{
  "version": 3,
  "sources": ["../../node_modules/cropperjs/dist/cropper.js", "../../node_modules/@hotwired/stimulus/dist/stimulus.js", "../../node_modules/engine.io-parser/build/esm/commons.js", "../../node_modules/engine.io-parser/build/esm/encodePacket.browser.js", "../../node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js", "../../node_modules/engine.io-parser/build/esm/decodePacket.browser.js", "../../node_modules/engine.io-parser/build/esm/index.js", "../../node_modules/@socket.io/component-emitter/lib/esm/index.js", "../../node_modules/engine.io-client/build/esm/globals.js", "../../node_modules/engine.io-client/build/esm/util.js", "../../node_modules/engine.io-client/build/esm/contrib/parseqs.js", "../../node_modules/engine.io-client/build/esm/transport.js", "../../node_modules/engine.io-client/build/esm/transports/polling.js", "../../node_modules/engine.io-client/build/esm/contrib/has-cors.js", "../../node_modules/engine.io-client/build/esm/transports/polling-xhr.js", "../../node_modules/engine.io-client/build/esm/transports/websocket.js", "../../node_modules/engine.io-client/build/esm/transports/webtransport.js", "../../node_modules/engine.io-client/build/esm/transports/index.js", "../../node_modules/engine.io-client/build/esm/contrib/parseuri.js", "../../node_modules/engine.io-client/build/esm/socket.js", "../../node_modules/engine.io-client/build/esm/index.js", "../../node_modules/socket.io-client/build/esm/url.js", "../../node_modules/socket.io-parser/build/esm/index.js", "../../node_modules/socket.io-parser/build/esm/is-binary.js", "../../node_modules/socket.io-parser/build/esm/binary.js", "../../node_modules/socket.io-client/build/esm/on.js", "../../node_modules/socket.io-client/build/esm/socket.js", "../../node_modules/socket.io-client/build/esm/contrib/backo2.js", "../../node_modules/socket.io-client/build/esm/manager.js", "../../node_modules/socket.io-client/build/esm/index.js", "../../static_src/js/services/event_bus.js", "../../static_src/js/services/socket_service.js", "../../static_src/js/controllers/validation_code.controller.js", "../../static_src/js/controllers/tel-input.controller.js", "../../static_src/js/controllers/managed-modal.controller.js", "../../static_src/js/controllers/education-experience-modal.controller.js", "../../static_src/js/controllers/certification-modal.controller.js", "../../static_src/js/controllers/cropper.controller.js", "../../static_src/js/controllers/certification-upload-image.controller.js", "../../static_src/js/controllers/dynamic-list.controller.js", "../../static_src/js/controllers/tabs.controller.js", "../../static_src/js/controllers/certification-list.controller.js", "../../static_src/js/controllers/vacancy-selection.controller.js", "../../static_src/js/controllers/vacancy-preview.controller.js", "../../static_src/js/controllers/applicant-selection.controller.js", "../../static_src/js/controllers/remove-element.controller.js", "../../static_src/js/controllers/conversation-search.controller.js", "../../static_src/js/controllers/conversation-chat.controller.js", "../../static_src/js/controllers/notification-dropdown.controller.js", "../../static_src/js/controllers/notification-snack.controller.js", "../../static_src/js/controllers/stripe-payment.controller.js", "../../static_src/js/controllers/credits-purchase.controller.js", "../../static_src/js/controllers/schedule-video-call.controller.js", "../../static_src/js/controllers/open-video-call.controller.js", "../../static_src/js/controllers/vacancy-age-range.controller.js", "../../static_src/js/controllers/confirm-modal.controller.js", "../../static_src/js/controllers/theme-toggle.controller.js", "../../static_src/js/controllers/disclosure.controller.js", "../../static_src/js/controllers/password-reveal.controller.js", "../../static_src/js/controllers/field-validation.controller.js", "../../static_src/js/controllers/required-submit.controller.js", "../../static_src/js/controllers/chip-list.controller.js", "../../static_src/js/controllers/current-period.controller.js", "../../static_src/js/controllers/line-chart.controller.js", "../../static_src/js/controllers/conversation-panes.controller.js", "../../static_src/js/controllers/print-page.controller.js", "../../static_src/js/controllers/list-detail.controller.js", "../../static_src/js/controllers/billing-form.controller.js", "../../static_src/js/controllers/logo-slider.controller.js", "../../static_src/js/controllers/vacancy-carousel.controller.js", "../../static_src/js/controllers/promo-code.controller.js", "../../static_src/js/main.js"],
  "sourcesContent": ["/*!\n * Cropper.js v1.6.2\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2024-04-21T07:43:05.335Z\n */\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Cropper = factory());\n})(this, (function () { 'use strict';\n\n  function ownKeys(e, r) {\n    var t = Object.keys(e);\n    if (Object.getOwnPropertySymbols) {\n      var o = Object.getOwnPropertySymbols(e);\n      r && (o = o.filter(function (r) {\n        return Object.getOwnPropertyDescriptor(e, r).enumerable;\n      })), t.push.apply(t, o);\n    }\n    return t;\n  }\n  function _objectSpread2(e) {\n    for (var r = 1; r < arguments.length; r++) {\n      var t = null != arguments[r] ? arguments[r] : {};\n      r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n        _defineProperty(e, r, t[r]);\n      }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n        Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n      });\n    }\n    return e;\n  }\n  function _toPrimitive(t, r) {\n    if (\"object\" != typeof t || !t) return t;\n    var e = t[Symbol.toPrimitive];\n    if (void 0 !== e) {\n      var i = e.call(t, r || \"default\");\n      if (\"object\" != typeof i) return i;\n      throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n    }\n    return (\"string\" === r ? String : Number)(t);\n  }\n  function _toPropertyKey(t) {\n    var i = _toPrimitive(t, \"string\");\n    return \"symbol\" == typeof i ? i : i + \"\";\n  }\n  function _typeof(o) {\n    \"@babel/helpers - typeof\";\n\n    return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n      return typeof o;\n    } : function (o) {\n      return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n    }, _typeof(o);\n  }\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n    }\n  }\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    Object.defineProperty(Constructor, \"prototype\", {\n      writable: false\n    });\n    return Constructor;\n  }\n  function _defineProperty(obj, key, value) {\n    key = _toPropertyKey(key);\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n    return obj;\n  }\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n  }\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n  }\n  function _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n  }\n  function _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n  }\n  function _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n    return arr2;\n  }\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n  var WINDOW = IS_BROWSER ? window : {};\n  var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\n  var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n  var NAMESPACE = 'cropper';\n\n  // Actions\n  var ACTION_ALL = 'all';\n  var ACTION_CROP = 'crop';\n  var ACTION_MOVE = 'move';\n  var ACTION_ZOOM = 'zoom';\n  var ACTION_EAST = 'e';\n  var ACTION_WEST = 'w';\n  var ACTION_SOUTH = 's';\n  var ACTION_NORTH = 'n';\n  var ACTION_NORTH_EAST = 'ne';\n  var ACTION_NORTH_WEST = 'nw';\n  var ACTION_SOUTH_EAST = 'se';\n  var ACTION_SOUTH_WEST = 'sw';\n\n  // Classes\n  var CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\n  var CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\n  var CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\n  var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n  var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n  var CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\n  var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\");\n\n  // Data keys\n  var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n  var DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\");\n\n  // Drag modes\n  var DRAG_MODE_CROP = 'crop';\n  var DRAG_MODE_MOVE = 'move';\n  var DRAG_MODE_NONE = 'none';\n\n  // Events\n  var EVENT_CROP = 'crop';\n  var EVENT_CROP_END = 'cropend';\n  var EVENT_CROP_MOVE = 'cropmove';\n  var EVENT_CROP_START = 'cropstart';\n  var EVENT_DBLCLICK = 'dblclick';\n  var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n  var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n  var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n  var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n  var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n  var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n  var EVENT_READY = 'ready';\n  var EVENT_RESIZE = 'resize';\n  var EVENT_WHEEL = 'wheel';\n  var EVENT_ZOOM = 'zoom';\n\n  // Mime types\n  var MIME_TYPE_JPEG = 'image/jpeg';\n\n  // RegExps\n  var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\n  var REGEXP_DATA_URL = /^data:/;\n  var REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\n  var REGEXP_TAG_NAME = /^img|canvas$/i;\n\n  // Misc\n  // Inspired by the default width and height of a canvas element.\n  var MIN_CONTAINER_WIDTH = 200;\n  var MIN_CONTAINER_HEIGHT = 100;\n\n  var DEFAULTS = {\n    // Define the view mode of the cropper\n    viewMode: 0,\n    // 0, 1, 2, 3\n\n    // Define the dragging mode of the cropper\n    dragMode: DRAG_MODE_CROP,\n    // 'crop', 'move' or 'none'\n\n    // Define the initial aspect ratio of the crop box\n    initialAspectRatio: NaN,\n    // Define the aspect ratio of the crop box\n    aspectRatio: NaN,\n    // An object with the previous cropping result data\n    data: null,\n    // A selector for adding extra containers to preview\n    preview: '',\n    // Re-render the cropper when resize the window\n    responsive: true,\n    // Restore the cropped area after resize the window\n    restore: true,\n    // Check if the current image is a cross-origin image\n    checkCrossOrigin: true,\n    // Check the current image's Exif Orientation information\n    checkOrientation: true,\n    // Show the black modal\n    modal: true,\n    // Show the dashed lines for guiding\n    guides: true,\n    // Show the center indicator for guiding\n    center: true,\n    // Show the white modal to highlight the crop box\n    highlight: true,\n    // Show the grid background\n    background: true,\n    // Enable to crop the image automatically when initialize\n    autoCrop: true,\n    // Define the percentage of automatic cropping area when initializes\n    autoCropArea: 0.8,\n    // Enable to move the image\n    movable: true,\n    // Enable to rotate the image\n    rotatable: true,\n    // Enable to scale the image\n    scalable: true,\n    // Enable to zoom the image\n    zoomable: true,\n    // Enable to zoom the image by dragging touch\n    zoomOnTouch: true,\n    // Enable to zoom the image by wheeling mouse\n    zoomOnWheel: true,\n    // Define zoom ratio when zoom the image by wheeling mouse\n    wheelZoomRatio: 0.1,\n    // Enable to move the crop box\n    cropBoxMovable: true,\n    // Enable to resize the crop box\n    cropBoxResizable: true,\n    // Toggle drag mode between \"crop\" and \"move\" when click twice on the cropper\n    toggleDragModeOnDblclick: true,\n    // Size limitation\n    minCanvasWidth: 0,\n    minCanvasHeight: 0,\n    minCropBoxWidth: 0,\n    minCropBoxHeight: 0,\n    minContainerWidth: MIN_CONTAINER_WIDTH,\n    minContainerHeight: MIN_CONTAINER_HEIGHT,\n    // Shortcuts of events\n    ready: null,\n    cropstart: null,\n    cropmove: null,\n    cropend: null,\n    crop: null,\n    zoom: null\n  };\n\n  var TEMPLATE = '<div class=\"cropper-container\" touch-action=\"none\">' + '<div class=\"cropper-wrap-box\">' + '<div class=\"cropper-canvas\"></div>' + '</div>' + '<div class=\"cropper-drag-box\"></div>' + '<div class=\"cropper-crop-box\">' + '<span class=\"cropper-view-box\"></span>' + '<span class=\"cropper-dashed dashed-h\"></span>' + '<span class=\"cropper-dashed dashed-v\"></span>' + '<span class=\"cropper-center\"></span>' + '<span class=\"cropper-face\"></span>' + '<span class=\"cropper-line line-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-line line-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-line line-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-line line-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-e\" data-cropper-action=\"e\"></span>' + '<span class=\"cropper-point point-n\" data-cropper-action=\"n\"></span>' + '<span class=\"cropper-point point-w\" data-cropper-action=\"w\"></span>' + '<span class=\"cropper-point point-s\" data-cropper-action=\"s\"></span>' + '<span class=\"cropper-point point-ne\" data-cropper-action=\"ne\"></span>' + '<span class=\"cropper-point point-nw\" data-cropper-action=\"nw\"></span>' + '<span class=\"cropper-point point-sw\" data-cropper-action=\"sw\"></span>' + '<span class=\"cropper-point point-se\" data-cropper-action=\"se\"></span>' + '</div>' + '</div>';\n\n  /**\n   * Check if the given value is not a number.\n   */\n  var isNaN = Number.isNaN || WINDOW.isNaN;\n\n  /**\n   * Check if the given value is a number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n   */\n  function isNumber(value) {\n    return typeof value === 'number' && !isNaN(value);\n  }\n\n  /**\n   * Check if the given value is a positive number.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n   */\n  var isPositiveNumber = function isPositiveNumber(value) {\n    return value > 0 && value < Infinity;\n  };\n\n  /**\n   * Check if the given value is undefined.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n   */\n  function isUndefined(value) {\n    return typeof value === 'undefined';\n  }\n\n  /**\n   * Check if the given value is an object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n   */\n  function isObject(value) {\n    return _typeof(value) === 'object' && value !== null;\n  }\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  /**\n   * Check if the given value is a plain object.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n   */\n  function isPlainObject(value) {\n    if (!isObject(value)) {\n      return false;\n    }\n    try {\n      var _constructor = value.constructor;\n      var prototype = _constructor.prototype;\n      return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * Check if the given value is a function.\n   * @param {*} value - The value to check.\n   * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n   */\n  function isFunction(value) {\n    return typeof value === 'function';\n  }\n  var slice = Array.prototype.slice;\n\n  /**\n   * Convert array-like or iterable object to an array.\n   * @param {*} value - The value to convert.\n   * @returns {Array} Returns a new array.\n   */\n  function toArray(value) {\n    return Array.from ? Array.from(value) : slice.call(value);\n  }\n\n  /**\n   * Iterate the given data.\n   * @param {*} data - The data to iterate.\n   * @param {Function} callback - The process function for each element.\n   * @returns {*} The original data.\n   */\n  function forEach(data, callback) {\n    if (data && isFunction(callback)) {\n      if (Array.isArray(data) || isNumber(data.length) /* array-like */) {\n        toArray(data).forEach(function (value, key) {\n          callback.call(data, value, key, data);\n        });\n      } else if (isObject(data)) {\n        Object.keys(data).forEach(function (key) {\n          callback.call(data, data[key], key, data);\n        });\n      }\n    }\n    return data;\n  }\n\n  /**\n   * Extend the given object.\n   * @param {*} target - The target object to extend.\n   * @param {*} args - The rest objects for merging to the target object.\n   * @returns {Object} The extended object.\n   */\n  var assign = Object.assign || function assign(target) {\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    if (isObject(target) && args.length > 0) {\n      args.forEach(function (arg) {\n        if (isObject(arg)) {\n          Object.keys(arg).forEach(function (key) {\n            target[key] = arg[key];\n          });\n        }\n      });\n    }\n    return target;\n  };\n  var REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n\n  /**\n   * Normalize decimal number.\n   * Check out {@link https://0.30000000000000004.com/}\n   * @param {number} value - The value to normalize.\n   * @param {number} [times=100000000000] - The times for normalizing.\n   * @returns {number} Returns the normalized number.\n   */\n  function normalizeDecimalNumber(value) {\n    var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n    return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n  }\n  var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n\n  /**\n   * Apply styles to the given element.\n   * @param {Element} element - The target element.\n   * @param {Object} styles - The styles for applying.\n   */\n  function setStyle(element, styles) {\n    var style = element.style;\n    forEach(styles, function (value, property) {\n      if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n        value = \"\".concat(value, \"px\");\n      }\n      style[property] = value;\n    });\n  }\n\n  /**\n   * Check if the given element has a special class.\n   * @param {Element} element - The element to check.\n   * @param {string} value - The class to search.\n   * @returns {boolean} Returns `true` if the special class was found.\n   */\n  function hasClass(element, value) {\n    return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n  }\n\n  /**\n   * Add classes to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be added.\n   */\n  function addClass(element, value) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        addClass(elem, value);\n      });\n      return;\n    }\n    if (element.classList) {\n      element.classList.add(value);\n      return;\n    }\n    var className = element.className.trim();\n    if (!className) {\n      element.className = value;\n    } else if (className.indexOf(value) < 0) {\n      element.className = \"\".concat(className, \" \").concat(value);\n    }\n  }\n\n  /**\n   * Remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be removed.\n   */\n  function removeClass(element, value) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        removeClass(elem, value);\n      });\n      return;\n    }\n    if (element.classList) {\n      element.classList.remove(value);\n      return;\n    }\n    if (element.className.indexOf(value) >= 0) {\n      element.className = element.className.replace(value, '');\n    }\n  }\n\n  /**\n   * Add or remove classes from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} value - The classes to be toggled.\n   * @param {boolean} added - Add only.\n   */\n  function toggleClass(element, value, added) {\n    if (!value) {\n      return;\n    }\n    if (isNumber(element.length)) {\n      forEach(element, function (elem) {\n        toggleClass(elem, value, added);\n      });\n      return;\n    }\n\n    // IE10-11 doesn't support the second parameter of `classList.toggle`\n    if (added) {\n      addClass(element, value);\n    } else {\n      removeClass(element, value);\n    }\n  }\n  var REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\n\n  /**\n   * Transform the given string from camelCase to kebab-case\n   * @param {string} value - The value to transform.\n   * @returns {string} The transformed value.\n   */\n  function toParamCase(value) {\n    return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\n  }\n\n  /**\n   * Get data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to get.\n   * @returns {string} The data value.\n   */\n  function getData(element, name) {\n    if (isObject(element[name])) {\n      return element[name];\n    }\n    if (element.dataset) {\n      return element.dataset[name];\n    }\n    return element.getAttribute(\"data-\".concat(toParamCase(name)));\n  }\n\n  /**\n   * Set data to the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to set.\n   * @param {string} data - The data value.\n   */\n  function setData(element, name, data) {\n    if (isObject(data)) {\n      element[name] = data;\n    } else if (element.dataset) {\n      element.dataset[name] = data;\n    } else {\n      element.setAttribute(\"data-\".concat(toParamCase(name)), data);\n    }\n  }\n\n  /**\n   * Remove data from the given element.\n   * @param {Element} element - The target element.\n   * @param {string} name - The data key to remove.\n   */\n  function removeData(element, name) {\n    if (isObject(element[name])) {\n      try {\n        delete element[name];\n      } catch (error) {\n        element[name] = undefined;\n      }\n    } else if (element.dataset) {\n      // #128 Safari not allows to delete dataset property\n      try {\n        delete element.dataset[name];\n      } catch (error) {\n        element.dataset[name] = undefined;\n      }\n    } else {\n      element.removeAttribute(\"data-\".concat(toParamCase(name)));\n    }\n  }\n  var REGEXP_SPACES = /\\s\\s*/;\n  var onceSupported = function () {\n    var supported = false;\n    if (IS_BROWSER) {\n      var once = false;\n      var listener = function listener() {};\n      var options = Object.defineProperty({}, 'once', {\n        get: function get() {\n          supported = true;\n          return once;\n        },\n        /**\n         * This setter can fix a `TypeError` in strict mode\n         * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n         * @param {boolean} value - The value to set\n         */\n        set: function set(value) {\n          once = value;\n        }\n      });\n      WINDOW.addEventListener('test', listener, options);\n      WINDOW.removeEventListener('test', listener, options);\n    }\n    return supported;\n  }();\n\n  /**\n   * Remove event listener from the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n  function removeListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (!onceSupported) {\n        var listeners = element.listeners;\n        if (listeners && listeners[event] && listeners[event][listener]) {\n          handler = listeners[event][listener];\n          delete listeners[event][listener];\n          if (Object.keys(listeners[event]).length === 0) {\n            delete listeners[event];\n          }\n          if (Object.keys(listeners).length === 0) {\n            delete element.listeners;\n          }\n        }\n      }\n      element.removeEventListener(event, handler, options);\n    });\n  }\n\n  /**\n   * Add event listener to the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Function} listener - The event listener.\n   * @param {Object} options - The event options.\n   */\n  function addListener(element, type, listener) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var _handler = listener;\n    type.trim().split(REGEXP_SPACES).forEach(function (event) {\n      if (options.once && !onceSupported) {\n        var _element$listeners = element.listeners,\n          listeners = _element$listeners === void 0 ? {} : _element$listeners;\n        _handler = function handler() {\n          delete listeners[event][listener];\n          element.removeEventListener(event, _handler, options);\n          for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n            args[_key2] = arguments[_key2];\n          }\n          listener.apply(element, args);\n        };\n        if (!listeners[event]) {\n          listeners[event] = {};\n        }\n        if (listeners[event][listener]) {\n          element.removeEventListener(event, listeners[event][listener], options);\n        }\n        listeners[event][listener] = _handler;\n        element.listeners = listeners;\n      }\n      element.addEventListener(event, _handler, options);\n    });\n  }\n\n  /**\n   * Dispatch event on the target element.\n   * @param {Element} element - The event target.\n   * @param {string} type - The event type(s).\n   * @param {Object} data - The additional event data.\n   * @returns {boolean} Indicate if the event is default prevented or not.\n   */\n  function dispatchEvent(element, type, data) {\n    var event;\n\n    // Event and CustomEvent on IE9-11 are global objects, not constructors\n    if (isFunction(Event) && isFunction(CustomEvent)) {\n      event = new CustomEvent(type, {\n        detail: data,\n        bubbles: true,\n        cancelable: true\n      });\n    } else {\n      event = document.createEvent('CustomEvent');\n      event.initCustomEvent(type, true, true, data);\n    }\n    return element.dispatchEvent(event);\n  }\n\n  /**\n   * Get the offset base on the document.\n   * @param {Element} element - The target element.\n   * @returns {Object} The offset data.\n   */\n  function getOffset(element) {\n    var box = element.getBoundingClientRect();\n    return {\n      left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n      top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n    };\n  }\n  var location = WINDOW.location;\n  var REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\n\n  /**\n   * Check if the given URL is a cross origin URL.\n   * @param {string} url - The target URL.\n   * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`.\n   */\n  function isCrossOriginURL(url) {\n    var parts = url.match(REGEXP_ORIGINS);\n    return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);\n  }\n\n  /**\n   * Add timestamp to the given URL.\n   * @param {string} url - The target URL.\n   * @returns {string} The result URL.\n   */\n  function addTimestamp(url) {\n    var timestamp = \"timestamp=\".concat(new Date().getTime());\n    return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\n  }\n\n  /**\n   * Get transforms base on the given object.\n   * @param {Object} obj - The target object.\n   * @returns {string} A string contains transform values.\n   */\n  function getTransforms(_ref) {\n    var rotate = _ref.rotate,\n      scaleX = _ref.scaleX,\n      scaleY = _ref.scaleY,\n      translateX = _ref.translateX,\n      translateY = _ref.translateY;\n    var values = [];\n    if (isNumber(translateX) && translateX !== 0) {\n      values.push(\"translateX(\".concat(translateX, \"px)\"));\n    }\n    if (isNumber(translateY) && translateY !== 0) {\n      values.push(\"translateY(\".concat(translateY, \"px)\"));\n    }\n\n    // Rotate should come first before scale to match orientation transform\n    if (isNumber(rotate) && rotate !== 0) {\n      values.push(\"rotate(\".concat(rotate, \"deg)\"));\n    }\n    if (isNumber(scaleX) && scaleX !== 1) {\n      values.push(\"scaleX(\".concat(scaleX, \")\"));\n    }\n    if (isNumber(scaleY) && scaleY !== 1) {\n      values.push(\"scaleY(\".concat(scaleY, \")\"));\n    }\n    var transform = values.length ? values.join(' ') : 'none';\n    return {\n      WebkitTransform: transform,\n      msTransform: transform,\n      transform: transform\n    };\n  }\n\n  /**\n   * Get the max ratio of a group of pointers.\n   * @param {string} pointers - The target pointers.\n   * @returns {number} The result ratio.\n   */\n  function getMaxZoomRatio(pointers) {\n    var pointers2 = _objectSpread2({}, pointers);\n    var maxRatio = 0;\n    forEach(pointers, function (pointer, pointerId) {\n      delete pointers2[pointerId];\n      forEach(pointers2, function (pointer2) {\n        var x1 = Math.abs(pointer.startX - pointer2.startX);\n        var y1 = Math.abs(pointer.startY - pointer2.startY);\n        var x2 = Math.abs(pointer.endX - pointer2.endX);\n        var y2 = Math.abs(pointer.endY - pointer2.endY);\n        var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n        var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n        var ratio = (z2 - z1) / z1;\n        if (Math.abs(ratio) > Math.abs(maxRatio)) {\n          maxRatio = ratio;\n        }\n      });\n    });\n    return maxRatio;\n  }\n\n  /**\n   * Get a pointer from an event object.\n   * @param {Object} event - The target event object.\n   * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n   * @returns {Object} The result pointer contains start and/or end point coordinates.\n   */\n  function getPointer(_ref2, endOnly) {\n    var pageX = _ref2.pageX,\n      pageY = _ref2.pageY;\n    var end = {\n      endX: pageX,\n      endY: pageY\n    };\n    return endOnly ? end : _objectSpread2({\n      startX: pageX,\n      startY: pageY\n    }, end);\n  }\n\n  /**\n   * Get the center point coordinate of a group of pointers.\n   * @param {Object} pointers - The target pointers.\n   * @returns {Object} The center point coordinate.\n   */\n  function getPointersCenter(pointers) {\n    var pageX = 0;\n    var pageY = 0;\n    var count = 0;\n    forEach(pointers, function (_ref3) {\n      var startX = _ref3.startX,\n        startY = _ref3.startY;\n      pageX += startX;\n      pageY += startY;\n      count += 1;\n    });\n    pageX /= count;\n    pageY /= count;\n    return {\n      pageX: pageX,\n      pageY: pageY\n    };\n  }\n\n  /**\n   * Get the max sizes in a rectangle under the given aspect ratio.\n   * @param {Object} data - The original sizes.\n   * @param {string} [type='contain'] - The adjust type.\n   * @returns {Object} The result sizes.\n   */\n  function getAdjustedSizes(_ref4) {\n    var aspectRatio = _ref4.aspectRatio,\n      height = _ref4.height,\n      width = _ref4.width;\n    var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain';\n    var isValidWidth = isPositiveNumber(width);\n    var isValidHeight = isPositiveNumber(height);\n    if (isValidWidth && isValidHeight) {\n      var adjustedWidth = height * aspectRatio;\n      if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n        height = width / aspectRatio;\n      } else {\n        width = height * aspectRatio;\n      }\n    } else if (isValidWidth) {\n      height = width / aspectRatio;\n    } else if (isValidHeight) {\n      width = height * aspectRatio;\n    }\n    return {\n      width: width,\n      height: height\n    };\n  }\n\n  /**\n   * Get the new sizes of a rectangle after rotated.\n   * @param {Object} data - The original sizes.\n   * @returns {Object} The result sizes.\n   */\n  function getRotatedSizes(_ref5) {\n    var width = _ref5.width,\n      height = _ref5.height,\n      degree = _ref5.degree;\n    degree = Math.abs(degree) % 180;\n    if (degree === 90) {\n      return {\n        width: height,\n        height: width\n      };\n    }\n    var arc = degree % 90 * Math.PI / 180;\n    var sinArc = Math.sin(arc);\n    var cosArc = Math.cos(arc);\n    var newWidth = width * cosArc + height * sinArc;\n    var newHeight = width * sinArc + height * cosArc;\n    return degree > 90 ? {\n      width: newHeight,\n      height: newWidth\n    } : {\n      width: newWidth,\n      height: newHeight\n    };\n  }\n\n  /**\n   * Get a canvas which drew the given image.\n   * @param {HTMLImageElement} image - The image for drawing.\n   * @param {Object} imageData - The image data.\n   * @param {Object} canvasData - The canvas data.\n   * @param {Object} options - The options.\n   * @returns {HTMLCanvasElement} The result canvas.\n   */\n  function getSourceCanvas(image, _ref6, _ref7, _ref8) {\n    var imageAspectRatio = _ref6.aspectRatio,\n      imageNaturalWidth = _ref6.naturalWidth,\n      imageNaturalHeight = _ref6.naturalHeight,\n      _ref6$rotate = _ref6.rotate,\n      rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate,\n      _ref6$scaleX = _ref6.scaleX,\n      scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX,\n      _ref6$scaleY = _ref6.scaleY,\n      scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY;\n    var aspectRatio = _ref7.aspectRatio,\n      naturalWidth = _ref7.naturalWidth,\n      naturalHeight = _ref7.naturalHeight;\n    var _ref8$fillColor = _ref8.fillColor,\n      fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor,\n      _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled,\n      imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE,\n      _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality,\n      imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ,\n      _ref8$maxWidth = _ref8.maxWidth,\n      maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth,\n      _ref8$maxHeight = _ref8.maxHeight,\n      maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight,\n      _ref8$minWidth = _ref8.minWidth,\n      minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth,\n      _ref8$minHeight = _ref8.minHeight,\n      minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight;\n    var canvas = document.createElement('canvas');\n    var context = canvas.getContext('2d');\n    var maxSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var minSizes = getAdjustedSizes({\n      aspectRatio: aspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth));\n    var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight));\n\n    // Note: should always use image's natural sizes for drawing as\n    // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n    var destMaxSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: maxWidth,\n      height: maxHeight\n    });\n    var destMinSizes = getAdjustedSizes({\n      aspectRatio: imageAspectRatio,\n      width: minWidth,\n      height: minHeight\n    }, 'cover');\n    var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth));\n    var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight));\n    var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight];\n    canvas.width = normalizeDecimalNumber(width);\n    canvas.height = normalizeDecimalNumber(height);\n    context.fillStyle = fillColor;\n    context.fillRect(0, 0, width, height);\n    context.save();\n    context.translate(width / 2, height / 2);\n    context.rotate(rotate * Math.PI / 180);\n    context.scale(scaleX, scaleY);\n    context.imageSmoothingEnabled = imageSmoothingEnabled;\n    context.imageSmoothingQuality = imageSmoothingQuality;\n    context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) {\n      return Math.floor(normalizeDecimalNumber(param));\n    }))));\n    context.restore();\n    return canvas;\n  }\n  var fromCharCode = String.fromCharCode;\n\n  /**\n   * Get string from char code in data view.\n   * @param {DataView} dataView - The data view for read.\n   * @param {number} start - The start index.\n   * @param {number} length - The read length.\n   * @returns {string} The read result.\n   */\n  function getStringFromCharCode(dataView, start, length) {\n    var str = '';\n    length += start;\n    for (var i = start; i < length; i += 1) {\n      str += fromCharCode(dataView.getUint8(i));\n    }\n    return str;\n  }\n  var REGEXP_DATA_URL_HEAD = /^data:.*,/;\n\n  /**\n   * Transform Data URL to array buffer.\n   * @param {string} dataURL - The Data URL to transform.\n   * @returns {ArrayBuffer} The result array buffer.\n   */\n  function dataURLToArrayBuffer(dataURL) {\n    var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, '');\n    var binary = atob(base64);\n    var arrayBuffer = new ArrayBuffer(binary.length);\n    var uint8 = new Uint8Array(arrayBuffer);\n    forEach(uint8, function (value, i) {\n      uint8[i] = binary.charCodeAt(i);\n    });\n    return arrayBuffer;\n  }\n\n  /**\n   * Transform array buffer to Data URL.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n   * @param {string} mimeType - The mime type of the Data URL.\n   * @returns {string} The result Data URL.\n   */\n  function arrayBufferToDataURL(arrayBuffer, mimeType) {\n    var chunks = [];\n\n    // Chunk Typed Array for better performance (#435)\n    var chunkSize = 8192;\n    var uint8 = new Uint8Array(arrayBuffer);\n    while (uint8.length > 0) {\n      // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n      // eslint-disable-next-line prefer-spread\n      chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n      uint8 = uint8.subarray(chunkSize);\n    }\n    return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n  }\n\n  /**\n   * Get orientation value from given array buffer.\n   * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n   * @returns {number} The read orientation value.\n   */\n  function resetAndGetOrientation(arrayBuffer) {\n    var dataView = new DataView(arrayBuffer);\n    var orientation;\n\n    // Ignores range error when the image does not have correct Exif information\n    try {\n      var littleEndian;\n      var app1Start;\n      var ifdStart;\n\n      // Only handle JPEG image (start by 0xFFD8)\n      if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n        var length = dataView.byteLength;\n        var offset = 2;\n        while (offset + 1 < length) {\n          if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n            app1Start = offset;\n            break;\n          }\n          offset += 1;\n        }\n      }\n      if (app1Start) {\n        var exifIDCode = app1Start + 4;\n        var tiffOffset = app1Start + 10;\n        if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n          var endianness = dataView.getUint16(tiffOffset);\n          littleEndian = endianness === 0x4949;\n          if (littleEndian || endianness === 0x4D4D /* bigEndian */) {\n            if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n              var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n              if (firstIFDOffset >= 0x00000008) {\n                ifdStart = tiffOffset + firstIFDOffset;\n              }\n            }\n          }\n        }\n      }\n      if (ifdStart) {\n        var _length = dataView.getUint16(ifdStart, littleEndian);\n        var _offset;\n        var i;\n        for (i = 0; i < _length; i += 1) {\n          _offset = ifdStart + i * 12 + 2;\n          if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) {\n            // 8 is the offset of the current tag's value\n            _offset += 8;\n\n            // Get the original orientation value\n            orientation = dataView.getUint16(_offset, littleEndian);\n\n            // Override the orientation with its default value\n            dataView.setUint16(_offset, 1, littleEndian);\n            break;\n          }\n        }\n      }\n    } catch (error) {\n      orientation = 1;\n    }\n    return orientation;\n  }\n\n  /**\n   * Parse Exif Orientation value.\n   * @param {number} orientation - The orientation to parse.\n   * @returns {Object} The parsed result.\n   */\n  function parseOrientation(orientation) {\n    var rotate = 0;\n    var scaleX = 1;\n    var scaleY = 1;\n    switch (orientation) {\n      // Flip horizontal\n      case 2:\n        scaleX = -1;\n        break;\n\n      // Rotate left 180\u00B0\n      case 3:\n        rotate = -180;\n        break;\n\n      // Flip vertical\n      case 4:\n        scaleY = -1;\n        break;\n\n      // Flip vertical and rotate right 90\u00B0\n      case 5:\n        rotate = 90;\n        scaleY = -1;\n        break;\n\n      // Rotate right 90\u00B0\n      case 6:\n        rotate = 90;\n        break;\n\n      // Flip horizontal and rotate right 90\u00B0\n      case 7:\n        rotate = 90;\n        scaleX = -1;\n        break;\n\n      // Rotate left 90\u00B0\n      case 8:\n        rotate = -90;\n        break;\n    }\n    return {\n      rotate: rotate,\n      scaleX: scaleX,\n      scaleY: scaleY\n    };\n  }\n\n  var render = {\n    render: function render() {\n      this.initContainer();\n      this.initCanvas();\n      this.initCropBox();\n      this.renderCanvas();\n      if (this.cropped) {\n        this.renderCropBox();\n      }\n    },\n    initContainer: function initContainer() {\n      var element = this.element,\n        options = this.options,\n        container = this.container,\n        cropper = this.cropper;\n      var minWidth = Number(options.minContainerWidth);\n      var minHeight = Number(options.minContainerHeight);\n      addClass(cropper, CLASS_HIDDEN);\n      removeClass(element, CLASS_HIDDEN);\n      var containerData = {\n        width: Math.max(container.offsetWidth, minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH),\n        height: Math.max(container.offsetHeight, minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT)\n      };\n      this.containerData = containerData;\n      setStyle(cropper, {\n        width: containerData.width,\n        height: containerData.height\n      });\n      addClass(element, CLASS_HIDDEN);\n      removeClass(cropper, CLASS_HIDDEN);\n    },\n    // Canvas (image wrapper)\n    initCanvas: function initCanvas() {\n      var containerData = this.containerData,\n        imageData = this.imageData;\n      var viewMode = this.options.viewMode;\n      var rotated = Math.abs(imageData.rotate) % 180 === 90;\n      var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth;\n      var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight;\n      var aspectRatio = naturalWidth / naturalHeight;\n      var canvasWidth = containerData.width;\n      var canvasHeight = containerData.height;\n      if (containerData.height * aspectRatio > containerData.width) {\n        if (viewMode === 3) {\n          canvasWidth = containerData.height * aspectRatio;\n        } else {\n          canvasHeight = containerData.width / aspectRatio;\n        }\n      } else if (viewMode === 3) {\n        canvasHeight = containerData.width / aspectRatio;\n      } else {\n        canvasWidth = containerData.height * aspectRatio;\n      }\n      var canvasData = {\n        aspectRatio: aspectRatio,\n        naturalWidth: naturalWidth,\n        naturalHeight: naturalHeight,\n        width: canvasWidth,\n        height: canvasHeight\n      };\n      this.canvasData = canvasData;\n      this.limited = viewMode === 1 || viewMode === 2;\n      this.limitCanvas(true, true);\n      canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n      canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n      canvasData.left = (containerData.width - canvasData.width) / 2;\n      canvasData.top = (containerData.height - canvasData.height) / 2;\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      this.initialCanvasData = assign({}, canvasData);\n    },\n    limitCanvas: function limitCanvas(sizeLimited, positionLimited) {\n      var options = this.options,\n        containerData = this.containerData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData;\n      var viewMode = options.viewMode;\n      var aspectRatio = canvasData.aspectRatio;\n      var cropped = this.cropped && cropBoxData;\n      if (sizeLimited) {\n        var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n        var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n        if (viewMode > 1) {\n          minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n          minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n          if (viewMode === 3) {\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        } else if (viewMode > 0) {\n          if (minCanvasWidth) {\n            minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0);\n          } else if (minCanvasHeight) {\n            minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0);\n          } else if (cropped) {\n            minCanvasWidth = cropBoxData.width;\n            minCanvasHeight = cropBoxData.height;\n            if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n              minCanvasWidth = minCanvasHeight * aspectRatio;\n            } else {\n              minCanvasHeight = minCanvasWidth / aspectRatio;\n            }\n          }\n        }\n        var _getAdjustedSizes = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: minCanvasWidth,\n          height: minCanvasHeight\n        });\n        minCanvasWidth = _getAdjustedSizes.width;\n        minCanvasHeight = _getAdjustedSizes.height;\n        canvasData.minWidth = minCanvasWidth;\n        canvasData.minHeight = minCanvasHeight;\n        canvasData.maxWidth = Infinity;\n        canvasData.maxHeight = Infinity;\n      }\n      if (positionLimited) {\n        if (viewMode > (cropped ? 0 : 1)) {\n          var newCanvasLeft = containerData.width - canvasData.width;\n          var newCanvasTop = containerData.height - canvasData.height;\n          canvasData.minLeft = Math.min(0, newCanvasLeft);\n          canvasData.minTop = Math.min(0, newCanvasTop);\n          canvasData.maxLeft = Math.max(0, newCanvasLeft);\n          canvasData.maxTop = Math.max(0, newCanvasTop);\n          if (cropped && this.limited) {\n            canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width));\n            canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height));\n            canvasData.maxLeft = cropBoxData.left;\n            canvasData.maxTop = cropBoxData.top;\n            if (viewMode === 2) {\n              if (canvasData.width >= containerData.width) {\n                canvasData.minLeft = Math.min(0, newCanvasLeft);\n                canvasData.maxLeft = Math.max(0, newCanvasLeft);\n              }\n              if (canvasData.height >= containerData.height) {\n                canvasData.minTop = Math.min(0, newCanvasTop);\n                canvasData.maxTop = Math.max(0, newCanvasTop);\n              }\n            }\n          }\n        } else {\n          canvasData.minLeft = -canvasData.width;\n          canvasData.minTop = -canvasData.height;\n          canvasData.maxLeft = containerData.width;\n          canvasData.maxTop = containerData.height;\n        }\n      }\n    },\n    renderCanvas: function renderCanvas(changed, transformed) {\n      var canvasData = this.canvasData,\n        imageData = this.imageData;\n      if (transformed) {\n        var _getRotatedSizes = getRotatedSizes({\n            width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1),\n            height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1),\n            degree: imageData.rotate || 0\n          }),\n          naturalWidth = _getRotatedSizes.width,\n          naturalHeight = _getRotatedSizes.height;\n        var width = canvasData.width * (naturalWidth / canvasData.naturalWidth);\n        var height = canvasData.height * (naturalHeight / canvasData.naturalHeight);\n        canvasData.left -= (width - canvasData.width) / 2;\n        canvasData.top -= (height - canvasData.height) / 2;\n        canvasData.width = width;\n        canvasData.height = height;\n        canvasData.aspectRatio = naturalWidth / naturalHeight;\n        canvasData.naturalWidth = naturalWidth;\n        canvasData.naturalHeight = naturalHeight;\n        this.limitCanvas(true, false);\n      }\n      if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n        canvasData.left = canvasData.oldLeft;\n      }\n      if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n        canvasData.top = canvasData.oldTop;\n      }\n      canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n      canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n      this.limitCanvas(false, true);\n      canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft);\n      canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop);\n      canvasData.oldLeft = canvasData.left;\n      canvasData.oldTop = canvasData.top;\n      setStyle(this.canvas, assign({\n        width: canvasData.width,\n        height: canvasData.height\n      }, getTransforms({\n        translateX: canvasData.left,\n        translateY: canvasData.top\n      })));\n      this.renderImage(changed);\n      if (this.cropped && this.limited) {\n        this.limitCropBox(true, true);\n      }\n    },\n    renderImage: function renderImage(changed) {\n      var canvasData = this.canvasData,\n        imageData = this.imageData;\n      var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth);\n      var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight);\n      assign(imageData, {\n        width: width,\n        height: height,\n        left: (canvasData.width - width) / 2,\n        top: (canvasData.height - height) / 2\n      });\n      setStyle(this.image, assign({\n        width: imageData.width,\n        height: imageData.height\n      }, getTransforms(assign({\n        translateX: imageData.left,\n        translateY: imageData.top\n      }, imageData))));\n      if (changed) {\n        this.output();\n      }\n    },\n    initCropBox: function initCropBox() {\n      var options = this.options,\n        canvasData = this.canvasData;\n      var aspectRatio = options.aspectRatio || options.initialAspectRatio;\n      var autoCropArea = Number(options.autoCropArea) || 0.8;\n      var cropBoxData = {\n        width: canvasData.width,\n        height: canvasData.height\n      };\n      if (aspectRatio) {\n        if (canvasData.height * aspectRatio > canvasData.width) {\n          cropBoxData.height = cropBoxData.width / aspectRatio;\n        } else {\n          cropBoxData.width = cropBoxData.height * aspectRatio;\n        }\n      }\n      this.cropBoxData = cropBoxData;\n      this.limitCropBox(true, true);\n\n      // Initialize auto crop area\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n\n      // The width/height of auto crop area must large than \"minWidth/Height\"\n      cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea);\n      cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea);\n      cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2;\n      cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2;\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n      this.initialCropBoxData = assign({}, cropBoxData);\n    },\n    limitCropBox: function limitCropBox(sizeLimited, positionLimited) {\n      var options = this.options,\n        containerData = this.containerData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData,\n        limited = this.limited;\n      var aspectRatio = options.aspectRatio;\n      if (sizeLimited) {\n        var minCropBoxWidth = Number(options.minCropBoxWidth) || 0;\n        var minCropBoxHeight = Number(options.minCropBoxHeight) || 0;\n        var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width;\n        var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height;\n\n        // The min/maxCropBoxWidth/Height must be less than container's width/height\n        minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n        minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n        if (aspectRatio) {\n          if (minCropBoxWidth && minCropBoxHeight) {\n            if (minCropBoxHeight * aspectRatio > minCropBoxWidth) {\n              minCropBoxHeight = minCropBoxWidth / aspectRatio;\n            } else {\n              minCropBoxWidth = minCropBoxHeight * aspectRatio;\n            }\n          } else if (minCropBoxWidth) {\n            minCropBoxHeight = minCropBoxWidth / aspectRatio;\n          } else if (minCropBoxHeight) {\n            minCropBoxWidth = minCropBoxHeight * aspectRatio;\n          }\n          if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n            maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n          } else {\n            maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n          }\n        }\n\n        // The minWidth/Height must be less than maxWidth/Height\n        cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n        cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n        cropBoxData.maxWidth = maxCropBoxWidth;\n        cropBoxData.maxHeight = maxCropBoxHeight;\n      }\n      if (positionLimited) {\n        if (limited) {\n          cropBoxData.minLeft = Math.max(0, canvasData.left);\n          cropBoxData.minTop = Math.max(0, canvasData.top);\n          cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width;\n          cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height;\n        } else {\n          cropBoxData.minLeft = 0;\n          cropBoxData.minTop = 0;\n          cropBoxData.maxLeft = containerData.width - cropBoxData.width;\n          cropBoxData.maxTop = containerData.height - cropBoxData.height;\n        }\n      }\n    },\n    renderCropBox: function renderCropBox() {\n      var options = this.options,\n        containerData = this.containerData,\n        cropBoxData = this.cropBoxData;\n      if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n        cropBoxData.left = cropBoxData.oldLeft;\n      }\n      if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n        cropBoxData.top = cropBoxData.oldTop;\n      }\n      cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n      cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n      this.limitCropBox(false, true);\n      cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft);\n      cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop);\n      cropBoxData.oldLeft = cropBoxData.left;\n      cropBoxData.oldTop = cropBoxData.top;\n      if (options.movable && options.cropBoxMovable) {\n        // Turn to move the canvas when the crop box is equal to the container\n        setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL);\n      }\n      setStyle(this.cropBox, assign({\n        width: cropBoxData.width,\n        height: cropBoxData.height\n      }, getTransforms({\n        translateX: cropBoxData.left,\n        translateY: cropBoxData.top\n      })));\n      if (this.cropped && this.limited) {\n        this.limitCanvas(true, true);\n      }\n      if (!this.disabled) {\n        this.output();\n      }\n    },\n    output: function output() {\n      this.preview();\n      dispatchEvent(this.element, EVENT_CROP, this.getData());\n    }\n  };\n\n  var preview = {\n    initPreview: function initPreview() {\n      var element = this.element,\n        crossOrigin = this.crossOrigin;\n      var preview = this.options.preview;\n      var url = crossOrigin ? this.crossOriginUrl : this.url;\n      var alt = element.alt || 'The image to preview';\n      var image = document.createElement('img');\n      if (crossOrigin) {\n        image.crossOrigin = crossOrigin;\n      }\n      image.src = url;\n      image.alt = alt;\n      this.viewBox.appendChild(image);\n      this.viewBoxImage = image;\n      if (!preview) {\n        return;\n      }\n      var previews = preview;\n      if (typeof preview === 'string') {\n        previews = element.ownerDocument.querySelectorAll(preview);\n      } else if (preview.querySelector) {\n        previews = [preview];\n      }\n      this.previews = previews;\n      forEach(previews, function (el) {\n        var img = document.createElement('img');\n\n        // Save the original size for recover\n        setData(el, DATA_PREVIEW, {\n          width: el.offsetWidth,\n          height: el.offsetHeight,\n          html: el.innerHTML\n        });\n        if (crossOrigin) {\n          img.crossOrigin = crossOrigin;\n        }\n        img.src = url;\n        img.alt = alt;\n\n        /**\n         * Override img element styles\n         * Add `display:block` to avoid margin top issue\n         * Add `height:auto` to override `height` attribute on IE8\n         * (Occur only when margin-top <= -height)\n         */\n        img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;\"';\n        el.innerHTML = '';\n        el.appendChild(img);\n      });\n    },\n    resetPreview: function resetPreview() {\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        setStyle(element, {\n          width: data.width,\n          height: data.height\n        });\n        element.innerHTML = data.html;\n        removeData(element, DATA_PREVIEW);\n      });\n    },\n    preview: function preview() {\n      var imageData = this.imageData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData;\n      var cropBoxWidth = cropBoxData.width,\n        cropBoxHeight = cropBoxData.height;\n      var width = imageData.width,\n        height = imageData.height;\n      var left = cropBoxData.left - canvasData.left - imageData.left;\n      var top = cropBoxData.top - canvasData.top - imageData.top;\n      if (!this.cropped || this.disabled) {\n        return;\n      }\n      setStyle(this.viewBoxImage, assign({\n        width: width,\n        height: height\n      }, getTransforms(assign({\n        translateX: -left,\n        translateY: -top\n      }, imageData))));\n      forEach(this.previews, function (element) {\n        var data = getData(element, DATA_PREVIEW);\n        var originalWidth = data.width;\n        var originalHeight = data.height;\n        var newWidth = originalWidth;\n        var newHeight = originalHeight;\n        var ratio = 1;\n        if (cropBoxWidth) {\n          ratio = originalWidth / cropBoxWidth;\n          newHeight = cropBoxHeight * ratio;\n        }\n        if (cropBoxHeight && newHeight > originalHeight) {\n          ratio = originalHeight / cropBoxHeight;\n          newWidth = cropBoxWidth * ratio;\n          newHeight = originalHeight;\n        }\n        setStyle(element, {\n          width: newWidth,\n          height: newHeight\n        });\n        setStyle(element.getElementsByTagName('img')[0], assign({\n          width: width * ratio,\n          height: height * ratio\n        }, getTransforms(assign({\n          translateX: -left * ratio,\n          translateY: -top * ratio\n        }, imageData))));\n      });\n    }\n  };\n\n  var events = {\n    bind: function bind() {\n      var element = this.element,\n        options = this.options,\n        cropper = this.cropper;\n      if (isFunction(options.cropstart)) {\n        addListener(element, EVENT_CROP_START, options.cropstart);\n      }\n      if (isFunction(options.cropmove)) {\n        addListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n      if (isFunction(options.cropend)) {\n        addListener(element, EVENT_CROP_END, options.cropend);\n      }\n      if (isFunction(options.crop)) {\n        addListener(element, EVENT_CROP, options.crop);\n      }\n      if (isFunction(options.zoom)) {\n        addListener(element, EVENT_ZOOM, options.zoom);\n      }\n      addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n      if (options.zoomable && options.zoomOnWheel) {\n        addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n          passive: false,\n          capture: true\n        });\n      }\n      if (options.toggleDragModeOnDblclick) {\n        addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n      }\n      addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this));\n      addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this));\n      if (options.responsive) {\n        addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n      }\n    },\n    unbind: function unbind() {\n      var element = this.element,\n        options = this.options,\n        cropper = this.cropper;\n      if (isFunction(options.cropstart)) {\n        removeListener(element, EVENT_CROP_START, options.cropstart);\n      }\n      if (isFunction(options.cropmove)) {\n        removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n      }\n      if (isFunction(options.cropend)) {\n        removeListener(element, EVENT_CROP_END, options.cropend);\n      }\n      if (isFunction(options.crop)) {\n        removeListener(element, EVENT_CROP, options.crop);\n      }\n      if (isFunction(options.zoom)) {\n        removeListener(element, EVENT_ZOOM, options.zoom);\n      }\n      removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n      if (options.zoomable && options.zoomOnWheel) {\n        removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n          passive: false,\n          capture: true\n        });\n      }\n      if (options.toggleDragModeOnDblclick) {\n        removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n      }\n      removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n      removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n      if (options.responsive) {\n        removeListener(window, EVENT_RESIZE, this.onResize);\n      }\n    }\n  };\n\n  var handlers = {\n    resize: function resize() {\n      if (this.disabled) {\n        return;\n      }\n      var options = this.options,\n        container = this.container,\n        containerData = this.containerData;\n      var ratioX = container.offsetWidth / containerData.width;\n      var ratioY = container.offsetHeight / containerData.height;\n      var ratio = Math.abs(ratioX - 1) > Math.abs(ratioY - 1) ? ratioX : ratioY;\n\n      // Resize when width changed or height changed\n      if (ratio !== 1) {\n        var canvasData;\n        var cropBoxData;\n        if (options.restore) {\n          canvasData = this.getCanvasData();\n          cropBoxData = this.getCropBoxData();\n        }\n        this.render();\n        if (options.restore) {\n          this.setCanvasData(forEach(canvasData, function (n, i) {\n            canvasData[i] = n * ratio;\n          }));\n          this.setCropBoxData(forEach(cropBoxData, function (n, i) {\n            cropBoxData[i] = n * ratio;\n          }));\n        }\n      }\n    },\n    dblclick: function dblclick() {\n      if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {\n        return;\n      }\n      this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);\n    },\n    wheel: function wheel(event) {\n      var _this = this;\n      var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n      var delta = 1;\n      if (this.disabled) {\n        return;\n      }\n      event.preventDefault();\n\n      // Limit wheel speed to prevent zoom too fast (#21)\n      if (this.wheeling) {\n        return;\n      }\n      this.wheeling = true;\n      setTimeout(function () {\n        _this.wheeling = false;\n      }, 50);\n      if (event.deltaY) {\n        delta = event.deltaY > 0 ? 1 : -1;\n      } else if (event.wheelDelta) {\n        delta = -event.wheelDelta / 120;\n      } else if (event.detail) {\n        delta = event.detail > 0 ? 1 : -1;\n      }\n      this.zoom(-delta * ratio, event);\n    },\n    cropStart: function cropStart(event) {\n      var buttons = event.buttons,\n        button = event.button;\n      if (this.disabled\n\n      // Handle mouse event and pointer event and ignore touch event\n      || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && (\n      // No primary button (Usually the left button)\n      isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0\n\n      // Open context menu\n      || event.ctrlKey)) {\n        return;\n      }\n      var options = this.options,\n        pointers = this.pointers;\n      var action;\n      if (event.changedTouches) {\n        // Handle touch event\n        forEach(event.changedTouches, function (touch) {\n          pointers[touch.identifier] = getPointer(touch);\n        });\n      } else {\n        // Handle mouse event and pointer event\n        pointers[event.pointerId || 0] = getPointer(event);\n      }\n      if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {\n        action = ACTION_ZOOM;\n      } else {\n        action = getData(event.target, DATA_ACTION);\n      }\n      if (!REGEXP_ACTIONS.test(action)) {\n        return;\n      }\n      if (dispatchEvent(this.element, EVENT_CROP_START, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      }\n\n      // This line is required for preventing page zooming in iOS browsers\n      event.preventDefault();\n      this.action = action;\n      this.cropping = false;\n      if (action === ACTION_CROP) {\n        this.cropping = true;\n        addClass(this.dragBox, CLASS_MODAL);\n      }\n    },\n    cropMove: function cropMove(event) {\n      var action = this.action;\n      if (this.disabled || !action) {\n        return;\n      }\n      var pointers = this.pointers;\n      event.preventDefault();\n      if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n        originalEvent: event,\n        action: action\n      }) === false) {\n        return;\n      }\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          // The first parameter should not be undefined (#432)\n          assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n        });\n      } else {\n        assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n      }\n      this.change(event);\n    },\n    cropEnd: function cropEnd(event) {\n      if (this.disabled) {\n        return;\n      }\n      var action = this.action,\n        pointers = this.pointers;\n      if (event.changedTouches) {\n        forEach(event.changedTouches, function (touch) {\n          delete pointers[touch.identifier];\n        });\n      } else {\n        delete pointers[event.pointerId || 0];\n      }\n      if (!action) {\n        return;\n      }\n      event.preventDefault();\n      if (!Object.keys(pointers).length) {\n        this.action = '';\n      }\n      if (this.cropping) {\n        this.cropping = false;\n        toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n      }\n      dispatchEvent(this.element, EVENT_CROP_END, {\n        originalEvent: event,\n        action: action\n      });\n    }\n  };\n\n  var change = {\n    change: function change(event) {\n      var options = this.options,\n        canvasData = this.canvasData,\n        containerData = this.containerData,\n        cropBoxData = this.cropBoxData,\n        pointers = this.pointers;\n      var action = this.action;\n      var aspectRatio = options.aspectRatio;\n      var left = cropBoxData.left,\n        top = cropBoxData.top,\n        width = cropBoxData.width,\n        height = cropBoxData.height;\n      var right = left + width;\n      var bottom = top + height;\n      var minLeft = 0;\n      var minTop = 0;\n      var maxWidth = containerData.width;\n      var maxHeight = containerData.height;\n      var renderable = true;\n      var offset;\n\n      // Locking aspect ratio in \"free mode\" by holding shift key\n      if (!aspectRatio && event.shiftKey) {\n        aspectRatio = width && height ? width / height : 1;\n      }\n      if (this.limited) {\n        minLeft = cropBoxData.minLeft;\n        minTop = cropBoxData.minTop;\n        maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width);\n        maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height);\n      }\n      var pointer = pointers[Object.keys(pointers)[0]];\n      var range = {\n        x: pointer.endX - pointer.startX,\n        y: pointer.endY - pointer.startY\n      };\n      var check = function check(side) {\n        switch (side) {\n          case ACTION_EAST:\n            if (right + range.x > maxWidth) {\n              range.x = maxWidth - right;\n            }\n            break;\n          case ACTION_WEST:\n            if (left + range.x < minLeft) {\n              range.x = minLeft - left;\n            }\n            break;\n          case ACTION_NORTH:\n            if (top + range.y < minTop) {\n              range.y = minTop - top;\n            }\n            break;\n          case ACTION_SOUTH:\n            if (bottom + range.y > maxHeight) {\n              range.y = maxHeight - bottom;\n            }\n            break;\n        }\n      };\n      switch (action) {\n        // Move crop box\n        case ACTION_ALL:\n          left += range.x;\n          top += range.y;\n          break;\n\n        // Resize crop box\n        case ACTION_EAST:\n          if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_EAST);\n          width += range.x;\n          if (width < 0) {\n            action = ACTION_WEST;\n            width = -width;\n            left -= width;\n          }\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n          break;\n        case ACTION_NORTH:\n          if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_NORTH);\n          height -= range.y;\n          top += range.y;\n          if (height < 0) {\n            action = ACTION_SOUTH;\n            height = -height;\n            top -= height;\n          }\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n          break;\n        case ACTION_WEST:\n          if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_WEST);\n          width -= range.x;\n          left += range.x;\n          if (width < 0) {\n            action = ACTION_EAST;\n            width = -width;\n            left -= width;\n          }\n          if (aspectRatio) {\n            height = width / aspectRatio;\n            top += (cropBoxData.height - height) / 2;\n          }\n          break;\n        case ACTION_SOUTH:\n          if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n            renderable = false;\n            break;\n          }\n          check(ACTION_SOUTH);\n          height += range.y;\n          if (height < 0) {\n            action = ACTION_NORTH;\n            height = -height;\n            top -= height;\n          }\n          if (aspectRatio) {\n            width = height * aspectRatio;\n            left += (cropBoxData.width - width) / 2;\n          }\n          break;\n        case ACTION_NORTH_EAST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_EAST);\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            top -= height;\n          }\n          break;\n        case ACTION_NORTH_WEST:\n          if (aspectRatio) {\n            if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_NORTH);\n            height -= range.y;\n            top += range.y;\n            width = height * aspectRatio;\n            left += cropBoxData.width - width;\n          } else {\n            check(ACTION_NORTH);\n            check(ACTION_WEST);\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y <= 0 && top <= minTop) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n            if (range.y <= 0) {\n              if (top > minTop) {\n                height -= range.y;\n                top += range.y;\n              }\n            } else {\n              height -= range.y;\n              top += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_SOUTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_NORTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_SOUTH_WEST;\n            height = -height;\n            top -= height;\n          }\n          break;\n        case ACTION_SOUTH_WEST:\n          if (aspectRatio) {\n            if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_WEST);\n            width -= range.x;\n            left += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_WEST);\n            if (range.x <= 0) {\n              if (left > minLeft) {\n                width -= range.x;\n                left += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width -= range.x;\n              left += range.x;\n            }\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_EAST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            top -= height;\n          }\n          break;\n        case ACTION_SOUTH_EAST:\n          if (aspectRatio) {\n            if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n              renderable = false;\n              break;\n            }\n            check(ACTION_EAST);\n            width += range.x;\n            height = width / aspectRatio;\n          } else {\n            check(ACTION_SOUTH);\n            check(ACTION_EAST);\n            if (range.x >= 0) {\n              if (right < maxWidth) {\n                width += range.x;\n              } else if (range.y >= 0 && bottom >= maxHeight) {\n                renderable = false;\n              }\n            } else {\n              width += range.x;\n            }\n            if (range.y >= 0) {\n              if (bottom < maxHeight) {\n                height += range.y;\n              }\n            } else {\n              height += range.y;\n            }\n          }\n          if (width < 0 && height < 0) {\n            action = ACTION_NORTH_WEST;\n            height = -height;\n            width = -width;\n            top -= height;\n            left -= width;\n          } else if (width < 0) {\n            action = ACTION_SOUTH_WEST;\n            width = -width;\n            left -= width;\n          } else if (height < 0) {\n            action = ACTION_NORTH_EAST;\n            height = -height;\n            top -= height;\n          }\n          break;\n\n        // Move canvas\n        case ACTION_MOVE:\n          this.move(range.x, range.y);\n          renderable = false;\n          break;\n\n        // Zoom canvas\n        case ACTION_ZOOM:\n          this.zoom(getMaxZoomRatio(pointers), event);\n          renderable = false;\n          break;\n\n        // Create crop box\n        case ACTION_CROP:\n          if (!range.x || !range.y) {\n            renderable = false;\n            break;\n          }\n          offset = getOffset(this.cropper);\n          left = pointer.startX - offset.left;\n          top = pointer.startY - offset.top;\n          width = cropBoxData.minWidth;\n          height = cropBoxData.minHeight;\n          if (range.x > 0) {\n            action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST;\n          } else if (range.x < 0) {\n            left -= width;\n            action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST;\n          }\n          if (range.y < 0) {\n            top -= height;\n          }\n\n          // Show the crop box if is hidden\n          if (!this.cropped) {\n            removeClass(this.cropBox, CLASS_HIDDEN);\n            this.cropped = true;\n            if (this.limited) {\n              this.limitCropBox(true, true);\n            }\n          }\n          break;\n      }\n      if (renderable) {\n        cropBoxData.width = width;\n        cropBoxData.height = height;\n        cropBoxData.left = left;\n        cropBoxData.top = top;\n        this.action = action;\n        this.renderCropBox();\n      }\n\n      // Override\n      forEach(pointers, function (p) {\n        p.startX = p.endX;\n        p.startY = p.endY;\n      });\n    }\n  };\n\n  var methods = {\n    // Show the crop box manually\n    crop: function crop() {\n      if (this.ready && !this.cropped && !this.disabled) {\n        this.cropped = true;\n        this.limitCropBox(true, true);\n        if (this.options.modal) {\n          addClass(this.dragBox, CLASS_MODAL);\n        }\n        removeClass(this.cropBox, CLASS_HIDDEN);\n        this.setCropBoxData(this.initialCropBoxData);\n      }\n      return this;\n    },\n    // Reset the image and crop box to their initial states\n    reset: function reset() {\n      if (this.ready && !this.disabled) {\n        this.imageData = assign({}, this.initialImageData);\n        this.canvasData = assign({}, this.initialCanvasData);\n        this.cropBoxData = assign({}, this.initialCropBoxData);\n        this.renderCanvas();\n        if (this.cropped) {\n          this.renderCropBox();\n        }\n      }\n      return this;\n    },\n    // Clear the crop box\n    clear: function clear() {\n      if (this.cropped && !this.disabled) {\n        assign(this.cropBoxData, {\n          left: 0,\n          top: 0,\n          width: 0,\n          height: 0\n        });\n        this.cropped = false;\n        this.renderCropBox();\n        this.limitCanvas(true, true);\n\n        // Render canvas after crop box rendered\n        this.renderCanvas();\n        removeClass(this.dragBox, CLASS_MODAL);\n        addClass(this.cropBox, CLASS_HIDDEN);\n      }\n      return this;\n    },\n    /**\n     * Replace the image's src and rebuild the cropper\n     * @param {string} url - The new URL.\n     * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one.\n     * @returns {Cropper} this\n     */\n    replace: function replace(url) {\n      var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      if (!this.disabled && url) {\n        if (this.isImg) {\n          this.element.src = url;\n        }\n        if (hasSameSize) {\n          this.url = url;\n          this.image.src = url;\n          if (this.ready) {\n            this.viewBoxImage.src = url;\n            forEach(this.previews, function (element) {\n              element.getElementsByTagName('img')[0].src = url;\n            });\n          }\n        } else {\n          if (this.isImg) {\n            this.replaced = true;\n          }\n          this.options.data = null;\n          this.uncreate();\n          this.load(url);\n        }\n      }\n      return this;\n    },\n    // Enable (unfreeze) the cropper\n    enable: function enable() {\n      if (this.ready && this.disabled) {\n        this.disabled = false;\n        removeClass(this.cropper, CLASS_DISABLED);\n      }\n      return this;\n    },\n    // Disable (freeze) the cropper\n    disable: function disable() {\n      if (this.ready && !this.disabled) {\n        this.disabled = true;\n        addClass(this.cropper, CLASS_DISABLED);\n      }\n      return this;\n    },\n    /**\n     * Destroy the cropper and remove the instance from the image\n     * @returns {Cropper} this\n     */\n    destroy: function destroy() {\n      var element = this.element;\n      if (!element[NAMESPACE]) {\n        return this;\n      }\n      element[NAMESPACE] = undefined;\n      if (this.isImg && this.replaced) {\n        element.src = this.originalUrl;\n      }\n      this.uncreate();\n      return this;\n    },\n    /**\n     * Move the canvas with relative offsets\n     * @param {number} offsetX - The relative offset distance on the x-axis.\n     * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis.\n     * @returns {Cropper} this\n     */\n    move: function move(offsetX) {\n      var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX;\n      var _this$canvasData = this.canvasData,\n        left = _this$canvasData.left,\n        top = _this$canvasData.top;\n      return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY));\n    },\n    /**\n     * Move the canvas to an absolute point\n     * @param {number} x - The x-axis coordinate.\n     * @param {number} [y=x] - The y-axis coordinate.\n     * @returns {Cropper} this\n     */\n    moveTo: function moveTo(x) {\n      var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n      var canvasData = this.canvasData;\n      var changed = false;\n      x = Number(x);\n      y = Number(y);\n      if (this.ready && !this.disabled && this.options.movable) {\n        if (isNumber(x)) {\n          canvasData.left = x;\n          changed = true;\n        }\n        if (isNumber(y)) {\n          canvasData.top = y;\n          changed = true;\n        }\n        if (changed) {\n          this.renderCanvas(true);\n        }\n      }\n      return this;\n    },\n    /**\n     * Zoom the canvas with a relative ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoom: function zoom(ratio, _originalEvent) {\n      var canvasData = this.canvasData;\n      ratio = Number(ratio);\n      if (ratio < 0) {\n        ratio = 1 / (1 - ratio);\n      } else {\n        ratio = 1 + ratio;\n      }\n      return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n    },\n    /**\n     * Zoom the canvas to an absolute ratio\n     * @param {number} ratio - The target ratio.\n     * @param {Object} pivot - The zoom pivot point coordinate.\n     * @param {Event} _originalEvent - The original event if any.\n     * @returns {Cropper} this\n     */\n    zoomTo: function zoomTo(ratio, pivot, _originalEvent) {\n      var options = this.options,\n        canvasData = this.canvasData;\n      var width = canvasData.width,\n        height = canvasData.height,\n        naturalWidth = canvasData.naturalWidth,\n        naturalHeight = canvasData.naturalHeight;\n      ratio = Number(ratio);\n      if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n        var newWidth = naturalWidth * ratio;\n        var newHeight = naturalHeight * ratio;\n        if (dispatchEvent(this.element, EVENT_ZOOM, {\n          ratio: ratio,\n          oldRatio: width / naturalWidth,\n          originalEvent: _originalEvent\n        }) === false) {\n          return this;\n        }\n        if (_originalEvent) {\n          var pointers = this.pointers;\n          var offset = getOffset(this.cropper);\n          var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : {\n            pageX: _originalEvent.pageX,\n            pageY: _originalEvent.pageY\n          };\n\n          // Zoom from the triggering point of the event\n          canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height);\n        } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n          canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width);\n          canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height);\n        } else {\n          // Zoom from the center of the canvas\n          canvasData.left -= (newWidth - width) / 2;\n          canvasData.top -= (newHeight - height) / 2;\n        }\n        canvasData.width = newWidth;\n        canvasData.height = newHeight;\n        this.renderCanvas(true);\n      }\n      return this;\n    },\n    /**\n     * Rotate the canvas with a relative degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotate: function rotate(degree) {\n      return this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n    },\n    /**\n     * Rotate the canvas to an absolute degree\n     * @param {number} degree - The rotate degree.\n     * @returns {Cropper} this\n     */\n    rotateTo: function rotateTo(degree) {\n      degree = Number(degree);\n      if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n        this.imageData.rotate = degree % 360;\n        this.renderCanvas(true, true);\n      }\n      return this;\n    },\n    /**\n     * Scale the image on the x-axis.\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @returns {Cropper} this\n     */\n    scaleX: function scaleX(_scaleX) {\n      var scaleY = this.imageData.scaleY;\n      return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1);\n    },\n    /**\n     * Scale the image on the y-axis.\n     * @param {number} scaleY - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scaleY: function scaleY(_scaleY) {\n      var scaleX = this.imageData.scaleX;\n      return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY);\n    },\n    /**\n     * Scale the image\n     * @param {number} scaleX - The scale ratio on the x-axis.\n     * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n     * @returns {Cropper} this\n     */\n    scale: function scale(scaleX) {\n      var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n      var imageData = this.imageData;\n      var transformed = false;\n      scaleX = Number(scaleX);\n      scaleY = Number(scaleY);\n      if (this.ready && !this.disabled && this.options.scalable) {\n        if (isNumber(scaleX)) {\n          imageData.scaleX = scaleX;\n          transformed = true;\n        }\n        if (isNumber(scaleY)) {\n          imageData.scaleY = scaleY;\n          transformed = true;\n        }\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n      }\n      return this;\n    },\n    /**\n     * Get the cropped area position and size data (base on the original image)\n     * @param {boolean} [rounded=false] - Indicate if round the data values or not.\n     * @returns {Object} The result cropped data.\n     */\n    getData: function getData() {\n      var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var options = this.options,\n        imageData = this.imageData,\n        canvasData = this.canvasData,\n        cropBoxData = this.cropBoxData;\n      var data;\n      if (this.ready && this.cropped) {\n        data = {\n          x: cropBoxData.left - canvasData.left,\n          y: cropBoxData.top - canvasData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n        var ratio = imageData.width / imageData.naturalWidth;\n        forEach(data, function (n, i) {\n          data[i] = n / ratio;\n        });\n        if (rounded) {\n          // In case rounding off leads to extra 1px in right or bottom border\n          // we should round the top-left corner and the dimension (#343).\n          var bottom = Math.round(data.y + data.height);\n          var right = Math.round(data.x + data.width);\n          data.x = Math.round(data.x);\n          data.y = Math.round(data.y);\n          data.width = right - data.x;\n          data.height = bottom - data.y;\n        }\n      } else {\n        data = {\n          x: 0,\n          y: 0,\n          width: 0,\n          height: 0\n        };\n      }\n      if (options.rotatable) {\n        data.rotate = imageData.rotate || 0;\n      }\n      if (options.scalable) {\n        data.scaleX = imageData.scaleX || 1;\n        data.scaleY = imageData.scaleY || 1;\n      }\n      return data;\n    },\n    /**\n     * Set the cropped area position and size with new data\n     * @param {Object} data - The new data.\n     * @returns {Cropper} this\n     */\n    setData: function setData(data) {\n      var options = this.options,\n        imageData = this.imageData,\n        canvasData = this.canvasData;\n      var cropBoxData = {};\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        var transformed = false;\n        if (options.rotatable) {\n          if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n            imageData.rotate = data.rotate;\n            transformed = true;\n          }\n        }\n        if (options.scalable) {\n          if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) {\n            imageData.scaleX = data.scaleX;\n            transformed = true;\n          }\n          if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n            imageData.scaleY = data.scaleY;\n            transformed = true;\n          }\n        }\n        if (transformed) {\n          this.renderCanvas(true, true);\n        }\n        var ratio = imageData.width / imageData.naturalWidth;\n        if (isNumber(data.x)) {\n          cropBoxData.left = data.x * ratio + canvasData.left;\n        }\n        if (isNumber(data.y)) {\n          cropBoxData.top = data.y * ratio + canvasData.top;\n        }\n        if (isNumber(data.width)) {\n          cropBoxData.width = data.width * ratio;\n        }\n        if (isNumber(data.height)) {\n          cropBoxData.height = data.height * ratio;\n        }\n        this.setCropBoxData(cropBoxData);\n      }\n      return this;\n    },\n    /**\n     * Get the container size data.\n     * @returns {Object} The result container data.\n     */\n    getContainerData: function getContainerData() {\n      return this.ready ? assign({}, this.containerData) : {};\n    },\n    /**\n     * Get the image position and size data.\n     * @returns {Object} The result image data.\n     */\n    getImageData: function getImageData() {\n      return this.sized ? assign({}, this.imageData) : {};\n    },\n    /**\n     * Get the canvas position and size data.\n     * @returns {Object} The result canvas data.\n     */\n    getCanvasData: function getCanvasData() {\n      var canvasData = this.canvasData;\n      var data = {};\n      if (this.ready) {\n        forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n          data[n] = canvasData[n];\n        });\n      }\n      return data;\n    },\n    /**\n     * Set the canvas position and size with new data.\n     * @param {Object} data - The new canvas data.\n     * @returns {Cropper} this\n     */\n    setCanvasData: function setCanvasData(data) {\n      var canvasData = this.canvasData;\n      var aspectRatio = canvasData.aspectRatio;\n      if (this.ready && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          canvasData.left = data.left;\n        }\n        if (isNumber(data.top)) {\n          canvasData.top = data.top;\n        }\n        if (isNumber(data.width)) {\n          canvasData.width = data.width;\n          canvasData.height = data.width / aspectRatio;\n        } else if (isNumber(data.height)) {\n          canvasData.height = data.height;\n          canvasData.width = data.height * aspectRatio;\n        }\n        this.renderCanvas(true);\n      }\n      return this;\n    },\n    /**\n     * Get the crop box position and size data.\n     * @returns {Object} The result crop box data.\n     */\n    getCropBoxData: function getCropBoxData() {\n      var cropBoxData = this.cropBoxData;\n      var data;\n      if (this.ready && this.cropped) {\n        data = {\n          left: cropBoxData.left,\n          top: cropBoxData.top,\n          width: cropBoxData.width,\n          height: cropBoxData.height\n        };\n      }\n      return data || {};\n    },\n    /**\n     * Set the crop box position and size with new data.\n     * @param {Object} data - The new crop box data.\n     * @returns {Cropper} this\n     */\n    setCropBoxData: function setCropBoxData(data) {\n      var cropBoxData = this.cropBoxData;\n      var aspectRatio = this.options.aspectRatio;\n      var widthChanged;\n      var heightChanged;\n      if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n        if (isNumber(data.left)) {\n          cropBoxData.left = data.left;\n        }\n        if (isNumber(data.top)) {\n          cropBoxData.top = data.top;\n        }\n        if (isNumber(data.width) && data.width !== cropBoxData.width) {\n          widthChanged = true;\n          cropBoxData.width = data.width;\n        }\n        if (isNumber(data.height) && data.height !== cropBoxData.height) {\n          heightChanged = true;\n          cropBoxData.height = data.height;\n        }\n        if (aspectRatio) {\n          if (widthChanged) {\n            cropBoxData.height = cropBoxData.width / aspectRatio;\n          } else if (heightChanged) {\n            cropBoxData.width = cropBoxData.height * aspectRatio;\n          }\n        }\n        this.renderCropBox();\n      }\n      return this;\n    },\n    /**\n     * Get a canvas drawn the cropped image.\n     * @param {Object} [options={}] - The config options.\n     * @returns {HTMLCanvasElement} - The result canvas.\n     */\n    getCroppedCanvas: function getCroppedCanvas() {\n      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      if (!this.ready || !window.HTMLCanvasElement) {\n        return null;\n      }\n      var canvasData = this.canvasData;\n      var source = getSourceCanvas(this.image, this.imageData, canvasData, options);\n\n      // Returns the source canvas if it is not cropped.\n      if (!this.cropped) {\n        return source;\n      }\n      var _this$getData = this.getData(options.rounded),\n        initialX = _this$getData.x,\n        initialY = _this$getData.y,\n        initialWidth = _this$getData.width,\n        initialHeight = _this$getData.height;\n      var ratio = source.width / Math.floor(canvasData.naturalWidth);\n      if (ratio !== 1) {\n        initialX *= ratio;\n        initialY *= ratio;\n        initialWidth *= ratio;\n        initialHeight *= ratio;\n      }\n      var aspectRatio = initialWidth / initialHeight;\n      var maxSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.maxWidth || Infinity,\n        height: options.maxHeight || Infinity\n      });\n      var minSizes = getAdjustedSizes({\n        aspectRatio: aspectRatio,\n        width: options.minWidth || 0,\n        height: options.minHeight || 0\n      }, 'cover');\n      var _getAdjustedSizes = getAdjustedSizes({\n          aspectRatio: aspectRatio,\n          width: options.width || (ratio !== 1 ? source.width : initialWidth),\n          height: options.height || (ratio !== 1 ? source.height : initialHeight)\n        }),\n        width = _getAdjustedSizes.width,\n        height = _getAdjustedSizes.height;\n      width = Math.min(maxSizes.width, Math.max(minSizes.width, width));\n      height = Math.min(maxSizes.height, Math.max(minSizes.height, height));\n      var canvas = document.createElement('canvas');\n      var context = canvas.getContext('2d');\n      canvas.width = normalizeDecimalNumber(width);\n      canvas.height = normalizeDecimalNumber(height);\n      context.fillStyle = options.fillColor || 'transparent';\n      context.fillRect(0, 0, width, height);\n      var _options$imageSmoothi = options.imageSmoothingEnabled,\n        imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi,\n        imageSmoothingQuality = options.imageSmoothingQuality;\n      context.imageSmoothingEnabled = imageSmoothingEnabled;\n      if (imageSmoothingQuality) {\n        context.imageSmoothingQuality = imageSmoothingQuality;\n      }\n\n      // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n      var sourceWidth = source.width;\n      var sourceHeight = source.height;\n\n      // Source canvas parameters\n      var srcX = initialX;\n      var srcY = initialY;\n      var srcWidth;\n      var srcHeight;\n\n      // Destination canvas parameters\n      var dstX;\n      var dstY;\n      var dstWidth;\n      var dstHeight;\n      if (srcX <= -initialWidth || srcX > sourceWidth) {\n        srcX = 0;\n        srcWidth = 0;\n        dstX = 0;\n        dstWidth = 0;\n      } else if (srcX <= 0) {\n        dstX = -srcX;\n        srcX = 0;\n        srcWidth = Math.min(sourceWidth, initialWidth + srcX);\n        dstWidth = srcWidth;\n      } else if (srcX <= sourceWidth) {\n        dstX = 0;\n        srcWidth = Math.min(initialWidth, sourceWidth - srcX);\n        dstWidth = srcWidth;\n      }\n      if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) {\n        srcY = 0;\n        srcHeight = 0;\n        dstY = 0;\n        dstHeight = 0;\n      } else if (srcY <= 0) {\n        dstY = -srcY;\n        srcY = 0;\n        srcHeight = Math.min(sourceHeight, initialHeight + srcY);\n        dstHeight = srcHeight;\n      } else if (srcY <= sourceHeight) {\n        dstY = 0;\n        srcHeight = Math.min(initialHeight, sourceHeight - srcY);\n        dstHeight = srcHeight;\n      }\n      var params = [srcX, srcY, srcWidth, srcHeight];\n\n      // Avoid \"IndexSizeError\"\n      if (dstWidth > 0 && dstHeight > 0) {\n        var scale = width / initialWidth;\n        params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n      }\n\n      // All the numerical parameters should be integer for `drawImage`\n      // https://github.com/fengyuanchen/cropper/issues/476\n      context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) {\n        return Math.floor(normalizeDecimalNumber(param));\n      }))));\n      return canvas;\n    },\n    /**\n     * Change the aspect ratio of the crop box.\n     * @param {number} aspectRatio - The new aspect ratio.\n     * @returns {Cropper} this\n     */\n    setAspectRatio: function setAspectRatio(aspectRatio) {\n      var options = this.options;\n      if (!this.disabled && !isUndefined(aspectRatio)) {\n        // 0 -> NaN\n        options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n        if (this.ready) {\n          this.initCropBox();\n          if (this.cropped) {\n            this.renderCropBox();\n          }\n        }\n      }\n      return this;\n    },\n    /**\n     * Change the drag mode.\n     * @param {string} mode - The new drag mode.\n     * @returns {Cropper} this\n     */\n    setDragMode: function setDragMode(mode) {\n      var options = this.options,\n        dragBox = this.dragBox,\n        face = this.face;\n      if (this.ready && !this.disabled) {\n        var croppable = mode === DRAG_MODE_CROP;\n        var movable = options.movable && mode === DRAG_MODE_MOVE;\n        mode = croppable || movable ? mode : DRAG_MODE_NONE;\n        options.dragMode = mode;\n        setData(dragBox, DATA_ACTION, mode);\n        toggleClass(dragBox, CLASS_CROP, croppable);\n        toggleClass(dragBox, CLASS_MOVE, movable);\n        if (!options.cropBoxMovable) {\n          // Sync drag mode to crop box when it is not movable\n          setData(face, DATA_ACTION, mode);\n          toggleClass(face, CLASS_CROP, croppable);\n          toggleClass(face, CLASS_MOVE, movable);\n        }\n      }\n      return this;\n    }\n  };\n\n  var AnotherCropper = WINDOW.Cropper;\n  var Cropper = /*#__PURE__*/function () {\n    /**\n     * Create a new Cropper.\n     * @param {Element} element - The target element for cropping.\n     * @param {Object} [options={}] - The configuration options.\n     */\n    function Cropper(element) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      _classCallCheck(this, Cropper);\n      if (!element || !REGEXP_TAG_NAME.test(element.tagName)) {\n        throw new Error('The first argument is required and must be an <img> or <canvas> element.');\n      }\n      this.element = element;\n      this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n      this.cropped = false;\n      this.disabled = false;\n      this.pointers = {};\n      this.ready = false;\n      this.reloading = false;\n      this.replaced = false;\n      this.sized = false;\n      this.sizing = false;\n      this.init();\n    }\n    return _createClass(Cropper, [{\n      key: \"init\",\n      value: function init() {\n        var element = this.element;\n        var tagName = element.tagName.toLowerCase();\n        var url;\n        if (element[NAMESPACE]) {\n          return;\n        }\n        element[NAMESPACE] = this;\n        if (tagName === 'img') {\n          this.isImg = true;\n\n          // e.g.: \"img/picture.jpg\"\n          url = element.getAttribute('src') || '';\n          this.originalUrl = url;\n\n          // Stop when it's a blank image\n          if (!url) {\n            return;\n          }\n\n          // e.g.: \"https://example.com/img/picture.jpg\"\n          url = element.src;\n        } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n          url = element.toDataURL();\n        }\n        this.load(url);\n      }\n    }, {\n      key: \"load\",\n      value: function load(url) {\n        var _this = this;\n        if (!url) {\n          return;\n        }\n        this.url = url;\n        this.imageData = {};\n        var element = this.element,\n          options = this.options;\n        if (!options.rotatable && !options.scalable) {\n          options.checkOrientation = false;\n        }\n\n        // Only IE10+ supports Typed Arrays\n        if (!options.checkOrientation || !window.ArrayBuffer) {\n          this.clone();\n          return;\n        }\n\n        // Detect the mime type of the image directly if it is a Data URL\n        if (REGEXP_DATA_URL.test(url)) {\n          // Read ArrayBuffer from Data URL of JPEG images directly for better performance\n          if (REGEXP_DATA_URL_JPEG.test(url)) {\n            this.read(dataURLToArrayBuffer(url));\n          } else {\n            // Only a JPEG image may contains Exif Orientation information,\n            // the rest types of Data URLs are not necessary to check orientation at all.\n            this.clone();\n          }\n          return;\n        }\n\n        // 1. Detect the mime type of the image by a XMLHttpRequest.\n        // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image.\n        var xhr = new XMLHttpRequest();\n        var clone = this.clone.bind(this);\n        this.reloading = true;\n        this.xhr = xhr;\n\n        // 1. Cross origin requests are only supported for protocol schemes:\n        // http, https, data, chrome, chrome-extension.\n        // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy\n        // in some browsers as IE11 and Safari.\n        xhr.onabort = clone;\n        xhr.onerror = clone;\n        xhr.ontimeout = clone;\n        xhr.onprogress = function () {\n          // Abort the request directly if it not a JPEG image for better performance\n          if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n            xhr.abort();\n          }\n        };\n        xhr.onload = function () {\n          _this.read(xhr.response);\n        };\n        xhr.onloadend = function () {\n          _this.reloading = false;\n          _this.xhr = null;\n        };\n\n        // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n        if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n          url = addTimestamp(url);\n        }\n\n        // The third parameter is required for avoiding side-effect (#682)\n        xhr.open('GET', url, true);\n        xhr.responseType = 'arraybuffer';\n        xhr.withCredentials = element.crossOrigin === 'use-credentials';\n        xhr.send();\n      }\n    }, {\n      key: \"read\",\n      value: function read(arrayBuffer) {\n        var options = this.options,\n          imageData = this.imageData;\n\n        // Reset the orientation value to its default value 1\n        // as some iOS browsers will render image with its orientation\n        var orientation = resetAndGetOrientation(arrayBuffer);\n        var rotate = 0;\n        var scaleX = 1;\n        var scaleY = 1;\n        if (orientation > 1) {\n          // Generate a new URL which has the default orientation value\n          this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n          var _parseOrientation = parseOrientation(orientation);\n          rotate = _parseOrientation.rotate;\n          scaleX = _parseOrientation.scaleX;\n          scaleY = _parseOrientation.scaleY;\n        }\n        if (options.rotatable) {\n          imageData.rotate = rotate;\n        }\n        if (options.scalable) {\n          imageData.scaleX = scaleX;\n          imageData.scaleY = scaleY;\n        }\n        this.clone();\n      }\n    }, {\n      key: \"clone\",\n      value: function clone() {\n        var element = this.element,\n          url = this.url;\n        var crossOrigin = element.crossOrigin;\n        var crossOriginUrl = url;\n        if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n          if (!crossOrigin) {\n            crossOrigin = 'anonymous';\n          }\n\n          // Bust cache when there is not a \"crossOrigin\" property (#519)\n          crossOriginUrl = addTimestamp(url);\n        }\n        this.crossOrigin = crossOrigin;\n        this.crossOriginUrl = crossOriginUrl;\n        var image = document.createElement('img');\n        if (crossOrigin) {\n          image.crossOrigin = crossOrigin;\n        }\n        image.src = crossOriginUrl || url;\n        image.alt = element.alt || 'The image to crop';\n        this.image = image;\n        image.onload = this.start.bind(this);\n        image.onerror = this.stop.bind(this);\n        addClass(image, CLASS_HIDE);\n        element.parentNode.insertBefore(image, element.nextSibling);\n      }\n    }, {\n      key: \"start\",\n      value: function start() {\n        var _this2 = this;\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        this.sizing = true;\n\n        // Match all browsers that use WebKit as the layout engine in iOS devices,\n        // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n        var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent);\n        var done = function done(naturalWidth, naturalHeight) {\n          assign(_this2.imageData, {\n            naturalWidth: naturalWidth,\n            naturalHeight: naturalHeight,\n            aspectRatio: naturalWidth / naturalHeight\n          });\n          _this2.initialImageData = assign({}, _this2.imageData);\n          _this2.sizing = false;\n          _this2.sized = true;\n          _this2.build();\n        };\n\n        // Most modern browsers (excepts iOS WebKit)\n        if (image.naturalWidth && !isIOSWebKit) {\n          done(image.naturalWidth, image.naturalHeight);\n          return;\n        }\n        var sizingImage = document.createElement('img');\n        var body = document.body || document.documentElement;\n        this.sizingImage = sizingImage;\n        sizingImage.onload = function () {\n          done(sizingImage.width, sizingImage.height);\n          if (!isIOSWebKit) {\n            body.removeChild(sizingImage);\n          }\n        };\n        sizingImage.src = image.src;\n\n        // iOS WebKit will convert the image automatically\n        // with its orientation once append it into DOM (#279)\n        if (!isIOSWebKit) {\n          sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n          body.appendChild(sizingImage);\n        }\n      }\n    }, {\n      key: \"stop\",\n      value: function stop() {\n        var image = this.image;\n        image.onload = null;\n        image.onerror = null;\n        image.parentNode.removeChild(image);\n        this.image = null;\n      }\n    }, {\n      key: \"build\",\n      value: function build() {\n        if (!this.sized || this.ready) {\n          return;\n        }\n        var element = this.element,\n          options = this.options,\n          image = this.image;\n\n        // Create cropper elements\n        var container = element.parentNode;\n        var template = document.createElement('div');\n        template.innerHTML = TEMPLATE;\n        var cropper = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n        var canvas = cropper.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n        var dragBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-drag-box\"));\n        var cropBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-crop-box\"));\n        var face = cropBox.querySelector(\".\".concat(NAMESPACE, \"-face\"));\n        this.container = container;\n        this.cropper = cropper;\n        this.canvas = canvas;\n        this.dragBox = dragBox;\n        this.cropBox = cropBox;\n        this.viewBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-view-box\"));\n        this.face = face;\n        canvas.appendChild(image);\n\n        // Hide the original image\n        addClass(element, CLASS_HIDDEN);\n\n        // Inserts the cropper after to the current image\n        container.insertBefore(cropper, element.nextSibling);\n\n        // Show the hidden image\n        removeClass(image, CLASS_HIDE);\n        this.initPreview();\n        this.bind();\n        options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN;\n        options.aspectRatio = Math.max(0, options.aspectRatio) || NaN;\n        options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0;\n        addClass(cropBox, CLASS_HIDDEN);\n        if (!options.guides) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n        }\n        if (!options.center) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n        }\n        if (options.background) {\n          addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n        }\n        if (!options.highlight) {\n          addClass(face, CLASS_INVISIBLE);\n        }\n        if (options.cropBoxMovable) {\n          addClass(face, CLASS_MOVE);\n          setData(face, DATA_ACTION, ACTION_ALL);\n        }\n        if (!options.cropBoxResizable) {\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-line\")), CLASS_HIDDEN);\n          addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-point\")), CLASS_HIDDEN);\n        }\n        this.render();\n        this.ready = true;\n        this.setDragMode(options.dragMode);\n        if (options.autoCrop) {\n          this.crop();\n        }\n        this.setData(options.data);\n        if (isFunction(options.ready)) {\n          addListener(element, EVENT_READY, options.ready, {\n            once: true\n          });\n        }\n        dispatchEvent(element, EVENT_READY);\n      }\n    }, {\n      key: \"unbuild\",\n      value: function unbuild() {\n        if (!this.ready) {\n          return;\n        }\n        this.ready = false;\n        this.unbind();\n        this.resetPreview();\n        var parentNode = this.cropper.parentNode;\n        if (parentNode) {\n          parentNode.removeChild(this.cropper);\n        }\n        removeClass(this.element, CLASS_HIDDEN);\n      }\n    }, {\n      key: \"uncreate\",\n      value: function uncreate() {\n        if (this.ready) {\n          this.unbuild();\n          this.ready = false;\n          this.cropped = false;\n        } else if (this.sizing) {\n          this.sizingImage.onload = null;\n          this.sizing = false;\n          this.sized = false;\n        } else if (this.reloading) {\n          this.xhr.onabort = null;\n          this.xhr.abort();\n        } else if (this.image) {\n          this.stop();\n        }\n      }\n\n      /**\n       * Get the no conflict cropper class.\n       * @returns {Cropper} The cropper class.\n       */\n    }], [{\n      key: \"noConflict\",\n      value: function noConflict() {\n        window.Cropper = AnotherCropper;\n        return Cropper;\n      }\n\n      /**\n       * Change the default options.\n       * @param {Object} options - The new default options.\n       */\n    }, {\n      key: \"setDefaults\",\n      value: function setDefaults(options) {\n        assign(DEFAULTS, isPlainObject(options) && options);\n      }\n    }]);\n  }();\n  assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\n  return Cropper;\n\n}));\n", "/*\nStimulus 3.2.1\nCopyright \u00A9 2023 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    hasBindings() {\n        return this.unorderedBindings.size > 0;\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()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\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)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\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\n        .split(\":\")\n        .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 namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\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\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\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        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"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        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\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    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\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 (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\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(element, attributeName) {\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\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 SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\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 element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\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\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).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\n        .trim()\n        .split(/\\s+/)\n        .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, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\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    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\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            try {\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            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\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\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\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\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        this.outletObserver = new OutletObserver(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        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\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.outletObserver.stop();\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    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, 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 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) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\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 () {\n            this.a.call(this);\n        };\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 || this.findTarget(targetName) || 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 OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\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(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\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        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : 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    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\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        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\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        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\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    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and 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    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\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        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(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        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\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 OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\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, this.identifier);\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, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\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], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            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(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\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 value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(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    static afterLoad(_identifier, _application) {\n        return;\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 outlets() {\n        return this.scope.outlets;\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 = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n", "const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach((key) => {\n    PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\nexport { PACKET_TYPES, PACKET_TYPES_REVERSE, ERROR_PACKET };\n", "import { PACKET_TYPES } from \"./commons.js\";\nconst withNativeBlob = typeof Blob === \"function\" ||\n    (typeof Blob !== \"undefined\" &&\n        Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = (obj) => {\n    return typeof ArrayBuffer.isView === \"function\"\n        ? ArrayBuffer.isView(obj)\n        : obj && obj.buffer instanceof ArrayBuffer;\n};\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n    if (withNativeBlob && data instanceof Blob) {\n        if (supportsBinary) {\n            return callback(data);\n        }\n        else {\n            return encodeBlobAsBase64(data, callback);\n        }\n    }\n    else if (withNativeArrayBuffer &&\n        (data instanceof ArrayBuffer || isView(data))) {\n        if (supportsBinary) {\n            return callback(data);\n        }\n        else {\n            return encodeBlobAsBase64(new Blob([data]), callback);\n        }\n    }\n    // plain string\n    return callback(PACKET_TYPES[type] + (data || \"\"));\n};\nconst encodeBlobAsBase64 = (data, callback) => {\n    const fileReader = new FileReader();\n    fileReader.onload = function () {\n        const content = fileReader.result.split(\",\")[1];\n        callback(\"b\" + (content || \"\"));\n    };\n    return fileReader.readAsDataURL(data);\n};\nfunction toArray(data) {\n    if (data instanceof Uint8Array) {\n        return data;\n    }\n    else if (data instanceof ArrayBuffer) {\n        return new Uint8Array(data);\n    }\n    else {\n        return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n    }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n    if (withNativeBlob && packet.data instanceof Blob) {\n        return packet.data.arrayBuffer().then(toArray).then(callback);\n    }\n    else if (withNativeArrayBuffer &&\n        (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n        return callback(toArray(packet.data));\n    }\n    encodePacket(packet, false, (encoded) => {\n        if (!TEXT_ENCODER) {\n            TEXT_ENCODER = new TextEncoder();\n        }\n        callback(TEXT_ENCODER.encode(encoded));\n    });\n}\nexport { encodePacket };\n", "// imported from https://github.com/socketio/base64-arraybuffer\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n}\nexport const encode = (arraybuffer) => {\n    let bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n    for (i = 0; i < len; i += 3) {\n        base64 += chars[bytes[i] >> 2];\n        base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n        base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n        base64 += chars[bytes[i + 2] & 63];\n    }\n    if (len % 3 === 2) {\n        base64 = base64.substring(0, base64.length - 1) + '=';\n    }\n    else if (len % 3 === 1) {\n        base64 = base64.substring(0, base64.length - 2) + '==';\n    }\n    return base64;\n};\nexport const decode = (base64) => {\n    let bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n    if (base64[base64.length - 1] === '=') {\n        bufferLength--;\n        if (base64[base64.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n    const arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n    for (i = 0; i < len; i += 4) {\n        encoded1 = lookup[base64.charCodeAt(i)];\n        encoded2 = lookup[base64.charCodeAt(i + 1)];\n        encoded3 = lookup[base64.charCodeAt(i + 2)];\n        encoded4 = lookup[base64.charCodeAt(i + 3)];\n        bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n        bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n        bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n    return arraybuffer;\n};\n", "import { ERROR_PACKET, PACKET_TYPES_REVERSE, } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nexport const decodePacket = (encodedPacket, binaryType) => {\n    if (typeof encodedPacket !== \"string\") {\n        return {\n            type: \"message\",\n            data: mapBinary(encodedPacket, binaryType),\n        };\n    }\n    const type = encodedPacket.charAt(0);\n    if (type === \"b\") {\n        return {\n            type: \"message\",\n            data: decodeBase64Packet(encodedPacket.substring(1), binaryType),\n        };\n    }\n    const packetType = PACKET_TYPES_REVERSE[type];\n    if (!packetType) {\n        return ERROR_PACKET;\n    }\n    return encodedPacket.length > 1\n        ? {\n            type: PACKET_TYPES_REVERSE[type],\n            data: encodedPacket.substring(1),\n        }\n        : {\n            type: PACKET_TYPES_REVERSE[type],\n        };\n};\nconst decodeBase64Packet = (data, binaryType) => {\n    if (withNativeArrayBuffer) {\n        const decoded = decode(data);\n        return mapBinary(decoded, binaryType);\n    }\n    else {\n        return { base64: true, data }; // fallback for old browsers\n    }\n};\nconst mapBinary = (data, binaryType) => {\n    switch (binaryType) {\n        case \"blob\":\n            if (data instanceof Blob) {\n                // from WebSocket + binaryType \"blob\"\n                return data;\n            }\n            else {\n                // from HTTP long-polling or WebTransport\n                return new Blob([data]);\n            }\n        case \"arraybuffer\":\n        default:\n            if (data instanceof ArrayBuffer) {\n                // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n                return data;\n            }\n            else {\n                // from WebTransport (Uint8Array)\n                return data.buffer;\n            }\n    }\n};\n", "import { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nimport { ERROR_PACKET, } from \"./commons.js\";\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\nconst encodePayload = (packets, callback) => {\n    // some packets may be added to the array while encoding, so the initial length must be saved\n    const length = packets.length;\n    const encodedPackets = new Array(length);\n    let count = 0;\n    packets.forEach((packet, i) => {\n        // force base64 encoding for binary packets\n        encodePacket(packet, false, (encodedPacket) => {\n            encodedPackets[i] = encodedPacket;\n            if (++count === length) {\n                callback(encodedPackets.join(SEPARATOR));\n            }\n        });\n    });\n};\nconst decodePayload = (encodedPayload, binaryType) => {\n    const encodedPackets = encodedPayload.split(SEPARATOR);\n    const packets = [];\n    for (let i = 0; i < encodedPackets.length; i++) {\n        const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n        packets.push(decodedPacket);\n        if (decodedPacket.type === \"error\") {\n            break;\n        }\n    }\n    return packets;\n};\nexport function createPacketEncoderStream() {\n    return new TransformStream({\n        transform(packet, controller) {\n            encodePacketToBinary(packet, (encodedPacket) => {\n                const payloadLength = encodedPacket.length;\n                let header;\n                // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length\n                if (payloadLength < 126) {\n                    header = new Uint8Array(1);\n                    new DataView(header.buffer).setUint8(0, payloadLength);\n                }\n                else if (payloadLength < 65536) {\n                    header = new Uint8Array(3);\n                    const view = new DataView(header.buffer);\n                    view.setUint8(0, 126);\n                    view.setUint16(1, payloadLength);\n                }\n                else {\n                    header = new Uint8Array(9);\n                    const view = new DataView(header.buffer);\n                    view.setUint8(0, 127);\n                    view.setBigUint64(1, BigInt(payloadLength));\n                }\n                // first bit indicates whether the payload is plain text (0) or binary (1)\n                if (packet.data && typeof packet.data !== \"string\") {\n                    header[0] |= 0x80;\n                }\n                controller.enqueue(header);\n                controller.enqueue(encodedPacket);\n            });\n        },\n    });\n}\nlet TEXT_DECODER;\nfunction totalLength(chunks) {\n    return chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n}\nfunction concatChunks(chunks, size) {\n    if (chunks[0].length === size) {\n        return chunks.shift();\n    }\n    const buffer = new Uint8Array(size);\n    let j = 0;\n    for (let i = 0; i < size; i++) {\n        buffer[i] = chunks[0][j++];\n        if (j === chunks[0].length) {\n            chunks.shift();\n            j = 0;\n        }\n    }\n    if (chunks.length && j < chunks[0].length) {\n        chunks[0] = chunks[0].slice(j);\n    }\n    return buffer;\n}\nexport function createPacketDecoderStream(maxPayload, binaryType) {\n    if (!TEXT_DECODER) {\n        TEXT_DECODER = new TextDecoder();\n    }\n    const chunks = [];\n    let state = 0 /* State.READ_HEADER */;\n    let expectedLength = -1;\n    let isBinary = false;\n    return new TransformStream({\n        transform(chunk, controller) {\n            chunks.push(chunk);\n            while (true) {\n                if (state === 0 /* State.READ_HEADER */) {\n                    if (totalLength(chunks) < 1) {\n                        break;\n                    }\n                    const header = concatChunks(chunks, 1);\n                    isBinary = (header[0] & 0x80) === 0x80;\n                    expectedLength = header[0] & 0x7f;\n                    if (expectedLength < 126) {\n                        state = 3 /* State.READ_PAYLOAD */;\n                    }\n                    else if (expectedLength === 126) {\n                        state = 1 /* State.READ_EXTENDED_LENGTH_16 */;\n                    }\n                    else {\n                        state = 2 /* State.READ_EXTENDED_LENGTH_64 */;\n                    }\n                }\n                else if (state === 1 /* State.READ_EXTENDED_LENGTH_16 */) {\n                    if (totalLength(chunks) < 2) {\n                        break;\n                    }\n                    const headerArray = concatChunks(chunks, 2);\n                    expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);\n                    state = 3 /* State.READ_PAYLOAD */;\n                }\n                else if (state === 2 /* State.READ_EXTENDED_LENGTH_64 */) {\n                    if (totalLength(chunks) < 8) {\n                        break;\n                    }\n                    const headerArray = concatChunks(chunks, 8);\n                    const view = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length);\n                    const n = view.getUint32(0);\n                    if (n > Math.pow(2, 53 - 32) - 1) {\n                        // the maximum safe integer in JavaScript is 2^53 - 1\n                        controller.enqueue(ERROR_PACKET);\n                        break;\n                    }\n                    expectedLength = n * Math.pow(2, 32) + view.getUint32(4);\n                    state = 3 /* State.READ_PAYLOAD */;\n                }\n                else {\n                    if (totalLength(chunks) < expectedLength) {\n                        break;\n                    }\n                    const data = concatChunks(chunks, expectedLength);\n                    controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));\n                    state = 0 /* State.READ_HEADER */;\n                }\n                if (expectedLength === 0 || expectedLength > maxPayload) {\n                    controller.enqueue(ERROR_PACKET);\n                    break;\n                }\n            }\n        },\n    });\n}\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload, };\n", "/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nexport function Emitter(obj) {\n  if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  function on() {\n    this.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks['$' + event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks['$' + event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n\n  // Remove event specific arrays for event types that no\n  // one is subscribed for to avoid memory leak.\n  if (callbacks.length === 0) {\n    delete this._callbacks['$' + event];\n  }\n\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n\n  var args = new Array(arguments.length - 1)\n    , callbacks = this._callbacks['$' + event];\n\n  for (var i = 1; i < arguments.length; i++) {\n    args[i - 1] = arguments[i];\n  }\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n// alias used for reserved events (protected method)\nEmitter.prototype.emitReserved = Emitter.prototype.emit;\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n", "export const nextTick = (() => {\n    const isPromiseAvailable = typeof Promise === \"function\" && typeof Promise.resolve === \"function\";\n    if (isPromiseAvailable) {\n        return (cb) => Promise.resolve().then(cb);\n    }\n    else {\n        return (cb, setTimeoutFn) => setTimeoutFn(cb, 0);\n    }\n})();\nexport const globalThisShim = (() => {\n    if (typeof self !== \"undefined\") {\n        return self;\n    }\n    else if (typeof window !== \"undefined\") {\n        return window;\n    }\n    else {\n        return Function(\"return this\")();\n    }\n})();\nexport const defaultBinaryType = \"arraybuffer\";\nexport function createCookieJar() { }\n", "import { globalThisShim as globalThis } from \"./globals.node.js\";\nexport function pick(obj, ...attr) {\n    return attr.reduce((acc, k) => {\n        if (obj.hasOwnProperty(k)) {\n            acc[k] = obj[k];\n        }\n        return acc;\n    }, {});\n}\n// Keep a reference to the real timeout functions so they can be used when overridden\nconst NATIVE_SET_TIMEOUT = globalThis.setTimeout;\nconst NATIVE_CLEAR_TIMEOUT = globalThis.clearTimeout;\nexport function installTimerFunctions(obj, opts) {\n    if (opts.useNativeTimers) {\n        obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);\n        obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);\n    }\n    else {\n        obj.setTimeoutFn = globalThis.setTimeout.bind(globalThis);\n        obj.clearTimeoutFn = globalThis.clearTimeout.bind(globalThis);\n    }\n}\n// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)\nconst BASE64_OVERHEAD = 1.33;\n// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9\nexport function byteLength(obj) {\n    if (typeof obj === \"string\") {\n        return utf8Length(obj);\n    }\n    // arraybuffer or blob\n    return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);\n}\nfunction utf8Length(str) {\n    let c = 0, length = 0;\n    for (let i = 0, l = str.length; i < l; i++) {\n        c = str.charCodeAt(i);\n        if (c < 0x80) {\n            length += 1;\n        }\n        else if (c < 0x800) {\n            length += 2;\n        }\n        else if (c < 0xd800 || c >= 0xe000) {\n            length += 3;\n        }\n        else {\n            i++;\n            length += 4;\n        }\n    }\n    return length;\n}\n/**\n * Generates a random 8-characters string.\n */\nexport function randomString() {\n    return (Date.now().toString(36).substring(3) +\n        Math.random().toString(36).substring(2, 5));\n}\n", "// imported from https://github.com/galkn/querystring\n/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\nexport function encode(obj) {\n    let str = '';\n    for (let i in obj) {\n        if (obj.hasOwnProperty(i)) {\n            if (str.length)\n                str += '&';\n            str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n        }\n    }\n    return str;\n}\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\nexport function decode(qs) {\n    let qry = {};\n    let pairs = qs.split('&');\n    for (let i = 0, l = pairs.length; i < l; i++) {\n        let pair = pairs[i].split('=');\n        qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n    }\n    return qry;\n}\n", "import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.js\";\nexport class TransportError extends Error {\n    constructor(reason, description, context) {\n        super(reason);\n        this.description = description;\n        this.context = context;\n        this.type = \"TransportError\";\n    }\n}\nexport class Transport extends Emitter {\n    /**\n     * Transport abstract constructor.\n     *\n     * @param {Object} opts - options\n     * @protected\n     */\n    constructor(opts) {\n        super();\n        this.writable = false;\n        installTimerFunctions(this, opts);\n        this.opts = opts;\n        this.query = opts.query;\n        this.socket = opts.socket;\n        this.supportsBinary = !opts.forceBase64;\n    }\n    /**\n     * Emits an error.\n     *\n     * @param {String} reason\n     * @param description\n     * @param context - the error context\n     * @return {Transport} for chaining\n     * @protected\n     */\n    onError(reason, description, context) {\n        super.emitReserved(\"error\", new TransportError(reason, description, context));\n        return this;\n    }\n    /**\n     * Opens the transport.\n     */\n    open() {\n        this.readyState = \"opening\";\n        this.doOpen();\n        return this;\n    }\n    /**\n     * Closes the transport.\n     */\n    close() {\n        if (this.readyState === \"opening\" || this.readyState === \"open\") {\n            this.doClose();\n            this.onClose();\n        }\n        return this;\n    }\n    /**\n     * Sends multiple packets.\n     *\n     * @param {Array} packets\n     */\n    send(packets) {\n        if (this.readyState === \"open\") {\n            this.write(packets);\n        }\n        else {\n            // this might happen if the transport was silently closed in the beforeunload event handler\n        }\n    }\n    /**\n     * Called upon open\n     *\n     * @protected\n     */\n    onOpen() {\n        this.readyState = \"open\";\n        this.writable = true;\n        super.emitReserved(\"open\");\n    }\n    /**\n     * Called with data.\n     *\n     * @param {String} data\n     * @protected\n     */\n    onData(data) {\n        const packet = decodePacket(data, this.socket.binaryType);\n        this.onPacket(packet);\n    }\n    /**\n     * Called with a decoded packet.\n     *\n     * @protected\n     */\n    onPacket(packet) {\n        super.emitReserved(\"packet\", packet);\n    }\n    /**\n     * Called upon close.\n     *\n     * @protected\n     */\n    onClose(details) {\n        this.readyState = \"closed\";\n        super.emitReserved(\"close\", details);\n    }\n    /**\n     * Pauses the transport, in order not to lose packets during an upgrade.\n     *\n     * @param onPause\n     */\n    pause(onPause) { }\n    createUri(schema, query = {}) {\n        return (schema +\n            \"://\" +\n            this._hostname() +\n            this._port() +\n            this.opts.path +\n            this._query(query));\n    }\n    _hostname() {\n        const hostname = this.opts.hostname;\n        return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n    }\n    _port() {\n        if (this.opts.port &&\n            ((this.opts.secure && Number(this.opts.port) !== 443) ||\n                (!this.opts.secure && Number(this.opts.port) !== 80))) {\n            return \":\" + this.opts.port;\n        }\n        else {\n            return \"\";\n        }\n    }\n    _query(query) {\n        const encodedQuery = encode(query);\n        return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n    }\n}\n", "import { Transport } from \"../transport.js\";\nimport { randomString } from \"../util.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nexport class Polling extends Transport {\n    constructor() {\n        super(...arguments);\n        this._polling = false;\n    }\n    get name() {\n        return \"polling\";\n    }\n    /**\n     * Opens the socket (triggers polling). We write a PING message to determine\n     * when the transport is open.\n     *\n     * @protected\n     */\n    doOpen() {\n        this._poll();\n    }\n    /**\n     * Pauses polling.\n     *\n     * @param {Function} onPause - callback upon buffers are flushed and transport is paused\n     * @package\n     */\n    pause(onPause) {\n        this.readyState = \"pausing\";\n        const pause = () => {\n            this.readyState = \"paused\";\n            onPause();\n        };\n        if (this._polling || !this.writable) {\n            let total = 0;\n            if (this._polling) {\n                total++;\n                this.once(\"pollComplete\", function () {\n                    --total || pause();\n                });\n            }\n            if (!this.writable) {\n                total++;\n                this.once(\"drain\", function () {\n                    --total || pause();\n                });\n            }\n        }\n        else {\n            pause();\n        }\n    }\n    /**\n     * Starts polling cycle.\n     *\n     * @private\n     */\n    _poll() {\n        this._polling = true;\n        this.doPoll();\n        this.emitReserved(\"poll\");\n    }\n    /**\n     * Overloads onData to detect payloads.\n     *\n     * @protected\n     */\n    onData(data) {\n        const callback = (packet) => {\n            // if its the first message we consider the transport open\n            if (\"opening\" === this.readyState && packet.type === \"open\") {\n                this.onOpen();\n            }\n            // if its a close packet, we close the ongoing requests\n            if (\"close\" === packet.type) {\n                this.onClose({ description: \"transport closed by the server\" });\n                return false;\n            }\n            // otherwise bypass onData and handle the message\n            this.onPacket(packet);\n        };\n        // decode payload\n        decodePayload(data, this.socket.binaryType).forEach(callback);\n        // if an event did not trigger closing\n        if (\"closed\" !== this.readyState) {\n            // if we got data we're not polling\n            this._polling = false;\n            this.emitReserved(\"pollComplete\");\n            if (\"open\" === this.readyState) {\n                this._poll();\n            }\n            else {\n            }\n        }\n    }\n    /**\n     * For polling, send a close packet.\n     *\n     * @protected\n     */\n    doClose() {\n        const close = () => {\n            this.write([{ type: \"close\" }]);\n        };\n        if (\"open\" === this.readyState) {\n            close();\n        }\n        else {\n            // in case we're trying to close while\n            // handshaking is in progress (GH-164)\n            this.once(\"open\", close);\n        }\n    }\n    /**\n     * Writes a packets payload.\n     *\n     * @param {Array} packets - data packets\n     * @protected\n     */\n    write(packets) {\n        this.writable = false;\n        encodePayload(packets, (data) => {\n            this.doWrite(data, () => {\n                this.writable = true;\n                this.emitReserved(\"drain\");\n            });\n        });\n    }\n    /**\n     * Generates uri for connection.\n     *\n     * @private\n     */\n    uri() {\n        const schema = this.opts.secure ? \"https\" : \"http\";\n        const query = this.query || {};\n        // cache busting is forced\n        if (false !== this.opts.timestampRequests) {\n            query[this.opts.timestampParam] = randomString();\n        }\n        if (!this.supportsBinary && !query.sid) {\n            query.b64 = 1;\n        }\n        return this.createUri(schema, query);\n    }\n}\n", "// imported from https://github.com/component/has-cors\nlet value = false;\ntry {\n    value = typeof XMLHttpRequest !== 'undefined' &&\n        'withCredentials' in new XMLHttpRequest();\n}\ncatch (err) {\n    // if XMLHttp support is disabled in IE then it will throw\n    // when trying to create\n}\nexport const hasCORS = value;\n", "import { Polling } from \"./polling.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions, pick } from \"../util.js\";\nimport { globalThisShim as globalThis } from \"../globals.node.js\";\nimport { hasCORS } from \"../contrib/has-cors.js\";\nfunction empty() { }\nexport class BaseXHR extends Polling {\n    /**\n     * XHR Polling constructor.\n     *\n     * @param {Object} opts\n     * @package\n     */\n    constructor(opts) {\n        super(opts);\n        if (typeof location !== \"undefined\") {\n            const isSSL = \"https:\" === location.protocol;\n            let port = location.port;\n            // some user agents have empty `location.port`\n            if (!port) {\n                port = isSSL ? \"443\" : \"80\";\n            }\n            this.xd =\n                (typeof location !== \"undefined\" &&\n                    opts.hostname !== location.hostname) ||\n                    port !== opts.port;\n        }\n    }\n    /**\n     * Sends data.\n     *\n     * @param {String} data - data to send.\n     * @param {Function} fn - called upon flush.\n     * @private\n     */\n    doWrite(data, fn) {\n        const req = this.request({\n            method: \"POST\",\n            data: data,\n        });\n        req.on(\"success\", fn);\n        req.on(\"error\", (xhrStatus, context) => {\n            this.onError(\"xhr post error\", xhrStatus, context);\n        });\n    }\n    /**\n     * Starts a poll cycle.\n     *\n     * @private\n     */\n    doPoll() {\n        const req = this.request();\n        req.on(\"data\", this.onData.bind(this));\n        req.on(\"error\", (xhrStatus, context) => {\n            this.onError(\"xhr poll error\", xhrStatus, context);\n        });\n        this.pollXhr = req;\n    }\n}\nexport class Request extends Emitter {\n    /**\n     * Request constructor\n     *\n     * @param {Object} options\n     * @package\n     */\n    constructor(createRequest, uri, opts) {\n        super();\n        this.createRequest = createRequest;\n        installTimerFunctions(this, opts);\n        this._opts = opts;\n        this._method = opts.method || \"GET\";\n        this._uri = uri;\n        this._data = undefined !== opts.data ? opts.data : null;\n        this._create();\n    }\n    /**\n     * Creates the XHR object and sends the request.\n     *\n     * @private\n     */\n    _create() {\n        var _a;\n        const opts = pick(this._opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n        opts.xdomain = !!this._opts.xd;\n        const xhr = (this._xhr = this.createRequest(opts));\n        try {\n            xhr.open(this._method, this._uri, true);\n            try {\n                if (this._opts.extraHeaders) {\n                    // @ts-ignore\n                    xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n                    for (let i in this._opts.extraHeaders) {\n                        if (this._opts.extraHeaders.hasOwnProperty(i)) {\n                            xhr.setRequestHeader(i, this._opts.extraHeaders[i]);\n                        }\n                    }\n                }\n            }\n            catch (e) { }\n            if (\"POST\" === this._method) {\n                try {\n                    xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n                }\n                catch (e) { }\n            }\n            try {\n                xhr.setRequestHeader(\"Accept\", \"*/*\");\n            }\n            catch (e) { }\n            (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\n            // ie6 check\n            if (\"withCredentials\" in xhr) {\n                xhr.withCredentials = this._opts.withCredentials;\n            }\n            if (this._opts.requestTimeout) {\n                xhr.timeout = this._opts.requestTimeout;\n            }\n            xhr.onreadystatechange = () => {\n                var _a;\n                if (xhr.readyState === 3) {\n                    (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(\n                    // @ts-ignore\n                    xhr.getResponseHeader(\"set-cookie\"));\n                }\n                if (4 !== xhr.readyState)\n                    return;\n                if (200 === xhr.status || 1223 === xhr.status) {\n                    this._onLoad();\n                }\n                else {\n                    // make sure the `error` event handler that's user-set\n                    // does not throw in the same tick and gets caught here\n                    this.setTimeoutFn(() => {\n                        this._onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n                    }, 0);\n                }\n            };\n            xhr.send(this._data);\n        }\n        catch (e) {\n            // Need to defer since .create() is called directly from the constructor\n            // and thus the 'error' event can only be only bound *after* this exception\n            // occurs.  Therefore, also, we cannot throw here at all.\n            this.setTimeoutFn(() => {\n                this._onError(e);\n            }, 0);\n            return;\n        }\n        if (typeof document !== \"undefined\") {\n            this._index = Request.requestsCount++;\n            Request.requests[this._index] = this;\n        }\n    }\n    /**\n     * Called upon error.\n     *\n     * @private\n     */\n    _onError(err) {\n        this.emitReserved(\"error\", err, this._xhr);\n        this._cleanup(true);\n    }\n    /**\n     * Cleans up house.\n     *\n     * @private\n     */\n    _cleanup(fromError) {\n        if (\"undefined\" === typeof this._xhr || null === this._xhr) {\n            return;\n        }\n        this._xhr.onreadystatechange = empty;\n        if (fromError) {\n            try {\n                this._xhr.abort();\n            }\n            catch (e) { }\n        }\n        if (typeof document !== \"undefined\") {\n            delete Request.requests[this._index];\n        }\n        this._xhr = null;\n    }\n    /**\n     * Called upon load.\n     *\n     * @private\n     */\n    _onLoad() {\n        const data = this._xhr.responseText;\n        if (data !== null) {\n            this.emitReserved(\"data\", data);\n            this.emitReserved(\"success\");\n            this._cleanup();\n        }\n    }\n    /**\n     * Aborts the request.\n     *\n     * @package\n     */\n    abort() {\n        this._cleanup();\n    }\n}\nRequest.requestsCount = 0;\nRequest.requests = {};\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\nif (typeof document !== \"undefined\") {\n    // @ts-ignore\n    if (typeof attachEvent === \"function\") {\n        // @ts-ignore\n        attachEvent(\"onunload\", unloadHandler);\n    }\n    else if (typeof addEventListener === \"function\") {\n        const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n        addEventListener(terminationEvent, unloadHandler, false);\n    }\n}\nfunction unloadHandler() {\n    for (let i in Request.requests) {\n        if (Request.requests.hasOwnProperty(i)) {\n            Request.requests[i].abort();\n        }\n    }\n}\nconst hasXHR2 = (function () {\n    const xhr = newRequest({\n        xdomain: false,\n    });\n    return xhr && xhr.responseType !== null;\n})();\n/**\n * HTTP long-polling based on the built-in `XMLHttpRequest` object.\n *\n * Usage: browser\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\n */\nexport class XHR extends BaseXHR {\n    constructor(opts) {\n        super(opts);\n        const forceBase64 = opts && opts.forceBase64;\n        this.supportsBinary = hasXHR2 && !forceBase64;\n    }\n    request(opts = {}) {\n        Object.assign(opts, { xd: this.xd }, this.opts);\n        return new Request(newRequest, this.uri(), opts);\n    }\n}\nfunction newRequest(opts) {\n    const xdomain = opts.xdomain;\n    // XMLHttpRequest can be disabled on IE\n    try {\n        if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n            return new XMLHttpRequest();\n        }\n    }\n    catch (e) { }\n    if (!xdomain) {\n        try {\n            return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\");\n        }\n        catch (e) { }\n    }\n}\n", "import { Transport } from \"../transport.js\";\nimport { pick, randomString } from \"../util.js\";\nimport { encodePacket } from \"engine.io-parser\";\nimport { globalThisShim as globalThis, nextTick } from \"../globals.node.js\";\n// detect ReactNative environment\nconst isReactNative = typeof navigator !== \"undefined\" &&\n    typeof navigator.product === \"string\" &&\n    navigator.product.toLowerCase() === \"reactnative\";\nexport class BaseWS extends Transport {\n    get name() {\n        return \"websocket\";\n    }\n    doOpen() {\n        const uri = this.uri();\n        const protocols = this.opts.protocols;\n        // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n        const opts = isReactNative\n            ? {}\n            : pick(this.opts, \"agent\", \"perMessageDeflate\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"localAddress\", \"protocolVersion\", \"origin\", \"maxPayload\", \"family\", \"checkServerIdentity\");\n        if (this.opts.extraHeaders) {\n            opts.headers = this.opts.extraHeaders;\n        }\n        try {\n            this.ws = this.createSocket(uri, protocols, opts);\n        }\n        catch (err) {\n            return this.emitReserved(\"error\", err);\n        }\n        this.ws.binaryType = this.socket.binaryType;\n        this.addEventListeners();\n    }\n    /**\n     * Adds event listeners to the socket\n     *\n     * @private\n     */\n    addEventListeners() {\n        this.ws.onopen = () => {\n            if (this.opts.autoUnref) {\n                this.ws._socket.unref();\n            }\n            this.onOpen();\n        };\n        this.ws.onclose = (closeEvent) => this.onClose({\n            description: \"websocket connection closed\",\n            context: closeEvent,\n        });\n        this.ws.onmessage = (ev) => this.onData(ev.data);\n        this.ws.onerror = (e) => this.onError(\"websocket error\", e);\n    }\n    write(packets) {\n        this.writable = false;\n        // encodePacket efficient as it uses WS framing\n        // no need for encodePayload\n        for (let i = 0; i < packets.length; i++) {\n            const packet = packets[i];\n            const lastPacket = i === packets.length - 1;\n            encodePacket(packet, this.supportsBinary, (data) => {\n                // Sometimes the websocket has already been closed but the browser didn't\n                // have a chance of informing us about it yet, in that case send will\n                // throw an error\n                try {\n                    this.doWrite(packet, data);\n                }\n                catch (e) {\n                }\n                if (lastPacket) {\n                    // fake drain\n                    // defer to next tick to allow Socket to clear writeBuffer\n                    nextTick(() => {\n                        this.writable = true;\n                        this.emitReserved(\"drain\");\n                    }, this.setTimeoutFn);\n                }\n            });\n        }\n    }\n    doClose() {\n        if (typeof this.ws !== \"undefined\") {\n            this.ws.onerror = () => { };\n            this.ws.close();\n            this.ws = null;\n        }\n    }\n    /**\n     * Generates uri for connection.\n     *\n     * @private\n     */\n    uri() {\n        const schema = this.opts.secure ? \"wss\" : \"ws\";\n        const query = this.query || {};\n        // append timestamp to URI\n        if (this.opts.timestampRequests) {\n            query[this.opts.timestampParam] = randomString();\n        }\n        // communicate binary support capabilities\n        if (!this.supportsBinary) {\n            query.b64 = 1;\n        }\n        return this.createUri(schema, query);\n    }\n}\nconst WebSocketCtor = globalThis.WebSocket || globalThis.MozWebSocket;\n/**\n * WebSocket transport based on the built-in `WebSocket` object.\n *\n * Usage: browser, Node.js (since v21), Deno, Bun\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @see https://caniuse.com/mdn-api_websocket\n * @see https://nodejs.org/api/globals.html#websocket\n */\nexport class WS extends BaseWS {\n    createSocket(uri, protocols, opts) {\n        return !isReactNative\n            ? protocols\n                ? new WebSocketCtor(uri, protocols)\n                : new WebSocketCtor(uri)\n            : new WebSocketCtor(uri, protocols, opts);\n    }\n    doWrite(_packet, data) {\n        this.ws.send(data);\n    }\n}\n", "import { Transport } from \"../transport.js\";\nimport { nextTick } from \"../globals.node.js\";\nimport { createPacketDecoderStream, createPacketEncoderStream, } from \"engine.io-parser\";\n/**\n * WebTransport transport based on the built-in `WebTransport` object.\n *\n * Usage: browser, Node.js (with the `@fails-components/webtransport` package)\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebTransport\n * @see https://caniuse.com/webtransport\n */\nexport class WT extends Transport {\n    get name() {\n        return \"webtransport\";\n    }\n    doOpen() {\n        try {\n            // @ts-ignore\n            this._transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n        }\n        catch (err) {\n            return this.emitReserved(\"error\", err);\n        }\n        this._transport.closed\n            .then(() => {\n            this.onClose();\n        })\n            .catch((err) => {\n            this.onError(\"webtransport error\", err);\n        });\n        // note: we could have used async/await, but that would require some additional polyfills\n        this._transport.ready.then(() => {\n            this._transport.createBidirectionalStream().then((stream) => {\n                const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);\n                const reader = stream.readable.pipeThrough(decoderStream).getReader();\n                const encoderStream = createPacketEncoderStream();\n                encoderStream.readable.pipeTo(stream.writable);\n                this._writer = encoderStream.writable.getWriter();\n                const read = () => {\n                    reader\n                        .read()\n                        .then(({ done, value }) => {\n                        if (done) {\n                            return;\n                        }\n                        this.onPacket(value);\n                        read();\n                    })\n                        .catch((err) => {\n                    });\n                };\n                read();\n                const packet = { type: \"open\" };\n                if (this.query.sid) {\n                    packet.data = `{\"sid\":\"${this.query.sid}\"}`;\n                }\n                this._writer.write(packet).then(() => this.onOpen());\n            });\n        });\n    }\n    write(packets) {\n        this.writable = false;\n        for (let i = 0; i < packets.length; i++) {\n            const packet = packets[i];\n            const lastPacket = i === packets.length - 1;\n            this._writer.write(packet).then(() => {\n                if (lastPacket) {\n                    nextTick(() => {\n                        this.writable = true;\n                        this.emitReserved(\"drain\");\n                    }, this.setTimeoutFn);\n                }\n            });\n        }\n    }\n    doClose() {\n        var _a;\n        (_a = this._transport) === null || _a === void 0 ? void 0 : _a.close();\n    }\n}\n", "import { XHR } from \"./polling-xhr.node.js\";\nimport { WS } from \"./websocket.node.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n    websocket: WS,\n    webtransport: WT,\n    polling: XHR,\n};\n", "// imported from https://github.com/galkn/parseuri\n/**\n * Parses a URI\n *\n * Note: we could also have used the built-in URL object, but it isn't supported on all platforms.\n *\n * See:\n * - https://developer.mozilla.org/en-US/docs/Web/API/URL\n * - https://caniuse.com/url\n * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B\n *\n * History of the parse() method:\n * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c\n * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3\n * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\nconst re = /^(?:(?![^:@\\/?#]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@\\/?#]*)(?::([^:@\\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\nconst parts = [\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\nexport function parse(str) {\n    if (str.length > 8000) {\n        throw \"URI too long\";\n    }\n    const src = str, b = str.indexOf('['), e = str.indexOf(']');\n    if (b != -1 && e != -1) {\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n    }\n    let m = re.exec(str || ''), uri = {}, i = 14;\n    while (i--) {\n        uri[parts[i]] = m[i] || '';\n    }\n    if (b != -1 && e != -1) {\n        uri.source = src;\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n        uri.ipv6uri = true;\n    }\n    uri.pathNames = pathNames(uri, uri['path']);\n    uri.queryKey = queryKey(uri, uri['query']);\n    return uri;\n}\nfunction pathNames(obj, path) {\n    const regx = /\\/{2,9}/g, names = path.replace(regx, \"/\").split(\"/\");\n    if (path.slice(0, 1) == '/' || path.length === 0) {\n        names.splice(0, 1);\n    }\n    if (path.slice(-1) == '/') {\n        names.splice(names.length - 1, 1);\n    }\n    return names;\n}\nfunction queryKey(uri, query) {\n    const data = {};\n    query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n        if ($1) {\n            data[$1] = $2;\n        }\n    });\n    return data;\n}\n", "import { transports as DEFAULT_TRANSPORTS } from \"./transports/index.js\";\nimport { installTimerFunctions, byteLength } from \"./util.js\";\nimport { decode } from \"./contrib/parseqs.js\";\nimport { parse } from \"./contrib/parseuri.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { protocol } from \"engine.io-parser\";\nimport { createCookieJar, defaultBinaryType, nextTick, } from \"./globals.node.js\";\nconst withEventListeners = typeof addEventListener === \"function\" &&\n    typeof removeEventListener === \"function\";\nconst OFFLINE_EVENT_LISTENERS = [];\nif (withEventListeners) {\n    // within a ServiceWorker, any event handler for the 'offline' event must be added on the initial evaluation of the\n    // script, so we create one single event listener here which will forward the event to the socket instances\n    addEventListener(\"offline\", () => {\n        OFFLINE_EVENT_LISTENERS.forEach((listener) => listener());\n    }, false);\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes without upgrade mechanism, which means that it will keep the first low-level transport that\n * successfully establishes the connection.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithoutUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithoutUpgrade({\n *   transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n *   socket.send(\"hello\");\n * });\n *\n * @see SocketWithUpgrade\n * @see Socket\n */\nexport class SocketWithoutUpgrade extends Emitter {\n    /**\n     * Socket constructor.\n     *\n     * @param {String|Object} uri - uri or options\n     * @param {Object} opts - options\n     */\n    constructor(uri, opts) {\n        super();\n        this.binaryType = defaultBinaryType;\n        this.writeBuffer = [];\n        this._prevBufferLen = 0;\n        this._pingInterval = -1;\n        this._pingTimeout = -1;\n        this._maxPayload = -1;\n        /**\n         * The expiration timestamp of the {@link _pingTimeoutTimer} object is tracked, in case the timer is throttled and the\n         * callback is not fired on time. This can happen for example when a laptop is suspended or when a phone is locked.\n         */\n        this._pingTimeoutTime = Infinity;\n        if (uri && \"object\" === typeof uri) {\n            opts = uri;\n            uri = null;\n        }\n        if (uri) {\n            const parsedUri = parse(uri);\n            opts.hostname = parsedUri.host;\n            opts.secure =\n                parsedUri.protocol === \"https\" || parsedUri.protocol === \"wss\";\n            opts.port = parsedUri.port;\n            if (parsedUri.query)\n                opts.query = parsedUri.query;\n        }\n        else if (opts.host) {\n            opts.hostname = parse(opts.host).host;\n        }\n        installTimerFunctions(this, opts);\n        this.secure =\n            null != opts.secure\n                ? opts.secure\n                : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n        if (opts.hostname && !opts.port) {\n            // if no port is specified manually, use the protocol default\n            opts.port = this.secure ? \"443\" : \"80\";\n        }\n        this.hostname =\n            opts.hostname ||\n                (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n        this.port =\n            opts.port ||\n                (typeof location !== \"undefined\" && location.port\n                    ? location.port\n                    : this.secure\n                        ? \"443\"\n                        : \"80\");\n        this.transports = [];\n        this._transportsByName = {};\n        opts.transports.forEach((t) => {\n            const transportName = t.prototype.name;\n            this.transports.push(transportName);\n            this._transportsByName[transportName] = t;\n        });\n        this.opts = Object.assign({\n            path: \"/engine.io\",\n            agent: false,\n            withCredentials: false,\n            upgrade: true,\n            timestampParam: \"t\",\n            rememberUpgrade: false,\n            addTrailingSlash: true,\n            rejectUnauthorized: true,\n            perMessageDeflate: {\n                threshold: 1024,\n            },\n            transportOptions: {},\n            closeOnBeforeunload: false,\n        }, opts);\n        this.opts.path =\n            this.opts.path.replace(/\\/$/, \"\") +\n                (this.opts.addTrailingSlash ? \"/\" : \"\");\n        if (typeof this.opts.query === \"string\") {\n            this.opts.query = decode(this.opts.query);\n        }\n        if (withEventListeners) {\n            if (this.opts.closeOnBeforeunload) {\n                // Firefox closes the connection when the \"beforeunload\" event is emitted but not Chrome. This event listener\n                // ensures every browser behaves the same (no \"disconnect\" event at the Socket.IO level when the page is\n                // closed/reloaded)\n                this._beforeunloadEventListener = () => {\n                    if (this.transport) {\n                        // silently close the transport\n                        this.transport.removeAllListeners();\n                        this.transport.close();\n                    }\n                };\n                addEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n            }\n            if (this.hostname !== \"localhost\") {\n                this._offlineEventListener = () => {\n                    this._onClose(\"transport close\", {\n                        description: \"network connection lost\",\n                    });\n                };\n                OFFLINE_EVENT_LISTENERS.push(this._offlineEventListener);\n            }\n        }\n        if (this.opts.withCredentials) {\n            this._cookieJar = createCookieJar();\n        }\n        this._open();\n    }\n    /**\n     * Creates transport of the given type.\n     *\n     * @param {String} name - transport name\n     * @return {Transport}\n     * @private\n     */\n    createTransport(name) {\n        const query = Object.assign({}, this.opts.query);\n        // append engine.io protocol identifier\n        query.EIO = protocol;\n        // transport name\n        query.transport = name;\n        // session id if we already have one\n        if (this.id)\n            query.sid = this.id;\n        const opts = Object.assign({}, this.opts, {\n            query,\n            socket: this,\n            hostname: this.hostname,\n            secure: this.secure,\n            port: this.port,\n        }, this.opts.transportOptions[name]);\n        return new this._transportsByName[name](opts);\n    }\n    /**\n     * Initializes transport to use and starts probe.\n     *\n     * @private\n     */\n    _open() {\n        if (this.transports.length === 0) {\n            // Emit error on next tick so it can be listened to\n            this.setTimeoutFn(() => {\n                this.emitReserved(\"error\", \"No transports available\");\n            }, 0);\n            return;\n        }\n        const transportName = this.opts.rememberUpgrade &&\n            SocketWithoutUpgrade.priorWebsocketSuccess &&\n            this.transports.indexOf(\"websocket\") !== -1\n            ? \"websocket\"\n            : this.transports[0];\n        this.readyState = \"opening\";\n        const transport = this.createTransport(transportName);\n        transport.open();\n        this.setTransport(transport);\n    }\n    /**\n     * Sets the current transport. Disables the existing one (if any).\n     *\n     * @private\n     */\n    setTransport(transport) {\n        if (this.transport) {\n            this.transport.removeAllListeners();\n        }\n        // set up transport\n        this.transport = transport;\n        // set up transport listeners\n        transport\n            .on(\"drain\", this._onDrain.bind(this))\n            .on(\"packet\", this._onPacket.bind(this))\n            .on(\"error\", this._onError.bind(this))\n            .on(\"close\", (reason) => this._onClose(\"transport close\", reason));\n    }\n    /**\n     * Called when connection is deemed open.\n     *\n     * @private\n     */\n    onOpen() {\n        this.readyState = \"open\";\n        SocketWithoutUpgrade.priorWebsocketSuccess =\n            \"websocket\" === this.transport.name;\n        this.emitReserved(\"open\");\n        this.flush();\n    }\n    /**\n     * Handles a packet.\n     *\n     * @private\n     */\n    _onPacket(packet) {\n        if (\"opening\" === this.readyState ||\n            \"open\" === this.readyState ||\n            \"closing\" === this.readyState) {\n            this.emitReserved(\"packet\", packet);\n            // Socket is live - any packet counts\n            this.emitReserved(\"heartbeat\");\n            switch (packet.type) {\n                case \"open\":\n                    this.onHandshake(JSON.parse(packet.data));\n                    break;\n                case \"ping\":\n                    this._sendPacket(\"pong\");\n                    this.emitReserved(\"ping\");\n                    this.emitReserved(\"pong\");\n                    this._resetPingTimeout();\n                    break;\n                case \"error\":\n                    const err = new Error(\"server error\");\n                    // @ts-ignore\n                    err.code = packet.data;\n                    this._onError(err);\n                    break;\n                case \"message\":\n                    this.emitReserved(\"data\", packet.data);\n                    this.emitReserved(\"message\", packet.data);\n                    break;\n            }\n        }\n        else {\n        }\n    }\n    /**\n     * Called upon handshake completion.\n     *\n     * @param {Object} data - handshake obj\n     * @private\n     */\n    onHandshake(data) {\n        this.emitReserved(\"handshake\", data);\n        this.id = data.sid;\n        this.transport.query.sid = data.sid;\n        this._pingInterval = data.pingInterval;\n        this._pingTimeout = data.pingTimeout;\n        this._maxPayload = data.maxPayload;\n        this.onOpen();\n        // In case open handler closes socket\n        if (\"closed\" === this.readyState)\n            return;\n        this._resetPingTimeout();\n    }\n    /**\n     * Sets and resets ping timeout timer based on server pings.\n     *\n     * @private\n     */\n    _resetPingTimeout() {\n        this.clearTimeoutFn(this._pingTimeoutTimer);\n        const delay = this._pingInterval + this._pingTimeout;\n        this._pingTimeoutTime = Date.now() + delay;\n        this._pingTimeoutTimer = this.setTimeoutFn(() => {\n            this._onClose(\"ping timeout\");\n        }, delay);\n        if (this.opts.autoUnref) {\n            this._pingTimeoutTimer.unref();\n        }\n    }\n    /**\n     * Called on `drain` event\n     *\n     * @private\n     */\n    _onDrain() {\n        this.writeBuffer.splice(0, this._prevBufferLen);\n        // setting prevBufferLen = 0 is very important\n        // for example, when upgrading, upgrade packet is sent over,\n        // and a nonzero prevBufferLen could cause problems on `drain`\n        this._prevBufferLen = 0;\n        if (0 === this.writeBuffer.length) {\n            this.emitReserved(\"drain\");\n        }\n        else {\n            this.flush();\n        }\n    }\n    /**\n     * Flush write buffers.\n     *\n     * @private\n     */\n    flush() {\n        if (\"closed\" !== this.readyState &&\n            this.transport.writable &&\n            !this.upgrading &&\n            this.writeBuffer.length) {\n            const packets = this._getWritablePackets();\n            this.transport.send(packets);\n            // keep track of current length of writeBuffer\n            // splice writeBuffer and callbackBuffer on `drain`\n            this._prevBufferLen = packets.length;\n            this.emitReserved(\"flush\");\n        }\n    }\n    /**\n     * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP\n     * long-polling)\n     *\n     * @private\n     */\n    _getWritablePackets() {\n        const shouldCheckPayloadSize = this._maxPayload &&\n            this.transport.name === \"polling\" &&\n            this.writeBuffer.length > 1;\n        if (!shouldCheckPayloadSize) {\n            return this.writeBuffer;\n        }\n        let payloadSize = 1; // first packet type\n        for (let i = 0; i < this.writeBuffer.length; i++) {\n            const data = this.writeBuffer[i].data;\n            if (data) {\n                payloadSize += byteLength(data);\n            }\n            if (i > 0 && payloadSize > this._maxPayload) {\n                return this.writeBuffer.slice(0, i);\n            }\n            payloadSize += 2; // separator + packet type\n        }\n        return this.writeBuffer;\n    }\n    /**\n     * Checks whether the heartbeat timer has expired but the socket has not yet been notified.\n     *\n     * Note: this method is private for now because it does not really fit the WebSocket API, but if we put it in the\n     * `write()` method then the message would not be buffered by the Socket.IO client.\n     *\n     * @return {boolean}\n     * @private\n     */\n    /* private */ _hasPingExpired() {\n        if (!this._pingTimeoutTime)\n            return true;\n        const hasExpired = Date.now() > this._pingTimeoutTime;\n        if (hasExpired) {\n            this._pingTimeoutTime = 0;\n            nextTick(() => {\n                this._onClose(\"ping timeout\");\n            }, this.setTimeoutFn);\n        }\n        return hasExpired;\n    }\n    /**\n     * Sends a message.\n     *\n     * @param {String} msg - message.\n     * @param {Object} options.\n     * @param {Function} fn - callback function.\n     * @return {Socket} for chaining.\n     */\n    write(msg, options, fn) {\n        this._sendPacket(\"message\", msg, options, fn);\n        return this;\n    }\n    /**\n     * Sends a message. Alias of {@link Socket#write}.\n     *\n     * @param {String} msg - message.\n     * @param {Object} options.\n     * @param {Function} fn - callback function.\n     * @return {Socket} for chaining.\n     */\n    send(msg, options, fn) {\n        this._sendPacket(\"message\", msg, options, fn);\n        return this;\n    }\n    /**\n     * Sends a packet.\n     *\n     * @param {String} type - packet type.\n     * @param {String} data.\n     * @param {Object} options.\n     * @param {Function} fn - callback function.\n     * @private\n     */\n    _sendPacket(type, data, options, fn) {\n        if (\"function\" === typeof data) {\n            fn = data;\n            data = undefined;\n        }\n        if (\"function\" === typeof options) {\n            fn = options;\n            options = null;\n        }\n        if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n            return;\n        }\n        options = options || {};\n        options.compress = false !== options.compress;\n        const packet = {\n            type: type,\n            data: data,\n            options: options,\n        };\n        this.emitReserved(\"packetCreate\", packet);\n        this.writeBuffer.push(packet);\n        if (fn)\n            this.once(\"flush\", fn);\n        this.flush();\n    }\n    /**\n     * Closes the connection.\n     */\n    close() {\n        const close = () => {\n            this._onClose(\"forced close\");\n            this.transport.close();\n        };\n        const cleanupAndClose = () => {\n            this.off(\"upgrade\", cleanupAndClose);\n            this.off(\"upgradeError\", cleanupAndClose);\n            close();\n        };\n        const waitForUpgrade = () => {\n            // wait for upgrade to finish since we can't send packets while pausing a transport\n            this.once(\"upgrade\", cleanupAndClose);\n            this.once(\"upgradeError\", cleanupAndClose);\n        };\n        if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n            this.readyState = \"closing\";\n            if (this.writeBuffer.length) {\n                this.once(\"drain\", () => {\n                    if (this.upgrading) {\n                        waitForUpgrade();\n                    }\n                    else {\n                        close();\n                    }\n                });\n            }\n            else if (this.upgrading) {\n                waitForUpgrade();\n            }\n            else {\n                close();\n            }\n        }\n        return this;\n    }\n    /**\n     * Called upon transport error\n     *\n     * @private\n     */\n    _onError(err) {\n        SocketWithoutUpgrade.priorWebsocketSuccess = false;\n        if (this.opts.tryAllTransports &&\n            this.transports.length > 1 &&\n            this.readyState === \"opening\") {\n            this.transports.shift();\n            return this._open();\n        }\n        this.emitReserved(\"error\", err);\n        this._onClose(\"transport error\", err);\n    }\n    /**\n     * Called upon transport close.\n     *\n     * @private\n     */\n    _onClose(reason, description) {\n        if (\"opening\" === this.readyState ||\n            \"open\" === this.readyState ||\n            \"closing\" === this.readyState) {\n            // clear timers\n            this.clearTimeoutFn(this._pingTimeoutTimer);\n            // stop event from firing again for transport\n            this.transport.removeAllListeners(\"close\");\n            // ensure transport won't stay open\n            this.transport.close();\n            // ignore further transport communication\n            this.transport.removeAllListeners();\n            if (withEventListeners) {\n                if (this._beforeunloadEventListener) {\n                    removeEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n                }\n                if (this._offlineEventListener) {\n                    const i = OFFLINE_EVENT_LISTENERS.indexOf(this._offlineEventListener);\n                    if (i !== -1) {\n                        OFFLINE_EVENT_LISTENERS.splice(i, 1);\n                    }\n                }\n            }\n            // set ready state\n            this.readyState = \"closed\";\n            // clear session id\n            this.id = null;\n            // emit close event\n            this.emitReserved(\"close\", reason, description);\n            // clean buffers after, so users can still\n            // grab the buffers on `close` event\n            this.writeBuffer = [];\n            this._prevBufferLen = 0;\n        }\n    }\n}\nSocketWithoutUpgrade.protocol = protocol;\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithUpgrade({\n *   transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n *   socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see Socket\n */\nexport class SocketWithUpgrade extends SocketWithoutUpgrade {\n    constructor() {\n        super(...arguments);\n        this._upgrades = [];\n    }\n    onOpen() {\n        super.onOpen();\n        if (\"open\" === this.readyState && this.opts.upgrade) {\n            for (let i = 0; i < this._upgrades.length; i++) {\n                this._probe(this._upgrades[i]);\n            }\n        }\n    }\n    /**\n     * Probes a transport.\n     *\n     * @param {String} name - transport name\n     * @private\n     */\n    _probe(name) {\n        let transport = this.createTransport(name);\n        let failed = false;\n        SocketWithoutUpgrade.priorWebsocketSuccess = false;\n        const onTransportOpen = () => {\n            if (failed)\n                return;\n            transport.send([{ type: \"ping\", data: \"probe\" }]);\n            transport.once(\"packet\", (msg) => {\n                if (failed)\n                    return;\n                if (\"pong\" === msg.type && \"probe\" === msg.data) {\n                    this.upgrading = true;\n                    this.emitReserved(\"upgrading\", transport);\n                    if (!transport)\n                        return;\n                    SocketWithoutUpgrade.priorWebsocketSuccess =\n                        \"websocket\" === transport.name;\n                    this.transport.pause(() => {\n                        if (failed)\n                            return;\n                        if (\"closed\" === this.readyState)\n                            return;\n                        cleanup();\n                        this.setTransport(transport);\n                        transport.send([{ type: \"upgrade\" }]);\n                        this.emitReserved(\"upgrade\", transport);\n                        transport = null;\n                        this.upgrading = false;\n                        this.flush();\n                    });\n                }\n                else {\n                    const err = new Error(\"probe error\");\n                    // @ts-ignore\n                    err.transport = transport.name;\n                    this.emitReserved(\"upgradeError\", err);\n                }\n            });\n        };\n        function freezeTransport() {\n            if (failed)\n                return;\n            // Any callback called by transport should be ignored since now\n            failed = true;\n            cleanup();\n            transport.close();\n            transport = null;\n        }\n        // Handle any error that happens while probing\n        const onerror = (err) => {\n            const error = new Error(\"probe error: \" + err);\n            // @ts-ignore\n            error.transport = transport.name;\n            freezeTransport();\n            this.emitReserved(\"upgradeError\", error);\n        };\n        function onTransportClose() {\n            onerror(\"transport closed\");\n        }\n        // When the socket is closed while we're probing\n        function onclose() {\n            onerror(\"socket closed\");\n        }\n        // When the socket is upgraded while we're probing\n        function onupgrade(to) {\n            if (transport && to.name !== transport.name) {\n                freezeTransport();\n            }\n        }\n        // Remove all listeners on the transport and on self\n        const cleanup = () => {\n            transport.removeListener(\"open\", onTransportOpen);\n            transport.removeListener(\"error\", onerror);\n            transport.removeListener(\"close\", onTransportClose);\n            this.off(\"close\", onclose);\n            this.off(\"upgrading\", onupgrade);\n        };\n        transport.once(\"open\", onTransportOpen);\n        transport.once(\"error\", onerror);\n        transport.once(\"close\", onTransportClose);\n        this.once(\"close\", onclose);\n        this.once(\"upgrading\", onupgrade);\n        if (this._upgrades.indexOf(\"webtransport\") !== -1 &&\n            name !== \"webtransport\") {\n            // favor WebTransport\n            this.setTimeoutFn(() => {\n                if (!failed) {\n                    transport.open();\n                }\n            }, 200);\n        }\n        else {\n            transport.open();\n        }\n    }\n    onHandshake(data) {\n        this._upgrades = this._filterUpgrades(data.upgrades);\n        super.onHandshake(data);\n    }\n    /**\n     * Filters upgrades, returning only those matching client transports.\n     *\n     * @param {Array} upgrades - server upgrades\n     * @private\n     */\n    _filterUpgrades(upgrades) {\n        const filteredUpgrades = [];\n        for (let i = 0; i < upgrades.length; i++) {\n            if (~this.transports.indexOf(upgrades[i]))\n                filteredUpgrades.push(upgrades[i]);\n        }\n        return filteredUpgrades;\n    }\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * @example\n * import { Socket } from \"engine.io-client\";\n *\n * const socket = new Socket();\n *\n * socket.on(\"open\", () => {\n *   socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see SocketWithUpgrade\n */\nexport class Socket extends SocketWithUpgrade {\n    constructor(uri, opts = {}) {\n        const isOptionsOnly = typeof uri === \"object\";\n        const o = isOptionsOnly ? { ...uri } : { ...opts };\n        if (!o.transports ||\n            (o.transports && typeof o.transports[0] === \"string\")) {\n            o.transports = (o.transports || [\"polling\", \"websocket\", \"webtransport\"])\n                .map((transportName) => DEFAULT_TRANSPORTS[transportName])\n                .filter((t) => !!t);\n        }\n        super(isOptionsOnly ? o : uri, o);\n    }\n}\n", "import { Socket } from \"./socket.js\";\nexport { Socket };\nexport { SocketWithoutUpgrade, SocketWithUpgrade, } from \"./socket.js\";\nexport const protocol = Socket.protocol;\nexport { Transport, TransportError } from \"./transport.js\";\nexport { transports } from \"./transports/index.js\";\nexport { installTimerFunctions } from \"./util.js\";\nexport { parse } from \"./contrib/parseuri.js\";\nexport { nextTick } from \"./globals.node.js\";\nexport { Fetch } from \"./transports/polling-fetch.js\";\nexport { XHR as NodeXHR } from \"./transports/polling-xhr.node.js\";\nexport { XHR } from \"./transports/polling-xhr.js\";\nexport { WS as NodeWebSocket } from \"./transports/websocket.node.js\";\nexport { WS as WebSocket } from \"./transports/websocket.js\";\nexport { WT as WebTransport } from \"./transports/webtransport.js\";\n", "import { parse } from \"engine.io-client\";\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n *        Defaults to window.location.\n * @public\n */\nexport function url(uri, path = \"\", loc) {\n    let obj = uri;\n    // default to window.location\n    loc = loc || (typeof location !== \"undefined\" && location);\n    if (null == uri)\n        uri = loc.protocol + \"//\" + loc.host;\n    // relative path support\n    if (typeof uri === \"string\") {\n        if (\"/\" === uri.charAt(0)) {\n            if (\"/\" === uri.charAt(1)) {\n                uri = loc.protocol + uri;\n            }\n            else {\n                uri = loc.host + uri;\n            }\n        }\n        if (!/^(https?|wss?):\\/\\//.test(uri)) {\n            if (\"undefined\" !== typeof loc) {\n                uri = loc.protocol + \"//\" + uri;\n            }\n            else {\n                uri = \"https://\" + uri;\n            }\n        }\n        // parse\n        obj = parse(uri);\n    }\n    // make sure we treat `localhost:80` and `localhost` equally\n    if (!obj.port) {\n        if (/^(http|ws)$/.test(obj.protocol)) {\n            obj.port = \"80\";\n        }\n        else if (/^(http|ws)s$/.test(obj.protocol)) {\n            obj.port = \"443\";\n        }\n    }\n    obj.path = obj.path || \"/\";\n    const ipv6 = obj.host.indexOf(\":\") !== -1;\n    const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n    // define unique id\n    obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n    // define href\n    obj.href =\n        obj.protocol +\n            \"://\" +\n            host +\n            (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n    return obj;\n}\n", "import { Emitter } from \"@socket.io/component-emitter\";\nimport { deconstructPacket, reconstructPacket } from \"./binary.js\";\nimport { isBinary, hasBinary } from \"./is-binary.js\";\n/**\n * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n    \"connect\", // used on the client side\n    \"connect_error\", // used on the client side\n    \"disconnect\", // used on both sides\n    \"disconnecting\", // used on the server side\n    \"newListener\", // used by the Node.js EventEmitter\n    \"removeListener\", // used by the Node.js EventEmitter\n];\n/**\n * Protocol version.\n *\n * @public\n */\nexport const protocol = 5;\nexport var PacketType;\n(function (PacketType) {\n    PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n    PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n    PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n    PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n    PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n    PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n    PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nexport class Encoder {\n    /**\n     * Encoder constructor\n     *\n     * @param {function} replacer - custom replacer to pass down to JSON.parse\n     */\n    constructor(replacer) {\n        this.replacer = replacer;\n    }\n    /**\n     * Encode a packet as a single string if non-binary, or as a\n     * buffer sequence, depending on packet type.\n     *\n     * @param {Object} obj - packet object\n     */\n    encode(obj) {\n        if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n            if (hasBinary(obj)) {\n                return this.encodeAsBinary({\n                    type: obj.type === PacketType.EVENT\n                        ? PacketType.BINARY_EVENT\n                        : PacketType.BINARY_ACK,\n                    nsp: obj.nsp,\n                    data: obj.data,\n                    id: obj.id,\n                });\n            }\n        }\n        return [this.encodeAsString(obj)];\n    }\n    /**\n     * Encode packet as string.\n     */\n    encodeAsString(obj) {\n        // first is type\n        let str = \"\" + obj.type;\n        // attachments if we have them\n        if (obj.type === PacketType.BINARY_EVENT ||\n            obj.type === PacketType.BINARY_ACK) {\n            str += obj.attachments + \"-\";\n        }\n        // if we have a namespace other than `/`\n        // we append it followed by a comma `,`\n        if (obj.nsp && \"/\" !== obj.nsp) {\n            str += obj.nsp + \",\";\n        }\n        // immediately followed by the id\n        if (null != obj.id) {\n            str += obj.id;\n        }\n        // json data\n        if (null != obj.data) {\n            str += JSON.stringify(obj.data, this.replacer);\n        }\n        return str;\n    }\n    /**\n     * Encode packet as 'buffer sequence' by removing blobs, and\n     * deconstructing packet into object with placeholders and\n     * a list of buffers.\n     */\n    encodeAsBinary(obj) {\n        const deconstruction = deconstructPacket(obj);\n        const pack = this.encodeAsString(deconstruction.packet);\n        const buffers = deconstruction.buffers;\n        buffers.unshift(pack); // add packet info to beginning of data list\n        return buffers; // write all the buffers\n    }\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nexport class Decoder extends Emitter {\n    /**\n     * Decoder constructor\n     */\n    constructor(opts) {\n        super();\n        this.opts = Object.assign({\n            reviver: undefined,\n            maxAttachments: 10,\n        }, typeof opts === \"function\" ? { reviver: opts } : opts);\n    }\n    /**\n     * Decodes an encoded packet string into packet JSON.\n     *\n     * @param {String} obj - encoded packet\n     */\n    add(obj) {\n        let packet;\n        if (typeof obj === \"string\") {\n            if (this.reconstructor) {\n                throw new Error(\"got plaintext data when reconstructing a packet\");\n            }\n            packet = this.decodeString(obj);\n            const isBinaryEvent = packet.type === PacketType.BINARY_EVENT;\n            if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {\n                packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;\n                // binary packet's json\n                this.reconstructor = new BinaryReconstructor(packet);\n            }\n            else {\n                // non-binary full packet\n                super.emitReserved(\"decoded\", packet);\n            }\n        }\n        else if (isBinary(obj) || obj.base64) {\n            // raw binary data\n            if (!this.reconstructor) {\n                throw new Error(\"got binary data when not reconstructing a packet\");\n            }\n            else {\n                packet = this.reconstructor.takeBinaryData(obj);\n                if (packet) {\n                    // received final buffer\n                    this.reconstructor = null;\n                    super.emitReserved(\"decoded\", packet);\n                }\n            }\n        }\n        else {\n            throw new Error(\"Unknown type: \" + obj);\n        }\n    }\n    /**\n     * Decode a packet String (JSON data)\n     *\n     * @param {String} str\n     * @return {Object} packet\n     */\n    decodeString(str) {\n        let i = 0;\n        // look up type\n        const p = {\n            type: Number(str.charAt(0)),\n        };\n        if (PacketType[p.type] === undefined) {\n            throw new Error(\"unknown packet type \" + p.type);\n        }\n        // look up attachments if type binary\n        if (p.type === PacketType.BINARY_EVENT ||\n            p.type === PacketType.BINARY_ACK) {\n            const start = i + 1;\n            while (str.charAt(++i) !== \"-\" && i != str.length) { }\n            const buf = str.substring(start, i);\n            if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n                throw new Error(\"Illegal attachments\");\n            }\n            const n = Number(buf);\n            if (!isInteger(n) || n < 1) {\n                throw new Error(\"Illegal attachments\");\n            }\n            else if (n > this.opts.maxAttachments) {\n                throw new Error(\"too many attachments\");\n            }\n            p.attachments = n;\n        }\n        // look up namespace (if any)\n        if (\"/\" === str.charAt(i + 1)) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (\",\" === c)\n                    break;\n                if (i === str.length)\n                    break;\n            }\n            p.nsp = str.substring(start, i);\n        }\n        else {\n            p.nsp = \"/\";\n        }\n        // look up id\n        const next = str.charAt(i + 1);\n        if (\"\" !== next && Number(next) == next) {\n            const start = i + 1;\n            while (++i) {\n                const c = str.charAt(i);\n                if (null == c || Number(c) != c) {\n                    --i;\n                    break;\n                }\n                if (i === str.length)\n                    break;\n            }\n            p.id = Number(str.substring(start, i + 1));\n        }\n        // look up json data\n        if (str.charAt(++i)) {\n            const payload = this.tryParse(str.substr(i));\n            if (Decoder.isPayloadValid(p.type, payload)) {\n                p.data = payload;\n            }\n            else {\n                throw new Error(\"invalid payload\");\n            }\n        }\n        return p;\n    }\n    tryParse(str) {\n        try {\n            return JSON.parse(str, this.opts.reviver);\n        }\n        catch (e) {\n            return false;\n        }\n    }\n    static isPayloadValid(type, payload) {\n        switch (type) {\n            case PacketType.CONNECT:\n                return isObject(payload);\n            case PacketType.DISCONNECT:\n                return payload === undefined;\n            case PacketType.CONNECT_ERROR:\n                return typeof payload === \"string\" || isObject(payload);\n            case PacketType.EVENT:\n            case PacketType.BINARY_EVENT:\n                return (Array.isArray(payload) &&\n                    (typeof payload[0] === \"number\" ||\n                        (typeof payload[0] === \"string\" &&\n                            RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n            case PacketType.ACK:\n            case PacketType.BINARY_ACK:\n                return Array.isArray(payload);\n        }\n    }\n    /**\n     * Deallocates a parser's resources\n     */\n    destroy() {\n        if (this.reconstructor) {\n            this.reconstructor.finishedReconstruction();\n            this.reconstructor = null;\n        }\n    }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n    constructor(packet) {\n        this.packet = packet;\n        this.buffers = [];\n        this.reconPack = packet;\n    }\n    /**\n     * Method to be called when binary data received from connection\n     * after a BINARY_EVENT packet.\n     *\n     * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n     * @return {null | Object} returns null if more binary data is expected or\n     *   a reconstructed packet object if all buffers have been received.\n     */\n    takeBinaryData(binData) {\n        this.buffers.push(binData);\n        if (this.buffers.length === this.reconPack.attachments) {\n            // done with buffer list\n            const packet = reconstructPacket(this.reconPack, this.buffers);\n            this.finishedReconstruction();\n            return packet;\n        }\n        return null;\n    }\n    /**\n     * Cleans up binary packet reconstruction variables.\n     */\n    finishedReconstruction() {\n        this.reconPack = null;\n        this.buffers = [];\n    }\n}\nfunction isNamespaceValid(nsp) {\n    return typeof nsp === \"string\";\n}\n// see https://caniuse.com/mdn-javascript_builtins_number_isinteger\nconst isInteger = Number.isInteger ||\n    function (value) {\n        return (typeof value === \"number\" &&\n            isFinite(value) &&\n            Math.floor(value) === value);\n    };\nfunction isAckIdValid(id) {\n    return id === undefined || isInteger(id);\n}\n// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n    return Object.prototype.toString.call(value) === \"[object Object]\";\n}\nfunction isDataValid(type, payload) {\n    switch (type) {\n        case PacketType.CONNECT:\n            return payload === undefined || isObject(payload);\n        case PacketType.DISCONNECT:\n            return payload === undefined;\n        case PacketType.EVENT:\n            return (Array.isArray(payload) &&\n                (typeof payload[0] === \"number\" ||\n                    (typeof payload[0] === \"string\" &&\n                        RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n        case PacketType.ACK:\n            return Array.isArray(payload);\n        case PacketType.CONNECT_ERROR:\n            return typeof payload === \"string\" || isObject(payload);\n        default:\n            return false;\n    }\n}\nexport function isPacketValid(packet) {\n    return (isNamespaceValid(packet.nsp) &&\n        isAckIdValid(packet.id) &&\n        isDataValid(packet.type, packet.data));\n}\n", "const withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n    return typeof ArrayBuffer.isView === \"function\"\n        ? ArrayBuffer.isView(obj)\n        : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n    (typeof Blob !== \"undefined\" &&\n        toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n    (typeof File !== \"undefined\" &&\n        toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nexport function isBinary(obj) {\n    return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n        (withNativeBlob && obj instanceof Blob) ||\n        (withNativeFile && obj instanceof File));\n}\nexport function hasBinary(obj, toJSON) {\n    if (!obj || typeof obj !== \"object\") {\n        return false;\n    }\n    if (Array.isArray(obj)) {\n        for (let i = 0, l = obj.length; i < l; i++) {\n            if (hasBinary(obj[i])) {\n                return true;\n            }\n        }\n        return false;\n    }\n    if (isBinary(obj)) {\n        return true;\n    }\n    if (obj.toJSON &&\n        typeof obj.toJSON === \"function\" &&\n        arguments.length === 1) {\n        return hasBinary(obj.toJSON(), true);\n    }\n    for (const key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n            return true;\n        }\n    }\n    return false;\n}\n", "import { isBinary } from \"./is-binary.js\";\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nexport function deconstructPacket(packet) {\n    const buffers = [];\n    const packetData = packet.data;\n    const pack = packet;\n    pack.data = _deconstructPacket(packetData, buffers);\n    pack.attachments = buffers.length; // number of binary 'attachments'\n    return { packet: pack, buffers: buffers };\n}\nfunction _deconstructPacket(data, buffers, toJSON) {\n    if (!data)\n        return data;\n    if (isBinary(data)) {\n        const placeholder = { _placeholder: true, num: buffers.length };\n        buffers.push(data);\n        return placeholder;\n    }\n    else if (Array.isArray(data)) {\n        const newData = new Array(data.length);\n        for (let i = 0; i < data.length; i++) {\n            newData[i] = _deconstructPacket(data[i], buffers);\n        }\n        return newData;\n    }\n    else if (typeof data === \"object\" && !(data instanceof Date)) {\n        if (data.toJSON && typeof data.toJSON === \"function\" && !toJSON) {\n            return _deconstructPacket(data.toJSON(), buffers, true);\n        }\n        const newData = {};\n        for (const key in data) {\n            if (Object.prototype.hasOwnProperty.call(data, key)) {\n                newData[key] = _deconstructPacket(data[key], buffers);\n            }\n        }\n        return newData;\n    }\n    return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nexport function reconstructPacket(packet, buffers) {\n    packet.data = _reconstructPacket(packet.data, buffers);\n    delete packet.attachments; // no longer useful\n    return packet;\n}\nfunction _reconstructPacket(data, buffers) {\n    if (!data)\n        return data;\n    if (data && data._placeholder === true) {\n        const isIndexValid = typeof data.num === \"number\" &&\n            data.num >= 0 &&\n            data.num < buffers.length;\n        if (isIndexValid) {\n            return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n        }\n        else {\n            throw new Error(\"illegal attachments\");\n        }\n    }\n    else if (Array.isArray(data)) {\n        for (let i = 0; i < data.length; i++) {\n            data[i] = _reconstructPacket(data[i], buffers);\n        }\n    }\n    else if (typeof data === \"object\") {\n        for (const key in data) {\n            if (Object.prototype.hasOwnProperty.call(data, key)) {\n                data[key] = _reconstructPacket(data[key], buffers);\n            }\n        }\n    }\n    return data;\n}\n", "export function on(obj, ev, fn) {\n    obj.on(ev, fn);\n    return function subDestroy() {\n        obj.off(ev, fn);\n    };\n}\n", "import { PacketType } from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n    connect: 1,\n    connect_error: 1,\n    disconnect: 1,\n    disconnecting: 1,\n    // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n    newListener: 1,\n    removeListener: 1,\n});\n/**\n * A Socket is the fundamental class for interacting with the server.\n *\n * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n *   console.log(\"connected\");\n * });\n *\n * // send an event to the server\n * socket.emit(\"foo\", \"bar\");\n *\n * socket.on(\"foobar\", () => {\n *   // an event was received from the server\n * });\n *\n * // upon disconnection\n * socket.on(\"disconnect\", (reason) => {\n *   console.log(`disconnected due to ${reason}`);\n * });\n */\nexport class Socket extends Emitter {\n    /**\n     * `Socket` constructor.\n     */\n    constructor(io, nsp, opts) {\n        super();\n        /**\n         * Whether the socket is currently connected to the server.\n         *\n         * @example\n         * const socket = io();\n         *\n         * socket.on(\"connect\", () => {\n         *   console.log(socket.connected); // true\n         * });\n         *\n         * socket.on(\"disconnect\", () => {\n         *   console.log(socket.connected); // false\n         * });\n         */\n        this.connected = false;\n        /**\n         * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will\n         * be transmitted by the server.\n         */\n        this.recovered = false;\n        /**\n         * Buffer for packets received before the CONNECT packet\n         */\n        this.receiveBuffer = [];\n        /**\n         * Buffer for packets that will be sent once the socket is connected\n         */\n        this.sendBuffer = [];\n        /**\n         * The queue of packets to be sent with retry in case of failure.\n         *\n         * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order.\n         * @private\n         */\n        this._queue = [];\n        /**\n         * A sequence to generate the ID of the {@link QueuedPacket}.\n         * @private\n         */\n        this._queueSeq = 0;\n        this.ids = 0;\n        /**\n         * A map containing acknowledgement handlers.\n         *\n         * The `withError` attribute is used to differentiate handlers that accept an error as first argument:\n         *\n         * - `socket.emit(\"test\", (err, value) => { ... })` with `ackTimeout` option\n         * - `socket.timeout(5000).emit(\"test\", (err, value) => { ... })`\n         * - `const value = await socket.emitWithAck(\"test\")`\n         *\n         * From those that don't:\n         *\n         * - `socket.emit(\"test\", (value) => { ... });`\n         *\n         * In the first case, the handlers will be called with an error when:\n         *\n         * - the timeout is reached\n         * - the socket gets disconnected\n         *\n         * In the second case, the handlers will be simply discarded upon disconnection, since the client will never receive\n         * an acknowledgement from the server.\n         *\n         * @private\n         */\n        this.acks = {};\n        this.flags = {};\n        this.io = io;\n        this.nsp = nsp;\n        if (opts && opts.auth) {\n            this.auth = opts.auth;\n        }\n        this._opts = Object.assign({}, opts);\n        if (this.io._autoConnect)\n            this.open();\n    }\n    /**\n     * Whether the socket is currently disconnected\n     *\n     * @example\n     * const socket = io();\n     *\n     * socket.on(\"connect\", () => {\n     *   console.log(socket.disconnected); // false\n     * });\n     *\n     * socket.on(\"disconnect\", () => {\n     *   console.log(socket.disconnected); // true\n     * });\n     */\n    get disconnected() {\n        return !this.connected;\n    }\n    /**\n     * Subscribe to open, close and packet events\n     *\n     * @private\n     */\n    subEvents() {\n        if (this.subs)\n            return;\n        const io = this.io;\n        this.subs = [\n            on(io, \"open\", this.onopen.bind(this)),\n            on(io, \"packet\", this.onpacket.bind(this)),\n            on(io, \"error\", this.onerror.bind(this)),\n            on(io, \"close\", this.onclose.bind(this)),\n        ];\n    }\n    /**\n     * Whether the Socket will try to reconnect when its Manager connects or reconnects.\n     *\n     * @example\n     * const socket = io();\n     *\n     * console.log(socket.active); // true\n     *\n     * socket.on(\"disconnect\", (reason) => {\n     *   if (reason === \"io server disconnect\") {\n     *     // the disconnection was initiated by the server, you need to manually reconnect\n     *     console.log(socket.active); // false\n     *   }\n     *   // else the socket will automatically try to reconnect\n     *   console.log(socket.active); // true\n     * });\n     */\n    get active() {\n        return !!this.subs;\n    }\n    /**\n     * \"Opens\" the socket.\n     *\n     * @example\n     * const socket = io({\n     *   autoConnect: false\n     * });\n     *\n     * socket.connect();\n     */\n    connect() {\n        if (this.connected)\n            return this;\n        this.subEvents();\n        if (!this.io[\"_reconnecting\"])\n            this.io.open(); // ensure open\n        if (\"open\" === this.io._readyState)\n            this.onopen();\n        return this;\n    }\n    /**\n     * Alias for {@link connect()}.\n     */\n    open() {\n        return this.connect();\n    }\n    /**\n     * Sends a `message` event.\n     *\n     * This method mimics the WebSocket.send() method.\n     *\n     * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send\n     *\n     * @example\n     * socket.send(\"hello\");\n     *\n     * // this is equivalent to\n     * socket.emit(\"message\", \"hello\");\n     *\n     * @return self\n     */\n    send(...args) {\n        args.unshift(\"message\");\n        this.emit.apply(this, args);\n        return this;\n    }\n    /**\n     * Override `emit`.\n     * If the event is in `events`, it's emitted normally.\n     *\n     * @example\n     * socket.emit(\"hello\", \"world\");\n     *\n     * // all serializable datastructures are supported (no need to call JSON.stringify)\n     * socket.emit(\"hello\", 1, \"2\", { 3: [\"4\"], 5: Uint8Array.from([6]) });\n     *\n     * // with an acknowledgement from the server\n     * socket.emit(\"hello\", \"world\", (val) => {\n     *   // ...\n     * });\n     *\n     * @return self\n     */\n    emit(ev, ...args) {\n        var _a, _b, _c;\n        if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n            throw new Error('\"' + ev.toString() + '\" is a reserved event name');\n        }\n        args.unshift(ev);\n        if (this._opts.retries && !this.flags.fromQueue && !this.flags.volatile) {\n            this._addToQueue(args);\n            return this;\n        }\n        const packet = {\n            type: PacketType.EVENT,\n            data: args,\n        };\n        packet.options = {};\n        packet.options.compress = this.flags.compress !== false;\n        // event ack callback\n        if (\"function\" === typeof args[args.length - 1]) {\n            const id = this.ids++;\n            const ack = args.pop();\n            this._registerAckCallback(id, ack);\n            packet.id = id;\n        }\n        const isTransportWritable = (_b = (_a = this.io.engine) === null || _a === void 0 ? void 0 : _a.transport) === null || _b === void 0 ? void 0 : _b.writable;\n        const isConnected = this.connected && !((_c = this.io.engine) === null || _c === void 0 ? void 0 : _c._hasPingExpired());\n        const discardPacket = this.flags.volatile && !isTransportWritable;\n        if (discardPacket) {\n        }\n        else if (isConnected) {\n            this.notifyOutgoingListeners(packet);\n            this.packet(packet);\n        }\n        else {\n            this.sendBuffer.push(packet);\n        }\n        this.flags = {};\n        return this;\n    }\n    /**\n     * @private\n     */\n    _registerAckCallback(id, ack) {\n        var _a;\n        const timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout;\n        if (timeout === undefined) {\n            this.acks[id] = ack;\n            return;\n        }\n        // @ts-ignore\n        const timer = this.io.setTimeoutFn(() => {\n            delete this.acks[id];\n            for (let i = 0; i < this.sendBuffer.length; i++) {\n                if (this.sendBuffer[i].id === id) {\n                    this.sendBuffer.splice(i, 1);\n                }\n            }\n            ack.call(this, new Error(\"operation has timed out\"));\n        }, timeout);\n        const fn = (...args) => {\n            // @ts-ignore\n            this.io.clearTimeoutFn(timer);\n            ack.apply(this, args);\n        };\n        fn.withError = true;\n        this.acks[id] = fn;\n    }\n    /**\n     * Emits an event and waits for an acknowledgement\n     *\n     * @example\n     * // without timeout\n     * const response = await socket.emitWithAck(\"hello\", \"world\");\n     *\n     * // with a specific timeout\n     * try {\n     *   const response = await socket.timeout(1000).emitWithAck(\"hello\", \"world\");\n     * } catch (err) {\n     *   // the server did not acknowledge the event in the given delay\n     * }\n     *\n     * @return a Promise that will be fulfilled when the server acknowledges the event\n     */\n    emitWithAck(ev, ...args) {\n        return new Promise((resolve, reject) => {\n            const fn = (arg1, arg2) => {\n                return arg1 ? reject(arg1) : resolve(arg2);\n            };\n            fn.withError = true;\n            args.push(fn);\n            this.emit(ev, ...args);\n        });\n    }\n    /**\n     * Add the packet to the queue.\n     * @param args\n     * @private\n     */\n    _addToQueue(args) {\n        let ack;\n        if (typeof args[args.length - 1] === \"function\") {\n            ack = args.pop();\n        }\n        const packet = {\n            id: this._queueSeq++,\n            tryCount: 0,\n            pending: false,\n            args,\n            flags: Object.assign({ fromQueue: true }, this.flags),\n        };\n        args.push((err, ...responseArgs) => {\n            if (packet !== this._queue[0]) {\n            }\n            const hasError = err !== null;\n            if (hasError) {\n                if (packet.tryCount > this._opts.retries) {\n                    this._queue.shift();\n                    if (ack) {\n                        ack(err);\n                    }\n                }\n            }\n            else {\n                this._queue.shift();\n                if (ack) {\n                    ack(null, ...responseArgs);\n                }\n            }\n            packet.pending = false;\n            return this._drainQueue();\n        });\n        this._queue.push(packet);\n        this._drainQueue();\n    }\n    /**\n     * Send the first packet of the queue, and wait for an acknowledgement from the server.\n     * @param force - whether to resend a packet that has not been acknowledged yet\n     *\n     * @private\n     */\n    _drainQueue(force = false) {\n        if (!this.connected || this._queue.length === 0) {\n            return;\n        }\n        const packet = this._queue[0];\n        if (packet.pending && !force) {\n            return;\n        }\n        packet.pending = true;\n        packet.tryCount++;\n        this.flags = packet.flags;\n        this.emit.apply(this, packet.args);\n    }\n    /**\n     * Sends a packet.\n     *\n     * @param packet\n     * @private\n     */\n    packet(packet) {\n        packet.nsp = this.nsp;\n        this.io._packet(packet);\n    }\n    /**\n     * Called upon engine `open`.\n     *\n     * @private\n     */\n    onopen() {\n        if (typeof this.auth == \"function\") {\n            this.auth((data) => {\n                this._sendConnectPacket(data);\n            });\n        }\n        else {\n            this._sendConnectPacket(this.auth);\n        }\n    }\n    /**\n     * Sends a CONNECT packet to initiate the Socket.IO session.\n     *\n     * @param data\n     * @private\n     */\n    _sendConnectPacket(data) {\n        this.packet({\n            type: PacketType.CONNECT,\n            data: this._pid\n                ? Object.assign({ pid: this._pid, offset: this._lastOffset }, data)\n                : data,\n        });\n    }\n    /**\n     * Called upon engine or manager `error`.\n     *\n     * @param err\n     * @private\n     */\n    onerror(err) {\n        if (!this.connected) {\n            this.emitReserved(\"connect_error\", err);\n        }\n    }\n    /**\n     * Called upon engine `close`.\n     *\n     * @param reason\n     * @param description\n     * @private\n     */\n    onclose(reason, description) {\n        this.connected = false;\n        delete this.id;\n        this.emitReserved(\"disconnect\", reason, description);\n        this._clearAcks();\n    }\n    /**\n     * Clears the acknowledgement handlers upon disconnection, since the client will never receive an acknowledgement from\n     * the server.\n     *\n     * @private\n     */\n    _clearAcks() {\n        Object.keys(this.acks).forEach((id) => {\n            const isBuffered = this.sendBuffer.some((packet) => String(packet.id) === id);\n            if (!isBuffered) {\n                // note: handlers that do not accept an error as first argument are ignored here\n                const ack = this.acks[id];\n                delete this.acks[id];\n                if (ack.withError) {\n                    ack.call(this, new Error(\"socket has been disconnected\"));\n                }\n            }\n        });\n    }\n    /**\n     * Called with socket packet.\n     *\n     * @param packet\n     * @private\n     */\n    onpacket(packet) {\n        const sameNamespace = packet.nsp === this.nsp;\n        if (!sameNamespace)\n            return;\n        switch (packet.type) {\n            case PacketType.CONNECT:\n                if (packet.data && packet.data.sid) {\n                    this.onconnect(packet.data.sid, packet.data.pid);\n                }\n                else {\n                    this.emitReserved(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n                }\n                break;\n            case PacketType.EVENT:\n            case PacketType.BINARY_EVENT:\n                this.onevent(packet);\n                break;\n            case PacketType.ACK:\n            case PacketType.BINARY_ACK:\n                this.onack(packet);\n                break;\n            case PacketType.DISCONNECT:\n                this.ondisconnect();\n                break;\n            case PacketType.CONNECT_ERROR:\n                this.destroy();\n                const err = new Error(packet.data.message);\n                // @ts-ignore\n                err.data = packet.data.data;\n                this.emitReserved(\"connect_error\", err);\n                break;\n        }\n    }\n    /**\n     * Called upon a server event.\n     *\n     * @param packet\n     * @private\n     */\n    onevent(packet) {\n        const args = packet.data || [];\n        if (null != packet.id) {\n            args.push(this.ack(packet.id));\n        }\n        if (this.connected) {\n            this.emitEvent(args);\n        }\n        else {\n            this.receiveBuffer.push(Object.freeze(args));\n        }\n    }\n    emitEvent(args) {\n        if (this._anyListeners && this._anyListeners.length) {\n            const listeners = this._anyListeners.slice();\n            for (const listener of listeners) {\n                listener.apply(this, args);\n            }\n        }\n        super.emit.apply(this, args);\n        if (this._pid && args.length && typeof args[args.length - 1] === \"string\") {\n            this._lastOffset = args[args.length - 1];\n        }\n    }\n    /**\n     * Produces an ack callback to emit with an event.\n     *\n     * @private\n     */\n    ack(id) {\n        const self = this;\n        let sent = false;\n        return function (...args) {\n            // prevent double callbacks\n            if (sent)\n                return;\n            sent = true;\n            self.packet({\n                type: PacketType.ACK,\n                id: id,\n                data: args,\n            });\n        };\n    }\n    /**\n     * Called upon a server acknowledgement.\n     *\n     * @param packet\n     * @private\n     */\n    onack(packet) {\n        const ack = this.acks[packet.id];\n        if (typeof ack !== \"function\") {\n            return;\n        }\n        delete this.acks[packet.id];\n        // @ts-ignore FIXME ack is incorrectly inferred as 'never'\n        if (ack.withError) {\n            packet.data.unshift(null);\n        }\n        // @ts-ignore\n        ack.apply(this, packet.data);\n    }\n    /**\n     * Called upon server connect.\n     *\n     * @private\n     */\n    onconnect(id, pid) {\n        this.id = id;\n        this.recovered = pid && this._pid === pid;\n        this._pid = pid; // defined only if connection state recovery is enabled\n        this.connected = true;\n        this.emitBuffered();\n        this._drainQueue(true);\n        this.emitReserved(\"connect\");\n    }\n    /**\n     * Emit buffered events (received and emitted).\n     *\n     * @private\n     */\n    emitBuffered() {\n        this.receiveBuffer.forEach((args) => this.emitEvent(args));\n        this.receiveBuffer = [];\n        this.sendBuffer.forEach((packet) => {\n            this.notifyOutgoingListeners(packet);\n            this.packet(packet);\n        });\n        this.sendBuffer = [];\n    }\n    /**\n     * Called upon server disconnect.\n     *\n     * @private\n     */\n    ondisconnect() {\n        this.destroy();\n        this.onclose(\"io server disconnect\");\n    }\n    /**\n     * Called upon forced client/server side disconnections,\n     * this method ensures the manager stops tracking us and\n     * that reconnections don't get triggered for this.\n     *\n     * @private\n     */\n    destroy() {\n        if (this.subs) {\n            // clean subscriptions to avoid reconnections\n            this.subs.forEach((subDestroy) => subDestroy());\n            this.subs = undefined;\n        }\n        this.io[\"_destroy\"](this);\n    }\n    /**\n     * Disconnects the socket manually. In that case, the socket will not try to reconnect.\n     *\n     * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.\n     *\n     * @example\n     * const socket = io();\n     *\n     * socket.on(\"disconnect\", (reason) => {\n     *   // console.log(reason); prints \"io client disconnect\"\n     * });\n     *\n     * socket.disconnect();\n     *\n     * @return self\n     */\n    disconnect() {\n        if (this.connected) {\n            this.packet({ type: PacketType.DISCONNECT });\n        }\n        // remove socket from pool\n        this.destroy();\n        if (this.connected) {\n            // fire events\n            this.onclose(\"io client disconnect\");\n        }\n        return this;\n    }\n    /**\n     * Alias for {@link disconnect()}.\n     *\n     * @return self\n     */\n    close() {\n        return this.disconnect();\n    }\n    /**\n     * Sets the compress flag.\n     *\n     * @example\n     * socket.compress(false).emit(\"hello\");\n     *\n     * @param compress - if `true`, compresses the sending data\n     * @return self\n     */\n    compress(compress) {\n        this.flags.compress = compress;\n        return this;\n    }\n    /**\n     * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n     * ready to send messages.\n     *\n     * @example\n     * socket.volatile.emit(\"hello\"); // the server may or may not receive it\n     *\n     * @returns self\n     */\n    get volatile() {\n        this.flags.volatile = true;\n        return this;\n    }\n    /**\n     * Sets a modifier for a subsequent event emission that the callback will be called with an error when the\n     * given number of milliseconds have elapsed without an acknowledgement from the server:\n     *\n     * @example\n     * socket.timeout(5000).emit(\"my-event\", (err) => {\n     *   if (err) {\n     *     // the server did not acknowledge the event in the given delay\n     *   }\n     * });\n     *\n     * @returns self\n     */\n    timeout(timeout) {\n        this.flags.timeout = timeout;\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback.\n     *\n     * @example\n     * socket.onAny((event, ...args) => {\n     *   console.log(`got ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    onAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.push(listener);\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback. The listener is added to the beginning of the listeners array.\n     *\n     * @example\n     * socket.prependAny((event, ...args) => {\n     *   console.log(`got event ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    prependAny(listener) {\n        this._anyListeners = this._anyListeners || [];\n        this._anyListeners.unshift(listener);\n        return this;\n    }\n    /**\n     * Removes the listener that will be fired when any event is emitted.\n     *\n     * @example\n     * const catchAllListener = (event, ...args) => {\n     *   console.log(`got event ${event}`);\n     * }\n     *\n     * socket.onAny(catchAllListener);\n     *\n     * // remove a specific listener\n     * socket.offAny(catchAllListener);\n     *\n     * // or remove all listeners\n     * socket.offAny();\n     *\n     * @param listener\n     */\n    offAny(listener) {\n        if (!this._anyListeners) {\n            return this;\n        }\n        if (listener) {\n            const listeners = this._anyListeners;\n            for (let i = 0; i < listeners.length; i++) {\n                if (listener === listeners[i]) {\n                    listeners.splice(i, 1);\n                    return this;\n                }\n            }\n        }\n        else {\n            this._anyListeners = [];\n        }\n        return this;\n    }\n    /**\n     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n     * e.g. to remove listeners.\n     */\n    listenersAny() {\n        return this._anyListeners || [];\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback.\n     *\n     * Note: acknowledgements sent to the server are not included.\n     *\n     * @example\n     * socket.onAnyOutgoing((event, ...args) => {\n     *   console.log(`sent event ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    onAnyOutgoing(listener) {\n        this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n        this._anyOutgoingListeners.push(listener);\n        return this;\n    }\n    /**\n     * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n     * callback. The listener is added to the beginning of the listeners array.\n     *\n     * Note: acknowledgements sent to the server are not included.\n     *\n     * @example\n     * socket.prependAnyOutgoing((event, ...args) => {\n     *   console.log(`sent event ${event}`);\n     * });\n     *\n     * @param listener\n     */\n    prependAnyOutgoing(listener) {\n        this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n        this._anyOutgoingListeners.unshift(listener);\n        return this;\n    }\n    /**\n     * Removes the listener that will be fired when any event is emitted.\n     *\n     * @example\n     * const catchAllListener = (event, ...args) => {\n     *   console.log(`sent event ${event}`);\n     * }\n     *\n     * socket.onAnyOutgoing(catchAllListener);\n     *\n     * // remove a specific listener\n     * socket.offAnyOutgoing(catchAllListener);\n     *\n     * // or remove all listeners\n     * socket.offAnyOutgoing();\n     *\n     * @param [listener] - the catch-all listener (optional)\n     */\n    offAnyOutgoing(listener) {\n        if (!this._anyOutgoingListeners) {\n            return this;\n        }\n        if (listener) {\n            const listeners = this._anyOutgoingListeners;\n            for (let i = 0; i < listeners.length; i++) {\n                if (listener === listeners[i]) {\n                    listeners.splice(i, 1);\n                    return this;\n                }\n            }\n        }\n        else {\n            this._anyOutgoingListeners = [];\n        }\n        return this;\n    }\n    /**\n     * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n     * e.g. to remove listeners.\n     */\n    listenersAnyOutgoing() {\n        return this._anyOutgoingListeners || [];\n    }\n    /**\n     * Notify the listeners for each packet sent\n     *\n     * @param packet\n     *\n     * @private\n     */\n    notifyOutgoingListeners(packet) {\n        if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {\n            const listeners = this._anyOutgoingListeners.slice();\n            for (const listener of listeners) {\n                listener.apply(this, packet.data);\n            }\n        }\n    }\n}\n", "/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\nexport function Backoff(opts) {\n    opts = opts || {};\n    this.ms = opts.min || 100;\n    this.max = opts.max || 10000;\n    this.factor = opts.factor || 2;\n    this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n    this.attempts = 0;\n}\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\nBackoff.prototype.duration = function () {\n    var ms = this.ms * Math.pow(this.factor, this.attempts++);\n    if (this.jitter) {\n        var rand = Math.random();\n        var deviation = Math.floor(rand * this.jitter * ms);\n        ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;\n    }\n    return Math.min(ms, this.max) | 0;\n};\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\nBackoff.prototype.reset = function () {\n    this.attempts = 0;\n};\n/**\n * Set the minimum duration\n *\n * @api public\n */\nBackoff.prototype.setMin = function (min) {\n    this.ms = min;\n};\n/**\n * Set the maximum duration\n *\n * @api public\n */\nBackoff.prototype.setMax = function (max) {\n    this.max = max;\n};\n/**\n * Set the jitter\n *\n * @api public\n */\nBackoff.prototype.setJitter = function (jitter) {\n    this.jitter = jitter;\n};\n", "import { Socket as Engine, installTimerFunctions, nextTick, } from \"engine.io-client\";\nimport { Socket } from \"./socket.js\";\nimport * as parser from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Backoff } from \"./contrib/backo2.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\nexport class Manager extends Emitter {\n    constructor(uri, opts) {\n        var _a;\n        super();\n        this.nsps = {};\n        this.subs = [];\n        if (uri && \"object\" === typeof uri) {\n            opts = uri;\n            uri = undefined;\n        }\n        opts = opts || {};\n        opts.path = opts.path || \"/socket.io\";\n        this.opts = opts;\n        installTimerFunctions(this, opts);\n        this.reconnection(opts.reconnection !== false);\n        this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n        this.reconnectionDelay(opts.reconnectionDelay || 1000);\n        this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n        this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);\n        this.backoff = new Backoff({\n            min: this.reconnectionDelay(),\n            max: this.reconnectionDelayMax(),\n            jitter: this.randomizationFactor(),\n        });\n        this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n        this._readyState = \"closed\";\n        this.uri = uri;\n        const _parser = opts.parser || parser;\n        this.encoder = new _parser.Encoder();\n        this.decoder = new _parser.Decoder();\n        this._autoConnect = opts.autoConnect !== false;\n        if (this._autoConnect)\n            this.open();\n    }\n    reconnection(v) {\n        if (!arguments.length)\n            return this._reconnection;\n        this._reconnection = !!v;\n        if (!v) {\n            this.skipReconnect = true;\n        }\n        return this;\n    }\n    reconnectionAttempts(v) {\n        if (v === undefined)\n            return this._reconnectionAttempts;\n        this._reconnectionAttempts = v;\n        return this;\n    }\n    reconnectionDelay(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelay;\n        this._reconnectionDelay = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n        return this;\n    }\n    randomizationFactor(v) {\n        var _a;\n        if (v === undefined)\n            return this._randomizationFactor;\n        this._randomizationFactor = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n        return this;\n    }\n    reconnectionDelayMax(v) {\n        var _a;\n        if (v === undefined)\n            return this._reconnectionDelayMax;\n        this._reconnectionDelayMax = v;\n        (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n        return this;\n    }\n    timeout(v) {\n        if (!arguments.length)\n            return this._timeout;\n        this._timeout = v;\n        return this;\n    }\n    /**\n     * Starts trying to reconnect if reconnection is enabled and we have not\n     * started reconnecting yet\n     *\n     * @private\n     */\n    maybeReconnectOnOpen() {\n        // Only try to reconnect if it's the first time we're connecting\n        if (!this._reconnecting &&\n            this._reconnection &&\n            this.backoff.attempts === 0) {\n            // keeps reconnection from firing twice for the same reconnection loop\n            this.reconnect();\n        }\n    }\n    /**\n     * Sets the current transport `socket`.\n     *\n     * @param {Function} fn - optional, callback\n     * @return self\n     * @public\n     */\n    open(fn) {\n        if (~this._readyState.indexOf(\"open\"))\n            return this;\n        this.engine = new Engine(this.uri, this.opts);\n        const socket = this.engine;\n        const self = this;\n        this._readyState = \"opening\";\n        this.skipReconnect = false;\n        // emit `open`\n        const openSubDestroy = on(socket, \"open\", function () {\n            self.onopen();\n            fn && fn();\n        });\n        const onError = (err) => {\n            this.cleanup();\n            this._readyState = \"closed\";\n            this.emitReserved(\"error\", err);\n            if (fn) {\n                fn(err);\n            }\n            else {\n                // Only do this if there is no fn to handle the error\n                this.maybeReconnectOnOpen();\n            }\n        };\n        // emit `error`\n        const errorSub = on(socket, \"error\", onError);\n        if (false !== this._timeout) {\n            const timeout = this._timeout;\n            // set timer\n            const timer = this.setTimeoutFn(() => {\n                openSubDestroy();\n                onError(new Error(\"timeout\"));\n                socket.close();\n            }, timeout);\n            if (this.opts.autoUnref) {\n                timer.unref();\n            }\n            this.subs.push(() => {\n                this.clearTimeoutFn(timer);\n            });\n        }\n        this.subs.push(openSubDestroy);\n        this.subs.push(errorSub);\n        return this;\n    }\n    /**\n     * Alias for open()\n     *\n     * @return self\n     * @public\n     */\n    connect(fn) {\n        return this.open(fn);\n    }\n    /**\n     * Called upon transport open.\n     *\n     * @private\n     */\n    onopen() {\n        // clear old subs\n        this.cleanup();\n        // mark as open\n        this._readyState = \"open\";\n        this.emitReserved(\"open\");\n        // add new subs\n        const socket = this.engine;\n        this.subs.push(on(socket, \"ping\", this.onping.bind(this)), on(socket, \"data\", this.ondata.bind(this)), on(socket, \"error\", this.onerror.bind(this)), on(socket, \"close\", this.onclose.bind(this)), \n        // @ts-ignore\n        on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n    }\n    /**\n     * Called upon a ping.\n     *\n     * @private\n     */\n    onping() {\n        this.emitReserved(\"ping\");\n    }\n    /**\n     * Called with data.\n     *\n     * @private\n     */\n    ondata(data) {\n        try {\n            this.decoder.add(data);\n        }\n        catch (e) {\n            this.onclose(\"parse error\", e);\n        }\n    }\n    /**\n     * Called when parser fully decodes a packet.\n     *\n     * @private\n     */\n    ondecoded(packet) {\n        // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a \"parse error\"\n        nextTick(() => {\n            this.emitReserved(\"packet\", packet);\n        }, this.setTimeoutFn);\n    }\n    /**\n     * Called upon socket error.\n     *\n     * @private\n     */\n    onerror(err) {\n        this.emitReserved(\"error\", err);\n    }\n    /**\n     * Creates a new socket for the given `nsp`.\n     *\n     * @return {Socket}\n     * @public\n     */\n    socket(nsp, opts) {\n        let socket = this.nsps[nsp];\n        if (!socket) {\n            socket = new Socket(this, nsp, opts);\n            this.nsps[nsp] = socket;\n        }\n        else if (this._autoConnect && !socket.active) {\n            socket.connect();\n        }\n        return socket;\n    }\n    /**\n     * Called upon a socket close.\n     *\n     * @param socket\n     * @private\n     */\n    _destroy(socket) {\n        const nsps = Object.keys(this.nsps);\n        for (const nsp of nsps) {\n            const socket = this.nsps[nsp];\n            if (socket.active) {\n                return;\n            }\n        }\n        this._close();\n    }\n    /**\n     * Writes a packet.\n     *\n     * @param packet\n     * @private\n     */\n    _packet(packet) {\n        const encodedPackets = this.encoder.encode(packet);\n        for (let i = 0; i < encodedPackets.length; i++) {\n            this.engine.write(encodedPackets[i], packet.options);\n        }\n    }\n    /**\n     * Clean up transport subscriptions and packet buffer.\n     *\n     * @private\n     */\n    cleanup() {\n        this.subs.forEach((subDestroy) => subDestroy());\n        this.subs.length = 0;\n        this.decoder.destroy();\n    }\n    /**\n     * Close the current socket.\n     *\n     * @private\n     */\n    _close() {\n        this.skipReconnect = true;\n        this._reconnecting = false;\n        this.onclose(\"forced close\");\n    }\n    /**\n     * Alias for close()\n     *\n     * @private\n     */\n    disconnect() {\n        return this._close();\n    }\n    /**\n     * Called when:\n     *\n     * - the low-level engine is closed\n     * - the parser encountered a badly formatted packet\n     * - all sockets are disconnected\n     *\n     * @private\n     */\n    onclose(reason, description) {\n        var _a;\n        this.cleanup();\n        (_a = this.engine) === null || _a === void 0 ? void 0 : _a.close();\n        this.backoff.reset();\n        this._readyState = \"closed\";\n        this.emitReserved(\"close\", reason, description);\n        if (this._reconnection && !this.skipReconnect) {\n            this.reconnect();\n        }\n    }\n    /**\n     * Attempt a reconnection.\n     *\n     * @private\n     */\n    reconnect() {\n        if (this._reconnecting || this.skipReconnect)\n            return this;\n        const self = this;\n        if (this.backoff.attempts >= this._reconnectionAttempts) {\n            this.backoff.reset();\n            this.emitReserved(\"reconnect_failed\");\n            this._reconnecting = false;\n        }\n        else {\n            const delay = this.backoff.duration();\n            this._reconnecting = true;\n            const timer = this.setTimeoutFn(() => {\n                if (self.skipReconnect)\n                    return;\n                this.emitReserved(\"reconnect_attempt\", self.backoff.attempts);\n                // check again for the case socket closed in above events\n                if (self.skipReconnect)\n                    return;\n                self.open((err) => {\n                    if (err) {\n                        self._reconnecting = false;\n                        self.reconnect();\n                        this.emitReserved(\"reconnect_error\", err);\n                    }\n                    else {\n                        self.onreconnect();\n                    }\n                });\n            }, delay);\n            if (this.opts.autoUnref) {\n                timer.unref();\n            }\n            this.subs.push(() => {\n                this.clearTimeoutFn(timer);\n            });\n        }\n    }\n    /**\n     * Called upon successful reconnect.\n     *\n     * @private\n     */\n    onreconnect() {\n        const attempt = this.backoff.attempts;\n        this._reconnecting = false;\n        this.backoff.reset();\n        this.emitReserved(\"reconnect\", attempt);\n    }\n}\n", "import { url } from \"./url.js\";\nimport { Manager } from \"./manager.js\";\nimport { Socket } from \"./socket.js\";\n/**\n * Managers cache.\n */\nconst cache = {};\nfunction lookup(uri, opts) {\n    if (typeof uri === \"object\") {\n        opts = uri;\n        uri = undefined;\n    }\n    opts = opts || {};\n    const parsed = url(uri, opts.path || \"/socket.io\");\n    const source = parsed.source;\n    const id = parsed.id;\n    const path = parsed.path;\n    const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n    const newConnection = opts.forceNew ||\n        opts[\"force new connection\"] ||\n        false === opts.multiplex ||\n        sameNamespace;\n    let io;\n    if (newConnection) {\n        io = new Manager(source, opts);\n    }\n    else {\n        if (!cache[id]) {\n            cache[id] = new Manager(source, opts);\n        }\n        io = cache[id];\n    }\n    if (parsed.query && !opts.query) {\n        opts.query = parsed.queryKey;\n    }\n    return io.socket(parsed.path, opts);\n}\n// so that \"lookup\" can be used both as a function (e.g. `io(...)`) and as a\n// namespace (e.g. `io.connect(...)`), for backward compatibility\nObject.assign(lookup, {\n    Manager,\n    Socket,\n    io: lookup,\n    connect: lookup,\n});\n/**\n * Protocol version.\n *\n * @public\n */\nexport { protocol } from \"socket.io-parser\";\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nexport { Manager, Socket, lookup as io, lookup as connect, lookup as default, };\nexport { Fetch, NodeXHR, XHR, NodeWebSocket, WebSocket, WebTransport, } from \"engine.io-client\";\n", "class EventBus extends EventTarget {\n  emit(eventName, detail = {}) {\n    this.dispatchEvent(\n      new CustomEvent(eventName, {\n        detail,\n      }),\n    );\n  }\n\n  on(eventName, callback) {\n    this.addEventListener(eventName, callback);\n  }\n\n  off(eventName, callback) {\n    this.removeEventListener(eventName, callback);\n  }\n}\n\nconst eventBus = new EventBus();\n\nexport { eventBus };\n", "import { io } from \"socket.io-client\";\nimport { eventBus } from \"./event_bus\";\n\nclass SocketService {\n  constructor() {\n    this.socket = null;\n  }\n\n  connect() {\n    if (this.socket) return;\n\n    const url = window.SOCKETIO_URL;\n\n    if (!url) return;\n\n    this.socket = io(url, {\n      transports: [\"websocket\"],\n      withCredentials: true,\n    });\n\n    this.registerEvents();\n  }\n\n  registerEvents() {\n    this.socket.on(\"connect\", () => {\n      eventBus.emit(\"socket:connected\", {\n        socketId: this.socket.id,\n      });\n    });\n\n    // this.socket.on(\"disconnect\", () => {\n    //   console.log(\"Socket desconectado\");\n    //\n    //   eventBus.emit(\"socket:disconnected\");\n    // });\n    //\n    this.socket.on(\"message\", (message) => {\n      eventBus.emit(\"chat:message\", message);\n    });\n    //\n    // this.socket.on(\"notification\", (notification) => {\n    //   eventBus.emit(\"notification:new\", notification);\n    // });\n    //\n    // this.socket.on(\"ticket_updated\", (ticket) => {\n    //   eventBus.emit(\"ticket:updated\", ticket);\n    // });\n  }\n\n  emit(eventName, payload) {\n    if (!this.socket) return;\n\n    this.socket.emit(eventName, payload);\n  }\n\n  joinRoom(roomId) {\n    this.emit(\"join_room\", roomId);\n  }\n\n  leaveRoom(roomId) {\n    this.emit(\"leave_room\", roomId);\n  }\n}\n\nconst socketService = new SocketService();\n\nexport { socketService };\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class ValidationCodeController extends Controller {\n  static targets = [\"digit\", \"code\", \"submit\"];\n  static values = { length: Number };\n\n  connect() {\n    // Ensure a consistent length (in case markup changes)\n    if (this.lengthValue && this.digitTargets.length !== this.lengthValue) {\n      // not fatal; proceed with actual inputs present\n    }\n\n    this.digitTargets.forEach((el) => (el.value = \"\"));\n    this.update();\n    this.digitTargets[0]?.focus();\n  }\n\n  sanitizeChar(value) {\n    // Keep only 0-9 A-Z, take first char, uppercase\n    return (value || \"\")\n      .toString()\n      .toUpperCase()\n      .replace(/[^0-9A-Z]/g, \"\")\n      .slice(0, 1);\n  }\n\n  sanitizeString(value) {\n    return (value || \"\")\n      .toString()\n      .toUpperCase()\n      .replace(/[^0-9A-Z]/g, \"\");\n  }\n\n  onInput(event) {\n    const el = event.target;\n    el.value = this.sanitizeChar(el.value);\n\n    const idx = this.digitTargets.indexOf(el);\n    if (el.value && idx < this.digitTargets.length - 1) {\n      this.digitTargets[idx + 1].focus();\n      this.digitTargets[idx + 1].select?.();\n    }\n\n    this.update();\n  }\n\n  onKeydown(event) {\n    const el = event.target;\n    const idx = this.digitTargets.indexOf(el);\n\n    if (event.key === \"Backspace\") {\n      event.preventDefault();\n\n      if (el.value) {\n        // Clear current if it has a value\n        el.value = \"\";\n        this.update();\n        return;\n      }\n\n      // If current is empty, move left and clear that\n      if (idx > 0) {\n        const prev = this.digitTargets[idx - 1];\n        prev.focus();\n        prev.value = \"\";\n        this.update();\n      }\n      return;\n    }\n\n    if (event.key === \"Delete\") {\n      event.preventDefault();\n      el.value = \"\";\n      this.update();\n      return;\n    }\n\n    if (event.key === \"ArrowLeft\") {\n      if (idx > 0) {\n        event.preventDefault();\n        this.digitTargets[idx - 1].focus();\n      }\n      return;\n    }\n\n    if (event.key === \"ArrowRight\") {\n      if (idx < this.digitTargets.length - 1) {\n        event.preventDefault();\n        this.digitTargets[idx + 1].focus();\n      }\n      return;\n    }\n\n    // Allow navigation/control keys\n    if (event.key.length !== 1) return;\n\n    // Block non-alphanumeric keystrokes at keydown for better UX\n    const ch = event.key.toUpperCase();\n    if (!/[0-9A-Z]/.test(ch) && !event.ctrlKey && !event.metaKey) {\n      event.preventDefault();\n    }\n  }\n\n  onPaste(event) {\n    const text = (event.clipboardData || window.clipboardData).getData(\"text\");\n    const clean = this.sanitizeString(text).slice(0, this.digitTargets.length);\n    if (!clean) return;\n\n    event.preventDefault();\n\n    for (let i = 0; i < this.digitTargets.length; i++) {\n      this.digitTargets[i].value = clean[i] || \"\";\n    }\n\n    const nextEmpty = this.digitTargets.find((d) => !d.value);\n    (nextEmpty || this.digitTargets[this.digitTargets.length - 1])?.focus();\n\n    this.update();\n  }\n\n  update() {\n    const joined = this.digitTargets\n      .map((d) => this.sanitizeChar(d.value))\n      .join(\"\");\n    this.codeTarget.value = joined;\n\n    const complete = joined.length === this.digitTargets.length;\n    this.submitTarget.disabled = !complete;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class TelInputController extends Controller {\n  sanitize() {\n    this.element.value = this.element.value.replace(/\\D+/g, \"\");\n  }\n\n  keydown(event) {\n    const allowed = new Set([\n      \"Backspace\",\n      \"Delete\",\n      \"ArrowLeft\",\n      \"ArrowRight\",\n      \"Tab\",\n      \"Home\",\n      \"End\",\n    ]);\n\n    if (allowed.has(event.key)) return;\n\n    if (\n      (event.ctrlKey || event.metaKey) &&\n      [\"a\", \"c\", \"v\", \"x\"].includes(event.key.toLowerCase())\n    ) {\n      return;\n    }\n\n    if (!/^\\d$/.test(event.key)) event.preventDefault();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Rendered with the item's values by the server and loaded into #modal_wrapper\nexport class ManagedModalController extends Controller {\n  static targets = [\"form\"];\n\n  close() {\n    this.element.close();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Rendered with the item's values by the server and loaded into #modal_wrapper\nexport class EducationExperienceModalController extends Controller {\n  static targets = [\"form\"];\n\n  close() {\n    this.element.close();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Rendered with the item's values by the server and loaded into #modal_wrapper\nexport class CertificationModalController extends Controller {\n  static targets = [\"form\"];\n\n  close() {\n    this.element.close();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport Cropper from \"cropperjs\";\n\nexport class CropperController extends Controller {\n  static targets = [\n    \"input\",\n    \"container\",\n    \"label\",\n    \"background\",\n    \"buttonDisabled\",\n    \"errorMessage\",\n    \"form\",\n  ];\n\n  static values = {\n    photoType: { type: String, default: \"profile\" },\n  };\n\n  connect() {\n    this.cropper = null;\n    this.image = null;\n    this.objectUrl = null;\n  }\n\n  get cropConfig() {\n    if (this.photoTypeSafe === \"background\") {\n      return {\n        aspectRatio: 16 / 9,\n        width: 1280,\n        height: 720,\n      };\n    }\n\n    return {\n      aspectRatio: 1,\n      width: 300,\n      height: 300,\n    };\n  }\n\n  get photoTypeSafe() {\n    const allowed = [\"profile\", \"background\"];\n    return allowed.includes(this.photoTypeValue)\n      ? this.photoTypeValue\n      : \"profile\";\n  }\n\n  loadImage(event) {\n    const file = event.target.files[0];\n    if (!file) return;\n\n    if (!file.type.startsWith(\"image/\")) {\n      this.cancel();\n      this.errorMessageTarget.style.display = \"block\";\n      return;\n    }\n\n    this.errorMessageTarget.style.display = \"none\";\n\n    this.cleanup();\n\n    const config = this.cropConfig;\n\n    this.objectUrl = URL.createObjectURL(file);\n\n    this.image = document.createElement(\"img\");\n    this.image.src = this.objectUrl;\n    this.image.style.maxWidth = \"100%\";\n\n    this.containerTarget.innerHTML = \"\";\n    this.containerTarget.appendChild(this.image);\n\n    this.cropper = new Cropper(this.image, {\n      aspectRatio: config.aspectRatio,\n      viewMode: 1,\n      autoCropArea: 1,\n      background: true,\n      movable: true,\n      zoomable: true,\n      rotatable: true,\n      scalable: true,\n      responsive: true,\n      minCropBoxWidth: 300,\n      minCropBoxHeight: 300,\n      ready: () => {\n        this.labelTarget.style.display = \"none\";\n        this.backgroundTarget.classList.add(\"cropper__view--background\");\n        this.buttonDisabledTarget.removeAttribute(\"disabled\");\n      },\n    });\n  }\n\n  // Actions\n  zoomIn() {\n    this.cropper?.zoom(0.1);\n  }\n\n  zoomOut() {\n    this.cropper?.zoom(-0.1);\n  }\n\n  rotateLeft() {\n    this.cropper?.rotate(-45);\n  }\n\n  rotateRight() {\n    this.cropper?.rotate(45);\n  }\n\n  flipX() {\n    if (!this.cropper) return;\n    const scaleX = this.cropper.getData().scaleX || 1;\n    this.cropper.scaleX(-scaleX);\n  }\n\n  flipY() {\n    if (!this.cropper) return;\n    const scaleY = this.cropper.getData().scaleY || 1;\n    this.cropper.scaleY(-scaleY);\n  }\n\n  reset() {\n    this.cropper?.reset();\n  }\n\n  cancel() {\n    this.cleanup();\n\n    this.labelTarget.style.display = \"flex\";\n    this.backgroundTarget.classList.remove(\"cropper__view--background\");\n    this.containerTarget.innerHTML = \"\";\n    this.inputTarget.value = \"\";\n\n    this.buttonDisabledTarget.setAttribute(\"disabled\", \"true\");\n    this.errorMessageTarget.style.display = \"none\";\n  }\n\n  submitForm(event) {\n    event.preventDefault();\n\n    if (!this.cropper) return;\n\n    const config = this.cropConfig;\n\n    this.buttonDisabledTarget.setAttribute(\"disabled\", \"true\");\n\n    const canvas = this.cropper.getCroppedCanvas({\n      width: config.width,\n      height: config.height,\n    });\n\n    canvas.toBlob(\n      (blob) => {\n        const file = new File([blob], \"image.png\", {\n          type: \"image/png\",\n        });\n\n        const dataTransfer = new DataTransfer();\n        dataTransfer.items.add(file);\n\n        this.inputTarget.files = dataTransfer.files;\n\n        this.formTarget.submit();\n      },\n      \"image/png\",\n      0.6,\n    );\n  }\n\n  cleanup() {\n    if (this.cropper) {\n      this.cropper.destroy();\n      this.cropper = null;\n    }\n\n    if (this.objectUrl) {\n      URL.revokeObjectURL(this.objectUrl);\n      this.objectUrl = null;\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class CertificationUploadImageController extends Controller {\n  static targets = [\"input\", \"label\", \"errorMessage\", \"preview\"];\n\n  connect() {\n    this.image = null;\n    this.objectUrl = null;\n    this.originalSrc = this.previewTarget.getAttribute(\"src\");\n  }\n\n  loadImage(event) {\n    const file = event.target.files[0];\n    if (!file) return;\n\n    if (!file.type.startsWith(\"image/\")) {\n      this.cancel();\n      this.errorMessageTarget.style.display = \"block\";\n      return;\n    }\n\n    this.errorMessageTarget.style.display = \"none\";\n\n    this.objectUrl = URL.createObjectURL(file);\n    this.previewTarget.src = this.objectUrl;\n    this.previewTarget.style.display = \"block\";\n    this.labelTarget.style.display = \"none\";\n  }\n\n  loadFileDialog() {\n    this.inputTarget.click();\n  }\n\n  cancel() {\n    this.inputTarget.value = \"\";\n\n    if (this.objectUrl) {\n      URL.revokeObjectURL(this.objectUrl);\n      this.objectUrl = null;\n    }\n\n    this.previewTarget.src = this.originalSrc || \"\";\n\n    this.labelTarget.style.display = this.originalSrc ? \"none\" : \"flex\";\n    this.errorMessageTarget.style.display = \"none\";\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class DynamicListController extends Controller {\n  static targets = [\"input\", \"list\", \"hidden\", \"addButton\"];\n  static values = {\n    name: String,\n    // Optional: accessible name prefix of each item's remove button, e.g. \"Remove\"\n    removeLabel: String,\n  };\n\n  connect() {\n    this.syncFromHidden();\n    this.toggleAddButton();\n  }\n\n  // Opt-in: lists that declare an addButton target only enable it when the input has text\n  toggleAddButton() {\n    if (!this.hasAddButtonTarget) return;\n\n    this.addButtonTarget.disabled = !this.inputTarget.value.trim();\n  }\n\n  add() {\n    const value = this.inputTarget.value.trim();\n    if (!value) return;\n\n    this.addItem(value);\n    this.inputTarget.value = \"\";\n    this.inputTarget.focus();\n    this.updateHidden();\n    this.toggleAddButton();\n  }\n\n  addItem(value, extra = null) {\n    const li = document.createElement(\"li\");\n    li.className = \"dynamic-list__item\";\n    li.dataset.value = value;\n    if (extra) {\n      Object.keys(extra).forEach((key) => {\n        li.dataset[key] = extra[key];\n      });\n    }\n\n    const textSpan = document.createElement(\"span\");\n    textSpan.className = \"dynamic-list__text\";\n    textSpan.textContent = value;\n\n    const actions = document.createElement(\"div\");\n    actions.className = \"dynamic-list__actions\";\n\n    const removeBtn = document.createElement(\"button\");\n    removeBtn.type = \"button\";\n    removeBtn.className = \"dynamic-list__btn-remove\";\n    removeBtn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>`;\n    removeBtn.dataset.action = \"click->dynamic-list#remove\";\n    if (this.removeLabelValue) {\n      removeBtn.setAttribute(\n        \"aria-label\",\n        `${this.removeLabelValue}: ${value}`,\n      );\n    }\n\n    actions.appendChild(removeBtn);\n    li.appendChild(textSpan);\n    li.appendChild(actions);\n    this.listTarget.appendChild(li);\n  }\n\n  remove(event) {\n    const item = event.currentTarget.closest(\".dynamic-list__item\");\n    if (item) {\n      item.remove();\n      this.updateHidden();\n    }\n  }\n\n  updateHidden() {\n    const items = [];\n    this.listTarget.querySelectorAll(\".dynamic-list__item\").forEach((li) => {\n      const entry = { value: li.dataset.value };\n      // Include any extra data attributes\n      Object.keys(li.dataset).forEach((key) => {\n        if (key !== \"value\") {\n          entry[key] = li.dataset[key];\n        }\n      });\n      items.push(entry);\n    });\n    this.hiddenTarget.value = JSON.stringify(items);\n  }\n\n  syncFromHidden() {\n    const raw = this.hiddenTarget.value;\n    if (!raw) return;\n    try {\n      const items = JSON.parse(raw);\n      if (Array.isArray(items)) {\n        this.listTarget.innerHTML = \"\";\n        items.forEach((item) => {\n          if (typeof item === \"string\") {\n            this.addItem(item);\n          } else if (item.value) {\n            const extra = { ...item };\n            delete extra.value;\n            this.addItem(item.value, extra);\n          }\n        });\n      }\n    } catch {\n      // Ignore malformed JSON\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class TabsController extends Controller {\n  static targets = [\"tab\", \"panel\"];\n  static values = {\n    activeClass: { type: String, default: \"active\" },\n  };\n\n  connect() {\n    this.showTab(0);\n  }\n\n  switch(event) {\n    event.preventDefault();\n    const index = this.tabTargets.indexOf(event.currentTarget);\n    if (index >= 0) {\n      this.showTab(index);\n    }\n  }\n\n  showTab(index) {\n    this.tabTargets.forEach((tab, i) => {\n      tab.classList.toggle(this.activeClassValue, i === index);\n      tab.setAttribute(\"aria-selected\", i === index ? \"true\" : \"false\");\n    });\n    this.panelTargets.forEach((panel, i) => {\n      panel.hidden = i !== index;\n    });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class CertificationListController extends Controller {\n  static targets = [\"academy\", \"certification\", \"list\", \"hidden\"];\n  // Optional: accessible name prefix of each item's remove button, e.g. \"Remove\"\n  static values = { removeLabel: String };\n\n  connect() {\n    this.syncFromHidden();\n  }\n\n  add() {\n    const academyId = this.academyTarget.value;\n    const certificationId = this.certificationTarget.value;\n    const academyName = this.academyTarget.selectedOptions[0]?.text || \"\";\n    const certificationName =\n      this.certificationTarget.selectedOptions[0]?.text || \"\";\n\n    if (!academyId || !certificationId) return;\n\n    this.addItem(academyId, academyName, certificationId, certificationName);\n    this.certificationTarget.innerHTML = '<option value=\"\"></option>';\n    this.academyTarget.selectedIndex = 0;\n    this.academyTarget.focus();\n    this.updateHidden();\n  }\n\n  addItem(academyId, academyName, certificationId, certificationName) {\n    const li = document.createElement(\"li\");\n    li.className = \"dynamic-list__item\";\n    li.dataset.academyId = academyId;\n    li.dataset.certificationId = certificationId;\n\n    const textSpan = document.createElement(\"span\");\n    textSpan.className = \"dynamic-list__text\";\n    textSpan.textContent = `${certificationName} - ${academyName}`;\n\n    const actions = document.createElement(\"div\");\n    actions.className = \"dynamic-list__actions\";\n\n    const removeBtn = document.createElement(\"button\");\n    removeBtn.type = \"button\";\n    removeBtn.className = \"dynamic-list__btn-remove\";\n    removeBtn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>`;\n    removeBtn.dataset.action = \"click->certification-list#remove\";\n    if (this.removeLabelValue) {\n      removeBtn.setAttribute(\n        \"aria-label\",\n        `${this.removeLabelValue}: ${certificationName} - ${academyName}`,\n      );\n    }\n\n    actions.appendChild(removeBtn);\n    li.appendChild(textSpan);\n    li.appendChild(actions);\n    this.listTarget.appendChild(li);\n  }\n\n  remove(event) {\n    const item = event.currentTarget.closest(\".dynamic-list__item\");\n    if (item) {\n      item.remove();\n      this.updateHidden();\n    }\n  }\n\n  updateHidden() {\n    const items = [];\n    this.listTarget.querySelectorAll(\".dynamic-list__item\").forEach((li) => {\n      items.push({\n        academy_id: li.dataset.academyId,\n        certification_id: li.dataset.certificationId,\n      });\n    });\n    this.hiddenTarget.value = JSON.stringify(items);\n  }\n\n  syncFromHidden() {\n    const raw = this.hiddenTarget.value;\n    if (!raw) return;\n    try {\n      const items = JSON.parse(raw);\n      if (Array.isArray(items)) {\n        this.listTarget.innerHTML = \"\";\n        items.forEach((item) => {\n          this.addItem(\n            item.academy_id,\n            item.academy_name || item.academy_id,\n            item.certification_id,\n            item.certification_name || item.certification_id,\n          );\n        });\n      }\n    } catch {\n      // Ignore malformed JSON\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class VacancySelectionController extends Controller {\n  static targets = [\"bulkDeleteButton\", \"selectAllCheckbox\", \"count\"];\n  static values = {\n    bulkDeleteUrl: String,\n  };\n\n  connect() {\n    this.selectedIds = new Set();\n    this.updateBulkDeleteVisibility();\n\n    this._onHtmxAfterSwap = this._onHtmxAfterSwap.bind(this);\n    document.body.addEventListener(\"htmx:afterSwap\", this._onHtmxAfterSwap);\n  }\n\n  disconnect() {\n    document.body.removeEventListener(\"htmx:afterSwap\", this._onHtmxAfterSwap);\n  }\n\n  _onHtmxAfterSwap(event) {\n    // Only reset if the swapped element is our list container\n    if (event.detail.target.id !== \"vacancy-list-container\") return;\n\n    this.selectedIds.clear();\n    this.updateBulkDeleteVisibility();\n\n    if (this.hasSelectAllCheckboxTarget) {\n      this.selectAllCheckboxTarget.checked = false;\n      this.selectAllCheckboxTarget.indeterminate = false;\n    }\n  }\n\n  toggleRow(event) {\n    const checkbox = event.currentTarget;\n    const id = checkbox.value;\n\n    if (checkbox.checked) {\n      this.selectedIds.add(id);\n    } else {\n      this.selectedIds.delete(id);\n    }\n\n    this.updateBulkDeleteVisibility();\n    this.updateSelectAllState();\n  }\n\n  toggleAll(event) {\n    const checkboxes = this.element.querySelectorAll(\n      '#vacancy-list-container input[name=\"vacancy_ids\"]',\n    );\n    const isChecked = event.currentTarget.checked;\n\n    checkboxes.forEach((checkbox) => {\n      checkbox.checked = isChecked;\n      const id = checkbox.value;\n      if (isChecked) {\n        this.selectedIds.add(id);\n      } else {\n        this.selectedIds.delete(id);\n      }\n    });\n\n    this.updateBulkDeleteVisibility();\n  }\n\n  updateBulkDeleteVisibility() {\n    // Optional: how many vacancies are selected\n    if (this.hasCountTarget)\n      this.countTarget.textContent = this.selectedIds.size;\n\n    if (this.selectedIds.size > 0) {\n      this.bulkDeleteButtonTarget.classList.remove(\"hidden\");\n    } else {\n      this.bulkDeleteButtonTarget.classList.add(\"hidden\");\n    }\n  }\n\n  updateSelectAllState() {\n    if (!this.hasSelectAllCheckboxTarget) return;\n\n    const checkboxes = this.element.querySelectorAll(\n      '#vacancy-list-container input[name=\"vacancy_ids\"]',\n    );\n    const checkedCount = Array.from(checkboxes).filter(\n      (cb) => cb.checked,\n    ).length;\n\n    if (checkedCount === 0) {\n      this.selectAllCheckboxTarget.checked = false;\n      this.selectAllCheckboxTarget.indeterminate = false;\n    } else if (checkedCount === checkboxes.length) {\n      this.selectAllCheckboxTarget.checked = true;\n      this.selectAllCheckboxTarget.indeterminate = false;\n    } else {\n      this.selectAllCheckboxTarget.checked = false;\n      this.selectAllCheckboxTarget.indeterminate = true;\n    }\n  }\n\n  getCSRFToken() {\n    const name = \"csrftoken\";\n    const cookies = document.cookie.split(\";\");\n\n    for (let cookie of cookies) {\n      cookie = cookie.trim();\n      if (cookie.startsWith(name + \"=\")) {\n        return decodeURIComponent(cookie.substring(name.length + 1));\n      }\n    }\n\n    return \"\";\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Company vacancy card: the title button expands and collapses the card's\n// preview panel (aria-expanded, `hidden`, the `expanded` class on the card). The\n// first expansion dispatches `vacancy-preview:load` on the button, whose hx-get\n// fills the panel; after a failed load the panel shows `error` and the next\n// expansion retries. Unlike `disclosure`, it stays open on outside clicks, focus\n// changes and Escape, since the panel is inline content, not a menu.\nexport class VacancyPreviewController extends Controller {\n  static targets = [\"button\", \"panel\"];\n  static classes = [\"expanded\"];\n  static values = { error: String };\n\n  connect() {\n    this.loaded = false;\n    this.onAfterRequest = this.onAfterRequest.bind(this);\n    this.buttonTarget.addEventListener(\n      \"htmx:afterRequest\",\n      this.onAfterRequest,\n    );\n  }\n\n  disconnect() {\n    this.buttonTarget.removeEventListener(\n      \"htmx:afterRequest\",\n      this.onAfterRequest,\n    );\n  }\n\n  get isExpanded() {\n    return this.buttonTarget.getAttribute(\"aria-expanded\") === \"true\";\n  }\n\n  toggle() {\n    const expanded = !this.isExpanded;\n    this.buttonTarget.setAttribute(\"aria-expanded\", String(expanded));\n    this.panelTarget.hidden = !expanded;\n    this.element.classList.toggle(this.expandedClass, expanded);\n\n    if (expanded && !this.loaded && !this.loading) {\n      this.loading = true;\n      this.buttonTarget.dispatchEvent(new CustomEvent(\"vacancy-preview:load\"));\n    }\n  }\n\n  onAfterRequest(event) {\n    this.loading = false;\n    if (event.detail.successful) {\n      this.loaded = true;\n      return;\n    }\n\n    const message = document.createElement(\"p\");\n    message.className = \"ds-vacancy-card__preview-status\";\n    message.setAttribute(\"role\", \"alert\");\n    message.textContent = this.errorValue;\n    this.panelTarget.replaceChildren(message);\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class ApplicantSelectionController extends Controller {\n  static targets = [\"bulkActionsBar\", \"selectAllCheckbox\", \"selectedCount\"];\n  static values = {\n    bulkDeleteUrl: String,\n    vacancyId: String,\n  };\n\n  connect() {\n    this.selectedIds = new Set();\n    this.updateBulkActionsVisibility();\n\n    this._onHtmxAfterSwap = this._onHtmxAfterSwap.bind(this);\n    document.body.addEventListener(\"htmx:afterSwap\", this._onHtmxAfterSwap);\n  }\n\n  disconnect() {\n    document.body.removeEventListener(\"htmx:afterSwap\", this._onHtmxAfterSwap);\n  }\n\n  _onHtmxAfterSwap(event) {\n    if (event.detail.target.id !== \"applicant-list-container\") return;\n\n    this.selectedIds.clear();\n    this.updateBulkActionsVisibility();\n\n    if (this.hasSelectAllCheckboxTarget) {\n      this.selectAllCheckboxTarget.checked = false;\n      this.selectAllCheckboxTarget.indeterminate = false;\n    }\n  }\n\n  toggleRow(event) {\n    const checkbox = event.currentTarget;\n    const id = checkbox.value;\n\n    if (checkbox.checked) {\n      this.selectedIds.add(id);\n    } else {\n      this.selectedIds.delete(id);\n    }\n\n    this.updateBulkActionsVisibility();\n    this.updateSelectAllState();\n  }\n\n  toggleAll(event) {\n    const checkboxes = this.element.querySelectorAll(\n      '#applicant-list-container input[name=\"application_ids\"]',\n    );\n    const isChecked = event.currentTarget.checked;\n\n    checkboxes.forEach((checkbox) => {\n      checkbox.checked = isChecked;\n      const id = checkbox.value;\n      if (isChecked) {\n        this.selectedIds.add(id);\n      } else {\n        this.selectedIds.delete(id);\n      }\n    });\n\n    this.updateBulkActionsVisibility();\n    this.updateSelectAllState();\n  }\n\n  updateBulkActionsVisibility() {\n    if (this.selectedIds.size > 0) {\n      this.bulkActionsBarTarget.classList.remove(\"hidden\");\n    } else {\n      this.bulkActionsBarTarget.classList.add(\"hidden\");\n    }\n\n    if (this.hasSelectedCountTarget) {\n      this.selectedCountTarget.textContent = `${this.selectedIds.size}`;\n    }\n  }\n\n  updateSelectAllState() {\n    if (!this.hasSelectAllCheckboxTarget) return;\n\n    const checkboxes = this.element.querySelectorAll(\n      '#applicant-list-container input[name=\"application_ids\"]',\n    );\n    const checkedCount = Array.from(checkboxes).filter(\n      (cb) => cb.checked,\n    ).length;\n\n    if (checkedCount === 0) {\n      this.selectAllCheckboxTarget.checked = false;\n      this.selectAllCheckboxTarget.indeterminate = false;\n    } else if (checkedCount === checkboxes.length) {\n      this.selectAllCheckboxTarget.checked = true;\n      this.selectAllCheckboxTarget.indeterminate = false;\n    } else {\n      this.selectAllCheckboxTarget.checked = false;\n      this.selectAllCheckboxTarget.indeterminate = true;\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class RemoveElementController extends Controller {\n  removeElement(event) {\n    const id = event.currentTarget.dataset.id;\n    const element = document.getElementById(id);\n\n    if (element) {\n      element.remove();\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class ConversationSearchController extends Controller {\n  static targets = [\"input\", \"form\"];\n  static values = {\n    vacanciesPanel: String,\n    applicantsPanel: String,\n    vacanciesPlaceholder: String,\n    applicantsPlaceholder: String,\n  };\n\n  switchPanel(event) {\n    const panel = event.currentTarget.dataset.conversationSearchPanelParam;\n    if (!panel) return;\n\n    const panelId =\n      panel === \"applicants\"\n        ? this.applicantsPanelValue\n        : this.vacanciesPanelValue;\n    const placeholder =\n      panel === \"applicants\"\n        ? this.applicantsPlaceholderValue\n        : this.vacanciesPlaceholderValue;\n\n    this.formTarget.setAttribute(\"hx-target\", `#${panelId}`);\n    this.formTarget.setAttribute(\"hx-vals\", JSON.stringify({ panel }));\n    this.inputTarget.placeholder = placeholder;\n    this.inputTarget.value = \"\";\n\n    if (window.htmx) {\n      window.htmx.process(this.inputTarget);\n      window.htmx.process(this.formTarget);\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { eventBus } from \"../services/event_bus\";\n\nexport class ConversationChatController extends Controller {\n  static targets = [\"list\", \"template\"];\n  static values = {\n    conversationId: String,\n    avatarUrl: String,\n  };\n\n  connect() {\n    this.onChatMessage = (event) => this.handleChatMessage(event.detail);\n    eventBus.on(\"chat:message\", this.onChatMessage);\n  }\n\n  disconnect() {\n    eventBus.off(\"chat:message\", this.onChatMessage);\n  }\n\n  handleChatMessage(payload) {\n    if (payload.event !== \"message.created\") return;\n\n    const message = payload.data?.message;\n\n    if (!message) return;\n    if (String(message.conversation_id) !== this.conversationIdValue) return;\n\n    this.appendMessage(message);\n  }\n\n  // Clone the page's received-message row (the template target)\n  appendMessage(message) {\n    const lastMessage = this.listTarget.lastElementChild;\n    const showAvatar = lastMessage?.dataset.direction !== \"received\";\n    const row = this.templateTarget.content.firstElementChild.cloneNode(true);\n    const now = new Date();\n\n    row.querySelector(\"[data-text]\").textContent = message.text;\n    const time = row.querySelector(\"[data-time]\");\n    time.textContent = now.toLocaleTimeString([], {\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n    });\n    time.dateTime = now.toISOString();\n\n    const avatar = row.querySelector(\"[data-avatar]\");\n    if (showAvatar) {\n      avatar.src = this.avatarUrlValue;\n    } else {\n      avatar.remove();\n    }\n\n    this.listTarget.appendChild(row);\n    row.scrollIntoView({ block: \"end\" });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { eventBus } from \"../services/event_bus\";\n\n// The header's unread indicator: shown on a real-time message, hidden by \"Mark all as read\".\n// The panel itself opens and closes through the disclosure controller.\nexport class NotificationDropdownController extends Controller {\n  static targets = [\"indicator\"];\n\n  connect() {\n    this.onChatMessage = (event) => this.handleChatMessage(event.detail);\n    eventBus.on(\"chat:message\", this.onChatMessage);\n  }\n\n  disconnect() {\n    eventBus.off(\"chat:message\", this.onChatMessage);\n  }\n\n  handleChatMessage(payload) {\n    if (payload?.event !== \"message.created\") return;\n    this.showIndicator();\n  }\n\n  showIndicator() {\n    if (this.hasIndicatorTarget) this.indicatorTarget.hidden = false;\n  }\n\n  hideIndicator() {\n    if (this.hasIndicatorTarget) this.indicatorTarget.hidden = true;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport { eventBus } from \"../services/event_bus\";\n\nconst SNACK_DURATION_MS = 5000;\n\nexport class NotificationSnackController extends Controller {\n  static values = {\n    closeLabel: String,\n    titleConversation: String,\n    titleMessage: String,\n    titleApplication: String,\n    titleProfileView: String,\n    titlePaymentReceived: String,\n    titleVideoCallScheduled: String,\n  };\n\n  connect() {\n    this.titlesByType = {\n      conversation: this.titleConversationValue,\n      message: this.titleMessageValue,\n      application: this.titleApplicationValue,\n      profile_view: this.titleProfileViewValue,\n      payment_received: this.titlePaymentReceivedValue,\n      video_call_scheduled: this.titleVideoCallScheduledValue,\n    };\n    this.onRealtimeMessage = (event) => this.handleMessage(event.detail);\n    eventBus.on(\"chat:message\", this.onRealtimeMessage);\n  }\n\n  disconnect() {\n    eventBus.off(\"chat:message\", this.onRealtimeMessage);\n  }\n\n  handleMessage(payload) {\n    if (payload?.event !== \"notification.created\") return;\n    this.show(payload.data?.notification);\n  }\n\n  show(notification) {\n    if (!notification?.message) return;\n\n    const snack = document.createElement(\"div\");\n    snack.className = \"notification-snack\";\n    snack.setAttribute(\"role\", \"status\");\n\n    const content = document.createElement(\"div\");\n    content.className = \"notification-snack__content\";\n\n    const title = this.titlesByType[notification.type];\n\n    if (title) {\n      const titleEl = document.createElement(\"p\");\n      titleEl.className = \"notification-snack__title\";\n      titleEl.textContent = title;\n      content.appendChild(titleEl);\n    }\n\n    const messageEl = document.createElement(\"p\");\n    messageEl.className = \"notification-snack__message\";\n    messageEl.textContent = notification.message;\n    content.appendChild(messageEl);\n\n    const closeButton = document.createElement(\"button\");\n    closeButton.type = \"button\";\n    closeButton.className = \"notification-snack__close\";\n    closeButton.setAttribute(\"aria-label\", this.closeLabelValue);\n\n    snack.append(content, closeButton);\n    this.element.appendChild(snack);\n\n    const timeoutId = window.setTimeout(\n      () => this.dismiss(snack),\n      SNACK_DURATION_MS,\n    );\n\n    closeButton.addEventListener(\"click\", () => {\n      window.clearTimeout(timeoutId);\n      this.dismiss(snack);\n    });\n  }\n\n  dismiss(snack) {\n    snack.remove();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// The checkout's Stripe form (design D4 of route-stripe-payments-by-country). The payment panel\n// arrives after the customer chooses a country, carrying the publishable key of that country's\n// Stripe account and the PaymentIntent's client secret on its `intent` target; a new country\n// replaces the panel, so the Payment Element is torn down and mounted again.\nexport class StripePaymentController extends Controller {\n  static targets = [\n    \"intent\",\n    \"element\",\n    \"submit\",\n    \"error\",\n    \"country\",\n    \"billing\",\n  ];\n  static values = {\n    // Shown when the billing options can't be stored (network or server failure)\n    prepareError: String,\n    // Optional: style the Payment Element from the design tokens and follow the theme\n    themed: Boolean,\n    fontCssUrl: String,\n  };\n\n  connect() {\n    if (this.themedValue) this.followTheme();\n  }\n\n  disconnect() {\n    this.teardown();\n    this.themeObserver?.disconnect();\n    this.colorScheme?.removeEventListener(\"change\", this.onThemeChange);\n  }\n\n  intentTargetConnected(intent) {\n    this.teardown();\n    this.paymentComplete = false;\n    this.intent = intent;\n    this.stripe = window.Stripe(intent.dataset.publishableKey);\n    this.elements = this.stripe.elements({\n      clientSecret: intent.dataset.clientSecret,\n      ...(this.themedValue ? this.themeOptions() : {}),\n    });\n    this.paymentElement = this.elements.create(\"payment\", {\n      layout: \"tabs\",\n      fields: { billingDetails: { address: { country: \"never\" } } },\n    });\n    this.paymentElement.on(\"change\", (event) => {\n      this.paymentComplete = event.complete;\n      this.updateSubmitState();\n    });\n    this.paymentElement.mount(\n      intent.querySelector('[data-stripe-payment-target=\"element\"]'),\n    );\n  }\n\n  intentTargetDisconnected(intent) {\n    if (intent === this.intent) this.teardown();\n  }\n\n  teardown() {\n    this.paymentElement?.destroy();\n    this.paymentElement = null;\n    this.elements = null;\n    this.intent = null;\n  }\n\n  // The Payment Element renders in Stripe's iframe, so the design tokens (resolved hex\n  // colors) are passed as its appearance variables, plus the font for the iframe.\n  themeOptions() {\n    return {\n      appearance: this.appearance(),\n      ...(this.fontCssUrlValue\n        ? { fonts: [{ cssSrc: this.fontCssUrlValue }] }\n        : {}),\n    };\n  }\n\n  appearance() {\n    const styles = getComputedStyle(this.element);\n    const token = (name) => styles.getPropertyValue(name).trim();\n    const rootFontSize = parseFloat(\n      getComputedStyle(document.documentElement).fontSize,\n    );\n    const radius = token(\"--ds-radius-md\");\n    const radiusPx = radius.endsWith(\"rem\")\n      ? `${parseFloat(radius) * rootFontSize}px`\n      : radius;\n\n    return {\n      theme: \"stripe\",\n      variables: {\n        colorPrimary: token(\"--ds-color-primary\"),\n        colorBackground: token(\"--ds-color-surface-elevated\"),\n        colorText: token(\"--ds-color-text-primary\"),\n        colorTextSecondary: token(\"--ds-color-text-secondary\"),\n        colorTextPlaceholder: token(\"--ds-color-text-muted\"),\n        colorDanger: token(\"--ds-color-error\"),\n        fontFamily: token(\"--ds-font-family\"),\n        borderRadius: radiusPx,\n      },\n      rules: {\n        \".Input\": { border: `1px solid ${token(\"--ds-color-border-strong\")}` },\n        \".Tab\": { border: `1px solid ${token(\"--ds-color-border-strong\")}` },\n      },\n    };\n  }\n\n  // Re-apply the tokens when the theme toggle (<html data-theme>) or the system scheme changes\n  followTheme() {\n    this.onThemeChange = () =>\n      this.elements?.update({ appearance: this.appearance() });\n    this.themeObserver = new MutationObserver(this.onThemeChange);\n    this.themeObserver.observe(document.documentElement, {\n      attributes: true,\n      attributeFilter: [\"data-theme\"],\n    });\n    this.colorScheme = window.matchMedia(\"(prefers-color-scheme: dark)\");\n    this.colorScheme.addEventListener(\"change\", this.onThemeChange);\n  }\n\n  // The country is always chosen here: the panel only exists after it\n  updateSubmitState() {\n    if (this.hasSubmitTarget)\n      this.submitTarget.disabled = !this.paymentComplete;\n  }\n\n  async submit(event) {\n    event.preventDefault();\n    if (!this.elements) return;\n\n    this.submitTarget.disabled = true;\n    this.errorTarget.textContent = \"\";\n\n    // The billing options are validated and stored on the server before paying\n    if (this.hasBillingTarget && !(await this.prepare())) {\n      this.updateSubmitState();\n      return;\n    }\n\n    const { error } = await this.stripe.confirmPayment({\n      elements: this.elements,\n      confirmParams: {\n        return_url: this.intent.dataset.returnUrl,\n        payment_method_data: {\n          billing_details: {\n            address: { country: this.countryTarget.value },\n          },\n        },\n      },\n    });\n\n    if (error) {\n      this.errorTarget.textContent = error.message;\n      this.updateSubmitState();\n    }\n  }\n\n  // POST the billing options; 204 means ready to pay, 422 brings them back with their errors\n  async prepare() {\n    const form = this.billingTarget;\n    let response;\n    try {\n      response = await fetch(form.dataset.prepareUrl, {\n        method: \"POST\",\n        body: new FormData(form),\n        credentials: \"same-origin\",\n        headers: { \"HX-Request\": \"true\" },\n      });\n    } catch {\n      this.errorTarget.textContent = this.prepareErrorValue;\n      return false;\n    }\n    if (response.status === 204) {\n      // Accepted: errors from an earlier attempt no longer apply\n      form\n        .querySelectorAll(\".ds-field__error\")\n        .forEach((error) => error.remove());\n      form\n        .querySelectorAll('[aria-invalid=\"true\"]')\n        .forEach((field) => field.removeAttribute(\"aria-invalid\"));\n      form\n        .querySelectorAll(\".ds-field--error\")\n        .forEach((field) => field.classList.remove(\"ds-field--error\"));\n      return true;\n    }\n    if (response.status === 422) {\n      const wrapper = form.closest(\"#checkout-billing\") || form;\n      wrapper.outerHTML = await response.text();\n      const invalid = this.element.querySelector(\n        '#checkout-billing [aria-invalid=\"true\"], #checkout-billing [role=\"alert\"]',\n      );\n      if (invalid?.getAttribute(\"role\") === \"alert\")\n        invalid.setAttribute(\"tabindex\", \"-1\");\n      invalid?.focus();\n      return false;\n    }\n    this.errorTarget.textContent = this.prepareErrorValue;\n    return false;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class CreditsPurchaseController extends Controller {\n  static targets = [\"quantity\", \"total\"];\n  static values = {\n    unitPrice: Number,\n    currency: String,\n    errorModalUrl: String,\n  };\n\n  connect() {\n    this.recalculate();\n  }\n\n  validate(event) {\n    if (this.currentQuantity() * this.unitPriceValue <= 0) {\n      event.preventDefault();\n      htmx.ajax(\"GET\", this.errorModalUrlValue, {\n        target: \"#modal_wrapper\",\n        swap: \"innerHTML\",\n      });\n    }\n  }\n\n  increment() {\n    this.quantityTarget.value = this.currentQuantity() + 1;\n    this.recalculate();\n  }\n\n  decrement() {\n    this.quantityTarget.value = Math.max(1, this.currentQuantity() - 1);\n    this.recalculate();\n  }\n\n  recalculate() {\n    const total = this.currentQuantity() * this.unitPriceValue;\n    this.totalTarget.textContent = `$${total.toFixed(2)} ${this.currencyValue}`;\n  }\n\n  currentQuantity() {\n    const value = parseInt(this.quantityTarget.value, 10);\n    return Number.isNaN(value) || value < 1 ? 1 : value;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class ScheduleVideoCallController extends Controller {\n  static targets = [\"form\", \"timezone\", \"date\", \"time\"];\n  static values = {\n    selectedTimezone: String,\n  };\n\n  connect() {\n    this.populateTimezones();\n    this.refreshLimits();\n  }\n\n  populateTimezones() {\n    if (!this.hasTimezoneTarget || this.timezoneTarget.options.length) return;\n\n    const localZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n    const selectedZone = this.selectedTimezoneValue || localZone;\n    const zones =\n      typeof Intl.supportedValuesOf === \"function\"\n        ? Intl.supportedValuesOf(\"timeZone\")\n        : [localZone];\n\n    if (!zones.includes(selectedZone)) zones.unshift(selectedZone);\n\n    zones.forEach((zone) => {\n      const option = document.createElement(\"option\");\n      option.value = zone;\n      option.textContent = zone;\n      option.selected = zone === selectedZone;\n      this.timezoneTarget.appendChild(option);\n    });\n  }\n\n  // Hints only: the server decides whether the scheduled datetime is in the future\n  refreshLimits() {\n    if (!this.hasDateTarget || !this.hasTimeTarget) return;\n\n    const { date, time } = this.nowIn(this.selectedZone());\n\n    this.dateTarget.min = date;\n\n    if (this.dateTarget.value === date) {\n      this.timeTarget.min = time;\n    } else {\n      this.timeTarget.removeAttribute(\"min\");\n    }\n  }\n\n  selectedZone() {\n    return (\n      (this.hasTimezoneTarget && this.timezoneTarget.value) ||\n      Intl.DateTimeFormat().resolvedOptions().timeZone\n    );\n  }\n\n  // Current date (YYYY-MM-DD) and next minute (HH:MM) in the given time zone\n  nowIn(timeZone) {\n    const nextMinute = new Date(Date.now() + 60 * 1000);\n    const parts = Object.fromEntries(\n      new Intl.DateTimeFormat(\"en-CA\", {\n        timeZone,\n        year: \"numeric\",\n        month: \"2-digit\",\n        day: \"2-digit\",\n        hour: \"2-digit\",\n        minute: \"2-digit\",\n        hourCycle: \"h23\",\n      })\n        .formatToParts(nextMinute)\n        .map(({ type, value }) => [type, value]),\n    );\n\n    return {\n      date: `${parts.year}-${parts.month}-${parts.day}`,\n      time: `${parts.hour}:${parts.minute}`,\n    };\n  }\n\n  close() {\n    this.element.close();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nexport class OpenVideoCallController extends Controller {\n  static values = { url: String };\n\n  open() {\n    window.open(this.urlValue, \"_blank\", \"noopener\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Browser hints for the candidate age range; the server enforces the same rules\nexport class VacancyAgeRangeController extends Controller {\n  static targets = [\"minimum\", \"maximum\"];\n  static values = {\n    minimumMessage: String,\n    maximumLimitMessage: String,\n    maximumOrderMessage: String,\n  };\n\n  connect() {\n    this.refresh();\n  }\n\n  refresh() {\n    const minimum = this.numberOf(this.minimumTarget);\n    const maximum = this.numberOf(this.maximumTarget);\n    const minimumIsValid = minimum === null || minimum >= 18;\n\n    this.maximumTarget.min =\n      minimum !== null && minimumIsValid ? minimum + 1 : 19;\n\n    this.minimumTarget.setCustomValidity(\n      minimumIsValid ? \"\" : this.minimumMessageValue,\n    );\n\n    let maximumMessage = \"\";\n    if (maximum !== null) {\n      if (maximum >= 100) {\n        maximumMessage = this.maximumLimitMessageValue;\n      } else if (minimum !== null && minimumIsValid && maximum <= minimum) {\n        maximumMessage = this.maximumOrderMessageValue;\n      }\n    }\n    this.maximumTarget.setCustomValidity(maximumMessage);\n  }\n\n  numberOf(input) {\n    const value = parseInt(input.value, 10);\n    return Number.isNaN(value) ? null : value;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Shared confirmation for hx-confirm; main.js issues the pending request on \"confirmed\"\nexport class ConfirmModalController extends Controller {\n  connect() {\n    this.onClose = () => this.dispatch(\"closed\");\n    this.element.addEventListener(\"close\", this.onClose);\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"close\", this.onClose);\n  }\n\n  confirm() {\n    this.dispatch(\"confirmed\");\n    this.element.close();\n  }\n\n  cancel() {\n    this.element.close();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Light/dark theme toggle. The stored choice is applied before first paint by\n// the inline bootstrap in templates/layouts/site.layout.html; this controller\n// only flips it. aria-pressed=\"true\" means the dark theme is active.\nconst STORAGE_KEY = \"pb-theme\";\nconst DARK_QUERY = \"(prefers-color-scheme: dark)\";\n\nexport class ThemeToggleController extends Controller {\n  connect() {\n    this.media = window.matchMedia(DARK_QUERY);\n    this.onSystemChange = () => this.sync();\n    this.media.addEventListener(\"change\", this.onSystemChange);\n\n    // The button is rendered hidden: it only works with JavaScript.\n    this.element.hidden = false;\n    this.sync();\n  }\n\n  disconnect() {\n    this.media?.removeEventListener(\"change\", this.onSystemChange);\n  }\n\n  toggle() {\n    const next = this.currentTheme() === \"dark\" ? \"light\" : \"dark\";\n\n    document.documentElement.dataset.theme = next;\n\n    try {\n      window.localStorage.setItem(STORAGE_KEY, next);\n    } catch (e) {\n      // Storage unavailable (private mode, blocked): the theme still applies to this view.\n    }\n\n    this.sync();\n  }\n\n  currentTheme() {\n    const explicit = document.documentElement.dataset.theme;\n    if (explicit === \"light\" || explicit === \"dark\") return explicit;\n    return this.media.matches ? \"dark\" : \"light\";\n  }\n\n  sync() {\n    this.element.setAttribute(\n      \"aria-pressed\",\n      String(this.currentTheme() === \"dark\"),\n    );\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Accessible disclosure (menus: Services, account, language, mobile nav).\n// Toggles aria-expanded on the button and the `hidden` attribute on the panel at\n// every width. Closes on Escape (returning focus to the button), outside click,\n// and when focus leaves the controller element. With `closeAbove` (a media\n// query), it also closes when that query starts matching (e.g. mobile nav on\n// resize to desktop). Dispatches `disclosure:open` on the controller element\n// when it opens (e.g. to lazy-load the notifications panel). With `focusFirst`,\n// opening moves focus to the first link or button in the panel (for a panel\n// that comes before its button in the DOM, e.g. the app header's mobile nav).\nexport class DisclosureController extends Controller {\n  static targets = [\"button\", \"panel\"];\n  static values = { closeAbove: String, focusFirst: Boolean };\n\n  connect() {\n    this.onDocumentClick = this.onDocumentClick.bind(this);\n    this.onKeydown = this.onKeydown.bind(this);\n    this.onFocusOut = this.onFocusOut.bind(this);\n\n    document.addEventListener(\"click\", this.onDocumentClick);\n    this.element.addEventListener(\"keydown\", this.onKeydown);\n    this.element.addEventListener(\"focusout\", this.onFocusOut);\n\n    if (this.closeAboveValue) {\n      this.media = window.matchMedia(this.closeAboveValue);\n      this.onMediaChange = (e) => e.matches && this.close();\n      this.media.addEventListener(\"change\", this.onMediaChange);\n    }\n\n    this.close();\n  }\n\n  disconnect() {\n    document.removeEventListener(\"click\", this.onDocumentClick);\n    this.element.removeEventListener(\"keydown\", this.onKeydown);\n    this.element.removeEventListener(\"focusout\", this.onFocusOut);\n    this.media?.removeEventListener(\"change\", this.onMediaChange);\n  }\n\n  get isOpen() {\n    return this.buttonTarget.getAttribute(\"aria-expanded\") === \"true\";\n  }\n\n  toggle(event) {\n    event?.preventDefault();\n    this.isOpen ? this.close() : this.open();\n  }\n\n  open() {\n    this.buttonTarget.setAttribute(\"aria-expanded\", \"true\");\n    this.panelTarget.hidden = false;\n    this.dispatch(\"open\");\n    if (this.focusFirstValue)\n      this.panelTarget\n        .querySelector(\"a[href], button:not([disabled])\")\n        ?.focus();\n  }\n\n  close({ focusButton = false } = {}) {\n    this.buttonTarget.setAttribute(\"aria-expanded\", \"false\");\n    this.panelTarget.hidden = true;\n    if (focusButton) this.buttonTarget.focus();\n  }\n\n  onKeydown(event) {\n    if (event.key !== \"Escape\" || !this.isOpen) return;\n    // Only the innermost open disclosure handles Escape.\n    event.stopPropagation();\n    this.close({ focusButton: true });\n  }\n\n  onDocumentClick(event) {\n    if (this.isOpen && !this.element.contains(event.target)) this.close();\n  }\n\n  onFocusOut(event) {\n    if (\n      this.isOpen &&\n      event.relatedTarget &&\n      !this.element.contains(event.relatedTarget)\n    ) {\n      this.close();\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Password show/hide toggle. The button keeps a static, translated accessible\n// name (\"Show password\") and exposes the state with aria-pressed.\nexport class PasswordRevealController extends Controller {\n  static targets = [\"input\", \"button\"];\n\n  connect() {\n    this.buttonTarget.hidden = false; // the toggle only works with JavaScript\n  }\n\n  toggle() {\n    const reveal = this.inputTarget.type === \"password\";\n    this.inputTarget.type = reveal ? \"text\" : \"password\";\n    this.buttonTarget.setAttribute(\"aria-pressed\", String(reveal));\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Client-side \"required\" check for a ds-field. On blur, an empty required\n// input shows the translated message (from the template) and is marked\n// aria-invalid; typing a value clears that client error. Server-rendered errors\n// are left as they are. With the \"invalid\" action (form_field validate_on_submit),\n// a submit the browser blocks shows the same message instead of the browser's own\n// bubble, and focus moves to the first invalid field (centralize-vacancy-search D4).\nexport class FieldValidationController extends Controller {\n  static targets = [\"input\", \"error\", \"message\"];\n  static values = { message: String };\n\n  validate() {\n    const input = this.inputTarget;\n    if (!input.required || input.value.trim() !== \"\") return;\n    this.show(this.messageValue);\n  }\n\n  blocked(event) {\n    event.preventDefault();\n    this.validate();\n    const form = this.inputTarget.form;\n    const first = form && form.querySelector(\":invalid\");\n    if (first === this.inputTarget) this.inputTarget.focus();\n  }\n\n  clear() {\n    if (this.clientError && this.inputTarget.value.trim() !== \"\") {\n      this.clientError = false;\n      this.errorTarget.hidden = true;\n      this.messageTarget.textContent = \"\";\n      this.inputTarget.removeAttribute(\"aria-invalid\");\n      this.describe(false);\n      this.element.classList.remove(\"ds-field--error\");\n    }\n  }\n\n  show(text) {\n    this.clientError = true;\n    this.messageTarget.textContent = text;\n    this.errorTarget.hidden = false;\n    this.inputTarget.setAttribute(\"aria-invalid\", \"true\");\n    this.describe(true);\n    this.element.classList.add(\"ds-field--error\");\n  }\n\n  // Reference the error from aria-describedby only while it is shown.\n  describe(on) {\n    const ids = (this.inputTarget.getAttribute(\"aria-describedby\") || \"\")\n      .split(/\\s+/)\n      .filter(Boolean);\n    const id = this.errorTarget.id;\n    const next = on ? [...new Set([...ids, id])] : ids.filter((x) => x !== id);\n    if (next.length)\n      this.inputTarget.setAttribute(\"aria-describedby\", next.join(\" \"));\n    else this.inputTarget.removeAttribute(\"aria-describedby\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Keeps a submit button disabled while any required field inside the\n// controller's element is empty (add-account-deletion D6). The loading state\n// and duplicate-submit guard stay with the global handlers in main.js.\nexport class RequiredSubmitController extends Controller {\n  static targets = [\"button\"];\n\n  connect() {\n    this.update();\n  }\n\n  update() {\n    const fields = this.element.querySelectorAll(\n      \"input[required], textarea[required], select[required]\",\n    );\n    const empty = [...fields].some((field) => field.value.trim() === \"\");\n    this.buttonTargets.forEach((button) => {\n      if (!button.dataset.loading) button.disabled = empty;\n    });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Chip list (skills, languages): add/remove \"name: level\" entries on the\n// page and keep the hidden `name`/`level` fields in the same \"||\"-joined format\n// the server expects. Rows are cloned\n// from a <template> and filled with textContent (no HTML injection); changes\n// are announced in a live region.\nexport class ChipListController extends Controller {\n  static targets = [\n    \"name\",\n    \"level\",\n    \"names\",\n    \"levels\",\n    \"list\",\n    \"template\",\n    \"status\",\n  ];\n  static values = {\n    max: Number,\n    min: Number, // optional: entries that must remain\n    minMessage: String, // \"Keep at least %s\"\n    removeLabel: String, // \"Remove %s\"\n    addedMessage: String, // \"%s added\"\n    removedMessage: String, // \"%s removed\"\n    maxMessage: String, // \"You can add up to %s\"\n  };\n\n  add(event) {\n    event?.preventDefault();\n    const name = this.nameTarget.value.trim();\n    const level = this.levelTarget.value;\n    if (!name || !level) {\n      this.nameTarget.focus();\n      return;\n    }\n    if (this.hasMaxValue && this.chips.length >= this.maxValue) {\n      this.announce(this.maxMessageValue.replace(\"%s\", this.maxValue));\n      return;\n    }\n\n    const levelText = this.levelTarget.selectedOptions[0]?.text.trim() || level;\n    const chip = this.templateTarget.content.firstElementChild.cloneNode(true);\n    chip.dataset.name = name;\n    chip.dataset.level = level;\n    chip.querySelector(\"[data-chip-text]\").textContent =\n      `${name}: ${levelText}`;\n    chip\n      .querySelector(\"button\")\n      .setAttribute(\"aria-label\", this.removeLabelValue.replace(\"%s\", name));\n    this.listTarget.appendChild(chip);\n\n    this.sync();\n    this.announce(this.addedMessageValue.replace(\"%s\", name));\n    this.nameTarget.value = \"\";\n    this.levelTarget.selectedIndex = 0;\n    this.nameTarget.focus();\n  }\n\n  remove(event) {\n    const chip = event.currentTarget.closest(\"[data-chip]\");\n    if (!chip) return;\n    if (this.hasMinValue && this.chips.length <= this.minValue) {\n      this.announce(this.minMessageValue.replace(\"%s\", this.minValue));\n      return;\n    }\n    const next = chip.nextElementSibling || chip.previousElementSibling;\n    const name = chip.dataset.name;\n    chip.remove();\n    this.sync();\n    this.announce(this.removedMessageValue.replace(\"%s\", name));\n    (next?.querySelector(\"button\") || this.nameTarget).focus();\n  }\n\n  get chips() {\n    return [...this.listTarget.querySelectorAll(\"[data-chip]\")];\n  }\n\n  sync() {\n    this.namesTarget.value = this.chips.map((c) => c.dataset.name).join(\"||\");\n    this.levelsTarget.value = this.chips.map((c) => c.dataset.level).join(\"||\");\n    this.listTarget.hidden = this.chips.length === 0;\n  }\n\n  announce(message) {\n    this.statusTarget.textContent = \"\";\n    requestAnimationFrame(() => (this.statusTarget.textContent = message));\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// \"Current job / current education\" checkbox: while checked, the end-date\n// field is disabled (so it is neither required nor submitted, as the server\n// expects for an ongoing item).\nexport class CurrentPeriodController extends Controller {\n  static targets = [\"checkbox\", \"end\"];\n\n  connect() {\n    this.sync();\n  }\n\n  sync() {\n    const current = this.checkboxTarget.checked;\n    this.endTarget.disabled = current;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Backoffice line chart readout (progressive enhancement). A crosshair snaps\n// to the nearest bucket on pointer move; on keyboard focus, \u2190/\u2192/Home/End move it\n// and a polite live region announces the value. The chart's data table stays the\n// text alternative, so nothing here is the only way to read a value.\nexport class LineChartController extends Controller {\n  static targets = [\n    \"plot\",\n    \"crosshair\",\n    \"marker\",\n    \"tooltip\",\n    \"tooltipValue\",\n    \"tooltipLabel\",\n    \"status\",\n  ];\n  static values = { points: Array };\n\n  connect() {\n    this.index = null;\n  }\n\n  track(event) {\n    if (!this.pointsValue.length) return;\n\n    const bounds = this.plotTarget.getBoundingClientRect();\n    const percent = ((event.clientX - bounds.left) / bounds.width) * 100;\n    this.show(this.nearest(percent), false);\n  }\n\n  focus() {\n    if (this.pointsValue.length) this.show(this.pointsValue.length - 1, true);\n  }\n\n  move(event) {\n    const last = this.pointsValue.length - 1;\n    if (last < 0 || this.index === null) return;\n\n    const next = {\n      ArrowLeft: Math.max(0, this.index - 1),\n      ArrowRight: Math.min(last, this.index + 1),\n      Home: 0,\n      End: last,\n    }[event.key];\n\n    if (event.key === \"Escape\") {\n      this.hide();\n      return;\n    }\n    if (next === undefined) return;\n\n    event.preventDefault();\n    this.show(next, true);\n  }\n\n  hide() {\n    this.index = null;\n    this.crosshairTarget.hidden = true;\n    this.markerTarget.hidden = true;\n    this.tooltipTarget.hidden = true;\n  }\n\n  nearest(percent) {\n    let best = 0;\n    this.pointsValue.forEach((point, index) => {\n      if (\n        Math.abs(point.x - percent) <\n        Math.abs(this.pointsValue[best].x - percent)\n      ) {\n        best = index;\n      }\n    });\n    return best;\n  }\n\n  show(index, announce) {\n    const point = this.pointsValue[index];\n    const value = point.value.toLocaleString(document.documentElement.lang);\n    this.index = index;\n\n    this.crosshairTarget.style.left = `${point.x}%`;\n    this.markerTarget.style.left = `${point.x}%`;\n    this.markerTarget.style.top = `${point.y}%`;\n    this.tooltipValueTarget.textContent = value;\n    this.tooltipLabelTarget.textContent = point.label;\n\n    this.crosshairTarget.hidden = false;\n    this.markerTarget.hidden = false;\n    this.tooltipTarget.hidden = false;\n    this.placeTooltip(point.x);\n\n    if (announce) this.statusTarget.textContent = `${value} \u00B7 ${point.label}`;\n  }\n\n  // Keep the tooltip inside the plot near the edges\n  placeTooltip(percent) {\n    const plotWidth = this.plotTarget.clientWidth;\n    const tipWidth = this.tooltipTarget.offsetWidth;\n    const center = (percent / 100) * plotWidth;\n    const left = Math.min(\n      Math.max(center - tipWidth / 2, 0),\n      plotWidth - tipWidth,\n    );\n    this.tooltipTarget.style.left = `${left}px`;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Messages: marks the open conversation's row (aria-current) and, on phones,\n// shows one pane at a time (the `open` class shows the conversation instead of\n// the list). Rows are re-marked after every swap (open, search, vacancy drill-down)\n// by matching their link to the address.\nexport class ConversationPanesController extends Controller {\n  static classes = [\"open\"];\n  static values = {\n    narrow: { type: String, default: \"(max-width: 47.99rem)\" },\n  };\n\n  connect() {\n    this.onSettle = this.onSettle.bind(this);\n    this.markCurrent = this.markCurrent.bind(this);\n    this.element.addEventListener(\"htmx:afterSettle\", this.onSettle);\n    // The address is updated after the swap; history events also cover back/forward\n    document.body.addEventListener(\"htmx:pushedIntoHistory\", this.markCurrent);\n    window.addEventListener(\"popstate\", this.markCurrent);\n    this.markCurrent();\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"htmx:afterSettle\", this.onSettle);\n    document.body.removeEventListener(\n      \"htmx:pushedIntoHistory\",\n      this.markCurrent,\n    );\n    window.removeEventListener(\"popstate\", this.markCurrent);\n  }\n\n  open() {\n    this.element.classList.add(this.openClass);\n    this.pendingFocus = true;\n  }\n\n  back() {\n    this.element.classList.remove(this.openClass);\n    this.element\n      .querySelector('.ds-conversation-row[aria-current=\"true\"]')\n      ?.focus();\n  }\n\n  onSettle(event) {\n    this.markCurrent();\n\n    // On phones the row that was activated is now hidden: continue on the conversation's heading\n    if (this.pendingFocus && event.detail.target?.id === \"conversation-panel\") {\n      this.pendingFocus = false;\n      if (window.matchMedia(this.narrowValue).matches) {\n        document.getElementById(\"conversation-title\")?.focus();\n      }\n    }\n  }\n\n  markCurrent() {\n    this.element\n      .querySelectorAll(\".ds-conversation-row[href]\")\n      .forEach((row) => {\n        if (row.getAttribute(\"href\") === window.location.pathname) {\n          row.setAttribute(\"aria-current\", \"true\");\n        } else {\n          row.removeAttribute(\"aria-current\");\n        }\n      });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Printable pages (the applicant CV): `print` opens the print dialog, and a\n// `?print=true` address prints once on load and drops the parameter.\nexport class PrintPageController extends Controller {\n  connect() {\n    const url = new URL(window.location.href);\n    if (!url.searchParams.has(\"print\")) return;\n\n    url.searchParams.delete(\"print\");\n    window.history.replaceState(window.history.state, \"\", url);\n    // After the first paint, so the printed page is the rendered CV\n    window.requestAnimationFrame(() => window.print());\n  }\n\n  print() {\n    window.print();\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// List + detail pages (the job search). `open` (on an item's button) marks\n// it aria-current and, below 64rem, shows the detail pane instead of the list\n// (the `open` class); once the detail panel is swapped in, focus moves to its\n// heading there. `back` returns to the list and to the current item. Marks are\n// kept across list swaps (filter, pagination, hide) by the item's hx-get URL.\nexport class ListDetailController extends Controller {\n  static classes = [\"open\"];\n  static values = {\n    panel: String,\n    heading: String,\n    narrow: { type: String, default: \"(max-width: 63.99rem)\" },\n  };\n\n  connect() {\n    this.onSettle = this.onSettle.bind(this);\n    this.element.addEventListener(\"htmx:afterSettle\", this.onSettle);\n  }\n\n  disconnect() {\n    this.element.removeEventListener(\"htmx:afterSettle\", this.onSettle);\n  }\n\n  open(event) {\n    this.currentUrl = event.currentTarget.getAttribute(\"hx-get\");\n    this.mark();\n    this.element.classList.add(this.openClass);\n    this.pendingFocus = true;\n  }\n\n  back() {\n    this.element.classList.remove(this.openClass);\n    this.currentItem()?.focus();\n  }\n\n  onSettle(event) {\n    const target = event.detail.target;\n\n    if (target?.id === this.panelValue) {\n      // Whichever item loaded the detail (a click, or the first item on load) is the current one\n      const source = event.detail.requestConfig?.elt;\n      if (source?.matches?.(\"[data-action~='click->list-detail#open']\")) {\n        this.currentUrl = source.getAttribute(\"hx-get\");\n      }\n      this.mark();\n      if (this.pendingFocus && window.matchMedia(this.narrowValue).matches) {\n        document.getElementById(this.headingValue)?.focus();\n      }\n      this.pendingFocus = false;\n    } else {\n      this.mark();\n    }\n  }\n\n  currentItem() {\n    if (!this.currentUrl) return null;\n    return [\n      ...this.element.querySelectorAll(\n        \"[data-action~='click->list-detail#open']\",\n      ),\n    ].find((item) => item.getAttribute(\"hx-get\") === this.currentUrl);\n  }\n\n  mark() {\n    const current = this.currentItem();\n    this.element\n      .querySelectorAll(\"[data-action~='click->list-detail#open']\")\n      .forEach((item) => {\n        if (item === current) {\n          item.setAttribute(\"aria-current\", \"true\");\n        } else {\n          item.removeAttribute(\"aria-current\");\n        }\n      });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Billing forms (add-billing-and-invoicing): shows the fields when an invoice is requested,\n// the section of the chosen Mexican method, and checks a constancia's type and size before\n// upload (the server validates it again).\nexport class BillingFormController extends Controller {\n  static targets = [\"invoice\", \"fields\", \"method\", \"file\", \"fileError\"];\n  static values = {\n    maxBytes: Number,\n    typeMessage: String,\n    sizeMessage: String,\n  };\n\n  connect() {\n    const checked = this.element.querySelector('input[name$=\"method\"]:checked');\n    if (checked) this.showMethodFor(checked.value);\n  }\n\n  toggleInvoice() {\n    if (this.hasFieldsTarget && this.hasInvoiceTarget) {\n      this.fieldsTarget.hidden = !this.invoiceTarget.checked;\n    }\n  }\n\n  showMethod(event) {\n    this.showMethodFor(event.target.value);\n  }\n\n  showMethodFor(value) {\n    this.methodTargets.forEach((section) => {\n      section.hidden = section.dataset.method !== value;\n    });\n  }\n\n  checkFile() {\n    const file = this.fileTarget.files[0];\n    let message = \"\";\n    if (file && !file.name.toLowerCase().endsWith(\".pdf\")) {\n      message = this.typeMessageValue;\n    } else if (file && file.size > this.maxBytesValue) {\n      message = this.sizeMessageValue;\n    }\n    if (this.hasFileErrorTarget) {\n      this.fileErrorTarget.querySelector(\"span\").textContent = message;\n      this.fileErrorTarget.hidden = !message;\n    }\n    this.fileTarget.setCustomValidity(message);\n    if (message) this.fileTarget.setAttribute(\"aria-invalid\", \"true\");\n    else this.fileTarget.removeAttribute(\"aria-invalid\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nconst SECONDS_PER_LOGO = 4;\n\n// Turns a static row of logos into an infinite slider (design D1\u2013D4 of add-partner-logo-slider).\n// The items are cloned once so the track can loop seamlessly; the clones are hidden from\n// assistive technology and the keyboard. Nothing moves when reduced motion is requested.\nexport class LogoSliderController extends Controller {\n  static targets = [\"track\"];\n\n  connect() {\n    this.items = [...this.trackTarget.children];\n    this.reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n    this.onMotionChange = () => this.update();\n    this.reducedMotion.addEventListener(\"change\", this.onMotionChange);\n    this.update();\n  }\n\n  disconnect() {\n    this.reducedMotion.removeEventListener(\"change\", this.onMotionChange);\n    this.stop();\n  }\n\n  update() {\n    if (this.reducedMotion.matches) this.stop();\n    else this.start();\n  }\n\n  start() {\n    if (this.element.classList.contains(\"ds-logo-slider--animated\")) return;\n\n    this.items.forEach((item) => {\n      const clone = item.cloneNode(true);\n      clone.dataset.logoSliderClone = \"\";\n      clone.setAttribute(\"aria-hidden\", \"true\");\n      clone\n        .querySelectorAll(\"a\")\n        .forEach((link) => link.setAttribute(\"tabindex\", \"-1\"));\n      clone\n        .querySelectorAll(\"img\")\n        .forEach((img) => img.setAttribute(\"alt\", \"\"));\n      this.trackTarget.appendChild(clone);\n    });\n\n    this.element.style.setProperty(\n      \"--ds-logo-slider-duration\",\n      `${this.items.length * SECONDS_PER_LOGO}s`,\n    );\n    this.element.classList.add(\"ds-logo-slider--animated\");\n  }\n\n  stop() {\n    this.trackTarget\n      .querySelectorAll(\"[data-logo-slider-clone]\")\n      .forEach((clone) => clone.remove());\n    this.element.classList.remove(\"ds-logo-slider--animated\");\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\nconst SECONDS_PER_CARD = 4;\n\n// The /jobs \"Available vacancies\" carousel (centralize-vacancy-search D6): the newest\n// vacancies glide upward in an endless loop, all of them visible at once. The cards are\n// cloned once so the track can loop seamlessly; the clones are inert and hidden from\n// assistive technology. The viewport is sized to the original cards. It pauses on hover\n// and focus (CSS) and with the Pause button; nothing moves under reduced motion, without\n// scripts, or with a single card, where the cards stay a still list.\nexport class VacancyCarouselController extends Controller {\n  static targets = [\"viewport\", \"track\", \"toggle\"];\n  static values = { pauseLabel: String, playLabel: String };\n\n  connect() {\n    this.items = [...this.trackTarget.children];\n    this.reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n    this.onMotionChange = () => this.update();\n    this.reducedMotion.addEventListener(\"change\", this.onMotionChange);\n    this.resize = new ResizeObserver(() => this.fit());\n    this.update();\n  }\n\n  disconnect() {\n    this.reducedMotion.removeEventListener(\"change\", this.onMotionChange);\n    this.stop();\n  }\n\n  update() {\n    if (this.reducedMotion.matches || this.items.length < 2) this.stop();\n    else this.start();\n  }\n\n  start() {\n    if (this.element.classList.contains(\"ds-vacancy-carousel--animated\"))\n      return;\n    this.items.forEach((item) => {\n      const clone = item.cloneNode(true);\n      clone.dataset.vacancyCarouselClone = \"\";\n      clone.setAttribute(\"aria-hidden\", \"true\");\n      clone.inert = true;\n      this.trackTarget.appendChild(clone);\n    });\n    this.element.style.setProperty(\n      \"--ds-vacancy-carousel-duration\",\n      `${this.items.length * SECONDS_PER_CARD}s`,\n    );\n    this.element.classList.add(\"ds-vacancy-carousel--animated\");\n    this.toggleTarget.hidden = false;\n    this.items.forEach((item) => this.resize.observe(item));\n    this.fit();\n  }\n\n  stop() {\n    this.resize.disconnect();\n    this.trackTarget\n      .querySelectorAll(\"[data-vacancy-carousel-clone]\")\n      .forEach((clone) => clone.remove());\n    this.element.classList.remove(\n      \"ds-vacancy-carousel--animated\",\n      \"ds-vacancy-carousel--paused\",\n    );\n    this.viewportTarget.style.removeProperty(\"height\");\n    this.toggleTarget.hidden = true;\n  }\n\n  // The viewport shows exactly the original cards (half of the doubled track)\n  fit() {\n    const last = this.items[this.items.length - 1];\n    const height = last.offsetTop + last.offsetHeight - this.items[0].offsetTop;\n    const gap = parseFloat(getComputedStyle(last).marginBlockEnd) || 0;\n    this.viewportTarget.style.height = `${height + gap}px`;\n  }\n\n  // Pause / Play (WCAG 2.2.2): the button's label says what it will do\n  toggle() {\n    const paused = this.element.classList.toggle(\"ds-vacancy-carousel--paused\");\n    this.toggleTarget.querySelector(\"span\").textContent = paused\n      ? this.playLabelValue\n      : this.pauseLabelValue;\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\n\n// Promotional codes backoffice (add-promotional-codes D7): shows the fields of the chosen\n// benefit and usage (the server validates them again), and copies a code's sign-up link.\nexport class PromoCodeController extends Controller {\n  static targets = [\"section\", \"status\"];\n  static values = { copiedLabel: String };\n\n  connect() {\n    this.update();\n  }\n\n  // Each section has data-field and data-value: shown when that radio group has that value\n  update() {\n    this.sectionTargets.forEach((section) => {\n      const checked = this.element.querySelector(\n        `input[name=\"${section.dataset.field}\"]:checked`,\n      );\n      section.hidden = checked\n        ? checked.value !== section.dataset.value\n        : false;\n    });\n  }\n\n  async copy(event) {\n    const input = document.getElementById(event.params.input);\n    input.select();\n    try {\n      await navigator.clipboard.writeText(input.value);\n      if (this.hasStatusTarget)\n        this.statusTarget.textContent = this.copiedLabelValue;\n    } catch {\n      // The link stays selected for a manual copy\n    }\n  }\n}\n", "import { Application } from \"@hotwired/stimulus\";\n\nimport { socketService } from \"./services/socket_service\";\n\n// Stimulus controllers\nimport { ValidationCodeController } from \"./controllers/validation_code.controller\";\nimport { TelInputController } from \"./controllers/tel-input.controller\";\nimport { ManagedModalController } from \"./controllers/managed-modal.controller\";\nimport { EducationExperienceModalController } from \"./controllers/education-experience-modal.controller\";\nimport { CertificationModalController } from \"./controllers/certification-modal.controller\";\nimport { CropperController } from \"./controllers/cropper.controller\";\nimport { CertificationUploadImageController } from \"./controllers/certification-upload-image.controller\";\nimport { DynamicListController } from \"./controllers/dynamic-list.controller\";\nimport { TabsController } from \"./controllers/tabs.controller\";\nimport { CertificationListController } from \"./controllers/certification-list.controller\";\nimport { VacancySelectionController } from \"./controllers/vacancy-selection.controller\";\nimport { VacancyPreviewController } from \"./controllers/vacancy-preview.controller\";\nimport { ApplicantSelectionController } from \"./controllers/applicant-selection.controller\";\nimport { RemoveElementController } from \"./controllers/remove-element.controller\";\nimport { ConversationSearchController } from \"./controllers/conversation-search.controller\";\nimport { ConversationChatController } from \"./controllers/conversation-chat.controller\";\nimport { NotificationDropdownController } from \"./controllers/notification-dropdown.controller\";\nimport { NotificationSnackController } from \"./controllers/notification-snack.controller\";\nimport { StripePaymentController } from \"./controllers/stripe-payment.controller\";\nimport { CreditsPurchaseController } from \"./controllers/credits-purchase.controller\";\nimport { ScheduleVideoCallController } from \"./controllers/schedule-video-call.controller\";\nimport { OpenVideoCallController } from \"./controllers/open-video-call.controller\";\nimport { VacancyAgeRangeController } from \"./controllers/vacancy-age-range.controller\";\nimport { ConfirmModalController } from \"./controllers/confirm-modal.controller\";\nimport { ThemeToggleController } from \"./controllers/theme-toggle.controller\";\nimport { DisclosureController } from \"./controllers/disclosure.controller\";\nimport { PasswordRevealController } from \"./controllers/password-reveal.controller\";\nimport { FieldValidationController } from \"./controllers/field-validation.controller\";\nimport { RequiredSubmitController } from \"./controllers/required-submit.controller\";\nimport { ChipListController } from \"./controllers/chip-list.controller\";\nimport { CurrentPeriodController } from \"./controllers/current-period.controller\";\nimport { LineChartController } from \"./controllers/line-chart.controller\";\nimport { ConversationPanesController } from \"./controllers/conversation-panes.controller\";\nimport { PrintPageController } from \"./controllers/print-page.controller\";\nimport { ListDetailController } from \"./controllers/list-detail.controller\";\nimport { BillingFormController } from \"./controllers/billing-form.controller\";\nimport { LogoSliderController } from \"./controllers/logo-slider.controller\";\nimport { VacancyCarouselController } from \"./controllers/vacancy-carousel.controller\";\nimport { PromoCodeController } from \"./controllers/promo-code.controller\";\n\nwindow.Stimulus = Application.start();\nsocketService.connect();\n\nStimulus.register(\"validation-code\", ValidationCodeController);\nStimulus.register(\"tel-input\", TelInputController);\nStimulus.register(\"managed-modal\", ManagedModalController);\nStimulus.register(\n  \"education-experience-modal\",\n  EducationExperienceModalController,\n);\nStimulus.register(\"certification-modal\", CertificationModalController);\nStimulus.register(\"cropper\", CropperController);\nStimulus.register(\"certification-upload\", CertificationUploadImageController);\nStimulus.register(\"dynamic-list\", DynamicListController);\nStimulus.register(\"tabs\", TabsController);\nStimulus.register(\"certification-list\", CertificationListController);\nStimulus.register(\"vacancy-selection\", VacancySelectionController);\nStimulus.register(\"vacancy-preview\", VacancyPreviewController);\nStimulus.register(\"applicant-selection\", ApplicantSelectionController);\nStimulus.register(\"remove\", RemoveElementController);\nStimulus.register(\"conversation-search\", ConversationSearchController);\nStimulus.register(\"conversation-chat\", ConversationChatController);\nStimulus.register(\"notification-dropdown\", NotificationDropdownController);\nStimulus.register(\"notification-snack\", NotificationSnackController);\nStimulus.register(\"stripe-payment\", StripePaymentController);\nStimulus.register(\"credits-purchase\", CreditsPurchaseController);\nStimulus.register(\"schedule-video-call\", ScheduleVideoCallController);\nStimulus.register(\"open-video-call\", OpenVideoCallController);\nStimulus.register(\"vacancy-age-range\", VacancyAgeRangeController);\nStimulus.register(\"confirm-modal\", ConfirmModalController);\nStimulus.register(\"theme-toggle\", ThemeToggleController);\nStimulus.register(\"disclosure\", DisclosureController);\nStimulus.register(\"password-reveal\", PasswordRevealController);\nStimulus.register(\"field-validation\", FieldValidationController);\nStimulus.register(\"required-submit\", RequiredSubmitController);\nStimulus.register(\"chip-list\", ChipListController);\nStimulus.register(\"current-period\", CurrentPeriodController);\nStimulus.register(\"line-chart\", LineChartController);\nStimulus.register(\"conversation-panes\", ConversationPanesController);\nStimulus.register(\"print-page\", PrintPageController);\nStimulus.register(\"list-detail\", ListDetailController);\nStimulus.register(\"billing-form\", BillingFormController);\nStimulus.register(\"logo-slider\", LogoSliderController);\nStimulus.register(\"vacancy-carousel\", VacancyCarouselController);\nStimulus.register(\"promo-code\", PromoCodeController);\n\nlet currentScroll = 0;\n\ndocument.body.addEventListener(\"htmx:beforeRequest\", () => {\n  currentScroll = window.scrollY;\n});\n\ndocument.body.addEventListener(\"htmx:afterSettle\", () => {\n  requestAnimationFrame(() => {\n    window.scrollTo(0, currentScroll);\n  });\n});\n\nconst getCSRFToken = function () {\n  const name = \"csrftoken\";\n  const cookies = document.cookie.split(\";\");\n\n  for (let cookie of cookies) {\n    cookie = cookie.trim();\n\n    if (cookie.startsWith(name + \"=\")) {\n      return decodeURIComponent(cookie.substring(name.length + 1));\n    }\n  }\n\n  return null;\n};\n\ndocument.body.addEventListener(\"htmx:configRequest\", (event) => {\n  const token = getCSRFToken();\n\n  if (token) {\n    event.detail.headers[\"X-CSRFToken\"] = token;\n  }\n});\n\n// Submit loaders: disable the submitting buttons and show a spinner until the request ends\nconst SUBMIT_BUTTON_SELECTOR =\n  'button[type=\"submit\"], button:not([type]), input[type=\"submit\"]';\n\nconst submitButtonsFor = (form, submitter = null) => {\n  const buttons = new Set(form.querySelectorAll(SUBMIT_BUTTON_SELECTOR));\n\n  if (form.id) {\n    document\n      .querySelectorAll(`button[form=\"${CSS.escape(form.id)}\"]`)\n      .forEach((button) => buttons.add(button));\n  }\n\n  if (submitter) buttons.add(submitter);\n\n  return [...buttons];\n};\n\nconst setLoading = (button) => {\n  if (button.dataset.loading) return;\n\n  button.dataset.loading = \"true\";\n  button.dataset.originalContent = button.innerHTML;\n  button.style.width = `${button.offsetWidth}px`;\n  button.style.height = `${button.offsetHeight}px`;\n  if (button.hasAttribute(\"aria-label\")) {\n    button.dataset.originalAriaLabel = button.getAttribute(\"aria-label\");\n  }\n  button.disabled = true;\n  button.setAttribute(\"aria-busy\", \"true\");\n  button.setAttribute(\"aria-label\", document.body.dataset.loadingLabel || \"\");\n\n  if (button.tagName === \"BUTTON\") {\n    button.innerHTML = '<span class=\"button-loader\" aria-hidden=\"true\"></span>';\n  }\n};\n\nconst restoreButton = (button) => {\n  if (!button.dataset.loading) return;\n\n  if (button.tagName === \"BUTTON\")\n    button.innerHTML = button.dataset.originalContent;\n  button.style.width = \"\";\n  button.style.height = \"\";\n  button.disabled = false;\n  button.removeAttribute(\"aria-busy\");\n  if (button.dataset.originalAriaLabel !== undefined) {\n    button.setAttribute(\"aria-label\", button.dataset.originalAriaLabel);\n  } else {\n    button.removeAttribute(\"aria-label\");\n  }\n  delete button.dataset.loading;\n  delete button.dataset.originalContent;\n  delete button.dataset.originalAriaLabel;\n};\n\n// Only submissions: forms submitted by the user and HTMX submit buttons, not openers or filters\nconst loadingButtonsFor = (detail) => {\n  const { elt } = detail;\n  const trigger = detail.requestConfig?.triggeringEvent;\n\n  if (elt instanceof HTMLFormElement) {\n    return trigger?.type === \"submit\"\n      ? submitButtonsFor(elt, trigger.submitter)\n      : [];\n  }\n  if (elt instanceof HTMLButtonElement && elt.type === \"submit\") return [elt];\n  return [];\n};\n\n// Native (full-page) submissions; HTMX and validation handlers cancel theirs first\ndocument.addEventListener(\"submit\", (event) => {\n  if (event.defaultPrevented || !(event.target instanceof HTMLFormElement))\n    return;\n\n  submitButtonsFor(event.target, event.submitter).forEach(setLoading);\n});\n\ndocument.body.addEventListener(\"htmx:beforeRequest\", (event) => {\n  loadingButtonsFor(event.detail).forEach(setLoading);\n});\n\ndocument.body.addEventListener(\"htmx:afterRequest\", (event) => {\n  loadingButtonsFor(event.detail)\n    .filter((button) => button.isConnected)\n    .forEach(restoreButton);\n});\n\n// hx-confirm: show the shared confirmation modal instead of the native dialog\nlet pendingConfirmation = null;\n\ndocument.body.addEventListener(\"htmx:confirm\", (event) => {\n  const modalWrapper = document.getElementById(\"modal_wrapper\");\n  if (!event.detail.question || !modalWrapper) return;\n\n  event.preventDefault();\n  pendingConfirmation = event.detail;\n\n  const confirmUrl = modalWrapper.dataset.confirmUrl;\n  const separator = confirmUrl.includes(\"?\") ? \"&\" : \"?\";\n  const url = `${confirmUrl}${separator}message=${encodeURIComponent(\n    event.detail.question,\n  )}`;\n  htmx.ajax(\"GET\", url, { target: \"#modal_wrapper\", swap: \"innerHTML\" });\n});\n\ndocument.addEventListener(\"confirm-modal:confirmed\", () => {\n  const confirmation = pendingConfirmation;\n  pendingConfirmation = null;\n  confirmation?.issueRequest(true);\n});\n\ndocument.addEventListener(\"confirm-modal:closed\", () => {\n  pendingConfirmation = null;\n});\n\n// Back/forward cache restores the page with the buttons still loading\nwindow.addEventListener(\"pageshow\", (event) => {\n  if (!event.persisted) return;\n\n  document.querySelectorAll(\"[data-loading]\").forEach(restoreButton);\n});\n"],
  "mappings": "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",
  "names": ["require_cropper", "__commonJSMin", "exports", "module", "global", "factory", "ownKeys", "e", "t", "r", "_objectSpread2", "_defineProperty", "_toPrimitive", "i", "_toPropertyKey", "_typeof", "o", "_classCallCheck", "instance", "Constructor", "_defineProperties", "target", "props", "descriptor", "_createClass", "protoProps", "staticProps", "obj", "key", "value", "_toConsumableArray", "arr", "_arrayWithoutHoles", "_iterableToArray", "_unsupportedIterableToArray", "_nonIterableSpread", "_arrayLikeToArray", "iter", "minLen", "n", "len", "arr2", "IS_BROWSER", "WINDOW", "IS_TOUCH_DEVICE", "HAS_POINTER_EVENT", "NAMESPACE", "ACTION_ALL", "ACTION_CROP", "ACTION_MOVE", "ACTION_ZOOM", "ACTION_EAST", "ACTION_WEST", "ACTION_SOUTH", "ACTION_NORTH", "ACTION_NORTH_EAST", "ACTION_NORTH_WEST", "ACTION_SOUTH_EAST", "ACTION_SOUTH_WEST", "CLASS_CROP", "CLASS_DISABLED", "CLASS_HIDDEN", "CLASS_HIDE", "CLASS_INVISIBLE", "CLASS_MODAL", "CLASS_MOVE", "DATA_ACTION", "DATA_PREVIEW", "DRAG_MODE_CROP", "DRAG_MODE_MOVE", "DRAG_MODE_NONE", "EVENT_CROP", "EVENT_CROP_END", "EVENT_CROP_MOVE", "EVENT_CROP_START", "EVENT_DBLCLICK", "EVENT_TOUCH_START", "EVENT_TOUCH_MOVE", "EVENT_TOUCH_END", "EVENT_POINTER_DOWN", "EVENT_POINTER_MOVE", "EVENT_POINTER_UP", "EVENT_READY", "EVENT_RESIZE", "EVENT_WHEEL", "EVENT_ZOOM", "MIME_TYPE_JPEG", "REGEXP_ACTIONS", "REGEXP_DATA_URL", "REGEXP_DATA_URL_JPEG", "REGEXP_TAG_NAME", "MIN_CONTAINER_WIDTH", "MIN_CONTAINER_HEIGHT", "DEFAULTS", "TEMPLATE", "isNaN", "isNumber", "isPositiveNumber", "isUndefined", "isObject", "hasOwnProperty", "isPlainObject", "_constructor", "prototype", "error", "isFunction", "slice", "toArray", "forEach", "data", "callback", "assign", "_len", "args", "_key", "arg", "REGEXP_DECIMALS", "normalizeDecimalNumber", "times", "REGEXP_SUFFIX", "setStyle", "element", "styles", "style", "property", "hasClass", "addClass", "elem", "className", "removeClass", "toggleClass", "added", "REGEXP_CAMEL_CASE", "toParamCase", "getData", "name", "setData", "removeData", "REGEXP_SPACES", "onceSupported", "supported", "once", "listener", "options", "removeListener", "type", "handler", "event", "listeners", "addListener", "_handler", "_element$listeners", "_len2", "_key2", "dispatchEvent", "getOffset", "box", "location", "REGEXP_ORIGINS", "isCrossOriginURL", "url", "parts", "addTimestamp", "timestamp", "getTransforms", "_ref", "rotate", "scaleX", "scaleY", "translateX", "translateY", "values", "transform", "getMaxZoomRatio", "pointers", "pointers2", "maxRatio", "pointer", "pointerId", "pointer2", "x1", "y1", "x2", "y2", "z1", "z2", "ratio", "getPointer", "_ref2", "endOnly", "pageX", "pageY", "end", "getPointersCenter", "count", "_ref3", "startX", "startY", "getAdjustedSizes", "_ref4", "aspectRatio", "height", "width", "isValidWidth", "isValidHeight", "adjustedWidth", "getRotatedSizes", "_ref5", "degree", "arc", "sinArc", "cosArc", "newWidth", "newHeight", "getSourceCanvas", "image", "_ref6", "_ref7", "_ref8", "imageAspectRatio", "imageNaturalWidth", "imageNaturalHeight", "_ref6$rotate", "_ref6$scaleX", "_ref6$scaleY", "naturalWidth", "naturalHeight", "_ref8$fillColor", "fillColor", "_ref8$imageSmoothingE", "imageSmoothingEnabled", "_ref8$imageSmoothingQ", "imageSmoothingQuality", "_ref8$maxWidth", "maxWidth", "_ref8$maxHeight", "maxHeight", "_ref8$minWidth", "minWidth", "_ref8$minHeight", "minHeight", "canvas", "context", "maxSizes", "minSizes", "destMaxSizes", "destMinSizes", "destWidth", "destHeight", "params", "param", "fromCharCode", "getStringFromCharCode", "dataView", "start", "length", "str", "REGEXP_DATA_URL_HEAD", "dataURLToArrayBuffer", "dataURL", "base64", "binary", "arrayBuffer", "uint8", "arrayBufferToDataURL", "mimeType", "chunks", "chunkSize", "resetAndGetOrientation", "orientation", "littleEndian", "app1Start", "ifdStart", "offset", "exifIDCode", "tiffOffset", "endianness", "firstIFDOffset", "_length", "_offset", "parseOrientation", "render", "container", "cropper", "containerData", "imageData", "viewMode", "rotated", "canvasWidth", "canvasHeight", "canvasData", "sizeLimited", "positionLimited", "cropBoxData", "cropped", "minCanvasWidth", "minCanvasHeight", "_getAdjustedSizes", "newCanvasLeft", "newCanvasTop", "changed", "transformed", "_getRotatedSizes", "autoCropArea", "limited", "minCropBoxWidth", "minCropBoxHeight", "maxCropBoxWidth", "maxCropBoxHeight", "preview", "crossOrigin", "alt", "previews", "el", "img", "cropBoxWidth", "cropBoxHeight", "left", "top", "originalWidth", "originalHeight", "events", "handlers", "ratioX", "ratioY", "_this", "delta", "buttons", "button", "action", "touch", "change", "right", "bottom", "minLeft", "minTop", "renderable", "range", "check", "side", "p", "methods", "hasSameSize", "offsetX", "offsetY", "_this$canvasData", "x", "y", "_originalEvent", "pivot", "center", "_scaleX", "_scaleY", "rounded", "widthChanged", "heightChanged", "source", "_this$getData", "initialX", "initialY", "initialWidth", "initialHeight", "_options$imageSmoothi", "sourceWidth", "sourceHeight", "srcX", "srcY", "srcWidth", "srcHeight", "dstX", "dstY", "dstWidth", "dstHeight", "scale", "mode", "dragBox", "face", "croppable", "movable", "AnotherCropper", "Cropper", "tagName", "xhr", "clone", "_parseOrientation", "crossOriginUrl", "_this2", "isIOSWebKit", "done", "sizingImage", "body", "template", "cropBox", "parentNode", "EventListener", "eventTarget", "eventName", "eventOptions", "binding", "event", "extendedEvent", "extendEvent", "left", "right", "leftIndex", "rightIndex", "stopImmediatePropagation", "Dispatcher", "application", "eventListener", "listeners", "map", "clearEventListeners", "error", "message", "detail", "eventListenerMap", "cacheKey", "parts", "key", "defaultActionDescriptorFilters", "value", "element", "descriptorPattern", "parseActionDescriptorString", "descriptorString", "matches", "keyFilter", "parseEventTarget", "parseEventOptions", "eventTargetName", "options", "token", "stringifyEventTarget", "camelize", "_", "char", "namespaceCamelize", "capitalize", "dasherize", "tokenize", "isSomething", "object", "hasProperty", "property", "allModifiers", "Action", "index", "descriptor", "schema", "getDefaultEventNameForElement", "eventFilter", "filters", "standardFilter", "params", "pattern", "name", "match", "typecast", "meta", "ctrl", "alt", "shift", "modifier", "defaultEventNames", "e", "tagName", "o_O", "Binding", "context", "action", "actionEvent", "method", "actionDescriptorFilters", "controller", "passes", "filter", "target", "currentTarget", "identifier", "ElementObserver", "delegate", "mutations", "callback", "mutation", "attributeName", "nodes", "node", "tree", "processor", "AttributeObserver", "add", "fetch", "del", "prune", "values", "Multimap", "set", "size", "_key", "_values", "SelectorObserver", "element", "selector", "delegate", "details", "ElementObserver", "Multimap", "callback", "matches", "tree", "match", "selectors", "_attributeName", "matchedBefore", "StringMapObserver", "mutations", "attributeName", "mutation", "oldValue", "key", "value", "attribute", "TokenListObserver", "AttributeObserver", "unmatchedTokens", "matchedTokens", "tokens", "token", "previousTokens", "currentTokens", "firstDifferingIndex", "zip", "previousToken", "currentToken", "tokensAreEqual", "tokenString", "parseTokenString", "content", "index", "left", "right", "length", "_", "ValueListObserver", "parseResult", "valuesByToken", "error", "BindingObserver", "context", "action", "binding", "Binding", "Action", "ValueObserver", "receiver", "descriptor", "name", "defaultValue", "writer", "rawValue", "rawOldValue", "changedMethodName", "changedMethod", "valueDescriptorMap", "descriptors", "hasMethodName", "capitalize", "TargetObserver", "_a", "readInheritableStaticArrayValues", "constructor", "propertyName", "ancestors", "getAncestorsForConstructor", "values", "getOwnStaticArrayValues", "readInheritableStaticObjectPairs", "pairs", "getOwnStaticObjectPairs", "definition", "OutletObserver", "outletName", "observer", "_selector", "outlet", "hasOutlet", "hasOutletController", "_element", "selectorObserver", "attributeObserver", "dependencies", "module", "identifiers", "Context", "scope", "functionName", "detail", "identifier", "controller", "message", "namespaceCamelize", "methodName", "args", "bless", "shadow", "getBlessedProperties", "properties", "shadowConstructor", "extend", "shadowProperties", "getShadowProperties", "blessedProperties", "blessing", "prototype", "getOwnKeys", "getShadowedDescriptor", "shadowingDescriptor", "object", "extendWithReflect", "extended", "testReflectExtension", "b", "blessDefinition", "Module", "application", "ClassMap", "tokenize", "DataMap", "dasherize", "Guide", "logger", "warnedKeys", "attributeValueContainsToken", "TargetSet", "targetName", "targetNames", "target", "targets", "targetDescriptor", "revisedAttributeName", "OutletSet", "controllerElement", "outletNames", "outlets", "controllerAttribute", "Scope", "_Scope", "schema", "ScopeObserver", "scopesByIdentifier", "referenceCount", "Router", "contexts", "afterLoad", "defaultSchema", "objectFromEntries", "c", "n", "array", "memo", "k", "v", "Application", "Dispatcher", "defaultActionDescriptorFilters", "domReady", "controllerConstructor", "filter", "head", "rest", "resolve", "ClassPropertiesBlessing", "classDefinition", "propertiesForClassDefinition", "classes", "OutletPropertiesBlessing", "outletDefinition", "propertiesForOutletDefinition", "getOutletController", "getControllerAndEnsureConnectedScope", "outletController", "camelizedName", "outletElement", "TargetPropertiesBlessing", "targetDefinition", "propertiesForTargetDefinition", "ValuePropertiesBlessing", "valueDefinitionPairs", "propertyDescriptorMap", "result", "valueDefinitionPair", "valueDescriptor", "parseValueDefinitionPair", "propertiesForValueDefinitionPair", "read", "write", "typeDefinition", "valueDescriptorForTokenAndTypeDefinition", "parseValueTypeConstant", "constant", "parseValueTypeDefault", "parseValueTypeObject", "payload", "typeObject", "hasType", "isSomething", "hasDefault", "fullObject", "onlyType", "onlyDefault", "typeFromObject", "typeFromDefaultValue", "propertyPath", "parseValueTypeDefinition", "typeFromConstant", "type", "defaultValueForDefinition", "defaultValuesByType", "hasProperty", "constantFromType", "camelize", "readers", "writers", "writeString", "writeJSON", "Controller", "_identifier", "_application", "eventName", "prefix", "bubbles", "cancelable", "event", "PACKET_TYPES", "PACKET_TYPES_REVERSE", "key", "ERROR_PACKET", "withNativeBlob", "withNativeArrayBuffer", "isView", "obj", "encodePacket", "type", "data", "supportsBinary", "callback", "encodeBlobAsBase64", "PACKET_TYPES", "fileReader", "content", "toArray", "TEXT_ENCODER", "encodePacketToBinary", "packet", "encoded", "chars", "lookup", "i", "decode", "base64", "bufferLength", "len", "p", "encoded1", "encoded2", "encoded3", "encoded4", "arraybuffer", "bytes", "lookup", "withNativeArrayBuffer", "decodePacket", "encodedPacket", "binaryType", "mapBinary", "type", "decodeBase64Packet", "PACKET_TYPES_REVERSE", "ERROR_PACKET", "data", "decoded", "decode", "SEPARATOR", "encodePayload", "packets", "callback", "length", "encodedPackets", "count", "packet", "i", "encodePacket", "encodedPacket", "decodePayload", "encodedPayload", "binaryType", "decodedPacket", "decodePacket", "createPacketEncoderStream", "controller", "encodePacketToBinary", "payloadLength", "header", "view", "TEXT_DECODER", "totalLength", "chunks", "acc", "chunk", "concatChunks", "size", "buffer", "j", "createPacketDecoderStream", "maxPayload", "state", "expectedLength", "isBinary", "headerArray", "n", "ERROR_PACKET", "data", "protocol", "Emitter", "obj", "mixin", "key", "event", "fn", "on", "callbacks", "cb", "i", "args", "len", "nextTick", "cb", "setTimeoutFn", "globalThisShim", "defaultBinaryType", "pick", "obj", "attr", "acc", "k", "NATIVE_SET_TIMEOUT", "globalThisShim", "NATIVE_CLEAR_TIMEOUT", "installTimerFunctions", "opts", "BASE64_OVERHEAD", "byteLength", "utf8Length", "str", "c", "length", "l", "randomString", "encode", "obj", "str", "i", "decode", "qs", "qry", "pairs", "l", "pair", "TransportError", "reason", "description", "context", "Transport", "Emitter", "opts", "installTimerFunctions", "packets", "data", "packet", "decodePacket", "details", "onPause", "schema", "query", "hostname", "encodedQuery", "encode", "Polling", "Transport", "onPause", "pause", "total", "data", "callback", "packet", "decodePayload", "close", "packets", "encodePayload", "schema", "query", "randomString", "value", "err", "hasCORS", "empty", "BaseXHR", "Polling", "opts", "isSSL", "port", "data", "fn", "req", "xhrStatus", "context", "Request", "_Request", "Emitter", "createRequest", "uri", "installTimerFunctions", "_a", "pick", "xhr", "i", "e", "err", "fromError", "unloadHandler", "terminationEvent", "globalThisShim", "hasXHR2", "newRequest", "XHR", "forceBase64", "xdomain", "hasCORS", "isReactNative", "BaseWS", "Transport", "uri", "protocols", "opts", "pick", "err", "closeEvent", "ev", "e", "packets", "i", "packet", "lastPacket", "encodePacket", "data", "nextTick", "schema", "query", "randomString", "WebSocketCtor", "globalThisShim", "WS", "_packet", "WT", "Transport", "err", "stream", "decoderStream", "createPacketDecoderStream", "reader", "encoderStream", "createPacketEncoderStream", "read", "done", "value", "packet", "packets", "i", "lastPacket", "nextTick", "_a", "transports", "WS", "WT", "XHR", "re", "parts", "parse", "str", "src", "b", "e", "m", "uri", "i", "pathNames", "queryKey", "obj", "path", "regx", "names", "query", "data", "$0", "$1", "$2", "withEventListeners", "OFFLINE_EVENT_LISTENERS", "listener", "SocketWithoutUpgrade", "_SocketWithoutUpgrade", "Emitter", "uri", "opts", "defaultBinaryType", "parsedUri", "parse", "installTimerFunctions", "t", "transportName", "decode", "name", "query", "protocol", "transport", "reason", "packet", "err", "data", "delay", "packets", "payloadSize", "byteLength", "hasExpired", "nextTick", "msg", "options", "fn", "type", "close", "cleanupAndClose", "waitForUpgrade", "description", "SocketWithUpgrade", "i", "failed", "onTransportOpen", "cleanup", "freezeTransport", "onerror", "error", "onTransportClose", "onclose", "onupgrade", "to", "upgrades", "filteredUpgrades", "Socket", "isOptionsOnly", "o", "transports", "protocol", "Socket", "url", "uri", "path", "loc", "obj", "parse", "host", "esm_exports", "__export", "Decoder", "Encoder", "PacketType", "isPacketValid", "protocol", "withNativeArrayBuffer", "isView", "obj", "toString", "withNativeBlob", "withNativeFile", "isBinary", "hasBinary", "toJSON", "i", "l", "key", "deconstructPacket", "packet", "buffers", "packetData", "pack", "_deconstructPacket", "data", "toJSON", "isBinary", "placeholder", "newData", "i", "key", "reconstructPacket", "_reconstructPacket", "RESERVED_EVENTS", "protocol", "PacketType", "Encoder", "replacer", "obj", "hasBinary", "str", "deconstruction", "deconstructPacket", "pack", "buffers", "Decoder", "_Decoder", "Emitter", "opts", "packet", "isBinaryEvent", "BinaryReconstructor", "isBinary", "i", "p", "start", "buf", "n", "isInteger", "next", "c", "payload", "type", "isObject", "binData", "reconstructPacket", "isNamespaceValid", "nsp", "value", "isAckIdValid", "id", "isDataValid", "isPacketValid", "on", "obj", "ev", "fn", "RESERVED_EVENTS", "Socket", "Emitter", "io", "nsp", "opts", "on", "args", "ev", "_a", "_b", "_c", "packet", "PacketType", "id", "ack", "isTransportWritable", "isConnected", "timeout", "timer", "i", "fn", "resolve", "reject", "arg1", "arg2", "err", "responseArgs", "force", "data", "reason", "description", "listeners", "listener", "self", "sent", "pid", "subDestroy", "compress", "Backoff", "opts", "ms", "rand", "deviation", "min", "max", "jitter", "Manager", "Emitter", "uri", "opts", "_a", "installTimerFunctions", "Backoff", "_parser", "esm_exports", "v", "fn", "Socket", "socket", "self", "openSubDestroy", "on", "onError", "err", "errorSub", "timeout", "timer", "data", "packet", "nextTick", "nsp", "nsps", "encodedPackets", "subDestroy", "reason", "description", "delay", "attempt", "cache", "lookup", "uri", "opts", "parsed", "url", "source", "id", "path", "sameNamespace", "newConnection", "io", "Manager", "Socket", "EventBus", "eventName", "detail", "callback", "eventBus", "SocketService", "url", "lookup", "eventBus", "message", "eventName", "payload", "roomId", "socketService", "ValidationCodeController", "Controller", "_a", "el", "value", "event", "_b", "idx", "prev", "ch", "text", "clean", "i", "d", "joined", "complete", "__publicField", "TelInputController", "Controller", "event", "ManagedModalController", "Controller", "__publicField", "EducationExperienceModalController", "Controller", "__publicField", "CertificationModalController", "Controller", "__publicField", "import_cropperjs", "CropperController", "Controller", "event", "file", "config", "Cropper", "_a", "scaleX", "scaleY", "blob", "dataTransfer", "__publicField", "CertificationUploadImageController", "Controller", "event", "file", "__publicField", "DynamicListController", "Controller", "value", "extra", "li", "key", "textSpan", "actions", "removeBtn", "event", "item", "items", "entry", "raw", "__publicField", "TabsController", "Controller", "event", "index", "tab", "panel", "__publicField", "CertificationListController", "Controller", "_a", "_b", "academyId", "certificationId", "academyName", "certificationName", "li", "textSpan", "actions", "removeBtn", "event", "item", "items", "raw", "__publicField", "VacancySelectionController", "Controller", "event", "checkbox", "id", "checkboxes", "isChecked", "checkedCount", "cb", "name", "cookies", "cookie", "__publicField", "VacancyPreviewController", "Controller", "expanded", "event", "message", "__publicField", "ApplicantSelectionController", "Controller", "event", "checkbox", "id", "checkboxes", "isChecked", "checkedCount", "cb", "__publicField", "RemoveElementController", "Controller", "event", "id", "element", "ConversationSearchController", "Controller", "event", "panel", "panelId", "placeholder", "__publicField", "ConversationChatController", "Controller", "event", "eventBus", "payload", "_a", "message", "lastMessage", "showAvatar", "row", "now", "time", "avatar", "__publicField", "NotificationDropdownController", "Controller", "event", "eventBus", "payload", "__publicField", "SNACK_DURATION_MS", "NotificationSnackController", "Controller", "event", "eventBus", "payload", "_a", "notification", "snack", "content", "title", "titleEl", "messageEl", "closeButton", "timeoutId", "__publicField", "StripePaymentController", "Controller", "_a", "_b", "intent", "event", "styles", "token", "name", "rootFontSize", "radius", "radiusPx", "error", "form", "response", "e", "field", "wrapper", "invalid", "__publicField", "CreditsPurchaseController", "Controller", "event", "total", "value", "__publicField", "ScheduleVideoCallController", "Controller", "localZone", "selectedZone", "zones", "zone", "option", "date", "time", "timeZone", "nextMinute", "parts", "type", "value", "__publicField", "OpenVideoCallController", "Controller", "__publicField", "VacancyAgeRangeController", "Controller", "minimum", "maximum", "minimumIsValid", "maximumMessage", "input", "value", "__publicField", "ConfirmModalController", "Controller", "STORAGE_KEY", "DARK_QUERY", "ThemeToggleController", "Controller", "_a", "next", "explicit", "DisclosureController", "Controller", "e", "_a", "event", "focusButton", "__publicField", "PasswordRevealController", "Controller", "reveal", "__publicField", "FieldValidationController", "Controller", "input", "event", "form", "text", "on", "ids", "id", "next", "x", "__publicField", "RequiredSubmitController", "Controller", "empty", "field", "button", "__publicField", "ChipListController", "Controller", "event", "_a", "name", "level", "levelText", "chip", "next", "c", "message", "__publicField", "CurrentPeriodController", "Controller", "current", "__publicField", "LineChartController", "Controller", "event", "bounds", "percent", "last", "next", "best", "point", "index", "announce", "value", "plotWidth", "tipWidth", "center", "left", "__publicField", "ConversationPanesController", "Controller", "_a", "event", "_b", "row", "__publicField", "PrintPageController", "Controller", "url", "ListDetailController", "Controller", "event", "_a", "_b", "_c", "target", "source", "item", "current", "__publicField", "BillingFormController", "Controller", "checked", "event", "value", "section", "file", "message", "__publicField", "SECONDS_PER_LOGO", "LogoSliderController", "Controller", "item", "clone", "link", "img", "__publicField", "SECONDS_PER_CARD", "VacancyCarouselController", "Controller", "item", "clone", "last", "height", "gap", "paused", "__publicField", "PromoCodeController", "Controller", "section", "checked", "event", "input", "e", "__publicField", "Application", "socketService", "ValidationCodeController", "TelInputController", "ManagedModalController", "EducationExperienceModalController", "CertificationModalController", "CropperController", "CertificationUploadImageController", "DynamicListController", "TabsController", "CertificationListController", "VacancySelectionController", "VacancyPreviewController", "ApplicantSelectionController", "RemoveElementController", "ConversationSearchController", "ConversationChatController", "NotificationDropdownController", "NotificationSnackController", "StripePaymentController", "CreditsPurchaseController", "ScheduleVideoCallController", "OpenVideoCallController", "VacancyAgeRangeController", "ConfirmModalController", "ThemeToggleController", "DisclosureController", "PasswordRevealController", "FieldValidationController", "RequiredSubmitController", "ChipListController", "CurrentPeriodController", "LineChartController", "ConversationPanesController", "PrintPageController", "ListDetailController", "BillingFormController", "LogoSliderController", "VacancyCarouselController", "PromoCodeController", "currentScroll", "getCSRFToken", "name", "cookies", "cookie", "event", "token", "SUBMIT_BUTTON_SELECTOR", "submitButtonsFor", "form", "submitter", "buttons", "button", "setLoading", "restoreButton", "loadingButtonsFor", "detail", "_a", "elt", "trigger", "pendingConfirmation", "modalWrapper", "confirmUrl", "separator", "url", "confirmation"]
}
