{
  "version": 3,
  "sources": ["fortree/app.mjs"],
  "sourcesContent": ["import { prepareGameplayStorage } from '../gameplay-reset.mjs?v=8a6208ef22c9ab94';\nimport { bindKeyboardControls } from '../keyboard-controls.mjs?v=8a6208ef22c9ab94';\nimport { createSoundEffects } from '../sound-effects.mjs?v=8a6208ef22c9ab94';\nimport { createGameplayBlocker } from '../dialog-state.mjs?v=8a6208ef22c9ab94';\nimport { observeRecovery } from './recovery-guidance.mjs?v=8a6208ef22c9ab94';\nimport { LINKED_SLOT, LINKED_FAMILY, CATALOG_SLOT, CATALOG_FAMILY, CROSSWIND_SLOT, isTrialSlot, isOpaqueTrial, sameTrial } from './trial-identity.mjs?v=8a6208ef22c9ab94';\nimport { createTrialPersistence, TRIAL_SAVE_MESSAGE } from './trial-persistence.mjs?v=8a6208ef22c9ab94';\nimport { linkedEntry, catalogEntry, crosswindEntry, freshTrial, validTrial } from './trial-run.mjs?v=8a6208ef22c9ab94';\nimport { campaignSlots } from './crosswind-credit.mjs?v=8a6208ef22c9ab94';\nimport { HintRoutes } from '../hint-routes.mjs?v=8a6208ef22c9ab94';\nimport { difficultyLabel, updateCompletion, bindCompletionPresentation, advanceChallenge, showGameMessage } from '../gameplay-flow.mjs?v=8a6208ef22c9ab94';\nimport { updateGymBadge } from '../gym-badges.mjs?v=8a6208ef22c9ab94';\nimport { loading, startupSelection } from '../loading.mjs?v=8a6208ef22c9ab94';\nimport { drawingCache, drawingVariants, boardStager } from '../drawing-cache.mjs?v=8a6208ef22c9ab94';\nimport { bindGeneratorGuidance, formatGenerationFailure } from '../generator-guidance.mjs?v=8a6208ef22c9ab94';\nimport { setupBoardAnnouncements } from '../board-announcements.mjs?v=8a6208ef22c9ab94';\nimport { gateApproach, blockedMessage, describeApproach, step, recover, orientation, DIRS, encode } from './engine.mjs?v=8a6208ef22c9ab94';\nimport { restoreInWorker, createTaskWorker } from '../worker-task.mjs?v=8a6208ef22c9ab94';\nimport { reducedMotion } from '../motion-preference.mjs?v=8a6208ef22c9ab94';\nimport { createSaveStore, SAVE_CONFLICT_MESSAGE } from '../save-store.mjs?v=8a6208ef22c9ab94';\nimport { bindPointerControls } from '../pointer-controls.mjs?v=8a6208ef22c9ab94';\nimport { elapsedSince } from '../run-clock.mjs?v=8a6208ef22c9ab94';\nimport { updateMapButton, updateSoundButton } from '../board-tools.mjs?v=8a6208ef22c9ab94';\nimport { challengeProgress, isLevelCleared } from '../challenge-progress.mjs?v=8a6208ef22c9ab94';\nimport { setupFeedback } from '../feedback.mjs?v=8a6208ef22c9ab94';\nimport { LEVELS, level, canonical, installGenerated, installTrial } from './levels.mjs?v=8a6208ef22c9ab94';\nimport { settings } from './generator.mjs?v=8a6208ef22c9ab94';\nimport { loadProgress, freshSlot, cleanSlot as cleanGeneratedSlot } from './progress.mjs?v=8a6208ef22c9ab94';\nimport { scene, drawBoard, drawGate, T, viewport } from './render.mjs?v=8a6208ef22c9ab94';\nimport {\n  TapQueue,\n  DirectionInput,\n  padDirection as pad,\n  swipeDirection as swipe,\n} from '../input.mjs?v=8a6208ef22c9ab94';\nimport { createAnalytics } from '../analytics.mjs?v=8a6208ef22c9ab94';\nconst updateAccessibility = setupBoardAnnouncements();\nconst track = createAnalytics('fortree');\n\nconst $ = (id) => document.getElementById(id),\n  canvas = $('game'),\n  ctx = canvas.getContext('2d'),\n  pads = [...document.querySelectorAll('[data-dir]')];\nconst STORAGE = 'gym-puzzles-beta-20261028-fortree-v1';\nconst recovery = observeRecovery(STORAGE);\nprepareGameplayStorage();\nconst saveStore = createSaveStore(STORAGE, { storage: recovery.storage });\nconst saved = startupSelection(saveStore.read(), LEVELS);\nconst trialPersistence = createTrialPersistence(saveStore, STORAGE);\nlet unknownTrialSelection = isOpaqueTrial(saved.selected) && !isTrialSlot(saved.selected);\nlet trialStartupError = '';\nlet initialSelection = isOpaqueTrial(saved.selected) ? 'crosswind' : saved.selected;\nlet generated = saved.generated ?? null;\nlet generatedReady = false;\nlet generatedRevision = 0;\nlet restoration = null;\nconst withLoading = loading();\n// First admission remains explicit. Reloading an admitted trial validates its\n// exact identity and pinned durable run before installing any playable board.\nif (isTrialSlot(saved.selected)) {\n  try {\n    await withLoading(async () => {\n      const target = trialPersistence.pin(saved.selected);\n      const entry = saved.selected === CROSSWIND_SLOT\n        ? crosswindEntry((await import('./crosswind-trial.mjs?v=8a6208ef22c9ab94')).CROSSWIND_TRIAL)\n        : (saved.selected === CATALOG_SLOT ? catalogEntry : linkedEntry)(\n            await restoreInWorker(new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url), target.value?.trial?.record),\n          );\n      if (saveStore.read().selected !== saved.selected)\n        throw Error('The selected run changed in another tab.');\n      const run = trialPersistence.resume(target, value => validTrial(entry, value));\n      if (saveStore.read().selected !== saved.selected)\n        throw Error('The selected run changed in another tab.');\n      installTrial(entry);\n      saved.slots[entry.id] = run;\n      initialSelection = entry.id;\n    }, 'Validating saved trial\u2026');\n  } catch (error) {\n    unknownTrialSelection = true;\n    trialStartupError = `${error.message} Your saved trial is kept unchanged. Reload to retry.`;\n  }\n}\n\nfunction validRetainedGeneratedSlot(retained) {\n  const restored = cleanGeneratedSlot('generated', retained);\n  return !!restored && Number.isFinite(retained.elapsed) && retained.elapsed >= 0 &&\n    typeof retained.started === 'boolean' && Array.isArray(retained.history) &&\n    JSON.stringify(restored.history) === JSON.stringify(retained.history ?? []);\n}\nasync function restoreGenerated() {\n  if (generatedReady) return;\n  const generationToken = generatedRevision;\n  restoration ??= withLoading(async () => {\n    const restoredGenerated = await restoreInWorker(\n      new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url),\n      saved.generated,\n    );\n    if (generationToken !== generatedRevision) return;\n    if (restoredGenerated) {\n      installGenerated(restoredGenerated.board, generated);\n      generatedReady = true;\n    }\n  }, 'Loading saved puzzle\u2026').finally(() => {\n    restoration = null;\n  });\n  await restoration;\n}\n// A selected generated game still validates before it can be played. Other\n// modes retain the raw record and slot unchanged until explicitly requested.\nif (saved.selected === 'generated') await restoreGenerated();\nconst progress = loadProgress(\n  generatedReady\n    ? { ...saved, selected: initialSelection }\n    : {\n        ...saved,\n        selected: initialSelection,\n        slots: Object.fromEntries(\n          Object.entries(saved.slots ?? {}).filter(([id]) => id !== 'generated'),\n        ),\n      },\n);\n// A valid retained run keeps its exact original metadata across warm reloads.\n// Invalid retained runs remain opaque and cannot become a fresh generated run.\nif (Object.prototype.hasOwnProperty.call(saved.slots ?? {}, 'generated'))\n  progress.slots.generated = saved.slots.generated;\nconst generatedStartupUnavailable = saved.selected === 'generated' &&\n  (!generatedReady || !validRetainedGeneratedSlot(saved.slots?.generated));\nif (generatedStartupUnavailable) progress.selected = LEVELS[0].id;\nconst recoveryNotice = $('saveRecoveryNotice');\nrecoveryNotice.hidden = !recovery.recovered(saved, progress.slots, LEVELS);\nif (!recoveryNotice.hidden)\n  recoveryNotice.textContent = 'Some saved runs were recovered. Use the challenge picker to find saved progress.';\nlet selected = progress.selected,\n  slots = progress.slots;\nlet slot = slots[selected] ?? freshSlot(selected),\n  b = level(selected).board;\nlet animation = null,\n  queued = null,\n  dir = 'up',\n  hint = null,\n  hintWorker = null,\n  generatorWorker = null,\n  job = 0,\n  map = false,\n  sound = false;\nlet lastFrame = performance.now(),\n  lastSave = lastFrame,\n  visual = { x: slot.state.x, y: slot.state.y };\nlet controls = null;\nconst remembered = { classic: 'classic', custom: 'first-turn', ...saved.remembered };\nconst analyticsDetails = () => ({\n  level_id: selected,\n  mode: level(selected).kind,\n  difficulty: level(selected).difficulty ?? 'classic',\n});\nlet cache, gateCaches;\nconst consoleElement = document.querySelector('.console');\nconst taps = new TapQueue();\nconst hintRoutes = new HintRoutes();\nlet completionVisible = false;\nconst input = new DirectionInput((d, repeat) => request(d, repeat));\nconst dialogOpen = createGameplayBlocker();\nconst say = (text) => {\n  showGameMessage($('message'), saveStore.conflicted ? SAVE_CONFLICT_MESSAGE : text, saveStore.conflicted);\n};\nconst clock = (ms) =>\n  `${String(Math.floor(ms / 60000)).padStart(2, '0')}:${String(Math.floor(ms / 1000) % 60).padStart(2, '0')}`;\nconst arrows = {\n  up: '\u2191',\n  right: '\u2192',\n  down: '\u2193',\n  left: '\u2190',\n  upLeft: '\u2196',\n  upRight: '\u2197',\n  downLeft: '\u2199',\n  downRight: '\u2198',\n};\nfunction announceChallenge() {\n  say(`${level(selected).name}. Push the gates to reach the golden finish.`);\n}\nfunction stopHint() {\n  hintWorker?.terminate();\n  hintWorker = null;\n  hint = null;\n}\nfunction clearInput() {\n  input.clear();\n  queued = null;\n  taps.clear();\n  controls?.reset();\n  updatePad();\n}\nfunction updatePad() {\n  $('queuedInput').hidden = !queued;\n  $('queuedInput').textContent = queued ? `Next input: ${queued.replace(/([A-Z])/g, ' $1').toLowerCase()} ${arrows[queued]}` : '';\n  for (const p of pads) {\n    p.disabled = !slot.started || slot.state.won;\n    const gate = !animation && slot.started ? gateApproach(b, slot.state, p.dataset.dir) : null;\n    p.setAttribute('aria-label', `Move ${p.dataset.dir}${gate ? gate.allowed ? ', push gate to turn' : ', gate turn blocked by wall in arm sweep' : ''}`);\n    p.classList.toggle('is-active', input.last === p.dataset.dir);\n    p.classList.toggle('is-queued', queued === p.dataset.dir);\n  }\n}\nfunction persist() {\n  if (trialPersistence.frozen || unknownTrialSelection) { $('saveLabel').textContent = 'RELOAD TO CONTINUE'; return false; }\n  slots[selected] = slot;\n  try {\n    const result = saveStore.write(\n      { version: 1, selected, slots, generated, remembered, archived: progress.archived },\n      selected,\n    );\n    if (isTrialSlot(selected) && !trialPersistence.verifySaved(selected, slot, result)) {\n      clearInput(); stopHint(); animation = null; say(TRIAL_SAVE_MESSAGE);\n      $('saveLabel').textContent = 'RELOAD TO CONTINUE'; return false;\n    }\n    if (result.status === 'conflict') say(SAVE_CONFLICT_MESSAGE);\n    $('saveLabel').textContent =\n      result.status === 'conflict'\n        ? 'NEWER SAVE IN ANOTHER TAB \u2014 RELOAD'\n        : result.status === 'session'\n          ? 'THIS SESSION'\n          : animation\n            ? 'STEPPING\u2026'\n            : 'PROGRESS SAVED';\n    return result.status === 'saved';\n  } catch {\n    if (isTrialSlot(selected)) trialPersistence.verifySaved(selected, slot, { status: 'session' });\n    $('saveLabel').textContent = animation ? 'STEPPING\u2026' : 'THIS SESSION';\n  }\n}\nconst cachedDrawing = drawingCache();\nfunction buildCache() {\n  const c = cachedDrawing(b, 'drawBoard', () => {\n    const c = document.createElement('canvas');\n    c.width = b.width * T;\n    c.height = b.height * T;\n    drawBoard(c.getContext('2d'), b);\n    return c;\n  });\n  cache = c;\n  gateCaches = b.gates.map((g) =>\n    drawingVariants(16, (i) => {\n      const sprite = cachedDrawing(b, 'drawGate' + ':' + i + ':' + b.gates.indexOf(g), () => {\n        const sprite = document.createElement('canvas');\n        sprite.width = sprite.height = 80;\n        drawGate(sprite.getContext('2d'), g, i / 4, 40, 40);\n        return sprite;\n      });\n      return sprite;\n    }),\n  );\n  stageBoard();\n}\nconst stageDrawing = boardStager(canvas);\nfunction stageBoard() {\n  const size = viewport(b, map);\n  stageDrawing(size, (c) =>\n    scene(c, {\n      board: b,\n      showGateActions: true,\n      state: slot.state,\n      map,\n      visual,\n      dir,\n      time: reducedMotion() ? 0 : performance.now(),\n      cache,\n      gateCaches,\n    }),\n  );\n  consoleElement.style.setProperty('--map-aspect', `${canvas.width}/${canvas.height}`);\n}\nfunction resize() {\n  const size = viewport(b, map);\n  canvas.width = size.width;\n  canvas.height = size.height;\n  consoleElement.style.setProperty('--map-aspect', `${canvas.width}/${canvas.height}`);\n}\nfunction update() {\n  const local = !animation && slot.started && !slot.state.won\n    ? Object.keys(DIRS).flatMap(d => {\n        const gate = gateApproach(b, slot.state, d);\n        return gate ? [`${arrows[d]} ${gate.allowed ? 'push to turn' : 'turn blocked'}`] : [];\n      }) : [];\n  $('playObjective').textContent = local.length\n    ? `Gate here: ${local.join(' \u00B7 ')}` : 'Rotate the gates to open a path.';\n  updateAccessibility({\n    identity: b,\n    name: level(selected).name,\n    state: slot.state,\n    width: b.width,\n    height: b.height,\n    cell: (x, y) => describeApproach(b, slot.state, x, y),\n    mechanisms: b.gates.map(\n      (g, i) => `Gate ${i + 1}: orientation ${(slot.state.gates >> (i * 2)) & 3}`,\n    ),\n  });\n  const l = level(selected);\n  $('levelSelect').value = l.kind === 'generated' ? 'ruby-sapphire' : selected === CROSSWIND_SLOT ? 'crosswind' : selected;\n  $('resumeGeneratedButton').hidden = !generated || selected === 'generated';\n  $('levelChoice').hidden = l.kind === 'generated';\n  $('crosswindTrialControls').hidden = selected !== 'crosswind' && selected !== CROSSWIND_SLOT;\n  $('crosswindOriginal').hidden = selected !== CROSSWIND_SLOT;\n  $('crosswindTrial').hidden = selected === CROSSWIND_SLOT;\n  for (const [id, kind] of [\n    ['modeClassic', 'classic'],\n    ['modeCustom', 'custom'],\n    ['modeGenerator', 'generated'],\n  ])\n    $(id).setAttribute('aria-pressed', String(l.kind === kind));\n  $('levelDifficulty').textContent = difficultyLabel(l, slot.stage ?? 0);\n  $('levelNote').textContent = l.note;\n  $('editionName').textContent = l.name.toUpperCase();\n  $('editionProgress').textContent =\n    `${LEVELS.filter((l) => isLevelCleared(l, campaignSlots(slots)[l.id])).length} / ${LEVELS.length} ${l.kind === 'generated' ? 'CLASSIC & CUSTOM CLEARED' : 'CLEARED'}`;\n  $('challengeProgress').innerHTML = challengeProgress(\n    l.kind === 'generated' ? [...LEVELS, level(selected)] : LEVELS,\n    campaignSlots({ ...slots, [selected]: slot }),\n    selected,\n  );\n  const badge = updateGymBadge('fortree', LEVELS, campaignSlots({ ...slots, [selected]: slot }));\n  $('broken').textContent = String(b.gates.length);\n  $('requiredTotal').textContent = '';\n  $('progressFill').style.width =\n    `${slot.state.won ? 100 : Math.min(95, (slot.state.changes / Math.max(1, l.minimumChanges)) * 100)}%`;\n  $('moves').textContent = String(slot.state.moves);\n  $('changes').textContent = String(slot.state.changes);\n  $('timer').textContent = clock(slot.elapsed);\n  $('undoButton').disabled = !slot.history.length;\n  $('startOverlay').hidden = slot.started;\n  $('winOverlay').hidden = !slot.state.won || !completionVisible;\n  $('startTitle').textContent = 'Find your way through.';\n  $('startDescription').textContent =\n    'Push a wooden arm to turn its gate. Approach from another side when a wall stops the turn. Reach the golden finish.';\n  $('winTitle').textContent = 'Challenge cleared.';\n  $('winStats').textContent =\n    `${slot.state.moves} move${slot.state.moves === 1 ? '' : 's'} \u00B7 ${slot.state.changes} gate turn${slot.state.changes === 1 ? '' : 's'} \u00B7 ${clock(slot.elapsed)}`;\n  $('nextButton').textContent =\n    l.kind === 'generated' ? 'Generate another maze \u2192' : 'Next challenge \u2192';\n  updateCompletion({\n    levels: LEVELS,\n    slots: campaignSlots({ ...slots, [selected]: slot }),\n    selected: selected === CROSSWIND_SLOT ? 'crosswind' : l.kind === 'generated' ? 'generated' : selected,\n    slot,\n    visible: completionVisible,\n    badge,\n    busy: !!animation,\n  });\n  updatePad();\n}\nconst tone = createSoundEffects({ enabled: () => sound });\nconst copy = (s) => ({ ...s });\nfunction finish() {\n  if (!animation) return;\n  const a = animation;\n  animation = null;\n  slot.state = a.result.state;\n  completionVisible = slot.state.won;\n  visual = { x: slot.state.x, y: slot.state.y };\n  slots[selected] = slot;\n  if (slot.state.won) {\n    clearInput();\n    say('The finish is yours. Challenge cleared.');\n    track('challenge_completed', {\n      ...analyticsDetails(),\n      moves: slot.state.moves,\n      gate_rotations: slot.state.changes,\n      duration_seconds: Math.round(slot.elapsed / 1000),\n    });\n  } else\n    say(\n      a.result.type === 'turn'\n        ? 'The gate turned. Its open side has moved.'\n        : 'Find your route through the rotating gates.',\n    );\n  update();\n  if (slot.state.won) $('nextButton').focus?.({ preventScroll: true });\n  persist();\n  const next = taps.shift();\n  queued = taps.items[0] ?? null;\n  if (next && !dialogOpen() && !slot.state.won) request(next, false);\n  updatePad();\n}\nfunction request(d, repeat = false) {\n  if (\n    saveStore.conflicted || trialPersistence.frozen || unknownTrialSelection ||\n    !slot.started ||\n    slot.state.won ||\n    dialogOpen() ||\n    document.visibilityState === 'hidden'\n  )\n    return;\n  if (animation) {\n    if (!repeat) taps.push(d);\n    queued = taps.items[0] ?? null;\n    updatePad();\n    return;\n  }\n  stopHint();\n  const result = step(b, slot.state, d);\n  dir = d;\n  if (result.type === 'blocked') {\n    say(blockedMessage(b, slot.state, d));\n    const nextTap = taps.shift();\n    queued = taps.items[0] ?? null;\n    if (nextTap) request(nextTap);\n    return;\n  }\n  slot.history.push(copy(slot.state));\n  slot.history = slot.history.slice(-600);\n  animation = {\n    from: copy(slot.state),\n    result,\n    start: performance.now(),\n    duration: result.type === 'turn' ? 220 : 115,\n  };\n  $('saveLabel').textContent = 'STEPPING\u2026';\n  tone(result.type === 'turn');\n  update();\n  if (reducedMotion()) finish();\n}\nlet selectionRequest = 0;\nlet generatedPickerRequest = false;\nlet generatedReturnFocus = null;\nfunction endGeneratedPicker(success = false) {\n  if (!generatedPickerRequest) return;\n  generatedPickerRequest = false;\n  generatedReturnFocus = success ? selectionRequest : null;\n  $('levelPickerDialog').close();\n}\nfunction rejectGeneratedResume(text) {\n  endGeneratedPicker();\n  say(text);\n}\nfunction cancelGeneratedPicker() {\n  if (!generatedPickerRequest) return;\n  generatedPickerRequest = false;\n  selectionRequest++;\n}\n\nfunction change(id) {\n  if (id !== 'generated') cancelGeneratedPicker();\n  if (isOpaqueTrial(id)) {\n    if (id === CROSSWIND_SLOT) void openCrosswindTrial();\n    else if (id === LINKED_SLOT || id === CATALOG_SLOT) { openGenerator(); $('generatorFamily').value = id === CATALOG_SLOT ? CATALOG_FAMILY : LINKED_FAMILY; updateFamilyControls(); }\n    else say('That trial identity is not supported. Your saved run is kept.');\n    return;\n  }\n  cancelGeneration(false);\n  crosswindRequest++;\n  $('crosswindCancel').hidden = true;\n  if (id === 'generated' && !saveStore.checkGenerated()) return rejectGeneratedResume(SAVE_CONFLICT_MESSAGE);\n  const selectionToken = ++selectionRequest;\n  if (id === 'generated' && generatedReady) {\n    const retained = slots.generated;\n    if (!validRetainedGeneratedSlot(retained)) {\n      rejectGeneratedResume('Your saved run could not be validated. It is still saved; your current run is unchanged.');\n      return;\n    }\n    // Validation must not rewrite opaque metadata on the retained run.\n    slots.generated = retained;\n  }\n  if (id === 'generated' && !generatedReady) {\n    void restoreGenerated()\n      .then(() => {\n        if (selectionToken !== selectionRequest) return;\n        if (!saveStore.checkGenerated()) return rejectGeneratedResume(SAVE_CONFLICT_MESSAGE);\n        if (!generatedReady) {\n          rejectGeneratedResume('Your saved puzzle could not be validated. It is still saved; your current run is unchanged.');\n          return;\n        }\n        slots.generated = saved.slots?.generated;\n        change(id);\n      })\n      .catch(() => {\n        if (selectionToken === selectionRequest)\n          rejectGeneratedResume('Your saved puzzle could not be loaded. It is still saved; select it again to retry.');\n      });\n    return;\n  }\n  if (saveStore.conflicted || trialPersistence.frozen || unknownTrialSelection) { endGeneratedPicker(); return; }\n  clearInput();\n  stopHint();\n  if (animation) finish();\n  persist();\n  if (saveStore.conflicted || trialPersistence.frozen || unknownTrialSelection) { endGeneratedPicker(); return; }\n  completionVisible = false;\n  $('keepProgress').checked = false;\n  selected = canonical(id);\n  if (selected !== 'generated')\n    slots[selected] = loadProgress(saveStore.refresh(selected)).slots[selected];\n  slot = slots[selected] ?? freshSlot(selected);\n  b = level(selected).board;\n  visual = { x: slot.state.x, y: slot.state.y };\n  if (level(selected).kind !== 'generated') remembered[level(selected).kind] = selected;\n  buildCache();\n  update();\n  persist();\n  announceChallenge();\n  track('challenge_selected', analyticsDetails());\n  endGeneratedPicker(true);\n}\nfunction restart() {\n  if (saveStore.conflicted || trialPersistence.frozen || unknownTrialSelection) return;\n  clearInput();\n  stopHint();\n  animation = null;\n  const cleared = isLevelCleared(level(selected), slot);\n  slot = freshSlot(selected);\n  if (cleared) slot.cleared = true;\n  slot.started = true;\n  slots[selected] = slot;\n  visual = { x: slot.state.x, y: slot.state.y };\n  buildCache();\n  completionVisible = false;\n  update();\n  persist();\n  say('The gates are reset. Find your way through the changing passages.');\n  track('challenge_started', { ...analyticsDetails(), trigger: 'restart' });\n}\nfunction undo() {\n  if (saveStore.conflicted || trialPersistence.frozen || unknownTrialSelection) return;\n  if (!slot.history.length || slot.state.won) return;\n  clearInput();\n  stopHint();\n  animation = null;\n  slot.state = slot.history.pop();\n  visual = { x: slot.state.x, y: slot.state.y };\n  completionVisible = false;\n  update();\n  persist();\n  say('Last step undone. Find your route.');\n}\nfunction retryFloor() {\n  if (saveStore.conflicted || trialPersistence.frozen || unknownTrialSelection || slot.state.won) return;\n  clearInput();\n  stopHint();\n  if (animation) finish();\n  if (saveStore.conflicted || trialPersistence.frozen || unknownTrialSelection || slot.state.won) return;\n  slot.history.push(copy(slot.state));\n  slot.history = slot.history.filter((s) => !s.won).slice(-600);\n  slot.state = recover(b, slot.state);\n  slot.started = true;\n  visual = { x: slot.state.x, y: slot.state.y };\n  completionVisible = false;\n  update();\n  persist();\n  say('Back at the entrance. All gates are reset; one recovery move is counted.');\n}\nfunction next() {\n  if (!slot.state.won) return;\n  clearInput();\n  stopHint();\n  if (level(selected).kind === 'generated') openGenerator();\n  else advanceChallenge(LEVELS, campaignSlots({ ...slots, [selected]: slot }), selected === CROSSWIND_SLOT ? 'crosswind' : selected, change);\n}\nfunction showDialog(id) {\n  clearInput();\n  stopHint();\n  if (animation) finish();\n  persist();\n  $(id).showModal();\n}\nfunction hintStep() {\n  if (saveStore.conflicted || trialPersistence.frozen || unknownTrialSelection || !slot.started || slot.state.won || dialogOpen()) return;\n  clearInput();\n  if (animation) finish();\n  if (slot.state.won) return;\n  stopHint();\n  const capture = JSON.stringify([selected, slot.state]);\n  say('Looking for a route through the rotating gates\u2026');\n  track('hint_requested', analyticsDetails());\n  const present = (data, verified = false) => {\n    const result = data.result;\n    if (\n      !verified &&\n      result?.status === 'ok' &&\n      result.route?.length &&\n      !hintRoutes.remember(b, slot.state, result, (state, direction) =>\n        direction === 'return' ? recover(b, state) : step(b, state, direction).state,\n      )\n    ) {\n      say('A reliable hint could not be verified. Try Undo or Back to entrance.');\n      return;\n    }\n    if (data.type === 'hint' && result?.status === 'ok' && result.route.length) {\n      const d = result.route[0];\n      if (d === 'return') {\n        say('Try BACK TO ENTRANCE. The gates will return to their starting positions.');\n        return;\n      }\n      if (!DIRS[d]) return;\n      const [dx, dy] = DIRS[d];\n      hint = { x: slot.state.x + dx, y: slot.state.y + dy };\n      say(\n        `Try ${d.toUpperCase()}. ${result.reference ? 'This follows a verified reference route.' : 'This is the next step on a shortest route from here.'}`,\n      );\n    } else say('No route found from here. Undo or return to the entrance.');\n  };\n  const cached = hintRoutes.get(b, slot.state);\n  if (cached) {\n    present({ type: 'hint', result: cached }, true);\n    return;\n  }\n  try {\n    const task = createTaskWorker(new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url));\n    hintWorker = task;\n    task.onmessage = ({ data }) => {\n      if (hintWorker !== task || capture !== JSON.stringify([selected, slot.state])) return;\n      task.terminate();\n      hintWorker = null;\n      present(data);\n    };\n    task.onerror = () => {\n      if (hintWorker === task) {\n        stopHint();\n        say('Hints are unavailable right now. Undo or return still works.');\n      }\n    };\n    task.postMessage({\n      kind: 'hint',\n      proof:\n        level(selected).kind === 'generated'\n          ? undefined\n          : (level(selected).routes?.[slot.stage ?? 0] ?? level(selected).route ?? b.proof),\n      board: encode(b),\n      state: copy(slot.state),\n    });\n  } catch {\n    stopHint();\n    say('Hints are unavailable in this browser. Undo or return still works.');\n  }\n}\nfunction generatorFields(config = generated?.settings ?? settings()) {\n  $('generatorWidth').value = String(config.gates);\n  $('generatorHeight').value = String(config.height);\n  $('generatorMoves').value = String(config.minMoves);\n  $('generatorChanges').value = String(config.minChanges);\n  $('generatorBranching').value = String(config.branchiness);\n  $('generatorRandomness').value = String(config.randomness);\n  $('randomnessValue').textContent = `${config.randomness}%`;\n  $('generatorSeed').value = '';\n  refreshGeneratorGuidance();\n}\nfunction openGenerator() {\n  cancelGeneratedPicker();\n  generatorFields();\n  $('generatorFamily').value = selected === CATALOG_SLOT ? CATALOG_FAMILY : selected === LINKED_SLOT ? LINKED_FAMILY : 'serial';\n  $('generatorCore').value = slots[CATALOG_SLOT]?.trial?.record?.settings?.core ?? 'mixed';\n  updateFamilyControls();\n  $('generatorStatus').textContent = selected === CATALOG_SLOT\n    ? 'Same seed and core replay the same catalog layout. Only two layouts are available.'\n    : selected === LINKED_SLOT\n      ? 'This prototype has one fixed layout. Seeds label replays; they do not add layouts.'\n      : 'Same seed and settings replay the same maze. Leave the seed blank for a fresh board.';\n  showDialog('generatorDialog');\n}\nfunction cancelGeneration(close = true) {\n  job++;\n  generatorWorker?.terminate();\n  generatorWorker = null;\n  $('generateButton').disabled = false;\n  $('generatorCancel').textContent = 'Close';\n  if (close) $('generatorDialog').close();\n}\nfunction startGeneration(event) {\n  event.preventDefault();\n  if (linkedChoice()) { startLinkedGeneration(); return; }\n  if (trialPersistence.frozen || unknownTrialSelection || saveStore.conflicted) return;\n  cancelGeneration(false);\n  let config;\n  try {\n    config = settings({\n      gates: $('generatorWidth').value,\n      height: $('generatorHeight').value,\n      minMoves: $('generatorMoves').value,\n      minChanges: $('generatorChanges').value,\n      branchiness: $('generatorBranching').value,\n      randomness: $('generatorRandomness').value,\n      seed: $('generatorSeed').value,\n    });\n  } catch (e) {\n    $('generatorStatus').textContent = formatGenerationFailure(e.message, $('generatorSeed').value);\n    return;\n  }\n  const explicit = !!config.seed;\n  if (!explicit)\n    config.seed = Array.from(crypto.getRandomValues(new Uint32Array(3)), (n) =>\n      n.toString(36),\n    ).join('-');\n  const identity = ++job, generationSelection = selectionRequest, generationOrigin = selected;\n  if (!saveStore.checkGenerated()) { say('The saved generated board changed. Reload before replacing it.'); return; }\n  $('generateButton').disabled = true;\n  $('generatorCancel').textContent = 'Cancel';\n  $('generatorStatus').textContent = 'Constructing and verifying a new route\u2026';\n  try {\n    const task = createTaskWorker(new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url));\n    generatorWorker = task;\n    task.onmessage = ({ data }) => {\n      if (identity !== job || generatorWorker !== task || generationSelection !== selectionRequest || generationOrigin !== selected || $('generatorFamily').value !== 'serial') return;\n      if (data.type === 'progress') {\n        $('generatorStatus').textContent = `Searching layout ${data.attempt} / 80\u2026`;\n        return;\n      }\n      if (data.type === 'error') {\n        cancelGeneration(false);\n        $('generatorStatus').textContent = formatGenerationFailure(data.message, explicit ? config.seed : '');\n        return;\n      }\n      if (data.type !== 'complete') return;\n      if (!saveStore.checkGenerated()) { cancelGeneration(false); say('The saved generated board changed. Reload before replacing it.'); return; }\n      const restored = data.restored;\n      if (!restored) {\n        cancelGeneration(false);\n        $('generatorStatus').textContent = 'Verification failed. Your current board is kept.';\n        return;\n      }\n      clearInput();\n      stopHint();\n      if (animation) finish();\n      persist();\n      if (trialBlocked()) { cancelGeneration(false); return; }\n      cancelGeneration();\n      generatedRevision++;\n      generated = restored.record;\n      installGenerated(restored.board, generated);\n      generatedReady = true;\n      slots.generated = freshSlot('generated');\n      if (selected === 'generated') slot = slots.generated;\n      change('generated');\n      track('puzzle_generated', analyticsDetails());\n    };\n    task.onerror = () => {\n      if (identity === job) {\n        cancelGeneration(false);\n        $('generatorStatus').textContent =\n          'Generation is unavailable right now. Your current board is kept.';\n      }\n    };\n    task.postMessage({\n      kind: 'generate',\n      settings: config,\n      // Seed identity must not depend on the previous board.\n      exclude: '',\n    });\n  } catch {\n    cancelGeneration(false);\n    $('generatorStatus').textContent =\n      'Generation is unavailable in this browser. Your current board is kept.';\n  }\n}\n\n// Optional admission is explicit, source/destination pinned, and fail-closed.\nlet crosswindRequest = 0;\nconst snapshot = () => ({ version: 1, selected, slots, generated, remembered, archived: progress.archived });\nconst trialBlocked = () => trialPersistence.frozen || unknownTrialSelection || saveStore.conflicted;\nfunction activateTrial(entry, run) {\n  if (trialBlocked()) return;\n  clearInput(); stopHint(); animation = null;\n  installTrial(entry);\n  slots[entry.id] = run;\n  selected = entry.id; slot = run; b = entry.board;\n  completionVisible = false; $('keepProgress').checked = false;\n  visual = { x: slot.state.x, y: slot.state.y };\n  buildCache(); update(); announceChallenge(); persist();\n}\nfunction linkedChoice() {\n  const family = $('generatorFamily').value;\n  if (family === LINKED_FAMILY) return { family, id: LINKED_SLOT, entry: linkedEntry };\n  if (family === CATALOG_FAMILY) return { family, id: CATALOG_SLOT, entry: catalogEntry };\n  return null;\n}\nfunction updateFamilyControls() {\n  const choice = linkedChoice(), catalog = choice?.family === CATALOG_FAMILY;\n  for (const id of ['generatorWidth', 'generatorHeight', 'generatorMoves', 'generatorChanges', 'generatorBranching', 'generatorRandomness']) $(id).disabled = !!choice;\n  $('serialGeneratorFields').hidden = !!choice;\n  $('linkedTrialDescription').hidden = choice?.family !== LINKED_FAMILY;\n  $('catalogGeneratorFields').hidden = !catalog;\n  $('generatorCore').disabled = !catalog;\n  $('resumeLinkedTrial').hidden = !choice || !slots[choice.id];\n  $('resumeLinkedTrial').textContent = catalog ? 'Resume saved two-core trial' : 'Resume saved fixed trial';\n  $('generatorGuidance').hidden = !!choice;\n  $('generatorMinimumNote').hidden = !!choice;\n  $('generatorSeed').placeholder = choice ? 'Leave blank for a new replay seed' : 'Leave blank for a fresh maze';\n}\nfor (const id of ['generatorFamily', 'generatorCore']) $(id).addEventListener('change', () => {\n  cancelGeneration(false);\n  updateFamilyControls();\n  $('generatorStatus').textContent = 'Choice only. Your current board is unchanged until Generate or Resume succeeds.';\n});\nasync function startLinkedGeneration() {\n  if (trialBlocked()) return;\n  const choice = linkedChoice();\n  if (!choice) return;\n  const { family, id, entry: makeEntry } = choice;\n  const core = family === CATALOG_FAMILY ? $('generatorCore').value : null;\n  if (core !== null && !['mixed', 'retained-return', 'committed-return'].includes(core)) {\n    $('generatorStatus').textContent = 'Choose a supported catalog core. Your current board is kept.'; return;\n  }\n  cancelGeneration(false);\n  const identity = ++job, selection = selectionRequest, origin = selected;\n  const current = () => identity === job && selection === selectionRequest && origin === selected &&\n    $('generatorFamily').value === family && (core === null || $('generatorCore').value === core) && !trialBlocked();\n  const seed = String($('generatorSeed').value ?? '').trim() || crypto.randomUUID();\n  if (seed.length > 64) { $('generatorStatus').textContent = 'Seed must be at most 64 characters.'; return; }\n  const config = core === null ? { seed } : { seed, core };\n  const target = trialPersistence.pin(id);\n  const sources = selected === id ? [] : [trialPersistence.pin(selected)];\n  $('generateButton').disabled = true;\n  $('generatorCancel').textContent = 'Cancel';\n  $('generatorStatus').textContent = core === null ? 'Verifying the reconstructed linked-return trial\u2026' : 'Verifying a layout from the two-core catalog\u2026';\n  try {\n    if (target.value) {\n      if (target.value.trial?.family !== family) throw Error('This saved trial belongs to another identity. It is kept, not replaced.');\n      const old = await restoreInWorker(new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url), target.value.trial.record);\n      if (!old || !validTrial(makeEntry(old), target.value)) throw Error('The saved trial could not be validated. It is kept, not replaced.');\n    }\n    if (!current()) return;\n    if (![target, ...sources].every(trialPersistence.check)) throw Error('A saved run changed during preparation. Your current board is kept.');\n    const task = createTaskWorker(new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url));\n    generatorWorker = task;\n    task.onmessage = ({ data }) => {\n      if (!current() || generatorWorker !== task) return;\n      if (data.type === 'progress') return;\n      if (data.type === 'error') { cancelGeneration(false); $('generatorStatus').textContent = data.message; return; }\n      if (data.type !== 'complete') return;\n      try {\n        const entry = makeEntry(data.restored);\n        if (data.family !== family || entry.trial.record.seed !== seed || !sameTrial(entry.trial.record.settings, config) ||\n            ![target, ...sources].every(trialPersistence.check)) throw Error('The trial changed during preparation. Your board is kept.');\n        const run = freshTrial(entry);\n        const admitted = trialPersistence.commit({ target, sources, snapshot: snapshot(), value: run });\n        if (!current()) return;\n        cancelGeneration();\n        activateTrial(entry, admitted);\n        track('puzzle_generated', analyticsDetails());\n      } catch (error) {\n        cancelGeneration(false); $('generatorStatus').textContent = error.message;\n        if (trialPersistence.frozen) say(TRIAL_SAVE_MESSAGE);\n      }\n    };\n    task.onerror = () => {\n      if (!current()) return;\n      cancelGeneration(false); $('generatorStatus').textContent = 'Trial generation is unavailable. Your current board is kept.';\n    };\n    // No exclusion: identical seed + settings always replay the same layout.\n    task.postMessage({ kind: 'generate', family, settings: config });\n  } catch (error) {\n    if (identity !== job) return;\n    cancelGeneration(false); $('generatorStatus').textContent = error.message;\n    if (trialPersistence.frozen) say(TRIAL_SAVE_MESSAGE);\n  }\n}\nasync function resumeLinkedTrial() {\n  if (trialBlocked()) return;\n  const choice = linkedChoice();\n  if (!choice) return;\n  const { family, id, entry: makeEntry } = choice;\n  const core = family === CATALOG_FAMILY ? $('generatorCore').value : null;\n  cancelGeneration(false);\n  const identity = ++job, selection = selectionRequest, origin = selected;\n  const target = trialPersistence.pin(id);\n  const current = () => identity === job && selection === selectionRequest && origin === selected &&\n    $('generatorFamily').value === family && (core === null || $('generatorCore').value === core) && !trialBlocked();\n  $('generatorStatus').textContent = 'Validating the saved trial before opening it\u2026';\n  try {\n    if (target.value?.trial?.family !== family) throw Error('This saved trial identity is unsupported. It is kept unchanged.');\n    const restored = await restoreInWorker(new URL('./worker.mjs?v=8a6208ef22c9ab94', import.meta.url), target.value.trial.record);\n    if (!current()) return;\n    const entry = makeEntry(restored);\n    const run = trialPersistence.resume(target, (value) => validTrial(entry, value));\n    if (!current()) return;\n    cancelGeneration(); activateTrial(entry, run);\n  } catch (error) {\n    if (identity === job) { $('generatorStatus').textContent = error.message; if (trialPersistence.frozen) say(TRIAL_SAVE_MESSAGE); }\n  }\n}\n$('resumeLinkedTrial').addEventListener('click', () => void resumeLinkedTrial());\nasync function openCrosswindTrial() {\n  cancelGeneratedPicker();\n  if (trialBlocked() || selected !== 'crosswind') return;\n  clearInput(); stopHint(); if (animation) finish();\n  if (!persist()) { say('Save the original run successfully before opening the compact trial.'); return; }\n  const request = ++crosswindRequest, selection = selectionRequest, source = trialPersistence.pin('crosswind'),\n    target = trialPersistence.pin(CROSSWIND_SLOT), live = JSON.stringify(slot);\n  const current = () => request === crosswindRequest && selection === selectionRequest && selected === 'crosswind' &&\n    JSON.stringify(slot) === live && !trialBlocked();\n  $('crosswindCancel').hidden = false;\n  $('crosswindStatus').textContent = 'Preparing a separate compact run. The original is kept.';\n  try {\n    if (!sameTrial(source.value, slot)) throw Error('The original live and saved runs differ. Reload before trying the compact board.');\n    // Only this optional admission edge is lazy. Ordinary Fortree startup stays eager.\n    const { CROSSWIND_TRIAL } = await import('./crosswind-trial.mjs?v=8a6208ef22c9ab94');\n    if (!current()) return;\n    if (!trialPersistence.check(source) || !trialPersistence.check(target)) throw Error('The original or compact run changed during preparation. Your original is kept.');\n    const entry = crosswindEntry(CROSSWIND_TRIAL);\n    if (target.value && !validTrial(entry, target.value)) throw Error('The compact save has an unsupported identity or run. It is kept unchanged.');\n    const run = target.value\n      ? trialPersistence.resume(target, (value) => validTrial(entry, value))\n      : trialPersistence.commit({ target, sources: [source], snapshot: snapshot(), value: freshTrial(entry) });\n    if (!current() || !trialPersistence.check(source)) return;\n    activateTrial(entry, run);\n    $('crosswindStatus').textContent = 'New reconstruction \u00B7 experimental and ungraded. Original 40-move run remains separate.';\n  } catch (error) { if (request === crosswindRequest) { $('crosswindStatus').textContent = error.message; if (trialPersistence.frozen) say(TRIAL_SAVE_MESSAGE); } }\n  finally { if (request === crosswindRequest) $('crosswindCancel').hidden = true; }\n}\n$('crosswindTrial').addEventListener('click', () => void openCrosswindTrial());\n$('crosswindOriginal').addEventListener('click', () => change('crosswind'));\n$('crosswindCancel').addEventListener('click', () => {\n  crosswindRequest++; $('crosswindCancel').hidden = true;\n  $('crosswindStatus').textContent = 'Cancelled. The original run is unchanged.';\n});\n\n$('startButton').addEventListener('click', () => {\n  if (trialPersistence.frozen || unknownTrialSelection || saveStore.conflicted) return;\n  if (!slot.started && !slot.state.won)\n    track('challenge_started', { ...analyticsDetails(), trigger: 'enter' });\n  slot.started = true;\n  update();\n  persist();\n  canvas.focus({ preventScroll: true });\n});\n$('levelSelect').addEventListener('change', (e) => change(e.target.value));\nfor (const [id, kind] of [\n  ['modeClassic', 'classic'],\n  ['modeCustom', 'custom'],\n])\n  $(id).addEventListener('click', () => change(remembered[kind]));\n$('modeGenerator').addEventListener('click', () =>\n  generated ? change('generated') : openGenerator(),\n);\n$('resumeGeneratedButton').addEventListener('click', () => {\n  if (!generated) return;\n  generatedPickerRequest = true;\n  change('generated');\n});\nfor (const event of ['gym-dialog-close', 'cancel'])\n  $('levelPickerDialog').addEventListener(event, cancelGeneratedPicker);\n$('levelPickerDialog').addEventListener('close', () => {\n  if ($('levelPickerDialog').open) return;\n  cancelGeneratedPicker();\n  const token = generatedReturnFocus;\n  generatedReturnFocus = null;\n  if (token !== null)\n    globalThis.queueMicrotask(() => {\n      if (token === selectionRequest && !dialogOpen()) canvas.focus({ preventScroll: true });\n    });\n});\n$('generatorSettingsButton').addEventListener('click', openGenerator);\nbindCompletionPresentation({ setVisible: value => { completionVisible = value; }, update: update, dialogOpen });\n$('generatorForm').addEventListener('submit', startGeneration);\nfor (const id of ['generatorClose', 'generatorCancel'])\n  $(id).addEventListener('click', () => cancelGeneration());\n$('generatorDialog').addEventListener('cancel', () => cancelGeneration());\n$('generatorDialog').addEventListener('close', () => {\n  if (generatorWorker) cancelGeneration(false);\n});\n$('generatorRandomness').addEventListener('input', () => {\n  $('randomnessValue').textContent = `${$('generatorRandomness').value}%`;\n});\n$('useSeedButton').addEventListener('click', () => {\n  const choice = linkedChoice(), record = choice ? slots[choice.id]?.trial?.record : generated;\n  $('generatorSeed').value = record?.seed ?? '';\n  if (choice?.family === CATALOG_FAMILY && record?.settings?.core) {\n    cancelGeneration(false);\n    $('generatorCore').value = record.settings.core;\n  }\n});\n$('returnButton').addEventListener('click', retryFloor);\n$('undoButton').addEventListener('click', undo);\n$('resetButton').addEventListener('click', () =>\n  $('keepProgress').checked && !slot.state.won ? retryFloor() : restart(),\n);\n$('againButton').addEventListener('click', restart);\n$('nextButton').addEventListener('click', next);\n$('hintButton').addEventListener('click', hintStep);\n$('helpButton').addEventListener('click', () => showDialog('helpDialog'));\nfor (const id of ['closeHelp', 'helpDone'])\n  $(id).addEventListener('click', () => $('helpDialog').close());\n$('mapButton').addEventListener('click', () => {\n  clearInput();\n  map = !map;\n  consoleElement.classList.toggle('map-active', map);\n  updateMapButton($('mapButton'), map);\n  resize();\n});\n$('soundButton').addEventListener('click', () => {\n  sound = !sound;\n  updateSoundButton($('soundButton'), sound);\n  if (sound) tone();\n});\nbindKeyboardControls({\n  input,\n  blocked: dialogOpen,\n  undo,\n  restart: () => {\n    $('keepProgress').checked && !slot.state.won ? retryFloor() : restart();\n  },\n  recover: () => retryFloor(),\n  update: updatePad,\n});\ncontrols = bindPointerControls({\n  canvas,\n  dpad: $('dpad'),\n  pads,\n  input,\n  request,\n  enabled: () => !trialPersistence.frozen && !unknownTrialSelection && !saveStore.conflicted && !dialogOpen() && slot.started && !slot.state.won,\n  clearInput,\n  update: updatePad,\n  padDirection: (x, y, r, previous) => pad(x, y, r, previous),\n  swipeDirection: (dx, dy) => swipe(dx, dy),\n});\nfunction pause() {\n  cancelGeneratedPicker();\n  clearInput();\n  stopHint();\n  if (animation) finish();\n  persist();\n  lastFrame = performance.now();\n}\nwindow.addEventListener('gym-ui-open', pause);\nwindow.addEventListener('gym-ui-close', () => {\n  lastFrame = performance.now();\n});\nwindow.addEventListener('blur', pause);\nwindow.addEventListener('gym-privacy-open', pause);\nwindow.addEventListener('pagehide', pause);\ndocument.addEventListener('visibilitychange', pause);\nfunction frame(now) {\n  const dt = elapsedSince(now, lastFrame);\n  lastFrame = now;\n  if (!trialPersistence.frozen && !unknownTrialSelection && !saveStore.conflicted && slot.started && !slot.state.won && !dialogOpen() && document.visibilityState !== 'hidden')\n    slot.elapsed += dt;\n  if (reducedMotion() && animation) finish();\n  if (animation) {\n    const a = animation,\n      t = Math.min(1, (now - a.start) / a.duration);\n    if (t >= 1) finish();\n    else\n      visual = {\n        x: a.from.x + (a.result.state.x - a.from.x) * t,\n        y: a.from.y + (a.result.state.y - a.from.y) * t,\n      };\n  }\n  if (!dialogOpen() && document.visibilityState !== 'hidden') input.update(now, !!animation);\n  scene(ctx, {\n    board: b,\n    showGateActions: true,\n    state: slot.state,\n    cache,\n    gateCaches,\n    map,\n    visual,\n    dir,\n    time: reducedMotion() ? 0 : now,\n    moving: !reducedMotion() && !!animation,\n    hint,\n    turn: animation?.result.delta\n      ? {\n          index: animation.result.index,\n          from: orientation(animation.from.gates, animation.result.index),\n          delta: animation.result.delta,\n          progress: Math.min(1, (now - animation.start) / animation.duration),\n        }\n      : null,\n  });\n  const displayTime = clock(slot.elapsed);\n  if ($('timer').textContent !== displayTime) $('timer').textContent = displayTime;\n  if (now - lastSave > 5000) {\n    persist();\n    lastSave = now;\n  }\n  requestAnimationFrame(frame);\n}\nbuildCache();\nupdate();\nif (unknownTrialSelection) say(trialStartupError || 'This saved trial identity is not supported. Nothing will be overwritten; reload a compatible version to resume.');\nelse if (generatedStartupUnavailable) say('Your saved generated run could not be validated. It is still saved; choose another challenge or retry Resume.');\nelse if (slot.state.won) say(`${level(selected).name}. Challenge cleared.`);\nelse announceChallenge();\npersist();\nrequestAnimationFrame(frame);\n\nsetupFeedback({\n  gym: 'fortree',\n  track,\n  beforeOpen: pause,\n  afterClose: () => {\n    lastFrame = performance.now();\n  },\n  context: () => ({\n    ...analyticsDetails(),\n    level_name: level(selected).name,\n    moves: slot.state.moves,\n    puzzle_state: slot.state,\n    player_x: slot.state.x,\n    player_y: slot.state.y,\n    duration_seconds: Math.round(slot.elapsed / 1000),\n    ...(slot.state.room !== undefined ? { room: slot.state.room } : {}),\n    ...(selected === 'generated' && generated\n      ? { puzzle_seed: generated.seed, puzzle_settings: generated.settings }\n      : {}),\n  }),\n});\n\nsaveStore.watch(\n  () => selected,\n  () => {\n    clearInput();\n    stopHint();\n    $('saveLabel').textContent = 'NEWER SAVE IN ANOTHER TAB \u2014 RELOAD';\n    say(SAVE_CONFLICT_MESSAGE);\n  },\n);\n\n$('generatorDialog').addEventListener('gym-dialog-close', () => {\n  if (generatorWorker) cancelGeneration(false);\n});\n\nconst refreshGeneratorGuidance = bindGeneratorGuidance('fortree');\n"],
  "mappings": "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",
  "names": ["prepareGameplayStorage", "bindKeyboardControls", "createSoundEffects", "createGameplayBlocker", "observeRecovery", "LINKED_SLOT", "LINKED_FAMILY", "CATALOG_SLOT", "CATALOG_FAMILY", "CROSSWIND_SLOT", "isTrialSlot", "isOpaqueTrial", "sameTrial", "createTrialPersistence", "TRIAL_SAVE_MESSAGE", "linkedEntry", "catalogEntry", "crosswindEntry", "freshTrial", "validTrial", "campaignSlots", "HintRoutes", "difficultyLabel", "updateCompletion", "bindCompletionPresentation", "advanceChallenge", "showGameMessage", "updateGymBadge", "loading", "startupSelection", "drawingCache", "drawingVariants", "boardStager", "bindGeneratorGuidance", "formatGenerationFailure", "setupBoardAnnouncements", "gateApproach", "blockedMessage", "describeApproach", "step", "recover", "orientation", "DIRS", "encode", "restoreInWorker", "createTaskWorker", "reducedMotion", "createSaveStore", "SAVE_CONFLICT_MESSAGE", "bindPointerControls", "elapsedSince", "updateMapButton", "updateSoundButton", "challengeProgress", "isLevelCleared", "setupFeedback", "LEVELS", "level", "canonical", "installGenerated", "installTrial", "settings", "loadProgress", "freshSlot", "cleanGeneratedSlot", "scene", "drawBoard", "drawGate", "T", "viewport", "TapQueue", "DirectionInput", "pad", "swipe", "createAnalytics", "updateAccessibility", "track", "$", "id", "canvas", "ctx", "pads", "STORAGE", "recovery", "saveStore", "saved", "trialPersistence", "unknownTrialSelection", "trialStartupError", "initialSelection", "generated", "generatedReady", "generatedRevision", "restoration", "withLoading", "target", "entry", "run", "value", "error", "validRetainedGeneratedSlot", "retained", "restored", "restoreGenerated", "generationToken", "restoredGenerated", "progress", "generatedStartupUnavailable", "recoveryNotice", "selected", "slots", "slot", "b", "animation", "queued", "dir", "hint", "hintWorker", "generatorWorker", "job", "map", "sound", "lastFrame", "lastSave", "visual", "controls", "remembered", "analyticsDetails", "cache", "gateCaches", "consoleElement", "taps", "hintRoutes", "completionVisible", "input", "d", "repeat", "request", "dialogOpen", "say", "text", "clock", "ms", "arrows", "announceChallenge", "stopHint", "clearInput", "updatePad", "p", "gate", "persist", "result", "cachedDrawing", "buildCache", "c", "g", "i", "sprite", "stageBoard", "stageDrawing", "size", "resize", "update", "local", "x", "y", "l", "kind", "badge", "tone", "copy", "s", "finish", "a", "next", "nextTap", "selectionRequest", "generatedPickerRequest", "generatedReturnFocus", "endGeneratedPicker", "success", "rejectGeneratedResume", "cancelGeneratedPicker", "change", "openCrosswindTrial", "openGenerator", "updateFamilyControls", "cancelGeneration", "crosswindRequest", "selectionToken", "restart", "cleared", "undo", "retryFloor", "showDialog", "hintStep", "capture", "present", "data", "verified", "state", "direction", "dx", "dy", "cached", "task", "generatorFields", "config", "refreshGeneratorGuidance", "close", "startGeneration", "event", "linkedChoice", "startLinkedGeneration", "e", "explicit", "n", "identity", "generationSelection", "generationOrigin", "trialBlocked", "snapshot", "activateTrial", "family", "choice", "catalog", "makeEntry", "core", "selection", "origin", "current", "seed", "sources", "old", "admitted", "resumeLinkedTrial", "source", "live", "CROSSWIND_TRIAL", "token", "record", "r", "previous", "pause", "frame", "now", "dt", "t", "displayTime"]
}
