{
  "version": 3,
  "sources": ["../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/adapters.js", "../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/logger.js", "../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/connection_monitor.js", "../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/internal.js", "../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/connection.js", "../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/subscription.js", "../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/subscription_guarantor.js", "../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/subscriptions.js", "../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/consumer.js", "../../../node_modules/.pnpm/@rails+actioncable@7.0.0/node_modules/@rails/actioncable/src/index.js", "../../../node_modules/.pnpm/pulljs@0.1.2/node_modules/pulljs/lib/index.js", "../../javascript/controllers/error_reporter.js", "../../javascript/controllers/request_submit_polyfill.js", "../../../node_modules/.pnpm/@hotwired+turbo@8.0.23/node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js", "../../../node_modules/.pnpm/@hotwired+turbo-rails@8.0.23/node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js", "../../../node_modules/.pnpm/@hotwired+turbo-rails@8.0.23/node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js", "../../../node_modules/.pnpm/@hotwired+turbo-rails@8.0.23/node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js", "../../../node_modules/.pnpm/@hotwired+turbo-rails@8.0.23/node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js", "../../../node_modules/.pnpm/@hotwired+turbo-rails@8.0.23/node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js", "../../javascript/controllers/turbo_frame_breakout.js", "../../javascript/controllers/turbo_stream_check.js", "../../../node_modules/.pnpm/@hotwired+stimulus@3.0.1/node_modules/@hotwired/stimulus/dist/stimulus.js", "../../javascript/controllers/application.js", "../../javascript/controllers/password_toggle_controller.js", "../../javascript/controllers/toggle_controller.js", "../../javascript/controllers/date_switcher_controller.js", "../../javascript/controllers/wheel_controller.js", "../../javascript/controllers/auto_submit_controller.js", "../../javascript/controllers/attachment_fallback_controller.js", "../../javascript/controllers/submit_error_controller.js", "../../javascript/controllers/autogrow_controller.js", "../../javascript/controllers/drawer_controller.js", "../../javascript/controllers/confirm_click_controller.js", "../../javascript/controllers/shared_controllers.js", "../../javascript/controllers/ai_answer_formatting.js", "../../javascript/controllers/ai_answer_controller.js", "../../javascript/controllers/audio_controller.js", "../../javascript/controllers/cancellation_modal_controller.js", "../../javascript/controllers/clipboard_controller.js", "../../../node_modules/.pnpm/canvas-confetti@1.9.4/node_modules/canvas-confetti/dist/confetti.module.mjs", "../../javascript/controllers/confetti_controller.js", "../../javascript/controllers/faq_ai_answer_controller.js", "../../javascript/controllers/invalid_scroll_controller.js", "../../javascript/controllers/location_redirect_controller.js", "../../javascript/controllers/options_radio_controller.js", "../../javascript/controllers/payment_form_controller.js", "../../javascript/controllers/play_tutorial_controller.js", "../../javascript/controllers/progress_countdown_controller.js", "../../javascript/controllers/result_overlay_controller.js", "../../javascript/source/particles.js", "../../javascript/controllers/step_particles_controller.js", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/util.ts", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/clone-pseudos.ts", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/mimes.ts", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/dataurl.ts", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/clone-node.ts", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/embed-resources.ts", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/embed-images.ts", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/apply-style.ts", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/embed-webfonts.ts", "../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/src/index.ts", "../../javascript/controllers/share_scorecard_controller.js", "../../javascript/controllers/submit_lock_controller.js", "../../javascript/controllers/tabs_controller.js", "../../javascript/controllers/auto_refresh_controller.js", "../../javascript/controllers/feedback_form_controller.js", "../../javascript/controllers/lobby_controller.js", "../../javascript/controllers/notification_controller.js", "../../javascript/controllers/print_on_load_controller.js", "../../javascript/controllers/pull_to_refresh_controller.js", "../../javascript/controllers/user_controllers.js", "../../javascript/source/custom_stream_actions.js", "../../javascript/source/viewport_fix.js"],
  "sourcesContent": ["export default {\n  logger: self.console,\n  WebSocket: self.WebSocket\n}\n", "import adapters from \"./adapters\"\n\n// The logger is disabled by default. You can enable it with:\n//\n//   ActionCable.logger.enabled = true\n//\n//   Example:\n//\n//   import * as ActionCable from '@rails/actioncable'\n//\n//   ActionCable.logger.enabled = true\n//   ActionCable.logger.log('Connection Established.')\n//\n\nexport default {\n  log(...messages) {\n    if (this.enabled) {\n      messages.push(Date.now())\n      adapters.logger.log(\"[ActionCable]\", ...messages)\n    }\n  },\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting\n// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.\n\nconst now = () => new Date().getTime()\n\nconst secondsSince = time => (now() - time) / 1000\n\nclass ConnectionMonitor {\n  constructor(connection) {\n    this.visibilityDidChange = this.visibilityDidChange.bind(this)\n    this.connection = connection\n    this.reconnectAttempts = 0\n  }\n\n  start() {\n    if (!this.isRunning()) {\n      this.startedAt = now()\n      delete this.stoppedAt\n      this.startPolling()\n      addEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`)\n    }\n  }\n\n  stop() {\n    if (this.isRunning()) {\n      this.stoppedAt = now()\n      this.stopPolling()\n      removeEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(\"ConnectionMonitor stopped\")\n    }\n  }\n\n  isRunning() {\n    return this.startedAt && !this.stoppedAt\n  }\n\n  recordPing() {\n    this.pingedAt = now()\n  }\n\n  recordConnect() {\n    this.reconnectAttempts = 0\n    this.recordPing()\n    delete this.disconnectedAt\n    logger.log(\"ConnectionMonitor recorded connect\")\n  }\n\n  recordDisconnect() {\n    this.disconnectedAt = now()\n    logger.log(\"ConnectionMonitor recorded disconnect\")\n  }\n\n  // Private\n\n  startPolling() {\n    this.stopPolling()\n    this.poll()\n  }\n\n  stopPolling() {\n    clearTimeout(this.pollTimeout)\n  }\n\n  poll() {\n    this.pollTimeout = setTimeout(() => {\n      this.reconnectIfStale()\n      this.poll()\n    }\n    , this.getPollInterval())\n  }\n\n  getPollInterval() {\n    const { staleThreshold, reconnectionBackoffRate } = this.constructor\n    const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10))\n    const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate\n    const jitter = jitterMax * Math.random()\n    return staleThreshold * 1000 * backoff * (1 + jitter)\n  }\n\n  reconnectIfStale() {\n    if (this.connectionIsStale()) {\n      logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`)\n      this.reconnectAttempts++\n      if (this.disconnectedRecently()) {\n        logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`)\n      } else {\n        logger.log(\"ConnectionMonitor reopening\")\n        this.connection.reopen()\n      }\n    }\n  }\n\n  get refreshedAt() {\n    return this.pingedAt ? this.pingedAt : this.startedAt\n  }\n\n  connectionIsStale() {\n    return secondsSince(this.refreshedAt) > this.constructor.staleThreshold\n  }\n\n  disconnectedRecently() {\n    return this.disconnectedAt && (secondsSince(this.disconnectedAt) < this.constructor.staleThreshold)\n  }\n\n  visibilityDidChange() {\n    if (document.visibilityState === \"visible\") {\n      setTimeout(() => {\n        if (this.connectionIsStale() || !this.connection.isOpen()) {\n          logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`)\n          this.connection.reopen()\n        }\n      }\n      , 200)\n    }\n  }\n\n}\n\nConnectionMonitor.staleThreshold = 6 // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)\nConnectionMonitor.reconnectionBackoffRate = 0.15\n\nexport default ConnectionMonitor\n", "export default {\n  \"message_types\": {\n    \"welcome\": \"welcome\",\n    \"disconnect\": \"disconnect\",\n    \"ping\": \"ping\",\n    \"confirmation\": \"confirm_subscription\",\n    \"rejection\": \"reject_subscription\"\n  },\n  \"disconnect_reasons\": {\n    \"unauthorized\": \"unauthorized\",\n    \"invalid_request\": \"invalid_request\",\n    \"server_restart\": \"server_restart\"\n  },\n  \"default_mount_path\": \"/cable\",\n  \"protocols\": [\n    \"actioncable-v1-json\",\n    \"actioncable-unsupported\"\n  ]\n}\n", "import adapters from \"./adapters\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\n\n// Encapsulate the cable connection held by the consumer. This is an internal class not intended for direct user manipulation.\n\nconst {message_types, protocols} = INTERNAL\nconst supportedProtocols = protocols.slice(0, protocols.length - 1)\n\nconst indexOf = [].indexOf\n\nclass Connection {\n  constructor(consumer) {\n    this.open = this.open.bind(this)\n    this.consumer = consumer\n    this.subscriptions = this.consumer.subscriptions\n    this.monitor = new ConnectionMonitor(this)\n    this.disconnected = true\n  }\n\n  send(data) {\n    if (this.isOpen()) {\n      this.webSocket.send(JSON.stringify(data))\n      return true\n    } else {\n      return false\n    }\n  }\n\n  open() {\n    if (this.isActive()) {\n      logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)\n      return false\n    } else {\n      logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`)\n      if (this.webSocket) { this.uninstallEventHandlers() }\n      this.webSocket = new adapters.WebSocket(this.consumer.url, protocols)\n      this.installEventHandlers()\n      this.monitor.start()\n      return true\n    }\n  }\n\n  close({allowReconnect} = {allowReconnect: true}) {\n    if (!allowReconnect) { this.monitor.stop() }\n    if (this.isActive()) {\n      return this.webSocket.close()\n    }\n  }\n\n  reopen() {\n    logger.log(`Reopening WebSocket, current state is ${this.getState()}`)\n    if (this.isActive()) {\n      try {\n        return this.close()\n      } catch (error) {\n        logger.log(\"Failed to reopen WebSocket\", error)\n      }\n      finally {\n        logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`)\n        setTimeout(this.open, this.constructor.reopenDelay)\n      }\n    } else {\n      return this.open()\n    }\n  }\n\n  getProtocol() {\n    if (this.webSocket) {\n      return this.webSocket.protocol\n    }\n  }\n\n  isOpen() {\n    return this.isState(\"open\")\n  }\n\n  isActive() {\n    return this.isState(\"open\", \"connecting\")\n  }\n\n  // Private\n\n  isProtocolSupported() {\n    return indexOf.call(supportedProtocols, this.getProtocol()) >= 0\n  }\n\n  isState(...states) {\n    return indexOf.call(states, this.getState()) >= 0\n  }\n\n  getState() {\n    if (this.webSocket) {\n      for (let state in adapters.WebSocket) {\n        if (adapters.WebSocket[state] === this.webSocket.readyState) {\n          return state.toLowerCase()\n        }\n      }\n    }\n    return null\n  }\n\n  installEventHandlers() {\n    for (let eventName in this.events) {\n      const handler = this.events[eventName].bind(this)\n      this.webSocket[`on${eventName}`] = handler\n    }\n  }\n\n  uninstallEventHandlers() {\n    for (let eventName in this.events) {\n      this.webSocket[`on${eventName}`] = function() {}\n    }\n  }\n\n}\n\nConnection.reopenDelay = 500\n\nConnection.prototype.events = {\n  message(event) {\n    if (!this.isProtocolSupported()) { return }\n    const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)\n    switch (type) {\n      case message_types.welcome:\n        this.monitor.recordConnect()\n        return this.subscriptions.reload()\n      case message_types.disconnect:\n        logger.log(`Disconnecting. Reason: ${reason}`)\n        return this.close({allowReconnect: reconnect})\n      case message_types.ping:\n        return this.monitor.recordPing()\n      case message_types.confirmation:\n        this.subscriptions.confirmSubscription(identifier)\n        return this.subscriptions.notify(identifier, \"connected\")\n      case message_types.rejection:\n        return this.subscriptions.reject(identifier)\n      default:\n        return this.subscriptions.notify(identifier, \"received\", message)\n    }\n  },\n\n  open() {\n    logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`)\n    this.disconnected = false\n    if (!this.isProtocolSupported()) {\n      logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\")\n      return this.close({allowReconnect: false})\n    }\n  },\n\n  close(event) {\n    logger.log(\"WebSocket onclose event\")\n    if (this.disconnected) { return }\n    this.disconnected = true\n    this.monitor.recordDisconnect()\n    return this.subscriptions.notifyAll(\"disconnected\", {willAttemptReconnect: this.monitor.isRunning()})\n  },\n\n  error() {\n    logger.log(\"WebSocket onerror event\")\n  }\n}\n\nexport default Connection\n", "// A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.\n// It provides a number of callbacks and a method for calling remote procedure calls on the corresponding\n// Channel instance on the server side.\n//\n// An example demonstrates the basic functionality:\n//\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\", {\n//     connected() {\n//       // Called once the subscription has been successfully completed\n//     },\n//\n//     disconnected({ willAttemptReconnect: boolean }) {\n//       // Called when the client has disconnected with the server.\n//       // The object will have an `willAttemptReconnect` property which\n//       // says whether the client has the intention of attempting\n//       // to reconnect.\n//     },\n//\n//     appear() {\n//       this.perform('appear', {appearing_on: this.appearingOn()})\n//     },\n//\n//     away() {\n//       this.perform('away')\n//     },\n//\n//     appearingOn() {\n//       $('main').data('appearing-on')\n//     }\n//   })\n//\n// The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server\n// by calling the `perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).\n// The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.\n//\n// This is how the server component would look:\n//\n//   class AppearanceChannel < ApplicationActionCable::Channel\n//     def subscribed\n//       current_user.appear\n//     end\n//\n//     def unsubscribed\n//       current_user.disappear\n//     end\n//\n//     def appear(data)\n//       current_user.appear on: data['appearing_on']\n//     end\n//\n//     def away\n//       current_user.away\n//     end\n//   end\n//\n// The \"AppearanceChannel\" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.\n// The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the perform method.\n\nconst extend = function(object, properties) {\n  if (properties != null) {\n    for (let key in properties) {\n      const value = properties[key]\n      object[key] = value\n    }\n  }\n  return object\n}\n\nexport default class Subscription {\n  constructor(consumer, params = {}, mixin) {\n    this.consumer = consumer\n    this.identifier = JSON.stringify(params)\n    extend(this, mixin)\n  }\n\n  // Perform a channel action with the optional data passed as an attribute\n  perform(action, data = {}) {\n    data.action = action\n    return this.send(data)\n  }\n\n  send(data) {\n    return this.consumer.send({command: \"message\", identifier: this.identifier, data: JSON.stringify(data)})\n  }\n\n  unsubscribe() {\n    return this.consumer.subscriptions.remove(this)\n  }\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received.\n// Internal class, not intended for direct user manipulation.\n\nclass SubscriptionGuarantor {\n  constructor(subscriptions) {\n    this.subscriptions = subscriptions\n    this.pendingSubscriptions = []\n  }\n\n  guarantee(subscription) {\n    if(this.pendingSubscriptions.indexOf(subscription) == -1){ \n      logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)\n      this.pendingSubscriptions.push(subscription) \n    }\n    else {\n      logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)\n    }\n    this.startGuaranteeing()\n  }\n\n  forget(subscription) {\n    logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)\n    this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))\n  }\n\n  startGuaranteeing() {\n    this.stopGuaranteeing()\n    this.retrySubscribing()\n  }\n  \n  stopGuaranteeing() {\n    clearTimeout(this.retryTimeout)\n  }\n\n  retrySubscribing() {\n    this.retryTimeout = setTimeout(() => {\n      if (this.subscriptions && typeof(this.subscriptions.subscribe) === \"function\") {\n        this.pendingSubscriptions.map((subscription) => {\n          logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)\n          this.subscriptions.subscribe(subscription)\n        })\n      }\n    }\n    , 500)\n  }\n}\n\nexport default SubscriptionGuarantor", "import Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport logger from \"./logger\"\n\n// Collection class for creating (and internally managing) channel subscriptions.\n// The only method intended to be triggered by the user is ActionCable.Subscriptions#create,\n// and it should be called through the consumer like so:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n\nexport default class Subscriptions {\n  constructor(consumer) {\n    this.consumer = consumer\n    this.guarantor = new SubscriptionGuarantor(this)\n    this.subscriptions = []\n  }\n\n  create(channelName, mixin) {\n    const channel = channelName\n    const params = typeof channel === \"object\" ? channel : {channel}\n    const subscription = new Subscription(this.consumer, params, mixin)\n    return this.add(subscription)\n  }\n\n  // Private\n\n  add(subscription) {\n    this.subscriptions.push(subscription)\n    this.consumer.ensureActiveConnection()\n    this.notify(subscription, \"initialized\")\n    this.subscribe(subscription)\n    return subscription\n  }\n\n  remove(subscription) {\n    this.forget(subscription)\n    if (!this.findAll(subscription.identifier).length) {\n      this.sendCommand(subscription, \"unsubscribe\")\n    }\n    return subscription\n  }\n\n  reject(identifier) {\n    return this.findAll(identifier).map((subscription) => {\n      this.forget(subscription)\n      this.notify(subscription, \"rejected\")\n      return subscription\n    })\n  }\n\n  forget(subscription) {\n    this.guarantor.forget(subscription)\n    this.subscriptions = (this.subscriptions.filter((s) => s !== subscription))\n    return subscription\n  }\n\n  findAll(identifier) {\n    return this.subscriptions.filter((s) => s.identifier === identifier)\n  }\n\n  reload() {\n    return this.subscriptions.map((subscription) =>\n      this.subscribe(subscription))\n  }\n\n  notifyAll(callbackName, ...args) {\n    return this.subscriptions.map((subscription) =>\n      this.notify(subscription, callbackName, ...args))\n  }\n\n  notify(subscription, callbackName, ...args) {\n    let subscriptions\n    if (typeof subscription === \"string\") {\n      subscriptions = this.findAll(subscription)\n    } else {\n      subscriptions = [subscription]\n    }\n\n    return subscriptions.map((subscription) =>\n      (typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined))\n  }\n\n  subscribe(subscription) {\n    if (this.sendCommand(subscription, \"subscribe\")) {\n      this.guarantor.guarantee(subscription)\n    }\n  }\n\n  confirmSubscription(identifier) {\n    logger.log(`Subscription confirmed ${identifier}`)\n    this.findAll(identifier).map((subscription) =>\n      this.guarantor.forget(subscription))\n  }\n\n  sendCommand(subscription, command) {\n    const {identifier} = subscription\n    return this.consumer.send({command, identifier})\n  }\n}\n", "import Connection from \"./connection\"\nimport Subscriptions from \"./subscriptions\"\n\n// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,\n// the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.\n// The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription\n// method.\n//\n// The following example shows how this can be set up:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n//\n// When a consumer is created, it automatically connects with the server.\n//\n// To disconnect from the server, call\n//\n//   App.cable.disconnect()\n//\n// and to restart the connection:\n//\n//   App.cable.connect()\n//\n// Any channel subscriptions which existed prior to disconnecting will\n// automatically resubscribe.\n\nexport default class Consumer {\n  constructor(url) {\n    this._url = url\n    this.subscriptions = new Subscriptions(this)\n    this.connection = new Connection(this)\n  }\n\n  get url() {\n    return createWebSocketURL(this._url)\n  }\n\n  send(data) {\n    return this.connection.send(data)\n  }\n\n  connect() {\n    return this.connection.open()\n  }\n\n  disconnect() {\n    return this.connection.close({allowReconnect: false})\n  }\n\n  ensureActiveConnection() {\n    if (!this.connection.isActive()) {\n      return this.connection.open()\n    }\n  }\n}\n\nexport function createWebSocketURL(url) {\n  if (typeof url === \"function\") {\n    url = url()\n  }\n\n  if (url && !/^wss?:/i.test(url)) {\n    const a = document.createElement(\"a\")\n    a.href = url\n    // Fix populating Location properties in IE. Otherwise, protocol will be blank.\n    a.href = a.href\n    a.protocol = a.protocol.replace(\"http\", \"ws\")\n    return a.href\n  } else {\n    return url\n  }\n}\n", "import Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport Subscription from \"./subscription\"\nimport Subscriptions from \"./subscriptions\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport adapters from \"./adapters\"\nimport logger from \"./logger\"\n\nexport {\n  Connection,\n  ConnectionMonitor,\n  Consumer,\n  INTERNAL,\n  Subscription,\n  Subscriptions,\n  SubscriptionGuarantor,\n  adapters,\n  createWebSocketURL,\n  logger,\n}\n\nexport function createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n  return new Consumer(url)\n}\n\nexport function getConfig(name) {\n  const element = document.head.querySelector(`meta[name='action-cable-${name}']`)\n  if (element) {\n    return element.getAttribute(\"content\")\n  }\n}\n", "'use strict';\n\nvar _SETTINGS = {};\nvar defaultStyle = void 0;\nvar defaultHTML = void 0;\nvar _defaults = {\n  distThreshold: 60,\n  distMax: 80,\n  distReload: 50,\n  bodyOffset: 20,\n  mainElement: 'body',\n  triggerElement: 'body',\n  ptrElement: '.ptr',\n  classPrefix: 'ptr--',\n  cssProp: 'min-height',\n  containerClassName: '',\n  boxClassName: '',\n  contentClassName: '',\n  textClassName: '',\n  instructionsPullToRefresh: 'Pull down to refresh',\n  instructionsReleaseToRefresh: 'Release to refresh',\n  instructionsRefreshing: 'Refreshing',\n  refreshTimeout: 500,\n  onInit: function onInit() {},\n  onRefresh: function onRefresh() {\n    return location.reload();\n  },\n  resistanceFunction: function resistanceFunction(t) {\n    return Math.min(1, t / 2.5);\n  }\n};\n\nvar pullStartY = null;\nvar pullMoveY = null;\nvar dist = 0;\nvar distResisted = 0;\n\nvar _state = 'pending';\nvar _setup = false;\nvar _enable = false;\nvar _timeout = void 0;\n\nfunction _update() {\n  var _SETTINGS2 = _SETTINGS,\n      classPrefix = _SETTINGS2.classPrefix,\n      ptrElement = _SETTINGS2.ptrElement,\n      instructionsRefreshing = _SETTINGS2.instructionsRefreshing,\n      instructionsPullToRefresh = _SETTINGS2.instructionsPullToRefresh,\n      instructionsReleaseToRefresh = _SETTINGS2.instructionsReleaseToRefresh;\n\n\n  var textEl = ptrElement.querySelector('.' + classPrefix + 'text');\n\n  if (_state === 'releasing') {\n    textEl.innerHTML = instructionsReleaseToRefresh;\n  }\n\n  if (_state === 'pulling' || _state === 'pending') {\n    textEl.innerHTML = instructionsPullToRefresh;\n  }\n\n  if (_state === 'refreshing') {\n    textEl.innerHTML = instructionsRefreshing;\n  }\n}\n\nfunction _setupEvents() {\n  function onReset() {\n    var _SETTINGS3 = _SETTINGS,\n        cssProp = _SETTINGS3.cssProp,\n        ptrElement = _SETTINGS3.ptrElement,\n        classPrefix = _SETTINGS3.classPrefix;\n\n\n    ptrElement.classList.remove(classPrefix + 'refresh');\n    ptrElement.style[cssProp] = '0px';\n\n    _state = 'pending';\n  }\n\n  function _onTouchStart(e) {\n    var _SETTINGS4 = _SETTINGS,\n        triggerElement = _SETTINGS4.triggerElement;\n\n\n    if (!window.scrollY) {\n      pullStartY = e.touches[0].screenY;\n    }\n\n    if (_state !== 'pending') {\n      return;\n    }\n\n    clearTimeout(_timeout);\n\n    _enable = triggerElement.contains(e.target);\n    _state = 'pending';\n    _update();\n  }\n\n  function _onTouchMove(e) {\n    var _SETTINGS5 = _SETTINGS,\n        ptrElement = _SETTINGS5.ptrElement,\n        resistanceFunction = _SETTINGS5.resistanceFunction,\n        distMax = _SETTINGS5.distMax,\n        distThreshold = _SETTINGS5.distThreshold,\n        cssProp = _SETTINGS5.cssProp,\n        classPrefix = _SETTINGS5.classPrefix;\n\n\n    if (!pullStartY) {\n      if (!window.scrollY) {\n        pullStartY = e.touches[0].screenY;\n      }\n    } else {\n      pullMoveY = e.touches[0].screenY;\n    }\n\n    if (!_enable || _state === 'refreshing') {\n      if (!window.scrollY && pullStartY < pullMoveY) {\n        e.preventDefault();\n      }\n\n      return;\n    }\n\n    if (_state === 'pending') {\n      ptrElement.classList.add(classPrefix + 'pull');\n      _state = 'pulling';\n      _update();\n    }\n\n    if (pullStartY && pullMoveY) {\n      dist = pullMoveY - pullStartY;\n    }\n\n    if (dist > 0) {\n      e.preventDefault();\n\n      ptrElement.style[cssProp] = distResisted + 'px';\n\n      distResisted = resistanceFunction(dist / distThreshold) * Math.min(distMax, dist);\n\n      if (_state === 'pulling' && distResisted > distThreshold) {\n        ptrElement.classList.add(classPrefix + 'release');\n        _state = 'releasing';\n        _update();\n      }\n\n      if (_state === 'releasing' && distResisted < distThreshold) {\n        ptrElement.classList.remove(classPrefix + 'release');\n        _state = 'pulling';\n        _update();\n      }\n    }\n  }\n\n  function _onTouchEnd() {\n    var _SETTINGS6 = _SETTINGS,\n        ptrElement = _SETTINGS6.ptrElement,\n        onRefresh = _SETTINGS6.onRefresh,\n        refreshTimeout = _SETTINGS6.refreshTimeout,\n        distThreshold = _SETTINGS6.distThreshold,\n        distReload = _SETTINGS6.distReload,\n        cssProp = _SETTINGS6.cssProp,\n        classPrefix = _SETTINGS6.classPrefix;\n\n\n    if (_state === 'releasing' && distResisted > distThreshold) {\n      _state = 'refreshing';\n\n      ptrElement.style[cssProp] = distReload + 'px';\n      ptrElement.classList.add(classPrefix + 'refresh');\n\n      _timeout = setTimeout(function () {\n        var retval = onRefresh(onReset);\n\n        if (retval && typeof retval.then === 'function') {\n          retval.then(function () {\n            return onReset();\n          });\n        }\n\n        if (!retval && !onRefresh.length) {\n          onReset();\n        }\n      }, refreshTimeout);\n    } else {\n      if (_state === 'refreshing') {\n        return;\n      }\n\n      ptrElement.style[cssProp] = '0px';\n\n      _state = 'pending';\n    }\n\n    _update();\n\n    ptrElement.classList.remove(classPrefix + 'release');\n    ptrElement.classList.remove(classPrefix + 'pull');\n\n    pullStartY = pullMoveY = null;\n    dist = distResisted = 0;\n  }\n\n  window.addEventListener('touchend', _onTouchEnd);\n  window.addEventListener('touchstart', _onTouchStart);\n  window.addEventListener('touchmove', _onTouchMove, { passive: false });\n\n  // Store event handlers to use for teardown later\n  return {\n    onTouchStart: _onTouchStart,\n    onTouchMove: _onTouchMove,\n    onTouchEnd: _onTouchEnd\n  };\n}\n\nfunction _run() {\n  var _SETTINGS7 = _SETTINGS,\n      mainElement = _SETTINGS7.mainElement,\n      classPrefix = _SETTINGS7.classPrefix,\n      onInit = _SETTINGS7.onInit,\n      containerClassName = _SETTINGS7.containerClassName;\n\n\n  if (!_SETTINGS.ptrElement) {\n    var ptr = document.createElement('div');\n    if (mainElement !== document.body) {\n      mainElement.parentNode.insertBefore(ptr, mainElement);\n    } else {\n      document.body.insertBefore(ptr, document.body.firstChild);\n    }\n\n    ptr.classList.add(classPrefix + 'ptr');\n    if (containerClassName !== '') {\n      ptr.classList.add('' + containerClassName);\n    }\n    ptr.innerHTML = defaultHTML;\n    _SETTINGS.ptrElement = ptr;\n  }\n\n  var styleEl = document.createElement('style');\n\n  styleEl.textContent = defaultStyle;\n\n  // document.head.appendChild(styleEl);\n\n  document.head.insertBefore(styleEl, document.head.firstChild);\n\n  if (typeof onInit === 'function') {\n    onInit(_SETTINGS);\n  }\n\n  return {\n    styleNode: styleEl,\n    ptrElement: _SETTINGS.ptrElement\n  };\n}\n\nvar updateElement = function updateElement() {\n  defaultStyle = '\\n    .' + _SETTINGS.classPrefix + 'ptr {\\n      background: #E0E0E0;\\n      pointer-events: none;\\n      font-size: 0.85em;\\n      font-weight: bold;\\n      top: 0;\\n      height: 0;\\n      transition: height 0.3s, min-height 0.3s;\\n      text-align: center;\\n      width: 100%;\\n      overflow: hidden;\\n      display: flex;\\n      align-items: flex-end;\\n      align-content: stretch;\\n    }\\n    .' + _SETTINGS.classPrefix + 'box {\\n      padding: 10px;\\n      flex-basis: 100%;\\n    }\\n    .' + _SETTINGS.classPrefix + 'pull {\\n      transition: none;\\n    }\\n    .' + _SETTINGS.classPrefix + 'release .' + _SETTINGS.classPrefix + 'icon {\\n      transform: rotate(180deg);\\n    }\\n  ';\n\n  defaultHTML = '\\n    <div class=\"' + _SETTINGS.classPrefix + 'box' + (_SETTINGS.boxClassName ? ' ' + _SETTINGS.boxClassName : '') + '\">\\n      <div class=\"' + _SETTINGS.classPrefix + 'content' + (_SETTINGS.contentClassName ? ' ' + _SETTINGS.contentClassName : '') + '\">\\n        <div class=\"' + _SETTINGS.classPrefix + 'text' + (_SETTINGS.textClassName ? ' ' + _SETTINGS.textClassName : '') + '\"></div>\\n      </div>\\n    </div>\\n  ';\n};\n\nvar Pull = {\n  init: function init() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    var handlers = void 0;\n    Object.keys(_defaults).forEach(function (key) {\n      _SETTINGS[key] = options[key] || _defaults[key];\n    });\n\n    if (typeof _SETTINGS.mainElement === 'string') {\n      _SETTINGS.mainElement = document.querySelector(_SETTINGS.mainElement);\n    }\n\n    if (typeof _SETTINGS.ptrElement === 'string') {\n      _SETTINGS.ptrElement = document.querySelector(_SETTINGS.ptrElement);\n    }\n\n    if (typeof _SETTINGS.triggerElement === 'string') {\n      _SETTINGS.triggerElement = document.querySelector(_SETTINGS.triggerElement);\n    }\n\n    updateElement();\n\n    if (!_setup) {\n      handlers = _setupEvents();\n      _setup = true;\n    }\n\n    var _run2 = _run(),\n        styleNode = _run2.styleNode,\n        ptrElement = _run2.ptrElement;\n\n    return {\n      destroy: function destroy() {\n        // Teardown event listeners\n        window.removeEventListener('touchstart', handlers.onTouchStart);\n        window.removeEventListener('touchend', handlers.onTouchEnd);\n        window.removeEventListener('touchmove', handlers.onTouchMove);\n\n        // Remove ptr element and style tag\n        styleNode.parentNode.removeChild(styleNode);\n        ptrElement.parentNode.removeChild(ptrElement);\n\n        // Enable setupEvents to run again\n        _setup = false;\n\n        // null object references\n        handlers = null;\n        styleNode = null;\n        ptrElement = null;\n        _SETTINGS = {};\n      }\n    };\n  }\n};\n\nmodule.exports = Pull;", "// Reports JavaScript errors thrown in our own bundles to /js_errors (JsError).\n// Imported once by every layout bundle (application, admin, booking, kiosk,\n// pages, guides, public_share); add-on bundles on top of them are covered by\n// the host's listener. Errors from browser extensions, tag managers and other\n// third-party scripts are dropped here, and the server drops them again.\n// Readable messages need crossorigin on our script tags (docs/js-errors.md).\nconst MAX_REPORTS_PER_PAGE = 5;\n\n// boot_check.js reports a page whose bundle never got this far (a parse error\n// on an old browser kills this reporter too). Imported first, so this runs\n// before any other module of the bundle.\nwindow.gamerBooted = true;\n// An own frame ends in <origin>/assets/<entry>-<64 hex digest>.js:<line>:<column>\n// (no digest in test and development). Anchored at the end: a V8 eval frame\n// names the script that called eval earlier in the line, but runs elsewhere.\nconst OWN_FRAME =\n  /https?:\\/\\/[^\\s/]+(\\/assets\\/[a-z_]+(?:-[0-9a-f]{64})?\\.js):(\\d+):(\\d+)\\)?\\s*$/;\n// Stack lines that are frames with a position of their own (V8 \"at \u2026\",\n// Gecko/JSC \"fn@\u2026\"). Builtins (`Array.map (<anonymous>)`, `[native code]`)\n// have none and are skipped, so our code calling into them still counts.\nconst POSITIONED_FRAME = /:\\d+:\\d+\\)?\\s*$/;\nconst BUILTIN_FRAME = /\\[native code\\]|\\(<anonymous>\\)\\s*$|\\(native\\)\\s*$/;\n\n// A fetch that lost the connection (Chrome, Safari, Firefox wording). Turbo\n// rethrows these and aborted requests after handling them: a failed visit\n// falls back to a full page load, an aborted one was superseded by the next\n// tap. Nothing in our code to fix (docs/js-errors.md).\nconst NETWORK_FAILURE =\n  /^(Failed to fetch|Load failed|NetworkError when attempting to fetch resource\\.?)$/;\n// Firefox's cross-compartment security error. Our code never touches another\n// frame or window, so the object came from a browser extension: e.g. a node it\n// inserted, which Stimulus' MutationObserver then reads `nodeType` on.\nconst FOREIGN_OBJECT = /^Permission denied to access (property|object)\\b/;\n\nlet sent = 0;\nconst seen = new Set();\n// Where the page came from when the error hit, sent as `context`: a crash on a\n// back/forward restore, a Turbo cache preview or in a just-loaded frame looks\n// the same in the stack as one on a fresh load.\nlet lastVisit = null;\nlet lastFrame = null;\nlet lastRenderAt = 0;\n\ndocument.addEventListener(\"turbo:visit\", (event) => {\n  lastVisit = event.detail.action;\n});\ndocument.addEventListener(\"turbo:load\", () => {\n  lastRenderAt = performance.now();\n});\ndocument.addEventListener(\"turbo:frame-load\", (event) => {\n  lastFrame = event.target.id || \"frame\";\n});\n\nwindow.addEventListener(\"error\", (event) => {\n  if (isBrowserNoise(event.error)) return;\n  const own =\n    ownFrame(`${event.filename}:${event.lineno}:${event.colno}`) ||\n    ownStackFrame(event.error?.stack);\n  if (own) report(event.message, own, event.error?.stack);\n});\n\nwindow.addEventListener(\"unhandledrejection\", (event) => {\n  const reason = event.reason;\n  if (isBrowserNoise(reason)) return;\n  const own = ownStackFrame(reason?.stack);\n  if (own) report(reason?.message || String(reason), own, reason?.stack);\n});\n\nfunction isBrowserNoise(error) {\n  return (\n    error?.name === \"AbortError\" ||\n    (error?.name === \"TypeError\" && NETWORK_FAILURE.test(error.message)) ||\n    FOREIGN_OBJECT.test(error?.message)\n  );\n}\n\n// The first frame with code of its own decides, not any frame further down:\n// an inline or injected script that Turbo runs (`<anonymous>:1:1`, e.g. from\n// a browser extension) has Turbo's activateScriptElements, ours, below it.\nfunction ownStackFrame(stack) {\n  for (const line of String(stack || \"\").split(\"\\n\")) {\n    if (BUILTIN_FRAME.test(line) || !POSITIONED_FRAME.test(line)) continue;\n    return ownFrame(line);\n  }\n  return null;\n}\n\n// The own-bundle location in a \"file:line:column\" string.\nfunction ownFrame(text) {\n  const match = OWN_FRAME.exec(text || \"\");\n  return match && { source: match[1], line: +match[2], column: +match[3] };\n}\n\n// keepalive lets the report outlive a page that is being left. Failures are\n// ignored: a lost report must never turn into another error.\nfunction report(message, { source, line, column }, stack) {\n  const key = `${message}|${source}|${line}|${column}`;\n  if (sent >= MAX_REPORTS_PER_PAGE || seen.has(key)) return;\n  sent += 1;\n  seen.add(key);\n\n  fetch(\"/js_errors\", {\n    method: \"POST\",\n    keepalive: true,\n    headers: { \"Content-Type\": \"application/json\" },\n    body: JSON.stringify({\n      message: String(message || \"unknown\").slice(0, 500),\n      source,\n      line,\n      column,\n      // Hosts stripped: every frame is ours or a browser internal anyway.\n      stack: String(stack || \"\")\n        .replace(/https?:\\/\\/[^\\s/)]+/g, \"\")\n        .slice(0, 4000),\n      page: window.location.pathname,\n      context: context(),\n    }),\n  }).catch(() => {});\n}\n\n// Scalars only; the server keeps the keys it knows (JsError::CONTEXT_KEYS).\nfunction context() {\n  return {\n    navigation: performance.getEntriesByType?.(\"navigation\")[0]?.type,\n    turbo_visit: lastVisit,\n    turbo_preview: document.documentElement.hasAttribute(\"data-turbo-preview\"),\n    frame: lastFrame,\n    ms_since_load: Math.round(performance.now()),\n    ms_since_render: lastRenderAt\n      ? Math.round(performance.now() - lastRenderAt)\n      : null,\n    visibility: document.visibilityState,\n  };\n}\n", "// HTMLFormElement#requestSubmit for Safari before 16.0 (every iPhone stuck on\n// iOS 15). Turbo 8 submits a `data-turbo-method` link by building a form and\n// calling form.requestSubmit() with no polyfill of its own, so on those\n// browsers every such link was a dead tap: the click was swallowed and the\n// TypeError thrown from a requestAnimationFrame callback (the wheel's Next\n// and Skip on users/goal_notifications, Oct 2026). Imported before Turbo in\n// every bundle that loads it. Clicking a hidden submit button fires the same\n// `submit` event Turbo's FormSubmitObserver listens for, with the button as\n// the submitter, so Turbo's interception runs unchanged.\n// After https://github.com/javan/form-request-submit-polyfill (MIT).\n(function (prototype) {\n  if (typeof prototype.requestSubmit === \"function\") return;\n\n  prototype.requestSubmit = function (submitter) {\n    if (submitter) {\n      validateSubmitter(submitter, this);\n      submitter.click();\n      return;\n    }\n    submitter = document.createElement(\"input\");\n    submitter.type = \"submit\";\n    submitter.hidden = true;\n    this.appendChild(submitter);\n    submitter.click();\n    this.removeChild(submitter);\n  };\n\n  function validateSubmitter(submitter, form) {\n    if (!(submitter instanceof HTMLElement))\n      raise(TypeError, \"parameter 1 is not of type 'HTMLElement'\");\n    if (submitter.type !== \"submit\")\n      raise(TypeError, \"The specified element is not a submit button\");\n    if (submitter.form !== form)\n      raise(\n        DOMException,\n        \"The specified element is not owned by this form element\",\n        \"NotFoundError\",\n      );\n  }\n\n  function raise(ErrorConstructor, message, name) {\n    throw new ErrorConstructor(\n      `Failed to execute 'requestSubmit' on 'HTMLFormElement': ${message}.`,\n      name,\n    );\n  }\n})(HTMLFormElement.prototype);\n", "/*!\nTurbo 8.0.23\nCopyright \u00A9 2026 37signals LLC\n */\nconst FrameLoadingStyle = {\n  eager: \"eager\",\n  lazy: \"lazy\"\n};\n\n/**\n * Contains a fragment of HTML which is updated based on navigation within\n * it (e.g. via links or form submissions).\n *\n * @customElement turbo-frame\n * @example\n *   <turbo-frame id=\"messages\">\n *     <a href=\"/messages/expanded\">\n *       Show all expanded messages in this frame.\n *     </a>\n *\n *     <form action=\"/messages\">\n *       Show response from this form within this frame.\n *     </form>\n *   </turbo-frame>\n */\nclass FrameElement extends HTMLElement {\n  static delegateConstructor = undefined\n\n  loaded = Promise.resolve()\n\n  static get observedAttributes() {\n    return [\"disabled\", \"loading\", \"src\"]\n  }\n\n  constructor() {\n    super();\n    this.delegate = new FrameElement.delegateConstructor(this);\n  }\n\n  connectedCallback() {\n    this.delegate.connect();\n  }\n\n  disconnectedCallback() {\n    this.delegate.disconnect();\n  }\n\n  reload() {\n    return this.delegate.sourceURLReloaded()\n  }\n\n  attributeChangedCallback(name) {\n    if (name == \"loading\") {\n      this.delegate.loadingStyleChanged();\n    } else if (name == \"src\") {\n      this.delegate.sourceURLChanged();\n    } else if (name == \"disabled\") {\n      this.delegate.disabledChanged();\n    }\n  }\n\n  /**\n   * Gets the URL to lazily load source HTML from\n   */\n  get src() {\n    return this.getAttribute(\"src\")\n  }\n\n  /**\n   * Sets the URL to lazily load source HTML from\n   */\n  set src(value) {\n    if (value) {\n      this.setAttribute(\"src\", value);\n    } else {\n      this.removeAttribute(\"src\");\n    }\n  }\n\n  /**\n   * Gets the refresh mode for the frame.\n   */\n  get refresh() {\n    return this.getAttribute(\"refresh\")\n  }\n\n  /**\n   * Sets the refresh mode for the frame.\n   */\n  set refresh(value) {\n    if (value) {\n      this.setAttribute(\"refresh\", value);\n    } else {\n      this.removeAttribute(\"refresh\");\n    }\n  }\n\n  get shouldReloadWithMorph() {\n    return this.src && this.refresh === \"morph\"\n  }\n\n  /**\n   * Determines if the element is loading\n   */\n  get loading() {\n    return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\")\n  }\n\n  /**\n   * Sets the value of if the element is loading\n   */\n  set loading(value) {\n    if (value) {\n      this.setAttribute(\"loading\", value);\n    } else {\n      this.removeAttribute(\"loading\");\n    }\n  }\n\n  /**\n   * Gets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  get disabled() {\n    return this.hasAttribute(\"disabled\")\n  }\n\n  /**\n   * Sets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  set disabled(value) {\n    if (value) {\n      this.setAttribute(\"disabled\", \"\");\n    } else {\n      this.removeAttribute(\"disabled\");\n    }\n  }\n\n  /**\n   * Gets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  get autoscroll() {\n    return this.hasAttribute(\"autoscroll\")\n  }\n\n  /**\n   * Sets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  set autoscroll(value) {\n    if (value) {\n      this.setAttribute(\"autoscroll\", \"\");\n    } else {\n      this.removeAttribute(\"autoscroll\");\n    }\n  }\n\n  /**\n   * Determines if the element has finished loading\n   */\n  get complete() {\n    return !this.delegate.isLoading\n  }\n\n  /**\n   * Gets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isActive() {\n    return this.ownerDocument === document && !this.isPreview\n  }\n\n  /**\n   * Sets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isPreview() {\n    return this.ownerDocument?.documentElement?.hasAttribute(\"data-turbo-preview\")\n  }\n}\n\nfunction frameLoadingStyleFromString(style) {\n  switch (style.toLowerCase()) {\n    case \"lazy\":\n      return FrameLoadingStyle.lazy\n    default:\n      return FrameLoadingStyle.eager\n  }\n}\n\nconst drive = {\n  enabled: true,\n  progressBarDelay: 500,\n  unvisitableExtensions: new Set(\n    [\n      \".7z\", \".aac\", \".apk\", \".avi\", \".bmp\", \".bz2\", \".css\", \".csv\", \".deb\", \".dmg\", \".doc\",\n      \".docx\", \".exe\", \".gif\", \".gz\", \".heic\", \".heif\", \".ico\", \".iso\", \".jpeg\", \".jpg\",\n      \".js\", \".json\", \".m4a\", \".mkv\", \".mov\", \".mp3\", \".mp4\", \".mpeg\", \".mpg\", \".msi\",\n      \".ogg\", \".ogv\", \".pdf\", \".pkg\", \".png\", \".ppt\", \".pptx\", \".rar\", \".rtf\",\n      \".svg\", \".tar\", \".tif\", \".tiff\", \".txt\", \".wav\", \".webm\", \".webp\", \".wma\", \".wmv\",\n      \".xls\", \".xlsx\", \".xml\", \".zip\"\n    ]\n  )\n};\n\nfunction activateScriptElement(element) {\n  if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n    return element\n  } else {\n    const createdScriptElement = document.createElement(\"script\");\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      createdScriptElement.nonce = cspNonce;\n    }\n    createdScriptElement.textContent = element.textContent;\n    createdScriptElement.async = false;\n    copyElementAttributes(createdScriptElement, element);\n    return createdScriptElement\n  }\n}\n\nfunction copyElementAttributes(destinationElement, sourceElement) {\n  for (const { name, value } of sourceElement.attributes) {\n    destinationElement.setAttribute(name, value);\n  }\n}\n\nfunction createDocumentFragment(html) {\n  const template = document.createElement(\"template\");\n  template.innerHTML = html;\n  return template.content\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n  const event = new CustomEvent(eventName, {\n    cancelable,\n    bubbles: true,\n    composed: true,\n    detail\n  });\n\n  if (target && target.isConnected) {\n    target.dispatchEvent(event);\n  } else {\n    document.documentElement.dispatchEvent(event);\n  }\n\n  return event\n}\n\nfunction cancelEvent(event) {\n  event.preventDefault();\n  event.stopImmediatePropagation();\n}\n\nfunction nextRepaint() {\n  if (document.visibilityState === \"hidden\") {\n    return nextEventLoopTick()\n  } else {\n    return nextAnimationFrame()\n  }\n}\n\nfunction nextAnimationFrame() {\n  return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction nextEventLoopTick() {\n  return new Promise((resolve) => setTimeout(() => resolve(), 0))\n}\n\nfunction parseHTMLDocument(html = \"\") {\n  return new DOMParser().parseFromString(html, \"text/html\")\n}\n\nfunction unindent(strings, ...values) {\n  const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n  const match = lines[0].match(/^\\s+/);\n  const indent = match ? match[0].length : 0;\n  return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nfunction interpolate(strings, values) {\n  return strings.reduce((result, string, i) => {\n    const value = values[i] == undefined ? \"\" : values[i];\n    return result + string + value\n  }, \"\")\n}\n\nfunction uuid() {\n  return Array.from({ length: 36 })\n    .map((_, i) => {\n      if (i == 8 || i == 13 || i == 18 || i == 23) {\n        return \"-\"\n      } else if (i == 14) {\n        return \"4\"\n      } else if (i == 19) {\n        return (Math.floor(Math.random() * 4) + 8).toString(16)\n      } else {\n        return Math.floor(Math.random() * 16).toString(16)\n      }\n    })\n    .join(\"\")\n}\n\nfunction getAttribute(attributeName, ...elements) {\n  for (const value of elements.map((element) => element?.getAttribute(attributeName))) {\n    if (typeof value == \"string\") return value\n  }\n\n  return null\n}\n\nfunction hasAttribute(attributeName, ...elements) {\n  return elements.some((element) => element && element.hasAttribute(attributeName))\n}\n\nfunction markAsBusy(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.setAttribute(\"busy\", \"\");\n    }\n    element.setAttribute(\"aria-busy\", \"true\");\n  }\n}\n\nfunction clearBusyState(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.removeAttribute(\"busy\");\n    }\n\n    element.removeAttribute(\"aria-busy\");\n  }\n}\n\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n  return new Promise((resolve) => {\n    const onComplete = () => {\n      element.removeEventListener(\"error\", onComplete);\n      element.removeEventListener(\"load\", onComplete);\n      resolve();\n    };\n\n    element.addEventListener(\"load\", onComplete, { once: true });\n    element.addEventListener(\"error\", onComplete, { once: true });\n    setTimeout(resolve, timeoutInMilliseconds);\n  })\n}\n\nfunction getHistoryMethodForAction(action) {\n  switch (action) {\n    case \"replace\":\n      return history.replaceState\n    case \"advance\":\n    case \"restore\":\n      return history.pushState\n  }\n}\n\nfunction isAction(action) {\n  return action == \"advance\" || action == \"replace\" || action == \"restore\"\n}\n\nfunction getVisitAction(...elements) {\n  const action = getAttribute(\"data-turbo-action\", ...elements);\n\n  return isAction(action) ? action : null\n}\n\nfunction getMetaElement(name) {\n  return document.querySelector(`meta[name=\"${name}\"]`)\n}\n\nfunction getMetaContent(name) {\n  const element = getMetaElement(name);\n  return element && element.content\n}\n\nfunction getCspNonce() {\n  const element = getMetaElement(\"csp-nonce\");\n\n  if (element) {\n    const { nonce, content } = element;\n    return nonce == \"\" ? content : nonce\n  }\n}\n\nfunction setMetaContent(name, content) {\n  let element = getMetaElement(name);\n\n  if (!element) {\n    element = document.createElement(\"meta\");\n    element.setAttribute(\"name\", name);\n\n    document.head.appendChild(element);\n  }\n\n  element.setAttribute(\"content\", content);\n\n  return element\n}\n\nfunction findClosestRecursively(element, selector) {\n  if (element instanceof Element) {\n    return (\n      element.closest(selector) || findClosestRecursively(element.assignedSlot || element.getRootNode()?.host, selector)\n    )\n  }\n}\n\nfunction elementIsFocusable(element) {\n  const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n\n  return !!element && element.closest(inertDisabledOrHidden) == null && typeof element.focus == \"function\"\n}\n\nfunction queryAutofocusableElement(elementOrDocumentFragment) {\n  return Array.from(elementOrDocumentFragment.querySelectorAll(\"[autofocus]\")).find(elementIsFocusable)\n}\n\nasync function around(callback, reader) {\n  const before = reader();\n\n  callback();\n\n  await nextAnimationFrame();\n\n  const after = reader();\n\n  return [before, after]\n}\n\nfunction doesNotTargetIFrame(name) {\n  if (name === \"_blank\") {\n    return false\n  } else if (name) {\n    for (const element of document.getElementsByName(name)) {\n      if (element instanceof HTMLIFrameElement) return false\n    }\n\n    return true\n  } else {\n    return true\n  }\n}\n\nfunction findLinkFromClickTarget(target) {\n  const link = findClosestRecursively(target, \"a[href], a[xlink\\\\:href]\");\n\n  if (!link) return null\n  if (link.href.startsWith(\"#\")) return null\n  if (link.hasAttribute(\"download\")) return null\n\n  const linkTarget = link.getAttribute(\"target\");\n  if (linkTarget && linkTarget !== \"_self\") return null\n\n  return link\n}\n\nfunction debounce(fn, delay) {\n  let timeoutId = null;\n\n  return (...args) => {\n    const callback = () => fn.apply(this, args);\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(callback, delay);\n  }\n}\n\nconst submitter = {\n  \"aria-disabled\": {\n    beforeSubmit: submitter => {\n      submitter.setAttribute(\"aria-disabled\", \"true\");\n      submitter.addEventListener(\"click\", cancelEvent);\n    },\n\n    afterSubmit: submitter => {\n      submitter.removeAttribute(\"aria-disabled\");\n      submitter.removeEventListener(\"click\", cancelEvent);\n    }\n  },\n\n  \"disabled\": {\n    beforeSubmit: submitter => submitter.disabled = true,\n    afterSubmit: submitter => submitter.disabled = false\n  }\n};\n\nclass Config {\n  #submitter = null\n\n  constructor(config) {\n    Object.assign(this, config);\n  }\n\n  get submitter() {\n    return this.#submitter\n  }\n\n  set submitter(value) {\n    this.#submitter = submitter[value] || value;\n  }\n}\n\nconst forms = new Config({\n  mode: \"on\",\n  submitter: \"disabled\"\n});\n\nconst config = {\n  drive,\n  forms\n};\n\nfunction expandURL(locatable) {\n  return new URL(locatable.toString(), document.baseURI)\n}\n\nfunction getAnchor(url) {\n  let anchorMatch;\n  if (url.hash) {\n    return url.hash.slice(1)\n    // eslint-disable-next-line no-cond-assign\n  } else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n    return anchorMatch[1]\n  }\n}\n\nfunction getAction$1(form, submitter) {\n  const action = submitter?.getAttribute(\"formaction\") || form.getAttribute(\"action\") || form.action;\n\n  return expandURL(action)\n}\n\nfunction getExtension(url) {\n  return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\"\n}\n\nfunction isPrefixedBy(baseURL, url) {\n  const prefix = addTrailingSlash(url.origin + url.pathname);\n  return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix)\n}\n\nfunction locationIsVisitable(location, rootLocation) {\n  return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location))\n}\n\nfunction getLocationForLink(link) {\n  return expandURL(link.getAttribute(\"href\") || \"\")\n}\n\nfunction getRequestURL(url) {\n  const anchor = getAnchor(url);\n  return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href\n}\n\nfunction toCacheKey(url) {\n  return getRequestURL(url)\n}\n\nfunction urlsAreEqual(left, right) {\n  return expandURL(left).href == expandURL(right).href\n}\n\nfunction getPathComponents(url) {\n  return url.pathname.split(\"/\").slice(1)\n}\n\nfunction getLastPathComponent(url) {\n  return getPathComponents(url).slice(-1)[0]\n}\n\nfunction addTrailingSlash(value) {\n  return value.endsWith(\"/\") ? value : value + \"/\"\n}\n\nclass FetchResponse {\n  constructor(response) {\n    this.response = response;\n  }\n\n  get succeeded() {\n    return this.response.ok\n  }\n\n  get failed() {\n    return !this.succeeded\n  }\n\n  get clientError() {\n    return this.statusCode >= 400 && this.statusCode <= 499\n  }\n\n  get serverError() {\n    return this.statusCode >= 500 && this.statusCode <= 599\n  }\n\n  get redirected() {\n    return this.response.redirected\n  }\n\n  get location() {\n    return expandURL(this.response.url)\n  }\n\n  get isHTML() {\n    return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/)\n  }\n\n  get statusCode() {\n    return this.response.status\n  }\n\n  get contentType() {\n    return this.header(\"Content-Type\")\n  }\n\n  get responseText() {\n    return this.response.clone().text()\n  }\n\n  get responseHTML() {\n    if (this.isHTML) {\n      return this.response.clone().text()\n    } else {\n      return Promise.resolve(undefined)\n    }\n  }\n\n  header(name) {\n    return this.response.headers.get(name)\n  }\n}\n\nclass LimitedSet extends Set {\n  constructor(maxSize) {\n    super();\n    this.maxSize = maxSize;\n  }\n\n  add(value) {\n    if (this.size >= this.maxSize) {\n      const iterator = this.values();\n      const oldestValue = iterator.next().value;\n      this.delete(oldestValue);\n    }\n    super.add(value);\n  }\n}\n\nconst recentRequests = new LimitedSet(20);\n\nfunction fetchWithTurboHeaders(url, options = {}) {\n  const modifiedHeaders = new Headers(options.headers || {});\n  const requestUID = uuid();\n  recentRequests.add(requestUID);\n  modifiedHeaders.append(\"X-Turbo-Request-Id\", requestUID);\n\n  return window.fetch(url, {\n    ...options,\n    headers: modifiedHeaders\n  })\n}\n\nfunction fetchMethodFromString(method) {\n  switch (method.toLowerCase()) {\n    case \"get\":\n      return FetchMethod.get\n    case \"post\":\n      return FetchMethod.post\n    case \"put\":\n      return FetchMethod.put\n    case \"patch\":\n      return FetchMethod.patch\n    case \"delete\":\n      return FetchMethod.delete\n  }\n}\n\nconst FetchMethod = {\n  get: \"get\",\n  post: \"post\",\n  put: \"put\",\n  patch: \"patch\",\n  delete: \"delete\"\n};\n\nfunction fetchEnctypeFromString(encoding) {\n  switch (encoding.toLowerCase()) {\n    case FetchEnctype.multipart:\n      return FetchEnctype.multipart\n    case FetchEnctype.plain:\n      return FetchEnctype.plain\n    default:\n      return FetchEnctype.urlEncoded\n  }\n}\n\nconst FetchEnctype = {\n  urlEncoded: \"application/x-www-form-urlencoded\",\n  multipart: \"multipart/form-data\",\n  plain: \"text/plain\"\n};\n\nclass FetchRequest {\n  abortController = new AbortController()\n  #resolveRequestPromise = (_value) => {}\n\n  constructor(delegate, method, location, requestBody = new URLSearchParams(), target = null, enctype = FetchEnctype.urlEncoded) {\n    const [url, body] = buildResourceAndBody(expandURL(location), method, requestBody, enctype);\n\n    this.delegate = delegate;\n    this.url = url;\n    this.target = target;\n    this.fetchOptions = {\n      credentials: \"same-origin\",\n      redirect: \"follow\",\n      method: method.toUpperCase(),\n      headers: { ...this.defaultHeaders },\n      body: body,\n      signal: this.abortSignal,\n      referrer: this.delegate.referrer?.href\n    };\n    this.enctype = enctype;\n  }\n\n  get method() {\n    return this.fetchOptions.method\n  }\n\n  set method(value) {\n    const fetchBody = this.isSafe ? this.url.searchParams : this.fetchOptions.body || new FormData();\n    const fetchMethod = fetchMethodFromString(value) || FetchMethod.get;\n\n    this.url.search = \"\";\n\n    const [url, body] = buildResourceAndBody(this.url, fetchMethod, fetchBody, this.enctype);\n\n    this.url = url;\n    this.fetchOptions.body = body;\n    this.fetchOptions.method = fetchMethod.toUpperCase();\n  }\n\n  get headers() {\n    return this.fetchOptions.headers\n  }\n\n  set headers(value) {\n    this.fetchOptions.headers = value;\n  }\n\n  get body() {\n    if (this.isSafe) {\n      return this.url.searchParams\n    } else {\n      return this.fetchOptions.body\n    }\n  }\n\n  set body(value) {\n    this.fetchOptions.body = value;\n  }\n\n  get location() {\n    return this.url\n  }\n\n  get params() {\n    return this.url.searchParams\n  }\n\n  get entries() {\n    return this.body ? Array.from(this.body.entries()) : []\n  }\n\n  cancel() {\n    this.abortController.abort();\n  }\n\n  async perform() {\n    const { fetchOptions } = this;\n    this.delegate.prepareRequest(this);\n    const event = await this.#allowRequestToBeIntercepted(fetchOptions);\n    try {\n      this.delegate.requestStarted(this);\n\n      if (event.detail.fetchRequest) {\n        this.response = event.detail.fetchRequest.response;\n      } else {\n        this.response = fetchWithTurboHeaders(this.url.href, fetchOptions);\n      }\n\n      const response = await this.response;\n      return await this.receive(response)\n    } catch (error) {\n      if (error.name !== \"AbortError\") {\n        if (this.#willDelegateErrorHandling(error)) {\n          this.delegate.requestErrored(this, error);\n        }\n        throw error\n      }\n    } finally {\n      this.delegate.requestFinished(this);\n    }\n  }\n\n  async receive(response) {\n    const fetchResponse = new FetchResponse(response);\n    const event = dispatch(\"turbo:before-fetch-response\", {\n      cancelable: true,\n      detail: { fetchResponse },\n      target: this.target\n    });\n    if (event.defaultPrevented) {\n      this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n    } else if (fetchResponse.succeeded) {\n      this.delegate.requestSucceededWithResponse(this, fetchResponse);\n    } else {\n      this.delegate.requestFailedWithResponse(this, fetchResponse);\n    }\n    return fetchResponse\n  }\n\n  get defaultHeaders() {\n    return {\n      Accept: \"text/html, application/xhtml+xml\"\n    }\n  }\n\n  get isSafe() {\n    return isSafe(this.method)\n  }\n\n  get abortSignal() {\n    return this.abortController.signal\n  }\n\n  acceptResponseType(mimeType) {\n    this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n  }\n\n  async #allowRequestToBeIntercepted(fetchOptions) {\n    const requestInterception = new Promise((resolve) => (this.#resolveRequestPromise = resolve));\n    const event = dispatch(\"turbo:before-fetch-request\", {\n      cancelable: true,\n      detail: {\n        fetchOptions,\n        url: this.url,\n        resume: this.#resolveRequestPromise\n      },\n      target: this.target\n    });\n    this.url = event.detail.url;\n    if (event.defaultPrevented) await requestInterception;\n\n    return event\n  }\n\n  #willDelegateErrorHandling(error) {\n    const event = dispatch(\"turbo:fetch-request-error\", {\n      target: this.target,\n      cancelable: true,\n      detail: { request: this, error: error }\n    });\n\n    return !event.defaultPrevented\n  }\n}\n\nfunction isSafe(fetchMethod) {\n  return fetchMethodFromString(fetchMethod) == FetchMethod.get\n}\n\nfunction buildResourceAndBody(resource, method, requestBody, enctype) {\n  const searchParams =\n    Array.from(requestBody).length > 0 ? new URLSearchParams(entriesExcludingFiles(requestBody)) : resource.searchParams;\n\n  if (isSafe(method)) {\n    return [mergeIntoURLSearchParams(resource, searchParams), null]\n  } else if (enctype == FetchEnctype.urlEncoded) {\n    return [resource, searchParams]\n  } else {\n    return [resource, requestBody]\n  }\n}\n\nfunction entriesExcludingFiles(requestBody) {\n  const entries = [];\n\n  for (const [name, value] of requestBody) {\n    if (value instanceof File) continue\n    else entries.push([name, value]);\n  }\n\n  return entries\n}\n\nfunction mergeIntoURLSearchParams(url, requestBody) {\n  const searchParams = new URLSearchParams(entriesExcludingFiles(requestBody));\n\n  url.search = searchParams.toString();\n\n  return url\n}\n\nclass AppearanceObserver {\n  started = false\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n    this.intersectionObserver = new IntersectionObserver(this.intersect);\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      this.intersectionObserver.observe(this.element);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      this.intersectionObserver.unobserve(this.element);\n    }\n  }\n\n  intersect = (entries) => {\n    const lastEntry = entries.slice(-1)[0];\n    if (lastEntry?.isIntersecting) {\n      this.delegate.elementAppearedInViewport(this.element);\n    }\n  }\n}\n\nclass StreamMessage {\n  static contentType = \"text/vnd.turbo-stream.html\"\n\n  static wrap(message) {\n    if (typeof message == \"string\") {\n      return new this(createDocumentFragment(message))\n    } else {\n      return message\n    }\n  }\n\n  constructor(fragment) {\n    this.fragment = importStreamElements(fragment);\n  }\n}\n\nfunction importStreamElements(fragment) {\n  for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n    const streamElement = document.importNode(element, true);\n\n    for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n      inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n    }\n\n    element.replaceWith(streamElement);\n  }\n\n  return fragment\n}\n\nconst identity = key => key;\n\nclass LRUCache {\n  keys = []\n  entries = {}\n  #toCacheKey\n\n  constructor(size, toCacheKey = identity) {\n    this.size = size;\n    this.#toCacheKey = toCacheKey;\n  }\n\n  has(key) {\n    return this.#toCacheKey(key) in this.entries\n  }\n\n  get(key) {\n    if (this.has(key)) {\n      const entry = this.read(key);\n      this.touch(key);\n      return entry\n    }\n  }\n\n  put(key, entry) {\n    this.write(key, entry);\n    this.touch(key);\n    return entry\n  }\n\n  clear() {\n    for (const key of Object.keys(this.entries)) {\n      this.evict(key);\n    }\n  }\n\n  // Private\n\n  read(key) {\n    return this.entries[this.#toCacheKey(key)]\n  }\n\n  write(key, entry) {\n    this.entries[this.#toCacheKey(key)] = entry;\n  }\n\n  touch(key) {\n    key = this.#toCacheKey(key);\n    const index = this.keys.indexOf(key);\n    if (index > -1) this.keys.splice(index, 1);\n    this.keys.unshift(key);\n    this.trim();\n  }\n\n  trim() {\n    for (const key of this.keys.splice(this.size)) {\n      this.evict(key);\n    }\n  }\n\n  evict(key) {\n    delete this.entries[key];\n  }\n}\n\nconst PREFETCH_DELAY = 100;\n\nclass PrefetchCache extends LRUCache {\n  #prefetchTimeout = null\n  #maxAges = {}\n\n  constructor(size = 1, prefetchDelay = PREFETCH_DELAY) {\n    super(size, toCacheKey);\n    this.prefetchDelay = prefetchDelay;\n  }\n\n  putLater(url, request, ttl) {\n    this.#prefetchTimeout = setTimeout(() => {\n      request.perform();\n      this.put(url, request, ttl);\n      this.#prefetchTimeout = null;\n    }, this.prefetchDelay);\n  }\n\n  put(url, request, ttl = cacheTtl) {\n    super.put(url, request);\n    this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl);\n  }\n\n  clear() {\n    super.clear();\n    if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout);\n  }\n\n  evict(key) {\n    super.evict(key);\n    delete this.#maxAges[key];\n  }\n\n  has(key) {\n    if (super.has(key)) {\n      const maxAge = this.#maxAges[toCacheKey(key)];\n\n      return maxAge && maxAge > Date.now()\n    } else {\n      return false\n    }\n  }\n}\n\nconst cacheTtl = 10 * 1000;\nconst prefetchCache = new PrefetchCache();\n\nconst FormSubmissionState = {\n  initialized: \"initialized\",\n  requesting: \"requesting\",\n  waiting: \"waiting\",\n  receiving: \"receiving\",\n  stopping: \"stopping\",\n  stopped: \"stopped\"\n};\n\nclass FormSubmission {\n  state = FormSubmissionState.initialized\n\n  static confirmMethod(message) {\n    return Promise.resolve(confirm(message))\n  }\n\n  constructor(delegate, formElement, submitter, mustRedirect = false) {\n    const method = getMethod(formElement, submitter);\n    const action = getAction(getFormAction(formElement, submitter), method);\n    const body = buildFormData(formElement, submitter);\n    const enctype = getEnctype(formElement, submitter);\n\n    this.delegate = delegate;\n    this.formElement = formElement;\n    this.submitter = submitter;\n    this.fetchRequest = new FetchRequest(this, method, action, body, formElement, enctype);\n    this.mustRedirect = mustRedirect;\n  }\n\n  get method() {\n    return this.fetchRequest.method\n  }\n\n  set method(value) {\n    this.fetchRequest.method = value;\n  }\n\n  get action() {\n    return this.fetchRequest.url.toString()\n  }\n\n  set action(value) {\n    this.fetchRequest.url = expandURL(value);\n  }\n\n  get body() {\n    return this.fetchRequest.body\n  }\n\n  get enctype() {\n    return this.fetchRequest.enctype\n  }\n\n  get isSafe() {\n    return this.fetchRequest.isSafe\n  }\n\n  get location() {\n    return this.fetchRequest.url\n  }\n\n  // The submission process\n\n  async start() {\n    const { initialized, requesting } = FormSubmissionState;\n    const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n\n    if (typeof confirmationMessage === \"string\") {\n      const confirmMethod = typeof config.forms.confirm === \"function\" ?\n        config.forms.confirm :\n        FormSubmission.confirmMethod;\n\n      const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter);\n      if (!answer) {\n        return\n      }\n    }\n\n    if (this.state == initialized) {\n      this.state = requesting;\n      return this.fetchRequest.perform()\n    }\n  }\n\n  stop() {\n    const { stopping, stopped } = FormSubmissionState;\n    if (this.state != stopping && this.state != stopped) {\n      this.state = stopping;\n      this.fetchRequest.cancel();\n      return true\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (!request.isSafe) {\n      const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n      if (token) {\n        request.headers[\"X-CSRF-Token\"] = token;\n      }\n    }\n\n    if (this.requestAcceptsTurboStreamResponse(request)) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    this.state = FormSubmissionState.waiting;\n    if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter);\n    this.setSubmitsWith();\n    markAsBusy(this.formElement);\n    dispatch(\"turbo:submit-start\", {\n      target: this.formElement,\n      detail: { formSubmission: this }\n    });\n    this.delegate.formSubmissionStarted(this);\n  }\n\n  requestPreventedHandlingResponse(request, response) {\n    prefetchCache.clear();\n\n    this.result = { success: response.succeeded, fetchResponse: response };\n  }\n\n  requestSucceededWithResponse(request, response) {\n    if (response.clientError || response.serverError) {\n      this.delegate.formSubmissionFailedWithResponse(this, response);\n      return\n    }\n\n    prefetchCache.clear();\n\n    if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n      const error = new Error(\"Form responses must redirect to another location\");\n      this.delegate.formSubmissionErrored(this, error);\n    } else {\n      this.state = FormSubmissionState.receiving;\n      this.result = { success: true, fetchResponse: response };\n      this.delegate.formSubmissionSucceededWithResponse(this, response);\n    }\n  }\n\n  requestFailedWithResponse(request, response) {\n    this.result = { success: false, fetchResponse: response };\n    this.delegate.formSubmissionFailedWithResponse(this, response);\n  }\n\n  requestErrored(request, error) {\n    this.result = { success: false, error };\n    this.delegate.formSubmissionErrored(this, error);\n  }\n\n  requestFinished(_request) {\n    this.state = FormSubmissionState.stopped;\n    if (this.submitter) config.forms.submitter.afterSubmit(this.submitter);\n    this.resetSubmitterText();\n    clearBusyState(this.formElement);\n    dispatch(\"turbo:submit-end\", {\n      target: this.formElement,\n      detail: { formSubmission: this, ...this.result }\n    });\n    this.delegate.formSubmissionFinished(this);\n  }\n\n  // Private\n\n  setSubmitsWith() {\n    if (!this.submitter || !this.submitsWith) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.originalSubmitText = this.submitter.innerHTML;\n      this.submitter.innerHTML = this.submitsWith;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      this.originalSubmitText = input.value;\n      input.value = this.submitsWith;\n    }\n  }\n\n  resetSubmitterText() {\n    if (!this.submitter || !this.originalSubmitText) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.submitter.innerHTML = this.originalSubmitText;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      input.value = this.originalSubmitText;\n    }\n  }\n\n  requestMustRedirect(request) {\n    return !request.isSafe && this.mustRedirect\n  }\n\n  requestAcceptsTurboStreamResponse(request) {\n    return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement)\n  }\n\n  get submitsWith() {\n    return this.submitter?.getAttribute(\"data-turbo-submits-with\")\n  }\n}\n\nfunction buildFormData(formElement, submitter) {\n  const formData = new FormData(formElement);\n  const name = submitter?.getAttribute(\"name\");\n  const value = submitter?.getAttribute(\"value\");\n\n  if (name) {\n    formData.append(name, value || \"\");\n  }\n\n  return formData\n}\n\nfunction getCookieValue(cookieName) {\n  if (cookieName != null) {\n    const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n    const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n    if (cookie) {\n      const value = cookie.split(\"=\").slice(1).join(\"=\");\n      return value ? decodeURIComponent(value) : undefined\n    }\n  }\n}\n\nfunction responseSucceededWithoutRedirect(response) {\n  return response.statusCode == 200 && !response.redirected\n}\n\nfunction getFormAction(formElement, submitter) {\n  const formElementAction = typeof formElement.action === \"string\" ? formElement.action : null;\n\n  if (submitter?.hasAttribute(\"formaction\")) {\n    return submitter.getAttribute(\"formaction\") || \"\"\n  } else {\n    return formElement.getAttribute(\"action\") || formElementAction || \"\"\n  }\n}\n\nfunction getAction(formAction, fetchMethod) {\n  const action = expandURL(formAction);\n\n  if (isSafe(fetchMethod)) {\n    action.search = \"\";\n  }\n\n  return action\n}\n\nfunction getMethod(formElement, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || formElement.getAttribute(\"method\") || \"\";\n  return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get\n}\n\nfunction getEnctype(formElement, submitter) {\n  return fetchEnctypeFromString(submitter?.getAttribute(\"formenctype\") || formElement.enctype)\n}\n\nclass Snapshot {\n  constructor(element) {\n    this.element = element;\n  }\n\n  get activeElement() {\n    return this.element.ownerDocument.activeElement\n  }\n\n  get children() {\n    return [...this.element.children]\n  }\n\n  hasAnchor(anchor) {\n    return this.getElementForAnchor(anchor) != null\n  }\n\n  getElementForAnchor(anchor) {\n    return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null\n  }\n\n  get isConnected() {\n    return this.element.isConnected\n  }\n\n  get firstAutofocusableElement() {\n    return queryAutofocusableElement(this.element)\n  }\n\n  get permanentElements() {\n    return queryPermanentElementsAll(this.element)\n  }\n\n  getPermanentElementById(id) {\n    return getPermanentElementById(this.element, id)\n  }\n\n  getPermanentElementMapForSnapshot(snapshot) {\n    const permanentElementMap = {};\n\n    for (const currentPermanentElement of this.permanentElements) {\n      const { id } = currentPermanentElement;\n      const newPermanentElement = snapshot.getPermanentElementById(id);\n      if (newPermanentElement) {\n        permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n      }\n    }\n\n    return permanentElementMap\n  }\n}\n\nfunction getPermanentElementById(node, id) {\n  return node.querySelector(`#${id}[data-turbo-permanent]`)\n}\n\nfunction queryPermanentElementsAll(node) {\n  return node.querySelectorAll(\"[id][data-turbo-permanent]\")\n}\n\nclass FormSubmitObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n      this.started = false;\n    }\n  }\n\n  submitCaptured = () => {\n    this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n    this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n  }\n\n  submitBubbled = (event) => {\n    if (!event.defaultPrevented) {\n      const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n      const submitter = event.submitter || undefined;\n\n      if (\n        form &&\n        submissionDoesNotDismissDialog(form, submitter) &&\n        submissionDoesNotTargetIFrame(form, submitter) &&\n        this.delegate.willSubmitForm(form, submitter)\n      ) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        this.delegate.formSubmitted(form, submitter);\n      }\n    }\n  }\n}\n\nfunction submissionDoesNotDismissDialog(form, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || form.getAttribute(\"method\");\n\n  return method != \"dialog\"\n}\n\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n  const target = submitter?.getAttribute(\"formtarget\") || form.getAttribute(\"target\");\n\n  return doesNotTargetIFrame(target)\n}\n\nclass View {\n  #resolveRenderPromise = (_value) => {}\n  #resolveInterceptionPromise = (_value) => {}\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  // Scrolling\n\n  scrollToAnchor(anchor) {\n    const element = this.snapshot.getElementForAnchor(anchor);\n    if (element) {\n      this.focusElement(element);\n      this.scrollToElement(element);\n    } else {\n      this.scrollToPosition({ x: 0, y: 0 });\n    }\n  }\n\n  scrollToAnchorFromLocation(location) {\n    this.scrollToAnchor(getAnchor(location));\n  }\n\n  scrollToElement(element) {\n    element.scrollIntoView();\n  }\n\n  focusElement(element) {\n    if (element instanceof HTMLElement) {\n      if (element.hasAttribute(\"tabindex\")) {\n        element.focus();\n      } else {\n        element.setAttribute(\"tabindex\", \"-1\");\n        element.focus();\n        element.removeAttribute(\"tabindex\");\n      }\n    }\n  }\n\n  scrollToPosition({ x, y }) {\n    this.scrollRoot.scrollTo(x, y);\n  }\n\n  scrollToTop() {\n    this.scrollToPosition({ x: 0, y: 0 });\n  }\n\n  get scrollRoot() {\n    return window\n  }\n\n  // Rendering\n\n  async render(renderer) {\n    const { isPreview, shouldRender, willRender, newSnapshot: snapshot } = renderer;\n\n    // A workaround to ignore tracked element mismatch reloads when performing\n    // a promoted Visit from a frame navigation\n    const shouldInvalidate = willRender;\n\n    if (shouldRender) {\n      try {\n        this.renderPromise = new Promise((resolve) => (this.#resolveRenderPromise = resolve));\n        this.renderer = renderer;\n        await this.prepareToRenderSnapshot(renderer);\n\n        const renderInterception = new Promise((resolve) => (this.#resolveInterceptionPromise = resolve));\n        const options = { resume: this.#resolveInterceptionPromise, render: this.renderer.renderElement, renderMethod: this.renderer.renderMethod };\n        const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n        if (!immediateRender) await renderInterception;\n\n        await this.renderSnapshot(renderer);\n        this.delegate.viewRenderedSnapshot(snapshot, isPreview, this.renderer.renderMethod);\n        this.delegate.preloadOnLoadLinksForView(this.element);\n        this.finishRenderingSnapshot(renderer);\n      } finally {\n        delete this.renderer;\n        this.#resolveRenderPromise(undefined);\n        delete this.renderPromise;\n      }\n    } else if (shouldInvalidate) {\n      this.invalidate(renderer.reloadReason);\n    }\n  }\n\n  invalidate(reason) {\n    this.delegate.viewInvalidated(reason);\n  }\n\n  async prepareToRenderSnapshot(renderer) {\n    this.markAsPreview(renderer.isPreview);\n    await renderer.prepareToRender();\n  }\n\n  markAsPreview(isPreview) {\n    if (isPreview) {\n      this.element.setAttribute(\"data-turbo-preview\", \"\");\n    } else {\n      this.element.removeAttribute(\"data-turbo-preview\");\n    }\n  }\n\n  markVisitDirection(direction) {\n    this.element.setAttribute(\"data-turbo-visit-direction\", direction);\n  }\n\n  unmarkVisitDirection() {\n    this.element.removeAttribute(\"data-turbo-visit-direction\");\n  }\n\n  async renderSnapshot(renderer) {\n    await renderer.render();\n  }\n\n  finishRenderingSnapshot(renderer) {\n    renderer.finishRendering();\n  }\n}\n\nclass FrameView extends View {\n  missing() {\n    this.element.innerHTML = `<strong class=\"turbo-frame-error\">Content missing</strong>`;\n  }\n\n  get snapshot() {\n    return new Snapshot(this.element)\n  }\n}\n\nclass LinkInterceptor {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  start() {\n    this.element.addEventListener(\"click\", this.clickBubbled);\n    document.addEventListener(\"turbo:click\", this.linkClicked);\n    document.addEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  stop() {\n    this.element.removeEventListener(\"click\", this.clickBubbled);\n    document.removeEventListener(\"turbo:click\", this.linkClicked);\n    document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  clickBubbled = (event) => {\n    if (this.clickEventIsSignificant(event)) {\n      this.clickEvent = event;\n    } else {\n      delete this.clickEvent;\n    }\n  }\n\n  linkClicked = (event) => {\n    if (this.clickEvent && this.clickEventIsSignificant(event)) {\n      if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n        this.clickEvent.preventDefault();\n        event.preventDefault();\n        this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n      }\n    }\n    delete this.clickEvent;\n  }\n\n  willVisit = (_event) => {\n    delete this.clickEvent;\n  }\n\n  clickEventIsSignificant(event) {\n    const target = event.composed ? event.target?.parentElement : event.target;\n    const element = findLinkFromClickTarget(target) || target;\n\n    return element instanceof Element && element.closest(\"turbo-frame, html\") == this.element\n  }\n}\n\nclass LinkClickObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n      this.started = false;\n    }\n  }\n\n  clickCaptured = () => {\n    this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n    this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n  }\n\n  clickBubbled = (event) => {\n    if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n      const target = (event.composedPath && event.composedPath()[0]) || event.target;\n      const link = findLinkFromClickTarget(target);\n      if (link && doesNotTargetIFrame(link.target)) {\n        const location = getLocationForLink(link);\n        if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n          event.preventDefault();\n          this.delegate.followedLinkToLocation(link, location);\n        }\n      }\n    }\n  }\n\n  clickEventIsSignificant(event) {\n    return !(\n      (event.target && event.target.isContentEditable) ||\n      event.defaultPrevented ||\n      event.which > 1 ||\n      event.altKey ||\n      event.ctrlKey ||\n      event.metaKey ||\n      event.shiftKey\n    )\n  }\n}\n\nclass FormLinkClickObserver {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.linkInterceptor = new LinkClickObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n  }\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return false\n  }\n\n  prefetchAndCacheRequestToLocation(link, location) {\n    return\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, originalEvent) {\n    return (\n      this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n      (link.hasAttribute(\"data-turbo-method\") || link.hasAttribute(\"data-turbo-stream\"))\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const form = document.createElement(\"form\");\n\n    const type = \"hidden\";\n    for (const [name, value] of location.searchParams) {\n      form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n    }\n\n    const action = Object.assign(location, { search: \"\" });\n    form.setAttribute(\"data-turbo\", \"true\");\n    form.setAttribute(\"action\", action.href);\n    form.setAttribute(\"hidden\", \"\");\n\n    const method = link.getAttribute(\"data-turbo-method\");\n    if (method) form.setAttribute(\"method\", method);\n\n    const turboFrame = link.getAttribute(\"data-turbo-frame\");\n    if (turboFrame) form.setAttribute(\"data-turbo-frame\", turboFrame);\n\n    const turboAction = getVisitAction(link);\n    if (turboAction) form.setAttribute(\"data-turbo-action\", turboAction);\n\n    const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n    if (turboConfirm) form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n\n    const turboStream = link.hasAttribute(\"data-turbo-stream\");\n    if (turboStream) form.setAttribute(\"data-turbo-stream\", \"\");\n\n    this.delegate.submittedFormLinkToLocation(link, location, form);\n\n    document.body.appendChild(form);\n    form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n    requestAnimationFrame(() => form.requestSubmit());\n  }\n}\n\nclass Bardo {\n  static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n    const bardo = new this(delegate, permanentElementMap);\n    bardo.enter();\n    await callback();\n    bardo.leave();\n  }\n\n  constructor(delegate, permanentElementMap) {\n    this.delegate = delegate;\n    this.permanentElementMap = permanentElementMap;\n  }\n\n  enter() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n      this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n      this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n    }\n  }\n\n  leave() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement] = this.permanentElementMap[id];\n      this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n      this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n      this.delegate.leavingBardo(currentPermanentElement);\n    }\n  }\n\n  replaceNewPermanentElementWithPlaceholder(permanentElement) {\n    const placeholder = createPlaceholderForPermanentElement(permanentElement);\n    permanentElement.replaceWith(placeholder);\n  }\n\n  replaceCurrentPermanentElementWithClone(permanentElement) {\n    const clone = permanentElement.cloneNode(true);\n    permanentElement.replaceWith(clone);\n  }\n\n  replacePlaceholderWithPermanentElement(permanentElement) {\n    const placeholder = this.getPlaceholderById(permanentElement.id);\n    placeholder?.replaceWith(permanentElement);\n  }\n\n  getPlaceholderById(id) {\n    return this.placeholders.find((element) => element.content == id)\n  }\n\n  get placeholders() {\n    return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")]\n  }\n}\n\nfunction createPlaceholderForPermanentElement(permanentElement) {\n  const element = document.createElement(\"meta\");\n  element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n  element.setAttribute(\"content\", permanentElement.id);\n  return element\n}\n\nclass Renderer {\n  #activeElement = null\n\n  static renderElement(currentElement, newElement) {\n    // Abstract method\n  }\n\n  constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n    this.currentSnapshot = currentSnapshot;\n    this.newSnapshot = newSnapshot;\n    this.isPreview = isPreview;\n    this.willRender = willRender;\n    this.renderElement = this.constructor.renderElement;\n    this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  get shouldAutofocus() {\n    return true\n  }\n\n  get reloadReason() {\n    return\n  }\n\n  prepareToRender() {\n    return\n  }\n\n  render() {\n    // Abstract method\n  }\n\n  finishRendering() {\n    if (this.resolvingFunctions) {\n      this.resolvingFunctions.resolve();\n      delete this.resolvingFunctions;\n    }\n  }\n\n  async preservingPermanentElements(callback) {\n    await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n  }\n\n  focusFirstAutofocusableElement() {\n    if (this.shouldAutofocus) {\n      const element = this.connectedSnapshot.firstAutofocusableElement;\n      if (element) {\n        element.focus();\n      }\n    }\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement) {\n    if (this.#activeElement) return\n\n    if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n      this.#activeElement = this.currentSnapshot.activeElement;\n    }\n  }\n\n  leavingBardo(currentPermanentElement) {\n    if (currentPermanentElement.contains(this.#activeElement) && this.#activeElement instanceof HTMLElement) {\n      this.#activeElement.focus();\n\n      this.#activeElement = null;\n    }\n  }\n\n  get connectedSnapshot() {\n    return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot\n  }\n\n  get currentElement() {\n    return this.currentSnapshot.element\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  get permanentElementMap() {\n    return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)\n  }\n\n  get renderMethod() {\n    return \"replace\"\n  }\n}\n\nclass FrameRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const destinationRange = document.createRange();\n    destinationRange.selectNodeContents(currentElement);\n    destinationRange.deleteContents();\n\n    const frameElement = newElement;\n    const sourceRange = frameElement.ownerDocument?.createRange();\n    if (sourceRange) {\n      sourceRange.selectNodeContents(frameElement);\n      currentElement.appendChild(sourceRange.extractContents());\n    }\n  }\n\n  constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n    super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n    this.delegate = delegate;\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  async render() {\n    await nextRepaint();\n    this.preservingPermanentElements(() => {\n      this.loadFrameElement();\n    });\n    this.scrollFrameIntoView();\n    await nextRepaint();\n    this.focusFirstAutofocusableElement();\n    await nextRepaint();\n    this.activateScriptElements();\n  }\n\n  loadFrameElement() {\n    this.delegate.willRenderFrame(this.currentElement, this.newElement);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  scrollFrameIntoView() {\n    if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n      const element = this.currentElement.firstElementChild;\n      const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n      const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n\n      if (element) {\n        element.scrollIntoView({ block, behavior });\n        return true\n      }\n    }\n    return false\n  }\n\n  activateScriptElements() {\n    for (const inertScriptElement of this.newScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  get newScriptElements() {\n    return this.currentElement.querySelectorAll(\"script\")\n  }\n}\n\nfunction readScrollLogicalPosition(value, defaultValue) {\n  if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\nfunction readScrollBehavior(value, defaultValue) {\n  if (value == \"auto\" || value == \"smooth\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\n/**\n * @typedef {object} ConfigHead\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} [style]\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {function(Element): boolean} [shouldPreserve]\n * @property {function(Element): boolean} [shouldReAppend]\n * @property {function(Element): boolean} [shouldRemove]\n * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed]\n */\n\n/**\n * @typedef {object} ConfigCallbacks\n *\n * @property {function(Node): boolean} [beforeNodeAdded]\n * @property {function(Node): void} [afterNodeAdded]\n * @property {function(Element, Node): boolean} [beforeNodeMorphed]\n * @property {function(Element, Node): void} [afterNodeMorphed]\n * @property {function(Element): boolean} [beforeNodeRemoved]\n * @property {function(Element): void} [afterNodeRemoved]\n * @property {function(string, Element, \"update\" | \"remove\"): boolean} [beforeAttributeUpdated]\n */\n\n/**\n * @typedef {object} Config\n *\n * @property {'outerHTML' | 'innerHTML'} [morphStyle]\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacks} [callbacks]\n * @property {ConfigHead} [head]\n */\n\n/**\n * @typedef {function} NoOp\n *\n * @returns {void}\n */\n\n/**\n * @typedef {object} ConfigHeadInternal\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} style\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {(function(Element): boolean) | NoOp} shouldPreserve\n * @property {(function(Element): boolean) | NoOp} shouldReAppend\n * @property {(function(Element): boolean) | NoOp} shouldRemove\n * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed\n */\n\n/**\n * @typedef {object} ConfigCallbacksInternal\n *\n * @property {(function(Node): boolean) | NoOp} beforeNodeAdded\n * @property {(function(Node): void) | NoOp} afterNodeAdded\n * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed\n * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed\n * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved\n * @property {(function(Node): void) | NoOp} afterNodeRemoved\n * @property {(function(string, Element, \"update\" | \"remove\"): boolean) | NoOp} beforeAttributeUpdated\n */\n\n/**\n * @typedef {object} ConfigInternal\n *\n * @property {'outerHTML' | 'innerHTML'} morphStyle\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacksInternal} callbacks\n * @property {ConfigHeadInternal} head\n */\n\n/**\n * @typedef {Object} IdSets\n * @property {Set<string>} persistentIds\n * @property {Map<Node, Set<string>>} idMap\n */\n\n/**\n * @typedef {Function} Morph\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {undefined | Node[]}\n */\n\n// base IIFE to define idiomorph\n/**\n *\n * @type {{defaults: ConfigInternal, morph: Morph}}\n */\nvar Idiomorph = (function () {\n\n  /**\n   * @typedef {object} MorphContext\n   *\n   * @property {Element} target\n   * @property {Element} newContent\n   * @property {ConfigInternal} config\n   * @property {ConfigInternal['morphStyle']} morphStyle\n   * @property {ConfigInternal['ignoreActive']} ignoreActive\n   * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue\n   * @property {ConfigInternal['restoreFocus']} restoreFocus\n   * @property {Map<Node, Set<string>>} idMap\n   * @property {Set<string>} persistentIds\n   * @property {ConfigInternal['callbacks']} callbacks\n   * @property {ConfigInternal['head']} head\n   * @property {HTMLDivElement} pantry\n   * @property {Element[]} activeElementAndParents\n   */\n\n  //=============================================================================\n  // AND NOW IT BEGINS...\n  //=============================================================================\n\n  const noOp = () => {};\n  /**\n   * Default configuration values, updatable by users now\n   * @type {ConfigInternal}\n   */\n  const defaults = {\n    morphStyle: \"outerHTML\",\n    callbacks: {\n      beforeNodeAdded: noOp,\n      afterNodeAdded: noOp,\n      beforeNodeMorphed: noOp,\n      afterNodeMorphed: noOp,\n      beforeNodeRemoved: noOp,\n      afterNodeRemoved: noOp,\n      beforeAttributeUpdated: noOp,\n    },\n    head: {\n      style: \"merge\",\n      shouldPreserve: (elt) => elt.getAttribute(\"im-preserve\") === \"true\",\n      shouldReAppend: (elt) => elt.getAttribute(\"im-re-append\") === \"true\",\n      shouldRemove: noOp,\n      afterHeadMorphed: noOp,\n    },\n    restoreFocus: true,\n  };\n\n  /**\n   * Core idiomorph function for morphing one DOM tree to another\n   *\n   * @param {Element | Document} oldNode\n   * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n   * @param {Config} [config]\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function morph(oldNode, newContent, config = {}) {\n    oldNode = normalizeElement(oldNode);\n    const newNode = normalizeParent(newContent);\n    const ctx = createMorphContext(oldNode, newNode, config);\n\n    const morphedNodes = saveAndRestoreFocus(ctx, () => {\n      return withHeadBlocking(\n        ctx,\n        oldNode,\n        newNode,\n        /** @param {MorphContext} ctx */ (ctx) => {\n          if (ctx.morphStyle === \"innerHTML\") {\n            morphChildren(ctx, oldNode, newNode);\n            return Array.from(oldNode.childNodes);\n          } else {\n            return morphOuterHTML(ctx, oldNode, newNode);\n          }\n        },\n      );\n    });\n\n    ctx.pantry.remove();\n    return morphedNodes;\n  }\n\n  /**\n   * Morph just the outerHTML of the oldNode to the newContent\n   * We have to be careful because the oldNode could have siblings which need to be untouched\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @returns {Node[]}\n   */\n  function morphOuterHTML(ctx, oldNode, newNode) {\n    const oldParent = normalizeParent(oldNode);\n    morphChildren(\n      ctx,\n      oldParent,\n      newNode,\n      // these two optional params are the secret sauce\n      oldNode, // start point for iteration\n      oldNode.nextSibling, // end point for iteration\n    );\n    // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed.\n    return Array.from(oldParent.childNodes);\n  }\n\n  /**\n   * @param {MorphContext} ctx\n   * @param {Function} fn\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function saveAndRestoreFocus(ctx, fn) {\n    if (!ctx.config.restoreFocus) return fn();\n    let activeElement =\n      /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ (\n        document.activeElement\n      );\n\n    // don't bother if the active element is not an input or textarea\n    if (\n      !(\n        activeElement instanceof HTMLInputElement ||\n        activeElement instanceof HTMLTextAreaElement\n      )\n    ) {\n      return fn();\n    }\n\n    const { id: activeElementId, selectionStart, selectionEnd } = activeElement;\n\n    const results = fn();\n\n    if (\n      activeElementId &&\n      activeElementId !== document.activeElement?.getAttribute(\"id\")\n    ) {\n      activeElement = ctx.target.querySelector(`[id=\"${activeElementId}\"]`);\n      activeElement?.focus();\n    }\n    if (activeElement && !activeElement.selectionEnd && selectionEnd) {\n      activeElement.setSelectionRange(selectionStart, selectionEnd);\n    }\n\n    return results;\n  }\n\n  const morphChildren = (function () {\n    /**\n     * This is the core algorithm for matching up children.  The idea is to use id sets to try to match up\n     * nodes as faithfully as possible.  We greedily match, which allows us to keep the algorithm fast, but\n     * by using id sets, we are able to better match up with content deeper in the DOM.\n     *\n     * Basic algorithm:\n     * - for each node in the new content:\n     *   - search self and siblings for an id set match, falling back to a soft match\n     *   - if match found\n     *     - remove any nodes up to the match:\n     *       - pantry persistent nodes\n     *       - delete the rest\n     *     - morph the match\n     *   - elsif no match found, and node is persistent\n     *     - find its match by querying the old root (future) and pantry (past)\n     *     - move it and its children here\n     *     - morph it\n     *   - else\n     *     - create a new node from scratch as a last result\n     *\n     * @param {MorphContext} ctx the merge context\n     * @param {Element} oldParent the old content that we are merging the new content into\n     * @param {Element} newParent the parent element of the new content\n     * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child)\n     * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child)\n     */\n    function morphChildren(\n      ctx,\n      oldParent,\n      newParent,\n      insertionPoint = null,\n      endPoint = null,\n    ) {\n      // normalize\n      if (\n        oldParent instanceof HTMLTemplateElement &&\n        newParent instanceof HTMLTemplateElement\n      ) {\n        // @ts-ignore we can pretend the DocumentFragment is an Element\n        oldParent = oldParent.content;\n        // @ts-ignore ditto\n        newParent = newParent.content;\n      }\n      insertionPoint ||= oldParent.firstChild;\n\n      // run through all the new content\n      for (const newChild of newParent.childNodes) {\n        // once we reach the end of the old parent content skip to the end and insert the rest\n        if (insertionPoint && insertionPoint != endPoint) {\n          const bestMatch = findBestMatch(\n            ctx,\n            newChild,\n            insertionPoint,\n            endPoint,\n          );\n          if (bestMatch) {\n            // if the node to morph is not at the insertion point then remove/move up to it\n            if (bestMatch !== insertionPoint) {\n              removeNodesBetween(ctx, insertionPoint, bestMatch);\n            }\n            morphNode(bestMatch, newChild, ctx);\n            insertionPoint = bestMatch.nextSibling;\n            continue;\n          }\n        }\n\n        // if the matching node is elsewhere in the original content\n        if (newChild instanceof Element) {\n          // we can pretend the id is non-null because the next `.has` line will reject it if not\n          const newChildId = /** @type {String} */ (\n            newChild.getAttribute(\"id\")\n          );\n          if (ctx.persistentIds.has(newChildId)) {\n            // move it and all its children here and morph\n            const movedChild = moveBeforeById(\n              oldParent,\n              newChildId,\n              insertionPoint,\n              ctx,\n            );\n            morphNode(movedChild, newChild, ctx);\n            insertionPoint = movedChild.nextSibling;\n            continue;\n          }\n        }\n\n        // last resort: insert the new node from scratch\n        const insertedNode = createNode(\n          oldParent,\n          newChild,\n          insertionPoint,\n          ctx,\n        );\n        // could be null if beforeNodeAdded prevented insertion\n        if (insertedNode) {\n          insertionPoint = insertedNode.nextSibling;\n        }\n      }\n\n      // remove any remaining old nodes that didn't match up with new content\n      while (insertionPoint && insertionPoint != endPoint) {\n        const tempNode = insertionPoint;\n        insertionPoint = insertionPoint.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n    }\n\n    /**\n     * This performs the action of inserting a new node while handling situations where the node contains\n     * elements with persistent ids and possible state info we can still preserve by moving in and then morphing\n     *\n     * @param {Element} oldParent\n     * @param {Node} newChild\n     * @param {Node|null} insertionPoint\n     * @param {MorphContext} ctx\n     * @returns {Node|null}\n     */\n    function createNode(oldParent, newChild, insertionPoint, ctx) {\n      if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null;\n      if (ctx.idMap.has(newChild)) {\n        // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm\n        const newEmptyChild = document.createElement(\n          /** @type {Element} */ (newChild).tagName,\n        );\n        oldParent.insertBefore(newEmptyChild, insertionPoint);\n        morphNode(newEmptyChild, newChild, ctx);\n        ctx.callbacks.afterNodeAdded(newEmptyChild);\n        return newEmptyChild;\n      } else {\n        // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants\n        const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent\n        oldParent.insertBefore(newClonedChild, insertionPoint);\n        ctx.callbacks.afterNodeAdded(newClonedChild);\n        return newClonedChild;\n      }\n    }\n\n    //=============================================================================\n    // Matching Functions\n    //=============================================================================\n    const findBestMatch = (function () {\n      /**\n       * Scans forward from the startPoint to the endPoint looking for a match\n       * for the node. It looks for an id set match first, then a soft match.\n       * We abort softmatching if we find two future soft matches, to reduce churn.\n       * @param {Node} node\n       * @param {MorphContext} ctx\n       * @param {Node | null} startPoint\n       * @param {Node | null} endPoint\n       * @returns {Node | null}\n       */\n      function findBestMatch(ctx, node, startPoint, endPoint) {\n        let softMatch = null;\n        let nextSibling = node.nextSibling;\n        let siblingSoftMatchCount = 0;\n\n        let cursor = startPoint;\n        while (cursor && cursor != endPoint) {\n          // soft matching is a prerequisite for id set matching\n          if (isSoftMatch(cursor, node)) {\n            if (isIdSetMatch(ctx, cursor, node)) {\n              return cursor; // found an id set match, we're done!\n            }\n\n            // we haven't yet saved a soft match fallback\n            if (softMatch === null) {\n              // the current soft match will hard match something else in the future, leave it\n              if (!ctx.idMap.has(cursor)) {\n                // save this as the fallback if we get through the loop without finding a hard match\n                softMatch = cursor;\n              }\n            }\n          }\n          if (\n            softMatch === null &&\n            nextSibling &&\n            isSoftMatch(cursor, nextSibling)\n          ) {\n            // The next new node has a soft match with this node, so\n            // increment the count of future soft matches\n            siblingSoftMatchCount++;\n            nextSibling = nextSibling.nextSibling;\n\n            // If there are two future soft matches, block soft matching for this node to allow\n            // future siblings to soft match. This is to reduce churn in the DOM when an element\n            // is prepended.\n            if (siblingSoftMatchCount >= 2) {\n              softMatch = undefined;\n            }\n          }\n\n          // if the current node contains active element, stop looking for better future matches,\n          // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus\n          // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion\n          if (ctx.activeElementAndParents.includes(cursor)) break;\n\n          cursor = cursor.nextSibling;\n        }\n\n        return softMatch || null;\n      }\n\n      /**\n       *\n       * @param {MorphContext} ctx\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isIdSetMatch(ctx, oldNode, newNode) {\n        let oldSet = ctx.idMap.get(oldNode);\n        let newSet = ctx.idMap.get(newNode);\n\n        if (!newSet || !oldSet) return false;\n\n        for (const id of oldSet) {\n          // a potential match is an id in the new and old nodes that\n          // has not already been merged into the DOM\n          // But the newNode content we call this on has not been\n          // merged yet and we don't allow duplicate IDs so it is simple\n          if (newSet.has(id)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      /**\n       *\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isSoftMatch(oldNode, newNode) {\n        // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that.\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        return (\n          oldElt.nodeType === newElt.nodeType &&\n          oldElt.tagName === newElt.tagName &&\n          // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing.\n          // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n          // its not persistent, and new nodes can't have any hidden state.\n          // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment\n          (!oldElt.getAttribute?.(\"id\") ||\n            oldElt.getAttribute?.(\"id\") === newElt.getAttribute?.(\"id\"))\n        );\n      }\n\n      return findBestMatch;\n    })();\n\n    //=============================================================================\n    // DOM Manipulation Functions\n    //=============================================================================\n\n    /**\n     * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n     * - Persistent nodes will be moved to the pantry for later reuse\n     * - Other nodes will have their hooks called, and then are removed\n     * @param {MorphContext} ctx\n     * @param {Node} node\n     */\n    function removeNode(ctx, node) {\n      // are we going to id set match this later?\n      if (ctx.idMap.has(node)) {\n        // skip callbacks and move to pantry\n        moveBefore(ctx.pantry, node, null);\n      } else {\n        // remove for realsies\n        if (ctx.callbacks.beforeNodeRemoved(node) === false) return;\n        node.parentNode?.removeChild(node);\n        ctx.callbacks.afterNodeRemoved(node);\n      }\n    }\n\n    /**\n     * Remove nodes between the start and end nodes\n     * @param {MorphContext} ctx\n     * @param {Node} startInclusive\n     * @param {Node} endExclusive\n     * @returns {Node|null}\n     */\n    function removeNodesBetween(ctx, startInclusive, endExclusive) {\n      /** @type {Node | null} */\n      let cursor = startInclusive;\n      // remove nodes until the endExclusive node\n      while (cursor && cursor !== endExclusive) {\n        let tempNode = /** @type {Node} */ (cursor);\n        cursor = cursor.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n      return cursor;\n    }\n\n    /**\n     * Search for an element by id within the document and pantry, and move it using moveBefore.\n     *\n     * @param {Element} parentNode - The parent node to which the element will be moved.\n     * @param {string} id - The ID of the element to be moved.\n     * @param {Node | null} after - The reference node to insert the element before.\n     *                              If `null`, the element is appended as the last child.\n     * @param {MorphContext} ctx\n     * @returns {Element} The found element\n     */\n    function moveBeforeById(parentNode, id, after, ctx) {\n      const target =\n        /** @type {Element} - will always be found */\n        (\n          // ctx.target.id unsafe because of form input shadowing\n          // ctx.target could be a document fragment which doesn't have `getAttribute`\n          (ctx.target.getAttribute?.(\"id\") === id && ctx.target) ||\n            ctx.target.querySelector(`[id=\"${id}\"]`) ||\n            ctx.pantry.querySelector(`[id=\"${id}\"]`)\n        );\n      removeElementFromAncestorsIdMaps(target, ctx);\n      moveBefore(parentNode, target, after);\n      return target;\n    }\n\n    /**\n     * Removes an element from its ancestors' id maps. This is needed when an element is moved from the\n     * \"future\" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the\n     * pantry rather than being deleted, preventing their removal hooks from being called.\n     *\n     * @param {Element} element - element to remove from its ancestors' id maps\n     * @param {MorphContext} ctx\n     */\n    function removeElementFromAncestorsIdMaps(element, ctx) {\n      // we know id is non-null String, because this function is only called on elements with ids\n      const id = /** @type {String} */ (element.getAttribute(\"id\"));\n      /** @ts-ignore - safe to loop in this way **/\n      while ((element = element.parentNode)) {\n        let idSet = ctx.idMap.get(element);\n        if (idSet) {\n          idSet.delete(id);\n          if (!idSet.size) {\n            ctx.idMap.delete(element);\n          }\n        }\n      }\n    }\n\n    /**\n     * Moves an element before another element within the same parent.\n     * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n     * This is essentialy a forward-compat wrapper.\n     *\n     * @param {Element} parentNode - The parent node containing the after element.\n     * @param {Node} element - The element to be moved.\n     * @param {Node | null} after - The reference node to insert `element` before.\n     *                              If `null`, `element` is appended as the last child.\n     */\n    function moveBefore(parentNode, element, after) {\n      // @ts-ignore - use proposed moveBefore feature\n      if (parentNode.moveBefore) {\n        try {\n          // @ts-ignore - use proposed moveBefore feature\n          parentNode.moveBefore(element, after);\n        } catch (e) {\n          // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry\n          parentNode.insertBefore(element, after);\n        }\n      } else {\n        parentNode.insertBefore(element, after);\n      }\n    }\n\n    return morphChildren;\n  })();\n\n  //=============================================================================\n  // Single Node Morphing Code\n  //=============================================================================\n  const morphNode = (function () {\n    /**\n     * @param {Node} oldNode root node to merge content into\n     * @param {Node} newContent new content to merge\n     * @param {MorphContext} ctx the merge context\n     * @returns {Node | null} the element that ended up in the DOM\n     */\n    function morphNode(oldNode, newContent, ctx) {\n      if (ctx.ignoreActive && oldNode === document.activeElement) {\n        // don't morph focused element\n        return null;\n      }\n\n      if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) {\n        return oldNode;\n      }\n\n      if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (\n        oldNode instanceof HTMLHeadElement &&\n        ctx.head.style !== \"morph\"\n      ) {\n        // ok to cast: if newContent wasn't also a <head>, it would've got caught in the `!isSoftMatch` branch above\n        handleHeadElement(\n          oldNode,\n          /** @type {HTMLHeadElement} */ (newContent),\n          ctx,\n        );\n      } else {\n        morphAttributes(oldNode, newContent, ctx);\n        if (!ignoreValueOfActiveElement(oldNode, ctx)) {\n          // @ts-ignore newContent can be a node here because .firstChild will be null\n          morphChildren(ctx, oldNode, newContent);\n        }\n      }\n      ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n      return oldNode;\n    }\n\n    /**\n     * syncs the oldNode to the newNode, copying over all attributes and\n     * inner element state from the newNode to the oldNode\n     *\n     * @param {Node} oldNode the node to copy attributes & state to\n     * @param {Node} newNode the node to copy attributes & state from\n     * @param {MorphContext} ctx the merge context\n     */\n    function morphAttributes(oldNode, newNode, ctx) {\n      let type = newNode.nodeType;\n\n      // if is an element type, sync the attributes from the\n      // new node into the new node\n      if (type === 1 /* element type */) {\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        const oldAttributes = oldElt.attributes;\n        const newAttributes = newElt.attributes;\n        for (const newAttribute of newAttributes) {\n          if (ignoreAttribute(newAttribute.name, oldElt, \"update\", ctx)) {\n            continue;\n          }\n          if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) {\n            oldElt.setAttribute(newAttribute.name, newAttribute.value);\n          }\n        }\n        // iterate backwards to avoid skipping over items when a delete occurs\n        for (let i = oldAttributes.length - 1; 0 <= i; i--) {\n          const oldAttribute = oldAttributes[i];\n\n          // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe\n          // e.g. custom element attribute callbacks can remove other attributes\n          if (!oldAttribute) continue;\n\n          if (!newElt.hasAttribute(oldAttribute.name)) {\n            if (ignoreAttribute(oldAttribute.name, oldElt, \"remove\", ctx)) {\n              continue;\n            }\n            oldElt.removeAttribute(oldAttribute.name);\n          }\n        }\n\n        if (!ignoreValueOfActiveElement(oldElt, ctx)) {\n          syncInputValue(oldElt, newElt, ctx);\n        }\n      }\n\n      // sync text nodes\n      if (type === 8 /* comment */ || type === 3 /* text */) {\n        if (oldNode.nodeValue !== newNode.nodeValue) {\n          oldNode.nodeValue = newNode.nodeValue;\n        }\n      }\n    }\n\n    /**\n     * NB: many bothans died to bring us information:\n     *\n     *  https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n     *  https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113\n     *\n     * @param {Element} oldElement the element to sync the input value to\n     * @param {Element} newElement the element to sync the input value from\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncInputValue(oldElement, newElement, ctx) {\n      if (\n        oldElement instanceof HTMLInputElement &&\n        newElement instanceof HTMLInputElement &&\n        newElement.type !== \"file\"\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n\n        // sync boolean attributes\n        syncBooleanAttribute(oldElement, newElement, \"checked\", ctx);\n        syncBooleanAttribute(oldElement, newElement, \"disabled\", ctx);\n\n        if (!newElement.hasAttribute(\"value\")) {\n          if (!ignoreAttribute(\"value\", oldElement, \"remove\", ctx)) {\n            oldElement.value = \"\";\n            oldElement.removeAttribute(\"value\");\n          }\n        } else if (oldValue !== newValue) {\n          if (!ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n            oldElement.setAttribute(\"value\", newValue);\n            oldElement.value = newValue;\n          }\n        }\n        // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why?\n        // did I break something?\n      } else if (\n        oldElement instanceof HTMLOptionElement &&\n        newElement instanceof HTMLOptionElement\n      ) {\n        syncBooleanAttribute(oldElement, newElement, \"selected\", ctx);\n      } else if (\n        oldElement instanceof HTMLTextAreaElement &&\n        newElement instanceof HTMLTextAreaElement\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n        if (ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n          return;\n        }\n        if (newValue !== oldValue) {\n          oldElement.value = newValue;\n        }\n        if (\n          oldElement.firstChild &&\n          oldElement.firstChild.nodeValue !== newValue\n        ) {\n          oldElement.firstChild.nodeValue = newValue;\n        }\n      }\n    }\n\n    /**\n     * @param {Element} oldElement element to write the value to\n     * @param {Element} newElement element to read the value from\n     * @param {string} attributeName the attribute name\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) {\n      // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n      const newLiveValue = newElement[attributeName],\n        // @ts-ignore ditto\n        oldLiveValue = oldElement[attributeName];\n      if (newLiveValue !== oldLiveValue) {\n        const ignoreUpdate = ignoreAttribute(\n          attributeName,\n          oldElement,\n          \"update\",\n          ctx,\n        );\n        if (!ignoreUpdate) {\n          // update attribute's associated DOM property\n          // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n          oldElement[attributeName] = newElement[attributeName];\n        }\n        if (newLiveValue) {\n          if (!ignoreUpdate) {\n            // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML\n            // this is the correct way to set a boolean attribute to \"true\"\n            oldElement.setAttribute(attributeName, \"\");\n          }\n        } else {\n          if (!ignoreAttribute(attributeName, oldElement, \"remove\", ctx)) {\n            oldElement.removeAttribute(attributeName);\n          }\n        }\n      }\n    }\n\n    /**\n     * @param {string} attr the attribute to be mutated\n     * @param {Element} element the element that is going to be updated\n     * @param {\"update\" | \"remove\"} updateType\n     * @param {MorphContext} ctx the merge context\n     * @returns {boolean} true if the attribute should be ignored, false otherwise\n     */\n    function ignoreAttribute(attr, element, updateType, ctx) {\n      if (\n        attr === \"value\" &&\n        ctx.ignoreActiveValue &&\n        element === document.activeElement\n      ) {\n        return true;\n      }\n      return (\n        ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) ===\n        false\n      );\n    }\n\n    /**\n     * @param {Node} possibleActiveElement\n     * @param {MorphContext} ctx\n     * @returns {boolean}\n     */\n    function ignoreValueOfActiveElement(possibleActiveElement, ctx) {\n      return (\n        !!ctx.ignoreActiveValue &&\n        possibleActiveElement === document.activeElement &&\n        possibleActiveElement !== document.body\n      );\n    }\n\n    return morphNode;\n  })();\n\n  //=============================================================================\n  // Head Management Functions\n  //=============================================================================\n  /**\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @param {function} callback\n   * @returns {Node[] | Promise<Node[]>}\n   */\n  function withHeadBlocking(ctx, oldNode, newNode, callback) {\n    if (ctx.head.block) {\n      const oldHead = oldNode.querySelector(\"head\");\n      const newHead = newNode.querySelector(\"head\");\n      if (oldHead && newHead) {\n        const promises = handleHeadElement(oldHead, newHead, ctx);\n        // when head promises resolve, proceed ignoring the head tag\n        return Promise.all(promises).then(() => {\n          const newCtx = Object.assign(ctx, {\n            head: {\n              block: false,\n              ignore: true,\n            },\n          });\n          return callback(newCtx);\n        });\n      }\n    }\n    // just proceed if we not head blocking\n    return callback(ctx);\n  }\n\n  /**\n   *  The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style\n   *\n   * @param {Element} oldHead\n   * @param {Element} newHead\n   * @param {MorphContext} ctx\n   * @returns {Promise<void>[]}\n   */\n  function handleHeadElement(oldHead, newHead, ctx) {\n    let added = [];\n    let removed = [];\n    let preserved = [];\n    let nodesToAppend = [];\n\n    // put all new head elements into a Map, by their outerHTML\n    let srcToNewHeadNodes = new Map();\n    for (const newHeadChild of newHead.children) {\n      srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);\n    }\n\n    // for each elt in the current head\n    for (const currentHeadElt of oldHead.children) {\n      // If the current head element is in the map\n      let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);\n      let isReAppended = ctx.head.shouldReAppend(currentHeadElt);\n      let isPreserved = ctx.head.shouldPreserve(currentHeadElt);\n      if (inNewContent || isPreserved) {\n        if (isReAppended) {\n          // remove the current version and let the new version replace it and re-execute\n          removed.push(currentHeadElt);\n        } else {\n          // this element already exists and should not be re-appended, so remove it from\n          // the new content map, preserving it in the DOM\n          srcToNewHeadNodes.delete(currentHeadElt.outerHTML);\n          preserved.push(currentHeadElt);\n        }\n      } else {\n        if (ctx.head.style === \"append\") {\n          // we are appending and this existing element is not new content\n          // so if and only if it is marked for re-append do we do anything\n          if (isReAppended) {\n            removed.push(currentHeadElt);\n            nodesToAppend.push(currentHeadElt);\n          }\n        } else {\n          // if this is a merge, we remove this content since it is not in the new head\n          if (ctx.head.shouldRemove(currentHeadElt) !== false) {\n            removed.push(currentHeadElt);\n          }\n        }\n      }\n    }\n\n    // Push the remaining new head elements in the Map into the\n    // nodes to append to the head tag\n    nodesToAppend.push(...srcToNewHeadNodes.values());\n\n    let promises = [];\n    for (const newNode of nodesToAppend) {\n      // TODO: This could theoretically be null, based on type\n      let newElt = /** @type {ChildNode} */ (\n        document.createRange().createContextualFragment(newNode.outerHTML)\n          .firstChild\n      );\n      if (ctx.callbacks.beforeNodeAdded(newElt) !== false) {\n        if (\n          (\"href\" in newElt && newElt.href) ||\n          (\"src\" in newElt && newElt.src)\n        ) {\n          /** @type {(result?: any) => void} */ let resolve;\n          let promise = new Promise(function (_resolve) {\n            resolve = _resolve;\n          });\n          newElt.addEventListener(\"load\", function () {\n            resolve();\n          });\n          promises.push(promise);\n        }\n        oldHead.appendChild(newElt);\n        ctx.callbacks.afterNodeAdded(newElt);\n        added.push(newElt);\n      }\n    }\n\n    // remove all removed elements, after we have appended the new elements to avoid\n    // additional network requests for things like style sheets\n    for (const removedElement of removed) {\n      if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) {\n        oldHead.removeChild(removedElement);\n        ctx.callbacks.afterNodeRemoved(removedElement);\n      }\n    }\n\n    ctx.head.afterHeadMorphed(oldHead, {\n      added: added,\n      kept: preserved,\n      removed: removed,\n    });\n    return promises;\n  }\n\n  //=============================================================================\n  // Create Morph Context Functions\n  //=============================================================================\n  const createMorphContext = (function () {\n    /**\n     *\n     * @param {Element} oldNode\n     * @param {Element} newContent\n     * @param {Config} config\n     * @returns {MorphContext}\n     */\n    function createMorphContext(oldNode, newContent, config) {\n      const { persistentIds, idMap } = createIdMaps(oldNode, newContent);\n\n      const mergedConfig = mergeDefaults(config);\n      const morphStyle = mergedConfig.morphStyle || \"outerHTML\";\n      if (![\"innerHTML\", \"outerHTML\"].includes(morphStyle)) {\n        throw `Do not understand how to morph style ${morphStyle}`;\n      }\n\n      return {\n        target: oldNode,\n        newContent: newContent,\n        config: mergedConfig,\n        morphStyle: morphStyle,\n        ignoreActive: mergedConfig.ignoreActive,\n        ignoreActiveValue: mergedConfig.ignoreActiveValue,\n        restoreFocus: mergedConfig.restoreFocus,\n        idMap: idMap,\n        persistentIds: persistentIds,\n        pantry: createPantry(),\n        activeElementAndParents: createActiveElementAndParents(oldNode),\n        callbacks: mergedConfig.callbacks,\n        head: mergedConfig.head,\n      };\n    }\n\n    /**\n     * Deep merges the config object and the Idiomorph.defaults object to\n     * produce a final configuration object\n     * @param {Config} config\n     * @returns {ConfigInternal}\n     */\n    function mergeDefaults(config) {\n      let finalConfig = Object.assign({}, defaults);\n\n      // copy top level stuff into final config\n      Object.assign(finalConfig, config);\n\n      // copy callbacks into final config (do this to deep merge the callbacks)\n      finalConfig.callbacks = Object.assign(\n        {},\n        defaults.callbacks,\n        config.callbacks,\n      );\n\n      // copy head config into final config  (do this to deep merge the head)\n      finalConfig.head = Object.assign({}, defaults.head, config.head);\n\n      return finalConfig;\n    }\n\n    /**\n     * @returns {HTMLDivElement}\n     */\n    function createPantry() {\n      const pantry = document.createElement(\"div\");\n      pantry.hidden = true;\n      document.body.insertAdjacentElement(\"afterend\", pantry);\n      return pantry;\n    }\n\n    /**\n     * @param {Element} oldNode\n     * @returns {Element[]}\n     */\n    function createActiveElementAndParents(oldNode) {\n      /** @type {Element[]} */\n      let activeElementAndParents = [];\n      let elt = document.activeElement;\n      if (elt?.tagName !== \"BODY\" && oldNode.contains(elt)) {\n        while (elt) {\n          activeElementAndParents.push(elt);\n          if (elt === oldNode) break;\n          elt = elt.parentElement;\n        }\n      }\n      return activeElementAndParents;\n    }\n\n    /**\n     * Returns all elements with an ID contained within the root element and its descendants\n     *\n     * @param {Element} root\n     * @returns {Element[]}\n     */\n    function findIdElements(root) {\n      let elements = Array.from(root.querySelectorAll(\"[id]\"));\n      // root could be a document fragment which doesn't have `getAttribute`\n      if (root.getAttribute?.(\"id\")) {\n        elements.push(root);\n      }\n      return elements;\n    }\n\n    /**\n     * A bottom-up algorithm that populates a map of Element -> IdSet.\n     * The idSet for a given element is the set of all IDs contained within its subtree.\n     * As an optimzation, we filter these IDs through the given list of persistent IDs,\n     * because we don't need to bother considering IDed elements that won't be in the new content.\n     *\n     * @param {Map<Node, Set<string>>} idMap\n     * @param {Set<string>} persistentIds\n     * @param {Element} root\n     * @param {Element[]} elements\n     */\n    function populateIdMapWithTree(idMap, persistentIds, root, elements) {\n      for (const elt of elements) {\n        // we can pretend id is non-null String, because the .has line will reject it immediately if not\n        const id = /** @type {String} */ (elt.getAttribute(\"id\"));\n        if (persistentIds.has(id)) {\n          /** @type {Element|null} */\n          let current = elt;\n          // walk up the parent hierarchy of that element, adding the id\n          // of element to the parent's id set\n          while (current) {\n            let idSet = idMap.get(current);\n            // if the id set doesn't exist, create it and insert it in the map\n            if (idSet == null) {\n              idSet = new Set();\n              idMap.set(current, idSet);\n            }\n            idSet.add(id);\n\n            if (current === root) break;\n            current = current.parentElement;\n          }\n        }\n      }\n    }\n\n    /**\n     * This function computes a map of nodes to all ids contained within that node (inclusive of the\n     * node).  This map can be used to ask if two nodes have intersecting sets of ids, which allows\n     * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n     * to contribute to a parent nodes matching.\n     *\n     * @param {Element} oldContent  the old content that will be morphed\n     * @param {Element} newContent  the new content to morph to\n     * @returns {IdSets}\n     */\n    function createIdMaps(oldContent, newContent) {\n      const oldIdElements = findIdElements(oldContent);\n      const newIdElements = findIdElements(newContent);\n\n      const persistentIds = createPersistentIds(oldIdElements, newIdElements);\n\n      /** @type {Map<Node, Set<string>>} */\n      let idMap = new Map();\n      populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements);\n\n      /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */\n      const newRoot = newContent.__idiomorphRoot || newContent;\n      populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements);\n\n      return { persistentIds, idMap };\n    }\n\n    /**\n     * This function computes the set of ids that persist between the two contents excluding duplicates\n     *\n     * @param {Element[]} oldIdElements\n     * @param {Element[]} newIdElements\n     * @returns {Set<string>}\n     */\n    function createPersistentIds(oldIdElements, newIdElements) {\n      let duplicateIds = new Set();\n\n      /** @type {Map<string, string>} */\n      let oldIdTagNameMap = new Map();\n      for (const { id, tagName } of oldIdElements) {\n        if (oldIdTagNameMap.has(id)) {\n          duplicateIds.add(id);\n        } else {\n          oldIdTagNameMap.set(id, tagName);\n        }\n      }\n\n      let persistentIds = new Set();\n      for (const { id, tagName } of newIdElements) {\n        if (persistentIds.has(id)) {\n          duplicateIds.add(id);\n        } else if (oldIdTagNameMap.get(id) === tagName) {\n          persistentIds.add(id);\n        }\n        // skip if tag types mismatch because its not possible to morph one tag into another\n      }\n\n      for (const id of duplicateIds) {\n        persistentIds.delete(id);\n      }\n      return persistentIds;\n    }\n\n    return createMorphContext;\n  })();\n\n  //=============================================================================\n  // HTML Normalization Functions\n  //=============================================================================\n  const { normalizeElement, normalizeParent } = (function () {\n    /** @type {WeakSet<Node>} */\n    const generatedByIdiomorph = new WeakSet();\n\n    /**\n     *\n     * @param {Element | Document} content\n     * @returns {Element}\n     */\n    function normalizeElement(content) {\n      if (content instanceof Document) {\n        return content.documentElement;\n      } else {\n        return content;\n      }\n    }\n\n    /**\n     *\n     * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent\n     * @returns {Element}\n     */\n    function normalizeParent(newContent) {\n      if (newContent == null) {\n        return document.createElement(\"div\"); // dummy parent element\n      } else if (typeof newContent === \"string\") {\n        return normalizeParent(parseContent(newContent));\n      } else if (\n        generatedByIdiomorph.has(/** @type {Element} */ (newContent))\n      ) {\n        // the template tag created by idiomorph parsing can serve as a dummy parent\n        return /** @type {Element} */ (newContent);\n      } else if (newContent instanceof Node) {\n        if (newContent.parentNode) {\n          // we can't use the parent directly because newContent may have siblings\n          // that we don't want in the morph, and reparenting might be expensive (TODO is it?),\n          // so instead we create a fake parent node that only sees a slice of its children.\n          /** @type {Element} */\n          return /** @type {any} */ (new SlicedParentNode(newContent));\n        } else {\n          // a single node is added as a child to a dummy parent\n          const dummyParent = document.createElement(\"div\");\n          dummyParent.append(newContent);\n          return dummyParent;\n        }\n      } else {\n        // all nodes in the array or HTMLElement collection are consolidated under\n        // a single dummy parent element\n        const dummyParent = document.createElement(\"div\");\n        for (const elt of [...newContent]) {\n          dummyParent.append(elt);\n        }\n        return dummyParent;\n      }\n    }\n\n    /**\n     * A fake duck-typed parent element to wrap a single node, without actually reparenting it.\n     * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved\n     * or replaced with one or more elements during the morph. This class effectively allows us a window into\n     * a slice of a node's children.\n     * \"If it walks like a duck, and quacks like a duck, then it must be a duck!\" -- James Whitcomb Riley (1849\u20131916)\n     */\n    class SlicedParentNode {\n      /** @param {Node} node */\n      constructor(node) {\n        this.originalNode = node;\n        this.realParentNode = /** @type {Element} */ (node.parentNode);\n        this.previousSibling = node.previousSibling;\n        this.nextSibling = node.nextSibling;\n      }\n\n      /** @returns {Node[]} */\n      get childNodes() {\n        // return slice of realParent's current childNodes, based on previousSibling and nextSibling\n        const nodes = [];\n        let cursor = this.previousSibling\n          ? this.previousSibling.nextSibling\n          : this.realParentNode.firstChild;\n        while (cursor && cursor != this.nextSibling) {\n          nodes.push(cursor);\n          cursor = cursor.nextSibling;\n        }\n        return nodes;\n      }\n\n      /**\n       * @param {string} selector\n       * @returns {Element[]}\n       */\n      querySelectorAll(selector) {\n        return this.childNodes.reduce((results, node) => {\n          if (node instanceof Element) {\n            if (node.matches(selector)) results.push(node);\n            const nodeList = node.querySelectorAll(selector);\n            for (let i = 0; i < nodeList.length; i++) {\n              results.push(nodeList[i]);\n            }\n          }\n          return results;\n        }, /** @type {Element[]} */ ([]));\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      insertBefore(node, referenceNode) {\n        return this.realParentNode.insertBefore(node, referenceNode);\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      moveBefore(node, referenceNode) {\n        // @ts-ignore - use new moveBefore feature\n        return this.realParentNode.moveBefore(node, referenceNode);\n      }\n\n      /**\n       * for later use with populateIdMapWithTree to halt upwards iteration\n       * @returns {Node}\n       */\n      get __idiomorphRoot() {\n        return this.originalNode;\n      }\n    }\n\n    /**\n     *\n     * @param {string} newContent\n     * @returns {Node | null | DocumentFragment}\n     */\n    function parseContent(newContent) {\n      let parser = new DOMParser();\n\n      // remove svgs to avoid false-positive matches on head, etc.\n      let contentWithSvgsRemoved = newContent.replace(\n        /<svg(\\s[^>]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n        \"\",\n      );\n\n      // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping\n      if (\n        contentWithSvgsRemoved.match(/<\\/html>/) ||\n        contentWithSvgsRemoved.match(/<\\/head>/) ||\n        contentWithSvgsRemoved.match(/<\\/body>/)\n      ) {\n        let content = parser.parseFromString(newContent, \"text/html\");\n        // if it is a full HTML document, return the document itself as the parent container\n        if (contentWithSvgsRemoved.match(/<\\/html>/)) {\n          generatedByIdiomorph.add(content);\n          return content;\n        } else {\n          // otherwise return the html element as the parent container\n          let htmlElement = content.firstChild;\n          if (htmlElement) {\n            generatedByIdiomorph.add(htmlElement);\n          }\n          return htmlElement;\n        }\n      } else {\n        // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help\n        // deal with touchy tags like tr, tbody, etc.\n        let responseDoc = parser.parseFromString(\n          \"<body><template>\" + newContent + \"</template></body>\",\n          \"text/html\",\n        );\n        let content = /** @type {HTMLTemplateElement} */ (\n          responseDoc.body.querySelector(\"template\")\n        ).content;\n        generatedByIdiomorph.add(content);\n        return content;\n      }\n    }\n\n    return { normalizeElement, normalizeParent };\n  })();\n\n  //=============================================================================\n  // This is what ends up becoming the Idiomorph global object\n  //=============================================================================\n  return {\n    morph,\n    defaults,\n  };\n})();\n\n/**\n * Morph the state of the currentElement based on the attributes and contents of\n * the newElement. Morphing may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing changes\n * @param newElement Element source of morphing changes\n */\nfunction morphElements(currentElement, newElement, { callbacks, ...options } = {}) {\n  Idiomorph.morph(currentElement, newElement, {\n    ...options,\n    callbacks: new DefaultIdiomorphCallbacks(callbacks)\n  });\n}\n\n/**\n * Morph the child elements of the currentElement based on the child elements of\n * the newElement. Morphing children may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing children changes\n * @param newElement Element source of morphing children changes\n */\nfunction morphChildren(currentElement, newElement, options = {}) {\n  morphElements(currentElement, newElement.childNodes, {\n    ...options,\n    morphStyle: \"innerHTML\"\n  });\n}\n\nfunction shouldRefreshFrameWithMorphing(currentFrame, newFrame) {\n  return currentFrame instanceof FrameElement &&\n    currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) &&\n    !currentFrame.closest(\"[data-turbo-permanent]\")\n}\n\nfunction areFramesCompatibleForRefreshing(currentFrame, newFrame) {\n  // newFrame cannot yet be an instance of FrameElement because custom\n  // elements don't get initialized until they're attached to the DOM, so\n  // test its Element#nodeName instead\n  return newFrame instanceof Element && newFrame.nodeName === \"TURBO-FRAME\" && currentFrame.id === newFrame.id &&\n  (!newFrame.getAttribute(\"src\") || urlsAreEqual(currentFrame.src, newFrame.getAttribute(\"src\")))\n}\n\nfunction closestFrameReloadableWithMorphing(node) {\n  return node.parentElement.closest(\"turbo-frame[src][refresh=morph]\")\n}\n\nclass DefaultIdiomorphCallbacks {\n  #beforeNodeMorphed\n\n  constructor({ beforeNodeMorphed } = {}) {\n    this.#beforeNodeMorphed = beforeNodeMorphed || (() => true);\n  }\n\n  beforeNodeAdded = (node) => {\n    return !(node.id && node.hasAttribute(\"data-turbo-permanent\") && document.getElementById(node.id))\n  }\n\n  beforeNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      if (!currentElement.hasAttribute(\"data-turbo-permanent\") && this.#beforeNodeMorphed(currentElement, newElement)) {\n        const event = dispatch(\"turbo:before-morph-element\", {\n          cancelable: true,\n          target: currentElement,\n          detail: { currentElement, newElement }\n        });\n\n        return !event.defaultPrevented\n      } else {\n        return false\n      }\n    }\n  }\n\n  beforeAttributeUpdated = (attributeName, target, mutationType) => {\n    const event = dispatch(\"turbo:before-morph-attribute\", {\n      cancelable: true,\n      target,\n      detail: { attributeName, mutationType }\n    });\n\n    return !event.defaultPrevented\n  }\n\n  beforeNodeRemoved = (node) => {\n    return this.beforeNodeMorphed(node)\n  }\n\n  afterNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      dispatch(\"turbo:morph-element\", {\n        target: currentElement,\n        detail: { currentElement, newElement }\n      });\n    }\n  }\n}\n\nclass MorphingFrameRenderer extends FrameRenderer {\n  static renderElement(currentElement, newElement) {\n    dispatch(\"turbo:before-frame-morph\", {\n      target: currentElement,\n      detail: { currentElement, newElement }\n    });\n\n    morphChildren(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              closestFrameReloadableWithMorphing(node) === currentElement\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n}\n\nclass ProgressBar {\n  static animationDuration = 300 /*ms*/\n\n  static get defaultCSS() {\n    return unindent`\n      .turbo-progress-bar {\n        position: fixed;\n        display: block;\n        top: 0;\n        left: 0;\n        height: 3px;\n        background: #0076ff;\n        z-index: 2147483647;\n        transition:\n          width ${ProgressBar.animationDuration}ms ease-out,\n          opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n        transform: translate3d(0, 0, 0);\n      }\n    `\n  }\n\n  hiding = false\n  value = 0\n  visible = false\n\n  constructor() {\n    this.stylesheetElement = this.createStylesheetElement();\n    this.progressElement = this.createProgressElement();\n    this.installStylesheetElement();\n    this.setValue(0);\n  }\n\n  show() {\n    if (!this.visible) {\n      this.visible = true;\n      this.installProgressElement();\n      this.startTrickling();\n    }\n  }\n\n  hide() {\n    if (this.visible && !this.hiding) {\n      this.hiding = true;\n      this.fadeProgressElement(() => {\n        this.uninstallProgressElement();\n        this.stopTrickling();\n        this.visible = false;\n        this.hiding = false;\n      });\n    }\n  }\n\n  setValue(value) {\n    this.value = value;\n    this.refresh();\n  }\n\n  // Private\n\n  installStylesheetElement() {\n    document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n  }\n\n  installProgressElement() {\n    this.progressElement.style.width = \"0\";\n    this.progressElement.style.opacity = \"1\";\n    document.documentElement.insertBefore(this.progressElement, document.body);\n    this.refresh();\n  }\n\n  fadeProgressElement(callback) {\n    this.progressElement.style.opacity = \"0\";\n    setTimeout(callback, ProgressBar.animationDuration * 1.5);\n  }\n\n  uninstallProgressElement() {\n    if (this.progressElement.parentNode) {\n      document.documentElement.removeChild(this.progressElement);\n    }\n  }\n\n  startTrickling() {\n    if (!this.trickleInterval) {\n      this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n    }\n  }\n\n  stopTrickling() {\n    window.clearInterval(this.trickleInterval);\n    delete this.trickleInterval;\n  }\n\n  trickle = () => {\n    this.setValue(this.value + Math.random() / 100);\n  }\n\n  refresh() {\n    requestAnimationFrame(() => {\n      this.progressElement.style.width = `${10 + this.value * 90}%`;\n    });\n  }\n\n  createStylesheetElement() {\n    const element = document.createElement(\"style\");\n    element.type = \"text/css\";\n    element.textContent = ProgressBar.defaultCSS;\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      element.nonce = cspNonce;\n    }\n    return element\n  }\n\n  createProgressElement() {\n    const element = document.createElement(\"div\");\n    element.className = \"turbo-progress-bar\";\n    return element\n  }\n}\n\nclass HeadSnapshot extends Snapshot {\n  detailsByOuterHTML = this.children\n    .filter((element) => !elementIsNoscript(element))\n    .map((element) => elementWithoutNonce(element))\n    .reduce((result, element) => {\n      const { outerHTML } = element;\n      const details =\n        outerHTML in result\n          ? result[outerHTML]\n          : {\n              type: elementType(element),\n              tracked: elementIsTracked(element),\n              elements: []\n            };\n      return {\n        ...result,\n        [outerHTML]: {\n          ...details,\n          elements: [...details.elements, element]\n        }\n      }\n    }, {})\n\n  get trackedElementSignature() {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n      .join(\"\")\n  }\n\n  getScriptElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot)\n  }\n\n  getStylesheetElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot)\n  }\n\n  getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n      .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n      .filter(({ type }) => type == matchedType)\n      .map(({ elements: [element] }) => element)\n  }\n\n  get provisionalElements() {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n      if (type == null && !tracked) {\n        return [...result, ...elements]\n      } else if (elements.length > 1) {\n        return [...result, ...elements.slice(1)]\n      } else {\n        return result\n      }\n    }, [])\n  }\n\n  getMetaValue(name) {\n    const element = this.findMetaElementByName(name);\n    return element ? element.getAttribute(\"content\") : null\n  }\n\n  findMetaElementByName(name) {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const {\n        elements: [element]\n      } = this.detailsByOuterHTML[outerHTML];\n      return elementIsMetaElementWithName(element, name) ? element : result\n    }, undefined | undefined)\n  }\n}\n\nfunction elementType(element) {\n  if (elementIsScript(element)) {\n    return \"script\"\n  } else if (elementIsStylesheet(element)) {\n    return \"stylesheet\"\n  }\n}\n\nfunction elementIsTracked(element) {\n  return element.getAttribute(\"data-turbo-track\") == \"reload\"\n}\n\nfunction elementIsScript(element) {\n  const tagName = element.localName;\n  return tagName == \"script\"\n}\n\nfunction elementIsNoscript(element) {\n  const tagName = element.localName;\n  return tagName == \"noscript\"\n}\n\nfunction elementIsStylesheet(element) {\n  const tagName = element.localName;\n  return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\")\n}\n\nfunction elementIsMetaElementWithName(element, name) {\n  const tagName = element.localName;\n  return tagName == \"meta\" && element.getAttribute(\"name\") == name\n}\n\nfunction elementWithoutNonce(element) {\n  if (element.hasAttribute(\"nonce\")) {\n    element.setAttribute(\"nonce\", \"\");\n  }\n\n  return element\n}\n\nclass PageSnapshot extends Snapshot {\n  static fromHTMLString(html = \"\") {\n    return this.fromDocument(parseHTMLDocument(html))\n  }\n\n  static fromElement(element) {\n    return this.fromDocument(element.ownerDocument)\n  }\n\n  static fromDocument({ documentElement, body, head }) {\n    return new this(documentElement, body, new HeadSnapshot(head))\n  }\n\n  constructor(documentElement, body, headSnapshot) {\n    super(body);\n    this.documentElement = documentElement;\n    this.headSnapshot = headSnapshot;\n  }\n\n  clone() {\n    const clonedElement = this.element.cloneNode(true);\n\n    const selectElements = this.element.querySelectorAll(\"select\");\n    const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n\n    for (const [index, source] of selectElements.entries()) {\n      const clone = clonedSelectElements[index];\n      for (const option of clone.selectedOptions) option.selected = false;\n      for (const option of source.selectedOptions) clone.options[option.index].selected = true;\n    }\n\n    for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n      clonedPasswordInput.value = \"\";\n    }\n\n    for (const clonedNoscriptElement of clonedElement.querySelectorAll(\"noscript\")) {\n      clonedNoscriptElement.remove();\n    }\n\n    return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot)\n  }\n\n  get lang() {\n    return this.documentElement.getAttribute(\"lang\")\n  }\n\n  get dir() {\n    return this.documentElement.getAttribute(\"dir\")\n  }\n\n  get headElement() {\n    return this.headSnapshot.element\n  }\n\n  get rootLocation() {\n    const root = this.getSetting(\"root\") ?? \"/\";\n    return expandURL(root)\n  }\n\n  get cacheControlValue() {\n    return this.getSetting(\"cache-control\")\n  }\n\n  get isPreviewable() {\n    return this.cacheControlValue != \"no-preview\"\n  }\n\n  get isCacheable() {\n    return this.cacheControlValue != \"no-cache\"\n  }\n\n  get isVisitable() {\n    return this.getSetting(\"visit-control\") != \"reload\"\n  }\n\n  get prefersViewTransitions() {\n    const viewTransitionEnabled = this.getSetting(\"view-transition\") === \"true\" || this.headSnapshot.getMetaValue(\"view-transition\") === \"same-origin\";\n    return viewTransitionEnabled && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n  }\n\n  get refreshMethod() {\n    return this.getSetting(\"refresh-method\")\n  }\n\n  get refreshScroll() {\n    return this.getSetting(\"refresh-scroll\")\n  }\n\n  // Private\n\n  getSetting(name) {\n    return this.headSnapshot.getMetaValue(`turbo-${name}`)\n  }\n}\n\nclass ViewTransitioner {\n  #viewTransitionStarted = false\n  #lastOperation = Promise.resolve()\n\n  renderChange(useViewTransition, render) {\n    if (useViewTransition && this.viewTransitionsAvailable && !this.#viewTransitionStarted) {\n      this.#viewTransitionStarted = true;\n      this.#lastOperation = this.#lastOperation.then(async () => {\n        await document.startViewTransition(render).finished;\n      });\n    } else {\n      this.#lastOperation = this.#lastOperation.then(render);\n    }\n\n    return this.#lastOperation\n  }\n\n  get viewTransitionsAvailable() {\n    return document.startViewTransition\n  }\n}\n\nconst defaultOptions = {\n  action: \"advance\",\n  historyChanged: false,\n  visitCachedSnapshot: () => {},\n  willRender: true,\n  updateHistory: true,\n  shouldCacheSnapshot: true,\n  acceptsStreamResponse: false,\n  refresh: {}\n};\n\nconst TimingMetric = {\n  visitStart: \"visitStart\",\n  requestStart: \"requestStart\",\n  requestEnd: \"requestEnd\",\n  visitEnd: \"visitEnd\"\n};\n\nconst VisitState = {\n  initialized: \"initialized\",\n  started: \"started\",\n  canceled: \"canceled\",\n  failed: \"failed\",\n  completed: \"completed\"\n};\n\nconst SystemStatusCode = {\n  networkFailure: 0,\n  timeoutFailure: -1,\n  contentTypeMismatch: -2\n};\n\nconst Direction = {\n  advance: \"forward\",\n  restore: \"back\",\n  replace: \"none\"\n};\n\nclass Visit {\n  identifier = uuid() // Required by turbo-ios\n  timingMetrics = {}\n\n  followedRedirect = false\n  historyChanged = false\n  scrolled = false\n  shouldCacheSnapshot = true\n  acceptsStreamResponse = false\n  snapshotCached = false\n  state = VisitState.initialized\n  viewTransitioner = new ViewTransitioner()\n\n  constructor(delegate, location, restorationIdentifier, options = {}) {\n    this.delegate = delegate;\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier || uuid();\n\n    const {\n      action,\n      historyChanged,\n      referrer,\n      snapshot,\n      snapshotHTML,\n      response,\n      visitCachedSnapshot,\n      willRender,\n      updateHistory,\n      shouldCacheSnapshot,\n      acceptsStreamResponse,\n      direction,\n      refresh\n    } = {\n      ...defaultOptions,\n      ...options\n    };\n    this.action = action;\n    this.historyChanged = historyChanged;\n    this.referrer = referrer;\n    this.snapshot = snapshot;\n    this.snapshotHTML = snapshotHTML;\n    this.response = response;\n    this.isPageRefresh = this.view.isPageRefresh(this);\n    this.visitCachedSnapshot = visitCachedSnapshot;\n    this.willRender = willRender;\n    this.updateHistory = updateHistory;\n    this.scrolled = !willRender;\n    this.shouldCacheSnapshot = shouldCacheSnapshot;\n    this.acceptsStreamResponse = acceptsStreamResponse;\n    this.direction = direction || Direction[action];\n    this.refresh = refresh;\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  get restorationData() {\n    return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)\n  }\n\n  start() {\n    if (this.state == VisitState.initialized) {\n      this.recordTimingMetric(TimingMetric.visitStart);\n      this.state = VisitState.started;\n      this.adapter.visitStarted(this);\n      this.delegate.visitStarted(this);\n    }\n  }\n\n  cancel() {\n    if (this.state == VisitState.started) {\n      if (this.request) {\n        this.request.cancel();\n      }\n      this.cancelRender();\n      this.state = VisitState.canceled;\n    }\n  }\n\n  complete() {\n    if (this.state == VisitState.started) {\n      this.recordTimingMetric(TimingMetric.visitEnd);\n      this.adapter.visitCompleted(this);\n      this.state = VisitState.completed;\n      this.followRedirect();\n\n      if (!this.followedRedirect) {\n        this.delegate.visitCompleted(this);\n      }\n    }\n  }\n\n  fail() {\n    if (this.state == VisitState.started) {\n      this.state = VisitState.failed;\n      this.adapter.visitFailed(this);\n      this.delegate.visitCompleted(this);\n    }\n  }\n\n  changeHistory() {\n    if (!this.historyChanged && this.updateHistory) {\n      const actionForHistory = this.location.href === this.referrer?.href ? \"replace\" : this.action;\n      const method = getHistoryMethodForAction(actionForHistory);\n      this.history.update(method, this.location, this.restorationIdentifier);\n      this.historyChanged = true;\n    }\n  }\n\n  issueRequest() {\n    if (this.hasPreloadedResponse()) {\n      this.simulateRequest();\n    } else if (this.shouldIssueRequest() && !this.request) {\n      this.request = new FetchRequest(this, FetchMethod.get, this.location);\n      this.request.perform();\n    }\n  }\n\n  simulateRequest() {\n    if (this.response) {\n      this.startRequest();\n      this.recordResponse();\n      this.finishRequest();\n    }\n  }\n\n  startRequest() {\n    this.recordTimingMetric(TimingMetric.requestStart);\n    this.adapter.visitRequestStarted(this);\n  }\n\n  recordResponse(response = this.response) {\n    this.response = response;\n    if (response) {\n      const { statusCode } = response;\n      if (isSuccessful(statusCode)) {\n        this.adapter.visitRequestCompleted(this);\n      } else {\n        this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n      }\n    }\n  }\n\n  finishRequest() {\n    this.recordTimingMetric(TimingMetric.requestEnd);\n    this.adapter.visitRequestFinished(this);\n  }\n\n  loadResponse() {\n    if (this.response) {\n      const { statusCode, responseHTML } = this.response;\n      this.render(async () => {\n        if (this.shouldCacheSnapshot) this.cacheSnapshot();\n        if (this.view.renderPromise) await this.view.renderPromise;\n\n        if (isSuccessful(statusCode) && responseHTML != null) {\n          const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n          await this.renderPageSnapshot(snapshot, false);\n\n          this.adapter.visitRendered(this);\n          this.complete();\n        } else {\n          await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n          this.adapter.visitRendered(this);\n          this.fail();\n        }\n      });\n    }\n  }\n\n  getCachedSnapshot() {\n    const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n\n    if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n      if (this.action == \"restore\" || snapshot.isPreviewable) {\n        return snapshot\n      }\n    }\n  }\n\n  getPreloadedSnapshot() {\n    if (this.snapshotHTML) {\n      return PageSnapshot.fromHTMLString(this.snapshotHTML)\n    }\n  }\n\n  hasCachedSnapshot() {\n    return this.getCachedSnapshot() != null\n  }\n\n  loadCachedSnapshot() {\n    const snapshot = this.getCachedSnapshot();\n    if (snapshot) {\n      const isPreview = this.shouldIssueRequest();\n      this.render(async () => {\n        this.cacheSnapshot();\n        if (this.isPageRefresh) {\n          this.adapter.visitRendered(this);\n        } else {\n          if (this.view.renderPromise) await this.view.renderPromise;\n\n          await this.renderPageSnapshot(snapshot, isPreview);\n\n          this.adapter.visitRendered(this);\n          if (!isPreview) {\n            this.complete();\n          }\n        }\n      });\n    }\n  }\n\n  followRedirect() {\n    if (this.redirectedToLocation && !this.followedRedirect && this.response?.redirected) {\n      this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n        action: \"replace\",\n        response: this.response,\n        shouldCacheSnapshot: false,\n        willRender: false\n      });\n      this.followedRedirect = true;\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (this.acceptsStreamResponse) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted() {\n    this.startRequest();\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {}\n\n  async requestSucceededWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.redirectedToLocation = response.redirected ? response.location : undefined;\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  async requestFailedWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  requestErrored(_request, _error) {\n    this.recordResponse({\n      statusCode: SystemStatusCode.networkFailure,\n      redirected: false\n    });\n  }\n\n  requestFinished() {\n    this.finishRequest();\n  }\n\n  // Scrolling\n\n  performScroll() {\n    if (!this.scrolled && !this.view.forceReloaded && !this.view.shouldPreserveScrollPosition(this)) {\n      if (this.action == \"restore\") {\n        this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n      } else {\n        this.scrollToAnchor() || this.view.scrollToTop();\n      }\n\n      this.scrolled = true;\n    }\n  }\n\n  scrollToRestoredPosition() {\n    const { scrollPosition } = this.restorationData;\n    if (scrollPosition) {\n      this.view.scrollToPosition(scrollPosition);\n      return true\n    }\n  }\n\n  scrollToAnchor() {\n    const anchor = getAnchor(this.location);\n    if (anchor != null) {\n      this.view.scrollToAnchor(anchor);\n      return true\n    }\n  }\n\n  // Instrumentation\n\n  recordTimingMetric(metric) {\n    this.timingMetrics[metric] = new Date().getTime();\n  }\n\n  getTimingMetrics() {\n    return { ...this.timingMetrics }\n  }\n\n  // Private\n\n  hasPreloadedResponse() {\n    return typeof this.response == \"object\"\n  }\n\n  shouldIssueRequest() {\n    if (this.action == \"restore\") {\n      return !this.hasCachedSnapshot()\n    } else {\n      return this.willRender\n    }\n  }\n\n  cacheSnapshot() {\n    if (!this.snapshotCached) {\n      this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n      this.snapshotCached = true;\n    }\n  }\n\n  async render(callback) {\n    this.cancelRender();\n    await new Promise((resolve) => {\n      this.frame =\n        document.visibilityState === \"hidden\" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve());\n    });\n    await callback();\n    delete this.frame;\n  }\n\n  async renderPageSnapshot(snapshot, isPreview) {\n    await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(snapshot), async () => {\n      await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n      this.performScroll();\n    });\n  }\n\n  cancelRender() {\n    if (this.frame) {\n      cancelAnimationFrame(this.frame);\n      delete this.frame;\n    }\n  }\n}\n\nfunction isSuccessful(statusCode) {\n  return statusCode >= 200 && statusCode < 300\n}\n\nclass BrowserAdapter {\n  progressBar = new ProgressBar()\n\n  constructor(session) {\n    this.session = session;\n  }\n\n  visitProposedToLocation(location, options) {\n    if (locationIsVisitable(location, this.navigator.rootLocation)) {\n      this.navigator.startVisit(location, options?.restorationIdentifier || uuid(), options);\n    } else {\n      window.location.href = location.toString();\n    }\n  }\n\n  visitStarted(visit) {\n    this.location = visit.location;\n    this.redirectedToLocation = null;\n\n    visit.loadCachedSnapshot();\n    visit.issueRequest();\n  }\n\n  visitRequestStarted(visit) {\n    this.progressBar.setValue(0);\n    if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n      this.showVisitProgressBarAfterDelay();\n    } else {\n      this.showProgressBar();\n    }\n  }\n\n  visitRequestCompleted(visit) {\n    visit.loadResponse();\n\n    if (visit.response.redirected) {\n      this.redirectedToLocation = visit.redirectedToLocation;\n    }\n  }\n\n  visitRequestFailedWithStatusCode(visit, statusCode) {\n    switch (statusCode) {\n      case SystemStatusCode.networkFailure:\n      case SystemStatusCode.timeoutFailure:\n      case SystemStatusCode.contentTypeMismatch:\n        return this.reload({\n          reason: \"request_failed\",\n          context: {\n            statusCode\n          }\n        })\n      default:\n        return visit.loadResponse()\n    }\n  }\n\n  visitRequestFinished(_visit) {}\n\n  visitCompleted(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  pageInvalidated(reason) {\n    this.reload(reason);\n  }\n\n  visitFailed(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  visitRendered(_visit) {}\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    return true\n  }\n\n  // Form Submission Delegate\n\n  formSubmissionStarted(_formSubmission) {\n    this.progressBar.setValue(0);\n    this.showFormProgressBarAfterDelay();\n  }\n\n  formSubmissionFinished(_formSubmission) {\n    this.progressBar.setValue(1);\n    this.hideFormProgressBar();\n  }\n\n  // Private\n\n  showVisitProgressBarAfterDelay() {\n    this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n  }\n\n  hideVisitProgressBar() {\n    this.progressBar.hide();\n    if (this.visitProgressBarTimeout != null) {\n      window.clearTimeout(this.visitProgressBarTimeout);\n      delete this.visitProgressBarTimeout;\n    }\n  }\n\n  showFormProgressBarAfterDelay() {\n    if (this.formProgressBarTimeout == null) {\n      this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n  }\n\n  hideFormProgressBar() {\n    this.progressBar.hide();\n    if (this.formProgressBarTimeout != null) {\n      window.clearTimeout(this.formProgressBarTimeout);\n      delete this.formProgressBarTimeout;\n    }\n  }\n\n  showProgressBar = () => {\n    this.progressBar.show();\n  }\n\n  reload(reason) {\n    dispatch(\"turbo:reload\", { detail: reason });\n\n    window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href;\n  }\n\n  get navigator() {\n    return this.session.navigator\n  }\n}\n\nclass CacheObserver {\n  selector = \"[data-turbo-temporary]\"\n\n  started = false\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  removeTemporaryElements = (_event) => {\n    for (const element of this.temporaryElements) {\n      element.remove();\n    }\n  }\n\n  get temporaryElements() {\n    return [...document.querySelectorAll(this.selector)]\n  }\n}\n\nclass FrameRedirector {\n  constructor(session, element) {\n    this.session = session;\n    this.element = element;\n    this.linkInterceptor = new LinkInterceptor(this, element);\n    this.formSubmitObserver = new FormSubmitObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n    this.formSubmitObserver.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n    this.formSubmitObserver.stop();\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldRedirect(element)\n  }\n\n  linkClickIntercepted(element, url, event) {\n    const frame = this.#findFrameElement(element);\n    if (frame) {\n      frame.delegate.linkClickIntercepted(element, url, event);\n    }\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return (\n      element.closest(\"turbo-frame\") == null &&\n      this.#shouldSubmit(element, submitter) &&\n      this.#shouldRedirect(element, submitter)\n    )\n  }\n\n  formSubmitted(element, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n    if (frame) {\n      frame.delegate.formSubmitted(element, submitter);\n    }\n  }\n\n  #shouldSubmit(form, submitter) {\n    const action = getAction$1(form, submitter);\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const rootLocation = expandURL(meta?.content ?? \"/\");\n\n    return this.#shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation)\n  }\n\n  #shouldRedirect(element, submitter) {\n    const isNavigatable =\n      element instanceof HTMLFormElement\n        ? this.session.submissionIsNavigatable(element, submitter)\n        : this.session.elementIsNavigatable(element);\n\n    if (isNavigatable) {\n      const frame = this.#findFrameElement(element, submitter);\n      return frame ? frame != element.closest(\"turbo-frame\") : false\n    } else {\n      return false\n    }\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = submitter?.getAttribute(\"data-turbo-frame\") || element.getAttribute(\"data-turbo-frame\");\n    if (id && id != \"_top\") {\n      const frame = this.element.querySelector(`#${id}:not([disabled])`);\n      if (frame instanceof FrameElement) {\n        return frame\n      }\n    }\n  }\n}\n\nclass History {\n  location\n  restorationIdentifier = uuid()\n  restorationData = {}\n  started = false\n  currentIndex = 0\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"popstate\", this.onPopState, false);\n      this.currentIndex = history.state?.turbo?.restorationIndex || 0;\n      this.started = true;\n      this.replace(new URL(window.location.href));\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"popstate\", this.onPopState, false);\n      this.started = false;\n    }\n  }\n\n  push(location, restorationIdentifier) {\n    this.update(history.pushState, location, restorationIdentifier);\n  }\n\n  replace(location, restorationIdentifier) {\n    this.update(history.replaceState, location, restorationIdentifier);\n  }\n\n  update(method, location, restorationIdentifier = uuid()) {\n    if (method === history.pushState) ++this.currentIndex;\n\n    const state = { turbo: { restorationIdentifier, restorationIndex: this.currentIndex } };\n    method.call(history, state, \"\", location.href);\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier;\n  }\n\n  // Restoration data\n\n  getRestorationDataForIdentifier(restorationIdentifier) {\n    return this.restorationData[restorationIdentifier] || {}\n  }\n\n  updateRestorationData(additionalData) {\n    const { restorationIdentifier } = this;\n    const restorationData = this.restorationData[restorationIdentifier];\n    this.restorationData[restorationIdentifier] = {\n      ...restorationData,\n      ...additionalData\n    };\n  }\n\n  // Scroll restoration\n\n  assumeControlOfScrollRestoration() {\n    if (!this.previousScrollRestoration) {\n      this.previousScrollRestoration = history.scrollRestoration ?? \"auto\";\n      history.scrollRestoration = \"manual\";\n    }\n  }\n\n  relinquishControlOfScrollRestoration() {\n    if (this.previousScrollRestoration) {\n      history.scrollRestoration = this.previousScrollRestoration;\n      delete this.previousScrollRestoration;\n    }\n  }\n\n  // Event handlers\n\n  onPopState = (event) => {\n    const { turbo } = event.state || {};\n    this.location = new URL(window.location.href);\n\n    if (turbo) {\n      const { restorationIdentifier, restorationIndex } = turbo;\n      this.restorationIdentifier = restorationIdentifier;\n      const direction = restorationIndex > this.currentIndex ? \"forward\" : \"back\";\n      this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction);\n      this.currentIndex = restorationIndex;\n    } else {\n      this.currentIndex++;\n      this.delegate.historyPoppedWithEmptyState(this.location);\n    }\n  }\n}\n\nclass LinkPrefetchObserver {\n  started = false\n  #prefetchedLink = null\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (this.started) return\n\n    if (this.eventTarget.readyState === \"loading\") {\n      this.eventTarget.addEventListener(\"DOMContentLoaded\", this.#enable, { once: true });\n    } else {\n      this.#enable();\n    }\n  }\n\n  stop() {\n    if (!this.started) return\n\n    this.eventTarget.removeEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.removeEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.removeEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = false;\n  }\n\n  #enable = () => {\n    this.eventTarget.addEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.addEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.addEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = true;\n  }\n\n  #tryToPrefetchRequest = (event) => {\n    if (getMetaContent(\"turbo-prefetch\") === \"false\") return\n\n    const target = event.target;\n    const isLink = target.matches && target.matches(\"a[href]:not([target^=_]):not([download])\");\n\n    if (isLink && this.#isPrefetchable(target)) {\n      const link = target;\n      const location = getLocationForLink(link);\n\n      if (this.delegate.canPrefetchRequestToLocation(link, location)) {\n        this.#prefetchedLink = link;\n\n        const fetchRequest = new FetchRequest(\n          this,\n          FetchMethod.get,\n          location,\n          new URLSearchParams(),\n          target\n        );\n\n        fetchRequest.fetchOptions.priority = \"low\";\n\n        prefetchCache.putLater(location, fetchRequest, this.#cacheTtl);\n      }\n    }\n  }\n\n  #cancelRequestIfObsolete = (event) => {\n    if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();\n  }\n\n  #cancelPrefetchRequest = () => {\n    prefetchCache.clear();\n    this.#prefetchedLink = null;\n  }\n\n  #tryToUsePrefetchedRequest = (event) => {\n    if (event.target.tagName !== \"FORM\" && event.detail.fetchOptions.method === \"GET\") {\n      const cached = prefetchCache.get(event.detail.url);\n\n      if (cached) {\n        // User clicked link, use cache response\n        event.detail.fetchRequest = cached;\n      }\n\n      prefetchCache.clear();\n    }\n  }\n\n  prepareRequest(request) {\n    const link = request.target;\n\n    request.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n\n    const turboFrame = link.closest(\"turbo-frame\");\n    const turboFrameTarget = link.getAttribute(\"data-turbo-frame\") || turboFrame?.getAttribute(\"target\") || turboFrame?.id;\n\n    if (turboFrameTarget && turboFrameTarget !== \"_top\") {\n      request.headers[\"Turbo-Frame\"] = turboFrameTarget;\n    }\n  }\n\n  // Fetch request interface\n\n  requestSucceededWithResponse() {}\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  get #cacheTtl() {\n    return Number(getMetaContent(\"turbo-prefetch-cache-time\")) || cacheTtl\n  }\n\n  #isPrefetchable(link) {\n    const href = link.getAttribute(\"href\");\n\n    if (!href) return false\n\n    if (unfetchableLink(link)) return false\n    if (linkToTheSamePage(link)) return false\n    if (linkOptsOut(link)) return false\n    if (nonSafeLink(link)) return false\n    if (eventPrevented(link)) return false\n\n    return true\n  }\n}\n\nconst unfetchableLink = (link) => {\n  return link.origin !== document.location.origin || ![\"http:\", \"https:\"].includes(link.protocol) || link.hasAttribute(\"target\")\n};\n\nconst linkToTheSamePage = (link) => {\n  return (link.pathname + link.search === document.location.pathname + document.location.search) || link.href.startsWith(\"#\")\n};\n\nconst linkOptsOut = (link) => {\n  if (link.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n  if (link.getAttribute(\"data-turbo\") === \"false\") return true\n\n  const turboPrefetchParent = findClosestRecursively(link, \"[data-turbo-prefetch]\");\n  if (turboPrefetchParent && turboPrefetchParent.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n\n  return false\n};\n\nconst nonSafeLink = (link) => {\n  const turboMethod = link.getAttribute(\"data-turbo-method\");\n  if (turboMethod && turboMethod.toLowerCase() !== \"get\") return true\n\n  if (isUJS(link)) return true\n  if (link.hasAttribute(\"data-turbo-confirm\")) return true\n  if (link.hasAttribute(\"data-turbo-stream\")) return true\n\n  return false\n};\n\nconst isUJS = (link) => {\n  return link.hasAttribute(\"data-remote\") || link.hasAttribute(\"data-behavior\") || link.hasAttribute(\"data-confirm\") || link.hasAttribute(\"data-method\")\n};\n\nconst eventPrevented = (link) => {\n  const event = dispatch(\"turbo:before-prefetch\", { target: link, cancelable: true });\n  return event.defaultPrevented\n};\n\nclass Navigator {\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  proposeVisit(location, options = {}) {\n    if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n      this.delegate.visitProposedToLocation(location, options);\n    }\n  }\n\n  startVisit(locatable, restorationIdentifier, options = {}) {\n    this.stop();\n    this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, {\n      referrer: this.location,\n      ...options\n    });\n    this.currentVisit.start();\n  }\n\n  submitForm(form, submitter) {\n    this.stop();\n    this.formSubmission = new FormSubmission(this, form, submitter, true);\n\n    this.formSubmission.start();\n  }\n\n  stop() {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n      delete this.formSubmission;\n    }\n\n    if (this.currentVisit) {\n      this.currentVisit.cancel();\n      delete this.currentVisit;\n    }\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get rootLocation() {\n    return this.view.snapshot.rootLocation\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted(formSubmission) {\n    // Not all adapters implement formSubmissionStarted\n    if (typeof this.adapter.formSubmissionStarted === \"function\") {\n      this.adapter.formSubmissionStarted(formSubmission);\n    }\n  }\n\n  async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n    if (formSubmission == this.formSubmission) {\n      const responseHTML = await fetchResponse.responseHTML;\n      if (responseHTML) {\n        const shouldCacheSnapshot = formSubmission.isSafe;\n        if (!shouldCacheSnapshot) {\n          this.view.clearSnapshotCache();\n        }\n\n        const { statusCode, redirected } = fetchResponse;\n        const action = this.#getActionForFormSubmission(formSubmission, fetchResponse);\n        const visitOptions = {\n          action,\n          shouldCacheSnapshot,\n          response: { statusCode, responseHTML, redirected }\n        };\n        this.proposeVisit(fetchResponse.location, visitOptions);\n      }\n    }\n  }\n\n  async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    const responseHTML = await fetchResponse.responseHTML;\n\n    if (responseHTML) {\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n      if (fetchResponse.serverError) {\n        await this.view.renderError(snapshot, this.currentVisit);\n      } else {\n        await this.view.renderPage(snapshot, false, true, this.currentVisit);\n      }\n      if (snapshot.refreshScroll !== \"preserve\") {\n        this.view.scrollToTop();\n      }\n      this.view.clearSnapshotCache();\n    }\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished(formSubmission) {\n    // Not all adapters implement formSubmissionFinished\n    if (typeof this.adapter.formSubmissionFinished === \"function\") {\n      this.adapter.formSubmissionFinished(formSubmission);\n    }\n  }\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    // Not all adapters implement linkPrefetchingIsEnabledForLocation\n    if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === \"function\") {\n      return this.adapter.linkPrefetchingIsEnabledForLocation(location)\n    }\n\n    return true\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    this.delegate.visitStarted(visit);\n  }\n\n  visitCompleted(visit) {\n    this.delegate.visitCompleted(visit);\n    delete this.currentVisit;\n  }\n\n  // Same-page links are no longer handled with a Visit.\n  // This method is still needed for Turbo Native adapters.\n  locationWithActionIsSamePage(location, action) {\n    return false\n  }\n\n  // Visits\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  #getActionForFormSubmission(formSubmission, fetchResponse) {\n    const { submitter, formElement } = formSubmission;\n    return getVisitAction(submitter, formElement) || this.#getDefaultAction(fetchResponse)\n  }\n\n  #getDefaultAction(fetchResponse) {\n    const sameLocationRedirect = fetchResponse.redirected && fetchResponse.location.href === this.location?.href;\n    return sameLocationRedirect ? \"replace\" : \"advance\"\n  }\n}\n\nconst PageStage = {\n  initial: 0,\n  loading: 1,\n  interactive: 2,\n  complete: 3\n};\n\nclass PageObserver {\n  stage = PageStage.initial\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      if (this.stage == PageStage.initial) {\n        this.stage = PageStage.loading;\n      }\n      document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n      addEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n      removeEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = false;\n    }\n  }\n\n  interpretReadyState = () => {\n    const { readyState } = this;\n    if (readyState == \"interactive\") {\n      this.pageIsInteractive();\n    } else if (readyState == \"complete\") {\n      this.pageIsComplete();\n    }\n  }\n\n  pageIsInteractive() {\n    if (this.stage == PageStage.loading) {\n      this.stage = PageStage.interactive;\n      this.delegate.pageBecameInteractive();\n    }\n  }\n\n  pageIsComplete() {\n    this.pageIsInteractive();\n    if (this.stage == PageStage.interactive) {\n      this.stage = PageStage.complete;\n      this.delegate.pageLoaded();\n    }\n  }\n\n  pageWillUnload = () => {\n    this.delegate.pageWillUnload();\n  }\n\n  get readyState() {\n    return document.readyState\n  }\n}\n\nclass ScrollObserver {\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"scroll\", this.onScroll, false);\n      this.onScroll();\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"scroll\", this.onScroll, false);\n      this.started = false;\n    }\n  }\n\n  onScroll = () => {\n    this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n  }\n\n  // Private\n\n  updatePosition(position) {\n    this.delegate.scrollPositionChanged(position);\n  }\n}\n\nclass StreamMessageRenderer {\n  render({ fragment }) {\n    Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => {\n      withAutofocusFromFragment(fragment, () => {\n        withPreservedFocus(() => {\n          document.documentElement.appendChild(fragment);\n        });\n      });\n    });\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement, newPermanentElement) {\n    newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n  }\n\n  leavingBardo() {}\n}\n\nfunction getPermanentElementMapForFragment(fragment) {\n  const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n  const permanentElementMap = {};\n  for (const permanentElementInDocument of permanentElementsInDocument) {\n    const { id } = permanentElementInDocument;\n\n    for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n      const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n\n      if (elementInStream) {\n        permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n      }\n    }\n  }\n\n  return permanentElementMap\n}\n\nasync function withAutofocusFromFragment(fragment, callback) {\n  const generatedID = `turbo-stream-autofocus-${uuid()}`;\n  const turboStreams = fragment.querySelectorAll(\"turbo-stream\");\n  const elementWithAutofocus = firstAutofocusableElementInStreams(turboStreams);\n  let willAutofocusId = null;\n\n  if (elementWithAutofocus) {\n    if (elementWithAutofocus.id) {\n      willAutofocusId = elementWithAutofocus.id;\n    } else {\n      willAutofocusId = generatedID;\n    }\n\n    elementWithAutofocus.id = willAutofocusId;\n  }\n\n  callback();\n  await nextRepaint();\n\n  const hasNoActiveElement = document.activeElement == null || document.activeElement == document.body;\n\n  if (hasNoActiveElement && willAutofocusId) {\n    const elementToAutofocus = document.getElementById(willAutofocusId);\n\n    if (elementIsFocusable(elementToAutofocus)) {\n      elementToAutofocus.focus();\n    }\n    if (elementToAutofocus && elementToAutofocus.id == generatedID) {\n      elementToAutofocus.removeAttribute(\"id\");\n    }\n  }\n}\n\nasync function withPreservedFocus(callback) {\n  const [activeElementBeforeRender, activeElementAfterRender] = await around(callback, () => document.activeElement);\n\n  const restoreFocusTo = activeElementBeforeRender && activeElementBeforeRender.id;\n\n  if (restoreFocusTo) {\n    const elementToFocus = document.getElementById(restoreFocusTo);\n\n    if (elementIsFocusable(elementToFocus) && elementToFocus != activeElementAfterRender) {\n      elementToFocus.focus();\n    }\n  }\n}\n\nfunction firstAutofocusableElementInStreams(nodeListOfStreamElements) {\n  for (const streamElement of nodeListOfStreamElements) {\n    const elementWithAutofocus = queryAutofocusableElement(streamElement.templateElement.content);\n\n    if (elementWithAutofocus) return elementWithAutofocus\n  }\n\n  return null\n}\n\nclass StreamObserver {\n  sources = new Set()\n  #started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.#started) {\n      this.#started = true;\n      addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  stop() {\n    if (this.#started) {\n      this.#started = false;\n      removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  connectStreamSource(source) {\n    if (!this.streamSourceIsConnected(source)) {\n      this.sources.add(source);\n      source.addEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  disconnectStreamSource(source) {\n    if (this.streamSourceIsConnected(source)) {\n      this.sources.delete(source);\n      source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  streamSourceIsConnected(source) {\n    return this.sources.has(source)\n  }\n\n  inspectFetchResponse = (event) => {\n    const response = fetchResponseFromEvent(event);\n    if (response && fetchResponseIsStream(response)) {\n      event.preventDefault();\n      this.receiveMessageResponse(response);\n    }\n  }\n\n  receiveMessageEvent = (event) => {\n    if (this.#started && typeof event.data == \"string\") {\n      this.receiveMessageHTML(event.data);\n    }\n  }\n\n  async receiveMessageResponse(response) {\n    const html = await response.responseHTML;\n    if (html) {\n      this.receiveMessageHTML(html);\n    }\n  }\n\n  receiveMessageHTML(html) {\n    this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n  }\n}\n\nfunction fetchResponseFromEvent(event) {\n  const fetchResponse = event.detail?.fetchResponse;\n  if (fetchResponse instanceof FetchResponse) {\n    return fetchResponse\n  }\n}\n\nfunction fetchResponseIsStream(response) {\n  const contentType = response.contentType ?? \"\";\n  return contentType.startsWith(StreamMessage.contentType)\n}\n\nclass ErrorRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const { documentElement, body } = document;\n\n    documentElement.replaceChild(newElement, body);\n  }\n\n  async render() {\n    this.replaceHeadAndBody();\n    this.activateScriptElements();\n  }\n\n  replaceHeadAndBody() {\n    const { documentElement, head } = document;\n    documentElement.replaceChild(this.newHead, head);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  activateScriptElements() {\n    for (const replaceableElement of this.scriptElements) {\n      const parentNode = replaceableElement.parentNode;\n      if (parentNode) {\n        const element = activateScriptElement(replaceableElement);\n        parentNode.replaceChild(element, replaceableElement);\n      }\n    }\n  }\n\n  get newHead() {\n    return this.newSnapshot.headSnapshot.element\n  }\n\n  get scriptElements() {\n    return document.documentElement.querySelectorAll(\"script\")\n  }\n}\n\nclass PageRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    if (document.body && newElement instanceof HTMLBodyElement) {\n      document.body.replaceWith(newElement);\n    } else {\n      document.documentElement.appendChild(newElement);\n    }\n  }\n\n  get shouldRender() {\n    return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical\n  }\n\n  get reloadReason() {\n    if (!this.newSnapshot.isVisitable) {\n      return {\n        reason: \"turbo_visit_control_is_reload\"\n      }\n    }\n\n    if (!this.trackedElementsAreIdentical) {\n      return {\n        reason: \"tracked_element_mismatch\"\n      }\n    }\n  }\n\n  async prepareToRender() {\n    this.#setLanguage();\n    await this.mergeHead();\n  }\n\n  async render() {\n    if (this.willRender) {\n      await this.replaceBody();\n    }\n  }\n\n  finishRendering() {\n    super.finishRendering();\n    if (!this.isPreview) {\n      this.focusFirstAutofocusableElement();\n    }\n  }\n\n  get currentHeadSnapshot() {\n    return this.currentSnapshot.headSnapshot\n  }\n\n  get newHeadSnapshot() {\n    return this.newSnapshot.headSnapshot\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  #setLanguage() {\n    const { documentElement } = this.currentSnapshot;\n    const { dir, lang } = this.newSnapshot;\n\n    if (lang) {\n      documentElement.setAttribute(\"lang\", lang);\n    } else {\n      documentElement.removeAttribute(\"lang\");\n    }\n    if (dir) {\n      documentElement.setAttribute(\"dir\", dir);\n    } else {\n      documentElement.removeAttribute(\"dir\");\n    }\n  }\n\n  async mergeHead() {\n    const mergedHeadElements = this.mergeProvisionalElements();\n    const newStylesheetElements = this.copyNewHeadStylesheetElements();\n    this.copyNewHeadScriptElements();\n\n    await mergedHeadElements;\n    await newStylesheetElements;\n\n    if (this.willRender) {\n      this.removeUnusedDynamicStylesheetElements();\n    }\n  }\n\n  async replaceBody() {\n    await this.preservingPermanentElements(async () => {\n      this.activateNewBody();\n      await this.assignNewBody();\n    });\n  }\n\n  get trackedElementsAreIdentical() {\n    return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature\n  }\n\n  async copyNewHeadStylesheetElements() {\n    const loadingElements = [];\n\n    for (const element of this.newHeadStylesheetElements) {\n      loadingElements.push(waitForLoad(element));\n\n      document.head.appendChild(element);\n    }\n\n    await Promise.all(loadingElements);\n  }\n\n  copyNewHeadScriptElements() {\n    for (const element of this.newHeadScriptElements) {\n      document.head.appendChild(activateScriptElement(element));\n    }\n  }\n\n  removeUnusedDynamicStylesheetElements() {\n    for (const element of this.unusedDynamicStylesheetElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  async mergeProvisionalElements() {\n    const newHeadElements = [...this.newHeadProvisionalElements];\n\n    for (const element of this.currentHeadProvisionalElements) {\n      if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n        document.head.removeChild(element);\n      }\n    }\n\n    for (const element of newHeadElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  isCurrentElementInElementList(element, elementList) {\n    for (const [index, newElement] of elementList.entries()) {\n      // if title element...\n      if (element.tagName == \"TITLE\") {\n        if (newElement.tagName != \"TITLE\") {\n          continue\n        }\n        if (element.innerHTML == newElement.innerHTML) {\n          elementList.splice(index, 1);\n          return true\n        }\n      }\n\n      // if any other element...\n      if (newElement.isEqualNode(element)) {\n        elementList.splice(index, 1);\n        return true\n      }\n    }\n\n    return false\n  }\n\n  removeCurrentHeadProvisionalElements() {\n    for (const element of this.currentHeadProvisionalElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  copyNewHeadProvisionalElements() {\n    for (const element of this.newHeadProvisionalElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  activateNewBody() {\n    document.adoptNode(this.newElement);\n    this.removeNoscriptElements();\n    this.activateNewBodyScriptElements();\n  }\n\n  removeNoscriptElements() {\n    for (const noscriptElement of this.newElement.querySelectorAll(\"noscript\")) {\n      noscriptElement.remove();\n    }\n  }\n\n  activateNewBodyScriptElements() {\n    for (const inertScriptElement of this.newBodyScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  async assignNewBody() {\n    await this.renderElement(this.currentElement, this.newElement);\n  }\n\n  get unusedDynamicStylesheetElements() {\n    return this.oldHeadStylesheetElements.filter((element) => {\n      return element.getAttribute(\"data-turbo-track\") === \"dynamic\"\n    })\n  }\n\n  get oldHeadStylesheetElements() {\n    return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot)\n  }\n\n  get newHeadStylesheetElements() {\n    return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get newHeadScriptElements() {\n    return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get currentHeadProvisionalElements() {\n    return this.currentHeadSnapshot.provisionalElements\n  }\n\n  get newHeadProvisionalElements() {\n    return this.newHeadSnapshot.provisionalElements\n  }\n\n  get newBodyScriptElements() {\n    return this.newElement.querySelectorAll(\"script\")\n  }\n}\n\nclass MorphingPageRenderer extends PageRenderer {\n  static renderElement(currentElement, newElement) {\n    morphElements(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              !closestFrameReloadableWithMorphing(node)\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n\n    dispatch(\"turbo:morph\", { detail: { currentElement, newElement } });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n\n  get renderMethod() {\n    return \"morph\"\n  }\n\n  get shouldAutofocus() {\n    return false\n  }\n}\n\nclass SnapshotCache extends LRUCache {\n  constructor(size) {\n    super(size, toCacheKey);\n  }\n\n  get snapshots() {\n    return this.entries\n  }\n}\n\nclass PageView extends View {\n  snapshotCache = new SnapshotCache(10)\n  lastRenderedLocation = new URL(location.href)\n  forceReloaded = false\n\n  shouldTransitionTo(newSnapshot) {\n    return this.snapshot.prefersViewTransitions && newSnapshot.prefersViewTransitions\n  }\n\n  renderPage(snapshot, isPreview = false, willRender = true, visit) {\n    const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === \"morph\";\n    const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer;\n\n    const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender);\n\n    if (!renderer.shouldRender) {\n      this.forceReloaded = true;\n    } else {\n      visit?.changeHistory();\n    }\n\n    return this.render(renderer)\n  }\n\n  renderError(snapshot, visit) {\n    visit?.changeHistory();\n    const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n    return this.render(renderer)\n  }\n\n  clearSnapshotCache() {\n    this.snapshotCache.clear();\n  }\n\n  async cacheSnapshot(snapshot = this.snapshot) {\n    if (snapshot.isCacheable) {\n      this.delegate.viewWillCacheSnapshot();\n      const { lastRenderedLocation: location } = this;\n      await nextEventLoopTick();\n      const cachedSnapshot = snapshot.clone();\n      this.snapshotCache.put(location, cachedSnapshot);\n      return cachedSnapshot\n    }\n  }\n\n  getCachedSnapshotForLocation(location) {\n    return this.snapshotCache.get(location)\n  }\n\n  isPageRefresh(visit) {\n    return !visit || (this.lastRenderedLocation.pathname === visit.location.pathname && visit.action === \"replace\")\n  }\n\n  shouldPreserveScrollPosition(visit) {\n    return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === \"preserve\"\n  }\n\n  get snapshot() {\n    return PageSnapshot.fromElement(this.element)\n  }\n}\n\nclass Preloader {\n  selector = \"a[data-turbo-preload]\"\n\n  constructor(delegate, snapshotCache) {\n    this.delegate = delegate;\n    this.snapshotCache = snapshotCache;\n  }\n\n  start() {\n    if (document.readyState === \"loading\") {\n      document.addEventListener(\"DOMContentLoaded\", this.#preloadAll);\n    } else {\n      this.preloadOnLoadLinksForView(document.body);\n    }\n  }\n\n  stop() {\n    document.removeEventListener(\"DOMContentLoaded\", this.#preloadAll);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    for (const link of element.querySelectorAll(this.selector)) {\n      if (this.delegate.shouldPreloadLink(link)) {\n        this.preloadURL(link);\n      }\n    }\n  }\n\n  async preloadURL(link) {\n    const location = new URL(link.href);\n\n    if (this.snapshotCache.has(location)) {\n      return\n    }\n\n    const fetchRequest = new FetchRequest(this, FetchMethod.get, location, new URLSearchParams(), link);\n    await fetchRequest.perform();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(fetchRequest) {\n    fetchRequest.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n  }\n\n  async requestSucceededWithResponse(fetchRequest, fetchResponse) {\n    try {\n      const responseHTML = await fetchResponse.responseHTML;\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n\n      this.snapshotCache.put(fetchRequest.url, snapshot);\n    } catch (_) {\n      // If we cannot preload that is ok!\n    }\n  }\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  #preloadAll = () => {\n    this.preloadOnLoadLinksForView(document.body);\n  }\n}\n\nclass Cache {\n  constructor(session) {\n    this.session = session;\n  }\n\n  clear() {\n    this.session.clearCache();\n  }\n\n  resetCacheControl() {\n    this.#setCacheControl(\"\");\n  }\n\n  exemptPageFromCache() {\n    this.#setCacheControl(\"no-cache\");\n  }\n\n  exemptPageFromPreview() {\n    this.#setCacheControl(\"no-preview\");\n  }\n\n  #setCacheControl(value) {\n    setMetaContent(\"turbo-cache-control\", value);\n  }\n}\n\nclass Session {\n  navigator = new Navigator(this)\n  history = new History(this)\n  view = new PageView(this, document.documentElement)\n  adapter = new BrowserAdapter(this)\n\n  pageObserver = new PageObserver(this)\n  cacheObserver = new CacheObserver()\n  linkPrefetchObserver = new LinkPrefetchObserver(this, document)\n  linkClickObserver = new LinkClickObserver(this, window)\n  formSubmitObserver = new FormSubmitObserver(this, document)\n  scrollObserver = new ScrollObserver(this)\n  streamObserver = new StreamObserver(this)\n  formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement)\n  frameRedirector = new FrameRedirector(this, document.documentElement)\n  streamMessageRenderer = new StreamMessageRenderer()\n  cache = new Cache(this)\n\n  enabled = true\n  started = false\n  #pageRefreshDebouncePeriod = 150\n\n  constructor(recentRequests) {\n    this.recentRequests = recentRequests;\n    this.preloader = new Preloader(this, this.view.snapshotCache);\n    this.debouncedRefresh = this.refresh;\n    this.pageRefreshDebouncePeriod = this.pageRefreshDebouncePeriod;\n  }\n\n  start() {\n    if (!this.started) {\n      this.pageObserver.start();\n      this.cacheObserver.start();\n      this.linkPrefetchObserver.start();\n      this.formLinkClickObserver.start();\n      this.linkClickObserver.start();\n      this.formSubmitObserver.start();\n      this.scrollObserver.start();\n      this.streamObserver.start();\n      this.frameRedirector.start();\n      this.history.start();\n      this.preloader.start();\n      this.started = true;\n      this.enabled = true;\n    }\n  }\n\n  disable() {\n    this.enabled = false;\n  }\n\n  stop() {\n    if (this.started) {\n      this.pageObserver.stop();\n      this.cacheObserver.stop();\n      this.linkPrefetchObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkClickObserver.stop();\n      this.formSubmitObserver.stop();\n      this.scrollObserver.stop();\n      this.streamObserver.stop();\n      this.frameRedirector.stop();\n      this.history.stop();\n      this.preloader.stop();\n      this.started = false;\n    }\n  }\n\n  registerAdapter(adapter) {\n    this.adapter = adapter;\n  }\n\n  visit(location, options = {}) {\n    const frameElement = options.frame ? document.getElementById(options.frame) : null;\n\n    if (frameElement instanceof FrameElement) {\n      const action = options.action || getVisitAction(frameElement);\n\n      frameElement.delegate.proposeVisitIfNavigatedWithAction(frameElement, action);\n      frameElement.src = location.toString();\n    } else {\n      this.navigator.proposeVisit(expandURL(location), options);\n    }\n  }\n\n  refresh(url, options = {}) {\n    options = typeof options === \"string\" ? { requestId: options } : options;\n\n    const { method, requestId, scroll } = options;\n    const isRecentRequest = requestId && this.recentRequests.has(requestId);\n    const isCurrentUrl = url === document.baseURI;\n    if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) {\n      this.visit(url, { action: \"replace\", shouldCacheSnapshot: false, refresh: { method, scroll } });\n    }\n  }\n\n  connectStreamSource(source) {\n    this.streamObserver.connectStreamSource(source);\n  }\n\n  disconnectStreamSource(source) {\n    this.streamObserver.disconnectStreamSource(source);\n  }\n\n  renderStreamMessage(message) {\n    this.streamMessageRenderer.render(StreamMessage.wrap(message));\n  }\n\n  clearCache() {\n    this.view.clearSnapshotCache();\n  }\n\n  setProgressBarDelay(delay) {\n    console.warn(\n      \"Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`\"\n    );\n\n    this.progressBarDelay = delay;\n  }\n\n  set progressBarDelay(delay) {\n    config.drive.progressBarDelay = delay;\n  }\n\n  get progressBarDelay() {\n    return config.drive.progressBarDelay\n  }\n\n  set drive(value) {\n    config.drive.enabled = value;\n  }\n\n  get drive() {\n    return config.drive.enabled\n  }\n\n  set formMode(value) {\n    config.forms.mode = value;\n  }\n\n  get formMode() {\n    return config.forms.mode\n  }\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  get pageRefreshDebouncePeriod() {\n    return this.#pageRefreshDebouncePeriod\n  }\n\n  set pageRefreshDebouncePeriod(value) {\n    this.refresh = debounce(this.debouncedRefresh.bind(this), value);\n    this.#pageRefreshDebouncePeriod = value;\n  }\n\n  // Preloader delegate\n\n  shouldPreloadLink(element) {\n    const isUnsafe = element.hasAttribute(\"data-turbo-method\");\n    const isStream = element.hasAttribute(\"data-turbo-stream\");\n    const frameTarget = element.getAttribute(\"data-turbo-frame\");\n    const frame = frameTarget == \"_top\" ?\n      null :\n      document.getElementById(frameTarget) || findClosestRecursively(element, \"turbo-frame:not([disabled])\");\n\n    if (isUnsafe || isStream || frame instanceof FrameElement) {\n      return false\n    } else {\n      const location = new URL(element.href);\n\n      return this.elementIsNavigatable(element) && locationIsVisitable(location, this.snapshot.rootLocation)\n    }\n  }\n\n  // History delegate\n\n  historyPoppedToLocationWithRestorationIdentifierAndDirection(location, restorationIdentifier, direction) {\n    if (this.enabled) {\n      this.navigator.startVisit(location, restorationIdentifier, {\n        action: \"restore\",\n        historyChanged: true,\n        direction\n      });\n    } else {\n      this.adapter.pageInvalidated({\n        reason: \"turbo_disabled\"\n      });\n    }\n  }\n\n  historyPoppedWithEmptyState(location) {\n    this.history.replace(location);\n    this.view.lastRenderedLocation = location;\n    this.view.cacheSnapshot();\n  }\n\n  // Scroll observer delegate\n\n  scrollPositionChanged(position) {\n    this.history.updateRestorationData({ scrollPosition: position });\n  }\n\n  // Form click observer delegate\n\n  willSubmitFormLinkToLocation(link, location) {\n    return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation)\n  }\n\n  submittedFormLinkToLocation() {}\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.navigator.linkPrefetchingIsEnabledForLocation(location)\n    )\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, event) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.applicationAllowsFollowingLinkToLocation(link, location, event)\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const action = this.getActionForLink(link);\n    const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n\n    this.visit(location.href, { action, acceptsStreamResponse });\n  }\n\n  // Navigator delegate\n\n  allowsVisitingLocationWithAction(location, action) {\n    return this.applicationAllowsVisitingLocation(location)\n  }\n\n  visitProposedToLocation(location, options) {\n    extendURLWithDeprecatedProperties(location);\n    this.adapter.visitProposedToLocation(location, options);\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    if (!visit.acceptsStreamResponse) {\n      markAsBusy(document.documentElement);\n      this.view.markVisitDirection(visit.direction);\n    }\n    extendURLWithDeprecatedProperties(visit.location);\n    this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n  }\n\n  visitCompleted(visit) {\n    this.view.unmarkVisitDirection();\n    clearBusyState(document.documentElement);\n    this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return (\n      this.submissionIsNavigatable(form, submitter) &&\n      locationIsVisitable(expandURL(action), this.snapshot.rootLocation)\n    )\n  }\n\n  formSubmitted(form, submitter) {\n    this.navigator.submitForm(form, submitter);\n  }\n\n  // Page observer delegate\n\n  pageBecameInteractive() {\n    this.view.lastRenderedLocation = this.location;\n    this.notifyApplicationAfterPageLoad();\n  }\n\n  pageLoaded() {\n    this.history.assumeControlOfScrollRestoration();\n  }\n\n  pageWillUnload() {\n    this.history.relinquishControlOfScrollRestoration();\n  }\n\n  // Stream observer delegate\n\n  receivedMessageFromStream(message) {\n    this.renderStreamMessage(message);\n  }\n\n  // Page view delegate\n\n  viewWillCacheSnapshot() {\n    this.notifyApplicationBeforeCachingSnapshot();\n  }\n\n  allowsImmediateRender({ element }, options) {\n    const event = this.notifyApplicationBeforeRender(element, options);\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, renderMethod) {\n    this.view.lastRenderedLocation = this.history.location;\n    this.notifyApplicationAfterRender(renderMethod);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    this.preloader.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated(reason) {\n    this.adapter.pageInvalidated(reason);\n  }\n\n  // Frame element\n\n  frameLoaded(frame) {\n    this.notifyApplicationAfterFrameLoad(frame);\n  }\n\n  frameRendered(fetchResponse, frame) {\n    this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n  }\n\n  // Application events\n\n  applicationAllowsFollowingLinkToLocation(link, location, ev) {\n    const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n    return !event.defaultPrevented\n  }\n\n  applicationAllowsVisitingLocation(location) {\n    const event = this.notifyApplicationBeforeVisitingLocation(location);\n    return !event.defaultPrevented\n  }\n\n  notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n    return dispatch(\"turbo:click\", {\n      target: link,\n      detail: { url: location.href, originalEvent: event },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationBeforeVisitingLocation(location) {\n    return dispatch(\"turbo:before-visit\", {\n      detail: { url: location.href },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterVisitingLocation(location, action) {\n    return dispatch(\"turbo:visit\", { detail: { url: location.href, action } })\n  }\n\n  notifyApplicationBeforeCachingSnapshot() {\n    return dispatch(\"turbo:before-cache\")\n  }\n\n  notifyApplicationBeforeRender(newBody, options) {\n    return dispatch(\"turbo:before-render\", {\n      detail: { newBody, ...options },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterRender(renderMethod) {\n    return dispatch(\"turbo:render\", { detail: { renderMethod } })\n  }\n\n  notifyApplicationAfterPageLoad(timing = {}) {\n    return dispatch(\"turbo:load\", {\n      detail: { url: this.location.href, timing }\n    })\n  }\n\n  notifyApplicationAfterFrameLoad(frame) {\n    return dispatch(\"turbo:frame-load\", { target: frame })\n  }\n\n  notifyApplicationAfterFrameRender(fetchResponse, frame) {\n    return dispatch(\"turbo:frame-render\", {\n      detail: { fetchResponse },\n      target: frame,\n      cancelable: true\n    })\n  }\n\n  // Helpers\n\n  submissionIsNavigatable(form, submitter) {\n    if (config.forms.mode == \"off\") {\n      return false\n    } else {\n      const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n\n      if (config.forms.mode == \"optin\") {\n        return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null\n      } else {\n        return submitterIsNavigatable && this.elementIsNavigatable(form)\n      }\n    }\n  }\n\n  elementIsNavigatable(element) {\n    const container = findClosestRecursively(element, \"[data-turbo]\");\n    const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n\n    // Check if Drive is enabled on the session or we're within a Frame.\n    if (config.drive.enabled || withinFrame) {\n      // Element is navigatable by default, unless `data-turbo=\"false\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") != \"false\"\n      } else {\n        return true\n      }\n    } else {\n      // Element isn't navigatable by default, unless `data-turbo=\"true\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") == \"true\"\n      } else {\n        return false\n      }\n    }\n  }\n\n  // Private\n\n  getActionForLink(link) {\n    return getVisitAction(link) || \"advance\"\n  }\n\n  get snapshot() {\n    return this.view.snapshot\n  }\n}\n\n// Older versions of the Turbo Native adapters referenced the\n// `Location#absoluteURL` property in their implementations of\n// the `Adapter#visitProposedToLocation()` and `#visitStarted()`\n// methods. The Location class has since been removed in favor\n// of the DOM URL API, and accordingly all Adapter methods now\n// receive URL objects.\n//\n// We alias #absoluteURL to #toString() here to avoid crashing\n// older adapters which do not expect URL objects. We should\n// consider removing this support at some point in the future.\n\nfunction extendURLWithDeprecatedProperties(url) {\n  Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\n\nconst deprecatedLocationPropertyDescriptors = {\n  absoluteURL: {\n    get() {\n      return this.toString()\n    }\n  }\n};\n\nconst session = new Session(recentRequests);\n\n// Rename `navigator` to avoid shadowing `window.navigator`\nconst { cache, navigator: sessionNavigator } = session;\n\n/**\n * Starts the main session.\n * This initialises any necessary observers such as those to monitor\n * link interactions.\n */\nfunction start() {\n  session.start();\n}\n\n/**\n * Registers an adapter for the main session.\n *\n * @param adapter Adapter to register\n */\nfunction registerAdapter(adapter) {\n  session.registerAdapter(adapter);\n}\n\n/**\n * Performs an application visit to the given location.\n *\n * @param location Location to visit (a URL or path)\n * @param options Options to apply\n * @param options.action Type of history navigation to apply (\"restore\",\n * \"replace\" or \"advance\")\n * @param options.historyChanged Specifies whether the browser history has\n * already been changed for this visit or not\n * @param options.referrer Specifies the referrer of this visit such that\n * navigations to the same page will not result in a new history entry.\n * @param options.snapshotHTML Cached snapshot to render\n * @param options.response Response of the specified location\n */\nfunction visit(location, options) {\n  session.visit(location, options);\n}\n\n/**\n * Connects a stream source to the main session.\n *\n * @param source Stream source to connect\n */\nfunction connectStreamSource(source) {\n  session.connectStreamSource(source);\n}\n\n/**\n * Disconnects a stream source from the main session.\n *\n * @param source Stream source to disconnect\n */\nfunction disconnectStreamSource(source) {\n  session.disconnectStreamSource(source);\n}\n\n/**\n * Renders a stream message to the main session by appending it to the\n * current document.\n *\n * @param message Message to render\n */\nfunction renderStreamMessage(message) {\n  session.renderStreamMessage(message);\n}\n\n/**\n * Sets the delay after which the progress bar will appear during navigation.\n *\n * The progress bar appears after 500ms by default.\n *\n * Note that this method has no effect when used with the iOS or Android\n * adapters.\n *\n * @param delay Time to delay in milliseconds\n */\nfunction setProgressBarDelay(delay) {\n  console.warn(\n    \"Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.drive.progressBarDelay = delay;\n}\n\nfunction setConfirmMethod(confirmMethod) {\n  console.warn(\n    \"Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.confirm = confirmMethod;\n}\n\nfunction setFormMode(mode) {\n  console.warn(\n    \"Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.mode = mode;\n}\n\n/**\n * Morph the state of the currentBody based on the attributes and contents of\n * the newBody. Morphing body elements may dispatch turbo:morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentBody HTMLBodyElement destination of morphing changes\n * @param newBody HTMLBodyElement source of morphing changes\n */\nfunction morphBodyElements(currentBody, newBody) {\n  MorphingPageRenderer.renderElement(currentBody, newBody);\n}\n\n/**\n * Morph the child elements of the currentFrame based on the child elements of\n * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentFrame FrameElement destination of morphing children changes\n * @param newFrame FrameElement source of morphing children changes\n */\nfunction morphTurboFrameElements(currentFrame, newFrame) {\n  MorphingFrameRenderer.renderElement(currentFrame, newFrame);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  PageRenderer: PageRenderer,\n  PageSnapshot: PageSnapshot,\n  FrameRenderer: FrameRenderer,\n  fetch: fetchWithTurboHeaders,\n  config: config,\n  session: session,\n  cache: cache,\n  navigator: sessionNavigator,\n  start: start,\n  registerAdapter: registerAdapter,\n  visit: visit,\n  connectStreamSource: connectStreamSource,\n  disconnectStreamSource: disconnectStreamSource,\n  renderStreamMessage: renderStreamMessage,\n  setProgressBarDelay: setProgressBarDelay,\n  setConfirmMethod: setConfirmMethod,\n  setFormMode: setFormMode,\n  morphBodyElements: morphBodyElements,\n  morphTurboFrameElements: morphTurboFrameElements,\n  morphChildren: morphChildren,\n  morphElements: morphElements\n});\n\nclass TurboFrameMissingError extends Error {}\n\nclass FrameController {\n  fetchResponseLoaded = (_fetchResponse) => Promise.resolve()\n  #currentFetchRequest = null\n  #resolveVisitPromise = () => {}\n  #connected = false\n  #hasBeenLoaded = false\n  #ignoredAttributes = new Set()\n  #shouldMorphFrame = false\n  action = null\n\n  constructor(element) {\n    this.element = element;\n    this.view = new FrameView(this, this.element);\n    this.appearanceObserver = new AppearanceObserver(this, this.element);\n    this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n    this.linkInterceptor = new LinkInterceptor(this, this.element);\n    this.restorationIdentifier = uuid();\n    this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n  }\n\n  // Frame delegate\n\n  connect() {\n    if (!this.#connected) {\n      this.#connected = true;\n      if (this.loadingStyle == FrameLoadingStyle.lazy) {\n        this.appearanceObserver.start();\n      } else {\n        this.#loadSourceURL();\n      }\n      this.formLinkClickObserver.start();\n      this.linkInterceptor.start();\n      this.formSubmitObserver.start();\n    }\n  }\n\n  disconnect() {\n    if (this.#connected) {\n      this.#connected = false;\n      this.appearanceObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkInterceptor.stop();\n      this.formSubmitObserver.stop();\n\n      if (!this.element.hasAttribute(\"recurse\")) {\n        this.#currentFetchRequest?.cancel();\n      }\n    }\n  }\n\n  disabledChanged() {\n    if (this.disabled) {\n      this.#currentFetchRequest?.cancel();\n    } else if (this.loadingStyle == FrameLoadingStyle.eager) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLChanged() {\n    if (this.#isIgnoringChangesTo(\"src\")) return\n\n    if (!this.sourceURL) {\n      this.#currentFetchRequest?.cancel();\n    }\n\n    if (this.element.isConnected) {\n      this.complete = false;\n    }\n\n    if (this.loadingStyle == FrameLoadingStyle.eager || this.#hasBeenLoaded) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLReloaded() {\n    const { refresh, src } = this.element;\n\n    this.#shouldMorphFrame = src && refresh === \"morph\";\n\n    this.element.removeAttribute(\"complete\");\n    this.element.src = null;\n    this.element.src = src;\n    return this.element.loaded\n  }\n\n  loadingStyleChanged() {\n    if (this.loadingStyle == FrameLoadingStyle.lazy) {\n      this.appearanceObserver.start();\n    } else {\n      this.appearanceObserver.stop();\n      this.#loadSourceURL();\n    }\n  }\n\n  async #loadSourceURL() {\n    if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n      this.element.loaded = this.#visit(expandURL(this.sourceURL));\n      this.appearanceObserver.stop();\n      await this.element.loaded;\n      this.#hasBeenLoaded = true;\n    }\n  }\n\n  async loadResponse(fetchResponse) {\n    if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n      this.sourceURL = fetchResponse.response.url;\n    }\n\n    try {\n      const html = await fetchResponse.responseHTML;\n      if (html) {\n        const document = parseHTMLDocument(html);\n        const pageSnapshot = PageSnapshot.fromDocument(document);\n\n        if (pageSnapshot.isVisitable) {\n          await this.#loadFrameResponse(fetchResponse, document);\n        } else {\n          await this.#handleUnvisitableFrameResponse(fetchResponse);\n        }\n      }\n    } finally {\n      this.#shouldMorphFrame = false;\n      this.fetchResponseLoaded = () => Promise.resolve();\n    }\n  }\n\n  // Appearance observer delegate\n\n  elementAppearedInViewport(element) {\n    this.proposeVisitIfNavigatedWithAction(element, getVisitAction(element));\n    this.#loadSourceURL();\n  }\n\n  // Form link click observer delegate\n\n  willSubmitFormLinkToLocation(link) {\n    return this.#shouldInterceptNavigation(link)\n  }\n\n  submittedFormLinkToLocation(link, _location, form) {\n    const frame = this.#findFrameElement(link);\n    if (frame) form.setAttribute(\"data-turbo-frame\", frame.id);\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldInterceptNavigation(element)\n  }\n\n  linkClickIntercepted(element, location) {\n    this.#navigateFrame(element, location);\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return element.closest(\"turbo-frame\") == this.element && this.#shouldInterceptNavigation(element, submitter)\n  }\n\n  formSubmitted(element, submitter) {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n    }\n\n    this.formSubmission = new FormSubmission(this, element, submitter);\n\n    const { fetchRequest } = this.formSubmission;\n    const frame = this.#findFrameElement(element, submitter);\n\n    this.prepareRequest(fetchRequest, frame);\n    this.formSubmission.start();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request, frame = this) {\n    request.headers[\"Turbo-Frame\"] = frame.id;\n\n    if (this.currentNavigationElement?.hasAttribute(\"data-turbo-stream\")) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    markAsBusy(this.element);\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {\n    this.#resolveVisitPromise();\n  }\n\n  async requestSucceededWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  async requestFailedWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  requestErrored(request, error) {\n    console.error(error);\n    this.#resolveVisitPromise();\n  }\n\n  requestFinished(_request) {\n    clearBusyState(this.element);\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted({ formElement }) {\n    markAsBusy(formElement, this.#findFrameElement(formElement));\n  }\n\n  formSubmissionSucceededWithResponse(formSubmission, response) {\n    const frame = this.#findFrameElement(formSubmission.formElement, formSubmission.submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(formSubmission.submitter, formSubmission.formElement, frame));\n    frame.delegate.loadResponse(response);\n\n    if (!formSubmission.isSafe) {\n      session.clearCache();\n    }\n  }\n\n  formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    this.element.delegate.loadResponse(fetchResponse);\n    session.clearCache();\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished({ formElement }) {\n    clearBusyState(formElement, this.#findFrameElement(formElement));\n  }\n\n  // View delegate\n\n  allowsImmediateRender({ element: newFrame }, options) {\n    const event = dispatch(\"turbo:before-frame-render\", {\n      target: this.element,\n      detail: { newFrame, ...options },\n      cancelable: true\n    });\n\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, _renderMethod) {}\n\n  preloadOnLoadLinksForView(element) {\n    session.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated() {}\n\n  // Frame renderer delegate\n\n  willRenderFrame(currentElement, _newElement) {\n    this.previousFrameElement = currentElement.cloneNode(true);\n  }\n\n  visitCachedSnapshot = ({ element }) => {\n    const frame = element.querySelector(\"#\" + this.element.id);\n\n    if (frame && this.previousFrameElement) {\n      frame.replaceChildren(...this.previousFrameElement.children);\n    }\n\n    delete this.previousFrameElement;\n  }\n\n  // Private\n\n  async #loadFrameResponse(fetchResponse, document) {\n    const newFrameElement = await this.extractForeignFrameElement(document.body);\n    const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer;\n\n    if (newFrameElement) {\n      const snapshot = new Snapshot(newFrameElement);\n      const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false);\n      if (this.view.renderPromise) await this.view.renderPromise;\n      this.changeHistory();\n\n      await this.view.render(renderer);\n      this.complete = true;\n      session.frameRendered(fetchResponse, this.element);\n      session.frameLoaded(this.element);\n      await this.fetchResponseLoaded(fetchResponse);\n    } else if (this.#willHandleFrameMissingFromResponse(fetchResponse)) {\n      this.#handleFrameMissingFromResponse(fetchResponse);\n    }\n  }\n\n  async #visit(url) {\n    const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n\n    this.#currentFetchRequest?.cancel();\n    this.#currentFetchRequest = request;\n\n    return new Promise((resolve) => {\n      this.#resolveVisitPromise = () => {\n        this.#resolveVisitPromise = () => {};\n        this.#currentFetchRequest = null;\n        resolve();\n      };\n      request.perform();\n    })\n  }\n\n  #navigateFrame(element, url, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(submitter, element, frame));\n\n    this.#withCurrentNavigationElement(element, () => {\n      frame.src = url;\n    });\n  }\n\n  proposeVisitIfNavigatedWithAction(frame, action = null) {\n    this.action = action;\n\n    if (this.action) {\n      const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n      const { visitCachedSnapshot } = frame.delegate;\n\n      frame.delegate.fetchResponseLoaded = async (fetchResponse) => {\n        if (frame.src) {\n          const { statusCode, redirected } = fetchResponse;\n          const responseHTML = await fetchResponse.responseHTML;\n          const response = { statusCode, redirected, responseHTML };\n          const options = {\n            response,\n            visitCachedSnapshot,\n            willRender: false,\n            updateHistory: false,\n            restorationIdentifier: this.restorationIdentifier,\n            snapshot: pageSnapshot\n          };\n\n          if (this.action) options.action = this.action;\n\n          session.visit(frame.src, options);\n        }\n      };\n    }\n  }\n\n  changeHistory() {\n    if (this.action) {\n      const method = getHistoryMethodForAction(this.action);\n      session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n    }\n  }\n\n  async #handleUnvisitableFrameResponse(fetchResponse) {\n    console.warn(\n      `The response (${fetchResponse.statusCode}) from <turbo-frame id=\"${this.element.id}\"> is performing a full page visit due to turbo-visit-control.`\n    );\n\n    await this.#visitResponse(fetchResponse.response);\n  }\n\n  #willHandleFrameMissingFromResponse(fetchResponse) {\n    this.element.setAttribute(\"complete\", \"\");\n\n    const response = fetchResponse.response;\n    const visit = async (url, options) => {\n      if (url instanceof Response) {\n        this.#visitResponse(url);\n      } else {\n        session.visit(url, options);\n      }\n    };\n\n    const event = dispatch(\"turbo:frame-missing\", {\n      target: this.element,\n      detail: { response, visit },\n      cancelable: true\n    });\n\n    return !event.defaultPrevented\n  }\n\n  #handleFrameMissingFromResponse(fetchResponse) {\n    this.view.missing();\n    this.#throwFrameMissingError(fetchResponse);\n  }\n\n  #throwFrameMissingError(fetchResponse) {\n    const message = `The response (${fetchResponse.statusCode}) did not contain the expected <turbo-frame id=\"${this.element.id}\"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n    throw new TurboFrameMissingError(message)\n  }\n\n  async #visitResponse(response) {\n    const wrapped = new FetchResponse(response);\n    const responseHTML = await wrapped.responseHTML;\n    const { location, redirected, statusCode } = wrapped;\n\n    return session.visit(location, { response: { redirected, statusCode, responseHTML } })\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n    const target = this.#getFrameElementById(id);\n\n    return target instanceof FrameElement ? target : this.element\n  }\n\n  async extractForeignFrameElement(container) {\n    let element;\n    const id = CSS.escape(this.id);\n\n    try {\n      element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n      if (element) {\n        return element\n      }\n\n      element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n      if (element) {\n        await element.loaded;\n        return await this.extractForeignFrameElement(element)\n      }\n    } catch (error) {\n      console.error(error);\n      return new FrameElement()\n    }\n\n    return null\n  }\n\n  #formActionIsVisitable(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return locationIsVisitable(expandURL(action), this.rootLocation)\n  }\n\n  #shouldInterceptNavigation(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n\n    if (element instanceof HTMLFormElement && !this.#formActionIsVisitable(element, submitter)) {\n      return false\n    }\n\n    if (!this.enabled || id == \"_top\") {\n      return false\n    }\n\n    if (id) {\n      const frameElement = this.#getFrameElementById(id);\n      if (frameElement) {\n        return !frameElement.disabled\n      } else if (id == \"_parent\") {\n        return false\n      }\n    }\n\n    if (!session.elementIsNavigatable(element)) {\n      return false\n    }\n\n    if (submitter && !session.elementIsNavigatable(submitter)) {\n      return false\n    }\n\n    return true\n  }\n\n  // Computed properties\n\n  get id() {\n    return this.element.id\n  }\n\n  get disabled() {\n    return this.element.disabled\n  }\n\n  get enabled() {\n    return !this.disabled\n  }\n\n  get sourceURL() {\n    if (this.element.src) {\n      return this.element.src\n    }\n  }\n\n  set sourceURL(sourceURL) {\n    this.#ignoringChangesToAttribute(\"src\", () => {\n      this.element.src = sourceURL ?? null;\n    });\n  }\n\n  get loadingStyle() {\n    return this.element.loading\n  }\n\n  get isLoading() {\n    return this.formSubmission !== undefined || this.#resolveVisitPromise() !== undefined\n  }\n\n  get complete() {\n    return this.element.hasAttribute(\"complete\")\n  }\n\n  set complete(value) {\n    if (value) {\n      this.element.setAttribute(\"complete\", \"\");\n    } else {\n      this.element.removeAttribute(\"complete\");\n    }\n  }\n\n  get isActive() {\n    return this.element.isActive && this.#connected\n  }\n\n  get rootLocation() {\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const root = meta?.content ?? \"/\";\n    return expandURL(root)\n  }\n\n  #isIgnoringChangesTo(attributeName) {\n    return this.#ignoredAttributes.has(attributeName)\n  }\n\n  #ignoringChangesToAttribute(attributeName, callback) {\n    this.#ignoredAttributes.add(attributeName);\n    callback();\n    this.#ignoredAttributes.delete(attributeName);\n  }\n\n  #withCurrentNavigationElement(element, callback) {\n    this.currentNavigationElement = element;\n    callback();\n    delete this.currentNavigationElement;\n  }\n\n  #getFrameElementById(id) {\n    if (id != null) {\n      const element = id === \"_parent\" ?\n        this.element.parentElement.closest(\"turbo-frame\") :\n        document.getElementById(id);\n      if (element instanceof FrameElement) {\n        return element\n      }\n    }\n  }\n}\n\nfunction activateElement(element, currentURL) {\n  if (element) {\n    const src = element.getAttribute(\"src\");\n    if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n      throw new Error(`Matching <turbo-frame id=\"${element.id}\"> element has a source URL which references itself`)\n    }\n    if (element.ownerDocument !== document) {\n      element = document.importNode(element, true);\n    }\n\n    if (element instanceof FrameElement) {\n      element.connectedCallback();\n      element.disconnectedCallback();\n      return element\n    }\n  }\n}\n\nconst StreamActions = {\n  after() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling));\n  },\n\n  append() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.append(this.templateContent));\n  },\n\n  before() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e));\n  },\n\n  prepend() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.prepend(this.templateContent));\n  },\n\n  remove() {\n    this.targetElements.forEach((e) => e.remove());\n  },\n\n  replace() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphElements(targetElement, this.templateContent);\n      } else {\n        targetElement.replaceWith(this.templateContent);\n      }\n    });\n  },\n\n  update() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphChildren(targetElement, this.templateContent);\n      } else {\n        targetElement.innerHTML = \"\";\n        targetElement.append(this.templateContent);\n      }\n    });\n  },\n\n  refresh() {\n    const method = this.getAttribute(\"method\");\n    const requestId = this.requestId;\n    const scroll = this.getAttribute(\"scroll\");\n\n    session.refresh(this.baseURI, { method, requestId, scroll });\n  }\n};\n\n// <turbo-stream action=replace target=id><template>...\n\n/**\n * Renders updates to the page from a stream of messages.\n *\n * Using the `action` attribute, this can be configured one of eight ways:\n *\n * - `after` - inserts the result after the target\n * - `append` - appends the result to the target\n * - `before` - inserts the result before the target\n * - `prepend` - prepends the result to the target\n * - `refresh` - initiates a page refresh\n * - `remove` - removes the target\n * - `replace` - replaces the outer HTML of the target\n * - `update` - replaces the inner HTML of the target\n *\n * @customElement turbo-stream\n * @example\n *   <turbo-stream action=\"append\" target=\"dom_id\">\n *     <template>\n *       Content to append to target designated with the dom_id.\n *     </template>\n *   </turbo-stream>\n */\nclass StreamElement extends HTMLElement {\n  static async renderElement(newElement) {\n    await newElement.performAction();\n  }\n\n  async connectedCallback() {\n    try {\n      await this.render();\n    } catch (error) {\n      console.error(error);\n    } finally {\n      this.disconnect();\n    }\n  }\n\n  async render() {\n    return (this.renderPromise ??= (async () => {\n      const event = this.beforeRenderEvent;\n\n      if (this.dispatchEvent(event)) {\n        await nextRepaint();\n        await event.detail.render(this);\n      }\n    })())\n  }\n\n  disconnect() {\n    try {\n      this.remove();\n      // eslint-disable-next-line no-empty\n    } catch {}\n  }\n\n  /**\n   * Removes duplicate children (by ID)\n   */\n  removeDuplicateTargetChildren() {\n    this.duplicateChildren.forEach((c) => c.remove());\n  }\n\n  /**\n   * Gets the list of duplicate children (i.e. those with the same ID)\n   */\n  get duplicateChildren() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.getAttribute(\"id\"));\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.getAttribute(\"id\")).map((c) => c.getAttribute(\"id\"));\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.getAttribute(\"id\")))\n  }\n\n  /**\n  * Removes duplicate siblings (by ID)\n  */\n  removeDuplicateTargetSiblings() {\n    this.duplicateSiblings.forEach((c) => c.remove());\n  }\n\n  /**\n  * Gets the list of duplicate siblings (i.e. those with the same ID)\n  */\n  get duplicateSiblings() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.parentElement.children]).filter((c) => !!c.id);\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.id).map((c) => c.id);\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.id))\n  }\n\n  /**\n   * Gets the action function to be performed.\n   */\n  get performAction() {\n    if (this.action) {\n      const actionFunction = StreamActions[this.action];\n      if (actionFunction) {\n        return actionFunction\n      }\n      this.#raise(\"unknown action\");\n    }\n    this.#raise(\"action attribute is missing\");\n  }\n\n  /**\n   * Gets the target elements which the template will be rendered to.\n   */\n  get targetElements() {\n    if (this.target) {\n      return this.targetElementsById\n    } else if (this.targets) {\n      return this.targetElementsByQuery\n    } else {\n      this.#raise(\"target or targets attribute is missing\");\n    }\n  }\n\n  /**\n   * Gets the contents of the main `<template>`.\n   */\n  get templateContent() {\n    return this.templateElement.content.cloneNode(true)\n  }\n\n  /**\n   * Gets the main `<template>` used for rendering\n   */\n  get templateElement() {\n    if (this.firstElementChild === null) {\n      const template = this.ownerDocument.createElement(\"template\");\n      this.appendChild(template);\n      return template\n    } else if (this.firstElementChild instanceof HTMLTemplateElement) {\n      return this.firstElementChild\n    }\n    this.#raise(\"first child element must be a <template> element\");\n  }\n\n  /**\n   * Gets the current action.\n   */\n  get action() {\n    return this.getAttribute(\"action\")\n  }\n\n  /**\n   * Gets the current target (an element ID) to which the result will\n   * be rendered.\n   */\n  get target() {\n    return this.getAttribute(\"target\")\n  }\n\n  /**\n   * Gets the current \"targets\" selector (a CSS selector)\n   */\n  get targets() {\n    return this.getAttribute(\"targets\")\n  }\n\n  /**\n   * Reads the request-id attribute\n   */\n  get requestId() {\n    return this.getAttribute(\"request-id\")\n  }\n\n  #raise(message) {\n    throw new Error(`${this.description}: ${message}`)\n  }\n\n  get description() {\n    return (this.outerHTML.match(/<[^>]+>/) ?? [])[0] ?? \"<turbo-stream>\"\n  }\n\n  get beforeRenderEvent() {\n    return new CustomEvent(\"turbo:before-stream-render\", {\n      bubbles: true,\n      cancelable: true,\n      detail: { newStream: this, render: StreamElement.renderElement }\n    })\n  }\n\n  get targetElementsById() {\n    const element = this.ownerDocument?.getElementById(this.target);\n\n    if (element !== null) {\n      return [element]\n    } else {\n      return []\n    }\n  }\n\n  get targetElementsByQuery() {\n    const elements = this.ownerDocument?.querySelectorAll(this.targets);\n\n    if (elements.length !== 0) {\n      return Array.prototype.slice.call(elements)\n    } else {\n      return []\n    }\n  }\n}\n\nclass StreamSourceElement extends HTMLElement {\n  streamSource = null\n\n  connectedCallback() {\n    this.streamSource = this.src.match(/^ws{1,2}:/) ? new WebSocket(this.src) : new EventSource(this.src);\n\n    connectStreamSource(this.streamSource);\n  }\n\n  disconnectedCallback() {\n    if (this.streamSource) {\n      this.streamSource.close();\n\n      disconnectStreamSource(this.streamSource);\n    }\n  }\n\n  get src() {\n    return this.getAttribute(\"src\") || \"\"\n  }\n}\n\nFrameElement.delegateConstructor = FrameController;\n\nif (customElements.get(\"turbo-frame\") === undefined) {\n  customElements.define(\"turbo-frame\", FrameElement);\n}\n\nif (customElements.get(\"turbo-stream\") === undefined) {\n  customElements.define(\"turbo-stream\", StreamElement);\n}\n\nif (customElements.get(\"turbo-stream-source\") === undefined) {\n  customElements.define(\"turbo-stream-source\", StreamSourceElement);\n}\n\n(() => {\n  const scriptElement = document.currentScript;\n  if (!scriptElement) return\n  if (scriptElement.hasAttribute(\"data-turbo-suppress-warning\")) return\n\n  let element = scriptElement.parentElement;\n  while (element) {\n    if (element == document.body) {\n      return console.warn(\n        unindent`\n        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!\n\n        Load your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\n        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements\n\n        \u2014\u2014\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `,\n        scriptElement.outerHTML\n      )\n    }\n\n    element = element.parentElement;\n  }\n})();\n\nwindow.Turbo = { ...Turbo, StreamActions };\nstart();\n\nexport { FetchEnctype, FetchMethod, FetchRequest, FetchResponse, FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, config, connectStreamSource, disconnectStreamSource, fetchWithTurboHeaders as fetch, fetchEnctypeFromString, fetchMethodFromString, isSafe, morphBodyElements, morphChildren, morphElements, morphTurboFrameElements, sessionNavigator as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit };\n", "let consumer\n\nexport async function getConsumer() {\n  return consumer || setConsumer(createConsumer().then(setConsumer))\n}\n\nexport function setConsumer(newConsumer) {\n  return consumer = newConsumer\n}\n\nexport async function createConsumer() {\n  const { createConsumer } = await import(/* webpackChunkName: \"actioncable\" */ \"@rails/actioncable/src\")\n  return createConsumer()\n}\n\nexport async function subscribeTo(channel, mixin) {\n  const { subscriptions } = await getConsumer()\n  return subscriptions.create(channel, mixin)\n}\n", "// Based on https://github.com/nathan7/snakeize\n//\n// This software is released under the MIT license:\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// 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, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\nexport default function walk (obj) {\n    if (!obj || typeof obj !== 'object') return obj;\n    if (obj instanceof Date || obj instanceof RegExp) return obj;\n    if (Array.isArray(obj)) return obj.map(walk);\n    return Object.keys(obj).reduce(function (acc, key) {\n        var camel = key[0].toLowerCase() + key.slice(1).replace(/([A-Z]+)/g, function (m, x) {\n            return '_' + x.toLowerCase();\n        });\n        acc[camel] = walk(obj[key]);\n        return acc;\n    }, {});\n};", "import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\nimport snakeize from \"./snakeize\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  static observedAttributes = [\"channel\", \"signed-stream-name\"]\n\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, {\n      received: this.dispatchMessageEvent.bind(this),\n      connected: this.subscriptionConnected.bind(this),\n      disconnected: this.subscriptionDisconnected.bind(this)\n    })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n    this.subscriptionDisconnected()\n  }\n\n  attributeChangedCallback() {\n    if (this.subscription) {\n      this.disconnectedCallback()\n      this.connectedCallback()\n    }\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\n  }\n\n  subscriptionConnected() {\n    this.setAttribute(\"connected\", \"\")\n  }\n\n  subscriptionDisconnected() {\n    this.removeAttribute(\"connected\")\n  }\n\n  get channel() {\n    const channel = this.getAttribute(\"channel\")\n    const signed_stream_name = this.getAttribute(\"signed-stream-name\")\n    return { channel, signed_stream_name, ...snakeize({ ...this.dataset }) }\n  }\n}\n\n\nif (customElements.get(\"turbo-cable-stream-source\") === undefined) {\n  customElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n}\n", "export function encodeMethodIntoRequestBody(event) {\n  if (event.target instanceof HTMLFormElement) {\n    const { target: form, detail: { fetchOptions } } = event\n\n    form.addEventListener(\"turbo:submit-start\", ({ detail: { formSubmission: { submitter } } }) => {\n      const body = isBodyInit(fetchOptions.body) ? fetchOptions.body : new URLSearchParams()\n      const method = determineFetchMethod(submitter, body, form)\n\n      if (!/get/i.test(method)) {\n        if (/post/i.test(method)) {\n          body.delete(\"_method\")\n        } else {\n          body.set(\"_method\", method)\n        }\n\n        fetchOptions.method = \"post\"\n      }\n    }, { once: true })\n  }\n}\n\nfunction determineFetchMethod(submitter, body, form) {\n  const formMethod = determineFormMethod(submitter)\n  const overrideMethod = body.get(\"_method\")\n  const method = form.getAttribute(\"method\") || \"get\"\n\n  if (typeof formMethod == \"string\") {\n    return formMethod\n  } else if (typeof overrideMethod == \"string\") {\n    return overrideMethod\n  } else {\n    return method\n  }\n}\n\nfunction determineFormMethod(submitter) {\n  if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) {\n    // Rails 7 ActionView::Helpers::FormBuilder#button method has an override\n    // for formmethod if the button does not have name or value attributes\n    // set, which is the default. This means that if you use <%= f.button\n    // formmethod: :delete %>, it will generate a <button name=\"_method\"\n    // value=\"delete\" formmethod=\"post\">. Therefore, if the submitter's name\n    // is already _method, it's value attribute already contains the desired\n    // method.\n    if (submitter.name === '_method') {\n      return submitter.value\n    } else if (submitter.hasAttribute(\"formmethod\")) {\n      return submitter.formMethod\n    } else {\n      return null\n    }\n  } else {\n    return null\n  }\n}\n\nfunction isBodyInit(body) {\n  return body instanceof FormData || body instanceof URLSearchParams\n}\n", "import \"./cable_stream_source_element\"\n\nimport * as Turbo from \"@hotwired/turbo\"\nexport { Turbo }\n\nimport * as cable from \"./cable\"\nexport { cable }\n\nimport { encodeMethodIntoRequestBody } from \"./fetch_requests\"\n\nwindow.Turbo = Turbo\n\naddEventListener(\"turbo:before-fetch-request\", encodeMethodIntoRequestBody)\n", "// Turbo writes the literal string \"Content missing\" into a frame when a\n// frame-scoped request lands on a page that carries no frame with the same id.\n// That is almost always a controller guard redirecting out of the frame \u2014 an\n// unaffordable duel to the coin account, a taken slot back to the time step, a\n// deleted record back to its index \u2014 where the redirect *is* the intended\n// answer. Perform it as a full page visit instead of parking a placeholder in\n// the frame, which fails silently for the user and only logs to the console.\n//\n// A frame that handles the event itself must stop it before it bubbles here\n// (see share_scorecard_controller), otherwise its failed fetch navigates the\n// whole page.\n//\n// The other cause is a bug: a successful, unredirected page that should carry\n// the frame but lost its id (a renamed tag, a branch of the view without it).\n// The full visit still beats the placeholder, but it would hide the bug, so\n// that case goes to error_reporter (JsError) as well. Error statuses stay\n// quiet: the server already knows about those.\ndocument.addEventListener(\"turbo:frame-missing\", (event) => {\n  const { response, visit } = event.detail;\n  if (!response || !visit) return;\n\n  if (response.ok && !response.redirected) {\n    const path = new URL(response.url).pathname;\n    window.reportError?.(\n      new Error(`Turbo frame #${event.target.id} missing from ${path}`),\n    );\n  }\n\n  event.preventDefault();\n  visit(response);\n});\n", "// Development and test only (the meta tag comes from layouts/_turbo_head): a\n// <turbo-stream target=\"\u2026\"> whose id matches nothing does nothing and logs\n// nothing, so a renamed dom id breaks a live update silently. Throwing turns\n// that into a console error locally and a failure in the browser journeys\n// (Cuprite runs with js_errors). Turbo renders the stream regardless.\n//\n// Exempt: `remove` (removing what is already gone is normal for per-user\n// broadcasts), streams without a single `target` (refresh, custom actions),\n// and `targets` selectors, which is how a stream says its target is optional\n// (comment badges exist only on pages with an activity tab).\ndocument.addEventListener(\"turbo:before-stream-render\", (event) => {\n  if (!document.querySelector('meta[name=\"turbo-stream-check\"]')) return;\n\n  const stream = event.target;\n  const target = stream.getAttribute(\"target\");\n  if (!target || stream.action === \"remove\") return;\n  if (document.getElementById(target)) return;\n\n  throw new Error(`turbo-stream ${stream.action}: no element #${target}`);\n});\n", "/*\nStimulus 3.0.1\nCopyright \u00A9 2021 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            }\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map;\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach(eventListener => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach(eventListener => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values())\n            .reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map;\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions).sort().forEach(key => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst descriptorPattern = /^((.+?)(@(window|document))?->)?(.+?)(#([^:]+?))(:(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName: matches[2],\n        eventOptions: matches[9] ? parseEventOptions(matches[9]) : {},\n        identifier: matches[5],\n        methodName: matches[7]\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions.split(\":\").reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nclass Action {\n    constructor(element, index, descriptor) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n    }\n    static forToken(token) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content));\n    }\n    toString() {\n        const eventNameSuffix = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventNameSuffix}->${this.identifier}#${this.methodName}`;\n    }\n    get params() {\n        if (this.eventTarget instanceof Element) {\n            return this.getParamsFromEventTargetAttributes(this.eventTarget);\n        }\n        else {\n            return {};\n        }\n    }\n    getParamsFromEventTargetAttributes(eventTarget) {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`);\n        const attributes = Array.from(eventTarget.attributes);\n        attributes.forEach(({ name, value }) => {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                Object.assign(params, { [camelize(key)]: typecast(value) });\n            }\n        });\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n}\nconst defaultEventNames = {\n    \"a\": e => \"click\",\n    \"button\": e => \"click\",\n    \"form\": e => \"submit\",\n    \"details\": e => \"toggle\",\n    \"input\": e => e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\",\n    \"select\": e => \"change\",\n    \"textarea\": e => \"input\"\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        if (this.willBeInvokedByEvent(event)) {\n            this.invokeWithEvent(event);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            const { params } = this.action;\n            const actionEvent = Object.assign(event, { params });\n            this.method.call(this.controller, actionEvent);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set;\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(node, attributeName) {\n        const element = node;\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map;\n        this.mutationObserver = new MutationObserver(mutations => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map(attribute => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some(set => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([key, values]) => values.has(value))\n            .map(([key, values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map;\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap;\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach(token => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach(token => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens)\n            .findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString.trim().split(/\\s+/).filter(content => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap;\n        this.valuesByTokenByElement = new WeakMap;\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map;\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map;\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach(binding => this.delegate.bindingDisconnected(binding));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    start() {\n        this.stringMapObserver.start();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            const value = descriptor.reader(rawValue);\n            let oldValue = rawOldValue;\n            if (rawOldValue) {\n                oldValue = descriptor.reader(rawOldValue);\n            }\n            changedMethod.call(this.receiver, value, oldValue);\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map(key => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach(key => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap;\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach(name => values.add(name));\n        return values;\n    }, new Set));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map(key => [key, definition[key]]) : [];\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [\n            ...Object.getOwnPropertyNames(object),\n            ...Object.getOwnPropertySymbols(object)\n        ];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended }\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () { this.a.call(this); };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b;\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor)\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap;\n        this.connectedContexts = new Set;\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap;\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set;\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target\n            || this.findTarget(targetName)\n            || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName)\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map(element => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n    }\n    findElement(selector) {\n        return this.element.matches(selector)\n            ? this.element\n            : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...this.element.matches(selector) ? [this.element] : [],\n            ...this.queryElements(selector).filter(this.containsElement)\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap;\n        this.scopeReferenceCounts = new WeakMap;\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map;\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap;\n        this.modulesByIdentifier = new Map;\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find(context => context.element == element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach(scope => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach(scope => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: identifier => `data-${identifier}-target`\n};\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n    }\n    static start(element, schema) {\n        const application = new Application(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        if (controllerConstructor.shouldLoad) {\n            this.load({ identifier, controllerConstructor });\n        }\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach(definition => this.router.loadDefinition(definition));\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach(identifier => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map(context => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise(resolve => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            }\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            }\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            }\n        }\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            }\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            }\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            }\n        }\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            }\n        }\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            }\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            }\n        }\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition]) {\n    return valueDescriptorForTokenAndTypeDefinition(token, typeDefinition);\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array: return \"array\";\n        case Boolean: return \"boolean\";\n        case Number: return \"number\";\n        case Object: return \"object\";\n        case String: return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\": return \"boolean\";\n        case \"number\": return \"number\";\n        case \"string\": return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(typeObject) {\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    if (typeFromObject) {\n        const defaultValueType = parseValueTypeDefault(typeObject.default);\n        if (typeFromObject !== defaultValueType) {\n            throw new Error(`Type \"${typeFromObject}\" must match the type of the default value. Given default value: \"${typeObject.default}\" as \"${defaultValueType}\"`);\n        }\n        return typeFromObject;\n    }\n}\nfunction parseValueTypeDefinition(typeDefinition) {\n    const typeFromObject = parseValueTypeObject(typeDefinition);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    throw new Error(`Unknown value type \"${typeDefinition}\"`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const defaultValue = typeDefinition.default;\n    if (defaultValue !== undefined)\n        return defaultValue;\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(token, typeDefinition) {\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(typeDefinition);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() { return defaultValueForDefinition(typeDefinition); },\n        get hasCustomDefaultValue() { return parseValueTypeDefault(typeDefinition) !== undefined; },\n        reader: readers[type],\n        writer: writers[type] || writers.default\n    };\n}\nconst defaultValuesByType = {\n    get array() { return []; },\n    boolean: false,\n    number: 0,\n    get object() { return {}; },\n    string: \"\"\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(\"Expected array\");\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || value == \"false\");\n    },\n    number(value) {\n        return Number(value);\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(\"Expected object\");\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    }\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [ClassPropertiesBlessing, TargetPropertiesBlessing, ValuePropertiesBlessing];\nController.targets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n", "import { Application } from \"@hotwired/stimulus\";\n\n// One Stimulus application per page, shared across bundles via window.Stimulus.\n// Add-on bundles (registration, faq_ai) are included on top of a host layout\n// bundle (application, admin, booking, ...). Each bundle carries its own copy\n// of this module, so the sharing must go through window: without it every\n// bundle would start its own Application, each would scan the whole DOM, and\n// any identifier registered by two bundles would connect twice per element\n// (e.g. step-particles in both the application and registration bundles).\nconst application = window.Stimulus || Application.start();\napplication.debug = false;\nwindow.Stimulus = application;\n\n// All bundles register through this helper, never through\n// application.register directly - Stimulus itself does not dedupe\n// identifiers, and the registered set must span bundles.\nconst registered = (application.registeredIdentifiers ||= new Set());\n\nexport function register(identifier, controller) {\n  if (registered.has(identifier)) return;\n  registered.add(identifier);\n  application.register(identifier, controller);\n}\n\nexport { application };\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"field\", \"showIcon\", \"hideIcon\"];\n\n  toggle() {\n    if (this.fieldTarget.type === \"password\") {\n      this.fieldTarget.type = \"text\";\n      this.showIconTarget.classList.add(\"hidden\");\n      this.hideIconTarget.classList.remove(\"hidden\");\n    } else {\n      this.fieldTarget.type = \"password\";\n      this.showIconTarget.classList.remove(\"hidden\");\n      this.hideIconTarget.classList.add(\"hidden\");\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"toggleable\", \"rotateable\"];\n  static values = { activated: Boolean };\n\n  connect() {\n    this.toggleClass = this.data.get(\"class\") || \"hidden\";\n\n    // A morphing page refresh re-applies the server-rendered class list, which\n    // would snap a disclosure the user opened shut mid-read \u2014 \"collapsed\" is\n    // the only state the server knows. Hold the class attribute on the elements\n    // this controller owns; their contents still morph normally.\n    this.keepDisclosureOpen = (event) => {\n      if (event.detail.attributeName !== \"class\") return;\n      if (!this.activatedValue) return;\n      if (!this.toggleableTargets.includes(event.target)) return;\n\n      event.preventDefault();\n    };\n    this.element.addEventListener(\n      \"turbo:before-morph-attribute\",\n      this.keepDisclosureOpen,\n    );\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\n      \"turbo:before-morph-attribute\",\n      this.keepDisclosureOpen,\n    );\n  }\n\n  toggle(event) {\n    event.preventDefault();\n\n    this.activatedValue = !this.activatedValue;\n  }\n\n  deactivate(event) {\n    if (event.target.type !== \"radio\") event.preventDefault();\n\n    this.activatedValue = false;\n  }\n\n  activate(event) {\n    if (event.target.type !== \"radio\") event.preventDefault();\n\n    this.activatedValue = true;\n  }\n\n  activatedValueChanged() {\n    if (!this.toggleClass) {\n      return;\n    }\n\n    this.toggleableTargets.forEach((target) => {\n      target.classList.toggle(this.toggleClass);\n    });\n  }\n\n  toggleAndRotate(event) {\n    this.toggle(event);\n    this.rotateableTargets.forEach((target) => {\n      if (target.classList.contains(\"rotate-90\")) {\n        target.classList.remove(\"rotate-90\");\n        target.classList.add(\"rotate-[270deg]\");\n      } else {\n        target.classList.remove(\"rotate-[270deg]\");\n        target.classList.add(\"rotate-90\");\n      }\n    });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nconst HIGHLIGHT_CLASSES = [\n  \"bg-gradient-to-b\",\n  \"from-custom-pink\",\n  \"to-custom-yellow\",\n  \"rounded-md\",\n  \"border-custom-red\",\n  \"text-white\",\n];\n\nexport default class extends Controller {\n  static targets = [\"cell\"];\n  static values = { selected: String };\n\n  connect() {\n    this.highlight();\n  }\n\n  selectedValueChanged() {\n    this.highlight();\n  }\n\n  highlight() {\n    this.cellTargets.forEach((cell) => {\n      const match = cell.dataset.date === this.selectedValue;\n      HIGHLIGHT_CLASSES.forEach((cls) => cell.classList.toggle(cls, match));\n    });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"rotateable\", \"revealable\", \"startButton\", \"skipButton\"];\n  static values = { angle: String };\n\n  connect() {}\n\n  rotate() {\n    this.startButtonTarget.classList.toggle(\"hidden\");\n    this.rotateableTarget.addEventListener(\"transitionend\", () => {\n      this.revealableTargets.forEach((target) => {\n        target.classList.toggle(\"hidden\");\n      });\n      // Only the goal notification has a skip button; /wheel_rewards/:id doesn't.\n      if (this.hasSkipButtonTarget)\n        this.skipButtonTarget.classList.toggle(\"hidden\");\n    });\n    this.rotateableTarget.style.webkitTransitionDuration = \"4s\";\n    this.rotateableTarget.style.webkitTransitionTimingFunction = \"ease-out\";\n    this.rotateableTarget.style.webkitTransform =\n      \"rotate(\" + this.angleValue + \"deg)\";\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Submits the form when an input fires the bound action. Replaces inline\n// `onchange=\"this.form.submit()\"` handlers so views stay CSP-compliant.\n//\n// Usage:\n//   <%= form_with ..., data: { controller: \"auto-submit\" } do |f| %>\n//     <%= f.select :status, ..., {}, data: { action: \"change->auto-submit#submit\" } %>\nexport default class extends Controller {\n  // Optional debounce (ms) so type-ahead inputs don't fire a request on\n  // every keystroke. Defaults to 0 (submit immediately) so existing\n  // change-based usages are unaffected.\n  static values = { delay: { type: Number, default: 0 } };\n\n  submit(event) {\n    const form =\n      this.element.tagName === \"FORM\" ? this.element : event.target.form;\n    if (!form) return;\n\n    const run = () => {\n      if (typeof form.requestSubmit === \"function\") {\n        form.requestSubmit();\n      } else {\n        form.submit();\n      }\n    };\n\n    if (this.delayValue > 0) {\n      clearTimeout(this.timeout);\n      this.timeout = setTimeout(run, this.delayValue);\n    } else {\n      run();\n    }\n  }\n\n  disconnect() {\n    clearTimeout(this.timeout);\n  }\n\n  // Prevents an input's change event from reaching the form-level\n  // auto-submit listener (used for date fields, which emit change\n  // events mid-typing as each date segment is filled in).\n  stop(event) {\n    event.stopPropagation();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Page-wide fallback input paths for every <input type=\"file\">, attached to\n// the layout <body>. Embedded browser views (Outlook's in-app window, Teams,\n// some PWAs) render pages normally but never open the OS file dialog, so a\n// plain file input silently dead-ends there. This controller adds two\n// picker-free ways in, plus a hint when the dialog looks broken:\n//  - drop files onto the form that contains a file input\n//  - paste files from the clipboard while focus is inside such a form (or\n//    anywhere, when the page has exactly one file input)\n//  - a click on a file input that neither blurs the window (a real dialog\n//    steals focus) nor fires change/cancel shows an inline hint.\n// Selected files land in the existing input via DataTransfer + a synthetic\n// bubbling change event, so direct-upload, max-size checks and file counters\n// react exactly as if the picker had been used. Detection only arms on\n// hover-capable fine-pointer devices: phone pickers open as sheets that may\n// not blur the window and would false-positive.\nexport default class extends Controller {\n  static values = { messages: Object };\n\n  connect() {\n    this.hints = new Map();\n    this.highlighted = null;\n    this.detectionArmed = window.matchMedia(\n      \"(hover: hover) and (pointer: fine)\",\n    ).matches;\n\n    this.boundPaste = this.paste.bind(this);\n    this.boundDragover = this.dragover.bind(this);\n    this.boundDragleave = this.dragleave.bind(this);\n    this.boundDrop = this.drop.bind(this);\n    this.boundClick = this.click.bind(this);\n    this.boundSettled = this.pickerSettled.bind(this);\n    this.boundWindowBlur = this.clearPending.bind(this);\n\n    document.addEventListener(\"paste\", this.boundPaste);\n    document.addEventListener(\"dragover\", this.boundDragover);\n    document.addEventListener(\"dragleave\", this.boundDragleave);\n    document.addEventListener(\"drop\", this.boundDrop);\n    document.addEventListener(\"click\", this.boundClick);\n    // capture: `cancel` on file inputs does not reliably bubble everywhere\n    document.addEventListener(\"change\", this.boundSettled, true);\n    document.addEventListener(\"cancel\", this.boundSettled, true);\n    window.addEventListener(\"blur\", this.boundWindowBlur);\n  }\n\n  disconnect() {\n    document.removeEventListener(\"paste\", this.boundPaste);\n    document.removeEventListener(\"dragover\", this.boundDragover);\n    document.removeEventListener(\"dragleave\", this.boundDragleave);\n    document.removeEventListener(\"drop\", this.boundDrop);\n    document.removeEventListener(\"click\", this.boundClick);\n    document.removeEventListener(\"change\", this.boundSettled, true);\n    document.removeEventListener(\"cancel\", this.boundSettled, true);\n    window.removeEventListener(\"blur\", this.boundWindowBlur);\n    this.clearPending();\n    this.unhighlight();\n    this.hints.forEach((hint) => hint.remove());\n    this.hints.clear();\n  }\n\n  // --- paste ---------------------------------------------------------------\n\n  paste(event) {\n    const files = Array.from(event.clipboardData?.files || []);\n    if (files.length === 0) return;\n\n    // Mixed clipboards (Office copy: text + image) pasted into a text field\n    // mean \"insert the text\" - only hijack file-only pastes there.\n    const inTextField = event.target.closest?.(\n      \"input, textarea, [contenteditable='true']\",\n    );\n    if (inTextField && event.clipboardData.types.includes(\"text/plain\")) return;\n\n    const input = this.inputForContext(event.target);\n    if (input && this.assign(input, files)) event.preventDefault();\n  }\n\n  // --- drag & drop ---------------------------------------------------------\n\n  dragover(event) {\n    if (!this.draggingFiles(event)) return;\n    // without preventDefault the browser refuses the drop / navigates away\n    event.preventDefault();\n    this.highlight(this.inputForDrop(event)?.closest(\"form\") || null);\n  }\n\n  dragleave(event) {\n    if (!event.relatedTarget) this.unhighlight();\n  }\n\n  drop(event) {\n    if (!this.draggingFiles(event)) return;\n    event.preventDefault();\n    this.unhighlight();\n    const input = this.inputForDrop(event);\n    if (input) this.assign(input, Array.from(event.dataTransfer.files));\n  }\n\n  // --- broken-picker detection --------------------------------------------\n\n  click(event) {\n    if (!this.detectionArmed || !this.isFileInput(event.target)) return;\n    this.clearPending();\n    this.pendingInput = event.target;\n    this.pendingTimer = setTimeout(() => this.pickerFailed(), 900);\n  }\n\n  pickerSettled(event) {\n    if (!this.isFileInput(event.target)) return;\n    this.clearPending();\n    if (event.type === \"change\") this.removeHint(event.target);\n  }\n\n  clearPending() {\n    if (this.pendingTimer) clearTimeout(this.pendingTimer);\n    this.pendingTimer = null;\n    this.pendingInput = null;\n  }\n\n  pickerFailed() {\n    const input = this.pendingInput;\n    this.clearPending();\n    const message = this.messagesValue.picker_failed;\n    if (!input || !message || this.hints.has(input)) return;\n\n    const hint = document.createElement(\"div\");\n    hint.className =\n      \"mt-1 flex items-start gap-2 rounded-lg border border-amber-200 bg-amber-50 p-2 text-xs text-amber-800\";\n    const text = document.createElement(\"span\");\n    text.className = \"flex-1\";\n    text.textContent = message;\n    const dismiss = document.createElement(\"button\");\n    dismiss.type = \"button\";\n    dismiss.className = \"font-bold px-1\";\n    dismiss.textContent = \"\u00D7\";\n    dismiss.addEventListener(\"click\", () => this.removeHint(input));\n    hint.append(text, dismiss);\n\n    (input.closest(\"form\") || input).after(hint);\n    this.hints.set(input, hint);\n  }\n\n  removeHint(input) {\n    this.hints.get(input)?.remove();\n    this.hints.delete(input);\n  }\n\n  // --- shared plumbing -----------------------------------------------------\n\n  // Files go into the input of the surrounding form; a form with several\n  // file inputs is only served by drop (nearest input wins via coordinates),\n  // never by paste, to avoid attaching to the wrong field. Outside any\n  // suitable form, an unambiguous page (exactly one file input) still works.\n  inputForContext(target, x = null, y = null) {\n    const form = target?.closest?.(\"form\");\n    const scoped = form ? this.fileInputs(form) : [];\n    if (scoped.length === 1) return scoped[0];\n    if (scoped.length > 1) return this.nearest(scoped, x, y);\n\n    const global = this.fileInputs(document);\n    return global.length === 1 ? global[0] : null;\n  }\n\n  inputForDrop(event) {\n    return this.inputForContext(event.target, event.clientX, event.clientY);\n  }\n\n  fileInputs(root) {\n    return Array.from(\n      root.querySelectorAll(\"input[type='file']:not([disabled])\"),\n    );\n  }\n\n  nearest(inputs, x, y) {\n    if (x === null) return null;\n    let best = null;\n    let bestDistance = Infinity;\n    inputs.forEach((input) => {\n      const rect = input.getBoundingClientRect();\n      const distance = Math.hypot(\n        rect.left + rect.width / 2 - x,\n        rect.top + rect.height / 2 - y,\n      );\n      if (distance < bestDistance) {\n        bestDistance = distance;\n        best = input;\n      }\n    });\n    return best;\n  }\n\n  assign(input, files) {\n    const accepted = files.filter((file) => this.accepts(input, file));\n    if (accepted.length === 0) return false;\n\n    const transfer = new DataTransfer();\n    if (input.multiple) {\n      Array.from(input.files || []).forEach((file) => transfer.items.add(file));\n      accepted.forEach((file) => transfer.items.add(file));\n    } else {\n      transfer.items.add(accepted[0]);\n    }\n    input.files = transfer.files;\n    this.removeHint(input);\n    input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n    return true;\n  }\n\n  accepts(input, file) {\n    const accept = (input.accept || \"\").trim();\n    if (accept === \"\") return true;\n    return accept.split(\",\").some((raw) => {\n      const token = raw.trim().toLowerCase();\n      if (token === \"\") return false;\n      if (token.startsWith(\".\")) return file.name.toLowerCase().endsWith(token);\n      if (token.endsWith(\"/*\"))\n        return file.type.toLowerCase().startsWith(token.slice(0, -1));\n      return file.type.toLowerCase() === token;\n    });\n  }\n\n  draggingFiles(event) {\n    return Array.from(event.dataTransfer?.types || []).includes(\"Files\");\n  }\n\n  isFileInput(element) {\n    return element instanceof HTMLInputElement && element.type === \"file\";\n  }\n\n  highlight(form) {\n    if (this.highlighted === form) return;\n    this.unhighlight();\n    if (!form) return;\n    form.classList.add(\"ring-2\", \"ring-highlight-purple\", \"ring-offset-1\");\n    this.highlighted = form;\n  }\n\n  unhighlight() {\n    this.highlighted?.classList.remove(\n      \"ring-2\",\n      \"ring-highlight-purple\",\n      \"ring-offset-1\",\n    );\n    this.highlighted = null;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Tells the guest when a Turbo form submit never got an answer (connection\n// lost on venue WiFi or mobile data). Turbo only logs that to the console and\n// re-enables the button, so without this the tap silently did nothing\n// (docs/js-errors.md). A server rejection (422, 500) carries a response and\n// renders its own errors; only a failed fetch sets `detail.error`.\n// Sits on <body>: turbo:submit-end bubbles up from every form on the page.\nexport default class extends Controller {\n  static values = { message: String };\n\n  disconnect() {\n    this.hide();\n  }\n\n  // turbo:submit-end\n  show(event) {\n    if (!event.detail?.error || !this.messageValue) return;\n\n    this.hide();\n    const toast = document.createElement(\"div\");\n    toast.setAttribute(\"role\", \"alert\");\n    toast.className =\n      \"fixed top-4 inset-x-4 z-[10000] mx-auto max-w-screen-sm flex items-start gap-2 rounded-lg bg-highlight-red p-3 text-sm font-semibold text-white shadow-lg\";\n    const text = document.createElement(\"span\");\n    text.className = \"flex-1\";\n    text.textContent = this.messageValue;\n    const dismiss = document.createElement(\"button\");\n    dismiss.type = \"button\";\n    dismiss.className = \"px-1 font-bold\";\n    dismiss.textContent = \"\u00D7\";\n    dismiss.addEventListener(\"click\", () => this.hide());\n    toast.append(text, dismiss);\n\n    document.body.append(toast);\n    this.toast = toast;\n    this.timer = setTimeout(() => this.hide(), 8000);\n  }\n\n  // turbo:submit-start: the retry is under way, the old message is stale.\n  hide() {\n    clearTimeout(this.timer);\n    this.toast?.remove();\n    this.toast = null;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Grows a textarea to fit its content so long values stay fully visible.\n// The IntersectionObserver re-measures once the element actually becomes\n// visible (e.g. the slide-over drawer opens), since an off-screen\n// textarea reports a scrollHeight of 0.\nexport default class extends Controller {\n  connect() {\n    this.io = new IntersectionObserver((entries) => {\n      if (entries.some((entry) => entry.isIntersecting)) this.resize();\n    });\n    this.io.observe(this.element);\n    this.resize();\n  }\n\n  disconnect() {\n    this.io.disconnect();\n  }\n\n  resize() {\n    if (this.element.scrollHeight === 0) return;\n    this.element.style.height = \"auto\";\n    this.element.style.height = `${this.element.scrollHeight}px`;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Slide-over panel backed by a Turbo Frame. Opens when the frame gains\n// content (a card's edit link was followed), closes on backdrop click,\n// ESC, the close button, or when the frame is emptied (after a\n// successful save the controller streams an empty frame back).\nexport default class extends Controller {\n  static targets = [\"frame\", \"panel\", \"backdrop\"];\n\n  connect() {\n    this.onKeydown = this.onKeydown.bind(this);\n    this.observer = new MutationObserver(() => this.syncToFrame());\n    this.observer.observe(this.frameTarget, { childList: true });\n    this.syncToFrame();\n  }\n\n  disconnect() {\n    this.observer.disconnect();\n    document.removeEventListener(\"keydown\", this.onKeydown);\n  }\n\n  syncToFrame() {\n    if (this.frameTarget.children.length > 0) {\n      this.open();\n    } else {\n      this.close();\n    }\n  }\n\n  open() {\n    if (this.opened) return;\n    this.opened = true;\n    this.element.classList.remove(\"hidden\");\n    document.body.classList.add(\"overflow-hidden\");\n    document.addEventListener(\"keydown\", this.onKeydown);\n    requestAnimationFrame(() => {\n      this.backdropTarget.classList.remove(\"opacity-0\");\n      this.panelTarget.classList.remove(\"translate-x-full\");\n    });\n  }\n\n  close() {\n    if (!this.opened) return;\n    this.opened = false;\n    document.body.classList.remove(\"overflow-hidden\");\n    document.removeEventListener(\"keydown\", this.onKeydown);\n    this.backdropTarget.classList.add(\"opacity-0\");\n    this.panelTarget.classList.add(\"translate-x-full\");\n    let done = false;\n    const finish = () => {\n      if (done) return;\n      done = true;\n      this.element.classList.add(\"hidden\");\n      this.frameTarget.innerHTML = \"\";\n      this.frameTarget.removeAttribute(\"complete\");\n      this.frameTarget.removeAttribute(\"src\");\n    };\n    this.panelTarget.addEventListener(\"transitionend\", finish, { once: true });\n    setTimeout(finish, 400);\n  }\n\n  onKeydown(event) {\n    if (event.key === \"Escape\") this.close();\n  }\n\n  backdropClick(event) {\n    if (event.target === this.backdropTarget) this.close();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Asks before letting a click through, for elements Turbo does not handle:\n// `data-turbo=\"false\"` also disables `data-turbo-confirm`, and there is no\n// @rails/ujs to fall back on.\nexport default class extends Controller {\n  static values = { message: String };\n\n  confirm(event) {\n    if (window.confirm(this.messageValue)) return;\n\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  }\n}\n", "// Shared Stimulus controllers - loaded in both user and admin bundles\n// Manually maintained. Do NOT use `rails stimulus:manifest:update`.\n\nimport { register } from \"./application\";\n\nimport PasswordToggleController from \"./password_toggle_controller\";\nregister(\"password-toggle\", PasswordToggleController);\n\nimport ToggleController from \"./toggle_controller\";\nregister(\"toggle\", ToggleController);\n\nimport DateSwitcherController from \"./date_switcher_controller\";\nregister(\"date-switcher\", DateSwitcherController);\n\nimport WheelController from \"./wheel_controller\";\nregister(\"wheel\", WheelController);\n\nimport AutoSubmitController from \"./auto_submit_controller\";\nregister(\"auto-submit\", AutoSubmitController);\n\nimport AttachmentFallbackController from \"./attachment_fallback_controller\";\nregister(\"attachment-fallback\", AttachmentFallbackController);\n\nimport SubmitErrorController from \"./submit_error_controller\";\nregister(\"submit-error\", SubmitErrorController);\n\nimport AutogrowController from \"./autogrow_controller\";\nregister(\"autogrow\", AutogrowController);\n\nimport DrawerController from \"./drawer_controller\";\nregister(\"drawer\", DrawerController);\n\nimport ConfirmClickController from \"./confirm_click_controller\";\nregister(\"confirm-click\", ConfirmClickController);\n", "// Formats an AI answer for display. The prompt asks for plain text, but the\n// model sometimes emits light markdown anyway \u2014 render that gracefully instead\n// of showing raw ** markers. Escapes HTML first, so the result is safe to\n// assign to innerHTML (containers use whitespace-pre-line for line breaks).\nexport function aiAnswerToHtml(text) {\n  return text\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\\*\\*([^*\\n]+)\\*\\*/g, \"<strong>$1</strong>\")\n    .replace(/^[-*]\\s+/gm, \"\u2022 \");\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { aiAnswerToHtml } from \"./ai_answer_formatting.js\";\n\nexport default class extends Controller {\n  static targets = [\n    \"message\",\n    \"locationId\",\n    \"answerContainer\",\n    \"answerText\",\n    \"loader\",\n    \"honeypot\",\n  ];\n  static values = {\n    url: String,\n    errorMessage: String,\n    throttleMessage: String,\n  };\n\n  initialize() {\n    this.lastMessage = \"\";\n  }\n\n  get csrfToken() {\n    return document\n      .querySelector('meta[name=\"csrf-token\"]')\n      .getAttribute(\"content\");\n  }\n\n  fetchAnswer() {\n    const message = this.messageTarget.value.trim();\n    const locationId = this.locationIdTarget.value;\n\n    // Don't fetch if message is empty or same as last time\n    if (message.length === 0 || message === this.lastMessage) {\n      return;\n    }\n\n    // Don't fetch if no location selected\n    if (!locationId) {\n      return;\n    }\n\n    this.lastMessage = message;\n    this.showLoader();\n\n    // Include honeypot field (should be empty for real users)\n    const honeypot = this.hasHoneypotTarget ? this.honeypotTarget.value : \"\";\n\n    fetch(this.urlValue, {\n      method: \"POST\",\n      body: JSON.stringify({\n        message: message,\n        location_id: locationId,\n        website: honeypot,\n      }),\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"X-CSRF-Token\": this.csrfToken,\n      },\n    })\n      .then((response) => {\n        // Throttled (429) and server errors return no answer - surface them instead of failing silently\n        if (!response.ok) {\n          const error = new Error(\n            `AI answer request failed: ${response.status}`,\n          );\n          error.status = response.status;\n          throw error;\n        }\n        return response.json();\n      })\n      .then((data) => {\n        this.hideLoader();\n        if (data.answer) {\n          this.showAnswer(data.answer);\n        } else {\n          this.hideContainer();\n        }\n      })\n      .catch((error) => {\n        this.hideLoader();\n        // A 429 is the per-IP throttle, not an outage - tell the guest to wait\n        const throttled = error.status === 429 && this.throttleMessageValue;\n        this.showAnswer(\n          throttled ? this.throttleMessageValue : this.errorMessageValue,\n        );\n        // Allow a retry with the same text after a failure\n        this.lastMessage = \"\";\n        console.error(\"Failed to fetch AI answer:\", error);\n      });\n  }\n\n  showLoader() {\n    this.answerContainerTarget.classList.remove(\"hidden\");\n    this.loaderTarget.classList.remove(\"hidden\");\n    this.answerTextTarget.classList.add(\"hidden\");\n  }\n\n  hideLoader() {\n    this.loaderTarget.classList.add(\"hidden\");\n  }\n\n  showAnswer(answer) {\n    this.answerContainerTarget.classList.remove(\"hidden\");\n    this.answerTextTarget.innerHTML = aiAnswerToHtml(answer);\n    this.answerTextTarget.classList.remove(\"hidden\");\n  }\n\n  hideContainer() {\n    this.answerContainerTarget.classList.add(\"hidden\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"player\", \"button\"];\n\n  toggle(event) {\n    const button = event.currentTarget;\n    const player = this.playerTarget;\n\n    if (player.paused) {\n      this.pauseAll(); // Stop any other playing audio\n      button.innerHTML = \"\u23F8\";\n      // iOS rejects files it can't decode (\"The operation is not supported\"):\n      // put the button back instead of leaving it on pause with no sound.\n      player.play().catch(() => {\n        button.innerHTML = \"\u25B6\";\n      });\n    } else {\n      player.pause();\n      button.innerHTML = \"\u25B6\";\n    }\n  }\n\n  pauseAll() {\n    // Pause all audio players on the page\n    document.querySelectorAll(\"audio\").forEach((audio) => {\n      audio.pause();\n    });\n\n    // Reset all buttons to \"Play\"\n    document\n      .querySelectorAll(\"[data-audio-target='button']\")\n      .forEach((button) => {\n        button.innerHTML = \"\u25B6\";\n      });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"modal\", \"emailInput\"];\n\n  open(event) {\n    event.preventDefault();\n    this.modalTarget.classList.remove(\"hidden\");\n    this.emailInputTarget.value = \"\";\n    this.emailInputTarget.focus();\n  }\n\n  close(event) {\n    if (event) event.preventDefault();\n    this.modalTarget.classList.add(\"hidden\");\n  }\n\n  closeOnBackground(event) {\n    if (event.target === this.modalTarget) {\n      this.close(event);\n    }\n  }\n\n  handleKeydown(event) {\n    if (\n      event.key === \"Escape\" &&\n      !this.modalTarget.classList.contains(\"hidden\")\n    ) {\n      this.close(event);\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Optional: idle targets hide while success targets show; with a resetAfter\n// value (ms) the swap reverts automatically (e.g. link icon -> check -> link).\nexport default class extends Controller {\n  static targets = [\"success\", \"idle\"];\n  static values = { url: String, resetAfter: Number };\n\n  copy(event) {\n    event.preventDefault();\n    navigator.clipboard.writeText(this.urlValue).then(\n      () => {\n        this.showSuccess(true);\n        if (this.resetAfterValue > 0) {\n          setTimeout(() => this.showSuccess(false), this.resetAfterValue);\n        }\n      },\n      () => {\n        console.error(\"Failed to copy text to clipboard.\");\n      },\n    );\n  }\n\n  showSuccess(shown) {\n    this.successTargets.forEach((t) => t.classList.toggle(\"hidden\", !shown));\n    this.idleTargets.forEach((t) => t.classList.toggle(\"hidden\", shown));\n  }\n}\n", "// canvas-confetti v1.9.4 built on 2025-10-25T05:14:56.640Z\nvar module = {};\n\n// source content\n/* globals Map */\n\n(function main(global, module, isWorker, workerSize) {\n  var canUseWorker = !!(\n    global.Worker &&\n    global.Blob &&\n    global.Promise &&\n    global.OffscreenCanvas &&\n    global.OffscreenCanvasRenderingContext2D &&\n    global.HTMLCanvasElement &&\n    global.HTMLCanvasElement.prototype.transferControlToOffscreen &&\n    global.URL &&\n    global.URL.createObjectURL);\n\n  var canUsePaths = typeof Path2D === 'function' && typeof DOMMatrix === 'function';\n  var canDrawBitmap = (function () {\n    // this mostly supports ssr\n    if (!global.OffscreenCanvas) {\n      return false;\n    }\n\n    try {\n      var canvas = new OffscreenCanvas(1, 1);\n      var ctx = canvas.getContext('2d');\n      ctx.fillRect(0, 0, 1, 1);\n      var bitmap = canvas.transferToImageBitmap();\n      ctx.createPattern(bitmap, 'no-repeat');\n    } catch (e) {\n      return false;\n    }\n\n    return true;\n  })();\n\n  function noop() {}\n\n  // create a promise if it exists, otherwise, just\n  // call the function directly\n  function promise(func) {\n    var ModulePromise = module.exports.Promise;\n    var Prom = ModulePromise !== void 0 ? ModulePromise : global.Promise;\n\n    if (typeof Prom === 'function') {\n      return new Prom(func);\n    }\n\n    func(noop, noop);\n\n    return null;\n  }\n\n  var bitmapMapper = (function (skipTransform, map) {\n    // see https://github.com/catdad/canvas-confetti/issues/209\n    // creating canvases is actually pretty expensive, so we should create a\n    // 1:1 map for bitmap:canvas, so that we can animate the confetti in\n    // a performant manner, but also not store them forever so that we don't\n    // have a memory leak\n    return {\n      transform: function(bitmap) {\n        if (skipTransform) {\n          return bitmap;\n        }\n\n        if (map.has(bitmap)) {\n          return map.get(bitmap);\n        }\n\n        var canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n        var ctx = canvas.getContext('2d');\n        ctx.drawImage(bitmap, 0, 0);\n\n        map.set(bitmap, canvas);\n\n        return canvas;\n      },\n      clear: function () {\n        map.clear();\n      }\n    };\n  })(canDrawBitmap, new Map());\n\n  var raf = (function () {\n    var TIME = Math.floor(1000 / 60);\n    var frame, cancel;\n    var frames = {};\n    var lastFrameTime = 0;\n\n    if (typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function') {\n      frame = function (cb) {\n        var id = Math.random();\n\n        frames[id] = requestAnimationFrame(function onFrame(time) {\n          if (lastFrameTime === time || lastFrameTime + TIME - 1 < time) {\n            lastFrameTime = time;\n            delete frames[id];\n\n            cb();\n          } else {\n            frames[id] = requestAnimationFrame(onFrame);\n          }\n        });\n\n        return id;\n      };\n      cancel = function (id) {\n        if (frames[id]) {\n          cancelAnimationFrame(frames[id]);\n        }\n      };\n    } else {\n      frame = function (cb) {\n        return setTimeout(cb, TIME);\n      };\n      cancel = function (timer) {\n        return clearTimeout(timer);\n      };\n    }\n\n    return { frame: frame, cancel: cancel };\n  }());\n\n  var getWorker = (function () {\n    var worker;\n    var prom;\n    var resolves = {};\n\n    function decorate(worker) {\n      function execute(options, callback) {\n        worker.postMessage({ options: options || {}, callback: callback });\n      }\n      worker.init = function initWorker(canvas) {\n        var offscreen = canvas.transferControlToOffscreen();\n        worker.postMessage({ canvas: offscreen }, [offscreen]);\n      };\n\n      worker.fire = function fireWorker(options, size, done) {\n        if (prom) {\n          execute(options, null);\n          return prom;\n        }\n\n        var id = Math.random().toString(36).slice(2);\n\n        prom = promise(function (resolve) {\n          function workerDone(msg) {\n            if (msg.data.callback !== id) {\n              return;\n            }\n\n            delete resolves[id];\n            worker.removeEventListener('message', workerDone);\n\n            prom = null;\n\n            bitmapMapper.clear();\n\n            done();\n            resolve();\n          }\n\n          worker.addEventListener('message', workerDone);\n          execute(options, id);\n\n          resolves[id] = workerDone.bind(null, { data: { callback: id }});\n        });\n\n        return prom;\n      };\n\n      worker.reset = function resetWorker() {\n        worker.postMessage({ reset: true });\n\n        for (var id in resolves) {\n          resolves[id]();\n          delete resolves[id];\n        }\n      };\n    }\n\n    return function () {\n      if (worker) {\n        return worker;\n      }\n\n      if (!isWorker && canUseWorker) {\n        var code = [\n          'var CONFETTI, SIZE = {}, module = {};',\n          '(' + main.toString() + ')(this, module, true, SIZE);',\n          'onmessage = function(msg) {',\n          '  if (msg.data.options) {',\n          '    CONFETTI(msg.data.options).then(function () {',\n          '      if (msg.data.callback) {',\n          '        postMessage({ callback: msg.data.callback });',\n          '      }',\n          '    });',\n          '  } else if (msg.data.reset) {',\n          '    CONFETTI && CONFETTI.reset();',\n          '  } else if (msg.data.resize) {',\n          '    SIZE.width = msg.data.resize.width;',\n          '    SIZE.height = msg.data.resize.height;',\n          '  } else if (msg.data.canvas) {',\n          '    SIZE.width = msg.data.canvas.width;',\n          '    SIZE.height = msg.data.canvas.height;',\n          '    CONFETTI = module.exports.create(msg.data.canvas);',\n          '  }',\n          '}',\n        ].join('\\n');\n        try {\n          worker = new Worker(URL.createObjectURL(new Blob([code])));\n        } catch (e) {\n          // eslint-disable-next-line no-console\n          typeof console !== 'undefined' && typeof console.warn === 'function' ? console.warn('\uD83C\uDF8A Could not load worker', e) : null;\n\n          return null;\n        }\n\n        decorate(worker);\n      }\n\n      return worker;\n    };\n  })();\n\n  var defaults = {\n    particleCount: 50,\n    angle: 90,\n    spread: 45,\n    startVelocity: 45,\n    decay: 0.9,\n    gravity: 1,\n    drift: 0,\n    ticks: 200,\n    x: 0.5,\n    y: 0.5,\n    shapes: ['square', 'circle'],\n    zIndex: 100,\n    colors: [\n      '#26ccff',\n      '#a25afd',\n      '#ff5e7e',\n      '#88ff5a',\n      '#fcff42',\n      '#ffa62d',\n      '#ff36ff'\n    ],\n    // probably should be true, but back-compat\n    disableForReducedMotion: false,\n    scalar: 1\n  };\n\n  function convert(val, transform) {\n    return transform ? transform(val) : val;\n  }\n\n  function isOk(val) {\n    return !(val === null || val === undefined);\n  }\n\n  function prop(options, name, transform) {\n    return convert(\n      options && isOk(options[name]) ? options[name] : defaults[name],\n      transform\n    );\n  }\n\n  function onlyPositiveInt(number){\n    return number < 0 ? 0 : Math.floor(number);\n  }\n\n  function randomInt(min, max) {\n    // [min, max)\n    return Math.floor(Math.random() * (max - min)) + min;\n  }\n\n  function toDecimal(str) {\n    return parseInt(str, 16);\n  }\n\n  function colorsToRgb(colors) {\n    return colors.map(hexToRgb);\n  }\n\n  function hexToRgb(str) {\n    var val = String(str).replace(/[^0-9a-f]/gi, '');\n\n    if (val.length < 6) {\n        val = val[0]+val[0]+val[1]+val[1]+val[2]+val[2];\n    }\n\n    return {\n      r: toDecimal(val.substring(0,2)),\n      g: toDecimal(val.substring(2,4)),\n      b: toDecimal(val.substring(4,6))\n    };\n  }\n\n  function getOrigin(options) {\n    var origin = prop(options, 'origin', Object);\n    origin.x = prop(origin, 'x', Number);\n    origin.y = prop(origin, 'y', Number);\n\n    return origin;\n  }\n\n  function setCanvasWindowSize(canvas) {\n    canvas.width = document.documentElement.clientWidth;\n    canvas.height = document.documentElement.clientHeight;\n  }\n\n  function setCanvasRectSize(canvas) {\n    var rect = canvas.getBoundingClientRect();\n    canvas.width = rect.width;\n    canvas.height = rect.height;\n  }\n\n  function getCanvas(zIndex) {\n    var canvas = document.createElement('canvas');\n\n    canvas.style.position = 'fixed';\n    canvas.style.top = '0px';\n    canvas.style.left = '0px';\n    canvas.style.pointerEvents = 'none';\n    canvas.style.zIndex = zIndex;\n\n    return canvas;\n  }\n\n  function ellipse(context, x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise) {\n    context.save();\n    context.translate(x, y);\n    context.rotate(rotation);\n    context.scale(radiusX, radiusY);\n    context.arc(0, 0, 1, startAngle, endAngle, antiClockwise);\n    context.restore();\n  }\n\n  function randomPhysics(opts) {\n    var radAngle = opts.angle * (Math.PI / 180);\n    var radSpread = opts.spread * (Math.PI / 180);\n\n    return {\n      x: opts.x,\n      y: opts.y,\n      wobble: Math.random() * 10,\n      wobbleSpeed: Math.min(0.11, Math.random() * 0.1 + 0.05),\n      velocity: (opts.startVelocity * 0.5) + (Math.random() * opts.startVelocity),\n      angle2D: -radAngle + ((0.5 * radSpread) - (Math.random() * radSpread)),\n      tiltAngle: (Math.random() * (0.75 - 0.25) + 0.25) * Math.PI,\n      color: opts.color,\n      shape: opts.shape,\n      tick: 0,\n      totalTicks: opts.ticks,\n      decay: opts.decay,\n      drift: opts.drift,\n      random: Math.random() + 2,\n      tiltSin: 0,\n      tiltCos: 0,\n      wobbleX: 0,\n      wobbleY: 0,\n      gravity: opts.gravity * 3,\n      ovalScalar: 0.6,\n      scalar: opts.scalar,\n      flat: opts.flat\n    };\n  }\n\n  function updateFetti(context, fetti) {\n    fetti.x += Math.cos(fetti.angle2D) * fetti.velocity + fetti.drift;\n    fetti.y += Math.sin(fetti.angle2D) * fetti.velocity + fetti.gravity;\n    fetti.velocity *= fetti.decay;\n\n    if (fetti.flat) {\n      fetti.wobble = 0;\n      fetti.wobbleX = fetti.x + (10 * fetti.scalar);\n      fetti.wobbleY = fetti.y + (10 * fetti.scalar);\n\n      fetti.tiltSin = 0;\n      fetti.tiltCos = 0;\n      fetti.random = 1;\n    } else {\n      fetti.wobble += fetti.wobbleSpeed;\n      fetti.wobbleX = fetti.x + ((10 * fetti.scalar) * Math.cos(fetti.wobble));\n      fetti.wobbleY = fetti.y + ((10 * fetti.scalar) * Math.sin(fetti.wobble));\n\n      fetti.tiltAngle += 0.1;\n      fetti.tiltSin = Math.sin(fetti.tiltAngle);\n      fetti.tiltCos = Math.cos(fetti.tiltAngle);\n      fetti.random = Math.random() + 2;\n    }\n\n    var progress = (fetti.tick++) / fetti.totalTicks;\n\n    var x1 = fetti.x + (fetti.random * fetti.tiltCos);\n    var y1 = fetti.y + (fetti.random * fetti.tiltSin);\n    var x2 = fetti.wobbleX + (fetti.random * fetti.tiltCos);\n    var y2 = fetti.wobbleY + (fetti.random * fetti.tiltSin);\n\n    context.fillStyle = 'rgba(' + fetti.color.r + ', ' + fetti.color.g + ', ' + fetti.color.b + ', ' + (1 - progress) + ')';\n\n    context.beginPath();\n\n    if (canUsePaths && fetti.shape.type === 'path' && typeof fetti.shape.path === 'string' && Array.isArray(fetti.shape.matrix)) {\n      context.fill(transformPath2D(\n        fetti.shape.path,\n        fetti.shape.matrix,\n        fetti.x,\n        fetti.y,\n        Math.abs(x2 - x1) * 0.1,\n        Math.abs(y2 - y1) * 0.1,\n        Math.PI / 10 * fetti.wobble\n      ));\n    } else if (fetti.shape.type === 'bitmap') {\n      var rotation = Math.PI / 10 * fetti.wobble;\n      var scaleX = Math.abs(x2 - x1) * 0.1;\n      var scaleY = Math.abs(y2 - y1) * 0.1;\n      var width = fetti.shape.bitmap.width * fetti.scalar;\n      var height = fetti.shape.bitmap.height * fetti.scalar;\n\n      var matrix = new DOMMatrix([\n        Math.cos(rotation) * scaleX,\n        Math.sin(rotation) * scaleX,\n        -Math.sin(rotation) * scaleY,\n        Math.cos(rotation) * scaleY,\n        fetti.x,\n        fetti.y\n      ]);\n\n      // apply the transform matrix from the confetti shape\n      matrix.multiplySelf(new DOMMatrix(fetti.shape.matrix));\n\n      var pattern = context.createPattern(bitmapMapper.transform(fetti.shape.bitmap), 'no-repeat');\n      pattern.setTransform(matrix);\n\n      context.globalAlpha = (1 - progress);\n      context.fillStyle = pattern;\n      context.fillRect(\n        fetti.x - (width / 2),\n        fetti.y - (height / 2),\n        width,\n        height\n      );\n      context.globalAlpha = 1;\n    } else if (fetti.shape === 'circle') {\n      context.ellipse ?\n        context.ellipse(fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI) :\n        ellipse(context, fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI);\n    } else if (fetti.shape === 'star') {\n      var rot = Math.PI / 2 * 3;\n      var innerRadius = 4 * fetti.scalar;\n      var outerRadius = 8 * fetti.scalar;\n      var x = fetti.x;\n      var y = fetti.y;\n      var spikes = 5;\n      var step = Math.PI / spikes;\n\n      while (spikes--) {\n        x = fetti.x + Math.cos(rot) * outerRadius;\n        y = fetti.y + Math.sin(rot) * outerRadius;\n        context.lineTo(x, y);\n        rot += step;\n\n        x = fetti.x + Math.cos(rot) * innerRadius;\n        y = fetti.y + Math.sin(rot) * innerRadius;\n        context.lineTo(x, y);\n        rot += step;\n      }\n    } else {\n      context.moveTo(Math.floor(fetti.x), Math.floor(fetti.y));\n      context.lineTo(Math.floor(fetti.wobbleX), Math.floor(y1));\n      context.lineTo(Math.floor(x2), Math.floor(y2));\n      context.lineTo(Math.floor(x1), Math.floor(fetti.wobbleY));\n    }\n\n    context.closePath();\n    context.fill();\n\n    return fetti.tick < fetti.totalTicks;\n  }\n\n  function animate(canvas, fettis, resizer, size, done) {\n    var animatingFettis = fettis.slice();\n    var context = canvas.getContext('2d');\n    var animationFrame;\n    var destroy;\n\n    var prom = promise(function (resolve) {\n      function onDone() {\n        animationFrame = destroy = null;\n\n        context.clearRect(0, 0, size.width, size.height);\n        bitmapMapper.clear();\n\n        done();\n        resolve();\n      }\n\n      function update() {\n        if (isWorker && !(size.width === workerSize.width && size.height === workerSize.height)) {\n          size.width = canvas.width = workerSize.width;\n          size.height = canvas.height = workerSize.height;\n        }\n\n        if (!size.width && !size.height) {\n          resizer(canvas);\n          size.width = canvas.width;\n          size.height = canvas.height;\n        }\n\n        context.clearRect(0, 0, size.width, size.height);\n\n        animatingFettis = animatingFettis.filter(function (fetti) {\n          return updateFetti(context, fetti);\n        });\n\n        if (animatingFettis.length) {\n          animationFrame = raf.frame(update);\n        } else {\n          onDone();\n        }\n      }\n\n      animationFrame = raf.frame(update);\n      destroy = onDone;\n    });\n\n    return {\n      addFettis: function (fettis) {\n        animatingFettis = animatingFettis.concat(fettis);\n\n        return prom;\n      },\n      canvas: canvas,\n      promise: prom,\n      reset: function () {\n        if (animationFrame) {\n          raf.cancel(animationFrame);\n        }\n\n        if (destroy) {\n          destroy();\n        }\n      }\n    };\n  }\n\n  function confettiCannon(canvas, globalOpts) {\n    var isLibCanvas = !canvas;\n    var allowResize = !!prop(globalOpts || {}, 'resize');\n    var hasResizeEventRegistered = false;\n    var globalDisableForReducedMotion = prop(globalOpts, 'disableForReducedMotion', Boolean);\n    var shouldUseWorker = canUseWorker && !!prop(globalOpts || {}, 'useWorker');\n    var worker = shouldUseWorker ? getWorker() : null;\n    var resizer = isLibCanvas ? setCanvasWindowSize : setCanvasRectSize;\n    var initialized = (canvas && worker) ? !!canvas.__confetti_initialized : false;\n    var preferLessMotion = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion)').matches;\n    var animationObj;\n\n    function fireLocal(options, size, done) {\n      var particleCount = prop(options, 'particleCount', onlyPositiveInt);\n      var angle = prop(options, 'angle', Number);\n      var spread = prop(options, 'spread', Number);\n      var startVelocity = prop(options, 'startVelocity', Number);\n      var decay = prop(options, 'decay', Number);\n      var gravity = prop(options, 'gravity', Number);\n      var drift = prop(options, 'drift', Number);\n      var colors = prop(options, 'colors', colorsToRgb);\n      var ticks = prop(options, 'ticks', Number);\n      var shapes = prop(options, 'shapes');\n      var scalar = prop(options, 'scalar');\n      var flat = !!prop(options, 'flat');\n      var origin = getOrigin(options);\n\n      var temp = particleCount;\n      var fettis = [];\n\n      var startX = canvas.width * origin.x;\n      var startY = canvas.height * origin.y;\n\n      while (temp--) {\n        fettis.push(\n          randomPhysics({\n            x: startX,\n            y: startY,\n            angle: angle,\n            spread: spread,\n            startVelocity: startVelocity,\n            color: colors[temp % colors.length],\n            shape: shapes[randomInt(0, shapes.length)],\n            ticks: ticks,\n            decay: decay,\n            gravity: gravity,\n            drift: drift,\n            scalar: scalar,\n            flat: flat\n          })\n        );\n      }\n\n      // if we have a previous canvas already animating,\n      // add to it\n      if (animationObj) {\n        return animationObj.addFettis(fettis);\n      }\n\n      animationObj = animate(canvas, fettis, resizer, size , done);\n\n      return animationObj.promise;\n    }\n\n    function fire(options) {\n      var disableForReducedMotion = globalDisableForReducedMotion || prop(options, 'disableForReducedMotion', Boolean);\n      var zIndex = prop(options, 'zIndex', Number);\n\n      if (disableForReducedMotion && preferLessMotion) {\n        return promise(function (resolve) {\n          resolve();\n        });\n      }\n\n      if (isLibCanvas && animationObj) {\n        // use existing canvas from in-progress animation\n        canvas = animationObj.canvas;\n      } else if (isLibCanvas && !canvas) {\n        // create and initialize a new canvas\n        canvas = getCanvas(zIndex);\n        document.body.appendChild(canvas);\n      }\n\n      if (allowResize && !initialized) {\n        // initialize the size of a user-supplied canvas\n        resizer(canvas);\n      }\n\n      var size = {\n        width: canvas.width,\n        height: canvas.height\n      };\n\n      if (worker && !initialized) {\n        worker.init(canvas);\n      }\n\n      initialized = true;\n\n      if (worker) {\n        canvas.__confetti_initialized = true;\n      }\n\n      function onResize() {\n        if (worker) {\n          // TODO this really shouldn't be immediate, because it is expensive\n          var obj = {\n            getBoundingClientRect: function () {\n              if (!isLibCanvas) {\n                return canvas.getBoundingClientRect();\n              }\n            }\n          };\n\n          resizer(obj);\n\n          worker.postMessage({\n            resize: {\n              width: obj.width,\n              height: obj.height\n            }\n          });\n          return;\n        }\n\n        // don't actually query the size here, since this\n        // can execute frequently and rapidly\n        size.width = size.height = null;\n      }\n\n      function done() {\n        animationObj = null;\n\n        if (allowResize) {\n          hasResizeEventRegistered = false;\n          global.removeEventListener('resize', onResize);\n        }\n\n        if (isLibCanvas && canvas) {\n          if (document.body.contains(canvas)) {\n            document.body.removeChild(canvas);\n          }\n          canvas = null;\n          initialized = false;\n        }\n      }\n\n      if (allowResize && !hasResizeEventRegistered) {\n        hasResizeEventRegistered = true;\n        global.addEventListener('resize', onResize, false);\n      }\n\n      if (worker) {\n        return worker.fire(options, size, done);\n      }\n\n      return fireLocal(options, size, done);\n    }\n\n    fire.reset = function () {\n      if (worker) {\n        worker.reset();\n      }\n\n      if (animationObj) {\n        animationObj.reset();\n      }\n    };\n\n    return fire;\n  }\n\n  // Make default export lazy to defer worker creation until called.\n  var defaultFire;\n  function getDefaultFire() {\n    if (!defaultFire) {\n      defaultFire = confettiCannon(null, { useWorker: true, resize: true });\n    }\n    return defaultFire;\n  }\n\n  function transformPath2D(pathString, pathMatrix, x, y, scaleX, scaleY, rotation) {\n    var path2d = new Path2D(pathString);\n\n    var t1 = new Path2D();\n    t1.addPath(path2d, new DOMMatrix(pathMatrix));\n\n    var t2 = new Path2D();\n    // see https://developer.mozilla.org/en-US/docs/Web/API/DOMMatrix/DOMMatrix\n    t2.addPath(t1, new DOMMatrix([\n      Math.cos(rotation) * scaleX,\n      Math.sin(rotation) * scaleX,\n      -Math.sin(rotation) * scaleY,\n      Math.cos(rotation) * scaleY,\n      x,\n      y\n    ]));\n\n    return t2;\n  }\n\n  function shapeFromPath(pathData) {\n    if (!canUsePaths) {\n      throw new Error('path confetti are not supported in this browser');\n    }\n\n    var path, matrix;\n\n    if (typeof pathData === 'string') {\n      path = pathData;\n    } else {\n      path = pathData.path;\n      matrix = pathData.matrix;\n    }\n\n    var path2d = new Path2D(path);\n    var tempCanvas = document.createElement('canvas');\n    var tempCtx = tempCanvas.getContext('2d');\n\n    if (!matrix) {\n      // attempt to figure out the width of the path, up to 1000x1000\n      var maxSize = 1000;\n      var minX = maxSize;\n      var minY = maxSize;\n      var maxX = 0;\n      var maxY = 0;\n      var width, height;\n\n      // do some line skipping... this is faster than checking\n      // every pixel and will be mostly still correct\n      for (var x = 0; x < maxSize; x += 2) {\n        for (var y = 0; y < maxSize; y += 2) {\n          if (tempCtx.isPointInPath(path2d, x, y, 'nonzero')) {\n            minX = Math.min(minX, x);\n            minY = Math.min(minY, y);\n            maxX = Math.max(maxX, x);\n            maxY = Math.max(maxY, y);\n          }\n        }\n      }\n\n      width = maxX - minX;\n      height = maxY - minY;\n\n      var maxDesiredSize = 10;\n      var scale = Math.min(maxDesiredSize/width, maxDesiredSize/height);\n\n      matrix = [\n        scale, 0, 0, scale,\n        -Math.round((width/2) + minX) * scale,\n        -Math.round((height/2) + minY) * scale\n      ];\n    }\n\n    return {\n      type: 'path',\n      path: path,\n      matrix: matrix\n    };\n  }\n\n  function shapeFromText(textData) {\n    var text,\n        scalar = 1,\n        color = '#000000',\n        // see https://nolanlawson.com/2022/04/08/the-struggle-of-using-native-emoji-on-the-web/\n        fontFamily = '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\", \"EmojiOne Color\", \"Android Emoji\", \"Twemoji Mozilla\", \"system emoji\", sans-serif';\n\n    if (typeof textData === 'string') {\n      text = textData;\n    } else {\n      text = textData.text;\n      scalar = 'scalar' in textData ? textData.scalar : scalar;\n      fontFamily = 'fontFamily' in textData ? textData.fontFamily : fontFamily;\n      color = 'color' in textData ? textData.color : color;\n    }\n\n    // all other confetti are 10 pixels,\n    // so this pixel size is the de-facto 100% scale confetti\n    var fontSize = 10 * scalar;\n    var font = '' + fontSize + 'px ' + fontFamily;\n\n    var canvas = new OffscreenCanvas(fontSize, fontSize);\n    var ctx = canvas.getContext('2d');\n\n    ctx.font = font;\n    var size = ctx.measureText(text);\n    var width = Math.ceil(size.actualBoundingBoxRight + size.actualBoundingBoxLeft);\n    var height = Math.ceil(size.actualBoundingBoxAscent + size.actualBoundingBoxDescent);\n\n    var padding = 2;\n    var x = size.actualBoundingBoxLeft + padding;\n    var y = size.actualBoundingBoxAscent + padding;\n    width += padding + padding;\n    height += padding + padding;\n\n    canvas = new OffscreenCanvas(width, height);\n    ctx = canvas.getContext('2d');\n    ctx.font = font;\n    ctx.fillStyle = color;\n\n    ctx.fillText(text, x, y);\n\n    var scale = 1 / scalar;\n\n    return {\n      type: 'bitmap',\n      // TODO these probably need to be transfered for workers\n      bitmap: canvas.transferToImageBitmap(),\n      matrix: [scale, 0, 0, scale, -width * scale / 2, -height * scale / 2]\n    };\n  }\n\n  module.exports = function() {\n    return getDefaultFire().apply(this, arguments);\n  };\n  module.exports.reset = function() {\n    getDefaultFire().reset();\n  };\n  module.exports.create = confettiCannon;\n  module.exports.shapeFromPath = shapeFromPath;\n  module.exports.shapeFromText = shapeFromText;\n}((function () {\n  if (typeof window !== 'undefined') {\n    return window;\n  }\n\n  if (typeof self !== 'undefined') {\n    return self;\n  }\n\n  return this || {};\n})(), module, false));\n\n// end source content\n\nexport default module.exports;\nexport var create = module.exports.create;\n", "import { Controller } from \"@hotwired/stimulus\";\nimport confetti from \"canvas-confetti\";\n\n// Connects to data-controller=\"confetti\"\nexport default class extends Controller {\n  static values = { type: { type: String, default: \"spray\" } };\n\n  connect() {\n    // Use requestAnimationFrame to ensure DOM is fully painted\n    requestAnimationFrame(() => {\n      // Use typeValue if set, otherwise fall back to parsing element ID for legacy support\n      let type = this.typeValue;\n      if (!type || type === \"spray\") {\n        // Check if element ID specifies a different type (legacy support)\n        const id = this.element.id;\n        if (id === \"confetti-firework\") type = \"firework\";\n        else if (id === \"confetti-snow\") type = \"snow\";\n        else type = \"spray\";\n      }\n      if (type === \"spray\") this.spray();\n      else if (type === \"firework\") this.firework();\n      else if (type === \"snow\") this.snow();\n    });\n  }\n\n  // Create a properly sized canvas for confetti\n  getConfettiInstance() {\n    // Remove any existing confetti canvas\n    const existing = document.querySelector(\"canvas.confetti-canvas\");\n    if (existing) existing.remove();\n\n    // Create canvas with viewport dimensions\n    const canvas = document.createElement(\"canvas\");\n    canvas.className = \"confetti-canvas\";\n    canvas.style.position = \"fixed\";\n    canvas.style.top = \"0\";\n    canvas.style.left = \"0\";\n    canvas.style.width = \"100vw\";\n    canvas.style.height = \"100vh\";\n    canvas.style.pointerEvents = \"none\";\n    canvas.style.zIndex = \"9999\";\n    canvas.width = window.innerWidth;\n    canvas.height = window.innerHeight;\n    document.body.appendChild(canvas);\n\n    return confetti.create(canvas, { resize: true, useWorker: true });\n  }\n\n  spray() {\n    const myConfetti = this.getConfettiInstance();\n    const count = 200;\n    const defaults = {\n      origin: { y: 0.7 },\n    };\n\n    function fire(particleRatio, opts) {\n      myConfetti(\n        Object.assign({}, defaults, opts, {\n          particleCount: Math.floor(count * particleRatio),\n        }),\n      );\n    }\n\n    fire(0.25, {\n      spread: 26,\n      startVelocity: 55,\n    });\n    fire(0.2, {\n      spread: 60,\n    });\n    fire(0.35, {\n      spread: 100,\n      decay: 0.91,\n      scalar: 0.8,\n    });\n    fire(0.1, {\n      spread: 120,\n      startVelocity: 25,\n      decay: 0.92,\n      scalar: 1.2,\n    });\n    fire(0.1, {\n      spread: 120,\n      startVelocity: 45,\n    });\n  }\n\n  firework() {\n    const myConfetti = this.getConfettiInstance();\n    const duration = 3 * 1000;\n    const animationEnd = Date.now() + duration;\n    const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 0 };\n\n    function randomInRange(min, max) {\n      return Math.random() * (max - min) + min;\n    }\n\n    const interval = setInterval(function () {\n      const timeLeft = animationEnd - Date.now();\n\n      if (timeLeft <= 0) {\n        return clearInterval(interval);\n      }\n\n      const particleCount = 50 * (timeLeft / duration);\n      // since particles fall down, start a bit higher than random\n      myConfetti(\n        Object.assign({}, defaults, {\n          particleCount,\n          origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 },\n        }),\n      );\n      myConfetti(\n        Object.assign({}, defaults, {\n          particleCount,\n          origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 },\n        }),\n      );\n    }, 250);\n  }\n\n  snow() {\n    const myConfetti = this.getConfettiInstance();\n    const duration = 3 * 1000;\n    const animationEnd = Date.now() + duration;\n    let skew = 1;\n\n    function randomInRange(min, max) {\n      return Math.random() * (max - min) + min;\n    }\n\n    (function frame() {\n      const timeLeft = animationEnd - Date.now();\n      const ticks = Math.max(200, 500 * (timeLeft / duration));\n      skew = Math.max(0.8, skew - 0.001);\n\n      myConfetti({\n        particleCount: 1,\n        startVelocity: 0,\n        ticks: ticks,\n        origin: {\n          x: Math.random(),\n          // since particles fall down, skew start toward the top\n          y: Math.random() * skew - 0.2,\n        },\n        colors: [\"#F72042\"],\n        shapes: [\"circle\"],\n        gravity: randomInRange(0.4, 0.6),\n        scalar: randomInRange(0.4, 1),\n        drift: randomInRange(-0.4, 0.4),\n      });\n\n      if (timeLeft > 0) {\n        requestAnimationFrame(frame);\n      }\n    })();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { aiAnswerToHtml } from \"./ai_answer_formatting.js\";\n\nexport default class extends Controller {\n  static targets = [\n    \"message\",\n    \"locationId\",\n    \"thread\",\n    \"questionTemplate\",\n    \"answerTemplate\",\n    \"honeypot\",\n  ];\n  // cityLevel: the surface is a city page where the guest has not chosen a\n  // venue yet (multi-venue cities) \u2014 the backend then answers for all venues.\n  // locale: the endpoint is not locale-scoped, so the page language has to be\n  // sent explicitly or the backend answers in German.\n  // messages: the customer_requests.ai_answer locale subtree.\n  static values = {\n    url: String,\n    cityLevel: Boolean,\n    locale: String,\n    messages: Object,\n  };\n\n  connect() {\n    // Set once the backend has opened a conversation; every later turn sends it\n    // back so the answers keep their context.\n    this.conversationId = null;\n  }\n\n  get csrfToken() {\n    return document\n      .querySelector('meta[name=\"csrf-token\"]')\n      .getAttribute(\"content\");\n  }\n\n  // Suggestion chips: fill the composer and submit as if the guest typed the\n  // question \u2014 requestSubmit fires the normal submit path (turbo_stream FAQ\n  // search + fetchAnswer), a plain .submit() would bypass both.\n  ask(event) {\n    this.messageTarget.value = event.params.question;\n    this.messageTarget.form.requestSubmit();\n  }\n\n  fetchAnswer(event) {\n    // The first question also runs the turbo_stream FAQ article search, so the\n    // list below matches what was asked. A follow-up only makes sense inside\n    // the conversation (\"und wie lange dauert das?\"), so searching the articles\n    // for it would just replace that list with noise.\n    if (this.conversationId) event.preventDefault();\n\n    const message = this.messageTarget.value.trim();\n    const locationId = this.locationIdTarget.value;\n\n    // Skip if query too short (must match backend minimum of 5 chars) or no location\n    if (message.length < 5 || !locationId) return;\n\n    this.appendQuestion(message);\n    const answer = this.appendAnswer();\n    this.clearComposer();\n    this.request(message, locationId, answer);\n  }\n\n  request(message, locationId, answer) {\n    const honeypot = this.hasHoneypotTarget ? this.honeypotTarget.value : \"\";\n\n    fetch(this.urlValue, {\n      method: \"POST\",\n      body: JSON.stringify({\n        message: message,\n        location_id: locationId,\n        city_level: this.cityLevelValue,\n        locale: this.localeValue,\n        conversation_id: this.conversationId,\n        website: honeypot,\n      }),\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"X-CSRF-Token\": this.csrfToken,\n      },\n    })\n      .then((response) => {\n        // Throttled (429) and server errors return no answer - surface them instead of failing silently\n        if (!response.ok) {\n          const error = new Error(\n            `FAQ AI answer request failed: ${response.status}`,\n          );\n          error.status = response.status;\n          throw error;\n        }\n        return response.json();\n      })\n      .then((data) => {\n        if (data.conversation_id) this.conversationId = data.conversation_id;\n        this.showAnswer(answer, this.answerTextFor(data));\n      })\n      .catch((error) => {\n        // A 429 is the per-IP throttle, not an outage - tell the guest to wait\n        const throttled = error.status === 429;\n        this.showAnswer(\n          answer,\n          throttled ? this.messagesValue.throttled : this.messagesValue.error,\n        );\n        console.error(\"Failed to fetch FAQ AI answer:\", error);\n      });\n  }\n\n  // An unanswerable question (preflight NO, or a request that needs a human)\n  // returns no answer. Saying so keeps the thread coherent, where a silently\n  // missing reply would read as a bug.\n  answerTextFor(data) {\n    if (data.conversation_limit_reached)\n      return this.messagesValue.limit_reached;\n    return data.answer || this.messagesValue.no_answer;\n  }\n\n  appendQuestion(message) {\n    const bubble = this.cloneTemplate(this.questionTemplateTarget);\n    // textContent, not innerHTML: this is the guest's own unescaped input.\n    bubble.textContent = message;\n    return this.appendToThread(bubble);\n  }\n\n  appendAnswer() {\n    const bubble = this.cloneTemplate(this.answerTemplateTarget);\n    bubble.classList.remove(\"hidden\");\n    bubble.querySelector('[data-role=\"loader\"]').classList.remove(\"hidden\");\n    return this.appendToThread(bubble);\n  }\n\n  cloneTemplate(template) {\n    return template.content.firstElementChild.cloneNode(true);\n  }\n\n  appendToThread(bubble) {\n    this.threadTarget.classList.remove(\"hidden\");\n    this.threadTarget.appendChild(bubble);\n    bubble.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n    return bubble;\n  }\n\n  showAnswer(bubble, answer) {\n    const text = bubble.querySelector('[data-role=\"answerText\"]');\n    bubble.querySelector('[data-role=\"loader\"]').classList.add(\"hidden\");\n    text.innerHTML = aiAnswerToHtml(answer);\n    text.classList.remove(\"hidden\");\n    bubble.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n  }\n\n  // Emptying the composer lets the guest type the next question straight away,\n  // instead of clearing the previous one by hand. It waits a tick because the\n  // first question's form submit serializes the field after this handler runs.\n  clearComposer() {\n    setTimeout(() => {\n      this.messageTarget.value = \"\";\n    }, 0);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// On HTML5 validation failure, scroll to the TOP of the invalid field's section\n// and outline it in red, instead of the browser's default jump-to-the-control\n// (which hides the section heading). Mark the form with this controller and wrap\n// each field group in an element with data-invalid-section.\nexport default class extends Controller {\n  connect() {\n    this.element.addEventListener(\"invalid\", this.handleInvalid, true);\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"invalid\", this.handleInvalid, true);\n  }\n\n  handleInvalid = (event) => {\n    // Only override fields opted in via data-invalid-section; let native\n    // validation handle the rest (e.g. fields with their own inline feedback)\n    const section = event.target.closest(\"[data-invalid-section]\");\n    if (!section) return;\n\n    // Suppress the native tooltip + jump-to-control\n    event.preventDefault();\n\n    // Only act on the first invalid field per submit (a radio group fires once per option)\n    if (this.handled) return;\n    this.handled = true;\n\n    section.classList.add(\"outline-error-red\");\n    section.addEventListener(\n      \"change\",\n      () => section.classList.remove(\"outline-error-red\"),\n      { once: true },\n    );\n\n    // Run after the browser's own focus handling so we win the scroll position\n    requestAnimationFrame(() => {\n      section.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n      this.handled = false;\n    });\n  };\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static values = {\n    target: String,\n    visitors: String,\n    customerGroup: String,\n    date: String,\n  };\n\n  redirect() {\n    const params = new URLSearchParams();\n    params.set(\"target_location\", this.targetValue);\n    params.set(\"visitors\", this.visitorsValue);\n    params.set(\"customer_group\", this.customerGroupValue);\n    if (this.dateValue) {\n      params.set(\"date\", this.dateValue);\n    }\n    window.location.href = `/location_redirect?${params.toString()}`;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// A two-option choice for a boolean form field (visits/_groups_options): the\n// two labels act as buttons (data-action ...#selectTrue / #selectFalse), the\n// hidden `input` target carries the value, and every `dependent` target is\n// shown only while the value equals its data-options-radio-when.\nexport default class extends Controller {\n  static targets = [\"trueSelection\", \"falseSelection\", \"input\", \"dependent\"];\n  static values = {\n    active: String,\n    inactive: String,\n    trueActive: String,\n    trueInactive: String,\n  };\n\n  connect() {\n    this.render();\n  }\n\n  selectTrue() {\n    this.inputTarget.value = \"true\";\n    this.render();\n  }\n\n  selectFalse() {\n    this.inputTarget.value = \"false\";\n    this.render();\n  }\n\n  render() {\n    const value = this.inputTarget.value === \"true\";\n    const trueActive = this.hasTrueActiveValue\n      ? this.trueActiveValue\n      : this.activeValue;\n    const trueInactive = this.hasTrueInactiveValue\n      ? this.trueInactiveValue\n      : this.inactiveValue;\n\n    this.highlight(\n      this.falseSelectionTarget,\n      !value,\n      this.activeValue,\n      this.inactiveValue,\n    );\n    this.highlight(this.trueSelectionTarget, value, trueActive, trueInactive);\n    this.dependentTargets.forEach((element) => {\n      element.hidden = element.dataset.optionsRadioWhen !== String(value);\n    });\n  }\n\n  highlight(element, active, activeClasses, inactiveClasses) {\n    const [add, remove] = active\n      ? [activeClasses, inactiveClasses]\n      : [inactiveClasses, activeClasses];\n    element.classList.remove(...remove.split(\" \"));\n    element.classList.add(...add.split(\" \"));\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\n    \"submitButton\",\n    \"customAmount\",\n    \"amountGroup\",\n    \"methodGroup\",\n    \"stepAmount\",\n    \"stepAmountMark\",\n    \"stepMethod\",\n    \"stepMethodMark\",\n  ];\n  static values = {\n    residual: Number,\n    share: Number,\n    currencySymbol: String,\n    template: String,\n    chooseAmount: String,\n    chooseMethod: String,\n  };\n\n  connect() {\n    this.selectedAmount = null;\n    this.selectedMethod = null;\n    this.selectedMethodName = null;\n    this.updateButton();\n  }\n\n  selectAmount(event) {\n    const option = event.target.value;\n    if (option === \"residual\") {\n      this.selectedAmount = this.residualValue;\n    } else if (option === \"my_share\") {\n      this.selectedAmount = this.shareValue;\n    } else if (option === \"custom\") {\n      this.selectedAmount = this.getCustomAmount();\n    }\n    this.updateButton();\n  }\n\n  updateCustomAmount() {\n    const selectedOption = this.element.querySelector(\n      'input[name=\"payment_option\"]:checked',\n    );\n    if (selectedOption && selectedOption.value === \"custom\") {\n      this.selectedAmount = this.getCustomAmount();\n      this.updateButton();\n    }\n  }\n\n  getCustomAmount() {\n    if (this.hasCustomAmountTarget) {\n      const value = parseFloat(this.customAmountTarget.value);\n      return isNaN(value) ? null : value;\n    }\n    return null;\n  }\n\n  selectMethod(event) {\n    this.selectedMethod = event.target.value;\n    this.selectedMethodName = event.target\n      .closest(\"label\")\n      .querySelector(\".font-bold\")\n      .textContent.trim();\n    this.updateButton();\n  }\n\n  attemptSubmit(event) {\n    if (this.hasValidAmount() && this.selectedMethod !== null) return;\n\n    event.preventDefault();\n    this.nudge(\n      this.hasValidAmount() ? this.methodGroupTarget : this.amountGroupTarget,\n    );\n  }\n\n  nudge(group) {\n    group.classList.remove(\"wiggle-small\");\n    void group.offsetWidth;\n    group.classList.add(\"wiggle-small\");\n  }\n\n  hasValidAmount() {\n    return this.selectedAmount !== null && this.selectedAmount >= 1;\n  }\n\n  updateButton() {\n    const button = this.submitButtonTarget;\n    const hasAmount = this.hasValidAmount();\n    const hasMethod = this.selectedMethod !== null;\n\n    this.setStep(\n      this.stepAmountTarget,\n      this.stepAmountMarkTarget,\n      hasAmount ? \"done\" : \"todo\",\n    );\n    this.setStep(\n      this.stepMethodTarget,\n      this.stepMethodMarkTarget,\n      hasMethod ? \"done\" : hasAmount ? \"todo\" : \"idle\",\n    );\n    this.methodGroupTarget.classList.toggle(\n      \"opacity-50\",\n      !hasAmount && !hasMethod,\n    );\n\n    button.classList.toggle(\"button\", hasAmount && hasMethod);\n    button.classList.toggle(\"button-passive\", !(hasAmount && hasMethod));\n\n    if (hasAmount && hasMethod) {\n      const formattedAmount =\n        Math.round(this.selectedAmount) + \" \" + this.currencySymbolValue;\n      button.textContent = this.templateValue\n        .replace(\"%{amount}\", formattedAmount)\n        .replace(\"%{method}\", this.selectedMethodName);\n    } else {\n      button.textContent = hasAmount\n        ? this.chooseMethodValue\n        : this.chooseAmountValue;\n    }\n  }\n\n  setStep(row, mark, state) {\n    row.classList.toggle(\"text-highlight-red\", state === \"todo\");\n    row.classList.toggle(\"text-green-700\", state === \"done\");\n    row.classList.toggle(\"text-gray-500\", state === \"idle\");\n    mark.classList.toggle(\"bg-highlight-red\", state === \"todo\");\n    mark.classList.toggle(\"bg-green-700\", state === \"done\");\n    mark.classList.toggle(\"bg-gray-300\", state === \"idle\");\n    mark.textContent = state === \"done\" ? \"\u2713\" : mark.dataset.index;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Drives the interactive first-play tutorial: a step-by-step spotlight that\n// frosts the page and lifts the relevant play sections sharply above it. A\n// body-level frame rings the focused section. Every tap advances; the map step\n// morphs the preview into the map button.\nexport default class extends Controller {\n  static targets = [\n    \"highlightFrame\",\n    \"text\",\n    \"mapWrapper\",\n    \"mapPreview\",\n    \"steps\",\n    \"backdrop\",\n    \"tooltip\",\n  ];\n  static values = {\n    containerId: String,\n    dismissUrl: String,\n    returnUrl: String,\n  };\n\n  connect() {\n    this.steps = Array.from(this.stepsTarget.children);\n    this.index = 0;\n    this.lifted = [];\n    this.busy = false;\n    this.ringEl = null;\n    this.reposition = this.positionFrame.bind(this);\n    // Capture so the frame also follows scrolling inside the app's inner\n    // overflow container (its scroll events don't bubble to window).\n    window.addEventListener(\"scroll\", this.reposition, {\n      passive: true,\n      capture: true,\n    });\n    window.addEventListener(\"resize\", this.reposition, { passive: true });\n    this.render();\n  }\n\n  disconnect() {\n    window.removeEventListener(\"scroll\", this.reposition, { capture: true });\n    window.removeEventListener(\"resize\", this.reposition);\n    this.clearLifted();\n  }\n\n  // --- step rendering -------------------------------------------------------\n\n  render() {\n    this.clearLifted();\n    const step = this.steps[this.index];\n    if (!step) return this.finish();\n\n    this.textTarget.innerHTML = step.innerHTML;\n\n    // Build the interface up progressively: lift the focused sections sharply\n    // above the backdrop, leave dimmed ones visible behind the blur, hide the\n    // rest.\n    const showKeys = (step.dataset.show || \"\").split(\",\").filter(Boolean);\n    const dimKeys = (step.dataset.dim || \"\").split(\",\").filter(Boolean);\n    this.sections().forEach((section) => {\n      const key = section.dataset.tutorialSection;\n      if (showKeys.includes(key)) {\n        section.style.display = \"\";\n        this.lift(section);\n      } else if (dimKeys.includes(key)) {\n        section.style.display = \"\";\n      } else {\n        section.style.display = \"none\";\n      }\n    });\n\n    const ringKey = step.dataset.ring;\n    this.frameOn(ringKey ? this.el(ringKey) : null);\n\n    if (step.dataset.showMap === \"true\") {\n      this.showMapPreview();\n    } else {\n      this.hideMapPreview();\n    }\n\n    if (step.dataset.scrollTop === \"true\") {\n      window.scrollTo({ top: 0, behavior: \"smooth\" });\n    } else if (step.dataset.autoscroll === \"true\" && this.ringEl) {\n      this.ringEl.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n    }\n  }\n\n  next(event) {\n    if (event) event.preventDefault();\n    if (this.busy) return;\n\n    const step = this.steps[this.index];\n    // On the map step, the first tap morphs the preview into the map button.\n    if (step && step.dataset.showMap === \"true\" && this.hasMapPreviewTarget) {\n      this.morphMap();\n      return;\n    }\n\n    this.index += 1;\n    this.render();\n  }\n\n  // --- spotlight helpers ----------------------------------------------------\n\n  el(key) {\n    return document.querySelector(\n      `#${this.containerIdValue} [data-tutorial-el=\"${key}\"]`,\n    );\n  }\n\n  sections() {\n    return Array.from(\n      document.querySelectorAll(\n        `#${this.containerIdValue} [data-tutorial-section]`,\n      ),\n    );\n  }\n\n  lift(el) {\n    if (!el || this.lifted.includes(el)) return;\n    if (getComputedStyle(el).position === \"static\") {\n      el.dataset.tutLiftedStatic = \"true\";\n      el.style.position = \"relative\";\n    }\n    el.style.zIndex = \"1010\";\n    this.lifted.push(el);\n  }\n\n  clearLifted() {\n    this.lifted.forEach((el) => {\n      el.style.zIndex = \"\";\n      if (el.dataset.tutLiftedStatic) {\n        el.style.position = \"\";\n        delete el.dataset.tutLiftedStatic;\n      }\n    });\n    this.lifted = [];\n  }\n\n  // Point the floating highlight frame at an element (or hide it).\n  frameOn(el) {\n    this.ringEl = el;\n    this.positionFrame();\n  }\n\n  positionFrame() {\n    const frame = this.highlightFrameTarget;\n    if (!this.ringEl) {\n      frame.style.opacity = \"0\";\n      return;\n    }\n    const pad = 6;\n    const rect = this.ringEl.getBoundingClientRect();\n    frame.style.top = `${rect.top - pad}px`;\n    frame.style.left = `${rect.left - pad}px`;\n    frame.style.width = `${rect.width + pad * 2}px`;\n    frame.style.height = `${rect.height + pad * 2}px`;\n    frame.style.opacity = \"1\";\n  }\n\n  // --- map preview ----------------------------------------------------------\n\n  showMapPreview() {\n    if (!this.hasMapWrapperTarget) return;\n    const preview = this.mapPreviewTarget;\n    // Settle the preview in with a soft scale + fade rather than a hard pop.\n    preview.style.transition = \"none\";\n    preview.style.transformOrigin = \"center center\";\n    preview.style.transform = \"scale(0.92)\";\n    preview.style.opacity = \"0\";\n    this.mapWrapperTarget.style.display = \"flex\";\n    requestAnimationFrame(() => {\n      preview.style.transition =\n        \"transform 0.45s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.35s ease\";\n      preview.style.transform = \"scale(1)\";\n      preview.style.opacity = \"1\";\n    });\n  }\n\n  hideMapPreview() {\n    if (this.hasMapWrapperTarget) this.mapWrapperTarget.style.display = \"none\";\n  }\n\n  morphMap() {\n    const button = this.el(\"map-button\");\n    if (!button) {\n      this.index += 1;\n      return this.render();\n    }\n\n    this.busy = true;\n    this.lift(button);\n\n    const preview = this.mapPreviewTarget;\n    const from = preview.getBoundingClientRect();\n    const to = button.getBoundingClientRect();\n    const dx = to.left + to.width / 2 - (from.left + from.width / 2);\n    const dy = to.top + to.height / 2 - (from.top + from.height / 2);\n    // Nest the map inside the button silhouette as it lands.\n    const scale = Math.min(to.width / from.width, to.height / from.height);\n\n    let finished = false;\n    const done = () => {\n      if (finished) return;\n      finished = true;\n      this.hideMapPreview();\n      this.busy = false;\n      this.index += 1;\n      this.render();\n    };\n\n    // Travel on a decelerating curve and stay opaque most of the flight, only\n    // dissolving as it reaches the button \u2014 so the map reads as turning into\n    // the button rather than fading away in mid-air.\n    preview.style.transformOrigin = \"center center\";\n    preview.style.transition =\n      \"transform 0.6s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.24s ease 0.36s\";\n    requestAnimationFrame(() => {\n      preview.style.transform = `translate(${dx}px, ${dy}px) scale(${scale})`;\n      preview.style.opacity = \"0\";\n    });\n\n    // The button gives a little \"catch\" pulse just as the map arrives.\n    const catchTimer = setTimeout(\n      () => button.classList.add(\"play-tutorial-catch\"),\n      340,\n    );\n    const catchEnd = () => button.classList.remove(\"play-tutorial-catch\");\n    button.addEventListener(\"animationend\", catchEnd, { once: true });\n\n    const onEnd = (event) => {\n      if (event.propertyName !== \"transform\") return;\n      preview.removeEventListener(\"transitionend\", onEnd);\n      done();\n    };\n    preview.addEventListener(\"transitionend\", onEnd);\n    setTimeout(() => {\n      clearTimeout(catchTimer);\n      done();\n    }, 720);\n  }\n\n  // --- teardown -------------------------------------------------------------\n\n  async finish() {\n    if (this.finishing) return;\n    this.finishing = true;\n    this.clearLifted();\n    this.frameOn(null);\n    this.hideMapPreview();\n    if (this.hasBackdropTarget) this.backdropTarget.style.display = \"none\";\n    if (this.hasTooltipTarget) this.tooltipTarget.style.display = \"none\";\n    // Keep the transparent tap-catcher swallowing taps until we navigate, so a\n    // reflexive tap right after the last step can't hit the page underneath.\n    this.busy = true;\n    window.scrollTo({ top: 0, behavior: \"smooth\" });\n\n    // Persist the dismissal BEFORE navigating back, otherwise the play page can\n    // re-render before the flag is saved and bounce us back into the tutorial.\n    const token = document.querySelector('meta[name=\"csrf-token\"]')?.content;\n    try {\n      await fetch(this.dismissUrlValue, {\n        method: \"POST\",\n        headers: { \"X-CSRF-Token\": token || \"\", Accept: \"text/plain\" },\n        credentials: \"same-origin\",\n      });\n    } catch {\n      // Navigate anyway; a missed dismissal just shows the tutorial again.\n    }\n\n    // Return to the screen the tutorial was launched from.\n    if (this.hasReturnUrlValue && this.returnUrlValue) {\n      if (window.Turbo) {\n        window.Turbo.visit(this.returnUrlValue);\n      } else {\n        window.location.href = this.returnUrlValue;\n      }\n      return;\n    }\n\n    setTimeout(() => this.element.remove(), 800);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static values = {\n    remainingSeconds: Number,\n    totalSeconds: Number,\n  };\n\n  static targets = [\"bar\"];\n\n  connect() {\n    this.remaining = this.remainingSecondsValue;\n    this.total = this.totalSecondsValue;\n\n    this.update();\n    this.timer = setInterval(() => this.tick(), 1000);\n  }\n\n  disconnect() {\n    clearInterval(this.timer);\n  }\n\n  remainingSecondsValueChanged() {\n    this.remaining = this.remainingSecondsValue;\n    this.update();\n  }\n\n  totalSecondsValueChanged() {\n    this.total = this.totalSecondsValue;\n    this.update();\n  }\n\n  tick() {\n    this.remaining = Math.max(this.remaining - 1, 0);\n    this.update();\n  }\n\n  update() {\n    const elapsed = this.total - this.remaining;\n    const progress =\n      this.total > 0\n        ? Math.min(Math.max((elapsed / this.total) * 100, 0), 95)\n        : 0;\n\n    if (this.hasBarTarget) {\n      this.barTarget.style.width = `${progress}%`;\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"comment\"];\n  static values = { url: String };\n\n  connect() {\n    this.isSubmitting = false;\n    document.body.style.overflow = \"hidden\";\n    this.markAsChecked();\n  }\n\n  markAsChecked() {\n    fetch(this.urlValue, {\n      method: \"PUT\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"X-CSRF-Token\": this.csrfToken,\n        Accept: \"application/json\",\n      },\n      body: JSON.stringify({}),\n    }).catch(function () {});\n  }\n\n  disconnect() {\n    document.body.style.overflow = \"\";\n  }\n\n  get csrfToken() {\n    const meta = document.querySelector('meta[name=\"csrf-token\"]');\n    return meta ? meta.getAttribute(\"content\") : \"\";\n  }\n\n  close() {\n    if (this.isSubmitting) return;\n    this.isSubmitting = true;\n    document.body.style.overflow = \"\";\n\n    const comment = this.hasCommentTarget ? this.commentTarget.value : \"\";\n    const url = this.urlValue;\n    const overlay = this.element;\n\n    fetch(url, {\n      method: \"PUT\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"X-CSRF-Token\": this.csrfToken,\n        Accept: \"application/json\",\n      },\n      body: JSON.stringify({ user_comment: comment }),\n    })\n      .then(function (response) {\n        return response.json().catch(function () {\n          return null;\n        });\n      })\n      .then(function (data) {\n        overlay.remove();\n        if (data && data.redirect_to) {\n          window.location.href = data.redirect_to;\n        }\n      })\n      .catch(function () {\n        overlay.remove();\n      });\n  }\n\n  closeOnBackground(event) {\n    if (event.target === this.element) {\n      this.close();\n    }\n  }\n}\n", "const COLORS = [\n  \"#f84d3b\",\n  \"#ff6b4a\",\n  \"#f4a0a0\",\n  \"#fbbf24\",\n  \"#f97316\",\n  \"#e8d5b7\",\n  \"#ffffff\",\n];\n\nfunction spawnDot(\n  container,\n  w,\n  h,\n  { distance = [12, 18], shapes = [\"star\", \"circle\"] } = {},\n) {\n  const dot = document.createElement(\"div\");\n  const shape = shapes[Math.floor(Math.random() * shapes.length)];\n  const color = COLORS[Math.floor(Math.random() * COLORS.length)];\n  dot.className = `particle-dot is-${shape}`;\n  dot.style.color = color;\n\n  const isSymbol = shape !== \"circle\";\n  const size = isSymbol ? 8 + Math.random() * 10 : 4 + Math.random() * 5;\n  if (isSymbol) {\n    dot.style.setProperty(\"--size\", `${size}px`);\n  } else {\n    dot.style.width = `${size}px`;\n    dot.style.height = `${size}px`;\n    dot.style.background = color;\n  }\n\n  const angle = Math.random() * Math.PI * 2;\n  dot.style.left = `${w / 2 + Math.cos(angle) * (w / 2) - size / 2}px`;\n  dot.style.top = `${h / 2 + Math.sin(angle) * (h / 2) - size / 2}px`;\n\n  const d = distance[0] + Math.random() * distance[1];\n  dot.style.setProperty(\"--px\", `${Math.cos(angle) * d}px`);\n  dot.style.setProperty(\"--py\", `${Math.sin(angle) * d}px`);\n  dot.style.setProperty(\"--rot\", `${90 + Math.random() * 270}deg`);\n  dot.style.setProperty(\"--duration\", `${0.6 + Math.random() * 0.4}s`);\n\n  container.appendChild(dot);\n  setTimeout(() => dot.remove(), 1000);\n}\n\nfunction getOrCreateContainer(parent) {\n  let container = parent.querySelector(\".particle-container\");\n  if (!container) {\n    container = document.createElement(\"div\");\n    container.className = \"particle-container\";\n    parent.appendChild(container);\n  }\n  return container;\n}\n\n/**\n * Fire a one-time burst of particles from an element.\n * @param {HTMLElement} el - The element to burst from\n * @param {Object} opts\n * @param {number} opts.count - Number of particles (default 14)\n * @param {number} opts.stagger - Delay between each particle in ms (default 30)\n * @param {number[]} opts.distance - [min, range] for travel distance (default [16, 22])\n * @param {string[]} opts.shapes - particle shapes: \"star\", \"circle\", \"heart\" (default [\"star\", \"heart\"])\n */\nexport function burst(\n  el,\n  {\n    count = 14,\n    stagger = 30,\n    distance = [16, 22],\n    shapes = [\"star\", \"heart\"],\n  } = {},\n) {\n  el.style.position = \"relative\";\n  const container = getOrCreateContainer(el);\n  const w = el.offsetWidth;\n  const h = el.offsetHeight;\n\n  for (let i = 0; i < count; i++) {\n    setTimeout(\n      () => spawnDot(container, w, h, { distance, shapes }),\n      i * stagger,\n    );\n  }\n\n  setTimeout(() => container.remove(), count * stagger + 1200);\n}\n\n/**\n * Start continuous particles around an element. Returns a stop function.\n * @param {HTMLElement} button - The button element\n * @param {Object} opts\n * @param {number} opts.interval - Spawn interval in ms (default 200)\n * @param {number} opts.burstCount - Initial burst count (default 10)\n * @param {number} opts.burstStagger - Delay between burst particles (default 40)\n * @param {number[]} opts.distance - [min, range] for travel distance (default [12, 18])\n * @param {string[]} opts.shapes - particle shapes: \"star\", \"circle\", \"heart\" (default [\"star\", \"circle\"])\n */\nexport function continuous(\n  button,\n  {\n    interval = 200,\n    burstCount = 10,\n    burstStagger = 40,\n    distance = [12, 18],\n    shapes = [\"star\", \"circle\"],\n  } = {},\n) {\n  const wrapper = button.parentElement;\n  if (!wrapper) return () => {};\n\n  wrapper.style.position = \"relative\";\n  const container = getOrCreateContainer(wrapper);\n  const w = button.offsetWidth;\n  const h = button.offsetHeight;\n\n  const spawn = () => spawnDot(container, w, h, { distance, shapes });\n\n  // Initial burst\n  for (let i = 0; i < burstCount; i++) setTimeout(spawn, i * burstStagger);\n\n  const intervalId = setInterval(spawn, interval);\n\n  return function stop() {\n    clearInterval(intervalId);\n    setTimeout(() => container.remove(), 1200);\n  };\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { burst } from \"../source/particles\";\n\nexport default class extends Controller {\n  static values = {\n    delay: { type: Number, default: 200 },\n    count: { type: Number, default: 10 },\n  };\n\n  connect() {\n    this.timeout = setTimeout(\n      () => burst(this.element, { count: this.countValue }),\n      this.delayValue,\n    );\n  }\n\n  disconnect() {\n    clearTimeout(this.timeout);\n  }\n}\n", "import type { Options } from './types'\n\nexport function resolveUrl(url: string, baseUrl: string | null): string {\n  // url is absolute already\n  if (url.match(/^[a-z]+:\\/\\//i)) {\n    return url\n  }\n\n  // url is absolute already, without protocol\n  if (url.match(/^\\/\\//)) {\n    return window.location.protocol + url\n  }\n\n  // dataURI, mailto:, tel:, etc.\n  if (url.match(/^[a-z]+:/i)) {\n    return url\n  }\n\n  const doc = document.implementation.createHTMLDocument()\n  const base = doc.createElement('base')\n  const a = doc.createElement('a')\n\n  doc.head.appendChild(base)\n  doc.body.appendChild(a)\n\n  if (baseUrl) {\n    base.href = baseUrl\n  }\n\n  a.href = url\n\n  return a.href\n}\n\nexport const uuid = (() => {\n  // generate uuid for className of pseudo elements.\n  // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n  let counter = 0\n\n  // ref: http://stackoverflow.com/a/6248722/2519373\n  const random = () =>\n    // eslint-disable-next-line no-bitwise\n    `0000${((Math.random() * 36 ** 4) << 0).toString(36)}`.slice(-4)\n\n  return () => {\n    counter += 1\n    return `u${random()}${counter}`\n  }\n})()\n\nexport function delay<T>(ms: number) {\n  return (args: T) =>\n    new Promise<T>((resolve) => {\n      setTimeout(() => resolve(args), ms)\n    })\n}\n\nexport function toArray<T>(arrayLike: any): T[] {\n  const arr: T[] = []\n\n  for (let i = 0, l = arrayLike.length; i < l; i++) {\n    arr.push(arrayLike[i])\n  }\n\n  return arr\n}\n\nlet styleProps: string[] | null = null\nexport function getStyleProperties(options: Options = {}): string[] {\n  if (styleProps) {\n    return styleProps\n  }\n\n  if (options.includeStyleProperties) {\n    styleProps = options.includeStyleProperties\n    return styleProps\n  }\n\n  styleProps = toArray(window.getComputedStyle(document.documentElement))\n\n  return styleProps\n}\n\nfunction px(node: HTMLElement, styleProperty: string) {\n  const win = node.ownerDocument.defaultView || window\n  const val = win.getComputedStyle(node).getPropertyValue(styleProperty)\n  return val ? parseFloat(val.replace('px', '')) : 0\n}\n\nfunction getNodeWidth(node: HTMLElement) {\n  const leftBorder = px(node, 'border-left-width')\n  const rightBorder = px(node, 'border-right-width')\n  return node.clientWidth + leftBorder + rightBorder\n}\n\nfunction getNodeHeight(node: HTMLElement) {\n  const topBorder = px(node, 'border-top-width')\n  const bottomBorder = px(node, 'border-bottom-width')\n  return node.clientHeight + topBorder + bottomBorder\n}\n\nexport function getImageSize(targetNode: HTMLElement, options: Options = {}) {\n  const width = options.width || getNodeWidth(targetNode)\n  const height = options.height || getNodeHeight(targetNode)\n\n  return { width, height }\n}\n\nexport function getPixelRatio() {\n  let ratio\n\n  let FINAL_PROCESS\n  try {\n    FINAL_PROCESS = process\n  } catch (e) {\n    // pass\n  }\n\n  const val =\n    FINAL_PROCESS && FINAL_PROCESS.env\n      ? FINAL_PROCESS.env.devicePixelRatio\n      : null\n  if (val) {\n    ratio = parseInt(val, 10)\n    if (Number.isNaN(ratio)) {\n      ratio = 1\n    }\n  }\n  return ratio || window.devicePixelRatio || 1\n}\n\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nconst canvasDimensionLimit = 16384\n\nexport function checkCanvasDimensions(canvas: HTMLCanvasElement) {\n  if (\n    canvas.width > canvasDimensionLimit ||\n    canvas.height > canvasDimensionLimit\n  ) {\n    if (\n      canvas.width > canvasDimensionLimit &&\n      canvas.height > canvasDimensionLimit\n    ) {\n      if (canvas.width > canvas.height) {\n        canvas.height *= canvasDimensionLimit / canvas.width\n        canvas.width = canvasDimensionLimit\n      } else {\n        canvas.width *= canvasDimensionLimit / canvas.height\n        canvas.height = canvasDimensionLimit\n      }\n    } else if (canvas.width > canvasDimensionLimit) {\n      canvas.height *= canvasDimensionLimit / canvas.width\n      canvas.width = canvasDimensionLimit\n    } else {\n      canvas.width *= canvasDimensionLimit / canvas.height\n      canvas.height = canvasDimensionLimit\n    }\n  }\n}\n\nexport function canvasToBlob(\n  canvas: HTMLCanvasElement,\n  options: Options = {},\n): Promise<Blob | null> {\n  if (canvas.toBlob) {\n    return new Promise((resolve) => {\n      canvas.toBlob(\n        resolve,\n        options.type ? options.type : 'image/png',\n        options.quality ? options.quality : 1,\n      )\n    })\n  }\n\n  return new Promise((resolve) => {\n    const binaryString = window.atob(\n      canvas\n        .toDataURL(\n          options.type ? options.type : undefined,\n          options.quality ? options.quality : undefined,\n        )\n        .split(',')[1],\n    )\n    const len = binaryString.length\n    const binaryArray = new Uint8Array(len)\n\n    for (let i = 0; i < len; i += 1) {\n      binaryArray[i] = binaryString.charCodeAt(i)\n    }\n\n    resolve(\n      new Blob([binaryArray], {\n        type: options.type ? options.type : 'image/png',\n      }),\n    )\n  })\n}\n\nexport function createImage(url: string): Promise<HTMLImageElement> {\n  return new Promise((resolve, reject) => {\n    const img = new Image()\n    img.onload = () => {\n      img.decode().then(() => {\n        requestAnimationFrame(() => resolve(img))\n      })\n    }\n    img.onerror = reject\n    img.crossOrigin = 'anonymous'\n    img.decoding = 'async'\n    img.src = url\n  })\n}\n\nexport async function svgToDataURL(svg: SVGElement): Promise<string> {\n  return Promise.resolve()\n    .then(() => new XMLSerializer().serializeToString(svg))\n    .then(encodeURIComponent)\n    .then((html) => `data:image/svg+xml;charset=utf-8,${html}`)\n}\n\nexport async function nodeToDataURL(\n  node: HTMLElement,\n  width: number,\n  height: number,\n): Promise<string> {\n  const xmlns = 'http://www.w3.org/2000/svg'\n  const svg = document.createElementNS(xmlns, 'svg')\n  const foreignObject = document.createElementNS(xmlns, 'foreignObject')\n\n  svg.setAttribute('width', `${width}`)\n  svg.setAttribute('height', `${height}`)\n  svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n\n  foreignObject.setAttribute('width', '100%')\n  foreignObject.setAttribute('height', '100%')\n  foreignObject.setAttribute('x', '0')\n  foreignObject.setAttribute('y', '0')\n  foreignObject.setAttribute('externalResourcesRequired', 'true')\n\n  svg.appendChild(foreignObject)\n  foreignObject.appendChild(node)\n  return svgToDataURL(svg)\n}\n\nexport const isInstanceOfElement = <\n  T extends typeof Element | typeof HTMLElement | typeof SVGImageElement,\n>(\n  node: Element | HTMLElement | SVGImageElement,\n  instance: T,\n): node is T['prototype'] => {\n  if (node instanceof instance) return true\n\n  const nodePrototype = Object.getPrototypeOf(node)\n\n  if (nodePrototype === null) return false\n\n  return (\n    nodePrototype.constructor.name === instance.name ||\n    isInstanceOfElement(nodePrototype, instance)\n  )\n}\n", "import type { Options } from './types'\nimport { uuid, getStyleProperties } from './util'\n\ntype Pseudo = ':before' | ':after'\n\nfunction formatCSSText(style: CSSStyleDeclaration) {\n  const content = style.getPropertyValue('content')\n  return `${style.cssText} content: '${content.replace(/'|\"/g, '')}';`\n}\n\nfunction formatCSSProperties(style: CSSStyleDeclaration, options: Options) {\n  return getStyleProperties(options)\n    .map((name) => {\n      const value = style.getPropertyValue(name)\n      const priority = style.getPropertyPriority(name)\n\n      return `${name}: ${value}${priority ? ' !important' : ''};`\n    })\n    .join(' ')\n}\n\nfunction getPseudoElementStyle(\n  className: string,\n  pseudo: Pseudo,\n  style: CSSStyleDeclaration,\n  options: Options,\n): Text {\n  const selector = `.${className}:${pseudo}`\n  const cssText = style.cssText\n    ? formatCSSText(style)\n    : formatCSSProperties(style, options)\n\n  return document.createTextNode(`${selector}{${cssText}}`)\n}\n\nfunction clonePseudoElement<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  pseudo: Pseudo,\n  options: Options,\n) {\n  const style = window.getComputedStyle(nativeNode, pseudo)\n  const content = style.getPropertyValue('content')\n  if (content === '' || content === 'none') {\n    return\n  }\n\n  const className = uuid()\n  try {\n    clonedNode.className = `${clonedNode.className} ${className}`\n  } catch (err) {\n    return\n  }\n\n  const styleElement = document.createElement('style')\n  styleElement.appendChild(\n    getPseudoElementStyle(className, pseudo, style, options),\n  )\n  clonedNode.appendChild(styleElement)\n}\n\nexport function clonePseudoElements<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  options: Options,\n) {\n  clonePseudoElement(nativeNode, clonedNode, ':before', options)\n  clonePseudoElement(nativeNode, clonedNode, ':after', options)\n}\n", "const WOFF = 'application/font-woff'\nconst JPEG = 'image/jpeg'\nconst mimes: { [key: string]: string } = {\n  woff: WOFF,\n  woff2: WOFF,\n  ttf: 'application/font-truetype',\n  eot: 'application/vnd.ms-fontobject',\n  png: 'image/png',\n  jpg: JPEG,\n  jpeg: JPEG,\n  gif: 'image/gif',\n  tiff: 'image/tiff',\n  svg: 'image/svg+xml',\n  webp: 'image/webp',\n}\n\nfunction getExtension(url: string): string {\n  const match = /\\.([^./]*?)$/g.exec(url)\n  return match ? match[1] : ''\n}\n\nexport function getMimeType(url: string): string {\n  const extension = getExtension(url).toLowerCase()\n  return mimes[extension] || ''\n}\n", "import { Options } from './types'\n\nfunction getContentFromDataUrl(dataURL: string) {\n  return dataURL.split(/,/)[1]\n}\n\nexport function isDataUrl(url: string) {\n  return url.search(/^(data:)/) !== -1\n}\n\nexport function makeDataUrl(content: string, mimeType: string) {\n  return `data:${mimeType};base64,${content}`\n}\n\nexport async function fetchAsDataURL<T>(\n  url: string,\n  init: RequestInit | undefined,\n  process: (data: { result: string; res: Response }) => T,\n): Promise<T> {\n  const res = await fetch(url, init)\n  if (res.status === 404) {\n    throw new Error(`Resource \"${res.url}\" not found`)\n  }\n  const blob = await res.blob()\n  return new Promise<T>((resolve, reject) => {\n    const reader = new FileReader()\n    reader.onerror = reject\n    reader.onloadend = () => {\n      try {\n        resolve(process({ res, result: reader.result as string }))\n      } catch (error) {\n        reject(error)\n      }\n    }\n\n    reader.readAsDataURL(blob)\n  })\n}\n\nconst cache: { [url: string]: string } = {}\n\nfunction getCacheKey(\n  url: string,\n  contentType: string | undefined,\n  includeQueryParams: boolean | undefined,\n) {\n  let key = url.replace(/\\?.*/, '')\n\n  if (includeQueryParams) {\n    key = url\n  }\n\n  // font resource\n  if (/ttf|otf|eot|woff2?/i.test(key)) {\n    key = key.replace(/.*\\//, '')\n  }\n\n  return contentType ? `[${contentType}]${key}` : key\n}\n\nexport async function resourceToDataURL(\n  resourceUrl: string,\n  contentType: string | undefined,\n  options: Options,\n) {\n  const cacheKey = getCacheKey(\n    resourceUrl,\n    contentType,\n    options.includeQueryParams,\n  )\n\n  if (cache[cacheKey] != null) {\n    return cache[cacheKey]\n  }\n\n  // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n  if (options.cacheBust) {\n    // eslint-disable-next-line no-param-reassign\n    resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime()\n  }\n\n  let dataURL: string\n  try {\n    const content = await fetchAsDataURL(\n      resourceUrl,\n      options.fetchRequestInit,\n      ({ res, result }) => {\n        if (!contentType) {\n          // eslint-disable-next-line no-param-reassign\n          contentType = res.headers.get('Content-Type') || ''\n        }\n        return getContentFromDataUrl(result)\n      },\n    )\n    dataURL = makeDataUrl(content, contentType!)\n  } catch (error) {\n    dataURL = options.imagePlaceholder || ''\n\n    let msg = `Failed to fetch resource: ${resourceUrl}`\n    if (error) {\n      msg = typeof error === 'string' ? error : error.message\n    }\n\n    if (msg) {\n      console.warn(msg)\n    }\n  }\n\n  cache[cacheKey] = dataURL\n  return dataURL\n}\n", "import type { Options } from './types'\nimport { clonePseudoElements } from './clone-pseudos'\nimport {\n  createImage,\n  toArray,\n  isInstanceOfElement,\n  getStyleProperties,\n} from './util'\nimport { getMimeType } from './mimes'\nimport { resourceToDataURL } from './dataurl'\n\nasync function cloneCanvasElement(canvas: HTMLCanvasElement) {\n  const dataURL = canvas.toDataURL()\n  if (dataURL === 'data:,') {\n    return canvas.cloneNode(false) as HTMLCanvasElement\n  }\n  return createImage(dataURL)\n}\n\nasync function cloneVideoElement(video: HTMLVideoElement, options: Options) {\n  if (video.currentSrc) {\n    const canvas = document.createElement('canvas')\n    const ctx = canvas.getContext('2d')\n    canvas.width = video.clientWidth\n    canvas.height = video.clientHeight\n    ctx?.drawImage(video, 0, 0, canvas.width, canvas.height)\n    const dataURL = canvas.toDataURL()\n    return createImage(dataURL)\n  }\n\n  const poster = video.poster\n  const contentType = getMimeType(poster)\n  const dataURL = await resourceToDataURL(poster, contentType, options)\n  return createImage(dataURL)\n}\n\nasync function cloneIFrameElement(iframe: HTMLIFrameElement, options: Options) {\n  try {\n    if (iframe?.contentDocument?.body) {\n      return (await cloneNode(\n        iframe.contentDocument.body,\n        options,\n        true,\n      )) as HTMLBodyElement\n    }\n  } catch {\n    // Failed to clone iframe\n  }\n\n  return iframe.cloneNode(false) as HTMLIFrameElement\n}\n\nasync function cloneSingleNode<T extends HTMLElement>(\n  node: T,\n  options: Options,\n): Promise<HTMLElement> {\n  if (isInstanceOfElement(node, HTMLCanvasElement)) {\n    return cloneCanvasElement(node)\n  }\n\n  if (isInstanceOfElement(node, HTMLVideoElement)) {\n    return cloneVideoElement(node, options)\n  }\n\n  if (isInstanceOfElement(node, HTMLIFrameElement)) {\n    return cloneIFrameElement(node, options)\n  }\n\n  return node.cloneNode(isSVGElement(node)) as T\n}\n\nconst isSlotElement = (node: HTMLElement): node is HTMLSlotElement =>\n  node.tagName != null && node.tagName.toUpperCase() === 'SLOT'\n\nconst isSVGElement = (node: HTMLElement): node is HTMLSlotElement =>\n  node.tagName != null && node.tagName.toUpperCase() === 'SVG'\n\nasync function cloneChildren<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  options: Options,\n): Promise<T> {\n  if (isSVGElement(clonedNode)) {\n    return clonedNode\n  }\n\n  let children: T[] = []\n\n  if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n    children = toArray<T>(nativeNode.assignedNodes())\n  } else if (\n    isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n    nativeNode.contentDocument?.body\n  ) {\n    children = toArray<T>(nativeNode.contentDocument.body.childNodes)\n  } else {\n    children = toArray<T>((nativeNode.shadowRoot ?? nativeNode).childNodes)\n  }\n\n  if (\n    children.length === 0 ||\n    isInstanceOfElement(nativeNode, HTMLVideoElement)\n  ) {\n    return clonedNode\n  }\n\n  await children.reduce(\n    (deferred, child) =>\n      deferred\n        .then(() => cloneNode(child, options))\n        .then((clonedChild: HTMLElement | null) => {\n          if (clonedChild) {\n            clonedNode.appendChild(clonedChild)\n          }\n        }),\n    Promise.resolve(),\n  )\n\n  return clonedNode\n}\n\nfunction cloneCSSStyle<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  options: Options,\n) {\n  const targetStyle = clonedNode.style\n  if (!targetStyle) {\n    return\n  }\n\n  const sourceStyle = window.getComputedStyle(nativeNode)\n  if (sourceStyle.cssText) {\n    targetStyle.cssText = sourceStyle.cssText\n    targetStyle.transformOrigin = sourceStyle.transformOrigin\n  } else {\n    getStyleProperties(options).forEach((name) => {\n      let value = sourceStyle.getPropertyValue(name)\n      if (name === 'font-size' && value.endsWith('px')) {\n        const reducedFont =\n          Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1\n        value = `${reducedFont}px`\n      }\n\n      if (\n        isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n        name === 'display' &&\n        value === 'inline'\n      ) {\n        value = 'block'\n      }\n\n      if (name === 'd' && clonedNode.getAttribute('d')) {\n        value = `path(${clonedNode.getAttribute('d')})`\n      }\n\n      targetStyle.setProperty(\n        name,\n        value,\n        sourceStyle.getPropertyPriority(name),\n      )\n    })\n  }\n}\n\nfunction cloneInputValue<T extends HTMLElement>(nativeNode: T, clonedNode: T) {\n  if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {\n    clonedNode.innerHTML = nativeNode.value\n  }\n\n  if (isInstanceOfElement(nativeNode, HTMLInputElement)) {\n    clonedNode.setAttribute('value', nativeNode.value)\n  }\n}\n\nfunction cloneSelectValue<T extends HTMLElement>(nativeNode: T, clonedNode: T) {\n  if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {\n    const clonedSelect = clonedNode as any as HTMLSelectElement\n    const selectedOption = Array.from(clonedSelect.children).find(\n      (child) => nativeNode.value === child.getAttribute('value'),\n    )\n\n    if (selectedOption) {\n      selectedOption.setAttribute('selected', '')\n    }\n  }\n}\n\nfunction decorate<T extends HTMLElement>(\n  nativeNode: T,\n  clonedNode: T,\n  options: Options,\n): T {\n  if (isInstanceOfElement(clonedNode, Element)) {\n    cloneCSSStyle(nativeNode, clonedNode, options)\n    clonePseudoElements(nativeNode, clonedNode, options)\n    cloneInputValue(nativeNode, clonedNode)\n    cloneSelectValue(nativeNode, clonedNode)\n  }\n\n  return clonedNode\n}\n\nasync function ensureSVGSymbols<T extends HTMLElement>(\n  clone: T,\n  options: Options,\n) {\n  const uses = clone.querySelectorAll ? clone.querySelectorAll('use') : []\n  if (uses.length === 0) {\n    return clone\n  }\n\n  const processedDefs: { [key: string]: HTMLElement } = {}\n  for (let i = 0; i < uses.length; i++) {\n    const use = uses[i]\n    const id = use.getAttribute('xlink:href')\n    if (id) {\n      const exist = clone.querySelector(id)\n      const definition = document.querySelector(id) as HTMLElement\n      if (!exist && definition && !processedDefs[id]) {\n        // eslint-disable-next-line no-await-in-loop\n        processedDefs[id] = (await cloneNode(definition, options, true))!\n      }\n    }\n  }\n\n  const nodes = Object.values(processedDefs)\n  if (nodes.length) {\n    const ns = 'http://www.w3.org/1999/xhtml'\n    const svg = document.createElementNS(ns, 'svg')\n    svg.setAttribute('xmlns', ns)\n    svg.style.position = 'absolute'\n    svg.style.width = '0'\n    svg.style.height = '0'\n    svg.style.overflow = 'hidden'\n    svg.style.display = 'none'\n\n    const defs = document.createElementNS(ns, 'defs')\n    svg.appendChild(defs)\n\n    for (let i = 0; i < nodes.length; i++) {\n      defs.appendChild(nodes[i])\n    }\n\n    clone.appendChild(svg)\n  }\n\n  return clone\n}\n\nexport async function cloneNode<T extends HTMLElement>(\n  node: T,\n  options: Options,\n  isRoot?: boolean,\n): Promise<T | null> {\n  if (!isRoot && options.filter && !options.filter(node)) {\n    return null\n  }\n\n  return Promise.resolve(node)\n    .then((clonedNode) => cloneSingleNode(clonedNode, options) as Promise<T>)\n    .then((clonedNode) => cloneChildren(node, clonedNode, options))\n    .then((clonedNode) => decorate(node, clonedNode, options))\n    .then((clonedNode) => ensureSVGSymbols(clonedNode, options))\n}\n", "import { Options } from './types'\nimport { resolveUrl } from './util'\nimport { getMimeType } from './mimes'\nimport { isDataUrl, makeDataUrl, resourceToDataURL } from './dataurl'\n\nconst URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g\nconst URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g\nconst FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g\n\nfunction toRegex(url: string): RegExp {\n  // eslint-disable-next-line no-useless-escape\n  const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1')\n  return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, 'g')\n}\n\nexport function parseURLs(cssText: string): string[] {\n  const urls: string[] = []\n\n  cssText.replace(URL_REGEX, (raw, quotation, url) => {\n    urls.push(url)\n    return raw\n  })\n\n  return urls.filter((url) => !isDataUrl(url))\n}\n\nexport async function embed(\n  cssText: string,\n  resourceURL: string,\n  baseURL: string | null,\n  options: Options,\n  getContentFromUrl?: (url: string) => Promise<string>,\n): Promise<string> {\n  try {\n    const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL\n    const contentType = getMimeType(resourceURL)\n    let dataURL: string\n    if (getContentFromUrl) {\n      const content = await getContentFromUrl(resolvedURL)\n      dataURL = makeDataUrl(content, contentType)\n    } else {\n      dataURL = await resourceToDataURL(resolvedURL, contentType, options)\n    }\n    return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`)\n  } catch (error) {\n    // pass\n  }\n  return cssText\n}\n\nfunction filterPreferredFontFormat(\n  str: string,\n  { preferredFontFormat }: Options,\n): string {\n  return !preferredFontFormat\n    ? str\n    : str.replace(FONT_SRC_REGEX, (match: string) => {\n        // eslint-disable-next-line no-constant-condition\n        while (true) {\n          const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || []\n          if (!format) {\n            return ''\n          }\n\n          if (format === preferredFontFormat) {\n            return `src: ${src};`\n          }\n        }\n      })\n}\n\nexport function shouldEmbed(url: string): boolean {\n  return url.search(URL_REGEX) !== -1\n}\n\nexport async function embedResources(\n  cssText: string,\n  baseUrl: string | null,\n  options: Options,\n): Promise<string> {\n  if (!shouldEmbed(cssText)) {\n    return cssText\n  }\n\n  const filteredCSSText = filterPreferredFontFormat(cssText, options)\n  const urls = parseURLs(filteredCSSText)\n  return urls.reduce(\n    (deferred, url) =>\n      deferred.then((css) => embed(css, url, baseUrl, options)),\n    Promise.resolve(filteredCSSText),\n  )\n}\n", "import { Options } from './types'\nimport { embedResources } from './embed-resources'\nimport { toArray, isInstanceOfElement } from './util'\nimport { isDataUrl, resourceToDataURL } from './dataurl'\nimport { getMimeType } from './mimes'\n\nasync function embedProp(\n  propName: string,\n  node: HTMLElement,\n  options: Options,\n) {\n  const propValue = node.style?.getPropertyValue(propName)\n  if (propValue) {\n    const cssString = await embedResources(propValue, null, options)\n    node.style.setProperty(\n      propName,\n      cssString,\n      node.style.getPropertyPriority(propName),\n    )\n    return true\n  }\n  return false\n}\n\nasync function embedBackground<T extends HTMLElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  ;(await embedProp('background', clonedNode, options)) ||\n    (await embedProp('background-image', clonedNode, options))\n  ;(await embedProp('mask', clonedNode, options)) ||\n    (await embedProp('-webkit-mask', clonedNode, options)) ||\n    (await embedProp('mask-image', clonedNode, options)) ||\n    (await embedProp('-webkit-mask-image', clonedNode, options))\n}\n\nasync function embedImageNode<T extends HTMLElement | SVGImageElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement)\n\n  if (\n    !(isImageElement && !isDataUrl(clonedNode.src)) &&\n    !(\n      isInstanceOfElement(clonedNode, SVGImageElement) &&\n      !isDataUrl(clonedNode.href.baseVal)\n    )\n  ) {\n    return\n  }\n\n  const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal\n\n  const dataURL = await resourceToDataURL(url, getMimeType(url), options)\n  await new Promise((resolve, reject) => {\n    clonedNode.onload = resolve\n    clonedNode.onerror = options.onImageErrorHandler\n      ? (...attributes) => {\n          try {\n            resolve(options.onImageErrorHandler!(...attributes))\n          } catch (error) {\n            reject(error)\n          }\n        }\n      : reject\n\n    const image = clonedNode as HTMLImageElement\n    if (image.decode) {\n      image.decode = resolve as any\n    }\n\n    if (image.loading === 'lazy') {\n      image.loading = 'eager'\n    }\n\n    if (isImageElement) {\n      clonedNode.srcset = ''\n      clonedNode.src = dataURL\n    } else {\n      clonedNode.href.baseVal = dataURL\n    }\n  })\n}\n\nasync function embedChildren<T extends HTMLElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  const children = toArray<HTMLElement>(clonedNode.childNodes)\n  const deferreds = children.map((child) => embedImages(child, options))\n  await Promise.all(deferreds).then(() => clonedNode)\n}\n\nexport async function embedImages<T extends HTMLElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  if (isInstanceOfElement(clonedNode, Element)) {\n    await embedBackground(clonedNode, options)\n    await embedImageNode(clonedNode, options)\n    await embedChildren(clonedNode, options)\n  }\n}\n", "import type { Options } from './types'\n\nexport function applyStyle<T extends HTMLElement>(\n  node: T,\n  options: Options,\n): T {\n  const { style } = node\n\n  if (options.backgroundColor) {\n    style.backgroundColor = options.backgroundColor\n  }\n\n  if (options.width) {\n    style.width = `${options.width}px`\n  }\n\n  if (options.height) {\n    style.height = `${options.height}px`\n  }\n\n  const manual = options.style\n  if (manual != null) {\n    Object.keys(manual).forEach((key: any) => {\n      style[key] = manual[key] as string\n    })\n  }\n\n  return node\n}\n", "import type { Options } from './types'\nimport { toArray } from './util'\nimport { fetchAsDataURL } from './dataurl'\nimport { shouldEmbed, embedResources } from './embed-resources'\n\ninterface Metadata {\n  url: string\n  cssText: string\n}\n\nconst cssFetchCache: { [href: string]: Metadata } = {}\n\nasync function fetchCSS(url: string) {\n  let cache = cssFetchCache[url]\n  if (cache != null) {\n    return cache\n  }\n\n  const res = await fetch(url)\n  const cssText = await res.text()\n  cache = { url, cssText }\n\n  cssFetchCache[url] = cache\n\n  return cache\n}\n\nasync function embedFonts(data: Metadata, options: Options): Promise<string> {\n  let cssText = data.cssText\n  const regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g\n  const fontLocs = cssText.match(/url\\([^)]+\\)/g) || []\n  const loadFonts = fontLocs.map(async (loc: string) => {\n    let url = loc.replace(regexUrl, '$1')\n    if (!url.startsWith('https://')) {\n      url = new URL(url, data.url).href\n    }\n\n    return fetchAsDataURL<[string, string]>(\n      url,\n      options.fetchRequestInit,\n      ({ result }) => {\n        cssText = cssText.replace(loc, `url(${result})`)\n        return [loc, result]\n      },\n    )\n  })\n\n  return Promise.all(loadFonts).then(() => cssText)\n}\n\nfunction parseCSS(source: string) {\n  if (source == null) {\n    return []\n  }\n\n  const result: string[] = []\n  const commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi\n  // strip out comments\n  let cssText = source.replace(commentsRegex, '')\n\n  // eslint-disable-next-line prefer-regex-literals\n  const keyframesRegex = new RegExp(\n    '((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})',\n    'gi',\n  )\n\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    const matches = keyframesRegex.exec(cssText)\n    if (matches === null) {\n      break\n    }\n    result.push(matches[0])\n  }\n  cssText = cssText.replace(keyframesRegex, '')\n\n  const importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi\n  // to match css & media queries together\n  const combinedCSSRegex =\n    '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n    '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})'\n  // unified regex\n  const unifiedRegex = new RegExp(combinedCSSRegex, 'gi')\n\n  // eslint-disable-next-line no-constant-condition\n  while (true) {\n    let matches = importRegex.exec(cssText)\n    if (matches === null) {\n      matches = unifiedRegex.exec(cssText)\n      if (matches === null) {\n        break\n      } else {\n        importRegex.lastIndex = unifiedRegex.lastIndex\n      }\n    } else {\n      unifiedRegex.lastIndex = importRegex.lastIndex\n    }\n    result.push(matches[0])\n  }\n\n  return result\n}\n\nasync function getCSSRules(\n  styleSheets: CSSStyleSheet[],\n  options: Options,\n): Promise<CSSStyleRule[]> {\n  const ret: CSSStyleRule[] = []\n  const deferreds: Promise<number | void>[] = []\n\n  // First loop inlines imports\n  styleSheets.forEach((sheet) => {\n    if ('cssRules' in sheet) {\n      try {\n        toArray<CSSRule>(sheet.cssRules || []).forEach((item, index) => {\n          if (item.type === CSSRule.IMPORT_RULE) {\n            let importIndex = index + 1\n            const url = (item as CSSImportRule).href\n            const deferred = fetchCSS(url)\n              .then((metadata) => embedFonts(metadata, options))\n              .then((cssText) =>\n                parseCSS(cssText).forEach((rule) => {\n                  try {\n                    sheet.insertRule(\n                      rule,\n                      rule.startsWith('@import')\n                        ? (importIndex += 1)\n                        : sheet.cssRules.length,\n                    )\n                  } catch (error) {\n                    console.error('Error inserting rule from remote css', {\n                      rule,\n                      error,\n                    })\n                  }\n                }),\n              )\n              .catch((e) => {\n                console.error('Error loading remote css', e.toString())\n              })\n\n            deferreds.push(deferred)\n          }\n        })\n      } catch (e) {\n        const inline =\n          styleSheets.find((a) => a.href == null) || document.styleSheets[0]\n        if (sheet.href != null) {\n          deferreds.push(\n            fetchCSS(sheet.href)\n              .then((metadata) => embedFonts(metadata, options))\n              .then((cssText) =>\n                parseCSS(cssText).forEach((rule) => {\n                  inline.insertRule(rule, inline.cssRules.length)\n                }),\n              )\n              .catch((err: unknown) => {\n                console.error('Error loading remote stylesheet', err)\n              }),\n          )\n        }\n        console.error('Error inlining remote css file', e)\n      }\n    }\n  })\n\n  return Promise.all(deferreds).then(() => {\n    // Second loop parses rules\n    styleSheets.forEach((sheet) => {\n      if ('cssRules' in sheet) {\n        try {\n          toArray<CSSStyleRule>(sheet.cssRules || []).forEach((item) => {\n            ret.push(item)\n          })\n        } catch (e) {\n          console.error(`Error while reading CSS rules from ${sheet.href}`, e)\n        }\n      }\n    })\n\n    return ret\n  })\n}\n\nfunction getWebFontRules(cssRules: CSSStyleRule[]): CSSStyleRule[] {\n  return cssRules\n    .filter((rule) => rule.type === CSSRule.FONT_FACE_RULE)\n    .filter((rule) => shouldEmbed(rule.style.getPropertyValue('src')))\n}\n\nasync function parseWebFontRules<T extends HTMLElement>(\n  node: T,\n  options: Options,\n) {\n  if (node.ownerDocument == null) {\n    throw new Error('Provided element is not within a Document')\n  }\n\n  const styleSheets = toArray<CSSStyleSheet>(node.ownerDocument.styleSheets)\n  const cssRules = await getCSSRules(styleSheets, options)\n\n  return getWebFontRules(cssRules)\n}\n\nfunction normalizeFontFamily(font: string) {\n  return font.trim().replace(/[\"']/g, '')\n}\n\nfunction getUsedFonts(node: HTMLElement) {\n  const fonts = new Set<string>()\n  function traverse(node: HTMLElement) {\n    const fontFamily =\n      node.style.fontFamily || getComputedStyle(node).fontFamily\n    fontFamily.split(',').forEach((font) => {\n      fonts.add(normalizeFontFamily(font))\n    })\n\n    Array.from(node.children).forEach((child) => {\n      if (child instanceof HTMLElement) {\n        traverse(child)\n      }\n    })\n  }\n  traverse(node)\n  return fonts\n}\n\nexport async function getWebFontCSS<T extends HTMLElement>(\n  node: T,\n  options: Options,\n): Promise<string> {\n  const rules = await parseWebFontRules(node, options)\n  const usedFonts = getUsedFonts(node)\n  const cssTexts = await Promise.all(\n    rules\n      .filter((rule) =>\n        usedFonts.has(normalizeFontFamily(rule.style.fontFamily)),\n      )\n      .map((rule) => {\n        const baseUrl = rule.parentStyleSheet\n          ? rule.parentStyleSheet.href\n          : null\n        return embedResources(rule.cssText, baseUrl, options)\n      }),\n  )\n\n  return cssTexts.join('\\n')\n}\n\nexport async function embedWebFonts<T extends HTMLElement>(\n  clonedNode: T,\n  options: Options,\n) {\n  const cssText =\n    options.fontEmbedCSS != null\n      ? options.fontEmbedCSS\n      : options.skipFonts\n      ? null\n      : await getWebFontCSS(clonedNode, options)\n\n  if (cssText) {\n    const styleNode = document.createElement('style')\n    const sytleContent = document.createTextNode(cssText)\n\n    styleNode.appendChild(sytleContent)\n\n    if (clonedNode.firstChild) {\n      clonedNode.insertBefore(styleNode, clonedNode.firstChild)\n    } else {\n      clonedNode.appendChild(styleNode)\n    }\n  }\n}\n", "import { Options } from './types'\nimport { cloneNode } from './clone-node'\nimport { embedImages } from './embed-images'\nimport { applyStyle } from './apply-style'\nimport { embedWebFonts, getWebFontCSS } from './embed-webfonts'\nimport {\n  getImageSize,\n  getPixelRatio,\n  createImage,\n  canvasToBlob,\n  nodeToDataURL,\n  checkCanvasDimensions,\n} from './util'\n\nexport async function toSvg<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<string> {\n  const { width, height } = getImageSize(node, options)\n  const clonedNode = (await cloneNode(node, options, true)) as HTMLElement\n  await embedWebFonts(clonedNode, options)\n  await embedImages(clonedNode, options)\n  applyStyle(clonedNode, options)\n  const datauri = await nodeToDataURL(clonedNode, width, height)\n  return datauri\n}\n\nexport async function toCanvas<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<HTMLCanvasElement> {\n  const { width, height } = getImageSize(node, options)\n  const svg = await toSvg(node, options)\n  const img = await createImage(svg)\n\n  const canvas = document.createElement('canvas')\n  const context = canvas.getContext('2d')!\n  const ratio = options.pixelRatio || getPixelRatio()\n  const canvasWidth = options.canvasWidth || width\n  const canvasHeight = options.canvasHeight || height\n\n  canvas.width = canvasWidth * ratio\n  canvas.height = canvasHeight * ratio\n\n  if (!options.skipAutoScale) {\n    checkCanvasDimensions(canvas)\n  }\n  canvas.style.width = `${canvasWidth}`\n  canvas.style.height = `${canvasHeight}`\n\n  if (options.backgroundColor) {\n    context.fillStyle = options.backgroundColor\n    context.fillRect(0, 0, canvas.width, canvas.height)\n  }\n\n  context.drawImage(img, 0, 0, canvas.width, canvas.height)\n\n  return canvas\n}\n\nexport async function toPixelData<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<Uint8ClampedArray> {\n  const { width, height } = getImageSize(node, options)\n  const canvas = await toCanvas(node, options)\n  const ctx = canvas.getContext('2d')!\n  return ctx.getImageData(0, 0, width, height).data\n}\n\nexport async function toPng<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<string> {\n  const canvas = await toCanvas(node, options)\n  return canvas.toDataURL()\n}\n\nexport async function toJpeg<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<string> {\n  const canvas = await toCanvas(node, options)\n  return canvas.toDataURL('image/jpeg', options.quality || 1)\n}\n\nexport async function toBlob<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<Blob | null> {\n  const canvas = await toCanvas(node, options)\n  const blob = await canvasToBlob(canvas)\n  return blob\n}\n\nexport async function getFontEmbedCSS<T extends HTMLElement>(\n  node: T,\n  options: Options = {},\n): Promise<string> {\n  return getWebFontCSS(node, options)\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { toPng } from \"html-to-image\";\n\n// Connects to data-controller=\"share-scorecard\"\n//\n// Buttons name the scorecard they want with data-share-scorecard-view-param\n// (\"teams\" or \"players\"); each view has its own off-screen Turbo Frame, so\n// switching tabs never re-renders one that is already loaded.\nexport default class extends Controller {\n  static targets = [\"frame\"];\n  static values = { frameUrl: String };\n\n  // Customer-facing highlights: offer the OS share sheet, fall back to a file.\n  async share({ params }) {\n    await this.withScorecard(params.view, async (blob, view) => {\n      if (await this.shareFile(blob, view)) return;\n\n      this.downloadFile(blob, view);\n    });\n  }\n\n  // Admin result tables: save the image straight to disk, no share sheet.\n  async download({ params }) {\n    await this.withScorecard(params.view, (blob, view) =>\n      this.downloadFile(blob, view),\n    );\n  }\n\n  async withScorecard(view, handler) {\n    if (this.busy) return;\n    this.busy = true;\n\n    try {\n      const blob = await this.renderScorecard(view);\n      if (blob) await handler(blob, view);\n    } catch (error) {\n      if (error.name !== \"AbortError\") {\n        console.error(\"Scorecard export failed:\", error);\n      }\n    } finally {\n      this.busy = false;\n    }\n  }\n\n  async renderScorecard(view) {\n    const node = await this.loadScorecard(view);\n    if (!node) {\n      console.error(\"Scorecard export failed: frame is empty\", view);\n      return null;\n    }\n\n    // Force layout to settle and read explicit dimensions. Required because\n    // html-to-image otherwise reads node.offsetWidth/Height which can be 0\n    // right after a Turbo Frame load if the browser hasn't laid out yet.\n    const rect = node.getBoundingClientRect();\n    const width = Math.ceil(rect.width) || node.offsetWidth || 430;\n    const height = Math.ceil(rect.height) || node.offsetHeight;\n    if (!height) {\n      console.error(\"Scorecard export failed: no height\", node);\n      return null;\n    }\n\n    const dataUrl = await toPng(node, {\n      pixelRatio: 2,\n      skipFonts: true,\n      width,\n      height,\n      cacheBust: false,\n    });\n\n    return (await fetch(dataUrl)).blob();\n  }\n\n  // Lazy-loads the requested scorecard into its Turbo Frame on first click and\n  // returns the rendered node. Rejects instead of hanging when the frame\n  // request fails - without that the promise never settles and the button\n  // silently does nothing on every later click too.\n  async loadScorecard(view) {\n    const frame = this.frameForView(view);\n    if (!frame) throw new Error(`No scorecard frame for view \"${view}\"`);\n\n    if (!frame.firstElementChild) {\n      const loaded = new Promise((resolve, reject) => {\n        const events = [\n          \"turbo:frame-load\",\n          \"turbo:frame-missing\",\n          \"turbo:fetch-request-error\",\n        ];\n        const finish = (event) => {\n          events.forEach((name) => frame.removeEventListener(name, finish));\n          clearTimeout(timeout);\n          // This frame owns its failures: keep a miss from bubbling to the\n          // global turbo:frame-missing handler, which would navigate the whole\n          // page to the response the button only wanted to rasterize, and\n          // from Turbo's default, which throws an uncaught error.\n          if (event.type === \"turbo:frame-missing\") {\n            event.preventDefault();\n            event.stopPropagation();\n          }\n          if (event.type === \"turbo:frame-load\") resolve();\n          else reject(new Error(`Scorecard frame failed: ${event.type}`));\n        };\n        const timeout = setTimeout(() => {\n          finish({ type: \"timeout\" });\n        }, 15000);\n        events.forEach((name) =>\n          frame.addEventListener(name, finish, { once: true }),\n        );\n      });\n      frame.src = this.scorecardUrl(view);\n      await loaded;\n    }\n\n    return frame.firstElementChild;\n  }\n\n  frameForView(view) {\n    if (!view) return this.frameTargets[0];\n\n    return this.frameTargets.find((frame) => frame.dataset.view === view);\n  }\n\n  scorecardUrl(view) {\n    const url = new URL(this.frameUrlValue, window.location.href);\n    if (view) url.searchParams.set(\"view\", view);\n\n    return url.pathname + url.search;\n  }\n\n  // Returns true when the image was handed to the OS share sheet (or the user\n  // dismissed it). navigator.share needs transient user activation, which the\n  // frame fetch plus rasterization above can outlive, so a rejection here is\n  // not fatal - the caller falls back to a plain download.\n  async shareFile(blob, view) {\n    const file = new File([blob], this.filename(view), { type: \"image/png\" });\n    if (!navigator.canShare || !navigator.canShare({ files: [file] })) {\n      return false;\n    }\n\n    try {\n      await navigator.share({ files: [file] });\n      return true;\n    } catch (error) {\n      return error.name === \"AbortError\";\n    }\n  }\n\n  // Object URL rather than the data URL: Chrome caps data: URL downloads by\n  // size, and the anchor must be in the document or Firefox ignores click().\n  downloadFile(blob, view) {\n    const url = URL.createObjectURL(blob);\n    const link = document.createElement(\"a\");\n    link.href = url;\n    link.download = this.filename(view);\n    document.body.appendChild(link);\n    link.click();\n    link.remove();\n    setTimeout(() => URL.revokeObjectURL(url), 0);\n  }\n\n  filename(view) {\n    return view ? `scorecard-${view}.png` : \"scorecard.png\";\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Prevents double-submits on a native (non-Turbo) form and shows a spinner\n// in the submit button while the request is in flight, so the tap gets\n// immediate feedback during the full page POST.\nexport default class extends Controller {\n  static targets = [\"button\", \"spinner\"];\n\n  connect() {\n    // Reset state in case the page is restored from the browser cache with\n    // the button still in its \"submitting\" appearance.\n    this.submitting = false;\n    if (this.hasSpinnerTarget) this.spinnerTarget.classList.add(\"hidden\");\n    if (this.hasButtonTarget) {\n      this.buttonTarget.classList.remove(\"pointer-events-none\", \"opacity-80\");\n    }\n  }\n\n  // The submit event only fires once native validation passes, so an\n  // incomplete form never triggers the locked state.\n  lock(event) {\n    if (this.submitting) {\n      event.preventDefault();\n      return;\n    }\n    this.submitting = true;\n\n    if (this.hasButtonTarget) {\n      this.buttonTarget.classList.add(\"pointer-events-none\", \"opacity-80\");\n    }\n    if (this.hasSpinnerTarget) this.spinnerTarget.classList.remove(\"hidden\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"btn\", \"tab\"];\n  static values = {\n    defaultTab: String,\n    activeClass: String,\n    inactiveClass: String,\n    storageKey: String,\n  };\n  currentTab = null;\n\n  connect() {\n    this.hideAllTabs();\n\n    try {\n      const name = this.restoreTabName() || this.defaultTabValue;\n      const selectedBtn =\n        this.findButtonByName(name) ||\n        this.findButtonByName(this.defaultTabValue);\n      const selectedTab =\n        this.findTabByName(name) || this.findTabByName(this.defaultTabValue);\n\n      this.showTab(selectedTab, selectedBtn);\n      this.currentTab = selectedTab;\n    } catch (error) {\n      console.error(\"Error selecting default tab:\", error);\n    }\n\n    // A morphing page refresh (the lobby's invite box) re-applies the\n    // server-rendered class lists, in which every panel is visible and the\n    // first button active. Hold the class attribute on the tabs and buttons\n    // this controller styles; their contents still morph.\n    this.keepSelection = (event) => {\n      if (event.detail.attributeName !== \"class\") return;\n      if (\n        !this.tabTargets.includes(event.target) &&\n        !this.btnTargets.includes(event.target)\n      )\n        return;\n\n      event.preventDefault();\n    };\n    this.element.addEventListener(\n      \"turbo:before-morph-attribute\",\n      this.keepSelection,\n    );\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\n      \"turbo:before-morph-attribute\",\n      this.keepSelection,\n    );\n  }\n\n  select(event) {\n    const name = event.currentTarget.dataset.tabsName;\n    const selectedTab = this.findTabByName(name);\n\n    if (selectedTab === this.currentTab) {\n      return;\n    }\n\n    this.hideAllTabs();\n    this.resetButtonStyles();\n    this.showTab(selectedTab, event.currentTarget);\n\n    this.currentTab = selectedTab;\n    this.persistTabName(name);\n  }\n\n  persistTabName(name) {\n    if (!this.hasStorageKeyValue) return;\n    try {\n      sessionStorage.setItem(this.storageKeyValue, name);\n    } catch (error) {\n      // ignore storage failures (e.g. private mode)\n    }\n  }\n\n  restoreTabName() {\n    if (!this.hasStorageKeyValue) return null;\n    try {\n      return sessionStorage.getItem(this.storageKeyValue);\n    } catch (error) {\n      return null;\n    }\n  }\n\n  hideAllTabs() {\n    this.tabTargets.forEach((tab) => tab.classList.add(\"hidden\"));\n  }\n\n  resetButtonStyles() {\n    const activeClasses = this.activeClassValue.split(\" \");\n    const inactiveClasses = this.inactiveClassValue.split(\" \");\n    this.btnTargets.forEach((btn) => {\n      btn.classList.remove(...activeClasses);\n      btn.classList.add(...inactiveClasses);\n    });\n  }\n\n  showTab(tab, btn) {\n    const activeClasses = this.activeClassValue.split(\" \");\n    const inactiveClasses = this.inactiveClassValue.split(\" \");\n    tab.classList.remove(\"hidden\");\n    btn.classList.add(...activeClasses);\n    btn.classList.remove(...inactiveClasses);\n  }\n\n  findButtonByName(name) {\n    return this.btnTargets.find((element) => element.dataset.tabsName === name);\n  }\n\n  findTabByName(name) {\n    return this.tabTargets.find((element) => element.dataset.tabsName === name);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Reloads the page when it becomes visible again (screen unlock, browser\n// un-minimize) to re-establish WebSocket connections that were dropped while\n// hidden. Attached to the body only when the view allows it (replaces the\n// retired source/auto_refresh.js and its data-auto-refresh flag). Turbo\n// replaces the body on navigation, so connect() re-stamps the timestamp the\n// same way the old lastTurboLoad tracking did - Safari fires\n// visibilitychange during transitions, hence the 3s grace period.\nexport default class extends Controller {\n  connect() {\n    this.connectedAt = Date.now();\n    this.onVisibility = () => {\n      if (document.visibilityState !== \"visible\") return;\n      if (Date.now() - this.connectedAt < 3000) return;\n      window.location.reload();\n    };\n    document.addEventListener(\"visibilitychange\", this.onVisibility);\n  }\n\n  disconnect() {\n    document.removeEventListener(\"visibilitychange\", this.onVisibility);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Reveals the free-text source field on the visit feedback form when the\n// \"other\" radio is chosen (replaces the retired source/feedback.js). The\n// change action sits on the radio-group wrapper - radio changes bubble up.\nexport default class extends Controller {\n  static targets = [\"otherContainer\", \"otherText\"];\n\n  connect() {\n    // Turbo cache restore can bring back a checked \"other\" radio while the\n    // server-rendered container is hidden.\n    const checked = this.element.querySelector(\n      'input[type=\"radio\"]:checked[value=\"other\"]',\n    );\n    if (checked) this.reveal(true);\n  }\n\n  toggleOther(event) {\n    if (event.target.type !== \"radio\") return;\n    this.reveal(event.target.value === \"other\");\n  }\n\n  reveal(isOther) {\n    this.otherContainerTarget.classList.toggle(\"hidden\", !isOther);\n    this.otherTextTarget.required = isOther;\n    this.otherTextTarget.disabled = !isOther;\n    if (!isOther) this.otherTextTarget.value = \"\";\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Gates the lobby setup button until everyone is ready (and, where the venue\n// requires it, the employee green light is checked). Replaces the retired\n// source/lobby.js.\nexport default class extends Controller {\n  static targets = [\"everyoneReady\", \"greenLight\", \"setupButton\"];\n\n  check() {\n    const ready =\n      this.everyoneReadyTarget.checked &&\n      (!this.hasGreenLightTarget || this.greenLightTarget.checked);\n    this.setupButtonTarget.classList.toggle(\"opacity-50\", !ready);\n    this.setupButtonTarget.classList.toggle(\"pointer-events-none\", !ready);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// One in-app notification card (layouts/_notifications): marks itself read\n// after 10s or on click, then removes itself (replaces the retired\n// source/notifications.js). As a Stimulus controller it also binds on cards\n// that arrive later via Turbo Streams, which the old turbo:load scan missed.\nexport default class extends Controller {\n  static values = { url: String };\n\n  connect() {\n    this.timeout = setTimeout(() => this.markRead(), 10000);\n  }\n\n  disconnect() {\n    clearTimeout(this.timeout);\n  }\n\n  read(event) {\n    event.preventDefault();\n    this.markRead();\n  }\n\n  goto(event) {\n    event.preventDefault();\n    this.markRead(event.currentTarget.href);\n  }\n\n  markRead(redirect) {\n    clearTimeout(this.timeout);\n    const token = document\n      .querySelector('meta[name=\"csrf-token\"]')\n      ?.getAttribute(\"content\");\n    fetch(this.urlValue, {\n      method: \"PUT\",\n      headers: { \"Content-Type\": \"application/json\", \"X-CSRF-Token\": token },\n    })\n      .catch(() => {})\n      .finally(() => {\n        this.remove();\n        if (redirect) window.location.href = redirect;\n      });\n  }\n\n  remove() {\n    const list = document.getElementById(\"notifications\");\n    this.element.remove();\n    if (list && list.children.length === 0) list.classList.add(\"hidden\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Opens the browser print dialog once the print-layout page has fully loaded\n// (images included - connect() alone would fire before the logo renders),\n// e.g. the admin visits print overview.\nexport default class extends Controller {\n  connect() {\n    if (document.readyState === \"complete\") {\n      window.print();\n    } else {\n      window.addEventListener(\"load\", () => window.print(), { once: true });\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport Pull from \"pulljs\";\n\n// Pull-down-to-reload on the application layout body (replaces the retired\n// source/pull_to_refresh.js, which re-ran Pull.init on every turbo:load and\n// hardcoded German instructions). pulljs attaches document-level listeners it\n// cannot detach, so init must run exactly once per full page load.\nlet initialized = false;\n\nexport default class extends Controller {\n  static values = { pull: String, release: String, refreshing: String };\n\n  connect() {\n    if (initialized) return;\n    initialized = true;\n    Pull.init({\n      instructionsPullToRefresh: this.pullValue,\n      instructionsReleaseToRefresh: this.releaseValue,\n      instructionsRefreshing: this.refreshingValue,\n      onRefresh() {\n        window.location.reload();\n      },\n    });\n  }\n}\n", "// User-facing Stimulus controllers - loaded in application bundle only\n// Manually maintained. Do NOT use `rails stimulus:manifest:update`.\n\nimport { register } from \"./application\";\n\nimport AiAnswerController from \"./ai_answer_controller\";\nregister(\"ai-answer\", AiAnswerController);\n\nimport AudioController from \"./audio_controller\";\nregister(\"audio\", AudioController);\n\nimport CancellationModalController from \"./cancellation_modal_controller\";\nregister(\"cancellation-modal\", CancellationModalController);\n\nimport ClipboardController from \"./clipboard_controller\";\nregister(\"clipboard\", ClipboardController);\n\nimport ConfettiController from \"./confetti_controller\";\nregister(\"confetti\", ConfettiController);\n\nimport FaqAiAnswerController from \"./faq_ai_answer_controller\";\nregister(\"faq-ai-answer\", FaqAiAnswerController);\n\nimport InvalidScrollController from \"./invalid_scroll_controller\";\nregister(\"invalid-scroll\", InvalidScrollController);\n\nimport LocationRedirectController from \"./location_redirect_controller\";\nregister(\"location-redirect\", LocationRedirectController);\n\nimport OptionsRadioController from \"./options_radio_controller\";\nregister(\"options-radio\", OptionsRadioController);\n\nimport PaymentFormController from \"./payment_form_controller\";\nregister(\"payment-form\", PaymentFormController);\n\nimport PlayTutorialController from \"./play_tutorial_controller\";\nregister(\"play-tutorial\", PlayTutorialController);\n\nimport ProgressCountdownController from \"./progress_countdown_controller\";\nregister(\"progress-countdown\", ProgressCountdownController);\n\nimport ResultOverlayController from \"./result_overlay_controller\";\nregister(\"result-overlay\", ResultOverlayController);\n\nimport StepParticlesController from \"./step_particles_controller\";\nregister(\"step-particles\", StepParticlesController);\n\nimport ShareScorecardController from \"./share_scorecard_controller\";\nregister(\"share-scorecard\", ShareScorecardController);\n\nimport SubmitLockController from \"./submit_lock_controller\";\nregister(\"submit-lock\", SubmitLockController);\n\nimport TabsController from \"./tabs_controller\";\nregister(\"tabs\", TabsController);\n\nimport AutoRefreshController from \"./auto_refresh_controller\";\nregister(\"auto-refresh\", AutoRefreshController);\n\nimport FeedbackFormController from \"./feedback_form_controller\";\nregister(\"feedback-form\", FeedbackFormController);\n\nimport LobbyController from \"./lobby_controller\";\nregister(\"lobby\", LobbyController);\n\nimport NotificationController from \"./notification_controller\";\nregister(\"notification\", NotificationController);\n\nimport PrintOnLoadController from \"./print_on_load_controller\";\nregister(\"print-on-load\", PrintOnLoadController);\n\nimport PullToRefreshController from \"./pull_to_refresh_controller\";\nregister(\"pull-to-refresh\", PullToRefreshController);\n", "import { Turbo } from \"@hotwired/turbo-rails\";\n\nlet _redirecting = false;\nlet _pendingRedirectUrl = null;\n\ndocument.addEventListener(\"turbo:load\", () => {\n  _redirecting = false;\n  if (_pendingRedirectUrl && window.location.pathname !== _pendingRedirectUrl) {\n    const url = _pendingRedirectUrl;\n    _pendingRedirectUrl = null;\n    _redirecting = true;\n    Turbo.visit(url);\n  } else {\n    _pendingRedirectUrl = null;\n  }\n});\n\nTurbo.StreamActions.redirect = function () {\n  const url = this.getAttribute(\"url\");\n  if (!url || window.location.pathname === url) return;\n  _pendingRedirectUrl = url;\n  if (_redirecting) return;\n  _redirecting = true;\n  Turbo.visit(url);\n};\n\nTurbo.StreamActions.remove_play = function () {\n  const playId = this.getAttribute(\"play-id\");\n  const url = this.getAttribute(\"url\");\n  const playStatus = document.getElementById(\"play-status\");\n  if (playStatus && playStatus.dataset.playId === playId) {\n    Turbo.visit(url);\n  }\n};\n", "if (typeof window !== \"undefined\") {\n  // Handler to call on window resize\n  function handleResize() {\n    const vh = window.innerHeight * 0.01;\n    document.documentElement.style.setProperty(\"--vh\", `${vh}px`);\n  }\n\n  // Add event listener\n  window.addEventListener(\"resize\", handleResize);\n\n  // Call handler right away so state gets updated with initial window size\n  handleResize();\n}\n"],
  "mappings": "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",
  "names": ["adapters_default", "init_adapters", "__esmMin", "logger_default", "init_logger", "__esmMin", "init_adapters", "messages", "adapters_default", "now", "secondsSince", "ConnectionMonitor", "connection_monitor_default", "init_connection_monitor", "__esmMin", "init_logger", "time", "connection", "logger_default", "staleThreshold", "reconnectionBackoffRate", "backoff", "jitter", "internal_default", "init_internal", "__esmMin", "message_types", "protocols", "supportedProtocols", "indexOf", "Connection", "connection_default", "init_connection", "__esmMin", "init_adapters", "init_connection_monitor", "init_internal", "init_logger", "internal_default", "consumer", "connection_monitor_default", "data", "logger_default", "adapters_default", "allowReconnect", "error", "states", "state", "eventName", "handler", "event", "identifier", "message", "reason", "reconnect", "type", "extend", "Subscription", "init_subscription", "__esmMin", "object", "properties", "key", "value", "consumer", "params", "mixin", "action", "data", "SubscriptionGuarantor", "subscription_guarantor_default", "init_subscription_guarantor", "__esmMin", "init_logger", "subscriptions", "subscription", "logger_default", "s", "Subscriptions", "init_subscriptions", "__esmMin", "init_subscription", "init_subscription_guarantor", "init_logger", "consumer", "subscription_guarantor_default", "channelName", "mixin", "channel", "params", "subscription", "Subscription", "identifier", "s", "callbackName", "args", "subscriptions", "logger_default", "command", "createWebSocketURL", "url", "a", "Consumer", "init_consumer", "__esmMin", "init_connection", "init_subscriptions", "Subscriptions", "connection_default", "data", "src_exports", "__export", "connection_default", "connection_monitor_default", "Consumer", "internal_default", "Subscription", "subscription_guarantor_default", "Subscriptions", "adapters_default", "createConsumer", "createWebSocketURL", "getConfig", "logger_default", "url", "name", "element", "init_src", "__esmMin", "init_connection", "init_connection_monitor", "init_consumer", "init_internal", "init_subscription", "init_subscriptions", "init_subscription_guarantor", "init_adapters", "init_logger", "require_lib", "__commonJSMin", "exports", "module", "_SETTINGS", "defaultStyle", "defaultHTML", "_defaults", "t", "pullStartY", "pullMoveY", "dist", "distResisted", "_state", "_setup", "_enable", "_timeout", "_update", "_SETTINGS2", "classPrefix", "ptrElement", "instructionsRefreshing", "instructionsPullToRefresh", "instructionsReleaseToRefresh", "textEl", "_setupEvents", "onReset", "_SETTINGS3", "cssProp", "_onTouchStart", "e", "_SETTINGS4", "triggerElement", "_onTouchMove", "_SETTINGS5", "resistanceFunction", "distMax", "distThreshold", "_onTouchEnd", "_SETTINGS6", "onRefresh", "refreshTimeout", "distReload", "retval", "_run", "_SETTINGS7", "mainElement", "onInit", "containerClassName", "ptr", "styleEl", "updateElement", "Pull", "options", "handlers", "key", "_run2", "styleNode", "OWN_FRAME", "POSITIONED_FRAME", "BUILTIN_FRAME", "NETWORK_FAILURE", "FOREIGN_OBJECT", "sent", "seen", "lastVisit", "lastFrame", "lastRenderAt", "event", "isBrowserNoise", "own", "ownFrame", "ownStackFrame", "report", "reason", "error", "stack", "line", "text", "match", "message", "source", "column", "key", "context", "prototype", "submitter", "validateSubmitter", "form", "raise", "ErrorConstructor", "message", "name", "turbo_es2017_esm_exports", "__export", "FetchEnctype", "FetchMethod", "FetchRequest", "FetchResponse", "FrameElement", "FrameLoadingStyle", "FrameRenderer", "PageRenderer", "PageSnapshot", "StreamActions", "StreamElement", "StreamSourceElement", "cache", "config", "connectStreamSource", "disconnectStreamSource", "fetchWithTurboHeaders", "fetchEnctypeFromString", "fetchMethodFromString", "isSafe", "morphBodyElements", "morphChildren", "morphElements", "morphTurboFrameElements", "sessionNavigator", "registerAdapter", "renderStreamMessage", "session", "setConfirmMethod", "setFormMode", "setProgressBarDelay", "start", "visit", "FrameLoadingStyle", "_FrameElement", "__publicField", "name", "value", "frameLoadingStyleFromString", "FrameElement", "style", "drive", "activateScriptElement", "element", "createdScriptElement", "cspNonce", "getCspNonce", "copyElementAttributes", "destinationElement", "sourceElement", "createDocumentFragment", "html", "template", "dispatch", "eventName", "target", "cancelable", "detail", "event", "cancelEvent", "nextRepaint", "nextEventLoopTick", "nextAnimationFrame", "resolve", "parseHTMLDocument", "unindent", "strings", "values", "lines", "interpolate", "match", "indent", "line", "result", "string", "uuid", "_", "i", "getAttribute", "attributeName", "elements", "hasAttribute", "markAsBusy", "clearBusyState", "waitForLoad", "timeoutInMilliseconds", "onComplete", "getHistoryMethodForAction", "action", "isAction", "getVisitAction", "getMetaElement", "getMetaContent", "nonce", "content", "setMetaContent", "findClosestRecursively", "selector", "elementIsFocusable", "queryAutofocusableElement", "elementOrDocumentFragment", "around", "callback", "reader", "before", "after", "doesNotTargetIFrame", "findLinkFromClickTarget", "link", "linkTarget", "debounce", "fn", "delay", "timeoutId", "args", "submitter", "_submitter", "Config", "config", "__privateAdd", "__privateGet", "__privateSet", "forms", "expandURL", "locatable", "getAnchor", "url", "anchorMatch", "getAction$1", "form", "getExtension", "getLastPathComponent", "isPrefixedBy", "baseURL", "prefix", "addTrailingSlash", "locationIsVisitable", "location", "rootLocation", "getLocationForLink", "getRequestURL", "anchor", "toCacheKey", "urlsAreEqual", "left", "right", "getPathComponents", "FetchResponse", "response", "LimitedSet", "maxSize", "oldestValue", "recentRequests", "fetchWithTurboHeaders", "options", "modifiedHeaders", "requestUID", "fetchMethodFromString", "method", "FetchMethod", "fetchEnctypeFromString", "encoding", "FetchEnctype", "_resolveRequestPromise", "_FetchRequest_instances", "allowRequestToBeIntercepted_fn", "willDelegateErrorHandling_fn", "FetchRequest", "delegate", "requestBody", "enctype", "_value", "body", "buildResourceAndBody", "fetchBody", "fetchMethod", "fetchOptions", "__privateMethod", "error", "fetchResponse", "isSafe", "mimeType", "requestInterception", "resource", "searchParams", "entriesExcludingFiles", "mergeIntoURLSearchParams", "entries", "AppearanceObserver", "StreamMessage", "message", "fragment", "importStreamElements", "streamElement", "inertScriptElement", "identity", "key", "_toCacheKey", "LRUCache", "size", "entry", "index", "PREFETCH_DELAY", "_prefetchTimeout", "_maxAges", "PrefetchCache", "prefetchDelay", "request", "ttl", "cacheTtl", "maxAge", "prefetchCache", "FormSubmissionState", "FormSubmission", "_FormSubmission", "formElement", "mustRedirect", "getMethod", "getAction", "getFormAction", "buildFormData", "getEnctype", "initialized", "requesting", "confirmationMessage", "stopping", "stopped", "token", "getCookieValue", "_request", "responseSucceededWithoutRedirect", "input", "formData", "cookieName", "cookie", "formElementAction", "formAction", "Snapshot", "queryPermanentElementsAll", "id", "getPermanentElementById", "snapshot", "permanentElementMap", "currentPermanentElement", "newPermanentElement", "node", "FormSubmitObserver", "eventTarget", "submissionDoesNotDismissDialog", "submissionDoesNotTargetIFrame", "_resolveRenderPromise", "_resolveInterceptionPromise", "View", "x", "y", "renderer", "isPreview", "shouldRender", "willRender", "shouldInvalidate", "renderInterception", "reason", "direction", "FrameView", "LinkInterceptor", "_event", "LinkClickObserver", "FormLinkClickObserver", "originalEvent", "type", "turboFrame", "turboAction", "turboConfirm", "Bardo", "bardo", "permanentElement", "placeholder", "createPlaceholderForPermanentElement", "clone", "_activeElement", "Renderer", "currentSnapshot", "newSnapshot", "reject", "currentElement", "newElement", "FrameRenderer", "destinationRange", "frameElement", "sourceRange", "renderElement", "block", "readScrollLogicalPosition", "behavior", "readScrollBehavior", "activatedScriptElement", "defaultValue", "Idiomorph", "noOp", "defaults", "elt", "morph", "oldNode", "newContent", "normalizeElement", "newNode", "normalizeParent", "ctx", "createMorphContext", "morphedNodes", "saveAndRestoreFocus", "withHeadBlocking", "morphChildren", "morphOuterHTML", "oldParent", "activeElement", "activeElementId", "selectionStart", "selectionEnd", "results", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "removeNodesBetween", "morphNode", "newChildId", "movedChild", "moveBeforeById", "insertedNode", "createNode", "tempNode", "removeNode", "newEmptyChild", "newClonedChild", "startPoint", "softMatch", "nextSibling", "siblingSoftMatchCount", "cursor", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "oldElt", "newElt", "moveBefore", "startInclusive", "endExclusive", "parentNode", "removeElementFromAncestorsIdMaps", "idSet", "handleHeadElement", "morphAttributes", "ignoreValueOfActiveElement", "oldAttributes", "newAttributes", "newAttribute", "ignoreAttribute", "oldAttribute", "syncInputValue", "oldElement", "newValue", "oldValue", "syncBooleanAttribute", "newLiveValue", "oldLiveValue", "ignoreUpdate", "attr", "updateType", "possibleActiveElement", "oldHead", "newHead", "promises", "newCtx", "added", "removed", "preserved", "nodesToAppend", "srcToNewHeadNodes", "newHeadChild", "currentHeadElt", "inNewContent", "isReAppended", "isPreserved", "promise", "_resolve", "removedElement", "persistentIds", "idMap", "createIdMaps", "mergedConfig", "mergeDefaults", "morphStyle", "createPantry", "createActiveElementAndParents", "finalConfig", "pantry", "activeElementAndParents", "findIdElements", "root", "populateIdMapWithTree", "current", "oldContent", "oldIdElements", "newIdElements", "createPersistentIds", "newRoot", "duplicateIds", "oldIdTagNameMap", "tagName", "generatedByIdiomorph", "parseContent", "SlicedParentNode", "dummyParent", "nodes", "nodeList", "referenceNode", "parser", "contentWithSvgsRemoved", "htmlElement", "morphElements", "callbacks", "DefaultIdiomorphCallbacks", "shouldRefreshFrameWithMorphing", "currentFrame", "newFrame", "areFramesCompatibleForRefreshing", "closestFrameReloadableWithMorphing", "_beforeNodeMorphed", "beforeNodeMorphed", "mutationType", "MorphingFrameRenderer", "_ProgressBar", "ProgressBar", "HeadSnapshot", "elementIsNoscript", "elementWithoutNonce", "outerHTML", "details", "elementType", "elementIsTracked", "matchedType", "tracked", "elementIsMetaElementWithName", "elementIsScript", "elementIsStylesheet", "PageSnapshot", "_PageSnapshot", "documentElement", "head", "headSnapshot", "clonedElement", "selectElements", "clonedSelectElements", "source", "option", "clonedPasswordInput", "clonedNoscriptElement", "_viewTransitionStarted", "_lastOperation", "ViewTransitioner", "useViewTransition", "render", "defaultOptions", "TimingMetric", "VisitState", "SystemStatusCode", "Direction", "Visit", "restorationIdentifier", "historyChanged", "referrer", "snapshotHTML", "visitCachedSnapshot", "updateHistory", "shouldCacheSnapshot", "acceptsStreamResponse", "refresh", "actionForHistory", "statusCode", "isSuccessful", "responseHTML", "_response", "redirected", "_error", "scrollPosition", "metric", "BrowserAdapter", "session", "visit", "_visit", "_formSubmission", "CacheObserver", "_FrameRedirector_instances", "shouldSubmit_fn", "shouldRedirect_fn", "findFrameElement_fn", "FrameRedirector", "_location", "frame", "meta", "History", "turbo", "restorationIndex", "state", "additionalData", "restorationData", "_prefetchedLink", "_enable", "_tryToPrefetchRequest", "_cancelRequestIfObsolete", "_cancelPrefetchRequest", "_tryToUsePrefetchedRequest", "_LinkPrefetchObserver_instances", "cacheTtl_get", "isPrefetchable_fn", "LinkPrefetchObserver", "fetchRequest", "cached", "turboFrameTarget", "unfetchableLink", "linkToTheSamePage", "linkOptsOut", "nonSafeLink", "eventPrevented", "turboPrefetchParent", "turboMethod", "isUJS", "_Navigator_instances", "getActionForFormSubmission_fn", "getDefaultAction_fn", "Navigator", "formSubmission", "visitOptions", "PageStage", "PageObserver", "readyState", "ScrollObserver", "position", "StreamMessageRenderer", "getPermanentElementMapForFragment", "withAutofocusFromFragment", "withPreservedFocus", "permanentElementsInDocument", "permanentElementInDocument", "elementInStream", "generatedID", "turboStreams", "elementWithAutofocus", "firstAutofocusableElementInStreams", "willAutofocusId", "elementToAutofocus", "activeElementBeforeRender", "activeElementAfterRender", "restoreFocusTo", "elementToFocus", "nodeListOfStreamElements", "_started", "StreamObserver", "fetchResponseFromEvent", "fetchResponseIsStream", "ErrorRenderer", "replaceableElement", "_PageRenderer_instances", "setLanguage_fn", "PageRenderer", "mergedHeadElements", "newStylesheetElements", "loadingElements", "newHeadElements", "elementList", "noscriptElement", "dir", "lang", "MorphingPageRenderer", "SnapshotCache", "PageView", "rendererClass", "cachedSnapshot", "_preloadAll", "Preloader", "snapshotCache", "_Cache_instances", "setCacheControl_fn", "Cache", "_pageRefreshDebouncePeriod", "Session", "adapter", "requestId", "scroll", "isRecentRequest", "isCurrentUrl", "isUnsafe", "isStream", "frameTarget", "extendURLWithDeprecatedProperties", "defaultPrevented", "_snapshot", "_isPreview", "renderMethod", "ev", "newBody", "timing", "submitterIsNavigatable", "container", "withinFrame", "deprecatedLocationPropertyDescriptors", "cache", "sessionNavigator", "start", "registerAdapter", "connectStreamSource", "disconnectStreamSource", "renderStreamMessage", "setProgressBarDelay", "setConfirmMethod", "confirmMethod", "setFormMode", "mode", "morphBodyElements", "currentBody", "morphTurboFrameElements", "Turbo", "TurboFrameMissingError", "_currentFetchRequest", "_resolveVisitPromise", "_connected", "_hasBeenLoaded", "_ignoredAttributes", "_shouldMorphFrame", "_FrameController_instances", "loadSourceURL_fn", "loadFrameResponse_fn", "visit_fn", "navigateFrame_fn", "handleUnvisitableFrameResponse_fn", "willHandleFrameMissingFromResponse_fn", "handleFrameMissingFromResponse_fn", "throwFrameMissingError_fn", "visitResponse_fn", "formActionIsVisitable_fn", "shouldInterceptNavigation_fn", "isIgnoringChangesTo_fn", "ignoringChangesToAttribute_fn", "withCurrentNavigationElement_fn", "getFrameElementById_fn", "FrameController", "_fetchResponse", "src", "document", "_renderMethod", "_newElement", "pageSnapshot", "activateElement", "sourceURL", "newFrameElement", "wrapped", "currentURL", "StreamActions", "e", "targetElement", "_StreamElement_instances", "raise_fn", "_StreamElement", "c", "existingChildren", "newChildrenIds", "actionFunction", "StreamElement", "StreamSourceElement", "scriptElement", "consumer", "getConsumer", "setConsumer", "createConsumer", "newConsumer", "subscribeTo", "channel", "mixin", "subscriptions", "walk", "obj", "acc", "key", "camel", "m", "x", "TurboCableStreamSourceElement", "connectStreamSource", "subscribeTo", "disconnectStreamSource", "data", "event", "channel", "signed_stream_name", "walk", "__publicField", "encodeMethodIntoRequestBody", "event", "form", "fetchOptions", "submitter", "body", "isBodyInit", "method", "determineFetchMethod", "formMethod", "determineFormMethod", "overrideMethod", "turbo_es2017_esm_exports", "encodeMethodIntoRequestBody", "event", "response", "visit", "path", "event", "stream", "target", "EventListener", "eventTarget", "eventName", "eventOptions", "binding", "event", "extendedEvent", "extendEvent", "left", "right", "leftIndex", "rightIndex", "stopImmediatePropagation", "Dispatcher", "application", "eventListener", "listeners", "map", "error", "message", "detail", "eventListenerMap", "cacheKey", "parts", "key", "descriptorPattern", "parseActionDescriptorString", "descriptorString", "matches", "parseEventTarget", "parseEventOptions", "eventTargetName", "options", "token", "stringifyEventTarget", "camelize", "value", "_", "char", "capitalize", "dasherize", "tokenize", "Action", "element", "index", "descriptor", "getDefaultEventNameForElement", "eventNameSuffix", "params", "pattern", "name", "match", "typecast", "defaultEventNames", "e", "tagName", "Binding", "context", "action", "method", "target", "currentTarget", "actionEvent", "identifier", "controller", "ElementObserver", "delegate", "mutations", "callback", "mutation", "node", "attributeName", "nodes", "tree", "processor", "AttributeObserver", "StringMapObserver", "oldValue", "attribute", "add", "fetch", "del", "prune", "values", "Multimap", "set", "size", "TokenListObserver", "element", "attributeName", "delegate", "AttributeObserver", "Multimap", "callback", "unmatchedTokens", "matchedTokens", "tokens", "token", "previousTokens", "currentTokens", "firstDifferingIndex", "zip", "previousToken", "currentToken", "tokensAreEqual", "tokenString", "parseTokenString", "content", "index", "left", "right", "length", "_", "ValueListObserver", "value", "parseResult", "valuesByToken", "error", "BindingObserver", "context", "action", "binding", "Binding", "Action", "ValueObserver", "receiver", "StringMapObserver", "key", "descriptor", "name", "oldValue", "defaultValue", "writer", "rawValue", "rawOldValue", "changedMethodName", "changedMethod", "valueDescriptorMap", "descriptors", "hasMethodName", "capitalize", "TargetObserver", "_a", "Context", "module", "scope", "functionName", "detail", "identifier", "controller", "message", "methodName", "args", "readInheritableStaticArrayValues", "constructor", "propertyName", "ancestors", "getAncestorsForConstructor", "values", "getOwnStaticArrayValues", "readInheritableStaticObjectPairs", "pairs", "getOwnStaticObjectPairs", "definition", "bless", "shadow", "getBlessedProperties", "properties", "shadowConstructor", "extend", "shadowProperties", "getShadowProperties", "blessedProperties", "blessing", "prototype", "getOwnKeys", "getShadowedDescriptor", "shadowingDescriptor", "object", "extendWithReflect", "extended", "testReflectExtension", "b", "blessDefinition", "Module", "application", "ClassMap", "tokenize", "DataMap", "dasherize", "Guide", "logger", "warnedKeys", "attributeValueContainsToken", "TargetSet", "targetName", "targetNames", "target", "targets", "selector", "targetDescriptor", "revisedAttributeName", "Scope", "schema", "ScopeObserver", "scopesByIdentifier", "referenceCount", "Router", "contexts", "defaultSchema", "Application", "_Application", "Dispatcher", "domReady", "controllerConstructor", "head", "rest", "resolve", "ClassPropertiesBlessing", "classDefinition", "propertiesForClassDefinition", "classes", "attribute", "TargetPropertiesBlessing", "targetDefinition", "propertiesForTargetDefinition", "ValuePropertiesBlessing", "valueDefinitionPairs", "propertyDescriptorMap", "result", "valueDefinitionPair", "valueDescriptor", "parseValueDefinitionPair", "propertiesForValueDefinitionPair", "read", "write", "typeDefinition", "valueDescriptorForTokenAndTypeDefinition", "parseValueTypeConstant", "constant", "parseValueTypeDefault", "parseValueTypeObject", "typeObject", "typeFromObject", "defaultValueType", "parseValueTypeDefinition", "typeFromDefaultValue", "typeFromConstant", "type", "defaultValueForDefinition", "defaultValuesByType", "camelize", "readers", "writers", "array", "writeString", "writeJSON", "Controller", "eventName", "prefix", "bubbles", "cancelable", "event", "application", "Application", "registered", "register", "identifier", "controller", "password_toggle_controller_default", "Controller", "__publicField", "toggle_controller_default", "Controller", "event", "target", "__publicField", "HIGHLIGHT_CLASSES", "date_switcher_controller_default", "Controller", "cell", "match", "cls", "__publicField", "wheel_controller_default", "Controller", "target", "__publicField", "auto_submit_controller_default", "Controller", "event", "form", "run", "__publicField", "attachment_fallback_controller_default", "Controller", "hint", "event", "files", "input", "message", "text", "dismiss", "target", "x", "y", "form", "scoped", "global", "root", "inputs", "best", "bestDistance", "rect", "distance", "accepted", "file", "transfer", "accept", "raw", "token", "element", "__publicField", "submit_error_controller_default", "Controller", "event", "toast", "text", "dismiss", "__publicField", "autogrow_controller_default", "Controller", "entries", "entry", "drawer_controller_default", "Controller", "done", "finish", "event", "__publicField", "confirm_click_controller_default", "Controller", "event", "__publicField", "register", "password_toggle_controller_default", "toggle_controller_default", "date_switcher_controller_default", "wheel_controller_default", "auto_submit_controller_default", "attachment_fallback_controller_default", "submit_error_controller_default", "autogrow_controller_default", "drawer_controller_default", "confirm_click_controller_default", "aiAnswerToHtml", "text", "ai_answer_controller_default", "Controller", "message", "locationId", "honeypot", "response", "error", "data", "throttled", "answer", "aiAnswerToHtml", "__publicField", "audio_controller_default", "Controller", "event", "button", "player", "audio", "__publicField", "cancellation_modal_controller_default", "Controller", "event", "__publicField", "clipboard_controller_default", "Controller", "event", "shown", "t", "__publicField", "module", "main", "global", "isWorker", "workerSize", "canUseWorker", "canUsePaths", "canDrawBitmap", "canvas", "ctx", "bitmap", "noop", "promise", "func", "ModulePromise", "Prom", "bitmapMapper", "skipTransform", "map", "raf", "TIME", "frame", "cancel", "frames", "lastFrameTime", "cb", "id", "onFrame", "time", "timer", "getWorker", "worker", "prom", "resolves", "decorate", "execute", "options", "callback", "offscreen", "size", "done", "resolve", "workerDone", "msg", "code", "e", "defaults", "convert", "val", "transform", "isOk", "prop", "name", "onlyPositiveInt", "number", "randomInt", "min", "max", "toDecimal", "str", "colorsToRgb", "colors", "hexToRgb", "getOrigin", "origin", "setCanvasWindowSize", "setCanvasRectSize", "rect", "getCanvas", "zIndex", "ellipse", "context", "x", "y", "radiusX", "radiusY", "rotation", "startAngle", "endAngle", "antiClockwise", "randomPhysics", "opts", "radAngle", "radSpread", "updateFetti", "fetti", "progress", "x1", "y1", "x2", "y2", "transformPath2D", "scaleX", "scaleY", "width", "height", "matrix", "pattern", "rot", "innerRadius", "outerRadius", "spikes", "step", "animate", "fettis", "resizer", "animatingFettis", "animationFrame", "destroy", "onDone", "update", "confettiCannon", "globalOpts", "isLibCanvas", "allowResize", "hasResizeEventRegistered", "globalDisableForReducedMotion", "shouldUseWorker", "initialized", "preferLessMotion", "animationObj", "fireLocal", "particleCount", "angle", "spread", "startVelocity", "decay", "gravity", "drift", "ticks", "shapes", "scalar", "flat", "temp", "startX", "startY", "fire", "disableForReducedMotion", "onResize", "obj", "defaultFire", "getDefaultFire", "pathString", "pathMatrix", "path2d", "t1", "t2", "shapeFromPath", "pathData", "path", "tempCanvas", "tempCtx", "maxSize", "minX", "minY", "maxX", "maxY", "maxDesiredSize", "scale", "shapeFromText", "textData", "text", "color", "fontFamily", "fontSize", "font", "padding", "confetti_module_default", "create", "confetti_controller_default", "Controller", "type", "id", "existing", "canvas", "confetti_module_default", "myConfetti", "count", "defaults", "fire", "particleRatio", "opts", "duration", "animationEnd", "randomInRange", "min", "max", "interval", "timeLeft", "particleCount", "skew", "frame", "ticks", "__publicField", "faq_ai_answer_controller_default", "Controller", "event", "message", "locationId", "answer", "honeypot", "response", "error", "data", "throttled", "bubble", "template", "text", "aiAnswerToHtml", "__publicField", "invalid_scroll_controller_default", "Controller", "__publicField", "event", "section", "location_redirect_controller_default", "Controller", "params", "__publicField", "options_radio_controller_default", "Controller", "value", "trueActive", "trueInactive", "element", "active", "activeClasses", "inactiveClasses", "add", "remove", "__publicField", "payment_form_controller_default", "Controller", "event", "option", "selectedOption", "value", "group", "button", "hasAmount", "hasMethod", "formattedAmount", "row", "mark", "state", "__publicField", "play_tutorial_controller_default", "Controller", "step", "showKeys", "dimKeys", "section", "key", "ringKey", "event", "el", "frame", "pad", "rect", "preview", "button", "from", "to", "dx", "dy", "scale", "finished", "done", "catchTimer", "catchEnd", "onEnd", "token", "__publicField", "progress_countdown_controller_default", "Controller", "elapsed", "progress", "__publicField", "result_overlay_controller_default", "Controller", "meta", "comment", "url", "overlay", "response", "data", "event", "__publicField", "COLORS", "spawnDot", "container", "w", "h", "distance", "shapes", "dot", "shape", "color", "isSymbol", "size", "angle", "d", "getOrCreateContainer", "parent", "burst", "el", "count", "stagger", "i", "step_particles_controller_default", "Controller", "burst", "__publicField", "resolveUrl", "url", "baseUrl", "doc", "base", "a", "uuid", "counter", "random", "toArray", "arrayLike", "arr", "i", "l", "styleProps", "getStyleProperties", "options", "px", "node", "styleProperty", "val", "getNodeWidth", "leftBorder", "rightBorder", "getNodeHeight", "topBorder", "bottomBorder", "getImageSize", "targetNode", "width", "height", "getPixelRatio", "ratio", "FINAL_PROCESS", "canvasDimensionLimit", "checkCanvasDimensions", "canvas", "createImage", "url", "resolve", "reject", "img", "svgToDataURL", "svg", "html", "nodeToDataURL", "node", "width", "height", "xmlns", "foreignObject", "isInstanceOfElement", "instance", "nodePrototype", "formatCSSText", "style", "content", "formatCSSProperties", "options", "getStyleProperties", "name", "value", "priority", "getPseudoElementStyle", "className", "pseudo", "selector", "cssText", "clonePseudoElement", "nativeNode", "clonedNode", "uuid", "styleElement", "clonePseudoElements", "WOFF", "JPEG", "mimes", "getExtension", "url", "match", "getMimeType", "extension", "getContentFromDataUrl", "dataURL", "isDataUrl", "url", "makeDataUrl", "content", "mimeType", "fetchAsDataURL", "init", "process", "res", "blob", "resolve", "reject", "reader", "error", "cache", "getCacheKey", "contentType", "includeQueryParams", "key", "resourceToDataURL", "resourceUrl", "options", "cacheKey", "result", "msg", "cloneCanvasElement", "canvas", "dataURL", "createImage", "cloneVideoElement", "video", "options", "ctx", "poster", "contentType", "getMimeType", "resourceToDataURL", "cloneIFrameElement", "iframe", "_a", "cloneNode", "cloneSingleNode", "node", "isInstanceOfElement", "isSVGElement", "isSlotElement", "cloneChildren", "nativeNode", "clonedNode", "children", "toArray", "_b", "deferred", "child", "clonedChild", "cloneCSSStyle", "targetStyle", "sourceStyle", "getStyleProperties", "name", "value", "cloneInputValue", "cloneSelectValue", "selectedOption", "decorate", "clonePseudoElements", "ensureSVGSymbols", "clone", "uses", "processedDefs", "i", "id", "exist", "definition", "nodes", "ns", "svg", "defs", "isRoot", "URL_REGEX", "URL_WITH_FORMAT_REGEX", "FONT_SRC_REGEX", "toRegex", "url", "escaped", "parseURLs", "cssText", "urls", "raw", "quotation", "isDataUrl", "embed", "resourceURL", "baseURL", "options", "getContentFromUrl", "resolvedURL", "resolveUrl", "contentType", "getMimeType", "dataURL", "content", "makeDataUrl", "resourceToDataURL", "filterPreferredFontFormat", "str", "preferredFontFormat", "match", "src", "format", "shouldEmbed", "embedResources", "baseUrl", "filteredCSSText", "deferred", "css", "embedProp", "propName", "node", "options", "propValue", "_a", "cssString", "embedResources", "embedBackground", "clonedNode", "embedImageNode", "isImageElement", "isInstanceOfElement", "isDataUrl", "url", "dataURL", "resourceToDataURL", "getMimeType", "resolve", "reject", "attributes", "error", "image", "embedChildren", "deferreds", "toArray", "child", "embedImages", "applyStyle", "node", "options", "style", "manual", "key", "cssFetchCache", "fetchCSS", "url", "cache", "cssText", "embedFonts", "data", "options", "regexUrl", "loadFonts", "loc", "fetchAsDataURL", "result", "parseCSS", "source", "commentsRegex", "keyframesRegex", "matches", "importRegex", "combinedCSSRegex", "unifiedRegex", "getCSSRules", "styleSheets", "ret", "deferreds", "sheet", "toArray", "item", "index", "importIndex", "deferred", "metadata", "rule", "error", "e", "inline", "a", "err", "getWebFontRules", "cssRules", "shouldEmbed", "parseWebFontRules", "node", "normalizeFontFamily", "font", "getUsedFonts", "fonts", "traverse", "child", "getWebFontCSS", "rules", "usedFonts", "baseUrl", "embedResources", "embedWebFonts", "clonedNode", "styleNode", "sytleContent", "toSvg", "node", "options", "width", "height", "getImageSize", "clonedNode", "cloneNode", "embedWebFonts", "embedImages", "applyStyle", "nodeToDataURL", "toCanvas", "svg", "img", "createImage", "canvas", "context", "ratio", "getPixelRatio", "canvasWidth", "canvasHeight", "checkCanvasDimensions", "toPng", "node", "options", "toCanvas", "share_scorecard_controller_default", "Controller", "params", "blob", "view", "handler", "error", "node", "rect", "width", "height", "dataUrl", "toPng", "frame", "loaded", "resolve", "reject", "events", "finish", "event", "name", "timeout", "url", "file", "link", "__publicField", "submit_lock_controller_default", "Controller", "event", "__publicField", "tabs_controller_default", "Controller", "__publicField", "name", "selectedBtn", "selectedTab", "error", "event", "tab", "activeClasses", "inactiveClasses", "btn", "element", "auto_refresh_controller_default", "Controller", "feedback_form_controller_default", "Controller", "event", "isOther", "__publicField", "lobby_controller_default", "Controller", "ready", "__publicField", "notification_controller_default", "Controller", "event", "redirect", "token", "list", "__publicField", "print_on_load_controller_default", "Controller", "import_pulljs", "initialized", "pull_to_refresh_controller_default", "Controller", "Pull", "__publicField", "register", "ai_answer_controller_default", "audio_controller_default", "cancellation_modal_controller_default", "clipboard_controller_default", "confetti_controller_default", "faq_ai_answer_controller_default", "invalid_scroll_controller_default", "location_redirect_controller_default", "options_radio_controller_default", "payment_form_controller_default", "play_tutorial_controller_default", "progress_countdown_controller_default", "result_overlay_controller_default", "step_particles_controller_default", "share_scorecard_controller_default", "submit_lock_controller_default", "tabs_controller_default", "auto_refresh_controller_default", "feedback_form_controller_default", "lobby_controller_default", "notification_controller_default", "print_on_load_controller_default", "pull_to_refresh_controller_default", "_redirecting", "_pendingRedirectUrl", "url", "turbo_es2017_esm_exports", "playId", "playStatus", "handleResize", "vh"]
}
