{
  "version": 3,
  "sources": ["../../../node_modules/@rails/actioncable/src/adapters.js", "../../../node_modules/@rails/actioncable/src/logger.js", "../../../node_modules/@rails/actioncable/src/connection_monitor.js", "../../../node_modules/@rails/actioncable/src/internal.js", "../../../node_modules/@rails/actioncable/src/connection.js", "../../../node_modules/@rails/actioncable/src/subscription.js", "../../../node_modules/@rails/actioncable/src/subscription_guarantor.js", "../../../node_modules/@rails/actioncable/src/subscriptions.js", "../../../node_modules/@rails/actioncable/src/consumer.js", "../../../node_modules/@rails/actioncable/src/index.js", "../../../node_modules/recaptcha-v3/dist/ReCaptchaInstance.js", "../../../node_modules/recaptcha-v3/dist/ReCaptchaLoader.js", "../../../node_modules/recaptcha-v3/dist/ReCaptcha.js", "../../../node_modules/@stripe/stripe-js/dist/pure.js", "../../../node_modules/@stripe/stripe-js/pure.js", "../../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js", "../../../node_modules/@rails/activestorage/app/assets/javascripts/activestorage.esm.js", "../../../node_modules/trix/src/trix/config/attachments.js", "../../../node_modules/trix/src/trix/config/block_attributes.js", "../../../node_modules/trix/src/trix/config/browser.js", "../../../node_modules/trix/src/trix/config/dompurify.js", "../../../node_modules/trix/src/trix/config/lang.js", "../../../node_modules/trix/src/trix/config/file_size_formatting.js", "../../../node_modules/trix/src/trix/constants.js", "../../../node_modules/trix/src/trix/core/helpers/extend.js", "../../../node_modules/trix/src/trix/core/helpers/dom.js", "../../../node_modules/trix/src/trix/config/input.js", "../../../node_modules/trix/src/trix/config/key_names.js", "../../../node_modules/trix/src/trix/config/parser.js", "../../../node_modules/trix/src/trix/config/text_attributes.js", "../../../node_modules/trix/src/trix/config/toolbar.js", "../../../node_modules/trix/src/trix/config/undo.js", "../../../node_modules/trix/src/trix/config/css.js", "../../../node_modules/trix/src/trix/core/basic_object.js", "../../../node_modules/trix/src/trix/core/utilities/utf16_string.js", "../../../node_modules/trix/src/trix/core/object.js", "../../../node_modules/trix/src/trix/core/helpers/arrays.js", "../../../node_modules/trix/src/trix/core/helpers/bidi.js", "../../../node_modules/trix/src/trix/core/helpers/config.js", "../../../node_modules/trix/src/trix/core/helpers/custom_elements.js", "../../../node_modules/trix/src/trix/core/helpers/events.js", "../../../node_modules/trix/src/trix/core/helpers/functions.js", "../../../node_modules/trix/src/trix/core/helpers/objects.js", "../../../node_modules/trix/src/trix/core/helpers/ranges.js", "../../../node_modules/trix/src/trix/observers/selection_change_observer.js", "../../../node_modules/trix/src/trix/core/helpers/strings.js", "../../../node_modules/trix/src/trix/core/collections/hash.js", "../../../node_modules/trix/src/trix/core/collections/object_group.js", "../../../node_modules/trix/src/trix/core/collections/object_map.js", "../../../node_modules/trix/src/trix/core/collections/element_store.js", "../../../node_modules/trix/src/trix/core/utilities/operation.js", "../../../node_modules/trix/src/trix/views/object_view.js", "../../../node_modules/trix/node_modules/dompurify/dist/purify.es.mjs", "../../../node_modules/trix/src/trix/models/html_sanitizer.js", "../../../node_modules/trix/src/trix/views/attachment_view.js", "../../../node_modules/trix/src/trix/views/previewable_attachment_view.js", "../../../node_modules/trix/src/trix/views/piece_view.js", "../../../node_modules/trix/src/trix/views/text_view.js", "../../../node_modules/trix/src/trix/views/block_view.js", "../../../node_modules/trix/src/trix/views/document_view.js", "../../../node_modules/trix/src/trix/models/piece.js", "../../../node_modules/trix/src/trix/operations/image_preload_operation.js", "../../../node_modules/trix/src/trix/models/attachment.js", "../../../node_modules/trix/src/trix/models/attachment_piece.js", "../../../node_modules/trix/src/trix/models/string_piece.js", "../../../node_modules/trix/src/trix/models/splittable_list.js", "../../../node_modules/trix/src/trix/models/text.js", "../../../node_modules/trix/src/trix/models/block.js", "../../../node_modules/trix/src/trix/models/document.js", "../../../node_modules/trix/src/trix/models/html_parser.js", "../../../node_modules/trix/src/trix/core/serialization.js", "../../../node_modules/trix/src/trix/models/managed_attachment.js", "../../../node_modules/trix/src/trix/models/attachment_manager.js", "../../../node_modules/trix/src/trix/models/line_break_insertion.js", "../../../node_modules/trix/src/trix/models/composition.js", "../../../node_modules/trix/src/trix/models/undo_manager.js", "../../../node_modules/trix/src/trix/filters/filter.js", "../../../node_modules/trix/src/trix/filters/attachment_gallery_filter.js", "../../../node_modules/trix/src/trix/models/editor.js", "../../../node_modules/trix/src/trix/models/location_mapper.js", "../../../node_modules/trix/src/trix/models/point_mapper.js", "../../../node_modules/trix/src/trix/models/selection_manager.js", "../../../node_modules/trix/src/trix/controllers/attachment_editor_controller.js", "../../../node_modules/trix/src/trix/controllers/composition_controller.js", "../../../node_modules/trix/src/trix/controllers/controller.js", "../../../node_modules/trix/src/trix/observers/mutation_observer.js", "../../../node_modules/trix/src/trix/operations/file_verification_operation.js", "../../../node_modules/trix/src/trix/models/flaky_android_keyboard_detector.js", "../../../node_modules/trix/src/trix/controllers/input_controller.js", "../../../node_modules/trix/src/trix/controllers/level_0_input_controller.js", "../../../node_modules/trix/src/trix/controllers/level_2_input_controller.js", "../../../node_modules/trix/src/trix/controllers/toolbar_controller.js", "../../../node_modules/trix/src/trix/controllers/editor_controller.js", "../../../node_modules/trix/src/trix/elements/trix_toolbar_element.js", "../../../node_modules/trix/src/trix/elements/trix_editor_element.js", "../../../node_modules/trix/src/trix/trix.js", "../../../node_modules/@rails/actiontext/app/assets/javascripts/actiontext.esm.js", "../../../node_modules/@hotwired/stimulus/dist/stimulus.js", "../../javascript/controllers/application.js", "../../javascript/controllers/access_controller.js", "../../javascript/controllers/anchor_controller.js", "../../javascript/controllers/dismiss_controller.js", "../../javascript/controllers/download_poller_controller.js", "../../javascript/controllers/flash_controller.js", "../../javascript/controllers/article_translation_controller.js", "../../javascript/shared/toast.js", "../../javascript/controllers/audio_controller.js", "../../javascript/controllers/bulk_controller.js", "../../javascript/shared/cart.js", "../../javascript/shared/cookies.js", "../../../node_modules/@rails/request.js/src/fetch_response.js", "../../../node_modules/@rails/request.js/src/request_interceptor.js", "../../../node_modules/@rails/request.js/src/lib/utils.js", "../../../node_modules/@rails/request.js/src/fetch_request.js", "../../../node_modules/@rails/request.js/src/verbs.js", "../../javascript/controllers/cart_controller.js", "../../javascript/controllers/chart_controller.js", "../../javascript/controllers/clipboard_controller.js", "../../javascript/controllers/combobox_controller.js", "../../javascript/controllers/color_field_controller.js", "../../javascript/controllers/multi_select_controller.js", "../../javascript/controllers/content_translation_controller.js", "../../javascript/controllers/cookie_consent_controller.js", "../../javascript/controllers/datalist_controller.js", "../../javascript/controllers/datalayer_controller.js", "../../javascript/controllers/display_controller.js", "../../javascript/controllers/external_redirect_controller.js", "../../javascript/controllers/filter_controller.js", "../../../node_modules/flatpickr/dist/esm/types/options.js", "../../../node_modules/flatpickr/dist/esm/l10n/default.js", "../../../node_modules/flatpickr/dist/esm/utils/index.js", "../../../node_modules/flatpickr/dist/esm/utils/dom.js", "../../../node_modules/flatpickr/dist/esm/utils/formatting.js", "../../../node_modules/flatpickr/dist/esm/utils/dates.js", "../../../node_modules/flatpickr/dist/esm/utils/polyfills.js", "../../../node_modules/flatpickr/dist/esm/index.js", "../../../node_modules/stimulus-flatpickr/node_modules/@hotwired/stimulus/dist/stimulus.js", "../../../node_modules/stimulus-flatpickr/src/utils.js", "../../../node_modules/stimulus-flatpickr/src/config_options.js", "../../../node_modules/stimulus-flatpickr/src/events.js", "../../../node_modules/stimulus-flatpickr/src/elements.js", "../../../node_modules/stimulus-flatpickr/src/strftime_mapping.js", "../../../node_modules/stimulus-flatpickr/src/index.js", "../../javascript/controllers/flatpickr_controller.js", "../../../node_modules/lodash-es/isObject.js", "../../../node_modules/lodash-es/_freeGlobal.js", "../../../node_modules/lodash-es/_root.js", "../../../node_modules/lodash-es/now.js", "../../../node_modules/lodash-es/_trimmedEndIndex.js", "../../../node_modules/lodash-es/_baseTrim.js", "../../../node_modules/lodash-es/_Symbol.js", "../../../node_modules/lodash-es/_getRawTag.js", "../../../node_modules/lodash-es/_objectToString.js", "../../../node_modules/lodash-es/_baseGetTag.js", "../../../node_modules/lodash-es/isObjectLike.js", "../../../node_modules/lodash-es/isSymbol.js", "../../../node_modules/lodash-es/toNumber.js", "../../../node_modules/lodash-es/debounce.js", "../../../node_modules/lodash-es/throttle.js", "../../javascript/controllers/form_controller.js", "../../javascript/controllers/form_submission_controller.js", "../../javascript/controllers/pricing_controller.js", "../../javascript/controllers/range_controller.js", "../../javascript/controllers/recaptcha_controller.js", "../../javascript/controllers/reviews_controller.js", "../../javascript/controllers/stripe_controller.js", "../../javascript/controllers/tabs_controller.js", "../../javascript/controllers/touched_controller.js", "../../javascript/controllers/tutorial_search_controller.js", "../../javascript/controllers/modal_controller.js", "../../javascript/controllers/onboarding_controller.js", "../../javascript/controllers/infinite_scroll_controller.js", "../../javascript/controllers/manual_search_controller.js", "../../javascript/controllers/page_layout_controller.js", "../../javascript/controllers/hero_video_controller.js", "../../javascript/controllers/carousel_controller.js", "../../javascript/controllers/feed_controller.js", "../../javascript/controllers/header_offset_controller.js", "../../javascript/controllers/announcement_top_banner_controller.js", "../../javascript/controllers/index.js", "../../javascript/application.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\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n    function verb(n) { return function (v) { return step([n, v]); }; }\n    function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n            if (y = 0, t) op = [op[0] & 2, t.value];\n            switch (op[0]) {\n                case 0: case 1: t = op; break;\n                case 4: _.label++; return { value: op[1], done: false };\n                case 5: _.label++; y = op[1]; op = [0]; continue;\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\n                default:\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                    if (t[2]) _.ops.pop();\n                    _.trys.pop(); continue;\n            }\n            op = body.call(thisArg, _);\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n    }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ReCaptchaInstance = void 0;\nvar ReCaptchaInstance = (function () {\n    function ReCaptchaInstance(siteKey, recaptchaID, recaptcha) {\n        this.siteKey = siteKey;\n        this.recaptchaID = recaptchaID;\n        this.recaptcha = recaptcha;\n        this.styleContainer = null;\n    }\n    ReCaptchaInstance.prototype.execute = function (action) {\n        return __awaiter(this, void 0, void 0, function () {\n            return __generator(this, function (_a) {\n                return [2, this.recaptcha.enterprise ? this.recaptcha.enterprise.execute(this.recaptchaID, { action: action }) : this.recaptcha.execute(this.recaptchaID, { action: action })];\n            });\n        });\n    };\n    ReCaptchaInstance.prototype.getSiteKey = function () {\n        return this.siteKey;\n    };\n    ReCaptchaInstance.prototype.hideBadge = function () {\n        if (this.styleContainer !== null) {\n            return;\n        }\n        this.styleContainer = document.createElement('style');\n        this.styleContainer.innerHTML = '.grecaptcha-badge{visibility:hidden !important;}';\n        document.head.appendChild(this.styleContainer);\n    };\n    ReCaptchaInstance.prototype.showBadge = function () {\n        if (this.styleContainer === null) {\n            return;\n        }\n        document.head.removeChild(this.styleContainer);\n        this.styleContainer = null;\n    };\n    return ReCaptchaInstance;\n}());\nexports.ReCaptchaInstance = ReCaptchaInstance;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getInstance = exports.load = void 0;\nvar ReCaptchaInstance_1 = require(\"./ReCaptchaInstance\");\nvar ELoadingState;\n(function (ELoadingState) {\n    ELoadingState[ELoadingState[\"NOT_LOADED\"] = 0] = \"NOT_LOADED\";\n    ELoadingState[ELoadingState[\"LOADING\"] = 1] = \"LOADING\";\n    ELoadingState[ELoadingState[\"LOADED\"] = 2] = \"LOADED\";\n})(ELoadingState || (ELoadingState = {}));\nvar ReCaptchaLoader = (function () {\n    function ReCaptchaLoader() {\n    }\n    ReCaptchaLoader.load = function (siteKey, options) {\n        if (options === void 0) { options = {}; }\n        if (typeof document === 'undefined') {\n            return Promise.reject(new Error('This is a library for the browser!'));\n        }\n        if (ReCaptchaLoader.getLoadingState() === ELoadingState.LOADED) {\n            if (ReCaptchaLoader.instance.getSiteKey() === siteKey) {\n                return Promise.resolve(ReCaptchaLoader.instance);\n            }\n            else {\n                return Promise.reject(new Error('reCAPTCHA already loaded with different site key!'));\n            }\n        }\n        if (ReCaptchaLoader.getLoadingState() === ELoadingState.LOADING) {\n            if (siteKey !== ReCaptchaLoader.instanceSiteKey) {\n                return Promise.reject(new Error('reCAPTCHA already loaded with different site key!'));\n            }\n            return new Promise(function (resolve, reject) {\n                ReCaptchaLoader.successfulLoadingConsumers.push(function (instance) { return resolve(instance); });\n                ReCaptchaLoader.errorLoadingRunnable.push(function (reason) { return reject(reason); });\n            });\n        }\n        ReCaptchaLoader.instanceSiteKey = siteKey;\n        ReCaptchaLoader.setLoadingState(ELoadingState.LOADING);\n        var loader = new ReCaptchaLoader();\n        return new Promise(function (resolve, reject) {\n            loader.loadScript(siteKey, options.useRecaptchaNet || false, options.useEnterprise || false, options.renderParameters ? options.renderParameters : {}, options.customUrl).then(function () {\n                ReCaptchaLoader.setLoadingState(ELoadingState.LOADED);\n                var widgetID = loader.doExplicitRender(grecaptcha, siteKey, options.explicitRenderParameters ? options.explicitRenderParameters : {}, options.useEnterprise || false);\n                var instance = new ReCaptchaInstance_1.ReCaptchaInstance(siteKey, widgetID, grecaptcha);\n                ReCaptchaLoader.successfulLoadingConsumers.forEach(function (v) { return v(instance); });\n                ReCaptchaLoader.successfulLoadingConsumers = [];\n                if (options.autoHideBadge) {\n                    instance.hideBadge();\n                }\n                ReCaptchaLoader.instance = instance;\n                resolve(instance);\n            }).catch(function (error) {\n                ReCaptchaLoader.errorLoadingRunnable.forEach(function (v) { return v(error); });\n                ReCaptchaLoader.errorLoadingRunnable = [];\n                reject(error);\n            });\n        });\n    };\n    ReCaptchaLoader.getInstance = function () {\n        return ReCaptchaLoader.instance;\n    };\n    ReCaptchaLoader.setLoadingState = function (state) {\n        ReCaptchaLoader.loadingState = state;\n    };\n    ReCaptchaLoader.getLoadingState = function () {\n        if (ReCaptchaLoader.loadingState === null) {\n            return ELoadingState.NOT_LOADED;\n        }\n        else {\n            return ReCaptchaLoader.loadingState;\n        }\n    };\n    ReCaptchaLoader.prototype.loadScript = function (siteKey, useRecaptchaNet, useEnterprise, renderParameters, customUrl) {\n        var _this = this;\n        if (useRecaptchaNet === void 0) { useRecaptchaNet = false; }\n        if (useEnterprise === void 0) { useEnterprise = false; }\n        if (renderParameters === void 0) { renderParameters = {}; }\n        if (customUrl === void 0) { customUrl = ''; }\n        var scriptElement = document.createElement('script');\n        scriptElement.setAttribute('recaptcha-v3-script', '');\n        var scriptBase = 'https://www.google.com/recaptcha/api.js';\n        if (useRecaptchaNet) {\n            if (useEnterprise) {\n                scriptBase = 'https://recaptcha.net/recaptcha/enterprise.js';\n            }\n            else {\n                scriptBase = 'https://recaptcha.net/recaptcha/api.js';\n            }\n        }\n        if (useEnterprise) {\n            scriptBase = 'https://www.google.com/recaptcha/enterprise.js';\n        }\n        if (customUrl) {\n            scriptBase = customUrl;\n        }\n        if (renderParameters.render) {\n            renderParameters.render = undefined;\n        }\n        var parametersQuery = this.buildQueryString(renderParameters);\n        scriptElement.src = scriptBase + '?render=explicit' + parametersQuery;\n        return new Promise(function (resolve, reject) {\n            scriptElement.addEventListener('load', _this.waitForScriptToLoad(function () {\n                resolve(scriptElement);\n            }, useEnterprise), false);\n            scriptElement.onerror = function (error) {\n                ReCaptchaLoader.setLoadingState(ELoadingState.NOT_LOADED);\n                reject(error);\n            };\n            document.head.appendChild(scriptElement);\n        });\n    };\n    ReCaptchaLoader.prototype.buildQueryString = function (parameters) {\n        var parameterKeys = Object.keys(parameters);\n        if (parameterKeys.length < 1) {\n            return '';\n        }\n        return '&' + Object.keys(parameters)\n            .filter(function (parameterKey) {\n            return !!parameters[parameterKey];\n        })\n            .map(function (parameterKey) {\n            return parameterKey + '=' + parameters[parameterKey];\n        }).join('&');\n    };\n    ReCaptchaLoader.prototype.waitForScriptToLoad = function (callback, useEnterprise) {\n        var _this = this;\n        return function () {\n            if (window.grecaptcha === undefined) {\n                setTimeout(function () {\n                    _this.waitForScriptToLoad(callback, useEnterprise);\n                }, ReCaptchaLoader.SCRIPT_LOAD_DELAY);\n            }\n            else {\n                if (useEnterprise) {\n                    window.grecaptcha.enterprise.ready(function () {\n                        callback();\n                    });\n                }\n                else {\n                    window.grecaptcha.ready(function () {\n                        callback();\n                    });\n                }\n            }\n        };\n    };\n    ReCaptchaLoader.prototype.doExplicitRender = function (grecaptcha, siteKey, parameters, isEnterprise) {\n        var augmentedParameters = {\n            sitekey: siteKey,\n            badge: parameters.badge,\n            size: parameters.size,\n            tabindex: parameters.tabindex\n        };\n        if (parameters.container) {\n            if (isEnterprise) {\n                return grecaptcha.enterprise.render(parameters.container, augmentedParameters);\n            }\n            else {\n                return grecaptcha.render(parameters.container, augmentedParameters);\n            }\n        }\n        else {\n            if (isEnterprise) {\n                return grecaptcha.enterprise.render(augmentedParameters);\n            }\n            else {\n                return grecaptcha.render(augmentedParameters);\n            }\n        }\n    };\n    ReCaptchaLoader.loadingState = null;\n    ReCaptchaLoader.instance = null;\n    ReCaptchaLoader.instanceSiteKey = null;\n    ReCaptchaLoader.successfulLoadingConsumers = [];\n    ReCaptchaLoader.errorLoadingRunnable = [];\n    ReCaptchaLoader.SCRIPT_LOAD_DELAY = 25;\n    return ReCaptchaLoader;\n}());\nexports.load = ReCaptchaLoader.load;\nexports.getInstance = ReCaptchaLoader.getInstance;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ReCaptchaInstance = exports.getInstance = exports.load = void 0;\nvar ReCaptchaLoader_1 = require(\"./ReCaptchaLoader\");\nObject.defineProperty(exports, \"load\", { enumerable: true, get: function () { return ReCaptchaLoader_1.load; } });\nObject.defineProperty(exports, \"getInstance\", { enumerable: true, get: function () { return ReCaptchaLoader_1.getInstance; } });\nvar ReCaptchaInstance_1 = require(\"./ReCaptchaInstance\");\nObject.defineProperty(exports, \"ReCaptchaInstance\", { enumerable: true, get: function () { return ReCaptchaInstance_1.ReCaptchaInstance; } });\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nvar V3_URL = 'https://js.stripe.com/v3';\nvar V3_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/v3\\/?(\\?.*)?$/;\nvar EXISTING_SCRIPT_MESSAGE = 'loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used';\nvar findScript = function findScript() {\n  var scripts = document.querySelectorAll(\"script[src^=\\\"\".concat(V3_URL, \"\\\"]\"));\n\n  for (var i = 0; i < scripts.length; i++) {\n    var script = scripts[i];\n\n    if (!V3_URL_REGEX.test(script.src)) {\n      continue;\n    }\n\n    return script;\n  }\n\n  return null;\n};\n\nvar injectScript = function injectScript(params) {\n  var queryString = params && !params.advancedFraudSignals ? '?advancedFraudSignals=false' : '';\n  var script = document.createElement('script');\n  script.src = \"\".concat(V3_URL).concat(queryString);\n  var headOrBody = document.head || document.body;\n\n  if (!headOrBody) {\n    throw new Error('Expected document.body not to be null. Stripe.js requires a <body> element.');\n  }\n\n  headOrBody.appendChild(script);\n  return script;\n};\n\nvar registerWrapper = function registerWrapper(stripe, startTime) {\n  if (!stripe || !stripe._registerWrapper) {\n    return;\n  }\n\n  stripe._registerWrapper({\n    name: 'stripe-js',\n    version: \"1.25.0\",\n    startTime: startTime\n  });\n};\n\nvar stripePromise = null;\nvar loadScript = function loadScript(params) {\n  // Ensure that we only attempt to load Stripe.js at most once\n  if (stripePromise !== null) {\n    return stripePromise;\n  }\n\n  stripePromise = new Promise(function (resolve, reject) {\n    if (typeof window === 'undefined') {\n      // Resolve to null when imported server side. This makes the module\n      // safe to import in an isomorphic code base.\n      resolve(null);\n      return;\n    }\n\n    if (window.Stripe && params) {\n      console.warn(EXISTING_SCRIPT_MESSAGE);\n    }\n\n    if (window.Stripe) {\n      resolve(window.Stripe);\n      return;\n    }\n\n    try {\n      var script = findScript();\n\n      if (script && params) {\n        console.warn(EXISTING_SCRIPT_MESSAGE);\n      } else if (!script) {\n        script = injectScript(params);\n      }\n\n      script.addEventListener('load', function () {\n        if (window.Stripe) {\n          resolve(window.Stripe);\n        } else {\n          reject(new Error('Stripe.js not available'));\n        }\n      });\n      script.addEventListener('error', function () {\n        reject(new Error('Failed to load Stripe.js'));\n      });\n    } catch (error) {\n      reject(error);\n      return;\n    }\n  });\n  return stripePromise;\n};\nvar initStripe = function initStripe(maybeStripe, args, startTime) {\n  if (maybeStripe === null) {\n    return null;\n  }\n\n  var stripe = maybeStripe.apply(undefined, args);\n  registerWrapper(stripe, startTime);\n  return stripe;\n};\nvar validateLoadParams = function validateLoadParams(params) {\n  var errorMessage = \"invalid load parameters; expected object of shape\\n\\n    {advancedFraudSignals: boolean}\\n\\nbut received\\n\\n    \".concat(JSON.stringify(params), \"\\n\");\n\n  if (params === null || _typeof(params) !== 'object') {\n    throw new Error(errorMessage);\n  }\n\n  if (Object.keys(params).length === 1 && typeof params.advancedFraudSignals === 'boolean') {\n    return params;\n  }\n\n  throw new Error(errorMessage);\n};\n\nvar loadParams;\nvar loadStripeCalled = false;\nvar loadStripe = function loadStripe() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  loadStripeCalled = true;\n  var startTime = Date.now();\n  return loadScript(loadParams).then(function (maybeStripe) {\n    return initStripe(maybeStripe, args, startTime);\n  });\n};\n\nloadStripe.setLoadParameters = function (params) {\n  if (loadStripeCalled) {\n    throw new Error('You cannot change load parameters after calling loadStripe');\n  }\n\n  loadParams = validateLoadParams(params);\n};\n\nexports.loadStripe = loadStripe;\n", "module.exports = require('./dist/pure.js');\n", "/*\nTurbo 7.1.0\nCopyright \u00A9 2021 Basecamp, LLC\n */\n(function () {\n    if (window.Reflect === undefined || window.customElements === undefined ||\n        window.customElements.polyfillWrapFlushCallback) {\n        return;\n    }\n    const BuiltInHTMLElement = HTMLElement;\n    const wrapperForTheName = {\n        'HTMLElement': function HTMLElement() {\n            return Reflect.construct(BuiltInHTMLElement, [], this.constructor);\n        }\n    };\n    window.HTMLElement =\n        wrapperForTheName['HTMLElement'];\n    HTMLElement.prototype = BuiltInHTMLElement.prototype;\n    HTMLElement.prototype.constructor = HTMLElement;\n    Object.setPrototypeOf(HTMLElement, BuiltInHTMLElement);\n})();\n\n/**\n * The MIT License (MIT)\n * \n * Copyright (c) 2019 Javan Makhmali\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n(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    } else {\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\n  function validateSubmitter(submitter, form) {\n    submitter instanceof HTMLElement || raise(TypeError, \"parameter 1 is not of type 'HTMLElement'\");\n    submitter.type == \"submit\" || raise(TypeError, \"The specified element is not a submit button\");\n    submitter.form == form || raise(DOMException, \"The specified element is not owned by this form element\", \"NotFoundError\");\n  }\n\n  function raise(errorConstructor, message, name) {\n    throw new errorConstructor(\"Failed to execute 'requestSubmit' on 'HTMLFormElement': \" + message + \".\", name)\n  }\n})(HTMLFormElement.prototype);\n\nconst submittersByForm = new WeakMap;\nfunction findSubmitterFromClickTarget(target) {\n    const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n    const candidate = element ? element.closest(\"input, button\") : null;\n    return (candidate === null || candidate === void 0 ? void 0 : candidate.type) == \"submit\" ? candidate : null;\n}\nfunction clickCaptured(event) {\n    const submitter = findSubmitterFromClickTarget(event.target);\n    if (submitter && submitter.form) {\n        submittersByForm.set(submitter.form, submitter);\n    }\n}\n(function () {\n    if (\"submitter\" in Event.prototype)\n        return;\n    let prototype;\n    if (\"SubmitEvent\" in window && /Apple Computer/.test(navigator.vendor)) {\n        prototype = window.SubmitEvent.prototype;\n    }\n    else if (\"SubmitEvent\" in window) {\n        return;\n    }\n    else {\n        prototype = window.Event.prototype;\n    }\n    addEventListener(\"click\", clickCaptured, true);\n    Object.defineProperty(prototype, \"submitter\", {\n        get() {\n            if (this.type == \"submit\" && this.target instanceof HTMLFormElement) {\n                return submittersByForm.get(this.target);\n            }\n        }\n    });\n})();\n\nvar FrameLoadingStyle;\n(function (FrameLoadingStyle) {\n    FrameLoadingStyle[\"eager\"] = \"eager\";\n    FrameLoadingStyle[\"lazy\"] = \"lazy\";\n})(FrameLoadingStyle || (FrameLoadingStyle = {}));\nclass FrameElement extends HTMLElement {\n    constructor() {\n        super();\n        this.loaded = Promise.resolve();\n        this.delegate = new FrameElement.delegateConstructor(this);\n    }\n    static get observedAttributes() {\n        return [\"disabled\", \"loading\", \"src\"];\n    }\n    connectedCallback() {\n        this.delegate.connect();\n    }\n    disconnectedCallback() {\n        this.delegate.disconnect();\n    }\n    reload() {\n        const { src } = this;\n        this.src = null;\n        this.src = src;\n    }\n    attributeChangedCallback(name) {\n        if (name == \"loading\") {\n            this.delegate.loadingStyleChanged();\n        }\n        else if (name == \"src\") {\n            this.delegate.sourceURLChanged();\n        }\n        else {\n            this.delegate.disabledChanged();\n        }\n    }\n    get src() {\n        return this.getAttribute(\"src\");\n    }\n    set src(value) {\n        if (value) {\n            this.setAttribute(\"src\", value);\n        }\n        else {\n            this.removeAttribute(\"src\");\n        }\n    }\n    get loading() {\n        return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\");\n    }\n    set loading(value) {\n        if (value) {\n            this.setAttribute(\"loading\", value);\n        }\n        else {\n            this.removeAttribute(\"loading\");\n        }\n    }\n    get disabled() {\n        return this.hasAttribute(\"disabled\");\n    }\n    set disabled(value) {\n        if (value) {\n            this.setAttribute(\"disabled\", \"\");\n        }\n        else {\n            this.removeAttribute(\"disabled\");\n        }\n    }\n    get autoscroll() {\n        return this.hasAttribute(\"autoscroll\");\n    }\n    set autoscroll(value) {\n        if (value) {\n            this.setAttribute(\"autoscroll\", \"\");\n        }\n        else {\n            this.removeAttribute(\"autoscroll\");\n        }\n    }\n    get complete() {\n        return !this.delegate.isLoading;\n    }\n    get isActive() {\n        return this.ownerDocument === document && !this.isPreview;\n    }\n    get isPreview() {\n        var _a, _b;\n        return (_b = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.hasAttribute(\"data-turbo-preview\");\n    }\n}\nfunction frameLoadingStyleFromString(style) {\n    switch (style.toLowerCase()) {\n        case \"lazy\": return FrameLoadingStyle.lazy;\n        default: return FrameLoadingStyle.eager;\n    }\n}\n\nfunction expandURL(locatable) {\n    return new URL(locatable.toString(), document.baseURI);\n}\nfunction getAnchor(url) {\n    let anchorMatch;\n    if (url.hash) {\n        return url.hash.slice(1);\n    }\n    else if (anchorMatch = url.href.match(/#(.*)$/)) {\n        return anchorMatch[1];\n    }\n}\nfunction getAction(form, submitter) {\n    const action = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formaction\")) || form.getAttribute(\"action\") || form.action;\n    return expandURL(action);\n}\nfunction getExtension(url) {\n    return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\";\n}\nfunction isHTML(url) {\n    return !!getExtension(url).match(/^(?:|\\.(?:htm|html|xhtml))$/);\n}\nfunction isPrefixedBy(baseURL, url) {\n    const prefix = getPrefix(url);\n    return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix);\n}\nfunction locationIsVisitable(location, rootLocation) {\n    return isPrefixedBy(location, rootLocation) && isHTML(location);\n}\nfunction getRequestURL(url) {\n    const anchor = getAnchor(url);\n    return anchor != null\n        ? url.href.slice(0, -(anchor.length + 1))\n        : url.href;\n}\nfunction toCacheKey(url) {\n    return getRequestURL(url);\n}\nfunction urlsAreEqual(left, right) {\n    return expandURL(left).href == expandURL(right).href;\n}\nfunction getPathComponents(url) {\n    return url.pathname.split(\"/\").slice(1);\n}\nfunction getLastPathComponent(url) {\n    return getPathComponents(url).slice(-1)[0];\n}\nfunction getPrefix(url) {\n    return addTrailingSlash(url.origin + url.pathname);\n}\nfunction addTrailingSlash(value) {\n    return value.endsWith(\"/\") ? value : value + \"/\";\n}\n\nclass FetchResponse {\n    constructor(response) {\n        this.response = response;\n    }\n    get succeeded() {\n        return this.response.ok;\n    }\n    get failed() {\n        return !this.succeeded;\n    }\n    get clientError() {\n        return this.statusCode >= 400 && this.statusCode <= 499;\n    }\n    get serverError() {\n        return this.statusCode >= 500 && this.statusCode <= 599;\n    }\n    get redirected() {\n        return this.response.redirected;\n    }\n    get location() {\n        return expandURL(this.response.url);\n    }\n    get isHTML() {\n        return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/);\n    }\n    get statusCode() {\n        return this.response.status;\n    }\n    get contentType() {\n        return this.header(\"Content-Type\");\n    }\n    get responseText() {\n        return this.response.clone().text();\n    }\n    get responseHTML() {\n        if (this.isHTML) {\n            return this.response.clone().text();\n        }\n        else {\n            return Promise.resolve(undefined);\n        }\n    }\n    header(name) {\n        return this.response.headers.get(name);\n    }\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n    const event = new CustomEvent(eventName, { cancelable, bubbles: true, detail });\n    if (target && target.isConnected) {\n        target.dispatchEvent(event);\n    }\n    else {\n        document.documentElement.dispatchEvent(event);\n    }\n    return event;\n}\nfunction nextAnimationFrame() {\n    return new Promise(resolve => requestAnimationFrame(() => resolve()));\n}\nfunction nextEventLoopTick() {\n    return new Promise(resolve => setTimeout(() => resolve(), 0));\n}\nfunction nextMicrotask() {\n    return Promise.resolve();\n}\nfunction parseHTMLDocument(html = \"\") {\n    return new DOMParser().parseFromString(html, \"text/html\");\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}\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}\nfunction uuid() {\n    return Array.apply(null, { length: 36 }).map((_, i) => {\n        if (i == 8 || i == 13 || i == 18 || i == 23) {\n            return \"-\";\n        }\n        else if (i == 14) {\n            return \"4\";\n        }\n        else if (i == 19) {\n            return (Math.floor(Math.random() * 4) + 8).toString(16);\n        }\n        else {\n            return Math.floor(Math.random() * 15).toString(16);\n        }\n    }).join(\"\");\n}\nfunction getAttribute(attributeName, ...elements) {\n    for (const value of elements.map(element => element === null || element === void 0 ? void 0 : element.getAttribute(attributeName))) {\n        if (typeof value == \"string\")\n            return value;\n    }\n    return null;\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}\nfunction clearBusyState(...elements) {\n    for (const element of elements) {\n        if (element.localName == \"turbo-frame\") {\n            element.removeAttribute(\"busy\");\n        }\n        element.removeAttribute(\"aria-busy\");\n    }\n}\n\nvar FetchMethod;\n(function (FetchMethod) {\n    FetchMethod[FetchMethod[\"get\"] = 0] = \"get\";\n    FetchMethod[FetchMethod[\"post\"] = 1] = \"post\";\n    FetchMethod[FetchMethod[\"put\"] = 2] = \"put\";\n    FetchMethod[FetchMethod[\"patch\"] = 3] = \"patch\";\n    FetchMethod[FetchMethod[\"delete\"] = 4] = \"delete\";\n})(FetchMethod || (FetchMethod = {}));\nfunction fetchMethodFromString(method) {\n    switch (method.toLowerCase()) {\n        case \"get\": return FetchMethod.get;\n        case \"post\": return FetchMethod.post;\n        case \"put\": return FetchMethod.put;\n        case \"patch\": return FetchMethod.patch;\n        case \"delete\": return FetchMethod.delete;\n    }\n}\nclass FetchRequest {\n    constructor(delegate, method, location, body = new URLSearchParams, target = null) {\n        this.abortController = new AbortController;\n        this.resolveRequestPromise = (value) => { };\n        this.delegate = delegate;\n        this.method = method;\n        this.headers = this.defaultHeaders;\n        this.body = body;\n        this.url = location;\n        this.target = target;\n    }\n    get location() {\n        return this.url;\n    }\n    get params() {\n        return this.url.searchParams;\n    }\n    get entries() {\n        return this.body ? Array.from(this.body.entries()) : [];\n    }\n    cancel() {\n        this.abortController.abort();\n    }\n    async perform() {\n        var _a, _b;\n        const { fetchOptions } = this;\n        (_b = (_a = this.delegate).prepareHeadersForRequest) === null || _b === void 0 ? void 0 : _b.call(_a, this.headers, this);\n        await this.allowRequestToBeIntercepted(fetchOptions);\n        try {\n            this.delegate.requestStarted(this);\n            const response = await fetch(this.url.href, fetchOptions);\n            return await this.receive(response);\n        }\n        catch (error) {\n            if (error.name !== 'AbortError') {\n                this.delegate.requestErrored(this, error);\n                throw error;\n            }\n        }\n        finally {\n            this.delegate.requestFinished(this);\n        }\n    }\n    async receive(response) {\n        const fetchResponse = new FetchResponse(response);\n        const event = dispatch(\"turbo:before-fetch-response\", { cancelable: true, detail: { fetchResponse }, target: this.target });\n        if (event.defaultPrevented) {\n            this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n        }\n        else if (fetchResponse.succeeded) {\n            this.delegate.requestSucceededWithResponse(this, fetchResponse);\n        }\n        else {\n            this.delegate.requestFailedWithResponse(this, fetchResponse);\n        }\n        return fetchResponse;\n    }\n    get fetchOptions() {\n        var _a;\n        return {\n            method: FetchMethod[this.method].toUpperCase(),\n            credentials: \"same-origin\",\n            headers: this.headers,\n            redirect: \"follow\",\n            body: this.isIdempotent ? null : this.body,\n            signal: this.abortSignal,\n            referrer: (_a = this.delegate.referrer) === null || _a === void 0 ? void 0 : _a.href\n        };\n    }\n    get defaultHeaders() {\n        return {\n            \"Accept\": \"text/html, application/xhtml+xml\"\n        };\n    }\n    get isIdempotent() {\n        return this.method == FetchMethod.get;\n    }\n    get abortSignal() {\n        return this.abortController.signal;\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        if (event.defaultPrevented)\n            await requestInterception;\n    }\n}\n\nclass AppearanceObserver {\n    constructor(delegate, element) {\n        this.started = false;\n        this.intersect = entries => {\n            const lastEntry = entries.slice(-1)[0];\n            if (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.isIntersecting) {\n                this.delegate.elementAppearedInViewport(this.element);\n            }\n        };\n        this.delegate = delegate;\n        this.element = element;\n        this.intersectionObserver = new IntersectionObserver(this.intersect);\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.intersectionObserver.observe(this.element);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.intersectionObserver.unobserve(this.element);\n        }\n    }\n}\n\nclass StreamMessage {\n    constructor(html) {\n        this.templateElement = document.createElement(\"template\");\n        this.templateElement.innerHTML = html;\n    }\n    static wrap(message) {\n        if (typeof message == \"string\") {\n            return new this(message);\n        }\n        else {\n            return message;\n        }\n    }\n    get fragment() {\n        const fragment = document.createDocumentFragment();\n        for (const element of this.foreignElements) {\n            fragment.appendChild(document.importNode(element, true));\n        }\n        return fragment;\n    }\n    get foreignElements() {\n        return this.templateChildren.reduce((streamElements, child) => {\n            if (child.tagName.toLowerCase() == \"turbo-stream\") {\n                return [...streamElements, child];\n            }\n            else {\n                return streamElements;\n            }\n        }, []);\n    }\n    get templateChildren() {\n        return Array.from(this.templateElement.content.children);\n    }\n}\nStreamMessage.contentType = \"text/vnd.turbo-stream.html\";\n\nvar FormSubmissionState;\n(function (FormSubmissionState) {\n    FormSubmissionState[FormSubmissionState[\"initialized\"] = 0] = \"initialized\";\n    FormSubmissionState[FormSubmissionState[\"requesting\"] = 1] = \"requesting\";\n    FormSubmissionState[FormSubmissionState[\"waiting\"] = 2] = \"waiting\";\n    FormSubmissionState[FormSubmissionState[\"receiving\"] = 3] = \"receiving\";\n    FormSubmissionState[FormSubmissionState[\"stopping\"] = 4] = \"stopping\";\n    FormSubmissionState[FormSubmissionState[\"stopped\"] = 5] = \"stopped\";\n})(FormSubmissionState || (FormSubmissionState = {}));\nvar FormEnctype;\n(function (FormEnctype) {\n    FormEnctype[\"urlEncoded\"] = \"application/x-www-form-urlencoded\";\n    FormEnctype[\"multipart\"] = \"multipart/form-data\";\n    FormEnctype[\"plain\"] = \"text/plain\";\n})(FormEnctype || (FormEnctype = {}));\nfunction formEnctypeFromString(encoding) {\n    switch (encoding.toLowerCase()) {\n        case FormEnctype.multipart: return FormEnctype.multipart;\n        case FormEnctype.plain: return FormEnctype.plain;\n        default: return FormEnctype.urlEncoded;\n    }\n}\nclass FormSubmission {\n    constructor(delegate, formElement, submitter, mustRedirect = false) {\n        this.state = FormSubmissionState.initialized;\n        this.delegate = delegate;\n        this.formElement = formElement;\n        this.submitter = submitter;\n        this.formData = buildFormData(formElement, submitter);\n        this.location = expandURL(this.action);\n        if (this.method == FetchMethod.get) {\n            mergeFormDataEntries(this.location, [...this.body.entries()]);\n        }\n        this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body, this.formElement);\n        this.mustRedirect = mustRedirect;\n    }\n    static confirmMethod(message, element) {\n        return confirm(message);\n    }\n    get method() {\n        var _a;\n        const method = ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formmethod\")) || this.formElement.getAttribute(\"method\") || \"\";\n        return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get;\n    }\n    get action() {\n        var _a;\n        const formElementAction = typeof this.formElement.action === 'string' ? this.formElement.action : null;\n        return ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formaction\")) || this.formElement.getAttribute(\"action\") || formElementAction || \"\";\n    }\n    get body() {\n        if (this.enctype == FormEnctype.urlEncoded || this.method == FetchMethod.get) {\n            return new URLSearchParams(this.stringFormData);\n        }\n        else {\n            return this.formData;\n        }\n    }\n    get enctype() {\n        var _a;\n        return formEnctypeFromString(((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formenctype\")) || this.formElement.enctype);\n    }\n    get isIdempotent() {\n        return this.fetchRequest.isIdempotent;\n    }\n    get stringFormData() {\n        return [...this.formData].reduce((entries, [name, value]) => {\n            return entries.concat(typeof value == \"string\" ? [[name, value]] : []);\n        }, []);\n    }\n    get confirmationMessage() {\n        return this.formElement.getAttribute(\"data-turbo-confirm\");\n    }\n    get needsConfirmation() {\n        return this.confirmationMessage !== null;\n    }\n    async start() {\n        const { initialized, requesting } = FormSubmissionState;\n        if (this.needsConfirmation) {\n            const answer = FormSubmission.confirmMethod(this.confirmationMessage, this.formElement);\n            if (!answer) {\n                return;\n            }\n        }\n        if (this.state == initialized) {\n            this.state = requesting;\n            return this.fetchRequest.perform();\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    prepareHeadersForRequest(headers, request) {\n        if (!request.isIdempotent) {\n            const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n            if (token) {\n                headers[\"X-CSRF-Token\"] = token;\n            }\n            headers[\"Accept\"] = [StreamMessage.contentType, headers[\"Accept\"]].join(\", \");\n        }\n    }\n    requestStarted(request) {\n        var _a;\n        this.state = FormSubmissionState.waiting;\n        (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.setAttribute(\"disabled\", \"\");\n        dispatch(\"turbo:submit-start\", { target: this.formElement, detail: { formSubmission: this } });\n        this.delegate.formSubmissionStarted(this);\n    }\n    requestPreventedHandlingResponse(request, response) {\n        this.result = { success: response.succeeded, fetchResponse: response };\n    }\n    requestSucceededWithResponse(request, response) {\n        if (response.clientError || response.serverError) {\n            this.delegate.formSubmissionFailedWithResponse(this, response);\n        }\n        else 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        }\n        else {\n            this.state = FormSubmissionState.receiving;\n            this.result = { success: true, fetchResponse: response };\n            this.delegate.formSubmissionSucceededWithResponse(this, response);\n        }\n    }\n    requestFailedWithResponse(request, response) {\n        this.result = { success: false, fetchResponse: response };\n        this.delegate.formSubmissionFailedWithResponse(this, response);\n    }\n    requestErrored(request, error) {\n        this.result = { success: false, error };\n        this.delegate.formSubmissionErrored(this, error);\n    }\n    requestFinished(request) {\n        var _a;\n        this.state = FormSubmissionState.stopped;\n        (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.removeAttribute(\"disabled\");\n        dispatch(\"turbo:submit-end\", { target: this.formElement, detail: Object.assign({ formSubmission: this }, this.result) });\n        this.delegate.formSubmissionFinished(this);\n    }\n    requestMustRedirect(request) {\n        return !request.isIdempotent && this.mustRedirect;\n    }\n}\nfunction buildFormData(formElement, submitter) {\n    const formData = new FormData(formElement);\n    const name = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"name\");\n    const value = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"value\");\n    if (name && value != null && formData.get(name) != value) {\n        formData.append(name, value);\n    }\n    return formData;\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}\nfunction getMetaContent(name) {\n    const element = document.querySelector(`meta[name=\"${name}\"]`);\n    return element && element.content;\n}\nfunction responseSucceededWithoutRedirect(response) {\n    return response.statusCode == 200 && !response.redirected;\n}\nfunction mergeFormDataEntries(url, entries) {\n    const searchParams = new URLSearchParams;\n    for (const [name, value] of entries) {\n        if (value instanceof File)\n            continue;\n        searchParams.append(name, value);\n    }\n    url.search = searchParams.toString();\n    return url;\n}\n\nclass Snapshot {\n    constructor(element) {\n        this.element = element;\n    }\n    get children() {\n        return [...this.element.children];\n    }\n    hasAnchor(anchor) {\n        return this.getElementForAnchor(anchor) != null;\n    }\n    getElementForAnchor(anchor) {\n        return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null;\n    }\n    get isConnected() {\n        return this.element.isConnected;\n    }\n    get firstAutofocusableElement() {\n        return this.element.querySelector(\"[autofocus]\");\n    }\n    get permanentElements() {\n        return [...this.element.querySelectorAll(\"[id][data-turbo-permanent]\")];\n    }\n    getPermanentElementById(id) {\n        return this.element.querySelector(`#${id}[data-turbo-permanent]`);\n    }\n    getPermanentElementMapForSnapshot(snapshot) {\n        const permanentElementMap = {};\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        return permanentElementMap;\n    }\n}\n\nclass FormInterceptor {\n    constructor(delegate, element) {\n        this.submitBubbled = ((event) => {\n            const form = event.target;\n            if (!event.defaultPrevented && form instanceof HTMLFormElement && form.closest(\"turbo-frame, html\") == this.element) {\n                const submitter = event.submitter || undefined;\n                const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formmethod\")) || form.method;\n                if (method != \"dialog\" && this.delegate.shouldInterceptFormSubmission(form, submitter)) {\n                    event.preventDefault();\n                    event.stopImmediatePropagation();\n                    this.delegate.formSubmissionIntercepted(form, submitter);\n                }\n            }\n        });\n        this.delegate = delegate;\n        this.element = element;\n    }\n    start() {\n        this.element.addEventListener(\"submit\", this.submitBubbled);\n    }\n    stop() {\n        this.element.removeEventListener(\"submit\", this.submitBubbled);\n    }\n}\n\nclass View {\n    constructor(delegate, element) {\n        this.resolveRenderPromise = (value) => { };\n        this.resolveInterceptionPromise = (value) => { };\n        this.delegate = delegate;\n        this.element = element;\n    }\n    scrollToAnchor(anchor) {\n        const element = this.snapshot.getElementForAnchor(anchor);\n        if (element) {\n            this.scrollToElement(element);\n            this.focusElement(element);\n        }\n        else {\n            this.scrollToPosition({ x: 0, y: 0 });\n        }\n    }\n    scrollToAnchorFromLocation(location) {\n        this.scrollToAnchor(getAnchor(location));\n    }\n    scrollToElement(element) {\n        element.scrollIntoView();\n    }\n    focusElement(element) {\n        if (element instanceof HTMLElement) {\n            if (element.hasAttribute(\"tabindex\")) {\n                element.focus();\n            }\n            else {\n                element.setAttribute(\"tabindex\", \"-1\");\n                element.focus();\n                element.removeAttribute(\"tabindex\");\n            }\n        }\n    }\n    scrollToPosition({ x, y }) {\n        this.scrollRoot.scrollTo(x, y);\n    }\n    scrollToTop() {\n        this.scrollToPosition({ x: 0, y: 0 });\n    }\n    get scrollRoot() {\n        return window;\n    }\n    async render(renderer) {\n        const { isPreview, shouldRender, newSnapshot: snapshot } = renderer;\n        if (shouldRender) {\n            try {\n                this.renderPromise = new Promise(resolve => this.resolveRenderPromise = resolve);\n                this.renderer = renderer;\n                this.prepareToRenderSnapshot(renderer);\n                const renderInterception = new Promise(resolve => this.resolveInterceptionPromise = resolve);\n                const immediateRender = this.delegate.allowsImmediateRender(snapshot, this.resolveInterceptionPromise);\n                if (!immediateRender)\n                    await renderInterception;\n                await this.renderSnapshot(renderer);\n                this.delegate.viewRenderedSnapshot(snapshot, isPreview);\n                this.finishRenderingSnapshot(renderer);\n            }\n            finally {\n                delete this.renderer;\n                this.resolveRenderPromise(undefined);\n                delete this.renderPromise;\n            }\n        }\n        else {\n            this.invalidate();\n        }\n    }\n    invalidate() {\n        this.delegate.viewInvalidated();\n    }\n    prepareToRenderSnapshot(renderer) {\n        this.markAsPreview(renderer.isPreview);\n        renderer.prepareToRender();\n    }\n    markAsPreview(isPreview) {\n        if (isPreview) {\n            this.element.setAttribute(\"data-turbo-preview\", \"\");\n        }\n        else {\n            this.element.removeAttribute(\"data-turbo-preview\");\n        }\n    }\n    async renderSnapshot(renderer) {\n        await renderer.render();\n    }\n    finishRenderingSnapshot(renderer) {\n        renderer.finishRendering();\n    }\n}\n\nclass FrameView extends View {\n    invalidate() {\n        this.element.innerHTML = \"\";\n    }\n    get snapshot() {\n        return new Snapshot(this.element);\n    }\n}\n\nclass LinkInterceptor {\n    constructor(delegate, element) {\n        this.clickBubbled = (event) => {\n            if (this.respondsToEventTarget(event.target)) {\n                this.clickEvent = event;\n            }\n            else {\n                delete this.clickEvent;\n            }\n        };\n        this.linkClicked = ((event) => {\n            if (this.clickEvent && this.respondsToEventTarget(event.target) && event.target instanceof Element) {\n                if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url)) {\n                    this.clickEvent.preventDefault();\n                    event.preventDefault();\n                    this.delegate.linkClickIntercepted(event.target, event.detail.url);\n                }\n            }\n            delete this.clickEvent;\n        });\n        this.willVisit = () => {\n            delete this.clickEvent;\n        };\n        this.delegate = delegate;\n        this.element = element;\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    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    respondsToEventTarget(target) {\n        const element = target instanceof Element\n            ? target\n            : target instanceof Node\n                ? target.parentElement\n                : null;\n        return element && element.closest(\"turbo-frame, html\") == this.element;\n    }\n}\n\nclass Bardo {\n    constructor(permanentElementMap) {\n        this.permanentElementMap = permanentElementMap;\n    }\n    static preservingPermanentElements(permanentElementMap, callback) {\n        const bardo = new this(permanentElementMap);\n        bardo.enter();\n        callback();\n        bardo.leave();\n    }\n    enter() {\n        for (const id in this.permanentElementMap) {\n            const [, newPermanentElement] = this.permanentElementMap[id];\n            this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\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        }\n    }\n    replaceNewPermanentElementWithPlaceholder(permanentElement) {\n        const placeholder = createPlaceholderForPermanentElement(permanentElement);\n        permanentElement.replaceWith(placeholder);\n    }\n    replaceCurrentPermanentElementWithClone(permanentElement) {\n        const clone = permanentElement.cloneNode(true);\n        permanentElement.replaceWith(clone);\n    }\n    replacePlaceholderWithPermanentElement(permanentElement) {\n        const placeholder = this.getPlaceholderById(permanentElement.id);\n        placeholder === null || placeholder === void 0 ? void 0 : placeholder.replaceWith(permanentElement);\n    }\n    getPlaceholderById(id) {\n        return this.placeholders.find(element => element.content == id);\n    }\n    get placeholders() {\n        return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")];\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    constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n        this.currentSnapshot = currentSnapshot;\n        this.newSnapshot = newSnapshot;\n        this.isPreview = isPreview;\n        this.willRender = willRender;\n        this.promise = new Promise((resolve, reject) => this.resolvingFunctions = { resolve, reject });\n    }\n    get shouldRender() {\n        return true;\n    }\n    prepareToRender() {\n        return;\n    }\n    finishRendering() {\n        if (this.resolvingFunctions) {\n            this.resolvingFunctions.resolve();\n            delete this.resolvingFunctions;\n        }\n    }\n    createScriptElement(element) {\n        if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n            return element;\n        }\n        else {\n            const createdScriptElement = document.createElement(\"script\");\n            if (this.cspNonce) {\n                createdScriptElement.nonce = this.cspNonce;\n            }\n            createdScriptElement.textContent = element.textContent;\n            createdScriptElement.async = false;\n            copyElementAttributes(createdScriptElement, element);\n            return createdScriptElement;\n        }\n    }\n    preservingPermanentElements(callback) {\n        Bardo.preservingPermanentElements(this.permanentElementMap, callback);\n    }\n    focusFirstAutofocusableElement() {\n        const element = this.connectedSnapshot.firstAutofocusableElement;\n        if (elementIsFocusable(element)) {\n            element.focus();\n        }\n    }\n    get connectedSnapshot() {\n        return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot;\n    }\n    get currentElement() {\n        return this.currentSnapshot.element;\n    }\n    get newElement() {\n        return this.newSnapshot.element;\n    }\n    get permanentElementMap() {\n        return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot);\n    }\n    get cspNonce() {\n        var _a;\n        return (_a = document.head.querySelector('meta[name=\"csp-nonce\"]')) === null || _a === void 0 ? void 0 : _a.getAttribute(\"content\");\n    }\n}\nfunction copyElementAttributes(destinationElement, sourceElement) {\n    for (const { name, value } of [...sourceElement.attributes]) {\n        destinationElement.setAttribute(name, value);\n    }\n}\nfunction elementIsFocusable(element) {\n    return element && typeof element.focus == \"function\";\n}\n\nclass FrameRenderer extends Renderer {\n    get shouldRender() {\n        return true;\n    }\n    async render() {\n        await nextAnimationFrame();\n        this.preservingPermanentElements(() => {\n            this.loadFrameElement();\n        });\n        this.scrollFrameIntoView();\n        await nextAnimationFrame();\n        this.focusFirstAutofocusableElement();\n        await nextAnimationFrame();\n        this.activateScriptElements();\n    }\n    loadFrameElement() {\n        var _a;\n        const destinationRange = document.createRange();\n        destinationRange.selectNodeContents(this.currentElement);\n        destinationRange.deleteContents();\n        const frameElement = this.newElement;\n        const sourceRange = (_a = frameElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.createRange();\n        if (sourceRange) {\n            sourceRange.selectNodeContents(frameElement);\n            this.currentElement.appendChild(sourceRange.extractContents());\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            if (element) {\n                element.scrollIntoView({ block });\n                return true;\n            }\n        }\n        return false;\n    }\n    activateScriptElements() {\n        for (const inertScriptElement of this.newScriptElements) {\n            const activatedScriptElement = this.createScriptElement(inertScriptElement);\n            inertScriptElement.replaceWith(activatedScriptElement);\n        }\n    }\n    get newScriptElements() {\n        return this.currentElement.querySelectorAll(\"script\");\n    }\n}\nfunction readScrollLogicalPosition(value, defaultValue) {\n    if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n        return value;\n    }\n    else {\n        return defaultValue;\n    }\n}\n\nclass ProgressBar {\n    constructor() {\n        this.hiding = false;\n        this.value = 0;\n        this.visible = false;\n        this.trickle = () => {\n            this.setValue(this.value + Math.random() / 100);\n        };\n        this.stylesheetElement = this.createStylesheetElement();\n        this.progressElement = this.createProgressElement();\n        this.installStylesheetElement();\n        this.setValue(0);\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: 9999;\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    show() {\n        if (!this.visible) {\n            this.visible = true;\n            this.installProgressElement();\n            this.startTrickling();\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    setValue(value) {\n        this.value = value;\n        this.refresh();\n    }\n    installStylesheetElement() {\n        document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\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    fadeProgressElement(callback) {\n        this.progressElement.style.opacity = \"0\";\n        setTimeout(callback, ProgressBar.animationDuration * 1.5);\n    }\n    uninstallProgressElement() {\n        if (this.progressElement.parentNode) {\n            document.documentElement.removeChild(this.progressElement);\n        }\n    }\n    startTrickling() {\n        if (!this.trickleInterval) {\n            this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n        }\n    }\n    stopTrickling() {\n        window.clearInterval(this.trickleInterval);\n        delete this.trickleInterval;\n    }\n    refresh() {\n        requestAnimationFrame(() => {\n            this.progressElement.style.width = `${10 + (this.value * 90)}%`;\n        });\n    }\n    createStylesheetElement() {\n        const element = document.createElement(\"style\");\n        element.type = \"text/css\";\n        element.textContent = ProgressBar.defaultCSS;\n        return element;\n    }\n    createProgressElement() {\n        const element = document.createElement(\"div\");\n        element.className = \"turbo-progress-bar\";\n        return element;\n    }\n}\nProgressBar.animationDuration = 300;\n\nclass HeadSnapshot extends Snapshot {\n    constructor() {\n        super(...arguments);\n        this.detailsByOuterHTML = this.children\n            .filter((element) => !elementIsNoscript(element))\n            .map((element) => elementWithoutNonce(element))\n            .reduce((result, element) => {\n            const { outerHTML } = element;\n            const details = outerHTML in result\n                ? result[outerHTML]\n                : {\n                    type: elementType(element),\n                    tracked: elementIsTracked(element),\n                    elements: []\n                };\n            return Object.assign(Object.assign({}, result), { [outerHTML]: Object.assign(Object.assign({}, details), { elements: [...details.elements, element] }) });\n        }, {});\n    }\n    get trackedElementSignature() {\n        return Object.keys(this.detailsByOuterHTML)\n            .filter(outerHTML => this.detailsByOuterHTML[outerHTML].tracked)\n            .join(\"\");\n    }\n    getScriptElementsNotInSnapshot(snapshot) {\n        return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot);\n    }\n    getStylesheetElementsNotInSnapshot(snapshot) {\n        return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot);\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    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            }\n            else if (elements.length > 1) {\n                return [...result, ...elements.slice(1)];\n            }\n            else {\n                return result;\n            }\n        }, []);\n    }\n    getMetaValue(name) {\n        const element = this.findMetaElementByName(name);\n        return element\n            ? element.getAttribute(\"content\")\n            : null;\n    }\n    findMetaElementByName(name) {\n        return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n            const { elements: [element] } = this.detailsByOuterHTML[outerHTML];\n            return elementIsMetaElementWithName(element, name) ? element : result;\n        }, undefined);\n    }\n}\nfunction elementType(element) {\n    if (elementIsScript(element)) {\n        return \"script\";\n    }\n    else if (elementIsStylesheet(element)) {\n        return \"stylesheet\";\n    }\n}\nfunction elementIsTracked(element) {\n    return element.getAttribute(\"data-turbo-track\") == \"reload\";\n}\nfunction elementIsScript(element) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"script\";\n}\nfunction elementIsNoscript(element) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"noscript\";\n}\nfunction elementIsStylesheet(element) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\");\n}\nfunction elementIsMetaElementWithName(element, name) {\n    const tagName = element.tagName.toLowerCase();\n    return tagName == \"meta\" && element.getAttribute(\"name\") == name;\n}\nfunction elementWithoutNonce(element) {\n    if (element.hasAttribute(\"nonce\")) {\n        element.setAttribute(\"nonce\", \"\");\n    }\n    return element;\n}\n\nclass PageSnapshot extends Snapshot {\n    constructor(element, headSnapshot) {\n        super(element);\n        this.headSnapshot = headSnapshot;\n    }\n    static fromHTMLString(html = \"\") {\n        return this.fromDocument(parseHTMLDocument(html));\n    }\n    static fromElement(element) {\n        return this.fromDocument(element.ownerDocument);\n    }\n    static fromDocument({ head, body }) {\n        return new this(body, new HeadSnapshot(head));\n    }\n    clone() {\n        return new PageSnapshot(this.element.cloneNode(true), this.headSnapshot);\n    }\n    get headElement() {\n        return this.headSnapshot.element;\n    }\n    get rootLocation() {\n        var _a;\n        const root = (_a = this.getSetting(\"root\")) !== null && _a !== void 0 ? _a : \"/\";\n        return expandURL(root);\n    }\n    get cacheControlValue() {\n        return this.getSetting(\"cache-control\");\n    }\n    get isPreviewable() {\n        return this.cacheControlValue != \"no-preview\";\n    }\n    get isCacheable() {\n        return this.cacheControlValue != \"no-cache\";\n    }\n    get isVisitable() {\n        return this.getSetting(\"visit-control\") != \"reload\";\n    }\n    getSetting(name) {\n        return this.headSnapshot.getMetaValue(`turbo-${name}`);\n    }\n}\n\nvar TimingMetric;\n(function (TimingMetric) {\n    TimingMetric[\"visitStart\"] = \"visitStart\";\n    TimingMetric[\"requestStart\"] = \"requestStart\";\n    TimingMetric[\"requestEnd\"] = \"requestEnd\";\n    TimingMetric[\"visitEnd\"] = \"visitEnd\";\n})(TimingMetric || (TimingMetric = {}));\nvar VisitState;\n(function (VisitState) {\n    VisitState[\"initialized\"] = \"initialized\";\n    VisitState[\"started\"] = \"started\";\n    VisitState[\"canceled\"] = \"canceled\";\n    VisitState[\"failed\"] = \"failed\";\n    VisitState[\"completed\"] = \"completed\";\n})(VisitState || (VisitState = {}));\nconst defaultOptions = {\n    action: \"advance\",\n    historyChanged: false,\n    visitCachedSnapshot: () => { },\n    willRender: true,\n};\nvar SystemStatusCode;\n(function (SystemStatusCode) {\n    SystemStatusCode[SystemStatusCode[\"networkFailure\"] = 0] = \"networkFailure\";\n    SystemStatusCode[SystemStatusCode[\"timeoutFailure\"] = -1] = \"timeoutFailure\";\n    SystemStatusCode[SystemStatusCode[\"contentTypeMismatch\"] = -2] = \"contentTypeMismatch\";\n})(SystemStatusCode || (SystemStatusCode = {}));\nclass Visit {\n    constructor(delegate, location, restorationIdentifier, options = {}) {\n        this.identifier = uuid();\n        this.timingMetrics = {};\n        this.followedRedirect = false;\n        this.historyChanged = false;\n        this.scrolled = false;\n        this.snapshotCached = false;\n        this.state = VisitState.initialized;\n        this.delegate = delegate;\n        this.location = location;\n        this.restorationIdentifier = restorationIdentifier || uuid();\n        const { action, historyChanged, referrer, snapshotHTML, response, visitCachedSnapshot, willRender } = Object.assign(Object.assign({}, defaultOptions), options);\n        this.action = action;\n        this.historyChanged = historyChanged;\n        this.referrer = referrer;\n        this.snapshotHTML = snapshotHTML;\n        this.response = response;\n        this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action);\n        this.visitCachedSnapshot = visitCachedSnapshot;\n        this.willRender = willRender;\n        this.scrolled = !willRender;\n    }\n    get adapter() {\n        return this.delegate.adapter;\n    }\n    get view() {\n        return this.delegate.view;\n    }\n    get history() {\n        return this.delegate.history;\n    }\n    get restorationData() {\n        return this.history.getRestorationDataForIdentifier(this.restorationIdentifier);\n    }\n    get silent() {\n        return this.isSamePage;\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    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    complete() {\n        if (this.state == VisitState.started) {\n            this.recordTimingMetric(TimingMetric.visitEnd);\n            this.state = VisitState.completed;\n            this.adapter.visitCompleted(this);\n            this.delegate.visitCompleted(this);\n            this.followRedirect();\n        }\n    }\n    fail() {\n        if (this.state == VisitState.started) {\n            this.state = VisitState.failed;\n            this.adapter.visitFailed(this);\n        }\n    }\n    changeHistory() {\n        var _a;\n        if (!this.historyChanged) {\n            const actionForHistory = this.location.href === ((_a = this.referrer) === null || _a === void 0 ? void 0 : _a.href) ? \"replace\" : this.action;\n            const method = this.getHistoryMethodForAction(actionForHistory);\n            this.history.update(method, this.location, this.restorationIdentifier);\n            this.historyChanged = true;\n        }\n    }\n    issueRequest() {\n        if (this.hasPreloadedResponse()) {\n            this.simulateRequest();\n        }\n        else if (this.shouldIssueRequest() && !this.request) {\n            this.request = new FetchRequest(this, FetchMethod.get, this.location);\n            this.request.perform();\n        }\n    }\n    simulateRequest() {\n        if (this.response) {\n            this.startRequest();\n            this.recordResponse();\n            this.finishRequest();\n        }\n    }\n    startRequest() {\n        this.recordTimingMetric(TimingMetric.requestStart);\n        this.adapter.visitRequestStarted(this);\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            }\n            else {\n                this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n            }\n        }\n    }\n    finishRequest() {\n        this.recordTimingMetric(TimingMetric.requestEnd);\n        this.adapter.visitRequestFinished(this);\n    }\n    loadResponse() {\n        if (this.response) {\n            const { statusCode, responseHTML } = this.response;\n            this.render(async () => {\n                this.cacheSnapshot();\n                if (this.view.renderPromise)\n                    await this.view.renderPromise;\n                if (isSuccessful(statusCode) && responseHTML != null) {\n                    await this.view.renderPage(PageSnapshot.fromHTMLString(responseHTML), false, this.willRender);\n                    this.adapter.visitRendered(this);\n                    this.complete();\n                }\n                else {\n                    await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML));\n                    this.adapter.visitRendered(this);\n                    this.fail();\n                }\n            });\n        }\n    }\n    getCachedSnapshot() {\n        const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\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    getPreloadedSnapshot() {\n        if (this.snapshotHTML) {\n            return PageSnapshot.fromHTMLString(this.snapshotHTML);\n        }\n    }\n    hasCachedSnapshot() {\n        return this.getCachedSnapshot() != null;\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.isSamePage) {\n                    this.adapter.visitRendered(this);\n                }\n                else {\n                    if (this.view.renderPromise)\n                        await this.view.renderPromise;\n                    await this.view.renderPage(snapshot, isPreview, this.willRender);\n                    this.adapter.visitRendered(this);\n                    if (!isPreview) {\n                        this.complete();\n                    }\n                }\n            });\n        }\n    }\n    followRedirect() {\n        var _a;\n        if (this.redirectedToLocation && !this.followedRedirect && ((_a = this.response) === null || _a === void 0 ? void 0 : _a.redirected)) {\n            this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n                action: 'replace',\n                response: this.response\n            });\n            this.followedRedirect = true;\n        }\n    }\n    goToSamePageAnchor() {\n        if (this.isSamePage) {\n            this.render(async () => {\n                this.cacheSnapshot();\n                this.adapter.visitRendered(this);\n            });\n        }\n    }\n    requestStarted() {\n        this.startRequest();\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({ statusCode: SystemStatusCode.contentTypeMismatch, redirected });\n        }\n        else {\n            this.redirectedToLocation = response.redirected ? response.location : undefined;\n            this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\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({ statusCode: SystemStatusCode.contentTypeMismatch, redirected });\n        }\n        else {\n            this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n        }\n    }\n    requestErrored(request, error) {\n        this.recordResponse({ statusCode: SystemStatusCode.networkFailure, redirected: false });\n    }\n    requestFinished() {\n        this.finishRequest();\n    }\n    performScroll() {\n        if (!this.scrolled) {\n            if (this.action == \"restore\") {\n                this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n            }\n            else {\n                this.scrollToAnchor() || this.view.scrollToTop();\n            }\n            if (this.isSamePage) {\n                this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location);\n            }\n            this.scrolled = true;\n        }\n    }\n    scrollToRestoredPosition() {\n        const { scrollPosition } = this.restorationData;\n        if (scrollPosition) {\n            this.view.scrollToPosition(scrollPosition);\n            return true;\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    recordTimingMetric(metric) {\n        this.timingMetrics[metric] = new Date().getTime();\n    }\n    getTimingMetrics() {\n        return Object.assign({}, this.timingMetrics);\n    }\n    getHistoryMethodForAction(action) {\n        switch (action) {\n            case \"replace\": return history.replaceState;\n            case \"advance\":\n            case \"restore\": return history.pushState;\n        }\n    }\n    hasPreloadedResponse() {\n        return typeof this.response == \"object\";\n    }\n    shouldIssueRequest() {\n        if (this.isSamePage) {\n            return false;\n        }\n        else if (this.action == \"restore\") {\n            return !this.hasCachedSnapshot();\n        }\n        else {\n            return this.willRender;\n        }\n    }\n    cacheSnapshot() {\n        if (!this.snapshotCached) {\n            this.view.cacheSnapshot().then(snapshot => snapshot && this.visitCachedSnapshot(snapshot));\n            this.snapshotCached = true;\n        }\n    }\n    async render(callback) {\n        this.cancelRender();\n        await new Promise(resolve => {\n            this.frame = requestAnimationFrame(() => resolve());\n        });\n        await callback();\n        delete this.frame;\n        this.performScroll();\n    }\n    cancelRender() {\n        if (this.frame) {\n            cancelAnimationFrame(this.frame);\n            delete this.frame;\n        }\n    }\n}\nfunction isSuccessful(statusCode) {\n    return statusCode >= 200 && statusCode < 300;\n}\n\nclass BrowserAdapter {\n    constructor(session) {\n        this.progressBar = new ProgressBar;\n        this.showProgressBar = () => {\n            this.progressBar.show();\n        };\n        this.session = session;\n    }\n    visitProposedToLocation(location, options) {\n        this.navigator.startVisit(location, uuid(), options);\n    }\n    visitStarted(visit) {\n        visit.loadCachedSnapshot();\n        visit.issueRequest();\n        visit.changeHistory();\n        visit.goToSamePageAnchor();\n    }\n    visitRequestStarted(visit) {\n        this.progressBar.setValue(0);\n        if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n            this.showVisitProgressBarAfterDelay();\n        }\n        else {\n            this.showProgressBar();\n        }\n    }\n    visitRequestCompleted(visit) {\n        visit.loadResponse();\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            default:\n                return visit.loadResponse();\n        }\n    }\n    visitRequestFinished(visit) {\n        this.progressBar.setValue(1);\n        this.hideVisitProgressBar();\n    }\n    visitCompleted(visit) {\n    }\n    pageInvalidated() {\n        this.reload();\n    }\n    visitFailed(visit) {\n    }\n    visitRendered(visit) {\n    }\n    formSubmissionStarted(formSubmission) {\n        this.progressBar.setValue(0);\n        this.showFormProgressBarAfterDelay();\n    }\n    formSubmissionFinished(formSubmission) {\n        this.progressBar.setValue(1);\n        this.hideFormProgressBar();\n    }\n    showVisitProgressBarAfterDelay() {\n        this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n    hideVisitProgressBar() {\n        this.progressBar.hide();\n        if (this.visitProgressBarTimeout != null) {\n            window.clearTimeout(this.visitProgressBarTimeout);\n            delete this.visitProgressBarTimeout;\n        }\n    }\n    showFormProgressBarAfterDelay() {\n        if (this.formProgressBarTimeout == null) {\n            this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\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    reload() {\n        window.location.reload();\n    }\n    get navigator() {\n        return this.session.navigator;\n    }\n}\n\nclass CacheObserver {\n    constructor() {\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            addEventListener(\"turbo:before-cache\", this.removeStaleElements, false);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            removeEventListener(\"turbo:before-cache\", this.removeStaleElements, false);\n        }\n    }\n    removeStaleElements() {\n        const staleElements = [...document.querySelectorAll('[data-turbo-cache=\"false\"]')];\n        for (const element of staleElements) {\n            element.remove();\n        }\n    }\n}\n\nclass FormSubmitObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.submitCaptured = () => {\n            removeEventListener(\"submit\", this.submitBubbled, false);\n            addEventListener(\"submit\", this.submitBubbled, false);\n        };\n        this.submitBubbled = ((event) => {\n            if (!event.defaultPrevented) {\n                const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n                const submitter = event.submitter || undefined;\n                if (form) {\n                    const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formmethod\")) || form.getAttribute(\"method\");\n                    if (method != \"dialog\" && this.delegate.willSubmitForm(form, submitter)) {\n                        event.preventDefault();\n                        this.delegate.formSubmitted(form, submitter);\n                    }\n                }\n            }\n        });\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"submit\", this.submitCaptured, true);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"submit\", this.submitCaptured, true);\n            this.started = false;\n        }\n    }\n}\n\nclass FrameRedirector {\n    constructor(element) {\n        this.element = element;\n        this.linkInterceptor = new LinkInterceptor(this, element);\n        this.formInterceptor = new FormInterceptor(this, element);\n    }\n    start() {\n        this.linkInterceptor.start();\n        this.formInterceptor.start();\n    }\n    stop() {\n        this.linkInterceptor.stop();\n        this.formInterceptor.stop();\n    }\n    shouldInterceptLinkClick(element, url) {\n        return this.shouldRedirect(element);\n    }\n    linkClickIntercepted(element, url) {\n        const frame = this.findFrameElement(element);\n        if (frame) {\n            frame.delegate.linkClickIntercepted(element, url);\n        }\n    }\n    shouldInterceptFormSubmission(element, submitter) {\n        return this.shouldSubmit(element, submitter);\n    }\n    formSubmissionIntercepted(element, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        if (frame) {\n            frame.removeAttribute(\"reloadable\");\n            frame.delegate.formSubmissionIntercepted(element, submitter);\n        }\n    }\n    shouldSubmit(form, submitter) {\n        var _a;\n        const action = getAction(form, submitter);\n        const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n        const rootLocation = expandURL((_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\");\n        return this.shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation);\n    }\n    shouldRedirect(element, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        return frame ? frame != element.closest(\"turbo-frame\") : false;\n    }\n    findFrameElement(element, submitter) {\n        const id = (submitter === null || submitter === void 0 ? void 0 : 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    constructor(delegate) {\n        this.restorationIdentifier = uuid();\n        this.restorationData = {};\n        this.started = false;\n        this.pageLoaded = false;\n        this.onPopState = (event) => {\n            if (this.shouldHandlePopState()) {\n                const { turbo } = event.state || {};\n                if (turbo) {\n                    this.location = new URL(window.location.href);\n                    const { restorationIdentifier } = turbo;\n                    this.restorationIdentifier = restorationIdentifier;\n                    this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location, restorationIdentifier);\n                }\n            }\n        };\n        this.onPageLoad = async (event) => {\n            await nextMicrotask();\n            this.pageLoaded = true;\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"popstate\", this.onPopState, false);\n            addEventListener(\"load\", this.onPageLoad, false);\n            this.started = true;\n            this.replace(new URL(window.location.href));\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"popstate\", this.onPopState, false);\n            removeEventListener(\"load\", this.onPageLoad, false);\n            this.started = false;\n        }\n    }\n    push(location, restorationIdentifier) {\n        this.update(history.pushState, location, restorationIdentifier);\n    }\n    replace(location, restorationIdentifier) {\n        this.update(history.replaceState, location, restorationIdentifier);\n    }\n    update(method, location, restorationIdentifier = uuid()) {\n        const state = { turbo: { restorationIdentifier } };\n        method.call(history, state, \"\", location.href);\n        this.location = location;\n        this.restorationIdentifier = restorationIdentifier;\n    }\n    getRestorationDataForIdentifier(restorationIdentifier) {\n        return this.restorationData[restorationIdentifier] || {};\n    }\n    updateRestorationData(additionalData) {\n        const { restorationIdentifier } = this;\n        const restorationData = this.restorationData[restorationIdentifier];\n        this.restorationData[restorationIdentifier] = Object.assign(Object.assign({}, restorationData), additionalData);\n    }\n    assumeControlOfScrollRestoration() {\n        var _a;\n        if (!this.previousScrollRestoration) {\n            this.previousScrollRestoration = (_a = history.scrollRestoration) !== null && _a !== void 0 ? _a : \"auto\";\n            history.scrollRestoration = \"manual\";\n        }\n    }\n    relinquishControlOfScrollRestoration() {\n        if (this.previousScrollRestoration) {\n            history.scrollRestoration = this.previousScrollRestoration;\n            delete this.previousScrollRestoration;\n        }\n    }\n    shouldHandlePopState() {\n        return this.pageIsLoaded();\n    }\n    pageIsLoaded() {\n        return this.pageLoaded || document.readyState == \"complete\";\n    }\n}\n\nclass LinkClickObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.clickCaptured = () => {\n            removeEventListener(\"click\", this.clickBubbled, false);\n            addEventListener(\"click\", this.clickBubbled, false);\n        };\n        this.clickBubbled = (event) => {\n            if (this.clickEventIsSignificant(event)) {\n                const target = (event.composedPath && event.composedPath()[0]) || event.target;\n                const link = this.findLinkFromClickTarget(target);\n                if (link) {\n                    const location = this.getLocationForLink(link);\n                    if (this.delegate.willFollowLinkToLocation(link, location)) {\n                        event.preventDefault();\n                        this.delegate.followedLinkToLocation(link, location);\n                    }\n                }\n            }\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"click\", this.clickCaptured, true);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"click\", this.clickCaptured, true);\n            this.started = false;\n        }\n    }\n    clickEventIsSignificant(event) {\n        return !((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    findLinkFromClickTarget(target) {\n        if (target instanceof Element) {\n            return target.closest(\"a[href]:not([target^=_]):not([download])\");\n        }\n    }\n    getLocationForLink(link) {\n        return expandURL(link.getAttribute(\"href\") || \"\");\n    }\n}\n\nfunction isAction(action) {\n    return action == \"advance\" || action == \"replace\" || action == \"restore\";\n}\n\nclass Navigator {\n    constructor(delegate) {\n        this.delegate = delegate;\n    }\n    proposeVisit(location, options = {}) {\n        if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n            if (locationIsVisitable(location, this.view.snapshot.rootLocation)) {\n                this.delegate.visitProposedToLocation(location, options);\n            }\n            else {\n                window.location.href = location.toString();\n            }\n        }\n    }\n    startVisit(locatable, restorationIdentifier, options = {}) {\n        this.stop();\n        this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, Object.assign({ referrer: this.location }, options));\n        this.currentVisit.start();\n    }\n    submitForm(form, submitter) {\n        this.stop();\n        this.formSubmission = new FormSubmission(this, form, submitter, true);\n        this.formSubmission.start();\n    }\n    stop() {\n        if (this.formSubmission) {\n            this.formSubmission.stop();\n            delete this.formSubmission;\n        }\n        if (this.currentVisit) {\n            this.currentVisit.cancel();\n            delete this.currentVisit;\n        }\n    }\n    get adapter() {\n        return this.delegate.adapter;\n    }\n    get view() {\n        return this.delegate.view;\n    }\n    get history() {\n        return this.delegate.history;\n    }\n    formSubmissionStarted(formSubmission) {\n        if (typeof this.adapter.formSubmissionStarted === 'function') {\n            this.adapter.formSubmissionStarted(formSubmission);\n        }\n    }\n    async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n        if (formSubmission == this.formSubmission) {\n            const responseHTML = await fetchResponse.responseHTML;\n            if (responseHTML) {\n                if (formSubmission.method != FetchMethod.get) {\n                    this.view.clearSnapshotCache();\n                }\n                const { statusCode, redirected } = fetchResponse;\n                const action = this.getActionForFormSubmission(formSubmission);\n                const visitOptions = { action, response: { statusCode, responseHTML, redirected } };\n                this.proposeVisit(fetchResponse.location, visitOptions);\n            }\n        }\n    }\n    async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n        const responseHTML = await fetchResponse.responseHTML;\n        if (responseHTML) {\n            const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n            if (fetchResponse.serverError) {\n                await this.view.renderError(snapshot);\n            }\n            else {\n                await this.view.renderPage(snapshot);\n            }\n            this.view.scrollToTop();\n            this.view.clearSnapshotCache();\n        }\n    }\n    formSubmissionErrored(formSubmission, error) {\n        console.error(error);\n    }\n    formSubmissionFinished(formSubmission) {\n        if (typeof this.adapter.formSubmissionFinished === 'function') {\n            this.adapter.formSubmissionFinished(formSubmission);\n        }\n    }\n    visitStarted(visit) {\n        this.delegate.visitStarted(visit);\n    }\n    visitCompleted(visit) {\n        this.delegate.visitCompleted(visit);\n    }\n    locationWithActionIsSamePage(location, action) {\n        const anchor = getAnchor(location);\n        const currentAnchor = getAnchor(this.view.lastRenderedLocation);\n        const isRestorationToTop = action === 'restore' && typeof anchor === 'undefined';\n        return action !== \"replace\" &&\n            getRequestURL(location) === getRequestURL(this.view.lastRenderedLocation) &&\n            (isRestorationToTop || (anchor != null && anchor !== currentAnchor));\n    }\n    visitScrolledToSamePageLocation(oldURL, newURL) {\n        this.delegate.visitScrolledToSamePageLocation(oldURL, newURL);\n    }\n    get location() {\n        return this.history.location;\n    }\n    get restorationIdentifier() {\n        return this.history.restorationIdentifier;\n    }\n    getActionForFormSubmission(formSubmission) {\n        const { formElement, submitter } = formSubmission;\n        const action = getAttribute(\"data-turbo-action\", submitter, formElement);\n        return isAction(action) ? action : \"advance\";\n    }\n}\n\nvar PageStage;\n(function (PageStage) {\n    PageStage[PageStage[\"initial\"] = 0] = \"initial\";\n    PageStage[PageStage[\"loading\"] = 1] = \"loading\";\n    PageStage[PageStage[\"interactive\"] = 2] = \"interactive\";\n    PageStage[PageStage[\"complete\"] = 3] = \"complete\";\n})(PageStage || (PageStage = {}));\nclass PageObserver {\n    constructor(delegate) {\n        this.stage = PageStage.initial;\n        this.started = false;\n        this.interpretReadyState = () => {\n            const { readyState } = this;\n            if (readyState == \"interactive\") {\n                this.pageIsInteractive();\n            }\n            else if (readyState == \"complete\") {\n                this.pageIsComplete();\n            }\n        };\n        this.pageWillUnload = () => {\n            this.delegate.pageWillUnload();\n        };\n        this.delegate = delegate;\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    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    pageIsInteractive() {\n        if (this.stage == PageStage.loading) {\n            this.stage = PageStage.interactive;\n            this.delegate.pageBecameInteractive();\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    get readyState() {\n        return document.readyState;\n    }\n}\n\nclass ScrollObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.onScroll = () => {\n            this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"scroll\", this.onScroll, false);\n            this.onScroll();\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"scroll\", this.onScroll, false);\n            this.started = false;\n        }\n    }\n    updatePosition(position) {\n        this.delegate.scrollPositionChanged(position);\n    }\n}\n\nclass StreamObserver {\n    constructor(delegate) {\n        this.sources = new Set;\n        this.started = false;\n        this.inspectFetchResponse = ((event) => {\n            const response = fetchResponseFromEvent(event);\n            if (response && fetchResponseIsStream(response)) {\n                event.preventDefault();\n                this.receiveMessageResponse(response);\n            }\n        });\n        this.receiveMessageEvent = (event) => {\n            if (this.started && typeof event.data == \"string\") {\n                this.receiveMessageHTML(event.data);\n            }\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\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    disconnectStreamSource(source) {\n        if (this.streamSourceIsConnected(source)) {\n            this.sources.delete(source);\n            source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n        }\n    }\n    streamSourceIsConnected(source) {\n        return this.sources.has(source);\n    }\n    async receiveMessageResponse(response) {\n        const html = await response.responseHTML;\n        if (html) {\n            this.receiveMessageHTML(html);\n        }\n    }\n    receiveMessageHTML(html) {\n        this.delegate.receivedMessageFromStream(new StreamMessage(html));\n    }\n}\nfunction fetchResponseFromEvent(event) {\n    var _a;\n    const fetchResponse = (_a = event.detail) === null || _a === void 0 ? void 0 : _a.fetchResponse;\n    if (fetchResponse instanceof FetchResponse) {\n        return fetchResponse;\n    }\n}\nfunction fetchResponseIsStream(response) {\n    var _a;\n    const contentType = (_a = response.contentType) !== null && _a !== void 0 ? _a : \"\";\n    return contentType.startsWith(StreamMessage.contentType);\n}\n\nclass ErrorRenderer extends Renderer {\n    async render() {\n        this.replaceHeadAndBody();\n        this.activateScriptElements();\n    }\n    replaceHeadAndBody() {\n        const { documentElement, head, body } = document;\n        documentElement.replaceChild(this.newHead, head);\n        documentElement.replaceChild(this.newElement, body);\n    }\n    activateScriptElements() {\n        for (const replaceableElement of this.scriptElements) {\n            const parentNode = replaceableElement.parentNode;\n            if (parentNode) {\n                const element = this.createScriptElement(replaceableElement);\n                parentNode.replaceChild(element, replaceableElement);\n            }\n        }\n    }\n    get newHead() {\n        return this.newSnapshot.headSnapshot.element;\n    }\n    get scriptElements() {\n        return [...document.documentElement.querySelectorAll(\"script\")];\n    }\n}\n\nclass PageRenderer extends Renderer {\n    get shouldRender() {\n        return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical;\n    }\n    prepareToRender() {\n        this.mergeHead();\n    }\n    async render() {\n        if (this.willRender) {\n            this.replaceBody();\n        }\n    }\n    finishRendering() {\n        super.finishRendering();\n        if (!this.isPreview) {\n            this.focusFirstAutofocusableElement();\n        }\n    }\n    get currentHeadSnapshot() {\n        return this.currentSnapshot.headSnapshot;\n    }\n    get newHeadSnapshot() {\n        return this.newSnapshot.headSnapshot;\n    }\n    get newElement() {\n        return this.newSnapshot.element;\n    }\n    mergeHead() {\n        this.copyNewHeadStylesheetElements();\n        this.copyNewHeadScriptElements();\n        this.removeCurrentHeadProvisionalElements();\n        this.copyNewHeadProvisionalElements();\n    }\n    replaceBody() {\n        this.preservingPermanentElements(() => {\n            this.activateNewBody();\n            this.assignNewBody();\n        });\n    }\n    get trackedElementsAreIdentical() {\n        return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature;\n    }\n    copyNewHeadStylesheetElements() {\n        for (const element of this.newHeadStylesheetElements) {\n            document.head.appendChild(element);\n        }\n    }\n    copyNewHeadScriptElements() {\n        for (const element of this.newHeadScriptElements) {\n            document.head.appendChild(this.createScriptElement(element));\n        }\n    }\n    removeCurrentHeadProvisionalElements() {\n        for (const element of this.currentHeadProvisionalElements) {\n            document.head.removeChild(element);\n        }\n    }\n    copyNewHeadProvisionalElements() {\n        for (const element of this.newHeadProvisionalElements) {\n            document.head.appendChild(element);\n        }\n    }\n    activateNewBody() {\n        document.adoptNode(this.newElement);\n        this.activateNewBodyScriptElements();\n    }\n    activateNewBodyScriptElements() {\n        for (const inertScriptElement of this.newBodyScriptElements) {\n            const activatedScriptElement = this.createScriptElement(inertScriptElement);\n            inertScriptElement.replaceWith(activatedScriptElement);\n        }\n    }\n    assignNewBody() {\n        if (document.body && this.newElement instanceof HTMLBodyElement) {\n            document.body.replaceWith(this.newElement);\n        }\n        else {\n            document.documentElement.appendChild(this.newElement);\n        }\n    }\n    get newHeadStylesheetElements() {\n        return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot);\n    }\n    get newHeadScriptElements() {\n        return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot);\n    }\n    get currentHeadProvisionalElements() {\n        return this.currentHeadSnapshot.provisionalElements;\n    }\n    get newHeadProvisionalElements() {\n        return this.newHeadSnapshot.provisionalElements;\n    }\n    get newBodyScriptElements() {\n        return this.newElement.querySelectorAll(\"script\");\n    }\n}\n\nclass SnapshotCache {\n    constructor(size) {\n        this.keys = [];\n        this.snapshots = {};\n        this.size = size;\n    }\n    has(location) {\n        return toCacheKey(location) in this.snapshots;\n    }\n    get(location) {\n        if (this.has(location)) {\n            const snapshot = this.read(location);\n            this.touch(location);\n            return snapshot;\n        }\n    }\n    put(location, snapshot) {\n        this.write(location, snapshot);\n        this.touch(location);\n        return snapshot;\n    }\n    clear() {\n        this.snapshots = {};\n    }\n    read(location) {\n        return this.snapshots[toCacheKey(location)];\n    }\n    write(location, snapshot) {\n        this.snapshots[toCacheKey(location)] = snapshot;\n    }\n    touch(location) {\n        const key = toCacheKey(location);\n        const index = this.keys.indexOf(key);\n        if (index > -1)\n            this.keys.splice(index, 1);\n        this.keys.unshift(key);\n        this.trim();\n    }\n    trim() {\n        for (const key of this.keys.splice(this.size)) {\n            delete this.snapshots[key];\n        }\n    }\n}\n\nclass PageView extends View {\n    constructor() {\n        super(...arguments);\n        this.snapshotCache = new SnapshotCache(10);\n        this.lastRenderedLocation = new URL(location.href);\n    }\n    renderPage(snapshot, isPreview = false, willRender = true) {\n        const renderer = new PageRenderer(this.snapshot, snapshot, isPreview, willRender);\n        return this.render(renderer);\n    }\n    renderError(snapshot) {\n        const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n        return this.render(renderer);\n    }\n    clearSnapshotCache() {\n        this.snapshotCache.clear();\n    }\n    async cacheSnapshot() {\n        if (this.shouldCacheSnapshot) {\n            this.delegate.viewWillCacheSnapshot();\n            const { snapshot, lastRenderedLocation: location } = this;\n            await nextEventLoopTick();\n            const cachedSnapshot = snapshot.clone();\n            this.snapshotCache.put(location, cachedSnapshot);\n            return cachedSnapshot;\n        }\n    }\n    getCachedSnapshotForLocation(location) {\n        return this.snapshotCache.get(location);\n    }\n    get snapshot() {\n        return PageSnapshot.fromElement(this.element);\n    }\n    get shouldCacheSnapshot() {\n        return this.snapshot.isCacheable;\n    }\n}\n\nclass Session {\n    constructor() {\n        this.navigator = new Navigator(this);\n        this.history = new History(this);\n        this.view = new PageView(this, document.documentElement);\n        this.adapter = new BrowserAdapter(this);\n        this.pageObserver = new PageObserver(this);\n        this.cacheObserver = new CacheObserver();\n        this.linkClickObserver = new LinkClickObserver(this);\n        this.formSubmitObserver = new FormSubmitObserver(this);\n        this.scrollObserver = new ScrollObserver(this);\n        this.streamObserver = new StreamObserver(this);\n        this.frameRedirector = new FrameRedirector(document.documentElement);\n        this.drive = true;\n        this.enabled = true;\n        this.progressBarDelay = 500;\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.pageObserver.start();\n            this.cacheObserver.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.started = true;\n            this.enabled = true;\n        }\n    }\n    disable() {\n        this.enabled = false;\n    }\n    stop() {\n        if (this.started) {\n            this.pageObserver.stop();\n            this.cacheObserver.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.started = false;\n        }\n    }\n    registerAdapter(adapter) {\n        this.adapter = adapter;\n    }\n    visit(location, options = {}) {\n        this.navigator.proposeVisit(expandURL(location), options);\n    }\n    connectStreamSource(source) {\n        this.streamObserver.connectStreamSource(source);\n    }\n    disconnectStreamSource(source) {\n        this.streamObserver.disconnectStreamSource(source);\n    }\n    renderStreamMessage(message) {\n        document.documentElement.appendChild(StreamMessage.wrap(message).fragment);\n    }\n    clearCache() {\n        this.view.clearSnapshotCache();\n    }\n    setProgressBarDelay(delay) {\n        this.progressBarDelay = delay;\n    }\n    get location() {\n        return this.history.location;\n    }\n    get restorationIdentifier() {\n        return this.history.restorationIdentifier;\n    }\n    historyPoppedToLocationWithRestorationIdentifier(location, restorationIdentifier) {\n        if (this.enabled) {\n            this.navigator.startVisit(location, restorationIdentifier, { action: \"restore\", historyChanged: true });\n        }\n        else {\n            this.adapter.pageInvalidated();\n        }\n    }\n    scrollPositionChanged(position) {\n        this.history.updateRestorationData({ scrollPosition: position });\n    }\n    willFollowLinkToLocation(link, location) {\n        return this.elementDriveEnabled(link)\n            && locationIsVisitable(location, this.snapshot.rootLocation)\n            && this.applicationAllowsFollowingLinkToLocation(link, location);\n    }\n    followedLinkToLocation(link, location) {\n        const action = this.getActionForLink(link);\n        this.convertLinkWithMethodClickToFormSubmission(link) || this.visit(location.href, { action });\n    }\n    convertLinkWithMethodClickToFormSubmission(link) {\n        const linkMethod = link.getAttribute(\"data-turbo-method\");\n        if (linkMethod) {\n            const form = document.createElement(\"form\");\n            form.method = linkMethod;\n            form.action = link.getAttribute(\"href\") || \"undefined\";\n            form.hidden = true;\n            if (link.hasAttribute(\"data-turbo-confirm\")) {\n                form.setAttribute(\"data-turbo-confirm\", link.getAttribute(\"data-turbo-confirm\"));\n            }\n            const frame = this.getTargetFrameForLink(link);\n            if (frame) {\n                form.setAttribute(\"data-turbo-frame\", frame);\n                form.addEventListener(\"turbo:submit-start\", () => form.remove());\n            }\n            else {\n                form.addEventListener(\"submit\", () => form.remove());\n            }\n            document.body.appendChild(form);\n            return dispatch(\"submit\", { cancelable: true, target: form });\n        }\n        else {\n            return false;\n        }\n    }\n    allowsVisitingLocationWithAction(location, action) {\n        return this.locationWithActionIsSamePage(location, action) || this.applicationAllowsVisitingLocation(location);\n    }\n    visitProposedToLocation(location, options) {\n        extendURLWithDeprecatedProperties(location);\n        this.adapter.visitProposedToLocation(location, options);\n    }\n    visitStarted(visit) {\n        extendURLWithDeprecatedProperties(visit.location);\n        if (!visit.silent) {\n            this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n        }\n    }\n    visitCompleted(visit) {\n        this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n    }\n    locationWithActionIsSamePage(location, action) {\n        return this.navigator.locationWithActionIsSamePage(location, action);\n    }\n    visitScrolledToSamePageLocation(oldURL, newURL) {\n        this.notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL);\n    }\n    willSubmitForm(form, submitter) {\n        const action = getAction(form, submitter);\n        return this.elementDriveEnabled(form)\n            && (!submitter || this.elementDriveEnabled(submitter))\n            && locationIsVisitable(expandURL(action), this.snapshot.rootLocation);\n    }\n    formSubmitted(form, submitter) {\n        this.navigator.submitForm(form, submitter);\n    }\n    pageBecameInteractive() {\n        this.view.lastRenderedLocation = this.location;\n        this.notifyApplicationAfterPageLoad();\n    }\n    pageLoaded() {\n        this.history.assumeControlOfScrollRestoration();\n    }\n    pageWillUnload() {\n        this.history.relinquishControlOfScrollRestoration();\n    }\n    receivedMessageFromStream(message) {\n        this.renderStreamMessage(message);\n    }\n    viewWillCacheSnapshot() {\n        var _a;\n        if (!((_a = this.navigator.currentVisit) === null || _a === void 0 ? void 0 : _a.silent)) {\n            this.notifyApplicationBeforeCachingSnapshot();\n        }\n    }\n    allowsImmediateRender({ element }, resume) {\n        const event = this.notifyApplicationBeforeRender(element, resume);\n        return !event.defaultPrevented;\n    }\n    viewRenderedSnapshot(snapshot, isPreview) {\n        this.view.lastRenderedLocation = this.history.location;\n        this.notifyApplicationAfterRender();\n    }\n    viewInvalidated() {\n        this.adapter.pageInvalidated();\n    }\n    frameLoaded(frame) {\n        this.notifyApplicationAfterFrameLoad(frame);\n    }\n    frameRendered(fetchResponse, frame) {\n        this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n    }\n    applicationAllowsFollowingLinkToLocation(link, location) {\n        const event = this.notifyApplicationAfterClickingLinkToLocation(link, location);\n        return !event.defaultPrevented;\n    }\n    applicationAllowsVisitingLocation(location) {\n        const event = this.notifyApplicationBeforeVisitingLocation(location);\n        return !event.defaultPrevented;\n    }\n    notifyApplicationAfterClickingLinkToLocation(link, location) {\n        return dispatch(\"turbo:click\", { target: link, detail: { url: location.href }, cancelable: true });\n    }\n    notifyApplicationBeforeVisitingLocation(location) {\n        return dispatch(\"turbo:before-visit\", { detail: { url: location.href }, cancelable: true });\n    }\n    notifyApplicationAfterVisitingLocation(location, action) {\n        markAsBusy(document.documentElement);\n        return dispatch(\"turbo:visit\", { detail: { url: location.href, action } });\n    }\n    notifyApplicationBeforeCachingSnapshot() {\n        return dispatch(\"turbo:before-cache\");\n    }\n    notifyApplicationBeforeRender(newBody, resume) {\n        return dispatch(\"turbo:before-render\", { detail: { newBody, resume }, cancelable: true });\n    }\n    notifyApplicationAfterRender() {\n        return dispatch(\"turbo:render\");\n    }\n    notifyApplicationAfterPageLoad(timing = {}) {\n        clearBusyState(document.documentElement);\n        return dispatch(\"turbo:load\", { detail: { url: this.location.href, timing } });\n    }\n    notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL) {\n        dispatchEvent(new HashChangeEvent(\"hashchange\", { oldURL: oldURL.toString(), newURL: newURL.toString() }));\n    }\n    notifyApplicationAfterFrameLoad(frame) {\n        return dispatch(\"turbo:frame-load\", { target: frame });\n    }\n    notifyApplicationAfterFrameRender(fetchResponse, frame) {\n        return dispatch(\"turbo:frame-render\", { detail: { fetchResponse }, target: frame, cancelable: true });\n    }\n    elementDriveEnabled(element) {\n        const container = element === null || element === void 0 ? void 0 : element.closest(\"[data-turbo]\");\n        if (this.drive) {\n            if (container) {\n                return container.getAttribute(\"data-turbo\") != \"false\";\n            }\n            else {\n                return true;\n            }\n        }\n        else {\n            if (container) {\n                return container.getAttribute(\"data-turbo\") == \"true\";\n            }\n            else {\n                return false;\n            }\n        }\n    }\n    getActionForLink(link) {\n        const action = link.getAttribute(\"data-turbo-action\");\n        return isAction(action) ? action : \"advance\";\n    }\n    getTargetFrameForLink(link) {\n        const frame = link.getAttribute(\"data-turbo-frame\");\n        if (frame) {\n            return frame;\n        }\n        else {\n            const container = link.closest(\"turbo-frame\");\n            if (container) {\n                return container.id;\n            }\n        }\n    }\n    get snapshot() {\n        return this.view.snapshot;\n    }\n}\nfunction extendURLWithDeprecatedProperties(url) {\n    Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\nconst deprecatedLocationPropertyDescriptors = {\n    absoluteURL: {\n        get() {\n            return this.toString();\n        }\n    }\n};\n\nconst session = new Session;\nconst { navigator: navigator$1 } = session;\nfunction start() {\n    session.start();\n}\nfunction registerAdapter(adapter) {\n    session.registerAdapter(adapter);\n}\nfunction visit(location, options) {\n    session.visit(location, options);\n}\nfunction connectStreamSource(source) {\n    session.connectStreamSource(source);\n}\nfunction disconnectStreamSource(source) {\n    session.disconnectStreamSource(source);\n}\nfunction renderStreamMessage(message) {\n    session.renderStreamMessage(message);\n}\nfunction clearCache() {\n    session.clearCache();\n}\nfunction setProgressBarDelay(delay) {\n    session.setProgressBarDelay(delay);\n}\nfunction setConfirmMethod(confirmMethod) {\n    FormSubmission.confirmMethod = confirmMethod;\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    navigator: navigator$1,\n    session: session,\n    PageRenderer: PageRenderer,\n    PageSnapshot: PageSnapshot,\n    start: start,\n    registerAdapter: registerAdapter,\n    visit: visit,\n    connectStreamSource: connectStreamSource,\n    disconnectStreamSource: disconnectStreamSource,\n    renderStreamMessage: renderStreamMessage,\n    clearCache: clearCache,\n    setProgressBarDelay: setProgressBarDelay,\n    setConfirmMethod: setConfirmMethod\n});\n\nclass FrameController {\n    constructor(element) {\n        this.fetchResponseLoaded = (fetchResponse) => { };\n        this.currentFetchRequest = null;\n        this.resolveVisitPromise = () => { };\n        this.connected = false;\n        this.hasBeenLoaded = false;\n        this.settingSourceURL = false;\n        this.element = element;\n        this.view = new FrameView(this, this.element);\n        this.appearanceObserver = new AppearanceObserver(this, this.element);\n        this.linkInterceptor = new LinkInterceptor(this, this.element);\n        this.formInterceptor = new FormInterceptor(this, this.element);\n    }\n    connect() {\n        if (!this.connected) {\n            this.connected = true;\n            this.reloadable = false;\n            if (this.loadingStyle == FrameLoadingStyle.lazy) {\n                this.appearanceObserver.start();\n            }\n            this.linkInterceptor.start();\n            this.formInterceptor.start();\n            this.sourceURLChanged();\n        }\n    }\n    disconnect() {\n        if (this.connected) {\n            this.connected = false;\n            this.appearanceObserver.stop();\n            this.linkInterceptor.stop();\n            this.formInterceptor.stop();\n        }\n    }\n    disabledChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.eager) {\n            this.loadSourceURL();\n        }\n    }\n    sourceURLChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.eager || this.hasBeenLoaded) {\n            this.loadSourceURL();\n        }\n    }\n    loadingStyleChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.lazy) {\n            this.appearanceObserver.start();\n        }\n        else {\n            this.appearanceObserver.stop();\n            this.loadSourceURL();\n        }\n    }\n    async loadSourceURL() {\n        if (!this.settingSourceURL && this.enabled && this.isActive && (this.reloadable || this.sourceURL != this.currentURL)) {\n            const previousURL = this.currentURL;\n            this.currentURL = this.sourceURL;\n            if (this.sourceURL) {\n                try {\n                    this.element.loaded = this.visit(expandURL(this.sourceURL));\n                    this.appearanceObserver.stop();\n                    await this.element.loaded;\n                    this.hasBeenLoaded = true;\n                }\n                catch (error) {\n                    this.currentURL = previousURL;\n                    throw error;\n                }\n            }\n        }\n    }\n    async loadResponse(fetchResponse) {\n        if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n            this.sourceURL = fetchResponse.response.url;\n        }\n        try {\n            const html = await fetchResponse.responseHTML;\n            if (html) {\n                const { body } = parseHTMLDocument(html);\n                const snapshot = new Snapshot(await this.extractForeignFrameElement(body));\n                const renderer = new FrameRenderer(this.view.snapshot, snapshot, false, false);\n                if (this.view.renderPromise)\n                    await this.view.renderPromise;\n                await this.view.render(renderer);\n                session.frameRendered(fetchResponse, this.element);\n                session.frameLoaded(this.element);\n                this.fetchResponseLoaded(fetchResponse);\n            }\n        }\n        catch (error) {\n            console.error(error);\n            this.view.invalidate();\n        }\n        finally {\n            this.fetchResponseLoaded = () => { };\n        }\n    }\n    elementAppearedInViewport(element) {\n        this.loadSourceURL();\n    }\n    shouldInterceptLinkClick(element, url) {\n        if (element.hasAttribute(\"data-turbo-method\")) {\n            return false;\n        }\n        else {\n            return this.shouldInterceptNavigation(element);\n        }\n    }\n    linkClickIntercepted(element, url) {\n        this.reloadable = true;\n        this.navigateFrame(element, url);\n    }\n    shouldInterceptFormSubmission(element, submitter) {\n        return this.shouldInterceptNavigation(element, submitter);\n    }\n    formSubmissionIntercepted(element, submitter) {\n        if (this.formSubmission) {\n            this.formSubmission.stop();\n        }\n        this.reloadable = false;\n        this.formSubmission = new FormSubmission(this, element, submitter);\n        const { fetchRequest } = this.formSubmission;\n        this.prepareHeadersForRequest(fetchRequest.headers, fetchRequest);\n        this.formSubmission.start();\n    }\n    prepareHeadersForRequest(headers, request) {\n        headers[\"Turbo-Frame\"] = this.id;\n    }\n    requestStarted(request) {\n        markAsBusy(this.element);\n    }\n    requestPreventedHandlingResponse(request, response) {\n        this.resolveVisitPromise();\n    }\n    async requestSucceededWithResponse(request, response) {\n        await this.loadResponse(response);\n        this.resolveVisitPromise();\n    }\n    requestFailedWithResponse(request, response) {\n        console.error(response);\n        this.resolveVisitPromise();\n    }\n    requestErrored(request, error) {\n        console.error(error);\n        this.resolveVisitPromise();\n    }\n    requestFinished(request) {\n        clearBusyState(this.element);\n    }\n    formSubmissionStarted({ formElement }) {\n        markAsBusy(formElement, this.findFrameElement(formElement));\n    }\n    formSubmissionSucceededWithResponse(formSubmission, response) {\n        const frame = this.findFrameElement(formSubmission.formElement, formSubmission.submitter);\n        this.proposeVisitIfNavigatedWithAction(frame, formSubmission.formElement, formSubmission.submitter);\n        frame.delegate.loadResponse(response);\n    }\n    formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n        this.element.delegate.loadResponse(fetchResponse);\n    }\n    formSubmissionErrored(formSubmission, error) {\n        console.error(error);\n    }\n    formSubmissionFinished({ formElement }) {\n        clearBusyState(formElement, this.findFrameElement(formElement));\n    }\n    allowsImmediateRender(snapshot, resume) {\n        return true;\n    }\n    viewRenderedSnapshot(snapshot, isPreview) {\n    }\n    viewInvalidated() {\n    }\n    async visit(url) {\n        var _a;\n        const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams, this.element);\n        (_a = this.currentFetchRequest) === null || _a === void 0 ? void 0 : _a.cancel();\n        this.currentFetchRequest = request;\n        return new Promise(resolve => {\n            this.resolveVisitPromise = () => {\n                this.resolveVisitPromise = () => { };\n                this.currentFetchRequest = null;\n                resolve();\n            };\n            request.perform();\n        });\n    }\n    navigateFrame(element, url, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        this.proposeVisitIfNavigatedWithAction(frame, element, submitter);\n        frame.setAttribute(\"reloadable\", \"\");\n        frame.src = url;\n    }\n    proposeVisitIfNavigatedWithAction(frame, element, submitter) {\n        const action = getAttribute(\"data-turbo-action\", submitter, element, frame);\n        if (isAction(action)) {\n            const { visitCachedSnapshot } = new SnapshotSubstitution(frame);\n            frame.delegate.fetchResponseLoaded = (fetchResponse) => {\n                if (frame.src) {\n                    const { statusCode, redirected } = fetchResponse;\n                    const responseHTML = frame.ownerDocument.documentElement.outerHTML;\n                    const response = { statusCode, redirected, responseHTML };\n                    session.visit(frame.src, { action, response, visitCachedSnapshot, willRender: false });\n                }\n            };\n        }\n    }\n    findFrameElement(element, submitter) {\n        var _a;\n        const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n        return (_a = getFrameElementById(id)) !== null && _a !== void 0 ? _a : this.element;\n    }\n    async extractForeignFrameElement(container) {\n        let element;\n        const id = CSS.escape(this.id);\n        try {\n            if (element = activateElement(container.querySelector(`turbo-frame#${id}`), this.currentURL)) {\n                return element;\n            }\n            if (element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.currentURL)) {\n                await element.loaded;\n                return await this.extractForeignFrameElement(element);\n            }\n            console.error(`Response has no matching <turbo-frame id=\"${id}\"> element`);\n        }\n        catch (error) {\n            console.error(error);\n        }\n        return new FrameElement();\n    }\n    formActionIsVisitable(form, submitter) {\n        const action = getAction(form, submitter);\n        return locationIsVisitable(expandURL(action), this.rootLocation);\n    }\n    shouldInterceptNavigation(element, submitter) {\n        const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n        if (element instanceof HTMLFormElement && !this.formActionIsVisitable(element, submitter)) {\n            return false;\n        }\n        if (!this.enabled || id == \"_top\") {\n            return false;\n        }\n        if (id) {\n            const frameElement = getFrameElementById(id);\n            if (frameElement) {\n                return !frameElement.disabled;\n            }\n        }\n        if (!session.elementDriveEnabled(element)) {\n            return false;\n        }\n        if (submitter && !session.elementDriveEnabled(submitter)) {\n            return false;\n        }\n        return true;\n    }\n    get id() {\n        return this.element.id;\n    }\n    get enabled() {\n        return !this.element.disabled;\n    }\n    get sourceURL() {\n        if (this.element.src) {\n            return this.element.src;\n        }\n    }\n    get reloadable() {\n        const frame = this.findFrameElement(this.element);\n        return frame.hasAttribute(\"reloadable\");\n    }\n    set reloadable(value) {\n        const frame = this.findFrameElement(this.element);\n        if (value) {\n            frame.setAttribute(\"reloadable\", \"\");\n        }\n        else {\n            frame.removeAttribute(\"reloadable\");\n        }\n    }\n    set sourceURL(sourceURL) {\n        this.settingSourceURL = true;\n        this.element.src = sourceURL !== null && sourceURL !== void 0 ? sourceURL : null;\n        this.currentURL = this.element.src;\n        this.settingSourceURL = false;\n    }\n    get loadingStyle() {\n        return this.element.loading;\n    }\n    get isLoading() {\n        return this.formSubmission !== undefined || this.resolveVisitPromise() !== undefined;\n    }\n    get isActive() {\n        return this.element.isActive && this.connected;\n    }\n    get rootLocation() {\n        var _a;\n        const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n        const root = (_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\";\n        return expandURL(root);\n    }\n}\nclass SnapshotSubstitution {\n    constructor(element) {\n        this.visitCachedSnapshot = ({ element }) => {\n            var _a;\n            const { id, clone } = this;\n            (_a = element.querySelector(\"#\" + id)) === null || _a === void 0 ? void 0 : _a.replaceWith(clone);\n        };\n        this.clone = element.cloneNode(true);\n        this.id = element.id;\n    }\n}\nfunction getFrameElementById(id) {\n    if (id != null) {\n        const element = document.getElementById(id);\n        if (element instanceof FrameElement) {\n            return element;\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        if (element instanceof FrameElement) {\n            element.connectedCallback();\n            element.disconnectedCallback();\n            return element;\n        }\n    }\n}\n\nconst StreamActions = {\n    after() {\n        this.targetElements.forEach(e => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e.nextSibling); });\n    },\n    append() {\n        this.removeDuplicateTargetChildren();\n        this.targetElements.forEach(e => e.append(this.templateContent));\n    },\n    before() {\n        this.targetElements.forEach(e => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e); });\n    },\n    prepend() {\n        this.removeDuplicateTargetChildren();\n        this.targetElements.forEach(e => e.prepend(this.templateContent));\n    },\n    remove() {\n        this.targetElements.forEach(e => e.remove());\n    },\n    replace() {\n        this.targetElements.forEach(e => e.replaceWith(this.templateContent));\n    },\n    update() {\n        this.targetElements.forEach(e => {\n            e.innerHTML = \"\";\n            e.append(this.templateContent);\n        });\n    }\n};\n\nclass StreamElement extends HTMLElement {\n    async connectedCallback() {\n        try {\n            await this.render();\n        }\n        catch (error) {\n            console.error(error);\n        }\n        finally {\n            this.disconnect();\n        }\n    }\n    async render() {\n        var _a;\n        return (_a = this.renderPromise) !== null && _a !== void 0 ? _a : (this.renderPromise = (async () => {\n            if (this.dispatchEvent(this.beforeRenderEvent)) {\n                await nextAnimationFrame();\n                this.performAction();\n            }\n        })());\n    }\n    disconnect() {\n        try {\n            this.remove();\n        }\n        catch (_a) { }\n    }\n    removeDuplicateTargetChildren() {\n        this.duplicateChildren.forEach(c => c.remove());\n    }\n    get duplicateChildren() {\n        var _a;\n        const existingChildren = this.targetElements.flatMap(e => [...e.children]).filter(c => !!c.id);\n        const newChildrenIds = [...(_a = this.templateContent) === null || _a === void 0 ? void 0 : _a.children].filter(c => !!c.id).map(c => c.id);\n        return existingChildren.filter(c => newChildrenIds.includes(c.id));\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    get targetElements() {\n        if (this.target) {\n            return this.targetElementsById;\n        }\n        else if (this.targets) {\n            return this.targetElementsByQuery;\n        }\n        else {\n            this.raise(\"target or targets attribute is missing\");\n        }\n    }\n    get templateContent() {\n        return this.templateElement.content.cloneNode(true);\n    }\n    get templateElement() {\n        if (this.firstElementChild instanceof HTMLTemplateElement) {\n            return this.firstElementChild;\n        }\n        this.raise(\"first child element must be a <template> element\");\n    }\n    get action() {\n        return this.getAttribute(\"action\");\n    }\n    get target() {\n        return this.getAttribute(\"target\");\n    }\n    get targets() {\n        return this.getAttribute(\"targets\");\n    }\n    raise(message) {\n        throw new Error(`${this.description}: ${message}`);\n    }\n    get description() {\n        var _a, _b;\n        return (_b = ((_a = this.outerHTML.match(/<[^>]+>/)) !== null && _a !== void 0 ? _a : [])[0]) !== null && _b !== void 0 ? _b : \"<turbo-stream>\";\n    }\n    get beforeRenderEvent() {\n        return new CustomEvent(\"turbo:before-stream-render\", { bubbles: true, cancelable: true });\n    }\n    get targetElementsById() {\n        var _a;\n        const element = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.getElementById(this.target);\n        if (element !== null) {\n            return [element];\n        }\n        else {\n            return [];\n        }\n    }\n    get targetElementsByQuery() {\n        var _a;\n        const elements = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.targets);\n        if (elements.length !== 0) {\n            return Array.prototype.slice.call(elements);\n        }\n        else {\n            return [];\n        }\n    }\n}\n\nFrameElement.delegateConstructor = FrameController;\ncustomElements.define(\"turbo-frame\", FrameElement);\ncustomElements.define(\"turbo-stream\", StreamElement);\n\n(() => {\n    let element = document.currentScript;\n    if (!element)\n        return;\n    if (element.hasAttribute(\"data-turbo-suppress-warning\"))\n        return;\n    while (element = element.parentElement) {\n        if (element == document.body) {\n            return console.warn(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      `, element.outerHTML);\n        }\n    }\n})();\n\nwindow.Turbo = Turbo;\nstart();\n\nexport { PageRenderer, PageSnapshot, clearCache, connectStreamSource, disconnectStreamSource, navigator$1 as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, 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", "import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, { received: this.dispatchMessageEvent.bind(this) })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\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 }\n  }\n}\n\ncustomElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n", "var sparkMd5 = {\n  exports: {}\n};\n\n(function(module, exports) {\n  (function(factory) {\n    {\n      module.exports = factory();\n    }\n  })((function(undefined$1) {\n    var hex_chr = [ \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\" ];\n    function md5cycle(x, k) {\n      var a = x[0], b = x[1], c = x[2], d = x[3];\n      a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[10] - 42063 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b ^ c ^ d) + k[5] - 378558 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      x[0] = a + x[0] | 0;\n      x[1] = b + x[1] | 0;\n      x[2] = c + x[2] | 0;\n      x[3] = d + x[3] | 0;\n    }\n    function md5blk(s) {\n      var md5blks = [], i;\n      for (i = 0; i < 64; i += 4) {\n        md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n      }\n      return md5blks;\n    }\n    function md5blk_array(a) {\n      var md5blks = [], i;\n      for (i = 0; i < 64; i += 4) {\n        md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n      }\n      return md5blks;\n    }\n    function md51(s) {\n      var n = s.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n      for (i = 64; i <= n; i += 64) {\n        md5cycle(state, md5blk(s.substring(i - 64, i)));\n      }\n      s = s.substring(i - 64);\n      length = s.length;\n      tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3);\n      }\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(state, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = n * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(state, tail);\n      return state;\n    }\n    function md51_array(a) {\n      var n = a.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n      for (i = 64; i <= n; i += 64) {\n        md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n      }\n      a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0);\n      length = a.length;\n      tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= a[i] << (i % 4 << 3);\n      }\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(state, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = n * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(state, tail);\n      return state;\n    }\n    function rhex(n) {\n      var s = \"\", j;\n      for (j = 0; j < 4; j += 1) {\n        s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15];\n      }\n      return s;\n    }\n    function hex(x) {\n      var i;\n      for (i = 0; i < x.length; i += 1) {\n        x[i] = rhex(x[i]);\n      }\n      return x.join(\"\");\n    }\n    if (hex(md51(\"hello\")) !== \"5d41402abc4b2a76b9719d911017c592\") ;\n    if (typeof ArrayBuffer !== \"undefined\" && !ArrayBuffer.prototype.slice) {\n      (function() {\n        function clamp(val, length) {\n          val = val | 0 || 0;\n          if (val < 0) {\n            return Math.max(val + length, 0);\n          }\n          return Math.min(val, length);\n        }\n        ArrayBuffer.prototype.slice = function(from, to) {\n          var length = this.byteLength, begin = clamp(from, length), end = length, num, target, targetArray, sourceArray;\n          if (to !== undefined$1) {\n            end = clamp(to, length);\n          }\n          if (begin > end) {\n            return new ArrayBuffer(0);\n          }\n          num = end - begin;\n          target = new ArrayBuffer(num);\n          targetArray = new Uint8Array(target);\n          sourceArray = new Uint8Array(this, begin, num);\n          targetArray.set(sourceArray);\n          return target;\n        };\n      })();\n    }\n    function toUtf8(str) {\n      if (/[\\u0080-\\uFFFF]/.test(str)) {\n        str = unescape(encodeURIComponent(str));\n      }\n      return str;\n    }\n    function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n      var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i;\n      for (i = 0; i < length; i += 1) {\n        arr[i] = str.charCodeAt(i);\n      }\n      return returnUInt8Array ? arr : buff;\n    }\n    function arrayBuffer2Utf8Str(buff) {\n      return String.fromCharCode.apply(null, new Uint8Array(buff));\n    }\n    function concatenateArrayBuffers(first, second, returnUInt8Array) {\n      var result = new Uint8Array(first.byteLength + second.byteLength);\n      result.set(new Uint8Array(first));\n      result.set(new Uint8Array(second), first.byteLength);\n      return returnUInt8Array ? result : result.buffer;\n    }\n    function hexToBinaryString(hex) {\n      var bytes = [], length = hex.length, x;\n      for (x = 0; x < length - 1; x += 2) {\n        bytes.push(parseInt(hex.substr(x, 2), 16));\n      }\n      return String.fromCharCode.apply(String, bytes);\n    }\n    function SparkMD5() {\n      this.reset();\n    }\n    SparkMD5.prototype.append = function(str) {\n      this.appendBinary(toUtf8(str));\n      return this;\n    };\n    SparkMD5.prototype.appendBinary = function(contents) {\n      this._buff += contents;\n      this._length += contents.length;\n      var length = this._buff.length, i;\n      for (i = 64; i <= length; i += 64) {\n        md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n      }\n      this._buff = this._buff.substring(i - 64);\n      return this;\n    };\n    SparkMD5.prototype.end = function(raw) {\n      var buff = this._buff, length = buff.length, i, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ret;\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3);\n      }\n      this._finish(tail, length);\n      ret = hex(this._hash);\n      if (raw) {\n        ret = hexToBinaryString(ret);\n      }\n      this.reset();\n      return ret;\n    };\n    SparkMD5.prototype.reset = function() {\n      this._buff = \"\";\n      this._length = 0;\n      this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n      return this;\n    };\n    SparkMD5.prototype.getState = function() {\n      return {\n        buff: this._buff,\n        length: this._length,\n        hash: this._hash.slice()\n      };\n    };\n    SparkMD5.prototype.setState = function(state) {\n      this._buff = state.buff;\n      this._length = state.length;\n      this._hash = state.hash;\n      return this;\n    };\n    SparkMD5.prototype.destroy = function() {\n      delete this._hash;\n      delete this._buff;\n      delete this._length;\n    };\n    SparkMD5.prototype._finish = function(tail, length) {\n      var i = length, tmp, lo, hi;\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(this._hash, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = this._length * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(this._hash, tail);\n    };\n    SparkMD5.hash = function(str, raw) {\n      return SparkMD5.hashBinary(toUtf8(str), raw);\n    };\n    SparkMD5.hashBinary = function(content, raw) {\n      var hash = md51(content), ret = hex(hash);\n      return raw ? hexToBinaryString(ret) : ret;\n    };\n    SparkMD5.ArrayBuffer = function() {\n      this.reset();\n    };\n    SparkMD5.ArrayBuffer.prototype.append = function(arr) {\n      var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i;\n      this._length += arr.byteLength;\n      for (i = 64; i <= length; i += 64) {\n        md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n      }\n      this._buff = i - 64 < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n      return this;\n    };\n    SparkMD5.ArrayBuffer.prototype.end = function(raw) {\n      var buff = this._buff, length = buff.length, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], i, ret;\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= buff[i] << (i % 4 << 3);\n      }\n      this._finish(tail, length);\n      ret = hex(this._hash);\n      if (raw) {\n        ret = hexToBinaryString(ret);\n      }\n      this.reset();\n      return ret;\n    };\n    SparkMD5.ArrayBuffer.prototype.reset = function() {\n      this._buff = new Uint8Array(0);\n      this._length = 0;\n      this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n      return this;\n    };\n    SparkMD5.ArrayBuffer.prototype.getState = function() {\n      var state = SparkMD5.prototype.getState.call(this);\n      state.buff = arrayBuffer2Utf8Str(state.buff);\n      return state;\n    };\n    SparkMD5.ArrayBuffer.prototype.setState = function(state) {\n      state.buff = utf8Str2ArrayBuffer(state.buff, true);\n      return SparkMD5.prototype.setState.call(this, state);\n    };\n    SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n    SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n    SparkMD5.ArrayBuffer.hash = function(arr, raw) {\n      var hash = md51_array(new Uint8Array(arr)), ret = hex(hash);\n      return raw ? hexToBinaryString(ret) : ret;\n    };\n    return SparkMD5;\n  }));\n})(sparkMd5);\n\nvar SparkMD5 = sparkMd5.exports;\n\nconst fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;\n\nclass FileChecksum {\n  static create(file, callback) {\n    const instance = new FileChecksum(file);\n    instance.create(callback);\n  }\n  constructor(file) {\n    this.file = file;\n    this.chunkSize = 2097152;\n    this.chunkCount = Math.ceil(this.file.size / this.chunkSize);\n    this.chunkIndex = 0;\n  }\n  create(callback) {\n    this.callback = callback;\n    this.md5Buffer = new SparkMD5.ArrayBuffer;\n    this.fileReader = new FileReader;\n    this.fileReader.addEventListener(\"load\", (event => this.fileReaderDidLoad(event)));\n    this.fileReader.addEventListener(\"error\", (event => this.fileReaderDidError(event)));\n    this.readNextChunk();\n  }\n  fileReaderDidLoad(event) {\n    this.md5Buffer.append(event.target.result);\n    if (!this.readNextChunk()) {\n      const binaryDigest = this.md5Buffer.end(true);\n      const base64digest = btoa(binaryDigest);\n      this.callback(null, base64digest);\n    }\n  }\n  fileReaderDidError(event) {\n    this.callback(`Error reading ${this.file.name}`);\n  }\n  readNextChunk() {\n    if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {\n      const start = this.chunkIndex * this.chunkSize;\n      const end = Math.min(start + this.chunkSize, this.file.size);\n      const bytes = fileSlice.call(this.file, start, end);\n      this.fileReader.readAsArrayBuffer(bytes);\n      this.chunkIndex++;\n      return true;\n    } else {\n      return false;\n    }\n  }\n}\n\nfunction getMetaValue(name) {\n  const element = findElement(document.head, `meta[name=\"${name}\"]`);\n  if (element) {\n    return element.getAttribute(\"content\");\n  }\n}\n\nfunction findElements(root, selector) {\n  if (typeof root == \"string\") {\n    selector = root;\n    root = document;\n  }\n  const elements = root.querySelectorAll(selector);\n  return toArray(elements);\n}\n\nfunction findElement(root, selector) {\n  if (typeof root == \"string\") {\n    selector = root;\n    root = document;\n  }\n  return root.querySelector(selector);\n}\n\nfunction dispatchEvent(element, type, eventInit = {}) {\n  const {disabled: disabled} = element;\n  const {bubbles: bubbles, cancelable: cancelable, detail: detail} = eventInit;\n  const event = document.createEvent(\"Event\");\n  event.initEvent(type, bubbles || true, cancelable || true);\n  event.detail = detail || {};\n  try {\n    element.disabled = false;\n    element.dispatchEvent(event);\n  } finally {\n    element.disabled = disabled;\n  }\n  return event;\n}\n\nfunction toArray(value) {\n  if (Array.isArray(value)) {\n    return value;\n  } else if (Array.from) {\n    return Array.from(value);\n  } else {\n    return [].slice.call(value);\n  }\n}\n\nclass BlobRecord {\n  constructor(file, checksum, url, customHeaders = {}) {\n    this.file = file;\n    this.attributes = {\n      filename: file.name,\n      content_type: file.type || \"application/octet-stream\",\n      byte_size: file.size,\n      checksum: checksum\n    };\n    this.xhr = new XMLHttpRequest;\n    this.xhr.open(\"POST\", url, true);\n    this.xhr.responseType = \"json\";\n    this.xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n    this.xhr.setRequestHeader(\"Accept\", \"application/json\");\n    this.xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n    Object.keys(customHeaders).forEach((headerKey => {\n      this.xhr.setRequestHeader(headerKey, customHeaders[headerKey]);\n    }));\n    const csrfToken = getMetaValue(\"csrf-token\");\n    if (csrfToken != undefined) {\n      this.xhr.setRequestHeader(\"X-CSRF-Token\", csrfToken);\n    }\n    this.xhr.addEventListener(\"load\", (event => this.requestDidLoad(event)));\n    this.xhr.addEventListener(\"error\", (event => this.requestDidError(event)));\n  }\n  get status() {\n    return this.xhr.status;\n  }\n  get response() {\n    const {responseType: responseType, response: response} = this.xhr;\n    if (responseType == \"json\") {\n      return response;\n    } else {\n      return JSON.parse(response);\n    }\n  }\n  create(callback) {\n    this.callback = callback;\n    this.xhr.send(JSON.stringify({\n      blob: this.attributes\n    }));\n  }\n  requestDidLoad(event) {\n    if (this.status >= 200 && this.status < 300) {\n      const {response: response} = this;\n      const {direct_upload: direct_upload} = response;\n      delete response.direct_upload;\n      this.attributes = response;\n      this.directUploadData = direct_upload;\n      this.callback(null, this.toJSON());\n    } else {\n      this.requestDidError(event);\n    }\n  }\n  requestDidError(event) {\n    this.callback(`Error creating Blob for \"${this.file.name}\". Status: ${this.status}`);\n  }\n  toJSON() {\n    const result = {};\n    for (const key in this.attributes) {\n      result[key] = this.attributes[key];\n    }\n    return result;\n  }\n}\n\nclass BlobUpload {\n  constructor(blob) {\n    this.blob = blob;\n    this.file = blob.file;\n    const {url: url, headers: headers} = blob.directUploadData;\n    this.xhr = new XMLHttpRequest;\n    this.xhr.open(\"PUT\", url, true);\n    this.xhr.responseType = \"text\";\n    for (const key in headers) {\n      this.xhr.setRequestHeader(key, headers[key]);\n    }\n    this.xhr.addEventListener(\"load\", (event => this.requestDidLoad(event)));\n    this.xhr.addEventListener(\"error\", (event => this.requestDidError(event)));\n  }\n  create(callback) {\n    this.callback = callback;\n    this.xhr.send(this.file.slice());\n  }\n  requestDidLoad(event) {\n    const {status: status, response: response} = this.xhr;\n    if (status >= 200 && status < 300) {\n      this.callback(null, response);\n    } else {\n      this.requestDidError(event);\n    }\n  }\n  requestDidError(event) {\n    this.callback(`Error storing \"${this.file.name}\". Status: ${this.xhr.status}`);\n  }\n}\n\nlet id = 0;\n\nclass DirectUpload {\n  constructor(file, url, delegate, customHeaders = {}) {\n    this.id = ++id;\n    this.file = file;\n    this.url = url;\n    this.delegate = delegate;\n    this.customHeaders = customHeaders;\n  }\n  create(callback) {\n    FileChecksum.create(this.file, ((error, checksum) => {\n      if (error) {\n        callback(error);\n        return;\n      }\n      const blob = new BlobRecord(this.file, checksum, this.url, this.customHeaders);\n      notify(this.delegate, \"directUploadWillCreateBlobWithXHR\", blob.xhr);\n      blob.create((error => {\n        if (error) {\n          callback(error);\n        } else {\n          const upload = new BlobUpload(blob);\n          notify(this.delegate, \"directUploadWillStoreFileWithXHR\", upload.xhr);\n          upload.create((error => {\n            if (error) {\n              callback(error);\n            } else {\n              callback(null, blob.toJSON());\n            }\n          }));\n        }\n      }));\n    }));\n  }\n}\n\nfunction notify(object, methodName, ...messages) {\n  if (object && typeof object[methodName] == \"function\") {\n    return object[methodName](...messages);\n  }\n}\n\nclass DirectUploadController {\n  constructor(input, file) {\n    this.input = input;\n    this.file = file;\n    this.directUpload = new DirectUpload(this.file, this.url, this);\n    this.dispatch(\"initialize\");\n  }\n  start(callback) {\n    const hiddenInput = document.createElement(\"input\");\n    hiddenInput.type = \"hidden\";\n    hiddenInput.name = this.input.name;\n    this.input.insertAdjacentElement(\"beforebegin\", hiddenInput);\n    this.dispatch(\"start\");\n    this.directUpload.create(((error, attributes) => {\n      if (error) {\n        hiddenInput.parentNode.removeChild(hiddenInput);\n        this.dispatchError(error);\n      } else {\n        hiddenInput.value = attributes.signed_id;\n      }\n      this.dispatch(\"end\");\n      callback(error);\n    }));\n  }\n  uploadRequestDidProgress(event) {\n    const progress = event.loaded / event.total * 100;\n    if (progress) {\n      this.dispatch(\"progress\", {\n        progress: progress\n      });\n    }\n  }\n  get url() {\n    return this.input.getAttribute(\"data-direct-upload-url\");\n  }\n  dispatch(name, detail = {}) {\n    detail.file = this.file;\n    detail.id = this.directUpload.id;\n    return dispatchEvent(this.input, `direct-upload:${name}`, {\n      detail: detail\n    });\n  }\n  dispatchError(error) {\n    const event = this.dispatch(\"error\", {\n      error: error\n    });\n    if (!event.defaultPrevented) {\n      alert(error);\n    }\n  }\n  directUploadWillCreateBlobWithXHR(xhr) {\n    this.dispatch(\"before-blob-request\", {\n      xhr: xhr\n    });\n  }\n  directUploadWillStoreFileWithXHR(xhr) {\n    this.dispatch(\"before-storage-request\", {\n      xhr: xhr\n    });\n    xhr.upload.addEventListener(\"progress\", (event => this.uploadRequestDidProgress(event)));\n  }\n}\n\nconst inputSelector = \"input[type=file][data-direct-upload-url]:not([disabled])\";\n\nclass DirectUploadsController {\n  constructor(form) {\n    this.form = form;\n    this.inputs = findElements(form, inputSelector).filter((input => input.files.length));\n  }\n  start(callback) {\n    const controllers = this.createDirectUploadControllers();\n    const startNextController = () => {\n      const controller = controllers.shift();\n      if (controller) {\n        controller.start((error => {\n          if (error) {\n            callback(error);\n            this.dispatch(\"end\");\n          } else {\n            startNextController();\n          }\n        }));\n      } else {\n        callback();\n        this.dispatch(\"end\");\n      }\n    };\n    this.dispatch(\"start\");\n    startNextController();\n  }\n  createDirectUploadControllers() {\n    const controllers = [];\n    this.inputs.forEach((input => {\n      toArray(input.files).forEach((file => {\n        const controller = new DirectUploadController(input, file);\n        controllers.push(controller);\n      }));\n    }));\n    return controllers;\n  }\n  dispatch(name, detail = {}) {\n    return dispatchEvent(this.form, `direct-uploads:${name}`, {\n      detail: detail\n    });\n  }\n}\n\nconst processingAttribute = \"data-direct-uploads-processing\";\n\nconst submitButtonsByForm = new WeakMap;\n\nlet started = false;\n\nfunction start() {\n  if (!started) {\n    started = true;\n    document.addEventListener(\"click\", didClick, true);\n    document.addEventListener(\"submit\", didSubmitForm, true);\n    document.addEventListener(\"ajax:before\", didSubmitRemoteElement);\n  }\n}\n\nfunction didClick(event) {\n  const button = event.target.closest(\"button, input\");\n  if (button && button.type === \"submit\" && button.form) {\n    submitButtonsByForm.set(button.form, button);\n  }\n}\n\nfunction didSubmitForm(event) {\n  handleFormSubmissionEvent(event);\n}\n\nfunction didSubmitRemoteElement(event) {\n  if (event.target.tagName == \"FORM\") {\n    handleFormSubmissionEvent(event);\n  }\n}\n\nfunction handleFormSubmissionEvent(event) {\n  const form = event.target;\n  if (form.hasAttribute(processingAttribute)) {\n    event.preventDefault();\n    return;\n  }\n  const controller = new DirectUploadsController(form);\n  const {inputs: inputs} = controller;\n  if (inputs.length) {\n    event.preventDefault();\n    form.setAttribute(processingAttribute, \"\");\n    inputs.forEach(disable);\n    controller.start((error => {\n      form.removeAttribute(processingAttribute);\n      if (error) {\n        inputs.forEach(enable);\n      } else {\n        submitForm(form);\n      }\n    }));\n  }\n}\n\nfunction submitForm(form) {\n  let button = submitButtonsByForm.get(form) || findElement(form, \"input[type=submit], button[type=submit]\");\n  if (button) {\n    const {disabled: disabled} = button;\n    button.disabled = false;\n    button.focus();\n    button.click();\n    button.disabled = disabled;\n  } else {\n    button = document.createElement(\"input\");\n    button.type = \"submit\";\n    button.style.display = \"none\";\n    form.appendChild(button);\n    button.click();\n    form.removeChild(button);\n  }\n  submitButtonsByForm.delete(form);\n}\n\nfunction disable(input) {\n  input.disabled = true;\n}\n\nfunction enable(input) {\n  input.disabled = false;\n}\n\nfunction autostart() {\n  if (window.ActiveStorage) {\n    start();\n  }\n}\n\nsetTimeout(autostart, 1);\n\nexport { DirectUpload, DirectUploadController, DirectUploadsController, dispatchEvent, start };\n", "export const attachmentSelector = \"[data-trix-attachment]\"\n\nconst attachments = {\n  preview: {\n    presentation: \"gallery\",\n    caption: {\n      name: true,\n      size: true,\n    },\n  },\n  file: {\n    caption: {\n      size: true,\n    },\n  },\n}\nexport default attachments\n", "const attributes = {\n  default: {\n    tagName: \"div\",\n    parse: false,\n  },\n  quote: {\n    tagName: \"blockquote\",\n    nestable: true,\n  },\n  heading1: {\n    tagName: \"h1\",\n    terminal: true,\n    breakOnReturn: true,\n    group: false,\n  },\n  code: {\n    tagName: \"pre\",\n    terminal: true,\n    htmlAttributes: [ \"language\" ],\n    text: {\n      plaintext: true,\n    },\n  },\n  bulletList: {\n    tagName: \"ul\",\n    parse: false,\n  },\n  bullet: {\n    tagName: \"li\",\n    listAttribute: \"bulletList\",\n    group: false,\n    nestable: true,\n    test(element) {\n      return tagName(element.parentNode) === attributes[this.listAttribute].tagName\n    },\n  },\n  numberList: {\n    tagName: \"ol\",\n    parse: false,\n  },\n  number: {\n    tagName: \"li\",\n    listAttribute: \"numberList\",\n    group: false,\n    nestable: true,\n    test(element) {\n      return tagName(element.parentNode) === attributes[this.listAttribute].tagName\n    },\n  },\n  attachmentGallery: {\n    tagName: \"div\",\n    exclusive: true,\n    terminal: true,\n    parse: false,\n    group: false,\n  },\n}\n\nconst tagName = (element) => element?.tagName?.toLowerCase()\n\nexport default attributes\n", "const androidVersionMatch = navigator.userAgent.match(/android\\s([0-9]+.*Chrome)/i)\nconst androidVersion = androidVersionMatch && parseInt(androidVersionMatch[1])\n\nexport default {\n  // Android emits composition events when moving the cursor through existing text\n  // Introduced in Chrome 65: https://bugs.chromium.org/p/chromium/issues/detail?id=764439#c9\n  composesExistingText: /Android.*Chrome/.test(navigator.userAgent),\n\n  // Android 13, especially on Samsung keyboards, emits extra compositionend and beforeinput events\n  // that can make the input handler lose the current selection or enter an infinite input -> render -> input\n  // loop.\n  recentAndroid: androidVersion && androidVersion > 12,\n  samsungAndroid: androidVersion && navigator.userAgent.match(/Android.*SM-/),\n\n  // IE 11 activates resizing handles on editable elements that have \"layout\"\n  forcesObjectResizing: /Trident.*rv:11/.test(navigator.userAgent),\n  // https://www.w3.org/TR/input-events-1/ + https://www.w3.org/TR/input-events-2/\n  supportsInputEvents: typeof InputEvent !== \"undefined\" &&\n    [ \"data\", \"getTargetRanges\", \"inputType\" ].every(prop => prop in InputEvent.prototype),\n}\n", "export default {\n  ADD_ATTR: [ \"language\" ],\n  SAFE_FOR_XML: false,\n  RETURN_DOM: true\n}\n", "export default {\n  attachFiles: \"Attach Files\",\n  bold: \"Bold\",\n  bullets: \"Bullets\",\n  byte: \"Byte\",\n  bytes: \"Bytes\",\n  captionPlaceholder: \"Add a caption\u2026\",\n  code: \"Code\",\n  heading1: \"Heading\",\n  indent: \"Increase Level\",\n  italic: \"Italic\",\n  link: \"Link\",\n  numbers: \"Numbers\",\n  outdent: \"Decrease Level\",\n  quote: \"Quote\",\n  redo: \"Redo\",\n  remove: \"Remove\",\n  strike: \"Strikethrough\",\n  undo: \"Undo\",\n  unlink: \"Unlink\",\n  url: \"URL\",\n  urlPlaceholder: \"Enter a URL\u2026\",\n  GB: \"GB\",\n  KB: \"KB\",\n  MB: \"MB\",\n  PB: \"PB\",\n  TB: \"TB\",\n}\n", "/* eslint-disable\n    no-case-declarations,\n*/\nimport lang from \"trix/config/lang\"\n\nconst sizes = [ lang.bytes, lang.KB, lang.MB, lang.GB, lang.TB, lang.PB ]\n\nexport default {\n  prefix: \"IEC\",\n  precision: 2,\n\n  formatter(number) {\n    switch (number) {\n      case 0:\n        return `0 ${lang.bytes}`\n      case 1:\n        return `1 ${lang.byte}`\n      default:\n        let base\n\n        if (this.prefix === \"SI\") {\n          base = 1000\n        } else if (this.prefix === \"IEC\") {\n          base = 1024\n        }\n\n        const exp = Math.floor(Math.log(number) / Math.log(base))\n        const humanSize = number / Math.pow(base, exp)\n        const string = humanSize.toFixed(this.precision)\n        const withoutInsignificantZeros = string.replace(/0*$/, \"\").replace(/\\.$/, \"\")\n        return `${withoutInsignificantZeros} ${sizes[exp]}`\n    }\n  },\n}\n", "export const ZERO_WIDTH_SPACE = \"\\uFEFF\"\nexport const NON_BREAKING_SPACE = \"\\u00A0\"\nexport const OBJECT_REPLACEMENT_CHARACTER = \"\\uFFFC\"\n", "export const extend = function(properties) {\n  for (const key in properties) {\n    const value = properties[key]\n    this[key] = value\n  }\n  return this\n}\n", "import blockAttributes from \"trix/config/block_attributes\"\nimport { ZERO_WIDTH_SPACE } from \"trix/constants\"\nimport { extend } from \"./extend\"\nimport { attachmentSelector } from \"trix/config/attachments\"\n\nconst html = document.documentElement\nconst match = html.matches\n\nexport const handleEvent = function(eventName, { onElement, matchingSelector, withCallback, inPhase, preventDefault, times } = {}) {\n  const element = onElement ? onElement : html\n  const selector = matchingSelector\n  const useCapture = inPhase === \"capturing\"\n\n  const handler = function(event) {\n    if (times != null && --times === 0) {\n      handler.destroy()\n    }\n    const target = findClosestElementFromNode(event.target, { matchingSelector: selector })\n    if (target != null) {\n      withCallback?.call(target, event, target)\n      if (preventDefault) {\n        event.preventDefault()\n      }\n    }\n  }\n\n  handler.destroy = () => element.removeEventListener(eventName, handler, useCapture)\n\n  element.addEventListener(eventName, handler, useCapture)\n  return handler\n}\n\nexport const handleEventOnce = function(eventName, options = {}) {\n  options.times = 1\n  return handleEvent(eventName, options)\n}\n\nexport const triggerEvent = function(eventName, { onElement, bubbles, cancelable, attributes } = {}) {\n  const element = onElement != null ? onElement : html\n  bubbles = bubbles !== false\n  cancelable = cancelable !== false\n\n  const event = document.createEvent(\"Events\")\n  event.initEvent(eventName, bubbles, cancelable)\n  if (attributes != null) {\n    extend.call(event, attributes)\n  }\n  return element.dispatchEvent(event)\n}\n\nexport const elementMatchesSelector = function(element, selector) {\n  if (element?.nodeType === 1) {\n    return match.call(element, selector)\n  }\n}\n\nexport const findClosestElementFromNode = function(node, { matchingSelector, untilNode } = {}) {\n  while (node && node.nodeType !== Node.ELEMENT_NODE) {\n    node = node.parentNode\n  }\n  if (node == null) {\n    return\n  }\n\n  if (matchingSelector != null) {\n    if (node.closest && untilNode == null) {\n      return node.closest(matchingSelector)\n    } else {\n      while (node && node !== untilNode) {\n        if (elementMatchesSelector(node, matchingSelector)) {\n          return node\n        }\n        node = node.parentNode\n      }\n    }\n  } else {\n    return node\n  }\n}\n\nexport const findInnerElement = function(element) {\n  while (element?.firstElementChild) {\n    element = element.firstElementChild\n  }\n  return element\n}\n\nexport const innerElementIsActive = (element) =>\n  document.activeElement !== element && elementContainsNode(element, document.activeElement)\n\nexport const elementContainsNode = function(element, node) {\n  if (!element || !node) {\n    return\n  }\n  while (node) {\n    if (node === element) {\n      return true\n    }\n    node = node.parentNode\n  }\n}\n\nexport const findNodeFromContainerAndOffset = function(container, offset) {\n  if (!container) {\n    return\n  }\n  if (container.nodeType === Node.TEXT_NODE) {\n    return container\n  } else if (offset === 0) {\n    return container.firstChild != null ? container.firstChild : container\n  } else {\n    return container.childNodes.item(offset - 1)\n  }\n}\n\nexport const findElementFromContainerAndOffset = function(container, offset) {\n  const node = findNodeFromContainerAndOffset(container, offset)\n  return findClosestElementFromNode(node)\n}\n\nexport const findChildIndexOfNode = function(node) {\n  if (!node?.parentNode) {\n    return\n  }\n  let childIndex = 0\n  node = node.previousSibling\n  while (node) {\n    childIndex++\n    node = node.previousSibling\n  }\n  return childIndex\n}\n\nexport const removeNode = (node) => node?.parentNode?.removeChild(node)\n\nexport const walkTree = function(tree, { onlyNodesOfType, usingFilter, expandEntityReferences } = {}) {\n  const whatToShow = (() => {\n    switch (onlyNodesOfType) {\n      case \"element\":\n        return NodeFilter.SHOW_ELEMENT\n      case \"text\":\n        return NodeFilter.SHOW_TEXT\n      case \"comment\":\n        return NodeFilter.SHOW_COMMENT\n      default:\n        return NodeFilter.SHOW_ALL\n    }\n  })()\n\n  return document.createTreeWalker(\n    tree,\n    whatToShow,\n    usingFilter != null ? usingFilter : null,\n    expandEntityReferences === true\n  )\n}\n\nexport const tagName = (element) => element?.tagName?.toLowerCase()\n\nexport const makeElement = function(tag, options = {}) {\n  let key, value\n  if (typeof tag === \"object\") {\n    options = tag\n    tag = options.tagName\n  } else {\n    options = { attributes: options }\n  }\n\n  const element = document.createElement(tag)\n\n  if (options.editable != null) {\n    if (options.attributes == null) {\n      options.attributes = {}\n    }\n    options.attributes.contenteditable = options.editable\n  }\n\n  if (options.attributes) {\n    for (key in options.attributes) {\n      value = options.attributes[key]\n      element.setAttribute(key, value)\n    }\n  }\n\n  if (options.style) {\n    for (key in options.style) {\n      value = options.style[key]\n      element.style[key] = value\n    }\n  }\n\n  if (options.data) {\n    for (key in options.data) {\n      value = options.data[key]\n      element.dataset[key] = value\n    }\n  }\n\n  if (options.className) {\n    options.className.split(\" \").forEach((className) => {\n      element.classList.add(className)\n    })\n  }\n\n  if (options.textContent) {\n    element.textContent = options.textContent\n  }\n\n  if (options.childNodes) {\n    [].concat(options.childNodes).forEach((childNode) => {\n      element.appendChild(childNode)\n    })\n  }\n\n  return element\n}\n\nlet blockTagNames = undefined\n\nexport const getBlockTagNames = function() {\n  if (blockTagNames != null) {\n    return blockTagNames\n  }\n\n  blockTagNames = []\n  for (const key in blockAttributes) {\n    const attributes = blockAttributes[key]\n    if (attributes.tagName) {\n      blockTagNames.push(attributes.tagName)\n    }\n  }\n\n  return blockTagNames\n}\n\nexport const nodeIsBlockContainer = (node) => nodeIsBlockStartComment(node?.firstChild)\n\nexport const nodeProbablyIsBlockContainer = function(node) {\n  return getBlockTagNames().includes(tagName(node)) && !getBlockTagNames().includes(tagName(node.firstChild))\n}\n\nexport const nodeIsBlockStart = function(node, { strict } = { strict: true }) {\n  if (strict) {\n    return nodeIsBlockStartComment(node)\n  } else {\n    return (\n      nodeIsBlockStartComment(node) || !nodeIsBlockStartComment(node.firstChild) && nodeProbablyIsBlockContainer(node)\n    )\n  }\n}\n\nexport const nodeIsBlockStartComment = (node) => nodeIsCommentNode(node) && node?.data === \"block\"\n\nexport const nodeIsCommentNode = (node) => node?.nodeType === Node.COMMENT_NODE\n\nexport const nodeIsCursorTarget = function(node, { name } = {}) {\n  if (!node) {\n    return\n  }\n  if (nodeIsTextNode(node)) {\n    if (node.data === ZERO_WIDTH_SPACE) {\n      if (name) {\n        return node.parentNode.dataset.trixCursorTarget === name\n      } else {\n        return true\n      }\n    }\n  } else {\n    return nodeIsCursorTarget(node.firstChild)\n  }\n}\n\nexport const nodeIsAttachmentElement = (node) => elementMatchesSelector(node, attachmentSelector)\n\nexport const nodeIsEmptyTextNode = (node) => nodeIsTextNode(node) && node?.data === \"\"\n\nexport const nodeIsTextNode = (node) => node?.nodeType === Node.TEXT_NODE\n", "import browser from \"trix/config/browser\"\nimport { makeElement, removeNode } from \"trix/core/helpers/dom\"\n\nconst input = {\n  level2Enabled: true,\n\n  getLevel() {\n    if (this.level2Enabled && browser.supportsInputEvents) {\n      return 2\n    } else {\n      return 0\n    }\n  },\n  pickFiles(callback) {\n    const input = makeElement(\"input\", { type: \"file\", multiple: true, hidden: true, id: this.fileInputId })\n\n    input.addEventListener(\"change\", () => {\n      callback(input.files)\n      removeNode(input)\n    })\n\n    removeNode(document.getElementById(this.fileInputId))\n    document.body.appendChild(input)\n    input.click()\n  }\n}\n\nexport default input\n", "export default {\n  8: \"backspace\",\n  9: \"tab\",\n  13: \"return\",\n  27: \"escape\",\n  37: \"left\",\n  39: \"right\",\n  46: \"delete\",\n  68: \"d\",\n  72: \"h\",\n  79: \"o\",\n}\n", "export default {\n  removeBlankTableCells: false,\n  tableCellSeparator: \" | \",\n  tableRowSeparator: \"\\n\",\n}\n", "import { attachmentSelector } from \"trix/config/attachments\"\n\nexport default {\n  bold: {\n    tagName: \"strong\",\n    inheritable: true,\n    parser(element) {\n      const style = window.getComputedStyle(element)\n      return style.fontWeight === \"bold\" || style.fontWeight >= 600\n    },\n  },\n  italic: {\n    tagName: \"em\",\n    inheritable: true,\n    parser(element) {\n      const style = window.getComputedStyle(element)\n      return style.fontStyle === \"italic\"\n    },\n  },\n  href: {\n    groupTagName: \"a\",\n    parser(element) {\n      const matchingSelector = `a:not(${attachmentSelector})`\n      const link = element.closest(matchingSelector)\n      if (link) {\n        return link.getAttribute(\"href\")\n      }\n    },\n  },\n  strike: {\n    tagName: \"del\",\n    inheritable: true,\n  },\n  frozen: {\n    style: { backgroundColor: \"highlight\" },\n  },\n}\n", "import lang from \"trix/config/lang\"\n\nexport default {\n  getDefaultHTML() {\n    return `<div class=\"trix-button-row\">\n      <span class=\"trix-button-group trix-button-group--text-tools\" data-trix-button-group=\"text-tools\">\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-bold\" data-trix-attribute=\"bold\" data-trix-key=\"b\" title=\"${lang.bold}\" tabindex=\"-1\">${lang.bold}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-italic\" data-trix-attribute=\"italic\" data-trix-key=\"i\" title=\"${lang.italic}\" tabindex=\"-1\">${lang.italic}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-strike\" data-trix-attribute=\"strike\" title=\"${lang.strike}\" tabindex=\"-1\">${lang.strike}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-link\" data-trix-attribute=\"href\" data-trix-action=\"link\" data-trix-key=\"k\" title=\"${lang.link}\" tabindex=\"-1\">${lang.link}</button>\n      </span>\n\n      <span class=\"trix-button-group trix-button-group--block-tools\" data-trix-button-group=\"block-tools\">\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-heading-1\" data-trix-attribute=\"heading1\" title=\"${lang.heading1}\" tabindex=\"-1\">${lang.heading1}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-quote\" data-trix-attribute=\"quote\" title=\"${lang.quote}\" tabindex=\"-1\">${lang.quote}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-code\" data-trix-attribute=\"code\" title=\"${lang.code}\" tabindex=\"-1\">${lang.code}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-bullet-list\" data-trix-attribute=\"bullet\" title=\"${lang.bullets}\" tabindex=\"-1\">${lang.bullets}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-number-list\" data-trix-attribute=\"number\" title=\"${lang.numbers}\" tabindex=\"-1\">${lang.numbers}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-decrease-nesting-level\" data-trix-action=\"decreaseNestingLevel\" title=\"${lang.outdent}\" tabindex=\"-1\">${lang.outdent}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-increase-nesting-level\" data-trix-action=\"increaseNestingLevel\" title=\"${lang.indent}\" tabindex=\"-1\">${lang.indent}</button>\n      </span>\n\n      <span class=\"trix-button-group trix-button-group--file-tools\" data-trix-button-group=\"file-tools\">\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-attach\" data-trix-action=\"attachFiles\" title=\"${lang.attachFiles}\" tabindex=\"-1\">${lang.attachFiles}</button>\n      </span>\n\n      <span class=\"trix-button-group-spacer\"></span>\n\n      <span class=\"trix-button-group trix-button-group--history-tools\" data-trix-button-group=\"history-tools\">\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-undo\" data-trix-action=\"undo\" data-trix-key=\"z\" title=\"${lang.undo}\" tabindex=\"-1\">${lang.undo}</button>\n        <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-redo\" data-trix-action=\"redo\" data-trix-key=\"shift+z\" title=\"${lang.redo}\" tabindex=\"-1\">${lang.redo}</button>\n      </span>\n    </div>\n\n    <div class=\"trix-dialogs\" data-trix-dialogs>\n      <div class=\"trix-dialog trix-dialog--link\" data-trix-dialog=\"href\" data-trix-dialog-attribute=\"href\">\n        <div class=\"trix-dialog__link-fields\">\n          <input type=\"url\" name=\"href\" class=\"trix-input trix-input--dialog\" placeholder=\"${lang.urlPlaceholder}\" aria-label=\"${lang.url}\" data-trix-validate-href required data-trix-input>\n          <div class=\"trix-button-group\">\n            <input type=\"button\" class=\"trix-button trix-button--dialog\" value=\"${lang.link}\" data-trix-method=\"setAttribute\">\n            <input type=\"button\" class=\"trix-button trix-button--dialog\" value=\"${lang.unlink}\" data-trix-method=\"removeAttribute\">\n          </div>\n        </div>\n      </div>\n    </div>`\n  },\n}\n", "const undo = { interval: 5000 }\nexport default undo\n", "export default {\n  attachment: \"attachment\",\n  attachmentCaption: \"attachment__caption\",\n  attachmentCaptionEditor: \"attachment__caption-editor\",\n  attachmentMetadata: \"attachment__metadata\",\n  attachmentMetadataContainer: \"attachment__metadata-container\",\n  attachmentName: \"attachment__name\",\n  attachmentProgress: \"attachment__progress\",\n  attachmentSize: \"attachment__size\",\n  attachmentToolbar: \"attachment__toolbar\",\n  attachmentGallery: \"attachment-gallery\",\n}\n", "export default class BasicObject {\n  static proxyMethod(expression) {\n    const { name, toMethod, toProperty, optional } = parseProxyMethodExpression(expression)\n\n    this.prototype[name] = function() {\n      let subject\n      let object\n\n      if (toMethod) {\n        if (optional) {\n          object = this[toMethod]?.()\n        } else {\n          object = this[toMethod]()\n        }\n      } else if (toProperty) {\n        object = this[toProperty]\n      }\n\n      if (optional) {\n        subject = object?.[name]\n        if (subject) {\n          return apply.call(subject, object, arguments)\n        }\n      } else {\n        subject = object[name]\n        return apply.call(subject, object, arguments)\n      }\n    }\n  }\n}\n\nconst parseProxyMethodExpression = function(expression) {\n  const match = expression.match(proxyMethodExpressionPattern)\n  if (!match) {\n    throw new Error(`can't parse @proxyMethod expression: ${expression}`)\n  }\n\n  const args = { name: match[4] }\n\n  if (match[2] != null) {\n    args.toMethod = match[1]\n  } else {\n    args.toProperty = match[1]\n  }\n\n  if (match[3] != null) {\n    args.optional = true\n  }\n\n  return args\n}\n\nconst { apply } = Function.prototype\n\nconst proxyMethodExpressionPattern = new RegExp(\"\\\n^\\\n(.+?)\\\n(\\\\(\\\\))?\\\n(\\\\?)?\\\n\\\\.\\\n(.+?)\\\n$\\\n\")\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class UTF16String extends BasicObject {\n  static box(value = \"\") {\n    if (value instanceof this) {\n      return value\n    } else {\n      return this.fromUCS2String(value?.toString())\n    }\n  }\n\n  static fromUCS2String(ucs2String) {\n    return new this(ucs2String, ucs2decode(ucs2String))\n  }\n\n  static fromCodepoints(codepoints) {\n    return new this(ucs2encode(codepoints), codepoints)\n  }\n\n  constructor(ucs2String, codepoints) {\n    super(...arguments)\n    this.ucs2String = ucs2String\n    this.codepoints = codepoints\n    this.length = this.codepoints.length\n    this.ucs2Length = this.ucs2String.length\n  }\n\n  offsetToUCS2Offset(offset) {\n    return ucs2encode(this.codepoints.slice(0, Math.max(0, offset))).length\n  }\n\n  offsetFromUCS2Offset(ucs2Offset) {\n    return ucs2decode(this.ucs2String.slice(0, Math.max(0, ucs2Offset))).length\n  }\n\n  slice() {\n    return this.constructor.fromCodepoints(this.codepoints.slice(...arguments))\n  }\n\n  charAt(offset) {\n    return this.slice(offset, offset + 1)\n  }\n\n  isEqualTo(value) {\n    return this.constructor.box(value).ucs2String === this.ucs2String\n  }\n\n  toJSON() {\n    return this.ucs2String\n  }\n\n  getCacheKey() {\n    return this.ucs2String\n  }\n\n  toString() {\n    return this.ucs2String\n  }\n}\n\nconst hasArrayFrom = Array.from?.(\"\\ud83d\\udc7c\").length === 1\nconst hasStringCodePointAt = \" \".codePointAt?.(0) != null\nconst hasStringFromCodePoint = String.fromCodePoint?.(32, 128124) === \" \\ud83d\\udc7c\"\n\n// UCS-2 conversion helpers ported from Mathias Bynens' Punycode.js:\n// https://github.com/bestiejs/punycode.js#punycodeucs2\n\nlet ucs2decode, ucs2encode\n\n// Creates an array containing the numeric code points of each Unicode\n// character in the string. While JavaScript uses UCS-2 internally,\n// this function will convert a pair of surrogate halves (each of which\n// UCS-2 exposes as separate characters) into a single code point,\n// matching UTF-16.\nif (hasArrayFrom && hasStringCodePointAt) {\n  ucs2decode = (string) => Array.from(string).map((char) => char.codePointAt(0))\n} else {\n  ucs2decode = function(string) {\n    const output = []\n    let counter = 0\n    const { length } = string\n\n    while (counter < length) {\n      let value = string.charCodeAt(counter++)\n      if (0xd800 <= value && value <= 0xdbff && counter < length) {\n        // high surrogate, and there is a next character\n        const extra = string.charCodeAt(counter++)\n        if ((extra & 0xfc00) === 0xdc00) {\n          // low surrogate\n          value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000\n        } else {\n          // unmatched surrogate; only append this code unit, in case the\n          // next code unit is the high surrogate of a surrogate pair\n          counter--\n        }\n      }\n      output.push(value)\n    }\n\n    return output\n  }\n}\n\n// Creates a string based on an array of numeric code points.\nif (hasStringFromCodePoint) {\n  ucs2encode = (array) => String.fromCodePoint(...Array.from(array || []))\n} else {\n  ucs2encode = function(array) {\n    const characters = (() => {\n      const result = []\n\n      Array.from(array).forEach((value) => {\n        let output = \"\"\n        if (value > 0xffff) {\n          value -= 0x10000\n          output += String.fromCharCode(value >>> 10 & 0x3ff | 0xd800)\n          value = 0xdc00 | value & 0x3ff\n        }\n        result.push(output + String.fromCharCode(value))\n      })\n\n      return result\n    })()\n\n    return characters.join(\"\")\n  }\n}\n", "import BasicObject from \"trix/core/basic_object\"\nimport UTF16String from \"trix/core/utilities/utf16_string\"\n\nlet id = 0\n\nexport default class TrixObject extends BasicObject {\n  static fromJSONString(jsonString) {\n    return this.fromJSON(JSON.parse(jsonString))\n  }\n\n  constructor() {\n    super(...arguments)\n    this.id = ++id\n  }\n\n  hasSameConstructorAs(object) {\n    return this.constructor === object?.constructor\n  }\n\n  isEqualTo(object) {\n    return this === object\n  }\n\n  inspect() {\n    const parts = []\n    const contents = this.contentsForInspection() || {}\n\n    for (const key in contents) {\n      const value = contents[key]\n      parts.push(`${key}=${value}`)\n    }\n\n    return `#<${this.constructor.name}:${this.id}${parts.length ? ` ${parts.join(\", \")}` : \"\"}>`\n  }\n\n  contentsForInspection() {}\n\n  toJSONString() {\n    return JSON.stringify(this)\n  }\n\n  toUTF16String() {\n    return UTF16String.box(this)\n  }\n\n  getCacheKey() {\n    return this.id.toString()\n  }\n}\n", "/* eslint-disable\n    id-length,\n*/\nexport const arraysAreEqual = function(a = [], b = []) {\n  if (a.length !== b.length) {\n    return false\n  }\n  for (let index = 0; index < a.length; index++) {\n    const value = a[index]\n    if (value !== b[index]) {\n      return false\n    }\n  }\n  return true\n}\n\nexport const arrayStartsWith = (a = [], b = []) => arraysAreEqual(a.slice(0, b.length), b)\n\nexport const spliceArray = function(array, ...args) {\n  const result = array.slice(0)\n  result.splice(...args)\n  return result\n}\n\nexport const summarizeArrayChange = function(oldArray = [], newArray = []) {\n  const added = []\n  const removed = []\n\n  const existingValues = new Set()\n\n  oldArray.forEach((value) => {\n    existingValues.add(value)\n  })\n\n  const currentValues = new Set()\n\n  newArray.forEach((value) => {\n    currentValues.add(value)\n    if (!existingValues.has(value)) {\n      added.push(value)\n    }\n  })\n\n  oldArray.forEach((value) => {\n    if (!currentValues.has(value)) {\n      removed.push(value)\n    }\n  })\n\n  return { added, removed }\n}\n", "import { makeElement } from \"trix/core/helpers/dom\"\n\n// https://github.com/mathiasbynens/unicode-2.1.8/blob/master/Bidi_Class/Right_To_Left/regex.js\nconst RTL_PATTERN =\n  /[\\u05BE\\u05C0\\u05C3\\u05D0-\\u05EA\\u05F0-\\u05F4\\u061B\\u061F\\u0621-\\u063A\\u0640-\\u064A\\u066D\\u0671-\\u06B7\\u06BA-\\u06BE\\u06C0-\\u06CE\\u06D0-\\u06D5\\u06E5\\u06E6\\u200F\\u202B\\u202E\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE72\\uFE74\\uFE76-\\uFEFC]/\n\nexport const getDirection = (function() {\n  const input = makeElement(\"input\", { dir: \"auto\", name: \"x\", dirName: \"x.dir\" })\n  const textArea = makeElement(\"textarea\", { dir: \"auto\", name: \"y\", dirName: \"y.dir\" })\n  const form = makeElement(\"form\")\n  form.appendChild(input)\n  form.appendChild(textArea)\n\n  const supportsDirName = (function() {\n    try {\n      return new FormData(form).has(textArea.dirName)\n    } catch (error) {\n      return false\n    }\n  })()\n\n  const supportsDirSelector = (function() {\n    try {\n      return input.matches(\":dir(ltr),:dir(rtl)\")\n    } catch (error) {\n      return false\n    }\n  })()\n\n  if (supportsDirName) {\n    return function(string) {\n      textArea.value = string\n      return new FormData(form).get(textArea.dirName)\n    }\n  } else if (supportsDirSelector) {\n    return function(string) {\n      input.value = string\n      if (input.matches(\":dir(rtl)\")) {\n        return \"rtl\"\n      } else {\n        return \"ltr\"\n      }\n    }\n  } else {\n    return function(string) {\n      const char = string.trim().charAt(0)\n      if (RTL_PATTERN.test(char)) {\n        return \"rtl\"\n      } else {\n        return \"ltr\"\n      }\n    }\n  }\n})()\n", "import * as config from \"trix/config\"\n\nlet allAttributeNames = null\nlet blockAttributeNames = null\nlet textAttributeNames = null\nlet listAttributeNames = null\n\nexport const getAllAttributeNames = () => {\n  if (!allAttributeNames) {\n    allAttributeNames = getTextAttributeNames().concat(getBlockAttributeNames())\n  }\n  return allAttributeNames\n}\n\nexport const getBlockConfig = (attributeName) => config.blockAttributes[attributeName]\n\nexport const getBlockAttributeNames = () => {\n  if (!blockAttributeNames) {\n    blockAttributeNames = Object.keys(config.blockAttributes)\n  }\n  return blockAttributeNames\n}\n\nexport const getTextConfig = (attributeName) => config.textAttributes[attributeName]\n\nexport const getTextAttributeNames = () => {\n  if (!textAttributeNames) {\n    textAttributeNames = Object.keys(config.textAttributes)\n  }\n  return textAttributeNames\n}\n\nexport const getListAttributeNames = () => {\n  if (!listAttributeNames) {\n    listAttributeNames = []\n    for (const key in config.blockAttributes) {\n      const { listAttribute } = config.blockAttributes[key]\n      if (listAttribute != null) {\n        listAttributeNames.push(listAttribute)\n      }\n    }\n  }\n  return listAttributeNames\n}\n", "/* eslint-disable\n*/\nexport const installDefaultCSSForTagName = function(tagName, defaultCSS) {\n  const styleElement = insertStyleElementForTagName(tagName)\n  styleElement.textContent = defaultCSS.replace(/%t/g, tagName)\n}\n\nconst insertStyleElementForTagName = function(tagName) {\n  const element = document.createElement(\"style\")\n  element.setAttribute(\"type\", \"text/css\")\n  element.setAttribute(\"data-tag-name\", tagName.toLowerCase())\n  const nonce = getCSPNonce()\n  if (nonce) {\n    element.setAttribute(\"nonce\", nonce)\n  }\n  document.head.insertBefore(element, document.head.firstChild)\n  return element\n}\n\nconst getCSPNonce = function() {\n  const element = getMetaElement(\"trix-csp-nonce\") || getMetaElement(\"csp-nonce\")\n  if (element) {\n    const { nonce, content } = element\n    return nonce == \"\" ? content : nonce\n  }\n}\n\nconst getMetaElement = (name) => document.head.querySelector(`meta[name=${name}]`)\n", "const testTransferData = { \"application/x-trix-feature-detection\": \"test\" }\n\nexport const dataTransferIsPlainText = function(dataTransfer) {\n  const text = dataTransfer.getData(\"text/plain\")\n  const html = dataTransfer.getData(\"text/html\")\n\n  if (text && html) {\n    const { body } = new DOMParser().parseFromString(html, \"text/html\")\n    if (body.textContent === text) {\n      return !body.querySelector(\"*\")\n    }\n  } else {\n    return text?.length\n  }\n}\n\nexport const dataTransferIsMsOfficePaste = ({ dataTransfer }) => {\n  return dataTransfer.types.includes(\"Files\") &&\n    dataTransfer.types.includes(\"text/html\") &&\n    dataTransfer.getData(\"text/html\").includes(\"urn:schemas-microsoft-com:office:office\")\n}\n\nexport const dataTransferIsWritable = function(dataTransfer) {\n  if (!dataTransfer?.setData) return false\n\n  for (const key in testTransferData) {\n    const value = testTransferData[key]\n\n    try {\n      dataTransfer.setData(key, value)\n      if (!dataTransfer.getData(key) === value) return false\n    } catch (error) {\n      return false\n    }\n  }\n  return true\n}\n\nexport const keyEventIsKeyboardCommand = (function() {\n  if (/Mac|^iP/.test(navigator.platform)) {\n    return (event) => event.metaKey\n  } else {\n    return (event) => event.ctrlKey\n  }\n})()\n\nexport function shouldRenderInmmediatelyToDealWithIOSDictation(inputEvent) {\n  if (/iPhone|iPad/.test(navigator.userAgent)) {\n    // Handle garbled content and duplicated newlines when using dictation on iOS 18+. Upon dictation completion, iOS sends\n    // the list of insertText / insertParagraph events in a quick sequence. If we don't render\n    // the editor synchronously, the internal range fails to update and results in garbled content or duplicated newlines.\n    //\n    // This workaround is necessary because iOS doesn't send composing events as expected while dictating:\n    // https://bugs.webkit.org/show_bug.cgi?id=261764\n    return !inputEvent.inputType || inputEvent.inputType === \"insertParagraph\"\n  } else {\n    return false\n  }\n}\n", "export const defer = (fn) => setTimeout(fn, 1)\n", "/* eslint-disable\n    id-length,\n*/\nexport const copyObject = function(object = {}) {\n  const result = {}\n  for (const key in object) {\n    const value = object[key]\n    result[key] = value\n  }\n  return result\n}\n\nexport const objectsAreEqual = function(a = {}, b = {}) {\n  if (Object.keys(a).length !== Object.keys(b).length) {\n    return false\n  }\n  for (const key in a) {\n    const value = a[key]\n    if (value !== b[key]) {\n      return false\n    }\n  }\n  return true\n}\n", "import { copyObject, objectsAreEqual } from \"trix/core/helpers/objects\"\n\nexport const normalizeRange = function(range) {\n  if (range == null) return\n\n  if (!Array.isArray(range)) {\n    range = [ range, range ]\n  }\n  return [ copyValue(range[0]), copyValue(range[1] != null ? range[1] : range[0]) ]\n}\n\nexport const rangeIsCollapsed = function(range) {\n  if (range == null) return\n\n  const [ start, end ] = normalizeRange(range)\n  return rangeValuesAreEqual(start, end)\n}\n\nexport const rangesAreEqual = function(leftRange, rightRange) {\n  if (leftRange == null || rightRange == null) return\n\n  const [ leftStart, leftEnd ] = normalizeRange(leftRange)\n  const [ rightStart, rightEnd ] = normalizeRange(rightRange)\n  return rangeValuesAreEqual(leftStart, rightStart) && rangeValuesAreEqual(leftEnd, rightEnd)\n}\n\nconst copyValue = function(value) {\n  if (typeof value === \"number\") {\n    return value\n  } else {\n    return copyObject(value)\n  }\n}\n\nconst rangeValuesAreEqual = function(left, right) {\n  if (typeof left === \"number\") {\n    return left === right\n  } else {\n    return objectsAreEqual(left, right)\n  }\n}\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class SelectionChangeObserver extends BasicObject {\n  constructor() {\n    super(...arguments)\n    this.update = this.update.bind(this)\n    this.selectionManagers = []\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true\n      document.addEventListener(\"selectionchange\", this.update, true)\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false\n      return document.removeEventListener(\"selectionchange\", this.update, true)\n    }\n  }\n\n  registerSelectionManager(selectionManager) {\n    if (!this.selectionManagers.includes(selectionManager)) {\n      this.selectionManagers.push(selectionManager)\n      return this.start()\n    }\n  }\n\n  unregisterSelectionManager(selectionManager) {\n    this.selectionManagers = this.selectionManagers.filter((sm) => sm !== selectionManager)\n    if (this.selectionManagers.length === 0) {\n      return this.stop()\n    }\n  }\n\n  notifySelectionManagersOfSelectionChange() {\n    return this.selectionManagers.map((selectionManager) => selectionManager.selectionDidChange())\n  }\n\n  update() {\n    this.notifySelectionManagersOfSelectionChange()\n  }\n\n  reset() {\n    this.update()\n  }\n}\n\nexport const selectionChangeObserver = new SelectionChangeObserver()\n\nexport const getDOMSelection = function() {\n  const selection = window.getSelection()\n  if (selection.rangeCount > 0) {\n    return selection\n  }\n}\n\nexport const getDOMRange = function() {\n  const domRange = getDOMSelection()?.getRangeAt(0)\n  if (domRange) {\n    if (!domRangeIsPrivate(domRange)) {\n      return domRange\n    }\n  }\n}\n\nexport const setDOMRange = function(domRange) {\n  const selection = window.getSelection()\n  selection.removeAllRanges()\n  selection.addRange(domRange)\n  return selectionChangeObserver.update()\n}\n\n// In Firefox, clicking certain <input> elements changes the selection to a\n// private element used to draw its UI. Attempting to access properties of those\n// elements throws an error.\n// https://bugzilla.mozilla.org/show_bug.cgi?id=208427\nconst domRangeIsPrivate = (domRange) => nodeIsPrivate(domRange.startContainer) || nodeIsPrivate(domRange.endContainer)\n\nconst nodeIsPrivate = (node) => !Object.getPrototypeOf(node)\n", "/* eslint-disable\n    id-length,\n    no-useless-escape,\n*/\nimport { NON_BREAKING_SPACE, ZERO_WIDTH_SPACE } from \"trix/constants\"\nimport UTF16String from \"trix/core/utilities/utf16_string\"\n\nexport const normalizeSpaces = (string) =>\n  string.replace(new RegExp(`${ZERO_WIDTH_SPACE}`, \"g\"), \"\").replace(new RegExp(`${NON_BREAKING_SPACE}`, \"g\"), \" \")\n\nexport const normalizeNewlines = (string) => string.replace(/\\r\\n?/g, \"\\n\")\n\nexport const breakableWhitespacePattern = new RegExp(`[^\\\\S${NON_BREAKING_SPACE}]`)\n\nexport const squishBreakableWhitespace = (string) =>\n  string\n    // Replace all breakable whitespace characters with a space\n    .replace(new RegExp(`${breakableWhitespacePattern.source}`, \"g\"), \" \")\n    // Replace two or more spaces with a single space\n    .replace(/\\ {2,}/g, \" \")\n\nexport const summarizeStringChange = function(oldString, newString) {\n  let added, removed\n  oldString = UTF16String.box(oldString)\n  newString = UTF16String.box(newString)\n\n  if (newString.length < oldString.length) {\n    [ removed, added ] = utf16StringDifferences(oldString, newString)\n  } else {\n    [ added, removed ] = utf16StringDifferences(newString, oldString)\n  }\n\n  return { added, removed }\n}\n\nconst utf16StringDifferences = function(a, b) {\n  if (a.isEqualTo(b)) {\n    return [ \"\", \"\" ]\n  }\n\n  const diffA = utf16StringDifference(a, b)\n  const { length } = diffA.utf16String\n\n  let diffB\n\n  if (length) {\n    const { offset } = diffA\n    const codepoints = a.codepoints.slice(0, offset).concat(a.codepoints.slice(offset + length))\n    diffB = utf16StringDifference(b, UTF16String.fromCodepoints(codepoints))\n  } else {\n    diffB = utf16StringDifference(b, a)\n  }\n\n  return [ diffA.utf16String.toString(), diffB.utf16String.toString() ]\n}\n\nconst utf16StringDifference = function(a, b) {\n  let leftIndex = 0\n  let rightIndexA = a.length\n  let rightIndexB = b.length\n\n  while (leftIndex < rightIndexA && a.charAt(leftIndex).isEqualTo(b.charAt(leftIndex))) {\n    leftIndex++\n  }\n\n  while (rightIndexA > leftIndex + 1 && a.charAt(rightIndexA - 1).isEqualTo(b.charAt(rightIndexB - 1))) {\n    rightIndexA--\n    rightIndexB--\n  }\n\n  return {\n    utf16String: a.slice(leftIndex, rightIndexA),\n    offset: leftIndex,\n  }\n}\n", "import TrixObject from \"trix/core/object\" // Don't override window.Object\nimport { arraysAreEqual } from \"trix/core/helpers\"\n\nexport default class Hash extends TrixObject {\n  static fromCommonAttributesOfObjects(objects = []) {\n    if (!objects.length) {\n      return new this()\n    }\n    let hash = box(objects[0])\n    let keys = hash.getKeys()\n\n    objects.slice(1).forEach((object) => {\n      keys = hash.getKeysCommonToHash(box(object))\n      hash = hash.slice(keys)\n    })\n\n    return hash\n  }\n\n  static box(values) {\n    return box(values)\n  }\n\n  constructor(values = {}) {\n    super(...arguments)\n    this.values = copy(values)\n  }\n\n  add(key, value) {\n    return this.merge(object(key, value))\n  }\n\n  remove(key) {\n    return new Hash(copy(this.values, key))\n  }\n\n  get(key) {\n    return this.values[key]\n  }\n\n  has(key) {\n    return key in this.values\n  }\n\n  merge(values) {\n    return new Hash(merge(this.values, unbox(values)))\n  }\n\n  slice(keys) {\n    const values = {}\n\n    Array.from(keys).forEach((key) => {\n      if (this.has(key)) {\n        values[key] = this.values[key]\n      }\n    })\n\n    return new Hash(values)\n  }\n\n  getKeys() {\n    return Object.keys(this.values)\n  }\n\n  getKeysCommonToHash(hash) {\n    hash = box(hash)\n    return this.getKeys().filter((key) => this.values[key] === hash.values[key])\n  }\n\n  isEqualTo(values) {\n    return arraysAreEqual(this.toArray(), box(values).toArray())\n  }\n\n  isEmpty() {\n    return this.getKeys().length === 0\n  }\n\n  toArray() {\n    if (!this.array) {\n      const result = []\n      for (const key in this.values) {\n        const value = this.values[key]\n        result.push(result.push(key, value))\n      }\n      this.array = result.slice(0)\n    }\n\n    return this.array\n  }\n\n  toObject() {\n    return copy(this.values)\n  }\n\n  toJSON() {\n    return this.toObject()\n  }\n\n  contentsForInspection() {\n    return { values: JSON.stringify(this.values) }\n  }\n}\n\nconst object = function(key, value) {\n  const result = {}\n  result[key] = value\n  return result\n}\n\nconst merge = function(object, values) {\n  const result = copy(object)\n  for (const key in values) {\n    const value = values[key]\n    result[key] = value\n  }\n  return result\n}\n\nconst copy = function(object, keyToRemove) {\n  const result = {}\n  const sortedKeys = Object.keys(object).sort()\n\n  sortedKeys.forEach((key) => {\n    if (key !== keyToRemove) {\n      result[key] = object[key]\n    }\n  })\n\n  return result\n}\n\nconst box = function(object) {\n  if (object instanceof Hash) {\n    return object\n  } else {\n    return new Hash(object)\n  }\n}\n\nconst unbox = function(object) {\n  if (object instanceof Hash) {\n    return object.values\n  } else {\n    return object\n  }\n}\n", "export default class ObjectGroup {\n  static groupObjects(ungroupedObjects = [], { depth, asTree } = {}) {\n    let group\n    if (asTree) {\n      if (depth == null) {\n        depth = 0\n      }\n    }\n    const objects = []\n\n    Array.from(ungroupedObjects).forEach((object) => {\n      if (group) {\n        if (object.canBeGrouped?.(depth) && group[group.length - 1].canBeGroupedWith?.(object, depth)) {\n          group.push(object)\n          return\n        } else {\n          objects.push(new this(group, { depth, asTree }))\n          group = null\n        }\n      }\n\n      if (object.canBeGrouped?.(depth)) {\n        group = [ object ]\n      } else {\n        objects.push(object)\n      }\n    })\n\n    if (group) {\n      objects.push(new this(group, { depth, asTree }))\n    }\n    return objects\n  }\n\n  constructor(objects = [], { depth, asTree }) {\n    this.objects = objects\n    if (asTree) {\n      this.depth = depth\n      this.objects = this.constructor.groupObjects(this.objects, { asTree, depth: this.depth + 1 })\n    }\n  }\n\n  getObjects() {\n    return this.objects\n  }\n\n  getDepth() {\n    return this.depth\n  }\n\n  getCacheKey() {\n    const keys = [ \"objectGroup\" ]\n    Array.from(this.getObjects()).forEach((object) => {\n      keys.push(object.getCacheKey())\n    })\n    return keys.join(\"/\")\n  }\n}\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class ObjectMap extends BasicObject {\n  constructor(objects = []) {\n    super(...arguments)\n    this.objects = {}\n\n    Array.from(objects).forEach((object) => {\n      const hash = JSON.stringify(object)\n      if (this.objects[hash] == null) {\n        this.objects[hash] = object\n      }\n    })\n  }\n\n  find(object) {\n    const hash = JSON.stringify(object)\n    return this.objects[hash]\n  }\n}\n", "export default class ElementStore {\n  constructor(elements) {\n    this.reset(elements)\n  }\n\n  add(element) {\n    const key = getKey(element)\n    this.elements[key] = element\n  }\n\n  remove(element) {\n    const key = getKey(element)\n    const value = this.elements[key]\n    if (value) {\n      delete this.elements[key]\n      return value\n    }\n  }\n\n  reset(elements = []) {\n    this.elements = {}\n    Array.from(elements).forEach((element) => {\n      this.add(element)\n    })\n    return elements\n  }\n}\n\nconst getKey = (element) => element.dataset.trixStoreKey\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class Operation extends BasicObject {\n  isPerforming() {\n    return this.performing === true\n  }\n\n  hasPerformed() {\n    return this.performed === true\n  }\n\n  hasSucceeded() {\n    return this.performed && this.succeeded\n  }\n\n  hasFailed() {\n    return this.performed && !this.succeeded\n  }\n\n  getPromise() {\n    if (!this.promise) {\n      this.promise = new Promise((resolve, reject) => {\n        this.performing = true\n        return this.perform((succeeded, result) => {\n          this.succeeded = succeeded\n          this.performing = false\n          this.performed = true\n\n          if (this.succeeded) {\n            resolve(result)\n          } else {\n            reject(result)\n          }\n        })\n      })\n    }\n\n    return this.promise\n  }\n\n  perform(callback) {\n    return callback(false)\n  }\n\n  release() {\n    this.promise?.cancel?.()\n    this.promise = null\n    this.performing = null\n    this.performed = null\n    this.succeeded = null\n  }\n}\n\nOperation.proxyMethod(\"getPromise().then\")\nOperation.proxyMethod(\"getPromise().catch\")\n", "import BasicObject from \"trix/core/basic_object\"\nimport ObjectGroup from \"trix/core/collections/object_group\"\n\nexport default class ObjectView extends BasicObject {\n  constructor(object, options = {}) {\n    super(...arguments)\n    this.object = object\n    this.options = options\n    this.childViews = []\n    this.rootView = this\n  }\n\n  getNodes() {\n    if (!this.nodes) { this.nodes = this.createNodes() }\n    return this.nodes.map((node) => node.cloneNode(true))\n  }\n\n  invalidate() {\n    this.nodes = null\n    this.childViews = []\n    return this.parentView?.invalidate()\n  }\n\n  invalidateViewForObject(object) {\n    return this.findViewForObject(object)?.invalidate()\n  }\n\n  findOrCreateCachedChildView(viewClass, object, options) {\n    let view = this.getCachedViewForObject(object)\n    if (view) {\n      this.recordChildView(view)\n    } else {\n      view = this.createChildView(...arguments)\n      this.cacheViewForObject(view, object)\n    }\n    return view\n  }\n\n  createChildView(viewClass, object, options = {}) {\n    if (object instanceof ObjectGroup) {\n      options.viewClass = viewClass\n      viewClass = ObjectGroupView\n    }\n\n    const view = new viewClass(object, options)\n    return this.recordChildView(view)\n  }\n\n  recordChildView(view) {\n    view.parentView = this\n    view.rootView = this.rootView\n    this.childViews.push(view)\n    return view\n  }\n\n  getAllChildViews() {\n    let views = []\n\n    this.childViews.forEach((childView) => {\n      views.push(childView)\n      views = views.concat(childView.getAllChildViews())\n    })\n\n    return views\n  }\n\n  findElement() {\n    return this.findElementForObject(this.object)\n  }\n\n  findElementForObject(object) {\n    const id = object?.id\n    if (id) {\n      return this.rootView.element.querySelector(`[data-trix-id='${id}']`)\n    }\n  }\n\n  findViewForObject(object) {\n    for (const view of this.getAllChildViews()) {\n      if (view.object === object) {\n        return view\n      }\n    }\n  }\n\n  getViewCache() {\n    if (this.rootView === this) {\n      if (this.isViewCachingEnabled()) {\n        if (!this.viewCache) { this.viewCache = {} }\n        return this.viewCache\n      }\n    } else {\n      return this.rootView.getViewCache()\n    }\n  }\n\n  isViewCachingEnabled() {\n    return this.shouldCacheViews !== false\n  }\n\n  enableViewCaching() {\n    this.shouldCacheViews = true\n  }\n\n  disableViewCaching() {\n    this.shouldCacheViews = false\n  }\n\n  getCachedViewForObject(object) {\n    return this.getViewCache()?.[object.getCacheKey()]\n  }\n\n  cacheViewForObject(view, object) {\n    const cache = this.getViewCache()\n    if (cache) {\n      cache[object.getCacheKey()] = view\n    }\n  }\n\n  garbageCollectCachedViews() {\n    const cache = this.getViewCache()\n    if (cache) {\n      const views = this.getAllChildViews().concat(this)\n      const objectKeys = views.map((view) => view.object.getCacheKey())\n      for (const key in cache) {\n        if (!objectKeys.includes(key)) {\n          delete cache[key]\n        }\n      }\n    }\n  }\n}\n\nexport class ObjectGroupView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.objectGroup = this.object\n    this.viewClass = this.options.viewClass\n    delete this.options.viewClass\n  }\n\n  getChildViews() {\n    if (!this.childViews.length) {\n      Array.from(this.objectGroup.getObjects()).forEach((object) => {\n        this.findOrCreateCachedChildView(this.viewClass, object, this.options)\n      })\n    }\n    return this.childViews\n  }\n\n  createNodes() {\n    const element = this.createContainerElement()\n\n    this.getChildViews().forEach((view) => {\n      Array.from(view.getNodes()).forEach((node) => {\n        element.appendChild(node)\n      })\n    })\n\n    return [ element ]\n  }\n\n  createContainerElement(depth = this.objectGroup.getDepth()) {\n    return this.getChildViews()[0].createContainerElement(depth)\n  }\n}\n", "/*! @license DOMPurify 3.2.5 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.5/LICENSE */\n\nconst {\n  entries,\n  setPrototypeOf,\n  isFrozen,\n  getPrototypeOf,\n  getOwnPropertyDescriptor\n} = Object;\nlet {\n  freeze,\n  seal,\n  create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n  apply,\n  construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(fun, thisValue, args) {\n    return fun.apply(thisValue, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func, args) {\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    if (thisArg instanceof RegExp) {\n      thisArg.lastIndex = 0;\n    }\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(func) {\n  return function () {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n    return construct(func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const [property, value] of entries(object)) {\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (Array.isArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  ARIA_ATTR: ARIA_ATTR,\n  ATTR_WHITESPACE: ATTR_WHITESPACE,\n  CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n  DATA_ATTR: DATA_ATTR,\n  DOCTYPE_NAME: DOCTYPE_NAME,\n  ERB_EXPR: ERB_EXPR,\n  IS_ALLOWED_URI: IS_ALLOWED_URI,\n  IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n  MUSTACHE_EXPR: MUSTACHE_EXPR,\n  TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  attribute: 2,\n  text: 3,\n  cdataSection: 4,\n  entityReference: 5,\n  // Deprecated\n  entityNode: 6,\n  // Deprecated\n  progressingInstruction: 7,\n  comment: 8,\n  document: 9,\n  documentType: 10,\n  documentFragment: 11,\n  notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.2.5';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let {\n    document\n  } = window;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  const {\n    DocumentFragment,\n    HTMLTemplateElement,\n    Node,\n    Element,\n    NodeFilter,\n    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n    HTMLFormElement,\n    DOMParser,\n    trustedTypes\n  } = window;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  const {\n    implementation,\n    createNodeIterator,\n    createDocumentFragment,\n    getElementsByTagName\n  } = document;\n  const {\n    importNode\n  } = originalDocument;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const {\n    MUSTACHE_EXPR,\n    ERB_EXPR,\n    TMPLIT_EXPR,\n    DATA_ATTR,\n    ARIA_ATTR,\n    IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE,\n    CUSTOM_ELEMENT\n  } = EXPRESSIONS;\n  let {\n    IS_ALLOWED_URI: IS_ALLOWED_URI$1\n  } = EXPRESSIONS;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (\u00A77.3.3)\n   *   - DOM Tree Accessors (\u00A73.1.5)\n   *   - Form Element Parent-Child Relations (\u00A74.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (\u00A74.8.5)\n   *   - HTMLCollection (\u00A74.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n    ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n    ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n    URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n    DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n    FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n    FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n    FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n    HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n    }\n    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n    }\n    if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n    }\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = [];\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Merge configuration parameters */\n    if (cfg.ADD_TAGS) {\n      if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n        ALLOWED_TAGS = clone(ALLOWED_TAGS);\n      }\n      addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n    }\n    if (cfg.ADD_ATTR) {\n      if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n        ALLOWED_ATTR = clone(ALLOWED_ATTR);\n      }\n      addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n    }\n    if (cfg.ADD_URI_SAFE_ATTR) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (cfg.FORBID_CONTENTS) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // Overwrite existing TrustedTypes policy.\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`.\n      emptyHTML = trustedTypesPolicy.createHTML('');\n    } else {\n      // Uninitialized policy, attempt to initialize the internal dompurify policy.\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      }\n      // If creating the internal policy succeeded sign internal variables.\n      if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n        emptyHTML = trustedTypesPolicy.createHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      // The only way to switch from HTML namespace to SVG\n      // is via <svg>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'svg';\n      }\n      // The only way to switch from MathML to SVG is via`\n      // svg if parent is either <annotation-xml> or MathML\n      // text integration points.\n      if (parent.namespaceURI === MATHML_NAMESPACE) {\n        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n      }\n      // We only allow elements that are defined in SVG\n      // spec. All others are disallowed in SVG namespace.\n      return Boolean(ALL_SVG_TAGS[tagName]);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      // The only way to switch from HTML namespace to MathML\n      // is via <math>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'math';\n      }\n      // The only way to switch from SVG to MathML is via\n      // <math> and HTML integration points\n      if (parent.namespaceURI === SVG_NAMESPACE) {\n        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n      }\n      // We only allow elements that are defined in MathML\n      // spec. All others are disallowed in MathML namespace.\n      return Boolean(ALL_MATHML_TAGS[tagName]);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      // The only way to switch from SVG to HTML is via\n      // HTML integration points, and from MathML to HTML\n      // is via MathML text integration points\n      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      // We disallow tags that are specific for MathML\n      // or SVG and should never appear in HTML namespace\n      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      remove(node);\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    return createNodeIterator.call(root.ownerDocument || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * _isClobbered\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n  };\n  /**\n   * Checks whether the given object is a DOM node.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true is object is a DOM node\n   */\n  const _isNode = function _isNode(value) {\n    return typeof Node === 'function' && value instanceof Node;\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  const _sanitizeElements = function _sanitizeElements(currentNode) {\n    let content = null;\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(currentNode.nodeName);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n      /* Check if we have a custom element to handle */\n      if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n          return false;\n        }\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n          return false;\n        }\n      }\n      /* Keep content except for bad-listed elements */\n      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n        const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n        if (childNodes && parentNode) {\n          const childCount = childNodes.length;\n          for (let i = childCount - 1; i >= 0; --i) {\n            const childClone = cloneNode(childNodes[i], true);\n            childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n            parentNode.insertBefore(childClone, getNextSibling(currentNode));\n          }\n        }\n      }\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Check whether element has a valid namespace */\n    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      content = currentNode.textContent;\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        content = stringReplace(content, expr, ' ');\n      });\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const {\n      attributes\n    } = currentNode;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const {\n        name,\n        namespaceURI,\n        value: attrValue\n      } = attr;\n      const lcName = transformCaseFunc(name);\n      let value = name === 'value' ? attrValue : stringTrim(attrValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Remove attribute */\n      _removeAttribute(name, currentNode);\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          value = stringReplace(value, expr, ' ');\n        });\n      }\n      /* Is `value` valid for this attribute? */\n      const lcTag = transformCaseFunc(currentNode.nodeName);\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n        if (namespaceURI) ; else {\n          switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n            case 'TrustedHTML':\n              {\n                value = trustedTypesPolicy.createHTML(value);\n                break;\n              }\n            case 'TrustedScriptURL':\n              {\n                value = trustedTypesPolicy.createScriptURL(value);\n                break;\n              }\n          }\n        }\n      }\n      /* Handle invalid data-* attribute set by try-catching it */\n      try {\n        if (namespaceURI) {\n          currentNode.setAttributeNS(namespaceURI, name, value);\n        } else {\n          /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n          currentNode.setAttribute(name, value);\n        }\n        if (_isClobbered(currentNode)) {\n          _forceRemove(currentNode);\n        } else {\n          arrayPop(DOMPurify.removed);\n        }\n      } catch (_) {}\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected */\n      if (shadowNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(shadowNode.content);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      if (typeof dirty.toString === 'function') {\n        dirty = dirty.toString();\n        if (typeof dirty !== 'string') {\n          throw typeErrorCreate('dirty is not a string, aborting');\n        }\n      } else {\n        throw typeErrorCreate('toString is not a function');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (!SET_CONFIG) {\n      _parseConfig(cfg);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Check if dirty is correctly typed for IN_PLACE */\n    if (typeof dirty === 'string') {\n      IN_PLACE = false;\n    }\n    if (IN_PLACE) {\n      /* Do some early pre-sanitization to avoid unsafe root nodes */\n      if (dirty.nodeName) {\n        const tagName = transformCaseFunc(dirty.nodeName);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n    } else if (dirty instanceof Node) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n    /* Now start iterating over the created document */\n    while (currentNode = nodeIterator.nextNode()) {\n      /* Sanitize tags and elements */\n      _sanitizeElements(currentNode);\n      /* Check attributes next */\n      _sanitizeAttributes(currentNode);\n      /* Shadow DOM detected, sanitize it */\n      if (currentNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(currentNode.content);\n      }\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (IN_PLACE) {\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        serializedHTML = stringReplace(serializedHTML, expr, ' ');\n      });\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n", "import BasicObject from \"trix/core/basic_object\"\n\nimport { nodeIsAttachmentElement, removeNode, tagName, walkTree } from \"trix/core/helpers\"\nimport DOMPurify from \"dompurify\"\nimport * as config from \"trix/config\"\n\nDOMPurify.addHook(\"uponSanitizeAttribute\", function (node, data) {\n  const allowedAttributePattern = /^data-trix-/\n  if (allowedAttributePattern.test(data.attrName)) {\n    data.forceKeepAttr = true\n  }\n})\n\nconst DEFAULT_ALLOWED_ATTRIBUTES = \"style href src width height language class\".split(\" \")\nconst DEFAULT_FORBIDDEN_PROTOCOLS = \"javascript:\".split(\" \")\nconst DEFAULT_FORBIDDEN_ELEMENTS = \"script iframe form noscript\".split(\" \")\n\nexport default class HTMLSanitizer extends BasicObject {\n  static setHTML(element, html, options) {\n    const sanitizedElement = new this(html, options).sanitize()\n    const sanitizedHtml = sanitizedElement.getHTML ? sanitizedElement.getHTML() : sanitizedElement.outerHTML\n    element.innerHTML = sanitizedHtml\n  }\n\n  static sanitize(html, options) {\n    const sanitizer = new this(html, options)\n    sanitizer.sanitize()\n    return sanitizer\n  }\n\n  constructor(html, { allowedAttributes, forbiddenProtocols, forbiddenElements, purifyOptions } = {}) {\n    super(...arguments)\n    this.allowedAttributes = allowedAttributes || DEFAULT_ALLOWED_ATTRIBUTES\n    this.forbiddenProtocols = forbiddenProtocols || DEFAULT_FORBIDDEN_PROTOCOLS\n    this.forbiddenElements = forbiddenElements || DEFAULT_FORBIDDEN_ELEMENTS\n    this.purifyOptions = purifyOptions || {}\n    this.body = createBodyElementForHTML(html)\n  }\n\n  sanitize() {\n    this.sanitizeElements()\n    this.normalizeListElementNesting()\n    const purifyConfig = Object.assign({}, config.dompurify, this.purifyOptions)\n    DOMPurify.setConfig(purifyConfig)\n    this.body = DOMPurify.sanitize(this.body)\n\n    return this.body\n  }\n\n  getHTML() {\n    return this.body.innerHTML\n  }\n\n  getBody() {\n    return this.body\n  }\n\n  // Private\n\n  sanitizeElements() {\n    const walker = walkTree(this.body)\n    const nodesToRemove = []\n\n    while (walker.nextNode()) {\n      const node = walker.currentNode\n      switch (node.nodeType) {\n        case Node.ELEMENT_NODE:\n          if (this.elementIsRemovable(node)) {\n            nodesToRemove.push(node)\n          } else {\n            this.sanitizeElement(node)\n          }\n          break\n        case Node.COMMENT_NODE:\n          nodesToRemove.push(node)\n          break\n      }\n    }\n\n    nodesToRemove.forEach((node) => removeNode(node))\n\n    return this.body\n  }\n\n  sanitizeElement(element) {\n    if (element.hasAttribute(\"href\")) {\n      if (this.forbiddenProtocols.includes(element.protocol)) {\n        element.removeAttribute(\"href\")\n      }\n    }\n\n    Array.from(element.attributes).forEach(({ name }) => {\n      if (!this.allowedAttributes.includes(name) && name.indexOf(\"data-trix\") !== 0) {\n        element.removeAttribute(name)\n      }\n    })\n\n    return element\n  }\n\n  normalizeListElementNesting() {\n    Array.from(this.body.querySelectorAll(\"ul,ol\")).forEach((listElement) => {\n      const previousElement = listElement.previousElementSibling\n      if (previousElement) {\n        if (tagName(previousElement) === \"li\") {\n          previousElement.appendChild(listElement)\n        }\n      }\n    })\n\n    return this.body\n  }\n\n  elementIsRemovable(element) {\n    if (element?.nodeType !== Node.ELEMENT_NODE) return\n    return this.elementIsForbidden(element) || this.elementIsntSerializable(element)\n  }\n\n  elementIsForbidden(element) {\n    return this.forbiddenElements.includes(tagName(element))\n  }\n\n  elementIsntSerializable(element) {\n    return element.getAttribute(\"data-trix-serialize\") === \"false\" && !nodeIsAttachmentElement(element)\n  }\n}\n\nconst createBodyElementForHTML = function(html = \"\") {\n  // Remove everything after </html>\n  html = html.replace(/<\\/html[^>]*>[^]*$/i, \"</html>\")\n  const doc = document.implementation.createHTMLDocument(\"\")\n  doc.documentElement.innerHTML = html\n\n  Array.from(doc.head.querySelectorAll(\"style\")).forEach((element) => {\n    doc.body.appendChild(element)\n  })\n\n  return doc.body\n}\n", "import * as config from \"trix/config\"\nimport { ZERO_WIDTH_SPACE } from \"trix/constants\"\nimport { copyObject, makeElement } from \"trix/core/helpers\"\nimport ObjectView from \"trix/views/object_view\"\nimport HTMLSanitizer from \"trix/models/html_sanitizer\"\n\nconst { css } = config\n\nexport default class AttachmentView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.attachment = this.object\n    this.attachment.uploadProgressDelegate = this\n    this.attachmentPiece = this.options.piece\n  }\n\n  createContentNodes() {\n    return []\n  }\n\n  createNodes() {\n    let innerElement\n    const figure = innerElement = makeElement({\n      tagName: \"figure\",\n      className: this.getClassName(),\n      data: this.getData(),\n      editable: false,\n    })\n\n    const href = this.getHref()\n    if (href) {\n      innerElement = makeElement({ tagName: \"a\", editable: false, attributes: { href, tabindex: -1 } })\n      figure.appendChild(innerElement)\n    }\n\n    if (this.attachment.hasContent()) {\n      HTMLSanitizer.setHTML(innerElement, this.attachment.getContent())\n    } else {\n      this.createContentNodes().forEach((node) => {\n        innerElement.appendChild(node)\n      })\n    }\n\n    innerElement.appendChild(this.createCaptionElement())\n\n    if (this.attachment.isPending()) {\n      this.progressElement = makeElement({\n        tagName: \"progress\",\n        attributes: {\n          class: css.attachmentProgress,\n          value: this.attachment.getUploadProgress(),\n          max: 100,\n        },\n        data: {\n          trixMutable: true,\n          trixStoreKey: [ \"progressElement\", this.attachment.id ].join(\"/\"),\n        },\n      })\n\n      figure.appendChild(this.progressElement)\n    }\n\n    return [ createCursorTarget(\"left\"), figure, createCursorTarget(\"right\") ]\n  }\n\n  createCaptionElement() {\n    const figcaption = makeElement({ tagName: \"figcaption\", className: css.attachmentCaption })\n    const caption = this.attachmentPiece.getCaption()\n    if (caption) {\n      figcaption.classList.add(`${css.attachmentCaption}--edited`)\n      figcaption.textContent = caption\n    } else {\n      let name, size\n      const captionConfig = this.getCaptionConfig()\n      if (captionConfig.name) {\n        name = this.attachment.getFilename()\n      }\n      if (captionConfig.size) {\n        size = this.attachment.getFormattedFilesize()\n      }\n\n      if (name) {\n        const nameElement = makeElement({ tagName: \"span\", className: css.attachmentName, textContent: name })\n        figcaption.appendChild(nameElement)\n      }\n\n      if (size) {\n        if (name) {\n          figcaption.appendChild(document.createTextNode(\" \"))\n        }\n        const sizeElement = makeElement({ tagName: \"span\", className: css.attachmentSize, textContent: size })\n        figcaption.appendChild(sizeElement)\n      }\n    }\n\n    return figcaption\n  }\n\n  getClassName() {\n    const names = [ css.attachment, `${css.attachment}--${this.attachment.getType()}` ]\n    const extension = this.attachment.getExtension()\n    if (extension) {\n      names.push(`${css.attachment}--${extension}`)\n    }\n    return names.join(\" \")\n  }\n\n  getData() {\n    const data = {\n      trixAttachment: JSON.stringify(this.attachment),\n      trixContentType: this.attachment.getContentType(),\n      trixId: this.attachment.id,\n    }\n\n    const { attributes } = this.attachmentPiece\n    if (!attributes.isEmpty()) {\n      data.trixAttributes = JSON.stringify(attributes)\n    }\n\n    if (this.attachment.isPending()) {\n      data.trixSerialize = false\n    }\n\n    return data\n  }\n\n  getHref() {\n    if (!htmlContainsTagName(this.attachment.getContent(), \"a\")) {\n      return this.attachment.getHref()\n    }\n  }\n\n  getCaptionConfig() {\n    const type = this.attachment.getType()\n    const captionConfig = copyObject(config.attachments[type]?.caption)\n    if (type === \"file\") {\n      captionConfig.name = true\n    }\n    return captionConfig\n  }\n\n  findProgressElement() {\n    return this.findElement()?.querySelector(\"progress\")\n  }\n\n  // Attachment delegate\n\n  attachmentDidChangeUploadProgress() {\n    const value = this.attachment.getUploadProgress()\n    const progressElement = this.findProgressElement()\n    if (progressElement) {\n      progressElement.value = value\n    }\n  }\n}\n\nconst createCursorTarget = (name) =>\n  makeElement({\n    tagName: \"span\",\n    textContent: ZERO_WIDTH_SPACE,\n    data: {\n      trixCursorTarget: name,\n      trixSerialize: false,\n    },\n  })\n\nconst htmlContainsTagName = function(html, tagName) {\n  const div = makeElement(\"div\")\n  HTMLSanitizer.setHTML(div, html || \"\")\n  return div.querySelector(tagName)\n}\n", "import * as config from \"trix/config\"\nimport { makeElement } from \"trix/core/helpers\"\n\nimport AttachmentView from \"trix/views/attachment_view\"\n\nexport default class PreviewableAttachmentView extends AttachmentView {\n  constructor() {\n    super(...arguments)\n    this.attachment.previewDelegate = this\n  }\n\n  createContentNodes() {\n    this.image = makeElement({\n      tagName: \"img\",\n      attributes: {\n        src: \"\",\n      },\n      data: {\n        trixMutable: true,\n      },\n    })\n\n    this.refresh(this.image)\n    return [ this.image ]\n  }\n\n  createCaptionElement() {\n    const figcaption = super.createCaptionElement(...arguments)\n    if (!figcaption.textContent) {\n      figcaption.setAttribute(\"data-trix-placeholder\", config.lang.captionPlaceholder)\n    }\n    return figcaption\n  }\n\n  refresh(image) {\n    if (!image) { image = this.findElement()?.querySelector(\"img\") }\n    if (image) {\n      return this.updateAttributesForImage(image)\n    }\n  }\n\n  updateAttributesForImage(image) {\n    const url = this.attachment.getURL()\n    const previewURL = this.attachment.getPreviewURL()\n    image.src = previewURL || url\n\n    if (previewURL === url) {\n      image.removeAttribute(\"data-trix-serialized-attributes\")\n    } else {\n      const serializedAttributes = JSON.stringify({ src: url })\n      image.setAttribute(\"data-trix-serialized-attributes\", serializedAttributes)\n    }\n\n    const width = this.attachment.getWidth()\n    const height = this.attachment.getHeight()\n\n    if (width != null) {\n      image.width = width\n    }\n    if (height != null) {\n      image.height = height\n    }\n\n    const storeKey = [ \"imageElement\", this.attachment.id, image.src, image.width, image.height ].join(\"/\")\n    image.dataset.trixStoreKey = storeKey\n  }\n\n  // Attachment delegate\n\n  attachmentDidChangeAttributes() {\n    this.refresh(this.image)\n    return this.refresh()\n  }\n}\n", "/* eslint-disable\n    no-useless-escape,\n    no-var,\n*/\nimport { NON_BREAKING_SPACE } from \"trix/constants\"\n\nimport ObjectView from \"trix/views/object_view\"\nimport AttachmentView from \"trix/views/attachment_view\"\nimport PreviewableAttachmentView from \"trix/views/previewable_attachment_view\"\n\nimport { findInnerElement, getTextConfig, makeElement } from \"trix/core/helpers\"\n\nexport default class PieceView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.piece = this.object\n    this.attributes = this.piece.getAttributes()\n    this.textConfig = this.options.textConfig\n    this.context = this.options.context\n\n    if (this.piece.attachment) {\n      this.attachment = this.piece.attachment\n    } else {\n      this.string = this.piece.toString()\n    }\n  }\n\n  createNodes() {\n    let nodes = this.attachment ? this.createAttachmentNodes() : this.createStringNodes()\n    const element = this.createElement()\n    if (element) {\n      const innerElement = findInnerElement(element)\n      Array.from(nodes).forEach((node) => {\n        innerElement.appendChild(node)\n      })\n      nodes = [ element ]\n    }\n    return nodes\n  }\n\n  createAttachmentNodes() {\n    const constructor = this.attachment.isPreviewable() ? PreviewableAttachmentView : AttachmentView\n\n    const view = this.createChildView(constructor, this.piece.attachment, { piece: this.piece })\n    return view.getNodes()\n  }\n\n  createStringNodes() {\n    if (this.textConfig?.plaintext) {\n      return [ document.createTextNode(this.string) ]\n    } else {\n      const nodes = []\n      const iterable = this.string.split(\"\\n\")\n      for (let index = 0; index < iterable.length; index++) {\n        const substring = iterable[index]\n        if (index > 0) {\n          const element = makeElement(\"br\")\n          nodes.push(element)\n        }\n\n        if (substring.length) {\n          const node = document.createTextNode(this.preserveSpaces(substring))\n          nodes.push(node)\n        }\n      }\n      return nodes\n    }\n  }\n\n  createElement() {\n    let element, key, value\n    const styles = {}\n\n    for (key in this.attributes) {\n      value = this.attributes[key]\n      const config = getTextConfig(key)\n      if (config) {\n        if (config.tagName) {\n          var innerElement\n          const pendingElement = makeElement(config.tagName)\n\n          if (innerElement) {\n            innerElement.appendChild(pendingElement)\n            innerElement = pendingElement\n          } else {\n            element = innerElement = pendingElement\n          }\n        }\n\n        if (config.styleProperty) {\n          styles[config.styleProperty] = value\n        }\n\n        if (config.style) {\n          for (key in config.style) {\n            value = config.style[key]\n            styles[key] = value\n          }\n        }\n      }\n    }\n\n    if (Object.keys(styles).length) {\n      if (!element) { element = makeElement(\"span\") }\n      for (key in styles) {\n        value = styles[key]\n        element.style[key] = value\n      }\n    }\n    return element\n  }\n\n  createContainerElement() {\n    for (const key in this.attributes) {\n      const value = this.attributes[key]\n      const config = getTextConfig(key)\n      if (config) {\n        if (config.groupTagName) {\n          const attributes = {}\n          attributes[key] = value\n          return makeElement(config.groupTagName, attributes)\n        }\n      }\n    }\n  }\n\n  preserveSpaces(string) {\n    if (this.context.isLast) {\n      string = string.replace(/\\ $/, NON_BREAKING_SPACE)\n    }\n\n    string = string\n      .replace(/(\\S)\\ {3}(\\S)/g, `$1 ${NON_BREAKING_SPACE} $2`)\n      .replace(/\\ {2}/g, `${NON_BREAKING_SPACE} `)\n      .replace(/\\ {2}/g, ` ${NON_BREAKING_SPACE}`)\n\n    if (this.context.isFirst || this.context.followsWhitespace) {\n      string = string.replace(/^\\ /, NON_BREAKING_SPACE)\n    }\n\n    return string\n  }\n}\n", "/* eslint-disable\n    no-var,\n*/\nimport ObjectView from \"trix/views/object_view\"\nimport ObjectGroup from \"trix/core/collections/object_group\"\nimport PieceView from \"trix/views/piece_view\"\n\nexport default class TextView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.text = this.object\n    this.textConfig = this.options.textConfig\n  }\n\n  createNodes() {\n    const nodes = []\n    const pieces = ObjectGroup.groupObjects(this.getPieces())\n    const lastIndex = pieces.length - 1\n\n    for (let index = 0; index < pieces.length; index++) {\n      const piece = pieces[index]\n      const context = {}\n      if (index === 0) {\n        context.isFirst = true\n      }\n      if (index === lastIndex) {\n        context.isLast = true\n      }\n      if (endsWithWhitespace(previousPiece)) {\n        context.followsWhitespace = true\n      }\n\n      const view = this.findOrCreateCachedChildView(PieceView, piece, { textConfig: this.textConfig, context })\n      nodes.push(...Array.from(view.getNodes() || []))\n\n      var previousPiece = piece\n    }\n    return nodes\n  }\n\n  getPieces() {\n    return Array.from(this.text.getPieces()).filter((piece) => !piece.hasAttribute(\"blockBreak\"))\n  }\n}\n\nconst endsWithWhitespace = (piece) => /\\s$/.test(piece?.toString())\n", "import * as config from \"trix/config\"\nimport ObjectView from \"trix/views/object_view\"\nimport TextView from \"trix/views/text_view\"\n\nimport { getBlockConfig, makeElement } from \"trix/core/helpers\"\nconst { css } = config\n\nexport default class BlockView extends ObjectView {\n  constructor() {\n    super(...arguments)\n    this.block = this.object\n    this.attributes = this.block.getAttributes()\n  }\n\n  createNodes() {\n    const comment = document.createComment(\"block\")\n    const nodes = [ comment ]\n    if (this.block.isEmpty()) {\n      nodes.push(makeElement(\"br\"))\n    } else {\n      const textConfig = getBlockConfig(this.block.getLastAttribute())?.text\n      const textView = this.findOrCreateCachedChildView(TextView, this.block.text, { textConfig })\n      nodes.push(...Array.from(textView.getNodes() || []))\n      if (this.shouldAddExtraNewlineElement()) {\n        nodes.push(makeElement(\"br\"))\n      }\n    }\n\n    if (this.attributes.length) {\n      return nodes\n    } else {\n      let attributes\n      const { tagName } = config.blockAttributes.default\n      if (this.block.isRTL()) {\n        attributes = { dir: \"rtl\" }\n      }\n\n      const element = makeElement({ tagName, attributes })\n      nodes.forEach((node) => element.appendChild(node))\n      return [ element ]\n    }\n  }\n\n  createContainerElement(depth) {\n    const attributes = {}\n    let className\n    const attributeName = this.attributes[depth]\n\n    const { tagName, htmlAttributes = [] } = getBlockConfig(attributeName)\n\n    if (depth === 0 && this.block.isRTL()) {\n      Object.assign(attributes, { dir: \"rtl\" })\n    }\n\n    if (attributeName === \"attachmentGallery\") {\n      const size = this.block.getBlockBreakPosition()\n      className = `${css.attachmentGallery} ${css.attachmentGallery}--${size}`\n    }\n\n    Object.entries(this.block.htmlAttributes).forEach(([ name, value ]) => {\n      if (htmlAttributes.includes(name)) {\n        attributes[name] = value\n      }\n    })\n\n    return makeElement({ tagName, className, attributes })\n  }\n\n  // A single <br> at the end of a block element has no visual representation\n  // so add an extra one.\n  shouldAddExtraNewlineElement() {\n    return /\\n\\n$/.test(this.block.toString())\n  }\n}\n", "import { makeElement } from \"trix/core/helpers\"\n\nimport ElementStore from \"trix/core/collections/element_store\"\nimport ObjectGroup from \"trix/core/collections/object_group\"\nimport ObjectView from \"trix/views/object_view\"\nimport BlockView from \"trix/views/block_view\"\n\nimport { defer } from \"trix/core/helpers\"\n\nexport default class DocumentView extends ObjectView {\n  static render(document) {\n    const element = makeElement(\"div\")\n    const view = new this(document, { element })\n    view.render()\n    view.sync()\n    return element\n  }\n\n  constructor() {\n    super(...arguments)\n    this.element = this.options.element\n    this.elementStore = new ElementStore()\n    this.setDocument(this.object)\n  }\n\n  setDocument(document) {\n    if (!document.isEqualTo(this.document)) {\n      this.document = this.object = document\n    }\n  }\n\n  render() {\n    this.childViews = []\n\n    this.shadowElement = makeElement(\"div\")\n\n    if (!this.document.isEmpty()) {\n      const objects = ObjectGroup.groupObjects(this.document.getBlocks(), { asTree: true })\n\n      Array.from(objects).forEach((object) => {\n        const view = this.findOrCreateCachedChildView(BlockView, object)\n        Array.from(view.getNodes()).map((node) => this.shadowElement.appendChild(node))\n      })\n    }\n  }\n\n  isSynced() {\n    return elementsHaveEqualHTML(this.shadowElement, this.element)\n  }\n\n  sync() {\n    const fragment = this.createDocumentFragmentForSync()\n    while (this.element.lastChild) {\n      this.element.removeChild(this.element.lastChild)\n    }\n    this.element.appendChild(fragment)\n    return this.didSync()\n  }\n\n  // Private\n\n  didSync() {\n    this.elementStore.reset(findStoredElements(this.element))\n    return defer(() => this.garbageCollectCachedViews())\n  }\n\n  createDocumentFragmentForSync() {\n    const fragment = document.createDocumentFragment()\n\n    Array.from(this.shadowElement.childNodes).forEach((node) => {\n      fragment.appendChild(node.cloneNode(true))\n    })\n\n    Array.from(findStoredElements(fragment)).forEach((element) => {\n      const storedElement = this.elementStore.remove(element)\n      if (storedElement) {\n        element.parentNode.replaceChild(storedElement, element)\n      }\n    })\n\n    return fragment\n  }\n}\n\nconst findStoredElements = (element) => element.querySelectorAll(\"[data-trix-store-key]\")\n\nconst elementsHaveEqualHTML = (element, otherElement) =>\n  ignoreSpaces(element.innerHTML) === ignoreSpaces(otherElement.innerHTML)\n\nconst ignoreSpaces = (html) => html.replace(/&nbsp;/g, \" \")\n", "import TrixObject from \"trix/core/object\" // Don't override window.Object\nimport Hash from \"trix/core/collections/hash\"\n\nexport default class Piece extends TrixObject {\n  static types = {}\n\n  static registerType(type, constructor) {\n    constructor.type = type\n    this.types[type] = constructor\n  }\n\n  static fromJSON(pieceJSON) {\n    const constructor = this.types[pieceJSON.type]\n    if (constructor) {\n      return constructor.fromJSON(pieceJSON)\n    }\n  }\n\n  constructor(value, attributes = {}) {\n    super(...arguments)\n    this.attributes = Hash.box(attributes)\n  }\n\n  copyWithAttributes(attributes) {\n    return new this.constructor(this.getValue(), attributes)\n  }\n\n  copyWithAdditionalAttributes(attributes) {\n    return this.copyWithAttributes(this.attributes.merge(attributes))\n  }\n\n  copyWithoutAttribute(attribute) {\n    return this.copyWithAttributes(this.attributes.remove(attribute))\n  }\n\n  copy() {\n    return this.copyWithAttributes(this.attributes)\n  }\n\n  getAttribute(attribute) {\n    return this.attributes.get(attribute)\n  }\n\n  getAttributesHash() {\n    return this.attributes\n  }\n\n  getAttributes() {\n    return this.attributes.toObject()\n  }\n\n  hasAttribute(attribute) {\n    return this.attributes.has(attribute)\n  }\n\n  hasSameStringValueAsPiece(piece) {\n    return piece && this.toString() === piece.toString()\n  }\n\n  hasSameAttributesAsPiece(piece) {\n    return piece && (this.attributes === piece.attributes || this.attributes.isEqualTo(piece.attributes))\n  }\n\n  isBlockBreak() {\n    return false\n  }\n\n  isEqualTo(piece) {\n    return (\n      super.isEqualTo(...arguments) ||\n      this.hasSameConstructorAs(piece) &&\n        this.hasSameStringValueAsPiece(piece) &&\n        this.hasSameAttributesAsPiece(piece)\n    )\n  }\n\n  isEmpty() {\n    return this.length === 0\n  }\n\n  isSerializable() {\n    return true\n  }\n\n  toJSON() {\n    return {\n      type: this.constructor.type,\n      attributes: this.getAttributes(),\n    }\n  }\n\n  contentsForInspection() {\n    return {\n      type: this.constructor.type,\n      attributes: this.attributes.inspect(),\n    }\n  }\n\n  // Grouping\n\n  canBeGrouped() {\n    return this.hasAttribute(\"href\")\n  }\n\n  canBeGroupedWith(piece) {\n    return this.getAttribute(\"href\") === piece.getAttribute(\"href\")\n  }\n\n  // Splittable\n\n  getLength() {\n    return this.length\n  }\n\n  canBeConsolidatedWith(piece) {\n    return false\n  }\n}\n", "import Operation from \"trix/core/utilities/operation\"\n\nexport default class ImagePreloadOperation extends Operation {\n  constructor(url) {\n    super(...arguments)\n    this.url = url\n  }\n\n  perform(callback) {\n    const image = new Image()\n\n    image.onload = () => {\n      image.width = this.width = image.naturalWidth\n      image.height = this.height = image.naturalHeight\n      return callback(true, image)\n    }\n\n    image.onerror = () => callback(false)\n\n    image.src = this.url\n  }\n}\n", "import * as config from \"trix/config\"\nimport TrixObject from \"trix/core/object\" // Don't override window.Object\nimport Hash from \"trix/core/collections/hash\"\nimport ImagePreloadOperation from \"trix/operations/image_preload_operation\"\n\nexport default class Attachment extends TrixObject {\n  static previewablePattern = /^image(\\/(gif|png|webp|jpe?g)|$)/\n\n  static attachmentForFile(file) {\n    const attributes = this.attributesForFile(file)\n    const attachment = new this(attributes)\n    attachment.setFile(file)\n    return attachment\n  }\n\n  static attributesForFile(file) {\n    return new Hash({\n      filename: file.name,\n      filesize: file.size,\n      contentType: file.type,\n    })\n  }\n\n  static fromJSON(attachmentJSON) {\n    return new this(attachmentJSON)\n  }\n\n  constructor(attributes = {}) {\n    super(attributes)\n    this.releaseFile = this.releaseFile.bind(this)\n    this.attributes = Hash.box(attributes)\n    this.didChangeAttributes()\n  }\n\n  getAttribute(attribute) {\n    return this.attributes.get(attribute)\n  }\n\n  hasAttribute(attribute) {\n    return this.attributes.has(attribute)\n  }\n\n  getAttributes() {\n    return this.attributes.toObject()\n  }\n\n  setAttributes(attributes = {}) {\n    const newAttributes = this.attributes.merge(attributes)\n    if (!this.attributes.isEqualTo(newAttributes)) {\n      this.attributes = newAttributes\n      this.didChangeAttributes()\n      this.previewDelegate?.attachmentDidChangeAttributes?.(this)\n      return this.delegate?.attachmentDidChangeAttributes?.(this)\n    }\n  }\n\n  didChangeAttributes() {\n    if (this.isPreviewable()) {\n      return this.preloadURL()\n    }\n  }\n\n  isPending() {\n    return this.file != null && !(this.getURL() || this.getHref())\n  }\n\n  isPreviewable() {\n    if (this.attributes.has(\"previewable\")) {\n      return this.attributes.get(\"previewable\")\n    } else {\n      return Attachment.previewablePattern.test(this.getContentType())\n    }\n  }\n\n  getType() {\n    if (this.hasContent()) {\n      return \"content\"\n    } else if (this.isPreviewable()) {\n      return \"preview\"\n    } else {\n      return \"file\"\n    }\n  }\n\n  getURL() {\n    return this.attributes.get(\"url\")\n  }\n\n  getHref() {\n    return this.attributes.get(\"href\")\n  }\n\n  getFilename() {\n    return this.attributes.get(\"filename\") || \"\"\n  }\n\n  getFilesize() {\n    return this.attributes.get(\"filesize\")\n  }\n\n  getFormattedFilesize() {\n    const filesize = this.attributes.get(\"filesize\")\n    if (typeof filesize === \"number\") {\n      return config.fileSize.formatter(filesize)\n    } else {\n      return \"\"\n    }\n  }\n\n  getExtension() {\n    return this.getFilename()\n      .match(/\\.(\\w+)$/)?.[1]\n      .toLowerCase()\n  }\n\n  getContentType() {\n    return this.attributes.get(\"contentType\")\n  }\n\n  hasContent() {\n    return this.attributes.has(\"content\")\n  }\n\n  getContent() {\n    return this.attributes.get(\"content\")\n  }\n\n  getWidth() {\n    return this.attributes.get(\"width\")\n  }\n\n  getHeight() {\n    return this.attributes.get(\"height\")\n  }\n\n  getFile() {\n    return this.file\n  }\n\n  setFile(file) {\n    this.file = file\n    if (this.isPreviewable()) {\n      return this.preloadFile()\n    }\n  }\n\n  releaseFile() {\n    this.releasePreloadedFile()\n    this.file = null\n  }\n\n  getUploadProgress() {\n    return this.uploadProgress != null ? this.uploadProgress : 0\n  }\n\n  setUploadProgress(value) {\n    if (this.uploadProgress !== value) {\n      this.uploadProgress = value\n      return this.uploadProgressDelegate?.attachmentDidChangeUploadProgress?.(this)\n    }\n  }\n\n  toJSON() {\n    return this.getAttributes()\n  }\n\n  getCacheKey() {\n    return [ super.getCacheKey(...arguments), this.attributes.getCacheKey(), this.getPreviewURL() ].join(\"/\")\n  }\n\n  // Previewable\n\n  getPreviewURL() {\n    return this.previewURL || this.preloadingURL\n  }\n\n  setPreviewURL(url) {\n    if (url !== this.getPreviewURL()) {\n      this.previewURL = url\n      this.previewDelegate?.attachmentDidChangeAttributes?.(this)\n      return this.delegate?.attachmentDidChangePreviewURL?.(this)\n    }\n  }\n\n  preloadURL() {\n    return this.preload(this.getURL(), this.releaseFile)\n  }\n\n  preloadFile() {\n    if (this.file) {\n      this.fileObjectURL = URL.createObjectURL(this.file)\n      return this.preload(this.fileObjectURL)\n    }\n  }\n\n  releasePreloadedFile() {\n    if (this.fileObjectURL) {\n      URL.revokeObjectURL(this.fileObjectURL)\n      this.fileObjectURL = null\n    }\n  }\n\n  preload(url, callback) {\n    if (url && url !== this.getPreviewURL()) {\n      this.preloadingURL = url\n      const operation = new ImagePreloadOperation(url)\n      return operation\n        .then(({ width, height }) => {\n          if (!this.getWidth() || !this.getHeight()) {\n            this.setAttributes({ width, height })\n          }\n          this.preloadingURL = null\n          this.setPreviewURL(url)\n          return callback?.()\n        })\n        .catch(() => {\n          this.preloadingURL = null\n          return callback?.()\n        })\n    }\n  }\n}\n", "import { OBJECT_REPLACEMENT_CHARACTER } from \"trix/constants\"\n\nimport Attachment from \"trix/models/attachment\"\nimport Piece from \"trix/models/piece\"\n\nexport default class AttachmentPiece extends Piece {\n  static permittedAttributes = [ \"caption\", \"presentation\" ]\n\n  static fromJSON(pieceJSON) {\n    return new this(Attachment.fromJSON(pieceJSON.attachment), pieceJSON.attributes)\n  }\n\n  constructor(attachment) {\n    super(...arguments)\n    this.attachment = attachment\n    this.length = 1\n    this.ensureAttachmentExclusivelyHasAttribute(\"href\")\n    if (!this.attachment.hasContent()) {\n      this.removeProhibitedAttributes()\n    }\n  }\n\n  ensureAttachmentExclusivelyHasAttribute(attribute) {\n    if (this.hasAttribute(attribute)) {\n      if (!this.attachment.hasAttribute(attribute)) {\n        this.attachment.setAttributes(this.attributes.slice([ attribute ]))\n      }\n      this.attributes = this.attributes.remove(attribute)\n    }\n  }\n\n  removeProhibitedAttributes() {\n    const attributes = this.attributes.slice(AttachmentPiece.permittedAttributes)\n    if (!attributes.isEqualTo(this.attributes)) {\n      this.attributes = attributes\n    }\n  }\n\n  getValue() {\n    return this.attachment\n  }\n\n  isSerializable() {\n    return !this.attachment.isPending()\n  }\n\n  getCaption() {\n    return this.attributes.get(\"caption\") || \"\"\n  }\n\n  isEqualTo(piece) {\n    return super.isEqualTo(piece) && this.attachment.id === piece?.attachment?.id\n  }\n\n  toString() {\n    return OBJECT_REPLACEMENT_CHARACTER\n  }\n\n  toJSON() {\n    const json = super.toJSON(...arguments)\n    json.attachment = this.attachment\n    return json\n  }\n\n  getCacheKey() {\n    return [ super.getCacheKey(...arguments), this.attachment.getCacheKey() ].join(\"/\")\n  }\n\n  toConsole() {\n    return JSON.stringify(this.toString())\n  }\n}\n\nPiece.registerType(\"attachment\", AttachmentPiece)\n", "import Piece from \"trix/models/piece\"\n\nimport { normalizeNewlines } from \"trix/core/helpers\"\n\nexport default class StringPiece extends Piece {\n  static fromJSON(pieceJSON) {\n    return new this(pieceJSON.string, pieceJSON.attributes)\n  }\n\n  constructor(string) {\n    super(...arguments)\n    this.string = normalizeNewlines(string)\n    this.length = this.string.length\n  }\n\n  getValue() {\n    return this.string\n  }\n\n  toString() {\n    return this.string.toString()\n  }\n\n  isBlockBreak() {\n    return this.toString() === \"\\n\" && this.getAttribute(\"blockBreak\") === true\n  }\n\n  toJSON() {\n    const result = super.toJSON(...arguments)\n    result.string = this.string\n    return result\n  }\n\n  // Splittable\n\n  canBeConsolidatedWith(piece) {\n    return piece && this.hasSameConstructorAs(piece) && this.hasSameAttributesAsPiece(piece)\n  }\n\n  consolidateWith(piece) {\n    return new this.constructor(this.toString() + piece.toString(), this.attributes)\n  }\n\n  splitAtOffset(offset) {\n    let left, right\n    if (offset === 0) {\n      left = null\n      right = this\n    } else if (offset === this.length) {\n      left = this\n      right = null\n    } else {\n      left = new this.constructor(this.string.slice(0, offset), this.attributes)\n      right = new this.constructor(this.string.slice(offset), this.attributes)\n    }\n    return [ left, right ]\n  }\n\n  toConsole() {\n    let { string } = this\n    if (string.length > 15) {\n      string = string.slice(0, 14) + \"\u2026\"\n    }\n    return JSON.stringify(string.toString())\n  }\n}\n\nPiece.registerType(\"string\", StringPiece)\n", "/* eslint-disable\n    prefer-const,\n*/\nimport TrixObject from \"trix/core/object\" // Don't override window.Object\n\nimport { spliceArray } from \"trix/core/helpers\"\n\nexport default class SplittableList extends TrixObject {\n  static box(objects) {\n    if (objects instanceof this) {\n      return objects\n    } else {\n      return new this(objects)\n    }\n  }\n\n  constructor(objects = []) {\n    super(...arguments)\n    this.objects = objects.slice(0)\n    this.length = this.objects.length\n  }\n\n  indexOf(object) {\n    return this.objects.indexOf(object)\n  }\n\n  splice(...args) {\n    return new this.constructor(spliceArray(this.objects, ...args))\n  }\n\n  eachObject(callback) {\n    return this.objects.map((object, index) => callback(object, index))\n  }\n\n  insertObjectAtIndex(object, index) {\n    return this.splice(index, 0, object)\n  }\n\n  insertSplittableListAtIndex(splittableList, index) {\n    return this.splice(index, 0, ...splittableList.objects)\n  }\n\n  insertSplittableListAtPosition(splittableList, position) {\n    const [ objects, index ] = this.splitObjectAtPosition(position)\n    return new this.constructor(objects).insertSplittableListAtIndex(splittableList, index)\n  }\n\n  editObjectAtIndex(index, callback) {\n    return this.replaceObjectAtIndex(callback(this.objects[index]), index)\n  }\n\n  replaceObjectAtIndex(object, index) {\n    return this.splice(index, 1, object)\n  }\n\n  removeObjectAtIndex(index) {\n    return this.splice(index, 1)\n  }\n\n  getObjectAtIndex(index) {\n    return this.objects[index]\n  }\n\n  getSplittableListInRange(range) {\n    const [ objects, leftIndex, rightIndex ] = this.splitObjectsAtRange(range)\n    return new this.constructor(objects.slice(leftIndex, rightIndex + 1))\n  }\n\n  selectSplittableList(test) {\n    const objects = this.objects.filter((object) => test(object))\n    return new this.constructor(objects)\n  }\n\n  removeObjectsInRange(range) {\n    const [ objects, leftIndex, rightIndex ] = this.splitObjectsAtRange(range)\n    return new this.constructor(objects).splice(leftIndex, rightIndex - leftIndex + 1)\n  }\n\n  transformObjectsInRange(range, transform) {\n    const [ objects, leftIndex, rightIndex ] = this.splitObjectsAtRange(range)\n    const transformedObjects = objects.map((object, index) =>\n      leftIndex <= index && index <= rightIndex ? transform(object) : object\n    )\n    return new this.constructor(transformedObjects)\n  }\n\n  splitObjectsAtRange(range) {\n    let rightOuterIndex\n    let [ objects, leftInnerIndex, offset ] = this.splitObjectAtPosition(startOfRange(range))\n    ;[ objects, rightOuterIndex ] = new this.constructor(objects).splitObjectAtPosition(endOfRange(range) + offset)\n\n    return [ objects, leftInnerIndex, rightOuterIndex - 1 ]\n  }\n\n  getObjectAtPosition(position) {\n    const { index } = this.findIndexAndOffsetAtPosition(position)\n    return this.objects[index]\n  }\n\n  splitObjectAtPosition(position) {\n    let splitIndex, splitOffset\n    const { index, offset } = this.findIndexAndOffsetAtPosition(position)\n    const objects = this.objects.slice(0)\n    if (index != null) {\n      if (offset === 0) {\n        splitIndex = index\n        splitOffset = 0\n      } else {\n        const object = this.getObjectAtIndex(index)\n        const [ leftObject, rightObject ] = object.splitAtOffset(offset)\n        objects.splice(index, 1, leftObject, rightObject)\n        splitIndex = index + 1\n        splitOffset = leftObject.getLength() - offset\n      }\n    } else {\n      splitIndex = objects.length\n      splitOffset = 0\n    }\n\n    return [ objects, splitIndex, splitOffset ]\n  }\n\n  consolidate() {\n    const objects = []\n    let pendingObject = this.objects[0]\n\n    this.objects.slice(1).forEach((object) => {\n      if (pendingObject.canBeConsolidatedWith?.(object)) {\n        pendingObject = pendingObject.consolidateWith(object)\n      } else {\n        objects.push(pendingObject)\n        pendingObject = object\n      }\n    })\n\n    if (pendingObject) {\n      objects.push(pendingObject)\n    }\n\n    return new this.constructor(objects)\n  }\n\n  consolidateFromIndexToIndex(startIndex, endIndex) {\n    const objects = this.objects.slice(0)\n    const objectsInRange = objects.slice(startIndex, endIndex + 1)\n    const consolidatedInRange = new this.constructor(objectsInRange).consolidate().toArray()\n    return this.splice(startIndex, objectsInRange.length, ...consolidatedInRange)\n  }\n\n  findIndexAndOffsetAtPosition(position) {\n    let index\n    let currentPosition = 0\n    for (index = 0; index < this.objects.length; index++) {\n      const object = this.objects[index]\n      const nextPosition = currentPosition + object.getLength()\n      if (currentPosition <= position && position < nextPosition) {\n        return { index, offset: position - currentPosition }\n      }\n      currentPosition = nextPosition\n    }\n    return { index: null, offset: null }\n  }\n\n  findPositionAtIndexAndOffset(index, offset) {\n    let position = 0\n    for (let currentIndex = 0; currentIndex < this.objects.length; currentIndex++) {\n      const object = this.objects[currentIndex]\n      if (currentIndex < index) {\n        position += object.getLength()\n      } else if (currentIndex === index) {\n        position += offset\n        break\n      }\n    }\n    return position\n  }\n\n  getEndPosition() {\n    if (this.endPosition == null) {\n      this.endPosition = 0\n      this.objects.forEach((object) => this.endPosition += object.getLength())\n    }\n\n    return this.endPosition\n  }\n\n  toString() {\n    return this.objects.join(\"\")\n  }\n\n  toArray() {\n    return this.objects.slice(0)\n  }\n\n  toJSON() {\n    return this.toArray()\n  }\n\n  isEqualTo(splittableList) {\n    return super.isEqualTo(...arguments) || objectArraysAreEqual(this.objects, splittableList?.objects)\n  }\n\n  contentsForInspection() {\n    return {\n      objects: `[${this.objects.map((object) => object.inspect()).join(\", \")}]`,\n    }\n  }\n}\n\nconst objectArraysAreEqual = function(left, right = []) {\n  if (left.length !== right.length) {\n    return false\n  }\n  let result = true\n  for (let index = 0; index < left.length; index++) {\n    const object = left[index]\n    if (result && !object.isEqualTo(right[index])) {\n      result = false\n    }\n  }\n  return result\n}\n\nconst startOfRange = (range) => range[0]\n\nconst endOfRange = (range) => range[1]\n", "import TrixObject from \"trix/core/object\" // Don't override window.Object\n\nimport { getDirection } from \"trix/core/helpers\"\n\nimport Piece from \"trix/models/piece\"\nimport AttachmentPiece from \"trix/models/attachment_piece\"\nimport StringPiece from \"trix/models/string_piece\"\nimport SplittableList from \"trix/models/splittable_list\"\n\nimport Hash from \"trix/core/collections/hash\"\n\nexport default class Text extends TrixObject {\n  static textForAttachmentWithAttributes(attachment, attributes) {\n    const piece = new AttachmentPiece(attachment, attributes)\n    return new this([ piece ])\n  }\n\n  static textForStringWithAttributes(string, attributes) {\n    const piece = new StringPiece(string, attributes)\n    return new this([ piece ])\n  }\n\n  static fromJSON(textJSON) {\n    const pieces = Array.from(textJSON).map((pieceJSON) => Piece.fromJSON(pieceJSON))\n    return new this(pieces)\n  }\n\n  constructor(pieces = []) {\n    super(...arguments)\n    const notEmpty = pieces.filter((piece) => !piece.isEmpty())\n    this.pieceList = new SplittableList(notEmpty)\n  }\n\n  copy() {\n    return this.copyWithPieceList(this.pieceList)\n  }\n\n  copyWithPieceList(pieceList) {\n    return new this.constructor(pieceList.consolidate().toArray())\n  }\n\n  copyUsingObjectMap(objectMap) {\n    const pieces = this.getPieces().map((piece) => objectMap.find(piece) || piece)\n    return new this.constructor(pieces)\n  }\n\n  appendText(text) {\n    return this.insertTextAtPosition(text, this.getLength())\n  }\n\n  insertTextAtPosition(text, position) {\n    return this.copyWithPieceList(this.pieceList.insertSplittableListAtPosition(text.pieceList, position))\n  }\n\n  removeTextAtRange(range) {\n    return this.copyWithPieceList(this.pieceList.removeObjectsInRange(range))\n  }\n\n  replaceTextAtRange(text, range) {\n    return this.removeTextAtRange(range).insertTextAtPosition(text, range[0])\n  }\n\n  moveTextFromRangeToPosition(range, position) {\n    if (range[0] <= position && position <= range[1]) return\n    const text = this.getTextAtRange(range)\n    const length = text.getLength()\n    if (range[0] < position) {\n      position -= length\n    }\n    return this.removeTextAtRange(range).insertTextAtPosition(text, position)\n  }\n\n  addAttributeAtRange(attribute, value, range) {\n    const attributes = {}\n    attributes[attribute] = value\n    return this.addAttributesAtRange(attributes, range)\n  }\n\n  addAttributesAtRange(attributes, range) {\n    return this.copyWithPieceList(\n      this.pieceList.transformObjectsInRange(range, (piece) => piece.copyWithAdditionalAttributes(attributes))\n    )\n  }\n\n  removeAttributeAtRange(attribute, range) {\n    return this.copyWithPieceList(\n      this.pieceList.transformObjectsInRange(range, (piece) => piece.copyWithoutAttribute(attribute))\n    )\n  }\n\n  setAttributesAtRange(attributes, range) {\n    return this.copyWithPieceList(\n      this.pieceList.transformObjectsInRange(range, (piece) => piece.copyWithAttributes(attributes))\n    )\n  }\n\n  getAttributesAtPosition(position) {\n    return this.pieceList.getObjectAtPosition(position)?.getAttributes() || {}\n  }\n\n  getCommonAttributes() {\n    const objects = Array.from(this.pieceList.toArray()).map((piece) => piece.getAttributes())\n    return Hash.fromCommonAttributesOfObjects(objects).toObject()\n  }\n\n  getCommonAttributesAtRange(range) {\n    return this.getTextAtRange(range).getCommonAttributes() || {}\n  }\n\n  getExpandedRangeForAttributeAtOffset(attributeName, offset) {\n    let right\n    let left = right = offset\n    const length = this.getLength()\n\n    while (left > 0 && this.getCommonAttributesAtRange([ left - 1, right ])[attributeName]) {\n      left--\n    }\n    while (right < length && this.getCommonAttributesAtRange([ offset, right + 1 ])[attributeName]) {\n      right++\n    }\n\n    return [ left, right ]\n  }\n\n  getTextAtRange(range) {\n    return this.copyWithPieceList(this.pieceList.getSplittableListInRange(range))\n  }\n\n  getStringAtRange(range) {\n    return this.pieceList.getSplittableListInRange(range).toString()\n  }\n\n  getStringAtPosition(position) {\n    return this.getStringAtRange([ position, position + 1 ])\n  }\n\n  startsWithString(string) {\n    return this.getStringAtRange([ 0, string.length ]) === string\n  }\n\n  endsWithString(string) {\n    const length = this.getLength()\n    return this.getStringAtRange([ length - string.length, length ]) === string\n  }\n\n  getAttachmentPieces() {\n    return this.pieceList.toArray().filter((piece) => !!piece.attachment)\n  }\n\n  getAttachments() {\n    return this.getAttachmentPieces().map((piece) => piece.attachment)\n  }\n\n  getAttachmentAndPositionById(attachmentId) {\n    let position = 0\n    for (const piece of this.pieceList.toArray()) {\n      if (piece.attachment?.id === attachmentId) {\n        return { attachment: piece.attachment, position }\n      }\n      position += piece.length\n    }\n    return { attachment: null, position: null }\n  }\n\n  getAttachmentById(attachmentId) {\n    const { attachment } = this.getAttachmentAndPositionById(attachmentId)\n    return attachment\n  }\n\n  getRangeOfAttachment(attachment) {\n    const attachmentAndPosition = this.getAttachmentAndPositionById(attachment.id)\n    const position = attachmentAndPosition.position\n    attachment = attachmentAndPosition.attachment\n    if (attachment) {\n      return [ position, position + 1 ]\n    }\n  }\n\n  updateAttributesForAttachment(attributes, attachment) {\n    const range = this.getRangeOfAttachment(attachment)\n    if (range) {\n      return this.addAttributesAtRange(attributes, range)\n    } else {\n      return this\n    }\n  }\n\n  getLength() {\n    return this.pieceList.getEndPosition()\n  }\n\n  isEmpty() {\n    return this.getLength() === 0\n  }\n\n  isEqualTo(text) {\n    return super.isEqualTo(text) || text?.pieceList?.isEqualTo(this.pieceList)\n  }\n\n  isBlockBreak() {\n    return this.getLength() === 1 && this.pieceList.getObjectAtIndex(0).isBlockBreak()\n  }\n\n  eachPiece(callback) {\n    return this.pieceList.eachObject(callback)\n  }\n\n  getPieces() {\n    return this.pieceList.toArray()\n  }\n\n  getPieceAtPosition(position) {\n    return this.pieceList.getObjectAtPosition(position)\n  }\n\n  contentsForInspection() {\n    return { pieceList: this.pieceList.inspect() }\n  }\n\n  toSerializableText() {\n    const pieceList = this.pieceList.selectSplittableList((piece) => piece.isSerializable())\n    return this.copyWithPieceList(pieceList)\n  }\n\n  toString() {\n    return this.pieceList.toString()\n  }\n\n  toJSON() {\n    return this.pieceList.toJSON()\n  }\n\n  toConsole() {\n    return JSON.stringify(this.pieceList.toArray().map((piece) => JSON.parse(piece.toConsole())))\n  }\n\n  // BIDI\n\n  getDirection() {\n    return getDirection(this.toString())\n  }\n\n  isRTL() {\n    return this.getDirection() === \"rtl\"\n  }\n}\n", "import TrixObject from \"trix/core/object\" // Don't override window.Object\nimport Text from \"trix/models/text\"\n\nimport {\n  arraysAreEqual,\n  getBlockConfig,\n  getListAttributeNames,\n  objectsAreEqual,\n  spliceArray,\n} from \"trix/core/helpers\"\n\nexport default class Block extends TrixObject {\n  static fromJSON(blockJSON) {\n    const text = Text.fromJSON(blockJSON.text)\n    return new this(text, blockJSON.attributes, blockJSON.htmlAttributes)\n  }\n\n  constructor(text, attributes, htmlAttributes) {\n    super(...arguments)\n    this.text = applyBlockBreakToText(text || new Text())\n    this.attributes = attributes || []\n    this.htmlAttributes = htmlAttributes || {}\n  }\n\n  isEmpty() {\n    return this.text.isBlockBreak()\n  }\n\n  isEqualTo(block) {\n    if (super.isEqualTo(block)) return true\n\n    return this.text.isEqualTo(block?.text) && arraysAreEqual(this.attributes, block?.attributes) && objectsAreEqual(this.htmlAttributes, block?.htmlAttributes)\n  }\n\n  copyWithText(text) {\n    return new Block(text, this.attributes, this.htmlAttributes)\n  }\n\n  copyWithoutText() {\n    return this.copyWithText(null)\n  }\n\n  copyWithAttributes(attributes) {\n    return new Block(this.text, attributes, this.htmlAttributes)\n  }\n\n  copyWithoutAttributes() {\n    return this.copyWithAttributes(null)\n  }\n\n  copyUsingObjectMap(objectMap) {\n    const mappedText = objectMap.find(this.text)\n    if (mappedText) {\n      return this.copyWithText(mappedText)\n    } else {\n      return this.copyWithText(this.text.copyUsingObjectMap(objectMap))\n    }\n  }\n\n  addAttribute(attribute) {\n    const attributes = this.attributes.concat(expandAttribute(attribute))\n    return this.copyWithAttributes(attributes)\n  }\n\n  addHTMLAttribute(attribute, value) {\n    const htmlAttributes = Object.assign({}, this.htmlAttributes, { [attribute]: value })\n    return new Block(this.text, this.attributes, htmlAttributes)\n  }\n\n  removeAttribute(attribute) {\n    const { listAttribute } = getBlockConfig(attribute)\n    const attributes = removeLastValue(removeLastValue(this.attributes, attribute), listAttribute)\n    return this.copyWithAttributes(attributes)\n  }\n\n  removeLastAttribute() {\n    return this.removeAttribute(this.getLastAttribute())\n  }\n\n  getLastAttribute() {\n    return getLastElement(this.attributes)\n  }\n\n  getAttributes() {\n    return this.attributes.slice(0)\n  }\n\n  getAttributeLevel() {\n    return this.attributes.length\n  }\n\n  getAttributeAtLevel(level) {\n    return this.attributes[level - 1]\n  }\n\n  hasAttribute(attributeName) {\n    return this.attributes.includes(attributeName)\n  }\n\n  hasAttributes() {\n    return this.getAttributeLevel() > 0\n  }\n\n  getLastNestableAttribute() {\n    return getLastElement(this.getNestableAttributes())\n  }\n\n  getNestableAttributes() {\n    return this.attributes.filter((attribute) => getBlockConfig(attribute).nestable)\n  }\n\n  getNestingLevel() {\n    return this.getNestableAttributes().length\n  }\n\n  decreaseNestingLevel() {\n    const attribute = this.getLastNestableAttribute()\n    if (attribute) {\n      return this.removeAttribute(attribute)\n    } else {\n      return this\n    }\n  }\n\n  increaseNestingLevel() {\n    const attribute = this.getLastNestableAttribute()\n    if (attribute) {\n      const index = this.attributes.lastIndexOf(attribute)\n      const attributes = spliceArray(this.attributes, index + 1, 0, ...expandAttribute(attribute))\n      return this.copyWithAttributes(attributes)\n    } else {\n      return this\n    }\n  }\n\n  getListItemAttributes() {\n    return this.attributes.filter((attribute) => getBlockConfig(attribute).listAttribute)\n  }\n\n  isListItem() {\n    return getBlockConfig(this.getLastAttribute())?.listAttribute\n  }\n\n  isTerminalBlock() {\n    return getBlockConfig(this.getLastAttribute())?.terminal\n  }\n\n  breaksOnReturn() {\n    return getBlockConfig(this.getLastAttribute())?.breakOnReturn\n  }\n\n  findLineBreakInDirectionFromPosition(direction, position) {\n    const string = this.toString()\n    let result\n    switch (direction) {\n      case \"forward\":\n        result = string.indexOf(\"\\n\", position)\n        break\n      case \"backward\":\n        result = string.slice(0, position).lastIndexOf(\"\\n\")\n    }\n\n    if (result !== -1) {\n      return result\n    }\n  }\n\n  contentsForInspection() {\n    return {\n      text: this.text.inspect(),\n      attributes: this.attributes,\n    }\n  }\n\n  toString() {\n    return this.text.toString()\n  }\n\n  toJSON() {\n    return {\n      text: this.text,\n      attributes: this.attributes,\n      htmlAttributes: this.htmlAttributes,\n    }\n  }\n\n  // BIDI\n\n  getDirection() {\n    return this.text.getDirection()\n  }\n\n  isRTL() {\n    return this.text.isRTL()\n  }\n\n  // Splittable\n\n  getLength() {\n    return this.text.getLength()\n  }\n\n  canBeConsolidatedWith(block) {\n    return !this.hasAttributes() && !block.hasAttributes() && this.getDirection() === block.getDirection()\n  }\n\n  consolidateWith(block) {\n    const newlineText = Text.textForStringWithAttributes(\"\\n\")\n    const text = this.getTextWithoutBlockBreak().appendText(newlineText)\n    return this.copyWithText(text.appendText(block.text))\n  }\n\n  splitAtOffset(offset) {\n    let left, right\n    if (offset === 0) {\n      left = null\n      right = this\n    } else if (offset === this.getLength()) {\n      left = this\n      right = null\n    } else {\n      left = this.copyWithText(this.text.getTextAtRange([ 0, offset ]))\n      right = this.copyWithText(this.text.getTextAtRange([ offset, this.getLength() ]))\n    }\n    return [ left, right ]\n  }\n\n  getBlockBreakPosition() {\n    return this.text.getLength() - 1\n  }\n\n  getTextWithoutBlockBreak() {\n    if (textEndsInBlockBreak(this.text)) {\n      return this.text.getTextAtRange([ 0, this.getBlockBreakPosition() ])\n    } else {\n      return this.text.copy()\n    }\n  }\n\n  // Grouping\n\n  canBeGrouped(depth) {\n    return this.attributes[depth]\n  }\n\n  canBeGroupedWith(otherBlock, depth) {\n    const otherAttributes = otherBlock.getAttributes()\n    const otherAttribute = otherAttributes[depth]\n    const attribute = this.attributes[depth]\n\n    return (\n      attribute === otherAttribute &&\n      !(getBlockConfig(attribute).group === false && !getListAttributeNames().includes(otherAttributes[depth + 1])) &&\n      (this.getDirection() === otherBlock.getDirection() || otherBlock.isEmpty())\n    )\n  }\n}\n\n// Block breaks\n\nconst applyBlockBreakToText = function(text) {\n  text = unmarkExistingInnerBlockBreaksInText(text)\n  text = addBlockBreakToText(text)\n  return text\n}\n\nconst unmarkExistingInnerBlockBreaksInText = function(text) {\n  let modified = false\n  const pieces = text.getPieces()\n\n  let innerPieces = pieces.slice(0, pieces.length - 1)\n  const lastPiece = pieces[pieces.length - 1]\n\n  if (!lastPiece) return text\n\n  innerPieces = innerPieces.map((piece) => {\n    if (piece.isBlockBreak()) {\n      modified = true\n      return unmarkBlockBreakPiece(piece)\n    } else {\n      return piece\n    }\n  })\n\n  if (modified) {\n    return new Text([ ...innerPieces, lastPiece ])\n  } else {\n    return text\n  }\n}\n\nconst blockBreakText = Text.textForStringWithAttributes(\"\\n\", { blockBreak: true })\n\nconst addBlockBreakToText = function(text) {\n  if (textEndsInBlockBreak(text)) {\n    return text\n  } else {\n    return text.appendText(blockBreakText)\n  }\n}\n\nconst textEndsInBlockBreak = function(text) {\n  const length = text.getLength()\n  if (length === 0) {\n    return false\n  }\n  const endText = text.getTextAtRange([ length - 1, length ])\n  return endText.isBlockBreak()\n}\n\nconst unmarkBlockBreakPiece = (piece) => piece.copyWithoutAttribute(\"blockBreak\")\n\n// Attributes\n\nconst expandAttribute = function(attribute) {\n  const { listAttribute } = getBlockConfig(attribute)\n  if (listAttribute) {\n    return [ listAttribute, attribute ]\n  } else {\n    return [ attribute ]\n  }\n}\n\n// Array helpers\n\nconst getLastElement = (array) => array.slice(-1)[0]\n\nconst removeLastValue = function(array, value) {\n  const index = array.lastIndexOf(value)\n  if (index === -1) {\n    return array\n  } else {\n    return spliceArray(array, index, 1)\n  }\n}\n", "import * as config from \"trix/config\"\nimport TrixObject from \"trix/core/object\" // Don't override window.Object\n\nimport Text from \"trix/models/text\"\nimport Block from \"trix/models/block\"\nimport SplittableList from \"trix/models/splittable_list\"\nimport Hash from \"trix/core/collections/hash\"\nimport ObjectMap from \"trix/core/collections/object_map\"\n\nimport { arraysAreEqual, getBlockConfig, normalizeRange, rangeIsCollapsed } from \"trix/core/helpers\"\n\nexport default class Document extends TrixObject {\n  static fromJSON(documentJSON) {\n    const blocks = Array.from(documentJSON).map((blockJSON) => Block.fromJSON(blockJSON))\n    return new this(blocks)\n  }\n\n  static fromString(string, textAttributes) {\n    const text = Text.textForStringWithAttributes(string, textAttributes)\n    return new this([ new Block(text) ])\n  }\n\n  constructor(blocks = []) {\n    super(...arguments)\n    if (blocks.length === 0) {\n      blocks = [ new Block() ]\n    }\n    this.blockList = SplittableList.box(blocks)\n  }\n\n  isEmpty() {\n    const block = this.getBlockAtIndex(0)\n    return this.blockList.length === 1 && block.isEmpty() && !block.hasAttributes()\n  }\n\n  copy(options = {}) {\n    const blocks = options.consolidateBlocks ? this.blockList.consolidate().toArray() : this.blockList.toArray()\n\n    return new this.constructor(blocks)\n  }\n\n  copyUsingObjectsFromDocument(sourceDocument) {\n    const objectMap = new ObjectMap(sourceDocument.getObjects())\n    return this.copyUsingObjectMap(objectMap)\n  }\n\n  copyUsingObjectMap(objectMap) {\n    const blocks = this.getBlocks().map((block) => {\n      const mappedBlock = objectMap.find(block)\n      return mappedBlock || block.copyUsingObjectMap(objectMap)\n    })\n    return new this.constructor(blocks)\n  }\n\n  copyWithBaseBlockAttributes(blockAttributes = []) {\n    const blocks = this.getBlocks().map((block) => {\n      const attributes = blockAttributes.concat(block.getAttributes())\n      return block.copyWithAttributes(attributes)\n    })\n\n    return new this.constructor(blocks)\n  }\n\n  replaceBlock(oldBlock, newBlock) {\n    const index = this.blockList.indexOf(oldBlock)\n    if (index === -1) {\n      return this\n    }\n    return new this.constructor(this.blockList.replaceObjectAtIndex(newBlock, index))\n  }\n\n  insertDocumentAtRange(document, range) {\n    const { blockList } = document\n    range = normalizeRange(range)\n    let [ position ] = range\n    const { index, offset } = this.locationFromPosition(position)\n\n    let result = this\n    const block = this.getBlockAtPosition(position)\n\n    if (rangeIsCollapsed(range) && block.isEmpty() && !block.hasAttributes()) {\n      result = new this.constructor(result.blockList.removeObjectAtIndex(index))\n    } else if (block.getBlockBreakPosition() === offset) {\n      position++\n    }\n\n    result = result.removeTextAtRange(range)\n    return new this.constructor(result.blockList.insertSplittableListAtPosition(blockList, position))\n  }\n\n  mergeDocumentAtRange(document, range) {\n    let formattedDocument, result\n    range = normalizeRange(range)\n    const [ startPosition ] = range\n    const startLocation = this.locationFromPosition(startPosition)\n    const blockAttributes = this.getBlockAtIndex(startLocation.index).getAttributes()\n    const baseBlockAttributes = document.getBaseBlockAttributes()\n    const trailingBlockAttributes = blockAttributes.slice(-baseBlockAttributes.length)\n\n    if (arraysAreEqual(baseBlockAttributes, trailingBlockAttributes)) {\n      const leadingBlockAttributes = blockAttributes.slice(0, -baseBlockAttributes.length)\n      formattedDocument = document.copyWithBaseBlockAttributes(leadingBlockAttributes)\n    } else {\n      formattedDocument = document.copy({ consolidateBlocks: true }).copyWithBaseBlockAttributes(blockAttributes)\n    }\n\n    const blockCount = formattedDocument.getBlockCount()\n    const firstBlock = formattedDocument.getBlockAtIndex(0)\n\n    if (arraysAreEqual(blockAttributes, firstBlock.getAttributes())) {\n      const firstText = firstBlock.getTextWithoutBlockBreak()\n      result = this.insertTextAtRange(firstText, range)\n\n      if (blockCount > 1) {\n        formattedDocument = new this.constructor(formattedDocument.getBlocks().slice(1))\n        const position = startPosition + firstText.getLength()\n        result = result.insertDocumentAtRange(formattedDocument, position)\n      }\n    } else {\n      result = this.insertDocumentAtRange(formattedDocument, range)\n    }\n\n    return result\n  }\n\n  insertTextAtRange(text, range) {\n    range = normalizeRange(range)\n    const [ startPosition ] = range\n    const { index, offset } = this.locationFromPosition(startPosition)\n\n    const document = this.removeTextAtRange(range)\n    return new this.constructor(\n      document.blockList.editObjectAtIndex(index, (block) =>\n        block.copyWithText(block.text.insertTextAtPosition(text, offset))\n      )\n    )\n  }\n\n  removeTextAtRange(range) {\n    let blocks\n    range = normalizeRange(range)\n    const [ leftPosition, rightPosition ] = range\n    if (rangeIsCollapsed(range)) {\n      return this\n    }\n    const [ leftLocation, rightLocation ] = Array.from(this.locationRangeFromRange(range))\n\n    const leftIndex = leftLocation.index\n    const leftOffset = leftLocation.offset\n    const leftBlock = this.getBlockAtIndex(leftIndex)\n\n    const rightIndex = rightLocation.index\n    const rightOffset = rightLocation.offset\n    const rightBlock = this.getBlockAtIndex(rightIndex)\n\n    const removeRightNewline =\n      rightPosition - leftPosition === 1 &&\n      leftBlock.getBlockBreakPosition() === leftOffset &&\n      rightBlock.getBlockBreakPosition() !== rightOffset &&\n      rightBlock.text.getStringAtPosition(rightOffset) === \"\\n\"\n\n    if (removeRightNewline) {\n      blocks = this.blockList.editObjectAtIndex(rightIndex, (block) =>\n        block.copyWithText(block.text.removeTextAtRange([ rightOffset, rightOffset + 1 ]))\n      )\n    } else {\n      let block\n      const leftText = leftBlock.text.getTextAtRange([ 0, leftOffset ])\n      const rightText = rightBlock.text.getTextAtRange([ rightOffset, rightBlock.getLength() ])\n      const text = leftText.appendText(rightText)\n\n      const removingLeftBlock = leftIndex !== rightIndex && leftOffset === 0\n      const useRightBlock = removingLeftBlock && leftBlock.getAttributeLevel() >= rightBlock.getAttributeLevel()\n\n      if (useRightBlock) {\n        block = rightBlock.copyWithText(text)\n      } else {\n        block = leftBlock.copyWithText(text)\n      }\n\n      const affectedBlockCount = rightIndex + 1 - leftIndex\n      blocks = this.blockList.splice(leftIndex, affectedBlockCount, block)\n    }\n\n    return new this.constructor(blocks)\n  }\n\n  moveTextFromRangeToPosition(range, position) {\n    let text\n    range = normalizeRange(range)\n    const [ startPosition, endPosition ] = range\n    if (startPosition <= position && position <= endPosition) {\n      return this\n    }\n\n    let document = this.getDocumentAtRange(range)\n    let result = this.removeTextAtRange(range)\n\n    const movingRightward = startPosition < position\n    if (movingRightward) {\n      position -= document.getLength()\n    }\n\n    const [ firstBlock, ...blocks ] = document.getBlocks()\n    if (blocks.length === 0) {\n      text = firstBlock.getTextWithoutBlockBreak()\n      if (movingRightward) {\n        position += 1\n      }\n    } else {\n      text = firstBlock.text\n    }\n\n    result = result.insertTextAtRange(text, position)\n    if (blocks.length === 0) {\n      return result\n    }\n\n    document = new this.constructor(blocks)\n    position += text.getLength()\n\n    return result.insertDocumentAtRange(document, position)\n  }\n\n  addAttributeAtRange(attribute, value, range) {\n    let { blockList } = this\n    this.eachBlockAtRange(\n      range,\n      (block, textRange, index) =>\n        blockList = blockList.editObjectAtIndex(index, function() {\n          if (getBlockConfig(attribute)) {\n            return block.addAttribute(attribute, value)\n          } else {\n            if (textRange[0] === textRange[1]) {\n              return block\n            } else {\n              return block.copyWithText(block.text.addAttributeAtRange(attribute, value, textRange))\n            }\n          }\n        })\n    )\n    return new this.constructor(blockList)\n  }\n\n  addAttribute(attribute, value) {\n    let { blockList } = this\n    this.eachBlock(\n      (block, index) => blockList = blockList.editObjectAtIndex(index, () => block.addAttribute(attribute, value))\n    )\n    return new this.constructor(blockList)\n  }\n\n  removeAttributeAtRange(attribute, range) {\n    let { blockList } = this\n    this.eachBlockAtRange(range, function(block, textRange, index) {\n      if (getBlockConfig(attribute)) {\n        blockList = blockList.editObjectAtIndex(index, () => block.removeAttribute(attribute))\n      } else if (textRange[0] !== textRange[1]) {\n        blockList = blockList.editObjectAtIndex(index, () =>\n          block.copyWithText(block.text.removeAttributeAtRange(attribute, textRange))\n        )\n      }\n    })\n    return new this.constructor(blockList)\n  }\n\n  updateAttributesForAttachment(attributes, attachment) {\n    const range = this.getRangeOfAttachment(attachment)\n    const [ startPosition ] = Array.from(range)\n    const { index } = this.locationFromPosition(startPosition)\n    const text = this.getTextAtIndex(index)\n\n    return new this.constructor(\n      this.blockList.editObjectAtIndex(index, (block) =>\n        block.copyWithText(text.updateAttributesForAttachment(attributes, attachment))\n      )\n    )\n  }\n\n  removeAttributeForAttachment(attribute, attachment) {\n    const range = this.getRangeOfAttachment(attachment)\n    return this.removeAttributeAtRange(attribute, range)\n  }\n\n  setHTMLAttributeAtPosition(position, name, value) {\n    const block = this.getBlockAtPosition(position)\n    const updatedBlock = block.addHTMLAttribute(name, value)\n    return this.replaceBlock(block, updatedBlock)\n  }\n\n  insertBlockBreakAtRange(range) {\n    let blocks\n    range = normalizeRange(range)\n    const [ startPosition ] = range\n    const { offset } = this.locationFromPosition(startPosition)\n\n    const document = this.removeTextAtRange(range)\n    if (offset === 0) {\n      blocks = [ new Block() ]\n    }\n    return new this.constructor(\n      document.blockList.insertSplittableListAtPosition(new SplittableList(blocks), startPosition)\n    )\n  }\n\n  applyBlockAttributeAtRange(attributeName, value, range) {\n    const expanded = this.expandRangeToLineBreaksAndSplitBlocks(range)\n    let document = expanded.document\n    range = expanded.range\n    const blockConfig = getBlockConfig(attributeName)\n\n    if (blockConfig.listAttribute) {\n      document = document.removeLastListAttributeAtRange(range, { exceptAttributeName: attributeName })\n      const converted = document.convertLineBreaksToBlockBreaksInRange(range)\n      document = converted.document\n      range = converted.range\n    } else if (blockConfig.exclusive) {\n      document = document.removeBlockAttributesAtRange(range)\n    } else if (blockConfig.terminal) {\n      document = document.removeLastTerminalAttributeAtRange(range)\n    } else {\n      document = document.consolidateBlocksAtRange(range)\n    }\n\n    return document.addAttributeAtRange(attributeName, value, range)\n  }\n\n  removeLastListAttributeAtRange(range, options = {}) {\n    let { blockList } = this\n    this.eachBlockAtRange(range, function(block, textRange, index) {\n      const lastAttributeName = block.getLastAttribute()\n      if (!lastAttributeName) {\n        return\n      }\n      if (!getBlockConfig(lastAttributeName).listAttribute) {\n        return\n      }\n      if (lastAttributeName === options.exceptAttributeName) {\n        return\n      }\n      blockList = blockList.editObjectAtIndex(index, () => block.removeAttribute(lastAttributeName))\n    })\n    return new this.constructor(blockList)\n  }\n\n  removeLastTerminalAttributeAtRange(range) {\n    let { blockList } = this\n    this.eachBlockAtRange(range, function(block, textRange, index) {\n      const lastAttributeName = block.getLastAttribute()\n      if (!lastAttributeName) {\n        return\n      }\n      if (!getBlockConfig(lastAttributeName).terminal) {\n        return\n      }\n      blockList = blockList.editObjectAtIndex(index, () => block.removeAttribute(lastAttributeName))\n    })\n    return new this.constructor(blockList)\n  }\n\n  removeBlockAttributesAtRange(range) {\n    let { blockList } = this\n    this.eachBlockAtRange(range, function(block, textRange, index) {\n      if (block.hasAttributes()) {\n        blockList = blockList.editObjectAtIndex(index, () => block.copyWithoutAttributes())\n      }\n    })\n    return new this.constructor(blockList)\n  }\n\n  expandRangeToLineBreaksAndSplitBlocks(range) {\n    let position\n    range = normalizeRange(range)\n    let [ startPosition, endPosition ] = range\n    const startLocation = this.locationFromPosition(startPosition)\n    const endLocation = this.locationFromPosition(endPosition)\n    let document = this\n\n    const startBlock = document.getBlockAtIndex(startLocation.index)\n    startLocation.offset = startBlock.findLineBreakInDirectionFromPosition(\"backward\", startLocation.offset)\n    if (startLocation.offset != null) {\n      position = document.positionFromLocation(startLocation)\n      document = document.insertBlockBreakAtRange([ position, position + 1 ])\n      endLocation.index += 1\n      endLocation.offset -= document.getBlockAtIndex(startLocation.index).getLength()\n      startLocation.index += 1\n    }\n    startLocation.offset = 0\n\n    if (endLocation.offset === 0 && endLocation.index > startLocation.index) {\n      endLocation.index -= 1\n      endLocation.offset = document.getBlockAtIndex(endLocation.index).getBlockBreakPosition()\n    } else {\n      const endBlock = document.getBlockAtIndex(endLocation.index)\n      if (endBlock.text.getStringAtRange([ endLocation.offset - 1, endLocation.offset ]) === \"\\n\") {\n        endLocation.offset -= 1\n      } else {\n        endLocation.offset = endBlock.findLineBreakInDirectionFromPosition(\"forward\", endLocation.offset)\n      }\n      if (endLocation.offset !== endBlock.getBlockBreakPosition()) {\n        position = document.positionFromLocation(endLocation)\n        document = document.insertBlockBreakAtRange([ position, position + 1 ])\n      }\n    }\n\n    startPosition = document.positionFromLocation(startLocation)\n    endPosition = document.positionFromLocation(endLocation)\n    range = normalizeRange([ startPosition, endPosition ])\n\n    return { document, range }\n  }\n\n  convertLineBreaksToBlockBreaksInRange(range) {\n    range = normalizeRange(range)\n    let [ position ] = range\n    const string = this.getStringAtRange(range).slice(0, -1)\n    let document = this\n\n    string.replace(/.*?\\n/g, function(match) {\n      position += match.length\n      document = document.insertBlockBreakAtRange([ position - 1, position ])\n    })\n\n    return { document, range }\n  }\n\n  consolidateBlocksAtRange(range) {\n    range = normalizeRange(range)\n    const [ startPosition, endPosition ] = range\n    const startIndex = this.locationFromPosition(startPosition).index\n    const endIndex = this.locationFromPosition(endPosition).index\n    return new this.constructor(this.blockList.consolidateFromIndexToIndex(startIndex, endIndex))\n  }\n\n  getDocumentAtRange(range) {\n    range = normalizeRange(range)\n    const blocks = this.blockList.getSplittableListInRange(range).toArray()\n    return new this.constructor(blocks)\n  }\n\n  getStringAtRange(range) {\n    let endIndex\n    const array = range = normalizeRange(range),\n      endPosition = array[array.length - 1]\n    if (endPosition !== this.getLength()) {\n      endIndex = -1\n    }\n    return this.getDocumentAtRange(range).toString().slice(0, endIndex)\n  }\n\n  getBlockAtIndex(index) {\n    return this.blockList.getObjectAtIndex(index)\n  }\n\n  getBlockAtPosition(position) {\n    const { index } = this.locationFromPosition(position)\n    return this.getBlockAtIndex(index)\n  }\n\n  getTextAtIndex(index) {\n    return this.getBlockAtIndex(index)?.text\n  }\n\n  getTextAtPosition(position) {\n    const { index } = this.locationFromPosition(position)\n    return this.getTextAtIndex(index)\n  }\n\n  getPieceAtPosition(position) {\n    const { index, offset } = this.locationFromPosition(position)\n    return this.getTextAtIndex(index).getPieceAtPosition(offset)\n  }\n\n  getCharacterAtPosition(position) {\n    const { index, offset } = this.locationFromPosition(position)\n    return this.getTextAtIndex(index).getStringAtRange([ offset, offset + 1 ])\n  }\n\n  getLength() {\n    return this.blockList.getEndPosition()\n  }\n\n  getBlocks() {\n    return this.blockList.toArray()\n  }\n\n  getBlockCount() {\n    return this.blockList.length\n  }\n\n  getEditCount() {\n    return this.editCount\n  }\n\n  eachBlock(callback) {\n    return this.blockList.eachObject(callback)\n  }\n\n  eachBlockAtRange(range, callback) {\n    let block, textRange\n    range = normalizeRange(range)\n    const [ startPosition, endPosition ] = range\n    const startLocation = this.locationFromPosition(startPosition)\n    const endLocation = this.locationFromPosition(endPosition)\n\n    if (startLocation.index === endLocation.index) {\n      block = this.getBlockAtIndex(startLocation.index)\n      textRange = [ startLocation.offset, endLocation.offset ]\n      return callback(block, textRange, startLocation.index)\n    } else {\n      for (let index = startLocation.index; index <= endLocation.index; index++) {\n        block = this.getBlockAtIndex(index)\n        if (block) {\n          switch (index) {\n            case startLocation.index:\n              textRange = [ startLocation.offset, block.text.getLength() ]\n              break\n            case endLocation.index:\n              textRange = [ 0, endLocation.offset ]\n              break\n            default:\n              textRange = [ 0, block.text.getLength() ]\n          }\n          callback(block, textRange, index)\n        }\n      }\n    }\n  }\n\n  getCommonAttributesAtRange(range) {\n    range = normalizeRange(range)\n    const [ startPosition ] = range\n    if (rangeIsCollapsed(range)) {\n      return this.getCommonAttributesAtPosition(startPosition)\n    } else {\n      const textAttributes = []\n      const blockAttributes = []\n\n      this.eachBlockAtRange(range, function(block, textRange) {\n        if (textRange[0] !== textRange[1]) {\n          textAttributes.push(block.text.getCommonAttributesAtRange(textRange))\n          return blockAttributes.push(attributesForBlock(block))\n        }\n      })\n\n      return Hash.fromCommonAttributesOfObjects(textAttributes)\n        .merge(Hash.fromCommonAttributesOfObjects(blockAttributes))\n        .toObject()\n    }\n  }\n\n  getCommonAttributesAtPosition(position) {\n    let key, value\n    const { index, offset } = this.locationFromPosition(position)\n    const block = this.getBlockAtIndex(index)\n    if (!block) {\n      return {}\n    }\n\n    const commonAttributes = attributesForBlock(block)\n    const attributes = block.text.getAttributesAtPosition(offset)\n    const attributesLeft = block.text.getAttributesAtPosition(offset - 1)\n    const inheritableAttributes = Object.keys(config.textAttributes).filter((key) => {\n      return config.textAttributes[key].inheritable\n    })\n\n    for (key in attributesLeft) {\n      value = attributesLeft[key]\n      if (value === attributes[key] || inheritableAttributes.includes(key)) {\n        commonAttributes[key] = value\n      }\n    }\n\n    return commonAttributes\n  }\n\n  getRangeOfCommonAttributeAtPosition(attributeName, position) {\n    const { index, offset } = this.locationFromPosition(position)\n    const text = this.getTextAtIndex(index)\n    const [ startOffset, endOffset ] = Array.from(text.getExpandedRangeForAttributeAtOffset(attributeName, offset))\n\n    const start = this.positionFromLocation({ index, offset: startOffset })\n    const end = this.positionFromLocation({ index, offset: endOffset })\n    return normalizeRange([ start, end ])\n  }\n\n  getBaseBlockAttributes() {\n    let baseBlockAttributes = this.getBlockAtIndex(0).getAttributes()\n\n    for (let blockIndex = 1; blockIndex < this.getBlockCount(); blockIndex++) {\n      const blockAttributes = this.getBlockAtIndex(blockIndex).getAttributes()\n      const lastAttributeIndex = Math.min(baseBlockAttributes.length, blockAttributes.length)\n\n      baseBlockAttributes = (() => {\n        const result = []\n        for (let index = 0; index < lastAttributeIndex; index++) {\n          if (blockAttributes[index] !== baseBlockAttributes[index]) {\n            break\n          }\n          result.push(blockAttributes[index])\n        }\n        return result\n      })()\n    }\n\n    return baseBlockAttributes\n  }\n\n  getAttachmentById(attachmentId) {\n    for (const attachment of this.getAttachments()) {\n      if (attachment.id === attachmentId) {\n        return attachment\n      }\n    }\n  }\n\n  getAttachmentPieces() {\n    let attachmentPieces = []\n    this.blockList.eachObject(({ text }) => attachmentPieces = attachmentPieces.concat(text.getAttachmentPieces()))\n    return attachmentPieces\n  }\n\n  getAttachments() {\n    return this.getAttachmentPieces().map((piece) => piece.attachment)\n  }\n\n  getRangeOfAttachment(attachment) {\n    let position = 0\n    const iterable = this.blockList.toArray()\n    for (let index = 0; index < iterable.length; index++) {\n      const { text } = iterable[index]\n      const textRange = text.getRangeOfAttachment(attachment)\n      if (textRange) {\n        return normalizeRange([ position + textRange[0], position + textRange[1] ])\n      }\n      position += text.getLength()\n    }\n  }\n\n  getLocationRangeOfAttachment(attachment) {\n    const range = this.getRangeOfAttachment(attachment)\n    return this.locationRangeFromRange(range)\n  }\n\n  getAttachmentPieceForAttachment(attachment) {\n    for (const piece of this.getAttachmentPieces()) {\n      if (piece.attachment === attachment) {\n        return piece\n      }\n    }\n  }\n\n  findRangesForBlockAttribute(attributeName) {\n    let position = 0\n    const ranges = []\n\n    this.getBlocks().forEach((block) => {\n      const length = block.getLength()\n      if (block.hasAttribute(attributeName)) {\n        ranges.push([ position, position + length ])\n      }\n      position += length\n    })\n\n    return ranges\n  }\n\n  findRangesForTextAttribute(attributeName, { withValue } = {}) {\n    let position = 0\n    let range = []\n    const ranges = []\n\n    const match = function(piece) {\n      if (withValue) {\n        return piece.getAttribute(attributeName) === withValue\n      } else {\n        return piece.hasAttribute(attributeName)\n      }\n    }\n\n    this.getPieces().forEach((piece) => {\n      const length = piece.getLength()\n      if (match(piece)) {\n        if (range[1] === position) {\n          range[1] = position + length\n        } else {\n          ranges.push(range = [ position, position + length ])\n        }\n      }\n      position += length\n    })\n\n    return ranges\n  }\n\n  locationFromPosition(position) {\n    const location = this.blockList.findIndexAndOffsetAtPosition(Math.max(0, position))\n    if (location.index != null) {\n      return location\n    } else {\n      const blocks = this.getBlocks()\n      return { index: blocks.length - 1, offset: blocks[blocks.length - 1].getLength() }\n    }\n  }\n\n  positionFromLocation(location) {\n    return this.blockList.findPositionAtIndexAndOffset(location.index, location.offset)\n  }\n\n  locationRangeFromPosition(position) {\n    return normalizeRange(this.locationFromPosition(position))\n  }\n\n  locationRangeFromRange(range) {\n    range = normalizeRange(range)\n    if (!range) return\n\n    const [ startPosition, endPosition ] = Array.from(range)\n    const startLocation = this.locationFromPosition(startPosition)\n    const endLocation = this.locationFromPosition(endPosition)\n    return normalizeRange([ startLocation, endLocation ])\n  }\n\n  rangeFromLocationRange(locationRange) {\n    let rightPosition\n    locationRange = normalizeRange(locationRange)\n    const leftPosition = this.positionFromLocation(locationRange[0])\n    if (!rangeIsCollapsed(locationRange)) {\n      rightPosition = this.positionFromLocation(locationRange[1])\n    }\n    return normalizeRange([ leftPosition, rightPosition ])\n  }\n\n  isEqualTo(document) {\n    return this.blockList.isEqualTo(document?.blockList)\n  }\n\n  getTexts() {\n    return this.getBlocks().map((block) => block.text)\n  }\n\n  getPieces() {\n    const pieces = []\n\n    Array.from(this.getTexts()).forEach((text) => {\n      pieces.push(...Array.from(text.getPieces() || []))\n    })\n\n    return pieces\n  }\n\n  getObjects() {\n    return this.getBlocks().concat(this.getTexts()).concat(this.getPieces())\n  }\n\n  toSerializableDocument() {\n    const blocks = []\n    this.blockList.eachObject((block) => blocks.push(block.copyWithText(block.text.toSerializableText())))\n    return new this.constructor(blocks)\n  }\n\n  toString() {\n    return this.blockList.toString()\n  }\n\n  toJSON() {\n    return this.blockList.toJSON()\n  }\n\n  toConsole() {\n    return JSON.stringify(this.blockList.toArray().map((block) => JSON.parse(block.text.toConsole())))\n  }\n}\n\nconst attributesForBlock = function(block) {\n  const attributes = {}\n  const attributeName = block.getLastAttribute()\n  if (attributeName) {\n    attributes[attributeName] = true\n  }\n  return attributes\n}\n", "/* eslint-disable\n    no-case-declarations,\n    no-irregular-whitespace,\n*/\nimport * as config from \"trix/config\"\nimport BasicObject from \"trix/core/basic_object\"\nimport Document from \"trix/models/document\"\nimport HTMLSanitizer from \"trix/models/html_sanitizer\"\n\nimport {\n  arraysAreEqual,\n  breakableWhitespacePattern,\n  elementContainsNode,\n  findClosestElementFromNode,\n  getBlockTagNames,\n  makeElement,\n  nodeIsAttachmentElement,\n  normalizeSpaces,\n  removeNode,\n  squishBreakableWhitespace,\n  tagName,\n  walkTree,\n} from \"trix/core/helpers\"\n\nconst pieceForString = (string, attributes = {}) => {\n  const type = \"string\"\n  string = normalizeSpaces(string)\n  return { string, attributes, type }\n}\n\nconst pieceForAttachment = (attachment, attributes = {}) => {\n  const type = \"attachment\"\n  return { attachment, attributes, type }\n}\n\nconst blockForAttributes = (attributes = {}, htmlAttributes = {}) => {\n  const text = []\n  return { text, attributes, htmlAttributes }\n}\n\nconst parseTrixDataAttribute = (element, name) => {\n  try {\n    return JSON.parse(element.getAttribute(`data-trix-${name}`))\n  } catch (error) {\n    return {}\n  }\n}\n\nconst getImageDimensions = (element) => {\n  const width = element.getAttribute(\"width\")\n  const height = element.getAttribute(\"height\")\n  const dimensions = {}\n  if (width) {\n    dimensions.width = parseInt(width, 10)\n  }\n  if (height) {\n    dimensions.height = parseInt(height, 10)\n  }\n  return dimensions\n}\n\nexport default class HTMLParser extends BasicObject {\n  static parse(html, options) {\n    const parser = new this(html, options)\n    parser.parse()\n    return parser\n  }\n\n  constructor(html, { referenceElement, purifyOptions } = {}) {\n    super(...arguments)\n    this.html = html\n    this.referenceElement = referenceElement\n    this.purifyOptions = purifyOptions\n    this.blocks = []\n    this.blockElements = []\n    this.processedElements = []\n  }\n\n  getDocument() {\n    return Document.fromJSON(this.blocks)\n  }\n\n  // HTML parsing\n\n  parse() {\n    try {\n      this.createHiddenContainer()\n      HTMLSanitizer.setHTML(this.containerElement, this.html, { purifyOptions: this.purifyOptions })\n      const walker = walkTree(this.containerElement, { usingFilter: nodeFilter })\n      while (walker.nextNode()) {\n        this.processNode(walker.currentNode)\n      }\n      return this.translateBlockElementMarginsToNewlines()\n    } finally {\n      this.removeHiddenContainer()\n    }\n  }\n\n  createHiddenContainer() {\n    if (this.referenceElement) {\n      this.containerElement = this.referenceElement.cloneNode(false)\n      this.containerElement.removeAttribute(\"id\")\n      this.containerElement.setAttribute(\"data-trix-internal\", \"\")\n      this.containerElement.style.display = \"none\"\n      return this.referenceElement.parentNode.insertBefore(this.containerElement, this.referenceElement.nextSibling)\n    } else {\n      this.containerElement = makeElement({ tagName: \"div\", style: { display: \"none\" } })\n      return document.body.appendChild(this.containerElement)\n    }\n  }\n\n  removeHiddenContainer() {\n    return removeNode(this.containerElement)\n  }\n\n  processNode(node) {\n    switch (node.nodeType) {\n      case Node.TEXT_NODE:\n        if (!this.isInsignificantTextNode(node)) {\n          this.appendBlockForTextNode(node)\n          return this.processTextNode(node)\n        }\n        break\n      case Node.ELEMENT_NODE:\n        this.appendBlockForElement(node)\n        return this.processElement(node)\n    }\n  }\n\n  appendBlockForTextNode(node) {\n    const element = node.parentNode\n    if (element === this.currentBlockElement && this.isBlockElement(node.previousSibling)) {\n      return this.appendStringWithAttributes(\"\\n\")\n    } else if (element === this.containerElement || this.isBlockElement(element)) {\n      const attributes = this.getBlockAttributes(element)\n      const htmlAttributes = this.getBlockHTMLAttributes(element)\n      if (!arraysAreEqual(attributes, this.currentBlock?.attributes)) {\n        this.currentBlock = this.appendBlockForAttributesWithElement(attributes, element, htmlAttributes)\n        this.currentBlockElement = element\n      }\n    }\n  }\n\n  appendBlockForElement(element) {\n    const elementIsBlockElement = this.isBlockElement(element)\n    const currentBlockContainsElement = elementContainsNode(this.currentBlockElement, element)\n\n    if (elementIsBlockElement && !this.isBlockElement(element.firstChild)) {\n      if (!this.isInsignificantTextNode(element.firstChild) || !this.isBlockElement(element.firstElementChild)) {\n        const attributes = this.getBlockAttributes(element)\n        const htmlAttributes = this.getBlockHTMLAttributes(element)\n        if (element.firstChild) {\n          if (!(currentBlockContainsElement && arraysAreEqual(attributes, this.currentBlock.attributes))) {\n            this.currentBlock = this.appendBlockForAttributesWithElement(attributes, element, htmlAttributes)\n            this.currentBlockElement = element\n          } else {\n            return this.appendStringWithAttributes(\"\\n\")\n          }\n        }\n      }\n    } else if (this.currentBlockElement && !currentBlockContainsElement && !elementIsBlockElement) {\n      const parentBlockElement = this.findParentBlockElement(element)\n      if (parentBlockElement) {\n        return this.appendBlockForElement(parentBlockElement)\n      } else {\n        this.currentBlock = this.appendEmptyBlock()\n        this.currentBlockElement = null\n      }\n    }\n  }\n\n  findParentBlockElement(element) {\n    let { parentElement } = element\n    while (parentElement && parentElement !== this.containerElement) {\n      if (this.isBlockElement(parentElement) && this.blockElements.includes(parentElement)) {\n        return parentElement\n      } else {\n        parentElement = parentElement.parentElement\n      }\n    }\n    return null\n  }\n\n  processTextNode(node) {\n    let string = node.data\n    if (!elementCanDisplayPreformattedText(node.parentNode)) {\n      string = squishBreakableWhitespace(string)\n      if (stringEndsWithWhitespace(node.previousSibling?.textContent)) {\n        string = leftTrimBreakableWhitespace(string)\n      }\n    }\n    return this.appendStringWithAttributes(string, this.getTextAttributes(node.parentNode))\n  }\n\n  processElement(element) {\n    let attributes\n    if (nodeIsAttachmentElement(element)) {\n      attributes = parseTrixDataAttribute(element, \"attachment\")\n      if (Object.keys(attributes).length) {\n        const textAttributes = this.getTextAttributes(element)\n        this.appendAttachmentWithAttributes(attributes, textAttributes)\n        // We have everything we need so avoid processing inner nodes\n        element.innerHTML = \"\"\n      }\n      return this.processedElements.push(element)\n    } else {\n      switch (tagName(element)) {\n        case \"br\":\n          if (!this.isExtraBR(element) && !this.isBlockElement(element.nextSibling)) {\n            this.appendStringWithAttributes(\"\\n\", this.getTextAttributes(element))\n          }\n          return this.processedElements.push(element)\n        case \"img\":\n          attributes = { url: element.getAttribute(\"src\"), contentType: \"image\" }\n          const object = getImageDimensions(element)\n          for (const key in object) {\n            const value = object[key]\n            attributes[key] = value\n          }\n          this.appendAttachmentWithAttributes(attributes, this.getTextAttributes(element))\n          return this.processedElements.push(element)\n        case \"tr\":\n          if (this.needsTableSeparator(element)) {\n            return this.appendStringWithAttributes(config.parser.tableRowSeparator)\n          }\n          break\n        case \"td\":\n          if (this.needsTableSeparator(element)) {\n            return this.appendStringWithAttributes(config.parser.tableCellSeparator)\n          }\n          break\n      }\n    }\n  }\n\n  // Document construction\n\n  appendBlockForAttributesWithElement(attributes, element, htmlAttributes = {}) {\n    this.blockElements.push(element)\n    const block = blockForAttributes(attributes, htmlAttributes)\n    this.blocks.push(block)\n    return block\n  }\n\n  appendEmptyBlock() {\n    return this.appendBlockForAttributesWithElement([], null)\n  }\n\n  appendStringWithAttributes(string, attributes) {\n    return this.appendPiece(pieceForString(string, attributes))\n  }\n\n  appendAttachmentWithAttributes(attachment, attributes) {\n    return this.appendPiece(pieceForAttachment(attachment, attributes))\n  }\n\n  appendPiece(piece) {\n    if (this.blocks.length === 0) {\n      this.appendEmptyBlock()\n    }\n    return this.blocks[this.blocks.length - 1].text.push(piece)\n  }\n\n  appendStringToTextAtIndex(string, index) {\n    const { text } = this.blocks[index]\n    const piece = text[text.length - 1]\n\n    if (piece?.type === \"string\") {\n      piece.string += string\n    } else {\n      return text.push(pieceForString(string))\n    }\n  }\n\n  prependStringToTextAtIndex(string, index) {\n    const { text } = this.blocks[index]\n    const piece = text[0]\n\n    if (piece?.type === \"string\") {\n      piece.string = string + piece.string\n    } else {\n      return text.unshift(pieceForString(string))\n    }\n  }\n\n  // Attribute parsing\n\n  getTextAttributes(element) {\n    let value\n    const attributes = {}\n    for (const attribute in config.textAttributes) {\n      const configAttr = config.textAttributes[attribute]\n      if (\n        configAttr.tagName &&\n        findClosestElementFromNode(element, {\n          matchingSelector: configAttr.tagName,\n          untilNode: this.containerElement,\n        })\n      ) {\n        attributes[attribute] = true\n      } else if (configAttr.parser) {\n        value = configAttr.parser(element)\n        if (value) {\n          let attributeInheritedFromBlock = false\n          for (const blockElement of this.findBlockElementAncestors(element)) {\n            if (configAttr.parser(blockElement) === value) {\n              attributeInheritedFromBlock = true\n              break\n            }\n          }\n          if (!attributeInheritedFromBlock) {\n            attributes[attribute] = value\n          }\n        }\n      } else if (configAttr.styleProperty) {\n        value = element.style[configAttr.styleProperty]\n        if (value) {\n          attributes[attribute] = value\n        }\n      }\n    }\n\n    if (nodeIsAttachmentElement(element)) {\n      const object = parseTrixDataAttribute(element, \"attributes\")\n      for (const key in object) {\n        value = object[key]\n        attributes[key] = value\n      }\n    }\n\n    return attributes\n  }\n\n  getBlockAttributes(element) {\n    const attributes = []\n    while (element && element !== this.containerElement) {\n      for (const attribute in config.blockAttributes) {\n        const attrConfig = config.blockAttributes[attribute]\n        if (attrConfig.parse !== false) {\n          if (tagName(element) === attrConfig.tagName) {\n            if (attrConfig.test?.(element) || !attrConfig.test) {\n              attributes.push(attribute)\n              if (attrConfig.listAttribute) {\n                attributes.push(attrConfig.listAttribute)\n              }\n            }\n          }\n        }\n      }\n      element = element.parentNode\n    }\n    return attributes.reverse()\n  }\n\n  getBlockHTMLAttributes(element) {\n    const attributes = {}\n    const blockConfig = Object.values(config.blockAttributes).find(settings => settings.tagName === tagName(element))\n    const allowedAttributes = blockConfig?.htmlAttributes || []\n\n    allowedAttributes.forEach((attribute) => {\n      if (element.hasAttribute(attribute)) {\n        attributes[attribute] = element.getAttribute(attribute)\n      }\n    })\n\n    return attributes\n  }\n\n  findBlockElementAncestors(element) {\n    const ancestors = []\n    while (element && element !== this.containerElement) {\n      const tag = tagName(element)\n      if (getBlockTagNames().includes(tag)) {\n        ancestors.push(element)\n      }\n      element = element.parentNode\n    }\n    return ancestors\n  }\n\n  // Element inspection\n\n  isBlockElement(element) {\n    if (element?.nodeType !== Node.ELEMENT_NODE) return\n    if (nodeIsAttachmentElement(element)) return\n    if (findClosestElementFromNode(element, { matchingSelector: \"td\", untilNode: this.containerElement })) return\n\n    return getBlockTagNames().includes(tagName(element)) ||\n      window.getComputedStyle(element).display === \"block\"\n  }\n\n  isInsignificantTextNode(node) {\n    if (node?.nodeType !== Node.TEXT_NODE) return\n    if (!stringIsAllBreakableWhitespace(node.data)) return\n    const { parentNode, previousSibling, nextSibling } = node\n    if (nodeEndsWithNonWhitespace(parentNode.previousSibling) && !this.isBlockElement(parentNode.previousSibling)) return\n    if (elementCanDisplayPreformattedText(parentNode)) return\n    return !previousSibling || this.isBlockElement(previousSibling) || !nextSibling || this.isBlockElement(nextSibling)\n  }\n\n  isExtraBR(element) {\n    return tagName(element) === \"br\" && this.isBlockElement(element.parentNode) && element.parentNode.lastChild === element\n  }\n\n  needsTableSeparator(element) {\n    if (config.parser.removeBlankTableCells) {\n      const content = element.previousSibling?.textContent\n      return content && /\\S/.test(content)\n    } else {\n      return element.previousSibling\n    }\n  }\n\n  // Margin translation\n\n  translateBlockElementMarginsToNewlines() {\n    const defaultMargin = this.getMarginOfDefaultBlockElement()\n\n    for (let index = 0; index < this.blocks.length; index++) {\n      const margin = this.getMarginOfBlockElementAtIndex(index)\n      if (margin) {\n        if (margin.top > defaultMargin.top * 2) {\n          this.prependStringToTextAtIndex(\"\\n\", index)\n        }\n\n        if (margin.bottom > defaultMargin.bottom * 2) {\n          this.appendStringToTextAtIndex(\"\\n\", index)\n        }\n      }\n    }\n  }\n\n  getMarginOfBlockElementAtIndex(index) {\n    const element = this.blockElements[index]\n    if (element) {\n      if (element.textContent) {\n        if (!getBlockTagNames().includes(tagName(element)) && !this.processedElements.includes(element)) {\n          return getBlockElementMargin(element)\n        }\n      }\n    }\n  }\n\n  getMarginOfDefaultBlockElement() {\n    const element = makeElement(config.blockAttributes.default.tagName)\n    this.containerElement.appendChild(element)\n    return getBlockElementMargin(element)\n  }\n}\n\n//\u00A0Helpers\n\nconst elementCanDisplayPreformattedText = function(element) {\n  const { whiteSpace } = window.getComputedStyle(element)\n  return [ \"pre\", \"pre-wrap\", \"pre-line\" ].includes(whiteSpace)\n}\n\nconst nodeEndsWithNonWhitespace = (node) => node && !stringEndsWithWhitespace(node.textContent)\n\nconst getBlockElementMargin = function(element) {\n  const style = window.getComputedStyle(element)\n  if (style.display === \"block\") {\n    return { top: parseInt(style.marginTop), bottom: parseInt(style.marginBottom) }\n  }\n}\n\nconst nodeFilter = function(node) {\n  if (tagName(node) === \"style\") {\n    return NodeFilter.FILTER_REJECT\n  } else {\n    return NodeFilter.FILTER_ACCEPT\n  }\n}\n\n// Whitespace\n\nconst leftTrimBreakableWhitespace = (string) => string.replace(new RegExp(`^${breakableWhitespacePattern.source}+`), \"\")\n\nconst stringIsAllBreakableWhitespace = (string) => new RegExp(`^${breakableWhitespacePattern.source}*$`).test(string)\n\nconst stringEndsWithWhitespace = (string) => /\\s$/.test(string)\n", "/* eslint-disable\n    no-empty,\n*/\nimport { removeNode } from \"trix/core/helpers\"\n\nimport DocumentView from \"trix/views/document_view\"\nimport Document from \"trix/models/document\"\nimport HTMLParser from \"trix/models/html_parser\"\n\nconst unserializableElementSelector = \"[data-trix-serialize=false]\"\nconst unserializableAttributeNames = [\n  \"contenteditable\",\n  \"data-trix-id\",\n  \"data-trix-store-key\",\n  \"data-trix-mutable\",\n  \"data-trix-placeholder\",\n  \"tabindex\",\n]\nconst serializedAttributesAttribute = \"data-trix-serialized-attributes\"\nconst serializedAttributesSelector = `[${serializedAttributesAttribute}]`\n\nconst blockCommentPattern = new RegExp(\"<!--block-->\", \"g\")\n\nconst serializers = {\n  \"application/json\": function(serializable) {\n    let document\n    if (serializable instanceof Document) {\n      document = serializable\n    } else if (serializable instanceof HTMLElement) {\n      document = HTMLParser.parse(serializable.innerHTML).getDocument()\n    } else {\n      throw new Error(\"unserializable object\")\n    }\n\n    return document.toSerializableDocument().toJSONString()\n  },\n\n  \"text/html\": function(serializable) {\n    let element\n    if (serializable instanceof Document) {\n      element = DocumentView.render(serializable)\n    } else if (serializable instanceof HTMLElement) {\n      element = serializable.cloneNode(true)\n    } else {\n      throw new Error(\"unserializable object\")\n    }\n\n    // Remove unserializable elements\n    Array.from(element.querySelectorAll(unserializableElementSelector)).forEach((el) => {\n      removeNode(el)\n    })\n\n    // Remove unserializable attributes\n    unserializableAttributeNames.forEach((attribute) => {\n      Array.from(element.querySelectorAll(`[${attribute}]`)).forEach((el) => {\n        el.removeAttribute(attribute)\n      })\n    })\n\n    // Rewrite elements with serialized attribute overrides\n    Array.from(element.querySelectorAll(serializedAttributesSelector)).forEach((el) => {\n      try {\n        const attributes = JSON.parse(el.getAttribute(serializedAttributesAttribute))\n        el.removeAttribute(serializedAttributesAttribute)\n        for (const name in attributes) {\n          const value = attributes[name]\n          el.setAttribute(name, value)\n        }\n      } catch (error) {}\n    })\n\n    return element.innerHTML.replace(blockCommentPattern, \"\")\n  },\n}\n\nconst deserializers = {\n  \"application/json\": function(string) {\n    return Document.fromJSONString(string)\n  },\n\n  \"text/html\": function(string) {\n    return HTMLParser.parse(string).getDocument()\n  },\n}\n\nexport const serializeToContentType = function(serializable, contentType) {\n  const serializer = serializers[contentType]\n  if (serializer) {\n    return serializer(serializable)\n  } else {\n    throw new Error(`unknown content type: ${contentType}`)\n  }\n}\n\nexport const deserializeFromContentType = function(string, contentType) {\n  const deserializer = deserializers[contentType]\n  if (deserializer) {\n    return deserializer(string)\n  } else {\n    throw new Error(`unknown content type: ${contentType}`)\n  }\n}\n", "import \"trix/models/attachment\"\nimport BasicObject from \"trix/core/basic_object\"\n\nexport default class ManagedAttachment extends BasicObject {\n  constructor(attachmentManager, attachment) {\n    super(...arguments)\n    this.attachmentManager = attachmentManager\n    this.attachment = attachment\n    this.id = this.attachment.id\n    this.file = this.attachment.file\n  }\n\n  remove() {\n    return this.attachmentManager.requestRemovalOfAttachment(this.attachment)\n  }\n}\n\nManagedAttachment.proxyMethod(\"attachment.getAttribute\")\nManagedAttachment.proxyMethod(\"attachment.hasAttribute\")\nManagedAttachment.proxyMethod(\"attachment.setAttribute\")\nManagedAttachment.proxyMethod(\"attachment.getAttributes\")\nManagedAttachment.proxyMethod(\"attachment.setAttributes\")\nManagedAttachment.proxyMethod(\"attachment.isPending\")\nManagedAttachment.proxyMethod(\"attachment.isPreviewable\")\nManagedAttachment.proxyMethod(\"attachment.getURL\")\nManagedAttachment.proxyMethod(\"attachment.getHref\")\nManagedAttachment.proxyMethod(\"attachment.getFilename\")\nManagedAttachment.proxyMethod(\"attachment.getFilesize\")\nManagedAttachment.proxyMethod(\"attachment.getFormattedFilesize\")\nManagedAttachment.proxyMethod(\"attachment.getExtension\")\nManagedAttachment.proxyMethod(\"attachment.getContentType\")\nManagedAttachment.proxyMethod(\"attachment.getFile\")\nManagedAttachment.proxyMethod(\"attachment.setFile\")\nManagedAttachment.proxyMethod(\"attachment.releaseFile\")\nManagedAttachment.proxyMethod(\"attachment.getUploadProgress\")\nManagedAttachment.proxyMethod(\"attachment.setUploadProgress\")\n\n", "import ManagedAttachment from \"trix/models/managed_attachment\"\nimport BasicObject from \"trix/core/basic_object\"\n\nexport default class AttachmentManager extends BasicObject {\n  constructor(attachments = []) {\n    super(...arguments)\n    this.managedAttachments = {}\n    Array.from(attachments).forEach((attachment) => {\n      this.manageAttachment(attachment)\n    })\n  }\n\n  getAttachments() {\n    const result = []\n    for (const id in this.managedAttachments) {\n      const attachment = this.managedAttachments[id]\n      result.push(attachment)\n    }\n    return result\n  }\n\n  manageAttachment(attachment) {\n    if (!this.managedAttachments[attachment.id]) {\n      this.managedAttachments[attachment.id] = new ManagedAttachment(this, attachment)\n    }\n    return this.managedAttachments[attachment.id]\n  }\n\n  attachmentIsManaged(attachment) {\n    return attachment.id in this.managedAttachments\n  }\n\n  requestRemovalOfAttachment(attachment) {\n    if (this.attachmentIsManaged(attachment)) {\n      return this.delegate?.attachmentManagerDidRequestRemovalOfAttachment?.(attachment)\n    }\n  }\n\n  unmanageAttachment(attachment) {\n    const managedAttachment = this.managedAttachments[attachment.id]\n    delete this.managedAttachments[attachment.id]\n    return managedAttachment\n  }\n}\n", "export default class LineBreakInsertion {\n  constructor(composition) {\n    this.composition = composition\n    this.document = this.composition.document\n    const selectedRange = this.composition.getSelectedRange()\n    this.startPosition = selectedRange[0]\n    this.endPosition = selectedRange[1]\n\n    this.startLocation = this.document.locationFromPosition(this.startPosition)\n    this.endLocation = this.document.locationFromPosition(this.endPosition)\n\n    this.block = this.document.getBlockAtIndex(this.endLocation.index)\n    this.breaksOnReturn = this.block.breaksOnReturn()\n    this.previousCharacter = this.block.text.getStringAtPosition(this.endLocation.offset - 1)\n    this.nextCharacter = this.block.text.getStringAtPosition(this.endLocation.offset)\n  }\n\n  shouldInsertBlockBreak() {\n    if (this.block.hasAttributes() && this.block.isListItem() && !this.block.isEmpty()) {\n      return this.startLocation.offset !== 0\n    } else {\n      return this.breaksOnReturn && this.nextCharacter !== \"\\n\"\n    }\n  }\n\n  shouldBreakFormattedBlock() {\n    return (\n      this.block.hasAttributes() &&\n      !this.block.isListItem() &&\n      (this.breaksOnReturn && this.nextCharacter === \"\\n\" || this.previousCharacter === \"\\n\")\n    )\n  }\n\n  shouldDecreaseListLevel() {\n    return this.block.hasAttributes() && this.block.isListItem() && this.block.isEmpty()\n  }\n\n  shouldPrependListItem() {\n    return this.block.isListItem() && this.startLocation.offset === 0 && !this.block.isEmpty()\n  }\n\n  shouldRemoveLastBlockAttribute() {\n    return this.block.hasAttributes() && !this.block.isListItem() && this.block.isEmpty()\n  }\n}\n", "import * as config from \"trix/config\"\nimport { OBJECT_REPLACEMENT_CHARACTER } from \"trix/constants\"\n\nimport BasicObject from \"trix/core/basic_object\"\nimport Text from \"trix/models/text\"\nimport Block from \"trix/models/block\"\nimport Attachment from \"trix/models/attachment\"\nimport Document from \"trix/models/document\"\nimport HTMLParser from \"trix/models/html_parser\"\nimport LineBreakInsertion from \"trix/models/line_break_insertion\"\n\nimport {\n  arrayStartsWith,\n  extend,\n  getAllAttributeNames,\n  getBlockConfig,\n  getTextConfig,\n  normalizeRange,\n  objectsAreEqual,\n  rangeIsCollapsed,\n  rangesAreEqual,\n  summarizeArrayChange,\n} from \"trix/core/helpers\"\n\nconst PLACEHOLDER = \" \"\n\nexport default class Composition extends BasicObject {\n  constructor() {\n    super(...arguments)\n    this.document = new Document()\n    this.attachments = []\n    this.currentAttributes = {}\n    this.revision = 0\n  }\n\n  setDocument(document) {\n    if (!document.isEqualTo(this.document)) {\n      this.document = document\n      this.refreshAttachments()\n      this.revision++\n      return this.delegate?.compositionDidChangeDocument?.(document)\n    }\n  }\n\n  // Snapshots\n\n  getSnapshot() {\n    return {\n      document: this.document,\n      selectedRange: this.getSelectedRange(),\n    }\n  }\n\n  loadSnapshot({ document, selectedRange }) {\n    this.delegate?.compositionWillLoadSnapshot?.()\n    this.setDocument(document != null ? document : new Document())\n    this.setSelection(selectedRange != null ? selectedRange : [ 0, 0 ])\n    return this.delegate?.compositionDidLoadSnapshot?.()\n  }\n\n  // Responder protocol\n\n  insertText(text, { updatePosition } = { updatePosition: true }) {\n    const selectedRange = this.getSelectedRange()\n    this.setDocument(this.document.insertTextAtRange(text, selectedRange))\n\n    const startPosition = selectedRange[0]\n    const endPosition = startPosition + text.getLength()\n\n    if (updatePosition) {\n      this.setSelection(endPosition)\n    }\n    return this.notifyDelegateOfInsertionAtRange([ startPosition, endPosition ])\n  }\n\n  insertBlock(block = new Block()) {\n    const document = new Document([ block ])\n    return this.insertDocument(document)\n  }\n\n  insertDocument(document = new Document()) {\n    const selectedRange = this.getSelectedRange()\n    this.setDocument(this.document.insertDocumentAtRange(document, selectedRange))\n\n    const startPosition = selectedRange[0]\n    const endPosition = startPosition + document.getLength()\n\n    this.setSelection(endPosition)\n    return this.notifyDelegateOfInsertionAtRange([ startPosition, endPosition ])\n  }\n\n  insertString(string, options) {\n    const attributes = this.getCurrentTextAttributes()\n    const text = Text.textForStringWithAttributes(string, attributes)\n    return this.insertText(text, options)\n  }\n\n  insertBlockBreak() {\n    const selectedRange = this.getSelectedRange()\n    this.setDocument(this.document.insertBlockBreakAtRange(selectedRange))\n\n    const startPosition = selectedRange[0]\n    const endPosition = startPosition + 1\n\n    this.setSelection(endPosition)\n    return this.notifyDelegateOfInsertionAtRange([ startPosition, endPosition ])\n  }\n\n  insertLineBreak() {\n    const insertion = new LineBreakInsertion(this)\n\n    if (insertion.shouldDecreaseListLevel()) {\n      this.decreaseListLevel()\n      return this.setSelection(insertion.startPosition)\n    } else if (insertion.shouldPrependListItem()) {\n      const document = new Document([ insertion.block.copyWithoutText() ])\n      return this.insertDocument(document)\n    } else if (insertion.shouldInsertBlockBreak()) {\n      return this.insertBlockBreak()\n    } else if (insertion.shouldRemoveLastBlockAttribute()) {\n      return this.removeLastBlockAttribute()\n    } else if (insertion.shouldBreakFormattedBlock()) {\n      return this.breakFormattedBlock(insertion)\n    } else {\n      return this.insertString(\"\\n\")\n    }\n  }\n\n  insertHTML(html) {\n    const document = HTMLParser.parse(html, { purifyOptions: { SAFE_FOR_XML: true } }).getDocument()\n    const selectedRange = this.getSelectedRange()\n\n    this.setDocument(this.document.mergeDocumentAtRange(document, selectedRange))\n\n    const startPosition = selectedRange[0]\n    const endPosition = startPosition + document.getLength() - 1\n\n    this.setSelection(endPosition)\n    return this.notifyDelegateOfInsertionAtRange([ startPosition, endPosition ])\n  }\n\n  replaceHTML(html) {\n    const document = HTMLParser.parse(html).getDocument().copyUsingObjectsFromDocument(this.document)\n    const locationRange = this.getLocationRange({ strict: false })\n    const selectedRange = this.document.rangeFromLocationRange(locationRange)\n    this.setDocument(document)\n    return this.setSelection(selectedRange)\n  }\n\n  insertFile(file) {\n    return this.insertFiles([ file ])\n  }\n\n  insertFiles(files) {\n    const attachments = []\n\n    Array.from(files).forEach((file) => {\n      if (this.delegate?.compositionShouldAcceptFile(file)) {\n        const attachment = Attachment.attachmentForFile(file)\n        attachments.push(attachment)\n      }\n    })\n\n    return this.insertAttachments(attachments)\n  }\n\n  insertAttachment(attachment) {\n    return this.insertAttachments([ attachment ])\n  }\n\n  insertAttachments(attachments) {\n    let text = new Text()\n\n    Array.from(attachments).forEach((attachment) => {\n      const type = attachment.getType()\n      const presentation = config.attachments[type]?.presentation\n\n      const attributes = this.getCurrentTextAttributes()\n      if (presentation) {\n        attributes.presentation = presentation\n      }\n\n      const attachmentText = Text.textForAttachmentWithAttributes(attachment, attributes)\n      text = text.appendText(attachmentText)\n    })\n\n    return this.insertText(text)\n  }\n\n  shouldManageDeletingInDirection(direction) {\n    const locationRange = this.getLocationRange()\n    if (rangeIsCollapsed(locationRange)) {\n      if (direction === \"backward\" && locationRange[0].offset === 0) {\n        return true\n      }\n      if (this.shouldManageMovingCursorInDirection(direction)) {\n        return true\n      }\n    } else {\n      if (locationRange[0].index !== locationRange[1].index) {\n        return true\n      }\n    }\n    return false\n  }\n\n  deleteInDirection(direction, { length } = {}) {\n    let attachment, deletingIntoPreviousBlock, selectionSpansBlocks\n    const locationRange = this.getLocationRange()\n    let range = this.getSelectedRange()\n    const selectionIsCollapsed = rangeIsCollapsed(range)\n\n    if (selectionIsCollapsed) {\n      deletingIntoPreviousBlock = direction === \"backward\" && locationRange[0].offset === 0\n    } else {\n      selectionSpansBlocks = locationRange[0].index !== locationRange[1].index\n    }\n\n    if (deletingIntoPreviousBlock) {\n      if (this.canDecreaseBlockAttributeLevel()) {\n        const block = this.getBlock()\n\n        if (block.isListItem()) {\n          this.decreaseListLevel()\n        } else {\n          this.decreaseBlockAttributeLevel()\n        }\n\n        this.setSelection(range[0])\n        if (block.isEmpty()) {\n          return false\n        }\n      }\n    }\n\n    if (selectionIsCollapsed) {\n      range = this.getExpandedRangeInDirection(direction, { length })\n      if (direction === \"backward\") {\n        attachment = this.getAttachmentAtRange(range)\n      }\n    }\n\n    if (attachment) {\n      this.editAttachment(attachment)\n      return false\n    } else {\n      this.setDocument(this.document.removeTextAtRange(range))\n      this.setSelection(range[0])\n      if (deletingIntoPreviousBlock || selectionSpansBlocks) {\n        return false\n      }\n    }\n  }\n\n  moveTextFromRange(range) {\n    const [ position ] = Array.from(this.getSelectedRange())\n    this.setDocument(this.document.moveTextFromRangeToPosition(range, position))\n    return this.setSelection(position)\n  }\n\n  removeAttachment(attachment) {\n    const range = this.document.getRangeOfAttachment(attachment)\n    if (range) {\n      this.stopEditingAttachment()\n      this.setDocument(this.document.removeTextAtRange(range))\n      return this.setSelection(range[0])\n    }\n  }\n\n  removeLastBlockAttribute() {\n    const [ startPosition, endPosition ] = Array.from(this.getSelectedRange())\n    const block = this.document.getBlockAtPosition(endPosition)\n    this.removeCurrentAttribute(block.getLastAttribute())\n    return this.setSelection(startPosition)\n  }\n\n  insertPlaceholder() {\n    this.placeholderPosition = this.getPosition()\n    return this.insertString(PLACEHOLDER)\n  }\n\n  selectPlaceholder() {\n    if (this.placeholderPosition != null) {\n      this.setSelectedRange([ this.placeholderPosition, this.placeholderPosition + PLACEHOLDER.length ])\n      return this.getSelectedRange()\n    }\n  }\n\n  forgetPlaceholder() {\n    this.placeholderPosition = null\n  }\n\n  // Current attributes\n\n  hasCurrentAttribute(attributeName) {\n    const value = this.currentAttributes[attributeName]\n    return value != null && value !== false\n  }\n\n  toggleCurrentAttribute(attributeName) {\n    const value = !this.currentAttributes[attributeName]\n    if (value) {\n      return this.setCurrentAttribute(attributeName, value)\n    } else {\n      return this.removeCurrentAttribute(attributeName)\n    }\n  }\n\n  canSetCurrentAttribute(attributeName) {\n    if (getBlockConfig(attributeName)) {\n      return this.canSetCurrentBlockAttribute(attributeName)\n    } else {\n      return this.canSetCurrentTextAttribute(attributeName)\n    }\n  }\n\n  canSetCurrentTextAttribute(attributeName) {\n    const document = this.getSelectedDocument()\n    if (!document) return\n    for (const attachment of Array.from(document.getAttachments())) {\n      if (!attachment.hasContent()) {\n        return false\n      }\n    }\n    return true\n  }\n\n  canSetCurrentBlockAttribute(attributeName) {\n    const block = this.getBlock()\n    if (!block) return\n    return !block.isTerminalBlock()\n  }\n\n  setCurrentAttribute(attributeName, value) {\n    if (getBlockConfig(attributeName)) {\n      return this.setBlockAttribute(attributeName, value)\n    } else {\n      this.setTextAttribute(attributeName, value)\n      this.currentAttributes[attributeName] = value\n      return this.notifyDelegateOfCurrentAttributesChange()\n    }\n  }\n\n  setHTMLAtributeAtPosition(position, attributeName, value) {\n    const block = this.document.getBlockAtPosition(position)\n    const allowedHTMLAttributes = getBlockConfig(block.getLastAttribute())?.htmlAttributes\n\n    if (block && allowedHTMLAttributes?.includes(attributeName)) {\n      const newDocument = this.document.setHTMLAttributeAtPosition(position, attributeName, value)\n      this.setDocument(newDocument)\n    }\n  }\n\n  setTextAttribute(attributeName, value) {\n    const selectedRange = this.getSelectedRange()\n    if (!selectedRange) return\n\n    const [ startPosition, endPosition ] = Array.from(selectedRange)\n    if (startPosition === endPosition) {\n      if (attributeName === \"href\") {\n        const text = Text.textForStringWithAttributes(value, { href: value })\n        return this.insertText(text)\n      }\n    } else {\n      return this.setDocument(this.document.addAttributeAtRange(attributeName, value, selectedRange))\n    }\n  }\n\n  setBlockAttribute(attributeName, value) {\n    const selectedRange = this.getSelectedRange()\n    if (this.canSetCurrentAttribute(attributeName)) {\n      this.setDocument(this.document.applyBlockAttributeAtRange(attributeName, value, selectedRange))\n      return this.setSelection(selectedRange)\n    }\n  }\n\n  removeCurrentAttribute(attributeName) {\n    if (getBlockConfig(attributeName)) {\n      this.removeBlockAttribute(attributeName)\n      return this.updateCurrentAttributes()\n    } else {\n      this.removeTextAttribute(attributeName)\n      delete this.currentAttributes[attributeName]\n      return this.notifyDelegateOfCurrentAttributesChange()\n    }\n  }\n\n  removeTextAttribute(attributeName) {\n    const selectedRange = this.getSelectedRange()\n    if (!selectedRange) return\n    return this.setDocument(this.document.removeAttributeAtRange(attributeName, selectedRange))\n  }\n\n  removeBlockAttribute(attributeName) {\n    const selectedRange = this.getSelectedRange()\n    if (!selectedRange) return\n    return this.setDocument(this.document.removeAttributeAtRange(attributeName, selectedRange))\n  }\n\n  canDecreaseNestingLevel() {\n    return this.getBlock()?.getNestingLevel() > 0\n  }\n\n  canIncreaseNestingLevel() {\n    const block = this.getBlock()\n    if (!block) return\n    if (getBlockConfig(block.getLastNestableAttribute())?.listAttribute) {\n      const previousBlock = this.getPreviousBlock()\n      if (previousBlock) {\n        return arrayStartsWith(previousBlock.getListItemAttributes(), block.getListItemAttributes())\n      }\n    } else {\n      return block.getNestingLevel() > 0\n    }\n  }\n\n  decreaseNestingLevel() {\n    const block = this.getBlock()\n    if (!block) return\n    return this.setDocument(this.document.replaceBlock(block, block.decreaseNestingLevel()))\n  }\n\n  increaseNestingLevel() {\n    const block = this.getBlock()\n    if (!block) return\n    return this.setDocument(this.document.replaceBlock(block, block.increaseNestingLevel()))\n  }\n\n  canDecreaseBlockAttributeLevel() {\n    return this.getBlock()?.getAttributeLevel() > 0\n  }\n\n  decreaseBlockAttributeLevel() {\n    const attribute = this.getBlock()?.getLastAttribute()\n    if (attribute) {\n      return this.removeCurrentAttribute(attribute)\n    }\n  }\n\n  decreaseListLevel() {\n    let [ startPosition ] = Array.from(this.getSelectedRange())\n    const { index } = this.document.locationFromPosition(startPosition)\n    let endIndex = index\n    const attributeLevel = this.getBlock().getAttributeLevel()\n\n    let block = this.document.getBlockAtIndex(endIndex + 1)\n    while (block) {\n      if (!block.isListItem() || block.getAttributeLevel() <= attributeLevel) {\n        break\n      }\n      endIndex++\n      block = this.document.getBlockAtIndex(endIndex + 1)\n    }\n\n    startPosition = this.document.positionFromLocation({ index, offset: 0 })\n    const endPosition = this.document.positionFromLocation({ index: endIndex, offset: 0 })\n    return this.setDocument(this.document.removeLastListAttributeAtRange([ startPosition, endPosition ]))\n  }\n\n  updateCurrentAttributes() {\n    const selectedRange = this.getSelectedRange({ ignoreLock: true })\n    if (selectedRange) {\n      const currentAttributes = this.document.getCommonAttributesAtRange(selectedRange)\n\n      Array.from(getAllAttributeNames()).forEach((attributeName) => {\n        if (!currentAttributes[attributeName]) {\n          if (!this.canSetCurrentAttribute(attributeName)) {\n            currentAttributes[attributeName] = false\n          }\n        }\n      })\n\n      if (!objectsAreEqual(currentAttributes, this.currentAttributes)) {\n        this.currentAttributes = currentAttributes\n        return this.notifyDelegateOfCurrentAttributesChange()\n      }\n    }\n  }\n\n  getCurrentAttributes() {\n    return extend.call({}, this.currentAttributes)\n  }\n\n  getCurrentTextAttributes() {\n    const attributes = {}\n    for (const key in this.currentAttributes) {\n      const value = this.currentAttributes[key]\n      if (value !== false) {\n        if (getTextConfig(key)) {\n          attributes[key] = value\n        }\n      }\n    }\n    return attributes\n  }\n\n  // Selection freezing\n\n  freezeSelection() {\n    return this.setCurrentAttribute(\"frozen\", true)\n  }\n\n  thawSelection() {\n    return this.removeCurrentAttribute(\"frozen\")\n  }\n\n  hasFrozenSelection() {\n    return this.hasCurrentAttribute(\"frozen\")\n  }\n\n  setSelection(selectedRange) {\n    const locationRange = this.document.locationRangeFromRange(selectedRange)\n    return this.delegate?.compositionDidRequestChangingSelectionToLocationRange(locationRange)\n  }\n\n  getSelectedRange() {\n    const locationRange = this.getLocationRange()\n    if (locationRange) {\n      return this.document.rangeFromLocationRange(locationRange)\n    }\n  }\n\n  setSelectedRange(selectedRange) {\n    const locationRange = this.document.locationRangeFromRange(selectedRange)\n    return this.getSelectionManager().setLocationRange(locationRange)\n  }\n\n  getPosition() {\n    const locationRange = this.getLocationRange()\n    if (locationRange) {\n      return this.document.positionFromLocation(locationRange[0])\n    }\n  }\n\n  getLocationRange(options) {\n    if (this.targetLocationRange) {\n      return this.targetLocationRange\n    } else {\n      return this.getSelectionManager().getLocationRange(options) || normalizeRange({ index: 0, offset: 0 })\n    }\n  }\n\n  withTargetLocationRange(locationRange, fn) {\n    let result\n    this.targetLocationRange = locationRange\n    try {\n      result = fn()\n    } finally {\n      this.targetLocationRange = null\n    }\n    return result\n  }\n\n  withTargetRange(range, fn) {\n    const locationRange = this.document.locationRangeFromRange(range)\n    return this.withTargetLocationRange(locationRange, fn)\n  }\n\n  withTargetDOMRange(domRange, fn) {\n    const locationRange = this.createLocationRangeFromDOMRange(domRange, { strict: false })\n    return this.withTargetLocationRange(locationRange, fn)\n  }\n\n  getExpandedRangeInDirection(direction, { length } = {}) {\n    let [ startPosition, endPosition ] = Array.from(this.getSelectedRange())\n    if (direction === \"backward\") {\n      if (length) {\n        startPosition -= length\n      } else {\n        startPosition = this.translateUTF16PositionFromOffset(startPosition, -1)\n      }\n    } else {\n      if (length) {\n        endPosition += length\n      } else {\n        endPosition = this.translateUTF16PositionFromOffset(endPosition, 1)\n      }\n    }\n    return normalizeRange([ startPosition, endPosition ])\n  }\n\n  shouldManageMovingCursorInDirection(direction) {\n    if (this.editingAttachment) {\n      return true\n    }\n    const range = this.getExpandedRangeInDirection(direction)\n    return this.getAttachmentAtRange(range) != null\n  }\n\n  moveCursorInDirection(direction) {\n    let canEditAttachment, range\n    if (this.editingAttachment) {\n      range = this.document.getRangeOfAttachment(this.editingAttachment)\n    } else {\n      const selectedRange = this.getSelectedRange()\n      range = this.getExpandedRangeInDirection(direction)\n      canEditAttachment = !rangesAreEqual(selectedRange, range)\n    }\n\n    if (direction === \"backward\") {\n      this.setSelectedRange(range[0])\n    } else {\n      this.setSelectedRange(range[1])\n    }\n\n    if (canEditAttachment) {\n      const attachment = this.getAttachmentAtRange(range)\n      if (attachment) {\n        return this.editAttachment(attachment)\n      }\n    }\n  }\n\n  expandSelectionInDirection(direction, { length } = {}) {\n    const range = this.getExpandedRangeInDirection(direction, { length })\n    return this.setSelectedRange(range)\n  }\n\n  expandSelectionForEditing() {\n    if (this.hasCurrentAttribute(\"href\")) {\n      return this.expandSelectionAroundCommonAttribute(\"href\")\n    }\n  }\n\n  expandSelectionAroundCommonAttribute(attributeName) {\n    const position = this.getPosition()\n    const range = this.document.getRangeOfCommonAttributeAtPosition(attributeName, position)\n    return this.setSelectedRange(range)\n  }\n\n  selectionContainsAttachments() {\n    return this.getSelectedAttachments()?.length > 0\n  }\n\n  selectionIsInCursorTarget() {\n    return this.editingAttachment || this.positionIsCursorTarget(this.getPosition())\n  }\n\n  positionIsCursorTarget(position) {\n    const location = this.document.locationFromPosition(position)\n    if (location) {\n      return this.locationIsCursorTarget(location)\n    }\n  }\n\n  positionIsBlockBreak(position) {\n    return this.document.getPieceAtPosition(position)?.isBlockBreak()\n  }\n\n  getSelectedDocument() {\n    const selectedRange = this.getSelectedRange()\n    if (selectedRange) {\n      return this.document.getDocumentAtRange(selectedRange)\n    }\n  }\n\n  getSelectedAttachments() {\n    return this.getSelectedDocument()?.getAttachments()\n  }\n\n  // Attachments\n\n  getAttachments() {\n    return this.attachments.slice(0)\n  }\n\n  refreshAttachments() {\n    const attachments = this.document.getAttachments()\n    const { added, removed } = summarizeArrayChange(this.attachments, attachments)\n    this.attachments = attachments\n\n    Array.from(removed).forEach((attachment) => {\n      attachment.delegate = null\n      this.delegate?.compositionDidRemoveAttachment?.(attachment)\n    })\n\n    return (() => {\n      const result = []\n\n      Array.from(added).forEach((attachment) => {\n        attachment.delegate = this\n        result.push(this.delegate?.compositionDidAddAttachment?.(attachment))\n      })\n\n      return result\n    })()\n  }\n\n  // Attachment delegate\n\n  attachmentDidChangeAttributes(attachment) {\n    this.revision++\n    return this.delegate?.compositionDidEditAttachment?.(attachment)\n  }\n\n  attachmentDidChangePreviewURL(attachment) {\n    this.revision++\n    return this.delegate?.compositionDidChangeAttachmentPreviewURL?.(attachment)\n  }\n\n  // Attachment editing\n\n  editAttachment(attachment, options) {\n    if (attachment === this.editingAttachment) return\n    this.stopEditingAttachment()\n    this.editingAttachment = attachment\n    return this.delegate?.compositionDidStartEditingAttachment?.(this.editingAttachment, options)\n  }\n\n  stopEditingAttachment() {\n    if (!this.editingAttachment) return\n    this.delegate?.compositionDidStopEditingAttachment?.(this.editingAttachment)\n    this.editingAttachment = null\n  }\n\n  updateAttributesForAttachment(attributes, attachment) {\n    return this.setDocument(this.document.updateAttributesForAttachment(attributes, attachment))\n  }\n\n  removeAttributeForAttachment(attribute, attachment) {\n    return this.setDocument(this.document.removeAttributeForAttachment(attribute, attachment))\n  }\n\n  // Private\n\n  breakFormattedBlock(insertion) {\n    let { document } = insertion\n    const { block } = insertion\n    let position = insertion.startPosition\n    let range = [ position - 1, position ]\n\n    if (block.getBlockBreakPosition() === insertion.startLocation.offset) {\n      if (block.breaksOnReturn() && insertion.nextCharacter === \"\\n\") {\n        position += 1\n      } else {\n        document = document.removeTextAtRange(range)\n      }\n      range = [ position, position ]\n    } else if (insertion.nextCharacter === \"\\n\") {\n      if (insertion.previousCharacter === \"\\n\") {\n        range = [ position - 1, position + 1 ]\n      } else {\n        range = [ position, position + 1 ]\n        position += 1\n      }\n    } else if (insertion.startLocation.offset - 1 !== 0) {\n      position += 1\n    }\n\n    const newDocument = new Document([ block.removeLastAttribute().copyWithoutText() ])\n    this.setDocument(document.insertDocumentAtRange(newDocument, range))\n    return this.setSelection(position)\n  }\n\n  getPreviousBlock() {\n    const locationRange = this.getLocationRange()\n    if (locationRange) {\n      const { index } = locationRange[0]\n      if (index > 0) {\n        return this.document.getBlockAtIndex(index - 1)\n      }\n    }\n  }\n\n  getBlock() {\n    const locationRange = this.getLocationRange()\n    if (locationRange) {\n      return this.document.getBlockAtIndex(locationRange[0].index)\n    }\n  }\n\n  getAttachmentAtRange(range) {\n    const document = this.document.getDocumentAtRange(range)\n    if (document.toString() === `${OBJECT_REPLACEMENT_CHARACTER}\\n`) {\n      return document.getAttachments()[0]\n    }\n  }\n\n  notifyDelegateOfCurrentAttributesChange() {\n    return this.delegate?.compositionDidChangeCurrentAttributes?.(this.currentAttributes)\n  }\n\n  notifyDelegateOfInsertionAtRange(range) {\n    return this.delegate?.compositionDidPerformInsertionAtRange?.(range)\n  }\n\n  translateUTF16PositionFromOffset(position, offset) {\n    const utf16string = this.document.toUTF16String()\n    const utf16position = utf16string.offsetFromUCS2Offset(position)\n    return utf16string.offsetToUCS2Offset(utf16position + offset)\n  }\n}\n\nComposition.proxyMethod(\"getSelectionManager().getPointRange\")\nComposition.proxyMethod(\"getSelectionManager().setLocationRangeFromPointRange\")\nComposition.proxyMethod(\"getSelectionManager().createLocationRangeFromDOMRange\")\nComposition.proxyMethod(\"getSelectionManager().locationIsCursorTarget\")\nComposition.proxyMethod(\"getSelectionManager().selectionIsExpanded\")\nComposition.proxyMethod(\"delegate?.getSelectionManager\")\n", "import BasicObject from \"trix/core/basic_object\"\n\nexport default class UndoManager extends BasicObject {\n  constructor(composition) {\n    super(...arguments)\n    this.composition = composition\n    this.undoEntries = []\n    this.redoEntries = []\n  }\n\n  recordUndoEntry(description, { context, consolidatable } = {}) {\n    const previousEntry = this.undoEntries.slice(-1)[0]\n\n    if (!consolidatable || !entryHasDescriptionAndContext(previousEntry, description, context)) {\n      const undoEntry = this.createEntry({ description, context })\n      this.undoEntries.push(undoEntry)\n      this.redoEntries = []\n    }\n  }\n\n  undo() {\n    const undoEntry = this.undoEntries.pop()\n    if (undoEntry) {\n      const redoEntry = this.createEntry(undoEntry)\n      this.redoEntries.push(redoEntry)\n      return this.composition.loadSnapshot(undoEntry.snapshot)\n    }\n  }\n\n  redo() {\n    const redoEntry = this.redoEntries.pop()\n    if (redoEntry) {\n      const undoEntry = this.createEntry(redoEntry)\n      this.undoEntries.push(undoEntry)\n      return this.composition.loadSnapshot(redoEntry.snapshot)\n    }\n  }\n\n  canUndo() {\n    return this.undoEntries.length > 0\n  }\n\n  canRedo() {\n    return this.redoEntries.length > 0\n  }\n\n  // Private\n\n  createEntry({ description, context } = {}) {\n    return {\n      description: description?.toString(),\n      context: JSON.stringify(context),\n      snapshot: this.composition.getSnapshot(),\n    }\n  }\n}\n\nconst entryHasDescriptionAndContext = (entry, description, context) =>\n  entry?.description === description?.toString() && entry?.context === JSON.stringify(context)\n", "const BLOCK_ATTRIBUTE_NAME = \"attachmentGallery\"\nconst TEXT_ATTRIBUTE_NAME = \"presentation\"\nconst TEXT_ATTRIBUTE_VALUE = \"gallery\"\n\nexport default class Filter {\n  constructor(snapshot) {\n    this.document = snapshot.document\n    this.selectedRange = snapshot.selectedRange\n  }\n\n  perform() {\n    this.removeBlockAttribute()\n    return this.applyBlockAttribute()\n  }\n\n  getSnapshot() {\n    return { document: this.document, selectedRange: this.selectedRange }\n  }\n\n  // Private\n\n  removeBlockAttribute() {\n    return this.findRangesOfBlocks().map((range) => this.document = this.document.removeAttributeAtRange(BLOCK_ATTRIBUTE_NAME, range))\n  }\n\n  applyBlockAttribute() {\n    let offset = 0\n\n    this.findRangesOfPieces().forEach((range) => {\n      if (range[1] - range[0] > 1) {\n        range[0] += offset\n        range[1] += offset\n\n        if (this.document.getCharacterAtPosition(range[1]) !== \"\\n\") {\n          this.document = this.document.insertBlockBreakAtRange(range[1])\n          if (range[1] < this.selectedRange[1]) {\n            this.moveSelectedRangeForward()\n          }\n          range[1]++\n          offset++\n        }\n\n        if (range[0] !== 0) {\n          if (this.document.getCharacterAtPosition(range[0] - 1) !== \"\\n\") {\n            this.document = this.document.insertBlockBreakAtRange(range[0])\n            if (range[0] < this.selectedRange[0]) {\n              this.moveSelectedRangeForward()\n            }\n            range[0]++\n            offset++\n          }\n        }\n\n        this.document = this.document.applyBlockAttributeAtRange(BLOCK_ATTRIBUTE_NAME, true, range)\n      }\n    })\n  }\n\n  findRangesOfBlocks() {\n    return this.document.findRangesForBlockAttribute(BLOCK_ATTRIBUTE_NAME)\n  }\n\n  findRangesOfPieces() {\n    return this.document.findRangesForTextAttribute(TEXT_ATTRIBUTE_NAME, { withValue: TEXT_ATTRIBUTE_VALUE })\n  }\n\n  moveSelectedRangeForward() {\n    this.selectedRange[0] += 1\n    this.selectedRange[1] += 1\n  }\n}\n", "import Filter from \"./filter\"\n\nexport const attachmentGalleryFilter = function(snapshot) {\n  const filter = new Filter(snapshot)\n  filter.perform()\n  return filter.getSnapshot()\n}\n\n", "import Document from \"trix/models/document\"\nimport HTMLParser from \"trix/models/html_parser\"\n\nimport UndoManager from \"trix/models/undo_manager\"\nimport { attachmentGalleryFilter } from \"trix/filters/attachment_gallery_filter\"\nconst DEFAULT_FILTERS = [ attachmentGalleryFilter ]\n\nexport default class Editor {\n  constructor(composition, selectionManager, element) {\n    this.insertFiles = this.insertFiles.bind(this)\n    this.composition = composition\n    this.selectionManager = selectionManager\n    this.element = element\n    this.undoManager = new UndoManager(this.composition)\n    this.filters = DEFAULT_FILTERS.slice(0)\n  }\n\n  loadDocument(document) {\n    return this.loadSnapshot({ document, selectedRange: [ 0, 0 ] })\n  }\n\n  loadHTML(html = \"\") {\n    const document = HTMLParser.parse(html, { referenceElement: this.element }).getDocument()\n    return this.loadDocument(document)\n  }\n\n  loadJSON({ document, selectedRange }) {\n    document = Document.fromJSON(document)\n    return this.loadSnapshot({ document, selectedRange })\n  }\n\n  loadSnapshot(snapshot) {\n    this.undoManager = new UndoManager(this.composition)\n    return this.composition.loadSnapshot(snapshot)\n  }\n\n  getDocument() {\n    return this.composition.document\n  }\n\n  getSelectedDocument() {\n    return this.composition.getSelectedDocument()\n  }\n\n  getSnapshot() {\n    return this.composition.getSnapshot()\n  }\n\n  toJSON() {\n    return this.getSnapshot()\n  }\n\n  // Document manipulation\n\n  deleteInDirection(direction) {\n    return this.composition.deleteInDirection(direction)\n  }\n\n  insertAttachment(attachment) {\n    return this.composition.insertAttachment(attachment)\n  }\n\n  insertAttachments(attachments) {\n    return this.composition.insertAttachments(attachments)\n  }\n\n  insertDocument(document) {\n    return this.composition.insertDocument(document)\n  }\n\n  insertFile(file) {\n    return this.composition.insertFile(file)\n  }\n\n  insertFiles(files) {\n    return this.composition.insertFiles(files)\n  }\n\n  insertHTML(html) {\n    return this.composition.insertHTML(html)\n  }\n\n  insertString(string) {\n    return this.composition.insertString(string)\n  }\n\n  insertText(text) {\n    return this.composition.insertText(text)\n  }\n\n  insertLineBreak() {\n    return this.composition.insertLineBreak()\n  }\n\n  // Selection\n\n  getSelectedRange() {\n    return this.composition.getSelectedRange()\n  }\n\n  getPosition() {\n    return this.composition.getPosition()\n  }\n\n  getClientRectAtPosition(position) {\n    const locationRange = this.getDocument().locationRangeFromRange([ position, position + 1 ])\n    return this.selectionManager.getClientRectAtLocationRange(locationRange)\n  }\n\n  expandSelectionInDirection(direction) {\n    return this.composition.expandSelectionInDirection(direction)\n  }\n\n  moveCursorInDirection(direction) {\n    return this.composition.moveCursorInDirection(direction)\n  }\n\n  setSelectedRange(selectedRange) {\n    return this.composition.setSelectedRange(selectedRange)\n  }\n\n  // Attributes\n\n  activateAttribute(name, value = true) {\n    return this.composition.setCurrentAttribute(name, value)\n  }\n\n  attributeIsActive(name) {\n    return this.composition.hasCurrentAttribute(name)\n  }\n\n  canActivateAttribute(name) {\n    return this.composition.canSetCurrentAttribute(name)\n  }\n\n  deactivateAttribute(name) {\n    return this.composition.removeCurrentAttribute(name)\n  }\n\n  // HTML attributes\n  setHTMLAtributeAtPosition(position, name, value) {\n    this.composition.setHTMLAtributeAtPosition(position, name, value)\n  }\n\n  // Nesting level\n\n  canDecreaseNestingLevel() {\n    return this.composition.canDecreaseNestingLevel()\n  }\n\n  canIncreaseNestingLevel() {\n    return this.composition.canIncreaseNestingLevel()\n  }\n\n  decreaseNestingLevel() {\n    if (this.canDecreaseNestingLevel()) {\n      return this.composition.decreaseNestingLevel()\n    }\n  }\n\n  increaseNestingLevel() {\n    if (this.canIncreaseNestingLevel()) {\n      return this.composition.increaseNestingLevel()\n    }\n  }\n\n  // Undo/redo\n\n  canRedo() {\n    return this.undoManager.canRedo()\n  }\n\n  canUndo() {\n    return this.undoManager.canUndo()\n  }\n\n  recordUndoEntry(description, { context, consolidatable } = {}) {\n    return this.undoManager.recordUndoEntry(description, { context, consolidatable })\n  }\n\n  redo() {\n    if (this.canRedo()) {\n      return this.undoManager.redo()\n    }\n  }\n\n  undo() {\n    if (this.canUndo()) {\n      return this.undoManager.undo()\n    }\n  }\n}\n", "/* eslint-disable\n    no-var,\n    prefer-const,\n*/\nimport {\n  elementContainsNode,\n  findChildIndexOfNode,\n  nodeIsAttachmentElement,\n  nodeIsBlockContainer,\n  nodeIsBlockStart,\n  nodeIsBlockStartComment,\n  nodeIsCursorTarget,\n  nodeIsEmptyTextNode,\n  nodeIsTextNode,\n  tagName,\n  walkTree,\n} from \"trix/core/helpers\"\n\nexport default class LocationMapper {\n  constructor(element) {\n    this.element = element\n  }\n\n  findLocationFromContainerAndOffset(container, offset, { strict } = { strict: true }) {\n    let childIndex = 0\n    let foundBlock = false\n    const location = { index: 0, offset: 0 }\n    const attachmentElement = this.findAttachmentElementParentForNode(container)\n\n    if (attachmentElement) {\n      container = attachmentElement.parentNode\n      offset = findChildIndexOfNode(attachmentElement)\n    }\n\n    const walker = walkTree(this.element, { usingFilter: rejectAttachmentContents })\n\n    while (walker.nextNode()) {\n      const node = walker.currentNode\n\n      if (node === container && nodeIsTextNode(container)) {\n        if (!nodeIsCursorTarget(node)) {\n          location.offset += offset\n        }\n        break\n      } else {\n        if (node.parentNode === container) {\n          if (childIndex++ === offset) {\n            break\n          }\n        } else if (!elementContainsNode(container, node)) {\n          if (childIndex > 0) {\n            break\n          }\n        }\n\n        if (nodeIsBlockStart(node, { strict })) {\n          if (foundBlock) {\n            location.index++\n          }\n          location.offset = 0\n          foundBlock = true\n        } else {\n          location.offset += nodeLength(node)\n        }\n      }\n    }\n\n    return location\n  }\n\n  findContainerAndOffsetFromLocation(location) {\n    let container, offset\n    if (location.index === 0 && location.offset === 0) {\n      container = this.element\n      offset = 0\n\n      while (container.firstChild) {\n        container = container.firstChild\n        if (nodeIsBlockContainer(container)) {\n          offset = 1\n          break\n        }\n      }\n\n      return [ container, offset ]\n    }\n\n    let [ node, nodeOffset ] = this.findNodeAndOffsetFromLocation(location)\n    if (!node) return\n\n    if (nodeIsTextNode(node)) {\n      if (nodeLength(node) === 0) {\n        container = node.parentNode.parentNode\n        offset = findChildIndexOfNode(node.parentNode)\n        if (nodeIsCursorTarget(node, { name: \"right\" })) {\n          offset++\n        }\n      } else {\n        container = node\n        offset = location.offset - nodeOffset\n      }\n    } else {\n      container = node.parentNode\n\n      if (!nodeIsBlockStart(node.previousSibling)) {\n        if (!nodeIsBlockContainer(container)) {\n          while (node === container.lastChild) {\n            node = container\n            container = container.parentNode\n            if (nodeIsBlockContainer(container)) {\n              break\n            }\n          }\n        }\n      }\n\n      offset = findChildIndexOfNode(node)\n      if (location.offset !== 0) {\n        offset++\n      }\n    }\n\n    return [ container, offset ]\n  }\n\n  findNodeAndOffsetFromLocation(location) {\n    let node, nodeOffset\n    let offset = 0\n\n    for (const currentNode of this.getSignificantNodesForIndex(location.index)) {\n      const length = nodeLength(currentNode)\n\n      if (location.offset <= offset + length) {\n        if (nodeIsTextNode(currentNode)) {\n          node = currentNode\n          nodeOffset = offset\n          if (location.offset === nodeOffset && nodeIsCursorTarget(node)) {\n            break\n          }\n        } else if (!node) {\n          node = currentNode\n          nodeOffset = offset\n        }\n      }\n\n      offset += length\n      if (offset > location.offset) {\n        break\n      }\n    }\n\n    return [ node, nodeOffset ]\n  }\n\n  // Private\n\n  findAttachmentElementParentForNode(node) {\n    while (node && node !== this.element) {\n      if (nodeIsAttachmentElement(node)) {\n        return node\n      }\n      node = node.parentNode\n    }\n  }\n\n  getSignificantNodesForIndex(index) {\n    const nodes = []\n    const walker = walkTree(this.element, { usingFilter: acceptSignificantNodes })\n    let recordingNodes = false\n\n    while (walker.nextNode()) {\n      const node = walker.currentNode\n      if (nodeIsBlockStartComment(node)) {\n        var blockIndex\n        if (blockIndex != null) {\n          blockIndex++\n        } else {\n          blockIndex = 0\n        }\n\n        if (blockIndex === index) {\n          recordingNodes = true\n        } else if (recordingNodes) {\n          break\n        }\n      } else if (recordingNodes) {\n        nodes.push(node)\n      }\n    }\n\n    return nodes\n  }\n}\n\nconst nodeLength = function(node) {\n  if (node.nodeType === Node.TEXT_NODE) {\n    if (nodeIsCursorTarget(node)) {\n      return 0\n    } else {\n      const string = node.textContent\n      return string.length\n    }\n  } else if (tagName(node) === \"br\" || nodeIsAttachmentElement(node)) {\n    return 1\n  } else {\n    return 0\n  }\n}\n\nconst acceptSignificantNodes = function(node) {\n  if (rejectEmptyTextNodes(node) === NodeFilter.FILTER_ACCEPT) {\n    return rejectAttachmentContents(node)\n  } else {\n    return NodeFilter.FILTER_REJECT\n  }\n}\n\nconst rejectEmptyTextNodes = function(node) {\n  if (nodeIsEmptyTextNode(node)) {\n    return NodeFilter.FILTER_REJECT\n  } else {\n    return NodeFilter.FILTER_ACCEPT\n  }\n}\n\nconst rejectAttachmentContents = function(node) {\n  if (nodeIsAttachmentElement(node.parentNode)) {\n    return NodeFilter.FILTER_REJECT\n  } else {\n    return NodeFilter.FILTER_ACCEPT\n  }\n}\n", "/* eslint-disable\n    id-length,\n    no-empty,\n*/\nimport { getDOMRange, setDOMRange } from \"trix/core/helpers\"\n\nexport default class PointMapper {\n  createDOMRangeFromPoint({ x, y }) {\n    let domRange\n    if (document.caretPositionFromPoint) {\n      const { offsetNode, offset } = document.caretPositionFromPoint(x, y)\n      domRange = document.createRange()\n      domRange.setStart(offsetNode, offset)\n      return domRange\n    } else if (document.caretRangeFromPoint) {\n      return document.caretRangeFromPoint(x, y)\n    } else if (document.body.createTextRange) {\n      const originalDOMRange = getDOMRange()\n      try {\n        // IE 11 throws \"Unspecified error\" when using moveToPoint\n        // during a drag-and-drop operation.\n        const textRange = document.body.createTextRange()\n        textRange.moveToPoint(x, y)\n        textRange.select()\n      } catch (error) {}\n      domRange = getDOMRange()\n      setDOMRange(originalDOMRange)\n      return domRange\n    }\n  }\n\n  getClientRectsForDOMRange(domRange) {\n    const array = Array.from(domRange.getClientRects())\n    const start = array[0]\n    const end = array[array.length - 1]\n\n    return [ start, end ]\n  }\n}\n", "/* eslint-disable\n*/\nimport BasicObject from \"trix/core/basic_object\"\n\nimport LocationMapper from \"trix/models/location_mapper\"\nimport PointMapper from \"trix/models/point_mapper\"\n\nimport {\n  elementContainsNode,\n  getDOMRange,\n  getDOMSelection,\n  handleEvent,\n  innerElementIsActive,\n  nodeIsCursorTarget,\n  normalizeRange,\n  rangeIsCollapsed,\n  rangesAreEqual,\n  setDOMRange,\n} from \"trix/core/helpers\"\n\nexport default class SelectionManager extends BasicObject {\n  constructor(element) {\n    super(...arguments)\n    this.didMouseDown = this.didMouseDown.bind(this)\n    this.selectionDidChange = this.selectionDidChange.bind(this)\n    this.element = element\n    this.locationMapper = new LocationMapper(this.element)\n    this.pointMapper = new PointMapper()\n    this.lockCount = 0\n    handleEvent(\"mousedown\", { onElement: this.element, withCallback: this.didMouseDown })\n  }\n\n  getLocationRange(options = {}) {\n    if (options.strict === false) {\n      return this.createLocationRangeFromDOMRange(getDOMRange())\n    } else if (options.ignoreLock) {\n      return this.currentLocationRange\n    } else if (this.lockedLocationRange) {\n      return this.lockedLocationRange\n    } else {\n      return this.currentLocationRange\n    }\n  }\n\n  setLocationRange(locationRange) {\n    if (this.lockedLocationRange) return\n    locationRange = normalizeRange(locationRange)\n\n    const domRange = this.createDOMRangeFromLocationRange(locationRange)\n    if (domRange) {\n      setDOMRange(domRange)\n      this.updateCurrentLocationRange(locationRange)\n    }\n  }\n\n  setLocationRangeFromPointRange(pointRange) {\n    pointRange = normalizeRange(pointRange)\n    const startLocation = this.getLocationAtPoint(pointRange[0])\n    const endLocation = this.getLocationAtPoint(pointRange[1])\n    this.setLocationRange([ startLocation, endLocation ])\n  }\n\n  getClientRectAtLocationRange(locationRange) {\n    const domRange = this.createDOMRangeFromLocationRange(locationRange)\n    if (domRange) {\n      return this.getClientRectsForDOMRange(domRange)[1]\n    }\n  }\n\n  locationIsCursorTarget(location) {\n    const node = Array.from(this.findNodeAndOffsetFromLocation(location))[0]\n    return nodeIsCursorTarget(node)\n  }\n\n  lock() {\n    if (this.lockCount++ === 0) {\n      this.updateCurrentLocationRange()\n      this.lockedLocationRange = this.getLocationRange()\n    }\n  }\n\n  unlock() {\n    if (--this.lockCount === 0) {\n      const { lockedLocationRange } = this\n      this.lockedLocationRange = null\n      if (lockedLocationRange != null) {\n        return this.setLocationRange(lockedLocationRange)\n      }\n    }\n  }\n\n  clearSelection() {\n    return getDOMSelection()?.removeAllRanges()\n  }\n\n  selectionIsCollapsed() {\n    return getDOMRange()?.collapsed === true\n  }\n\n  selectionIsExpanded() {\n    return !this.selectionIsCollapsed()\n  }\n\n  createLocationRangeFromDOMRange(domRange, options) {\n    if (domRange == null || !this.domRangeWithinElement(domRange)) return\n\n    const start = this.findLocationFromContainerAndOffset(domRange.startContainer, domRange.startOffset, options)\n    if (!start) return\n\n    const end = domRange.collapsed\n      ? undefined\n      : this.findLocationFromContainerAndOffset(domRange.endContainer, domRange.endOffset, options)\n\n    return normalizeRange([ start, end ])\n  }\n\n  didMouseDown() {\n    return this.pauseTemporarily()\n  }\n\n  pauseTemporarily() {\n    let resumeHandlers\n    this.paused = true\n\n    const resume = () => {\n      this.paused = false\n      clearTimeout(resumeTimeout)\n\n      Array.from(resumeHandlers).forEach((handler) => {\n        handler.destroy()\n      })\n\n      if (elementContainsNode(document, this.element)) {\n        return this.selectionDidChange()\n      }\n    }\n\n    const resumeTimeout = setTimeout(resume, 200)\n\n    resumeHandlers = [ \"mousemove\", \"keydown\" ].map((eventName) =>\n      handleEvent(eventName, { onElement: document, withCallback: resume })\n    )\n  }\n\n  selectionDidChange() {\n    if (!this.paused && !innerElementIsActive(this.element)) {\n      return this.updateCurrentLocationRange()\n    }\n  }\n\n  updateCurrentLocationRange(locationRange) {\n    if (locationRange != null ? locationRange : locationRange = this.createLocationRangeFromDOMRange(getDOMRange())) {\n      if (!rangesAreEqual(locationRange, this.currentLocationRange)) {\n        this.currentLocationRange = locationRange\n        return this.delegate?.locationRangeDidChange?.(this.currentLocationRange.slice(0))\n      }\n    }\n  }\n\n  createDOMRangeFromLocationRange(locationRange) {\n    const rangeStart = this.findContainerAndOffsetFromLocation(locationRange[0])\n    const rangeEnd = rangeIsCollapsed(locationRange)\n      ? rangeStart\n      : this.findContainerAndOffsetFromLocation(locationRange[1]) || rangeStart\n\n    if (rangeStart != null && rangeEnd != null) {\n      const domRange = document.createRange()\n      domRange.setStart(...Array.from(rangeStart || []))\n      domRange.setEnd(...Array.from(rangeEnd || []))\n      return domRange\n    }\n  }\n\n  getLocationAtPoint(point) {\n    const domRange = this.createDOMRangeFromPoint(point)\n    if (domRange) {\n      return this.createLocationRangeFromDOMRange(domRange)?.[0]\n    }\n  }\n\n  domRangeWithinElement(domRange) {\n    if (domRange.collapsed) {\n      return elementContainsNode(this.element, domRange.startContainer)\n    } else {\n      return (\n        elementContainsNode(this.element, domRange.startContainer) &&\n        elementContainsNode(this.element, domRange.endContainer)\n      )\n    }\n  }\n}\n\nSelectionManager.proxyMethod(\"locationMapper.findLocationFromContainerAndOffset\")\nSelectionManager.proxyMethod(\"locationMapper.findContainerAndOffsetFromLocation\")\nSelectionManager.proxyMethod(\"locationMapper.findNodeAndOffsetFromLocation\")\nSelectionManager.proxyMethod(\"pointMapper.createDOMRangeFromPoint\")\nSelectionManager.proxyMethod(\"pointMapper.getClientRectsForDOMRange\")\n\n", "import { removeNode } from \"trix/core/helpers\"\n\nimport * as config from \"trix/config\"\nimport BasicObject from \"trix/core/basic_object\"\n\nimport { defer, handleEvent, makeElement, tagName, triggerEvent } from \"trix/core/helpers\"\nconst { lang, css, keyNames } = config\n\nconst undoable = function(fn) {\n  return function() {\n    const commands = fn.apply(this, arguments)\n    commands.do()\n    if (!this.undos) {\n      this.undos = []\n    }\n    this.undos.push(commands.undo)\n  }\n}\n\nexport default class AttachmentEditorController extends BasicObject {\n  constructor(attachmentPiece, element, container, options = {}) {\n    super(...arguments)\n    this.didClickToolbar = this.didClickToolbar.bind(this)\n    this.didClickActionButton = this.didClickActionButton.bind(this)\n    this.didKeyDownCaption = this.didKeyDownCaption.bind(this)\n    this.didInputCaption = this.didInputCaption.bind(this)\n    this.didChangeCaption = this.didChangeCaption.bind(this)\n    this.didBlurCaption = this.didBlurCaption.bind(this)\n    this.attachmentPiece = attachmentPiece\n    this.element = element\n    this.container = container\n    this.options = options\n    this.attachment = this.attachmentPiece.attachment\n    if (tagName(this.element) === \"a\") {\n      this.element = this.element.firstChild\n    }\n    this.install()\n  }\n\n  install() {\n    this.makeElementMutable()\n    this.addToolbar()\n    if (this.attachment.isPreviewable()) {\n      this.installCaptionEditor()\n    }\n  }\n\n  uninstall() {\n    let undo = this.undos.pop()\n    this.savePendingCaption()\n    while (undo) {\n      undo()\n      undo = this.undos.pop()\n    }\n    this.delegate?.didUninstallAttachmentEditor(this)\n  }\n\n  // Private\n\n  savePendingCaption() {\n    if (this.pendingCaption != null) {\n      const caption = this.pendingCaption\n      this.pendingCaption = null\n      if (caption) {\n        this.delegate?.attachmentEditorDidRequestUpdatingAttributesForAttachment?.({ caption }, this.attachment)\n      } else {\n        this.delegate?.attachmentEditorDidRequestRemovingAttributeForAttachment?.(\"caption\", this.attachment)\n      }\n    }\n  }\n\n  // Installing and uninstalling\n\n  makeElementMutable = undoable(() => {\n    return {\n      do: () => {\n        this.element.dataset.trixMutable = true\n      },\n      undo: () => delete this.element.dataset.trixMutable,\n    }\n  })\n\n  addToolbar = undoable(() => {\n    // <div class=\"#{css.attachmentMetadataContainer}\" data-trix-mutable=\"true\">\n    //   <div class=\"trix-button-row\">\n    //     <span class=\"trix-button-group trix-button-group--actions\">\n    //       <button type=\"button\" class=\"trix-button trix-button--remove\" title=\"#{lang.remove}\" data-trix-action=\"remove\">#{lang.remove}</button>\n    //     </span>\n    //   </div>\n    // </div>\n    const element = makeElement({\n      tagName: \"div\",\n      className: css.attachmentToolbar,\n      data: { trixMutable: true },\n      childNodes: makeElement({\n        tagName: \"div\",\n        className: \"trix-button-row\",\n        childNodes: makeElement({\n          tagName: \"span\",\n          className: \"trix-button-group trix-button-group--actions\",\n          childNodes: makeElement({\n            tagName: \"button\",\n            className: \"trix-button trix-button--remove\",\n            textContent: lang.remove,\n            attributes: { title: lang.remove },\n            data: { trixAction: \"remove\" },\n          }),\n        }),\n      }),\n    })\n\n    if (this.attachment.isPreviewable()) {\n      // <div class=\"#{css.attachmentMetadataContainer}\">\n      //   <span class=\"#{css.attachmentMetadata}\">\n      //     <span class=\"#{css.attachmentName}\" title=\"#{name}\">#{name}</span>\n      //     <span class=\"#{css.attachmentSize}\">#{size}</span>\n      //   </span>\n      // </div>\n      element.appendChild(\n        makeElement({\n          tagName: \"div\",\n          className: css.attachmentMetadataContainer,\n          childNodes: makeElement({\n            tagName: \"span\",\n            className: css.attachmentMetadata,\n            childNodes: [\n              makeElement({\n                tagName: \"span\",\n                className: css.attachmentName,\n                textContent: this.attachment.getFilename(),\n                attributes: { title: this.attachment.getFilename() },\n              }),\n              makeElement({\n                tagName: \"span\",\n                className: css.attachmentSize,\n                textContent: this.attachment.getFormattedFilesize(),\n              }),\n            ],\n          }),\n        })\n      )\n    }\n\n    handleEvent(\"click\", { onElement: element, withCallback: this.didClickToolbar })\n    handleEvent(\"click\", {\n      onElement: element,\n      matchingSelector: \"[data-trix-action]\",\n      withCallback: this.didClickActionButton,\n    })\n\n    triggerEvent(\"trix-attachment-before-toolbar\", { onElement: this.element, attributes: { toolbar: element, attachment: this.attachment } })\n\n    return {\n      do: () => this.element.appendChild(element),\n      undo: () => removeNode(element),\n    }\n  })\n\n  installCaptionEditor = undoable(() => {\n    const textarea = makeElement({\n      tagName: \"textarea\",\n      className: css.attachmentCaptionEditor,\n      attributes: { placeholder: lang.captionPlaceholder },\n      data: { trixMutable: true },\n    })\n    textarea.value = this.attachmentPiece.getCaption()\n\n    const textareaClone = textarea.cloneNode()\n    textareaClone.classList.add(\"trix-autoresize-clone\")\n    textareaClone.tabIndex = -1\n\n    const autoresize = function() {\n      textareaClone.value = textarea.value\n      textarea.style.height = textareaClone.scrollHeight + \"px\"\n    }\n\n    handleEvent(\"input\", { onElement: textarea, withCallback: autoresize })\n    handleEvent(\"input\", { onElement: textarea, withCallback: this.didInputCaption })\n    handleEvent(\"keydown\", { onElement: textarea, withCallback: this.didKeyDownCaption })\n    handleEvent(\"change\", { onElement: textarea, withCallback: this.didChangeCaption })\n    handleEvent(\"blur\", { onElement: textarea, withCallback: this.didBlurCaption })\n\n    const figcaption = this.element.querySelector(\"figcaption\")\n    const editingFigcaption = figcaption.cloneNode()\n\n    return {\n      do: () => {\n        figcaption.style.display = \"none\"\n        editingFigcaption.appendChild(textarea)\n        editingFigcaption.appendChild(textareaClone)\n        editingFigcaption.classList.add(`${css.attachmentCaption}--editing`)\n        figcaption.parentElement.insertBefore(editingFigcaption, figcaption)\n        autoresize()\n        if (this.options.editCaption) {\n          return defer(() => textarea.focus())\n        }\n      },\n      undo() {\n        removeNode(editingFigcaption)\n        figcaption.style.display = null\n      },\n    }\n  })\n\n  // Event handlers\n\n  didClickToolbar(event) {\n    event.preventDefault()\n    return event.stopPropagation()\n  }\n\n  didClickActionButton(event) {\n    const action = event.target.getAttribute(\"data-trix-action\")\n    switch (action) {\n      case \"remove\":\n        return this.delegate?.attachmentEditorDidRequestRemovalOfAttachment(this.attachment)\n    }\n  }\n\n  didKeyDownCaption(event) {\n    if (keyNames[event.keyCode] === \"return\") {\n      event.preventDefault()\n      this.savePendingCaption()\n      return this.delegate?.attachmentEditorDidRequestDeselectingAttachment?.(this.attachment)\n    }\n  }\n\n  didInputCaption(event) {\n    this.pendingCaption = event.target.value.replace(/\\s/g, \" \").trim()\n  }\n\n  didChangeCaption(event) {\n    return this.savePendingCaption()\n  }\n\n  didBlurCaption(event) {\n    return this.savePendingCaption()\n  }\n}\n", "import BasicObject from \"trix/core/basic_object\"\nimport DocumentView from \"trix/views/document_view\"\nimport AttachmentEditorController from \"trix/controllers/attachment_editor_controller\"\n\nimport { defer, findClosestElementFromNode, handleEvent, innerElementIsActive } from \"trix/core/helpers\"\nimport { attachmentSelector } from \"trix/config/attachments\"\n\nexport default class CompositionController extends BasicObject {\n  constructor(element, composition) {\n    super(...arguments)\n    this.didFocus = this.didFocus.bind(this)\n    this.didBlur = this.didBlur.bind(this)\n    this.didClickAttachment = this.didClickAttachment.bind(this)\n\n    this.element = element\n    this.composition = composition\n    this.documentView = new DocumentView(this.composition.document, { element: this.element })\n\n    handleEvent(\"focus\", { onElement: this.element, withCallback: this.didFocus })\n    handleEvent(\"blur\", { onElement: this.element, withCallback: this.didBlur })\n    handleEvent(\"click\", {\n      onElement: this.element,\n      matchingSelector: \"a[contenteditable=false]\",\n      preventDefault: true,\n    })\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      matchingSelector: attachmentSelector,\n      withCallback: this.didClickAttachment,\n    })\n    handleEvent(\"click\", { onElement: this.element, matchingSelector: `a${attachmentSelector}`, preventDefault: true })\n  }\n\n  didFocus(event) {\n    const perform = () => {\n      if (!this.focused) {\n        this.focused = true\n        return this.delegate?.compositionControllerDidFocus?.()\n      }\n    }\n\n    return this.blurPromise?.then(perform) || perform()\n  }\n\n  didBlur(event) {\n    this.blurPromise = new Promise((resolve) => {\n      return defer(() => {\n        if (!innerElementIsActive(this.element)) {\n          this.focused = null\n          this.delegate?.compositionControllerDidBlur?.()\n        }\n        this.blurPromise = null\n        return resolve()\n      })\n    })\n  }\n\n  didClickAttachment(event, target) {\n    const attachment = this.findAttachmentForElement(target)\n    const editCaption = !!findClosestElementFromNode(event.target, { matchingSelector: \"figcaption\" })\n    return this.delegate?.compositionControllerDidSelectAttachment?.(attachment, { editCaption })\n  }\n\n  getSerializableElement() {\n    if (this.isEditingAttachment()) {\n      return this.documentView.shadowElement\n    } else {\n      return this.element\n    }\n  }\n\n  render() {\n    if (this.revision !== this.composition.revision) {\n      this.documentView.setDocument(this.composition.document)\n      this.documentView.render()\n      this.revision = this.composition.revision\n    }\n\n    if (this.canSyncDocumentView() && !this.documentView.isSynced()) {\n      this.delegate?.compositionControllerWillSyncDocumentView?.()\n      this.documentView.sync()\n      this.delegate?.compositionControllerDidSyncDocumentView?.()\n    }\n\n    return this.delegate?.compositionControllerDidRender?.()\n  }\n\n  rerenderViewForObject(object) {\n    this.invalidateViewForObject(object)\n    return this.render()\n  }\n\n  invalidateViewForObject(object) {\n    return this.documentView.invalidateViewForObject(object)\n  }\n\n  isViewCachingEnabled() {\n    return this.documentView.isViewCachingEnabled()\n  }\n\n  enableViewCaching() {\n    return this.documentView.enableViewCaching()\n  }\n\n  disableViewCaching() {\n    return this.documentView.disableViewCaching()\n  }\n\n  refreshViewCache() {\n    return this.documentView.garbageCollectCachedViews()\n  }\n\n  // Attachment editor management\n\n  isEditingAttachment() {\n    return !!this.attachmentEditor\n  }\n\n  installAttachmentEditorForAttachment(attachment, options) {\n    if (this.attachmentEditor?.attachment === attachment) return\n    const element = this.documentView.findElementForObject(attachment)\n    if (!element) return\n\n    this.uninstallAttachmentEditor()\n    const attachmentPiece = this.composition.document.getAttachmentPieceForAttachment(attachment)\n    this.attachmentEditor = new AttachmentEditorController(attachmentPiece, element, this.element, options)\n    this.attachmentEditor.delegate = this\n  }\n\n  uninstallAttachmentEditor() {\n    return this.attachmentEditor?.uninstall()\n  }\n\n  // Attachment controller delegate\n\n  didUninstallAttachmentEditor() {\n    this.attachmentEditor = null\n    return this.render()\n  }\n\n  attachmentEditorDidRequestUpdatingAttributesForAttachment(attributes, attachment) {\n    this.delegate?.compositionControllerWillUpdateAttachment?.(attachment)\n    return this.composition.updateAttributesForAttachment(attributes, attachment)\n  }\n\n  attachmentEditorDidRequestRemovingAttributeForAttachment(attribute, attachment) {\n    this.delegate?.compositionControllerWillUpdateAttachment?.(attachment)\n    return this.composition.removeAttributeForAttachment(attribute, attachment)\n  }\n\n  attachmentEditorDidRequestRemovalOfAttachment(attachment) {\n    return this.delegate?.compositionControllerDidRequestRemovalOfAttachment?.(attachment)\n  }\n\n  attachmentEditorDidRequestDeselectingAttachment(attachment) {\n    return this.delegate?.compositionControllerDidRequestDeselectingAttachment?.(attachment)\n  }\n\n  // Private\n\n  canSyncDocumentView() {\n    return !this.isEditingAttachment()\n  }\n\n  findAttachmentForElement(element) {\n    return this.composition.document.getAttachmentById(parseInt(element.dataset.trixId, 10))\n  }\n}\n", "import \"trix/views/object_view\"\nimport BasicObject from \"trix/core/basic_object\"\n\nexport default class Controller extends BasicObject {}\n", "import BasicObject from \"trix/core/basic_object\"\n\nimport {\n  findClosestElementFromNode,\n  nodeIsBlockStartComment,\n  nodeIsEmptyTextNode,\n  normalizeSpaces,\n  summarizeStringChange,\n  tagName,\n} from \"trix/core/helpers\"\n\nconst mutableAttributeName = \"data-trix-mutable\"\nconst mutableSelector = `[${mutableAttributeName}]`\n\nconst options = {\n  attributes: true,\n  childList: true,\n  characterData: true,\n  characterDataOldValue: true,\n  subtree: true,\n}\n\nexport default class MutationObserver extends BasicObject {\n  constructor(element) {\n    super(element)\n    this.didMutate = this.didMutate.bind(this)\n    this.element = element\n    this.observer = new window.MutationObserver(this.didMutate)\n    this.start()\n  }\n\n  start() {\n    this.reset()\n    return this.observer.observe(this.element, options)\n  }\n\n  stop() {\n    return this.observer.disconnect()\n  }\n\n  didMutate(mutations) {\n    this.mutations.push(...Array.from(this.findSignificantMutations(mutations) || []))\n\n    if (this.mutations.length) {\n      this.delegate?.elementDidMutate?.(this.getMutationSummary())\n      return this.reset()\n    }\n  }\n\n  // Private\n\n  reset() {\n    this.mutations = []\n  }\n\n  findSignificantMutations(mutations) {\n    return mutations.filter((mutation) => {\n      return this.mutationIsSignificant(mutation)\n    })\n  }\n\n  mutationIsSignificant(mutation) {\n    if (this.nodeIsMutable(mutation.target)) {\n      return false\n    }\n    for (const node of Array.from(this.nodesModifiedByMutation(mutation))) {\n      if (this.nodeIsSignificant(node)) return true\n    }\n    return false\n  }\n\n  nodeIsSignificant(node) {\n    return node !== this.element && !this.nodeIsMutable(node) && !nodeIsEmptyTextNode(node)\n  }\n\n  nodeIsMutable(node) {\n    return findClosestElementFromNode(node, { matchingSelector: mutableSelector })\n  }\n\n  nodesModifiedByMutation(mutation) {\n    const nodes = []\n    switch (mutation.type) {\n      case \"attributes\":\n        if (mutation.attributeName !== mutableAttributeName) {\n          nodes.push(mutation.target)\n        }\n        break\n      case \"characterData\":\n        // Changes to text nodes should consider the parent element\n        nodes.push(mutation.target.parentNode)\n        nodes.push(mutation.target)\n        break\n      case \"childList\":\n        // Consider each added or removed node\n        nodes.push(...Array.from(mutation.addedNodes || []))\n        nodes.push(...Array.from(mutation.removedNodes || []))\n        break\n    }\n    return nodes\n  }\n\n  getMutationSummary() {\n    return this.getTextMutationSummary()\n  }\n\n  getTextMutationSummary() {\n    const { additions, deletions } = this.getTextChangesFromCharacterData()\n    const textChanges = this.getTextChangesFromChildList()\n\n    Array.from(textChanges.additions).forEach((addition) => {\n      if (!Array.from(additions).includes(addition)) {\n        additions.push(addition)\n      }\n    })\n\n    deletions.push(...Array.from(textChanges.deletions || []))\n\n    const summary = {}\n\n    const added = additions.join(\"\")\n    if (added) {\n      summary.textAdded = added\n    }\n\n    const deleted = deletions.join(\"\")\n    if (deleted) {\n      summary.textDeleted = deleted\n    }\n\n    return summary\n  }\n\n  getMutationsByType(type) {\n    return Array.from(this.mutations).filter((mutation) => mutation.type === type)\n  }\n\n  getTextChangesFromChildList() {\n    let textAdded, textRemoved\n    const addedNodes = []\n    const removedNodes = []\n\n    Array.from(this.getMutationsByType(\"childList\")).forEach((mutation) => {\n      addedNodes.push(...Array.from(mutation.addedNodes || []))\n      removedNodes.push(...Array.from(mutation.removedNodes || []))\n    })\n\n    const singleBlockCommentRemoved =\n      addedNodes.length === 0 && removedNodes.length === 1 && nodeIsBlockStartComment(removedNodes[0])\n\n    if (singleBlockCommentRemoved) {\n      textAdded = []\n      textRemoved = [ \"\\n\" ]\n    } else {\n      textAdded = getTextForNodes(addedNodes)\n      textRemoved = getTextForNodes(removedNodes)\n    }\n\n    const additions = textAdded.filter((text, index) => text !== textRemoved[index]).map(normalizeSpaces)\n    const deletions = textRemoved.filter((text, index) => text !== textAdded[index]).map(normalizeSpaces)\n\n    return { additions, deletions }\n  }\n\n  getTextChangesFromCharacterData() {\n    let added, removed\n    const characterMutations = this.getMutationsByType(\"characterData\")\n\n    if (characterMutations.length) {\n      const startMutation = characterMutations[0],\n        endMutation = characterMutations[characterMutations.length - 1]\n\n      const oldString = normalizeSpaces(startMutation.oldValue)\n      const newString = normalizeSpaces(endMutation.target.data)\n      const summarized = summarizeStringChange(oldString, newString)\n      added = summarized.added\n      removed = summarized.removed\n    }\n\n    return {\n      additions: added ? [ added ] : [],\n      deletions: removed ? [ removed ] : [],\n    }\n  }\n}\n\nconst getTextForNodes = function(nodes = []) {\n  const text = []\n  for (const node of Array.from(nodes)) {\n    switch (node.nodeType) {\n      case Node.TEXT_NODE:\n        text.push(node.data)\n        break\n      case Node.ELEMENT_NODE:\n        if (tagName(node) === \"br\") {\n          text.push(\"\\n\")\n        } else {\n          text.push(...Array.from(getTextForNodes(node.childNodes) || []))\n        }\n        break\n    }\n  }\n  return text\n}\n", "/* eslint-disable\n    no-empty,\n*/\nimport Operation from \"trix/core/utilities/operation\"\n\nexport default class FileVerificationOperation extends Operation {\n  constructor(file) {\n    super(...arguments)\n    this.file = file\n  }\n\n  perform(callback) {\n    const reader = new FileReader()\n\n    reader.onerror = () => callback(false)\n\n    reader.onload = () => {\n      reader.onerror = null\n      try {\n        reader.abort()\n      } catch (error) {}\n      return callback(true, this.file)\n    }\n\n    return reader.readAsArrayBuffer(this.file)\n  }\n}\n", "import * as config from \"trix/config\"\nimport { NON_BREAKING_SPACE, OBJECT_REPLACEMENT_CHARACTER, ZERO_WIDTH_SPACE } from \"trix/constants\"\n\n// Each software keyboard on Android emits its own set of events and some of them can be buggy.\n// This class detects when some buggy events are being emitted and lets know the input controller\n// that they should be ignored.\nexport default class FlakyAndroidKeyboardDetector {\n  constructor(element) {\n    this.element = element\n  }\n\n  shouldIgnore(event) {\n    if (!config.browser.samsungAndroid) return false\n\n    this.previousEvent = this.event\n    this.event = event\n\n    this.checkSamsungKeyboardBuggyModeStart()\n    this.checkSamsungKeyboardBuggyModeEnd()\n\n    return this.buggyMode\n  }\n\n  // private\n\n  // The Samsung keyboard on Android can enter a buggy state in which it emits a flurry of confused events that,\n  // if processed, corrupts the editor. The buggy mode always starts with an insertText event, right after a\n  // keydown event with for an \"Unidentified\" key, with the same text as the editor element, except for a few\n  // extra whitespace, or exotic utf8, characters.\n  checkSamsungKeyboardBuggyModeStart() {\n    if (this.insertingLongTextAfterUnidentifiedChar() && differsInWhitespace(this.element.innerText, this.event.data)) {\n      this.buggyMode = true\n      this.event.preventDefault()\n    }\n  }\n\n  // The flurry of buggy events are always insertText. If we see any other type, it means it's over.\n  checkSamsungKeyboardBuggyModeEnd() {\n    if (this.buggyMode && this.event.inputType !== \"insertText\") {\n      this.buggyMode = false\n    }\n  }\n\n  insertingLongTextAfterUnidentifiedChar() {\n    return this.isBeforeInputInsertText() && this.previousEventWasUnidentifiedKeydown() && this.event.data?.length > 50\n  }\n\n  isBeforeInputInsertText() {\n    return this.event.type === \"beforeinput\" && this.event.inputType === \"insertText\"\n  }\n\n  previousEventWasUnidentifiedKeydown() {\n    return this.previousEvent?.type === \"keydown\" && this.previousEvent?.key === \"Unidentified\"\n  }\n}\n\nconst differsInWhitespace = (text1, text2) => {\n  return normalize(text1) === normalize(text2)\n}\n\nconst whiteSpaceNormalizerRegexp = new RegExp(`(${OBJECT_REPLACEMENT_CHARACTER}|${ZERO_WIDTH_SPACE}|${NON_BREAKING_SPACE}|\\\\s)+`, \"g\")\nconst normalize = (text) => text.replace(whiteSpaceNormalizerRegexp, \" \").trim()\n", "import BasicObject from \"trix/core/basic_object\"\nimport MutationObserver from \"trix/observers/mutation_observer\"\nimport FileVerificationOperation from \"trix/operations/file_verification_operation\"\nimport FlakyAndroidKeyboardDetector from \"../models/flaky_android_keyboard_detector\"\n\nimport { handleEvent, innerElementIsActive } from \"trix/core/helpers\"\n\nexport default class InputController extends BasicObject {\n\n  static events = {}\n\n  constructor(element) {\n    super(...arguments)\n    this.element = element\n    this.mutationObserver = new MutationObserver(this.element)\n    this.mutationObserver.delegate = this\n    this.flakyKeyboardDetector = new FlakyAndroidKeyboardDetector(this.element)\n    for (const eventName in this.constructor.events) {\n      handleEvent(eventName, { onElement: this.element, withCallback: this.handlerFor(eventName) })\n    }\n  }\n\n  elementDidMutate(mutationSummary) {}\n\n  editorWillSyncDocumentView() {\n    return this.mutationObserver.stop()\n  }\n\n  editorDidSyncDocumentView() {\n    return this.mutationObserver.start()\n  }\n\n  requestRender() {\n    return this.delegate?.inputControllerDidRequestRender?.()\n  }\n\n  requestReparse() {\n    this.delegate?.inputControllerDidRequestReparse?.()\n    return this.requestRender()\n  }\n\n  attachFiles(files) {\n    const operations = Array.from(files).map((file) => new FileVerificationOperation(file))\n    return Promise.all(operations).then((files) => {\n      this.handleInput(function() {\n        this.delegate?.inputControllerWillAttachFiles()\n        this.responder?.insertFiles(files)\n        return this.requestRender()\n      })\n    })\n  }\n\n  // Private\n\n  handlerFor(eventName) {\n    return (event) => {\n      if (!event.defaultPrevented) {\n        this.handleInput(() => {\n          if (!innerElementIsActive(this.element)) {\n            if (this.flakyKeyboardDetector.shouldIgnore(event)) return\n\n            this.eventName = eventName\n            this.constructor.events[eventName].call(this, event)\n          }\n        })\n      }\n    }\n  }\n\n  handleInput(callback) {\n    try {\n      this.delegate?.inputControllerWillHandleInput()\n      callback.call(this)\n    } finally {\n      this.delegate?.inputControllerDidHandleInput()\n    }\n  }\n\n  createLinkHTML(href, text) {\n    const link = document.createElement(\"a\")\n    link.href = href\n    link.textContent = text ? text : href\n    return link.outerHTML\n  }\n}\n\n", "import * as config from \"trix/config\"\nimport UTF16String from \"trix/core/utilities/utf16_string\"\nimport BasicObject from \"trix/core/basic_object\"\nimport InputController from \"trix/controllers/input_controller\"\nimport DocumentView from \"trix/views/document_view\"\nimport Document from \"trix/models/document\"\n\nimport {\n  dataTransferIsPlainText,\n  dataTransferIsWritable,\n  keyEventIsKeyboardCommand,\n  makeElement,\n  objectsAreEqual,\n  removeNode,\n  squishBreakableWhitespace,\n} from \"trix/core/helpers\"\n\nimport { selectionChangeObserver } from \"trix/observers/selection_change_observer\"\n\nconst { browser, keyNames } = config\nlet pastedFileCount = 0\n\nexport default class Level0InputController extends InputController {\n\n  static events = {\n    keydown(event) {\n      if (!this.isComposing()) {\n        this.resetInputSummary()\n      }\n      this.inputSummary.didInput = true\n\n      const keyName = keyNames[event.keyCode]\n      if (keyName) {\n        let context = this.keys\n\n        ;[ \"ctrl\", \"alt\", \"shift\", \"meta\" ].forEach((modifier) => {\n          if (event[`${modifier}Key`]) {\n            if (modifier === \"ctrl\") {\n              modifier = \"control\"\n            }\n            context = context?.[modifier]\n          }\n        })\n\n        if (context?.[keyName] != null) {\n          this.setInputSummary({ keyName })\n          selectionChangeObserver.reset()\n          context[keyName].call(this, event)\n        }\n      }\n\n      if (keyEventIsKeyboardCommand(event)) {\n        const character = String.fromCharCode(event.keyCode).toLowerCase()\n        if (character) {\n          const keys = [ \"alt\", \"shift\" ].map((modifier) => {\n            if (event[`${modifier}Key`]) {\n              return modifier\n            }\n          }).filter(key => key)\n          keys.push(character)\n          if (this.delegate?.inputControllerDidReceiveKeyboardCommand(keys)) {\n            event.preventDefault()\n          }\n        }\n      }\n    },\n\n    keypress(event) {\n      if (this.inputSummary.eventName != null) return\n      if (event.metaKey) return\n      if (event.ctrlKey && !event.altKey) return\n\n      const string = stringFromKeyEvent(event)\n      if (string) {\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.insertString(string)\n        return this.setInputSummary({ textAdded: string, didDelete: this.selectionIsExpanded() })\n      }\n    },\n\n    textInput(event) {\n      // Handle autocapitalization\n      const { data } = event\n      const { textAdded } = this.inputSummary\n      if (textAdded && textAdded !== data && textAdded.toUpperCase() === data) {\n        const range = this.getSelectedRange()\n        this.setSelectedRange([ range[0], range[1] + textAdded.length ])\n        this.responder?.insertString(data)\n        this.setInputSummary({ textAdded: data })\n        return this.setSelectedRange(range)\n      }\n    },\n\n    dragenter(event) {\n      event.preventDefault()\n    },\n\n    dragstart(event) {\n      this.serializeSelectionToDataTransfer(event.dataTransfer)\n      this.draggedRange = this.getSelectedRange()\n      return this.delegate?.inputControllerDidStartDrag?.()\n    },\n\n    dragover(event) {\n      if (this.draggedRange || this.canAcceptDataTransfer(event.dataTransfer)) {\n        event.preventDefault()\n        const draggingPoint = { x: event.clientX, y: event.clientY }\n        if (!objectsAreEqual(draggingPoint, this.draggingPoint)) {\n          this.draggingPoint = draggingPoint\n          return this.delegate?.inputControllerDidReceiveDragOverPoint?.(this.draggingPoint)\n        }\n      }\n    },\n\n    dragend(event) {\n      this.delegate?.inputControllerDidCancelDrag?.()\n      this.draggedRange = null\n      this.draggingPoint = null\n    },\n\n    drop(event) {\n      event.preventDefault()\n      const files = event.dataTransfer?.files\n      const documentJSON = event.dataTransfer.getData(\"application/x-trix-document\")\n\n      const point = { x: event.clientX, y: event.clientY }\n      this.responder?.setLocationRangeFromPointRange(point)\n\n      if (files?.length) {\n        this.attachFiles(files)\n      } else if (this.draggedRange) {\n        this.delegate?.inputControllerWillMoveText()\n        this.responder?.moveTextFromRange(this.draggedRange)\n        this.draggedRange = null\n        this.requestRender()\n      } else if (documentJSON) {\n        const document = Document.fromJSONString(documentJSON)\n        this.responder?.insertDocument(document)\n        this.requestRender()\n      }\n\n      this.draggedRange = null\n      this.draggingPoint = null\n    },\n\n    cut(event) {\n      if (this.responder?.selectionIsExpanded()) {\n        if (this.serializeSelectionToDataTransfer(event.clipboardData)) {\n          event.preventDefault()\n        }\n\n        this.delegate?.inputControllerWillCutText()\n        this.deleteInDirection(\"backward\")\n        if (event.defaultPrevented) {\n          return this.requestRender()\n        }\n      }\n    },\n\n    copy(event) {\n      if (this.responder?.selectionIsExpanded()) {\n        if (this.serializeSelectionToDataTransfer(event.clipboardData)) {\n          event.preventDefault()\n        }\n      }\n    },\n\n    paste(event) {\n      const clipboard = event.clipboardData || event.testClipboardData\n      const paste = { clipboard }\n\n      if (!clipboard || pasteEventIsCrippledSafariHTMLPaste(event)) {\n        this.getPastedHTMLUsingHiddenElement((html) => {\n          paste.type = \"text/html\"\n          paste.html = html\n          this.delegate?.inputControllerWillPaste(paste)\n          this.responder?.insertHTML(paste.html)\n          this.requestRender()\n          return this.delegate?.inputControllerDidPaste(paste)\n        })\n        return\n      }\n\n      const href = clipboard.getData(\"URL\")\n      const html = clipboard.getData(\"text/html\")\n      const name = clipboard.getData(\"public.url-name\")\n\n      if (href) {\n        let string\n        paste.type = \"text/html\"\n        if (name) {\n          string = squishBreakableWhitespace(name).trim()\n        } else {\n          string = href\n        }\n        paste.html = this.createLinkHTML(href, string)\n        this.delegate?.inputControllerWillPaste(paste)\n        this.setInputSummary({ textAdded: string, didDelete: this.selectionIsExpanded() })\n        this.responder?.insertHTML(paste.html)\n        this.requestRender()\n        this.delegate?.inputControllerDidPaste(paste)\n      } else if (dataTransferIsPlainText(clipboard)) {\n        paste.type = \"text/plain\"\n        paste.string = clipboard.getData(\"text/plain\")\n        this.delegate?.inputControllerWillPaste(paste)\n        this.setInputSummary({ textAdded: paste.string, didDelete: this.selectionIsExpanded() })\n        this.responder?.insertString(paste.string)\n        this.requestRender()\n        this.delegate?.inputControllerDidPaste(paste)\n      } else if (html) {\n        paste.type = \"text/html\"\n        paste.html = html\n        this.delegate?.inputControllerWillPaste(paste)\n        this.responder?.insertHTML(paste.html)\n        this.requestRender()\n        this.delegate?.inputControllerDidPaste(paste)\n      } else if (Array.from(clipboard.types).includes(\"Files\")) {\n        const file = clipboard.items?.[0]?.getAsFile?.()\n        if (file) {\n          const extension = extensionForFile(file)\n          if (!file.name && extension) {\n            file.name = `pasted-file-${++pastedFileCount}.${extension}`\n          }\n          paste.type = \"File\"\n          paste.file = file\n          this.delegate?.inputControllerWillAttachFiles()\n          this.responder?.insertFile(paste.file)\n          this.requestRender()\n          this.delegate?.inputControllerDidPaste(paste)\n        }\n      }\n\n      event.preventDefault()\n    },\n\n    compositionstart(event) {\n      return this.getCompositionInput().start(event.data)\n    },\n\n    compositionupdate(event) {\n      return this.getCompositionInput().update(event.data)\n    },\n\n    compositionend(event) {\n      return this.getCompositionInput().end(event.data)\n    },\n\n    beforeinput(event) {\n      this.inputSummary.didInput = true\n    },\n\n    input(event) {\n      this.inputSummary.didInput = true\n      return event.stopPropagation()\n    },\n  }\n\n  static keys = {\n    backspace(event) {\n      this.delegate?.inputControllerWillPerformTyping()\n      return this.deleteInDirection(\"backward\", event)\n    },\n\n    delete(event) {\n      this.delegate?.inputControllerWillPerformTyping()\n      return this.deleteInDirection(\"forward\", event)\n    },\n\n    return(event) {\n      this.setInputSummary({ preferDocument: true })\n      this.delegate?.inputControllerWillPerformTyping()\n      return this.responder?.insertLineBreak()\n    },\n\n    tab(event) {\n      if (this.responder?.canIncreaseNestingLevel()) {\n        this.responder?.increaseNestingLevel()\n        this.requestRender()\n        event.preventDefault()\n      }\n    },\n\n    left(event) {\n      if (this.selectionIsInCursorTarget()) {\n        event.preventDefault()\n        return this.responder?.moveCursorInDirection(\"backward\")\n      }\n    },\n\n    right(event) {\n      if (this.selectionIsInCursorTarget()) {\n        event.preventDefault()\n        return this.responder?.moveCursorInDirection(\"forward\")\n      }\n    },\n\n    control: {\n      d(event) {\n        this.delegate?.inputControllerWillPerformTyping()\n        return this.deleteInDirection(\"forward\", event)\n      },\n\n      h(event) {\n        this.delegate?.inputControllerWillPerformTyping()\n        return this.deleteInDirection(\"backward\", event)\n      },\n\n      o(event) {\n        event.preventDefault()\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.insertString(\"\\n\", { updatePosition: false })\n        return this.requestRender()\n      },\n    },\n\n    shift: {\n      return(event) {\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.insertString(\"\\n\")\n        this.requestRender()\n        event.preventDefault()\n      },\n\n      tab(event) {\n        if (this.responder?.canDecreaseNestingLevel()) {\n          this.responder?.decreaseNestingLevel()\n          this.requestRender()\n          event.preventDefault()\n        }\n      },\n\n      left(event) {\n        if (this.selectionIsInCursorTarget()) {\n          event.preventDefault()\n          return this.expandSelectionInDirection(\"backward\")\n        }\n      },\n\n      right(event) {\n        if (this.selectionIsInCursorTarget()) {\n          event.preventDefault()\n          return this.expandSelectionInDirection(\"forward\")\n        }\n      },\n    },\n\n    alt: {\n      backspace(event) {\n        this.setInputSummary({ preferDocument: false })\n        return this.delegate?.inputControllerWillPerformTyping()\n      },\n    },\n\n    meta: {\n      backspace(event) {\n        this.setInputSummary({ preferDocument: false })\n        return this.delegate?.inputControllerWillPerformTyping()\n      },\n    },\n  }\n\n  constructor() {\n    super(...arguments)\n    this.resetInputSummary()\n  }\n\n  setInputSummary(summary = {}) {\n    this.inputSummary.eventName = this.eventName\n    for (const key in summary) {\n      const value = summary[key]\n      this.inputSummary[key] = value\n    }\n    return this.inputSummary\n  }\n\n  resetInputSummary() {\n    this.inputSummary = {}\n  }\n\n  reset() {\n    this.resetInputSummary()\n    return selectionChangeObserver.reset()\n  }\n\n  // Mutation observer delegate\n\n  elementDidMutate(mutationSummary) {\n    if (this.isComposing()) {\n      return this.delegate?.inputControllerDidAllowUnhandledInput?.()\n    } else {\n      return this.handleInput(function() {\n        if (this.mutationIsSignificant(mutationSummary)) {\n          if (this.mutationIsExpected(mutationSummary)) {\n            this.requestRender()\n          } else {\n            this.requestReparse()\n          }\n        }\n        return this.reset()\n      })\n    }\n  }\n\n  mutationIsExpected({ textAdded, textDeleted }) {\n    if (this.inputSummary.preferDocument) {\n      return true\n    }\n\n    const mutationAdditionMatchesSummary =\n      textAdded != null ? textAdded === this.inputSummary.textAdded : !this.inputSummary.textAdded\n    const mutationDeletionMatchesSummary =\n      textDeleted != null ? this.inputSummary.didDelete : !this.inputSummary.didDelete\n\n    const unexpectedNewlineAddition = [ \"\\n\", \" \\n\" ].includes(textAdded) && !mutationAdditionMatchesSummary\n    const unexpectedNewlineDeletion = textDeleted === \"\\n\" && !mutationDeletionMatchesSummary\n    const singleUnexpectedNewline =\n      unexpectedNewlineAddition && !unexpectedNewlineDeletion ||\n      unexpectedNewlineDeletion && !unexpectedNewlineAddition\n\n    if (singleUnexpectedNewline) {\n      const range = this.getSelectedRange()\n      if (range) {\n        const offset = unexpectedNewlineAddition ? textAdded.replace(/\\n$/, \"\").length || -1 : textAdded?.length || 1\n        if (this.responder?.positionIsBlockBreak(range[1] + offset)) {\n          return true\n        }\n      }\n    }\n\n    return mutationAdditionMatchesSummary && mutationDeletionMatchesSummary\n  }\n\n  mutationIsSignificant(mutationSummary) {\n    const textChanged = Object.keys(mutationSummary).length > 0\n    const composedEmptyString = this.compositionInput?.getEndData() === \"\"\n    return textChanged || !composedEmptyString\n  }\n\n  // Private\n\n  getCompositionInput() {\n    if (this.isComposing()) {\n      return this.compositionInput\n    } else {\n      this.compositionInput = new CompositionInput(this)\n    }\n  }\n\n  isComposing() {\n    return this.compositionInput && !this.compositionInput.isEnded()\n  }\n\n  deleteInDirection(direction, event) {\n    if (this.responder?.deleteInDirection(direction) === false) {\n      if (event) {\n        event.preventDefault()\n        return this.requestRender()\n      }\n    } else {\n      return this.setInputSummary({ didDelete: true })\n    }\n  }\n\n  serializeSelectionToDataTransfer(dataTransfer) {\n    if (!dataTransferIsWritable(dataTransfer)) return\n    const document = this.responder?.getSelectedDocument().toSerializableDocument()\n\n    dataTransfer.setData(\"application/x-trix-document\", JSON.stringify(document))\n    dataTransfer.setData(\"text/html\", DocumentView.render(document).innerHTML)\n    dataTransfer.setData(\"text/plain\", document.toString().replace(/\\n$/, \"\"))\n    return true\n  }\n\n  canAcceptDataTransfer(dataTransfer) {\n    const types = {}\n    Array.from(dataTransfer?.types || []).forEach((type) => {\n      types[type] = true\n    })\n    return types.Files || types[\"application/x-trix-document\"] || types[\"text/html\"] || types[\"text/plain\"]\n  }\n\n  getPastedHTMLUsingHiddenElement(callback) {\n    const selectedRange = this.getSelectedRange()\n\n    const style = {\n      position: \"absolute\",\n      left: `${window.pageXOffset}px`,\n      top: `${window.pageYOffset}px`,\n      opacity: 0,\n    }\n\n    const element = makeElement({ style, tagName: \"div\", editable: true })\n    document.body.appendChild(element)\n    element.focus()\n\n    return requestAnimationFrame(() => {\n      const html = element.innerHTML\n      removeNode(element)\n      this.setSelectedRange(selectedRange)\n      return callback(html)\n    })\n  }\n}\n\nLevel0InputController.proxyMethod(\"responder?.getSelectedRange\")\nLevel0InputController.proxyMethod(\"responder?.setSelectedRange\")\nLevel0InputController.proxyMethod(\"responder?.expandSelectionInDirection\")\nLevel0InputController.proxyMethod(\"responder?.selectionIsInCursorTarget\")\nLevel0InputController.proxyMethod(\"responder?.selectionIsExpanded\")\n\nconst extensionForFile = (file) => file.type?.match(/\\/(\\w+)$/)?.[1]\n\nconst hasStringCodePointAt = !!\" \".codePointAt?.(0)\n\nconst stringFromKeyEvent = function(event) {\n  if (event.key && hasStringCodePointAt && event.key.codePointAt(0) === event.keyCode) {\n    return event.key\n  } else {\n    let code\n    if (event.which === null) {\n      code = event.keyCode\n    } else if (event.which !== 0 && event.charCode !== 0) {\n      code = event.charCode\n    }\n\n    if (code != null && keyNames[code] !== \"escape\") {\n      return UTF16String.fromCodepoints([ code ]).toString()\n    }\n  }\n}\n\nconst pasteEventIsCrippledSafariHTMLPaste = function(event) {\n  const paste = event.clipboardData\n  if (paste) {\n    if (paste.types.includes(\"text/html\")) {\n      // Answer is yes if there's any possibility of Paste and Match Style in Safari,\n      // which is nearly impossible to detect confidently: https://bugs.webkit.org/show_bug.cgi?id=174165\n      for (const type of paste.types) {\n        const hasPasteboardFlavor = /^CorePasteboardFlavorType/.test(type)\n        const hasReadableDynamicData = /^dyn\\./.test(type) && paste.getData(type)\n        const mightBePasteAndMatchStyle = hasPasteboardFlavor || hasReadableDynamicData\n        if (mightBePasteAndMatchStyle) {\n          return true\n        }\n      }\n      return false\n    } else {\n      const isExternalHTMLPaste = paste.types.includes(\"com.apple.webarchive\")\n      const isExternalRichTextPaste = paste.types.includes(\"com.apple.flat-rtfd\")\n      return isExternalHTMLPaste || isExternalRichTextPaste\n    }\n  }\n}\n\nclass CompositionInput extends BasicObject {\n  constructor(inputController) {\n    super(...arguments)\n    this.inputController = inputController\n    this.responder = this.inputController.responder\n    this.delegate = this.inputController.delegate\n    this.inputSummary = this.inputController.inputSummary\n    this.data = {}\n  }\n\n  start(data) {\n    this.data.start = data\n\n    if (this.isSignificant()) {\n      if (this.inputSummary.eventName === \"keypress\" && this.inputSummary.textAdded) {\n        this.responder?.deleteInDirection(\"left\")\n      }\n\n      if (!this.selectionIsExpanded()) {\n        this.insertPlaceholder()\n        this.requestRender()\n      }\n\n      this.range = this.responder?.getSelectedRange()\n    }\n  }\n\n  update(data) {\n    this.data.update = data\n\n    if (this.isSignificant()) {\n      const range = this.selectPlaceholder()\n      if (range) {\n        this.forgetPlaceholder()\n        this.range = range\n      }\n    }\n  }\n\n  end(data) {\n    this.data.end = data\n\n    if (this.isSignificant()) {\n      this.forgetPlaceholder()\n\n      if (this.canApplyToDocument()) {\n        this.setInputSummary({ preferDocument: true, didInput: false })\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.setSelectedRange(this.range)\n        this.responder?.insertString(this.data.end)\n        return this.responder?.setSelectedRange(this.range[0] + this.data.end.length)\n      } else if (this.data.start != null || this.data.update != null) {\n        this.requestReparse()\n        return this.inputController.reset()\n      }\n    } else {\n      return this.inputController.reset()\n    }\n  }\n\n  getEndData() {\n    return this.data.end\n  }\n\n  isEnded() {\n    return this.getEndData() != null\n  }\n\n  isSignificant() {\n    if (browser.composesExistingText) {\n      return this.inputSummary.didInput\n    } else {\n      return true\n    }\n  }\n\n  // Private\n\n  canApplyToDocument() {\n    return this.data.start?.length === 0 && this.data.end?.length > 0 && this.range\n  }\n}\n\nCompositionInput.proxyMethod(\"inputController.setInputSummary\")\nCompositionInput.proxyMethod(\"inputController.requestRender\")\nCompositionInput.proxyMethod(\"inputController.requestReparse\")\nCompositionInput.proxyMethod(\"responder?.selectionIsExpanded\")\nCompositionInput.proxyMethod(\"responder?.insertPlaceholder\")\nCompositionInput.proxyMethod(\"responder?.selectPlaceholder\")\nCompositionInput.proxyMethod(\"responder?.forgetPlaceholder\")\n", "import { getAllAttributeNames, shouldRenderInmmediatelyToDealWithIOSDictation, squishBreakableWhitespace } from \"trix/core/helpers\"\nimport InputController from \"trix/controllers/input_controller\"\nimport * as config from \"trix/config\"\n\nimport { dataTransferIsMsOfficePaste, dataTransferIsPlainText, keyEventIsKeyboardCommand, objectsAreEqual } from \"trix/core/helpers\"\n\nimport { selectionChangeObserver } from \"trix/observers/selection_change_observer\"\n\nexport default class Level2InputController extends InputController {\n  constructor(...args) {\n    super(...args)\n    this.render = this.render.bind(this)\n  }\n\n  static events = {\n    keydown(event) {\n      if (keyEventIsKeyboardCommand(event)) {\n        const command = keyboardCommandFromKeyEvent(event)\n        if (this.delegate?.inputControllerDidReceiveKeyboardCommand(command)) {\n          event.preventDefault()\n        }\n      } else {\n        let name = event.key\n        if (event.altKey) {\n          name += \"+Alt\"\n        }\n        if (event.shiftKey) {\n          name += \"+Shift\"\n        }\n        const handler = this.constructor.keys[name]\n        if (handler) {\n          return this.withEvent(event, handler)\n        }\n      }\n    },\n\n    // Handle paste event to work around beforeinput.insertFromPaste browser bugs.\n    // Safe to remove each condition once fixed upstream.\n    paste(event) {\n      // https://bugs.webkit.org/show_bug.cgi?id=194921\n      let paste\n      const href = event.clipboardData?.getData(\"URL\")\n      if (pasteEventHasFilesOnly(event)) {\n        event.preventDefault()\n        return this.attachFiles(event.clipboardData.files)\n\n        // https://bugs.chromium.org/p/chromium/issues/detail?id=934448\n      } else if (pasteEventHasPlainTextOnly(event)) {\n        event.preventDefault()\n        paste = {\n          type: \"text/plain\",\n          string: event.clipboardData.getData(\"text/plain\"),\n        }\n        this.delegate?.inputControllerWillPaste(paste)\n        this.responder?.insertString(paste.string)\n        this.render()\n        return this.delegate?.inputControllerDidPaste(paste)\n\n        // https://bugs.webkit.org/show_bug.cgi?id=196702\n      } else if (href) {\n        event.preventDefault()\n        paste = {\n          type: \"text/html\",\n          html: this.createLinkHTML(href),\n        }\n        this.delegate?.inputControllerWillPaste(paste)\n        this.responder?.insertHTML(paste.html)\n        this.render()\n        return this.delegate?.inputControllerDidPaste(paste)\n      }\n    },\n\n    beforeinput(event) {\n      const handler = this.constructor.inputTypes[event.inputType]\n\n      const immmediateRender = shouldRenderInmmediatelyToDealWithIOSDictation(event)\n\n      if (handler) {\n        this.withEvent(event, handler)\n\n        if (!immmediateRender) {\n          this.scheduleRender()\n        }\n      }\n\n      if (immmediateRender) {\n        this.render()\n      }\n    },\n\n    input(event) {\n      selectionChangeObserver.reset()\n    },\n\n    dragstart(event) {\n      if (this.responder?.selectionContainsAttachments()) {\n        event.dataTransfer.setData(\"application/x-trix-dragging\", true)\n\n        this.dragging = {\n          range: this.responder?.getSelectedRange(),\n          point: pointFromEvent(event),\n        }\n      }\n    },\n\n    dragenter(event) {\n      if (dragEventHasFiles(event)) {\n        event.preventDefault()\n      }\n    },\n\n    dragover(event) {\n      if (this.dragging) {\n        event.preventDefault()\n        const point = pointFromEvent(event)\n        if (!objectsAreEqual(point, this.dragging.point)) {\n          this.dragging.point = point\n          return this.responder?.setLocationRangeFromPointRange(point)\n        }\n      } else if (dragEventHasFiles(event)) {\n        event.preventDefault()\n      }\n    },\n\n    drop(event) {\n      if (this.dragging) {\n        event.preventDefault()\n        this.delegate?.inputControllerWillMoveText()\n        this.responder?.moveTextFromRange(this.dragging.range)\n        this.dragging = null\n        return this.scheduleRender()\n      } else if (dragEventHasFiles(event)) {\n        event.preventDefault()\n        const point = pointFromEvent(event)\n        this.responder?.setLocationRangeFromPointRange(point)\n        return this.attachFiles(event.dataTransfer.files)\n      }\n    },\n\n    dragend() {\n      if (this.dragging) {\n        this.responder?.setSelectedRange(this.dragging.range)\n        this.dragging = null\n      }\n    },\n\n    compositionend(event) {\n      if (this.composing) {\n        this.composing = false\n        if (!config.browser.recentAndroid) this.scheduleRender()\n      }\n    },\n  }\n\n  static keys = {\n    ArrowLeft() {\n      if (this.responder?.shouldManageMovingCursorInDirection(\"backward\")) {\n        this.event.preventDefault()\n        return this.responder?.moveCursorInDirection(\"backward\")\n      }\n    },\n\n    ArrowRight() {\n      if (this.responder?.shouldManageMovingCursorInDirection(\"forward\")) {\n        this.event.preventDefault()\n        return this.responder?.moveCursorInDirection(\"forward\")\n      }\n    },\n\n    Backspace() {\n      if (this.responder?.shouldManageDeletingInDirection(\"backward\")) {\n        this.event.preventDefault()\n        this.delegate?.inputControllerWillPerformTyping()\n        this.responder?.deleteInDirection(\"backward\")\n        return this.render()\n      }\n    },\n\n    Tab() {\n      if (this.responder?.canIncreaseNestingLevel()) {\n        this.event.preventDefault()\n        this.responder?.increaseNestingLevel()\n        return this.render()\n      }\n    },\n\n    \"Tab+Shift\"() {\n      if (this.responder?.canDecreaseNestingLevel()) {\n        this.event.preventDefault()\n        this.responder?.decreaseNestingLevel()\n        return this.render()\n      }\n    },\n  }\n\n  static inputTypes = {\n    deleteByComposition() {\n      return this.deleteInDirection(\"backward\", { recordUndoEntry: false })\n    },\n\n    deleteByCut() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteByDrag() {\n      this.event.preventDefault()\n      return this.withTargetDOMRange(function() {\n        this.deleteByDragRange = this.responder?.getSelectedRange()\n      })\n    },\n\n    deleteCompositionText() {\n      return this.deleteInDirection(\"backward\", { recordUndoEntry: false })\n    },\n\n    deleteContent() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteContentBackward() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteContentForward() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    deleteEntireSoftLine() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    deleteHardLineBackward() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteHardLineForward() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    deleteSoftLineBackward() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteSoftLineForward() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    deleteWordBackward() {\n      return this.deleteInDirection(\"backward\")\n    },\n\n    deleteWordForward() {\n      return this.deleteInDirection(\"forward\")\n    },\n\n    formatBackColor() {\n      return this.activateAttributeIfSupported(\"backgroundColor\", this.event.data)\n    },\n\n    formatBold() {\n      return this.toggleAttributeIfSupported(\"bold\")\n    },\n\n    formatFontColor() {\n      return this.activateAttributeIfSupported(\"color\", this.event.data)\n    },\n\n    formatFontName() {\n      return this.activateAttributeIfSupported(\"font\", this.event.data)\n    },\n\n    formatIndent() {\n      if (this.responder?.canIncreaseNestingLevel()) {\n        return this.withTargetDOMRange(function() {\n          return this.responder?.increaseNestingLevel()\n        })\n      }\n    },\n\n    formatItalic() {\n      return this.toggleAttributeIfSupported(\"italic\")\n    },\n\n    formatJustifyCenter() {\n      return this.toggleAttributeIfSupported(\"justifyCenter\")\n    },\n\n    formatJustifyFull() {\n      return this.toggleAttributeIfSupported(\"justifyFull\")\n    },\n\n    formatJustifyLeft() {\n      return this.toggleAttributeIfSupported(\"justifyLeft\")\n    },\n\n    formatJustifyRight() {\n      return this.toggleAttributeIfSupported(\"justifyRight\")\n    },\n\n    formatOutdent() {\n      if (this.responder?.canDecreaseNestingLevel()) {\n        return this.withTargetDOMRange(function() {\n          return this.responder?.decreaseNestingLevel()\n        })\n      }\n    },\n\n    formatRemove() {\n      this.withTargetDOMRange(function() {\n        for (const attributeName in this.responder?.getCurrentAttributes()) {\n          this.responder?.removeCurrentAttribute(attributeName)\n        }\n      })\n    },\n\n    formatSetBlockTextDirection() {\n      return this.activateAttributeIfSupported(\"blockDir\", this.event.data)\n    },\n\n    formatSetInlineTextDirection() {\n      return this.activateAttributeIfSupported(\"textDir\", this.event.data)\n    },\n\n    formatStrikeThrough() {\n      return this.toggleAttributeIfSupported(\"strike\")\n    },\n\n    formatSubscript() {\n      return this.toggleAttributeIfSupported(\"sub\")\n    },\n\n    formatSuperscript() {\n      return this.toggleAttributeIfSupported(\"sup\")\n    },\n\n    formatUnderline() {\n      return this.toggleAttributeIfSupported(\"underline\")\n    },\n\n    historyRedo() {\n      return this.delegate?.inputControllerWillPerformRedo()\n    },\n\n    historyUndo() {\n      return this.delegate?.inputControllerWillPerformUndo()\n    },\n\n    insertCompositionText() {\n      this.composing = true\n      return this.insertString(this.event.data)\n    },\n\n    insertFromComposition() {\n      this.composing = false\n      return this.insertString(this.event.data)\n    },\n\n    insertFromDrop() {\n      const range = this.deleteByDragRange\n      if (range) {\n        this.deleteByDragRange = null\n        this.delegate?.inputControllerWillMoveText()\n        return this.withTargetDOMRange(function() {\n          return this.responder?.moveTextFromRange(range)\n        })\n      }\n    },\n\n    insertFromPaste() {\n      const { dataTransfer } = this.event\n      const paste = { dataTransfer }\n\n      const href = dataTransfer.getData(\"URL\")\n      const html = dataTransfer.getData(\"text/html\")\n\n      if (href) {\n        let string\n        this.event.preventDefault()\n        paste.type = \"text/html\"\n        const name = dataTransfer.getData(\"public.url-name\")\n        if (name) {\n          string = squishBreakableWhitespace(name).trim()\n        } else {\n          string = href\n        }\n        paste.html = this.createLinkHTML(href, string)\n        this.delegate?.inputControllerWillPaste(paste)\n        this.withTargetDOMRange(function() {\n          return this.responder?.insertHTML(paste.html)\n        })\n        this.afterRender = () => {\n          return this.delegate?.inputControllerDidPaste(paste)\n        }\n      } else if (dataTransferIsPlainText(dataTransfer)) {\n        paste.type = \"text/plain\"\n        paste.string = dataTransfer.getData(\"text/plain\")\n        this.delegate?.inputControllerWillPaste(paste)\n        this.withTargetDOMRange(function() {\n          return this.responder?.insertString(paste.string)\n        })\n\n        this.afterRender = () => {\n          return this.delegate?.inputControllerDidPaste(paste)\n        }\n      } else if (processableFilePaste(this.event)) {\n        paste.type = \"File\"\n        paste.file = dataTransfer.files[0]\n        this.delegate?.inputControllerWillPaste(paste)\n        this.withTargetDOMRange(function() {\n          return this.responder?.insertFile(paste.file)\n        })\n\n        this.afterRender = () => {\n          return this.delegate?.inputControllerDidPaste(paste)\n        }\n      } else if (html) {\n        this.event.preventDefault()\n        paste.type = \"text/html\"\n        paste.html = html\n        this.delegate?.inputControllerWillPaste(paste)\n        this.withTargetDOMRange(function() {\n          return this.responder?.insertHTML(paste.html)\n        })\n        this.afterRender = () => {\n          return this.delegate?.inputControllerDidPaste(paste)\n        }\n      }\n    },\n\n    insertFromYank() {\n      return this.insertString(this.event.data)\n    },\n\n    insertLineBreak() {\n      return this.insertString(\"\\n\")\n    },\n\n    insertLink() {\n      return this.activateAttributeIfSupported(\"href\", this.event.data)\n    },\n\n    insertOrderedList() {\n      return this.toggleAttributeIfSupported(\"number\")\n    },\n\n    insertParagraph() {\n      this.delegate?.inputControllerWillPerformTyping()\n      return this.withTargetDOMRange(function() {\n        return this.responder?.insertLineBreak()\n      })\n    },\n\n    insertReplacementText() {\n      const replacement = this.event.dataTransfer.getData(\"text/plain\")\n      const domRange = this.event.getTargetRanges()[0]\n\n      this.withTargetDOMRange(domRange, () => {\n        this.insertString(replacement, { updatePosition: false })\n      })\n    },\n\n    insertText() {\n      return this.insertString(this.event.data || this.event.dataTransfer?.getData(\"text/plain\"))\n    },\n\n    insertTranspose() {\n      return this.insertString(this.event.data)\n    },\n\n    insertUnorderedList() {\n      return this.toggleAttributeIfSupported(\"bullet\")\n    },\n  }\n\n  elementDidMutate() {\n    if (this.scheduledRender) {\n      if (this.composing) {\n        return this.delegate?.inputControllerDidAllowUnhandledInput?.()\n      }\n    } else {\n      return this.reparse()\n    }\n  }\n\n  scheduleRender() {\n    return this.scheduledRender ? this.scheduledRender : this.scheduledRender = requestAnimationFrame(this.render)\n  }\n\n  render() {\n    cancelAnimationFrame(this.scheduledRender)\n    this.scheduledRender = null\n    if (!this.composing) {\n      this.delegate?.render()\n    }\n    this.afterRender?.()\n    this.afterRender = null\n  }\n\n  reparse() {\n    return this.delegate?.reparse()\n  }\n\n  // Responder helpers\n\n  insertString(string = \"\", options) {\n    this.delegate?.inputControllerWillPerformTyping()\n    return this.withTargetDOMRange(function() {\n      return this.responder?.insertString(string, options)\n    })\n  }\n\n  toggleAttributeIfSupported(attributeName) {\n    if (getAllAttributeNames().includes(attributeName)) {\n      this.delegate?.inputControllerWillPerformFormatting(attributeName)\n      return this.withTargetDOMRange(function() {\n        return this.responder?.toggleCurrentAttribute(attributeName)\n      })\n    }\n  }\n\n  activateAttributeIfSupported(attributeName, value) {\n    if (getAllAttributeNames().includes(attributeName)) {\n      this.delegate?.inputControllerWillPerformFormatting(attributeName)\n      return this.withTargetDOMRange(function() {\n        return this.responder?.setCurrentAttribute(attributeName, value)\n      })\n    }\n  }\n\n  deleteInDirection(direction, { recordUndoEntry } = { recordUndoEntry: true }) {\n    if (recordUndoEntry) {\n      this.delegate?.inputControllerWillPerformTyping()\n    }\n    const perform = () => this.responder?.deleteInDirection(direction)\n    const domRange = this.getTargetDOMRange({ minLength: this.composing ? 1 : 2 })\n    if (domRange) {\n      return this.withTargetDOMRange(domRange, perform)\n    } else {\n      return perform()\n    }\n  }\n\n  // Selection helpers\n\n  withTargetDOMRange(domRange, fn) {\n    if (typeof domRange === \"function\") {\n      fn = domRange\n      domRange = this.getTargetDOMRange()\n    }\n    if (domRange) {\n      return this.responder?.withTargetDOMRange(domRange, fn.bind(this))\n    } else {\n      selectionChangeObserver.reset()\n      return fn.call(this)\n    }\n  }\n\n  getTargetDOMRange({ minLength } = { minLength: 0 }) {\n    const targetRanges = this.event.getTargetRanges?.()\n    if (targetRanges) {\n      if (targetRanges.length) {\n        const domRange = staticRangeToRange(targetRanges[0])\n        if (minLength === 0 || domRange.toString().length >= minLength) {\n          return domRange\n        }\n      }\n    }\n  }\n\n  withEvent(event, fn) {\n    let result\n    this.event = event\n    try {\n      result = fn.call(this)\n    } finally {\n      this.event = null\n    }\n    return result\n  }\n}\n\nconst staticRangeToRange = function(staticRange) {\n  const range = document.createRange()\n  range.setStart(staticRange.startContainer, staticRange.startOffset)\n  range.setEnd(staticRange.endContainer, staticRange.endOffset)\n  return range\n}\n\n// Event helpers\n\nconst dragEventHasFiles = (event) => Array.from(event.dataTransfer?.types || []).includes(\"Files\")\n\nconst processableFilePaste = (event) => {\n  // Paste events that only have files are handled by the paste event handler,\n  // to work around Safari not supporting beforeinput.insertFromPaste for files.\n\n  // MS Office text pastes include a file with a screenshot of the text, but we should\n  // handle them as text pastes.\n  return event.dataTransfer.files?.[0] && !pasteEventHasFilesOnly(event) && !dataTransferIsMsOfficePaste(event)\n}\n\nconst pasteEventHasFilesOnly = function(event) {\n  const clipboard = event.clipboardData\n  if (clipboard) {\n    const fileTypes = Array.from(clipboard.types).filter((type) => type.match(/file/i)) // \"Files\", \"application/x-moz-file\"\n    return fileTypes.length === clipboard.types.length && clipboard.files.length >= 1\n  }\n}\n\nconst pasteEventHasPlainTextOnly = function(event) {\n  const clipboard = event.clipboardData\n  if (clipboard) {\n    return clipboard.types.includes(\"text/plain\") && clipboard.types.length === 1\n  }\n}\n\nconst keyboardCommandFromKeyEvent = function(event) {\n  const command = []\n  if (event.altKey) {\n    command.push(\"alt\")\n  }\n  if (event.shiftKey) {\n    command.push(\"shift\")\n  }\n  command.push(event.key)\n  return command\n}\n\nconst pointFromEvent = (event) => ({\n  x: event.clientX,\n  y: event.clientY,\n})\n", "import BasicObject from \"trix/core/basic_object\"\n\nimport { findClosestElementFromNode, handleEvent, triggerEvent } from \"trix/core/helpers\"\n\nimport DOMPurify from \"dompurify\"\n\nconst attributeButtonSelector = \"[data-trix-attribute]\"\nconst actionButtonSelector = \"[data-trix-action]\"\nconst toolbarButtonSelector = `${attributeButtonSelector}, ${actionButtonSelector}`\nconst dialogSelector = \"[data-trix-dialog]\"\nconst activeDialogSelector = `${dialogSelector}[data-trix-active]`\nconst dialogButtonSelector = `${dialogSelector} [data-trix-method]`\nconst dialogInputSelector = `${dialogSelector} [data-trix-input]`\nconst getInputForDialog = (element, attributeName) => {\n  if (!attributeName) { attributeName = getAttributeName(element) }\n  return element.querySelector(`[data-trix-input][name='${attributeName}']`)\n}\nconst getActionName = (element) => element.getAttribute(\"data-trix-action\")\nconst getAttributeName = (element) => {\n  return element.getAttribute(\"data-trix-attribute\") || element.getAttribute(\"data-trix-dialog-attribute\")\n}\nconst getDialogName = (element) => element.getAttribute(\"data-trix-dialog\")\n\nexport default class ToolbarController extends BasicObject {\n  constructor(element) {\n    super(element)\n    this.didClickActionButton = this.didClickActionButton.bind(this)\n    this.didClickAttributeButton = this.didClickAttributeButton.bind(this)\n    this.didClickDialogButton = this.didClickDialogButton.bind(this)\n    this.didKeyDownDialogInput = this.didKeyDownDialogInput.bind(this)\n    this.element = element\n    this.attributes = {}\n    this.actions = {}\n    this.resetDialogInputs()\n\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      matchingSelector: actionButtonSelector,\n      withCallback: this.didClickActionButton,\n    })\n    handleEvent(\"mousedown\", {\n      onElement: this.element,\n      matchingSelector: attributeButtonSelector,\n      withCallback: this.didClickAttributeButton,\n    })\n    handleEvent(\"click\", { onElement: this.element, matchingSelector: toolbarButtonSelector, preventDefault: true })\n    handleEvent(\"click\", {\n      onElement: this.element,\n      matchingSelector: dialogButtonSelector,\n      withCallback: this.didClickDialogButton,\n    })\n    handleEvent(\"keydown\", {\n      onElement: this.element,\n      matchingSelector: dialogInputSelector,\n      withCallback: this.didKeyDownDialogInput,\n    })\n  }\n\n  // Event handlers\n\n  didClickActionButton(event, element) {\n    this.delegate?.toolbarDidClickButton()\n    event.preventDefault()\n    const actionName = getActionName(element)\n\n    if (this.getDialog(actionName)) {\n      return this.toggleDialog(actionName)\n    } else {\n      return this.delegate?.toolbarDidInvokeAction(actionName, element)\n    }\n  }\n\n  didClickAttributeButton(event, element) {\n    this.delegate?.toolbarDidClickButton()\n    event.preventDefault()\n    const attributeName = getAttributeName(element)\n\n    if (this.getDialog(attributeName)) {\n      this.toggleDialog(attributeName)\n    } else {\n      this.delegate?.toolbarDidToggleAttribute(attributeName)\n    }\n\n    return this.refreshAttributeButtons()\n  }\n\n  didClickDialogButton(event, element) {\n    const dialogElement = findClosestElementFromNode(element, { matchingSelector: dialogSelector })\n    const method = element.getAttribute(\"data-trix-method\")\n    return this[method].call(this, dialogElement)\n  }\n\n  didKeyDownDialogInput(event, element) {\n    if (event.keyCode === 13) {\n      // Enter key\n      event.preventDefault()\n      const attribute = element.getAttribute(\"name\")\n      const dialog = this.getDialog(attribute)\n      this.setAttribute(dialog)\n    }\n    if (event.keyCode === 27) {\n      // Escape key\n      event.preventDefault()\n      return this.hideDialog()\n    }\n  }\n\n  // Action buttons\n\n  updateActions(actions) {\n    this.actions = actions\n    return this.refreshActionButtons()\n  }\n\n  refreshActionButtons() {\n    return this.eachActionButton((element, actionName) => {\n      element.disabled = this.actions[actionName] === false\n    })\n  }\n\n  eachActionButton(callback) {\n    return Array.from(this.element.querySelectorAll(actionButtonSelector)).map((element) =>\n      callback(element, getActionName(element))\n    )\n  }\n\n  // Attribute buttons\n\n  updateAttributes(attributes) {\n    this.attributes = attributes\n    return this.refreshAttributeButtons()\n  }\n\n  refreshAttributeButtons() {\n    return this.eachAttributeButton((element, attributeName) => {\n      element.disabled = this.attributes[attributeName] === false\n      if (this.attributes[attributeName] || this.dialogIsVisible(attributeName)) {\n        element.setAttribute(\"data-trix-active\", \"\")\n        return element.classList.add(\"trix-active\")\n      } else {\n        element.removeAttribute(\"data-trix-active\")\n        return element.classList.remove(\"trix-active\")\n      }\n    })\n  }\n\n  eachAttributeButton(callback) {\n    return Array.from(this.element.querySelectorAll(attributeButtonSelector)).map((element) =>\n      callback(element, getAttributeName(element))\n    )\n  }\n\n  applyKeyboardCommand(keys) {\n    const keyString = JSON.stringify(keys.sort())\n    for (const button of Array.from(this.element.querySelectorAll(\"[data-trix-key]\"))) {\n      const buttonKeys = button.getAttribute(\"data-trix-key\").split(\"+\")\n      const buttonKeyString = JSON.stringify(buttonKeys.sort())\n      if (buttonKeyString === keyString) {\n        triggerEvent(\"mousedown\", { onElement: button })\n        return true\n      }\n    }\n    return false\n  }\n\n  // Dialogs\n\n  dialogIsVisible(dialogName) {\n    const element = this.getDialog(dialogName)\n    if (element) {\n      return element.hasAttribute(\"data-trix-active\")\n    }\n  }\n\n  toggleDialog(dialogName) {\n    if (this.dialogIsVisible(dialogName)) {\n      return this.hideDialog()\n    } else {\n      return this.showDialog(dialogName)\n    }\n  }\n\n  showDialog(dialogName) {\n    this.hideDialog()\n    this.delegate?.toolbarWillShowDialog()\n\n    const element = this.getDialog(dialogName)\n    element.setAttribute(\"data-trix-active\", \"\")\n    element.classList.add(\"trix-active\")\n\n    Array.from(element.querySelectorAll(\"input[disabled]\")).forEach((disabledInput) => {\n      disabledInput.removeAttribute(\"disabled\")\n    })\n\n    const attributeName = getAttributeName(element)\n    if (attributeName) {\n      const input = getInputForDialog(element, dialogName)\n      if (input) {\n        input.value = this.attributes[attributeName] || \"\"\n        input.select()\n      }\n    }\n\n    return this.delegate?.toolbarDidShowDialog(dialogName)\n  }\n\n  setAttribute(dialogElement) {\n    const attributeName = getAttributeName(dialogElement)\n    const input = getInputForDialog(dialogElement, attributeName)\n\n    if (input.willValidate) {\n      input.setCustomValidity(\"\")\n      if (!input.checkValidity() || !this.isSafeAttribute(input)) {\n        input.setCustomValidity(\"Invalid value\")\n        input.setAttribute(\"data-trix-validate\", \"\")\n        input.classList.add(\"trix-validate\")\n        return input.focus()\n      }\n    }\n    this.delegate?.toolbarDidUpdateAttribute(attributeName, input.value)\n    return this.hideDialog()\n  }\n\n  isSafeAttribute(input) {\n    if (input.hasAttribute(\"data-trix-validate-href\")) {\n      return DOMPurify.isValidAttribute(\"a\", \"href\", input.value)\n    } else {\n      return true\n    }\n  }\n\n  removeAttribute(dialogElement) {\n    const attributeName = getAttributeName(dialogElement)\n    this.delegate?.toolbarDidRemoveAttribute(attributeName)\n    return this.hideDialog()\n  }\n\n  hideDialog() {\n    const element = this.element.querySelector(activeDialogSelector)\n    if (element) {\n      element.removeAttribute(\"data-trix-active\")\n      element.classList.remove(\"trix-active\")\n      this.resetDialogInputs()\n      return this.delegate?.toolbarDidHideDialog(getDialogName(element))\n    }\n  }\n\n  resetDialogInputs() {\n    Array.from(this.element.querySelectorAll(dialogInputSelector)).forEach((input) => {\n      input.setAttribute(\"disabled\", \"disabled\")\n      input.removeAttribute(\"data-trix-validate\")\n      input.classList.remove(\"trix-validate\")\n    })\n  }\n\n  getDialog(dialogName) {\n    return this.element.querySelector(`[data-trix-dialog=${dialogName}]`)\n  }\n}\n", "/* eslint-disable\n    id-length,\n*/\nimport * as config from \"trix/config\"\n\nimport { serializeToContentType } from \"trix/core/serialization\"\n\nimport Controller from \"trix/controllers/controller\"\nimport Level0InputController from \"trix/controllers/level_0_input_controller\"\nimport Level2InputController from \"trix/controllers/level_2_input_controller\"\nimport CompositionController from \"trix/controllers/composition_controller\"\nimport ToolbarController from \"trix/controllers/toolbar_controller\"\nimport Composition from \"trix/models/composition\"\nimport Editor from \"trix/models/editor\"\nimport AttachmentManager from \"trix/models/attachment_manager\"\nimport SelectionManager from \"trix/models/selection_manager\"\n\nimport { getBlockConfig, objectsAreEqual, rangeIsCollapsed, rangesAreEqual } from \"trix/core/helpers\"\nimport { selectionChangeObserver } from \"trix/observers/selection_change_observer\"\n\nconst snapshotsAreEqual = (a, b) => rangesAreEqual(a.selectedRange, b.selectedRange) && a.document.isEqualTo(b.document)\n\nexport default class EditorController extends Controller {\n  static actions = {\n    undo: {\n      test() {\n        return this.editor.canUndo()\n      },\n      perform() {\n        return this.editor.undo()\n      },\n    },\n    redo: {\n      test() {\n        return this.editor.canRedo()\n      },\n      perform() {\n        return this.editor.redo()\n      },\n    },\n    link: {\n      test() {\n        return this.editor.canActivateAttribute(\"href\")\n      },\n    },\n    increaseNestingLevel: {\n      test() {\n        return this.editor.canIncreaseNestingLevel()\n      },\n      perform() {\n        return this.editor.increaseNestingLevel() && this.render()\n      },\n    },\n    decreaseNestingLevel: {\n      test() {\n        return this.editor.canDecreaseNestingLevel()\n      },\n      perform() {\n        return this.editor.decreaseNestingLevel() && this.render()\n      },\n    },\n    attachFiles: {\n      test() {\n        return true\n      },\n      perform() {\n        return config.input.pickFiles(this.editor.insertFiles)\n      },\n    },\n  }\n\n  constructor({ editorElement, document, html }) {\n    super(...arguments)\n    this.editorElement = editorElement\n    this.selectionManager = new SelectionManager(this.editorElement)\n    this.selectionManager.delegate = this\n\n    this.composition = new Composition()\n    this.composition.delegate = this\n\n    this.attachmentManager = new AttachmentManager(this.composition.getAttachments())\n    this.attachmentManager.delegate = this\n\n    this.inputController =\n      config.input.getLevel() === 2\n        ? new Level2InputController(this.editorElement)\n        : new Level0InputController(this.editorElement)\n\n    this.inputController.delegate = this\n    this.inputController.responder = this.composition\n\n    this.compositionController = new CompositionController(this.editorElement, this.composition)\n    this.compositionController.delegate = this\n\n    this.toolbarController = new ToolbarController(this.editorElement.toolbarElement)\n    this.toolbarController.delegate = this\n\n    this.editor = new Editor(this.composition, this.selectionManager, this.editorElement)\n    if (document) {\n      this.editor.loadDocument(document)\n    } else {\n      this.editor.loadHTML(html)\n    }\n  }\n\n  registerSelectionManager() {\n    return selectionChangeObserver.registerSelectionManager(this.selectionManager)\n  }\n\n  unregisterSelectionManager() {\n    return selectionChangeObserver.unregisterSelectionManager(this.selectionManager)\n  }\n\n  render() {\n    return this.compositionController.render()\n  }\n\n  reparse() {\n    return this.composition.replaceHTML(this.editorElement.innerHTML)\n  }\n\n  // Composition delegate\n\n  compositionDidChangeDocument(document) {\n    this.notifyEditorElement(\"document-change\")\n    if (!this.handlingInput) {\n      return this.render()\n    }\n  }\n\n  compositionDidChangeCurrentAttributes(currentAttributes) {\n    this.currentAttributes = currentAttributes\n    this.toolbarController.updateAttributes(this.currentAttributes)\n    this.updateCurrentActions()\n    return this.notifyEditorElement(\"attributes-change\", { attributes: this.currentAttributes })\n  }\n\n  compositionDidPerformInsertionAtRange(range) {\n    if (this.pasting) {\n      this.pastedRange = range\n    }\n  }\n\n  compositionShouldAcceptFile(file) {\n    return this.notifyEditorElement(\"file-accept\", { file })\n  }\n\n  compositionDidAddAttachment(attachment) {\n    const managedAttachment = this.attachmentManager.manageAttachment(attachment)\n    return this.notifyEditorElement(\"attachment-add\", { attachment: managedAttachment })\n  }\n\n  compositionDidEditAttachment(attachment) {\n    this.compositionController.rerenderViewForObject(attachment)\n    const managedAttachment = this.attachmentManager.manageAttachment(attachment)\n    this.notifyEditorElement(\"attachment-edit\", { attachment: managedAttachment })\n    return this.notifyEditorElement(\"change\")\n  }\n\n  compositionDidChangeAttachmentPreviewURL(attachment) {\n    this.compositionController.invalidateViewForObject(attachment)\n    return this.notifyEditorElement(\"change\")\n  }\n\n  compositionDidRemoveAttachment(attachment) {\n    const managedAttachment = this.attachmentManager.unmanageAttachment(attachment)\n    return this.notifyEditorElement(\"attachment-remove\", { attachment: managedAttachment })\n  }\n\n  compositionDidStartEditingAttachment(attachment, options) {\n    this.attachmentLocationRange = this.composition.document.getLocationRangeOfAttachment(attachment)\n    this.compositionController.installAttachmentEditorForAttachment(attachment, options)\n    return this.selectionManager.setLocationRange(this.attachmentLocationRange)\n  }\n\n  compositionDidStopEditingAttachment(attachment) {\n    this.compositionController.uninstallAttachmentEditor()\n    this.attachmentLocationRange = null\n  }\n\n  compositionDidRequestChangingSelectionToLocationRange(locationRange) {\n    if (this.loadingSnapshot && !this.isFocused()) return\n    this.requestedLocationRange = locationRange\n    this.compositionRevisionWhenLocationRangeRequested = this.composition.revision\n    if (!this.handlingInput) {\n      return this.render()\n    }\n  }\n\n  compositionWillLoadSnapshot() {\n    this.loadingSnapshot = true\n  }\n\n  compositionDidLoadSnapshot() {\n    this.compositionController.refreshViewCache()\n    this.render()\n    this.loadingSnapshot = false\n  }\n\n  getSelectionManager() {\n    return this.selectionManager\n  }\n\n  // Attachment manager delegate\n\n  attachmentManagerDidRequestRemovalOfAttachment(attachment) {\n    return this.removeAttachment(attachment)\n  }\n\n  // Document controller delegate\n\n  compositionControllerWillSyncDocumentView() {\n    this.inputController.editorWillSyncDocumentView()\n    this.selectionManager.lock()\n    return this.selectionManager.clearSelection()\n  }\n\n  compositionControllerDidSyncDocumentView() {\n    this.inputController.editorDidSyncDocumentView()\n    this.selectionManager.unlock()\n    this.updateCurrentActions()\n    return this.notifyEditorElement(\"sync\")\n  }\n\n  compositionControllerDidRender() {\n    if (this.requestedLocationRange) {\n      if (this.compositionRevisionWhenLocationRangeRequested === this.composition.revision) {\n        this.selectionManager.setLocationRange(this.requestedLocationRange)\n      }\n      this.requestedLocationRange = null\n      this.compositionRevisionWhenLocationRangeRequested = null\n    }\n\n    if (this.renderedCompositionRevision !== this.composition.revision) {\n      this.runEditorFilters()\n      this.composition.updateCurrentAttributes()\n      this.notifyEditorElement(\"render\")\n    }\n\n    this.renderedCompositionRevision = this.composition.revision\n  }\n\n  compositionControllerDidFocus() {\n    if (this.isFocusedInvisibly()) {\n      this.setLocationRange({ index: 0, offset: 0 })\n    }\n    this.toolbarController.hideDialog()\n    return this.notifyEditorElement(\"focus\")\n  }\n\n  compositionControllerDidBlur() {\n    return this.notifyEditorElement(\"blur\")\n  }\n\n  compositionControllerDidSelectAttachment(attachment, options) {\n    this.toolbarController.hideDialog()\n    return this.composition.editAttachment(attachment, options)\n  }\n\n  compositionControllerDidRequestDeselectingAttachment(attachment) {\n    const locationRange = this.attachmentLocationRange || this.composition.document.getLocationRangeOfAttachment(attachment)\n    return this.selectionManager.setLocationRange(locationRange[1])\n  }\n\n  compositionControllerWillUpdateAttachment(attachment) {\n    return this.editor.recordUndoEntry(\"Edit Attachment\", { context: attachment.id, consolidatable: true })\n  }\n\n  compositionControllerDidRequestRemovalOfAttachment(attachment) {\n    return this.removeAttachment(attachment)\n  }\n\n  // Input controller delegate\n\n  inputControllerWillHandleInput() {\n    this.handlingInput = true\n    this.requestedRender = false\n  }\n\n  inputControllerDidRequestRender() {\n    this.requestedRender = true\n  }\n\n  inputControllerDidHandleInput() {\n    this.handlingInput = false\n    if (this.requestedRender) {\n      this.requestedRender = false\n      return this.render()\n    }\n  }\n\n  inputControllerDidAllowUnhandledInput() {\n    return this.notifyEditorElement(\"change\")\n  }\n\n  inputControllerDidRequestReparse() {\n    return this.reparse()\n  }\n\n  inputControllerWillPerformTyping() {\n    return this.recordTypingUndoEntry()\n  }\n\n  inputControllerWillPerformFormatting(attributeName) {\n    return this.recordFormattingUndoEntry(attributeName)\n  }\n\n  inputControllerWillCutText() {\n    return this.editor.recordUndoEntry(\"Cut\")\n  }\n\n  inputControllerWillPaste(paste) {\n    this.editor.recordUndoEntry(\"Paste\")\n    this.pasting = true\n    return this.notifyEditorElement(\"before-paste\", { paste })\n  }\n\n  inputControllerDidPaste(paste) {\n    paste.range = this.pastedRange\n    this.pastedRange = null\n    this.pasting = null\n    return this.notifyEditorElement(\"paste\", { paste })\n  }\n\n  inputControllerWillMoveText() {\n    return this.editor.recordUndoEntry(\"Move\")\n  }\n\n  inputControllerWillAttachFiles() {\n    return this.editor.recordUndoEntry(\"Drop Files\")\n  }\n\n  inputControllerWillPerformUndo() {\n    return this.editor.undo()\n  }\n\n  inputControllerWillPerformRedo() {\n    return this.editor.redo()\n  }\n\n  inputControllerDidReceiveKeyboardCommand(keys) {\n    return this.toolbarController.applyKeyboardCommand(keys)\n  }\n\n  inputControllerDidStartDrag() {\n    this.locationRangeBeforeDrag = this.selectionManager.getLocationRange()\n  }\n\n  inputControllerDidReceiveDragOverPoint(point) {\n    return this.selectionManager.setLocationRangeFromPointRange(point)\n  }\n\n  inputControllerDidCancelDrag() {\n    this.selectionManager.setLocationRange(this.locationRangeBeforeDrag)\n    this.locationRangeBeforeDrag = null\n  }\n\n  // Selection manager delegate\n\n  locationRangeDidChange(locationRange) {\n    this.composition.updateCurrentAttributes()\n    this.updateCurrentActions()\n    if (this.attachmentLocationRange && !rangesAreEqual(this.attachmentLocationRange, locationRange)) {\n      this.composition.stopEditingAttachment()\n    }\n    return this.notifyEditorElement(\"selection-change\")\n  }\n\n  // Toolbar controller delegate\n\n  toolbarDidClickButton() {\n    if (!this.getLocationRange()) {\n      return this.setLocationRange({ index: 0, offset: 0 })\n    }\n  }\n\n  toolbarDidInvokeAction(actionName, invokingElement) {\n    return this.invokeAction(actionName, invokingElement)\n  }\n\n  toolbarDidToggleAttribute(attributeName) {\n    this.recordFormattingUndoEntry(attributeName)\n    this.composition.toggleCurrentAttribute(attributeName)\n    this.render()\n    if (!this.selectionFrozen) {\n      return this.editorElement.focus()\n    }\n  }\n\n  toolbarDidUpdateAttribute(attributeName, value) {\n    this.recordFormattingUndoEntry(attributeName)\n    this.composition.setCurrentAttribute(attributeName, value)\n    this.render()\n    if (!this.selectionFrozen) {\n      return this.editorElement.focus()\n    }\n  }\n\n  toolbarDidRemoveAttribute(attributeName) {\n    this.recordFormattingUndoEntry(attributeName)\n    this.composition.removeCurrentAttribute(attributeName)\n    this.render()\n    if (!this.selectionFrozen) {\n      return this.editorElement.focus()\n    }\n  }\n\n  toolbarWillShowDialog(dialogElement) {\n    this.composition.expandSelectionForEditing()\n    return this.freezeSelection()\n  }\n\n  toolbarDidShowDialog(dialogName) {\n    return this.notifyEditorElement(\"toolbar-dialog-show\", { dialogName })\n  }\n\n  toolbarDidHideDialog(dialogName) {\n    this.thawSelection()\n    this.editorElement.focus()\n    return this.notifyEditorElement(\"toolbar-dialog-hide\", { dialogName })\n  }\n\n  // Selection\n\n  freezeSelection() {\n    if (!this.selectionFrozen) {\n      this.selectionManager.lock()\n      this.composition.freezeSelection()\n      this.selectionFrozen = true\n      return this.render()\n    }\n  }\n\n  thawSelection() {\n    if (this.selectionFrozen) {\n      this.composition.thawSelection()\n      this.selectionManager.unlock()\n      this.selectionFrozen = false\n      return this.render()\n    }\n  }\n\n  canInvokeAction(actionName) {\n    if (this.actionIsExternal(actionName)) {\n      return true\n    } else {\n      return !!this.actions[actionName]?.test?.call(this)\n    }\n  }\n\n  invokeAction(actionName, invokingElement) {\n    if (this.actionIsExternal(actionName)) {\n      return this.notifyEditorElement(\"action-invoke\", { actionName, invokingElement })\n    } else {\n      return this.actions[actionName]?.perform?.call(this)\n    }\n  }\n\n  actionIsExternal(actionName) {\n    return /^x-./.test(actionName)\n  }\n\n  getCurrentActions() {\n    const result = {}\n    for (const actionName in this.actions) {\n      result[actionName] = this.canInvokeAction(actionName)\n    }\n    return result\n  }\n\n  updateCurrentActions() {\n    const currentActions = this.getCurrentActions()\n    if (!objectsAreEqual(currentActions, this.currentActions)) {\n      this.currentActions = currentActions\n      this.toolbarController.updateActions(this.currentActions)\n      return this.notifyEditorElement(\"actions-change\", { actions: this.currentActions })\n    }\n  }\n\n  // Editor filters\n\n  runEditorFilters() {\n    let snapshot = this.composition.getSnapshot()\n\n    Array.from(this.editor.filters).forEach((filter) => {\n      const { document, selectedRange } = snapshot\n      snapshot = filter.call(this.editor, snapshot) || {}\n      if (!snapshot.document) {\n        snapshot.document = document\n      }\n      if (!snapshot.selectedRange) {\n        snapshot.selectedRange = selectedRange\n      }\n    })\n\n    if (!snapshotsAreEqual(snapshot, this.composition.getSnapshot())) {\n      return this.composition.loadSnapshot(snapshot)\n    }\n  }\n\n  // Private\n\n  updateInputElement() {\n    const element = this.compositionController.getSerializableElement()\n    const value = serializeToContentType(element, \"text/html\")\n    return this.editorElement.setFormValue(value)\n  }\n\n  notifyEditorElement(message, data) {\n    switch (message) {\n      case \"document-change\":\n        this.documentChangedSinceLastRender = true\n        break\n      case \"render\":\n        if (this.documentChangedSinceLastRender) {\n          this.documentChangedSinceLastRender = false\n          this.notifyEditorElement(\"change\")\n        }\n        break\n      case \"change\":\n      case \"attachment-add\":\n      case \"attachment-edit\":\n      case \"attachment-remove\":\n        this.updateInputElement()\n        break\n    }\n\n    return this.editorElement.notify(message, data)\n  }\n\n  removeAttachment(attachment) {\n    this.editor.recordUndoEntry(\"Delete Attachment\")\n    this.composition.removeAttachment(attachment)\n    return this.render()\n  }\n\n  recordFormattingUndoEntry(attributeName) {\n    const blockConfig = getBlockConfig(attributeName)\n    const locationRange = this.selectionManager.getLocationRange()\n    if (blockConfig || !rangeIsCollapsed(locationRange)) {\n      return this.editor.recordUndoEntry(\"Formatting\", { context: this.getUndoContext(), consolidatable: true })\n    }\n  }\n\n  recordTypingUndoEntry() {\n    return this.editor.recordUndoEntry(\"Typing\", {\n      context: this.getUndoContext(this.currentAttributes),\n      consolidatable: true,\n    })\n  }\n\n  getUndoContext(...context) {\n    return [ this.getLocationContext(), this.getTimeContext(), ...Array.from(context) ]\n  }\n\n  getLocationContext() {\n    const locationRange = this.selectionManager.getLocationRange()\n    if (rangeIsCollapsed(locationRange)) {\n      return locationRange[0].index\n    } else {\n      return locationRange\n    }\n  }\n\n  getTimeContext() {\n    if (config.undo.interval > 0) {\n      return Math.floor(new Date().getTime() / config.undo.interval)\n    } else {\n      return 0\n    }\n  }\n\n  isFocused() {\n    return this.editorElement === this.editorElement.ownerDocument?.activeElement\n  }\n\n  // Detect \"Cursor disappears sporadically\" Firefox bug.\n  // - https://bugzilla.mozilla.org/show_bug.cgi?id=226301\n  isFocusedInvisibly() {\n    return this.isFocused() && !this.getLocationRange()\n  }\n\n  get actions() {\n    return this.constructor.actions\n  }\n}\n\nEditorController.proxyMethod(\"getSelectionManager().setLocationRange\")\nEditorController.proxyMethod(\"getSelectionManager().getLocationRange\")\n", "import * as config from \"trix/config\"\n\nimport { installDefaultCSSForTagName } from \"trix/core/helpers\"\n\ninstallDefaultCSSForTagName(\"trix-toolbar\", `\\\n%t {\n  display: block;\n}\n\n%t {\n  white-space: nowrap;\n}\n\n%t [data-trix-dialog] {\n  display: none;\n}\n\n%t [data-trix-dialog][data-trix-active] {\n  display: block;\n}\n\n%t [data-trix-dialog] [data-trix-validate]:invalid {\n  background-color: #ffdddd;\n}`)\n\nexport default class TrixToolbarElement extends HTMLElement {\n\n  // Element lifecycle\n\n  connectedCallback() {\n    if (this.innerHTML === \"\") {\n      this.innerHTML = config.toolbar.getDefaultHTML()\n    }\n  }\n}\n", "import * as config from \"trix/config\"\n\nimport {\n  findClosestElementFromNode,\n  handleEvent,\n  handleEventOnce,\n  installDefaultCSSForTagName,\n  makeElement,\n  triggerEvent,\n} from \"trix/core/helpers\"\n\nimport { attachmentSelector } from \"trix/config/attachments\"\nimport EditorController from \"trix/controllers/editor_controller\"\nimport \"trix/elements/trix_toolbar_element\"\n\nlet id = 0\n\n// Contenteditable support helpers\n\nconst autofocus = function(element) {\n  if (!document.querySelector(\":focus\")) {\n    if (element.hasAttribute(\"autofocus\") && document.querySelector(\"[autofocus]\") === element) {\n      return element.focus()\n    }\n  }\n}\n\nconst makeEditable = function(element) {\n  if (element.hasAttribute(\"contenteditable\")) {\n    return\n  }\n  element.setAttribute(\"contenteditable\", \"\")\n  return handleEventOnce(\"focus\", {\n    onElement: element,\n    withCallback() {\n      return configureContentEditable(element)\n    },\n  })\n}\n\nconst configureContentEditable = function(element) {\n  disableObjectResizing(element)\n  return setDefaultParagraphSeparator(element)\n}\n\nconst disableObjectResizing = function(element) {\n  if (document.queryCommandSupported?.(\"enableObjectResizing\")) {\n    document.execCommand(\"enableObjectResizing\", false, false)\n    return handleEvent(\"mscontrolselect\", { onElement: element, preventDefault: true })\n  }\n}\n\nconst setDefaultParagraphSeparator = function(element) {\n  if (document.queryCommandSupported?.(\"DefaultParagraphSeparator\")) {\n    const { tagName } = config.blockAttributes.default\n    if ([ \"div\", \"p\" ].includes(tagName)) {\n      return document.execCommand(\"DefaultParagraphSeparator\", false, tagName)\n    }\n  }\n}\n\n// Accessibility helpers\n\nconst addAccessibilityRole = function(element) {\n  if (element.hasAttribute(\"role\")) {\n    return\n  }\n  return element.setAttribute(\"role\", \"textbox\")\n}\n\nconst ensureAriaLabel = function(element) {\n  if (element.hasAttribute(\"aria-label\") || element.hasAttribute(\"aria-labelledby\")) {\n    return\n  }\n\n  const update = function() {\n    const texts = Array.from(element.labels).map((label) => {\n      if (!label.contains(element)) return label.textContent\n    }).filter(text => text)\n\n    const text = texts.join(\" \")\n    if (text) {\n      return element.setAttribute(\"aria-label\", text)\n    } else {\n      return element.removeAttribute(\"aria-label\")\n    }\n  }\n  update()\n  return handleEvent(\"focus\", { onElement: element, withCallback: update })\n}\n\n// Style\n\nconst cursorTargetStyles = (function() {\n  if (config.browser.forcesObjectResizing) {\n    return {\n      display: \"inline\",\n      width: \"auto\",\n    }\n  } else {\n    return {\n      display: \"inline-block\",\n      width: \"1px\",\n    }\n  }\n})()\n\ninstallDefaultCSSForTagName(\"trix-editor\", `\\\n%t {\n    display: block;\n}\n\n%t:empty::before {\n    content: attr(placeholder);\n    color: graytext;\n    cursor: text;\n    pointer-events: none;\n    white-space: pre-line;\n}\n\n%t a[contenteditable=false] {\n    cursor: text;\n}\n\n%t img {\n    max-width: 100%;\n    height: auto;\n}\n\n%t ${attachmentSelector} figcaption textarea {\n    resize: none;\n}\n\n%t ${attachmentSelector} figcaption textarea.trix-autoresize-clone {\n    position: absolute;\n    left: -9999px;\n    max-height: 0px;\n}\n\n%t ${attachmentSelector} figcaption[data-trix-placeholder]:empty::before {\n    content: attr(data-trix-placeholder);\n    color: graytext;\n}\n\n%t [data-trix-cursor-target] {\n    display: ${cursorTargetStyles.display} !important;\n    width: ${cursorTargetStyles.width} !important;\n    padding: 0 !important;\n    margin: 0 !important;\n    border: none !important;\n}\n\n%t [data-trix-cursor-target=left] {\n    vertical-align: top !important;\n    margin-left: -1px !important;\n}\n\n%t [data-trix-cursor-target=right] {\n    vertical-align: bottom !important;\n    margin-right: -1px !important;\n}`)\n\nclass ElementInternalsDelegate {\n  #internals\n\n  constructor(element) {\n    this.element = element\n    this.#internals = element.attachInternals()\n  }\n\n  connectedCallback() {\n    this.#validate()\n  }\n\n  disconnectedCallback() {\n  }\n\n  get labels() {\n    return this.#internals.labels\n  }\n\n  get disabled() {\n    return this.element.inputElement?.disabled\n  }\n\n  set disabled(value) {\n    this.element.toggleAttribute(\"disabled\", value)\n  }\n\n  get required() {\n    return this.element.hasAttribute(\"required\")\n  }\n\n  set required(value) {\n    this.element.toggleAttribute(\"required\", value)\n    this.#validate()\n  }\n\n  get validity() {\n    return this.#internals.validity\n  }\n\n  get validationMessage() {\n    return this.#internals.validationMessage\n  }\n\n  get willValidate() {\n    return this.#internals.willValidate\n  }\n\n  setFormValue(value) {\n    this.#validate()\n  }\n\n  checkValidity() {\n    return this.#internals.checkValidity()\n  }\n\n  reportValidity() {\n    return this.#internals.reportValidity()\n  }\n\n  setCustomValidity(validationMessage) {\n    this.#validate(validationMessage)\n  }\n\n  #validate(customValidationMessage = \"\") {\n    const { required, value } = this.element\n    const valueMissing = required && !value\n    const customError = !!customValidationMessage\n    const input = makeElement(\"input\", { required })\n    const validationMessage = customValidationMessage || input.validationMessage\n\n    this.#internals.setValidity({ valueMissing, customError }, validationMessage)\n  }\n}\n\nclass LegacyDelegate {\n  #focusHandler\n\n  constructor(element) {\n    this.element = element\n  }\n\n  connectedCallback() {\n    this.#focusHandler = ensureAriaLabel(this.element)\n    window.addEventListener(\"reset\", this.#resetBubbled, false)\n    window.addEventListener(\"click\", this.#clickBubbled, false)\n  }\n\n  disconnectedCallback() {\n    this.#focusHandler?.destroy()\n    window.removeEventListener(\"reset\", this.#resetBubbled, false)\n    window.removeEventListener(\"click\", this.#clickBubbled, false)\n  }\n\n  get labels() {\n    const labels = []\n    if (this.element.id && this.element.ownerDocument) {\n      labels.push(...Array.from(this.element.ownerDocument.querySelectorAll(`label[for='${this.element.id}']`) || []))\n    }\n\n    const label = findClosestElementFromNode(this.element, { matchingSelector: \"label\" })\n    if (label) {\n      if ([ this.element, null ].includes(label.control)) {\n        labels.push(label)\n      }\n    }\n\n    return labels\n  }\n\n  get disabled() {\n    console.warn(\"This browser does not support the [disabled] attribute for trix-editor elements.\")\n\n    return false\n  }\n\n  set disabled(value) {\n    console.warn(\"This browser does not support the [disabled] attribute for trix-editor elements.\")\n  }\n\n  get required() {\n    console.warn(\"This browser does not support the [required] attribute for trix-editor elements.\")\n\n    return false\n  }\n\n  set required(value) {\n    console.warn(\"This browser does not support the [required] attribute for trix-editor elements.\")\n  }\n\n  get validity() {\n    console.warn(\"This browser does not support the validity property for trix-editor elements.\")\n    return null\n  }\n\n  get validationMessage() {\n    console.warn(\"This browser does not support the validationMessage property for trix-editor elements.\")\n\n    return \"\"\n  }\n\n  get willValidate() {\n    console.warn(\"This browser does not support the willValidate property for trix-editor elements.\")\n\n    return false\n  }\n\n  setFormValue(value) {\n  }\n\n  checkValidity() {\n    console.warn(\"This browser does not support checkValidity() for trix-editor elements.\")\n\n    return true\n  }\n\n  reportValidity() {\n    console.warn(\"This browser does not support reportValidity() for trix-editor elements.\")\n\n    return true\n  }\n\n  setCustomValidity(validationMessage) {\n    console.warn(\"This browser does not support setCustomValidity(validationMessage) for trix-editor elements.\")\n  }\n\n  #resetBubbled = (event) => {\n    if (event.defaultPrevented) return\n    if (event.target !== this.element.form) return\n    this.element.reset()\n  }\n\n  #clickBubbled = (event) => {\n    if (event.defaultPrevented) return\n    if (this.element.contains(event.target)) return\n\n    const label = findClosestElementFromNode(event.target, { matchingSelector: \"label\" })\n    if (!label) return\n\n    if (!Array.from(this.labels).includes(label)) return\n\n    this.element.focus()\n  }\n}\n\nexport default class TrixEditorElement extends HTMLElement {\n  static formAssociated = \"ElementInternals\" in window\n\n  static observedAttributes = [ \"connected\" ]\n\n  #delegate\n\n  constructor() {\n    super()\n    this.#delegate = this.constructor.formAssociated ?\n      new ElementInternalsDelegate(this) :\n      new LegacyDelegate(this)\n  }\n\n  // Properties\n\n  get trixId() {\n    if (this.hasAttribute(\"trix-id\")) {\n      return this.getAttribute(\"trix-id\")\n    } else {\n      this.setAttribute(\"trix-id\", ++id)\n      return this.trixId\n    }\n  }\n\n  get labels() {\n    return this.#delegate.labels\n  }\n\n  get disabled() {\n    return this.#delegate.disabled\n  }\n\n  set disabled(value) {\n    this.#delegate.disabled = value\n  }\n\n  get required() {\n    return this.#delegate.required\n  }\n\n  set required(value) {\n    this.#delegate.required = value\n  }\n\n  get validity() {\n    return this.#delegate.validity\n  }\n\n  get validationMessage() {\n    return this.#delegate.validationMessage\n  }\n\n  get willValidate() {\n    return this.#delegate.willValidate\n  }\n\n  get type() {\n    return this.localName\n  }\n\n  get toolbarElement() {\n    if (this.hasAttribute(\"toolbar\")) {\n      return this.ownerDocument?.getElementById(this.getAttribute(\"toolbar\"))\n    } else if (this.parentNode) {\n      const toolbarId = `trix-toolbar-${this.trixId}`\n      this.setAttribute(\"toolbar\", toolbarId)\n      this.internalToolbar = makeElement(\"trix-toolbar\", { id: toolbarId })\n      this.parentNode.insertBefore(this.internalToolbar, this)\n      return this.internalToolbar\n    } else {\n      return undefined\n    }\n  }\n\n  get form() {\n    return this.inputElement?.form\n  }\n\n  get inputElement() {\n    if (this.hasAttribute(\"input\")) {\n      return this.ownerDocument?.getElementById(this.getAttribute(\"input\"))\n    } else if (this.parentNode) {\n      const inputId = `trix-input-${this.trixId}`\n      this.setAttribute(\"input\", inputId)\n      const element = makeElement(\"input\", { type: \"hidden\", id: inputId })\n      this.parentNode.insertBefore(element, this.nextElementSibling)\n      return element\n    } else {\n      return undefined\n    }\n  }\n\n  get editor() {\n    return this.editorController?.editor\n  }\n\n  get name() {\n    return this.inputElement?.name\n  }\n\n  get value() {\n    return this.inputElement?.value\n  }\n\n  set value(defaultValue) {\n    this.defaultValue = defaultValue\n    this.editor?.loadHTML(this.defaultValue)\n  }\n\n  // Element callbacks\n\n  attributeChangedCallback(name, oldValue, newValue) {\n    if (name === \"connected\" && this.isConnected && oldValue != null && oldValue !== newValue) {\n      requestAnimationFrame(() => this.reconnect())\n    }\n  }\n\n  // Controller delegate methods\n\n  notify(message, data) {\n    if (this.editorController) {\n      return triggerEvent(`trix-${message}`, { onElement: this, attributes: data })\n    }\n  }\n\n  setFormValue(value) {\n    if (this.inputElement) {\n      this.inputElement.value = value\n      this.#delegate.setFormValue(value)\n    }\n  }\n\n  // Element lifecycle\n\n  connectedCallback() {\n    if (!this.hasAttribute(\"data-trix-internal\")) {\n      makeEditable(this)\n      addAccessibilityRole(this)\n\n      if (!this.editorController) {\n        triggerEvent(\"trix-before-initialize\", { onElement: this })\n        this.editorController = new EditorController({\n          editorElement: this,\n          html: this.defaultValue = this.value,\n        })\n        requestAnimationFrame(() => triggerEvent(\"trix-initialize\", { onElement: this }))\n      }\n      this.editorController.registerSelectionManager()\n      this.#delegate.connectedCallback()\n\n      this.toggleAttribute(\"connected\", true)\n      autofocus(this)\n    }\n  }\n\n  disconnectedCallback() {\n    this.editorController?.unregisterSelectionManager()\n    this.#delegate.disconnectedCallback()\n    this.toggleAttribute(\"connected\", false)\n  }\n\n  reconnect() {\n    this.removeInternalToolbar()\n    this.disconnectedCallback()\n    this.connectedCallback()\n  }\n\n  removeInternalToolbar() {\n    this.internalToolbar?.remove()\n    this.internalToolbar = null\n  }\n\n  // Form support\n\n  checkValidity() {\n    return this.#delegate.checkValidity()\n  }\n\n  reportValidity() {\n    return this.#delegate.reportValidity()\n  }\n\n  setCustomValidity(validationMessage) {\n    this.#delegate.setCustomValidity(validationMessage)\n  }\n\n  formDisabledCallback(disabled) {\n    if (this.inputElement) {\n      this.inputElement.disabled = disabled\n    }\n    this.toggleAttribute(\"contenteditable\", !disabled)\n  }\n\n  formResetCallback() {\n    this.reset()\n  }\n\n  reset() {\n    this.value = this.defaultValue\n  }\n}\n", "import { version } from \"../../package.json\"\n\nimport * as config from \"trix/config\"\nimport * as core from \"trix/core\"\nimport * as models from \"trix/models\"\nimport * as views from \"trix/views\"\nimport * as controllers from \"trix/controllers\"\nimport * as observers from \"trix/observers\"\nimport * as operations from \"trix/operations\"\nimport * as elements from \"trix/elements\"\nimport * as filters from \"trix/filters\"\n\nconst Trix = {\n  VERSION: version,\n  config,\n  core,\n  models,\n  views,\n  controllers,\n  observers,\n  operations,\n  elements,\n  filters\n}\n\n// Expose models under the Trix constant for compatibility with v1\nObject.assign(Trix, models)\n\nfunction start() {\n  if (!customElements.get(\"trix-toolbar\")) {\n    customElements.define(\"trix-toolbar\", elements.TrixToolbarElement)\n  }\n\n  if (!customElements.get(\"trix-editor\")) {\n    customElements.define(\"trix-editor\", elements.TrixEditorElement)\n  }\n}\n\nwindow.Trix = Trix\nsetTimeout(start, 0)\n\nexport default Trix\n", "var sparkMd5 = {\n  exports: {}\n};\n\n(function(module, exports) {\n  (function(factory) {\n    {\n      module.exports = factory();\n    }\n  })((function(undefined$1) {\n    var hex_chr = [ \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\" ];\n    function md5cycle(x, k) {\n      var a = x[0], b = x[1], c = x[2], d = x[3];\n      a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[10] - 42063 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n      a = (a << 7 | a >>> 25) + b | 0;\n      d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n      d = (d << 12 | d >>> 20) + a | 0;\n      c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n      c = (c << 17 | c >>> 15) + d | 0;\n      b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n      b = (b << 22 | b >>> 10) + c | 0;\n      a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n      a = (a << 5 | a >>> 27) + b | 0;\n      d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n      d = (d << 9 | d >>> 23) + a | 0;\n      c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n      c = (c << 14 | c >>> 18) + d | 0;\n      b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n      b = (b << 20 | b >>> 12) + c | 0;\n      a += (b ^ c ^ d) + k[5] - 378558 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n      a = (a << 4 | a >>> 28) + b | 0;\n      d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n      d = (d << 11 | d >>> 21) + a | 0;\n      c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n      c = (c << 16 | c >>> 16) + d | 0;\n      b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n      b = (b << 23 | b >>> 9) + c | 0;\n      a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n      a = (a << 6 | a >>> 26) + b | 0;\n      d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n      d = (d << 10 | d >>> 22) + a | 0;\n      c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n      c = (c << 15 | c >>> 17) + d | 0;\n      b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n      b = (b << 21 | b >>> 11) + c | 0;\n      x[0] = a + x[0] | 0;\n      x[1] = b + x[1] | 0;\n      x[2] = c + x[2] | 0;\n      x[3] = d + x[3] | 0;\n    }\n    function md5blk(s) {\n      var md5blks = [], i;\n      for (i = 0; i < 64; i += 4) {\n        md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n      }\n      return md5blks;\n    }\n    function md5blk_array(a) {\n      var md5blks = [], i;\n      for (i = 0; i < 64; i += 4) {\n        md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n      }\n      return md5blks;\n    }\n    function md51(s) {\n      var n = s.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n      for (i = 64; i <= n; i += 64) {\n        md5cycle(state, md5blk(s.substring(i - 64, i)));\n      }\n      s = s.substring(i - 64);\n      length = s.length;\n      tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3);\n      }\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(state, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = n * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(state, tail);\n      return state;\n    }\n    function md51_array(a) {\n      var n = a.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n      for (i = 64; i <= n; i += 64) {\n        md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n      }\n      a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0);\n      length = a.length;\n      tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= a[i] << (i % 4 << 3);\n      }\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(state, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = n * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(state, tail);\n      return state;\n    }\n    function rhex(n) {\n      var s = \"\", j;\n      for (j = 0; j < 4; j += 1) {\n        s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15];\n      }\n      return s;\n    }\n    function hex(x) {\n      var i;\n      for (i = 0; i < x.length; i += 1) {\n        x[i] = rhex(x[i]);\n      }\n      return x.join(\"\");\n    }\n    if (hex(md51(\"hello\")) !== \"5d41402abc4b2a76b9719d911017c592\") ;\n    if (typeof ArrayBuffer !== \"undefined\" && !ArrayBuffer.prototype.slice) {\n      (function() {\n        function clamp(val, length) {\n          val = val | 0 || 0;\n          if (val < 0) {\n            return Math.max(val + length, 0);\n          }\n          return Math.min(val, length);\n        }\n        ArrayBuffer.prototype.slice = function(from, to) {\n          var length = this.byteLength, begin = clamp(from, length), end = length, num, target, targetArray, sourceArray;\n          if (to !== undefined$1) {\n            end = clamp(to, length);\n          }\n          if (begin > end) {\n            return new ArrayBuffer(0);\n          }\n          num = end - begin;\n          target = new ArrayBuffer(num);\n          targetArray = new Uint8Array(target);\n          sourceArray = new Uint8Array(this, begin, num);\n          targetArray.set(sourceArray);\n          return target;\n        };\n      })();\n    }\n    function toUtf8(str) {\n      if (/[\\u0080-\\uFFFF]/.test(str)) {\n        str = unescape(encodeURIComponent(str));\n      }\n      return str;\n    }\n    function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n      var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i;\n      for (i = 0; i < length; i += 1) {\n        arr[i] = str.charCodeAt(i);\n      }\n      return returnUInt8Array ? arr : buff;\n    }\n    function arrayBuffer2Utf8Str(buff) {\n      return String.fromCharCode.apply(null, new Uint8Array(buff));\n    }\n    function concatenateArrayBuffers(first, second, returnUInt8Array) {\n      var result = new Uint8Array(first.byteLength + second.byteLength);\n      result.set(new Uint8Array(first));\n      result.set(new Uint8Array(second), first.byteLength);\n      return returnUInt8Array ? result : result.buffer;\n    }\n    function hexToBinaryString(hex) {\n      var bytes = [], length = hex.length, x;\n      for (x = 0; x < length - 1; x += 2) {\n        bytes.push(parseInt(hex.substr(x, 2), 16));\n      }\n      return String.fromCharCode.apply(String, bytes);\n    }\n    function SparkMD5() {\n      this.reset();\n    }\n    SparkMD5.prototype.append = function(str) {\n      this.appendBinary(toUtf8(str));\n      return this;\n    };\n    SparkMD5.prototype.appendBinary = function(contents) {\n      this._buff += contents;\n      this._length += contents.length;\n      var length = this._buff.length, i;\n      for (i = 64; i <= length; i += 64) {\n        md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n      }\n      this._buff = this._buff.substring(i - 64);\n      return this;\n    };\n    SparkMD5.prototype.end = function(raw) {\n      var buff = this._buff, length = buff.length, i, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ret;\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3);\n      }\n      this._finish(tail, length);\n      ret = hex(this._hash);\n      if (raw) {\n        ret = hexToBinaryString(ret);\n      }\n      this.reset();\n      return ret;\n    };\n    SparkMD5.prototype.reset = function() {\n      this._buff = \"\";\n      this._length = 0;\n      this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n      return this;\n    };\n    SparkMD5.prototype.getState = function() {\n      return {\n        buff: this._buff,\n        length: this._length,\n        hash: this._hash.slice()\n      };\n    };\n    SparkMD5.prototype.setState = function(state) {\n      this._buff = state.buff;\n      this._length = state.length;\n      this._hash = state.hash;\n      return this;\n    };\n    SparkMD5.prototype.destroy = function() {\n      delete this._hash;\n      delete this._buff;\n      delete this._length;\n    };\n    SparkMD5.prototype._finish = function(tail, length) {\n      var i = length, tmp, lo, hi;\n      tail[i >> 2] |= 128 << (i % 4 << 3);\n      if (i > 55) {\n        md5cycle(this._hash, tail);\n        for (i = 0; i < 16; i += 1) {\n          tail[i] = 0;\n        }\n      }\n      tmp = this._length * 8;\n      tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n      lo = parseInt(tmp[2], 16);\n      hi = parseInt(tmp[1], 16) || 0;\n      tail[14] = lo;\n      tail[15] = hi;\n      md5cycle(this._hash, tail);\n    };\n    SparkMD5.hash = function(str, raw) {\n      return SparkMD5.hashBinary(toUtf8(str), raw);\n    };\n    SparkMD5.hashBinary = function(content, raw) {\n      var hash = md51(content), ret = hex(hash);\n      return raw ? hexToBinaryString(ret) : ret;\n    };\n    SparkMD5.ArrayBuffer = function() {\n      this.reset();\n    };\n    SparkMD5.ArrayBuffer.prototype.append = function(arr) {\n      var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i;\n      this._length += arr.byteLength;\n      for (i = 64; i <= length; i += 64) {\n        md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n      }\n      this._buff = i - 64 < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n      return this;\n    };\n    SparkMD5.ArrayBuffer.prototype.end = function(raw) {\n      var buff = this._buff, length = buff.length, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], i, ret;\n      for (i = 0; i < length; i += 1) {\n        tail[i >> 2] |= buff[i] << (i % 4 << 3);\n      }\n      this._finish(tail, length);\n      ret = hex(this._hash);\n      if (raw) {\n        ret = hexToBinaryString(ret);\n      }\n      this.reset();\n      return ret;\n    };\n    SparkMD5.ArrayBuffer.prototype.reset = function() {\n      this._buff = new Uint8Array(0);\n      this._length = 0;\n      this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n      return this;\n    };\n    SparkMD5.ArrayBuffer.prototype.getState = function() {\n      var state = SparkMD5.prototype.getState.call(this);\n      state.buff = arrayBuffer2Utf8Str(state.buff);\n      return state;\n    };\n    SparkMD5.ArrayBuffer.prototype.setState = function(state) {\n      state.buff = utf8Str2ArrayBuffer(state.buff, true);\n      return SparkMD5.prototype.setState.call(this, state);\n    };\n    SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n    SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n    SparkMD5.ArrayBuffer.hash = function(arr, raw) {\n      var hash = md51_array(new Uint8Array(arr)), ret = hex(hash);\n      return raw ? hexToBinaryString(ret) : ret;\n    };\n    return SparkMD5;\n  }));\n})(sparkMd5);\n\nvar SparkMD5 = sparkMd5.exports;\n\nconst fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;\n\nclass FileChecksum {\n  static create(file, callback) {\n    const instance = new FileChecksum(file);\n    instance.create(callback);\n  }\n  constructor(file) {\n    this.file = file;\n    this.chunkSize = 2097152;\n    this.chunkCount = Math.ceil(this.file.size / this.chunkSize);\n    this.chunkIndex = 0;\n  }\n  create(callback) {\n    this.callback = callback;\n    this.md5Buffer = new SparkMD5.ArrayBuffer;\n    this.fileReader = new FileReader;\n    this.fileReader.addEventListener(\"load\", (event => this.fileReaderDidLoad(event)));\n    this.fileReader.addEventListener(\"error\", (event => this.fileReaderDidError(event)));\n    this.readNextChunk();\n  }\n  fileReaderDidLoad(event) {\n    this.md5Buffer.append(event.target.result);\n    if (!this.readNextChunk()) {\n      const binaryDigest = this.md5Buffer.end(true);\n      const base64digest = btoa(binaryDigest);\n      this.callback(null, base64digest);\n    }\n  }\n  fileReaderDidError(event) {\n    this.callback(`Error reading ${this.file.name}`);\n  }\n  readNextChunk() {\n    if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {\n      const start = this.chunkIndex * this.chunkSize;\n      const end = Math.min(start + this.chunkSize, this.file.size);\n      const bytes = fileSlice.call(this.file, start, end);\n      this.fileReader.readAsArrayBuffer(bytes);\n      this.chunkIndex++;\n      return true;\n    } else {\n      return false;\n    }\n  }\n}\n\nfunction getMetaValue(name) {\n  const element = findElement(document.head, `meta[name=\"${name}\"]`);\n  if (element) {\n    return element.getAttribute(\"content\");\n  }\n}\n\nfunction findElements(root, selector) {\n  if (typeof root == \"string\") {\n    selector = root;\n    root = document;\n  }\n  const elements = root.querySelectorAll(selector);\n  return toArray(elements);\n}\n\nfunction findElement(root, selector) {\n  if (typeof root == \"string\") {\n    selector = root;\n    root = document;\n  }\n  return root.querySelector(selector);\n}\n\nfunction dispatchEvent(element, type, eventInit = {}) {\n  const {disabled: disabled} = element;\n  const {bubbles: bubbles, cancelable: cancelable, detail: detail} = eventInit;\n  const event = document.createEvent(\"Event\");\n  event.initEvent(type, bubbles || true, cancelable || true);\n  event.detail = detail || {};\n  try {\n    element.disabled = false;\n    element.dispatchEvent(event);\n  } finally {\n    element.disabled = disabled;\n  }\n  return event;\n}\n\nfunction toArray(value) {\n  if (Array.isArray(value)) {\n    return value;\n  } else if (Array.from) {\n    return Array.from(value);\n  } else {\n    return [].slice.call(value);\n  }\n}\n\nclass BlobRecord {\n  constructor(file, checksum, url, customHeaders = {}) {\n    this.file = file;\n    this.attributes = {\n      filename: file.name,\n      content_type: file.type || \"application/octet-stream\",\n      byte_size: file.size,\n      checksum: checksum\n    };\n    this.xhr = new XMLHttpRequest;\n    this.xhr.open(\"POST\", url, true);\n    this.xhr.responseType = \"json\";\n    this.xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n    this.xhr.setRequestHeader(\"Accept\", \"application/json\");\n    this.xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n    Object.keys(customHeaders).forEach((headerKey => {\n      this.xhr.setRequestHeader(headerKey, customHeaders[headerKey]);\n    }));\n    const csrfToken = getMetaValue(\"csrf-token\");\n    if (csrfToken != undefined) {\n      this.xhr.setRequestHeader(\"X-CSRF-Token\", csrfToken);\n    }\n    this.xhr.addEventListener(\"load\", (event => this.requestDidLoad(event)));\n    this.xhr.addEventListener(\"error\", (event => this.requestDidError(event)));\n  }\n  get status() {\n    return this.xhr.status;\n  }\n  get response() {\n    const {responseType: responseType, response: response} = this.xhr;\n    if (responseType == \"json\") {\n      return response;\n    } else {\n      return JSON.parse(response);\n    }\n  }\n  create(callback) {\n    this.callback = callback;\n    this.xhr.send(JSON.stringify({\n      blob: this.attributes\n    }));\n  }\n  requestDidLoad(event) {\n    if (this.status >= 200 && this.status < 300) {\n      const {response: response} = this;\n      const {direct_upload: direct_upload} = response;\n      delete response.direct_upload;\n      this.attributes = response;\n      this.directUploadData = direct_upload;\n      this.callback(null, this.toJSON());\n    } else {\n      this.requestDidError(event);\n    }\n  }\n  requestDidError(event) {\n    this.callback(`Error creating Blob for \"${this.file.name}\". Status: ${this.status}`);\n  }\n  toJSON() {\n    const result = {};\n    for (const key in this.attributes) {\n      result[key] = this.attributes[key];\n    }\n    return result;\n  }\n}\n\nclass BlobUpload {\n  constructor(blob) {\n    this.blob = blob;\n    this.file = blob.file;\n    const {url: url, headers: headers} = blob.directUploadData;\n    this.xhr = new XMLHttpRequest;\n    this.xhr.open(\"PUT\", url, true);\n    this.xhr.responseType = \"text\";\n    for (const key in headers) {\n      this.xhr.setRequestHeader(key, headers[key]);\n    }\n    this.xhr.addEventListener(\"load\", (event => this.requestDidLoad(event)));\n    this.xhr.addEventListener(\"error\", (event => this.requestDidError(event)));\n  }\n  create(callback) {\n    this.callback = callback;\n    this.xhr.send(this.file.slice());\n  }\n  requestDidLoad(event) {\n    const {status: status, response: response} = this.xhr;\n    if (status >= 200 && status < 300) {\n      this.callback(null, response);\n    } else {\n      this.requestDidError(event);\n    }\n  }\n  requestDidError(event) {\n    this.callback(`Error storing \"${this.file.name}\". Status: ${this.xhr.status}`);\n  }\n}\n\nlet id = 0;\n\nclass DirectUpload {\n  constructor(file, url, delegate, customHeaders = {}) {\n    this.id = ++id;\n    this.file = file;\n    this.url = url;\n    this.delegate = delegate;\n    this.customHeaders = customHeaders;\n  }\n  create(callback) {\n    FileChecksum.create(this.file, ((error, checksum) => {\n      if (error) {\n        callback(error);\n        return;\n      }\n      const blob = new BlobRecord(this.file, checksum, this.url, this.customHeaders);\n      notify(this.delegate, \"directUploadWillCreateBlobWithXHR\", blob.xhr);\n      blob.create((error => {\n        if (error) {\n          callback(error);\n        } else {\n          const upload = new BlobUpload(blob);\n          notify(this.delegate, \"directUploadWillStoreFileWithXHR\", upload.xhr);\n          upload.create((error => {\n            if (error) {\n              callback(error);\n            } else {\n              callback(null, blob.toJSON());\n            }\n          }));\n        }\n      }));\n    }));\n  }\n}\n\nfunction notify(object, methodName, ...messages) {\n  if (object && typeof object[methodName] == \"function\") {\n    return object[methodName](...messages);\n  }\n}\n\nclass DirectUploadController {\n  constructor(input, file) {\n    this.input = input;\n    this.file = file;\n    this.directUpload = new DirectUpload(this.file, this.url, this);\n    this.dispatch(\"initialize\");\n  }\n  start(callback) {\n    const hiddenInput = document.createElement(\"input\");\n    hiddenInput.type = \"hidden\";\n    hiddenInput.name = this.input.name;\n    this.input.insertAdjacentElement(\"beforebegin\", hiddenInput);\n    this.dispatch(\"start\");\n    this.directUpload.create(((error, attributes) => {\n      if (error) {\n        hiddenInput.parentNode.removeChild(hiddenInput);\n        this.dispatchError(error);\n      } else {\n        hiddenInput.value = attributes.signed_id;\n      }\n      this.dispatch(\"end\");\n      callback(error);\n    }));\n  }\n  uploadRequestDidProgress(event) {\n    const progress = event.loaded / event.total * 100;\n    if (progress) {\n      this.dispatch(\"progress\", {\n        progress: progress\n      });\n    }\n  }\n  get url() {\n    return this.input.getAttribute(\"data-direct-upload-url\");\n  }\n  dispatch(name, detail = {}) {\n    detail.file = this.file;\n    detail.id = this.directUpload.id;\n    return dispatchEvent(this.input, `direct-upload:${name}`, {\n      detail: detail\n    });\n  }\n  dispatchError(error) {\n    const event = this.dispatch(\"error\", {\n      error: error\n    });\n    if (!event.defaultPrevented) {\n      alert(error);\n    }\n  }\n  directUploadWillCreateBlobWithXHR(xhr) {\n    this.dispatch(\"before-blob-request\", {\n      xhr: xhr\n    });\n  }\n  directUploadWillStoreFileWithXHR(xhr) {\n    this.dispatch(\"before-storage-request\", {\n      xhr: xhr\n    });\n    xhr.upload.addEventListener(\"progress\", (event => this.uploadRequestDidProgress(event)));\n  }\n}\n\nconst inputSelector = \"input[type=file][data-direct-upload-url]:not([disabled])\";\n\nclass DirectUploadsController {\n  constructor(form) {\n    this.form = form;\n    this.inputs = findElements(form, inputSelector).filter((input => input.files.length));\n  }\n  start(callback) {\n    const controllers = this.createDirectUploadControllers();\n    const startNextController = () => {\n      const controller = controllers.shift();\n      if (controller) {\n        controller.start((error => {\n          if (error) {\n            callback(error);\n            this.dispatch(\"end\");\n          } else {\n            startNextController();\n          }\n        }));\n      } else {\n        callback();\n        this.dispatch(\"end\");\n      }\n    };\n    this.dispatch(\"start\");\n    startNextController();\n  }\n  createDirectUploadControllers() {\n    const controllers = [];\n    this.inputs.forEach((input => {\n      toArray(input.files).forEach((file => {\n        const controller = new DirectUploadController(input, file);\n        controllers.push(controller);\n      }));\n    }));\n    return controllers;\n  }\n  dispatch(name, detail = {}) {\n    return dispatchEvent(this.form, `direct-uploads:${name}`, {\n      detail: detail\n    });\n  }\n}\n\nconst processingAttribute = \"data-direct-uploads-processing\";\n\nconst submitButtonsByForm = new WeakMap;\n\nlet started = false;\n\nfunction start() {\n  if (!started) {\n    started = true;\n    document.addEventListener(\"click\", didClick, true);\n    document.addEventListener(\"submit\", didSubmitForm, true);\n    document.addEventListener(\"ajax:before\", didSubmitRemoteElement);\n  }\n}\n\nfunction didClick(event) {\n  const button = event.target.closest(\"button, input\");\n  if (button && button.type === \"submit\" && button.form) {\n    submitButtonsByForm.set(button.form, button);\n  }\n}\n\nfunction didSubmitForm(event) {\n  handleFormSubmissionEvent(event);\n}\n\nfunction didSubmitRemoteElement(event) {\n  if (event.target.tagName == \"FORM\") {\n    handleFormSubmissionEvent(event);\n  }\n}\n\nfunction handleFormSubmissionEvent(event) {\n  const form = event.target;\n  if (form.hasAttribute(processingAttribute)) {\n    event.preventDefault();\n    return;\n  }\n  const controller = new DirectUploadsController(form);\n  const {inputs: inputs} = controller;\n  if (inputs.length) {\n    event.preventDefault();\n    form.setAttribute(processingAttribute, \"\");\n    inputs.forEach(disable);\n    controller.start((error => {\n      form.removeAttribute(processingAttribute);\n      if (error) {\n        inputs.forEach(enable);\n      } else {\n        submitForm(form);\n      }\n    }));\n  }\n}\n\nfunction submitForm(form) {\n  let button = submitButtonsByForm.get(form) || findElement(form, \"input[type=submit], button[type=submit]\");\n  if (button) {\n    const {disabled: disabled} = button;\n    button.disabled = false;\n    button.focus();\n    button.click();\n    button.disabled = disabled;\n  } else {\n    button = document.createElement(\"input\");\n    button.type = \"submit\";\n    button.style.display = \"none\";\n    form.appendChild(button);\n    button.click();\n    form.removeChild(button);\n  }\n  submitButtonsByForm.delete(form);\n}\n\nfunction disable(input) {\n  input.disabled = true;\n}\n\nfunction enable(input) {\n  input.disabled = false;\n}\n\nfunction autostart() {\n  if (window.ActiveStorage) {\n    start();\n  }\n}\n\nsetTimeout(autostart, 1);\n\nclass AttachmentUpload {\n  constructor(attachment, element) {\n    this.attachment = attachment;\n    this.element = element;\n    this.directUpload = new DirectUpload(attachment.file, this.directUploadUrl, this);\n  }\n  start() {\n    this.directUpload.create(this.directUploadDidComplete.bind(this));\n    this.dispatch(\"start\");\n  }\n  directUploadWillStoreFileWithXHR(xhr) {\n    xhr.upload.addEventListener(\"progress\", (event => {\n      const progress = event.loaded / event.total * 100;\n      this.attachment.setUploadProgress(progress);\n      if (progress) {\n        this.dispatch(\"progress\", {\n          progress: progress\n        });\n      }\n    }));\n  }\n  directUploadDidComplete(error, attributes) {\n    if (error) {\n      this.dispatchError(error);\n    } else {\n      this.attachment.setAttributes({\n        sgid: attributes.attachable_sgid,\n        url: this.createBlobUrl(attributes.signed_id, attributes.filename)\n      });\n      this.dispatch(\"end\");\n    }\n  }\n  createBlobUrl(signedId, filename) {\n    return this.blobUrlTemplate.replace(\":signed_id\", signedId).replace(\":filename\", encodeURIComponent(filename));\n  }\n  dispatch(name, detail = {}) {\n    detail.attachment = this.attachment;\n    return dispatchEvent(this.element, `direct-upload:${name}`, {\n      detail: detail\n    });\n  }\n  dispatchError(error) {\n    const event = this.dispatch(\"error\", {\n      error: error\n    });\n    if (!event.defaultPrevented) {\n      alert(error);\n    }\n  }\n  get directUploadUrl() {\n    return this.element.dataset.directUploadUrl;\n  }\n  get blobUrlTemplate() {\n    return this.element.dataset.blobUrlTemplate;\n  }\n}\n\naddEventListener(\"trix-attachment-add\", (event => {\n  const {attachment: attachment, target: target} = event;\n  if (attachment.file) {\n    const upload = new AttachmentUpload(attachment, target);\n    upload.start();\n  }\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\nconst application = Application.start();\n\nwindow.Stimulus = application;\n\nexport { application };\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Free / Premium / Paid checkboxes. All three are real flags and can be\n// combined (a paid pack can also be in the Premium subscription). One rule,\n// mirrored on the server (StudioContent#ensure_paid_when_not_free_or_premium):\n// a sound that is neither Free nor Premium can only be bought, so it is Paid.\nexport default class extends Controller {\n  static targets = [\"free\", \"premium\", \"paid\"];\n\n  connect() {\n    this.enforcePaid();\n  }\n\n  // Free or Premium toggled -> if both are now off, Paid turns on\n  monetizationChanged() {\n    this.enforcePaid();\n  }\n\n  // Paid can't be switched off while Free and Premium are both off\n  paidChanged() {\n    this.enforcePaid();\n  }\n\n  enforcePaid() {\n    if (!this.freeTarget.checked && !this.premiumTarget.checked) {\n      this.paidTarget.checked = true;\n    }\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['anchor'];\n  static classes = ['highlight'];\n\n  connect() {\n    this.setupScrollSpy();\n  }\n\n  disconnect() {\n    if (this._scrollHandler) {\n      window.removeEventListener('scroll', this._scrollHandler);\n    }\n  }\n\n  anchorTargetConnected(element) {\n    this.scrollTo(element);\n  }\n\n  scrollTo(element) {\n    const anchor = window.location.hash?.replace(/^#/, '');\n    if (anchor && anchor === element.id) {\n      element.scrollIntoView({\n        block: 'start',\n        behavior: 'smooth'\n      });\n      element.classList.add(this.highlightClass);\n      element.focus()\n    }\n  }\n\n  scrollBy({params: { id }}) {\n    const element = document.getElementById(id)\n    if (element) {\n      element.scrollIntoView({\n        block: 'start',\n        behavior: 'smooth'\n      });\n    }\n  }\n\n  setupScrollSpy() {\n    const tocInputs = document.querySelectorAll('input[name=\"anchors\"]');\n    if (!tocInputs.length) return;\n\n    const headingIds = Array.from(tocInputs).map(i => i.id.replace(/-anchor$/, ''));\n    const headings = headingIds.map(id => document.getElementById(id)).filter(Boolean);\n    if (!headings.length) return;\n\n    // Offset = sticky header height + some buffer\n    const OFFSET = 130;\n\n    const updateActive = () => {\n      let activeId = headings[0]?.id;\n\n      for (const heading of headings) {\n        if (heading.getBoundingClientRect().top <= OFFSET) {\n          activeId = heading.id;\n        }\n      }\n\n      if (activeId) {\n        const radio = document.getElementById(`${activeId}-anchor`);\n        if (radio && !radio.checked) radio.checked = true;\n      }\n    };\n\n    this._scrollHandler = updateActive;\n    window.addEventListener('scroll', this._scrollHandler, { passive: true });\n    updateActive();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Removes its element when the close button is clicked (used by the\n// \"zip ready\" toast pushed over Turbo Streams).\nexport default class extends Controller {\n  close() {\n    this.element.remove();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Polls a background job's status URL until it reports ready, updating the\n// toast with any progress message on the way. Used for the zip download (turns\n// into a download button) and for the stuck-sounds promotion. Cable-free.\nexport default class extends Controller {\n  static targets = [\"status\"];\n  static values = {\n    url: String,\n    interval: { type: Number, default: 3000 },\n    maxAttempts: { type: Number, default: 150 }, // 150 \u00D7 3s \u2248 7.5 min\n    timeoutMessage: { type: String, default: \"This is taking too long \u2014 please try again later.\" },\n  };\n\n  connect() {\n    this.attempts = 0;\n    this.schedule();\n  }\n\n  disconnect() {\n    clearTimeout(this.timer);\n  }\n\n  schedule() {\n    this.timer = setTimeout(() => this.poll(), this.intervalValue);\n  }\n\n  async poll() {\n    this.attempts += 1;\n    try {\n      const res = await fetch(this.urlValue, { headers: { Accept: \"application/json\" } });\n      const data = await res.json();\n      if (data && data.ready) {\n        this.finish(data);\n        return;\n      }\n      if (data && data.message) this.statusTarget.textContent = data.message;\n    } catch (e) {\n      // network hiccup \u2014 keep trying\n    }\n\n    if (this.attempts >= this.maxAttemptsValue) {\n      this.statusTarget.textContent = this.timeoutMessageValue;\n      return;\n    }\n    this.schedule();\n  }\n\n  finish(data) {\n    this.statusTarget.textContent = data.message || \"Done.\";\n\n    if (data.url) {\n      const link = document.createElement(\"a\");\n      link.href = data.url;\n      link.textContent = \"\u2B07 Download zip\";\n      link.className =\n        \"px-4 py-2 bg-emerald-600 text-white rounded-lg font-semibold no-underline hover:bg-emerald-700\";\n      this.statusTarget.after(link);\n    }\n\n    if (data.failed) {\n      this.element.classList.remove(\"bg-emerald-50\", \"text-emerald-800\");\n      this.element.classList.add(\"bg-red-50\", \"text-red-800\");\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Auto-dismissing flash banner. Flash notices are broadcast over Turbo Streams to\n// every open tab of the session, and used to stay until clicked \u2014 blocking the UI\n// on admin pages (fixed overlay) and lingering on unrelated pages like the shop.\n// This removes them after a short delay while still allowing click-to-dismiss.\nexport default class extends Controller {\n  static values = { delay: { type: Number, default: 5000 } };\n\n  connect() {\n    this.timeout = setTimeout(() => this.close(), this.delayValue);\n  }\n\n  disconnect() {\n    clearTimeout(this.timeout);\n  }\n\n  close() {\n    this.element.remove();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"button\", \"status\", \"spinner\", \"icon\"]\n  static values = {\n    articleId: String,\n    locale: String,\n    jobId: String\n  }\n\n  connect() {\n    // Check for existing translation status on load\n    this.checkInitialStatus()\n  }\n\n  disconnect() {\n    this.stopPolling()\n  }\n\n  async checkInitialStatus() {\n    // Don't check if we don't have an article yet\n    if (!this.articleIdValue) return\n\n    try {\n      const response = await fetch(\n        `/admin/articles/${this.articleIdValue}/translation_status?target_locale=${this.localeValue}`,\n        {\n          headers: {\n            'Accept': 'application/json'\n          }\n        }\n      )\n\n      if (response.ok) {\n        const data = await response.json()\n        if (data.status === 'completed') {\n          this.showCompleted()\n        } else if (data.status === 'processing') {\n          this.updateStatus('Translation in progress...', 'text-blue-600')\n          this.showSpinner()\n          this.startPolling()\n        } else if (data.status === 'failed') {\n          this.showError(data.error || 'Translation failed')\n        }\n      }\n    } catch (error) {\n      console.error('Error checking translation status:', error)\n    }\n  }\n\n  async translate(event) {\n    event.preventDefault()\n\n    if (!this.articleIdValue || !this.localeValue) {\n      this.showError('Missing article or locale information')\n      return\n    }\n\n    this.updateStatus('Initiating translation...', 'text-blue-600')\n    this.showSpinner()\n    this.disableButton()\n\n    try {\n      const response = await fetch(`/admin/articles/${this.articleIdValue}/translate`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          target_locale: this.localeValue\n        })\n      })\n\n      const data = await response.json()\n\n      if (data.confirm_required) {\n        this.hideSpinner()\n        this.enableButton()\n\n        if (confirm(`${data.message}\\n\\nContinue?`)) {\n          // Re-submit with force flag\n          this.translateWithForce()\n        } else {\n          this.updateStatus('Translation cancelled', 'text-gray-600')\n        }\n        return\n      }\n\n      if (response.ok) {\n        this.jobIdValue = data.job_id\n        this.updateStatus('Translation queued...', 'text-blue-600')\n        this.startPolling()\n      } else {\n        this.showError(data.error || 'Translation failed to start')\n        this.enableButton()\n      }\n    } catch (error) {\n      console.error('Translation error:', error)\n      this.showError('Network error. Please try again.')\n      this.enableButton()\n    }\n  }\n\n  async translateWithForce() {\n    this.updateStatus('Initiating translation...', 'text-blue-600')\n    this.showSpinner()\n    this.disableButton()\n\n    try {\n      const response = await fetch(`/admin/articles/${this.articleIdValue}/translate`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          target_locale: this.localeValue,\n          force: 'true'\n        })\n      })\n\n      const data = await response.json()\n\n      if (response.ok) {\n        this.jobIdValue = data.job_id\n        this.updateStatus('Translation queued...', 'text-blue-600')\n        this.startPolling()\n      } else {\n        this.showError(data.error || 'Translation failed to start')\n        this.enableButton()\n      }\n    } catch (error) {\n      console.error('Translation error:', error)\n      this.showError('Network error. Please try again.')\n      this.enableButton()\n    }\n  }\n\n  startPolling() {\n    this.stopPolling() // Clear any existing interval\n    this.pollInterval = setInterval(() => {\n      this.checkStatus()\n    }, 2000) // Poll every 2 seconds\n  }\n\n  stopPolling() {\n    if (this.pollInterval) {\n      clearInterval(this.pollInterval)\n      this.pollInterval = null\n    }\n  }\n\n  async checkStatus() {\n    if (!this.jobIdValue && !this.localeValue) {\n      this.stopPolling()\n      return\n    }\n\n    try {\n      const params = new URLSearchParams({\n        target_locale: this.localeValue\n      })\n\n      if (this.jobIdValue) {\n        params.append('job_id', this.jobIdValue)\n      }\n\n      const response = await fetch(\n        `/admin/articles/${this.articleIdValue}/translation_status?${params}`,\n        {\n          headers: {\n            'Accept': 'application/json'\n          }\n        }\n      )\n\n      if (response.ok) {\n        const data = await response.json()\n\n        switch (data.status) {\n          case 'pending':\n            this.updateStatus('Translation queued...', 'text-blue-600')\n            break\n          case 'processing':\n            this.updateStatus('Translating content...', 'text-blue-600')\n            break\n          case 'completed':\n            this.stopPolling()\n            this.showCompleted()\n            break\n          case 'failed':\n            this.stopPolling()\n            this.showError(data.error || 'Translation failed')\n            break\n        }\n      } else if (response.status === 404) {\n        // Job not found yet, keep polling\n        this.updateStatus('Waiting for translation job...', 'text-blue-600')\n      }\n    } catch (error) {\n      console.error('Status check error:', error)\n    }\n  }\n\n  async applyTranslation(event) {\n    event.preventDefault()\n\n    this.updateStatus('Applying translation...', 'text-blue-600')\n\n    try {\n      const params = new URLSearchParams({\n        target_locale: this.localeValue\n      })\n\n      if (this.jobIdValue) {\n        params.append('job_id', this.jobIdValue)\n      }\n\n      const response = await fetch(\n        `/admin/articles/${this.articleIdValue}/apply_translation?${params}`,\n        {\n          method: 'POST',\n          headers: {\n            'Accept': 'application/json'\n          }\n        }\n      )\n\n      const data = await response.json()\n\n      if (response.ok) {\n        this.updateStatus('Translation applied! Reloading...', 'text-green-600')\n\n        // Reload the page after a short delay\n        setTimeout(() => {\n          window.location.reload()\n        }, 1000)\n      } else {\n        this.showError(data.error || 'Failed to apply translation')\n      }\n    } catch (error) {\n      console.error('Apply translation error:', error)\n      this.showError('Network error. Please try again.')\n    }\n  }\n\n  showCompleted() {\n    this.hideSpinner()\n    this.enableButton()\n    this.updateStatus('Translation complete! Click Apply to use it.', 'text-green-600')\n    this.showApplyButton()\n  }\n\n  showError(message) {\n    this.hideSpinner()\n    this.enableButton()\n    this.updateStatus(`Error: ${message}`, 'text-red-600')\n  }\n\n  updateStatus(message, colorClass) {\n    if (this.hasStatusTarget) {\n      this.statusTarget.textContent = message\n      // Remove all color classes and add the new one\n      this.statusTarget.className = this.statusTarget.className\n        .replace(/text-(blue|green|red|gray)-\\d+/g, '')\n      this.statusTarget.classList.add(colorClass, 'text-xs')\n    }\n  }\n\n  showSpinner() {\n    if (this.hasSpinnerTarget) {\n      this.spinnerTarget.classList.remove('hidden')\n    }\n  }\n\n  hideSpinner() {\n    if (this.hasSpinnerTarget) {\n      this.spinnerTarget.classList.add('hidden')\n    }\n  }\n\n  disableButton() {\n    if (this.hasButtonTarget) {\n      this.buttonTarget.disabled = true\n      this.buttonTarget.classList.add('opacity-50', 'cursor-not-allowed')\n    }\n  }\n\n  enableButton() {\n    if (this.hasButtonTarget) {\n      this.buttonTarget.disabled = false\n      this.buttonTarget.classList.remove('opacity-50', 'cursor-not-allowed')\n    }\n  }\n\n  showApplyButton() {\n    const applyContainer = this.element.querySelector('[data-translation-apply-container]')\n    if (applyContainer) {\n      applyContainer.classList.remove('hidden')\n    }\n  }\n}\n", "// Client-side dismissable toast. Appends to #flash_messages (the area the\n// server-rendered/broadcast toasts also use) and falls back to <body>.\n// Uses textContent only, so messages can't inject markup.\nexport function showToast(message, type = \"error\") {\n  const container = document.getElementById(\"flash_messages\") || document.body;\n  const colors =\n    type === \"error\" ? \"bg-red-50 text-red-800\" : \"bg-emerald-50 text-emerald-800\";\n  const closeColor =\n    type === \"error\" ? \"text-red-700 hover:text-red-900\" : \"text-emerald-700 hover:text-emerald-900\";\n\n  const toast = document.createElement(\"div\");\n  toast.className = `p-4 rounded-xl my-2 flex items-center gap-3 break-words ${colors}`;\n\n  const text = document.createElement(\"span\");\n  text.textContent = message;\n\n  const close = document.createElement(\"button\");\n  close.type = \"button\";\n  close.setAttribute(\"aria-label\", \"Close\");\n  close.textContent = \"\u2715\";\n  close.className = `ml-auto font-bold text-lg leading-none ${closeColor}`;\n  close.addEventListener(\"click\", () => toast.remove());\n\n  toast.appendChild(text);\n  toast.appendChild(close);\n  container.appendChild(toast);\n  return toast;\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { showToast } from \"../shared/toast\";\n\nexport default class extends Controller {\n  static targets = ['audio', 'button', 'duration', 'playIcon', 'pauseIcon', 'player', 'playerBtn', 'playerPlayIcon', 'playerPauseIcon', 'playerLink', 'playerImg', 'playerTitle', 'playerType', 'seeker', 'timer'];\n  static values = { current: Number };\n  static classes = [];\n\n  get audio() {\n    return this.audioTarget\n  }\n\n  get duration() {\n    return this.durationTarget\n  }\n\n  get playlist() {\n    return JSON.parse(localStorage.getItem('playlist'))\n  }\n\n  get seeker() {\n    return this.seekerTarget\n  }\n\n  get timer() {\n    return this.timerTarget\n  }\n\n/** Implementation of the functionality of the audio player */\n\n\n  calculateTime(secs) {\n    const minutes = Math.floor(secs / 60);\n    const seconds = Math.floor(secs % 60);\n    const returnedSeconds = seconds < 10 ? `0${seconds}` : `${seconds}`;\n    return `${minutes}:${returnedSeconds}`;\n  }\n\n  whilePlaying = () => {\n    this.seeker.value = this.audio.currentTime;\n    this.seeker.dispatchEvent(new Event('input'));\n    this.timer.textContent = this.calculateTime(this.seeker.value);\n    this.raf = requestAnimationFrame(this.whilePlaying);\n  }\n\n  initialize() {\n    if (!this.audio.src) {\n      this.raf = null;\n      this.audio.src = 'data:audio/mpeg;base64,//OExAAAAAAAAAAAAEluZm8AAAAHAAAABAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAJAa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//MUxAAAAANIAAAAAExBTUUzLjk2LjFV//MUxAsAAANIAAAAAFVVVVVVVVVVVVVV//MUxBYAAANIAAAAAFVVVVVVVVVVVVVV//MUxCEAAANIAAAAAFVVVVVVVVVVVVVV';\n      document.body.addEventListener('click', this.unlockAudio)\n      document.body.addEventListener('touchstart', this.unlockAudio)\n    } else {\n      requestAnimationFrame(this.whilePlaying)\n    }\n\n    if (!this.playlist) {\n      localStorage.setItem('playlist', JSON.stringify([]))\n    }\n\n    this.audio.addEventListener('error', this.onAudioError)\n  }\n\n  // fires when a sample can't be loaded (file missing/unavailable on S3, e.g.\n  // a sample stuck in cache or not present in this environment's bucket)\n  onAudioError = () => {\n    const src = this.audio.currentSrc || this.audio.src;\n    if (!src || src.startsWith('data:') || !this.audio.error) return;\n\n    showToast(`Couldn't play \"${this.currentTitle || 'this sound'}\" \u2014 the audio file is missing or unavailable.`);\n\n    cancelAnimationFrame(this.raf);\n    this.buttonTargets.forEach(b => b.classList.remove('opacity-100'));\n    this.playIconTargets.forEach(i => i.classList.remove('hidden'));\n    this.pauseIconTargets.forEach(i => i.classList.add('hidden'));\n    if (this.hasPlayerTarget) this.playerTarget.classList.add('hidden');\n  }\n\n  playerSetup() {\n    this.duration.textContent = this.calculateTime(this.audio.duration);\n    this.seeker.max = Math.floor(this.audio.duration);\n  }\n\n  playerPause() {\n    cancelAnimationFrame(this.raf);\n    this.playerPlayIconTarget.classList.remove('hidden');\n    this.playerPauseIconTarget.classList.add('hidden');\n  }\n\n  playerResume() {\n    requestAnimationFrame(this.whilePlaying)\n    this.playerPlayIconTarget.classList.add('hidden');\n    this.playerPauseIconTarget.classList.remove('hidden');\n  }\n\n  playerStop() {\n    this.pauseIconTargets.forEach(icon => icon.classList.add('hidden'));\n    this.playIconTargets.forEach(icon => icon.classList.remove('hidden'));\n    this.playerPause();\n  }\n\n  seekerInput() {\n    this.timer.textContent = this.calculateTime(this.seeker.value);\n    if(!this.audio.paused) {\n      cancelAnimationFrame(this.raf);\n    }\n  }\n\n  seekerChange() {\n    this.audio.currentTime = this.seeker.value;\n      if(!this.audio.paused) {\n        requestAnimationFrame(this.whilePlaying);\n      }\n  }\n\n  unlockAudio = () => {\n    document.body.removeEventListener('click', this.unlockAudio);\n    document.body.removeEventListener('touchstart', this.unlockAudio);\n    this.audio\n      .play()\n      .then(() => {})\n      .catch(() => {})\n  };\n\n  play({ params: { url, img, link, title, type }, currentTarget }) {\n    const playIcon = this.playIconTargets.find(icon => icon.parentNode === currentTarget);\n    const pauseIcon = this.pauseIconTargets.find(icon => icon.parentNode === currentTarget);\n\n    if (this.audio.src === url) {\n      const isPlaying = !this.audio.paused;\n\n      if (isPlaying) {\n        currentTarget.classList.remove('opacity-100');\n        this.audio.pause();\n      }\n      else {\n        currentTarget.classList.add('opacity-100');\n        this.audio.play();\n      }\n\n      if (playIcon) {\n        isPlaying ? playIcon.classList.remove('hidden') : playIcon.classList.add('hidden');\n      }\n\n      if (pauseIcon) {\n        isPlaying ? pauseIcon.classList.add('hidden') : pauseIcon.classList.remove('hidden');\n      }\n    }\n    else {\n      this.playerTarget.classList.remove('hidden');\n      this.pauseIconTargets.forEach(icon => icon.classList.add('hidden'));\n      this.playIconTargets.forEach(icon => icon.classList.remove('hidden'));\n      this.buttonTargets.forEach(button => button.classList.remove('opacity-100'));\n      this.audio.src = url;\n      this.updatePlayerInfo(url, img, link, title, type);\n      currentTarget.classList.add('opacity-100');\n      playIcon.classList.add('hidden');\n      pauseIcon.classList.remove('hidden');\n      this.addToPlaylist({url, img, link, title, type})\n\n      this.audio.play();\n    }\n  }\n\n  updateVolume({ currentTarget }) {\n    this.audio.volume = currentTarget.value;\n  }\n\n  updatePlayerInfo(url, img, link, title, type) {\n    this.currentTitle = title;\n    this.playerBtnTarget.dataset.audioUrlParam = url;\n    this.playerImgTarget.src = img;\n    this.playerLinkTarget.href = link;\n    this.playerTitleTarget.innerText = title;\n    this.playerTypeTarget.innerText = type;\n  }\n\n  prev() {\n    let track;\n    if (this.currentValue === 9) {\n      track = this.playlist[9];\n    } else {\n      track = this.playlist[this.currentValue + 1];\n      this.currentValue += 1\n    }\n    this.audio.src = track.url;\n    this.updatePlayerInfo(track.url, track.img, track.link, track.title, track.type);\n    this.audio.play();\n  }\n\n  next() {\n    let track;\n    if (this.currentValue === 0) {\n      track = this.playlist[0];\n    } else {\n      track = this.playlist[this.currentValue - 1];\n      this.currentValue -= 1\n    }\n    this.audio.src = track.url;\n    this.updatePlayerInfo(track.url, track.img, track.link, track.title, track.type);\n    this.audio.play();\n  }\n\n  hide() {\n    this.playerTarget.classList.add('hidden');\n  }\n\n  addToPlaylist(track) {\n    let playlist = this.playlist;\n    playlist.unshift(track);\n    if (playlist.length > 10) {\n      playlist.length = 10;\n    }\n    localStorage.setItem('playlist', JSON.stringify(playlist));\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Row selection + bulk action toolbar for the admin Sounds table.\n// Selection works either on explicitly checked rows (ids[]) or, after\n// \"Select all matching\", on the whole filtered scope (all_matching=1 +\n// a copy of the current search form fields).\nexport default class extends Controller {\n  static targets = ['checkbox', 'selectAll', 'bar', 'counter', 'matchingLabel', 'allMatchingButton',\n                    'editModal', 'folderModal', 'folderFrom', 'folderFromLabel', 'folderTo',\n                    'folderDownloadForm', 'folderDownloadPath'];\n  static values = { matchingCount: Number, searchForm: String };\n\n  connect() {\n    this.allMatching = false;\n    // a filter/page change re-renders the table; reset selection then refresh\n    this.streamHandler = () => setTimeout(() => { this.allMatching = false; this.update(); }, 0);\n    document.addEventListener('turbo:before-stream-render', this.streamHandler);\n  }\n\n  disconnect() {\n    document.removeEventListener('turbo:before-stream-render', this.streamHandler);\n  }\n\n  get searchForm() {\n    return document.getElementById(this.searchFormValue || 'sounds-search-form');\n  }\n\n  get checkedBoxes() {\n    return this.checkboxTargets.filter(box => box.checked);\n  }\n\n  // live total of the current filtered scope (kept fresh by the search form's\n  // turbo_stream update of #totals), falling back to the page-load value\n  get matchingCount() {\n    const el = document.querySelector('[data-sounds-total]');\n    const live = el && parseInt(el.dataset.soundsTotal, 10);\n    return Number.isInteger(live) ? live : (this.matchingCountValue || 0);\n  }\n\n  update() {\n    if (this.hasSelectAllTarget) {\n      const boxes = this.checkboxTargets;\n      this.selectAllTarget.checked = boxes.length > 0 && boxes.every(box => box.checked);\n    }\n    this.refreshBar();\n  }\n\n  toggleAll(event) {\n    this.allMatching = false;\n    this.checkboxTargets.forEach(box => { box.checked = event.target.checked });\n    this.refreshBar();\n  }\n\n  rowToggled() {\n    this.allMatching = false;\n    this.update();\n  }\n\n  selectAllMatching() {\n    this.allMatching = true;\n    this.checkboxTargets.forEach(box => { box.checked = true });\n    this.refreshBar();\n  }\n\n  clearSelection() {\n    this.allMatching = false;\n    this.checkboxTargets.forEach(box => { box.checked = false });\n    if (this.hasSelectAllTarget) this.selectAllTarget.checked = false;\n    this.refreshBar();\n  }\n\n  refreshBar() {\n    const count = this.allMatching ? this.matchingCount : this.checkedBoxes.length;\n\n    if (this.hasBarTarget) this.barTarget.classList.toggle('hidden', count === 0);\n    if (this.hasCounterTarget) this.counterTarget.innerText = count;\n    if (this.hasMatchingLabelTarget) this.matchingLabelTarget.innerText = this.matchingCount;\n    if (this.hasAllMatchingButtonTarget) {\n      this.allMatchingButtonTarget.classList.toggle('hidden', this.allMatching);\n    }\n  }\n\n  openEdit(event) {\n    event.preventDefault();\n    if (!this.ensureSelection()) return;\n    this.editModalTarget.classList.remove('hidden');\n  }\n\n  closeEdit() {\n    this.editModalTarget.classList.add('hidden');\n  }\n\n  // \u270E / \u2B07 on a folder row. Both buttons share the row's data-bulk-path-param,\n  // and the page-level forms below do the work \u2014 a form per folder would mean\n  // thousands of them in the sidebar.\n  folderAction(event) {\n    const button = event.target.closest('[data-folder-action]');\n    if (!button) return;\n\n    event.preventDefault(); // keeps the click from also toggling the folder\n    if (button.dataset.folderAction === 'rename') {\n      this.openFolderModal(event.params.path);\n    } else {\n      this.folderDownloadPathTarget.value = event.params.path;\n      this.folderDownloadFormTarget.requestSubmit();\n    }\n  }\n\n  openFolderModal(path) {\n    this.folderFromTarget.value = path;\n    this.folderFromLabelTarget.innerText = path;\n    this.folderToTarget.value = path;\n    this.folderModalTarget.classList.remove('hidden');\n  }\n\n  closeFolderModal() {\n    this.folderModalTarget.classList.add('hidden');\n  }\n\n  closePreview() {\n    const modal = document.getElementById('bulk_modal');\n    if (modal) modal.innerHTML = '';\n  }\n\n  // attached as submit action on every bulk form: injects the current\n  // selection (ids or all_matching + filters) as hidden fields\n  injectSelection(event) {\n    const form = event.target;\n\n    if (!this.ensureSelection()) {\n      event.preventDefault();\n      return;\n    }\n\n    form.querySelectorAll('.bulk-injected').forEach(input => input.remove());\n\n    if (this.allMatching) {\n      this.addHidden(form, 'all_matching', '1');\n      if (this.searchForm) {\n        new FormData(this.searchForm).forEach((value, name) => {\n          if (value === '' || name === 'page' || name === 'authenticity_token') return;\n          this.addHidden(form, name, value);\n        });\n      }\n    } else {\n      this.checkedBoxes.forEach(box => this.addHidden(form, 'ids[]', box.value));\n    }\n\n    // so the action returns to the current filtered list, not the bare one\n    this.addHidden(form, 'return_to', this.currentFilteredPath());\n  }\n\n  // /admin/studio_contents?<current filters> built from the search form\n  currentFilteredPath() {\n    const base = '/admin/studio_contents';\n    if (!this.searchForm) return base;\n\n    const params = new URLSearchParams();\n    new FormData(this.searchForm).forEach((value, name) => {\n      if (value === '' || name === 'authenticity_token' || name === 'utf8') return;\n      params.append(name, value);\n    });\n    const qs = params.toString();\n    return qs ? `${base}?${qs}` : base;\n  }\n\n  ensureSelection() {\n    if (this.allMatching || this.checkedBoxes.length > 0) return true;\n\n    alert('Select at least one sound first');\n    return false;\n  }\n\n  addHidden(form, name, value) {\n    const input = document.createElement('input');\n    input.type = 'hidden';\n    input.name = name;\n    input.value = value;\n    input.classList.add('bulk-injected');\n    form.appendChild(input);\n  }\n}\n", "\n\nexport default {\n  _callback: null,\n\n  _read() {\n    return JSON.parse(localStorage.getItem(\"cart\")) || [];\n  },\n\n  _store(products) {\n    localStorage.setItem(\"cart\", JSON.stringify(products));\n  },\n\n  _clear() {\n    localStorage.removeItem(\"cart\");\n  },\n\n  add(product) {\n    let products = this._read();\n    if (!this.hasProduct(product.id, product.type)) {\n      products.push(product);\n      this._store(products);\n    }\n  },\n\n  remove(id, type) {\n    let products = this._read();\n    let index = products.findIndex(p => { return p.id === id && p.type === type });\n    if (index !== -1) {\n      products.splice(index, 1);\n      this._store(products);\n    }\n  },\n\n  hasProduct(id, type) {\n    let products = this._read();\n    let index = products.findIndex(p => { return p.id === id && p.type === type });\n    return (index !== -1);\n  },\n\n  reset() {\n    this._clear();\n  },\n\n  get products() {\n    return this._read();\n  },\n\n  set callback(value) {\n    this._callback = value;\n  }\n\n};\n", "const path = \";path=/\";\n\nexport function setCookie(name, value, urlDomain) {\n  let expires = \"\";\n\n  let d = new Date();\n  d.setTime(d.getTime() + 1000 * 3600 * 24 * 365);\n  expires = \";expires=\" + d.toUTCString();\n\n  const domain = \";domain=\" + (window.location.href.includes(urlDomain) ? \".\" + urlDomain : \".localhost.test\");\n\n  document.cookie = `${name}=${value}${domain}${expires}${path}`;\n}\n\nexport function getCookie(name) {\n  if (!decodeURIComponent(document.cookie)) return;\n\n  let pair = document.cookie.split(\"; \").find(s => s.startsWith(`${name}=`));\n  return pair && pair.substr(name.length + 1);\n}\n", "export class FetchResponse {\n  constructor (response) {\n    this.response = response\n  }\n\n  get statusCode () {\n    return this.response.status\n  }\n\n  get redirected () {\n    return this.response.redirected\n  }\n\n  get ok () {\n    return this.response.ok\n  }\n\n  get unauthenticated () {\n    return this.statusCode === 401\n  }\n\n  get unprocessableEntity () {\n    return this.statusCode === 422\n  }\n\n  get authenticationURL () {\n    return this.response.headers.get('WWW-Authenticate')\n  }\n\n  get contentType () {\n    const contentType = this.response.headers.get('Content-Type') || ''\n\n    return contentType.replace(/;.*$/, '')\n  }\n\n  get headers () {\n    return this.response.headers\n  }\n\n  get html () {\n    if (this.contentType.match(/^(application|text)\\/(html|xhtml\\+xml)$/)) {\n      return this.text\n    }\n\n    return Promise.reject(new Error(`Expected an HTML response but got \"${this.contentType}\" instead`))\n  }\n\n  get json () {\n    if (this.contentType.match(/^application\\/.*json$/)) {\n      return this.responseJson || (this.responseJson = this.response.json())\n    }\n\n    return Promise.reject(new Error(`Expected a JSON response but got \"${this.contentType}\" instead`))\n  }\n\n  get text () {\n    return this.responseText || (this.responseText = this.response.text())\n  }\n\n  get isTurboStream () {\n    return this.contentType.match(/^text\\/vnd\\.turbo-stream\\.html/)\n  }\n\n  async renderTurboStream () {\n    if (this.isTurboStream) {\n      if (window.Turbo) {\n        await window.Turbo.renderStreamMessage(await this.text)\n      } else {\n        console.warn('You must set `window.Turbo = Turbo` to automatically process Turbo Stream events with request.js')\n      }\n    } else {\n      return Promise.reject(new Error(`Expected a Turbo Stream response but got \"${this.contentType}\" instead`))\n    }\n  }\n}\n", "export class RequestInterceptor {\n  static register (interceptor) {\n    this.interceptor = interceptor\n  }\n\n  static get () {\n    return this.interceptor\n  }\n\n  static reset () {\n    this.interceptor = undefined\n  }\n}\n", "export function getCookie (name) {\n  const cookies = document.cookie ? document.cookie.split('; ') : []\n  const prefix = `${encodeURIComponent(name)}=`\n  const cookie = cookies.find(cookie => cookie.startsWith(prefix))\n\n  if (cookie) {\n    const value = cookie.split('=').slice(1).join('=')\n\n    if (value) {\n      return decodeURIComponent(value)\n    }\n  }\n}\n\nexport function compact (object) {\n  const result = {}\n\n  for (const key in object) {\n    const value = object[key]\n    if (value !== undefined) {\n      result[key] = value\n    }\n  }\n\n  return result\n}\n\nexport function metaContent (name) {\n  const element = document.head.querySelector(`meta[name=\"${name}\"]`)\n  return element && element.content\n}\n\nexport function stringEntriesFromFormData (formData) {\n  return [...formData].reduce((entries, [name, value]) => {\n    return entries.concat(typeof value === 'string' ? [[name, value]] : [])\n  }, [])\n}\n\nexport function mergeEntries (searchParams, entries) {\n  for (const [name, value] of entries) {\n    if (value instanceof window.File) continue\n\n    if (searchParams.has(name)) {\n      searchParams.delete(name)\n      searchParams.set(name, value)\n    } else {\n      searchParams.append(name, value)\n    }\n  }\n}\n", "import { FetchResponse } from './fetch_response'\nimport { RequestInterceptor } from './request_interceptor'\nimport { getCookie, compact, metaContent, stringEntriesFromFormData, mergeEntries } from './lib/utils'\n\nexport class FetchRequest {\n  constructor (method, url, options = {}) {\n    this.method = method\n    this.options = options\n    this.originalUrl = url.toString()\n  }\n\n  async perform () {\n    try {\n      const requestInterceptor = RequestInterceptor.get()\n      if (requestInterceptor) {\n        await requestInterceptor(this)\n      }\n    } catch (error) {\n      console.error(error)\n    }\n\n    const response = new FetchResponse(await window.fetch(this.url, this.fetchOptions))\n\n    if (response.unauthenticated && response.authenticationURL) {\n      return Promise.reject(window.location.href = response.authenticationURL)\n    }\n\n    if (response.ok && response.isTurboStream) {\n      await response.renderTurboStream()\n    }\n\n    return response\n  }\n\n  addHeader (key, value) {\n    const headers = this.additionalHeaders\n    headers[key] = value\n    this.options.headers = headers\n  }\n\n  get fetchOptions () {\n    return {\n      method: this.method.toUpperCase(),\n      headers: this.headers,\n      body: this.formattedBody,\n      signal: this.signal,\n      credentials: 'same-origin',\n      redirect: this.redirect\n    }\n  }\n\n  get headers () {\n    return compact(\n      Object.assign({\n        'X-Requested-With': 'XMLHttpRequest',\n        'X-CSRF-Token': this.csrfToken,\n        'Content-Type': this.contentType,\n        Accept: this.accept\n      },\n      this.additionalHeaders)\n    )\n  }\n\n  get csrfToken () {\n    return getCookie(metaContent('csrf-param')) || metaContent('csrf-token')\n  }\n\n  get contentType () {\n    if (this.options.contentType) {\n      return this.options.contentType\n    } else if (this.body == null || this.body instanceof window.FormData) {\n      return undefined\n    } else if (this.body instanceof window.File) {\n      return this.body.type\n    }\n\n    return 'application/json'\n  }\n\n  get accept () {\n    switch (this.responseKind) {\n      case 'html':\n        return 'text/html, application/xhtml+xml'\n      case 'turbo-stream':\n        return 'text/vnd.turbo-stream.html, text/html, application/xhtml+xml'\n      case 'json':\n        return 'application/json, application/vnd.api+json'\n      default:\n        return '*/*'\n    }\n  }\n\n  get body () {\n    return this.options.body\n  }\n\n  get query () {\n    const originalQuery = (this.originalUrl.split('?')[1] || '').split('#')[0]\n    const params = new URLSearchParams(originalQuery)\n\n    let requestQuery = this.options.query\n    if (requestQuery instanceof window.FormData) {\n      requestQuery = stringEntriesFromFormData(requestQuery)\n    } else if (requestQuery instanceof window.URLSearchParams) {\n      requestQuery = requestQuery.entries()\n    } else {\n      requestQuery = Object.entries(requestQuery || {})\n    }\n\n    mergeEntries(params, requestQuery)\n\n    const query = params.toString()\n    return (query.length > 0 ? `?${query}` : '')\n  }\n\n  get url () {\n    return (this.originalUrl.split('?')[0]).split('#')[0] + this.query\n  }\n\n  get responseKind () {\n    return this.options.responseKind || 'html'\n  }\n\n  get signal () {\n    return this.options.signal\n  }\n\n  get redirect () {\n    return this.options.redirect || 'follow'\n  }\n\n  get additionalHeaders () {\n    return this.options.headers || {}\n  }\n\n  get formattedBody () {\n    const bodyIsAString = Object.prototype.toString.call(this.body) === '[object String]'\n    const contentTypeIsJson = this.headers['Content-Type'] === 'application/json'\n\n    if (contentTypeIsJson && !bodyIsAString) {\n      return JSON.stringify(this.body)\n    }\n\n    return this.body\n  }\n}\n", "import { FetchRequest } from './fetch_request'\n\nasync function get (url, options) {\n  const request = new FetchRequest('get', url, options)\n  return request.perform()\n}\n\nasync function post (url, options) {\n  const request = new FetchRequest('post', url, options)\n  return request.perform()\n}\n\nasync function put (url, options) {\n  const request = new FetchRequest('put', url, options)\n  return request.perform()\n}\n\nasync function patch (url, options) {\n  const request = new FetchRequest('patch', url, options)\n  return request.perform()\n}\n\nasync function destroy (url, options) {\n  const request = new FetchRequest('delete', url, options)\n  return request.perform()\n}\n\nexport { get, post, put, patch, destroy }\n", "import { Controller } from '@hotwired/stimulus';\nimport Cart from '../shared/cart';\nimport { getCookie } from '../shared/cookies';\nimport { post } from '@rails/request.js';\n\nexport default class extends Controller {\n  static targets = ['amount', 'button', 'cart', 'counter'];\n  static values = { amount: Number, currency: String, count: Number, path: String };\n\n  HIGHLIGHT_ADD_CLASS = 'animate-flash-green';\n  HIGHLIGHT_REMOVED_CLASS = 'animate-flash-red';\n\n  connect() {\n    this.amountValue = this.total;\n  }\n\n  cartTargetConnected() {\n    this.createOrder();\n  }\n\n  async createOrder(event) {\n    await post(this.pathValue, {\n      body: { line_items: Cart.products },\n      responseKind: 'turbo-stream'\n    })\n  }\n\n  amountValueChanged() {\n    if (this.hasCounterTarget) {\n      this.counterTarget.innerText = Cart.products.length > 0 ? Cart.products.length : ''\n    }\n    this.amountTargets.forEach(t => {\n      t.innerText = new Intl.NumberFormat(getCookie('lang'), {\n        style: 'currency',\n        currency: this.currencyValue\n      }).format(this.total * 0.01);\n    })\n  }\n\n  buttonTargetConnected(el) {\n    const id = Number(el.dataset.cartIdParam);\n    const type = el.dataset.cartTypeParam;\n    el.checked = Cart.hasProduct(id, type)\n  }\n\n  addOrRemove({ params: { id, type, price }, currentTarget }) {\n    if (Cart.hasProduct(id, type)) {\n      Cart.remove(id, type);\n      currentTarget.checked = false\n      this.highlight(this.HIGHLIGHT_REMOVED_CLASS)\n    } else {\n      Cart.add({ id, type, price, currency: this.currencyValue });\n      currentTarget.checked = true\n      this.highlight(this.HIGHLIGHT_ADD_CLASS)\n    }\n    this.amountValue = this.total;\n  }\n\n  remove(event) {\n    event.preventDefault();\n    Cart.remove(event.params.id, event.params.type);\n    this.amountValue = this.total;\n    this.createOrder();\n  }\n\n  clear() {\n\n    Cart.reset();\n  }\n\n  highlight(animationClass) {\n    const cartLink = document.getElementById('cartLink');\n\n    if (cartLink) {\n      cartLink.classList.add(animationClass)\n      setTimeout(() => cartLink.classList.remove(animationClass), 500)\n    }\n  }\n\n  get total() {\n    return Cart.products.reduce((acc, product) => acc + product.price, 0);\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['chart'];\n  static values = { data: Object, type: String };\n\n  chartTargetConnected(element) {\n    new Chart(element, {\n      type: this.typeValue,\n      data: this.dataValue\n    });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Usage:\n// <button data-controller=\"clipboard\"\n//         data-clipboard-text-value=\"sk_test_123\"\n//         data-action=\"click->clipboard#copy\">\n//   Copy\n// </button>\n\nexport default class extends Controller {\n  static values = { text: String }\n\n  async copy(event) {\n    event.preventDefault()\n    try {\n      const button = event.currentTarget\n      await navigator.clipboard.writeText(this.textValue)\n      const original = button.innerHTML\n      button.disabled = true\n      setTimeout(() => {\n        button.disabled = false\n      }, 1000)\n    } catch (err) {\n      console.error(\"Clipboard error:\", err)\n    }\n  }\n\n  // Legacy!! Use modern approach above!\n  async copyText({ params: { text } }) {\n\n    const textToCopy = this.element.dataset.copyText ?? text;\n    if (\"clipboard\" in navigator) {\n      try {\n        await navigator.clipboard.writeText(textToCopy)\n        return true\n      } catch {\n        // Android WebView does not support the clipboard API fully and will throw an exception\n      }\n    }\n    const node = this.createNode(textToCopy)\n    document.body.append(node)\n    const result = this.copyNode(node)\n    node.remove()\n    return result\n  }\n\n  createNode(text) {\n    const node = document.createElement(\"pre\")\n    node.style = \"width: 1px; height: 1px; position: fixed; top: 50%\"\n    node.textContent = text\n    return node\n  }\n\n  copyNode(node) {\n    const selection = document.getSelection()\n    const range = document.createRange()\n    range.selectNodeContents(node)\n    selection.removeAllRanges()\n    selection.addRange(range)\n    return document.execCommand(\"copy\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Cross-browser combobox: pick a value from the list OR type a new one.\n// Replaces native <datalist>, which Firefox renders without a dropdown arrow\n// and only reveals while typing. The options arrive as JSON (inline, or shared\n// per page through `sourceValue`) and the rows are built only while the list is\n// open, capped at `limit`, so thousands of options stay cheap.\nconst sharedOptions = new Map();\n\nexport default class extends Controller {\n  static targets = [\"input\", \"list\"];\n  static values = {\n    options: Array,\n    source: String,\n    limit: { type: Number, default: 200 },\n  };\n\n  connect() {\n    this.onDocClick = (event) => {\n      if (!this.element.contains(event.target)) this.close();\n    };\n    document.addEventListener(\"click\", this.onDocClick);\n  }\n\n  disconnect() {\n    document.removeEventListener(\"click\", this.onDocClick);\n  }\n\n  get options() {\n    if (!this.hasSourceValue) return this.optionsValue;\n\n    if (!sharedOptions.has(this.sourceValue)) {\n      const element = document.querySelector(this.sourceValue);\n      let parsed = [];\n      try {\n        parsed = element ? JSON.parse(element.textContent) : [];\n      } catch (e) {\n        parsed = [];\n      }\n      sharedOptions.set(this.sourceValue, parsed);\n    }\n    return sharedOptions.get(this.sourceValue);\n  }\n\n  open() {\n    this.render();\n    this.listTarget.classList.remove(\"hidden\");\n  }\n\n  close() {\n    this.listTarget.classList.add(\"hidden\");\n  }\n\n  toggle(event) {\n    event.preventDefault();\n    if (this.listTarget.classList.contains(\"hidden\")) {\n      this.inputTarget.focus();\n      this.open();\n    } else {\n      this.close();\n    }\n  }\n\n  filter() {\n    this.render();\n  }\n\n  render() {\n    const query = this.inputTarget.value.trim().toLowerCase();\n    const matches = [];\n\n    for (const option of this.options) {\n      if (String(option).toLowerCase().includes(query)) matches.push(option);\n      if (matches.length >= this.limitValue) break;\n    }\n\n    this.listTarget.replaceChildren(...matches.map(option => this.row(option)));\n  }\n\n  row(option) {\n    const row = document.createElement(\"div\");\n    row.className = \"px-3 py-1 cursor-pointer text-sm hover:bg-emerald-50\";\n    row.dataset.value = option;\n    row.textContent = option;\n    return row;\n  }\n\n  pick(event) {\n    const option = event.target.closest(\"[data-value]\");\n    if (!option) return;\n    this.inputTarget.value = option.dataset.value;\n    this.close();\n    this.inputTarget.dispatchEvent(new Event(\"change\", { bubbles: true }));\n    this.inputTarget.dispatchEvent(new Event(\"input\", { bubbles: true }));\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Tag color input: a native color picker, a hex text field and preset swatches,\n// all kept in sync. The hex field is the one submitted, so any #rgb / #rrggbb\n// value can be typed in.\nexport default class extends Controller {\n  static targets = [\"picker\", \"hex\", \"preview\"];\n\n  connect() {\n    this.render(this.hexTarget.value);\n  }\n\n  picked() {\n    this.hexTarget.value = this.pickerTarget.value;\n    this.render(this.pickerTarget.value);\n  }\n\n  typed() {\n    let value = this.hexTarget.value.trim();\n    if (value && !value.startsWith(\"#\")) value = `#${value}`;\n    this.render(value);\n  }\n\n  swatch(event) {\n    event.preventDefault();\n    this.hexTarget.value = event.params.color;\n    this.render(event.params.color);\n  }\n\n  render(value) {\n    const valid = /^#([0-9a-f]{3}){1,2}$/i.test(value);\n    this.hexTarget.classList.toggle(\"border-red-400\", Boolean(value) && !valid);\n    if (!valid) return;\n\n    // the native picker only understands #rrggbb\n    const full = value.length === 4 ? `#${[...value.slice(1)].map(c => c + c).join(\"\")}` : value;\n    this.pickerTarget.value = full.toLowerCase();\n    if (this.hasPreviewTarget) this.previewTarget.style.backgroundColor = full;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Pick several options (tags) by typing: matches drop down, a click turns one\n// into a removable chip carrying a hidden field. Built for lists of hundreds of\n// tags, so the dropdown is built on demand and capped.\nexport default class extends Controller {\n  static targets = [\"input\", \"list\", \"chips\"];\n  static values = {\n    options: Array, // [{ value, label, color }]\n    name: String, // form field name, submitted as name[]\n    limit: { type: Number, default: 50 },\n    // filters submit on every pick; a picker inside an editing form must not\n    autoSubmit: { type: Boolean, default: true },\n    // genres on a pack may be typed in, tag filters may not\n    allowNew: { type: Boolean, default: false },\n  };\n\n  connect() {\n    this.onDocClick = (event) => {\n      if (!this.element.contains(event.target)) this.close();\n    };\n    document.addEventListener(\"click\", this.onDocClick);\n  }\n\n  disconnect() {\n    document.removeEventListener(\"click\", this.onDocClick);\n  }\n\n  get selected() {\n    return Array.from(this.chipsTarget.querySelectorAll(\"input[type=hidden]\")).map(input => input.value);\n  }\n\n  open() {\n    this.render();\n    this.listTarget.classList.remove(\"hidden\");\n  }\n\n  close() {\n    this.listTarget.classList.add(\"hidden\");\n  }\n\n  filter() {\n    this.render();\n  }\n\n  render() {\n    const query = this.inputTarget.value.trim().toLowerCase();\n    const chosen = this.selected;\n    const rows = [];\n\n    for (const option of this.optionsValue) {\n      if (chosen.includes(String(option.value))) continue;\n      if (!option.label.toLowerCase().includes(query)) continue;\n\n      const row = document.createElement(\"div\");\n      row.className = \"px-3 py-1 cursor-pointer text-sm flex items-center gap-2 hover:bg-emerald-50\";\n      row.dataset.value = option.value;\n      row.dataset.label = option.label;\n      row.innerHTML = `<span class=\"inline-block w-2 h-2 rounded-full shrink-0\"></span>`;\n      row.firstChild.style.backgroundColor = option.color || \"#64748b\";\n      row.append(option.label);\n      rows.push(row);\n      if (rows.length >= this.limitValue) break;\n    }\n\n    this.listTarget.replaceChildren(...rows);\n  }\n\n  // Enter adds whatever is typed, so a value that is not in the list yet can\n  // still be picked (only when allowNew is on). The key is checked here rather\n  // than with a keydown.enter action filter, which needs Stimulus 3.1.\n  addTyped(event) {\n    if (event.key !== \"Enter\" || !this.allowNewValue) return;\n\n    event.preventDefault(); // Enter would otherwise submit the whole form\n\n    const value = this.inputTarget.value.trim();\n    if (!value || this.selected.includes(value)) return;\n\n    this.addChip(value, value);\n    this.inputTarget.value = \"\";\n    this.close();\n    this.submit();\n  }\n\n  pick(event) {\n    const row = event.target.closest(\"[data-value]\");\n    if (!row) return;\n\n    this.addChip(row.dataset.value, row.dataset.label, row.querySelector(\"span\")?.style.backgroundColor);\n    this.inputTarget.value = \"\";\n    this.close();\n    this.submit();\n  }\n\n  remove(event) {\n    event.preventDefault();\n    event.target.closest(\"[data-chip]\")?.remove();\n    this.submit();\n  }\n\n  addChip(value, label, color) {\n    const chip = document.createElement(\"span\");\n    chip.dataset.chip = \"\";\n    chip.className = \"inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-semibold text-white\";\n    chip.style.backgroundColor = color || \"#64748b\";\n    chip.append(label);\n\n    const button = document.createElement(\"button\");\n    button.type = \"button\";\n    button.textContent = \"\u2715\";\n    button.className = \"leading-none\";\n    button.dataset.action = \"multi-select#remove\";\n    chip.append(button);\n\n    const hidden = document.createElement(\"input\");\n    hidden.type = \"hidden\";\n    hidden.name = `${this.nameValue}[]`;\n    hidden.value = value;\n    chip.append(hidden);\n\n    this.chipsTarget.append(chip);\n  }\n\n  submit() {\n    if (!this.autoSubmitValue) return;\n\n    this.element.closest(\"form\")?.requestSubmit();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"button\", \"status\", \"spinner\", \"icon\"]\n  static values = {\n    url: String,\n    locale: String,\n    jobId: String\n  }\n\n  connect() {\n    this.checkInitialStatus()\n  }\n\n  disconnect() {\n    this.stopPolling()\n  }\n\n  async checkInitialStatus() {\n    if (!this.urlValue) return\n\n    try {\n      const response = await fetch(\n        `${this.urlValue}/translation_status?target_locale=${this.localeValue}`,\n        { headers: { 'Accept': 'application/json' } }\n      )\n\n      if (response.ok) {\n        const data = await response.json()\n        if (data.status === 'completed') {\n          this.showCompleted()\n        } else if (data.status === 'processing') {\n          this.updateStatus('Translation in progress...', 'text-blue-600')\n          this.showSpinner()\n          this.startPolling()\n        } else if (data.status === 'failed') {\n          this.showError(data.error || 'Translation failed')\n        }\n      }\n    } catch (error) {\n      console.error('Error checking translation status:', error)\n    }\n  }\n\n  get csrfToken() {\n    return document.querySelector('meta[name=\"csrf-token\"]')?.content\n  }\n\n  async translate(event) {\n    event.preventDefault()\n\n    if (!this.urlValue || !this.localeValue) {\n      this.showError('Missing configuration')\n      return\n    }\n\n    this.updateStatus('Initiating translation...', 'text-blue-600')\n    this.showSpinner()\n    this.disableButton()\n\n    try {\n      const response = await fetch(`${this.urlValue}/translate`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-Token': this.csrfToken },\n        body: JSON.stringify({ target_locale: this.localeValue })\n      })\n\n      const data = await response.json()\n\n      if (data.confirm_required) {\n        this.hideSpinner()\n        this.enableButton()\n        if (confirm(`${data.message}\\n\\nContinue?`)) {\n          this.translateWithForce()\n        } else {\n          this.updateStatus('Translation cancelled', 'text-gray-600')\n        }\n        return\n      }\n\n      if (response.ok) {\n        this.jobIdValue = data.job_id\n        this.updateStatus('Translation queued...', 'text-blue-600')\n        this.startPolling()\n      } else {\n        this.showError(data.error || 'Translation failed to start')\n        this.enableButton()\n      }\n    } catch (error) {\n      console.error('Translation error:', error)\n      this.showError('Network error. Please try again.')\n      this.enableButton()\n    }\n  }\n\n  async translateWithForce() {\n    this.updateStatus('Initiating translation...', 'text-blue-600')\n    this.showSpinner()\n    this.disableButton()\n\n    try {\n      const response = await fetch(`${this.urlValue}/translate`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-Token': this.csrfToken },\n        body: JSON.stringify({ target_locale: this.localeValue, force: 'true' })\n      })\n\n      const data = await response.json()\n\n      if (response.ok) {\n        this.jobIdValue = data.job_id\n        this.updateStatus('Translation queued...', 'text-blue-600')\n        this.startPolling()\n      } else {\n        this.showError(data.error || 'Translation failed to start')\n        this.enableButton()\n      }\n    } catch (error) {\n      console.error('Translation error:', error)\n      this.showError('Network error. Please try again.')\n      this.enableButton()\n    }\n  }\n\n  startPolling() {\n    this.stopPolling()\n    this.pollInterval = setInterval(() => { this.checkStatus() }, 2000)\n  }\n\n  stopPolling() {\n    if (this.pollInterval) {\n      clearInterval(this.pollInterval)\n      this.pollInterval = null\n    }\n  }\n\n  async checkStatus() {\n    if (!this.jobIdValue && !this.localeValue) {\n      this.stopPolling()\n      return\n    }\n\n    try {\n      const params = new URLSearchParams({ target_locale: this.localeValue })\n      if (this.jobIdValue) params.append('job_id', this.jobIdValue)\n\n      const response = await fetch(\n        `${this.urlValue}/translation_status?${params}`,\n        { headers: { 'Accept': 'application/json' } }\n      )\n\n      if (response.ok) {\n        const data = await response.json()\n        switch (data.status) {\n          case 'pending':\n            this.updateStatus('Translation queued...', 'text-blue-600')\n            break\n          case 'processing':\n            this.updateStatus('Translating content...', 'text-blue-600')\n            break\n          case 'completed':\n            this.stopPolling()\n            this.showCompleted()\n            break\n          case 'failed':\n            this.stopPolling()\n            this.showError(data.error || 'Translation failed')\n            break\n        }\n      } else if (response.status === 404) {\n        this.updateStatus('Waiting for translation job...', 'text-blue-600')\n      }\n    } catch (error) {\n      console.error('Status check error:', error)\n    }\n  }\n\n  async applyTranslation(event) {\n    event.preventDefault()\n    this.updateStatus('Applying translation...', 'text-blue-600')\n\n    try {\n      const params = new URLSearchParams({ target_locale: this.localeValue })\n      if (this.jobIdValue) params.append('job_id', this.jobIdValue)\n\n      const response = await fetch(\n        `${this.urlValue}/apply_translation?${params}`,\n        { method: 'POST', headers: { 'Accept': 'application/json', 'X-CSRF-Token': this.csrfToken } }\n      )\n\n      const data = await response.json()\n\n      if (response.ok) {\n        this.updateStatus('Translation applied! Reloading...', 'text-green-600')\n        setTimeout(() => { window.location.reload() }, 1000)\n      } else {\n        this.showError(data.error || 'Failed to apply translation')\n      }\n    } catch (error) {\n      console.error('Apply translation error:', error)\n      this.showError('Network error. Please try again.')\n    }\n  }\n\n  showCompleted() {\n    this.hideSpinner()\n    this.enableButton()\n    this.updateStatus('Translation complete! Click Apply to use it.', 'text-green-600')\n    const applyContainer = this.element.querySelector('[data-translation-apply-container]')\n    if (applyContainer) applyContainer.classList.remove('hidden')\n  }\n\n  showError(message) {\n    this.hideSpinner()\n    this.enableButton()\n    this.updateStatus(`Error: ${message}`, 'text-red-600')\n  }\n\n  updateStatus(message, colorClass) {\n    if (this.hasStatusTarget) {\n      this.statusTarget.textContent = message\n      this.statusTarget.className = this.statusTarget.className.replace(/text-(blue|green|red|gray)-\\d+/g, '')\n      this.statusTarget.classList.add(colorClass, 'text-xs')\n    }\n  }\n\n  showSpinner() {\n    if (this.hasSpinnerTarget) this.spinnerTarget.classList.remove('hidden')\n  }\n\n  hideSpinner() {\n    if (this.hasSpinnerTarget) this.spinnerTarget.classList.add('hidden')\n  }\n\n  disableButton() {\n    if (this.hasButtonTarget) {\n      this.buttonTarget.disabled = true\n      this.buttonTarget.classList.add('opacity-50', 'cursor-not-allowed')\n    }\n  }\n\n  enableButton() {\n    if (this.hasButtonTarget) {\n      this.buttonTarget.disabled = false\n      this.buttonTarget.classList.remove('opacity-50', 'cursor-not-allowed')\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n\n  allow() {\n    this.setConsent(\"allow\");\n    window.location.reload();\n  }\n\n  deny() {\n    this.setConsent(\"deny\");\n    window.location.reload();\n  }\n\n  setConsent(value) {\n    const domain = window.location.hostname;\n    const age = 60 * 60 * 24 * 365; // 1 year\n    document.cookie = `cookieconsent_status=${value};path=/;domain=${domain};max-age=${age}`;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Generic controller for comma-separated input with datalist autocomplete\n// Usage: data-controller=\"datalist\" data-datalist-options-value='[\"option1\", \"option2\"]'\nexport default class extends Controller {\n  static targets = [\"input\", \"datalist\"]\n  static values = {\n    options: Array,\n    separator: { type: String, default: ',' }\n  }\n\n  connect() {\n    this.allOptions = this.optionsValue || []\n    this.updateDatalist()\n  }\n\n  updateDatalist() {\n    const inputValue = this.inputTarget.value\n    const separator = this.separatorValue\n    const lastSeparatorIndex = inputValue.lastIndexOf(separator)\n\n    // Get the prefix (everything before the current tag, including separator and space)\n    const prefix = lastSeparatorIndex >= 0\n      ? inputValue.slice(0, lastSeparatorIndex + 1) + ' '\n      : ''\n\n    // Get the current item being typed (after last separator)\n    const currentInput = inputValue.slice(lastSeparatorIndex + 1).trim()\n\n    // Filter options that match the current input\n    const filteredOptions = this.allOptions.filter(option =>\n      option.toLowerCase().includes(currentInput.toLowerCase())\n    )\n\n    // Update datalist with filtered options, including the prefix so browser can match\n    this.datalistTarget.innerHTML = filteredOptions\n      .map(option => `<option value=\"${this.escapeHtml(prefix + option)}\"></option>`)\n      .join('')\n  }\n\n  escapeHtml(text) {\n    const div = document.createElement('div')\n    div.textContent = text\n    return div.innerHTML\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Pushes dataLayer events that arrive in a turbo-stream response\n// (DatalayerHelper#datalayer_stream_event_tag).\nexport default class extends Controller {\n  static values = { events: Array };\n\n  connect() {\n    window.dataLayer = window.dataLayer || [];\n    this.eventsValue.forEach((event) => window.dataLayer.push(event));\n    // A page restored from Turbo's cache would connect the controller again.\n    this.element.remove();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static classes = [ 'hidden' ];\n\n  hide({ params: { id }}) {\n    const ids = id.split(' ')\n    ids.forEach(id => {\n      document.getElementById(id).classList.add(this.class)\n    });\n  }\n\n  show({ params: { id }}) {\n    const ids = id.split(' ')\n    ids.forEach(id => {\n      document.getElementById(id).classList.remove(this.class)\n    });\n  }\n\n  toggle({ params: { id }}) {\n    const ids = id.split(' ')\n    ids.forEach(id => {\n      document.getElementById(id).classList.toggle(this.class);\n    });\n  }\n\n  get class() {\n    return this.hasHiddenClass ? this.hiddenClass : \"hidden\"\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static values = { url: String };\n\n  connect() {\n    if (this.urlValue) {\n      window.location.href = this.urlValue;\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [ \"row\" ];\n  static values = { array: Array };\n\n  apply({target: { checked }, params: { by, value }}) {\n    if (checked) {\n      this.arrayValue = [...this.arrayValue, `${by}:${value}`]\n      if (this.arrayValue.length === 1) {\n        this.rowTargets.filter(row => row.dataset[by] !== value.toString()).forEach(t => t.classList.add('hidden'))\n      } else {\n        this.rowTargets.filter(row => row.dataset[by] === value.toString()).forEach(t => t.classList.remove('hidden'))\n      }\n    } else {\n      this.arrayValue = this.arrayValue.filter(val => val !== `${by}:${value}`)\n      if (this.arrayValue.length > 0) {\n        this.rowTargets.filter(row => row.dataset[by] === value.toString()).forEach(target => target.classList.add('hidden'))\n      } else {\n        this.rowTargets.forEach(t => t.classList.remove('hidden'))\n      }\n    }\n  }\n}\n", "export var HOOKS = [\n    \"onChange\",\n    \"onClose\",\n    \"onDayCreate\",\n    \"onDestroy\",\n    \"onKeyDown\",\n    \"onMonthChange\",\n    \"onOpen\",\n    \"onParseConfig\",\n    \"onReady\",\n    \"onValueUpdate\",\n    \"onYearChange\",\n    \"onPreCalendarPosition\",\n];\nexport var defaults = {\n    _disable: [],\n    allowInput: false,\n    allowInvalidPreload: false,\n    altFormat: \"F j, Y\",\n    altInput: false,\n    altInputClass: \"form-control input\",\n    animate: typeof window === \"object\" &&\n        window.navigator.userAgent.indexOf(\"MSIE\") === -1,\n    ariaDateFormat: \"F j, Y\",\n    autoFillDefaultTime: true,\n    clickOpens: true,\n    closeOnSelect: true,\n    conjunction: \", \",\n    dateFormat: \"Y-m-d\",\n    defaultHour: 12,\n    defaultMinute: 0,\n    defaultSeconds: 0,\n    disable: [],\n    disableMobile: false,\n    enableSeconds: false,\n    enableTime: false,\n    errorHandler: function (err) {\n        return typeof console !== \"undefined\" && console.warn(err);\n    },\n    getWeek: function (givenDate) {\n        var date = new Date(givenDate.getTime());\n        date.setHours(0, 0, 0, 0);\n        date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7));\n        var week1 = new Date(date.getFullYear(), 0, 4);\n        return (1 +\n            Math.round(((date.getTime() - week1.getTime()) / 86400000 -\n                3 +\n                ((week1.getDay() + 6) % 7)) /\n                7));\n    },\n    hourIncrement: 1,\n    ignoredFocusElements: [],\n    inline: false,\n    locale: \"default\",\n    minuteIncrement: 5,\n    mode: \"single\",\n    monthSelectorType: \"dropdown\",\n    nextArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>\",\n    noCalendar: false,\n    now: new Date(),\n    onChange: [],\n    onClose: [],\n    onDayCreate: [],\n    onDestroy: [],\n    onKeyDown: [],\n    onMonthChange: [],\n    onOpen: [],\n    onParseConfig: [],\n    onReady: [],\n    onValueUpdate: [],\n    onYearChange: [],\n    onPreCalendarPosition: [],\n    plugins: [],\n    position: \"auto\",\n    positionElement: undefined,\n    prevArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>\",\n    shorthandCurrentMonth: false,\n    showMonths: 1,\n    static: false,\n    time_24hr: false,\n    weekNumbers: false,\n    wrap: false,\n};\n", "export var english = {\n    weekdays: {\n        shorthand: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n        longhand: [\n            \"Sunday\",\n            \"Monday\",\n            \"Tuesday\",\n            \"Wednesday\",\n            \"Thursday\",\n            \"Friday\",\n            \"Saturday\",\n        ],\n    },\n    months: {\n        shorthand: [\n            \"Jan\",\n            \"Feb\",\n            \"Mar\",\n            \"Apr\",\n            \"May\",\n            \"Jun\",\n            \"Jul\",\n            \"Aug\",\n            \"Sep\",\n            \"Oct\",\n            \"Nov\",\n            \"Dec\",\n        ],\n        longhand: [\n            \"January\",\n            \"February\",\n            \"March\",\n            \"April\",\n            \"May\",\n            \"June\",\n            \"July\",\n            \"August\",\n            \"September\",\n            \"October\",\n            \"November\",\n            \"December\",\n        ],\n    },\n    daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],\n    firstDayOfWeek: 0,\n    ordinal: function (nth) {\n        var s = nth % 100;\n        if (s > 3 && s < 21)\n            return \"th\";\n        switch (s % 10) {\n            case 1:\n                return \"st\";\n            case 2:\n                return \"nd\";\n            case 3:\n                return \"rd\";\n            default:\n                return \"th\";\n        }\n    },\n    rangeSeparator: \" to \",\n    weekAbbreviation: \"Wk\",\n    scrollTitle: \"Scroll to increment\",\n    toggleTitle: \"Click to toggle\",\n    amPM: [\"AM\", \"PM\"],\n    yearAriaLabel: \"Year\",\n    monthAriaLabel: \"Month\",\n    hourAriaLabel: \"Hour\",\n    minuteAriaLabel: \"Minute\",\n    time_24hr: false,\n};\nexport default english;\n", "export var pad = function (number, length) {\n    if (length === void 0) { length = 2; }\n    return (\"000\" + number).slice(length * -1);\n};\nexport var int = function (bool) { return (bool === true ? 1 : 0); };\nexport function debounce(fn, wait) {\n    var t;\n    return function () {\n        var _this = this;\n        var args = arguments;\n        clearTimeout(t);\n        t = setTimeout(function () { return fn.apply(_this, args); }, wait);\n    };\n}\nexport var arrayify = function (obj) {\n    return obj instanceof Array ? obj : [obj];\n};\n", "export function toggleClass(elem, className, bool) {\n    if (bool === true)\n        return elem.classList.add(className);\n    elem.classList.remove(className);\n}\nexport function createElement(tag, className, content) {\n    var e = window.document.createElement(tag);\n    className = className || \"\";\n    content = content || \"\";\n    e.className = className;\n    if (content !== undefined)\n        e.textContent = content;\n    return e;\n}\nexport function clearNode(node) {\n    while (node.firstChild)\n        node.removeChild(node.firstChild);\n}\nexport function findParent(node, condition) {\n    if (condition(node))\n        return node;\n    else if (node.parentNode)\n        return findParent(node.parentNode, condition);\n    return undefined;\n}\nexport function createNumberInput(inputClassName, opts) {\n    var wrapper = createElement(\"div\", \"numInputWrapper\"), numInput = createElement(\"input\", \"numInput \" + inputClassName), arrowUp = createElement(\"span\", \"arrowUp\"), arrowDown = createElement(\"span\", \"arrowDown\");\n    if (navigator.userAgent.indexOf(\"MSIE 9.0\") === -1) {\n        numInput.type = \"number\";\n    }\n    else {\n        numInput.type = \"text\";\n        numInput.pattern = \"\\\\d*\";\n    }\n    if (opts !== undefined)\n        for (var key in opts)\n            numInput.setAttribute(key, opts[key]);\n    wrapper.appendChild(numInput);\n    wrapper.appendChild(arrowUp);\n    wrapper.appendChild(arrowDown);\n    return wrapper;\n}\nexport function getEventTarget(event) {\n    try {\n        if (typeof event.composedPath === \"function\") {\n            var path = event.composedPath();\n            return path[0];\n        }\n        return event.target;\n    }\n    catch (error) {\n        return event.target;\n    }\n}\n", "import { int, pad } from \"../utils\";\nvar doNothing = function () { return undefined; };\nexport var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? \"shorthand\" : \"longhand\"][monthNumber]; };\nexport var revFormat = {\n    D: doNothing,\n    F: function (dateObj, monthName, locale) {\n        dateObj.setMonth(locale.months.longhand.indexOf(monthName));\n    },\n    G: function (dateObj, hour) {\n        dateObj.setHours((dateObj.getHours() >= 12 ? 12 : 0) + parseFloat(hour));\n    },\n    H: function (dateObj, hour) {\n        dateObj.setHours(parseFloat(hour));\n    },\n    J: function (dateObj, day) {\n        dateObj.setDate(parseFloat(day));\n    },\n    K: function (dateObj, amPM, locale) {\n        dateObj.setHours((dateObj.getHours() % 12) +\n            12 * int(new RegExp(locale.amPM[1], \"i\").test(amPM)));\n    },\n    M: function (dateObj, shortMonth, locale) {\n        dateObj.setMonth(locale.months.shorthand.indexOf(shortMonth));\n    },\n    S: function (dateObj, seconds) {\n        dateObj.setSeconds(parseFloat(seconds));\n    },\n    U: function (_, unixSeconds) { return new Date(parseFloat(unixSeconds) * 1000); },\n    W: function (dateObj, weekNum, locale) {\n        var weekNumber = parseInt(weekNum);\n        var date = new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0);\n        date.setDate(date.getDate() - date.getDay() + locale.firstDayOfWeek);\n        return date;\n    },\n    Y: function (dateObj, year) {\n        dateObj.setFullYear(parseFloat(year));\n    },\n    Z: function (_, ISODate) { return new Date(ISODate); },\n    d: function (dateObj, day) {\n        dateObj.setDate(parseFloat(day));\n    },\n    h: function (dateObj, hour) {\n        dateObj.setHours((dateObj.getHours() >= 12 ? 12 : 0) + parseFloat(hour));\n    },\n    i: function (dateObj, minutes) {\n        dateObj.setMinutes(parseFloat(minutes));\n    },\n    j: function (dateObj, day) {\n        dateObj.setDate(parseFloat(day));\n    },\n    l: doNothing,\n    m: function (dateObj, month) {\n        dateObj.setMonth(parseFloat(month) - 1);\n    },\n    n: function (dateObj, month) {\n        dateObj.setMonth(parseFloat(month) - 1);\n    },\n    s: function (dateObj, seconds) {\n        dateObj.setSeconds(parseFloat(seconds));\n    },\n    u: function (_, unixMillSeconds) {\n        return new Date(parseFloat(unixMillSeconds));\n    },\n    w: doNothing,\n    y: function (dateObj, year) {\n        dateObj.setFullYear(2000 + parseFloat(year));\n    },\n};\nexport var tokenRegex = {\n    D: \"\",\n    F: \"\",\n    G: \"(\\\\d\\\\d|\\\\d)\",\n    H: \"(\\\\d\\\\d|\\\\d)\",\n    J: \"(\\\\d\\\\d|\\\\d)\\\\w+\",\n    K: \"\",\n    M: \"\",\n    S: \"(\\\\d\\\\d|\\\\d)\",\n    U: \"(.+)\",\n    W: \"(\\\\d\\\\d|\\\\d)\",\n    Y: \"(\\\\d{4})\",\n    Z: \"(.+)\",\n    d: \"(\\\\d\\\\d|\\\\d)\",\n    h: \"(\\\\d\\\\d|\\\\d)\",\n    i: \"(\\\\d\\\\d|\\\\d)\",\n    j: \"(\\\\d\\\\d|\\\\d)\",\n    l: \"\",\n    m: \"(\\\\d\\\\d|\\\\d)\",\n    n: \"(\\\\d\\\\d|\\\\d)\",\n    s: \"(\\\\d\\\\d|\\\\d)\",\n    u: \"(.+)\",\n    w: \"(\\\\d\\\\d|\\\\d)\",\n    y: \"(\\\\d{2})\",\n};\nexport var formats = {\n    Z: function (date) { return date.toISOString(); },\n    D: function (date, locale, options) {\n        return locale.weekdays.shorthand[formats.w(date, locale, options)];\n    },\n    F: function (date, locale, options) {\n        return monthToStr(formats.n(date, locale, options) - 1, false, locale);\n    },\n    G: function (date, locale, options) {\n        return pad(formats.h(date, locale, options));\n    },\n    H: function (date) { return pad(date.getHours()); },\n    J: function (date, locale) {\n        return locale.ordinal !== undefined\n            ? date.getDate() + locale.ordinal(date.getDate())\n            : date.getDate();\n    },\n    K: function (date, locale) { return locale.amPM[int(date.getHours() > 11)]; },\n    M: function (date, locale) {\n        return monthToStr(date.getMonth(), true, locale);\n    },\n    S: function (date) { return pad(date.getSeconds()); },\n    U: function (date) { return date.getTime() / 1000; },\n    W: function (date, _, options) {\n        return options.getWeek(date);\n    },\n    Y: function (date) { return pad(date.getFullYear(), 4); },\n    d: function (date) { return pad(date.getDate()); },\n    h: function (date) { return (date.getHours() % 12 ? date.getHours() % 12 : 12); },\n    i: function (date) { return pad(date.getMinutes()); },\n    j: function (date) { return date.getDate(); },\n    l: function (date, locale) {\n        return locale.weekdays.longhand[date.getDay()];\n    },\n    m: function (date) { return pad(date.getMonth() + 1); },\n    n: function (date) { return date.getMonth() + 1; },\n    s: function (date) { return date.getSeconds(); },\n    u: function (date) { return date.getTime(); },\n    w: function (date) { return date.getDay(); },\n    y: function (date) { return String(date.getFullYear()).substring(2); },\n};\n", "import { tokenRegex, revFormat, formats, } from \"./formatting\";\nimport { defaults } from \"../types/options\";\nimport { english } from \"../l10n/default\";\nexport var createDateFormatter = function (_a) {\n    var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c, _d = _a.isMobile, isMobile = _d === void 0 ? false : _d;\n    return function (dateObj, frmt, overrideLocale) {\n        var locale = overrideLocale || l10n;\n        if (config.formatDate !== undefined && !isMobile) {\n            return config.formatDate(dateObj, frmt, locale);\n        }\n        return frmt\n            .split(\"\")\n            .map(function (c, i, arr) {\n            return formats[c] && arr[i - 1] !== \"\\\\\"\n                ? formats[c](dateObj, locale, config)\n                : c !== \"\\\\\"\n                    ? c\n                    : \"\";\n        })\n            .join(\"\");\n    };\n};\nexport var createDateParser = function (_a) {\n    var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c;\n    return function (date, givenFormat, timeless, customLocale) {\n        if (date !== 0 && !date)\n            return undefined;\n        var locale = customLocale || l10n;\n        var parsedDate;\n        var dateOrig = date;\n        if (date instanceof Date)\n            parsedDate = new Date(date.getTime());\n        else if (typeof date !== \"string\" &&\n            date.toFixed !== undefined)\n            parsedDate = new Date(date);\n        else if (typeof date === \"string\") {\n            var format = givenFormat || (config || defaults).dateFormat;\n            var datestr = String(date).trim();\n            if (datestr === \"today\") {\n                parsedDate = new Date();\n                timeless = true;\n            }\n            else if (config && config.parseDate) {\n                parsedDate = config.parseDate(date, format);\n            }\n            else if (/Z$/.test(datestr) ||\n                /GMT$/.test(datestr)) {\n                parsedDate = new Date(date);\n            }\n            else {\n                var matched = void 0, ops = [];\n                for (var i = 0, matchIndex = 0, regexStr = \"\"; i < format.length; i++) {\n                    var token = format[i];\n                    var isBackSlash = token === \"\\\\\";\n                    var escaped = format[i - 1] === \"\\\\\" || isBackSlash;\n                    if (tokenRegex[token] && !escaped) {\n                        regexStr += tokenRegex[token];\n                        var match = new RegExp(regexStr).exec(date);\n                        if (match && (matched = true)) {\n                            ops[token !== \"Y\" ? \"push\" : \"unshift\"]({\n                                fn: revFormat[token],\n                                val: match[++matchIndex],\n                            });\n                        }\n                    }\n                    else if (!isBackSlash)\n                        regexStr += \".\";\n                }\n                parsedDate =\n                    !config || !config.noCalendar\n                        ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0)\n                        : new Date(new Date().setHours(0, 0, 0, 0));\n                ops.forEach(function (_a) {\n                    var fn = _a.fn, val = _a.val;\n                    return (parsedDate = fn(parsedDate, val, locale) || parsedDate);\n                });\n                parsedDate = matched ? parsedDate : undefined;\n            }\n        }\n        if (!(parsedDate instanceof Date && !isNaN(parsedDate.getTime()))) {\n            config.errorHandler(new Error(\"Invalid date provided: \" + dateOrig));\n            return undefined;\n        }\n        if (timeless === true)\n            parsedDate.setHours(0, 0, 0, 0);\n        return parsedDate;\n    };\n};\nexport function compareDates(date1, date2, timeless) {\n    if (timeless === void 0) { timeless = true; }\n    if (timeless !== false) {\n        return (new Date(date1.getTime()).setHours(0, 0, 0, 0) -\n            new Date(date2.getTime()).setHours(0, 0, 0, 0));\n    }\n    return date1.getTime() - date2.getTime();\n}\nexport function compareTimes(date1, date2) {\n    return (3600 * (date1.getHours() - date2.getHours()) +\n        60 * (date1.getMinutes() - date2.getMinutes()) +\n        date1.getSeconds() -\n        date2.getSeconds());\n}\nexport var isBetween = function (ts, ts1, ts2) {\n    return ts > Math.min(ts1, ts2) && ts < Math.max(ts1, ts2);\n};\nexport var calculateSecondsSinceMidnight = function (hours, minutes, seconds) {\n    return hours * 3600 + minutes * 60 + seconds;\n};\nexport var parseSeconds = function (secondsSinceMidnight) {\n    var hours = Math.floor(secondsSinceMidnight / 3600), minutes = (secondsSinceMidnight - hours * 3600) / 60;\n    return [hours, minutes, secondsSinceMidnight - hours * 3600 - minutes * 60];\n};\nexport var duration = {\n    DAY: 86400000,\n};\nexport function getDefaultHours(config) {\n    var hours = config.defaultHour;\n    var minutes = config.defaultMinute;\n    var seconds = config.defaultSeconds;\n    if (config.minDate !== undefined) {\n        var minHour = config.minDate.getHours();\n        var minMinutes = config.minDate.getMinutes();\n        var minSeconds = config.minDate.getSeconds();\n        if (hours < minHour) {\n            hours = minHour;\n        }\n        if (hours === minHour && minutes < minMinutes) {\n            minutes = minMinutes;\n        }\n        if (hours === minHour && minutes === minMinutes && seconds < minSeconds)\n            seconds = config.minDate.getSeconds();\n    }\n    if (config.maxDate !== undefined) {\n        var maxHr = config.maxDate.getHours();\n        var maxMinutes = config.maxDate.getMinutes();\n        hours = Math.min(hours, maxHr);\n        if (hours === maxHr)\n            minutes = Math.min(maxMinutes, minutes);\n        if (hours === maxHr && minutes === maxMinutes)\n            seconds = config.maxDate.getSeconds();\n    }\n    return { hours: hours, minutes: minutes, seconds: seconds };\n}\n", "\"use strict\";\nif (typeof Object.assign !== \"function\") {\n    Object.assign = function (target) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        if (!target) {\n            throw TypeError(\"Cannot convert undefined or null to object\");\n        }\n        var _loop_1 = function (source) {\n            if (source) {\n                Object.keys(source).forEach(function (key) { return (target[key] = source[key]); });\n            }\n        };\n        for (var _a = 0, args_1 = args; _a < args_1.length; _a++) {\n            var source = args_1[_a];\n            _loop_1(source);\n        }\n        return target;\n    };\n}\n", "var __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n            r[k] = a[j];\n    return r;\n};\nimport { defaults as defaultOptions, HOOKS, } from \"./types/options\";\nimport English from \"./l10n/default\";\nimport { arrayify, debounce, int, pad } from \"./utils\";\nimport { clearNode, createElement, createNumberInput, findParent, toggleClass, getEventTarget, } from \"./utils/dom\";\nimport { compareDates, createDateParser, createDateFormatter, duration, isBetween, getDefaultHours, calculateSecondsSinceMidnight, parseSeconds, } from \"./utils/dates\";\nimport { tokenRegex, monthToStr } from \"./utils/formatting\";\nimport \"./utils/polyfills\";\nvar DEBOUNCED_CHANGE_MS = 300;\nfunction FlatpickrInstance(element, instanceConfig) {\n    var self = {\n        config: __assign(__assign({}, defaultOptions), flatpickr.defaultConfig),\n        l10n: English,\n    };\n    self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n    self._handlers = [];\n    self.pluginElements = [];\n    self.loadedPlugins = [];\n    self._bind = bind;\n    self._setHoursFromDate = setHoursFromDate;\n    self._positionCalendar = positionCalendar;\n    self.changeMonth = changeMonth;\n    self.changeYear = changeYear;\n    self.clear = clear;\n    self.close = close;\n    self.onMouseOver = onMouseOver;\n    self._createElement = createElement;\n    self.createDay = createDay;\n    self.destroy = destroy;\n    self.isEnabled = isEnabled;\n    self.jumpToDate = jumpToDate;\n    self.updateValue = updateValue;\n    self.open = open;\n    self.redraw = redraw;\n    self.set = set;\n    self.setDate = setDate;\n    self.toggle = toggle;\n    function setupHelperFunctions() {\n        self.utils = {\n            getDaysInMonth: function (month, yr) {\n                if (month === void 0) { month = self.currentMonth; }\n                if (yr === void 0) { yr = self.currentYear; }\n                if (month === 1 && ((yr % 4 === 0 && yr % 100 !== 0) || yr % 400 === 0))\n                    return 29;\n                return self.l10n.daysInMonth[month];\n            },\n        };\n    }\n    function init() {\n        self.element = self.input = element;\n        self.isOpen = false;\n        parseConfig();\n        setupLocale();\n        setupInputs();\n        setupDates();\n        setupHelperFunctions();\n        if (!self.isMobile)\n            build();\n        bindEvents();\n        if (self.selectedDates.length || self.config.noCalendar) {\n            if (self.config.enableTime) {\n                setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj : undefined);\n            }\n            updateValue(false);\n        }\n        setCalendarWidth();\n        var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n        if (!self.isMobile && isSafari) {\n            positionCalendar();\n        }\n        triggerEvent(\"onReady\");\n    }\n    function getClosestActiveElement() {\n        var _a;\n        return ((_a = self.calendarContainer) === null || _a === void 0 ? void 0 : _a.getRootNode()).activeElement || document.activeElement;\n    }\n    function bindToInstance(fn) {\n        return fn.bind(self);\n    }\n    function setCalendarWidth() {\n        var config = self.config;\n        if (config.weekNumbers === false && config.showMonths === 1) {\n            return;\n        }\n        else if (config.noCalendar !== true) {\n            window.requestAnimationFrame(function () {\n                if (self.calendarContainer !== undefined) {\n                    self.calendarContainer.style.visibility = \"hidden\";\n                    self.calendarContainer.style.display = \"block\";\n                }\n                if (self.daysContainer !== undefined) {\n                    var daysWidth = (self.days.offsetWidth + 1) * config.showMonths;\n                    self.daysContainer.style.width = daysWidth + \"px\";\n                    self.calendarContainer.style.width =\n                        daysWidth +\n                            (self.weekWrapper !== undefined\n                                ? self.weekWrapper.offsetWidth\n                                : 0) +\n                            \"px\";\n                    self.calendarContainer.style.removeProperty(\"visibility\");\n                    self.calendarContainer.style.removeProperty(\"display\");\n                }\n            });\n        }\n    }\n    function updateTime(e) {\n        if (self.selectedDates.length === 0) {\n            var defaultDate = self.config.minDate === undefined ||\n                compareDates(new Date(), self.config.minDate) >= 0\n                ? new Date()\n                : new Date(self.config.minDate.getTime());\n            var defaults = getDefaultHours(self.config);\n            defaultDate.setHours(defaults.hours, defaults.minutes, defaults.seconds, defaultDate.getMilliseconds());\n            self.selectedDates = [defaultDate];\n            self.latestSelectedDateObj = defaultDate;\n        }\n        if (e !== undefined && e.type !== \"blur\") {\n            timeWrapper(e);\n        }\n        var prevValue = self._input.value;\n        setHoursFromInputs();\n        updateValue();\n        if (self._input.value !== prevValue) {\n            self._debouncedChange();\n        }\n    }\n    function ampm2military(hour, amPM) {\n        return (hour % 12) + 12 * int(amPM === self.l10n.amPM[1]);\n    }\n    function military2ampm(hour) {\n        switch (hour % 24) {\n            case 0:\n            case 12:\n                return 12;\n            default:\n                return hour % 12;\n        }\n    }\n    function setHoursFromInputs() {\n        if (self.hourElement === undefined || self.minuteElement === undefined)\n            return;\n        var hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24, minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60, seconds = self.secondElement !== undefined\n            ? (parseInt(self.secondElement.value, 10) || 0) % 60\n            : 0;\n        if (self.amPM !== undefined) {\n            hours = ampm2military(hours, self.amPM.textContent);\n        }\n        var limitMinHours = self.config.minTime !== undefined ||\n            (self.config.minDate &&\n                self.minDateHasTime &&\n                self.latestSelectedDateObj &&\n                compareDates(self.latestSelectedDateObj, self.config.minDate, true) ===\n                    0);\n        var limitMaxHours = self.config.maxTime !== undefined ||\n            (self.config.maxDate &&\n                self.maxDateHasTime &&\n                self.latestSelectedDateObj &&\n                compareDates(self.latestSelectedDateObj, self.config.maxDate, true) ===\n                    0);\n        if (self.config.maxTime !== undefined &&\n            self.config.minTime !== undefined &&\n            self.config.minTime > self.config.maxTime) {\n            var minBound = calculateSecondsSinceMidnight(self.config.minTime.getHours(), self.config.minTime.getMinutes(), self.config.minTime.getSeconds());\n            var maxBound = calculateSecondsSinceMidnight(self.config.maxTime.getHours(), self.config.maxTime.getMinutes(), self.config.maxTime.getSeconds());\n            var currentTime = calculateSecondsSinceMidnight(hours, minutes, seconds);\n            if (currentTime > maxBound && currentTime < minBound) {\n                var result = parseSeconds(minBound);\n                hours = result[0];\n                minutes = result[1];\n                seconds = result[2];\n            }\n        }\n        else {\n            if (limitMaxHours) {\n                var maxTime = self.config.maxTime !== undefined\n                    ? self.config.maxTime\n                    : self.config.maxDate;\n                hours = Math.min(hours, maxTime.getHours());\n                if (hours === maxTime.getHours())\n                    minutes = Math.min(minutes, maxTime.getMinutes());\n                if (minutes === maxTime.getMinutes())\n                    seconds = Math.min(seconds, maxTime.getSeconds());\n            }\n            if (limitMinHours) {\n                var minTime = self.config.minTime !== undefined\n                    ? self.config.minTime\n                    : self.config.minDate;\n                hours = Math.max(hours, minTime.getHours());\n                if (hours === minTime.getHours() && minutes < minTime.getMinutes())\n                    minutes = minTime.getMinutes();\n                if (minutes === minTime.getMinutes())\n                    seconds = Math.max(seconds, minTime.getSeconds());\n            }\n        }\n        setHours(hours, minutes, seconds);\n    }\n    function setHoursFromDate(dateObj) {\n        var date = dateObj || self.latestSelectedDateObj;\n        if (date && date instanceof Date) {\n            setHours(date.getHours(), date.getMinutes(), date.getSeconds());\n        }\n    }\n    function setHours(hours, minutes, seconds) {\n        if (self.latestSelectedDateObj !== undefined) {\n            self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);\n        }\n        if (!self.hourElement || !self.minuteElement || self.isMobile)\n            return;\n        self.hourElement.value = pad(!self.config.time_24hr\n            ? ((12 + hours) % 12) + 12 * int(hours % 12 === 0)\n            : hours);\n        self.minuteElement.value = pad(minutes);\n        if (self.amPM !== undefined)\n            self.amPM.textContent = self.l10n.amPM[int(hours >= 12)];\n        if (self.secondElement !== undefined)\n            self.secondElement.value = pad(seconds);\n    }\n    function onYearInput(event) {\n        var eventTarget = getEventTarget(event);\n        var year = parseInt(eventTarget.value) + (event.delta || 0);\n        if (year / 1000 > 1 ||\n            (event.key === \"Enter\" && !/[^\\d]/.test(year.toString()))) {\n            changeYear(year);\n        }\n    }\n    function bind(element, event, handler, options) {\n        if (event instanceof Array)\n            return event.forEach(function (ev) { return bind(element, ev, handler, options); });\n        if (element instanceof Array)\n            return element.forEach(function (el) { return bind(el, event, handler, options); });\n        element.addEventListener(event, handler, options);\n        self._handlers.push({\n            remove: function () { return element.removeEventListener(event, handler, options); },\n        });\n    }\n    function triggerChange() {\n        triggerEvent(\"onChange\");\n    }\n    function bindEvents() {\n        if (self.config.wrap) {\n            [\"open\", \"close\", \"toggle\", \"clear\"].forEach(function (evt) {\n                Array.prototype.forEach.call(self.element.querySelectorAll(\"[data-\" + evt + \"]\"), function (el) {\n                    return bind(el, \"click\", self[evt]);\n                });\n            });\n        }\n        if (self.isMobile) {\n            setupMobile();\n            return;\n        }\n        var debouncedResize = debounce(onResize, 50);\n        self._debouncedChange = debounce(triggerChange, DEBOUNCED_CHANGE_MS);\n        if (self.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent))\n            bind(self.daysContainer, \"mouseover\", function (e) {\n                if (self.config.mode === \"range\")\n                    onMouseOver(getEventTarget(e));\n            });\n        bind(self._input, \"keydown\", onKeyDown);\n        if (self.calendarContainer !== undefined) {\n            bind(self.calendarContainer, \"keydown\", onKeyDown);\n        }\n        if (!self.config.inline && !self.config.static)\n            bind(window, \"resize\", debouncedResize);\n        if (window.ontouchstart !== undefined)\n            bind(window.document, \"touchstart\", documentClick);\n        else\n            bind(window.document, \"mousedown\", documentClick);\n        bind(window.document, \"focus\", documentClick, { capture: true });\n        if (self.config.clickOpens === true) {\n            bind(self._input, \"focus\", self.open);\n            bind(self._input, \"click\", self.open);\n        }\n        if (self.daysContainer !== undefined) {\n            bind(self.monthNav, \"click\", onMonthNavClick);\n            bind(self.monthNav, [\"keyup\", \"increment\"], onYearInput);\n            bind(self.daysContainer, \"click\", selectDate);\n        }\n        if (self.timeContainer !== undefined &&\n            self.minuteElement !== undefined &&\n            self.hourElement !== undefined) {\n            var selText = function (e) {\n                return getEventTarget(e).select();\n            };\n            bind(self.timeContainer, [\"increment\"], updateTime);\n            bind(self.timeContainer, \"blur\", updateTime, { capture: true });\n            bind(self.timeContainer, \"click\", timeIncrement);\n            bind([self.hourElement, self.minuteElement], [\"focus\", \"click\"], selText);\n            if (self.secondElement !== undefined)\n                bind(self.secondElement, \"focus\", function () { return self.secondElement && self.secondElement.select(); });\n            if (self.amPM !== undefined) {\n                bind(self.amPM, \"click\", function (e) {\n                    updateTime(e);\n                });\n            }\n        }\n        if (self.config.allowInput) {\n            bind(self._input, \"blur\", onBlur);\n        }\n    }\n    function jumpToDate(jumpDate, triggerChange) {\n        var jumpTo = jumpDate !== undefined\n            ? self.parseDate(jumpDate)\n            : self.latestSelectedDateObj ||\n                (self.config.minDate && self.config.minDate > self.now\n                    ? self.config.minDate\n                    : self.config.maxDate && self.config.maxDate < self.now\n                        ? self.config.maxDate\n                        : self.now);\n        var oldYear = self.currentYear;\n        var oldMonth = self.currentMonth;\n        try {\n            if (jumpTo !== undefined) {\n                self.currentYear = jumpTo.getFullYear();\n                self.currentMonth = jumpTo.getMonth();\n            }\n        }\n        catch (e) {\n            e.message = \"Invalid date supplied: \" + jumpTo;\n            self.config.errorHandler(e);\n        }\n        if (triggerChange && self.currentYear !== oldYear) {\n            triggerEvent(\"onYearChange\");\n            buildMonthSwitch();\n        }\n        if (triggerChange &&\n            (self.currentYear !== oldYear || self.currentMonth !== oldMonth)) {\n            triggerEvent(\"onMonthChange\");\n        }\n        self.redraw();\n    }\n    function timeIncrement(e) {\n        var eventTarget = getEventTarget(e);\n        if (~eventTarget.className.indexOf(\"arrow\"))\n            incrementNumInput(e, eventTarget.classList.contains(\"arrowUp\") ? 1 : -1);\n    }\n    function incrementNumInput(e, delta, inputElem) {\n        var target = e && getEventTarget(e);\n        var input = inputElem ||\n            (target && target.parentNode && target.parentNode.firstChild);\n        var event = createEvent(\"increment\");\n        event.delta = delta;\n        input && input.dispatchEvent(event);\n    }\n    function build() {\n        var fragment = window.document.createDocumentFragment();\n        self.calendarContainer = createElement(\"div\", \"flatpickr-calendar\");\n        self.calendarContainer.tabIndex = -1;\n        if (!self.config.noCalendar) {\n            fragment.appendChild(buildMonthNav());\n            self.innerContainer = createElement(\"div\", \"flatpickr-innerContainer\");\n            if (self.config.weekNumbers) {\n                var _a = buildWeeks(), weekWrapper = _a.weekWrapper, weekNumbers = _a.weekNumbers;\n                self.innerContainer.appendChild(weekWrapper);\n                self.weekNumbers = weekNumbers;\n                self.weekWrapper = weekWrapper;\n            }\n            self.rContainer = createElement(\"div\", \"flatpickr-rContainer\");\n            self.rContainer.appendChild(buildWeekdays());\n            if (!self.daysContainer) {\n                self.daysContainer = createElement(\"div\", \"flatpickr-days\");\n                self.daysContainer.tabIndex = -1;\n            }\n            buildDays();\n            self.rContainer.appendChild(self.daysContainer);\n            self.innerContainer.appendChild(self.rContainer);\n            fragment.appendChild(self.innerContainer);\n        }\n        if (self.config.enableTime) {\n            fragment.appendChild(buildTime());\n        }\n        toggleClass(self.calendarContainer, \"rangeMode\", self.config.mode === \"range\");\n        toggleClass(self.calendarContainer, \"animate\", self.config.animate === true);\n        toggleClass(self.calendarContainer, \"multiMonth\", self.config.showMonths > 1);\n        self.calendarContainer.appendChild(fragment);\n        var customAppend = self.config.appendTo !== undefined &&\n            self.config.appendTo.nodeType !== undefined;\n        if (self.config.inline || self.config.static) {\n            self.calendarContainer.classList.add(self.config.inline ? \"inline\" : \"static\");\n            if (self.config.inline) {\n                if (!customAppend && self.element.parentNode)\n                    self.element.parentNode.insertBefore(self.calendarContainer, self._input.nextSibling);\n                else if (self.config.appendTo !== undefined)\n                    self.config.appendTo.appendChild(self.calendarContainer);\n            }\n            if (self.config.static) {\n                var wrapper = createElement(\"div\", \"flatpickr-wrapper\");\n                if (self.element.parentNode)\n                    self.element.parentNode.insertBefore(wrapper, self.element);\n                wrapper.appendChild(self.element);\n                if (self.altInput)\n                    wrapper.appendChild(self.altInput);\n                wrapper.appendChild(self.calendarContainer);\n            }\n        }\n        if (!self.config.static && !self.config.inline)\n            (self.config.appendTo !== undefined\n                ? self.config.appendTo\n                : window.document.body).appendChild(self.calendarContainer);\n    }\n    function createDay(className, date, dayNumber, i) {\n        var dateIsEnabled = isEnabled(date, true), dayElement = createElement(\"span\", className, date.getDate().toString());\n        dayElement.dateObj = date;\n        dayElement.$i = i;\n        dayElement.setAttribute(\"aria-label\", self.formatDate(date, self.config.ariaDateFormat));\n        if (className.indexOf(\"hidden\") === -1 &&\n            compareDates(date, self.now) === 0) {\n            self.todayDateElem = dayElement;\n            dayElement.classList.add(\"today\");\n            dayElement.setAttribute(\"aria-current\", \"date\");\n        }\n        if (dateIsEnabled) {\n            dayElement.tabIndex = -1;\n            if (isDateSelected(date)) {\n                dayElement.classList.add(\"selected\");\n                self.selectedDateElem = dayElement;\n                if (self.config.mode === \"range\") {\n                    toggleClass(dayElement, \"startRange\", self.selectedDates[0] &&\n                        compareDates(date, self.selectedDates[0], true) === 0);\n                    toggleClass(dayElement, \"endRange\", self.selectedDates[1] &&\n                        compareDates(date, self.selectedDates[1], true) === 0);\n                    if (className === \"nextMonthDay\")\n                        dayElement.classList.add(\"inRange\");\n                }\n            }\n        }\n        else {\n            dayElement.classList.add(\"flatpickr-disabled\");\n        }\n        if (self.config.mode === \"range\") {\n            if (isDateInRange(date) && !isDateSelected(date))\n                dayElement.classList.add(\"inRange\");\n        }\n        if (self.weekNumbers &&\n            self.config.showMonths === 1 &&\n            className !== \"prevMonthDay\" &&\n            dayNumber % 7 === 1) {\n            self.weekNumbers.insertAdjacentHTML(\"beforeend\", \"<span class='flatpickr-day'>\" + self.config.getWeek(date) + \"</span>\");\n        }\n        triggerEvent(\"onDayCreate\", dayElement);\n        return dayElement;\n    }\n    function focusOnDayElem(targetNode) {\n        targetNode.focus();\n        if (self.config.mode === \"range\")\n            onMouseOver(targetNode);\n    }\n    function getFirstAvailableDay(delta) {\n        var startMonth = delta > 0 ? 0 : self.config.showMonths - 1;\n        var endMonth = delta > 0 ? self.config.showMonths : -1;\n        for (var m = startMonth; m != endMonth; m += delta) {\n            var month = self.daysContainer.children[m];\n            var startIndex = delta > 0 ? 0 : month.children.length - 1;\n            var endIndex = delta > 0 ? month.children.length : -1;\n            for (var i = startIndex; i != endIndex; i += delta) {\n                var c = month.children[i];\n                if (c.className.indexOf(\"hidden\") === -1 && isEnabled(c.dateObj))\n                    return c;\n            }\n        }\n        return undefined;\n    }\n    function getNextAvailableDay(current, delta) {\n        var givenMonth = current.className.indexOf(\"Month\") === -1\n            ? current.dateObj.getMonth()\n            : self.currentMonth;\n        var endMonth = delta > 0 ? self.config.showMonths : -1;\n        var loopDelta = delta > 0 ? 1 : -1;\n        for (var m = givenMonth - self.currentMonth; m != endMonth; m += loopDelta) {\n            var month = self.daysContainer.children[m];\n            var startIndex = givenMonth - self.currentMonth === m\n                ? current.$i + delta\n                : delta < 0\n                    ? month.children.length - 1\n                    : 0;\n            var numMonthDays = month.children.length;\n            for (var i = startIndex; i >= 0 && i < numMonthDays && i != (delta > 0 ? numMonthDays : -1); i += loopDelta) {\n                var c = month.children[i];\n                if (c.className.indexOf(\"hidden\") === -1 &&\n                    isEnabled(c.dateObj) &&\n                    Math.abs(current.$i - i) >= Math.abs(delta))\n                    return focusOnDayElem(c);\n            }\n        }\n        self.changeMonth(loopDelta);\n        focusOnDay(getFirstAvailableDay(loopDelta), 0);\n        return undefined;\n    }\n    function focusOnDay(current, offset) {\n        var activeElement = getClosestActiveElement();\n        var dayFocused = isInView(activeElement || document.body);\n        var startElem = current !== undefined\n            ? current\n            : dayFocused\n                ? activeElement\n                : self.selectedDateElem !== undefined && isInView(self.selectedDateElem)\n                    ? self.selectedDateElem\n                    : self.todayDateElem !== undefined && isInView(self.todayDateElem)\n                        ? self.todayDateElem\n                        : getFirstAvailableDay(offset > 0 ? 1 : -1);\n        if (startElem === undefined) {\n            self._input.focus();\n        }\n        else if (!dayFocused) {\n            focusOnDayElem(startElem);\n        }\n        else {\n            getNextAvailableDay(startElem, offset);\n        }\n    }\n    function buildMonthDays(year, month) {\n        var firstOfMonth = (new Date(year, month, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;\n        var prevMonthDays = self.utils.getDaysInMonth((month - 1 + 12) % 12, year);\n        var daysInMonth = self.utils.getDaysInMonth(month, year), days = window.document.createDocumentFragment(), isMultiMonth = self.config.showMonths > 1, prevMonthDayClass = isMultiMonth ? \"prevMonthDay hidden\" : \"prevMonthDay\", nextMonthDayClass = isMultiMonth ? \"nextMonthDay hidden\" : \"nextMonthDay\";\n        var dayNumber = prevMonthDays + 1 - firstOfMonth, dayIndex = 0;\n        for (; dayNumber <= prevMonthDays; dayNumber++, dayIndex++) {\n            days.appendChild(createDay(\"flatpickr-day \" + prevMonthDayClass, new Date(year, month - 1, dayNumber), dayNumber, dayIndex));\n        }\n        for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) {\n            days.appendChild(createDay(\"flatpickr-day\", new Date(year, month, dayNumber), dayNumber, dayIndex));\n        }\n        for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth &&\n            (self.config.showMonths === 1 || dayIndex % 7 !== 0); dayNum++, dayIndex++) {\n            days.appendChild(createDay(\"flatpickr-day \" + nextMonthDayClass, new Date(year, month + 1, dayNum % daysInMonth), dayNum, dayIndex));\n        }\n        var dayContainer = createElement(\"div\", \"dayContainer\");\n        dayContainer.appendChild(days);\n        return dayContainer;\n    }\n    function buildDays() {\n        if (self.daysContainer === undefined) {\n            return;\n        }\n        clearNode(self.daysContainer);\n        if (self.weekNumbers)\n            clearNode(self.weekNumbers);\n        var frag = document.createDocumentFragment();\n        for (var i = 0; i < self.config.showMonths; i++) {\n            var d = new Date(self.currentYear, self.currentMonth, 1);\n            d.setMonth(self.currentMonth + i);\n            frag.appendChild(buildMonthDays(d.getFullYear(), d.getMonth()));\n        }\n        self.daysContainer.appendChild(frag);\n        self.days = self.daysContainer.firstChild;\n        if (self.config.mode === \"range\" && self.selectedDates.length === 1) {\n            onMouseOver();\n        }\n    }\n    function buildMonthSwitch() {\n        if (self.config.showMonths > 1 ||\n            self.config.monthSelectorType !== \"dropdown\")\n            return;\n        var shouldBuildMonth = function (month) {\n            if (self.config.minDate !== undefined &&\n                self.currentYear === self.config.minDate.getFullYear() &&\n                month < self.config.minDate.getMonth()) {\n                return false;\n            }\n            return !(self.config.maxDate !== undefined &&\n                self.currentYear === self.config.maxDate.getFullYear() &&\n                month > self.config.maxDate.getMonth());\n        };\n        self.monthsDropdownContainer.tabIndex = -1;\n        self.monthsDropdownContainer.innerHTML = \"\";\n        for (var i = 0; i < 12; i++) {\n            if (!shouldBuildMonth(i))\n                continue;\n            var month = createElement(\"option\", \"flatpickr-monthDropdown-month\");\n            month.value = new Date(self.currentYear, i).getMonth().toString();\n            month.textContent = monthToStr(i, self.config.shorthandCurrentMonth, self.l10n);\n            month.tabIndex = -1;\n            if (self.currentMonth === i) {\n                month.selected = true;\n            }\n            self.monthsDropdownContainer.appendChild(month);\n        }\n    }\n    function buildMonth() {\n        var container = createElement(\"div\", \"flatpickr-month\");\n        var monthNavFragment = window.document.createDocumentFragment();\n        var monthElement;\n        if (self.config.showMonths > 1 ||\n            self.config.monthSelectorType === \"static\") {\n            monthElement = createElement(\"span\", \"cur-month\");\n        }\n        else {\n            self.monthsDropdownContainer = createElement(\"select\", \"flatpickr-monthDropdown-months\");\n            self.monthsDropdownContainer.setAttribute(\"aria-label\", self.l10n.monthAriaLabel);\n            bind(self.monthsDropdownContainer, \"change\", function (e) {\n                var target = getEventTarget(e);\n                var selectedMonth = parseInt(target.value, 10);\n                self.changeMonth(selectedMonth - self.currentMonth);\n                triggerEvent(\"onMonthChange\");\n            });\n            buildMonthSwitch();\n            monthElement = self.monthsDropdownContainer;\n        }\n        var yearInput = createNumberInput(\"cur-year\", { tabindex: \"-1\" });\n        var yearElement = yearInput.getElementsByTagName(\"input\")[0];\n        yearElement.setAttribute(\"aria-label\", self.l10n.yearAriaLabel);\n        if (self.config.minDate) {\n            yearElement.setAttribute(\"min\", self.config.minDate.getFullYear().toString());\n        }\n        if (self.config.maxDate) {\n            yearElement.setAttribute(\"max\", self.config.maxDate.getFullYear().toString());\n            yearElement.disabled =\n                !!self.config.minDate &&\n                    self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();\n        }\n        var currentMonth = createElement(\"div\", \"flatpickr-current-month\");\n        currentMonth.appendChild(monthElement);\n        currentMonth.appendChild(yearInput);\n        monthNavFragment.appendChild(currentMonth);\n        container.appendChild(monthNavFragment);\n        return {\n            container: container,\n            yearElement: yearElement,\n            monthElement: monthElement,\n        };\n    }\n    function buildMonths() {\n        clearNode(self.monthNav);\n        self.monthNav.appendChild(self.prevMonthNav);\n        if (self.config.showMonths) {\n            self.yearElements = [];\n            self.monthElements = [];\n        }\n        for (var m = self.config.showMonths; m--;) {\n            var month = buildMonth();\n            self.yearElements.push(month.yearElement);\n            self.monthElements.push(month.monthElement);\n            self.monthNav.appendChild(month.container);\n        }\n        self.monthNav.appendChild(self.nextMonthNav);\n    }\n    function buildMonthNav() {\n        self.monthNav = createElement(\"div\", \"flatpickr-months\");\n        self.yearElements = [];\n        self.monthElements = [];\n        self.prevMonthNav = createElement(\"span\", \"flatpickr-prev-month\");\n        self.prevMonthNav.innerHTML = self.config.prevArrow;\n        self.nextMonthNav = createElement(\"span\", \"flatpickr-next-month\");\n        self.nextMonthNav.innerHTML = self.config.nextArrow;\n        buildMonths();\n        Object.defineProperty(self, \"_hidePrevMonthArrow\", {\n            get: function () { return self.__hidePrevMonthArrow; },\n            set: function (bool) {\n                if (self.__hidePrevMonthArrow !== bool) {\n                    toggleClass(self.prevMonthNav, \"flatpickr-disabled\", bool);\n                    self.__hidePrevMonthArrow = bool;\n                }\n            },\n        });\n        Object.defineProperty(self, \"_hideNextMonthArrow\", {\n            get: function () { return self.__hideNextMonthArrow; },\n            set: function (bool) {\n                if (self.__hideNextMonthArrow !== bool) {\n                    toggleClass(self.nextMonthNav, \"flatpickr-disabled\", bool);\n                    self.__hideNextMonthArrow = bool;\n                }\n            },\n        });\n        self.currentYearElement = self.yearElements[0];\n        updateNavigationCurrentMonth();\n        return self.monthNav;\n    }\n    function buildTime() {\n        self.calendarContainer.classList.add(\"hasTime\");\n        if (self.config.noCalendar)\n            self.calendarContainer.classList.add(\"noCalendar\");\n        var defaults = getDefaultHours(self.config);\n        self.timeContainer = createElement(\"div\", \"flatpickr-time\");\n        self.timeContainer.tabIndex = -1;\n        var separator = createElement(\"span\", \"flatpickr-time-separator\", \":\");\n        var hourInput = createNumberInput(\"flatpickr-hour\", {\n            \"aria-label\": self.l10n.hourAriaLabel,\n        });\n        self.hourElement = hourInput.getElementsByTagName(\"input\")[0];\n        var minuteInput = createNumberInput(\"flatpickr-minute\", {\n            \"aria-label\": self.l10n.minuteAriaLabel,\n        });\n        self.minuteElement = minuteInput.getElementsByTagName(\"input\")[0];\n        self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;\n        self.hourElement.value = pad(self.latestSelectedDateObj\n            ? self.latestSelectedDateObj.getHours()\n            : self.config.time_24hr\n                ? defaults.hours\n                : military2ampm(defaults.hours));\n        self.minuteElement.value = pad(self.latestSelectedDateObj\n            ? self.latestSelectedDateObj.getMinutes()\n            : defaults.minutes);\n        self.hourElement.setAttribute(\"step\", self.config.hourIncrement.toString());\n        self.minuteElement.setAttribute(\"step\", self.config.minuteIncrement.toString());\n        self.hourElement.setAttribute(\"min\", self.config.time_24hr ? \"0\" : \"1\");\n        self.hourElement.setAttribute(\"max\", self.config.time_24hr ? \"23\" : \"12\");\n        self.hourElement.setAttribute(\"maxlength\", \"2\");\n        self.minuteElement.setAttribute(\"min\", \"0\");\n        self.minuteElement.setAttribute(\"max\", \"59\");\n        self.minuteElement.setAttribute(\"maxlength\", \"2\");\n        self.timeContainer.appendChild(hourInput);\n        self.timeContainer.appendChild(separator);\n        self.timeContainer.appendChild(minuteInput);\n        if (self.config.time_24hr)\n            self.timeContainer.classList.add(\"time24hr\");\n        if (self.config.enableSeconds) {\n            self.timeContainer.classList.add(\"hasSeconds\");\n            var secondInput = createNumberInput(\"flatpickr-second\");\n            self.secondElement = secondInput.getElementsByTagName(\"input\")[0];\n            self.secondElement.value = pad(self.latestSelectedDateObj\n                ? self.latestSelectedDateObj.getSeconds()\n                : defaults.seconds);\n            self.secondElement.setAttribute(\"step\", self.minuteElement.getAttribute(\"step\"));\n            self.secondElement.setAttribute(\"min\", \"0\");\n            self.secondElement.setAttribute(\"max\", \"59\");\n            self.secondElement.setAttribute(\"maxlength\", \"2\");\n            self.timeContainer.appendChild(createElement(\"span\", \"flatpickr-time-separator\", \":\"));\n            self.timeContainer.appendChild(secondInput);\n        }\n        if (!self.config.time_24hr) {\n            self.amPM = createElement(\"span\", \"flatpickr-am-pm\", self.l10n.amPM[int((self.latestSelectedDateObj\n                ? self.hourElement.value\n                : self.config.defaultHour) > 11)]);\n            self.amPM.title = self.l10n.toggleTitle;\n            self.amPM.tabIndex = -1;\n            self.timeContainer.appendChild(self.amPM);\n        }\n        return self.timeContainer;\n    }\n    function buildWeekdays() {\n        if (!self.weekdayContainer)\n            self.weekdayContainer = createElement(\"div\", \"flatpickr-weekdays\");\n        else\n            clearNode(self.weekdayContainer);\n        for (var i = self.config.showMonths; i--;) {\n            var container = createElement(\"div\", \"flatpickr-weekdaycontainer\");\n            self.weekdayContainer.appendChild(container);\n        }\n        updateWeekdays();\n        return self.weekdayContainer;\n    }\n    function updateWeekdays() {\n        if (!self.weekdayContainer) {\n            return;\n        }\n        var firstDayOfWeek = self.l10n.firstDayOfWeek;\n        var weekdays = __spreadArrays(self.l10n.weekdays.shorthand);\n        if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {\n            weekdays = __spreadArrays(weekdays.splice(firstDayOfWeek, weekdays.length), weekdays.splice(0, firstDayOfWeek));\n        }\n        for (var i = self.config.showMonths; i--;) {\n            self.weekdayContainer.children[i].innerHTML = \"\\n      <span class='flatpickr-weekday'>\\n        \" + weekdays.join(\"</span><span class='flatpickr-weekday'>\") + \"\\n      </span>\\n      \";\n        }\n    }\n    function buildWeeks() {\n        self.calendarContainer.classList.add(\"hasWeeks\");\n        var weekWrapper = createElement(\"div\", \"flatpickr-weekwrapper\");\n        weekWrapper.appendChild(createElement(\"span\", \"flatpickr-weekday\", self.l10n.weekAbbreviation));\n        var weekNumbers = createElement(\"div\", \"flatpickr-weeks\");\n        weekWrapper.appendChild(weekNumbers);\n        return {\n            weekWrapper: weekWrapper,\n            weekNumbers: weekNumbers,\n        };\n    }\n    function changeMonth(value, isOffset) {\n        if (isOffset === void 0) { isOffset = true; }\n        var delta = isOffset ? value : value - self.currentMonth;\n        if ((delta < 0 && self._hidePrevMonthArrow === true) ||\n            (delta > 0 && self._hideNextMonthArrow === true))\n            return;\n        self.currentMonth += delta;\n        if (self.currentMonth < 0 || self.currentMonth > 11) {\n            self.currentYear += self.currentMonth > 11 ? 1 : -1;\n            self.currentMonth = (self.currentMonth + 12) % 12;\n            triggerEvent(\"onYearChange\");\n            buildMonthSwitch();\n        }\n        buildDays();\n        triggerEvent(\"onMonthChange\");\n        updateNavigationCurrentMonth();\n    }\n    function clear(triggerChangeEvent, toInitial) {\n        if (triggerChangeEvent === void 0) { triggerChangeEvent = true; }\n        if (toInitial === void 0) { toInitial = true; }\n        self.input.value = \"\";\n        if (self.altInput !== undefined)\n            self.altInput.value = \"\";\n        if (self.mobileInput !== undefined)\n            self.mobileInput.value = \"\";\n        self.selectedDates = [];\n        self.latestSelectedDateObj = undefined;\n        if (toInitial === true) {\n            self.currentYear = self._initialDate.getFullYear();\n            self.currentMonth = self._initialDate.getMonth();\n        }\n        if (self.config.enableTime === true) {\n            var _a = getDefaultHours(self.config), hours = _a.hours, minutes = _a.minutes, seconds = _a.seconds;\n            setHours(hours, minutes, seconds);\n        }\n        self.redraw();\n        if (triggerChangeEvent)\n            triggerEvent(\"onChange\");\n    }\n    function close() {\n        self.isOpen = false;\n        if (!self.isMobile) {\n            if (self.calendarContainer !== undefined) {\n                self.calendarContainer.classList.remove(\"open\");\n            }\n            if (self._input !== undefined) {\n                self._input.classList.remove(\"active\");\n            }\n        }\n        triggerEvent(\"onClose\");\n    }\n    function destroy() {\n        if (self.config !== undefined)\n            triggerEvent(\"onDestroy\");\n        for (var i = self._handlers.length; i--;) {\n            self._handlers[i].remove();\n        }\n        self._handlers = [];\n        if (self.mobileInput) {\n            if (self.mobileInput.parentNode)\n                self.mobileInput.parentNode.removeChild(self.mobileInput);\n            self.mobileInput = undefined;\n        }\n        else if (self.calendarContainer && self.calendarContainer.parentNode) {\n            if (self.config.static && self.calendarContainer.parentNode) {\n                var wrapper = self.calendarContainer.parentNode;\n                wrapper.lastChild && wrapper.removeChild(wrapper.lastChild);\n                if (wrapper.parentNode) {\n                    while (wrapper.firstChild)\n                        wrapper.parentNode.insertBefore(wrapper.firstChild, wrapper);\n                    wrapper.parentNode.removeChild(wrapper);\n                }\n            }\n            else\n                self.calendarContainer.parentNode.removeChild(self.calendarContainer);\n        }\n        if (self.altInput) {\n            self.input.type = \"text\";\n            if (self.altInput.parentNode)\n                self.altInput.parentNode.removeChild(self.altInput);\n            delete self.altInput;\n        }\n        if (self.input) {\n            self.input.type = self.input._type;\n            self.input.classList.remove(\"flatpickr-input\");\n            self.input.removeAttribute(\"readonly\");\n        }\n        [\n            \"_showTimeInput\",\n            \"latestSelectedDateObj\",\n            \"_hideNextMonthArrow\",\n            \"_hidePrevMonthArrow\",\n            \"__hideNextMonthArrow\",\n            \"__hidePrevMonthArrow\",\n            \"isMobile\",\n            \"isOpen\",\n            \"selectedDateElem\",\n            \"minDateHasTime\",\n            \"maxDateHasTime\",\n            \"days\",\n            \"daysContainer\",\n            \"_input\",\n            \"_positionElement\",\n            \"innerContainer\",\n            \"rContainer\",\n            \"monthNav\",\n            \"todayDateElem\",\n            \"calendarContainer\",\n            \"weekdayContainer\",\n            \"prevMonthNav\",\n            \"nextMonthNav\",\n            \"monthsDropdownContainer\",\n            \"currentMonthElement\",\n            \"currentYearElement\",\n            \"navigationCurrentMonth\",\n            \"selectedDateElem\",\n            \"config\",\n        ].forEach(function (k) {\n            try {\n                delete self[k];\n            }\n            catch (_) { }\n        });\n    }\n    function isCalendarElem(elem) {\n        return self.calendarContainer.contains(elem);\n    }\n    function documentClick(e) {\n        if (self.isOpen && !self.config.inline) {\n            var eventTarget_1 = getEventTarget(e);\n            var isCalendarElement = isCalendarElem(eventTarget_1);\n            var isInput = eventTarget_1 === self.input ||\n                eventTarget_1 === self.altInput ||\n                self.element.contains(eventTarget_1) ||\n                (e.path &&\n                    e.path.indexOf &&\n                    (~e.path.indexOf(self.input) ||\n                        ~e.path.indexOf(self.altInput)));\n            var lostFocus = !isInput &&\n                !isCalendarElement &&\n                !isCalendarElem(e.relatedTarget);\n            var isIgnored = !self.config.ignoredFocusElements.some(function (elem) {\n                return elem.contains(eventTarget_1);\n            });\n            if (lostFocus && isIgnored) {\n                if (self.config.allowInput) {\n                    self.setDate(self._input.value, false, self.config.altInput\n                        ? self.config.altFormat\n                        : self.config.dateFormat);\n                }\n                if (self.timeContainer !== undefined &&\n                    self.minuteElement !== undefined &&\n                    self.hourElement !== undefined &&\n                    self.input.value !== \"\" &&\n                    self.input.value !== undefined) {\n                    updateTime();\n                }\n                self.close();\n                if (self.config &&\n                    self.config.mode === \"range\" &&\n                    self.selectedDates.length === 1)\n                    self.clear(false);\n            }\n        }\n    }\n    function changeYear(newYear) {\n        if (!newYear ||\n            (self.config.minDate && newYear < self.config.minDate.getFullYear()) ||\n            (self.config.maxDate && newYear > self.config.maxDate.getFullYear()))\n            return;\n        var newYearNum = newYear, isNewYear = self.currentYear !== newYearNum;\n        self.currentYear = newYearNum || self.currentYear;\n        if (self.config.maxDate &&\n            self.currentYear === self.config.maxDate.getFullYear()) {\n            self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);\n        }\n        else if (self.config.minDate &&\n            self.currentYear === self.config.minDate.getFullYear()) {\n            self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);\n        }\n        if (isNewYear) {\n            self.redraw();\n            triggerEvent(\"onYearChange\");\n            buildMonthSwitch();\n        }\n    }\n    function isEnabled(date, timeless) {\n        var _a;\n        if (timeless === void 0) { timeless = true; }\n        var dateToCheck = self.parseDate(date, undefined, timeless);\n        if ((self.config.minDate &&\n            dateToCheck &&\n            compareDates(dateToCheck, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0) ||\n            (self.config.maxDate &&\n                dateToCheck &&\n                compareDates(dateToCheck, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0))\n            return false;\n        if (!self.config.enable && self.config.disable.length === 0)\n            return true;\n        if (dateToCheck === undefined)\n            return false;\n        var bool = !!self.config.enable, array = (_a = self.config.enable) !== null && _a !== void 0 ? _a : self.config.disable;\n        for (var i = 0, d = void 0; i < array.length; i++) {\n            d = array[i];\n            if (typeof d === \"function\" &&\n                d(dateToCheck))\n                return bool;\n            else if (d instanceof Date &&\n                dateToCheck !== undefined &&\n                d.getTime() === dateToCheck.getTime())\n                return bool;\n            else if (typeof d === \"string\") {\n                var parsed = self.parseDate(d, undefined, true);\n                return parsed && parsed.getTime() === dateToCheck.getTime()\n                    ? bool\n                    : !bool;\n            }\n            else if (typeof d === \"object\" &&\n                dateToCheck !== undefined &&\n                d.from &&\n                d.to &&\n                dateToCheck.getTime() >= d.from.getTime() &&\n                dateToCheck.getTime() <= d.to.getTime())\n                return bool;\n        }\n        return !bool;\n    }\n    function isInView(elem) {\n        if (self.daysContainer !== undefined)\n            return (elem.className.indexOf(\"hidden\") === -1 &&\n                elem.className.indexOf(\"flatpickr-disabled\") === -1 &&\n                self.daysContainer.contains(elem));\n        return false;\n    }\n    function onBlur(e) {\n        var isInput = e.target === self._input;\n        if (isInput &&\n            (self.selectedDates.length > 0 || self._input.value.length > 0) &&\n            !(e.relatedTarget && isCalendarElem(e.relatedTarget))) {\n            self.setDate(self._input.value, true, e.target === self.altInput\n                ? self.config.altFormat\n                : self.config.dateFormat);\n        }\n    }\n    function onKeyDown(e) {\n        var eventTarget = getEventTarget(e);\n        var isInput = self.config.wrap\n            ? element.contains(eventTarget)\n            : eventTarget === self._input;\n        var allowInput = self.config.allowInput;\n        var allowKeydown = self.isOpen && (!allowInput || !isInput);\n        var allowInlineKeydown = self.config.inline && isInput && !allowInput;\n        if (e.keyCode === 13 && isInput) {\n            if (allowInput) {\n                self.setDate(self._input.value, true, eventTarget === self.altInput\n                    ? self.config.altFormat\n                    : self.config.dateFormat);\n                self.close();\n                return eventTarget.blur();\n            }\n            else {\n                self.open();\n            }\n        }\n        else if (isCalendarElem(eventTarget) ||\n            allowKeydown ||\n            allowInlineKeydown) {\n            var isTimeObj = !!self.timeContainer &&\n                self.timeContainer.contains(eventTarget);\n            switch (e.keyCode) {\n                case 13:\n                    if (isTimeObj) {\n                        e.preventDefault();\n                        updateTime();\n                        focusAndClose();\n                    }\n                    else\n                        selectDate(e);\n                    break;\n                case 27:\n                    e.preventDefault();\n                    focusAndClose();\n                    break;\n                case 8:\n                case 46:\n                    if (isInput && !self.config.allowInput) {\n                        e.preventDefault();\n                        self.clear();\n                    }\n                    break;\n                case 37:\n                case 39:\n                    if (!isTimeObj && !isInput) {\n                        e.preventDefault();\n                        var activeElement = getClosestActiveElement();\n                        if (self.daysContainer !== undefined &&\n                            (allowInput === false ||\n                                (activeElement && isInView(activeElement)))) {\n                            var delta_1 = e.keyCode === 39 ? 1 : -1;\n                            if (!e.ctrlKey)\n                                focusOnDay(undefined, delta_1);\n                            else {\n                                e.stopPropagation();\n                                changeMonth(delta_1);\n                                focusOnDay(getFirstAvailableDay(1), 0);\n                            }\n                        }\n                    }\n                    else if (self.hourElement)\n                        self.hourElement.focus();\n                    break;\n                case 38:\n                case 40:\n                    e.preventDefault();\n                    var delta = e.keyCode === 40 ? 1 : -1;\n                    if ((self.daysContainer &&\n                        eventTarget.$i !== undefined) ||\n                        eventTarget === self.input ||\n                        eventTarget === self.altInput) {\n                        if (e.ctrlKey) {\n                            e.stopPropagation();\n                            changeYear(self.currentYear - delta);\n                            focusOnDay(getFirstAvailableDay(1), 0);\n                        }\n                        else if (!isTimeObj)\n                            focusOnDay(undefined, delta * 7);\n                    }\n                    else if (eventTarget === self.currentYearElement) {\n                        changeYear(self.currentYear - delta);\n                    }\n                    else if (self.config.enableTime) {\n                        if (!isTimeObj && self.hourElement)\n                            self.hourElement.focus();\n                        updateTime(e);\n                        self._debouncedChange();\n                    }\n                    break;\n                case 9:\n                    if (isTimeObj) {\n                        var elems = [\n                            self.hourElement,\n                            self.minuteElement,\n                            self.secondElement,\n                            self.amPM,\n                        ]\n                            .concat(self.pluginElements)\n                            .filter(function (x) { return x; });\n                        var i = elems.indexOf(eventTarget);\n                        if (i !== -1) {\n                            var target = elems[i + (e.shiftKey ? -1 : 1)];\n                            e.preventDefault();\n                            (target || self._input).focus();\n                        }\n                    }\n                    else if (!self.config.noCalendar &&\n                        self.daysContainer &&\n                        self.daysContainer.contains(eventTarget) &&\n                        e.shiftKey) {\n                        e.preventDefault();\n                        self._input.focus();\n                    }\n                    break;\n                default:\n                    break;\n            }\n        }\n        if (self.amPM !== undefined && eventTarget === self.amPM) {\n            switch (e.key) {\n                case self.l10n.amPM[0].charAt(0):\n                case self.l10n.amPM[0].charAt(0).toLowerCase():\n                    self.amPM.textContent = self.l10n.amPM[0];\n                    setHoursFromInputs();\n                    updateValue();\n                    break;\n                case self.l10n.amPM[1].charAt(0):\n                case self.l10n.amPM[1].charAt(0).toLowerCase():\n                    self.amPM.textContent = self.l10n.amPM[1];\n                    setHoursFromInputs();\n                    updateValue();\n                    break;\n            }\n        }\n        if (isInput || isCalendarElem(eventTarget)) {\n            triggerEvent(\"onKeyDown\", e);\n        }\n    }\n    function onMouseOver(elem, cellClass) {\n        if (cellClass === void 0) { cellClass = \"flatpickr-day\"; }\n        if (self.selectedDates.length !== 1 ||\n            (elem &&\n                (!elem.classList.contains(cellClass) ||\n                    elem.classList.contains(\"flatpickr-disabled\"))))\n            return;\n        var hoverDate = elem\n            ? elem.dateObj.getTime()\n            : self.days.firstElementChild.dateObj.getTime(), initialDate = self.parseDate(self.selectedDates[0], undefined, true).getTime(), rangeStartDate = Math.min(hoverDate, self.selectedDates[0].getTime()), rangeEndDate = Math.max(hoverDate, self.selectedDates[0].getTime());\n        var containsDisabled = false;\n        var minRange = 0, maxRange = 0;\n        for (var t = rangeStartDate; t < rangeEndDate; t += duration.DAY) {\n            if (!isEnabled(new Date(t), true)) {\n                containsDisabled =\n                    containsDisabled || (t > rangeStartDate && t < rangeEndDate);\n                if (t < initialDate && (!minRange || t > minRange))\n                    minRange = t;\n                else if (t > initialDate && (!maxRange || t < maxRange))\n                    maxRange = t;\n            }\n        }\n        var hoverableCells = Array.from(self.rContainer.querySelectorAll(\"*:nth-child(-n+\" + self.config.showMonths + \") > .\" + cellClass));\n        hoverableCells.forEach(function (dayElem) {\n            var date = dayElem.dateObj;\n            var timestamp = date.getTime();\n            var outOfRange = (minRange > 0 && timestamp < minRange) ||\n                (maxRange > 0 && timestamp > maxRange);\n            if (outOfRange) {\n                dayElem.classList.add(\"notAllowed\");\n                [\"inRange\", \"startRange\", \"endRange\"].forEach(function (c) {\n                    dayElem.classList.remove(c);\n                });\n                return;\n            }\n            else if (containsDisabled && !outOfRange)\n                return;\n            [\"startRange\", \"inRange\", \"endRange\", \"notAllowed\"].forEach(function (c) {\n                dayElem.classList.remove(c);\n            });\n            if (elem !== undefined) {\n                elem.classList.add(hoverDate <= self.selectedDates[0].getTime()\n                    ? \"startRange\"\n                    : \"endRange\");\n                if (initialDate < hoverDate && timestamp === initialDate)\n                    dayElem.classList.add(\"startRange\");\n                else if (initialDate > hoverDate && timestamp === initialDate)\n                    dayElem.classList.add(\"endRange\");\n                if (timestamp >= minRange &&\n                    (maxRange === 0 || timestamp <= maxRange) &&\n                    isBetween(timestamp, initialDate, hoverDate))\n                    dayElem.classList.add(\"inRange\");\n            }\n        });\n    }\n    function onResize() {\n        if (self.isOpen && !self.config.static && !self.config.inline)\n            positionCalendar();\n    }\n    function open(e, positionElement) {\n        if (positionElement === void 0) { positionElement = self._positionElement; }\n        if (self.isMobile === true) {\n            if (e) {\n                e.preventDefault();\n                var eventTarget = getEventTarget(e);\n                if (eventTarget) {\n                    eventTarget.blur();\n                }\n            }\n            if (self.mobileInput !== undefined) {\n                self.mobileInput.focus();\n                self.mobileInput.click();\n            }\n            triggerEvent(\"onOpen\");\n            return;\n        }\n        else if (self._input.disabled || self.config.inline) {\n            return;\n        }\n        var wasOpen = self.isOpen;\n        self.isOpen = true;\n        if (!wasOpen) {\n            self.calendarContainer.classList.add(\"open\");\n            self._input.classList.add(\"active\");\n            triggerEvent(\"onOpen\");\n            positionCalendar(positionElement);\n        }\n        if (self.config.enableTime === true && self.config.noCalendar === true) {\n            if (self.config.allowInput === false &&\n                (e === undefined ||\n                    !self.timeContainer.contains(e.relatedTarget))) {\n                setTimeout(function () { return self.hourElement.select(); }, 50);\n            }\n        }\n    }\n    function minMaxDateSetter(type) {\n        return function (date) {\n            var dateObj = (self.config[\"_\" + type + \"Date\"] = self.parseDate(date, self.config.dateFormat));\n            var inverseDateObj = self.config[\"_\" + (type === \"min\" ? \"max\" : \"min\") + \"Date\"];\n            if (dateObj !== undefined) {\n                self[type === \"min\" ? \"minDateHasTime\" : \"maxDateHasTime\"] =\n                    dateObj.getHours() > 0 ||\n                        dateObj.getMinutes() > 0 ||\n                        dateObj.getSeconds() > 0;\n            }\n            if (self.selectedDates) {\n                self.selectedDates = self.selectedDates.filter(function (d) { return isEnabled(d); });\n                if (!self.selectedDates.length && type === \"min\")\n                    setHoursFromDate(dateObj);\n                updateValue();\n            }\n            if (self.daysContainer) {\n                redraw();\n                if (dateObj !== undefined)\n                    self.currentYearElement[type] = dateObj.getFullYear().toString();\n                else\n                    self.currentYearElement.removeAttribute(type);\n                self.currentYearElement.disabled =\n                    !!inverseDateObj &&\n                        dateObj !== undefined &&\n                        inverseDateObj.getFullYear() === dateObj.getFullYear();\n            }\n        };\n    }\n    function parseConfig() {\n        var boolOpts = [\n            \"wrap\",\n            \"weekNumbers\",\n            \"allowInput\",\n            \"allowInvalidPreload\",\n            \"clickOpens\",\n            \"time_24hr\",\n            \"enableTime\",\n            \"noCalendar\",\n            \"altInput\",\n            \"shorthandCurrentMonth\",\n            \"inline\",\n            \"static\",\n            \"enableSeconds\",\n            \"disableMobile\",\n        ];\n        var userConfig = __assign(__assign({}, JSON.parse(JSON.stringify(element.dataset || {}))), instanceConfig);\n        var formats = {};\n        self.config.parseDate = userConfig.parseDate;\n        self.config.formatDate = userConfig.formatDate;\n        Object.defineProperty(self.config, \"enable\", {\n            get: function () { return self.config._enable; },\n            set: function (dates) {\n                self.config._enable = parseDateRules(dates);\n            },\n        });\n        Object.defineProperty(self.config, \"disable\", {\n            get: function () { return self.config._disable; },\n            set: function (dates) {\n                self.config._disable = parseDateRules(dates);\n            },\n        });\n        var timeMode = userConfig.mode === \"time\";\n        if (!userConfig.dateFormat && (userConfig.enableTime || timeMode)) {\n            var defaultDateFormat = flatpickr.defaultConfig.dateFormat || defaultOptions.dateFormat;\n            formats.dateFormat =\n                userConfig.noCalendar || timeMode\n                    ? \"H:i\" + (userConfig.enableSeconds ? \":S\" : \"\")\n                    : defaultDateFormat + \" H:i\" + (userConfig.enableSeconds ? \":S\" : \"\");\n        }\n        if (userConfig.altInput &&\n            (userConfig.enableTime || timeMode) &&\n            !userConfig.altFormat) {\n            var defaultAltFormat = flatpickr.defaultConfig.altFormat || defaultOptions.altFormat;\n            formats.altFormat =\n                userConfig.noCalendar || timeMode\n                    ? \"h:i\" + (userConfig.enableSeconds ? \":S K\" : \" K\")\n                    : defaultAltFormat + (\" h:i\" + (userConfig.enableSeconds ? \":S\" : \"\") + \" K\");\n        }\n        Object.defineProperty(self.config, \"minDate\", {\n            get: function () { return self.config._minDate; },\n            set: minMaxDateSetter(\"min\"),\n        });\n        Object.defineProperty(self.config, \"maxDate\", {\n            get: function () { return self.config._maxDate; },\n            set: minMaxDateSetter(\"max\"),\n        });\n        var minMaxTimeSetter = function (type) { return function (val) {\n            self.config[type === \"min\" ? \"_minTime\" : \"_maxTime\"] = self.parseDate(val, \"H:i:S\");\n        }; };\n        Object.defineProperty(self.config, \"minTime\", {\n            get: function () { return self.config._minTime; },\n            set: minMaxTimeSetter(\"min\"),\n        });\n        Object.defineProperty(self.config, \"maxTime\", {\n            get: function () { return self.config._maxTime; },\n            set: minMaxTimeSetter(\"max\"),\n        });\n        if (userConfig.mode === \"time\") {\n            self.config.noCalendar = true;\n            self.config.enableTime = true;\n        }\n        Object.assign(self.config, formats, userConfig);\n        for (var i = 0; i < boolOpts.length; i++)\n            self.config[boolOpts[i]] =\n                self.config[boolOpts[i]] === true ||\n                    self.config[boolOpts[i]] === \"true\";\n        HOOKS.filter(function (hook) { return self.config[hook] !== undefined; }).forEach(function (hook) {\n            self.config[hook] = arrayify(self.config[hook] || []).map(bindToInstance);\n        });\n        self.isMobile =\n            !self.config.disableMobile &&\n                !self.config.inline &&\n                self.config.mode === \"single\" &&\n                !self.config.disable.length &&\n                !self.config.enable &&\n                !self.config.weekNumbers &&\n                /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n        for (var i = 0; i < self.config.plugins.length; i++) {\n            var pluginConf = self.config.plugins[i](self) || {};\n            for (var key in pluginConf) {\n                if (HOOKS.indexOf(key) > -1) {\n                    self.config[key] = arrayify(pluginConf[key])\n                        .map(bindToInstance)\n                        .concat(self.config[key]);\n                }\n                else if (typeof userConfig[key] === \"undefined\")\n                    self.config[key] = pluginConf[key];\n            }\n        }\n        if (!userConfig.altInputClass) {\n            self.config.altInputClass =\n                getInputElem().className + \" \" + self.config.altInputClass;\n        }\n        triggerEvent(\"onParseConfig\");\n    }\n    function getInputElem() {\n        return self.config.wrap\n            ? element.querySelector(\"[data-input]\")\n            : element;\n    }\n    function setupLocale() {\n        if (typeof self.config.locale !== \"object\" &&\n            typeof flatpickr.l10ns[self.config.locale] === \"undefined\")\n            self.config.errorHandler(new Error(\"flatpickr: invalid locale \" + self.config.locale));\n        self.l10n = __assign(__assign({}, flatpickr.l10ns.default), (typeof self.config.locale === \"object\"\n            ? self.config.locale\n            : self.config.locale !== \"default\"\n                ? flatpickr.l10ns[self.config.locale]\n                : undefined));\n        tokenRegex.D = \"(\" + self.l10n.weekdays.shorthand.join(\"|\") + \")\";\n        tokenRegex.l = \"(\" + self.l10n.weekdays.longhand.join(\"|\") + \")\";\n        tokenRegex.M = \"(\" + self.l10n.months.shorthand.join(\"|\") + \")\";\n        tokenRegex.F = \"(\" + self.l10n.months.longhand.join(\"|\") + \")\";\n        tokenRegex.K = \"(\" + self.l10n.amPM[0] + \"|\" + self.l10n.amPM[1] + \"|\" + self.l10n.amPM[0].toLowerCase() + \"|\" + self.l10n.amPM[1].toLowerCase() + \")\";\n        var userConfig = __assign(__assign({}, instanceConfig), JSON.parse(JSON.stringify(element.dataset || {})));\n        if (userConfig.time_24hr === undefined &&\n            flatpickr.defaultConfig.time_24hr === undefined) {\n            self.config.time_24hr = self.l10n.time_24hr;\n        }\n        self.formatDate = createDateFormatter(self);\n        self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n    }\n    function positionCalendar(customPositionElement) {\n        if (typeof self.config.position === \"function\") {\n            return void self.config.position(self, customPositionElement);\n        }\n        if (self.calendarContainer === undefined)\n            return;\n        triggerEvent(\"onPreCalendarPosition\");\n        var positionElement = customPositionElement || self._positionElement;\n        var calendarHeight = Array.prototype.reduce.call(self.calendarContainer.children, (function (acc, child) { return acc + child.offsetHeight; }), 0), calendarWidth = self.calendarContainer.offsetWidth, configPos = self.config.position.split(\" \"), configPosVertical = configPos[0], configPosHorizontal = configPos.length > 1 ? configPos[1] : null, inputBounds = positionElement.getBoundingClientRect(), distanceFromBottom = window.innerHeight - inputBounds.bottom, showOnTop = configPosVertical === \"above\" ||\n            (configPosVertical !== \"below\" &&\n                distanceFromBottom < calendarHeight &&\n                inputBounds.top > calendarHeight);\n        var top = window.pageYOffset +\n            inputBounds.top +\n            (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2);\n        toggleClass(self.calendarContainer, \"arrowTop\", !showOnTop);\n        toggleClass(self.calendarContainer, \"arrowBottom\", showOnTop);\n        if (self.config.inline)\n            return;\n        var left = window.pageXOffset + inputBounds.left;\n        var isCenter = false;\n        var isRight = false;\n        if (configPosHorizontal === \"center\") {\n            left -= (calendarWidth - inputBounds.width) / 2;\n            isCenter = true;\n        }\n        else if (configPosHorizontal === \"right\") {\n            left -= calendarWidth - inputBounds.width;\n            isRight = true;\n        }\n        toggleClass(self.calendarContainer, \"arrowLeft\", !isCenter && !isRight);\n        toggleClass(self.calendarContainer, \"arrowCenter\", isCenter);\n        toggleClass(self.calendarContainer, \"arrowRight\", isRight);\n        var right = window.document.body.offsetWidth -\n            (window.pageXOffset + inputBounds.right);\n        var rightMost = left + calendarWidth > window.document.body.offsetWidth;\n        var centerMost = right + calendarWidth > window.document.body.offsetWidth;\n        toggleClass(self.calendarContainer, \"rightMost\", rightMost);\n        if (self.config.static)\n            return;\n        self.calendarContainer.style.top = top + \"px\";\n        if (!rightMost) {\n            self.calendarContainer.style.left = left + \"px\";\n            self.calendarContainer.style.right = \"auto\";\n        }\n        else if (!centerMost) {\n            self.calendarContainer.style.left = \"auto\";\n            self.calendarContainer.style.right = right + \"px\";\n        }\n        else {\n            var doc = getDocumentStyleSheet();\n            if (doc === undefined)\n                return;\n            var bodyWidth = window.document.body.offsetWidth;\n            var centerLeft = Math.max(0, bodyWidth / 2 - calendarWidth / 2);\n            var centerBefore = \".flatpickr-calendar.centerMost:before\";\n            var centerAfter = \".flatpickr-calendar.centerMost:after\";\n            var centerIndex = doc.cssRules.length;\n            var centerStyle = \"{left:\" + inputBounds.left + \"px;right:auto;}\";\n            toggleClass(self.calendarContainer, \"rightMost\", false);\n            toggleClass(self.calendarContainer, \"centerMost\", true);\n            doc.insertRule(centerBefore + \",\" + centerAfter + centerStyle, centerIndex);\n            self.calendarContainer.style.left = centerLeft + \"px\";\n            self.calendarContainer.style.right = \"auto\";\n        }\n    }\n    function getDocumentStyleSheet() {\n        var editableSheet = null;\n        for (var i = 0; i < document.styleSheets.length; i++) {\n            var sheet = document.styleSheets[i];\n            if (!sheet.cssRules)\n                continue;\n            try {\n                sheet.cssRules;\n            }\n            catch (err) {\n                continue;\n            }\n            editableSheet = sheet;\n            break;\n        }\n        return editableSheet != null ? editableSheet : createStyleSheet();\n    }\n    function createStyleSheet() {\n        var style = document.createElement(\"style\");\n        document.head.appendChild(style);\n        return style.sheet;\n    }\n    function redraw() {\n        if (self.config.noCalendar || self.isMobile)\n            return;\n        buildMonthSwitch();\n        updateNavigationCurrentMonth();\n        buildDays();\n    }\n    function focusAndClose() {\n        self._input.focus();\n        if (window.navigator.userAgent.indexOf(\"MSIE\") !== -1 ||\n            navigator.msMaxTouchPoints !== undefined) {\n            setTimeout(self.close, 0);\n        }\n        else {\n            self.close();\n        }\n    }\n    function selectDate(e) {\n        e.preventDefault();\n        e.stopPropagation();\n        var isSelectable = function (day) {\n            return day.classList &&\n                day.classList.contains(\"flatpickr-day\") &&\n                !day.classList.contains(\"flatpickr-disabled\") &&\n                !day.classList.contains(\"notAllowed\");\n        };\n        var t = findParent(getEventTarget(e), isSelectable);\n        if (t === undefined)\n            return;\n        var target = t;\n        var selectedDate = (self.latestSelectedDateObj = new Date(target.dateObj.getTime()));\n        var shouldChangeMonth = (selectedDate.getMonth() < self.currentMonth ||\n            selectedDate.getMonth() >\n                self.currentMonth + self.config.showMonths - 1) &&\n            self.config.mode !== \"range\";\n        self.selectedDateElem = target;\n        if (self.config.mode === \"single\")\n            self.selectedDates = [selectedDate];\n        else if (self.config.mode === \"multiple\") {\n            var selectedIndex = isDateSelected(selectedDate);\n            if (selectedIndex)\n                self.selectedDates.splice(parseInt(selectedIndex), 1);\n            else\n                self.selectedDates.push(selectedDate);\n        }\n        else if (self.config.mode === \"range\") {\n            if (self.selectedDates.length === 2) {\n                self.clear(false, false);\n            }\n            self.latestSelectedDateObj = selectedDate;\n            self.selectedDates.push(selectedDate);\n            if (compareDates(selectedDate, self.selectedDates[0], true) !== 0)\n                self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n        }\n        setHoursFromInputs();\n        if (shouldChangeMonth) {\n            var isNewYear = self.currentYear !== selectedDate.getFullYear();\n            self.currentYear = selectedDate.getFullYear();\n            self.currentMonth = selectedDate.getMonth();\n            if (isNewYear) {\n                triggerEvent(\"onYearChange\");\n                buildMonthSwitch();\n            }\n            triggerEvent(\"onMonthChange\");\n        }\n        updateNavigationCurrentMonth();\n        buildDays();\n        updateValue();\n        if (!shouldChangeMonth &&\n            self.config.mode !== \"range\" &&\n            self.config.showMonths === 1)\n            focusOnDayElem(target);\n        else if (self.selectedDateElem !== undefined &&\n            self.hourElement === undefined) {\n            self.selectedDateElem && self.selectedDateElem.focus();\n        }\n        if (self.hourElement !== undefined)\n            self.hourElement !== undefined && self.hourElement.focus();\n        if (self.config.closeOnSelect) {\n            var single = self.config.mode === \"single\" && !self.config.enableTime;\n            var range = self.config.mode === \"range\" &&\n                self.selectedDates.length === 2 &&\n                !self.config.enableTime;\n            if (single || range) {\n                focusAndClose();\n            }\n        }\n        triggerChange();\n    }\n    var CALLBACKS = {\n        locale: [setupLocale, updateWeekdays],\n        showMonths: [buildMonths, setCalendarWidth, buildWeekdays],\n        minDate: [jumpToDate],\n        maxDate: [jumpToDate],\n        positionElement: [updatePositionElement],\n        clickOpens: [\n            function () {\n                if (self.config.clickOpens === true) {\n                    bind(self._input, \"focus\", self.open);\n                    bind(self._input, \"click\", self.open);\n                }\n                else {\n                    self._input.removeEventListener(\"focus\", self.open);\n                    self._input.removeEventListener(\"click\", self.open);\n                }\n            },\n        ],\n    };\n    function set(option, value) {\n        if (option !== null && typeof option === \"object\") {\n            Object.assign(self.config, option);\n            for (var key in option) {\n                if (CALLBACKS[key] !== undefined)\n                    CALLBACKS[key].forEach(function (x) { return x(); });\n            }\n        }\n        else {\n            self.config[option] = value;\n            if (CALLBACKS[option] !== undefined)\n                CALLBACKS[option].forEach(function (x) { return x(); });\n            else if (HOOKS.indexOf(option) > -1)\n                self.config[option] = arrayify(value);\n        }\n        self.redraw();\n        updateValue(true);\n    }\n    function setSelectedDate(inputDate, format) {\n        var dates = [];\n        if (inputDate instanceof Array)\n            dates = inputDate.map(function (d) { return self.parseDate(d, format); });\n        else if (inputDate instanceof Date || typeof inputDate === \"number\")\n            dates = [self.parseDate(inputDate, format)];\n        else if (typeof inputDate === \"string\") {\n            switch (self.config.mode) {\n                case \"single\":\n                case \"time\":\n                    dates = [self.parseDate(inputDate, format)];\n                    break;\n                case \"multiple\":\n                    dates = inputDate\n                        .split(self.config.conjunction)\n                        .map(function (date) { return self.parseDate(date, format); });\n                    break;\n                case \"range\":\n                    dates = inputDate\n                        .split(self.l10n.rangeSeparator)\n                        .map(function (date) { return self.parseDate(date, format); });\n                    break;\n                default:\n                    break;\n            }\n        }\n        else\n            self.config.errorHandler(new Error(\"Invalid date supplied: \" + JSON.stringify(inputDate)));\n        self.selectedDates = (self.config.allowInvalidPreload\n            ? dates\n            : dates.filter(function (d) { return d instanceof Date && isEnabled(d, false); }));\n        if (self.config.mode === \"range\")\n            self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n    }\n    function setDate(date, triggerChange, format) {\n        if (triggerChange === void 0) { triggerChange = false; }\n        if (format === void 0) { format = self.config.dateFormat; }\n        if ((date !== 0 && !date) || (date instanceof Array && date.length === 0))\n            return self.clear(triggerChange);\n        setSelectedDate(date, format);\n        self.latestSelectedDateObj =\n            self.selectedDates[self.selectedDates.length - 1];\n        self.redraw();\n        jumpToDate(undefined, triggerChange);\n        setHoursFromDate();\n        if (self.selectedDates.length === 0) {\n            self.clear(false);\n        }\n        updateValue(triggerChange);\n        if (triggerChange)\n            triggerEvent(\"onChange\");\n    }\n    function parseDateRules(arr) {\n        return arr\n            .slice()\n            .map(function (rule) {\n            if (typeof rule === \"string\" ||\n                typeof rule === \"number\" ||\n                rule instanceof Date) {\n                return self.parseDate(rule, undefined, true);\n            }\n            else if (rule &&\n                typeof rule === \"object\" &&\n                rule.from &&\n                rule.to)\n                return {\n                    from: self.parseDate(rule.from, undefined),\n                    to: self.parseDate(rule.to, undefined),\n                };\n            return rule;\n        })\n            .filter(function (x) { return x; });\n    }\n    function setupDates() {\n        self.selectedDates = [];\n        self.now = self.parseDate(self.config.now) || new Date();\n        var preloadedDate = self.config.defaultDate ||\n            ((self.input.nodeName === \"INPUT\" ||\n                self.input.nodeName === \"TEXTAREA\") &&\n                self.input.placeholder &&\n                self.input.value === self.input.placeholder\n                ? null\n                : self.input.value);\n        if (preloadedDate)\n            setSelectedDate(preloadedDate, self.config.dateFormat);\n        self._initialDate =\n            self.selectedDates.length > 0\n                ? self.selectedDates[0]\n                : self.config.minDate &&\n                    self.config.minDate.getTime() > self.now.getTime()\n                    ? self.config.minDate\n                    : self.config.maxDate &&\n                        self.config.maxDate.getTime() < self.now.getTime()\n                        ? self.config.maxDate\n                        : self.now;\n        self.currentYear = self._initialDate.getFullYear();\n        self.currentMonth = self._initialDate.getMonth();\n        if (self.selectedDates.length > 0)\n            self.latestSelectedDateObj = self.selectedDates[0];\n        if (self.config.minTime !== undefined)\n            self.config.minTime = self.parseDate(self.config.minTime, \"H:i\");\n        if (self.config.maxTime !== undefined)\n            self.config.maxTime = self.parseDate(self.config.maxTime, \"H:i\");\n        self.minDateHasTime =\n            !!self.config.minDate &&\n                (self.config.minDate.getHours() > 0 ||\n                    self.config.minDate.getMinutes() > 0 ||\n                    self.config.minDate.getSeconds() > 0);\n        self.maxDateHasTime =\n            !!self.config.maxDate &&\n                (self.config.maxDate.getHours() > 0 ||\n                    self.config.maxDate.getMinutes() > 0 ||\n                    self.config.maxDate.getSeconds() > 0);\n    }\n    function setupInputs() {\n        self.input = getInputElem();\n        if (!self.input) {\n            self.config.errorHandler(new Error(\"Invalid input element specified\"));\n            return;\n        }\n        self.input._type = self.input.type;\n        self.input.type = \"text\";\n        self.input.classList.add(\"flatpickr-input\");\n        self._input = self.input;\n        if (self.config.altInput) {\n            self.altInput = createElement(self.input.nodeName, self.config.altInputClass);\n            self._input = self.altInput;\n            self.altInput.placeholder = self.input.placeholder;\n            self.altInput.disabled = self.input.disabled;\n            self.altInput.required = self.input.required;\n            self.altInput.tabIndex = self.input.tabIndex;\n            self.altInput.type = \"text\";\n            self.input.setAttribute(\"type\", \"hidden\");\n            if (!self.config.static && self.input.parentNode)\n                self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);\n        }\n        if (!self.config.allowInput)\n            self._input.setAttribute(\"readonly\", \"readonly\");\n        updatePositionElement();\n    }\n    function updatePositionElement() {\n        self._positionElement = self.config.positionElement || self._input;\n    }\n    function setupMobile() {\n        var inputType = self.config.enableTime\n            ? self.config.noCalendar\n                ? \"time\"\n                : \"datetime-local\"\n            : \"date\";\n        self.mobileInput = createElement(\"input\", self.input.className + \" flatpickr-mobile\");\n        self.mobileInput.tabIndex = 1;\n        self.mobileInput.type = inputType;\n        self.mobileInput.disabled = self.input.disabled;\n        self.mobileInput.required = self.input.required;\n        self.mobileInput.placeholder = self.input.placeholder;\n        self.mobileFormatStr =\n            inputType === \"datetime-local\"\n                ? \"Y-m-d\\\\TH:i:S\"\n                : inputType === \"date\"\n                    ? \"Y-m-d\"\n                    : \"H:i:S\";\n        if (self.selectedDates.length > 0) {\n            self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr);\n        }\n        if (self.config.minDate)\n            self.mobileInput.min = self.formatDate(self.config.minDate, \"Y-m-d\");\n        if (self.config.maxDate)\n            self.mobileInput.max = self.formatDate(self.config.maxDate, \"Y-m-d\");\n        if (self.input.getAttribute(\"step\"))\n            self.mobileInput.step = String(self.input.getAttribute(\"step\"));\n        self.input.type = \"hidden\";\n        if (self.altInput !== undefined)\n            self.altInput.type = \"hidden\";\n        try {\n            if (self.input.parentNode)\n                self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);\n        }\n        catch (_a) { }\n        bind(self.mobileInput, \"change\", function (e) {\n            self.setDate(getEventTarget(e).value, false, self.mobileFormatStr);\n            triggerEvent(\"onChange\");\n            triggerEvent(\"onClose\");\n        });\n    }\n    function toggle(e) {\n        if (self.isOpen === true)\n            return self.close();\n        self.open(e);\n    }\n    function triggerEvent(event, data) {\n        if (self.config === undefined)\n            return;\n        var hooks = self.config[event];\n        if (hooks !== undefined && hooks.length > 0) {\n            for (var i = 0; hooks[i] && i < hooks.length; i++)\n                hooks[i](self.selectedDates, self.input.value, self, data);\n        }\n        if (event === \"onChange\") {\n            self.input.dispatchEvent(createEvent(\"change\"));\n            self.input.dispatchEvent(createEvent(\"input\"));\n        }\n    }\n    function createEvent(name) {\n        var e = document.createEvent(\"Event\");\n        e.initEvent(name, true, true);\n        return e;\n    }\n    function isDateSelected(date) {\n        for (var i = 0; i < self.selectedDates.length; i++) {\n            var selectedDate = self.selectedDates[i];\n            if (selectedDate instanceof Date && compareDates(selectedDate, date) === 0)\n                return \"\" + i;\n        }\n        return false;\n    }\n    function isDateInRange(date) {\n        if (self.config.mode !== \"range\" || self.selectedDates.length < 2)\n            return false;\n        return (compareDates(date, self.selectedDates[0]) >= 0 &&\n            compareDates(date, self.selectedDates[1]) <= 0);\n    }\n    function updateNavigationCurrentMonth() {\n        if (self.config.noCalendar || self.isMobile || !self.monthNav)\n            return;\n        self.yearElements.forEach(function (yearElement, i) {\n            var d = new Date(self.currentYear, self.currentMonth, 1);\n            d.setMonth(self.currentMonth + i);\n            if (self.config.showMonths > 1 ||\n                self.config.monthSelectorType === \"static\") {\n                self.monthElements[i].textContent =\n                    monthToStr(d.getMonth(), self.config.shorthandCurrentMonth, self.l10n) + \" \";\n            }\n            else {\n                self.monthsDropdownContainer.value = d.getMonth().toString();\n            }\n            yearElement.value = d.getFullYear().toString();\n        });\n        self._hidePrevMonthArrow =\n            self.config.minDate !== undefined &&\n                (self.currentYear === self.config.minDate.getFullYear()\n                    ? self.currentMonth <= self.config.minDate.getMonth()\n                    : self.currentYear < self.config.minDate.getFullYear());\n        self._hideNextMonthArrow =\n            self.config.maxDate !== undefined &&\n                (self.currentYear === self.config.maxDate.getFullYear()\n                    ? self.currentMonth + 1 > self.config.maxDate.getMonth()\n                    : self.currentYear > self.config.maxDate.getFullYear());\n    }\n    function getDateStr(format) {\n        return self.selectedDates\n            .map(function (dObj) { return self.formatDate(dObj, format); })\n            .filter(function (d, i, arr) {\n            return self.config.mode !== \"range\" ||\n                self.config.enableTime ||\n                arr.indexOf(d) === i;\n        })\n            .join(self.config.mode !== \"range\"\n            ? self.config.conjunction\n            : self.l10n.rangeSeparator);\n    }\n    function updateValue(triggerChange) {\n        if (triggerChange === void 0) { triggerChange = true; }\n        if (self.mobileInput !== undefined && self.mobileFormatStr) {\n            self.mobileInput.value =\n                self.latestSelectedDateObj !== undefined\n                    ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr)\n                    : \"\";\n        }\n        self.input.value = getDateStr(self.config.dateFormat);\n        if (self.altInput !== undefined) {\n            self.altInput.value = getDateStr(self.config.altFormat);\n        }\n        if (triggerChange !== false)\n            triggerEvent(\"onValueUpdate\");\n    }\n    function onMonthNavClick(e) {\n        var eventTarget = getEventTarget(e);\n        var isPrevMonth = self.prevMonthNav.contains(eventTarget);\n        var isNextMonth = self.nextMonthNav.contains(eventTarget);\n        if (isPrevMonth || isNextMonth) {\n            changeMonth(isPrevMonth ? -1 : 1);\n        }\n        else if (self.yearElements.indexOf(eventTarget) >= 0) {\n            eventTarget.select();\n        }\n        else if (eventTarget.classList.contains(\"arrowUp\")) {\n            self.changeYear(self.currentYear + 1);\n        }\n        else if (eventTarget.classList.contains(\"arrowDown\")) {\n            self.changeYear(self.currentYear - 1);\n        }\n    }\n    function timeWrapper(e) {\n        e.preventDefault();\n        var isKeyDown = e.type === \"keydown\", eventTarget = getEventTarget(e), input = eventTarget;\n        if (self.amPM !== undefined && eventTarget === self.amPM) {\n            self.amPM.textContent =\n                self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n        }\n        var min = parseFloat(input.getAttribute(\"min\")), max = parseFloat(input.getAttribute(\"max\")), step = parseFloat(input.getAttribute(\"step\")), curValue = parseInt(input.value, 10), delta = e.delta ||\n            (isKeyDown ? (e.which === 38 ? 1 : -1) : 0);\n        var newValue = curValue + step * delta;\n        if (typeof input.value !== \"undefined\" && input.value.length === 2) {\n            var isHourElem = input === self.hourElement, isMinuteElem = input === self.minuteElement;\n            if (newValue < min) {\n                newValue =\n                    max +\n                        newValue +\n                        int(!isHourElem) +\n                        (int(isHourElem) && int(!self.amPM));\n                if (isMinuteElem)\n                    incrementNumInput(undefined, -1, self.hourElement);\n            }\n            else if (newValue > max) {\n                newValue =\n                    input === self.hourElement ? newValue - max - int(!self.amPM) : min;\n                if (isMinuteElem)\n                    incrementNumInput(undefined, 1, self.hourElement);\n            }\n            if (self.amPM &&\n                isHourElem &&\n                (step === 1\n                    ? newValue + curValue === 23\n                    : Math.abs(newValue - curValue) > step)) {\n                self.amPM.textContent =\n                    self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n            }\n            input.value = pad(newValue);\n        }\n    }\n    init();\n    return self;\n}\nfunction _flatpickr(nodeList, config) {\n    var nodes = Array.prototype.slice\n        .call(nodeList)\n        .filter(function (x) { return x instanceof HTMLElement; });\n    var instances = [];\n    for (var i = 0; i < nodes.length; i++) {\n        var node = nodes[i];\n        try {\n            if (node.getAttribute(\"data-fp-omit\") !== null)\n                continue;\n            if (node._flatpickr !== undefined) {\n                node._flatpickr.destroy();\n                node._flatpickr = undefined;\n            }\n            node._flatpickr = FlatpickrInstance(node, config || {});\n            instances.push(node._flatpickr);\n        }\n        catch (e) {\n            console.error(e);\n        }\n    }\n    return instances.length === 1 ? instances[0] : instances;\n}\nif (typeof HTMLElement !== \"undefined\" &&\n    typeof HTMLCollection !== \"undefined\" &&\n    typeof NodeList !== \"undefined\") {\n    HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {\n        return _flatpickr(this, config);\n    };\n    HTMLElement.prototype.flatpickr = function (config) {\n        return _flatpickr([this], config);\n    };\n}\nvar flatpickr = function (selector, config) {\n    if (typeof selector === \"string\") {\n        return _flatpickr(window.document.querySelectorAll(selector), config);\n    }\n    else if (selector instanceof Node) {\n        return _flatpickr([selector], config);\n    }\n    else {\n        return _flatpickr(selector, config);\n    }\n};\nflatpickr.defaultConfig = {};\nflatpickr.l10ns = {\n    en: __assign({}, English),\n    default: __assign({}, English),\n};\nflatpickr.localize = function (l10n) {\n    flatpickr.l10ns.default = __assign(__assign({}, flatpickr.l10ns.default), l10n);\n};\nflatpickr.setDefaults = function (config) {\n    flatpickr.defaultConfig = __assign(__assign({}, flatpickr.defaultConfig), config);\n};\nflatpickr.parseDate = createDateParser({});\nflatpickr.formatDate = createDateFormatter({});\nflatpickr.compareDates = compareDates;\nif (typeof jQuery !== \"undefined\" && typeof jQuery.fn !== \"undefined\") {\n    jQuery.fn.flatpickr = function (config) {\n        return _flatpickr(this, config);\n    };\n}\nDate.prototype.fp_incr = function (days) {\n    return new Date(this.getFullYear(), this.getMonth(), this.getDate() + (typeof days === \"string\" ? parseInt(days, 10) : days));\n};\nif (typeof window !== \"undefined\") {\n    window.flatpickr = flatpickr;\n}\nexport default flatpickr;\n", "/*\nStimulus 3.0.0\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    \"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.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, { attributes: true, childList: true, subtree: 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            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    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    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        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            this.delegate.targetConnected(element, name);\n        }\n    }\n    disconnectTarget(element, name) {\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            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", "export const kebabCase = string =>\n  string\n    .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n    .replace(/[\\s_]+/g, \"-\")\n    .toLowerCase();\n\nexport const capitalize = string => {\n  return string.charAt(0).toUpperCase() + string.slice(1);\n};\n", "const booleanOptions = [\n  'allowInput',\n  'altInput',\n  'animate',\n  'clickOpens',\n  'closeOnSelect',\n  'disableMobile',\n  'enableSeconds',\n  'enableTime',\n  'inline',\n  'noCalendar',\n  'shorthandCurrentMonth',\n  'static',\n  'time_24hr',\n  'weekNumbers',\n  'wrap'\n]\n\nconst stringOptions = [\n  'altInputClass',\n  'conjunction',\n  'mode',\n  'nextArrow',\n  'position',\n  'prevArrow',\n  'monthSelectorType'\n]\n\nconst numberOptions = [\n  'defaultHour',\n  'defaultMinute',\n  'defaultSeconds',\n  'hourIncrement',\n  'minuteIncrement',\n  'showMonths'\n]\n\nconst arrayOptions = ['disable', 'enable', 'disableDaysOfWeek', 'enableDaysOfWeek']\n\nconst arrayOrStringOptions = ['defaultDate']\n\nconst dateOptions = ['maxDate', 'minDate', 'maxTime', 'minTime', 'now']\n\nexport const dateFormats = ['altFormat', 'ariaDateFormat', 'dateFormat']\n\nexport const options = {\n  string: stringOptions,\n  boolean: booleanOptions,\n  date: dateOptions,\n  array: arrayOptions,\n  number: numberOptions,\n  arrayOrString: arrayOrStringOptions\n}\n", "export const events = ['change', 'open', 'close', 'monthChange', 'yearChange', 'ready', 'valueUpdate', 'dayCreate']\n", "export const elements = [\n  'calendarContainer',\n  'currentYearElement',\n  'days',\n  'daysContainer',\n  'input',\n  'nextMonthNav',\n  'monthNav',\n  'prevMonthNav',\n  'rContainer',\n  'selectedDateElem',\n  'todayDateElem',\n  'weekdayContainer'\n]\n", "export const mapping = {\n  '%Y': 'Y',\n  '%y': 'y',\n  '%C': 'Y',\n  '%m': 'm',\n  '%-m': 'n',\n  '%_m': 'n',\n  '%B': 'F',\n  '%^B': 'F',\n  '%b': 'M',\n  '%^b': 'M',\n  '%h': 'M',\n  '%^h': 'M',\n  '%d': 'd',\n  '%-d': 'j',\n  '%e': 'j',\n  '%H': 'H',\n  '%k': 'H',\n  '%I': 'h',\n  '%l': 'h',\n  '%-l': 'h',\n  '%P': 'K',\n  '%p': 'K',\n  '%M': 'i',\n  '%S': 'S',\n  '%A': 'l',\n  '%a': 'D',\n  '%w': 'w'\n}\n\nconst strftimeRegex = new RegExp(\n  Object.keys(mapping)\n    .join('|')\n    .replace(new RegExp('\\\\^', 'g'), '\\\\^'),\n  'g'\n)\n\nexport const convertDateFormat = (format) => {\n  return format.replace(strftimeRegex, (match) => {\n    return mapping[match]\n  })\n}\n", "import { Controller } from '@hotwired/stimulus'\nimport flatpickr from 'flatpickr'\nimport { kebabCase, capitalize } from './utils'\nimport { options, dateFormats } from './config_options'\nimport { events } from './events'\nimport { elements } from './elements'\nimport { convertDateFormat } from './strftime_mapping'\n\nclass StimulusFlatpickr extends Controller {\n  static targets = ['instance']\n\n  initialize() {\n    this.config = {}\n  }\n\n  connect() {\n    this._initializeEvents()\n    this._initializeOptions()\n    this._initializeDateFormats()\n\n    this.fp = flatpickr(this.flatpickrElement, {\n      ...this.config\n    })\n\n    this._initializeElements()\n  }\n\n  disconnect() {\n    const value = this.inputTarget.value\n    this.fp.destroy()\n    this.inputTarget.value = value\n  }\n\n  _initializeEvents() {\n    events.forEach((event) => {\n      if (this[event]) {\n        const hook = `on${capitalize(event)}`\n        this.config[hook] = this[event].bind(this)\n      }\n    })\n  }\n\n  _initializeOptions() {\n    Object.keys(options).forEach((optionType) => {\n      const optionsCamelCase = options[optionType]\n      optionsCamelCase.forEach((option) => {\n        const optionKebab = kebabCase(option)\n        if (this.data.has(optionKebab)) {\n          this.config[option] = this[`_${optionType}`](optionKebab)\n        }\n      })\n    })\n    this._handleDaysOfWeek()\n  }\n\n  _handleDaysOfWeek() {\n    if (this.config.disableDaysOfWeek) {\n      this.config.disableDaysOfWeek = this._validateDaysOfWeek(this.config.disableDaysOfWeek)\n      this.config.disable = [...(this.config.disable || []), this._disable.bind(this)]\n    }\n\n    if (this.config.enableDaysOfWeek) {\n      this.config.enableDaysOfWeek = this._validateDaysOfWeek(this.config.enableDaysOfWeek)\n      this.config.enable = [...(this.config.enable || []), this._enable.bind(this)]\n    }\n  }\n\n  _validateDaysOfWeek(days) {\n    if (Array.isArray(days)) {\n      return days.map((day) => parseInt(day))\n    } else {\n      console.error('days of week must be a valid array')\n      return []\n    }\n  }\n\n  _disable(date) {\n    const disabledDays = this.config.disableDaysOfWeek\n    return disabledDays.includes(date.getDay())\n  }\n\n  _enable(date) {\n    const enabledDays = this.config.enableDaysOfWeek\n    return enabledDays.includes(date.getDay())\n  }\n\n  _initializeDateFormats() {\n    dateFormats.forEach((dateFormat) => {\n      if (this.data.has(dateFormat)) {\n        this.config[dateFormat] = convertDateFormat(this.data.get(dateFormat))\n      }\n    })\n  }\n\n  _initializeElements() {\n    elements.forEach((element) => {\n      this[`${element}Target`] = this.fp[element]\n    })\n  }\n\n  _string(option) {\n    return this.data.get(option)\n  }\n\n  _date(option) {\n    return this.data.get(option)\n  }\n\n  _boolean(option) {\n    return !(this.data.get(option) == '0' || this.data.get(option) == 'false')\n  }\n\n  _array(option) {\n    return JSON.parse(this.data.get(option))\n  }\n\n  _number(option) {\n    return parseInt(this.data.get(option))\n  }\n\n  _arrayOrString(option) {\n    const val = this.data.get(option)\n    try {\n      return JSON.parse(val)\n    } catch (e) {\n      return val\n    }\n  }\n\n  get flatpickrElement() {\n    return (this.hasInstanceTarget && this.instanceTarget) || this.element\n  }\n}\n\nexport default StimulusFlatpickr\n", "import Flatpickr from \"stimulus-flatpickr\";\n\nexport default class extends Flatpickr {\n}\n", "/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n", "/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n", "import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n", "import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\nexport default now;\n", "/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n  var index = string.length;\n\n  while (index-- && reWhitespace.test(string.charAt(index))) {}\n  return index;\n}\n\nexport default trimmedEndIndex;\n", "import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n  return string\n    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n    : string;\n}\n\nexport default baseTrim;\n", "import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n", "import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nexport default getRawTag;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n", "import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nexport default baseGetTag;\n", "/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n", "import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n", "import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = baseTrim(value);\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n", "import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        timeWaiting = wait - timeSinceLastCall;\n\n    return maxing\n      ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n      : timeWaiting;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        clearTimeout(timerId);\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\nexport default debounce;\n", "import debounce from './debounce.js';\nimport isObject from './isObject.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n *  Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, {\n    'leading': leading,\n    'maxWait': wait,\n    'trailing': trailing\n  });\n}\n\nexport default throttle;\n", "import { Controller } from \"@hotwired/stimulus\";\nimport throttle from \"lodash-es/throttle\";\n\nexport default class extends Controller {\n  static targets = [ 'form', 'order', 'page', 'titleOrder', 'usernameOrder', 'emailOrder', 'createdAtOrder', 'updatedAtOrder', 'lastSignInAtOrder', 'signInCountOrder', 'durationOrder', 'fileSizeOrder'];\n  static values = { order: Object };\n  static classes = [ 'active' ];\n\n  initialize() {\n    this.submit = throttle(this.submit, 1000);\n  }\n\n  // After a full page load the sort state is rehydrated from data-form-order-value\n  // (server-side, from the `order` param); mark the matching arrows active so the\n  // highlight survives navigations/edits, not just in-page clicks.\n  connect() {\n    this.renderSortIcons();\n    if (!this.hasActiveClass) return;\n\n    this.element.querySelectorAll('[data-order-column]').forEach(arrow => {\n      if (this.orderValue[arrow.dataset.orderColumn] === arrow.dataset.orderDirection) {\n        arrow.classList.add(this.activeClass);\n      }\n    });\n  }\n\n  // Header sort toggle (data-sort-toggle): each click cycles the column through\n  // first direction \u2192 opposite \u2192 off. A plain click sorts by that column alone,\n  // Shift+click adds it to the current sort as the next tie-breaker.\n  toggleOrder(event) {\n    const column = event.currentTarget.dataset.orderColumn;\n    const first = event.currentTarget.dataset.orderFirst || 'asc';\n    const current = this.orderValue[column];\n    const next = !current ? first : (current === first ? (first === 'asc' ? 'desc' : 'asc') : null);\n\n    const order = event.shiftKey ? { ...this.orderValue } : {};\n    if (next) {\n      order[column] = next;\n    } else {\n      delete order[column];\n    }\n\n    this.orderValue = order;\n    this.orderTarget.value = Object.entries(order).map(pair => pair.join(' ')).join(', ');\n    this.renderSortIcons();\n    this.submit();\n  }\n\n  // \u25B2 / \u25BC on sorted columns (with their position when sorting by several), \u21C5 on the rest\n  renderSortIcons() {\n    const columns = Object.keys(this.orderValue);\n\n    this.element.querySelectorAll('[data-sort-toggle]').forEach(toggle => {\n      const column = toggle.dataset.orderColumn;\n      const direction = this.orderValue[column];\n      const icon = toggle.querySelector('[data-sort-icon]');\n      const position = columns.length > 1 && direction ? columns.indexOf(column) + 1 : '';\n\n      if (icon) icon.textContent = direction ? `${direction === 'asc' ? '\u25B2' : '\u25BC'}${position}` : '\u21C5';\n      if (this.hasActiveClass) toggle.classList.toggle(this.activeClass, Boolean(direction));\n    });\n  }\n\n  setOrder(event) {\n    if (this.hasOrderTarget) {\n      const dataset = event.currentTarget.dataset;\n      const target = dataset.formTarget;\n      let column = dataset.orderColumn;\n      const direction = dataset.orderDirection;\n\n      this[`${target}Targets`].forEach(t => t.classList.remove(this.activeClass));\n\n      if (this.orderValue[column] === direction) {\n        const {[column]: _, ...newValue} = this.orderValue;\n        this.orderValue = newValue;\n      } else {\n        this.orderValue = {...this.orderValue, [column]: direction};\n        event.currentTarget.classList.add(this.activeClass);\n      }\n\n      this.orderTarget.value = Object.entries(this.orderValue).map(pair => pair.join(' ')).join(', ');\n      this.submit();\n    }\n  }\n\n  setPage(event) {\n    if (this.hasPageTarget) {\n      this.pageTarget.value = event.currentTarget.dataset.page;\n      this.formTarget.requestSubmit();\n    }\n  }\n\n  submit() {\n    if (this.hasPageTarget) {\n      this.pageTarget.value = '';\n    }\n    this.formTarget.requestSubmit();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n\n  search() {\n    clearTimeout(this.timeout)\n    this.timeout = setTimeout(() => {\n      this.element.requestSubmit();\n    }, 200);\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['quantity', 'priceOutput', 'quantityOutput'];\n  static values = { base: Number };\n\n  quantityTargetConnected() {\n    this.calculatePrice();\n  }\n\n  calculatePrice() {\n    const price = Math.round(Number(this.quantityTarget.value) * this.baseValue * 100) / 100;\n    this.priceOutputTargets.forEach(t => t.innerText = price)\n    this.quantityOutputTargets.forEach(t => t.innerText = this.quantityTarget.value)\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['input', 'progress', 'thumb'];\n\n  connect() {\n    this.move();\n  }\n\n  move() {\n    this.progressTarget.style.setProperty('--tw-translate-x', `-${100 - (this.inputTarget.value / this.inputTarget.max) * 100}%`)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { load } from \"recaptcha-v3\";\n\nexport default class extends Controller {\n  static targets = ['token'];\n  static values = { action: String, key: String }\n\n  check(event) {\n    event.preventDefault();\n\n    const form = this.element;\n\n    if (!form.checkValidity()) {\n      form.reportValidity();\n      return;\n    }\n\n    const button = event.currentTarget;\n    button.disabled = true;\n\n    load(this.keyValue, { autoHideBadge: true }).then(recaptcha => {\n      recaptcha.execute(this.actionValue).then(token => {\n        this.tokenTarget.value = token;\n        this.element.requestSubmit();\n      })\n          .catch(error => {\n            console.log(error);\n            button.disabled = false;\n          });\n    })\n        .catch(error => {\n          console.log(error);\n          button.disabled = false;\n        });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n\n  render({ params: { order, email, country, date } }) {\n    window.gapi.load(\"surveyoptin\", function () {\n      window.gapi.surveyoptin.render(\n        {\n          merchant_id: 621680571,\n          order_id: order,\n          email: email,\n          delivery_country: country,\n          estimated_delivery_date: date\n        });\n    });\n  }\n\n  renderBadge() {\n    let ratingBadgeContainer = document.createElement(\"div\");\n    document.body.appendChild(ratingBadgeContainer);\n    window.gapi.load(\"ratingbadge\", function () {\n      window.gapi.ratingbadge.render(\n        ratingBadgeContainer, {\n          merchant_id: 621680571\n        });\n    });\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\nimport { loadStripe } from '@stripe/stripe-js/pure';\n\n\nexport default class extends Controller {\n  static targets = [ 'cardElement', 'cardErrors', 'form', 'paymentMethod' ];\n  static values = { key: String };\n\n  async connect() {\n    this.stripe = await loadStripe(this.keyValue);\n    const elements = this.stripe.elements();\n    const style = {\n      base: {\n        color: '#32325d',\n        fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\n        fontSmoothing: 'antialiased',\n        fontSize: '16px',\n        '::placeholder': {\n          color: '#aab7c4'\n        }\n      },\n      invalid: {\n        color: '#fa755a',\n        iconColor: '#fa755a'\n      }\n    };\n\n    this.card = elements.create('card', {\n      style: style\n    });\n\n    this.card.mount(this.cardElementTarget);\n  }\n\n  addCard(event) {\n    event.preventDefault();\n    event.currentTarget.disabled = true;\n    const form = this.formTarget;\n    const input = this.paymentMethodTarget;\n    this.stripe\n      .createPaymentMethod({\n        type: 'card',\n        card: this.card\n      })\n      .then(function(result) {\n        if (result.error) {\n          console.log(result.error);\n        } else {\n          input.value = result.paymentMethod.id;\n          console.log(input.value);\n          form.requestSubmit();\n        }\n      });\n  }\n}\n", "import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['tab', 'title'];\n\n  connect() {\n    let activeTab;\n    const activeTabAnchor = window.location.hash.replace('#', '')\n\n    if (activeTabAnchor) {\n      const activeTabEl = document.getElementById(activeTabAnchor)\n      if (activeTabEl) {\n        const activeTabId = activeTabEl.dataset.tabsIdParam\n        activeTab = this.tabTargets.find(tab => tab.id === activeTabId)\n      }\n    }\n\n    activeTab ||= this.hasTabTarget && this.tabTarget\n\n    if (activeTab) {\n      activeTab.classList.remove('hidden')\n      this.titleTarget.innerText = activeTab.getAttribute(\"data-title\")\n      this.loadTurboFrames(activeTab)\n    }\n  }\n\n  toggle({ params: { id }}) {\n    this.tabTargets.forEach(t => {\n      if (t.id === id) {\n        t.classList.remove('hidden')\n        this.titleTarget.innerText = t.getAttribute(\"data-title\")\n        this.loadTurboFrames(t)\n      } else {\n        t.classList.add('hidden')\n      }\n    })\n  }\n\n  loadTurboFrames(activeTab) {\n    const frames = activeTab.matches(\"turbo-frame\") ? [activeTab] : [] // tab is a turbo-frame itself\n    frames.concat(activeTab.querySelectorAll(\"turbo-frame\"))\n    frames.forEach(frame => {\n      if (frame.getAttribute(\"loading\") === \"lazy\" && !frame.hasAttribute(\"data-loaded\")) {\n        // Trigger Turbo to load content\n        frame.removeAttribute(\"loading\")\n        frame.src = frame.getAttribute(\"src\")\n        frame.setAttribute(\"data-loaded\", \"true\")\n      }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = []\n\n  touch(event) {\n    event.target.setAttribute(\"touched\", \"\")\n    this.element.setAttribute(\"touched\", \"\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"input\", \"clear\"]\n  static values = {\n    minLength: { type: Number, default: 4 },\n    debounce: { type: Number, default: 1000 }\n  }\n\n  connect() {\n    this.timeout = null\n    this.updateClearButton()\n  }\n\n  disconnect() {\n    if (this.timeout) {\n      clearTimeout(this.timeout)\n    }\n  }\n\n  search() {\n    const query = this.inputTarget.value.trim()\n\n    // Update clear button visibility\n    this.updateClearButton()\n\n    // Clear existing timeout\n    if (this.timeout) {\n      clearTimeout(this.timeout)\n    }\n\n    // If query is empty or less than min length, submit immediately to show all results\n    if (query.length === 0) {\n      this.element.requestSubmit()\n      return\n    }\n\n    // If query is less than min length, don't search\n    if (query.length < this.minLengthValue) {\n      return\n    }\n\n    // Debounce the search\n    this.timeout = setTimeout(() => {\n      this.element.requestSubmit()\n    }, this.debounceValue)\n  }\n\n  clear() {\n    this.inputTarget.value = \"\"\n    this.updateClearButton()\n    this.element.requestSubmit()\n  }\n\n  updateClearButton() {\n    if (this.hasClearTarget) {\n      if (this.inputTarget.value.length > 0) {\n        this.clearTarget.classList.remove(\"hidden\")\n      } else {\n        this.clearTarget.classList.add(\"hidden\")\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"overlay\", \"submitButton\", \"postBody\", \"mediaPreview\"]\n\n  connect() {\n    this.hideModal()\n    this.validateForm()\n\n    document.addEventListener(\"turbo:submit-start\", this.onSubmitStart.bind(this))\n    document.addEventListener(\"turbo:submit-end\", this.onSubmitEnd.bind(this))\n\n    // Add event listeners for text and media changes\n    this.postBodyTarget.addEventListener(\"input\", this.validateForm.bind(this))\n    document.querySelectorAll('input[type=\"file\"]').forEach(input => {\n      input.addEventListener(\"change\", this.validateForm.bind(this))\n    })\n  }\n\n  showModal() {\n    this.overlayTarget.classList.remove(\"hidden\")\n    document.body.classList.add(\"overflow-hidden\")\n\n    const adBlock = document.querySelector('.sticky#block-for-cards')\n    if (adBlock) {\n      adBlock.classList.remove('sticky')\n      adBlock.style.top = '134px'\n      adBlock.style.maxHeight = '80vh'\n    }\n\n    const lightHeader = document.querySelector('header.fixed.w-full.z-20#light-header')\n    if (lightHeader) {\n      lightHeader.classList.remove('z-20')\n      lightHeader.style.backgroundColor = 'rgba(247, 247, 247, 1)'\n      lightHeader.style.height = '86px'\n    }\n  }\n\n  hideModal() {\n    this.overlayTarget.classList.add(\"hidden\")\n    document.body.classList.remove(\"overflow-hidden\")\n\n    const adBlock = document.querySelector('#block-for-cards')\n    if (adBlock) {\n      adBlock.classList.add('sticky')\n    }\n\n    const lightHeader = document.querySelector('header.fixed.w-full#light-header')\n    if (lightHeader) {\n      lightHeader.classList.add('z-20')\n    }\n  }\n\n  validateForm() {\n    const hasText = this.postBodyTarget.value.trim().length > 0\n    const hasMedia = this.mediaPreviewTargets.some(preview => !preview.classList.contains('hidden'))\n\n    this.submitButtonTarget.disabled = !(hasText || hasMedia)\n  }\n\n  onSubmitStart(event) {\n    if (event.target.id === \"new-post-form\") {\n      const loader = document.getElementById('loader')\n      if (loader) {\n        loader.classList.remove('hidden')\n      }\n\n      this.showModal()\n    }\n  }\n\n  onSubmitEnd(event) {\n    if (event.target.id === \"new-post-form\") {\n      const loader = document.getElementById('loader')\n      if (loader) {\n        loader.classList.add('hidden')\n      }\n\n      this.hideModal()\n      this.resetMediaPreviews()\n      this.validateForm()\n    }\n  }\n\n  resetMediaPreviews() {\n    const previewContainers = ['image-preview-container', 'video-preview-container', 'track-preview-container']\n    const previews = ['image-preview', 'video-preview', 'track-preview']\n    const inputs = ['image-input', 'video-input', 'track-input']\n\n    previewContainers.forEach(container => {\n      const element = document.getElementById(container)\n      if (element) element.classList.add('hidden')\n    })\n\n    previews.forEach(preview => {\n      const element = document.getElementById(preview)\n      if (element) element.src = preview === 'track-preview' ? '' : '#'\n    })\n\n    inputs.forEach(input => {\n      const element = document.getElementById(input)\n      if (element) element.value = ''\n    })\n\n    this.validateForm()\n  }\n}", "import { Controller } from \"@hotwired/stimulus\";\n\n// Two-step dashboard onboarding. Both steps live in one form, so this only\n// swaps which one is visible and keeps each step's counter and Continue button\n// in sync with how many chips are ticked. Targets are index-aligned: every step\n// holds exactly one counter and one Continue button.\nexport default class extends Controller {\n  static targets = [\"step\", \"counter\", \"counterBox\", \"continue\"];\n\n  connect() {\n    this.index = 0;\n    document.body.classList.add(\"overflow-hidden\");\n    this.refresh();\n  }\n\n  disconnect() {\n    document.body.classList.remove(\"overflow-hidden\");\n  }\n\n  next() {\n    this.show(this.index + 1);\n  }\n\n  back() {\n    this.show(this.index - 1);\n  }\n\n  refresh() {\n    this.stepTargets.forEach((step, i) => {\n      const count = step.querySelectorAll(\"input[type=checkbox]:checked\").length;\n      const button = this.continueTargets[i];\n\n      this.counterTargets[i].textContent = count;\n      button.disabled = count === 0;\n      button.classList.toggle(\"opacity-50\", count === 0);\n      button.classList.toggle(\"pointer-events-none\", count === 0);\n\n      // Phone-only emphasis; the sm: variant keeps desktop at 80% either way.\n      const box = this.counterBoxTargets[i];\n      box.classList.toggle(\"text-amped-gray/50\", count === 0);\n      box.classList.toggle(\"text-amped-gray/80\", count > 0);\n    });\n  }\n\n  show(index) {\n    if (index < 0 || index >= this.stepTargets.length) return;\n\n    this.index = index;\n    this.stepTargets.forEach((step, i) => step.classList.toggle(\"hidden\", i !== index));\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport default class extends Controller {\n  static targets = [\"pagination\"];\n\n  connect() {\n    this.observePagination();\n  }\n\n  observePagination() {\n    if (this.paginationObserver) {\n      this.paginationObserver.disconnect();\n    }\n\n    if (\"IntersectionObserver\" in window && this.hasPaginationTarget) {\n      this.paginationObserver = new IntersectionObserver(\n        (entries) => {\n          entries.forEach((entry) => {\n            if (entry.isIntersecting) {\n              this.loadMore();\n            }\n          });\n        },\n        {\n          root: null,\n          rootMargin: \"0px\",\n          threshold: 1.0,\n        }\n      );\n\n      this.paginationObserver.observe(this.paginationTarget);\n    }\n  }\n\n  click(event) {\n    event.preventDefault();\n\n    const url = event.currentTarget.href || event.currentTarget.dataset.url;\n    if (url && !this.isLoading) {\n      this.fetchStream(url).catch(() => {});\n    }\n  }\n\n  loadMore() {\n    const url = this.paginationTarget.dataset.url;\n    if (url && !this.isLoading) {\n      this.fetchStream(url).catch(() => {});\n    }\n  }\n\n  fetchStream(url) {\n    this.isLoading = true;\n    this.setLoading(true);\n\n    return fetch(url, {\n      headers: {\n        Accept: \"text/vnd.turbo-stream.html\",\n        \"X-Requested-With\": \"XMLHttpRequest\",\n      },\n      cache: \"no-store\",\n    }).then((response) => {\n      if (!response.ok) {\n        throw new Error(`Failed to load more content: ${response.status}`);\n      }\n\n      return response.text();\n    }).then((html) => {\n      if (!html.includes(\"<turbo-stream\")) {\n        throw new Error(\"Expected turbo-stream response\");\n      }\n\n      this.renderStreamMessage(html);\n    }).finally(() => {\n      this.isLoading = false;\n      this.setLoading(false);\n    });\n  }\n\n  renderStreamMessage(html) {\n    if (window.Turbo?.renderStreamMessage) {\n      window.Turbo.renderStreamMessage(html);\n      return;\n    }\n\n    const template = document.createElement(\"template\");\n    template.innerHTML = html.trim();\n\n    template.content.querySelectorAll(\"turbo-stream\").forEach((stream) => {\n      const target = document.getElementById(stream.getAttribute(\"target\"));\n      const content = stream.querySelector(\"template\")?.content.cloneNode(true);\n      if (!target || !content) return;\n\n      switch (stream.getAttribute(\"action\")) {\n        case \"append\":\n          target.append(content);\n          break;\n        case \"replace\":\n          target.replaceWith(content);\n          break;\n      }\n    });\n  }\n\n  setLoading(isLoading) {\n    const button = this.element.querySelector(\"[data-action*='infinite-scroll#click']\");\n    if (!button) return;\n\n    button.disabled = isLoading;\n    button.setAttribute(\"aria-busy\", isLoading.toString());\n  }\n\n  disconnect() {\n    if (this.paginationObserver) {\n      this.paginationObserver.disconnect();\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nconst escapeHtml = (value) =>\n  String(value ?? \"\").replace(/[&<>\"']/g, (c) => ({\n    \"&\": \"&amp;\",\n    \"<\": \"&lt;\",\n    \">\": \"&gt;\",\n    '\"': \"&quot;\",\n    \"'\": \"&#39;\"\n  }[c]))\n\nexport default class extends Controller {\n  static targets = [\n    \"input\", \"sidebar\", \"breadcrumbPage\", \"header\", \"contentArea\",\n    \"chapterCard\", \"chapterSections\", \"chapterGroup\", \"chapterContent\",\n    \"sectionRadio\", \"sectionContent\", \"introContent\",\n    \"results\", \"resultsCount\", \"resultsGrid\",\n    \"mobileTop\", \"mobileBottom\"\n  ]\n\n  static values = {\n    debounce: { type: Number, default: 300 },\n    baseUrl: { type: String, default: \"/manual\" },\n    activeChapter: { type: String, default: \"\" },\n    activeSection: { type: String, default: \"\" },\n    chapterOnly: { type: String, default: \"\" },\n    labelManual: { type: String, default: \"Manual\" },\n    labelSearchResult: { type: String, default: \"Search Result\" },\n    labelResultsFor: { type: String, default: \"results for\" },\n    labelResultFor: { type: String, default: \"result for\" }\n  }\n\n  connect() {\n    this.timeout = null\n    this.searchIndex = this.buildSearchIndex()\n\n    if (this.activeChapterValue !== \"\") {\n      const chIdx = this.activeChapterValue\n\n      this.chapterCardTargets.forEach(card => {\n        card.classList.toggle(\"active\", card.dataset.chapterIdx === chIdx)\n      })\n      this.chapterSectionsTargets.forEach(nav => {\n        if (nav.dataset.chapterIdx === chIdx) {\n          nav.classList.remove(\"hidden\")\n        } else {\n          nav.classList.add(\"hidden\")\n        }\n      })\n\n      if (this.chapterOnlyValue === \"true\") {\n        this.showChapterContent(chIdx)\n      } else if (this.activeSectionValue !== \"\") {\n        const secIdx = this.activeSectionValue\n        const radio = this.sectionRadioTargets.find(\n          r => r.dataset.chapterIdx === chIdx && r.dataset.sectionIdx === secIdx\n        )\n        if (radio) {\n          radio.checked = true\n          this.showSection(chIdx, secIdx)\n        }\n      }\n    }\n\n    this.arrangeMobileLayout()\n\n    this._onResize = () => {\n      if (this._resizeTimeout) clearTimeout(this._resizeTimeout)\n      this._resizeTimeout = setTimeout(() => this.arrangeMobileLayout(), 100)\n    }\n    window.addEventListener(\"resize\", this._onResize)\n\n    this._onPopState = () => this.syncFromUrl()\n    window.addEventListener(\"popstate\", this._onPopState)\n  }\n\n  disconnect() {\n    if (this.timeout) clearTimeout(this.timeout)\n    if (this._resizeTimeout) clearTimeout(this._resizeTimeout)\n    if (this._onResize) window.removeEventListener(\"resize\", this._onResize)\n    if (this._onPopState) window.removeEventListener(\"popstate\", this._onPopState)\n  }\n\n  syncFromUrl() {\n    const base = this.baseUrlValue.replace(/\\/+$/, \"\")\n    const path = window.location.pathname.replace(/\\/+$/, \"\")\n    const slug = path.startsWith(base) ? path.slice(base.length).replace(/^\\/+/, \"\") : \"\"\n\n    if (this.hasResultsTarget && !this.resultsTarget.classList.contains(\"hidden\")) {\n      this.resultsTarget.classList.add(\"hidden\")\n      if (this.hasSidebarTarget) {\n        this.sidebarTarget.classList.remove(\"hidden\")\n        this.sidebarTarget.classList.add(\"lg:block\")\n      }\n      if (this.hasMobileTopTarget) this.mobileTopTarget.classList.remove(\"hidden\")\n      if (this.hasMobileBottomTarget) this.mobileBottomTarget.classList.remove(\"hidden\")\n      if (this.hasInputTarget) this.inputTarget.value = \"\"\n    }\n\n    this._suppressUrlUpdate = true\n    try {\n      if (!slug) {\n        this.showIntro()\n      } else {\n        const chapterCard = this.chapterCardTargets.find(c => c.dataset.chapterSlug === slug)\n        if (chapterCard) {\n          const chIdx = chapterCard.dataset.chapterIdx\n          this.chapterCardTargets.forEach(card => {\n            card.classList.toggle(\"active\", card.dataset.chapterIdx === chIdx)\n          })\n          this.chapterSectionsTargets.forEach(nav => {\n            nav.classList.toggle(\"hidden\", nav.dataset.chapterIdx !== chIdx)\n          })\n          this.sectionRadioTargets.forEach(r => { r.checked = false })\n          this.showChapterContent(chIdx)\n        } else {\n          const radio = this.sectionRadioTargets.find(r => r.dataset.sectionSlug === slug)\n          if (radio) {\n            const chIdx = radio.dataset.chapterIdx\n            const secIdx = radio.dataset.sectionIdx\n            this.chapterCardTargets.forEach(card => {\n              card.classList.toggle(\"active\", card.dataset.chapterIdx === chIdx)\n            })\n            this.chapterSectionsTargets.forEach(nav => {\n              nav.classList.toggle(\"hidden\", nav.dataset.chapterIdx !== chIdx)\n            })\n            this.sectionRadioTargets.forEach(r => { r.checked = false })\n            radio.checked = true\n            this.showSection(chIdx, secIdx)\n          }\n        }\n      }\n    } finally {\n      this._suppressUrlUpdate = false\n    }\n  }\n\n  get isMobile() {\n    return window.innerWidth < 1024\n  }\n\n  arrangeMobileLayout() {\n    if (!this.hasMobileTopTarget || !this.hasMobileBottomTarget) return\n\n    if (!this.isMobile) {\n      this._restoreToSidebar()\n      return\n    }\n\n    const activeCard = this.chapterCardTargets.find(c => c.classList.contains(\"active\"))\n    const activeChIdx = activeCard?.dataset.chapterIdx\n\n    const sorted = [...this.chapterGroupTargets].sort((a, b) =>\n      parseInt(a.dataset.chapterIdx) - parseInt(b.dataset.chapterIdx)\n    )\n\n    sorted.forEach(group => {\n      if (activeChIdx && group.dataset.chapterIdx === activeChIdx) {\n        this.mobileTopTarget.appendChild(group)\n      } else {\n        this.mobileBottomTarget.appendChild(group)\n      }\n    })\n  }\n\n  _restoreToSidebar() {\n    if (!this.hasSidebarTarget) return\n    const container = this.sidebarTarget.querySelector('.flex.flex-col')\n    if (!container) return\n\n    const sorted = [...this.chapterGroupTargets].sort((a, b) =>\n      parseInt(a.dataset.chapterIdx) - parseInt(b.dataset.chapterIdx)\n    )\n    sorted.forEach(g => container.appendChild(g))\n  }\n\n  buildSearchIndex() {\n    return this.sectionRadioTargets.map(radio => ({\n      chapterIdx: radio.dataset.chapterIdx,\n      sectionIdx: radio.dataset.sectionIdx,\n      title: radio.dataset.sectionTitle,\n      preview: radio.dataset.sectionPreview || \"\",\n      element: radio\n    }))\n  }\n\n  // --- Chapter / Section navigation ---\n\n  onChapterClick(e) {\n    e.preventDefault()\n    const chIdx = e.currentTarget.dataset.chapterIdx\n    const isActive = e.currentTarget.classList.contains(\"active\")\n\n    if (isActive) {\n      e.currentTarget.classList.remove(\"active\")\n      const nav = this.chapterSectionsTargets.find(n => n.dataset.chapterIdx === chIdx)\n      if (nav) nav.classList.add(\"hidden\")\n      return\n    }\n\n    this.chapterCardTargets.forEach(card => {\n      card.classList.toggle(\"active\", card.dataset.chapterIdx === chIdx)\n    })\n\n    this.chapterSectionsTargets.forEach(nav => {\n      if (nav.dataset.chapterIdx === chIdx) {\n        nav.classList.remove(\"hidden\")\n      } else {\n        nav.classList.add(\"hidden\")\n      }\n    })\n\n    this.sectionRadioTargets.forEach(r => { r.checked = false })\n    this.showChapterContent(chIdx)\n  }\n\n  materializeTemplate(container) {\n    const tmpl = container.querySelector(':scope > template')\n    if (!tmpl) return\n    container.appendChild(tmpl.content)\n    tmpl.remove()\n  }\n\n  scrollToManualHeader() {\n    const header = document.querySelector('header.fixed')\n    const headerHeight = header ? header.offsetHeight : 0\n\n    if (this.hasContentAreaTarget) {\n      const top = this.contentAreaTarget.getBoundingClientRect().top + window.scrollY - headerHeight\n      window.scrollTo({ top, behavior: \"smooth\" })\n    } else if (this.hasHeaderTarget) {\n      const top = this.headerTarget.getBoundingClientRect().top + window.scrollY - headerHeight\n      window.scrollTo({ top, behavior: \"smooth\" })\n    } else {\n      window.scrollTo({ top: 0, behavior: \"smooth\" })\n    }\n  }\n\n  showChapterContent(chIdx) {\n    if (this.hasIntroContentTarget) {\n      this.introContentTarget.classList.add(\"hidden\")\n    }\n\n    this.sectionContentTargets.forEach(c => c.classList.add(\"hidden\"))\n\n    this.chapterContentTargets.forEach(content => {\n      const isTarget = content.dataset.chapterIdx === chIdx\n      if (isTarget) this.materializeTemplate(content)\n      content.classList.toggle(\"hidden\", !isTarget)\n      this.swapHeadingTag(content, isTarget)\n    })\n\n    const chapterCard = this.chapterCardTargets.find(c => c.dataset.chapterIdx === chIdx)\n    const chapterTitle = chapterCard?.dataset.chapterTitle || \"\"\n    const chapterSlug = chapterCard?.dataset.chapterSlug || \"\"\n\n    this.updateBreadcrumb(chapterTitle, null, chapterSlug)\n    this.updateUrl(chapterSlug, null)\n    this.arrangeMobileLayout()\n\n    if (!this._suppressUrlUpdate) {\n      this.scrollToManualHeader()\n    }\n  }\n\n  onSectionSelect(e) {\n    const chIdx = e.target.dataset.chapterIdx\n    const secIdx = e.target.dataset.sectionIdx\n    this.showSection(chIdx, secIdx)\n  }\n\n  onFirstChapter(e) {\n    e.preventDefault()\n    const firstCard = this.chapterCardTargets[0]\n    if (!firstCard) return\n\n    const chIdx = firstCard.dataset.chapterIdx\n    this.chapterCardTargets.forEach(card => {\n      card.classList.toggle(\"active\", card.dataset.chapterIdx === chIdx)\n    })\n    this.chapterSectionsTargets.forEach(nav => {\n      if (nav.dataset.chapterIdx === chIdx) {\n        nav.classList.remove(\"hidden\")\n      } else {\n        nav.classList.add(\"hidden\")\n      }\n    })\n    this.showChapterContent(chIdx)\n  }\n\n  onFirstSection(e) {\n    e.preventDefault()\n    const chIdx = e.currentTarget.dataset.chapterIdx\n    const firstRadio = this.sectionRadioTargets.find(r => r.dataset.chapterIdx === chIdx)\n    if (!firstRadio) return\n\n    firstRadio.checked = true\n    this.showSection(chIdx, firstRadio.dataset.sectionIdx)\n  }\n\n  onNextSection(e) {\n    e.preventDefault()\n    const current = this.sectionRadioTargets.find(r => r.checked)\n    const allRadios = this.sectionRadioTargets\n\n    let next\n    if (!current) {\n      next = allRadios[0]\n    } else {\n      const currentIndex = allRadios.indexOf(current)\n      next = allRadios[currentIndex + 1]\n    }\n\n    if (next) {\n      next.checked = true\n      const chIdx = next.dataset.chapterIdx\n      const secIdx = next.dataset.sectionIdx\n\n      this.chapterCardTargets.forEach(card => {\n        card.classList.toggle(\"active\", card.dataset.chapterIdx === chIdx)\n      })\n      this.chapterSectionsTargets.forEach(nav => {\n        if (nav.dataset.chapterIdx === chIdx) {\n          nav.classList.remove(\"hidden\")\n        } else {\n          nav.classList.add(\"hidden\")\n        }\n      })\n      this.showSection(chIdx, secIdx)\n    }\n  }\n\n  showSection(chIdx, secIdx) {\n    if (this.hasIntroContentTarget) {\n      this.introContentTarget.classList.add(\"hidden\")\n    }\n\n    this.chapterContentTargets.forEach(c => c.classList.add(\"hidden\"))\n\n    this.sectionContentTargets.forEach(content => {\n      const isTarget = content.dataset.chapterIdx === chIdx && content.dataset.sectionIdx === secIdx\n      if (isTarget) this.materializeTemplate(content)\n      content.classList.toggle(\"hidden\", !isTarget)\n      this.swapHeadingTag(content, isTarget)\n    })\n\n    const radio = this.sectionRadioTargets.find(\n      r => r.dataset.chapterIdx === chIdx && r.dataset.sectionIdx === secIdx\n    )\n    const chapterCard = this.chapterCardTargets.find(c => c.dataset.chapterIdx === chIdx)\n    const chapterTitle = chapterCard?.dataset.chapterTitle || \"\"\n    const chapterSlug = chapterCard?.dataset.chapterSlug || \"\"\n    const sectionTitle = radio?.dataset.sectionTitle || this.labelManualValue\n    const sectionSlug = radio?.dataset.sectionSlug\n\n    this.updateBreadcrumb(chapterTitle, sectionTitle, chapterSlug)\n    this.updateUrl(chapterSlug, sectionSlug)\n    this.arrangeMobileLayout()\n\n    if (!this._suppressUrlUpdate) {\n      this.scrollToManualHeader()\n    }\n  }\n\n  swapHeadingTag(container, toH1) {\n    const current = toH1\n      ? container.querySelector('div[data-role=\"section-heading\"]')\n      : container.querySelector('h1')\n    if (!current) return\n\n    const replacement = document.createElement(toH1 ? \"h1\" : \"div\")\n    Array.from(current.attributes).forEach(attr => replacement.setAttribute(attr.name, attr.value))\n    if (!toH1) replacement.setAttribute(\"data-role\", \"section-heading\")\n    replacement.innerHTML = current.innerHTML\n    current.replaceWith(replacement)\n  }\n\n  updateBreadcrumb(chapterTitle, sectionTitle, chapterSlug) {\n    if (!this.hasBreadcrumbPageTarget) return\n    const base = this.baseUrlValue.replace(/\\/+$/, \"\")\n    const baseHref = escapeHtml(base)\n    const manualLabel = escapeHtml(this.labelManualValue)\n    let html =\n      `<span class=\"shrink-0\"><a class=\"text-amped-green hover:opacity-80 transition\" href=\"${baseHref}\">${manualLabel}</a></span>`\n\n    if (chapterTitle) {\n      const chapterTitleSafe = escapeHtml(chapterTitle)\n      html += ` <span class=\"text-white shrink-0\">\u203A</span>`\n      if (sectionTitle) {\n        const chapterUrl = escapeHtml(`${base}/${encodeURIComponent(chapterSlug || \"\")}`)\n        const sectionTitleSafe = escapeHtml(sectionTitle)\n        html += ` <span class=\"shrink-0\"><a class=\"text-amped-green hover:opacity-80 transition\" href=\"${chapterUrl}\">${chapterTitleSafe}</a></span>`\n        html += ` <span class=\"text-white shrink-0\">\u203A</span>`\n        html += ` <span class=\"text-white truncate\">${sectionTitleSafe}</span>`\n      } else {\n        html += ` <span class=\"text-white truncate\">${chapterTitleSafe}</span>`\n      }\n    }\n\n    this.breadcrumbPageTarget.innerHTML = html\n  }\n\n  updateUrl(chapterSlug, sectionSlug) {\n    if (this._suppressUrlUpdate) return\n\n    const base = this.baseUrlValue.replace(/\\/+$/, \"\")\n    let url = base\n    if (sectionSlug) {\n      url = `${base}/${sectionSlug}`\n    } else if (chapterSlug) {\n      url = `${base}/${chapterSlug}`\n    }\n\n    if (window.location.pathname.replace(/\\/+$/, \"\") === url.replace(/\\/+$/, \"\")) return\n\n    window.history.pushState({}, \"\", url)\n  }\n\n  // --- Search ---\n\n  onSearch() {\n    if (this.timeout) clearTimeout(this.timeout)\n    const query = this.inputTarget.value.trim()\n\n    if (query.length === 0) {\n      this.hideResults()\n      return\n    }\n\n    if (query.length < 2) return\n\n    this.timeout = setTimeout(() => {\n      this.performSearch(query)\n    }, this.debounceValue)\n  }\n\n  performSearch(query) {\n    const lower = query.toLowerCase()\n    const matches = this.searchIndex.filter(item =>\n      item.title.toLowerCase().includes(lower)\n    )\n    this.showResults(matches, query)\n  }\n\n  showResults(matches, query) {\n    if (this.hasIntroContentTarget) this.introContentTarget.classList.add(\"hidden\")\n    this.chapterContentTargets.forEach(c => c.classList.add(\"hidden\"))\n    this.sectionContentTargets.forEach(c => c.classList.add(\"hidden\"))\n    if (this.hasSidebarTarget) {\n      this.sidebarTarget.classList.add(\"hidden\")\n      this.sidebarTarget.classList.remove(\"lg:block\")\n    }\n    if (this.hasMobileTopTarget) this.mobileTopTarget.classList.add(\"hidden\")\n    if (this.hasMobileBottomTarget) this.mobileBottomTarget.classList.add(\"hidden\")\n    this.resultsTarget.classList.remove(\"hidden\")\n\n    if (this.hasBreadcrumbPageTarget) {\n      const baseHref = escapeHtml(this.baseUrlValue)\n      this.breadcrumbPageTarget.innerHTML =\n        `<a class=\"text-amped-green hover:opacity-80 transition\" href=\"${baseHref}\">${escapeHtml(this.labelManualValue)}</a>` +\n        ` <span class=\"text-white mx-1\">\u203A</span>` +\n        ` <span class=\"text-white\">${escapeHtml(this.labelSearchResultValue)}</span>`\n    }\n\n    const countLabel = matches.length !== 1 ? this.labelResultsForValue : this.labelResultForValue\n    this.resultsCountTarget.textContent =\n      `${matches.length} ${countLabel} \"${query}\"`\n\n    this.resultsGridTarget.innerHTML = matches.map(item => `\n      <a href=\"#\" class=\"manual-search-card cursor-pointer\"\n         data-ch=\"${escapeHtml(item.chapterIdx)}\" data-sec=\"${escapeHtml(item.sectionIdx)}\">\n        <div class=\"font-semibold text-[24px] leading-[130%] text-[#272727]\">${escapeHtml(item.title)}</div>\n        <div class=\"text-base leading-[150%] text-[#272727] opacity-50 line-clamp-3\">${escapeHtml(item.preview)}</div>\n      </a>\n    `).join(\"\")\n\n    this.resultsGridTarget.querySelectorAll(\"a\").forEach(card => {\n      card.addEventListener(\"click\", (e) => {\n        e.preventDefault()\n        this.hideResults()\n        const chIdx = card.dataset.ch\n        const secIdx = card.dataset.sec\n\n        this.chapterCardTargets.forEach(c => c.classList.toggle(\"active\", c.dataset.chapterIdx === chIdx))\n        this.chapterSectionsTargets.forEach(nav => {\n          nav.classList.toggle(\"hidden\", nav.dataset.chapterIdx !== chIdx)\n        })\n\n        const radio = this.sectionRadioTargets.find(\n          r => r.dataset.chapterIdx === chIdx && r.dataset.sectionIdx === secIdx\n        )\n        if (radio) radio.checked = true\n        this.showSection(chIdx, secIdx)\n      })\n    })\n  }\n\n  hideResults() {\n    this.resultsTarget.classList.add(\"hidden\")\n    if (this.hasInputTarget) this.inputTarget.value = \"\"\n    if (this.hasSidebarTarget) {\n      this.sidebarTarget.classList.remove(\"hidden\")\n      this.sidebarTarget.classList.add(\"lg:block\")\n    }\n    if (this.hasMobileTopTarget) this.mobileTopTarget.classList.remove(\"hidden\")\n    if (this.hasMobileBottomTarget) this.mobileBottomTarget.classList.remove(\"hidden\")\n\n    const current = this.sectionRadioTargets.find(r => r.checked)\n    if (current) {\n      this.showSection(current.dataset.chapterIdx, current.dataset.sectionIdx)\n    } else {\n      const activeCard = this.chapterCardTargets.find(c => c.classList.contains(\"active\"))\n      if (activeCard) {\n        this.showChapterContent(activeCard.dataset.chapterIdx)\n      } else {\n        this.showIntro()\n      }\n    }\n  }\n\n  showIntro() {\n    this.chapterContentTargets.forEach(c => c.classList.add(\"hidden\"))\n    this.sectionContentTargets.forEach(c => c.classList.add(\"hidden\"))\n    if (this.hasIntroContentTarget) {\n      this.introContentTarget.classList.remove(\"hidden\")\n      const introDiv = this.introContentTarget.querySelector('div[data-role=\"intro-heading\"]')\n      if (introDiv) {\n        const h2 = document.createElement(\"h2\")\n        Array.from(introDiv.attributes).forEach(attr => {\n          if (attr.name !== \"data-role\") h2.setAttribute(attr.name, attr.value)\n        })\n        h2.setAttribute(\"data-role\", \"intro-heading\")\n        h2.innerHTML = introDiv.innerHTML\n        introDiv.replaceWith(h2)\n      }\n    }\n    this.chapterCardTargets.forEach(c => c.classList.remove(\"active\"))\n    this.chapterSectionsTargets.forEach(nav => nav.classList.add(\"hidden\"))\n    this.sectionRadioTargets.forEach(r => { r.checked = false })\n    if (this.hasBreadcrumbPageTarget) {\n      this.breadcrumbPageTarget.innerHTML = `<span class=\"text-white\">${this.labelManualValue}</span>`\n    }\n    this.updateUrl(null, null)\n    this.arrangeMobileLayout()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  connect() {\n    this.adjustLayout();\n  }\n\n  adjustLayout() {\n    const adBlock = document.querySelector('.sticky#block-for-cards')\n    if (adBlock) {\n      adBlock.classList.remove('sticky')\n      adBlock.style.top = '134px'\n      adBlock.style.maxHeight = '80vh'\n    }\n\n    const lightHeader = document.querySelector('header.fixed.w-full.z-20#light-header')\n    if (lightHeader) {\n      lightHeader.classList.remove('z-20')\n      lightHeader.style.backgroundColor = 'rgba(247, 247, 247, 1)'\n      lightHeader.style.height = '86px'\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Click-to-load YouTube hero. The poster (background image + Play button) is\n// shown first; the YouTube iframe is only injected \u2014 and the video only loads \u2014\n// when the user clicks the block. Mirrors the \"What's New\" play pattern.\nexport default class extends Controller {\n  static targets = [\"poster\", \"frame\"]\n  static values = { videoId: String }\n\n  play() {\n    if (this.loaded || !this.hasFrameTarget) return\n    this.loaded = true\n\n    const iframe = document.createElement(\"iframe\")\n    iframe.src =\n      `https://www.youtube-nocookie.com/embed/${this.videoIdValue}` +\n      \"?autoplay=1&rel=0&modestbranding=1&playsinline=1\"\n    iframe.className = \"absolute inset-0 w-full h-full\"\n    iframe.setAttribute(\"frameborder\", \"0\")\n    iframe.setAttribute(\"allowfullscreen\", \"\")\n    iframe.setAttribute(\"referrerpolicy\", \"strict-origin-when-cross-origin\")\n    iframe.allow =\n      \"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n\n    this.frameTarget.appendChild(iframe)\n    if (this.hasPosterTarget) this.posterTarget.style.display = \"none\"\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Horizontal card shelf: prev/next arrows scroll the row. The arrow group\n// hides itself when there is nothing to scroll, and each arrow dims at its edge.\nexport default class extends Controller {\n  static targets = [\"scroller\", \"arrows\", \"prev\", \"next\"]\n\n  connect() {\n    this.update = this.update.bind(this)\n    if (this.hasScrollerTarget) {\n      this.scrollerTarget.addEventListener(\"scroll\", this.update, { passive: true })\n    }\n    window.addEventListener(\"resize\", this.update)\n    this.update()\n  }\n\n  disconnect() {\n    if (this.hasScrollerTarget) {\n      this.scrollerTarget.removeEventListener(\"scroll\", this.update)\n    }\n    window.removeEventListener(\"resize\", this.update)\n  }\n\n  prev() {\n    this.scrollByAmount(-1)\n  }\n\n  next() {\n    this.scrollByAmount(1)\n  }\n\n  scrollByAmount(direction) {\n    if (!this.hasScrollerTarget) return\n    const amount = Math.max(this.scrollerTarget.clientWidth * 0.85, 280)\n    this.scrollerTarget.scrollBy({ left: direction * amount, behavior: \"smooth\" })\n  }\n\n  update() {\n    if (!this.hasScrollerTarget) return\n    const el = this.scrollerTarget\n    const scrollable = el.scrollWidth - el.clientWidth > 4\n\n    if (this.hasArrowsTarget) {\n      // Don't touch the responsive `hidden md:flex` classes (toggling them\n      // breaks the flex layout below the md breakpoint). Just hide the whole\n      // group when there's nothing to scroll.\n      this.arrowsTarget.style.display = scrollable ? \"\" : \"none\"\n    }\n\n    this.setDisabled(this.hasPrevTarget && this.prevTarget, el.scrollLeft <= 1)\n    this.setDisabled(\n      this.hasNextTarget && this.nextTarget,\n      el.scrollLeft >= el.scrollWidth - el.clientWidth - 1\n    )\n  }\n\n  setDisabled(button, disabled) {\n    if (!button) return\n    button.disabled = disabled\n    button.classList.toggle(\"opacity-50\", disabled)\n    button.classList.toggle(\"pointer-events-none\", disabled)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Music Production Tips feed.\n// - Category changes update the frame in place (no scroll).\n// - Pagination scrolls back to the top of the feed after the frame swaps,\n//   so the new page isn't left scrolled to the bottom.\nexport default class extends Controller {\n  static targets = [\"top\"]\n\n  connect() {\n    this.scrollPending = false\n    this.onFrameLoad = this.onFrameLoad.bind(this)\n    this.element.addEventListener(\"turbo:frame-load\", this.onFrameLoad)\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"turbo:frame-load\", this.onFrameLoad)\n  }\n\n  // Bound to pagination links; flags that the next frame load should scroll up.\n  paginate() {\n    this.scrollPending = true\n  }\n\n  onFrameLoad() {\n    if (!this.scrollPending) return\n    this.scrollPending = false\n    const target = this.hasTopTarget ? this.topTarget : this.element\n    target.scrollIntoView({ behavior: \"smooth\", block: \"start\" })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Attached to the fixed site header. Its height varies (the \"what's new\"\n// banner is hidden on some pages, and its text can wrap to two lines\n// depending on viewport width/locale), so pages can't safely hardcode a\n// top offset. This publishes the header's real height as --header-height\n// so page content can offset itself dynamically instead of guessing.\nexport default class extends Controller {\n  connect() {\n    this.updateHeight = this.updateHeight.bind(this)\n    this.observer = new ResizeObserver(this.updateHeight)\n    this.observer.observe(this.element)\n    this.updateHeight()\n  }\n\n  disconnect() {\n    this.observer?.disconnect()\n  }\n\n  updateHeight() {\n    document.documentElement.style.setProperty('--header-height', `${this.element.offsetHeight}px`)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Dismisses the top-of-page announcement banner and remembers it, so it doesn't reappear on\n// later visits. One flag for the whole component, regardless of whatever content is inside it.\n// (Initial visibility is decided by the inline script in _announcement_top_banner.html.slim,\n// synchronously before paint \u2014 this controller only has to handle the close click.)\nconst DISMISSED_KEY = \"announcementTopBannerDismissed\"\n\nexport default class extends Controller {\n  close() {\n    localStorage.setItem(DISMISSED_KEY, \"true\")\n    this.element.remove()\n  }\n}\n", "// This file is auto-generated by ./bin/rails stimulus:manifest:update\n// Run that command whenever you add a new controller or create them with\n// ./bin/rails generate stimulus controllerName\n\nimport { application } from \"./application\";\n\nimport AccessController from \"./access_controller.js\";\napplication.register(\"access\", AccessController);\n\nimport AnchorController from \"./anchor_controller.js\";\napplication.register(\"anchor\", AnchorController);\n\nimport DismissController from \"./dismiss_controller.js\";\napplication.register(\"dismiss\", DismissController);\n\nimport DownloadPollerController from \"./download_poller_controller.js\";\napplication.register(\"download-poller\", DownloadPollerController);\n\nimport FlashController from \"./flash_controller.js\";\napplication.register(\"flash\", FlashController);\n\nimport ArticleTranslationController from \"./article_translation_controller.js\";\napplication.register(\"article-translation\", ArticleTranslationController);\n\nimport AudioController from \"./audio_controller.js\";\napplication.register(\"audio\", AudioController);\n\nimport BulkController from \"./bulk_controller.js\";\napplication.register(\"bulk\", BulkController);\n\nimport CartController from \"./cart_controller.js\";\napplication.register(\"cart\", CartController);\n\nimport ChartController from \"./chart_controller.js\";\napplication.register(\"chart\", ChartController);\n\nimport ClipboardController from \"./clipboard_controller.js\";\napplication.register(\"clipboard\", ClipboardController);\n\nimport ComboboxController from \"./combobox_controller.js\";\napplication.register(\"combobox\", ComboboxController);\n\nimport ColorFieldController from \"./color_field_controller.js\";\napplication.register(\"color-field\", ColorFieldController);\n\nimport MultiSelectController from \"./multi_select_controller.js\";\napplication.register(\"multi-select\", MultiSelectController);\n\nimport ContentTranslationController from \"./content_translation_controller.js\";\napplication.register(\"content-translation\", ContentTranslationController);\n\nimport CookieConsentController from \"./cookie_consent_controller.js\";\napplication.register(\"cookie-consent\", CookieConsentController);\n\nimport DatalistController from \"./datalist_controller.js\";\napplication.register(\"datalist\", DatalistController);\n\nimport DatalayerController from \"./datalayer_controller.js\";\napplication.register(\"datalayer\", DatalayerController);\n\nimport DisplayController from \"./display_controller.js\";\napplication.register(\"display\", DisplayController);\n\nimport ExternalRedirectController from \"./external_redirect_controller.js\";\napplication.register(\"external-redirect\", ExternalRedirectController);\n\nimport FilterController from \"./filter_controller.js\";\napplication.register(\"filter\", FilterController);\n\nimport FlatpickrController from \"./flatpickr_controller.js\";\napplication.register(\"flatpickr\", FlatpickrController);\n\nimport FormController from \"./form_controller.js\";\napplication.register(\"form\", FormController);\n\nimport FormSubmissionController from \"./form_submission_controller.js\";\napplication.register(\"form-submission\", FormSubmissionController);\n\nimport PricingController from \"./pricing_controller.js\";\napplication.register(\"pricing\", PricingController);\n\nimport RangeController from \"./range_controller.js\";\napplication.register(\"range\", RangeController);\n\nimport RecaptchaController from \"./recaptcha_controller.js\";\napplication.register(\"recaptcha\", RecaptchaController);\n\nimport ReviewsController from \"./reviews_controller.js\";\napplication.register(\"reviews\", ReviewsController);\n\nimport StripeController from \"./stripe_controller.js\";\napplication.register(\"stripe\", StripeController);\n\nimport TabsController from \"./tabs_controller.js\";\napplication.register(\"tabs\", TabsController);\n\nimport TouchedController from \"./touched_controller.js\";\napplication.register(\"touched\", TouchedController);\n\nimport TutorialSearchController from \"./tutorial_search_controller.js\";\napplication.register(\"tutorial-search\", TutorialSearchController);\n\nimport ModalController from \"./modal_controller\";\napplication.register(\"modal\", ModalController);\n\nimport OnboardingController from \"./onboarding_controller.js\";\napplication.register(\"onboarding\", OnboardingController);\n\nimport InfiniteScrollController from \"./infinite_scroll_controller.js\";\napplication.register(\"infinite-scroll\", InfiniteScrollController);\n\nimport ManualSearchController from \"./manual_search_controller.js\";\napplication.register(\"manual-search\", ManualSearchController);\n\nimport PageLayoutController from \"./page_layout_controller.js\";\napplication.register(\"page-layout\", PageLayoutController);\n\nimport HeroVideoController from \"./hero_video_controller.js\";\napplication.register(\"hero-video\", HeroVideoController);\n\nimport CarouselController from \"./carousel_controller.js\";\napplication.register(\"carousel\", CarouselController);\n\nimport FeedController from \"./feed_controller.js\";\napplication.register(\"feed\", FeedController);\n\nimport HeaderOffsetController from \"./header_offset_controller.js\";\napplication.register(\"header-offset\", HeaderOffsetController);\n\nimport AnnouncementTopBannerController from \"./announcement_top_banner_controller.js\";\napplication.register(\"announcement-top-banner\", AnnouncementTopBannerController);\n", "import \"@hotwired/turbo-rails\";\nimport * as ActiveStorage from \"@rails/activestorage\";\nActiveStorage.start()\nimport \"trix\";\nimport \"@rails/actiontext\";\nimport \"./controllers\";\n\nimport Trix from \"trix\"\n\ndocument.addEventListener(\"trix-before-initialize\", () => {\n  Trix.config.dompurify.ADD_TAGS = [ \"h2\", \"h3\", \"p\", \"a\", \"cta\", \"youtube\", \"table-data\", \"table-row\", \"table-cell\" ]\n  Trix.config.dompurify.ADD_ATTR = [ \"class\", \"href\", \"rows\", \"cols\" ]\n\n  Trix.config.blockAttributes.heading1.tagName = \"h2\"\n  Trix.config.blockAttributes.heading3 = {\n    tagName: \"h3\",\n    terminal: true,\n    breakOnReturn: true,\n    group: false\n  }\n  Trix.config.blockAttributes.paragraph = {\n    tagName: \"p\",\n    terminal: true,\n    breakOnReturn: false,\n    group: false\n  }\n  Trix.config.blockAttributes.cta = {\n    tagName: \"cta\",\n    htmlAttributes: [ \"href\" ],\n    terminal: true,\n    breakOnReturn: true,\n    group: false\n  }\n  Trix.config.blockAttributes.youtube = {\n    tagName: \"youtube\",\n    htmlAttributes: [ \"href\" ],\n    terminal: true,\n    breakOnReturn: true,\n    group: false\n  }\n  Trix.config.blockAttributes[\"table-data\"] = {\n    tagName: \"table-data\",\n    htmlAttributes: [ \"rows\", \"cols\" ],  // Removed \"class\" to prevent propagation\n    terminal: true,\n    breakOnReturn: true,\n    group: true  // Allow this block to contain other blocks\n  }\n  Trix.config.blockAttributes[\"table-row\"] = {\n    tagName: \"table-row\",\n    htmlAttributes: [ \"class\" ],\n    terminal: true,\n    breakOnReturn: true,\n    nestable: true,\n    group: true,\n  }\n  Trix.config.blockAttributes[\"table-cell\"] = {\n    tagName: \"table-cell\",\n    htmlAttributes: [ \"class\" ],\n    nestable: true,\n    group: false,\n  }\n})\n\ndocument.addEventListener(\"trix-initialize\", (event) => {\n  const toolbar = event.target.previousElementSibling\n  const heading3ButtonHTML = '<button type=\"button\" class=\"trix-button trix-button--icon\" data-trix-attribute=\"heading3\" title=\"h3\">h3</button>'\n  const paragraphButtonHTML = '<button type=\"button\" class=\"trix-button trix-button--icon\" data-trix-attribute=\"paragraph\" title=\"Paragraph\">P</button>'\n  const ctaButtonHTML = '<button type=\"button\" class=\"trix-button trix-button--icon\" data-trix-action=\"x-cta-link\" title=\"CTA Link\">CTA</button>'\n  const youtubeButtonHTML = '<button type=\"button\" class=\"trix-button trix-button--icon\" data-trix-action=\"x-youtube-video\" title=\"Embed YouTube\">YT</button>'\n  const tableButtonHTML = '<button type=\"button\" class=\"trix-button trix-button--icon\" data-trix-action=\"x-insert-table\" title=\"Insert Table\">\uD83D\uDCCA</button>'\n\n  const headingButton = toolbar.querySelector(\".trix-button--icon-heading-1\")\n  if (headingButton) {\n    headingButton.insertAdjacentHTML(\"afterend\", paragraphButtonHTML)\n    headingButton.insertAdjacentHTML(\"afterend\", heading3ButtonHTML)\n  }\n  const linkButton = toolbar.querySelector(\".trix-button--icon-link\")\n  if (linkButton) {\n    linkButton.insertAdjacentHTML(\"afterend\", tableButtonHTML)\n    linkButton.insertAdjacentHTML(\"afterend\", youtubeButtonHTML)\n    linkButton.insertAdjacentHTML(\"afterend\", ctaButtonHTML)\n  }\n})\ndocument.addEventListener(\"trix-action-invoke\", (event) => {\n  const { target, invokingElement, actionName } = event\n\n  if (actionName === \"x-cta-link\") {\n    const url = prompt(\"Enter CTA URL:\");\n    if (!url) return;\n    const [start, end] = target.editor.getSelectedRange();\n    const text = target.editor.getDocument().toString().slice(start, end)\n    target.editor.insertHTML(`<cta href=\"${url}\">${text}</cta>`);\n  }\n\n  if (actionName === \"x-youtube-video\") {\n    const input = prompt(\"Enter YouTube URL or video ID:\");\n    if (!input) return;\n\n    // Extract video ID from various YouTube URL formats\n    let videoId = null;\n\n    // Check if it's already just a video ID (11 characters, alphanumeric and hyphens/underscores)\n    if (/^[A-Za-z0-9_-]{11}$/.test(input)) {\n      videoId = input;\n    } else {\n      // Try to extract from various YouTube URL formats\n      const patterns = [\n        /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([A-Za-z0-9_-]{11})/,\n        /youtube\\.com\\/watch\\?.*&v=([A-Za-z0-9_-]{11})/\n      ];\n\n      for (const pattern of patterns) {\n        const match = input.match(pattern);\n        if (match) {\n          videoId = match[1];\n          break;\n        }\n      }\n    }\n\n    if (!videoId) {\n      alert(\"Invalid YouTube URL or video ID. Please try again.\");\n      return;\n    }\n\n    // Insert custom element that will be transformed to iframe on the backend\n    target.editor.insertHTML(`<youtube href=\"${videoId}\">video</youtube>`);\n  }\n\n  if (actionName === \"x-insert-table\") {\n    const rows = prompt(\"Number of rows:\", \"3\");\n    const cols = prompt(\"Number of columns:\", \"3\");\n\n    if (!rows || !cols) return;\n\n    const numRows = parseInt(rows);\n    const numCols = parseInt(cols);\n\n    if (isNaN(numRows) || isNaN(numCols) || numRows < 1 || numCols < 1 || numRows > 20 || numCols > 10) {\n      alert(\"Please enter valid numbers (rows: 1-20, columns: 1-10)\");\n      return;\n    }\n\n    // Build table structure wrapped in table-data\n    let tableHTML = '<table-data>';\n\n    // Header row\n    tableHTML += '<table-row class=\"header\">';\n    for (let c = 0; c < numCols; c++) {\n      tableHTML += `<table-cell>Header ${c + 1}</table-cell>`;\n    }\n    tableHTML += '</table-row>';\n\n    // Body rows\n    for (let r = 0; r < numRows - 1; r++) {\n      tableHTML += '&nbsp;<table-row>';\n      for (let c = 0; c < numCols; c++) {\n        tableHTML += '<table-cell>cell</table-cell>';\n      }\n      tableHTML += '</table-row>';\n    }\n\n    tableHTML += '</table-data>';\n\n    // Insert table\n    target.editor.insertHTML(tableHTML);\n  }\n});\n\n\n"],
  "mappings": "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",
  "names": []
}
