PageSourceSearch

https://ministrybooks.org/assets/js/app.js?v=1790202179

js ministrybooks.org collected 2026-09-24 20:06:30 UTC 1,768,726 bytes, 531 lines download raw bytes

1/*
2 * ATTENTION: An "eval-source-map" devtool has been used.
3 * This devtool is neither made for production nor for readable output files.
4 * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
5 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6 * or disable the default devtool with "devtool: false".
7 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8 */
9/******/ (() => { // webpackBootstrap
10/******/ 	"use strict";
11/******/ 	var __webpack_modules__ = ({
12
13/***/ "./resources/js/account/annotations-bulk-edit.js":
14/*!*******************************************************!*\
15  !*** ./resources/js/account/annotations-bulk-edit.js ***!
16  \*******************************************************/
17/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
18
19eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   buildBulkPayload: () => (/* binding */ buildBulkPayload),\n/* harmony export */   buildDeleteConfirmMessage: () => (/* binding */ buildDeleteConfirmMessage),\n/* harmony export */   collectSelectedMarks: () => (/* binding */ collectSelectedMarks),\n/* harmony export */   createBulkEditController: () => (/* binding */ createBulkEditController)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/toConsumableArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/from */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/filter */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/promise */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/promise.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _utilities_i18n__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utilities/i18n */ \"./resources/js/utilities/i18n.js\");\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _utilities_sticky_toolbar__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utilities/sticky-toolbar */ \"./resources/js/utilities/sticky-toolbar.js\");\n\n\n\n\n\n\n\n\n\n/**\n * Batch-editing (v1) for the annotations management page — #3051.\n *\n * Adds an edit mode to the annotations list that lets a user select multiple\n * marks on the current page and either delete them or change their highlight\n * color in a single request. Checkboxes are injected client-side when edit\n * mode is entered so the shared server render path (renderCollection) is\n * untouched; the bulk actions reuse the existing modifyCollection path\n * (UserMark::modifyMarks), which already loops over an array of marks.\n *\n * Selection is scoped to the current page only. Works in both card and list\n * views.\n */\n\n\n\n\nvar EDIT_MODE_CLASS = 'bulk-edit-active';\nvar CHECKBOX_CLASS = 'bulk-select-checkbox';\n\n/**\n * Build the modifyCollection payload for a batch operation.\n *\n * @param {Array<{markId: string, userMarkId: string, hid: string}>} selectedMarks\n * @param {string} action - 'edit' (recolor) or 'delete'\n * @param {?string} color - highlight color value for recolor; null for delete\n * @returns {{type: string, marks: Array}}\n */\nfunction buildBulkPayload(selectedMarks, action) {\n  var color = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n  return {\n    type: 'UserMark',\n    marks: _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_3___default()(selectedMarks).call(selectedMarks, function (mark) {\n      return {\n        action: action,\n        htmlContentId: mark.hid,\n        userMarkId: mark.userMarkId,\n        markId: mark.markId,\n        color: color !== null && color !== void 0 ? color : null\n      };\n    })\n  };\n}\n\n/**\n * Read the currently-checked rows from a paginated collection and return their\n * mark identifiers. Ids stay encrypted here — the server decrypts and enforces\n * ownership on every mark.\n *\n * @param {HTMLElement} collection - the [data-paginated-collection] element\n * @returns {Array<{markId: string, userMarkId: string, hid: string}>}\n */\nfunction collectSelectedMarks(collection) {\n  var _context;\n  if (!collection) {\n    return [];\n  }\n  var selected = [];\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4___default()(_context = collection.querySelectorAll(\".\".concat(CHECKBOX_CLASS, \":checked\"))).call(_context, function (checkbox) {\n    var _editAnchor$dataset$h;\n    var annotationRow = checkbox.closest('[data-annotation]');\n    if (!annotationRow || !annotationRow.dataset.markId) {\n      return;\n    }\n    var editAnchor = annotationRow.querySelector('.user-mark-edit');\n    selected.push({\n      markId: annotationRow.dataset.markId,\n      userMarkId: annotationRow.dataset.userMarkRecordId,\n      hid: (_editAnchor$dataset$h = editAnchor === null || editAnchor === void 0 ? void 0 : editAnchor.dataset.hid) !== null && _editAnchor$dataset$h !== void 0 ? _editAnchor$dataset$h : '',\n      // The note is part of the same annotation object, so deleting the row\n      // deletes the note — the confirm copy has to say so (#4114).\n      hasNote: Boolean(annotationRow.querySelector('[data-note-display]'))\n    });\n  });\n  return selected;\n}\n\n/**\n * Create the bulk-edit controller.\n *\n * @param {Object} deps\n * @param {Object}
19 deps.colors - map of color name => highlight color value\n * @param {(payload: Object, action: string) => Promise<{success: boolean}>} deps.applyBatch\n *        Sends one modifyCollection request and repaints the list.\n * @param {(count: number) => Promise<boolean>} [deps.confirmDelete] - confirm gate for deletes\n * @param {(message: string, type: string) => void} [deps.notify] - user-facing notice\n * @returns {Object} controller\n */\nfunction createBulkEditController(deps) {\n  var _deps$confirmDelete, _deps$notify;\n  var colors = deps.colors,\n    applyBatch = deps.applyBatch;\n  var confirmDelete = (_deps$confirmDelete = deps.confirmDelete) !== null && _deps$confirmDelete !== void 0 ? _deps$confirmDelete : defaultConfirmDelete;\n  var notify = (_deps$notify = deps.notify) !== null && _deps$notify !== void 0 ? _deps$notify : defaultNotify;\n  var editMode = false;\n  var getWrapper = function getWrapper() {\n    return document.querySelector('[data-collection]');\n  };\n  var getCollection = function getCollection() {\n    return document.querySelector('[data-paginated-collection]');\n  };\n  var getToggle = function getToggle() {\n    return document.querySelector('[data-bulk-edit-toggle]');\n  };\n  var getToggleLabel = function getToggleLabel(toggle) {\n    return ((toggle === null || toggle === void 0 ? void 0 : toggle.closest('.collection-style')) || (toggle === null || toggle === void 0 ? void 0 : toggle.parentElement) || document).querySelector('[data-bulk-edit-toggle-label]');\n  };\n  var getBar = function getBar() {\n    return document.querySelector('[data-bulk-action-bar]');\n  };\n  var getSelectAll = function getSelectAll() {\n    return document.querySelector('[data-bulk-select-all]');\n  };\n  var getSelectAllWrapper = function getSelectAllWrapper() {\n    return document.querySelector('[data-bulk-select-all-wrapper]');\n  };\n  var getCountElement = function getCountElement() {\n    return document.querySelector('[data-bulk-count]');\n  };\n  var getDeleteButton = function getDeleteButton() {\n    return document.querySelector('[data-bulk-delete]');\n  };\n  var getColorSwatches = function getColorSwatches() {\n    return _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5___default()(document.querySelectorAll('.bulk-color-swatch'));\n  };\n\n  // Pins the Total/Show row + toolbar directly below the sticky main nav while\n  // edit mode is active only (#3566).\n  var stickyToolbar = (0,_utilities_sticky_toolbar__WEBPACK_IMPORTED_MODULE_11__.createStickyToolbar)(function () {\n    return document.querySelector('[data-sticky-batch-toolbar]');\n  });\n  var selectableRows = function selectableRows() {\n    var _context2;\n    var collection = getCollection();\n    if (!collection) {\n      return [];\n    }\n    return _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_6___default()(_context2 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5___default()(collection.querySelectorAll('[data-annotation]'))).call(_context2, function (row) {\n      return row.dataset.markId;\n    });\n  };\n  var rowCheckboxes = function rowCheckboxes() {\n    var collection = getCollection();\n    if (!collection) {\n      return [];\n    }\n    return _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5___default()(collection.querySelectorAll(\".\".concat(CHECKBOX_CLASS)));\n  };\n  function injectCheckboxes() {\n    var _context3;\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4___default()(_context3 = selectableRows()).call(_context3, function (row) {\n      if (row.querySelector(\".\".concat(CHECKBOX_CLASS))) {\n        return;\n      }\n      var label = document.createElement('label');\n      label.className = 'bulk-select';\n      var checkbox = document.createElement('input');\n      checkbox.type = 'checkbox';\n      checkbox.className = CHECKBOX_CLASS;\n      checkbox.setAttribute('aria-label', (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_9__.t)('annotations.select_item') || 'Select annotation');\n      var srText = document.createElement('span');\n      srText.className = 'show-for-sr';\n      srText.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_9__.t)('annotations.select_item') || 'Select annotation';\n      label.appendChild(checkbox);\n      label.appendChild(srText);\n\n      // list view rows are <tr>; put the control inside the first cell so the\n      // table markup stays valid. Card rows take the control directly.\n      var firstCell = row.tagName === 'TR' ? row.querySelector('td, th') : null;\n      (firstCell !== null && firstCell !== void 0 ? firstCell : row).insertAdjacentElement('afterbegin', label);\n    });\n  }\n  function removeCheckboxes() {\n    var _context4;\n    var collection = getCollection();\n    if (!collection) {\n      return;\n    }\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4___default()(_context4 = collection.querySelectorAll('.bulk-select')).call(_context4, function (label) {\n      return label.remove();\n    });\n  }\n  function refreshSelectionUI() {\n    var boxes = rowCheckboxes();\n    var selectedCount = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_6___default()(boxes).call(boxes, function (cb) {\n      return cb.checked;\n    }).length;\n    var countElement = getCountElement();\n    if (countElement) {\n      countElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_9__.t)('annotations.selected_count', {\n        ':count': selectedCount\n      }) || \"\".concat(selectedCount, \" selected\");\n    }\n    var hasSelection = selectedCount > 0;
19\n    setActionsEnabled(hasSelection);\n    var selectAll = getSelectAll();\n    if (selectAll) {\n      selectAll.checked = boxes.length > 0 && selectedCount === boxes.length;\n      selectAll.indeterminate = selectedCount > 0 && selectedCount < boxes.length;\n    }\n  }\n  function setActionsEnabled(enabled) {\n    var _context5, _context6;\n    var controls = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_6___default()(_context5 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_7___default()(_context6 = [getDeleteButton()]).call(_context6, (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(getColorSwatches()))).call(_context5, Boolean);\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4___default()(controls).call(controls, function (control) {\n      control.disabled = !enabled;\n      control.setAttribute('aria-disabled', enabled ? 'false' : 'true');\n    });\n  }\n  function resetSelection() {\n    var _context7;\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4___default()(_context7 = rowCheckboxes()).call(_context7, function (cb) {\n      cb.checked = false;\n    });\n    var selectAll = getSelectAll();\n    if (selectAll) {\n      selectAll.checked = false;\n      selectAll.indeterminate = false;\n    }\n    refreshSelectionUI();\n  }\n  function enterEditMode() {\n    var _getWrapper, _getBar, _getSelectAllWrapper;\n    editMode = true;\n    (_getWrapper = getWrapper()) === null || _getWrapper === void 0 || _getWrapper.classList.add(EDIT_MODE_CLASS);\n    injectCheckboxes();\n    (_getBar = getBar()) === null || _getBar === void 0 || _getBar.classList.remove('hide');\n    (_getSelectAllWrapper = getSelectAllWrapper()) === null || _getSelectAllWrapper === void 0 || _getSelectAllWrapper.classList.remove('hide');\n    stickyToolbar.activate();\n    var toggle = getToggle();\n    if (toggle) {\n      toggle.setAttribute('aria-pressed', 'true');\n      toggle.classList.remove('icon-off');\n      toggle.classList.add('icon-on');\n      var label = getToggleLabel(toggle);\n      if (label) {\n        label.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_9__.t)('annotations.done') || 'Done';\n      }\n    }\n    resetSelection();\n  }\n  function exitEditMode() {\n    var _getWrapper2, _getBar2, _getSelectAllWrapper2;\n    editMode = false;\n    removeCheckboxes();\n    (_getWrapper2 = getWrapper()) === null || _getWrapper2 === void 0 || _getWrapper2.classList.remove(EDIT_MODE_CLASS);\n    (_getBar2 = getBar()) === null || _getBar2 === void 0 || _getBar2.classList.add('hide');\n    (_getSelectAllWrapper2 = getSelectAllWrapper()) === null || _getSelectAllWrapper2 === void 0 || _getSelectAllWrapper2.classList.add('hide');\n    setActionsEnabled(false);\n    stickyToolbar.deactivate();\n    var toggle = getToggle();\n    if (toggle) {\n      toggle.setAttribute('aria-pressed', 'false');\n      toggle.classList.remove('icon-on');\n      toggle.classList.add('icon-off');\n      var label = getToggleLabel(toggle);\n      if (label) {\n        label.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_9__.t)('annotations.edit_mode') || 'Edit';\n      }\n      toggle.focus();\n    }\n  }\n  function toggleEditMode() {\n    if (editMode) {\n      exitEditMode();\n    } else {\n      enterEditMode();\n    }\n  }\n  function onSelectAll() {\n    var _context8;\n    var selectAll = getSelectAll();\n    if (!selectAll) {\n      return;\n    }\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4___default()(_context8 = rowCheckboxes()).call(_context8, function (cb) {\n      cb.checked = selectAll.checked;\n    });\n    refreshSelectionUI();\n  }\n\n  /**\n   * Re-apply edit-mode DOM to a freshly-repainted collection and reset state.\n   * Called after a batch op (the collection node is replaced by updateCollection).\n   */\n  function syncAfterRepaint() {\n    if (!editMode) {\n      return;\n    }\n    injectCheckboxes();\n    resetSelection();\n  }\n  function submitBatch(_x, _x2) {\n    return _submitBatch.apply(this, arguments);\n  }\n  function _submitBatch() {\n    _submitBatch = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee(action, color) {\n      var collection, selected, notedCount, confirmed, payload, result;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context10) {\n        while (1) switch (_context10.prev = _context10.next) {\n          case 0:\n            collection = getCollection();\n            selected = collectSelectedMarks(collection);\n            if (!(selected.length === 0)) {\n              _context10.next = 5;\n              break;\n            }\n            notify((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_9__.t)('annotations.bulk_none_selected') || 'Select at least one annotation.', 'warning');\n            return _context10.abrupt(\"return\");\n          case 5:\n            if (!(action === 'delete')) {\n              _context10.next = 12;\n              break;\n            }\n            notedCount = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_6___default()(selected).call(selected, function (mark) {\n              return mark.hasNote;\n            }).length;\n            _context10.next = 9;\n            return confirmDelete(selected.length, notedCount);\n          case 9:\n            confirmed = _context10.sent;\n            if (confirmed) {\n              _context10.next = 12;\n              break;\n            }\n            return _context10.abrupt(\"return\");\n          case 12:\n            payload = buildBulkPayload(selected, action, color);
19\n            setActionsEnabled(false);\n            _context10.next = 16;\n            return applyBatch(payload, action);\n          case 16:\n            result = _context10.sent;\n            // updateCollection replaced the collection node — re-apply edit-mode DOM.\n            syncAfterRepaint();\n            if (result && result.success === false) {\n              notify((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_9__.t)('error_updating_list') || 'There was an error updating the annotations list.', 'error');\n            }\n          case 19:\n          case \"end\":\n            return _context10.stop();\n        }\n      }, _callee);\n    }));\n    return _submitBatch.apply(this, arguments);\n  }\n  function submitDelete() {\n    return submitBatch('delete', null);\n  }\n  function submitRecolor(colorName) {\n    var _colors$colorName;\n    var colorValue = (_colors$colorName = colors === null || colors === void 0 ? void 0 : colors[colorName]) !== null && _colors$colorName !== void 0 ? _colors$colorName : null;\n    return submitBatch('edit', colorValue);\n  }\n  function init() {\n    var _getSelectAll, _getDeleteButton, _context9;\n    var toggle = getToggle();\n    if (!toggle) {\n      return; // page has no bulk-edit toolbar\n    }\n\n    // #3133: the Continue Reading toolbar uses the same generic selectors. Bind\n    // only when this page actually has annotation rows, so this controller can\n    // never cross-bind to the Continue Reading toolbar.\n    if (!document.querySelector('[data-annotation]')) {\n      return;\n    }\n\n    // The generic paginator replaces the collection element wholesale, so the\n    // injected checkboxes disappear on every page change while the toolbar\n    // (outside the repainted collection) stays untouched. Re-apply edit-mode\n    // DOM so checkboxes come back on the new page (#3153, #3581).\n    document.addEventListener('collection:repainted', function () {\n      syncAfterRepaint();\n    });\n\n    // Delegate on document so a click anywhere in the toggle (the caption text\n    // or the icon, including a Font Awesome-swapped <svg>) triggers it, and it\n    // survives any toolbar/collection re-render. (#3051)\n    document.addEventListener('click', function (event) {\n      if (event.target.closest('[data-bulk-edit-toggle]')) {\n        event.preventDefault();\n        toggleEditMode();\n      }\n    });\n    (_getSelectAll = getSelectAll()) === null || _getSelectAll === void 0 || _getSelectAll.addEventListener('change', onSelectAll);\n    (_getDeleteButton = getDeleteButton()) === null || _getDeleteButton === void 0 || _getDeleteButton.addEventListener('click', function (event) {\n      event.preventDefault();\n      submitDelete();\n    });\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_4___default()(_context9 = getColorSwatches()).call(_context9, function (swatch) {\n      swatch.addEventListener('click', function (event) {\n        event.preventDefault();\n        if (swatch.disabled) {\n          return;\n        }\n        submitRecolor(swatch.dataset.colorName);\n      });\n    });\n\n    // Delegate row-checkbox changes and whole-row clicks on the stable\n    // [data-collection] wrapper so handlers survive collection repaints.\n    var wrapper = getWrapper();\n    if (wrapper) {\n      wrapper.addEventListener('change', function (event) {\n        if (editMode && event.target.classList.contains(CHECKBOX_CLASS)) {\n          refreshSelectionUI();\n        }\n      });\n      wrapper.addEventListener('click', function (event) {\n        if (!editMode) {\n          return;\n        }\n        // ignore clicks on the checkbox itself (native toggle handles it) and\n        // on any interactive control inside the card\n        if (event.target.closest('.bulk-select, a, button, input')) {\n          return;\n        }\n        var row = event.target.closest('[data-annotation]');\n        if (!row || !row.dataset.markId) {\n          return;\n        }\n        var checkbox = row.querySelector(\".\".concat(CHECKBOX_CLASS));\n        if (checkbox) {\n          checkbox.checked = !checkbox.checked;\n          refreshSelectionUI();\n        }\n      });\n    }\n  }\n  return {\n    init: init,\n    enterEditMode: enterEditMode,\n    exitEditMode: exitEditMode,\n    toggleEditMode: toggleEditMode,\n    refreshSelectionUI: refreshSelectionUI,\n    syncAfterRepaint: syncAfterRepaint,\n    submitDelete: submitDelete,\n    submitRecolor: submitRecolor,\n    getSelectedMarks: function getSelectedMarks() {\
19n      return collectSelectedMarks(getCollection());\n    }\n  };\n}\n\n/**\n * Build the bulk-delete confirmation message, naming how many of the selected\n * annotations carry a note (#4114).\n *\n * @param {number} count\n * @param {number} [notedCount=0]\n * @returns {string}\n */\nfunction buildDeleteConfirmMessage(count) {\n  var _context11;\n  var notedCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  var key = notedCount > 0 ? 'annotations.bulk_delete_confirm_notes' : 'annotations.bulk_delete_confirm';\n  var fallback = notedCount > 0 ? _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_7___default()(_context11 = \"Delete \".concat(count, \" annotations, including \")).call(_context11, notedCount, \" with notes? This cannot be undone.\") : \"Delete \".concat(count, \" annotations? This cannot be undone.\");\n\n  // t() returns the key itself when the key is missing, so an unresolved key is\n  // truthy and a plain `||` fallback never fires.\n  if ((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(key) === key) {\n    return fallback;\n  }\n  return (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_9__.t)(key, {\n    ':count': count,\n    ':notes': notedCount\n  });\n}\n\n/**\n * Default confirm gate for deletes using the Foundation reveal modal in the\n * page. Resolves true when the user confirms, false otherwise.\n *\n * @param {number} count\n * @param {number} [notedCount=0] How many of them carry a note.\n * @returns {Promise<boolean>}\n */\nfunction defaultConfirmDelete(count) {\n  var notedCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  var modal = document.querySelector('[data-bulk-delete-modal]');\n  var confirmMessage = buildDeleteConfirmMessage(count, notedCount);\n  if (!modal || typeof jQuery === 'undefined') {\n    // eslint-disable-next-line no-alert\n    return _babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_8___default().resolve(window.confirm(confirmMessage));\n  }\n  return new (_babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_8___default())(function (resolve) {\n    var message = modal.querySelector('[data-bulk-delete-message]');\n    if (message) {\n      message.textContent = confirmMessage;\n    }\n    var confirmButton = modal.querySelector('[data-bulk-delete-confirm]');\n    var $modal = jQuery(modal);\n    var settled = false;\n    var finish = function finish(result) {\n      if (settled) {\n        return;\n      }\n      settled = true;\n      confirmButton === null || confirmButton === void 0 || confirmButton.removeEventListener('click', onConfirm);\n      $modal.off('closed.zf.reveal', onClose);\n      resolve(result);\n    };\n\n    // Settle with `true` BEFORE closing the reveal. foundation('close') fires\n    // 'closed.zf.reveal' synchronously, which previously ran onClose → finish(false)\n    // first, so `settled` short-circuited the intended finish(true) and the delete\n    // was silently cancelled. finish() detaches onClose, so the close below is inert. (#3051)\n    var onConfirm = function onConfirm() {\n      finish(true);\n      $modal.foundation('close');\n    };\n    var onClose = function onClose() {\n      return finish(false);\n    };\n    confirmButton === null || confirmButton === void 0 || confirmButton.addEventListener('click', onConfirm);\n    $modal.on('closed.zf.reveal', onClose);\n    $modal.foundation('open');\n  });\n}\n\n/**\n * Default notice implementation.\n *\n * @param {string} message\n * @param {string} type\n */\nfunction defaultNotify(message, type) {\n  var notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_10__.AsyncNotice(message, type);\n  notice.create({});\n  notice.remove(4);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWNjb3VudC9hbm5vdGF0aW9ucy1idWxrLWVkaXQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7O0F
19BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy9hY2NvdW50L2Fubm90YXRpb25zLWJ1bGstZWRpdC5qcz9hZjQ2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmF0Y2gtZWRpdGluZyAodjEpIGZvciB0aGUgYW5ub3RhdGlvbnMgbWFuYWdlbWVudCBwYWdlIOKAlCAjMzA1MS5cbiAqXG4gKiBBZGRzIGFuIGVkaXQgbW9kZSB0byB0aGUgYW5ub3RhdGlvbnMgbGlzdCB0aGF0IGxldHMgYSB1c2VyIHNlbGVjdCBtdWx0aXBsZVxuICogbWFya3Mgb24gdGhlIGN1cnJlbnQgcGFnZSBhbmQgZWl0aGVyIGRlbGV0ZSB0aGVtIG9yIGNoYW5nZSB0aGVpciBoaWdobGlnaHRcbiAqIGNvbG9yIGluIGEgc2luZ2xlIHJlcXVlc3QuIENoZWNrYm94ZXMgYXJlIGluamVjdGVkIGNsaWVudC1zaWRlIHdoZW4gZWRpdFxuICogbW9kZSBpcyBlbnRlcmVkIHNvIHRoZSBzaGFyZWQgc2VydmVyIHJlbmRlciBwYXRoIChyZW5kZXJDb2xsZWN0aW9uKSBpc1xuICogdW50b3VjaGVkOyB0aGUgYnVsayBhY3Rpb25zIHJldXNlIHRoZSBleGlzdGluZyBtb2RpZnlDb2xsZWN0aW9uIHBhdGhcbiAqIChVc2VyTWFyazo6bW9kaWZ5TWFya3MpLCB3aGljaCBhbHJlYWR5IGxvb3BzIG92ZXIgYW4gYXJyYXkgb2YgbWFya3MuXG4gKlxuICogU2VsZWN0aW9uIGlzIHNjb3BlZCB0byB0aGUgY3VycmVudCBwYWdlIG9ubHkuIFdvcmtzIGluIGJvdGggY2FyZCBhbmQgbGlzdFxuICogdmlld3MuXG4gKi9cblxuaW1wb3J0IHsgdCB9IGZyb20gJy4uL3V0aWxpdGllcy9pMThuJztcbmltcG9ydCB7
19IEFzeW5jTm90aWNlIH0gZnJvbSAnLi4vbm90aWNlcy9ub3RpY2UnO1xuaW1wb3J0IHsgY3JlYXRlU3RpY2t5VG9vbGJhciB9IGZyb20gJy4uL3V0aWxpdGllcy9zdGlja3ktdG9vbGJhcic7XG5cbmNvbnN0IEVESVRfTU9ERV9DTEFTUyA9ICdidWxrLWVkaXQtYWN0aXZlJztcbmNvbnN0IENIRUNLQk9YX0NMQVNTID0gJ2J1bGstc2VsZWN0LWNoZWNrYm94JztcblxuLyoqXG4gKiBCdWlsZCB0aGUgbW9kaWZ5Q29sbGVjdGlvbiBwYXlsb2FkIGZvciBhIGJhdGNoIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHttYXJrSWQ6IHN0cmluZywgdXNlck1hcmtJZDogc3RyaW5nLCBoaWQ6IHN0cmluZ30+fSBzZWxlY3RlZE1hcmtzXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gJ2VkaXQnIChyZWNvbG9yKSBvciAnZGVsZXRlJ1xuICogQHBhcmFtIHs/c3RyaW5nfSBjb2xvciAtIGhpZ2hsaWdodCBjb2xvciB2YWx1ZSBmb3IgcmVjb2xvcjsgbnVsbCBmb3IgZGVsZXRlXG4gKiBAcmV0dXJucyB7e3R5cGU6IHN0cmluZywgbWFya3M6IEFycmF5fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQnVsa1BheWxvYWQoc2VsZWN0ZWRNYXJrcywgYWN0aW9uLCBjb2xvciA9IG51bGwpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVXNlck1hcmsnLFxuICAgIG1hcmtzOiBzZWxlY3RlZE1hcmtzLm1hcCgobWFyaykgPT4gKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGh0bWxDb250ZW50SWQ6IG1hcmsuaGlkLFxuICAgICAgdXNlck1hcmtJZDogbWFyay51c2VyTWFya0lkLFxuICAgICAgbWFya0lkOiBtYXJrLm1hcmtJZCxcbiAgICAgIGNvbG9yOiBjb2xvciA/PyBudWxsLFxuICAgIH0pKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBjdXJyZW50bHktY2hlY2tlZCByb3dzIGZyb20gYSBwYWdpbmF0ZWQgY29sbGVjdGlvbiBhbmQgcmV0dXJuIHRoZWlyXG4gKiBtYXJrIGlkZW50aWZpZXJzLiBJZHMgc3RheSBlbmNyeXB0ZWQgaGVyZSDigJQgdGhlIHNlcnZlciBkZWNyeXB0cyBhbmQgZW5mb3JjZXNcbiAqIG93bmVyc2hpcCBvbiBldmVyeSBtYXJrLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbGxlY3Rpb24gLSB0aGUgW2RhdGEtcGFnaW5hdGVkLWNvbGxlY3Rpb25dIGVsZW1lbnRcbiAqIEByZXR1cm5zIHtBcnJheTx7bWFya0lkOiBzdHJpbmcsIHVzZXJNYXJrSWQ6IHN0cmluZywgaGlkOiBzdHJpbmd9Pn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RTZWxlY3RlZE1hcmtzKGNvbGxlY3Rpb24pIHtcbiAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3Qgc2VsZWN0ZWQgPSBbXTtcbiAgY29sbGVjdGlvbi5xdWVyeVNlbGVjdG9yQWxsKGAuJHtDSEVDS0JPWF9DTEFTU306Y2hlY2tlZGApLmZvckVhY2goKGNoZWNrYm94KSA9PiB7XG4gICAgY29uc3QgYW5ub3RhdGlvblJvdyA9IGNoZWNrYm94LmNsb3Nlc3QoJ1tkYXRhLWFubm90YXRpb25dJyk7XG4gICAgaWYgKCFhbm5vdGF0aW9uUm93IHx8ICFhbm5vdGF0aW9uUm93LmRhdGFzZXQubWFya0lkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWRpdEFuY2hvciA9IGFubm90YXRpb25Sb3cucXVlcnlTZWxlY3RvcignLnVzZXItbWFyay1lZGl0Jyk7XG4gICAgc2VsZWN0ZWQucHVzaCh7XG4gICAgICBtYXJrSWQ6IGFubm90YXRpb25Sb3cuZGF0YXNldC5tYXJrSWQsXG4gICAgICB1c2VyTWFya0lkOiBhbm5vdGF0aW9uUm93LmRhdGFzZXQudXNlck1hcmtSZWNvcmRJZCxcbiAgICAgIGhpZDogZWRpdEFuY2hvcj8uZGF0YXNldC5oaWQgPz8gJycsXG4gICAgICAvLyBUaGUgbm90ZSBpcyBwYXJ0IG9mIHRoZSBzYW1lIGFubm90YXRpb24gb2JqZWN0LCBzbyBkZWxldGluZyB0aGUgcm93XG4gICAgICAvLyBkZWxldGVzIHRoZSBub3RlIOKAlCB0aGUgY29uZmlybSBjb3B5IGhhcyB0byBzYXkgc28gKCM0MTE0KS5cbiAgICAgIGhhc05vdGU6IEJvb2xlYW4oYW5ub3RhdGlvblJvdy5xdWVyeVNlbGVjdG9yKCdbZGF0YS1ub3RlLWRpc3BsYXldJykpLFxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gc2VsZWN0ZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBidWxrLWVkaXQgY29udHJvbGxlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVwc1xuICogQHBhcmFtIHtPYmplY3R9IGRlcHMuY29sb3JzIC0gbWFwIG9mIGNvbG9yIG5hbWUgPT4gaGlnaGxpZ2h0IGNvbG9yIHZhbHVlXG4gKiBAcGFyYW0geyhwYXlsb2FkOiBPYmplY3QsIGFjdGlvbjogc3RyaW5nKSA9PiBQcm9taXNlPHtzdWNjZXNzOiBib29sZWFufT59IGRlcHMuYXBwbHlCYXRjaFxuICogICAgICAgIFNlbmRzIG9uZSBtb2RpZnlDb2xsZWN0aW9uIHJlcXVlc3QgYW5kIHJlcGFpbnRzIHRoZSBsaXN0LlxuICogQHBhcmFtIHsoY291bnQ6IG51bWJlcikgPT4gUHJvbWlzZTxib29sZWFuPn0gW2RlcHMuY29uZmlybURlbGV0ZV0gLSBjb25maXJtIGdhdGUgZm9yIGRlbGV0ZXNcbiAqIEBwYXJhbSB7KG1lc3NhZ2U6IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PiB2b2lkfSBbZGVwcy5ub3RpZnldIC0gdXNlci1mYWNpbmcgbm90aWNlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBjb250cm9sbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWxrRWRpdENvbnRyb2xsZXIoZGVwcykge1xuICBjb25zdCB7IGNvbG9ycywgYXBwbHlCYXRjaCB9ID0gZGVwcztcbiAgY29uc3QgY29uZmlybURlbGV0ZSA9IGRlcHMuY29uZmlybURlbGV0ZSA/PyBkZWZhdWx0Q29uZmlybURlbGV0ZTtcbiAgY29uc3Qgbm90aWZ5ID0gZGVwcy5ub3RpZnkgPz8gZGVmYXVsdE5vdGlmeTtcblxuICBsZXQgZWRpdE1vZGUgPSBmYWxzZTtcblxuICBjb25zdCBnZXRXcmFwcGVyID0gKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY29sbGVjdGlvbl0nKTtcbiAgY29uc3QgZ2V0Q29sbGVjdGlvbiA9ICgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhZ2luYXRlZC1jb2xsZWN0aW9uXScpO1xuICBjb25zdCBnZXRUb2dnbGUgPSAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1idWxrLWVkaXQtdG9nZ2xlXScpO1xuICBjb25zdCBnZXRUb2dnbGVMYWJlbCA9ICh0b2dnbGUpID0+XG4gICAgKHRvZ2dsZT8uY2xvc2VzdCgnLmNvbGxlY3Rpb24tc3R5bGUnKSB8fCB0b2dnbGU/LnBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQpXG4gICAgICAucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1lZGl0LXRvZ2dsZS1sYWJlbF0nKTtcbiAgY29uc3QgZ2V0QmFyID0gKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1hY3Rpb24tYmFyXScpO1xuICBjb25zdCBnZXRTZWxlY3RBbGwgPSAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1idWxrLXNlbGVjdC1hbGxdJyk7XG4gIGNvbnN0IGdldFNlbGVjdEFsbFdyYXBwZXIgPSAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1idWxrLXNlbGVjdC1hbGwtd3JhcHBlcl0nKTtcbiAgY29uc3QgZ2V0Q291bnRFbGVtZW50ID0gKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1jb3VudF0nKTtcbiAgY29uc3QgZ2V0RGVsZXRlQnV0dG9uID0gKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1kZWxldGVdJyk7XG4gIGNvbnN0IGdldENvbG9yU3dhdGNoZXMgPSAoKSA9PiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5idWxrLWNvbG9yLXN3YXRjaCcpKTtcblxuICAvLyBQaW5zIHRoZSBUb3RhbC9TaG93IHJvdyArIHRvb2xiYXIgZGlyZWN0bHkgYmVsb3cgdGhlIHN0aWNreSBtYWluIG5hdiB3aGlsZVxuICAvLyBlZGl0IG1vZGUgaXMgYWN0aXZlIG9ubHkgKCMzNTY2KS5cbiAgY29uc3Qgc3RpY2t5VG9vbGJhciA9IGNyZWF0ZVN0aWNreVRvb2xiYXIoKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtc3RpY2t5LWJhdGNoLXRvb2xiYXJdJykpO1xuXG4gIGNvbnN0IHNlbGVjdGFibGVSb3dzID0gKCkgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uKCk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybi
19BBcnJheS5mcm9tKGNvbGxlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5ub3RhdGlvbl0nKSlcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gcm93LmRhdGFzZXQubWFya0lkKTtcbiAgfTtcblxuICBjb25zdCByb3dDaGVja2JveGVzID0gKCkgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uKCk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKGNvbGxlY3Rpb24ucXVlcnlTZWxlY3RvckFsbChgLiR7Q0hFQ0tCT1hfQ0xBU1N9YCkpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGluamVjdENoZWNrYm94ZXMoKSB7XG4gICAgc2VsZWN0YWJsZVJvd3MoKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChyb3cucXVlcnlTZWxlY3RvcihgLiR7Q0hFQ0tCT1hfQ0xBU1N9YCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICBsYWJlbC5jbGFzc05hbWUgPSAnYnVsay1zZWxlY3QnO1xuXG4gICAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9IENIRUNLQk9YX0NMQVNTO1xuICAgICAgY2hlY2tib3guc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdCgnYW5ub3RhdGlvbnMuc2VsZWN0X2l0ZW0nKSB8fCAnU2VsZWN0IGFubm90YXRpb24nKTtcblxuICAgICAgY29uc3Qgc3JUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgc3JUZXh0LmNsYXNzTmFtZSA9ICdzaG93LWZvci1zcic7XG4gICAgICBzclRleHQudGV4dENvbnRlbnQgPSB0KCdhbm5vdGF0aW9ucy5zZWxlY3RfaXRlbScpIHx8ICdTZWxlY3QgYW5ub3RhdGlvbic7XG5cbiAgICAgIGxhYmVsLmFwcGVuZENoaWxkKGNoZWNrYm94KTtcbiAgICAgIGxhYmVsLmFwcGVuZENoaWxkKHNyVGV4dCk7XG5cbiAgICAgIC8vIGxpc3QgdmlldyByb3dzIGFyZSA8dHI+OyBwdXQgdGhlIGNvbnRyb2wgaW5zaWRlIHRoZSBmaXJzdCBjZWxsIHNvIHRoZVxuICAgICAgLy8gdGFibGUgbWFya3VwIHN0YXlzIHZhbGlkLiBDYXJkIHJvd3MgdGFrZSB0aGUgY29udHJvbCBkaXJlY3RseS5cbiAgICAgIGNvbnN0IGZpcnN0Q2VsbCA9IHJvdy50YWdOYW1lID09PSAnVFInID8gcm93LnF1ZXJ5U2VsZWN0b3IoJ3RkLCB0aCcpIDogbnVsbDtcbiAgICAgIChmaXJzdENlbGwgPz8gcm93KS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyYmVnaW4nLCBsYWJlbCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVDaGVja2JveGVzKCkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uKCk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbGxlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnLmJ1bGstc2VsZWN0JykuZm9yRWFjaCgobGFiZWwpID0+IGxhYmVsLnJlbW92ZSgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZnJlc2hTZWxlY3Rpb25VSSgpIHtcbiAgICBjb25zdCBib3hlcyA9IHJvd0NoZWNrYm94ZXMoKTtcbiAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gYm94ZXMuZmlsdGVyKChjYikgPT4gY2IuY2hlY2tlZCkubGVuZ3RoO1xuXG4gICAgY29uc3QgY291bnRFbGVtZW50ID0gZ2V0Q291bnRFbGVtZW50KCk7XG4gICAgaWYgKGNvdW50RWxlbWVudCkge1xuICAgICAgY291bnRFbGVtZW50LnRleHRDb250ZW50ID0gdCgnYW5ub3RhdGlvbnMuc2VsZWN0ZWRfY291bnQnLCB7ICc6Y291bnQnOiBzZWxlY3RlZENvdW50IH0pXG4gICAgICAgIHx8IGAke3NlbGVjdGVkQ291bnR9IHNlbGVjdGVkYDtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSBzZWxlY3RlZENvdW50ID4gMDtcbiAgICBzZXRBY3Rpb25zRW5hYmxlZChoYXNTZWxlY3Rpb24pO1xuXG4gICAgY29uc3Qgc2VsZWN0QWxsI
19D0gZ2V0U2VsZWN0QWxsKCk7XG4gICAgaWYgKHNlbGVjdEFsbCkge1xuICAgICAgc2VsZWN0QWxsLmNoZWNrZWQgPSBib3hlcy5sZW5ndGggPiAwICYmIHNlbGVjdGVkQ291bnQgPT09IGJveGVzLmxlbmd0aDtcbiAgICAgIHNlbGVjdEFsbC5pbmRldGVybWluYXRlID0gc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0ZWRDb3VudCA8IGJveGVzLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRBY3Rpb25zRW5hYmxlZChlbmFibGVkKSB7XG4gICAgY29uc3QgY29udHJvbHMgPSBbZ2V0RGVsZXRlQnV0dG9uKCksIC4uLmdldENvbG9yU3dhdGNoZXMoKV0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgIGNvbnRyb2wuZGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgICAgIGNvbnRyb2wuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgZW5hYmxlZCA/ICdmYWxzZScgOiAndHJ1ZScpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRTZWxlY3Rpb24oKSB7XG4gICAgcm93Q2hlY2tib3hlcygpLmZvckVhY2goKGNiKSA9PiB7IGNiLmNoZWNrZWQgPSBmYWxzZTsgfSk7XG4gICAgY29uc3Qgc2VsZWN0QWxsID0gZ2V0U2VsZWN0QWxsKCk7XG4gICAgaWYgKHNlbGVjdEFsbCkge1xuICAgICAgc2VsZWN0QWxsLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIHNlbGVjdEFsbC5pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgfVxuICAgIHJlZnJlc2hTZWxlY3Rpb25VSSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZW50ZXJFZGl0TW9kZSgpIHtcbiAgICBlZGl0TW9kZSA9IHRydWU7XG4gICAgZ2V0V3JhcHBlcigpPy5jbGFzc0xpc3QuYWRkKEVESVRfTU9ERV9DTEFTUyk7XG4gICAgaW5qZWN0Q2hlY2tib3hlcygpO1xuICAgIGdldEJhcigpPy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgZ2V0U2VsZWN0QWxsV3JhcHBlcigpPy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgc3RpY2t5VG9vbGJhci5hY3RpdmF0ZSgpO1xuXG4gICAgY29uc3QgdG9nZ2xlID0gZ2V0VG9nZ2xlKCk7XG4gICAgaWYgKHRvZ2dsZSkge1xuICAgICAgdG9nZ2xlLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICAgIHRvZ2dsZS5jbGFzc0xpc3QucmVtb3ZlKCdpY29uLW9mZicpO1xuICAgICAgdG9nZ2xlLmNsYXNzTGlzdC5hZGQoJ2ljb24tb24nKTtcbiAgICAgIGNvbnN0IGxhYmVsID0gZ2V0VG9nZ2xlTGFiZWwodG9nZ2xlKTtcbiAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHQoJ2Fubm90YXRpb25zLmRvbmUnKSB8fCAnRG9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXRFZGl0TW9kZSgpIHtcbiAgICBlZGl0TW9kZSA9IGZhbHNlO1xuICAgIHJlbW92ZUNoZWNrYm94ZXMoKTtcbiAgICBnZXRXcmFwcGVyKCk/LmNsYXNzTGlzdC5yZW1vdmUoRURJVF9NT0RFX0NMQVNTKTtcbiAgICBnZXRCYXIoKT8uY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgIGdldFNlbGVjdEFsbFdyYXBwZXIoKT8uY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgIHNldEFjdGlvbnNFbmFibGVkKGZhbHNlKTtcbiAgICBzdGlja3lUb29sYmFyLmRlYWN0aXZhdGUoKTtcblxuICAgIGNvbnN0IHRvZ2dsZSA9IGdldFRvZ2dsZSgpO1xuICAgIGlmICh0b2dnbGUpIHtcbiAgICAgIHRvZ2dsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICAgICAgdG9nZ2xlLmNsYXNzTGlzdC5yZW1vdmUoJ2ljb24tb24nKTtcbiAgICAgIHRvZ2dsZS5jbGFzc0xpc3QuYWRkKCdpY29uLW9mZicpO1xuICAgICAgY29uc3QgbGFiZWwgPSBnZXRUb2dnbGVMYWJlbCh0b2dnbGUpO1xuICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gdCgnYW5ub3RhdGlvbnMuZWRpdF9tb2RlJykgfHwgJ0VkaXQnO1xuICAgICAgfVxuICAgICAgdG9nZ2xlLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlRWRpdE1vZGUoKSB7XG4gICAgaWYgKGVkaXRNb2RlKSB7XG4gICAgICBleGl0RWRpdE1vZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJFZGl0TW9kZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uU2VsZWN0QWxsKCkge1xuICAgIGNvbnN0IHNlbGVjdEFsbCA9IGdldFNlbGVjdEFsbCgpO1xuICAgIGlmICghc2VsZWN0QWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd0NoZWNrYm94ZXMoKS5mb3JFYWNoKChjYikgPT4geyBjYi5jaGVja2VkID0gc2VsZWN0QWxsLmNoZWNrZWQ7IH0pO1xuICAgIHJlZnJlc2hTZWxlY3Rpb25VSSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLWFwcGx5IGVkaXQtbW9kZSBET00gdG8gYSBmcmVzaGx5LXJlcGFpbnRlZCBjb2xsZWN0aW9uIGFuZCByZXNldCBzdGF0ZS5cbiAgICogQ2FsbGVkIGFmdGVyIGEgYmF0Y2ggb3AgKHRoZSBjb2xsZWN0aW9uIG5vZGUgaXMgcmVwbGFjZWQgYnkgdXBkYXRlQ29sbGVjdGlvbikuXG4gICAqL1xuICBmdW5jdGlvbiBzeW5jQWZ0ZXJSZXBhaW50KCkge1xuICAgIGlmICghZWRpdE1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5qZWN0Q2hlY2tib3hlcygpO1xuICAgIHJlc2V0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdWJtaXRCYXRjaChhY3Rpb24sIGNvbG9yKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IGdldENvbGxlY3Rpb24oKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGNvbGxlY3RTZWxlY3RlZE1hcmtzKGNvbGxlY3Rpb24pO1xuXG4gICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbm90aWZ5KHQoJ2Fubm90YXRpb25zLmJ1bGtfbm9uZV9zZWxlY3RlZCcpIHx8ICdTZWxlY3QgYXQgbGVhc3Qgb25lIGFubm90YXRpb24uJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgY29uc3Qgbm90ZWRDb3VudCA9IHNlbGVjdGVkLmZpbHRlcigobWFyaykgPT4gbWFyay5oYXNOb3RlKS5sZW5ndGg7XG4gICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBjb25maXJtRGVsZXRlKHNlbGVjdGVkLmxlbmd0aCwgbm90ZWRDb3VudCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IGJ1aWxkQnVsa1BheWxvYWQoc2VsZWN0ZWQsIGFjdGlvbiwgY29sb3IpO1xuICAgIHNldEFjdGlvbnNFbmFibGVkKGZhbHNlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcGx5QmF0Y2gocGF5bG9hZCwgYWN0aW9uKTtcblxuICAgIC8vIHVwZGF0ZUNvbGxlY3Rpb24gcmVwbGFjZWQgdGhlIGNvbGxlY3Rpb24gbm9kZSDigJQgcmUtYXBwbHkgZWRpdC1tb2RlIERPTS5cbiAgICBzeW5jQWZ0ZXJSZXBhaW50KCk7XG5cbiAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSkge1xuICAgICAgbm90aWZ5KHQoJ2Vycm9yX3VwZGF0aW5nX2xpc3QnKSB8fCAnVGhlcmUgd2FzIGFuIGVycm9yIHVwZGF0aW5nIHRoZSBhbm5vdGF0aW9ucyBsaXN0LicsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN1Ym1pdERlbGV0ZSgpIHtcbiAgICByZXR1cm4gc3VibWl0QmF0Y2goJ2RlbGV0ZScsIG51bGwpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3VibWl0UmVjb2xvcihjb2xvck5hbWUpIHtcbiAgICBjb25zdCBjb2xvclZhbHVlID0gY29sb3JzPy5bY29sb3JOYW1lXSA/PyBudWxsO1xuICAgIHJldHVybi
19BzdWJtaXRCYXRjaCgnZWRpdCcsIGNvbG9yVmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBjb25zdCB0b2dnbGUgPSBnZXRUb2dnbGUoKTtcbiAgICBpZiAoIXRvZ2dsZSkge1xuICAgICAgcmV0dXJuOyAvLyBwYWdlIGhhcyBubyBidWxrLWVkaXQgdG9vbGJhclxuICAgIH1cblxuICAgIC8vICMzMTMzOiB0aGUgQ29udGludWUgUmVhZGluZyB0b29sYmFyIHVzZXMgdGhlIHNhbWUgZ2VuZXJpYyBzZWxlY3RvcnMuIEJpbmRcbiAgICAvLyBvbmx5IHdoZW4gdGhpcyBwYWdlIGFjdHVhbGx5IGhhcyBhbm5vdGF0aW9uIHJvd3MsIHNvIHRoaXMgY29udHJvbGxlciBjYW5cbiAgICAvLyBuZXZlciBjcm9zcy1iaW5kIHRvIHRoZSBDb250aW51ZSBSZWFkaW5nIHRvb2xiYXIuXG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hbm5vdGF0aW9uXScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGdlbmVyaWMgcGFnaW5hdG9yIHJlcGxhY2VzIHRoZSBjb2xsZWN0aW9uIGVsZW1lbnQgd2hvbGVzYWxlLCBzbyB0aGVcbiAgICAvLyBpbmplY3RlZCBjaGVja2JveGVzIGRpc2FwcGVhciBvbiBldmVyeSBwYWdlIGNoYW5nZSB3aGlsZSB0aGUgdG9vbGJhclxuICAgIC8vIChvdXRzaWRlIHRoZSByZXBhaW50ZWQgY29sbGVjdGlvbikgc3RheXMgdW50b3VjaGVkLiBSZS1hcHBseSBlZGl0LW1vZGVcbiAgICAvLyBET00gc28gY2hlY2tib3hlcyBjb21lIGJhY2sgb24gdGhlIG5ldyBwYWdlICgjMzE1MywgIzM1ODEpLlxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbGxlY3Rpb246cmVwYWludGVkJywgKCkgPT4ge1xuICAgICAgc3luY0FmdGVyUmVwYWludCgpO1xuICAgIH0pO1xuXG4gICAgLy8gRGVsZWdhdGUgb24gZG9jdW1lbnQgc28gYSBjbGljayBhbnl3aGVyZSBpbiB0aGUgdG9nZ2xlICh0aGUgY2FwdGlvbiB0ZXh0XG4gICAgLy8gb3IgdGhlIGljb24sIGluY2x1ZGluZyBhIEZvbnQgQXdlc29tZS1zd2FwcGVkIDxzdmc+KSB0cmlnZ2VycyBpdCwgYW5kIGl0XG4gICAgLy8gc3Vydml2ZXMgYW55IHRvb2xiYXIvY29sbGVjdGlvbiByZS1yZW5kZXIuICgjMzA1MSlcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbG9zZXN0KCdbZGF0YS1idWxrLWVkaXQtdG9nZ2xlXScpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRvZ2dsZUVkaXRNb2RlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBnZXRTZWxlY3RBbGwoKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25TZWxlY3RBbGwpO1xuXG4gICAgZ2V0RGVsZXRlQnV0dG9uKCk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0RGVsZXRlKCk7XG4gICAgfSk7XG5cbiAgICBnZXRDb2xvclN3YXRjaGVzKCkuZm9yRWFjaCgoc3dhdGNoKSA9PiB7XG4gICAgICBzd2F0Y2guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHN3YXRjaC5kaXNhYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdWJtaXRSZWNvbG9yKHN3YXRjaC5kYXRhc2V0LmNvbG9yTmFtZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIERlbGVnYXRlIHJvdy1jaGVja2JveCBjaGFuZ2VzIGFuZCB3aG9sZS1yb3cgY2xpY2tzIG9uIHRoZSBzdGFibGVcbiAgICAvLyBbZGF0YS1jb2xsZWN0aW9uXSB3cmFwcGVyIHNvIGhhbmRsZXJzIHN1cnZpdmUgY29sbGVjdGlvbiByZXBhaW50cy5cbiAgICBjb25zdCB3cmFwcGVyID0gZ2V0V3JhcHBlcigpO1xuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICB3cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZWRpdE1vZGUgJiYgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDSEVDS0JPWF9DTEFTUykpIHtcbiAgICAgICAgICByZWZyZXNoU2VsZWN0aW9uVUkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFlZGl0TW9kZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZ25vcmUgY2xpY2tzIG9uIHRoZSBjaGVja2JveCBpdHNlbGYgKG5hdGl2ZSB0b2dnbGUgaGFuZGxlcyBpdCkgYW5kXG4gICAgICAgIC8vIG9uIGFueSBpbnRlcmFjdGl2ZSBjb250cm9sIGluc2lkZSB0aGUgY2FyZFxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5idWxrLXNlbGVjdCwgYSwgYnV0dG9uLCBpbnB1dCcpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvdyA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCdbZGF0YS1hbm5vdGF0aW9uXScpO1xuICAgICAgICBpZiAoIXJvdyB8fCAhcm93LmRhdGFzZXQubWFya0lkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoZWNrYm94ID0gcm93LnF1ZXJ5U2VsZWN0b3IoYC4ke0NIRUNLQk9YX0NMQVNTfWApO1xuICAgICAgICBpZiAoY2hlY2tib3gpIHtcbiAgICAgICAgICBjaGVja2JveC5jaGVja2VkID0gIWNoZWNrYm94LmNoZWNrZWQ7XG4gICAgICAgICAgcmVmcmVzaFNlbGVjdGlvblVJKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5pdCxcbiAgICBlbnRlckVkaXRNb2RlLFxuICAgIGV4aXRFZGl0TW9kZSxcbiAgICB0b2dnbGVFZGl0TW9kZSxcbiAgICByZWZyZXNoU2VsZWN0aW9uVUksXG4gICAgc3luY0FmdGVyUmVwYWludCxcbiAgICBzdWJtaXREZWxldGUsXG4gICAgc3VibWl0UmVjb2xvcixcbiAgICBnZXRTZWxlY3RlZE1hcmtzOiAoKSA9PiBjb2xsZWN0U2VsZWN0ZWRNYXJrcyhnZXRDb2xsZWN0aW9uKCkpLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBidWxrLWRlbGV0ZSBjb25maXJtYXRpb24gbWVzc2FnZSwgbmFtaW5nIGhvdyBtYW55IG9mIHRoZSBzZWxlY3RlZFxuICogYW5ub3RhdGlvbnMgY2FycnkgYSBub3RlICgjNDExNCkuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50XG4gKiBAcGFyYW0ge251bWJlcn0gW25vdGVkQ291bnQ9MF1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbGV0ZUNvbmZpcm1NZXNzYWdlKGNvdW50LCBub3RlZENvdW50ID0gMCkge1xuICBjb25zdCBrZXkgPSBub3RlZENvdW50ID4gMCA/ICdhbm5vdGF0aW9ucy5idWxrX2RlbGV0ZV9jb25maXJtX25vdGVzJyA6ICdhbm5vdGF0aW9ucy5idWxrX2RlbGV0ZV9jb25maXJtJztcbiAgY29uc3QgZmFsbGJhY2sgPSBub3RlZENvdW50ID4gMFxuICAgID8gYERlbGV0ZSAke2NvdW50fSBhbm5vdGF0aW9ucywgaW5jbHVkaW5nICR7bm90ZWRDb3VudH0gd2l0aCBub3Rlcz8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLmBcbiAgICA6IGBEZWxldGUgJHtjb3VudH0gYW5ub3RhdGlvbnM/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gO1xuXG4gIC8vIHQoKSByZXR1cm5zIHRoZSBrZXkgaXRzZWxmIHdoZW4gdGhlIGtleSBpcyBtaXNzaW5nLCBzbyBhbiB1bnJlc29sdmVkIGtleSBpc1xuICAvLyB0cnV0aHkgYW5kIGEg
19cGxhaW4gYHx8YCBmYWxsYmFjayBuZXZlciBmaXJlcy5cbiAgaWYgKHQoa2V5KSA9PT0ga2V5KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG5cbiAgcmV0dXJuIHQoa2V5LCB7ICc6Y291bnQnOiBjb3VudCwgJzpub3Rlcyc6IG5vdGVkQ291bnQgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBjb25maXJtIGdhdGUgZm9yIGRlbGV0ZXMgdXNpbmcgdGhlIEZvdW5kYXRpb24gcmV2ZWFsIG1vZGFsIGluIHRoZVxuICogcGFnZS4gUmVzb2x2ZXMgdHJ1ZSB3aGVuIHRoZSB1c2VyIGNvbmZpcm1zLCBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50XG4gKiBAcGFyYW0ge251bWJlcn0gW25vdGVkQ291bnQ9MF0gSG93IG1hbnkgb2YgdGhlbSBjYXJyeSBhIG5vdGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdENvbmZpcm1EZWxldGUoY291bnQsIG5vdGVkQ291bnQgPSAwKSB7XG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1kZWxldGUtbW9kYWxdJyk7XG4gIGNvbnN0IGNvbmZpcm1NZXNzYWdlID0gYnVpbGREZWxldGVDb25maXJtTWVzc2FnZShjb3VudCwgbm90ZWRDb3VudCk7XG5cbiAgaWYgKCFtb2RhbCB8fCB0eXBlb2YgalF1ZXJ5ID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hbGVydFxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUod2luZG93LmNvbmZpcm0oY29uZmlybU1lc3NhZ2UpKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1idWxrLWRlbGV0ZS1tZXNzYWdlXScpO1xuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICBtZXNzYWdlLnRleHRDb250ZW50ID0gY29uZmlybU1lc3NhZ2U7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybUJ1dHRvbiA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWJ1bGstZGVsZXRlLWNvbmZpcm1dJyk7XG4gICAgY29uc3QgJG1vZGFsID0galF1ZXJ5KG1vZGFsKTtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgZmluaXNoID0gKHJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICBjb25maXJtQnV0dG9uPy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ29uZmlybSk7XG4gICAgICAkbW9kYWwub2ZmKCdjbG9zZWQuemYucmV2ZWFsJywgb25DbG9zZSk7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfTtcblxuICAgIC8vIFNldHRsZSB3aXRoIGB0cnVlYCBCRUZPUkUgY2xvc2luZyB0aGUgcmV2ZWFsLiBmb3VuZGF0aW9uKCdjbG9zZScpIGZpcmVzXG4gICAgLy8gJ2Nsb3NlZC56Zi5yZXZlYWwnIHN5bmNocm9ub3VzbHksIHdoaWNoIHByZXZpb3VzbHkgcmFuIG9uQ2xvc2Ug4oaSIGZpbmlzaChmYWxzZSlcbiAgICAvLyBmaXJzdCwgc28gYHNldHRsZWRgIHNob3J0LWNpcmN1aXRlZCB0aGUgaW50ZW5kZWQgZmluaXNoKHRydWUpIGFuZCB0aGUgZGVsZXRlXG4gICAgLy8gd2FzIHNpbGVudGx5IGNhbmNlbGxlZC4gZmluaXNoKCkgZGV0YWNoZXMgb25DbG9zZSwgc28gdGhlIGNsb3NlIGJlbG93IGlzIGluZXJ0LiAoIzMwNTEpXG4gICAgY29uc3Qgb25Db25maXJtID0gKCkgPT4ge1xuICAgICAgZmluaXNoKHRydWUpO1xuICAgICAgJG1vZGFsLmZvdW5kYXRpb24oJ2Nsb3NlJyk7XG4gICAgfTtcbiAgICBjb25zdCBvbkNsb3NlID0gKCkgPT4gZmluaXNoKGZhbHNlKTtcblxuICAgIGNvbmZpcm1CdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25Db25maXJtKTtcbiAgICAkbW9kYWwub24oJ2Nsb3NlZC56Zi5yZXZlYWwnLCBvbkNsb3NlKTtcbiAgICAkbW9kYWwuZm91bmRhdGlvbignb3BlbicpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IG5vdGljZSBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdE5vdGlmeShtZXNzYWdlLCB0eXBlKSB7XG4gIGNvbnN0IG5vdGljZSA9IG5ldyBBc3luY05vdGljZShtZXNzYWdlLCB0eXBlKTtcbiAgbm90aWNlLmNyZWF0ZSh7fSk7XG4gIG5vdGljZS5yZW1vdmUoNCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/account/annotations-bulk-edit.js\n");
20
21/***/ }),
22
23/***/ "./resources/js/account/annotations-note-editor.js":
24/*!*********************************************************!*\
25  !*** ./resources/js/account/annotations-note-editor.js ***!
26  \*********************************************************/
27/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
28
29eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   buildNotePayload: () => (/* binding */ buildNotePayload),\n/* harmony export */   openAnnotationNoteEditor: () => (/* binding */ openAnnotationNoteEditor),\n/* harmony export */   readNoteEditorTargets: () => (/* binding */ readNoteEditorTargets)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _annotations_note_editor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../annotations/note-editor */ \"./resources/js/annotations/note-editor.js\");\n\n\n/**\n * Account annotations-page note editor wiring (experimental notes, #3083).\n *\n * The reader already opens the hardened note editor for a mark; the account\n * Annotations page rendered the note button but had no editor or single-mark\n * save path. This module reuses the shared createNoteEditor component and\n * persists a single-mark note through the SAME modifyCollection path recolor\n * uses (updateCollection), so the collection repaints and the card reflects the\n * saved note.\n *\n * Dependencies (updateCollection, setOptions, overlay, notify) are injected so\n * the payload + persistence flow can be unit-tested without the heavy account\n * module or the network layer. The note stays a plain string end-to-end (#3076).\n */\n\n\n\n/**\n * Build the single-mark modifyCollection payload for a note save/clear.\n * `note` is always coerced to a plain string so an object can never be sent.\n *\n * @param {Object} params\n * @param {string} params.markId\n * @param {string} params.userMarkId\n * @param {string} params.htmlContentId\n * @param {*}      params.note\n * @returns {{type: string, marks: Array<Object>}}\n */\nfunction buildNotePayload(_ref) {\n  var markId = _ref.markId,\n    userMarkId = _ref.userMarkId,\n    htmlContentId = _ref.htmlContentId,\n    note = _ref.note;\n  return {\n    type: 'UserMark',\n    marks: [{\n      action: 'note',\n      markId: markId,\n      userMarkId: userMarkId,\n      htmlContentId: htmlContentId,\n      note: typeof note === 'string' ? note : String(note !== null && note !== void 0 ? note : '')\n    }]\n  };\n}\n\n/**\n * Read the ids + existing note the editor needs from an annotation card. Ids\n * 
29stay encrypted; the server decrypts and enforces ownership.\n *\n * @param {HTMLElement} annotation\n * @returns {{optionsDiv: HTMLElement|null, markId: string, userMarkId: string, htmlContentId: string, note: string}}\n */\nfunction readNoteEditorTargets(annotation) {\n  var _annotation$querySele, _annotation$querySele2, _optionsDiv$dataset$m, _optionsDiv$dataset$u, _editAnchor$dataset$h, _optionsDiv$dataset$n;\n  var optionsDiv = (_annotation$querySele = annotation === null || annotation === void 0 ? void 0 : annotation.querySelector('.annotation-options')) !== null && _annotation$querySele !== void 0 ? _annotation$querySele : null;\n  var editAnchor = (_annotation$querySele2 = annotation === null || annotation === void 0 ? void 0 : annotation.querySelector('.user-mark-edit')) !== null && _annotation$querySele2 !== void 0 ? _annotation$querySele2 : null;\n  return {\n    optionsDiv: optionsDiv,\n    markId: (_optionsDiv$dataset$m = optionsDiv === null || optionsDiv === void 0 ? void 0 : optionsDiv.dataset.markId) !== null && _optionsDiv$dataset$m !== void 0 ? _optionsDiv$dataset$m : '',\n    userMarkId: (_optionsDiv$dataset$u = optionsDiv === null || optionsDiv === void 0 ? void 0 : optionsDiv.dataset.userMarkRecordId) !== null && _optionsDiv$dataset$u !== void 0 ? _optionsDiv$dataset$u : '',\n    htmlContentId: (_editAnchor$dataset$h = editAnchor === null || editAnchor === void 0 ? void 0 : editAnchor.dataset.hid) !== null && _editAnchor$dataset$h !== void 0 ? _editAnchor$dataset$h : '',\n    note: (_optionsDiv$dataset$n = optionsDiv === null || optionsDiv === void 0 ? void 0 : optionsDiv.dataset.note) !== null && _optionsDiv$dataset$n !== void 0 ? _optionsDiv$dataset$n : ''\n  };\n}\n\n/**\n * Open the note editor for one annotation card and wire its save/delete to a\n * single-mark modifyCollection request through the injected updateCollection.\n *\n * @param {Object} params\n * @param {HTMLElement} params.annotation\n * @param {Object|null} [params.i18n=null]\n * @param {() => Object} params.setOptions      Build the current collection options.\n * @param {(options: Object) => Promise<{success: boolean}>} params.updateCollection\n * @param {() => void} [params.showOverlay]\n * @param {() => void} [params.hideOverlay]\n * @param {(err: Error) => void} [params.onError]\n * @returns {HTMLElement|null} The editor element, or null when the card has no options panel.\n */\nfunction openAnnotationNoteEditor(_ref2) {\n  var annotation = _ref2.annotation,\n    _ref2$i18n = _ref2.i18n,\n    i18n = _ref2$i18n === void 0 ? null : _ref2$i18n,\n    setOptions = _ref2.setOptions,\n    updateCollection = _ref2.updateCollection,\n    _ref2$showOverlay = _ref2.showOverlay,\n    showOverlay = _ref2$showOverlay === void 0 ? function () {} : _ref2$showOverlay,\n    _ref2$hideOverlay = _ref2.hideOverlay,\n    hideOverlay = _ref2$hideOverlay === void 0 ? function () {} : _ref2$hideOverlay,\n    _ref2$onError = _ref2.onError,\n    onError = _ref2$onError === void 0 ? function () {} : _ref2$onError;\n  var _readNoteEditorTarget = readNoteEditorTargets(annotation),\n    optionsDiv = _readNoteEditorTarget.optionsDiv,\n    markId = _readNoteEditorTarget.markId,\n    userMarkId = _readNoteEditorTarget.userMarkId,\n    htmlContentId = _readNoteEditorTarget.htmlContentId,\n    note = _readNoteEditorTarget.note;\n  if (!optionsDiv) {\n    return null;\n  }\n  var persist = /*#__PURE__*/function () {\n    var _ref3 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee(noteText) {\n      var options, result;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n        while (1) switch (_context.prev = _context.next) {\n          case 0:\n            options = setOptions();\n            options.modifyCollection = buildNotePayload({\n              markId: markId,\n              userMarkId: userMarkId,\n              htmlContentId: htmlContentId,\n              note: n
29oteText\n            });\n            showOverlay();\n            _context.prev = 3;\n            _context.next = 6;\n            return updateCollection(options);\n          case 6:\n            result = _context.sent;\n            if (!(result && result.success === false)) {\n              _context.next = 9;\n              break;\n            }\n            throw new Error('Note save failed');\n          case 9:\n            return _context.abrupt(\"return\", result);\n          case 10:\n            _context.prev = 10;\n            hideOverlay();\n            return _context.finish(10);\n          case 13:\n          case \"end\":\n            return _context.stop();\n        }\n      }, _callee, null, [[3,, 10, 13]]);\n    }));\n    return function persist(_x) {\n      return _ref3.apply(this, arguments);\n    };\n  }();\n  var editor = (0,_annotations_note_editor__WEBPACK_IMPORTED_MODULE_2__.createNoteEditor)({\n    markId: markId,\n    userMarkRecordId: userMarkId,\n    initialValue: note,\n    i18n: i18n,\n    saveNote: function saveNote(text) {\n      return persist(text);\n    },\n    deleteNote: function deleteNote() {\n      return persist('');\n    },\n    onError: onError\n  });\n\n  // The editor is a floating, draggable panel — mount it on document.body so it\n  // sits outside the annotation card and can be dragged to reveal the text\n  // behind it (#3083). Once mounted (so it can be measured), open it anchored\n  // beside/below the annotation card so it appears close to what's being edited.\n  optionsDiv.classList.add('hide');\n  document.body.appendChild(editor);\n  (0,_annotations_note_editor__WEBPACK_IMPORTED_MODULE_2__.positionEditorNearAnchor)(editor, annotation !== null && annotation !== void 0 ? annotation : optionsDiv);\n  return editor;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWNjb3VudC9hbm5vdGF0aW9ucy1ub3RlLWVkaXRvci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQVBBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUdBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFuQkE7QUFBQTtBQUFBO0FBcUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvYWNjb3VudC9hbm5vdGF0aW9ucy1ub3RlLWVkaXRvci5qcz9lYjg3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWNjb3VudCBhbm5vdGF0aW9ucy1wYWdlIG5vdGUgZWRpdG9yIHdpcmluZyAoZXhwZXJpbWVudGFsIG5vdGVzLCAjMzA4MykuXG4gKlxuICogVGhlIHJlYWRlciBhbHJlYWR5IG9wZW5zIHRoZSBoYXJkZW5lZCBub3RlIGVkaXRvciBmb3IgYSBtYXJrOyB0aGUgYWNjb3VudFxuICogQW5ub3RhdGlvbnMgcGFnZSByZW5kZXJlZCB0aGUgbm90ZSBidXR0b24gYnV0IGhhZCBubyBlZGl0b3Igb3Igc2luZ2xlLW1hcmtcbiAqIHNhdmUgcGF0aC4gVGhpcyBtb2R1bGUgcmV1c2VzIHRoZSBzaGFyZWQgY3JlYXRlTm90ZUVkaXRvciBjb21wb25lbnQgYW5kXG4gKiBwZXJzaXN0cyBhIHNpbmdsZS1tYXJrIG5vdGUgdGhyb3VnaCB0aGUgU0FNRSBtb2RpZnlDb2xsZWN0aW9uIHBhdGggcmVjb2xvclxuICogdXNlcyAodXBkYXRlQ29sbGVjdGlvbiksIHNvIHRoZSBjb2xsZWN0aW9uIHJlcGFpbnRzIGFuZCB0aGUgY2FyZCByZWZsZWN0cyB0aGVcbiAqIHNhdmVkIG5vdGUuXG4gKlxuICogRGVwZW5kZW5jaWVzICh1cGRhdGVDb2xsZWN0aW9uLCBzZXRPcHRpb25zLCBvdmVybGF5LCBub3RpZnkpIGFyZSBpbmplY3RlZCBzb1xuICogdGhlIHBheWxvYWQgKyBwZXJzaXN0ZW5jZSBmbG93IGNhbiBiZSB1bml0LXRlc3RlZCB3aXRob3V0IHRoZSBoZWF2eSBhY2NvdW50XG4gKiBtb2R1bGUgb3IgdGhlIG5ldHdvcmsgbGF5ZXIuIFRoZSBub3RlIHN0YXlzIGEgcGxhaW4gc3RyaW5nIGVuZC10by1lbmQgKCMzMDc2KS5cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVOb3RlRWRpdG9yLCBwb3NpdGlvbkVkaXRvck5lYXJBbmNob3IgfSBmcm9tICcuLi9hbm5vdGF0aW9ucy9ub3RlLWVkaXRvcic7XG5cbi8qKlxuICogQnVpbGQgdGhlIHNpbmdsZS1tYXJrIG1vZGlmeUNvbGxlY3Rpb24gcGF5bG9hZCBmb3IgYSBub3RlIHNhdmUvY2xlYXIuXG4gKiBgbm90ZWAgaXMgYWx3YXlzIGNvZXJjZWQgdG8gYSBwbGFpbiBzdHJpbmcgc28gYW4gb2JqZWN0IGNhbiBuZXZlciBiZSBzZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMubWFya0lkXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnVzZXJNYXJrSWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMua
29HRtbENvbnRlbnRJZFxuICogQHBhcmFtIHsqfSAgICAgIHBhcmFtcy5ub3RlXG4gKiBAcmV0dXJucyB7e3R5cGU6IHN0cmluZywgbWFya3M6IEFycmF5PE9iamVjdD59fVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGROb3RlUGF5bG9hZCh7IG1hcmtJZCwgdXNlck1hcmtJZCwgaHRtbENvbnRlbnRJZCwgbm90ZSB9KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1VzZXJNYXJrJyxcbiAgICBtYXJrczogW1xuICAgICAge1xuICAgICAgICBhY3Rpb246ICdub3RlJyxcbiAgICAgICAgbWFya0lkLFxuICAgICAgICB1c2VyTWFya0lkLFxuICAgICAgICBodG1sQ29udGVudElkLFxuICAgICAgICBub3RlOiB0eXBlb2Ygbm90ZSA9PT0gJ3N0cmluZycgPyBub3RlIDogU3RyaW5nKG5vdGUgPz8gJycpLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIGlkcyArIGV4aXN0aW5nIG5vdGUgdGhlIGVkaXRvciBuZWVkcyBmcm9tIGFuIGFubm90YXRpb24gY2FyZC4gSWRzXG4gKiBzdGF5IGVuY3J5cHRlZDsgdGhlIHNlcnZlciBkZWNyeXB0cyBhbmQgZW5mb3JjZXMgb3duZXJzaGlwLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGFubm90YXRpb25cbiAqIEByZXR1cm5zIHt7b3B0aW9uc0RpdjogSFRNTEVsZW1lbnR8bnVsbCwgbWFya0lkOiBzdHJpbmcsIHVzZXJNYXJrSWQ6IHN0cmluZywgaHRtbENvbnRlbnRJZDogc3RyaW5nLCBub3RlOiBzdHJpbmd9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZE5vdGVFZGl0b3JUYXJnZXRzKGFubm90YXRpb24pIHtcbiAgY29uc3Qgb3B0aW9uc0RpdiA9IGFubm90YXRpb24/LnF1ZXJ5U2VsZWN0b3IoJy5hbm5vdGF0aW9uLW9wdGlvbnMnKSA/PyBudWxsO1xuICBjb25zdCBlZGl0QW5jaG9yID0gYW5ub3RhdGlvbj8ucXVlcnlTZWxlY3RvcignLnVzZXItbWFyay1lZGl0JykgPz8gbnVsbDtcblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnNEaXYsXG4gICAgbWFya0lkOiBvcHRpb25zRGl2Py5kYXRhc2V0Lm1hcmtJZCA/PyAnJyxcbiAgICB1c2VyTWFya0lkOiBvcHRpb25zRGl2Py5kYXRhc2V0LnVzZXJNYXJrUmVjb3JkSWQgPz8gJycsXG4gICAgaHRtbENvbnRlbnRJZDogZWRpdEFuY2hvcj8uZGF0YXNldC5oaWQgPz8gJycsXG4gICAgbm90ZTogb3B0aW9uc0Rpdj8uZGF0YXNldC5ub3RlID8/ICcnLFxuICB9O1xufVxuXG4vKipcbiAqIE9wZW4gdGhlIG5vdGUgZWRpdG9yIGZvciBvbmUgYW5ub3RhdGlvbiBjYXJkIGFuZCB3aXJlIGl0cyBzYXZlL2RlbGV0ZSB0byBhXG4gKiBzaW5nbGUtbWFyayBtb2RpZnlDb2xsZWN0aW9uIHJlcXVlc3QgdGhyb3VnaCB0aGUgaW5qZWN0ZWQgdXBkYXRlQ29sbGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJhbXMuYW5ub3RhdGlvblxuICogQHBhcmFtIHtPYmplY3R8bnVsbH0gW3BhcmFtcy5pMThuPW51bGxdXG4gKiBAcGFyYW0geygpID0+IE9iamVjdH0gcGFyYW1zLnNldE9wdGlvbnMgICAgICBCdWlsZCB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9wdGlvbnMuXG4gKiBAcGFyYW0geyhvcHRpb25zOiBPYmplY3QpID0+IFByb21pc2U8e3N1Y2Nlc3M6IGJvb2xlYW59Pn0gcGFyYW1zLnVwZGF0ZUNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gW3BhcmFtcy5zaG93T3ZlcmxheV1cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gW3BhcmFtcy5oaWRlT3ZlcmxheV1cbiAqIEBwYXJhbSB7KGVycjogRXJyb3IpID0+IHZvaWR9IFtwYXJhbXMub25FcnJvcl1cbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfSBUaGUgZWRpdG9yIGVsZW1lbnQsIG9yIG51bGwgd2hlbiB0aGUgY2FyZCBoYXMgbm8gb3B0aW9ucyBwYW5lbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZW5Bbm5vdGF0aW9uTm90ZUVkaXRvcih7XG4gIGFubm90YXRpb24sXG4gIGkxOG4gPSBudWxsLFxuICBzZXRPcHRpb25zLFxuICB1cGRhdGVDb2xsZWN0aW9uLFxuICBzaG93T3ZlcmxheSA9ICgpID0+IHt9LFxuICBoaWRlT3ZlcmxheSA9ICgpID0+IHt9LFxuICBvbkVycm9yID0gKCkgPT4ge30sXG59KSB7XG4gIGNvbnN0IHsgb3B0aW9uc0RpdiwgbWFya0lkLCB1c2VyTWFya0lkLCBodG1sQ29udGVudElkLCBub3RlIH0gPSByZWFkTm90ZUVkaXRvclRhcmdldHMoYW5ub3RhdGlvbik7XG5cbiAgaWYgKCFvcHRpb25zRGl2KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwZXJzaXN0ID0gYXN5bmMgKG5vdGVUZXh0KSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHNldE9wdGlvbnMoKTtcbiAgICBvcHRpb25zLm1vZGlmeUNvbGxlY3Rpb24gPSBidWlsZE5vdGVQYXlsb2FkKHsgbWFya0lkLCB1c2VyTWFya0lkLCBodG1sQ29udGVudElkLCBub3RlOiBub3RlVGV4dCB9KTtcblxuICAgIHNob3dPdmVybGF5KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXBkYXRlQ29sbGVjdGlvbihvcHRpb25zKTtcblxuICAgICAgLy8gQSBnZW51aW5lIHJlcXVlc3QgZmFpbHVyZSBtdXN0IHRocm93IHNvIHRoZSBlZGl0b3Igcm9sbHMgYmFjayBpdHMgYnVzeVxuICAgICAgLy8gc3RhdGUgYW5kIHN1cmZhY2VzIHRoZSBlcnJvciByYXRoZXIgdGhhbiBjbG9zaW5nIG9uIGEgc2lsZW50IGZhaWx1cmUuXG4gICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdGUgc2F2ZSBmYWlsZWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGlkZU92ZXJsYXkoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZWRpdG9yID0gY3JlYXRlTm90ZUVkaXRvcih7XG4gICAgbWFya0lkLFxuICAgIHVzZXJNYXJrUmVjb3JkSWQ6IHVzZXJNYXJrSWQsXG4gICAgaW5pdGlhbFZhbHVlOiBub3RlLFxuICAgIGkxOG4sXG4gICAgc2F2ZU5vdGU6ICh0ZXh0KSA9PiBwZXJzaXN0KHRleHQpLFxuICAgIGRlbGV0ZU5vdGU6ICgpID0+IHBlcnNpc3QoJycpLFxuICAgIG9uRXJyb3IsXG4gIH0pO1xuXG4gIC8vIFRoZSBlZGl0b3IgaXMgYSBmbG9hdGluZywgZHJhZ2dhYmxlIHBhbmVsIOKAlCBtb3VudCBpdCBvbiBkb2N1bWVudC5ib2R5IHNvIGl0XG4gIC8vIHNpdHMgb3V0c2lkZSB0aGUgYW5ub3RhdGlvbiBjYXJkIGFuZCBjYW4gYmUgZHJhZ2dlZCB0byByZXZlYWwgdGhlIHRleHRcbiAgLy8gYmVoaW5kIGl0ICgjMzA4MykuIE9uY2UgbW91bnRlZCAoc28gaXQgY2FuIGJlIG1lYXN1cmVkKSwgb3BlbiBpdCBhbmNob3JlZFxuICAvLyBiZXNpZGUvYmVsb3cgdGhlIGFubm90YXRpb24gY2FyZCBzbyBpdCBhcHBlYXJzIGNsb3NlIHRvIHdoYXQncyBiZWluZyBlZGl0ZWQuXG4gIG9wdGlvbnNEaXYuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVkaXRvcik7XG4gIHBvc2l0aW9uRWRpdG9yTmVhckFuY2hvcihlZGl0b3IsIGFubm90YXRpb24gPz8gb3B0aW9uc0Rpdik7XG5cbiAgcmV0dXJuIGVkaXRvcjtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/account/annotations-note-editor.js\n");
30
31/***/ }),
32
33/***/ "./resources/js/account/annotations.js":
34/*!*********************************************!*\
35  !*** ./resources/js/account/annotations.js ***!
36  \*********************************************/
37/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
38
39eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   addAnnotationPageEventHandlers: () => (/* binding */ addAnnotationPageEventHandlers),\n/* harmony export */   addAnnotationsActionHandlers: () => (/* binding */ addAnnotationsActionHandlers),\n/* harmony export */   appColors: () => (/* reexport safe */ _utilities_general__WEBPACK_IMPORTED_MODULE_27__.appColors),\n/* harmony export */   clearFilterControls: () => (/* binding */ clearFilterControls),\n/* harmony export */   clearMarkObjectInSession: () => (/* binding */ clearMarkObjectInSession),\n/* harmony export */   defaultFilters: () => (/* binding */ defaultFilters),\n/* harmony export */   defaultOptions: () => (/* binding */ defaultOptions),\n/* harmony export */   emphasizeFilteredTagsOnAnnotations: () => (/* binding */ emphasizeFilteredTagsOnAnnotations),\n/* harmony export */   fetchUserTags: () => (/* binding */ fetchUserTags),\n/* harmony export */   filterTagsByPrefix: () => (/* binding */ filterTagsByPrefix),\n/* harmony export */   findHighlightTextContainer: () => (/* binding */ findHighlightTextContainer),\n/* harmony export */   getCurrentOptions: () => (/* binding */ getCurrentOptions),\n/* harmony export */   getSectionMarksFromSessionStorage: () => (/* binding */ getSectionMarksFromSessionStorage),\n/* harmony export */   isCollectionFiltered: () => (/* binding */ isCollectionFiltered),\n/* harmony export */   isTypeFiltered: () => (/* binding */ isTypeFiltered),\n/* harmony export */   manageFilterAccordions: () => (/* binding */ manageFilterAccordions),\n/* harmony export */   noteFilterWords: () => (/* binding */ noteFilterWords),\n/* harmony export */   setOptionValues: () => (/* binding */ setOptionValues),\n/* harmony export */   textFilterWords: () => (/* binding */ textFilterWords),\n/* harmony export */   toggleNoteFilterAllNoiseNotice: () => (/* binding */ toggleNoteFilterAllNoiseNotice),\n/* harmony export */   toggleTextFilterAllNoiseNotice: () => (/* binding */ toggleTextFilterAllNoiseNotice),\n/* harmony export */   updateCollection: () => (/* binding */ _updateCollection),\n/* harmony export */   updateStateOfHighlightsMenuDeleteButtons: () => (/* binding */ updateStateOfHighlightsMenuDeleteButtons)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/slicedToArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/createForOfIteratorHelper */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/createForOfIteratorHelper.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/toConsumableArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_objectSpread2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/objectSpread2 */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/objectSpread2.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/object/keys */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/trim */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/from */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/includes */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/parse-int */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/filter */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/sort */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/sort.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/set-timeout */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/json/stringify */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/is-array */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/set */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/set.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_starts_with__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/starts-with */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_starts_with__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_starts_with__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/some */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_23__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js/instance/replace-all */ \"./node_modules/@babel/runtime-corejs3/core-js/instance/replace-all.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_24__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_entries__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/object/entries */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_entries__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_object_entries__WEBPACK_IMPORTED_MODULE_25__);\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _utilities_general__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../utilities/general */ \"./resources/js/utilities/general.js\");\n/* harmony import */ var _spinner__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../spinner */ \"./resources/js/spinner.js\");\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _pagination__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../pagination */ \"./resources/js/pagination.js\");\n/* harmony import */ var _annotations_manage_tags__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../annotations/manage-tags */ \"./resources/js/annotations/manage-tags.js\");\n/* harmony import */ var _utilities_i18n__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../utilities/i18n */ \"./resources/js/utilities/i18n.js\");\n/* harmony import */ var _annotations_bulk_edit__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./annotations-bulk-edit */ \"./resources/js/account/annotations-bulk-edit.js\");\n/* harmony import */ var _annotations_note_editor__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./annotations-note-editor */ \"./resources/js/account/annotations-note-editor.js\");\n/* harmony import */ var _utilities_debug__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../utilities/debug */ \"./resources/js/utilities/debug.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * JavaScript functions for the Annotations page. Handles clicks on Sort controls, filter options, buttons to change the view\n * Style, and the 'annotations' management controls.\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Every filter type the annotations filter panel can render.\n *\n * Which of these are actually on the page is decided at runtime by\n * renderedFilterT
39ypes() — 'note' is feature-gated. (#4491)\n *\n * @type {string[]}\n */\nvar FILTER_TYPES = ['colors', 'tags', 'text', 'note', 'note-presence'];\n\n// The two note presence selections. '' — neither radio checked — is the third\n// state, and it means \"not filtering by presence\"; it is deliberately not an\n// option the user can pick. (#4777)\nvar NOTE_PRESENCE_WITH = 'with';\nvar NOTE_PRESENCE_WITHOUT = 'without';\nvar _createLogger = (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_35__.createLogger)('account-annotations'),\n  log = _createLogger.log;\n\n// Adapter so the shared note editor's dotted keys resolve through the account\n// page's window.__i18n map. Returns undefined for a missing key so the editor's\n// English fallbacks fire (the utilities t() returns the key name when missing).\nvar noteEditorI18n = {\n  t: function t(key) {\n    var value = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)(key);\n    return value === key ? undefined : value;\n  }\n};\n\n// Holds the batch-edit controller instance for the annotations page (#3051).\nvar bulkEditController = null;\n\n/**\n * Find the highlight text container within an annotation element.\n * Both cards and list views use the same .user-highlight div structure.\n *\n * @param {HTMLElement} annotation - The annotation element to search within\n * @param {string} style - The collection style ('cards' or 'list') - currently unused as both use same selector\n * @returns {HTMLElement|null} - The highlight container element or null if not found\n */\nfunction findHighlightTextContainer(annotation, style) {\n  // Both card and list views use .user-highlight as the element with background-color\n  return annotation.querySelector('.user-highlight');\n}\n\n/**\n * Set the 'options' object that manages the state of annotation components (filters, view, sort, etc.).\n * if clearFilters is set, it sets the filters objects to the default values.\n *\n * @returns {any}\n */\nfunction setOptionValues() {\n  var clearFilters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n  // initialize with current options\n  var currentOptions = getCurrentOptions();\n  var options = structuredClone(currentOptions);\n\n  // ensure not empty object. Build the default skeleton non-recursively —\n  // calling setOptionValues(true) here re-entered this same empty-check before\n  // reaching its own base case and stack-overflowed (\"too much recursion\")\n  // whenever getCurrentOptions() returned {} (e.g. an unparseable dataset). (#3076)\n  if (_babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_6___default()(options).length === 0) {\n    options = defaultOptions();\n  }\n  if (clearFilters) {\n    options.filters = defaultFilters();\n    options.filters.clear = true;\n    return options;\n  }\n\n  // 0. event handler for filtered label 'x' button\n  var filteredClearBtn = document.querySelector('#total i');\n  if (filteredClearBtn) {\n    filteredClearBtn.addEventListener('click', /*#__PURE__*/function () {\n      var _ref = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee(event) {\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee$(_context) {\n          while (1) switch (_context.prev = _context.next) {\n            case 0:\n              event.preventDefault();\n              // clearFiltersHandler already handles spinner and overlay\n              _context.next = 3;\n              return clearFiltersHandler(event, 'all');\n            case 3:\n            case \"end\":\n              return _context.stop();\n          }\n        }, _callee);\n      }));\n      return function (_x) {\n        return _ref.apply(this, arguments);\n      };\n    }());\n  }\n\n  // 1. update collection style\n  var viewStyleElem = document.querySelector('#view-style');\n\n  // if the user is changing the collection style\n  if (viewStyleElem) {\n    var viewElem = viewStyleElem.querySelector('.icon-on');\n    if (viewElem) {\n      var value = viewElem.dataset.value;\n      options.collection.style = value;\n    }\n  }\n\n  // 2. update sort option\n  var sortElem = document.querySelector('#sort-by');\n  if (sortElem) {\n    options.sort = sortElem.value;\n    options.collection.sort = sortElem.value;\n  }\n\n  // 3. update color filter options\n  var colorFilterElems = document.querySelectorAll('.filter-colors div input[type=\"checkbox\"]');\n  if (colorFilterElems && colorFilterElems.length > 0) {\n    options.filters.colors = [];\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(colorFilterElems).call(colorFilterElems, function (elem) {\n      if (clearFilters) {\n        elem.checked = false;\n      } else {\n        if (elem.checked) {\n          options.filters.colors.push(elem.id);\n        }\n      }\n    });\n  }\n\n  // 4. update text filters\n  var textSensitivity, textGrouping;\n  var textFilterElem = document.querySelector('#filter-by-text');\n  var textGroupingElem = document.querySelector(\"#word-grouping\");\n  var textSensitivityElem = document.querySelector(\"#case-sensitivity\");\n  var excludeNoiseWordsElem = document.querySelector(\"#ignore-common-words\");\n  if (textSensitivityElem) {\n    textSensitivity = textSensitivityElem.checked ? 'sensitive' : 'insensitive';\n  }\n  if (clearFilters) {\n    if (textFilterElem) {\n      textFilterElem.value = '';\n    }\n    if (textSensitivityElem) {\n      textSensitivityElem.checked = false; // default to 'insensitive'\n    }\n    if (textGroupingElem) {\n      textGroupingElem.checked = true; // default to 'All'\n    }\n    if (excludeNoiseWordsElem) {\n      excludeNoiseWordsElem.checked = false; // default to include common words\n    }\n  } else {\n    if (textSensitivity) {\n      options.filters.text.sensitivity = textSensitivity;\n    }\n    if (textGroupingElem) {\n      var _textGroupingElem$dat = textGroupingElem.dataset,\n        on = _textGroupingElem$dat.on,\n        off = _textGroupingElem$dat.off;\n      textGrouping = textGroupingElem.checked ? on : off;\n      options.filters.text.grouping = textGrouping;\n    }\n    if (textFilterElem) {\n      var _context2;\n      options.filters.text.words = _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8___default()(_context2 = textFilterElem.value).call(_context2);\n    }\n    if (excludeNoiseWordsElem) {\n      options.filters.text.excludeNoiseWords = excludeNoiseWordsElem.checked;\n    }\n  }\n\n  // 4b. update note filters (#4491)\n  // The section is server-gated behind FEATURE_NOTES, so a non-allowlisted user\n  // has none of these controls. Nothing is written to options.filters.note\n  // unless at least one of them exists, which keeps a pre-note stored options\n  // array byte-identical and leaves the server defaults in charge.\n  var noteFilterElem = document.querySelector('#filter-by-note');\n  var noteGroupingElem = document.querySelector('#note-word-grouping');\n  var noteSensitivityElem = document.querySelector('#note-case-sensitivity');\n  var noteExcludeNoiseWordsElem = document.querySelector('#note-ignore-common-words');\n  var notePresenceElems = document.querySelectorAll('input[name=\"note-presence\"]');\n  if (noteFilterElem || noteGroupingElem || noteSensitivityElem || noteExcludeNoiseWordsElem || notePresenceElems.length > 0) {\n    var _options$filters$note;\n    options.filters.note = (0,_babel_runtime_corejs3_helpers_objectSpread2__WEBPACK_IMPORTED_MODULE_3__[\"default\"])((0,_babel_runtime_corejs3_helpers_objectSpread2__WEBPACK_IMPORTED_MODULE_3__[\"default\"])({}, defaultFilters().note), (_options$filters$note = options.filters.note) !== null && _options$filters$note !== void 0 ? _options$filters$note : {});\n    if (noteSensitivityElem) {\n      options.filters.note.sensitivity = noteSensitivityElem.checked ? 'sensitive' : 'insensitive';\n    }\n    if (noteGroupingElem) {\n      var _noteGroupingElem$dat = noteGroupingElem.dataset,\n        _on = _noteGroupingElem$dat.on,\n        _off = _noteGroupingElem$dat.off;\n      options.filters.note.grouping = noteGroupingElem.checked ? _on : _off;\n    }\n    if (noteFilterElem) {\n      var _context3;\n      options.filters.note.words = _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8___default()(_context3 = noteFilterElem.value).call(_context3);\n    }\n    if (noteExcludeNoiseWordsElem) {\n      options.filters.note.excludeNoiseWords = noteExcludeNoiseWordsElem.checked;\n    }\n\n    // Note presence: '' (no preference), 'with', 'without'. The control is a\n    // pair of radios in its own filter card, so no-preference is \"neither\n    // checked\" rather than a third option the user has to pick (#4777).\n    // Anything else is sent as typed and reduced to 'any' by\n    // PaginationOptions::getNoteHasFilter(), which is the one place the value\n    // is validated. (#4492)\n    if (notePresenceElems.length > 0) {\n      var _context4;\n      var chosen = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_9___default()(_context4 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_10___default()(notePresenceElems)).call(_context4, function (elem) {\n        return elem.checked;\n      });\n      options.filters.note.has = chosen ? chosen.value : '';\n    }\n\n    // A note-text query cannot apply to marks that have no note, so \"no note\"\n    // suppresses the typed words instead of combining with them into a query\n    // that can only return nothing — which is what produced a silent\n    // \"Total: 0 of 401\" in QC. The text stays in the disabled input so it comes\n    // back when the presence selection changes. (#4777)\n    if (options.filters.note.has === NOTE_PRESENCE_WITHOUT) {\n      options.filters.note.words = '';\n    }\n  }\n\n  // 5. update tags filter\n  if (clearFilters) {\n    var _tagGroupingElem = document.querySelector('#tag-grouping');\n    if (_tagGroupingElem) {\n      _tagGroupingElem.checked = false; // default to 'any'\n    }\n  }\n  options.filters.tags.ids = [];\n  var selectedTags = document.querySelectorAll('.selected-tags .tag');\n  if (selectedTags && selectedTags.length > 0) {\n    options.filters.tags.ids = [];\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(selectedTags).call(selectedTags, function (elem) {\n      var _context5;\n      if (!_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_11___default()(_context5 = options.filters.tags.ids).call(_context5, elem.dataset.id)) {\n        options.filters.tags.ids.push(elem.dataset.id);\n      }\n    });\n  }\n\n  // tags grouping - default to 'any' when toggle doesn't exist (feature off)\n  var tagGroupingElem = document.querySelector('#tag-grouping');\n  if (tagGroupingElem) {\n    var _tagGroupingElem$data = tagGroupingElem.dataset,\n      _on2 = _tagGroupingElem$data.on,\n      _off2 = _tagGroupingElem$data.off;\n    options.filters.tags.grouping = tagGroupingElem.checked ? _on2 : _off2;\n  } else {\n    options.filters.tags.grouping = 'any';\n  }\n\n  // 6. update itemsPerPage\n  var showElem = document.querySelector('.items-per-page');\n  if (showElem) {\n    options.collection.itemsPerPage = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_12___default()(showElem.value);\n  }\n\n  // 7. update sort by\n  if (sortElem) {\n    options.sort = sortElem.value;\n    options.collection.sort = sortElem.value;\n  }\n  return options;\n}\n\n/**\n * Add the event handlers for the Annotations page.\n *\n * @returns {Promise<void>}\n */\nfunction addAnnotationPageEventHandlers() {\n  return _addAnnotationPageEventHandlers.apply(this, arguments);\n}\n/**\n * Initialize the batch-editing controller for the annotations page.\n * Reuses the existing modifyCollection path (updateCollection) so batch\n * delete/recolor share the single-item persistence flow.\n */\nfunction _addAnnotationPageEventHandlers() {\n  _addAnnotationPageEventHandlers = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee22() {\n    var textFilterBtn, sortElem, colorFilterElems, textFilterElemSelector, textFilterElem, viewStyleElems;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee22$(_context71) {\n      while (1) switch (_context71.prev = _context71.next) {\n        case 0:\n          textFilterBtn = document.querySelector(\".filter-text button\");\n          sortElem = document.querySelector('#sort-by');\n          colorFilterElems = document.querySelectorAll(\".filter-colors div input[type=\\'checkbox\\']\");\n          textFilterElemSelector = '.filter-text input[type=\"text\"]'; // used below for spinner options as well\n          textFilterElem = document.querySelector(textFilterElemSelector);\n          viewStyleElems = document.querySelectorAll('#view-style a'); // 0. Load user tags into sessionStorage for filter functionality\n          _context71.next = 8;\n          return fetchUserTags();\n        case 8:\n          // 1. Collection style click handler\n          _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(viewStyleElems).call(viewStyleElems, function (styleElement) {\n            styleElement.addEventListener('click', /*#__PURE__*/function () {\n              var _ref16 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee17(event) {\n                var target, listItemAnchor, newCollectionStyle, annotationsWrapper, currentOptions, activeElem, disabledElem, options, collectionContainer, result;\n                return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee17$(_context66) {\n                  while (1) switch (_context66.prev = _context66.next) {\n                    case 0:\n                      event.preventDefault();\n                      target = event.target;\n                      listItemAnchor = target.closest('a'); // Ignore click on the active view style icon\n                      if (!listItemAnchor.classList.contains('icon-on')) {\n                        _context66.next = 5;\n                        break;\n                      }\n                      return _context66.abrupt(\"return\");\n                    case 5:\n                      newCollectionStyle = listItemAnchor.dataset.value; // get current values\n                      annotationsWrapper = document.querySelector('[data-paginated-collection]');\n                      currentOptions = JSON.parse(annotationsWrapper.dataset.options); // if changing Collection style\n                      if (!(currentOptions.collection.style !== newCollectionStyle)) {\
39n                        _context66.next = 27;\n                        break;\n                      }\n                      // 1. swap style element visibility\n                      activeElem = document.querySelector('#view-style a.icon-on');\n                      disabledElem = document.querySelector('#view-style a.icon-off');\n                      activeElem.classList.replace('icon-on', 'icon-off');\n                      disabledElem.classList.replace('icon-off', 'icon-on');\n\n                      // 2. set options\n                      options = setOptionValues();\n                      options.spinner = {\n                        name: 'collection-style',\n                        targetSelector: '#view-style',\n                        insertPosition: 'afterbegin'\n                      };\n\n                      // 3. add overlay to collection container while updating (no spinner, just dim)\n                      // Target the .cell that wraps the collection: it survives the\n                      // updateCollection replaceWith and is a plain block box (inside the\n                      // grid-x gutters), so the overlay fills the full collection area\n                      // correctly in both list and grid (cards) layouts. (#2857)\n                      collectionContainer = document.querySelector('[data-collection] > .cell');\n                      (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.insertOverlayOnElement)(collectionContainer, 'collection-view-overlay', false);\n                      _context66.prev = 17;\n                      _context66.next = 20;\n                      return _updateCollection(options);\n                    case 20:\n                      result = _context66.sent;\n                      emphasizeFilteredTagsOnAnnotations();\n                      manageFilterAccordions();\n\n                      // 5. manage list icons\n                      if (result.success) {\n                        activeElem.classList.replace('icon-on', 'icon-off');\n                        disabledElem.classList.replace('icon-off', 'icon-on');\n\n                        // updateCollection() already wrote the server's canonical options onto the\n                        // freshly rendered collection node — don't clobber it with pre-switch\n                        // client state, which left stale data-options and broke the first color\n                        // change after a view switch (#2910)\n                      } else {\n                        // revert icons and dataset values\n                        activeElem.classList.replace('icon-off', 'icon-on');\n                        disabledElem.classList.replace('icon-on', 'icon-off');\n                      }\n                    case 24:\n                      _context66.prev = 24;\n                      (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.removeOverlayOnElement)('collection-view-overlay');\n                      return _context66.finish(24);\n                    case 27:\n                    case \"end\":\n                      return _context66.stop();\n                  }\n                }, _callee17, null, [[17,, 24, 27]]);\n              }));\n              return function (_x21) {\n                return _ref16.apply(this, arguments);\n              };\n            }());\n          });\n\n          // 2. 'Sort By' selection handlers\n          if (sortElem) {\n            sortElem.addEventListener('change', /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee18() {\n              var options;\n              return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee18$(_context67) {\n                while (1) switch (_context67.prev = _context67.next) {\n                  case 0:\n                    disableFilters();\n                    _context67.prev = 1;\n                    options = setOptionValues();\n                    (0,_pagination__WEBPACK_IMPORTED_MODULE_30__.setCollectionOptions)(options, options.collection.style, options.paginatorName);\n                    _context67.next = 6;\n                    return _updateCollection(options);\n                  case 6:\n                    manageFilterAccordions();\n                  case 7:\n                    _context67.prev = 7;\n                    enableFilters();
39\n                    return _context67.finish(7);\n                  case 10:\n                  case \"end\":\n                    return _context67.stop();\n                }\n              }, _callee18, null, [[1,, 7, 10]]);\n            })));\n          }\n\n          // 3. Color filters click handler\n          if (colorFilterElems) {\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(colorFilterElems).call(colorFilterElems, function (input) {\n              input.addEventListener('click', /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee19() {\n                var options;\n                return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee19$(_context68) {\n                  while (1) switch (_context68.prev = _context68.next) {\n                    case 0:\n                      disableFilters();\n                      _context68.prev = 1;\n                      options = setOptionValues();\n                      _context68.next = 5;\n                      return _updateCollection(options);\n                    case 5:\n                      manageFilterAccordions();\n                    case 6:\n                      _context68.prev = 6;\n                      enableFilters();\n                      return _context68.finish(6);\n                    case 9:\n                    case \"end\":\n                      return _context68.stop();\n                  }\n                }, _callee19, null, [[1,, 6, 9]]);\n              })));\n            });\n          }\n\n          // 4. text filter click handler\n          if (textFilterElem) {\n            // click handler on filter button\n            textFilterBtn.addEventListener('click', /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee20() {\n              var options;\n              return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee20$(_context69) {\n                while (1) switch (_context69.prev = _context69.next) {\n                  case 0:\n                    disableFilters();\n                    _context69.prev = 1;\n                    options = setOptionValues();\n                    _context69.next = 5;\n                    return _updateCollection(options);\n                  case 5:\n                    manageFilterAccordions();\n                  case 6:\n                    _context69.prev = 6;\n                    enableFilters();\n                    return _context69.finish(6);\n                  case 9:\n                  case \"end\":\n                    return _context69.stop();\n                }\n              }, _callee20, null, [[1,, 6, 9]]);\n            })));\n\n            // 5. 'Enter' key handler on text filter input field\n            textFilterElem.addEventListener('keypress', /*#__PURE__*/function () {\n              var _ref20 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee21(event) {\n                var options;\n                return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee21$(_context70) {\n                  while (1) switch (_context70.prev = _context70.next) {\n                    case 0:\n                      if (!(event.key === 'Enter')) {\n                        _context70.next = 11;\n                        break;\n                      }\n                      disableFilters();\n                      _context70.prev = 2;\n                      options = setOptionValues();\n                      if (!options.filters.text.words) {\n                        _context70.next = 8;\n                        break;\n                      }\n                      _context70.next = 7;\n                      return _updateCollection(options);\n                    case 7:\n                      manageFilterAccordions();\n                    case 8:\n                      _context70.prev = 8;\n                      enableFilters();\n                      return _context70.finish(8);\n                    case 11:\n                    case \"end\":\n                      return _context70.stop();\n                  }\n                }, _callee21, null, [[2,, 8, 11]]);\n              }));\n              return function (_x22) {\n                return _ref20.apply(this, arguments);\n              };\n            }());\n\n            // 6. text filter case sensitivity\n            textFilterSensitivityChangeHandler();\n\n            // 7. Text filter grouping\n            textFilterGroupingClickHandler();\n\n            // 7b. Text filter \"Ignore common words\" toggle\n            textFilterExcludeNoiseWordsChangeHandler();\n          }\n\n          // 7c. Note filter handlers (#4491) — every one is internally guarded, so this\n          // is a no-op for a user whose page carries no note section.\n          addNoteFilterHandlers();\n\n          // 8. add click handlers to tags in filter\n          addHandlersToTagsInFilter();\n\n          // 9. Clear filters button\n          _context71.next = 16;\n          return addClearFiltersHandlers();\n        case 16:\n          _context71.next = 18;\n          return addAnnotationsActionHandlers();\n        case 18:\n          // 11. Tags collections full view\n          addMarkTagsFullViewHandler();\n\n          // 12. Tags filter input text handler\n          addKeyUpTextInputOnTagsFilterHandler();\n\n          // 13. filter toggle icon handlers\n          tagToggleButtonsClickHandler();\n\n          // 14. tag icon on edit options handler\n          annotationOptionDivClickHandler();\n\n          // 15. filter tags sort handlers\n          addFilterTagsSortHandlers();\n\n          // 16. Gate tag management icons behind experimental feature\n          gateTagManagementIcons();\n\n          // 17. Batch-editing (delete / recolor) controls (#3051)\n          initBulkEdit();\n        case 25:\n        case \"end\":\n          return _context71.stop();\n      }\n    }, _callee22);\n  }));\n  return _addAnnotationPageEventHandlers.apply(this, arguments);\n}\nfunction initBulkEdit() {\n  // #3133: the dashboard Continue Reading toolbar shares these generic\n  // selectors. Bail unless annotation rows are present so this controller only\n  // ever binds to the annotations toolbar.\n  if (bulkEditController || !document.querySelector('[data-bulk-edit-toggle]') || !document.querySelector('[data-annotation]')) {\
39n    return;\n  }\n  bulkEditController = (0,_annotations_bulk_edit__WEBPACK_IMPORTED_MODULE_33__.createBulkEditController)({\n    colors: (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.appColors)(),\n    applyBatch: function () {\n      var _applyBatch = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee2(payload) {\n        var options, collectionContainer;\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee2$(_context6) {\n          while (1) switch (_context6.prev = _context6.next) {\n            case 0:\n              options = setOptionValues();\n              options.modifyCollection = payload;\n\n              // Dim + centered spinner over the collection area, matching the filter /\n              // view-switch treatment. Injecting a Spinner into the bulk-action bar\n              // rendered as a cramped dark box at the bar's edge (#3051). The overlay\n              // anchors to the .cell wrapping the collection, which survives the\n              // replaceWith in updateCollection().\n              collectionContainer = document.querySelector('[data-collection] > .cell');\n              (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.insertOverlayOnElement)(collectionContainer, 'collection-view-overlay', true);\n              _context6.prev = 4;\n              _context6.next = 7;\n              return _updateCollection(options);\n            case 7:\n              return _context6.abrupt(\"return\", _context6.sent);\n            case 8:\n              _context6.prev = 8;\n              (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.removeOverlayOnElement)('collection-view-overlay');\n              return _context6.finish(8);\n            case 11:\n            case \"end\":\n              return _context6.stop();\n          }\n        }, _callee2, null, [[4,, 8, 11]]);\n      }));\n      function applyBatch(_x2) {\n        return _applyBatch.apply(this, arguments);\n      }\n      return applyBatch;\n    }()\n  });\n  bulkEditController.init();\n}\n\n/**\n * CLick event handler on annotation options div tag icon\n */\nfunction annotationOptionDivClickHandler() {\n  var annotationsCollection = document.querySelectorAll('#annotations-collection .annotation-options');\n  if (annotationsCollection) {\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(annotationsCollection).call(annotationsCollection, function (item) {\n      var tagIcon = item.querySelector('[data-name=\"manage-tags\"]');\n      if (tagIcon) {\n        tagIcon.addEventListener('click', /*#__PURE__*/function () {\n          var _ref2 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee3(event) {\n            var optionsDiv, tagsManagementControlsDiv, _optionsDiv$dataset, markId, userMarkRecordId;\n            return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee3$(_context7) {\n              while (1) switch (_context7.prev = _context7.next) {\n                case 0:\n                  event.preventDefault();\n                  disableFilters();\n                  _context7.prev = 2;\n                  optionsDiv = event.target.closest('.annotation-options');\n                  _context7.next = 6;\n                  return (0,_annotations_manage_tags__WEBPACK_IMPORTED_MODULE_31__.createTagManagementControls)(event, 'annotations');\n                case 6:\n                  tagsManagementControlsDiv = _context7.sent;\n                  if (tagsManagementControlsDiv) {\n                    optionsDiv.insertAdjacentElement('beforebegin', tagsManagementControlsDiv);\n                    optionsDiv.classList.add('hide');\n                    // _calculatePlacementOfDiv(tagsManagementControlsDiv, optionsDiv);\n                  }\n                  _optionsDiv$dataset = optionsDiv.dataset, markId = _optionsDiv$dataset.markId, userMarkRecordId = _optionsDiv$dataset.userMarkRecordId;\n                  (0,_annotations_manage_tags__WEBPACK_IMPORTED_MODULE_31__.updateTagManagementElements)(markId, 'n
39ame', 'asc', userMarkRecordId);\n                case 10:\n                  _context7.prev = 10;\n                  enableFilters();\n                  return _context7.finish(10);\n                case 13:\n                case \"end\":\n                  return _context7.stop();\n              }\n            }, _callee3, null, [[2,, 10, 13]]);\n          }));\n          return function (_x3) {\n            return _ref2.apply(this, arguments);\n          };\n        }());\n      }\n    });\n  }\n}\n\n/**\n * Change handler for text filter sensitivity element.\n */\nfunction textFilterSensitivityChangeHandler() {\n  var textSensitivityElem = document.querySelector(\"#case-sensitivity\");\n  textSensitivityElem.addEventListener('change', /*#__PURE__*/function () {\n    var _ref3 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee4(event) {\n      var _context8, options;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee4$(_context9) {\n        while (1) switch (_context9.prev = _context9.next) {\n          case 0:\n            event.preventDefault();\n            disableFilters();\n            _context9.prev = 2;\n            options = setOptionValues();\n            if (!_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8___default()(_context8 = options.filters.text.words).call(_context8)) {\n              _context9.next = 8;\n              break;\n            }\n            _context9.next = 7;\n            return _updateCollection(options);\n          case 7:\n            manageFilterAccordions();\n          case 8:\n            _context9.prev = 8;\n            enableFilters();\n            return _context9.finish(8);\n          case 11:\n          case \"end\":\n            return _context9.stop();\n        }\n      }, _callee4, null, [[2,, 8, 11]]);\n    }));\n    return function (_x4) {\n      return _ref3.apply(this, arguments);\n    };\n  }());\n}\n/**\n * Click event handler for text filter element\n */\nfunction textFilterGroupingClickHandler() {\n  var textGroupingElem = document.querySelector(\"#word-grouping\");\n  if (textGroupingElem) {\n    textGroupingElem.addEventListener('change', /*#__PURE__*/function () {\n      var _ref4 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee5(event) {\n        var _context10, options;\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee5$(_context11) {\n          while (1) switch (_context11.prev = _context11.next) {\n            case 0:\n              event.preventDefault();\n              disableFilters();\n              _context11.prev = 2;\n              options = setOptionValues();\n              if (!_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8___default()(_context10 = options.filters.text.words).call(_context10)) {\n                _context11.next = 8;\n                break;\n              }\n              _context11.next = 7;\n              return _updateCollection(options);\n            case 7:\n              manageFilterAccordions();\n            case 8:\n              _context11.prev = 8;\n              enableFilters();\n              return _context11.finish(8);\n            case 11:\n            case \"end\":\n              return _context11.stop();\n          }\n        }, _callee5, null, [[2,, 8, 11]]);\n      }));\n      return function (_x5) {\n        return _ref4.apply(this, arguments);\n      };\n    }());\n  }\n}\n/**\n * Change event handler for the \"Ignore common words\" text filter checkbox.\n * Toggling it re-runs the text filter through the noise-strip/CONTAINS path\n * (checked) or the include-all-terms LIKE path (unchecked). (#3354)\n */\nfunction textFilterExcludeNoiseWordsChangeHandler() {\n  var excludeNoiseWordsElem = document.querySelector(\"#ignore-common-words\");\n  if (excludeNoiseWordsElem) {\n    excludeNoiseWordsElem.addEventListener('change', /*#__PURE__*/function () {\n      var _ref5 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee6(event) {\n        var _context12, options;\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee6$(_context13) {\n          while (1) switch (_context13.prev = _context13.next) {\n            case 0:\n              event.preventDefault();\n              disableFilters();\n              _context13.prev = 2;\n              options = setOptionValues();\n              if (!_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8___default()(_context12 = options.filters.text.words).call(_context12)) {\
39n                _context13.next = 8;\n                break;\n              }\n              _context13.next = 7;\n              return _updateCollection(options);\n            case 7:\n              manageFilterAccordions();\n            case 8:\n              _context13.prev = 8;\n              enableFilters();\n              return _context13.finish(8);\n            case 11:\n            case \"end\":\n              return _context13.stop();\n          }\n        }, _callee6, null, [[2,, 8, 11]]);\n      }));\n      return function (_x6) {\n        return _ref5.apply(this, arguments);\n      };\n    }());\n  }\n}\n/**\n * Wire up the Filter by note section: the filter button, the Enter key on the\n * input, and the three switches. (#4491)\n *\n * The section is server-gated behind FEATURE_NOTES, so every lookup here is\n * null-guarded and the whole function is a no-op when the section is absent.\n */\nfunction addNoteFilterHandlers() {\n  var _context18, _context20;\n  var noteFilterElem = document.querySelector('#filter-by-note');\n\n  /**\n   * Re-run the note filter against the server and refresh the accordions.\n   *\n   * @param {boolean} onlyWhenFiltering - skip the round trip when no note terms\n   *                                      are entered, matching the text filter's\n   *                                      behaviour for its switches.\n   * @returns {Promise<void>}\n   */\n  var applyNoteFilter = /*#__PURE__*/function () {\n    var _ref6 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee7(onlyWhenFiltering) {\n      var _context14, _options$filters$note2, _options$filters$note3, options;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee7$(_context15) {\n        while (1) switch (_context15.prev = _context15.next) {\n          case 0:\n            disableFilters();\n            _context15.prev = 1;\n            options = setOptionValues();\n            if (!(onlyWhenFiltering && !_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8___default()(_context14 = (_options$filters$note2 = (_options$filters$note3 = options.filters.note) === null || _options$filters$note3 === void 0 ? void 0 : _options$filters$note3.words) !== null && _options$filters$note2 !== void 0 ? _options$filters$note2 : '').call(_context14))) {\n              _context15.next = 5;\n              break;\n            }\n            return _context15.abrupt(\"return\");\n          case 5:\n            _context15.next = 7;\n            return _updateCollection(options);\n          case 7:\n            manageFilterAccordions();\n          case 8:\n            _context15.prev = 8;\n            enableFilters();\n            return _context15.finish(8);\n          case 11:\n          case \"end\":\n            return _context15.stop();\n        }\n      }, _callee7, null, [[1,, 8, 11]]);\n    }));\n    return function applyNoteFilter(_x7) {\n      return _ref6.apply(this, arguments);\n    };\n  }();\n  if (noteFilterElem) {\n    var noteFilterBtn = document.querySelector('.filter-note button');\n    if (noteFilterBtn) {\n      noteFilterBtn.addEventListener('click', /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee8() {\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee8$(_context16) {\n          while (1) switch (_context16.prev = _context16.next) {\n            case 0:\n              _context16.next = 2;\n              return applyNoteFilter(false);\n            case 2:\n            case \"end\":\n              return _context16.stop();\n          }\n        }, _callee8);\n      })));\n    }\n    noteFilterElem.addEventListener('keypress', /*#__PURE__*/function () {\n      var _ref8 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee9(event) {\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee9$(_context17) {\n          while (1) switch (_context17.prev = _context17.next) {\n            case 0:\n              if (!(event.key === 'Enter')) {\n                _context17.next = 4;\n                break;\n              }\n              event.preventDefault();\n              _context17.next = 4;\n              return applyNoteFilter(true);\n            case 4:\n            case \"end\":\n              return _context17.stop();\n          }\n        }, _callee9);\n      }));\n      return function (_x8) {\n        return _ref8.apply(this, arguments);\n      };\n    }());\n  }\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context18 = ['#note-case-sensitivity', '#note-word-grouping', '#note-ignore-common-words']).call(_context18, function (selector) {\n    var toggleElem = document.querySelector(selector);\n    if (!toggleElem) {\n      return;\n    }\n    toggleElem.addEventListener('change', /*#__PURE__*/function () {\n      var _ref9 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee10(event) {\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee10$(_context19) {\n          while (1) switch (_context19.prev = _context19.next) {\n            case 0:\n              event.preventDefault();\n              _context19.next = 3;\n              return applyNoteFilter(true);\n            case 3:\n            case \"end\":\n              return _context19.stop();\n          }\n        }, _callee10);\n      }));\n      return function (_x9) {\n        return _ref9.apply(this, arguments);\n      };\n    }());\n  });\n\n  // Presence always round-trips, unlike the switches above: it filters on its\n  // own with 
39no terms typed, which is the point of \"no note\". Passing `true`\n  // here would make the control do nothing until the user also typed a\n  // word. (#4492)\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context20 = document.querySelectorAll('input[name=\"note-presence\"]')).call(_context20, function (elem) {\n    elem.addEventListener('change', /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee11() {\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee11$(_context21) {\n        while (1) switch (_context21.prev = _context21.next) {\n          case 0:\n            _context21.next = 2;\n            return applyNoteFilter(false);\n          case 2:\n          case \"end\":\n            return _context21.stop();\n        }\n      }, _callee11);\n    })));\n  });\n}\n/**\n * Show or hide the \"every entered term is a common word\" notice.\n *\n * @param {boolean} show - true to show the notice, false to hide it.\n */\nfunction toggleTextFilterAllNoiseNotice(show) {\n  var notice = document.querySelector('#text-filter-all-noise-notice');\n  if (!notice) {\n    return;\n  }\n  notice.style.display = show ? '' : 'none';\n}\n/**\n * Show or hide the note filter's \"every entered term is a common word\" notice.\n *\n * A no-op for a user without the notes feature, whose page carries no such\n * element. (#4491)\n *\n * @param {boolean} show - true to show the notice, false to hide it.\n */\nfunction toggleNoteFilterAllNoiseNotice(show) {\n  var notice = document.querySelector('#note-filter-all-noise-notice');\n  if (!notice) {\n    return;\n  }\n  notice.style.display = show ? '' : 'none';\n}\n/**\n * Tag filter toggle buttons handler.\n */\nfunction tagToggleButtonsClickHandler() {\n  var toggleButtons = document.querySelectorAll('[data-toggle-icon]');\n\n  // event handlers to switch the icon on the filter toggle elements, when clicked\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(toggleButtons).call(toggleButtons, function (toggleButton) {\n    toggleButton.addEventListener('click', function (event) {\n      event.preventDefault();\n      togglerIconsHandler(toggleButton);\n    });\n  });\n}\n\n/**\n * Add click handlers for the filter tags sort buttons.\n */\nfunction addFilterTagsSortHandlers() {\n  var sortOptions = document.querySelector('[data-filter-sort]');\n  if (!sortOptions) return;\n  var sortButtons = sortOptions.querySelectorAll('[data-sort-by]');\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(sortButtons).call(sortButtons, function (button) {\n    button.addEventListener('click', function (event) {\n      event.preventDefault();\n\n      // Update active state\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(sortButtons).call(sortButtons, function (btn) {\n        return btn.classList.remove('sorted');\n      });\n      var target = event.target.closest('[data-sort-by]');\n      target.classList.add('sorted');\n\n      // Get sort parameters\n      var sortBy = target.dataset.sortBy;\n      var direction = sortBy === 'name' ? 'asc' : 'desc';\n\n      // Re-sort and re-render the filter tags\n      sortFilterTags(sortBy, direction);\n    });\n  });\n}\n\n/**\n * Sort the filter tags in the \"Your Tags\" section.\n *\n * @param sortBy - one of: ('name', 'time', 'usage')\n * @param direction - one of: ('asc', 'desc')\n */\nfunction sortFilterTags(sortBy, direction) {\n  // Store the sort preferences\n  sessionStorage.setItem('tagFilterSortBy', sortBy);\n  sessionStorage.setItem('tagFilterSortDirection', direction);\n\n  // Use shared refresh logic\n  refreshAvailableTagsList();\n}\n\n/**\n * Refresh the \"Your Tags\" section with remaining available tags.\n * Filters out selected tags and re-renders the available tags list.\n */\nfunction refreshAvailableTagsList() {\n  var _context22, _context23, _context24;\n  var existingTagsWrapper = document.querySelector('.existing-tags[data-available-tags]');\n  if (!existingTagsWrapper) return;\n  var allTagsData = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(_context22 = JSON.parse(sessionStorage.getItem('userTags') || '[]')).call(_context22, Boolean);\n  var selectedTagElems = document.querySelectorAll('.selected-tags .tag');\n\n  // Get IDs of already selected tags to exclude from available tags\n  var selectedTagIds = _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_14___default()(_context23 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_10___default()(selectedTagElems)).call(_context23, function (tag) {\n    return tag.dataset.tagId || tag.dataset.id;\n  });\n\n  // Get current sort preference (default to name/asc)\n  var sortBy = sessionStorage.getItem('tagFilterSortBy') || 'name';\n  var direction = sessionStorage.getItem('tagFilterSortDirection') || 'asc';
39\n\n  // Filter out selected tags and sort\n  var sortFunction = (0,_annotations_manage_tags__WEBPACK_IMPORTED_MODULE_31__.tagsSortingFunction)(sortBy, direction);\n  var availableTags = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default()(_context24 = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(allTagsData).call(allTagsData, function (tag) {\n    return tag && !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_11___default()(selectedTagIds).call(selectedTagIds, tag.id);\n  })).call(_context24, sortFunction);\n\n  // Clear and re-render\n  while (existingTagsWrapper.firstChild) {\n    existingTagsWrapper.removeChild(existingTagsWrapper.firstChild);\n  }\n  if (availableTags.length > 0) {\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(availableTags).call(availableTags, function (tagData) {\n      var _tagData$usage;\n      var tagDiv = createFilterTagElement(tagData);\n      tagDiv.setAttribute('title', \"Usage: \".concat((_tagData$usage = tagData.usage) !== null && _tagData$usage !== void 0 ? _tagData$usage : 0));\n      tagDiv.setAttribute('data-id', tagData.id);\n      existingTagsWrapper.appendChild(tagDiv);\n    });\n  } else {\n    var noneSpan = document.createElement('span');\n    noneSpan.className = 'no-tags-message';\n    noneSpan.innerText = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('no_tags_available') || 'No tags available.';\n    existingTagsWrapper.appendChild(noneSpan);\n  }\n}\n\n/**\n * Add text input handler for keyUp\n */\nfunction addKeyUpTextInputOnTagsFilterHandler() {\n  var tagsFilterInputText = document.querySelector('#filter-by-tag');\n  if (tagsFilterInputText) {\n    tagsFilterInputText.addEventListener('keyup', /*#__PURE__*/function () {\n      var _ref11 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee12(event) {\n        var _context25, selectedTags, availableTags, tag, _context26;\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee12$(_context27) {\n          while (1) switch (_context27.prev = _context27.next) {\n            case 0:\n              event.preventDefault();\n              event.stopPropagation(); // ensure keyup for color selector (or any other reason) doesn't fire\n\n              if (event.key === 'Enter') {\n                disableFilters();\n                try {\n                  selectedTags = document.querySelectorAll('.selected-tags .tag');\n                  availableTags = document.querySelectorAll('.existing-tags .tag');\n                  tag = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_9___default()(_context25 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_10___default()(availableTags)).call(_context25, function (tag) {\n                    if (tag.dataset.text === tagsFilterInputText.value) {\n                      return tag.dataset.tagId;\n                    }\n                  });\n                  if (tag) {\n                    // let { dataset: { tagId } } = tag;\n                    tagsFilterInputText.value = ''; // clear the input field\n                    log(\"Add filter tag: \".concat(tagsFilterInputText.value));\n                    // const tag = document.querySelector(`.tag[data-id=\"${tagId}\"]`);\n                    tag.dispatchEvent(new Event('click'));\n                  } else {\n                    // already filtering by that tag\n                    tag = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_9___default()(_context26 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_10___default()(selectedTags)).call(_context26, function (tag) {\n                      if (tag.dataset.text === tagsFilterInputText.value) {\n                        return tag.dataset.id;\n                      }\n                    });\n                    if (tag) {\n                      log(\"Already filtering by tag: \".concat(tagsFilterInputText.value));\n                      // const tag = document.querySelector(`.tag[data-id=\"${tagId}\"]`);\n                      tag.style.borderWidth = '1.25rem';\n                      _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_16___default()(function () {\n                        tag.removeAttribute('style');\n                      }, 2000);\n                    }\n                  }\n                } finally {\n                  enableFilters();\n                }\n              } else {\n                updateTagFilterElements(event);\n              }\n            case 3:\n            case \"end\":\n              return _context27.stop();\n          }\n        }, _callee12);\n      }));
39\n      return function (_x10) {\n        return _ref11.apply(this, arguments);\n      };\n    }());\n  }\n}\n\n/**\n * Add click handlers to filter tag elements in the filter-by-tag filter.\n */\nfunction addHandlersToTagsInFilter() {\n  var existingTags = document.querySelectorAll('.existing-tags .tag');\n  var selectedTags = document.querySelectorAll('.selected-tags .tag');\n  if (existingTags) {\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(existingTags).call(existingTags, function (tag) {\n      tag.dataset.action = 'add';\n      if (!tag.dataset.listenerAttached) {\n        tag.addEventListener('click', /*#__PURE__*/function () {\n          var _ref12 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee13(event) {\n            return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee13$(_context28) {\n              while (1) switch (_context28.prev = _context28.next) {\n                case 0:\n                  disableFilters();\n                  _context28.prev = 1;\n                  _context28.next = 4;\n                  return filterTagClickHandler(event);\n                case 4:\n                  _context28.prev = 4;\n                  enableFilters();\n                  return _context28.finish(4);\n                case 7:\n                case \"end\":\n                  return _context28.stop();\n              }\n            }, _callee13, null, [[1,, 4, 7]]);\n          }));\n          return function (_x11) {\n            return _ref12.apply(this, arguments);\n          };\n        }());\n      }\n      tag.dataset.listenerAttached = 'true';\n    });\n    if (selectedTags) {\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(selectedTags).call(selectedTags, function (tag) {\n        tag.dataset.action = 'remove';\n        if (!tag.dataset.listenerAttached) {\n          tag.addEventListener('click', /*#__PURE__*/function () {\n            var _ref13 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee14(event) {\n              return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee14$(_context29) {\n                while (1) switch (_context29.prev = _context29.next) {\n                  case 0:\n                    disableFilters();\n                    _context29.prev = 1;\n                    _context29.next = 4;\n                    return filterTagClickHandler(event);\n                  case 4:\n                    _context29.prev = 4;\n                    enableFilters();\n                    return _context29.finish(4);\n                  case 7:\n                  case \"end\":\n                    return _context29.stop();\n                }\n              }, _callee14, null, [[1,, 4, 7]]);\n            }));\n            return function (_x12) {\n              return _ref13.apply(this, arguments);\n            };\n          }());\n        }\n        tag.dataset.listenerAttached = 'true';\n      });\n    }\n  }\n  var tagGroupingElem = document.querySelector('#tag-grouping');\n  if (tagGroupingElem) {\n    tagGroupingElem.addEventListener('change', /*#__PURE__*/function () {\n      var _ref14 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee15(event) {\n        var options;\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee15$(_context30) {\n          while (1) switch (_context30.prev = _context30.next) {\n            case 0:\n              event.preventDefault();\n              disableFilters();\n              _context30.prev = 2;\n              options = setOptionValues();\n              if (!(options.filters.tags.ids.length > 0)) {\n                _context30.next = 8;\n                break;\n              }\n              _context30.next = 7;\n              return _updateCollection(options);\n            case 7:\n              manageFilterAccordions();\n            case 8:\n              _context30.prev = 8;\n              enableFilters();\n              return _context30.finish(8);\n            case 11:\n            case \"end\":\n              return _context30.stop();\n          }\n        }, _callee15, null, [[2,, 8, 11]]);\n      }));\n      return function (_x13) {\n        return _ref14.apply(this, arguments);\n      };\n    }());\n  }\n}\n\n/**\n * Emphasize tags on existing tags collection that are currently selected for filtering.\n */\nfunction emphasizeFilteredTagsOnAnnotations() {\n  var _context31;\n  var tagsFilteringBy = document.querySelectorAll('#filter-tags-expanded .selected-tags .tag');\n  var highlightTagCollections = document.querySelectorAll('#annotations-collection .show-tags');\n  var filteringByTextCollection = _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_14___default()(_context31 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_10___default()(tagsFilteringBy)).call(_context31, function (tag) {\n    return tag.dataset.text;\n  });\n\n  // thicker border to emphasize the tag\n  var borderWidth = '0.15rem';\n  var emphasizingColorPercentage = '60';\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(highlightTagCollections).call(highlightTagCollections, function (collection) {\n    var _context32;\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context32 = collection.querySelectorAll('.tag')).call(_context32, function (tagDiv) {\n      // emphasize the tag by changing its border width\n      var text = tagDiv.dataset.text;\n      var color = window.getComputedStyle(tagDiv).borderColor;\n      if (_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_11___default()(filteringByTextCollection).call(filteringByTextCollection, text)) {\n        if (tagDiv.style.borderWidth !== borderWidth) {\n          tagDiv.style.borderWidth = borderWidth;\n          tagDiv.borderColor = (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.darkenColor)(color, emphasizingColorPercentage);\n        }\n      } else {\n        // if the tag was emphasized, remove the emphasis\n        if (tagDiv.style.borderWidth === borderWidth) {\n          tagDiv.style.borderWidth = '1px';\n          tagDiv.style.borderColor = (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.lightenColor)(color, emphasizingColorPercentage);\n        }\n      }\n    });\n  });\n}\n\n/**\n * Toggle the filter expand/collapse icon in the given toggler.\n *\n * @param toggleButton\n */\nfunction togglerIconsHandler(toggleButton) {\n  var isExpanded = toggleButton.getAttribute('aria-expanded') === 'true';\n\n  // Update icon visibility\n  var plusIcon = toggleButton.querySelector('.fa-plus');\n  var minusIcon = toggleButton.querySelector('.fa-minus');\n  if (!isExpanded) {\n    plusIcon.style.display = 'none';\n    minusIcon.style.display = 'inline-block';\n  } else {\n    plusIcon.style.display = 'inline-block';\n    minusIcon.style.display = 'none';\n  }\n}\n\n/**\n * Add handler for tags view element.\n */\nfunction addMarkTagsFullViewHandler() {\n  var annotationTagsWrapper = document.querySelectorAll('.assigned-tags-wrapper');\n  if (annotationTagsWrapper) {\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(annotationTagsWrapper).call(annotationTagsWrapper, function (tagGutter) {\n      var viewIcon = tagGutter.querySelector('a');\n      var closeButton = tagGutter.querySelector('.close-button');\n\n      // tags collection div\n      if (viewIcon) {\n        viewIcon.addEventListener('click', function (event) {\n          event.preventDefault();\n          var tagDiv = tagGutter.querySelector('.annotation-options');\n          if (tagDiv) {\n            tagDiv.classList.remove('hide');\n          }\n        });\n      }\n\n      // close button\n      if (closeButton) {\n        closeButton.addEventListener('click', function (event) {\n          event.preventDefault();\n          var tagDiv = tagGutter.querySelector('.annotation-options');\n          if (tagDiv) {\n            tagDiv.classList.add('hide');\n          }\n        });\n      }\n    });\n  }\n}\n\n/**\n * Handler for links and button on an annotation options div.\n *\n * @param event\n * @param action\n * @param annotation\n * @returns {Promise<void>}
39\n */\nfunction annotationActionHandler(_x14, _x15, _x16) {\n  return _annotationActionHandler.apply(this, arguments);\n}\n/**\n * Open the experimental note editor for an annotation card and persist a\n * single-mark note through the same modifyCollection path recolor uses, so the\n * collection repaints and the card reflects the saved note (#3083).\n *\n * @param {HTMLElement} annotation\n */\nfunction _annotationActionHandler() {\n  _annotationActionHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee23(event, action, annotation) {\n    var _actionBtn$dataset, _options$collection, _ref21, _optionsDiv$dataset$m, _ref22, _optionsDiv$dataset$u;\n    var target, name, response, actionBtn, options, data, highlightTextContainer, color, optionsDiv, markId, userMarkRecordId, targetSelector, insertPosition, _context72, result;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee23$(_context73) {\n      while (1) switch (_context73.prev = _context73.next) {\n        case 0:\n          event.preventDefault();\n          target = event.target;\n          if (!(action === 'delete')) {\n            _context73.next = 6;\n            break;\n          }\n          response = confirm((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('confirm_delete_annotation') || 'Are you sure you want to delete this annotation?'); // if 'cancel'\n          if (response) {\n            _context73.next = 6;\n            break;\n          }\n          return _context73.abrupt(\"return\");\n        case 6:\n          actionBtn = annotation.querySelector('.user-mark-edit');\n          options = setOptionValues();\n          data = (_actionBtn$dataset = actionBtn === null || actionBtn === void 0 ? void 0 : actionBtn.dataset) !== null && _actionBtn$dataset !== void 0 ? _actionBtn$dataset : {}; // View-agnostic read: both card and list views place the highlight background\n          // color on the same .user-highlight element (#2910)\n          highlightTextContainer = findHighlightTextContainer(annotation, options === null || options === void 0 || (_options$collection = options.collection) === null || _options$collection === void 0 ? void 0 : _options$collection.style);\n          color = highlightTextContainer === null || highlightTextContainer === void 0 ? void 0 : highlightTextContainer.style.backgroundColor; // Prefer the ids on the options div; fall back to the annotation element's own\n          // dataset when the click target has no .annotation-options ancestor (#2910)\n          optionsDiv = event.target.closest('.annotation-options');\n          markId = (_ref21 = (_optionsDiv$dataset$m = optionsDiv === null || optionsDiv === void 0 ? void 0 : optionsDiv.dataset.markId) !== null && _optionsDiv$dataset$m !== void 0 ? _optionsDiv$dataset$m : annotation.dataset.markId) !== null && _ref21 !== void 0 ? _ref21 : data.markId;\n          userMarkRecordId = (_ref22 = (_optionsDiv$dataset$u = optionsDiv === null || optionsDiv === void 0 ? void 0 : optionsDiv.dataset.userMarkRecordId) !== null && _optionsDiv$dataset$u !== void 0 ? _optionsDiv$dataset$u : annotation.dataset.userMarkRecordId) !== null && _ref22 !== void 0 ? _ref22 : data.userMarkRecordId;\n          options.modifyCollection = {\n            type: 'UserMark',\n            marks: [{\n              action: action,\n              htmlContentId: data.hid,\n              userMarkId: userMarkRecordId,\n              color: color,\n              markId: markId\n            }]\n          };\n          if (action === 'delete') {\n            name = 'delete-annotation';\n            targetSelector = \"[data-mark-id=\\\"\".concat(markId, \"\\\"] .highlight-colors#delete-highlight\");\n            insertPosition = 'beforeEnd';\n          } else {\n            name = 'change-color';\n            targetSelector = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context72 = \"[data-mark-id=\\\"\".concat(markId, \"\\\"] .highlight-colors .\")).call(_context72, target.classList[0]);\n            insertPosition = 'afterend';
39\n          }\n          options.spinner = {\n            name: name,\n            targetSelector: targetSelector,\n            insertPosition: insertPosition\n          };\n          _context73.next = 19;\n          return _updateCollection(options);\n        case 19:\n          result = _context73.sent;\n          manageFilterAccordions();\n\n          // Surface a genuine request failure to the caller so the color/delete handler\n          // shows its specific notice — the pre-request state no longer throws (#2910)\n          if (!(result && result.success === false)) {\n            _context73.next = 23;\n            break;\n          }\n          throw new Error('Collection update failed');\n        case 23:\n        case \"end\":\n          return _context73.stop();\n      }\n    }, _callee23);\n  }));\n  return _annotationActionHandler.apply(this, arguments);\n}\nfunction openNoteEditor(annotation) {\n  (0,_annotations_note_editor__WEBPACK_IMPORTED_MODULE_34__.openAnnotationNoteEditor)({\n    annotation: annotation,\n    i18n: noteEditorI18n,\n    setOptions: function setOptions() {\n      return setOptionValues();\n    },\n    updateCollection: function updateCollection(options) {\n      return _updateCollection(options);\n    },\n    showOverlay: function showOverlay() {\n      var collectionContainer = document.querySelector('[data-collection] > .cell');\n      (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.insertOverlayOnElement)(collectionContainer, 'collection-view-overlay', true);\n    },\n    hideOverlay: function hideOverlay() {\n      return (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.removeOverlayOnElement)('collection-view-overlay');\n    },\n    onError: function onError() {\n      var message = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('annotations.note_save_error') || 'There was an error saving your note.';\n      var notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_29__.AsyncNotice(message, 'error');\n      notice.create({});\n      notice.remove(4);\n    }\n  });\n}\n\n/**\n * Hook up action handlers for marks listed in annotations page\n */\nfunction addAnnotationsActionHandlers() {\n  return _addAnnotationsActionHandlers.apply(this, arguments);\n}\n/**\n * Adds event listener to the clear filter buttons\n *\n * @returns {Promise<void>} - A Promise that resolves when the event listener is added\n */\nfunction _addAnnotationsActionHandlers() {\n  _addAnnotationsActionHandlers = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee27() {\n    var annotations;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee27$(_context79) {\n      while (1) switch (_context79.prev = _context79.next) {\n        case 0:\n          annotations = document.querySelectorAll('[data-annotation]'); // add handlers for all links in each annotation div\n          if (annotations) {\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(annotations).call(annotations, function (annotation) {\n              // skip if annotation is empty container (when there are no annotations in collection).\n              if (annotation.dataset.annotation === 'empty') {\n                return;\n              }\n              var _getCurrentOptions2 = getCurrentOptions(),\n                style = _getCurrentOptions2.collection.style;\n              var anchor = annotation.querySelector(\"a[data-mark-id]\");\n\n              // placeholder / expired-subscription rows carry no editable mark anchor —\n              // skip them so the color handler never dereferences a null anchor (#2910)\n              if (!anchor) {\n                return;\n              }\n              var action = anchor.dataset.markAction;\n              var highlightTextContainer = findHighlightTextContainer(annotation, style);\n              var optionsDiv = annotation.querySelector('.annotation-options');\n              var colors = (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.appColors)();\n              var colorAnchorElem, newColor, newColorValue;\n              var copyElem = annotation.querySelector('[data-name=\"copy-text\"]');\n\n              // 1.  copy button handler\n              if (copyElem) {\n                copyElem.addEventListener('click', /*#__PURE__*/function () {\n                  var _ref23 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee24(event) {\n                    var textWithoutPageNumbers, copyIcon, classList, message, notice;\n                    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee24$(_context74) {\n                      while (1) switch (_context74.prev = _context74.next) {\n                        case 0:\n                          event.preventDefault();\n                          _context74.prev = 1;\n                          textWithoutPageNumbers = (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.stripPageNumbers)(highlightTextContainer.innerText);\n                          _context74.next = 5;\n                          return (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.copyToClipboard)(textWithoutPageNumbers);\n                        case 5:\n                          // Change the copy text icon to green 'clicked' version\n                          copyIcon = event.target; // annotation.querySelector('[data-name=\"copy-text\"]';\n                          classList = copyIcon.classList;\n                          classList.remove('fa-copy');\n                          classList.add('fa-file-circle-check');\n\n                          // wait 2s before changing back the icon\n                          _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_16___default()(function () {\n                            log('waited 2 seconds.');\n                            classList.remove('fa-file-circle-check');\n                            classList.add('fa-copy');\n                          }, 2000);\n                          _context74.next = 19;\n                          break;\n                        case 12:\n                          _context74.prev = 12;\n                          _context74.t0 = _context74[\"catch\"](1);
39\n                          console.error(\"Error copying text to clipboard: \".concat(_context74.t0.message));\n                          message = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('error_copying_text') || 'There was a problem copying the text. Please try again.';\n                          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_29__.AsyncNotice(message, 'error');\n                          notice.create({\n                            error: _context74.t0\n                          });\n                          notice.remove(3);\n                        case 19:\n                        case \"end\":\n                          return _context74.stop();\n                      }\n                    }, _callee24, null, [[1, 12]]);\n                  }));\n                  return function (_x23) {\n                    return _ref23.apply(this, arguments);\n                  };\n                }());\n              }\n\n              // 1b. note editor handler (experimental notes, #3083). Bound here so it is\n              // re-attached on every collection repaint (updateCollection re-runs this).\n              var noteIcon = annotation.querySelector('[data-name=\"manage-note\"]');\n              if (noteIcon) {\n                noteIcon.addEventListener('click', function (event) {\n                  event.preventDefault();\n                  openNoteEditor(annotation);\n                });\n              }\n\n              // 2. delete handler for options div trash can\n              // Guard: some repainted rows (e.g. after a batch delete/recolor) may not\n              // carry a remove-highlight control. Calling addEventListener on a null\n              // element threw a TypeError that propagated up through updateCollection()\n              // and surfaced to the user as \"error updating the annotations list\" (#3051).\n              var optionsDivDeleteElem = annotation.querySelector('[data-name=\"remove-highlight\"]');\n              if (optionsDivDeleteElem) {\n                optionsDivDeleteElem.addEventListener('click', /*#__PURE__*/function () {\n                  var _ref24 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee25(e) {\n                    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee25$(_context75) {\n                      while (1) switch (_context75.prev = _context75.next) {\n                        case 0:\n                          _context75.next = 2;\n                          return annotationActionHandler(e, 'delete', annotation);\n                        case 2:\n                          // hide the option div\n                          optionsDiv === null || optionsDiv === void 0 || optionsDiv.classList.add('hide');\n                        case 3:\n                        case \"end\":\n                          return _context75.stop();\n                      }\n                    }, _callee25);\n                  }));\n                  return function (_x24) {\n                    return _ref24.apply(this, arguments);\n                  };\n                }());\n              }\n\n              // 3. close icon handler\n              var closeElem = annotation.querySelector(\".close-button\");\n              if (closeElem) {\n                closeElem.addEventListener('click', function (event) {\n                  event.preventDefault();\n                  optionsDiv.classList.add('hide');\n                });\n              }\n\n              // 4. add handlers to change the highlight colors circles\n              var _loop = function _loop() {\n                var _Object$entries$_i = (0,_babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_Object$entries[_i], 2),\n                  key = _Object$entries$_i[0],\n                  value = _Object$entries$_i[1];\n                colorAnchorElem = annotation.querySelector(\"[title=\\\"\".concat(key, \"\\\"]\"));\n\n                // Guard: skip color anchors a repainted row does not provide, so the\n                // re-attach loop never dereferences null and crashes updateCollection (#3051).\n                if (!colorAnchorElem) {\n                  return 1; // continue\n                }\n\n                // event listener for color option\n                colorAnchorElem.addEventListener('click', /*#__PURE__*/function () {\n                  var _ref25 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee26(event) {\n                    var targetParent, _context76, message, notice;\n                    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee26$(_context77) {\n                      while (1) switch (_context77.prev = _context77.next) {\n                        case 0:\n                          event.preventDefault();\n                          targetParent = event.target.parentElement;\n                          newColor = targetParent.title;\n                          newColorValue = colors[newColor];\n\n                          // Guard clause: ensure highlightTextContainer exists before accessing properties\n                          if (highlightTextContainer) {\n                            _context77.next = 7;\n                            break;\n                          }\n                          console.error('Cannot change color: highlight text container not found');\n                          return _context77.abrupt(\"return\");\n                        case 7:\n                          // store current color to revert if there's an error\n                          annotation.dataset.currentColor = highlightTextContainer.style.backgroundColor;\n\n                          // change the background color to the newly selected color\n                          highlightTextContainer.setAttribute('style', \"background-color: \".concat(value));\n                          log(\"changing highlight color to \".concat(newColor));\n                          _context77.prev = 10;\n                          _context77.next = 13;\n                          return annotationActionHandler(event, 'edit', annotation);\n                        case 13:\n                          _context77.next = 22;\n                          break;\n                        case 15:\n                          _context77.prev = 15;\n                          _context77.t0 = _context77[\"catch\"](10);\n                          console.error(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context76 = \"Issue handling this highlight.\\n\\n \".concat(_context77.t0.message, \" \\n\\n \")).call(_context76, _context77.t0.stack));\n                          message = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('error_updating_color') || 'There was a problem updating the highlight color. Please try again.';\n                          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_29__.AsyncNotice(message, 'error');\n                          notice.create({\n                            error: _context77.t0\n                          });\n                          notice.remove(3);\n                        case 22:\n                        case \"end\":\n                          return _context77.stop();\n                      }\n                    }, _callee26, null, [[10, 15]]);\n                  }));\n                  return function (_x25) {\n                    return _ref25.apply(this, arguments);\n                  };\n                }());\n              };\n              for (var _i = 0, _Object$entries = _babel_runtime_corejs3_core_js_stable_object_entries__WEBPACK_IMPORTED_MODULE_25___default()(colors); _i < _Object$entries.length;
39 _i++) {\n                if (_loop()) continue;\n              }\n\n              // 5. 'edit' pencil handler\n              if (action === 'edit') {\n                anchor.addEventListener('click', function (event) {\n                  var _context78;\n                  event.preventDefault();\n                  var selector = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context78 = \".annotation-options[data-user-mark-record-id=\\\"\".concat(anchor.dataset.userMarkRecordId, \"\\\"][data-mark-id=\\\"\")).call(_context78, anchor.dataset.markId, \"\\\"]\");\n                  var optionsDiv = document.querySelector(selector);\n                  if (optionsDiv) {\n                    optionsDiv.classList.remove('hide');\n                  }\n                });\n              }\n            });\n          }\n        case 2:\n        case \"end\":\n          return _context79.stop();\n      }\n    }, _callee27);\n  }));\n  return _addAnnotationsActionHandlers.apply(this, arguments);\n}\nfunction addClearFiltersHandlers() {\n  return _addClearFiltersHandlers.apply(this, arguments);\n}\n/**\n * Clear all the filters and update the collection.\n *\n * @param {Event} event - The event triggered by clicking the 'Clear All' button.\n * @param filterType\n * @returns {Promise<void>} - A promise that indicates the completion or failure of the operation.\n */\nfunction _addClearFiltersHandlers() {\n  _addClearFiltersHandlers = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee34() {\n    var clearAllBtn, clearColorsFilterBtn, clearTagsFilterBtn, clearTextFilterBtn, clearNoteFilterBtn, clearNotePresenceFilterBtn;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee34$(_context86) {\n      while (1) switch (_context86.prev = _context86.next) {\n        case 0:\n          clearAllBtn = document.querySelector('#clear-all-filters');\n          if (clearAllBtn) {\n            clearAllBtn.addEventListener('click', /*#__PURE__*/function () {\n              var _ref26 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee28(event) {\n                return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee28$(_context80) {\n                  while (1) switch (_context80.prev = _context80.next) {\n                    case 0:\n                      _context80.next = 2;\n                      return clearFiltersHandler(event, 'all');\n                    case 2:\n                    case \"end\":\n                      return _context80.stop();\n                  }\n                }, _callee28);\n              }));\n              return function (_x26) {\n                return _ref26.apply(this, arguments);\n              };\n            }());\n          }\n          clearColorsFilterBtn = document.querySelector('#clear-colors-filter');\n          if (clearColorsFilterBtn) {\n            clearColorsFilterBtn.addEventListener('click', /*#__PURE__*/function () {\n              var _ref27 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee29(event) {\n                return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee29$(_context81) {\n                  while (1) switch (_context81.prev = _context81.next) {\n                    case 0:\n                      _context81.next = 2;\n                      return clearFiltersHandler(event, 'colors');\n                    case 2:\n                    case \"end\":\n                      return _context81.stop();\n                  }\n                }, _callee29);\n              }));\n              return function (_x27) {\n                return _ref27.apply(this, arguments);\n              };\n            }());\n          }\n          clearTagsFilterBtn = document.querySelector('#clear-tags-filter');\n          if (clearTagsFilterBtn) {\n            clearTagsFilterBtn.addEventListener('click', /*#__PURE__*/function () {\n              var _ref28 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee30(event) {\n                return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee30$(_context82) {\n                  while (1) switch (_context82.prev = _context82.next) {\n                    case 0:\n                      _context82.next = 2;\n                      return clearFiltersHandler(event, 'tags');\n                    case 2:\n                    case \"end\":\n                      return _context82.stop();\n                  }\n                }, _callee30);\n              }));\n              return function (_x28) {\n                return _ref28.apply(this, arguments);\n              };\n            }());\n          }\n          clearTextFilterBtn = document.querySelector('#clear-text-filter');\n          if (clearTextFilterBtn) {\n            clearTextFilterBtn.addEventListener('click', /*#__PURE__*/function () {\n              var _ref29 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee31(event) {\n                return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee31$(_context83) {\n                  while (1) switch (_context83.prev = _context83.next) {\n                    case 0:\n                      _context83.next = 2;\n                      return clearFiltersHandler(event, 'text');\n                    case 2:\n                    case \"end\":\n                      return _context83.stop();\n                  }\n                }, _callee31);\n              }));\n              return function (_x29) {\n                return _ref29.apply(this, arguments);\n              };\n            }());\n          }\n          clearNoteFilterBtn = document.querySelector('#clear-note-filter');\n          if (clearNoteFilterBtn) {\n            clearNoteFilterBtn.addEventListener('click', /*#__PURE__*/function () {\n              var _ref30 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee32(event) {\n                return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee32$(_context84) {\n                  while (1) switch (_context84.prev = _context84.next) {\n                    case 0:\n                      _context84.next = 2;
39\n                      return clearFiltersHandler(event, 'note');\n                    case 2:\n                    case \"end\":\n                      return _context84.stop();\n                  }\n                }, _callee32);\n              }));\n              return function (_x30) {\n                return _ref30.apply(this, arguments);\n              };\n            }());\n          }\n\n          // Note presence has its own card and therefore its own Clear (#4777)\n          clearNotePresenceFilterBtn = document.querySelector('#clear-note-presence-filter');\n          if (clearNotePresenceFilterBtn) {\n            clearNotePresenceFilterBtn.addEventListener('click', /*#__PURE__*/function () {\n              var _ref31 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee33(event) {\n                return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee33$(_context85) {\n                  while (1) switch (_context85.prev = _context85.next) {\n                    case 0:\n                      _context85.next = 2;\n                      return clearFiltersHandler(event, 'note-presence');\n                    case 2:\n                    case \"end\":\n                      return _context85.stop();\n                  }\n                }, _callee33);\n              }));\n              return function (_x31) {\n                return _ref31.apply(this, arguments);\n              };\n            }());\n          }\n        case 12:\n        case \"end\":\n          return _context86.stop();\n      }\n    }, _callee34);\n  }));\n  return _addClearFiltersHandlers.apply(this, arguments);\n}\nfunction clearFiltersHandler(_x17) {\n  return _clearFiltersHandler.apply(this, arguments);\n}\n/**\n * Handle the clearing of a filter in the filters drop down.\n * The default is to clear all the filters. You can filter just a specific filter\n * by setting filter type to one of: 'colors','tags','text'.\n *\n * @param options\n * @param filterType\n */\nfunction _clearFiltersHandler() {\n  _clearFiltersHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee35(event) {\n    var filterType,\n      options,\n      collection,\n      _args35 = arguments;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee35$(_context87) {\n      while (1) switch (_context87.prev = _context87.next) {\n        case 0:\n          filterType = _args35.length > 1 && _args35[1] !== undefined ? _args35[1] : 'all';\n          event.preventDefault();\n          disableFilters();\n          _context87.prev = 3;\n          options = getCurrentOptions();\n          if (filterType === 'all') {\n            options = setOptionValues(true);\n          }\n          options = clearFilterControls(options, filterType);\n          collection = document.querySelector('[data-paginated-collection]');\n          collection.dataset.options = _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_17___default()(options);\n          _context87.next = 11;\n          return _updateCollection(options);\n        case 11:\n          emphasizeFilteredTagsOnAnnotations();\n          manageFilterAccordions();\n        case 13:\n          _context87.prev = 13;\n          enableFilters();\n          return _context87.finish(13);\n        case 16:\n        case \"end\":\n          return _context87.stop();\n      }\n    }, _callee35, null, [[3,, 13, 16]]);\n  }));\n  return _clearFiltersHandler.apply(this, arguments);\n}\nfunction clearFilterControls(options) {\n  var filterType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'all';\n  /* colors filter */\n  if (filterType === 'all' || filterType === 'colors') {\n    /* reset color controls */\n    // Scoped to the colours pane deliberately: the unscoped selector this\n    // replaced unchecked every switch in the dropdown, so clearing colours\n    // silently flipped the text (and now note) toggles out of sync with the\n    // options object they are read back into. (#4491
39)\n    var colorFilters = document.querySelectorAll('#annotation-filters .filter-colors input[type=\"checkbox\"]');\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(colorFilters).call(colorFilters, function (checkbox) {\n      checkbox.checked = false;\n    });\n    options.filters.colors = [];\n  }\n\n  /* text filter */\n  if (filterType === 'all' || filterType === 'text') {\n    // reset text field\n    var textFilter = document.querySelector('#filter-by-text');\n    if (textFilter) {\n      textFilter.value = '';\n    }\n    options.filters.text.words = '';\n\n    // reset case sensitivity (insensitive)\n    var caseSensitivity = document.querySelector('#case-sensitivity');\n    if (caseSensitivity) {\n      caseSensitivity.checked = false;\n    }\n    options.filters.text.sensitivity = 'insensitive';\n\n    // reset text grouping ('all')\n    var textGrouping = document.querySelector('#word-grouping');\n    if (textGrouping) {\n      textGrouping.checked = true;\n    }\n    options.filters.text.grouping = 'all';\n\n    // reset \"Ignore common words\" (unchecked = include common words)\n    var excludeNoiseWords = document.querySelector('#ignore-common-words');\n    if (excludeNoiseWords) {\n      excludeNoiseWords.checked = false;\n    }\n    options.filters.text.excludeNoiseWords = false;\n\n    // hide the all-noise notice when the text filter is cleared\n    toggleTextFilterAllNoiseNotice(false);\n  }\n\n  /* note text filter (#4491) */\n  if (filterType === 'all' || filterType === 'note') {\n    var _options$filters$note4, _options$filters$note5;\n    // Presence is a separate card with its own Clear, so clearing the note\n    // text filter must leave `has` as the user left it. (#4777)\n    var clearedHas = filterType === 'all' ? '' : (_options$filters$note4 = (_options$filters$note5 = options.filters.note) === null || _options$filters$note5 === void 0 ? void 0 : _options$filters$note5.has) !== null && _options$filters$note4 !== void 0 ? _options$filters$note4 : '';\n    options.filters.note = (0,_babel_runtime_corejs3_helpers_objectSpread2__WEBPACK_IMPORTED_MODULE_3__[\"default\"])((0,_babel_runtime_corejs3_helpers_objectSpread2__WEBPACK_IMPORTED_MODULE_3__[\"default\"])({}, defaultFilters().note), {}, {\n      has: clearedHas\n    });\n    var noteFilter = document.querySelector('#filter-by-note');\n    if (noteFilter) {\n      noteFilter.value = '';\n    }\n\n    // reset case sensitivity (insensitive)\n    var noteCaseSensitivity = document.querySelector('#note-case-sensitivity');\n    if (noteCaseSensitivity) {\n      noteCaseSensitivity.checked = false;\n    }\n\n    // reset note word grouping ('all')\n    var noteGrouping = document.querySelector('#note-word-grouping');\n    if (noteGrouping) {\n      noteGrouping.checked = true;\n    }\n\n    // reset \"Ignore common words\" (unchecked = include common words)\n    var noteExcludeNoiseWords = document.querySelector('#note-ignore-common-words');\n    if (noteExcludeNoiseWords) {\n      noteExcludeNoiseWords.checked = false;\n    }\n    toggleNoteFilterAllNoiseNotice(false);\n  }\n\n  /* note presence filter (#4492, its own card since #4777) */\n  if (filterType === 'all' || filterType === 'note-presence') {\n    var _context33;\n    if (options.filters.note) {\n      options.filters.note.has = '';\n    }\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context33 = document.querySelectorAll('input[name=\"note-presence\"]')).call(_context33, function (elem) {\n      elem.checked = false;\n    });\n\n    // The note text input is disabled while \"no note\" is selected, so clearing\n    // the presence card has to hand it back. (#4777)\n    syncNotePresenceExclusivity(options);\n  }\n\n  /* tags filter */\n  if (filterType === 'all' || filterType === 'tags') {\n    // clear text in tags filter input\n    var filterByTagInput = document.querySelector('#filter-by-tag');\n    if (filterByTagInput) {\n      filterByTagInput.textContent = '';\n    }\n    options.filters.tags.ids = [];\n\n    // reset tag grouping to 'any' (default)\n    var tagGrouping = document.querySelector('#tag-grouping');\n    if (tagGrouping) {\n      tagGrouping.checked = false; // unchecked = 'any'\n    }\n    options.filters.tags.grouping = 'any';\n\n    // Clear selected tags - just remove them, refreshAvailableTagsList will rebuild the list\n    var selectedTagsContainer = document.querySelector('.selected-tags');\n    if (selectedTagsContainer) {\n      while (selectedTagsContainer.firstChild) {\n        selectedTagsContainer.removeChild(selectedTagsContainer.firstChild);\n      }\n    }\n\n    // Re-render the \"Your Tags\" section with all available tags\n    refreshAvailableTagsList();\n  }\n  manageFilterAccordions();\n  return options;\n}\n\n/**\n * Returns true if the page is currently filtered by the given filter type.\n *\n * @param options * @param filterType\n * @param filterType\n * @returns {boolean}\n */\nfunction isTypeFiltered(options, filterType) {\n  var _options$filters$note6, _options$filters$note7, _options$filters$note8, _options$filters$note9;\n  var response = false;\n  switch (filterType) {\n    case 'colors':\n      response = options.filters[filterType].length > 0;\n      break;\n    case 'tags':\n      response = options.filters[filterType].ids.length > 0;\n      break;\n    case 'text':\n      response = options.filters[filterType].words.length > 0;\n      break;\n    case 'note':\n      // Optional chaining, unlike the cases above: the note block is absent\n      // from any options array persisted before the note filter shipped. (#4491
39)\n      //\n      // Words only. Presence is its own card and lights up its own checkmark,\n      // so reporting it here too made this card claim a filter it no longer\n      // owns. (#4777)\n      response = ((_options$filters$note6 = (_options$filters$note7 = options.filters.note) === null || _options$filters$note7 === void 0 ? void 0 : _options$filters$note7.words) !== null && _options$filters$note6 !== void 0 ? _options$filters$note6 : '').length > 0;\n      break;\n    case 'note-presence':\n      // Presence filters on its own, with nothing typed — that is the whole\n      // point of \"no note\". (#4492, moved to its own card by #4777)\n      response = ((_options$filters$note8 = (_options$filters$note9 = options.filters.note) === null || _options$filters$note9 === void 0 ? void 0 : _options$filters$note9.has) !== null && _options$filters$note8 !== void 0 ? _options$filters$note8 : '') !== '';\n      break;\n  }\n  return response;\n}\n\n/**\n * Manages all the DOM elements related to a filter based on the options object.\n * Update each filter accordion component such as the border color, icons, toggles the accordion, and\n * handles the visibility of the clear filter button.\n */\nfunction manageFilterAccordions() {\n  var _context34;\n  var options = setOptionValues();\n  syncNotePresenceExclusivity(options);\n\n  // for each filter type that is actually on the page\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context34 = renderedFilterTypes()).call(_context34, function (filterType) {\n    var filterIndicatorIcon = document.querySelector(\"#\".concat(filterType, \"-filter-indicator\"));\n    var filterIsEnabled = isTypeFiltered(options, filterType);\n    switch (filterType) {\n      case 'colors':\n        updateColorFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon);\n        break;\n      case 'tags':\n        updateTagsFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon);\n        break;\n      case 'text':\n        updateTextFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon);\n        break;\n      case 'note':\n        updateNoteFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon);\n        break;\n      case 'note-presence':\n        updateNotePresenceFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon);\n        break;\n    }\n\n    // manage the visibility of the filter icon on the accordion\n    if (filterIndicatorIcon) {\n      if (filterIsEnabled) {\n        filterIndicatorIcon.classList.remove('hide');\n      } else {\n        filterIndicatorIcon.classList.add('hide');\n      }\n    }\n\n    // handle the filtered class on the accordion\n    var filterSection = filterIndicatorIcon === null || filterIndicatorIcon === void 0 ? void 0 : filterIndicatorIcon.closest('.filter-section');\n    if (filterSection) {\n      if (filterIsEnabled) {\n        filterSection.classList.add('filtered');\n      } else {\n        filterSection.classList.remove('filtered');\n      }\n    }\n\n    // accordion toggle icon\n    var toggleAnchor = document.querySelector(\"#filter-\".concat(filterType, \"-toggle\"));\n    if (toggleAnchor) {\n      var minusIcon = toggleAnchor.querySelector('.fa-minus');\n      var plusIcon = toggleAnchor.querySelector('.fa-plus');\n      if (filterIsEnabled) {\n        if (minusIcon) {\n          minusIcon.style.display = 'block';\n        }\n        if (plusIcon) {\n          plusIcon.style.display = 'none';\n        }\n      } else {\n        if (minusIcon) {\n          minusIcon.style.display = 'none';\n        }\n        if (plusIcon) {\n          plusIcon.style.display = 'block';\n        }\n      }\n    }\n\n    // handle accordion state (open/closed) based on icon (+ or -) that is showing\n    var filterAccordion = document.querySelector(\"#filter-\".concat(filterType, \"-expanded\"));\n    var enabledAccordionIcon = toggleAnchor === null || toggleAnchor === void 0 ? void 0 : toggleAnchor.querySelector('i[style=\"display: block;\"]');\n    if (enabledAccordionIcon !== null && enabledAccordionIcon !== void 0 && enabledAccordionIcon.classList.contains('fa-plus') && filterAccordion && filterAccordion.style.display !== 'none') {\n      jQuery(\"#filter-\".concat(filterType, \"-expanded\")).foundation('toggle');\n    }\n\n    // the clear filter button\n    var clearFilterButton = document.querySelector(\"#clear-\".concat(filterType, \"-filter\"));\n    if (clearFilterButton) {\n      if (filterIsEnabled) {\n        clearFilterButton.classList.remove('hide');\n      } else {\n        clearFilterButton.classList.add('hide');\n      }\n    }\n  });\n\n  // handle clear all visibility\n  var clearAllBtn = document.querySelector('#clear-all-filters');\n\n  // manage clear all button availability\n  if (!clearAllBtn) {\n    return;\n  }\n  if (isCollectionFiltered()) {\n    clearAllBtn.classList.remove('disabled');\n    clearAllBtn.removeAttribute('disabled');\n    clearAllBtn.removeAttribute('aria-disabled');\n  } else {\n    clearAllBtn.classList.add('disabled');\n    clearAllBtn.setAttribute('disabled', '');\n    clearAllBtn.setAttribute('aria-disabled', '');\n  }\n}\n\n/**\n * Make the note text query unavailable while \"no note\" is the presence\n * selection, and available again as soon as it is not.\n *\n * The two are mutually exclusive: no mark can both contain a word 
39in its note\n * and have no note, so offering the combination produced a correct but\n * unexplained empty result set — \"Total: 0 of 401\" with nothing saying why\n * (#4777). Disabling the input states the exclusion in the control instead.\n *\n * A no-op for a user without the notes feature, whose page carries none of\n * these elements.\n *\n * @param {Object} options\n */\nfunction syncNotePresenceExclusivity(options) {\n  var _options$filters$note10, _options$filters;\n  var noteFilterElem = document.querySelector('#filter-by-note');\n  if (!noteFilterElem) {\n    return;\n  }\n  var unavailable = ((_options$filters$note10 = (_options$filters = options.filters) === null || _options$filters === void 0 || (_options$filters = _options$filters.note) === null || _options$filters === void 0 ? void 0 : _options$filters.has) !== null && _options$filters$note10 !== void 0 ? _options$filters$note10 : '') === NOTE_PRESENCE_WITHOUT;\n  noteFilterElem.disabled = unavailable;\n  var noteFilterButton = document.querySelector('.filter-note button');\n  if (noteFilterButton) {\n    noteFilterButton.disabled = unavailable;\n  }\n  var noteFilterContainer = document.querySelector('.filter-note');\n  if (noteFilterContainer) {\n    noteFilterContainer.classList.toggle('note-text-unavailable', unavailable);\n  }\n\n  // A disabled input with no explanation is its own defect, so the reason is\n  // stated next to it rather than left to be inferred. (#4777)\n  var notice = document.querySelector('#note-text-unavailable-notice');\n  if (notice) {\n    notice.style.display = unavailable ? '' : 'none';\n  }\n}\n\n/**\n * The filter types whose accordion is actually rendered on the page.\n *\n * Built from the DOM rather than hardcoded, because the note section is\n * server-gated behind FEATURE_NOTES: a non-allowlisted user receives no note\n * markup at all. A hardcoded list including 'note' would dereference a null\n * indicator icon and take the WHOLE filter panel down for that user, not just\n * the note section. (#4491)\n *\n * @returns {string[]} The subset of FILTER_TYPES present in the DOM.\n */\nfunction renderedFilterTypes() {\n  return _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(FILTER_TYPES).call(FILTER_TYPES, function (filterType) {\n    return document.querySelector(\"#\".concat(filterType, \"-filter-indicator\")) !== null;\n  });\n}\n\n/**\n * create a tag filter element. if action is 'add', the event handler will handle adding the tag\n * to the filter list from the 'Your Tags' collection. If action is remove, the handler will handle\n * removing the tag from the filter list and adding back to the 'Your Tags' collection.\n * @param tagData\n * @param action // ['add' , 'remove']\n * @returns {HTMLDivElement}\n */\nfunction createFilterTagElement(tagData) {\n  var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'add';\n  var color = tagData.color,\n    id = tagData.id,\n    lastUpdated = tagData.lastUpdated,\n    text = tagData.text,\n    usage = tagData.usage;\n\n  // create a tag element\n  var tag = document.createElement('div');\n  tag.classList.add('tag', \"\".concat(color));\n  tag.dataset.tagId = id;\n  tag.dataset.color = color;\n  tag.dataset.lastUpdated = lastUpdated;\n  tag.dataset.text = text;\n  tag.dataset.usage = usage;\n  tag.dataset.action = action;\n  var nameSpan = document.createElement('span');\n  nameSpan.innerHTML = text;\n  tag.appendChild(nameSpan);\n\n  // Add usage count span to match PHP-rendered tags\n  var usageSpan = document.createElement('span');\n  usageSpan.className = 'tag-usage';\n  usageSpan.textContent = usage !== null && usage !== void 0 ? usage : 0;\n  tag.appendChild(usageSpan);\n  tag.addEventListener('click', /*#__PURE__*/function () {\n    var _ref15 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee16(event) {\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee16$(_context35) {\n        while (1) switch (_context35.prev = _context35.next) {\n          case 0:\n            disableFilters();\n            _context35.prev = 1;\n            _context35.next = 4;\n            return filterTagClickHandler(event);\n          case 4:\n            _context35.prev = 4;\n            enableFilters();\n            return _context35.finish(4);\n          case 7:\n          case \"end\":\n            return _context35.stop();\n        }\n      }, _callee16, null, [[1,, 4, 7]]);\n    }));\n    return function (_x18) {\n      return _ref15.apply(this, arguments);\n    };\n  }());\n\n  // Prevent addHandlersToTagsInFilter from adding a duplicate handler\n  tag.dataset.listenerAttached = 'true';\n  return tag;\n}\n\n/**\n * Handler to add or remove a tag from the tags filter list.\n *\n * @param event\n */\nfunction filterTagClickHandler(_x19) {\n  return _filterTagClickHandler.apply(this, arguments);\n}\n/**\n * Move a tag filter element between existing and suggested areas.\n *\n * @param tag\n */\nfunction _filterTagClickHandler() {\n  _filterTagClickHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee36(event) {\n    var tag, isRemoving, options;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee36$(_context88) {\n      while (1) switch (_context88.prev = _context88.next) {\n        case 0:\n          event.preventDefault();\n          tag = event.target;\n          if (tag.nodeName === 'SPAN') {\n            tag = tag.closest('.tag');\n          }\n\n          // Determine if we're adding or removing before the move changes the action\n          isRemoving = tag.dataset.action === 'remove';\n          moveTagFilterTagElement(tag);\n\n          // Re-render the \"Your Tags\" section with remaining available tags\n          refreshAvailableTagsList();\n          options = setOptionValues();\n          _context88.next = 9;\n          return _updateCollection(options);\n        case 9:\n          emphasizeFilteredTagsOnAnnotations();\n          manageFilterAccordions();\n        case 11:\n        case \"end\":\n          return _context88.stop();\n      }\n    }, _callee36);\n  }));\n  return _filterTagClickHandler.apply(this, arguments);\n}\nfunction moveTagFilterTagElement(tag) {\n  var action = tag.dataset.action;\n  var selectedTagsCollection = document.querySelector('.selected-tags');\n  var userTagsCollection = document.querySelector('.existing-tags');\n  if (action === 'add') {\n    selectedTagsCollection = removeNonCharacterNodes(selectedTagsCollection);\n    if (selectedTagsCollection.childNodes.length === 0) {\n      selectedTagsCollection.appendChild(tag);\n    } else {\n      selectedTagsCollection.insertAdjacentElement('afterbegin', tag);\n    }\n\n    // swap action\n    tag.dataset.action = 'remove';\n  }\n  if (action === 'remove') {\n    userTagsCollection = removeNonCharacterNodes(userTagsCollection);\n    if (userTagsCollection.childNodes.length === 0) {\n      userTagsCollection.appendChild(tag);\n    } else {\n      userTagsCollection.insertAdjacentElement('afterbegin', tag);\n    }\n\n    // swap action\n    tag.dataset.action = 'add';\n  }\n}\n\n/**\n * Return the case sensitivity selection from text sensitivity filter radio buttons.\n *\n * @param selectorGroup\n * @returns {string}\n */\nfunction getTextSensitivity(selectorGroup) {\n  var selection = 'sensitive';\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(selectorGroup).call(selectorGroup, function (radio) {\n    if (radio.checked) {\n      selection = radio.value;\n    }\n  });\n  return selection;\n}\n\n/**\n * Update the collection of Annotations based on paging / sorting / filtering selected.\n * calls addActionHandlers after the collection is updated\n *\n * @param options\n * @returns {Promise<{success: boolean}>}\n */\nfunction _updateCollection(_x20) {\n  return _updateCollection2.apply(this, arguments);\n}\n/**\n * Get the options from the collection element's dataset in DOM.\n * @returns {*}\n *\n */\nfunction _updateCollection2() {\n  _updateCollection2 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee37(options) {\n    var _spinner5;\n    var _options$collection2, paginatorName, paginationControlsSelector, spinnerOptions, spinner, targetSelector, _spinnerOptions$targe, name, _spinnerOptions$inser, insertPosition, _spinnerOptions$withW, withWrapper, _spinner, _spinner3, collectionElement, paginationControls, sortElement, data, url, result, success, messages, _result$options, _bulkEditController, newCollectionHolder, newCollectionNode, canonicalOptions, totalsElem, temp, nav, newNav, message, notice, _spinner2, _message, _notice, stack, regex, target, _document$querySelect, element, _spinner4, _message2, _notice2, _stack, _regex, _target, _document$querySelect2, _element;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee37$(_context89) {\n      while (1) switch (_context89.prev = _context89.next) {\n        case 0:\n          _options$collection2 = options.collection, paginatorName = _options$collection2.paginatorName, paginationControlsSelector = _options$collection2.paginationControlsSelector;\n          spinnerOptions = options.spinner; // Guard against missing spinner options\n          spinner = null;\n          targetSelector = null;\n          if (spinnerOptions) {\n            // spread assignment used to ensure correct order of params in Spinner construction\n            name = spinnerOptions.name, _spinnerOptions$inser = spinnerOptions.insertPosition, insertPosition = _spinnerOptions$inser === void 0 ? 'afterend' : _spinnerOptions$inser, _spinnerOptions$withW = spinnerOptions.withWrapper, withWrapper = _spinnerOptions$withW === void 0 ? false : _spinnerOptions$withW;\n            targetSelector = (_spinnerOptions$targe = spinnerOptions.targetSelector) !== null && _spinnerOptions$targe !== void 0 ? _spinnerOptions$targe : null;\n            spinner = new _spinner__WEBPACK_IMPORTED_MODULE_28__.Spinner(name, targetSelector, insertPosition, withWrapper);\n          }\n          _context89.prev = 5;\n          collectionElement = document.querySelector('[data-paginated-collection]');\n          paginationControls = document.querySelector(\"\".concat(paginationControlsSelector));\n          sortElement = document.querySelector(\"#sort-by\");\n          if (sortElement) {\n            options.sort = sortElement.value;\n          }\n          (_spinner = spinner) === null || _spinner === void 0 || _spinner.add();\n          data = {\n            paginatorName: paginatorName,\n            options: options\n          };\n          url = collectionElement.dataset.refreshUrl;\n          _context89.next = 15;\n          return new _fetch_helpers__WEBPACK_IMPORTED_MODULE_26__[\"default\"]().fetchData('POST', url, data);\n        case 15:\n          result = _context89.sent;\n          success = result.success, messages = result.messages;
39\n          if (!success) {\n            _context89.next = 51;\n            break;\n          }\n          // set the page param to '1' on url\n          // const params = new URLSearchParams(location.search);\n          // params.delete('page');\n          // params.append('page', '1');\n          // window.history.replaceState({}, '', `${location.pathname}?${params}`);\n          window.history.replaceState({}, '', \"\".concat(location.pathname));\n\n          /* update collection element with new rows, related attributes and event handlers */\n          newCollectionHolder = document.createElement('div');\n          newCollectionHolder.innerHTML = result['collection'];\n          newCollectionNode = newCollectionHolder.firstElementChild;\n          collectionElement.replaceWith(newCollectionNode);\n\n          // Write canonical state onto the NEW in-DOM node — the old collectionElement\n          // is now detached, so writes to it never reach the live DOM (#2910)\n          newCollectionNode.dataset.collection = _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_17___default()(options);\n          // refresh-paginated-list.php echoes the options back as a JSON object, so\n          // result['options'] arrives as a parsed JS object. A dataset property only\n          // stores strings — assigning the object directly coerced it to the literal\n          // \"[object Object]\", which the next getCurrentOptions() then failed to\n          // JSON.parse. That empty/unparseable state is what drove the setOptionValues\n          // recursion. Serialize objects; pass through an already-serialized string. (#3076)\n          canonicalOptions = (_result$options = result['options']) !== null && _result$options !== void 0 ? _result$options : options;\n          newCollectionNode.dataset.options = typeof canonicalOptions === 'string' ? canonicalOptions : _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_17___default()(canonicalOptions);\n\n          /* add event handlers for elements in the new collection */\n          _context89.next = 28;\n          return addAnnotationsActionHandlers();\n        case 28:\n          addMarkTagsFullViewHandler();\n\n          // Re-apply batch-edit checkboxes to the repainted collection (#3051)\n          (_bulkEditController = bulkEditController) === null || _bulkEditController === void 0 || _bulkEditController.syncAfterRepaint();\n\n          // Gate tag management icons behind experimental feature\n          gateTagManagementIcons();\n\n          // update totals\n          totalsElem = document.querySelector('.annotation-items');\n          temp = document.createElement('div');\n          temp.innerHTML = result['total'];\n          totalsElem.replaceWith(temp.firstChild);\n\n          // update navigation controls\n          nav = result['nav'].toString();\n          newNav = document.createRange().createContextualFragment(nav);\n          paginationControls.replaceWith(newNav);\n          _context89.next = 40;\n          return (0,_pagination__WEBPACK_IMPORTED_MODULE_30__.addPaginationNavigationHandlers)(paginatorName);\n        case 40:\n          // toggle the \"every term is a common word\" notice. The server is the\n          // authoritative source: it is only true when \"Ignore common words\" is\n          // checked AND every entered term is a stopword. (#3354)\n          toggleTextFilterAllNoiseNotice(result['textFilterAllNoise'] === true);\n          toggleNoteFilterAllNoiseNotice(result['noteFilterAllNoise'] === true);\n\n          // display any messages available\n          if (!messages) {\n            _context89.next = 48;\n            break;\n          }\n          message = messages.join(\"\\n\");\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_29__.AsyncNotice(message, 'warning', true, 5);\n          _context89.next = 47;\n          return notice.create({}, true);\n        case 47:\n          notice.remove();\n        case 48:\n          // re-init foundation\n          jQuery(document).foundation();\n          _context89.next = 61;\n          break;\n        case 51:\n          _message = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('error_updating_collection') || 'There was an error updating the collection.';\n          _notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_29__.AsyncNotice(_message, 'error');\n          stack = result['error'].stack.toString();\n          _context89.next = 56;\n          return _notice.create({\n            message: _message,\n            stack: stack\n          }, true);\n        case 56:\n          _notice.remove();
39\n          if (targetSelector) {\n            regex = /(\\[.*])/;\n            target = targetSelector.match(regex);\n            if (target) {\n              element = (_document$querySelect = document.querySelector(\"\".concat(target[1]))) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.closest('[data-annotation]');\n              if (element) {\n                element.querySelector('.user-highlight').style.backgroundColor = element.dataset.currentColor;\n              }\n            }\n          }\n          console.error(_message);\n          (_spinner2 = spinner) === null || _spinner2 === void 0 || _spinner2.remove();\n\n          // A server-reported failure must reach the caller as a failure. Falling\n          // through to the success return told annotationActionHandler and the note\n          // editor that a rejected write had succeeded, so the colour handler never\n          // showed its own notice and the note editor closed on a silent failure.\n          // The hardening in #4491 removed the incidental TypeError that used to\n          // mask this. (#4488)\n          return _context89.abrupt(\"return\", {\n            success: false\n          });\n        case 61:\n          (_spinner3 = spinner) === null || _spinner3 === void 0 || _spinner3.remove();\n          _context89.next = 76;\n          break;\n        case 64:\n          _context89.prev = 64;\n          _context89.t0 = _context89[\"catch\"](5);\n          console.error(\"\".concat(_context89.t0));\n          _message2 = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('error_updating_list') || 'There was an error updating the annotations list. Please refresh the page.';\n          _notice2 = new _notices_notice__WEBPACK_IMPORTED_MODULE_29__.AsyncNotice(_message2, 'error');\n          _stack = _context89.t0.stack.toString();\n          _context89.next = 72;\n          return _notice2.create({\n            message: _message2,\n            error: _context89.t0,\n            stack: _stack\n          }, true);\n        case 72:\n          _notice2.remove(5);\n          if (targetSelector) {\n            _regex = /(\\[.*])/;\n            _target = targetSelector.match(_regex);\n            if (_target) {\n              _element = (_document$querySelect2 = document.querySelector(\"\".concat(_target[1]))) === null || _document$querySelect2 === void 0 ? void 0 : _document$querySelect2.closest('[data-annotation]');\n              if (_element) {\n                _element.querySelector('.user-highlight').style.backgroundColor = _element.dataset.currentColor;\n              }\n            }\n          }\n          (_spinner4 = spinner) === null || _spinner4 === void 0 || _spinner4.remove();\n          return _context89.abrupt(\"return\", {\n            success: false\n          });\n        case 76:\n          (_spinner5 = spinner) === null || _spinner5 === void 0 || _spinner5.remove();\n          return _context89.abrupt(\"return\", {\n            success: true\n          });\n        case 78:\n        case \"end\":\n          return _context89.stop();\n      }\n    }, _callee37, null, [[5, 64]]);\n  }));\n  return _updateCollection2.apply(this, arguments);\n}\nfunction getCurrentOptions() {\n  var _collectionElement$da, _collectionElement$da2;\n  var collectionElement = document.querySelector('[data-paginated-collection]');\n  var currentOptions = (_collectionElement$da = collectionElement === null || collectionElement === void 0 || (_collectionElement$da2 = collectionElement.dataset) === null || _collectionElement$da2 === void 0 ? void 0 : _collectionElement$da2.options) !== null && _collectionElement$da !== void 0 ? _collectionElement$da : {};\n  var options = {};\n  try {\n    if (currentOptions) {\n      var _collectionElement$da3, _collectionElement$da4;\n      var json = (_collectionElement$da3 = collectionElement === null || collectionElement === void 0 || (_collectionElement$da4 = collectionElement.dataset) === null || _collectionElement$da4 === void 0 ? void 0 : _collectionElement$da4.options) !== null && _collectionElement$da3 !== void 0 ? _collectionElement$da3 : '';\n      var data = JSON.parse(json);\n      options = structuredClone(data);\n      if (options.filters) {\n        var _data$filters$colors, _data$filters$text, _data$filters$tags;\n        options.filters = {};\n        options.filters.colors = (_data$filters$colors = data.filters['colors']) !== null && _data$filters$colors !== void 0 ? _data$filters$colors : [];\n        options.filters.text = (_data$filters$text = data.filters.text) !== null && _data$filters$text !== void 0 ? _data$filters$text : {\n          grouping: 'all',\n          sensitivity: 'insensitive',\n          words: '',\n          excludeNoiseWords: false\n        };\n        options.filters.tags = (_data$filters$tags = data.filters.tags) !== null && _data$filters$tags !== void 0 ? _data$filters$tags : {\n          grouping: 'all',\n          ids: []\n        };\n\n        // Copied through only when present, never defaulted in: an options array\n        // persisted before the note filter shipped stays 
39note-less, so the server\n        // keeps deciding the note defaults rather than the client asserting them. (#4491)\n        if (data.filters.note) {\n          options.filters.note = data.filters.note;\n        }\n      }\n    } else {\n      // No dataset options yet (empty/whitespace attribute): return a sane\n      // default skeleton rather than calling setOptionValues(), which would\n      // call back into getCurrentOptions() and risk mutual recursion. (#3076)\n      options = defaultOptions();\n    }\n  } catch (error) {\n    // An unparseable dataset.options (e.g. the coerced \"[object Object]\" string\n    // a missing JSON.stringify used to leave behind) must degrade to defaults,\n    // never to {} — an empty object re-triggered the setOptionValues recursion. (#3076)\n    console.error(\"Error parsing annotation collection options: \".concat(error.message));\n    options = defaultOptions();\n  }\n  return options;\n}\n\n/**\n * Build a complete default options skeleton without touching filter/sort state\n * inference. Used as the non-recursive base case for setOptionValues() and the\n * fallback for getCurrentOptions() when the collection has no usable dataset\n * options. Paginator identifiers are recovered from the DOM when present so a\n * subsequent updateCollection() can still target the right refresh endpoint.\n *\n * @returns {Object} A fully-formed options object with default filters.\n */\nfunction defaultOptions() {\n  var options = {\n    sort: '',\n    collection: {\n      style: 'list',\n      sort: '',\n      itemsPerPage: 10,\n      paginatorName: '',\n      paginationControlsSelector: ''\n    },\n    filters: defaultFilters()\n  };
39\n  var navElem = document.querySelector('nav[data-paginator-name]');\n  if (navElem) {\n    var paginatorName = navElem.dataset.paginatorName;\n    options.collection.paginatorName = paginatorName;\n    options.collection.paginationControlsSelector = \"nav#\".concat(paginatorName, \"-nav\");\n  }\n  return options;\n}\n\n/**\n * Returns the default annotations filters.\n *\n * @return {Object} - Default filters object with two properties: text and colors.\n *                   The text property contains an object with three properties: words, sensitivity, and grouping.\n *                   - The words property is an array of strings.\n *                   - The sensitivity property is a string that specifies the case sensitivity for text matching.\n *                   - The grouping property is a string that specifies the grouping behavior for text matching.\n *                   The colors property is an array of color values.\n */\nfunction defaultFilters() {\n  return {\n    text: {\n      sensitivity: 'insensitive',\n      grouping: 'all',\n      words: '',\n      excludeNoiseWords: false\n    },\n    note: {\n      sensitivity: 'insensitive',\n      grouping: 'all',\n      words: '',\n      excludeNoiseWords: false,\n      has: ''\n    },\n    colors: [],\n    tags: {\n      grouping: 'any',\n      ids: []\n    }\n  };\n}\n\n/**\n * Returns the marks array from sessionStorage\n * @returns {any}\n * @private\n */\nfunction getSectionMarksFromSessionStorage() {\n  var sessionMarks = sessionStorage.getItem('marks');\n  if (!sessionMarks) {\n    sessionMarks = clearMarkObjectInSession();\n  }\n  return JSON.parse(sessionMarks);\n}\n\n/**\n * Clear the mark object in session storage\n * @returns {string}\n * @private\n */\nfunction clearMarkObjectInSession() {\n  var marks = _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_17___default()([]);\n  sessionStorage.setItem('marks', marks);\n  return marks;\n}\n\n/**\n * Update the number of marks, on the highlights menu.\n */\nfunction updateStateOfHighlightsMenuDeleteButtons(marksCount) {\n  var deleteAll = document.querySelector('#remove-all-annotations');\n  var deleteLast = document.querySelector('#remove-last-annotation');\n\n  // The highlights menu is absent on pages that load this module without the\n  // annotations toolbar markup (#4046).\n  if (!deleteAll || !deleteLast) {\n    return;\n  }\n  var deleteAllText = deleteAll.querySelector('#count');\n\n  // Empty, not '(0)': book-toolbar.php renders no count at all for a section\n  // with no highlights, so a cleared span matches a fresh page load (#4100).\n  var text = '';\n  if (marksCount > 0) {\n    text = \"(\".concat(marksCount, \")\");\n\n    // update visibility of buttons\n    deleteAll.removeAttribute('disabled');\n    deleteLast.removeAttribute('disabled');\n  } else {\n    // update visibility of buttons\n    deleteAll.setAttribute('disabled', 'disabled');\n    deleteLast.setAttribute('disabled', 'disabled');\n  }\n\n  // update button text — textContent, not innerText: the latter is not\n  // implemented in jsdom, so the behaviour could not be tested (#4100).\n  if (deleteAllText) {\n    deleteAllText.textContent = text;\n  }\n}\n\n/**\n * Filter tags based on search text prefix (case-insensitive).\n * Excludes already selected tags and null entries.\n *\n * @param {Array} allTags - Array of tag objects with 'text' property\n * @param {Array} selectedTags - Array of already selected tag objects\n * @param {string} searchText - Text to filter by (prefix match)\n * @returns {Array} Filtered tags that match the search prefix and aren't selected\n */\nfunction filterTagsByPrefix(allTags, selectedTags, searchText) {\n  var _context36, _context37, _context38, _context39;\n  if (!_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_18___default()(allTags)) {\n    return [];\n  }\n  var selectedTexts = new (_babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_19___default())(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(_context36 = _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_14___default()(_context37 = selectedTags || []).call(_context37, function (t) {\n    return t === null || t === void 0 ? void 0 : t.text;\n  })).call(_context36, Boolean));\n  var search = (searchText || '').toLowerCase();\n  return _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(_context38 = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(_context39 = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(allTags).call(allTags, function (tag) {\n    return tag && tag.text;\n  }) // null guard\n  ).call(_context39, function (tag) {\n    return !selectedTexts.has(tag.text);\n  }) // exclude selected\n  ).call(_context38, function (tag) {\n    var _context40;\n    return _babel_runtime_corejs3_core_js_stable_instance_starts_with__WEBPACK_IMPORTED_MODULE_20___default()(_context40 = tag.text.toLowerCase()).call(_context40, search);\n  }); // prefix match\n}\n\n/**\n * Generate the tags management div with updated suggested tags.\n *\n * @param event\n * @param sortBy - one of: ('name', 'time', 'usage'); default: 'name'\n * @param direction - one of: ('asc', 'desc'); default: 'asc'\n */\nfunction updateTagFilterElements(event) {\n  var _context41, _context42, _context43, _filteredTags$length, _filteredTags$length2, _filteredTags;\n  var sortBy = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'name';\n  var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'asc';\n  var textInputElem = document.querySelector('#filter-by-tag');\n  var inputText = textInputElem.value;\n  var existingTagsWrapper = document.querySelector('.existing-tags');\n  // const existingTags = existingTagsWrapper.querySelectorAll('.tag');\n  var allTagsData = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(_context41 = JSON.parse(sessionStorage.getItem('userTags')) || []).call(_context41, Boolean);\n  var selectedTagElems = document.querySelectorAll('.selected-tags .tag');\n  var selectedTags = _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_14___default()(_context42 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_10___default()(selectedTagElems)).call(_context42, function (tag) {\n    var _tag$dataset = tag.dataset,\n      color = _tag$dataset.color,\n      id = _tag$dataset.id,\n      lastUpdated = _tag$dataset.lastUpdated,\n      text = _tag$dataset.text,\n      usage = _tag$dataset.usage;\n    return {\n      color: color,\n      id: id,\n      lastUpdated: lastUpdated,\n      text: text,\n      usage: usage\n    };\n  });\n\n  /* manage tags management variables */\n  var sortFunction = (0,_annotations_manage_tags__WEBPACK_IMPORTED_MODULE_31__.tagsSortingFunction)(sortBy, direction);\n\n  // filter() function to remove tags already added to mark\n  var filterAlreadyAddedTags = function filterAlreadyAddedTags(tag) {\n    return tag && !_babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_21___default()(selectedTags).call(selectedTags, function (selectedTag) {\n      return selectedTag.text === tag.text;\n    });\n  };\n  var filteredTags = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default()(_context43 = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(allTagsData).call(allTagsData, filterAlreadyAddedTags)).call(_context43, sortFunction);\n\n  // grab previous text input value, save current\n  var previousInputTextCount = sessionStorage.getItem('current-mark-new-tag-text-count');\n  sessionStorage.setItem('current-mark-new-tag-text-count', inputText.length);\n\n  // For performance reasons, we keep and use a filtered tags list instead of always re
39checking the full\n  // tags list. Decide when we need to reset the filtered tags list.\n  var resetTagsList = ((_filteredTags$length = filteredTags.length) !== null && _filteredTags$length !== void 0 ? _filteredTags$length : 0) === 0 ||\n  // if the filtered Tag List is empty\n  textInputElem.value.length === 0 ||\n  // if there are no characters in the new tag input text field\n  previousInputTextCount > textInputElem.value.length; // if the user removed a character\n\n  if (resetTagsList) {\n    var _context44, _context45;\n    // copy by value, not reference - still exclude already selected tags\n    filteredTags = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default()(_context44 = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(_context45 = (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(allTagsData)).call(_context45, filterAlreadyAddedTags)).call(_context44, sortFunction);\n  }\n\n  // list of all visible tag names:\n  // (1) from filtered tags list\n  // (2) existing tags\n  // (3) newly added tags that have not been saved.\n  var allTagElems = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(filteredTags).call(filteredTags, selectedTags);\n  var visibleTagNamesMap = new (_babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_23___default())();\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(allTagElems).call(allTagElems, function (item) {\n    visibleTagNamesMap.set(item.text, {\n      id: item.id,\n      color: item.color\n    });\n  });\n\n  // manage suggested tags\n  var tagDiv;\n\n  // suggestions div\n  var newExistingTagsWrapper = existingTagsWrapper.cloneNode();\n  var tagTexts = (0,_annotations_manage_tags__WEBPACK_IMPORTED_MODULE_31__.arrayColumn)(allTagsData, 'text');\n  if (((_filteredTags$length2 = (_filteredTags = filteredTags) === null || _filteredTags === void 0 ? void 0 : _filteredTags.length) !== null && _filteredTags$length2 !== void 0 ? _filteredTags$length2 : 0) > 0) {\n    // clear the filtered tags list and fill with remaining possible matches, below\n    var _iterator = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(filteredTags),\n      _step;\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var _context46;\n        var tagData = _step.value;\n        var text = tagData.text;\n        if (_babel_runtime_corejs3_core_js_stable_instance_starts_with__WEBPACK_IMPORTED_MODULE_20___default()(_context46 = text.toLowerCase()).call(_context46, textInputElem.value.toLowerCase()) && _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_11___default()(tagTexts).call(tagTexts, text)) {\n          var _tagData$usage2;\n          tagDiv = createFilterTagElement(tagData);\n          tagDiv.setAttribute('title', \"Usage: \".concat((_tagData$usage2 = tagData.usage) !== null && _tagData$usage2 !== void 0 ? _tagData$usage2 : 0));\n          tagDiv.setAttribute('data-id', tagData.id);\n          newExistingTagsWrapper.appendChild(tagDiv);\n          var deleteTagElem = tagDiv.querySelector('[data-tag-type=\"delete\"]');\n          if (deleteTagElem) {\n            deleteTagElem.remove();\n            tagDiv.appendChild(newExistingTagsWrapper);\n          }\n        }\n      }\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n  }\n  if (newExistingTagsWrapper.childNodes.length > 0) {\n    while (existingTagsWrapper.firstChild) {\n      existingTagsWrapper.removeChild(existingTagsWrapper.firstChild);\n    }\n    existingTagsWrapper.replaceWith(newExistingTagsWrapper);\n    // Re-attach click handlers to the newly added tag elements\n    addHandlersToTagsInFilter();\n  } else {\n    (0,_annotations_manage_tags__WEBPACK_IMPORTED_MODULE_31__.removeAllChildNodes)(existingTagsWrapper);\n    var noneSpan = document.createElement('span');\n    noneSpan.innerText = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('no_suggestions') || 'No suggestions.';\n    existingTagsWrapper.appendChild(noneSpan);\n  }\n}\n\n/**\n * Utility method to remove empty nodes ('', '\\n', or '\\t') from a NodeList\n * @param collectionWrapper\n */\nfunction removeNonCharacterNodes(collectionWrapper) {\n  var _context47;\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context47 = collectionWrapper.childNodes).call(_context47, function (node) {\n    var _context48;\n    if (node.nodeType === Node.TEXT_NODE && _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_8___default()(_context48 = n
39ode.textContent).call(_context48) === '') {\n      node.parentNode.removeChild(node);\n    }\n  });\n  return collectionWrapper;\n}\n\n/**\n * fetch user tags data from DB if it has not been already loaded into session storage\n */\nfunction fetchUserTags() {\n  return _fetchUserTags.apply(this, arguments);\n}\n/**\n * Return the colors we are filtering by, with the color filter.\n *\n * @param options\n * @returns {*}\n */\nfunction _fetchUserTags() {\n  _fetchUserTags = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().mark(function _callee38() {\n    var fetchSuccess, collectionElement, url, data, result, success, tags, msg, notice;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_5___default().wrap(function _callee38$(_context90) {\n      while (1) switch (_context90.prev = _context90.next) {\n        case 0:\n          if (sessionStorage.getItem('userTags')) {\n            _context90.next = 18;\n            break;\n          }\n          fetchSuccess = false;\n          collectionElement = document.querySelector('[data-collection]');\n          url = '';\n          if (!collectionElement) {\n            _context90.next = 12;\n            break;\n          }\n          url = collectionElement.dataset.fetchUrl;\n          data = {\n            action: 'load'\n          };\n          _context90.next = 9;\n          return new _fetch_helpers__WEBPACK_IMPORTED_MODULE_26__[\"default\"]().fetchData('POST', url, data);\n        case 9:\n          result = _context90.sent;\n          success = result.success, tags = result.tags;
39\n          if (success) {\n            sessionStorage.setItem('userTags', _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_17___default()(tags));\n            fetchSuccess = true;\n          }\n        case 12:\n          if (fetchSuccess) {\n            _context90.next = 18;\n            break;\n          }\n          msg = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('could_not_load_tags') || \"Could not load your tag collection.\";\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_29__.AsyncNotice(msg, 'warning');\n          _context90.next = 17;\n          return notice.create({}, true);\n        case 17:\n          notice.remove();\n        case 18:\n        case \"end\":\n          return _context90.stop();\n      }\n    }, _callee38);\n  }));\n  return _fetchUserTags.apply(this, arguments);\n}\nfunction colorFilterSelections(options) {\n  return options.filters.colors;\n}\n\n/** return the tag names of all tags we are filtering by, with the tags filter.\n *\n * @param options\n */\nfunction tagsFilterNames(options) {\n  var _context49;\n  var tagIds = options.filters.tags.ids;\n  var tags = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_13___default()(_context49 = JSON.parse(sessionStorage.getItem('userTags')) || []).call(_context49, Boolean);\n  if (tags.length === 0) {\n    return [];\n  }\n  var tagNames = [];\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(tagIds).call(tagIds, function (tagId) {\n    var tagData = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_9___default()(tags).call(tags, function (tag) {\n      return tag && tag.id === tagId;\n    });\n    if (tagData) {\n      tagNames.push(tagData.text);\n    }\n  });\n  return tagNames;\n}\n\n/** return the content words we are filtering by, with the text filter.\n *\n * Splits on whitespace and commas and drops noise words / lone letters so the\n * header count reflects the words actually matched by the query (#2912).\n *\n * @param options\n */\nfunction textFilterWords(options) {\n  var words = options.filters.text.words;\n  if (!words) {\n    return [];\n  }\n  return (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.filterNoiseWords)((0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.getUniqueWords)(words));\n}\n\n/** return the note words we are filtering by, with the note filter.\n *\n * Mirrors textFilterWords(): splits on whitespace and commas and drops noise\n * words / lone letters so the accordion header count reflects the terms that\n * actually reach the predicate. (#4491)\n *\n * @param options\n * @returns {string[]}\n */\nfunction noteFilterWords(options) {\n  var _options$filters$note11;\n  var words = (_options$filters$note11 = options.filters.note) === null || _options$filters$note11 === void 0 ? void 0 : _options$filters$note11.words;\n  if (!words) {\n    return [];\n  }\n  return (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.filterNoiseWords)((0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.getUniqueWords)(words));\n}\n\n/**\n * Manage the color filter accordion header details.\n * If the filter is enabled, add details of how many colors we are filtering by, to the title.\n *\n * @param options\n * @param filterIsEnabled\n * @param filterIndicatorIcon\n */\nfunction updateColorFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon) {\n  // update the accordion header when filtering\n  var filterTitleSpan = filterIndicatorIcon === null || filterIndicatorIcon === void 0 ? void 0 : filterIndicatorIcon.nextElementSibling;\n  if (!filterTitleSpan) {\n    return;\n  }\n  filterTitleSpan.innerHTML = \"&nbsp;\" + ((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('filter_by_color') || \"Filter by color\");\n  if (filterIsEnabled) {\n    // add number of colors to title\n    var filterColors = colorFilterSelections(options);\n    if (filterColors.length > 0) {\n      var _context50, _context51;\n      var color = filterColors.length === 1 ? (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('color_one') || 'color' : (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('color_other') || 'colors';\n      var title = filterTitleSpan.childNodes[0];\n      filterTitleSpan.innerHTML = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context50 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context51 = \"\".concat(title.textContent, \": \")).call(_context51, filterColors.length, \" \")).call(_context50, color);\n    }\n  }\n}\n\n/**\n * Manage the tags filter accordion header details.\n * If the filter is enabled, add details of how many tags we are filtering by, to the title.\n *\n * @param options\n * @param filterIsEnabled\n * @param filterIndicatorIcon\n */\nfunction updateTagsFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon) {\n  // update the accordion header when filtering\n  var filterTitleSpan = filterIndicatorIcon === null || filterIndicatorIcon === void 0 ? void 0 : filterIndicatorIcon.nextElementSibling;\n  if (!filterTitleSpan) {\n    return;\n  }\n  filterTitleSpan.innerHTML = \"&nbsp;\" + ((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('filter_by_tag') || \"Filter by tag\");\n  if (filterIsEnabled) {\n    // add number of tags to title\n    var filteredTagNames = tagsFilterNames(options);\n    if (filteredTagNames.length > 0) {\n      var _context52, _context53, _context54;\n      var tag = filteredTagNames.length === 1 ? (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('tag_one') || 'tag' : (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('tag_other') || 'tags';\n      var title = filterTitleSpan.childNodes[0];\n      filterTitleSpan.innerHTML = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context52 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context53 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context54 = \"\".concat(title.textContent, \": \")).call(_context54, filteredTagNames.length, \" \")).call(_context53, tag, \" (\")).call(_context52, options.filters.tags.grouping, \")\");\n    }\n  }\n}\n\n/**\n * Manage the text filter accordion header details.\n * If the filter is enabled, add details of how many words we are filtering by, to the title.\n *\n * @param options\n * @param filterIsEnabled\n * @param filterIndicatorIcon\n */\nfunction updateTextFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon) {\n  var _options$filters2;\n  // update the accordion header when filtering\n  var filterTitleSpan = filterIndicatorIcon === null || filterIndicatorIcon === void 0 ? void 0 : filterIndicatorIcon.nextElementSibling;\n  if (!filterTitleSpan) {\n    return;\n  }\n  filterTitleSpan.innerHTML = \"&nbsp;\" + ((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('filter_by_text') || \"Filter by text\");\n  if (!filterIsEnabled) {\n    return;\n  }\n\n  // The same details[] shape as the note header below, so the two cannot drift\n  // apart as either grows a detail the other does not have. (#4778)\n  var details = [];\n  var filterWords = textFilterWords(options);\n  if (filterWords.length > 0) {\n    var _context55, _context56;\n    var word = filterWords.length === 1 ? (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('word_one') || 'word' : (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('word_other') || 'words';\n    details.push(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context55 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context56 = \"\".concat(filterWords.length, \" \")).call(_context56, word, \" (\")).call(_context55, options.filters.text.grouping, \")\"));\n  }\n  renderFilterAccordionHeader(filterTitleSpan, details, (_options$filters2 = options.filters) === null || _options$filters2 === void 0 ? void 0 : _options$filters2.text);\n}\n\n/**\n * Write the details onto a filter card header, followed by a chip for every\n * toggle that is off its default.\n *\n * A no-op when there are no details, which leaves the bare card title the\n * caller has already written in place. (#4778)\n *\n * @param {HTMLElement} filterTitleSpan - the span holding the card title\n * @param {string[]} details - detail phrases, joined with \", \"\n * @param {Object} [filter] - the filter block whose toggles are chipped, if any\n */\nfunction renderFilterAccordionHeader(filterTitleSpan, details, filter) {\n  var _context57, _context58;\n  if (details.length === 0) {\n    return;\n  }\n  var title = filterTitleSpan.childNodes[0];\n  filterTitleSpan.innerHTML = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context57 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context58 = \"\".concat(title.textContent, \": \")).call(_context58, details.join(', '))).call(_context57, nonDefaultToggleChips(filter));\n}\n\n/**\n * Chips for the toggles that are not on their default setting.\n *\n * Only a changed toggle is reported, so a header with everything at its default\n * is byte-identical to the header that shipped before chips existed. Grouping\n * is deliberately absent: the details already name it in words. (#4778)\n *\n * The glyph is language-neutral and the meaning is carried by the title and the\n * aria-label, so a reader who does not recognise the symbol still gets the\n * phrase and Spanish does not lengthen the header.\n *\n * Read with translateOrUndefined(), not t(): t() echoes the key back 
39when it is\n * missing, so `t(key) || fallback` renders \"filter_chip_case_sensitive\" into an\n * aria-label rather than the English phrase (#4592).\n *\n * @param {Object} [filter] - options.filters.text or options.filters.note\n * @returns {string} HTML, or '' when every toggle is at its default\n */\nfunction nonDefaultToggleChips(filter) {\n  var chips = [];\n  if ((filter === null || filter === void 0 ? void 0 : filter.sensitivity) === 'sensitive') {\n    var _translateOrUndefined;\n    chips.push(filterChip(\"\\u1D00a\", (_translateOrUndefined = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.translateOrUndefined)('filter_chip_case_sensitive')) !== null && _translateOrUndefined !== void 0 ? _translateOrUndefined : 'Case-sensitive'));\n  }\n  if ((filter === null || filter === void 0 ? void 0 : filter.excludeNoiseWords) === true) {\n    var _translateOrUndefined2;\n    chips.push(filterChip(\"\\u2298\", (_translateOrUndefined2 = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.translateOrUndefined)('filter_chip_ignore_common_words')) !== null && _translateOrUndefined2 !== void 0 ? _translateOrUndefined2 : 'Ignoring common words'));\n  }\n  return chips.join('');\n}\n\n/**\n * One header chip: a glyph that announces itself as its translated phrase.\n *\n * role=\"img\" with an aria-label is what stops a screen reader spelling out the\n * glyph, and the colour of the chip carries no meaning of its own. (#4778)\n *\n * @param {string} glyph - the visible character\n * @param {string} label - the translated phrase for title and aria-label\n * @returns {string} HTML for the chip, with a leading space\n */\nfunction filterChip(glyph, label) {\n  var _context59;\n  var safeLabel = escapeAttributeValue(label);\n  return \" <span class=\\\"filter-chip\\\" role=\\\"img\\\" title=\\\"\".concat(safeLabel, \"\\\"\") + _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context59 = \" aria-label=\\\"\".concat(safeLabel, \"\\\">\")).call(_context59, glyph, \"</span>\");\n}\n\n/**\n * Escape a string for use inside a double-quoted HTML attribute.\n *\n * The chip labels come from the translation files rather than from user input,\n * but they are interpolated into markup, and a stray quote in a translation\n * would otherwise break the attribute it sits in.\n *\n * @param {string} value\n * @returns {string}\n */\nfunction escapeAttributeValue(value) {\n  var _context60, _context61, _context62, _context63;\n  return _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_24___default()(_context60 = _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_24___default()(_context61 = _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_24___default()(_context62 = _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_24___default()(_context63 = String(value)).call(_context63, '&', '&amp;')).call(_context62, '\"', '&quot;')).call(_context61, '<', '&lt;')).call(_context60, '>', '&gt;');\n}\n\n/**\n * Manage the note filter accordion header details.\n * If the filter is enabled, add details of how many words we are filtering by, to the title.\n *\n * @param options\n * @param filterIsEnabled\n * @param filterIndicatorIcon\n */\nfunction updateNoteFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon) {\n  var _options$filters3;\n  // update the accordion header when filtering\n  var filterTitleSpan = filterIndicatorIcon === null || filterIndicatorIcon === void 0 ? void 0 : filterIndicatorIcon.nextElementSibling;\n  if (!filterTitleSpan) {\n    return;\n  }\n  filterTitleSpan.innerHTML = \"&nbsp;\" + ((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('filter_by_note') || \"Filter by note\");\n  if (!filterIsEnabled) {\n    return;\n  }\n\n  // Words only. Presence moved to its own card, which reports its own state:\n  // stating it here as well rendered \"Filter by note: has a note\" above a\n  // control that already said \"Has a note\". (#4777)\n  var details = [];\n  var filterWords = noteFilterWords(options);\n  if (filterWords.length > 0) {\n    var _context64, _context65;\n    var word = filterWords.length === 1 ? (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('word_one') || 'word' : (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('word_other') || 'words';\n    details.push(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context64 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_22___default()(_context65 = \"\".concat(filterWords.length, \" \")).call(_context65, word, \" (\")).call(_context64, options.filters.note.grouping, \")\"));\n  }\n  renderFilterAccordionHeader(filterTitleSpan, details, (_options$filters3 = options.filters) === null || _options$filters3 === void 0 ? void 0 : _options$filters3.note);\n}\n\n/**\n * Manage the note presence accordion header details.\n *\n * The card carries no toggles of its own, so it takes no chips. (#4777)\n *\n * @param options\n * @param filterIsEnabled\n * @param filterIndicatorIcon\n */\nfunction updateNotePresenceFilterAccordionHeader(options, filterIsEnabled, filterIndicatorIcon) {\n  var _translateOrUndefined3;\n  var filterTitleSpan = filterIndicatorIcon === null || filterIndicatorIcon === void 0 ? void 0 : filterIndicatorIcon.nextElementSibling;\n  if (!filterTitleSpan) {\n    return;\n  }\n  filterTitleSpan.innerHTML = \"&nbsp;\" + ((_translateOrUndefined3 = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.translateOrUndefined)('filter_by_note_presence')) !== null && _translateOrUndefined3 !== void 0 ? _translateOrUndefined3 : 'Filter by note presence');\n  if (!filterIsEnabled) {\n    return;\n  }\n  var details = [];\n  var presenceLabel = notePresenceLabel(options);\n  if (presenceLabel) {\n    details.push(presenceLabel);\n  }\n  renderFilterAccordionHeader(filterTitleSpan, details);\n}\n\n/**\n * The human-readable label for the note presence selection, or '' for no preference.\n *\n * Read defensively: `has` is absent from any options array persisted before the\n * tri-state shipped, and an unrecognised value means no preference, matching\n * how PaginationOptions::getNoteHasFilter() reduces it server-side. (#4492)\n *\n * @param {Object} options\n * @returns {string}\n */\nfunction notePresenceLabel(options) {\n  var _options$filters$note12, _options$filters4;\n  switch ((_options$filters$note12 = (_options$filters4 = options.filters) === null || _options$filters4 === void 0 || (_options$filters4 = _options$filters4.note) === null || _options$filters4 === void 0 ? void 0 : _options$filters4.has) !== null && _options$filters$note12 !== void 0 ? _options$filters$note12 : '') {\n    case NOTE_PRESENCE_WITH:\n      return (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('note_presence_with') || 'has a 
39note';\n    case NOTE_PRESENCE_WITHOUT:\n      return (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_32__.t)('note_presence_without') || 'no note';\n    default:\n      return '';\n  }\n}\n\n/**\n * Returns true if the collection is being filtered by any of the filters.\n *\n * @returns {boolean}\n */\nfunction isCollectionFiltered() {\n  var _filters$note$words, _filters$note, _filters$note$has, _filters$note2;\n  var _getCurrentOptions = getCurrentOptions(),\n    filters = _getCurrentOptions.filters;\n  var colors = filters.colors,\n    tagIds = filters.tags.ids,\n    words = filters.text.words;\n\n  // The note block is read defensively because it is absent from any options\n  // array persisted before the note filter shipped. (#4491)\n  var noteWords = (_filters$note$words = (_filters$note = filters.note) === null || _filters$note === void 0 ? void 0 : _filters$note.words) !== null && _filters$note$words !== void 0 ? _filters$note$words : '';\n  var notePresence = (_filters$note$has = (_filters$note2 = filters.note) === null || _filters$note2 === void 0 ? void 0 : _filters$note2.has) !== null && _filters$note$has !== void 0 ? _filters$note$has : '';\n  return colors.length > 0 || tagIds.length > 0 || words.length > 0 || noteWords.length > 0 || notePresence !== '';\n}\n\n/**\n * Disable the filters with an overlay. This prevents multiple clicks by the users while a process hasn't finished.\n */\nfunction disableFilters() {\n  var filtersContainer = document.querySelector('#annotation-filters');\n  (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.insertOverlayOnElement)(filtersContainer, 'filters-overlay');\n}\n\n/**\n * Enable the filters by removing the overlay, if when present.\n */\nfunction enableFilters() {\n  (0,_utilities_general__WEBPACK_IMPORTED_MODULE_27__.removeOverlayOnElement)('filters-overlay');\n}\n\n/**\n * Gate tag management icons behind experimental feature.\n * Hides tag icons if the user doesn't have access to the tag management feature.\n */\nfunction gateTagManagementIcons() {\n  var collectionWrapper = document.querySelector('[data-collection]');\n  var hasTagManagement = (collectionWrapper === null || collectionWrapper === void 0 ? void 0 : collectionWrapper.dataset.hasTagManagement) === 'true';\n  if (!hasTagManagement) {\n    var tagIcons = document.querySelectorAll('.annotation-options [data-name=\"manage-tags\"]');\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(tagIcons).call(tagIcons, function (icon) {\n      var wrapper = icon.closest('.other-options');\n      if (wrapper) {\n        wrapper.remove();\n      }\n    });\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWNjb3VudC9hbm5vdGF0aW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0F
39BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBS0E7QUFBQTtBQThMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFBQTtBQTlMQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQWpCQTtBQUFBO0FBQUE7QUFBQTtBQWtCQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFiQTtBQUFBO0FBQUE7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0F
39BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBUUE7QUFBQTtBQXdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQUE7QUF4RUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFBQTtBQWdLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFBQTtBQWhLQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0F
39BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQTFDQTtBQUFBO0FBTUE7O0FBc0NBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFPQTtBQUFBO0FBNkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFBQTtBQTdDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQVNBO0FBQUE7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBQUE7QUF2QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQVVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUtBO0FBQUE7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQUE7QUF2QkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQU9BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
39BRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFPQTtBQUFBO0FBMEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUFBO0FBMUpBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFPQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7QUFLQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQUE7QUEyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQTNCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBUUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0F
39BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBTUE7QUFFQTtBQUFBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBS0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL2FjY291bnQvYW5ub3RhdGlvbnMuanM/YWNmYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEphdmFTY3JpcHQgZnVuY3Rpb25zIGZvciB0aGUgQW5ub3RhdGlvbnMgcGFnZS4gSGFuZGxlcyBjbGlja3Mgb24gU29ydCBjb250cm9scywgZmlsdGVyIG9wdGlvbnMsIGJ1dHRvbnMgdG8gY2hhbmdlIHRoZSB2aWV3XG4gKiBTdHlsZSwgYW5kIHRoZSAnYW5ub3RhdGlvbnMnIG1hbmFnZW1lbnQgY29udHJvbHMuXG4gKi9cblxuaW1wb3J0IEZldGNoSGVscGVycyBmcm9tIFwiLi4vZmV0Y2gtaGVscGVyc1wiO1xuaW1wb3J0IHthcHBDb2xvcnMsIGNvcHlUb0NsaXBib2FyZCwgZGFya2VuQ29sb3IsIGZpbHRlck5vaXNlV29yZHMsIGdldFVuaXF1ZVdvcmRzLCBsaWdodGVuQ29sb3IsIHN0cmlwUGFnZU51bWJlcnN9IGZyb20gXCIuLi91dGlsaXRpZXMvZ2VuZXJhbFwiO1xuaW1wb3J0IHtTcGlubmVyfSBmcm9tIFwiLi4vc3Bpbm5lclwiO1xuaW1wb3J0IHtBc3luY05vdGljZX0gZnJvbSBcIi4uL25vdGljZXMvbm90aWNlXCI7XG5pbXBvcnQge2FkZFBhZ2luYXRpb25OYXZpZ2F0aW9uSGFuZGxlcnMsIHNldENvbGxlY3Rpb25PcHRpb25zfSBmcm9tIFwiLi4vcGFnaW5hdGlvblwiO1xuaW1wb3J0IHtcbiAgYXJyYXlDb2x1bW4sXG4gIGNyZWF0ZVRhZ01hbmFnZW1lbnRDb250cm9scyxcbiAgcmVtb3ZlQWxsQ2hpbGROb2RlcyxcbiAgdGFnc1NvcnRpbmdGdW5jdGlvbixcbiAgdXBkYXRlVGFnTWFuYWdlbWVudEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vYW5ub3RhdGlvbnMvbWFuYWdlLXRhZ3NcIjtcbmltcG9ydCB7XG4gIGluc2VydE92ZXJsYXlPbkVsZW1lbnQsIHJlbW92ZU92ZXJsYXlPbkVsZW1lbnRcbn0gZnJvbSBcIi4uL3V0aWxpdGllcy9nZW5lcmFsXCI7XG5pbXBvcnQgeyB0LCB0cmFuc2xhdGVPclVuZGVmaW5lZCB9IGZyb20gXCIuLi91dGlsaXRpZXMvaTE4blwiO1xuaW1wb3J0IHsgY3JlYXRlQnVsa0VkaXRDb250cm9sbGVyIH0gZnJvbSBcIi4vYW5ub3RhdGlvbnMtYnVsay1lZGl0XCI7XG5pbXBvcnQgeyBvcGVuQW5ub3RhdGlvbk5vdGVFZGl0b3IgfSBmcm9tIFwiLi9hbm5vdGF0aW9ucy1ub3RlLWVkaXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9kZWJ1Z1wiO1xuXG4vKipcbiAqIEV2ZXJ5IGZpbHRlciB0eXBlIHRoZSBhbm5vdGF0aW9ucyBmaWx0ZXIgcGFuZWwgY2FuIHJlbmRlci5cbiAqXG4gKiBXaGljaCBvZiB0aGVzZSBhcmUgYWN0dWFsbHkgb24gdGhlIHBhZ2UgaXMgZGVjaWRlZCBhdCBydW50aW1lIGJ5XG4gKiByZW5kZXJlZEZpbHRlclR5cGVzKCkg4oCUICdub3RlJyBpcyBmZWF0dXJlLWdhdGVkLiAoIzQ0OTEpXG4gKlxuICogQHR5cGUge3N0cmluZ1tdfVxuICovXG5jb25zdCBGSUxURVJfVFlQRVMgPSBbJ2NvbG9ycycsICd0YWdzJywgJ3RleHQnLCAnbm90ZScsICdub3RlLXByZXNlbmNlJ107XG5cbi8vIFRoZSB0d28gbm90ZSBwcmVzZW5jZSBzZWxlY3Rpb25zLiAnJyDigJQgbmVpdGhlciByYWRpbyBjaGVja2VkIOKAlCBpcyB0aGUgdGhpcmRcbi8vIHN0YXRlLCBhbmQgaXQgbWVhbnMgXCJub3QgZmlsdGVyaW5nIGJ5IHByZXNlbmNlXCI7IGl0IGlzIGRlbGliZXJhdGVseSBub3QgYW5cbi8vIG9wdGlvbiB0aGUgdXNlciBjYW4gcGljay4gKCM0Nzc3KVxuY29uc3QgTk9URV9QUkVTRU5DRV9XSVRIID0gJ3dpdGgnO1xuY29uc3QgTk9URV9QUkVTRU5DRV9XSVRIT1VUID0gJ3dpdGhvdXQnO1xuY29uc3QgeyBsb2cgfSA9IGNyZWF0ZUxvZ2dlcignYWNjb3VudC1hbm5vdGF0aW9ucycpO1xuXG4vLyBBZGFwdGVyIHNvIHRoZSBzaGFyZWQgbm90ZSBlZGl0b3IncyBkb3R0ZWQga2V5cyByZXNvbHZlIHRocm91Z2ggdGhlIGFjY291bnRcbi8vIHBhZ2UncyB3aW5kb3cuX19pMThuIG1hcC4gUmV0dXJucyB1bmRlZmluZWQgZm9yIGEgbWlzc2luZyBrZXkgc28gdGhlIGVkaXRvcidzXG4vLyBFbmdsaXNoIGZhbGxiYWNrcyBmaXJlICh0aGUgdXRpbGl0aWVzIHQoKSByZXR1cm5zIHRoZSBrZXkgbmFtZSB3aGVuIG1pc3NpbmcpLlxuY29uc3Qgbm90ZUVkaXRvckkxOG4gPSB7XG4gIHQ6IChrZXkpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHQoa2V5KTtcbiAgICByZXR1cm4gdmFsdWUgPT09IGtleSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9LFxufTtcblxuLy8gSG9sZHMgdGhlIGJhdGNoLWVkaXQgY29udHJvbGxlciBpbnN0YW5jZSBmb3IgdGhlIGFubm90YXRpb25zIHBhZ2UgKCMzMDUxKS5cbmxldCBidWxrRWRpdENvbnRyb2xsZXIgPSBudWxsO1xuXG4vKipcbiAqIEZpbmQgdGhlIGhpZ2hsaWdodCB0ZXh0IGNvbnRhaW5lciB3aXRoaW4gYW4gYW5ub3RhdGlvbiBlbGVtZW50LlxuICogQm90aCBjYXJkcyBhbmQgbGlzdCB2aWV3cyB1c2UgdGhlIHNhbWUgLnVzZXItaGlnaGxpZ2h0IGRpdiBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYW5ub3RhdGlvbiAtIFRoZSBhbm5vdGF0aW9uIGVsZW1lbnQgdG8gc2VhcmNoIHdpdGhpblxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlIC0gVGhlIGNvbGxlY3Rpb24gc3R5bGUgKCdjYXJkcycgb3IgJ2xpc3QnKSAtIGN1cnJlbnRseSB1bnVzZWQgYXMgYm90aCB1c2Ugc2FtZSBzZWxlY3RvclxuICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9IC0gVGhlIGhpZ2hsaWdodCBjb250YWluZXIgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEhpZ2hsaWdodFRleHRDb250YWluZXIoYW5ub3RhdGlvbiwgc3R5bGUpIHtcbiAgLy8gQm90aCBjYXJkIGFuZCBsaXN0IHZpZXdzIHVzZSAudXNlci1oaWdobGlnaHQgYXMgdGhlIGVsZW1lbnQgd2l0aCBiYWNrZ3JvdW5kLWNvbG9yXG4gIHJldHVybi
39Bhbm5vdGF0aW9uLnF1ZXJ5U2VsZWN0b3IoJy51c2VyLWhpZ2hsaWdodCcpO1xufVxuXG4vKipcbiAqIFNldCB0aGUgJ29wdGlvbnMnIG9iamVjdCB0aGF0IG1hbmFnZXMgdGhlIHN0YXRlIG9mIGFubm90YXRpb24gY29tcG9uZW50cyAoZmlsdGVycywgdmlldywgc29ydCwgZXRjLikuXG4gKiBpZiBjbGVhckZpbHRlcnMgaXMgc2V0LCBpdCBzZXRzIHRoZSBmaWx0ZXJzIG9iamVjdHMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIHNldE9wdGlvblZhbHVlcyhjbGVhckZpbHRlcnMgPSBmYWxzZSkge1xuICAvLyBpbml0aWFsaXplIHdpdGggY3VycmVudCBvcHRpb25zXG4gIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gZ2V0Q3VycmVudE9wdGlvbnMoKTtcbiAgbGV0IG9wdGlvbnMgPSBzdHJ1Y3R1cmVkQ2xvbmUoY3VycmVudE9wdGlvbnMpO1xuXG4gIC8vIGVuc3VyZSBub3QgZW1wdHkgb2JqZWN0LiBCdWlsZCB0aGUgZGVmYXVsdCBza2VsZXRvbiBub24tcmVjdXJzaXZlbHkg4oCUXG4gIC8vIGNhbGxpbmcgc2V0T3B0aW9uVmFsdWVzKHRydWUpIGhlcmUgcmUtZW50ZXJlZCB0aGlzIHNhbWUgZW1wdHktY2hlY2sgYmVmb3JlXG4gIC8vIHJlYWNoaW5nIGl0cyBvd24gYmFzZSBjYXNlIGFuZCBzdGFjay1vdmVyZmxvd2VkIChcInRvbyBtdWNoIHJlY3Vyc2lvblwiKVxuICAvLyB3aGVuZXZlciBnZXRDdXJyZW50T3B0aW9ucygpIHJldHVybmVkIHt9IChlLmcuIGFuIHVucGFyc2VhYmxlIGRhdGFzZXQpLiAoIzMwNzYpXG4gIGlmKE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucygpO1xuICB9XG5cbiAgaWYgKGNsZWFyRmlsdGVycykge1xuICAgIG9wdGlvbnMuZmlsdGVycyA9IGRlZmF1bHRGaWx0ZXJzKCk7XG4gICAgb3B0aW9ucy5maWx0ZXJzLmNsZWFyID0gdHJ1ZTtcblxuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgLy8gMC4gZXZlbnQgaGFuZGxlciBmb3IgZmlsdGVyZWQgbGFiZWwgJ3gnIGJ1dHRvblxuICBjb25zdCBmaWx0ZXJlZENsZWFyQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RvdGFsIGknKTtcbiAgaWYoZmlsdGVyZWRDbGVhckJ0bikge1xuICAgIGZpbHRlcmVkQ2xlYXJCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBjbGVhckZpbHRlcnNIYW5kbGVyIGFscmVhZHkgaGFuZGxlcyBzcGlubmVyIGFuZCBvdmVybGF5XG4gICAgICBhd2FpdCBjbGVhckZpbHRlcnNIYW5kbGVyKGV2ZW50LCAnYWxsJyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAxLiB1cGRhdGUgY29sbGVjdGlvbiBzdHlsZVxuICBjb25zdCB2aWV3U3R5bGVFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXctc3R5bGUnKTtcblxuICAvLyBpZiB0aGUgdXNlciBpcyBjaGFuZ2luZyB0aGUgY29sbGVjdGlvbiBzdHlsZVxuICBpZiAodmlld1N0eWxlRWxlbSkge1xuICAgIGNvbnN0IHZpZXdFbGVtID0gdmlld1N0eWxlRWxlbS5xdWVyeVNlbGVjdG9yKCcuaWNvbi1vbicpO1xuICAgIGlmKHZpZXdFbGVtKSB7XG4gICAgICBjb25zdCB7IGRhdGFzZXQ6IHsgdmFsdWUgfSB9ID0gdmlld0VsZW07XG4gICAgIG9wdGlvbnMuY29sbGVjdGlvbi5zdHlsZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIDIuIHVwZGF0ZSBzb3J0IG9wdGlvblxuICBjb25zdCBzb3J0RWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzb3J0LWJ5Jyk7XG4gIGlmIChzb3J0RWxlbSkge1xuICAgIG9wdGlvbnMuc29ydCA9IHNvcnRFbGVtLnZhbHVlO1xuICAgIG9wdGlvbnMuY29sbGVjdGlvbi5zb3J0ID0gc29ydEVsZW0udmFsdWU7XG4gIH1cblxuICAvLyAzLiB1cGRhdGUgY29sb3IgZmlsdGVyIG9wdGlvbnNcbiAgY29uc3QgY29sb3JGaWx0ZXJFbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5maWx0ZXItY29sb3JzIGRpdiBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0nKTtcbiAgaWYgKGNvbG9yRmlsdGVyRWxlbXMgJiYgY29sb3JGaWx0ZXJFbGVtcy5sZW5ndGggPiAwKSB7XG4gICAgb3B0aW9ucy5maWx0ZXJzLmNvbG9ycyA9IFtdO1xuICAgIGNvbG9yRmlsdGVyRWxlbXMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgaWYgKGNsZWFyRmlsdGVycykge1xuICAgICAgICBlbGVtLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlbGVtLmNoZWNrZWQpIHtcbiAgICAgICAgICBvcHRpb25zLmZpbHRlcnMuY29sb3JzLnB1c2goZWxlbS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIDQuIHVwZGF0ZSB0ZXh0IGZpbHRlcnNcbiAgbGV0IHRleHRTZW5zaXRpdml0eSwgdGV4dEdyb3VwaW5nO1xuICBjb25zdCB0ZXh0RmlsdGVyRWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWx0ZXItYnktdGV4dCcpO1xuICBjb25zdCB0ZXh0R3JvdXBpbmdFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiN3b3JkLWdyb3VwaW5nXCIpO1xuICBjb25zdCB0ZXh0U2Vuc2l0aXZpdHlFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjYXNlLXNlbnNpdGl2aXR5XCIpO1xuICBjb25zdCBleGNsdWRlTm9pc2VXb3Jkc0VsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2lnbm9yZS1jb21tb24td29yZHNcIik7XG4gIGlmICh0ZXh0U2Vuc2l0aXZpdHlFbGVtKSB7XG4gICAgdGV4dFNlbnNpdGl2aXR5ID0gdGV4dFNlbnNpdGl2aXR5RWxlbS5jaGVja2VkID8gJ3NlbnNpdGl2ZScgOiAnaW5zZW5zaXRpdmUnXG4gIH1cblxuICBpZiAoY2xlYXJGaWx0ZXJzKSB7XG4gICAgaWYodGV4dEZpbHRlckVsZW0pIHtcbiAgICAgIHRleHRGaWx0ZXJFbGVtLnZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaWYodGV4dFNlbnNpdGl2aXR5RWxlbSkge1xuICAgICAgdGV4dFNlbnNpdGl2aXR5RWxlbS5jaGVja2VkID0gZmFsc2U7IC8vIGRlZmF1bHQgdG8gJ2luc2Vuc2l0aXZlJ1xuICAgIH1cblxuICAgIGlmKHRleHRHcm91cGluZ0VsZW0pIHtcbiAgICAgIHRleHRHcm91cGluZ0VsZW0uY2hlY2tlZCA9IHRydWU7IC8vIGRlZmF1bHQgdG8gJ0FsbCdcbiAgICB9XG5cbiAgICBpZihleGNsdWRlTm9pc2VXb3Jkc0VsZW0pIHtcbiAgICAgIGV4Y2x1ZGVOb2lzZVdvcmRzRWxlbS5jaGVja2VkID0gZmFsc2U7IC8vIGRlZmF1bHQgdG8gaW5jbHVkZSBjb21tb24gd29yZHNcbiAgICB9XG4gI
39H0gZWxzZSB7XG4gICAgaWYgKHRleHRTZW5zaXRpdml0eSkge1xuICAgICAgb3B0aW9ucy5maWx0ZXJzLnRleHQuc2Vuc2l0aXZpdHkgPSB0ZXh0U2Vuc2l0aXZpdHk7XG4gICAgfVxuXG4gICAgaWYgKHRleHRHcm91cGluZ0VsZW0pIHtcbiAgICAgIGxldCB7b24sIG9mZn0gPSB0ZXh0R3JvdXBpbmdFbGVtLmRhdGFzZXQ7XG4gICAgICB0ZXh0R3JvdXBpbmcgPSB0ZXh0R3JvdXBpbmdFbGVtLmNoZWNrZWQgPyBvbiA6IG9mZjtcbiAgICAgIG9wdGlvbnMuZmlsdGVycy50ZXh0Lmdyb3VwaW5nID0gdGV4dEdyb3VwaW5nO1xuICAgIH1cblxuICAgIGlmICh0ZXh0RmlsdGVyRWxlbSkge1xuICAgICAgb3B0aW9ucy5maWx0ZXJzLnRleHQud29yZHMgPSB0ZXh0RmlsdGVyRWxlbS52YWx1ZS50cmltKCk7XG4gICAgfVxuXG4gICAgaWYgKGV4Y2x1ZGVOb2lzZVdvcmRzRWxlbSkge1xuICAgICAgb3B0aW9ucy5maWx0ZXJzLnRleHQuZXhjbHVkZU5vaXNlV29yZHMgPSBleGNsdWRlTm9pc2VXb3Jkc0VsZW0uY2hlY2tlZDtcbiAgICB9XG4gIH1cblxuICAvLyA0Yi4gdXBkYXRlIG5vdGUgZmlsdGVycyAoIzQ0OTEpXG4gIC8vIFRoZSBzZWN0aW9uIGlzIHNlcnZlci1nYXRlZCBiZWhpbmQgRkVBVFVSRV9OT1RFUywgc28gYSBub24tYWxsb3dsaXN0ZWQgdXNlclxuICAvLyBoYXMgbm9uZSBvZiB0aGVzZSBjb250cm9scy4gTm90aGluZyBpcyB3cml0dGVuIHRvIG9wdGlvbnMuZmlsdGVycy5ub3RlXG4gIC8vIHVubGVzcyBhdCBsZWFzdCBvbmUgb2YgdGhlbSBleGlzdHMsIHdoaWNoIGtlZXBzIGEgcHJlLW5vdGUgc3RvcmVkIG9wdGlvbnNcbiAgLy8gYXJyYXkgYnl0ZS1pZGVudGljYWwgYW5kIGxlYXZlcyB0aGUgc2VydmVyIGRlZmF1bHRzIGluIGNoYXJnZS5cbiAgY29uc3Qgbm90ZUZpbHRlckVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmlsdGVyLWJ5LW5vdGUnKTtcbiAgY29uc3Qgbm90ZUdyb3VwaW5nRWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub3RlLXdvcmQtZ3JvdXBpbmcnKTtcbiAgY29uc3Qgbm90ZVNlbnNpdGl2aXR5RWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub3RlLWNhc2Utc2Vuc2l0aXZpdHknKTtcbiAgY29uc3Qgbm90ZUV4Y2x1ZGVOb2lzZVdvcmRzRWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub3RlLWlnbm9yZS1jb21tb24td29yZHMnKTtcbiAgY29uc3Qgbm90ZVByZXNlbmNlRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwibm90ZS1wcmVzZW5jZVwiXScpO1xuXG4gIGlmIChub3RlRmlsdGVyRWxlbSB8fCBub3RlR3JvdXBpbmdFbGVtIHx8IG5vdGVTZW5zaXRpdml0eUVsZW0gfHwgbm90ZUV4Y2x1ZGVOb2lzZVdvcmRzRWxlbVxuICAgICAgfHwgbm90ZVByZXNlbmNlRWxlbXMubGVuZ3RoID4gMCkge1xuICAgIG9wdGlvbnMuZmlsdGVycy5ub3RlID0geyAuLi5kZWZhdWx0RmlsdGVycygpLm5vdGUsIC4uLihvcHRpb25zLmZpbHRlcnMubm90ZSA/PyB7fSkgfTtcblxuICAgIGlmIChub3RlU2Vuc2l0aXZpdHlFbGVtKSB7XG4gICAgICBvcHRpb25zLmZpbHRlcnMubm90ZS5zZW5zaXRpdml0eSA9IG5vdGVTZW5zaXRpdml0eUVsZW0uY2hlY2tlZCA/ICdzZW5zaXRpdmUnIDogJ2luc2Vuc2l0aXZlJztcbiAgICB9XG5cbiAgICBpZiAobm90ZUdyb3VwaW5nRWxlbSkge1xuICAgICAgY29uc3QgeyBvbiwgb2ZmIH0gPSBub3RlR3JvdXBpbmdFbGVtLmRhdGFzZXQ7XG4gICAgICBvcHRpb25zLmZpbHRlcnMubm90ZS5ncm91cGluZyA9IG5vdGVHcm91cGluZ0VsZW0uY2hlY2tlZCA/IG9uIDogb2ZmO1xuICAgIH1cblxuICAgIGlmIChub3RlRmlsdGVyRWxlbSkge1xuICAgICAgb3B0aW9ucy5maWx0ZXJzLm5vdGUud29yZHMgPSBub3RlRmlsdGVyRWxlbS52YWx1ZS50cmltKCk7XG4gICAgfVxuXG4gICAgaWYgKG5vdGVFeGNsdWRlTm9pc2VXb3Jkc0VsZW0pIHtcbiAgICAgIG9wdGlvbnMuZmlsdGVycy5ub3RlLmV4Y2x1ZGVOb2lzZVdvcmRzID0gbm90ZUV4Y2x1ZGVOb2lzZVdvcmRzRWxlbS5jaGVja2VkO1xuICAgIH1cblxuICAgIC8vIE5vdGUgcHJlc2VuY2U6ICcnIChubyBwcmVmZXJlbmNlKSwgJ3dpdGgnLCAnd2l0aG91dCcuIFRoZSBjb250cm9sIGlzIGFcbiAgICAvLyBwYWlyIG9mIHJhZGlvcyBpbiBpdHMgb3duIGZpbHRlciBjYXJkLCBzbyBuby1wcmVmZXJlbmNlIGlzIFwibmVpdGhlclxuICAgIC8vIGNoZWNrZWRcIiByYXRoZXIgdGhhbiBhIHRoaXJkIG9wdGlvbiB0aGUgdXNlciBoYXMgdG8gcGljayAoIzQ3NzcpLlxuICAgIC8vIEFueXRoaW5nIGVsc2UgaXMgc2VudCBhcyB0eXBlZCBhbmQgcmVkdWNlZCB0byAnYW55JyBieVxuICAgIC8vIFBhZ2luYXRpb25PcHRpb25zOjpnZXROb3RlSGFzRmlsdGVyKCksIHdoaWNoIGlzIHRoZSBvbmUgcGxhY2UgdGhlIHZhbHVlXG4gICAgLy8gaXMgdmFsaWRhdGVkLiAoIzQ0OTIpXG4gICAgaWYgKG5vdGVQcmVzZW5jZUVsZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNob3NlbiA9IEFycmF5LmZyb20obm90ZVByZXNlbmNlRWxlbXMpLmZpbmQoZWxlbSA9PiBlbGVtLmNoZWNrZWQpO1xuICAgICAgb3B0aW9ucy5maWx0ZXJzLm5vdGUuaGFzID0gY2hvc2VuID8gY2hvc2VuLnZhbHVlIDogJyc7XG4gICAgfVxuXG4gICAgLy8gQSBub3RlLXRleHQgcXVlcnkgY2Fubm90IGFwcGx5IHRvIG1hcmtzIHRoYXQgaGF2ZSBubyBub3RlLCBzbyBcIm5vIG5vdGVcIlxuICAgIC8vIHN1cHByZXNzZXMgdGhlIHR5cGVkIHdvcmRzIGluc3RlYWQgb2YgY29tYmluaW5nIHdpdGggdGhlbSBpbnRvIGEgcXVlcnlcbiAgICAvLyB0aGF0IGNhbiBvbmx5IHJldHVybiBub3RoaW5nIOKAlCB3aGljaCBpcyB3aGF0IHByb2R1Y2VkIGEgc2lsZW50XG4gICAgLy8gXCJUb3RhbDogMCBvZiA0MDFcIiBpbiBRQy4gVGhlIHRleHQgc3RheXMgaW4gdGhlIGRpc2FibGVkIGlucHV0IHNvIGl0IGNvbWVzXG4gICAgLy8gYmFjayB3aGVuIHRoZSBwcmVzZW5jZSBzZWxlY3Rpb24gY2hhbmdlcy4gKCM0Nzc3KVxuICAgIGlmIChvcHRpb25zLmZpbHRlcnMubm90ZS5oYXMgPT09IE5PVEVfUFJFU0VOQ0VfV0lUSE9VVCkge1xuICAgICAgb3B0aW9ucy5maWx0ZXJzLm5vdGUud29yZHMgPSAnJztcbiAgICB9XG4gI
39H1cblxuICAvLyA1LiB1cGRhdGUgdGFncyBmaWx0ZXJcbiAgaWYoY2xlYXJGaWx0ZXJzKSB7XG4gICAgY29uc3QgdGFnR3JvdXBpbmdFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3RhZy1ncm91cGluZycpO1xuICAgIGlmICh0YWdHcm91cGluZ0VsZW0pIHtcbiAgICAgIHRhZ0dyb3VwaW5nRWxlbS5jaGVja2VkID0gZmFsc2U7IC8vIGRlZmF1bHQgdG8gJ2FueSdcbiAgICB9XG4gIH1cblxuICBvcHRpb25zLmZpbHRlcnMudGFncy5pZHMgPSBbXTtcblxuICBjb25zdCBzZWxlY3RlZFRhZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQtdGFncyAudGFnJyk7XG4gIGlmIChzZWxlY3RlZFRhZ3MgJiYgc2VsZWN0ZWRUYWdzLmxlbmd0aCA+IDApIHtcbiAgICBvcHRpb25zLmZpbHRlcnMudGFncy5pZHMgPSBbXTtcblxuICAgIHNlbGVjdGVkVGFncy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICBpZighb3B0aW9ucy5maWx0ZXJzLnRhZ3MuaWRzLmluY2x1ZGVzKGVsZW0uZGF0YXNldC5pZCkpIHtcbiAgICAgICAgb3B0aW9ucy5maWx0ZXJzLnRhZ3MuaWRzLnB1c2goZWxlbS5kYXRhc2V0LmlkKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy8gdGFncyBncm91cGluZyAtIGRlZmF1bHQgdG8gJ2FueScgd2hlbiB0b2dnbGUgZG9lc24ndCBleGlzdCAoZmVhdHVyZSBvZmYpXG4gIGNvbnN0IHRhZ0dyb3VwaW5nRWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0YWctZ3JvdXBpbmcnKTtcbiAgaWYgKHRhZ0dyb3VwaW5nRWxlbSkge1xuICAgIGNvbnN0IHsgb24sIG9mZiB9ID0gdGFnR3JvdXBpbmdFbGVtLmRhdGFzZXQ7XG4gICAgb3B0aW9ucy5maWx0ZXJzLnRhZ3MuZ3JvdXBpbmcgPSB0YWdHcm91cGluZ0VsZW0uY2hlY2tlZCA/IG9uIDogb2ZmO1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMuZmlsdGVycy50YWdzLmdyb3VwaW5nID0gJ2FueSc7XG4gIH1cblxuICAvLyA2LiB1cGRhdGUgaXRlbXNQZXJQYWdlXG4gIGNvbnN0IHNob3dFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLml0ZW1zLXBlci1wYWdlJyk7XG4gIGlmIChzaG93RWxlbSkge1xuICAgIG9wdGlvbnMuY29sbGVjdGlvbi5pdGVtc1BlclBhZ2UgPSBwYXJzZUludChzaG93RWxlbS52YWx1ZSk7XG4gIH1cblxuICAvLyA3LiB1cGRhdGUgc29ydCBieVxuICBpZiAoc29ydEVsZW0pIHtcbiAgICBvcHRpb25zLnNvcnQgPSBzb3J0RWxlbS52YWx1ZTtcbiAgICBvcHRpb25zLmNvbGxlY3Rpb24uc29ydCA9IHNvcnRFbGVtLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogQWRkIHRoZSBldmVudCBoYW5kbGVycyBmb3IgdGhlIEFubm90YXRpb25zIHBhZ2UuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFkZEFubm90YXRpb25QYWdlRXZlbnRIYW5kbGVycygpIHtcbiAgY29uc3QgdGV4dEZpbHRlckJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZmlsdGVyLXRleHQgYnV0dG9uXCIpO1xuICBjb25zdCBzb3J0RWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzb3J0LWJ5Jyk7XG4gIGNvbnN0IGNvbG9yRmlsdGVyRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmZpbHRlci1jb2xvcnMgZGl2IGlucHV0W3R5cGU9XFwnY2hlY2tib3hcXCddXCIpO1xuICBjb25zdCB0ZXh0RmlsdGVyRWxlbVNlbGVjdG9yID0gJy5maWx0ZXItdGV4dCBpbnB1dFt0eXBlPVwidGV4dFwiXSc7IC8vIHVzZWQgYmVsb3cgZm9yIHNwaW5uZXIgb3B0aW9ucyBhcyB3ZWxsXG5cbiAgY29uc3QgdGV4dEZpbHRlckVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRleHRGaWx0ZXJFbGVtU2VsZWN0b3IpO1xuICBjb25zdCB2aWV3U3R5bGVFbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN2aWV3LXN0eWxlIGEnKTtcblxuICAvLyAwLiBMb2FkIHVzZXIgdGFncyBpbnRvIHNlc3Npb25TdG9yYWdlIGZvciBmaWx0ZXIgZnVuY3Rpb25hbGl0eVxuICBhd2FpdCBmZXRjaFVzZXJUYWdzKCk7XG5cbiAgLy8gMS4gQ29sbGVjdGlvbiBzdHlsZSBjbGljayBoYW5kbGVyXG4gIHZpZXdTdHlsZUVsZW1zLmZvckVhY2goKHN0eWxlRWxlbWVudCkgPT4ge1xuICAgIHN0eWxlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGV2ZW50O1xuICAgICAgY29uc3QgbGlzdEl0ZW1BbmNob3IgPSB0YXJnZXQuY2xvc2VzdCgnYScpO1xuXG4gICAgICAvLyBJZ25vcmUgY2xpY2sgb24gdGhlIGFjdGl2ZSB2aWV3IHN0eWxlIGljb25cbiAgICAgIGlmIChsaXN0SXRlbUFuY2hvci5jbGFzc0xpc3QuY29udGFpbnMoJ2ljb24tb24nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0NvbGxlY3Rpb25TdHlsZSA9IGxpc3RJdGVtQW5jaG9yLmRhdGFzZXQudmFsdWU7XG5cbiAgICAgIC8vIGdldCBjdXJyZW50IHZhbHVlc1xuICAgICAgbGV0IGFubm90YXRpb25zV3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhZ2luYXRlZC1jb2xsZWN0aW9uXScpO1xuICAgICAgbGV0IGN1cnJlbnRPcHRpb25zID0gSlNPTi5wYXJzZShhbm5vdGF0aW9uc1dyYXBwZXIuZGF0YXNldC5vcHRpb25zKTtcblxuICAgICAgLy8gaWYgY2hhbmdpbmcgQ29sbGVjdGlvbiBzdHlsZVxuICAgICAgaWYgKGN1cnJlbnRPcHRpb25zLmNvbGxlY3Rpb24uc3R5bGUgIT09IG5ld0NvbGxlY3Rpb25TdHlsZSkge1xuICAgICAgICAvLyAxLiBzd2FwIHN0eWxlIGVsZW1lbnQgdmlzaWJpbGl0eVxuICAgICAgICBsZXQgYWN0aXZlRWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWV3LXN0eWxlIGEuaWNvbi1vbicpO1xuICAgICAgICBsZXQgZGlzYWJsZWRFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXctc3R5bGUgYS5pY29uLW9mZicpO1xuXG4gICAgICAgIGFjdGl2ZUVsZW0uY2xhc3NMaXN0LnJlcGxhY2UoJ2ljb24tb24nLCAnaWNvbi1vZmYnKTtcbiAgICAgICAgZGlzYWJsZWRFbGVtLmNsYXNzTGlzdC5yZXBsYWNlKCdpY29uLW9mZicsICdpY29uLW9uJyk7XG5cbiAgICAgICAgLy8gMi4gc2V0IG9wdGlvbnNcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBzZXRPcHRpb25WYWx1ZXMoKTtcblxuICAgICAgICBvcHRpb25zLnNwaW5uZXIgPSB7XG4gICAgICAgICAgbmFtZTogJ2NvbGxlY3Rpb24tc3R5bGUnLFxuICAgICAgICAgI
39HRhcmdldFNlbGVjdG9yOiAnI3ZpZXctc3R5bGUnLFxuICAgICAgICAgIGluc2VydFBvc2l0aW9uOiAnYWZ0ZXJiZWdpbicsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gMy4gYWRkIG92ZXJsYXkgdG8gY29sbGVjdGlvbiBjb250YWluZXIgd2hpbGUgdXBkYXRpbmcgKG5vIHNwaW5uZXIsIGp1c3QgZGltKVxuICAgICAgICAvLyBUYXJnZXQgdGhlIC5jZWxsIHRoYXQgd3JhcHMgdGhlIGNvbGxlY3Rpb246IGl0IHN1cnZpdmVzIHRoZVxuICAgICAgICAvLyB1cGRhdGVDb2xsZWN0aW9uIHJlcGxhY2VXaXRoIGFuZCBpcyBhIHBsYWluIGJsb2NrIGJveCAoaW5zaWRlIHRoZVxuICAgICAgICAvLyBncmlkLXggZ3V0dGVycyksIHNvIHRoZSBvdmVybGF5IGZpbGxzIHRoZSBmdWxsIGNvbGxlY3Rpb24gYXJlYVxuICAgICAgICAvLyBjb3JyZWN0bHkgaW4gYm90aCBsaXN0IGFuZCBncmlkIChjYXJkcykgbGF5b3V0cy4gKCMyODU3KVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY29sbGVjdGlvbl0gPiAuY2VsbCcpO1xuICAgICAgICBpbnNlcnRPdmVybGF5T25FbGVtZW50KGNvbGxlY3Rpb25Db250YWluZXIsICdjb2xsZWN0aW9uLXZpZXctb3ZlcmxheScsIGZhbHNlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIDQuIHVwZGF0ZSBjb2xsZWN0aW9uXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHVwZGF0ZUNvbGxlY3Rpb24ob3B0aW9ucyk7XG4gICAgICAgICAgZW1waGFzaXplRmlsdGVyZWRUYWdzT25Bbm5vdGF0aW9ucygpO1xuICAgICAgICAgIG1hbmFnZUZpbHRlckFjY29yZGlvbnMoKTtcblxuICAgICAgICAgIC8vIDUuIG1hbmFnZSBsaXN0IGljb25zXG4gICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICBhY3RpdmVFbGVtLmNsYXNzTGlzdC5yZXBsYWNlKCdpY29uLW9uJywgJ2ljb24tb2ZmJyk7XG4gICAgICAgICAgICBkaXNhYmxlZEVsZW0uY2xhc3NMaXN0LnJlcGxhY2UoJ2ljb24tb2ZmJywgJ2ljb24tb24nKTtcblxuICAgICAgICAgICAgLy8gdXBkYXRlQ29sbGVjdGlvbigpIGFscmVhZHkgd3JvdGUgdGhlIHNlcnZlcidzIGNhbm9uaWNhbCBvcHRpb25zIG9udG8gdGhlXG4gICAgICAgICAgICAvLyBmcmVzaGx5IHJlbmRlcmVkIGNvbGxlY3Rpb24gbm9kZSDigJQgZG9uJ3QgY2xvYmJlciBpdCB3aXRoIHByZS1zd2l0Y2hcbiAgICAgICAgICAgIC8vIGNsaWVudCBzdGF0ZSwgd2hpY2ggbGVmdCBzdGFsZSBkYXRhLW9wdGlvbnMgYW5kIGJyb2tlIHRoZSBmaXJzdCBjb2xvclxuICAgICAgICAgICAgLy8gY2hhbmdlIGFmdGVyIGEgdmlldyBzd2l0Y2ggKCMyOTEwKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZXZlcnQgaWNvbnMgYW5kIGRhdGFzZXQgdmFsdWVzXG4gICAgICAgICAgICBhY3RpdmVFbGVtLmNsYXNzTGlzdC5yZXBsYWNlKCdpY29uLW9mZicsICdpY29uLW9uJyk7XG4gICAgICAgICAgICBkaXNhYmxlZEVsZW0uY2xhc3NMaXN0LnJlcGxhY2UoJ2ljb24tb24nLCAnaWNvbi1vZmYnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVtb3ZlT3ZlcmxheU9uRWxlbWVudCgnY29sbGVjdGlvbi12aWV3LW92ZXJsYXknKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvLyAyLiAnU29ydCBCeScgc2VsZWN0aW9uIGhhbmRsZXJzXG4gIGlmIChzb3J0RWxlbSkge1xuICAgIHNvcnRFbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGRpc2FibGVGaWx0ZXJzKCk7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHNldE9wdGlvblZhbHVlcygpO1xuICAgICAgICBzZXRDb2xsZWN0aW9uT3B0aW9ucyhvcHRpb25zLCBvcHRpb25zLmNvbGxlY3Rpb24uc3R5bGUsIG9wdGlvbnMucGFnaW5hdG9yTmFtZSlcbiAgICAgICAgYXdhaXQgdXBkYXRlQ29sbGVjdGlvbihvcHRpb25zKTtcbiAgICAgICAgbWFuYWdlRmlsdGVyQWNjb3JkaW9ucygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5hYmxlRmlsdGVycygpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyAzLiBDb2xvciBmaWx0ZXJzIGNsaWNrIGhhbmRsZXJcbiAgaWYgKGNvbG9yRmlsdGVyRWxlbXMpIHtcbiAgICBjb2xvckZpbHRlckVsZW1zLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgZGlzYWJsZUZpbHRlcnMoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgb3B0aW9ucyA9IHNldE9wdGlvblZhbHVlcygpO1xuICAgICAgICAgIGF3YWl0IHVwZGF0ZUNvbGxlY3Rpb24ob3B0aW9ucyk7XG4gICAgICAgICAgbWFuYWdlRmlsdGVyQWNjb3JkaW9ucygpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGVuYWJsZUZpbHRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA0LiB0ZXh0IGZpbHRlciBjbGljayBoYW5kbGVyXG4gIGlmICh0ZXh0RmlsdGVyRWxlbSkge1xuICAgIC8vIGNsaWNrIGhhbmRsZXIgb24gZmlsdGVyIGJ1dHRvblxuICAgIHRleHRGaWx0ZXJCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICBkaXNhYmxlRmlsdGVycygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBzZXRPcHRpb25WYWx1ZXMoKTtcbiAgICAgICAgYXdhaXQgdXBkYXRlQ29sbGVjdGlvbihvcHRpb25zKTtcbiAgICAgICAgbWFuYWdlRmlsdGVyQWNjb3JkaW9ucygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5hYmxlRmlsdGVycygpO1xuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyA1LiAnRW50ZXInIGtleSBoYW5kbGVyIG9uIHRleHQgZmlsdGVyIGlucHV0IGZpZWxkXG4gICAgdGV4dEZpbHRlckVsZW0uYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgZGlzYWJsZUZpbHRlcnMoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgb3B0aW9ucyA9IHNldE9wdGlvblZhbHVlcygpO1xuICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcnMudGV4dC53b3Jkcykge1xuICAgICAgICAgICAgYXdhaXQgdXBkYXRlQ29sbGVjdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgIG1hbmFnZUZpbHRlckFjY29yZGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgI
39H0gZmluYWxseSB7XG4gICAgICAgICAgZW5hYmxlRmlsdGVycygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIDYuIHRleHQgZmlsdGVyIGNhc2Ugc2Vuc2l0aXZpdHlcbiAgICB0ZXh0RmlsdGVyU2Vuc2l0aXZpdHlDaGFuZ2VIYW5kbGVyKCk7XG5cbiAgICAvLyA3LiBUZXh0IGZpbHRlciBncm91cGluZ1xuICAgIHRleHRGaWx0ZXJHcm91cGluZ0NsaWNrSGFuZGxlcigpO1xuXG4gICAgLy8gN2IuIFRleHQgZmlsdGVyIFwiSWdub3JlIGNvbW1vbiB3b3Jkc1wiIHRvZ2dsZVxuICAgIHRleHRGaWx0ZXJFeGNsdWRlTm9pc2VXb3Jkc0NoYW5nZUhhbmRsZXIoKTtcbiAgfVxuXG4gIC8vIDdjLiBOb3RlIGZpbHRlciBoYW5kbGVycyAoIzQ0OTEpIOKAlCBldmVyeSBvbmUgaXMgaW50ZXJuYWxseSBndWFyZGVkLCBzbyB0aGlzXG4gIC8vIGlzIGEgbm8tb3AgZm9yIGEgdXNlciB3aG9zZSBwYWdlIGNhcnJpZXMgbm8gbm90ZSBzZWN0aW9uLlxuICBhZGROb3RlRmlsdGVySGFuZGxlcnMoKTtcblxuICAvLyA4LiBhZGQgY2xpY2sgaGFuZGxlcnMgdG8gdGFncyBpbiBmaWx0ZXJcbiAgYWRkSGFuZGxlcnNUb1RhZ3NJbkZpbHRlcigpO1xuXG4gIC8vIDkuIENsZWFyIGZpbHRlcnMgYnV0dG9uXG4gIGF3YWl0IGFkZENsZWFyRmlsdGVyc0hhbmRsZXJzKCk7XG5cbiAgLy8gMTAuIEFubm90YXRpb24gYWN0aW9uIGhhbmRsZXJzXG4gIGF3YWl0IGFkZEFubm90YXRpb25zQWN0aW9uSGFuZGxlcnMoKTtcblxuICAvLyAxMS4gVGFncyBjb2xsZWN0aW9ucyBmdWxsIHZpZXdcbiAgYWRkTWFya1RhZ3NGdWxsVmlld0hhbmRsZXIoKTtcblxuICAvLyAxMi4gVGFncyBmaWx0ZXIgaW5wdXQgdGV4dCBoYW5kbGVyXG4gIGFkZEtleVVwVGV4dElucHV0T25UYWdzRmlsdGVySGFuZGxlcigpO1xuXG4gIC8vIDEzLiBmaWx0ZXIgdG9nZ2xlIGljb24gaGFuZGxlcnNcbiAgdGFnVG9nZ2xlQnV0dG9uc0NsaWNrSGFuZGxlcigpO1xuXG4gIC8vIDE0LiB0YWcgaWNvbiBvbiBlZGl0IG9wdGlvbnMgaGFuZGxlclxuICBhbm5vdGF0aW9uT3B0aW9uRGl2Q2xpY2tIYW5kbGVyKCk7XG5cbiAgLy8gMTUuIGZpbHRlciB0YWdzIHNvcnQgaGFuZGxlcnNcbiAgYWRkRmlsdGVyVGFnc1NvcnRIYW5kbGVycygpO1xuXG4gIC8vIDE2LiBHYXRlIHRhZyBtYW5hZ2VtZW50IGljb25zIGJlaGluZCBleHBlcmltZW50YWwgZmVhdHVyZVxuICBnYXRlVGFnTWFuYWdlbWVudEljb25zKCk7XG5cbiAgLy8gMTcuIEJhdGNoLWVkaXRpbmcgKGRlbGV0ZSAvIHJlY29sb3IpIGNvbnRyb2xzICgjMzA1MSlcbiAgaW5pdEJ1bGtFZGl0KCk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgYmF0Y2gtZWRpdGluZyBjb250cm9sbGVyIGZvciB0aGUgYW5ub3RhdGlvbnMgcGFnZS5cbiAqIFJldXNlcyB0aGUgZXhpc3RpbmcgbW9kaWZ5Q29sbGVjdGlvbiBwYXRoICh1cGRhdGVDb2xsZWN0aW9uKSBzbyBiYXRjaFxuICogZGVsZXRlL3JlY29sb3Igc2hhcmUgdGhlIHNpbmdsZS1pdGVtIHBlcnNpc3RlbmNlIGZsb3cuXG4gKi9cbmZ1bmN0aW9uIGluaXRCdWxrRWRpdCgpIHtcbiAgLy8gIzMxMzM6IHRoZSBkYXNoYm9hcmQgQ29udGludWUgUmVhZGluZyB0b29sYmFyIHNoYXJlcyB0aGVzZSBnZW5lcmljXG4gIC8vIHNlbGVjdG9ycy4gQmFpbCB1bmxlc3MgYW5ub3RhdGlvbiByb3dzIGFyZSBwcmVzZW50IHNvIHRoaXMgY29udHJvbGxlciBvbmx5XG4gIC8vIGV2ZXIgYmluZHMgdG8gdGhlIGFubm90YXRpb25zIHRvb2xiYXIuXG4gIGlmIChidWxrRWRpdENvbnRyb2xsZXJcbiAgICB8fCAhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1lZGl0LXRvZ2dsZV0nKVxuICAgIHx8ICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hbm5vdGF0aW9uXScpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYnVsa0VkaXRDb250cm9sbGVyID0gY3JlYXRlQnVsa0VkaXRDb250cm9sbGVyKHtcbiAgICBjb2xvcnM6IGFwcENvbG9ycygpLFxuICAgIGFwcGx5QmF0Y2g6IGFzeW5jIChwYXlsb2FkKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gc2V0T3B0aW9uVmFsdWVzKCk7XG4gICAgICBvcHRpb25zLm1vZGlmeUNvbGxlY3Rpb24gPSBwYXlsb2FkO1xuXG4gICAgICAvLyBEaW0gKyBjZW50ZXJlZCBzcGlubmVyIG92ZXIgdGhlIGNvbGxlY3Rpb24gYXJlYSwgbWF0Y2hpbmcgdGhlIGZpbHRlciAvXG4gICAgICAvLyB2aWV3LXN3aXRjaCB0cmVhdG1lbnQuIEluamVjdGluZyBhIFNwaW5uZXIgaW50byB0aGUgYnVsay1hY3Rpb24gYmFyXG4gICAgICAvLyByZW5kZXJlZCBhcyBhIGNyYW1wZWQgZGFyayBib3ggYXQgdGhlIGJhcidzIGVkZ2UgKCMzMDUxKS4gVGhlIG92ZXJsYXlcbiAgICAgIC8vIGFuY2hvcnMgdG8gdGhlIC5jZWxsIHdyYXBwaW5nIHRoZSBjb2xsZWN0aW9uLCB3aGljaCBzdXJ2aXZlcyB0aGVcbiAgICAgIC8vIHJlcGxhY2VXaXRoIGluIHVwZGF0ZUNvbGxlY3Rpb24oKS5cbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb2xsZWN0aW9uXSA+IC5jZWxsJyk7XG4gICAgICBpbnNlcnRPdmVybGF5T25FbGVtZW50KGNvbGxlY3Rpb25Db250YWluZXIsICdjb2xsZWN0aW9uLXZpZXctb3ZlcmxheScsIHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdXBkYXRlQ29sbGVjdGlvbihvcHRpb25zKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlbW92ZU92ZXJsYXlPbkVsZW1lbnQoJ2NvbGxlY3Rpb24tdmlldy1vdmVybGF5Jyk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgYnVsa0VkaXRDb250cm9sbGVyLmluaXQoKTtcbn1cblxuLyoqXG4gKiBDTGljayBldmVudCBoYW5kbGVyIG9uIGFubm90YXRpb24gb3B0aW9ucyBkaXYgdGFnIGljb25cbiAqL1xuZnVuY3Rpb24gYW5ub3RhdGlvbk9wdGlvbkRpdkNsaWNrSGFuZGxlcigpIHtcbiAgY29uc3QgYW5ub3RhdGlvbnNDb2xsZWN0aW9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2Fubm90YXRpb25zLWNvbGxlY3Rpb24gLmFubm90YXRpb24tb3B0aW9ucycpO1xuICBpZihhbm5vdGF0aW9uc0NvbGxlY3Rpb24pIHtcbiAgICBhbm5vdGF0aW9uc0NvbGxlY3Rpb24uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgdGFnSWNvbiA9IGl0ZW0ucXVlcnlTZWxlY3RvcignW2RhdGEtbmFtZT1cIm1hbmFnZS10YWdzXCJdJyk7XG4gICAgICBpZih0YWdJY29uKSB7XG4gICAgICAgI
39HRhZ0ljb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgZGlzYWJsZUZpbHRlcnMoKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc0RpdiA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuYW5ub3RhdGlvbi1vcHRpb25zJyk7XG4gICAgICAgICAgICBjb25zdCB0YWdzTWFuYWdlbWVudENvbnRyb2xzRGl2ID0gYXdhaXQgY3JlYXRlVGFnTWFuYWdlbWVudENvbnRyb2xzKGV2ZW50LCAnYW5ub3RhdGlvbnMnKTtcbiAgICAgICAgICAgIGlmKHRhZ3NNYW5hZ2VtZW50Q29udHJvbHNEaXYpIHtcbiAgICAgICAgICAgICAgb3B0aW9uc0Rpdi5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgdGFnc01hbmFnZW1lbnRDb250cm9sc0Rpdik7XG4gICAgICAgICAgICAgIG9wdGlvbnNEaXYuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgICAgICAgICAgICAvLyBfY2FsY3VsYXRlUGxhY2VtZW50T2ZEaXYodGFnc01hbmFnZW1lbnRDb250cm9sc0Rpdiwgb3B0aW9uc0Rpdik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YXNldDogeyBtYXJrSWQsIHVzZXJNYXJrUmVjb3JkSWQgfSB9ID0gb3B0aW9uc0RpdjtcbiAgICAgICAgICAgIHVwZGF0ZVRhZ01hbmFnZW1lbnRFbGVtZW50cyhtYXJrSWQsICduYW1lJywgJ2FzYycsIHVzZXJNYXJrUmVjb3JkSWQpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBlbmFibGVGaWx0ZXJzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBDaGFuZ2UgaGFuZGxlciBmb3IgdGV4dCBmaWx0ZXIgc2Vuc2l0aXZpdHkgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gdGV4dEZpbHRlclNlbnNpdGl2aXR5Q2hhbmdlSGFuZGxlcigpIHtcbiAgY29uc3QgdGV4dFNlbnNpdGl2aXR5RWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY2FzZS1zZW5zaXRpdml0eVwiKTtcbiAgdGV4dFNlbnNpdGl2aXR5RWxlbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgZGlzYWJsZUZpbHRlcnMoKTtcbiAgICB0cnkge1xuICAgICAgbGV0IG9wdGlvbnMgPSBzZXRPcHRpb25WYWx1ZXMoKTtcbiAgICAgIGlmIChvcHRpb25zLmZpbHRlcnMudGV4dC53b3Jkcy50cmltKCkpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlQ29sbGVjdGlvbihvcHRpb25zKTtcbiAgICAgICAgbWFuYWdlRmlsdGVyQWNjb3JkaW9ucygpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBlbmFibGVGaWx0ZXJzKCk7XG4gICAgfVxuICB9KVxufVxuLyoqXG4gKiBDbGljayBldmVudCBoYW5kbGVyIGZvciB0ZXh0IGZpbHRlciBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHRleHRGaWx0ZXJHcm91cGluZ0NsaWNrSGFuZGxlcigpIHtcbiAgY29uc3QgdGV4dEdyb3VwaW5nRWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjd29yZC1ncm91cGluZ1wiKTtcbiAgaWYodGV4dEdyb3VwaW5nRWxlbSkge1xuICAgIHRleHRHcm91cGluZ0VsZW0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBkaXNhYmxlRmlsdGVycygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNldE9wdGlvblZhbHVlcygpO1xuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJzLnRleHQud29yZHMudHJpbSgpKSB7XG4gICAgICAgICAgYXdhaXQgdXBkYXRlQ29sbGVjdGlvbihvcHRpb25zKTtcbiAgICAgICAgICBtYW5hZ2VGaWx0ZXJBY2NvcmRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGVuYWJsZUZpbHRlcnMoKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG4vKipcbiAqIENoYW5nZSBldmVudCBoYW5kbGVyIGZvciB0aGUgXCJJZ25vcmUgY29tbW9uIHdvcmRzXCIgdGV4dCBmaWx0ZXIgY2hlY2tib3guXG4gKiBUb2dnbGluZyBpdCByZS1ydW5zIHRoZSB0ZXh0IGZpbHRlciB0aHJvdWdoIHRoZSBub2lzZS1zdHJpcC9DT05UQUlOUyBwYXRoXG4gKiAoY2hlY2tlZCkgb3IgdGhlIGluY2x1ZGUtYWxsLXRlcm1zIExJS0UgcGF0aCAodW5jaGVja2VkKS4gKCMzMzU0KVxuICovXG5mdW5jdGlvbiB0ZXh0RmlsdGVyRXhjbHVkZU5vaXNlV29yZHNDaGFuZ2VIYW5kbGVyKCkge1xuICBjb25zdCBleGNsdWRlTm9pc2VXb3Jkc0VsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2lnbm9yZS1jb21tb24td29yZHNcIik7XG4gIGlmKGV4Y2x1ZGVOb2lzZVdvcmRzRWxlbSkge1xuICAgIGV4Y2x1ZGVOb2lzZVdvcmRzRWxlbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGRpc2FibGVGaWx0ZXJzKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gc2V0T3B0aW9uVmFsdWVzKCk7XG4gICAgICAgIGlmIChvcHRpb25zLmZpbHRlcnMudGV4dC53b3Jkcy50cmltKCkpIHtcbiAgICAgICAgICBhd2FpdCB1cGRhdGVDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgIG1hbmFnZUZpbHRlckFjY29yZGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5hYmxlRmlsdGVycygpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cbi8qKlxuICogV2lyZSB1cCB0aGUgRmlsdGVyIGJ5IG5vdGUgc2VjdGlvbjogdGhlIGZpbHRlciBidXR0b24sIHRoZSBFbnRlciBrZXkgb24gdGhlXG4gKiBpbnB1dCwgYW5kIHR
39oZSB0aHJlZSBzd2l0Y2hlcy4gKCM0NDkxKVxuICpcbiAqIFRoZSBzZWN0aW9uIGlzIHNlcnZlci1nYXRlZCBiZWhpbmQgRkVBVFVSRV9OT1RFUywgc28gZXZlcnkgbG9va3VwIGhlcmUgaXNcbiAqIG51bGwtZ3VhcmRlZCBhbmQgdGhlIHdob2xlIGZ1bmN0aW9uIGlzIGEgbm8tb3Agd2hlbiB0aGUgc2VjdGlvbiBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIGFkZE5vdGVGaWx0ZXJIYW5kbGVycygpIHtcbiAgY29uc3Qgbm90ZUZpbHRlckVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmlsdGVyLWJ5LW5vdGUnKTtcblxuICAvKipcbiAgICogUmUtcnVuIHRoZSBub3RlIGZpbHRlciBhZ2FpbnN0IHRoZSBzZXJ2ZXIgYW5kIHJlZnJlc2ggdGhlIGFjY29yZGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb25seVdoZW5GaWx0ZXJpbmcgLSBza2lwIHRoZSByb3VuZCB0cmlwIHdoZW4gbm8gbm90ZSB0ZXJtc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGVudGVyZWQsIG1hdGNoaW5nIHRoZSB0ZXh0IGZpbHRlcidzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvdXIgZm9yIGl0cyBzd2l0Y2hlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBjb25zdCBhcHBseU5vdGVGaWx0ZXIgPSBhc3luYyAob25seVdoZW5GaWx0ZXJpbmcpID0+IHtcbiAgICBkaXNhYmxlRmlsdGVycygpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gc2V0T3B0aW9uVmFsdWVzKCk7XG4gICAgICBpZiAob25seVdoZW5GaWx0ZXJpbmcgJiYgIShvcHRpb25zLmZpbHRlcnMubm90ZT8ud29yZHMgPz8gJycpLnRyaW0oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHVwZGF0ZUNvbGxlY3Rpb24ob3B0aW9ucyk7XG4gICAgICBtYW5hZ2VGaWx0ZXJBY2NvcmRpb25zKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuYWJsZUZpbHRlcnMoKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKG5vdGVGaWx0ZXJFbGVtKSB7XG4gICAgY29uc3Qgbm90ZUZpbHRlckJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXItbm90ZSBidXR0b24nKTtcbiAgICBpZiAobm90ZUZpbHRlckJ0bikge1xuICAgICAgbm90ZUZpbHRlckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgYXBwbHlOb3RlRmlsdGVyKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG5vdGVGaWx0ZXJFbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGF3YWl0IGFwcGx5Tm90ZUZpbHRlcih0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIFsnI25vdGUtY2FzZS1zZW5zaXRpdml0eScsICcjbm90ZS13b3JkLWdyb3VwaW5nJywgJyNub3RlLWlnbm9yZS1jb21tb24td29yZHMnXS5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgIGNvbnN0IHRvZ2dsZUVsZW0gP
39SBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICBpZiAoIXRvZ2dsZUVsZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2dnbGVFbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGF3YWl0IGFwcGx5Tm90ZUZpbHRlcih0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gUHJlc2VuY2UgYWx3YXlzIHJvdW5kLXRyaXBzLCB1bmxpa2UgdGhlIHN3aXRjaGVzIGFib3ZlOiBpdCBmaWx0ZXJzIG9uIGl0c1xuICAvLyBvd24gd2l0aCBubyB0ZXJtcyB0eXBlZCwgd2hpY2ggaXMgdGhlIHBvaW50IG9mIFwibm8gbm90ZVwiLiBQYXNzaW5nIGB0cnVlYFxuICAvLyBoZXJlIHdvdWxkIG1ha2UgdGhlIGNvbnRyb2wgZG8gbm90aGluZyB1bnRpbCB0aGUgdXNlciBhbHNvIHR5cGVkIGFcbiAgLy8gd29yZC4gKCM0NDkyKVxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwibm90ZS1wcmVzZW5jZVwiXScpLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFwcGx5Tm90ZUZpbHRlcihmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuLyoqXG4gKiBTaG93IG9yIGhpZGUgdGhlIFwiZXZlcnkgZW50ZXJlZCB0ZXJtIGlzIGEgY29tbW9uIHdvcmRcIiBub3RpY2UuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBzaG93IC0gdHJ1ZSB0byBzaG93IHRoZSBub3RpY2UsIGZhbHNlIHRvIGhpZGUgaXQuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZVRleHRGaWx0ZXJBbGxOb2lzZU5vdGljZShzaG93KSB7XG4gIGNvbnN0IG5vdGljZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0ZXh0LWZpbHRlci1hbGwtbm9pc2Utbm90aWNlJyk7XG4gIGlmICghbm90aWNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbm90aWNlLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gJycgOiAnbm9uZSc7XG59XG4vKipcbiAqIFNob3cgb3IgaGlkZSB0aGUgbm90ZSBmaWx0ZXIncyBcImV2ZXJ5IGVudGVyZWQgdGVybSBpcyBhIGNvbW1vbiB3b3JkXCIgbm90aWNlLlxuICpcbiAqIEEgbm8tb3AgZm9yIGEgdXNlciB3aXRob3V0IHRoZSBub3RlcyBmZWF0dXJlLCB3aG9zZSBwYWdlIGNhcnJpZXMgbm8gc3VjaFxuICogZWxlbWVudC4gKCM0NDkxKVxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdyAtIHRydWUgdG8gc2hvdyB0aGUgbm90aWNlLCBmYWxzZSB0byBoaWRlIGl0LlxuICovXG5mdW5jdGlvbiB0b2dnbGVOb3RlRmlsdGVyQWxsTm9pc2VOb3RpY2Uoc2hvdykge1xuICBjb25zdCBub3RpY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbm90ZS1maWx0ZXItYWxsLW5vaXNlLW5vdGljZScpO1xuICBpZiAoIW5vdGljZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG5vdGljZS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICcnIDogJ25vbmUnO1xufVxuLyoqXG4gKiBUYWcgZmlsdGVyIHRvZ2dsZSBidXR0b25zIGhhbmRsZXIuXG4gKi9cbmZ1bmN0aW9uIHRhZ1RvZ2dsZUJ1dHRvbnNDbGlja0hhbmRsZXIoKSB7XG4gIGNvbnN0IHRvZ2dsZUJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS10b2dnbGUtaWNvbl0nKTtcblxuICAvLyBldmVudCBoYW5kbGVycyB0byBzd2l0Y2ggdGhlIGljb24gb24gdGhlIGZpbHRlciB0b2dnbGUgZWxlbWVudHMsIHdoZW4gY2xpY2tlZFxuICB0b2dnbGVCdXR0b25zLmZvckVhY2godG9nZ2xlQnV0dG9uID0+IHtcbiAgICB0b2dnbGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHRvZ2dsZXJJY29uc0hhbmRsZXIodG9nZ2xlQnV0dG9uKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkIGNsaWNrIGhhbmRsZXJzIGZvciB0aGUgZmlsdGVyIHRhZ3Mgc29ydCBidXR0b25zLlxuICovXG5mdW5jdGlvbiBhZGRGaWx0ZXJUYWdzU29ydEhhbmRsZXJzKCkge1xuICBjb25zdCBzb3J0T3B0aW9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZpbHRlci1zb3J0XScpO1xuICBpZiAoIXNvcnRPcHRpb25zKSByZXR1cm47XG5cbiAgY29uc3Qgc29ydEJ1dHRvbnMgPSBzb3J0T3B0aW9ucy5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zb3J0LWJ5XScpO1xuICBzb3J0QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAvLyBVcGRhdGUgYWN0aXZlIHN0YXRlXG4gICAgICBzb3J0QnV0dG9ucy5mb3JFYWNoKGJ0biA9PiBidG4uY2xhc3NMaXN0LnJlbW92ZSgnc29ydGVkJykpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXNvcnQtYnldJyk7XG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZCgnc29ydGVkJyk7XG5cbiAgICAgIC8vIEdldCBzb3J0IHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IHNvcnRCeSA9IHRhcmdldC5kYXRhc2V0LnNvcnRCeTtcbiAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHNvcnRCeSA9PT0gJ25hbWUnID8gJ2FzYycgOiAnZGVzYyc7XG5cbiAgICAgIC8vIFJlLXNvcnQgYW5kIHJlLXJlbmRlciB0aGUgZmlsdGVyIHRhZ3NcbiAgICAgIHNvcnRGaWx0ZXJUYWdzKHNvcnRCeSwgZGlyZWN0aW9uKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU29ydCB0aGUgZmlsdGVyIHRhZ3MgaW4gdGhlIFwiWW91ciBUYWdzXCIgc2VjdGlvbi5cbiAqXG4gKiBAcGFyYW0gc29ydEJ5IC0gb25lIG9mOiAoJ25hbWUnLCAndGltZScsICd1c2FnZScpXG4gKiBAcGFyYW0gZGlyZWN0aW9uIC0gb25lIG9mOiAoJ2FzYycsICdkZXNjJylcbiAqL1xuZnVuY3Rpb24gc29ydEZpbHRlclRhZ3Moc29ydEJ5LCBkaXJlY3Rpb24pIHtcbiAgLy8gU3RvcmUgdGhlIHNvcnQgcHJlZmVyZW5jZXNcbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgndGFnRmlsdGVyU29ydEJ5Jywgc29ydEJ5KTtcbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgndGFnRmlsdGVyU29ydERpcmVjdGlvbicsIGRpcmVjdGlvbik7XG5cbiAgLy8gVXNlIHNoYXJlZCByZWZyZXNoIGxvZ2ljXG4gIHJlZnJlc2hBdmFpbGFibGVUYWdzTGlzdCgpO1xufVxuXG4vKipcbiAqIFJlZnJlc2ggdGhlIFwiWW91ciBUYWdzXCIg
39c2VjdGlvbiB3aXRoIHJlbWFpbmluZyBhdmFpbGFibGUgdGFncy5cbiAqIEZpbHRlcnMgb3V0IHNlbGVjdGVkIHRhZ3MgYW5kIHJlLXJlbmRlcnMgdGhlIGF2YWlsYWJsZSB0YWdzIGxpc3QuXG4gKi9cbmZ1bmN0aW9uIHJlZnJlc2hBdmFpbGFibGVUYWdzTGlzdCgpIHtcbiAgY29uc3QgZXhpc3RpbmdUYWdzV3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGlzdGluZy10YWdzW2RhdGEtYXZhaWxhYmxlLXRhZ3NdJyk7XG4gIGlmICghZXhpc3RpbmdUYWdzV3JhcHBlcikgcmV0dXJuO1xuXG4gIGNvbnN0IGFsbFRhZ3NEYXRhID0gKEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndXNlclRhZ3MnKSB8fCAnW10nKSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBzZWxlY3RlZFRhZ0VsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkLXRhZ3MgLnRhZycpO1xuXG4gIC8vIEdldCBJRHMgb2YgYWxyZWFkeSBzZWxlY3RlZCB0YWdzIHRvIGV4Y2x1ZGUgZnJvbSBhdmFpbGFibGUgdGFnc1xuICBjb25zdCBzZWxlY3RlZFRhZ0lkcyA9IEFycmF5LmZyb20oc2VsZWN0ZWRUYWdFbGVtcykubWFwKHRhZyA9PiB0YWcuZGF0YXNldC50YWdJZCB8fCB0YWcuZGF0YXNldC5pZCk7XG5cbiAgLy8gR2V0IGN1cnJlbnQgc29ydCBwcmVmZXJlbmNlIChkZWZhdWx0IHRvIG5hbWUvYXNjKVxuICBjb25zdCBzb3J0QnkgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd0YWdGaWx0ZXJTb3J0QnknKSB8fCAnbmFtZSc7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3RhZ0ZpbHRlclNvcnREaXJlY3Rpb24nKSB8fCAnYXNjJztcblxuICAvLyBGaWx0ZXIgb3V0IHNlbGVjdGVkIHRhZ3MgYW5kIHNvcnRcbiAgY29uc3Qgc29ydEZ1bmN0aW9uID0gdGFnc1NvcnRpbmdGdW5jdGlvbihzb3J0QnksIGRpcmVjdGlvbik7XG4gIGNvbnN0IGF2YWlsYWJsZVRhZ3MgPSBhbGxUYWdzRGF0YVxuICAgIC5maWx0ZXIodGFnID0+IHRhZyAmJiAhc2VsZWN0ZWRUYWdJZHMuaW5jbHVkZXModGFnLmlkKSlcbiAgICAuc29ydChzb3J0RnVuY3Rpb24pO1xuXG4gIC8vIENsZWFyIGFuZCByZS1yZW5kZXJcbiAgd2hpbGUgKGV4aXN0aW5nVGFnc1dyYXBwZXIuZmlyc3RDaGlsZCkge1xuICAgIGV4aXN0aW5nVGFnc1dyYXBwZXIucmVtb3ZlQ2hpbGQoZXhpc3RpbmdUYWdzV3JhcHBlci5maXJzdENoaWxkKTtcbiAgfVxuXG4gIGlmIChhdmFpbGFibGVUYWdzLmxlbmd0aCA+IDApIHtcbiAgICBhdmFpbGFibGVUYWdzLmZvckVhY2godGFnRGF0YSA9PiB7XG4gICAgICBjb25zdCB0YWdEaXYgPSBjcmVhdGVGaWx0ZXJUYWdFbGVtZW50KHRhZ0RhdGEpO1xuICAgICAgdGFnRGl2LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBgVXNhZ2U6ICR7dGFnRGF0YS51c2FnZSA/PyAwfWApO1xuICAgICAgdGFnRGl2LnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsIHRhZ0RhdGEuaWQpO1xuICAgICAgZXhpc3RpbmdUYWdzV3JhcHBlci5hcHBlbmRDaGlsZCh0YWdEaXYpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5vbmVTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIG5vbmVTcGFuLmNsYXNzTmFtZSA9ICduby10YWdzLW1lc3NhZ2UnO1xuICAgIG5vbmVTcGFuLmlubmVyVGV4dCA9IHQoJ25vX3RhZ3NfYXZhaWxhYmxlJykgfHwgJ05vIHRhZ3MgYXZhaWxhYmxlLic7XG4gICAgZXhpc3RpbmdUYWdzV3JhcHBlci5hcHBlbmRDaGlsZChub25lU3Bhbik7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgdGV4dCBpbnB1dCBoYW5kbGVyIGZvciBrZXlVcFxuICovXG5mdW5jdGlvbiBhZGRLZXlVcFRleHRJbnB1dE9uVGFnc0ZpbHRlckhhbmRsZXIoKSB7XG4gIGNvbnN0IHRhZ3NGaWx0ZXJJbnB1dFRleHRcbiAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWx0ZXItYnktdGFnJyk7XG4gIGlmKHRhZ3NGaWx0ZXJJbnB1dFRleHQpIHtcbiAgICB0YWdzRmlsdGVySW5wdXRUZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIGVuc3VyZSBrZXl1cCBmb3IgY29sb3Igc2VsZWN0b3IgKG9yIGFueSBvdGhlciByZWFzb24pIGRvZXNuJ3QgZmlyZVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGRpc2FibGVGaWx0ZXJzKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWdzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkLXRhZ3MgLnRhZycpO1xuICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVRhZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhpc3RpbmctdGFncyAudGFnJyk7XG5cbiAgICAgICAgICBsZXQgdGFnID0gQXJyYXkuZnJvbShhdmFpbGFibGVUYWdzKS5maW5kKCh0YWcpID0+IHtcbiAgICAgICAgICAgIGlmKHRhZy5kYXRhc2V0LnRleHQgPT09IHRhZ3NGaWx0ZXJJbnB1dFRleHQudmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhZy5kYXRhc2V0LnRhZ0lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRhZykge1xuICAgICAgICAgICAgLy8gbGV0IHsgZGF0YXNldDogeyB0YWdJZCB9IH0gPSB0YWc7XG4gICAgICAgICAgICB0YWdzRmlsdGVySW5wdXRUZXh0LnZhbHVlID0gJyc7IC8vIGNsZWFyIHRoZSBpbnB1dCBmaWVsZFxuICAgICAgICAgICAgbG9nKGBBZGQgZmlsdGVyIHRhZzogJHt0YWdzRmlsdGVySW5wdXRUZXh0LnZhbHVlfWApO1xuICAgICAgICAgICAgLy8gY29uc3QgdGFnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRhZ1tkYXRhLWlkPVwiJHt0YWdJZH1cIl1gKTtcbiAgICAgICAgICAgIHRhZy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2xpY2snKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZmlsdGVyaW5nIGJ5IHRoYXQgdGFnXG4gICAgICAgICAgICB0YWcgPSBBcnJheS5mcm9tKHNlbGVjdGVkVGFncykuZmluZCh0YWcgPT4ge1xuICAgICAgICAgICAgICBpZiAodGFnLmRhdGFzZXQudGV4dCA9PT0gdGFnc0ZpbHRlcklucHV0VGV4dC52YWx1ZSkge1xuICAgICAgICAgICAgICAgI
39HJldHVybiB0YWcuZGF0YXNldC5pZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmKHRhZykge1xuICAgICAgICAgICAgICBsb2coYEFscmVhZHkgZmlsdGVyaW5nIGJ5IHRhZzogJHt0YWdzRmlsdGVySW5wdXRUZXh0LnZhbHVlfWApO1xuICAgICAgICAgICAgICAvLyBjb25zdCB0YWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGFnW2RhdGEtaWQ9XCIke3RhZ0lkfVwiXWApO1xuICAgICAgICAgICAgICB0YWcuc3R5bGUuYm9yZGVyV2lkdGggPSAnMS4yNXJlbSc7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRhZy5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBlbmFibGVGaWx0ZXJzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZVRhZ0ZpbHRlckVsZW1lbnRzKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQWRkIGNsaWNrIGhhbmRsZXJzIHRvIGZpbHRlciB0YWcgZWxlbWVudHMgaW4gdGhlIGZpbHRlci1ieS10YWcgZmlsdGVyLlxuICovXG5mdW5jdGlvbiBhZGRIYW5kbGVyc1RvVGFnc0luRmlsdGVyKCkge1xuICBjb25zdCBleGlzdGluZ1RhZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhpc3RpbmctdGFncyAudGFnJyk7XG4gIGNvbnN0IHNlbGVjdGVkVGFncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWxlY3RlZC10YWdzIC50YWcnKTtcblxuICBpZiAoZXhpc3RpbmdUYWdzKSB7XG4gICAgZXhpc3RpbmdUYWdzLmZvckVhY2goKHRhZykgPT4ge1xuICAgICAgdGFnLmRhdGFzZXQuYWN0aW9uID0gJ2FkZCc7XG4gICAgICBpZiAoIXRhZy5kYXRhc2V0Lmxpc3RlbmVyQXR0YWNoZWQpIHtcbiAgICAgICAgdGFnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgZGlzYWJsZUZpbHRlcnMoKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZmlsdGVyVGFnQ2xpY2tIYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZW5hYmxlRmlsdGVycygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgdGFnLmRhdGFzZXQubGlzdGVuZXJBdHRhY2hlZCA9ICd0cnVlJztcbiAgICB9KTtcblxuICAgIGlmIChzZWxlY3RlZFRhZ3MpIHtcbiAgICAgIHNlbGVjdGVkVGFncy5mb3JFYWNoKCh0YWcpID0+IHtcbiAgICAgICAgdGFnLmRhdGFzZXQuYWN0aW9uID0gJ3JlbW92ZSc7XG4gICAgICAgIGlmICghdGFnLmRhdGFzZXQubGlzdGVuZXJBdHRhY2hlZCkge1xuICAgICAgICAgIHRhZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgZGlzYWJsZUZpbHRlcnMoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IGZpbHRlclRhZ0NsaWNrSGFuZGxlcihldmVudCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBlbmFibGVGaWx0ZXJzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRhZy5kYXRhc2V0Lmxpc3RlbmVyQXR0YWNoZWQgPSAndHJ1ZSc7XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRhZ0dyb3VwaW5nRWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0YWctZ3JvdXBpbmcnKTtcblxuICBpZih0YWdHcm91cGluZ0VsZW0pIHtcbiAgICB0YWdHcm91cGluZ0VsZW0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBkaXNhYmxlRmlsdGVycygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNldE9wdGlvblZhbHVlcygpO1xuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJzLnRhZ3MuaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB1cGRhdGVDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgIG1hbmFnZUZpbHRlckFjY29yZGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZW5hYmxlRmlsdGVycygpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBFbXBoYXNpemUgdGFncyBvbiBleGlzdGluZyB0YWdzIGNvbGxlY3Rpb24gdGhhdCBhcmUgY3VycmVudGx5IHNlbGVjdGVkIGZvciBmaWx0ZXJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVtcGhhc2l6ZUZpbHRlcmVkVGFnc09uQW5ub3RhdGlvbnMoKSB7XG4gIGNvbnN0IHRhZ3NGaWx0ZXJpbmdCeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNmaWx0ZXItdGFncy1leHBhbmRlZCAuc2VsZWN0ZWQtdGFncyAudGFnJyk7XG4gIGxldCBoaWdobGlnaHRUYWdDb2xsZWN0aW9ucz0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2Fubm90YXRpb25zLWNvbGxlY3Rpb24gLnNob3ctdGFncycpO1xuXG4gIGNvbnN0IGZpbHRlcmluZ0J5VGV4dENvbGxlY3Rpb24gPSBBcnJheS5mcm9tKHRhZ3NGaWx0ZXJpbmdCeSkubWFwKCh0YWcpID0+IHtcbiAgICByZXR1cm4gdGFnLmRhdGFzZXQudGV4dDtcbiAgfSk7XG5cbiAgLy8gdGhpY2tlciBib3JkZXIgdG8gZW1waGFzaXplIHRoZSB0YWdcbiAgY29uc3QgYm9yZGVyV2lkdGggPSAnMC4xNXJlbSc7XG4gIGNvbnN0IGVtcGhhc2l6aW5nQ29sb3JQZXJjZW50YWdlID0gJzYwJztcblxuICBoaWdobGlnaHRUYWdDb2xsZWN0aW9ucy5mb3JFYWNoKGNvbGxlY3Rpb24gPT4ge1xuICAgIGNvbGxlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnLnRhZycpLmZvckVhY2goKHRhZ0RpdikgPT4ge1xuICAgICAgLy8gZW1waGFzaXplIHRoZSB0YWcgYnkgY2hhbmdpbmcgaXRzIGJvcmRlciB3aWR0aFxuICAgICAgY29uc3QgeyBkYXRhc2V0OiB7IHRleHQgfSB9ID0gdGFnRGl2O1xuICAgICAgY29uc3QgY29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YWdEaXYpLmJvcmRlckNvbG9yO1xuICAgICAgaWYoZmlsdGVyaW5nQnlUZXh0Q29sbGVjdGlvbi5pbmNsdWRlcyh0ZXh0KSkge1xuICAgICAgICAgIGlmKHRhZ0Rpdi5zdHlsZS5ib3JkZXJXaWR0aCAhPT0gYm9yZGVyV2lkdGgpIHtcbiAgICAgICAgICAgI
39HRhZ0Rpdi5zdHlsZS5ib3JkZXJXaWR0aCA9IGJvcmRlcldpZHRoO1xuICAgICAgICAgICAgdGFnRGl2LmJvcmRlckNvbG9yID0gZGFya2VuQ29sb3IoY29sb3IsIGVtcGhhc2l6aW5nQ29sb3JQZXJjZW50YWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgdGhlIHRhZyB3YXMgZW1waGFzaXplZCwgcmVtb3ZlIHRoZSBlbXBoYXNpc1xuICAgICAgICAgIGlmKHRhZ0Rpdi5zdHlsZS5ib3JkZXJXaWR0aCA9PT0gYm9yZGVyV2lkdGgpIHtcbiAgICAgICAgICAgIHRhZ0Rpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHgnO1xuICAgICAgICAgICAgdGFnRGl2LnN0eWxlLmJvcmRlckNvbG9yID0gbGlnaHRlbkNvbG9yKGNvbG9yLCBlbXBoYXNpemluZ0NvbG9yUGVyY2VudGFnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gIH0pXG59XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBmaWx0ZXIgZXhwYW5kL2NvbGxhcHNlIGljb24gaW4gdGhlIGdpdmVuIHRvZ2dsZXIuXG4gKlxuICogQHBhcmFtIHRvZ2dsZUJ1dHRvblxuICovXG5mdW5jdGlvbiB0b2dnbGVySWNvbnNIYW5kbGVyKHRvZ2dsZUJ1dHRvbikge1xuICBjb25zdCBpc0V4cGFuZGVkID0gdG9nZ2xlQnV0dG9uLmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpID09PSAndHJ1ZSc7XG5cbiAgLy8gVXBkYXRlIGljb24gdmlzaWJpbGl0eVxuICBjb25zdCBwbHVzSWNvbiA9IHRvZ2dsZUJ1dHRvbi5xdWVyeVNlbGVjdG9yKCcuZmEtcGx1cycpO1xuICBjb25zdCBtaW51c0ljb24gPSB0b2dnbGVCdXR0b24ucXVlcnlTZWxlY3RvcignLmZhLW1pbnVzJyk7XG5cbiAgaWYgKCFpc0V4cGFuZGVkKSB7XG4gICAgcGx1c0ljb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBtaW51c0ljb24uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuICB9IGVsc2Uge1xuICAgIHBsdXNJY29uLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICBtaW51c0ljb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuXG4vKipcbiAqIEFkZCBoYW5kbGVyIGZvciB0YWdzIHZpZXcgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gYWRkTWFya1RhZ3NGdWxsVmlld0hhbmRsZXIoKSB7XG4gIGNvbnN0IGFubm90YXRpb25UYWdzV3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hc3NpZ25lZC10YWdzLXdyYXBwZXInKTtcbiAgaWYgKGFubm90YXRpb25UYWdzV3JhcHBlcikge1xuICAgIGFubm90YXRpb25UYWdzV3JhcHBlci5mb3JFYWNoKCh0YWdHdXR0ZXIpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdJY29uID0gdGFnR3V0dGVyLnF1ZXJ5U2VsZWN0b3IoJ2EnKTtcbiAgICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gdGFnR3V0dGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9zZS1idXR0b24nKTtcblxuICAgICAgLy8gdGFncyBjb2xsZWN0aW9uIGRpdlxuICAgICAgaWYodmlld0ljb24pIHtcbiAgICAgICAgdmlld0ljb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgY29uc3QgdGFnRGl2ID0gdGFnR3V0dGVyLnF1ZXJ5U2VsZWN0b3IoJy5hbm5vdGF0aW9uLW9wdGlvbnMnKTtcbiAgICAgICAgICBpZiAodGFnRGl2KSB7XG4gICAgICAgICAgICB0YWdEaXYuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gY2xvc2UgYnV0dG9uXG4gICAgICBpZihjbG9zZUJ1dHRvbikge1xuICAgICAgICBjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICBjb25zdCB0YWdEaXYgPSB0YWdHdXR0ZXIucXVlcnlTZWxlY3RvcignLmFubm90YXRpb24tb3B0aW9ucycpO1xuICAgICAgICAgIGlmICh0YWdEaXYpIHtcbiAgICAgICAgICAgIHRhZ0Rpdi5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlciBmb3IgbGlua3MgYW5kIGJ1dHRvbiBvbiBhbiBhbm5vdGF0aW9uIG9wdGlvbnMgZGl2LlxuICpcbiAqIEBwYXJhbSBldmVudFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFubm90YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBhbm5vdGF0aW9uQWN0aW9uSGFuZGxlcihldmVudCwgYWN0aW9uLCBhbm5vdGF0aW9uKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgY29uc3Qge3RhcmdldH0gPSBldmVudDtcbiAgbGV0IG5hbWU7XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2RlbGV0ZScpIHtcbiAgICBsZXQgcmVzcG9uc2UgPSBjb25maXJtKHQoJ2NvbmZpcm1fZGVsZXRlX2Fubm90YXRpb24nKSB8fCAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFubm90YXRpb24/Jyk7XG5cbiAgICAvLyBpZiAnY2FuY2VsJ1xuICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhY3Rpb25CdG4gPSBhbm5vdGF0aW9uLnF1ZXJ5U2VsZWN0b3IoJy51c2VyLW1hcmstZWRpdCcpO1xuICBjb25zdCBvcHRpb25zID0gc2V0T3B0aW9uVmFsdWVzKCk7XG5cbiAgY29uc3QgZGF0YSA9IGFjdGlvbkJ0bj8uZGF0YXNldCA/PyB7fTtcblxuICAvLyBWaWV3LWFnbm9zdGljIHJlYWQ6IGJvdGggY2FyZCBhbmQgbGlzdCB2aWV3cyBwbGFjZSB0aGUgaGlnaGxpZ2h0IGJhY2tncm91bmRcbiAgLy8gY29sb3Igb24gdGhlIHNhbWUgLnVzZXItaGlnaGxpZ2h0IGVsZW1lbnQgKCMyOTEwKVxuICBjb25zdCBoaWdobGlnaHRUZXh0Q29udGFpbmVyID0gZmluZEhpZ2hsaWdodFRleHRDb250YWluZXIoYW5ub3RhdGlvbiwgb3B0aW9ucz8uY29sbGVjdGlvbj8uc3R5bGUpO1xuICBjb25zdCBjb2xvciA9IGhpZ2hsaWdodFRleHRDb250YWluZXI/LnN0eWxlLmJhY2tncm91bmRDb2xvcjtcblxuICAvLyBQcmVmZXIgdGhlIGl
39kcyBvbiB0aGUgb3B0aW9ucyBkaXY7IGZhbGwgYmFjayB0byB0aGUgYW5ub3RhdGlvbiBlbGVtZW50J3Mgb3duXG4gIC8vIGRhdGFzZXQgd2hlbiB0aGUgY2xpY2sgdGFyZ2V0IGhhcyBubyAuYW5ub3RhdGlvbi1vcHRpb25zIGFuY2VzdG9yICgjMjkxMClcbiAgY29uc3Qgb3B0aW9uc0RpdiA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuYW5ub3RhdGlvbi1vcHRpb25zJyk7XG4gIGNvbnN0IG1hcmtJZCA9IG9wdGlvbnNEaXY/LmRhdGFzZXQubWFya0lkID8/IGFubm90YXRpb24uZGF0YXNldC5tYXJrSWQgPz8gZGF0YS5tYXJrSWQ7XG4gIGNvbnN0IHVzZXJNYXJrUmVjb3JkSWRcbiAgICA9IG9wdGlvbnNEaXY/LmRhdGFzZXQudXNlck1hcmtSZWNvcmRJZCA/PyBhbm5vdGF0aW9uLmRhdGFzZXQudXNlck1hcmtSZWNvcmRJZCA/PyBkYXRhLnVzZXJNYXJrUmVjb3JkSWQ7XG5cbiAgb3B0aW9ucy5tb2RpZnlDb2xsZWN0aW9uXG4gICAgPSB7XG4gICAgdHlwZTogJ1VzZXJNYXJrJyxcbiAgICBtYXJrczogW3tcbiAgICAgIGFjdGlvbixcbiAgICAgIGh0bWxDb250ZW50SWQ6IGRhdGEuaGlkLFxuICAgICAgdXNlck1hcmtJZDogdXNlck1hcmtSZWNvcmRJZCxcbiAgICAgIGNvbG9yLFxuICAgICAgbWFya0lkXG4gICAgfV1cbiAgfTtcblxuICBsZXQgdGFyZ2V0U2VsZWN0b3I7XG4gIGxldCBpbnNlcnRQb3NpdGlvbjtcbiAgaWYgKGFjdGlvbiA9PT0gJ2RlbGV0ZScpIHtcbiAgICBuYW1lID0gJ2RlbGV0ZS1hbm5vdGF0aW9uJztcbiAgICB0YXJnZXRTZWxlY3RvciA9IGBbZGF0YS1tYXJrLWlkPVwiJHttYXJrSWR9XCJdIC5oaWdobGlnaHQtY29sb3JzI2RlbGV0ZS1oaWdobGlnaHRgO1xuICAgIGluc2VydFBvc2l0aW9uID0gJ2JlZm9yZUVuZCc7XG4gIH0gZWxzZSB7XG4gICAgbmFtZSA9ICdjaGFuZ2UtY29sb3InO1xuICAgIHRhcmdldFNlbGVjdG9yID0gYFtkYXRhLW1hcmstaWQ9XCIke21hcmtJZH1cIl0gLmhpZ2hsaWdodC1jb2xvcnMgLiR7dGFyZ2V0LmNsYXNzTGlzdFswXX1gO1xuICAgIGluc2VydFBvc2l0aW9uID0gJ2FmdGVyZW5kJ1xuICB9XG5cbiAgb3B0aW9ucy5zcGlubmVyID0ge1xuICAgIG5hbWUsXG4gICAgdGFyZ2V0U2VsZWN0b3IsXG4gICAgaW5zZXJ0UG9zaXRpb25cbiAgfTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGRhdGVDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICBtYW5hZ2VGaWx0ZXJBY2NvcmRpb25zKCk7XG5cbiAgLy8gU3VyZmFjZSBhIGdlbnVpbmUg
39cmVxdWVzdCBmYWlsdXJlIHRvIHRoZSBjYWxsZXIgc28gdGhlIGNvbG9yL2RlbGV0ZSBoYW5kbGVyXG4gIC8vIHNob3dzIGl0cyBzcGVjaWZpYyBub3RpY2Ug4oCUIHRoZSBwcmUtcmVxdWVzdCBzdGF0ZSBubyBsb25nZXIgdGhyb3dzICgjMjkxMClcbiAgaWYgKHJlc3VsdCAmJiByZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb24gdXBkYXRlIGZhaWxlZCcpO1xuICB9XG59XG5cbi8qKlxuICogT3BlbiB0aGUgZXhwZXJpbWVudGFsIG5vdGUgZWRpdG9yIGZvciBhbiBhbm5vdGF0aW9uIGNhcmQgYW5kIHBlcnNpc3QgYVxuICogc2luZ2xlLW1hcmsgbm90ZSB0aHJvdWdoIHRoZSBzYW1lIG1vZGlmeUNvbGxlY3Rpb24gcGF0aCByZWNvbG9yIHVzZXMsIHNvIHRoZVxuICogY29sbGVjdGlvbiByZXBhaW50cyBhbmQgdGhlIGNhcmQgcmVmbGVjdHMgdGhlIHNhdmVkIG5vdGUgKCMzMDgzKS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBhbm5vdGF0aW9uXG4gKi9cbmZ1bmN0aW9uIG9wZW5Ob3RlRWRpdG9yKGFubm90YXRpb24pIHtcbiAgb3BlbkFubm90YXRpb25Ob3RlRWRpdG9yKHtcbiAgICBhbm5vdGF0aW9uLFxuICAgIGkxOG46IG5vdGVFZGl0b3JJMThuLFxuICAgIHNldE9wdGlvbnM6ICgpID0+IHNldE9wdGlvblZhbHVlcygpLFxuICAgIHVwZGF0ZUNvbGxlY3Rpb246IChvcHRpb25zKSA9PiB1cGRhdGVDb2xsZWN0aW9uKG9wdGlvbnMpLFxuICAgIHNob3dPdmVybGF5OiAoKSA9PiB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY29sbGVjdGlvbl0gPiAuY2VsbCcpO1xuICAgICAgaW5zZXJ0T3ZlcmxheU9uRWxlbWVudChjb2xsZWN0aW9uQ29udGFpbmVyLCAnY29sbGVjdGlvbi12aWV3LW92ZXJsYXknLCB0cnVlKTtcbiAgICB9LFxuICAgIGhpZGVPdmVybGF5OiAoKSA9PiByZW1vdmVPdmVybGF5T25FbGVtZW50KCdjb2xsZWN0aW9uLXZpZXctb3ZlcmxheScpLFxuICAgIG9uRXJyb3I6ICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0KCdhbm5vdGF0aW9ucy5ub3RlX3NhdmVfZXJyb3InKSB8fCAnVGhlcmUgd2FzIGFuIGVycm9yIHNhdmluZyB5b3VyIG5vdGUuJztcbiAgICAgIGNvbnN0IG5vdGljZSA9IG5ldyBBc3luY05vdGljZShtZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgIG5vdGljZS5jcmVhdGUoe30pO1xuICAgICAgbm90aWNlLnJlbW92ZSg0KTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBIb29rIHVwIGFjdGlvbiBoYW5kbGVycyBmb3IgbWFya3MgbGlzdGVkIGluIGFubm90YXRpb25zIHBhZ2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkQW5ub3RhdGlvbnNBY3Rpb25IYW5kbGVycygpIHtcbiAgY29uc3QgYW5ub3RhdGlvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hbm5vdGF0aW9uXScpO1xuXG4gIC8vIGFkZCBoYW5kbGVycyBmb3IgYWxsIGxpbmtzIGluIGVhY2ggYW5ub3RhdGlvbiBkaXZcbiAgaWYgKGFubm90YXRpb25zKSB7XG4gICAgYW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbikgPT4ge1xuICAgICAgLy8gc2tpcCBpZiBhbm5vdGF0aW9uIGlzIGVtcHR5IGNvbnRhaW5lciAod2hlbiB0aGVyZSBhcmUgbm8gYW5ub3RhdGlvbnMgaW4gY29sbGVjdGlvbikuXG4gICAgICBpZiAoYW5ub3RhdGlvbi5kYXRhc2V0LmFubm90YXRpb24gPT09ICdlbXB0eScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7Y29sbGVjdGlvbjoge3N0eWxlfX0gPSBnZXRDdXJyZW50T3B0aW9ucygpO1xuICAgICAgY29uc3QgYW5jaG9yID0gYW5ub3RhdGlvbi5xdWVyeVNlbGVjdG9yKFwiYVtkYXRhLW1hcmstaWRdXCIpO1xuXG4gICAgICAvLyBwbGFjZWhvbGRlciAvIGV4cGlyZWQtc3Vic2NyaXB0aW9uIHJvd3MgY2Fycnkgbm8gZWRpdGFibGUgbWFyayBhbmNob3Ig4oCUXG4gICAgICAvLyBza2lwIHRoZW0gc28gdGhlIGNvbG9yIGhhbmRsZXIgbmV2ZXIgZGVyZWZlcmVuY2VzIGEgbnVsbCBhbmNob3IgKCMyOTEwKVxuICAgICAgaWYgKCFhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3Rpb24gPSBhbmNob3IuZGF0YXNldC5tYXJrQWN0aW9uO1xuXG4gICAgICBjb25zdCBoaWdobGlnaHRUZXh0Q29udGFpbmVyID0gZmluZEhpZ2hsaWdodFRleHRDb250YWluZXIoYW5ub3RhdGlvbiwgc3R5bGUpO1xuXG4gICAgICBjb25zdCBvcHRpb25zRGl2ID0gYW5ub3RhdGlvbi5xdWVyeVNlbGVjdG9yKCcuYW5ub3RhdGlvbi1vcHRpb25zJyk7XG5cbiAgICAgIGNvbnN0IGNvbG9ycyA9IGFwcENvbG9ycygpO1xuICAgICAgbGV0IGNvbG9yQW5jaG9yRWxlbSwgbmV3Q29sb3IsIG5ld0NvbG9yVmFsdWU7XG4gICAgICBjb25zdCBjb3B5RWxlbSA9IGFubm90YXRpb24ucXVlcnlTZWxlY3RvcignW2RhdGEtbmFtZT1cImNvcHktdGV4dFwiXScpO1xuXG4gICAgICAvLyAxLiAgY29weSBidXR0b24gaGFuZGxlclxuICAgICAgaWYoY29weUVsZW0pIHtcbiAgICAgICAgY29weUVsZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRXaXRob3V0UGFnZU
3951bWJlcnMgPSBzdHJpcFBhZ2VOdW1iZXJzKGhpZ2hsaWdodFRleHRDb250YWluZXIuaW5uZXJUZXh0KTtcbiAgICAgICAgICAgIGF3YWl0IGNvcHlUb0NsaXBib2FyZCh0ZXh0V2l0aG91dFBhZ2VOdW1iZXJzKTtcblxuICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBjb3B5IHRleHQgaWNvbiB0byBncmVlbiAnY2xpY2tlZCcgdmVyc2lvblxuICAgICAgICAgICAgY29uc3QgY29weUljb24gPSBldmVudC50YXJnZXQ7IC8vIGFubm90YXRpb24ucXVlcnlTZWxlY3RvcignW2RhdGEtbmFtZT1cImNvcHktdGV4dFwiXSc7XG4gICAgICAgICAgICBjb25zdCB7Y2xhc3NMaXN0fSA9IGNvcHlJY29uO1xuICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZSgnZmEtY29weScpO1xuICAgICAgICAgICAgY2xhc3NMaXN0LmFkZCgnZmEtZmlsZS1jaXJjbGUtY2hlY2snKTtcblxuICAgICAgICAgICAgLy8gd2FpdCAycyBiZWZvcmUgY2hhbmdpbmcgYmFjayB0aGUgaWNvblxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGxvZygnd2FpdGVkIDIgc2Vjb25kcy4nKTtcbiAgICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZSgnZmEtZmlsZS1jaXJjbGUtY2hlY2snKTtcbiAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZCgnZmEtY29weScpO1xuICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNvcHlpbmcgdGV4dCB0byBjbGlwYm9hcmQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0KCdlcnJvcl9jb3B5aW5nX3RleHQnKSB8fCAnVGhlcmUgd2FzIGEgcHJvYmxlbSBjb3B5aW5nIHRoZSB0ZXh0LiBQbGVhc2UgdHJ5IGFnYWluLic7XG4gICAgICAgICAgICBjb25zdCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UobWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICBub3RpY2UuY3JlYXRlKHtlcnJvcn0pO1xuICAgICAgICAgICAgbm90aWNlLnJlbW92ZSgzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyAxYi4gbm90ZSBlZGl0b3IgaGFuZGxlciAoZXhwZXJpbWVudGFsIG5vdGVzLCAjMzA4MykuIEJvdW5kIGhlcmUgc28gaXQgaXNcbiAgICAgIC8vIHJlLWF0dGFjaGVkIG9uIGV2ZXJ5IGNvbGxlY3Rpb24gcmVwYWludCAodXBkYXRlQ29sbGVjdGlvbiByZS1ydW5zIHRoaXMpLlxuICAgICAgY29uc3Qgbm90ZUljb24gPSBhbm5vdGF0aW9uLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5hbWU9XCJtYW5hZ2Utbm90ZVwiXScpO1xuICAgICAgaWYgKG5vdGVJY29uKSB7XG4gICAgICAgIG5vdGVJY29uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBvcGVuTm90ZUVkaXRvcihhbm5vdGF0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIGRlbGV0ZSBoYW5kbGVyIGZvciBvcHRpb25zIGRpdiB0cmFzaCBjYW5cbiAgICAgIC8vIEd1YXJkOiBzb21lIHJlcGFpbnRlZCByb3dzIChlLmcuIGFmdGVyIGEgYmF0Y2ggZGVsZXRlL3JlY29sb3IpIG1heSBub3RcbiAgICAgIC8vIGNhcnJ5IGEgcmVtb3ZlLWhpZ2hsaWdodCBjb250cm9sLiBDYWxsaW5nIGFkZEV2ZW50TGlzdGVuZXIgb24gYSBudWxsXG4gICAgICAvLyBlbGVtZW50IHRocmV3IGEgVHlwZUVycm9yIHRoYXQgcHJvcGFnYXRlZCB1cCB0aHJvdWdoIHVwZGF0ZUNvbGxlY3Rpb24oKVxuICAgICAgLy8gYW5kIHN1cmZhY2VkIHRvIHRoZSB1c2VyIGFzIFwiZXJyb3IgdXBkYXRpbmcgdGhlIGFubm90YXRpb25zIGxpc3RcIiAoIzMwNTEpLlxuICAgICAgY29uc3Qgb3B0aW9uc0RpdkRlbGV0ZUVsZW0gP
39SBhbm5vdGF0aW9uLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5hbWU9XCJyZW1vdmUtaGlnaGxpZ2h0XCJdJyk7XG4gICAgICBpZiAob3B0aW9uc0RpdkRlbGV0ZUVsZW0pIHtcbiAgICAgICAgb3B0aW9uc0RpdkRlbGV0ZUVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAnY2xpY2snLFxuICAgICAgICAgIGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBhbm5vdGF0aW9uQWN0aW9uSGFuZGxlcihlLCAnZGVsZXRlJywgYW5ub3RhdGlvbilcblxuICAgICAgICAgICAgLy8gaGlkZSB0aGUgb3B0aW9uIGRpdlxuICAgICAgICAgICAgb3B0aW9uc0Rpdj8uY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBjbG9zZSBpY29uIGhhbmRsZXJcbiAgICAgIGNvbnN0IGNsb3NlRWxlbSA9IGFubm90YXRpb24ucXVlcnlTZWxlY3RvcihcIi5jbG9zZS1idXR0b25cIik7XG4gICAgICBpZihjbG9zZUVsZW0pIHtcbiAgICAgICAgY2xvc2VFbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIG9wdGlvbnNEaXYuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyA0LiBhZGQgaGFuZGxlcnMgdG8gY2hhbmdlIHRoZSBoaWdobGlnaHQgY29sb3JzIGNpcmNsZXNcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb2xvcnMpKSB7XG4gICAgICAgIGNvbG9yQW5jaG9yRWxlbSA9IGFubm90YXRpb24ucXVlcnlTZWxlY3RvcihgW3RpdGxlPVwiJHtrZXl9XCJdYCk7XG5cbiAgICAgICAgLy8gR3VhcmQ6IHNraXAgY29sb3IgYW5jaG9ycyBhIHJlcGFpbnRlZCByb3cgZG9lcyBub3QgcHJvdmlkZSwgc28gdGhlXG4gICAgICAgIC8vIHJlLWF0dGFjaCBsb29wIG5ldmVyIGRlcmVmZXJlbmNlcyBudWxsIGFuZCBjcmFzaGVzIHVwZGF0ZUNvbGxlY3Rpb24gKCMzMDUxKS5cbiAgICAgICAgaWYgKCFjb2xvckFuY2hvckVsZW0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50IGxpc3RlbmVyIGZvciBjb2xvciBvcHRpb25cbiAgICAgICAgY29sb3JBbmNob3JFbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBjb25zdCB7dGFyZ2V0OiB7cGFyZW50RWxlbWVudDogdGFyZ2V0UGFyZW50fX0gPSBldmVudDtcbiAgICAgICAgICBuZXdDb2xvciA9IHRhcmdldFBhcmVudC50aXRsZTtcbiAgICAgICAgICBuZXdDb2xvclZhbHVlID0gY29sb3JzW25ld0NvbG9yXTtcblxuICAgICAgICAgIC8vIEd1YXJkIGNsYXVzZTogZW5zdXJlIGhpZ2hsaWdodFRleHRDb250YWluZXIgZXhpc3RzIGJlZm9yZSBhY2Nlc3NpbmcgcHJvcGVydGllc1xuICAgICAgICAgIGlmICghaGlnaGxpZ2h0VGV4dENvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGNoYW5nZSBjb2xvcjogaGlnaGxpZ2h0IHRleHQgY29udGFpbmVyIG5vdCBmb3VuZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHN0b3JlIGN1cnJlbnQgY29sb3IgdG8gcmV2ZXJ0IGlmIHRoZXJlJ3MgYW4gZXJyb3JcbiAgICAgICAgICBhbm5vdGF0aW9uLmRhdGFzZXQuY3VycmVudENvbG9yID0gaGlnaGxpZ2h0VGV4dENvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIG5ld2x5IHNlbGVjdGVkIGNvbG9yXG4gICAgICAgICAgaGlnaGxpZ2h0VGV4dENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYGJhY2tncm91bmQtY29sb3I6ICR7dmFsdWV9YCk7XG4gICAgICAgICAgbG9nKGBjaGFuZ2luZyBoaWdobGlnaHQgY29sb3IgdG8gJHtuZXdDb2xvcn1gKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBhbm5vdGF0aW9uQWN0aW9uSGFuZGxlcihldmVudCwgJ2VkaXQnLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgSXNzdWUgaGFuZGxpbmcgdGhpcyBoaWdobGlnaHQuXFxuXFxuICR7ZXJyb3IubWVzc2FnZX0gXFxuXFxuICR7ZXJyb3Iuc3RhY2t9YCk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdCgnZXJyb3JfdXBkYXRpbmdfY29sb3InKSB8fCAnVGhlcmUgd2FzIGEgcHJvYmxlbSB1cGRhdGluZyB0aGUgaGlnaGxpZ2h0IGNvbG9yLiBQbGVhc2UgdHJ5IGFnYWluLic7XG4gICAgICAgICAgICBjb25zdCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UobWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICBub3RpY2UuY3JlYXRlKHtlcnJvcn0pO1xuICAgICAgICAgICAgbm90aWNlLnJlbW92ZSgzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBoaWRlIHRoZSBvcHRpb24gZGl2XG4gICAgICAgICAgLy8gb3B0aW9uc0Rpdi5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiAnZWRpdCcgcGVuY2lsIGhhbmRsZXJcbiAgICAgIGlmIChhY3Rpb24gPT09ICdlZGl0Jykge1xuICAgICAgICBhbmNob3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgLmFubm90YXRpb24tb3B0aW9uc1tkYXRhLXVzZXItbWFyay1yZWNvcmQtaWQ9XCIke2FuY2hvci5kYXRhc2V0LnVzZXJNYXJrUmVjb3JkSWR9XCJdW2RhdGEtbWFyay1pZD1cIiR7YW5jaG9yLmRhdGFzZXQubWFya0lkfVwiXWA7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uc0RpdlxuICAgICAgICAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgICAgICAgIGlmKG9wdGlvbnNEaXYpIHtcbiAgICAgICAgICAgIG9wdGlvbnNEaXYuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgICAgI
39H1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGNsZWFyIGZpbHRlciBidXR0b25zXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZXZlbnQgbGlzdGVuZXIgaXMgYWRkZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkQ2xlYXJGaWx0ZXJzSGFuZGxlcnMoKSB7XG4gIGNvbnN0IGNsZWFyQWxsQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NsZWFyLWFsbC1maWx0ZXJzJyk7XG4gIGlmIChjbGVhckFsbEJ0bikge1xuICAgIGNsZWFyQWxsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBhd2FpdCBjbGVhckZpbHRlcnNIYW5kbGVyKGV2ZW50LCAnYWxsJyk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBjbGVhckNvbG9yc0ZpbHRlckJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjbGVhci1jb2xvcnMtZmlsdGVyJyk7XG4gIGlmKGNsZWFyQ29sb3JzRmlsdGVyQnRuKSB7XG4gICAgY2xlYXJDb2xvcnNGaWx0ZXJCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGF3YWl0IGNsZWFyRmlsdGVyc0hhbmRsZXIoZXZlbnQsICdjb2xvcnMnKTtcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgY2xlYXJUYWdzRmlsdGVyQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NsZWFyLXRhZ3MtZmlsdGVyJyk7XG4gIGlmKGNsZWFyVGFnc0ZpbHRlckJ0bikge1xuICAgIGNsZWFyVGFnc0ZpbHRlckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jKGV2ZW50KSA9PiB7XG4gICAgICBhd2FpdCBjbGVhckZpbHRlcnNIYW5kbGVyKGV2ZW50LCAndGFncycpO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgY2xlYXJUZXh0RmlsdGVyQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NsZWFyLXRleHQtZmlsdGVyJyk7XG4gIGlmKGNsZWFyVGV4dEZpbHRlckJ0bikge1xuICAgIGNsZWFyVGV4dEZpbHRlckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgYXdhaXQgY2xlYXJGaWx0ZXJzSGFuZGxlcihldmVudCwgJ3RleHQnKTtcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgY2xlYXJOb3RlRmlsdGVyQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NsZWFyLW5vdGUtZmlsdGVyJyk7XG4gIGlmKGNsZWFyTm90ZUZpbHRlckJ0bikge1xuICAgIGNsZWFyTm90ZUZpbHRlckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgYXdhaXQgY2xlYXJGaWx0ZXJzSGFuZGxlcihldmVudCwgJ25vdGUnKTtcbiAgICB9KVxuICB9XG5cbiAgLy8gTm90ZSBwcmVzZW5jZSBoYXMgaXRzIG93biBjYXJkIGFuZCB0aGVyZWZvcmUgaXRzIG93biBDbGVhciAoIzQ3NzcpXG4gIGNvbnN0IGNsZWFyTm90ZVByZXNlbmNlRmlsdGVyQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NsZWFyLW5vdGUtcHJlc2VuY2UtZmlsdGVyJyk7XG4gIGlmKGNsZWFyTm90ZVByZXNlbmNlRmlsdGVyQnRuKSB7XG4gICAgY2xlYXJOb3RlUHJlc2VuY2VGaWx0ZXJCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGF3YWl0IGNsZWFyRmlsdGVyc0hhbmRsZXIoZXZlbnQsICdub3RlLXByZXNlbmNlJyk7XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCB0aGUgZmlsdGVycyBhbmQgdXBkYXRlIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IHRyaWdnZXJlZCBieSBjbGlja2luZyB0aGUgJ0NsZWFyIEFsbCcgYnV0dG9uLlxuICogQHBhcmFtIGZpbHRlclR5cGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIEEgcHJvbWlzZSB0aGF0IGluZGljYXRlcyB0aGUgY29tcGxldGlvbiBvciBmYWlsdXJlIG9mIHRoZSBvcGVyYXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNsZWFyRmlsdGVyc0hhbmRsZXIoZXZlbnQsIGZpbHRlclR5cGUgPSAnYWxsJykge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGRpc2FibGVGaWx0ZXJzKCk7XG4gIHRyeSB7XG4gICAgbGV0IG9wdGlvbnMgPSBnZXRDdXJyZW50T3B0aW9ucygpO1xuICAgIGlmKGZpbHRlclR5cGUgPT09ICdhbGwnKSB7XG4gICAgICBvcHRpb25zID0gc2V0T3B0aW9uVmFsdWVzKHRydWUpO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBjbGVhckZpbHRlckNvbnRyb2xzKG9wdGlvbnMsIGZpbHRlclR5cGUpO1xuXG4gICAgY29uc3QgY29sbGVjdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhZ2luYXRlZC1jb2xsZWN0aW9uXScpO1xuICAgIGNvbGxlY3Rpb24uZGF0YXNldC5vcHRpb25zID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG5cbiAgICBhd2FpdCB1cGRhdGVDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICAgIGVtcGhhc2l6ZUZpbHRlcmVkVGFnc09uQW5ub3RhdGlvbnMoKTtcbiAgICBtYW5hZ2VGaWx0ZXJBY2NvcmRpb25zKCk7XG4gIH0gZmluYWxseSB7XG4gICAgZW5hYmxlRmlsdGVycygpO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlIHRoZSBjbGVhcmluZyBvZiBhIGZpbHRlciBpbiB0aGUgZmlsdGVycyBkcm9wIGRvd24uXG4gKiBUaGUgZGVmYXVsdCBpcyB0byBjbGVhciBhbGwgdGhlIGZpbHRlcnMuIFlvdSBjYW4gZmlsdGVyIGp1c3QgYSBzcGVjaWZpYyBmaWx0ZXJcbiAqIGJ5IHNldHRpbmcgZmlsdGVyIHR5cGUgdG8gb25lIG9mOiAnY29sb3JzJywndGFncycsJ3RleHQnLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gZmlsdGVyVHlwZVxuICovXG5mdW5jdGlvbiBjbGVhckZpbHRlckNvbnRyb2xzKG9wdGlvbnMsIGZpbHRlclR5cGUgPSAnYWxsJykge1xuICAvKiBjb2xvcnMgZmlsdGVyICovXG4gIGlmKGZpbHRlclR5cGUgPT09ICdhbGwnIHx8IGZpbHRlclR5cGUgPT09ICdjb2xvcnMnKSB7XG4gICAgLyogcmVzZXQgY29sb3IgY29udHJvbHMgKi9cbiAgICAvLyBTY29wZWQgdG8gdGhlIGNvbG91cnMgcGFuZSBkZWxpYmVyYXRlbHk6IHRoZSB1bnNjb3BlZCBzZWxlY3RvciB0aGlzXG4gICAgLy8gcmVwbGFjZWQgdW5jaG
39Vja2VkIGV2ZXJ5IHN3aXRjaCBpbiB0aGUgZHJvcGRvd24sIHNvIGNsZWFyaW5nIGNvbG91cnNcbiAgICAvLyBzaWxlbnRseSBmbGlwcGVkIHRoZSB0ZXh0IChhbmQgbm93IG5vdGUpIHRvZ2dsZXMgb3V0IG9mIHN5bmMgd2l0aCB0aGVcbiAgICAvLyBvcHRpb25zIG9iamVjdCB0aGV5IGFyZSByZWFkIGJhY2sgaW50by4gKCM0NDkxKVxuICAgIGxldCBjb2xvckZpbHRlcnNcbiAgICAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjYW5ub3RhdGlvbi1maWx0ZXJzIC5maWx0ZXItY29sb3JzIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpXG4gICAgY29sb3JGaWx0ZXJzLmZvckVhY2goKGNoZWNrYm94KSA9PiB7XG4gICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICBvcHRpb25zLmZpbHRlcnMuY29sb3JzID0gW107XG4gIH1cblxuICAvKiB0ZXh0IGZpbHRlciAqL1xuICBpZihmaWx0ZXJUeXBlID09PSAnYWxsJyB8fCBmaWx0ZXJUeXBlID09PSAndGV4dCcpIHtcbiAgICAvLyByZXNldCB0ZXh0IGZpZWxkXG4gICAgbGV0IHRleHRGaWx0ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmlsdGVyLWJ5LXRleHQnKTtcbiAgICBpZiAodGV4dEZpbHRlcikge1xuICAgICAgdGV4dEZpbHRlci52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIG9wdGlvbnMuZmlsdGVycy50ZXh0LndvcmRzID0gJyc7XG5cbiAgICAvLyByZXNldCBjYXNlIHNlbnNpdGl2aXR5IChpbnNlbnNpdGl2ZSlcbiAgICBsZXQgY2FzZVNlbnNpdGl2aXR5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Nhc2Utc2Vuc2l0aXZpdHknKTtcbiAgICBpZihjYXNlU2Vuc2l0aXZpdHkpIHtcbiAgICAgIGNhc2VTZW5zaXRpdml0eS5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5maWx0ZXJzLnRleHQuc2Vuc2l0aXZpdHkgPSAnaW5zZW5zaXRpdmUnO1xuXG4gICAgLy8gcmVzZXQgdGV4dCBncm91cGluZyAoJ2FsbCcpXG4gICAgbGV0IHRleHRHcm91cGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN3b3JkLWdyb3VwaW5nJyk7XG4gICAgaWYodGV4dEdyb3VwaW5nKSB7XG4gICAgICB0ZXh0R3JvdXBpbmcuY2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5maWx0ZXJzLnRleHQuZ3JvdXBpbmcgPSAnYWxsJztcblxuICAgIC8vIHJlc2V0IFwiSWdub3JlIGNvbW1vbiB3b3Jkc1wiICh1bmNoZWNrZWQgPSBpbmNsdWRlIGNvbW1vbiB3b3JkcylcbiAgICBsZXQgZXhjbHVkZU5vaXNlV29yZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaWdub3JlLWNvbW1vbi13b3JkcycpO1xuICAgIGlmKGV4Y2x1ZGVOb2lzZVdvcmRzKSB7XG4gICAgICBleGNsdWRlTm9pc2VXb3Jkcy5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb3B0aW9ucy5maWx0ZXJzLnRleHQuZXhjbHVkZU5vaXNlV29yZHMgPSBmYWxzZTtcblxuICAgIC8vIGhpZGUgdGhlIGFsbC1ub2lzZSBub3RpY2Ugd2hlbiB0aGUgdGV4dCBmaWx0ZXIgaXMgY2xlYXJlZFxuICAgIHRvZ2dsZVRleHRGaWx0ZXJBbGxOb2lzZU5vdGljZShmYWxzZSk7XG4gIH1cblxuICAvKiBub3RlIHRleHQgZmlsdGVyICgjNDQ5MSkgKi9cbiAgaWYoZmlsdGVyVHlwZSA9PT0gJ2FsbCcgfHwgZmlsdGVyVHlwZSA9PT0gJ25vdGUnKSB7XG4gICAgLy8gUHJlc2VuY2UgaXMgYSBzZXBhcmF0ZSBjYXJkIHdpdGggaXRzIG93biBDbGVhciwgc28gY2xlYXJpbmcgdGhlIG5vdGVcbiAgICAvLyB0ZXh0IGZpbHRlciBtdXN0IGxlYXZlIGBoYXNgIGFzIHRoZSB1c2VyIGxlZnQgaXQuICgjNDc3NylcbiAgICBjb25zdCBjbGVhcmVkSGFzID0gZmlsdGVyVHlwZSA9PT0gJ2FsbCcgPyAnJyA6IChvcHRpb25zLmZpbHRlcnMubm90ZT8uaGFzID8/ICcnKTtcbiAgICBvcHRpb25zLmZpbHRlcnMubm90ZSA9IHsgLi4uZGVmYXVsdEZpbHRlcnMoKS5ub3RlLCBoYXM6IGNsZWFyZWRIYXMgfTtcblxuICAgIGNvbnN0IG5vdGVGaWx0ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmlsdGVyLWJ5LW5vdGUnKTtcbiAgICBpZiAobm90ZUZpbHRlcikge1xuICAgICAgbm90ZUZpbHRlci52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIC8vIHJlc2V0IGNhc2Ugc2Vuc2l0aXZpdHkgKGluc2Vuc2l0aXZlKVxuICAgIGNvbnN0IG5vdGVDYXNlU2Vuc2l0aXZpdHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbm90ZS1jYXNlLXNlbnNpdGl2aXR5Jyk7XG4gICAgaWYobm90ZUNhc2VTZW5zaXRpdml0eSkge1xuICAgICAgbm90ZUNhc2VTZW5zaXRpdml0eS5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmVzZXQgbm90ZSB3b3JkIGdyb3VwaW5nICgnYWxsJylcbiAgICBjb25zdCBub3RlR3JvdXBpbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbm90ZS13b3JkLWdyb3VwaW5nJyk7XG4gICAgaWYobm90ZUdyb3VwaW5nKSB7XG4gICAgICBub3RlR3JvdXBpbmcuY2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gcmVzZXQgXCJJZ25vcmUgY29tbW9uIHdvcmRzXCIgKHVuY2hlY2tlZCA9IGluY2x1ZGUgY29tbW9uIHdvcmRzKVxuICAgIGNvbnN0IG5vdGVFeGNsdWRlTm9pc2VXb3JkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub3RlLWlnbm9yZS1jb21tb24td29yZHMnKTtcbiAgICBpZihub3RlRXhjbHVkZU5vaXNlV29yZHMpIHtcbiAgICAgIG5vdGVFeGNsdWRlTm9pc2VXb3Jkcy5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdG9nZ2xlTm90ZUZpbHRlckFsbE5vaXNlTm90aWNlKGZhbHNlKTtcbiAgfVxuXG4gIC8qIG5vdGUgcHJlc2VuY2UgZmlsdGVyICgjNDQ5MiwgaXRzIG93biBjYXJkIHNpbmNlICM0Nzc3KSAqL1xuICBpZihmaWx0ZXJUeXBlID09PSAnYWxsJyB8fCBmaWx0ZXJUeXBlID09PSAnbm90ZS1wcmVzZW5jZScpIHtcbiAgICBpZiAob3B0aW9ucy5maWx0ZXJzLm5vdGUpIHtcbiAgICAgIG9wdGlvbnMuZmlsdGVycy5ub3RlLmhhcyA9ICcnO1xuICAgIH1cblxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJub3RlLXByZXNlbmNlXCJdJykuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgZWxlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgbm90ZSB0ZXh0IGlucHV0IGlzIGRpc2FibGVkIHdoaWxlIFwibm8gbm90ZVwiIGlzIHNlbGVjdGVkLCBzbyBjbGVhcmluZ1xuICAgIC8vIHRoZSBwcmVzZW5jZSBjYXJkIGhhcyB0byBoYW5kIGl0IGJhY2suICgjNDc3NylcbiAgICBzeW5jTm90ZVByZXNlbmNlRXhjbHVzaXZpdHkob3B0aW9ucyk7XG4gIH1cblxuICAvKiB0YWdzIGZpbHRlciAqL1xuICBpZihmaWx0ZXJUeXBlID09PSAnYWxsJyB8fCBmaWx0ZXJUeXBlID09PSAndGFncycpIHtcbiAgICAvLyBjbGVhciB0ZXh0IGluIHRhZ3MgZmlsdGVyIGlucHV0XG4gICAgY29uc3QgZmlsdGVyQnlUYWdJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWx0ZXItYnktdGFnJyk7XG4gICAgaWYoZmlsdGVyQnlUYWdJbnB1dCkge1xuICAgICAgZmlsdGVyQnlUYWdJbnB1dC50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cblxuICAgIG9wdGlvbnMuZmlsdGVycy50YWdzLmlkcyA9IFtdO1xuXG4gICAgLy8gcmVzZXQgdGFnIGdyb3VwaW5nIHRvICdhbnknIChkZWZhdWx0KVxuICAgIGxldCB0YWdHcm91cGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0YWctZ3JvdXBpbmcnKTtcbiAgICBpZih0YWdHcm91cGluZykge1xuICAgICAgdGFnR3JvdXBpbmcuY2hlY2tlZCA9IGZhbHNlOyAvLyB1bmNoZWNrZWQgPSAnYW55J1xuICAgIH1cblxuICAgIG9wdGlvbnMuZmlsdGVycy50YWdzLmdyb3VwaW5nID0gJ2FueSdcblxuICAgIC8vIENsZWFyIHNlbGVjdGVkIHRhZ3MgLSBqdXN0IHJlbW92ZSB0aGVtLCByZWZyZXNoQXZhaWxhYmxlVGFnc0xpc3Qgd2lsbCByZWJ1aWxkIHRoZSBsaXN0XG4gICAgY29uc3Qgc2VsZWN0ZWRUYWdzQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlbGVjdGVkLXRhZ3MnKTtcbiAgICBpZihzZWxlY3RlZFRhZ3NDb250YWluZXIpIHtcbiAgICAgIHdoaWxlIChzZWxlY3RlZFRhZ3NDb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICBzZWxlY3RlZFRhZ3NDb250YWluZXIucmVtb3ZlQ2hpbGQoc2VsZWN0ZWRUYWdzQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlLXJlbmRlciB0aGUgXCJZb3VyIFRhZ3NcIiBzZWN0aW9uIHdpdGggYWxsIGF2YWlsYWJsZSB0YWdzXG4gICAgcmVmcmVzaEF2YWlsYWJsZVRhZ3NMaXN0KCk7XG4gIH1cblxuICBtYW5hZ2VGaWx0ZXJBY2NvcmRpb25zKCk7XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYWdlIGlzIGN1cnJlbnRseSBmaWx0ZXJlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIHR5cGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgKiBAcGFyYW0gZmlsdGVyVHlwZVxuICogQHBhcmFtIGZpbHRlclR5cGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1R5cGVGaWx0ZXJlZChvcHRpb25zLCBmaWx0ZXJUeXBlKSB7XG4gIGxldCByZXNwb25zZSA9IGZhbHNlO1xuICBzd2l0Y2goZmlsdGVyVHlwZSkge1xuICAgIGNhc2UgJ2NvbG9ycyc6XG4gICAgICByZXNwb25zZSA9IG9wdGlvbnMuZmlsdGVyc1tmaWx0ZXJUeXBlXS5sZW5ndGggPiAwO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndGFncyc6XG4gICAgICByZXNwb25zZSA9IG9wdGlvbnMuZmlsdGVyc1tmaWx0ZXJUeXBlXS5pZH
39MubGVuZ3RoID4gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RleHQnOlxuICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLmZpbHRlcnNbZmlsdGVyVHlwZV0ud29yZHMubGVuZ3RoID4gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ25vdGUnOlxuICAgICAgLy8gT3B0aW9uYWwgY2hhaW5pbmcsIHVubGlrZSB0aGUgY2FzZXMgYWJvdmU6IHRoZSBub3RlIGJsb2NrIGlzIGFic2VudFxuICAgICAgLy8gZnJvbSBhbnkgb3B0aW9ucyBhcnJheSBwZXJzaXN0ZWQgYmVmb3JlIHRoZSBub3RlIGZpbHRlciBzaGlwcGVkLiAoIzQ0OTEpXG4gICAgICAvL1xuICAgICAgLy8gV29yZHMgb25seS4gUHJlc2VuY2UgaXMgaXRzIG93biBjYXJkIGFuZCBsaWdodHMgdXAgaXRzIG93biBjaGVja21hcmssXG4gICAgICAvLyBzbyByZXBvcnRpbmcgaXQgaGVyZSB0b28gbWFkZSB0aGlzIGNhcmQgY2xhaW0gYSBmaWx0ZXIgaXQgbm8gbG9uZ2VyXG4gICAgICAvLyBvd25zLiAoIzQ3NzcpXG4gICAgICByZXNwb25zZSA9IChvcHRpb25zLmZpbHRlcnMubm90ZT8ud29yZHMgPz8gJycpLmxlbmd0aCA+IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdub3RlLXByZXNlbmNlJzpcbiAgICAgIC8vIFByZXNlbmNlIGZpbHRlcnMgb24gaXRzIG93biwgd2l0aCBub3RoaW5nIHR5cGVkIOKAlCB0aGF0IGlzIHRoZSB3aG9sZVxuICAgICAgLy8gcG9pbnQgb2YgXCJubyBub3RlXCIuICgjNDQ5MiwgbW92ZWQgdG8gaXRzIG93biBjYXJkIGJ5ICM0Nzc3KVxuICAgICAgcmVzcG9uc2UgPSAob3B0aW9ucy5maWx0ZXJzLm5vdGU/LmhhcyA/PyAnJykgIT09ICcnO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogTWFuYWdlcyBhbGwgdGhlIERPTSBlbGVtZW50cyByZWxhdGVkIHRvIGEgZmlsdGVyIGJhc2VkIG9uIHRoZSBvcHRpb25zIG9iamVjdC5cbiAqIFVwZGF0ZSBlYWNoIGZpbHRlciBhY2NvcmRpb24gY29tcG9uZW50IHN1Y2ggYXMgdGhlIGJvcmRlciBjb2xvciwgaWNvbnMsIHRvZ2dsZXMgdGhlIGFjY29yZGlvbiwgYW5kXG4gKiBoYW5kbGVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjbGVhciBmaWx0ZXIgYnV0dG9uLlxuICovXG5mdW5jdGlvbiBtYW5hZ2VGaWx0ZXJBY2NvcmRpb25zKCkge1xuICBjb25zdCBvcHRpb25zID0gc2V0T3B0aW9uVmFsdWVzKCk7XG5cbiAgc3luY05vdGVQcmVzZW5jZUV4Y2x1c2l2aXR5KG9wdGlvbnMpO1xuXG4gIC8vIGZvciBlYWNoIGZpbHRlciB0eXBlIHRoYXQgaXMgYWN0dWFsbHkgb24gdGhlIHBhZ2VcbiAgcmVuZGVyZWRGaWx0ZXJUeXBlcygpLmZvckVhY2goZmlsdGVyVHlwZSA9PiB7XG4gICAgbGV0IGZpbHRlckluZGljYXRvckljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtmaWx0ZXJUeXBlfS1maWx0ZXItaW5kaWNhdG9yYCk7XG4gICAgbGV0IGZpbHRlcklzRW5hYmxlZCA9IGlzVHlwZUZpbHRlcmVkKG9wdGlvbnMsIGZpbHRlclR5cGUpO1xuXG4gICAgc3dpdGNoKGZpbHRlclR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvbG9ycyc6XG4gICAgICAgIHVwZGF0ZUNvbG9yRmlsdGVyQWNjb3JkaW9uSGVhZGVyKG9wdGlvbnMsIGZpbHRlcklzRW5hYmxlZCwgZmlsdGVySW5kaWNhdG9ySWNvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGFncyc6XG4gICAgICAgIHVwZGF0ZVRhZ3NGaWx0ZXJBY2NvcmRpb25IZWFkZXIob3B0aW9ucywgZmlsdGVySXNFbmFibGVkLCBmaWx0ZXJJbmRpY2F0b3JJY29uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgdXBkYXRlVGV4dEZpbHRlckFjY29yZGlvbkhlYWRlcihvcHRpb25zLCBmaWx0ZXJJc0VuYWJsZWQsIGZpbHRlckluZGljYXRvckljb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vdGUnOlxuICAgICAgICB1cGRhdGVOb3RlRmlsdGVyQWNjb3JkaW9uSGVhZGVyKG9wdGlvbnMsIGZpbHRlcklzRW5hYmxlZCwgZmlsdGVySW5kaWNhdG9ySWNvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm90ZS1wcmVzZW5jZSc6XG4gICAgICAgIHVwZGF0ZU5vdGVQcmVzZW5jZUZpbHRlckFjY29yZGlvbkhlYWRlcihvcHRpb25zLCBmaWx0ZXJJc0VuYWJsZWQsIGZpbHRlckluZGljYXRvckljb24pO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBtYW5hZ2UgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZpbHRlciBpY29uIG9uIHRoZSBhY2NvcmRpb25cbiAgICBpZihmaWx0ZXJJbmRpY2F0b3JJY29uKSB7XG4gICAgICBpZiAoZmlsdGVySXNFbmFibGVkKSB7XG4gICAgICAgIGZpbHRlckluZGljYXRvckljb24uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVySW5kaWNhdG9ySWNvbi5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIHRoZSBmaWx0ZXJlZCBjbGFzcyBvbiB0aGUgYWNjb3JkaW9uXG4gICAgbGV0IGZpbHRlclNlY3Rpb24gPSBmaWx0ZXJJbmRpY2F0b3JJY29uPy5jbG9zZXN0KCcuZmlsdGVyLXNlY3Rpb24nKTtcbiAgICBpZiAoZmlsdGVyU2VjdGlvbikge1xuICAgICAgaWYoZmlsdGVySXNFbmFibGVkKSB7XG4gICAgICAgIGZpbHRlclNlY3Rpb24uY2xhc3NMaXN0LmFkZCgnZmlsdGVyZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbHRlclNlY3Rpb24uY2xhc3NMaXN0LnJlbW92ZSgnZmlsdGVyZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhY2NvcmRpb24gdG9nZ2xlIGljb25cbiAgICBjb25zdCB0b2dnbGVBbmNob3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjZmlsdGVyLSR7ZmlsdGVyVHlwZX0tdG9nZ2xlYCk7XG4gICAgaWYgKHRvZ2dsZUFuY2hvcikge1xuICAgICAgY29uc3QgbWludXNJY29uID0gdG9nZ2xlQW5jaG9yLnF1ZXJ5U2VsZWN0b3IoJy5mYS1taW51cycpO1xuICAgICAgY29uc3QgcGx1c0ljb24gPSB0b2dnbGVBbmNob3IucXVlcnlTZWxlY3RvcignLmZhLXBsdXMnKTtcblxuICAgICAgaWYoZmlsdGVySXNFbmFibGVkKSB7XG4gICAgICAgIGlmIChtaW51c0ljb24pIHtcbiAgICAgICAgICBtaW51c0ljb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgI
39H1cblxuICAgICAgICBpZihwbHVzSWNvbikge1xuICAgICAgICAgIHBsdXNJY29uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKG1pbnVzSWNvbikge1xuICAgICAgICAgIG1pbnVzSWNvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwbHVzSWNvbikge1xuICAgICAgICAgIHBsdXNJY29uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICAvLyBoYW5kbGUgYWNjb3JkaW9uIHN0YXRlIChvcGVuL2Nsb3NlZCkgYmFzZWQgb24gaWNvbiAoKyBvciAtKSB0aGF0IGlzIHNob3dpbmdcbiAgICBjb25zdCBmaWx0ZXJBY2NvcmRpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjZmlsdGVyLSR7ZmlsdGVyVHlwZX0tZXhwYW5kZWRgKTtcbiAgICBjb25zdCBlbmFibGVkQWNjb3JkaW9uSWNvbiA9IHRvZ2dsZUFuY2hvcj8ucXVlcnlTZWxlY3RvcignaVtzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiXScpO1xuICAgIGlmKGVuYWJsZWRBY2NvcmRpb25JY29uPy5jbGFzc0xpc3QuY29udGFpbnMoJ2ZhLXBsdXMnKSAmJiBmaWx0ZXJBY2NvcmRpb24gJiYgZmlsdGVyQWNjb3JkaW9uLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykgIHtcbiAgICAgIGpRdWVyeShgI2ZpbHRlci0ke2ZpbHRlclR5cGV9LWV4cGFuZGVkYCkuZm91bmRhdGlvbigndG9nZ2xlJyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGNsZWFyIGZpbHRlciBidXR0b25cbiAgICBjb25zdCBjbGVhckZpbHRlckJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNjbGVhci0ke2ZpbHRlclR5cGV9LWZpbHRlcmApO1xuICAgIGlmKGNsZWFyRmlsdGVyQnV0dG9uKSB7XG4gICAgICBpZihmaWx0ZXJJc0VuYWJsZWQpIHtcbiAgICAgICAgY2xlYXJGaWx0ZXJCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xlYXJGaWx0ZXJCdXR0b24uY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gaGFuZGxlIGNsZWFyIGFsbCB2aXNpYmlsaXR5XG4gIGNvbnN0IGNsZWFyQWxsQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NsZWFyLWFsbC1maWx0ZXJzJyk7XG5cbiAgLy8gbWFuYWdlIGNsZWFyIGFsbCBidXR0b24gYXZhaWxhYmlsaXR5XG4gIGlmICghY2xlYXJBbGxCdG4pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaXNDb2xsZWN0aW9uRmlsdGVyZWQoKSkge1xuICAgIGNsZWFyQWxsQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2FibGVkJyk7XG4gICAgY2xlYXJBbGxCdG4ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIGNsZWFyQWxsQnRuLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpO1xuICB9IGVsc2Uge1xuICAgIGNsZWFyQWxsQnRuLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgY2xlYXJBbGxCdG4uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICBjbGVhckFsbEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCAnJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlIHRoZSBub3RlIHRleHQgcXVlcnkgdW5hdmFpbGFibGUgd2hpbGUgXCJubyBub3RlXCIgaXMgdGhlIHByZXNlbmNlXG4gKiBzZWxlY3Rpb24sIGFuZCBhdmFpbGFibGUgYWdhaW4gYXMgc29vbiBhcyBpdCBpcyBub3QuXG4gKlxuICogVGhlIHR3byBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlOiBubyBtYXJrIGNhbiBib3RoIGNvbnRhaW4gYSB3b3JkIGluIGl0cyBub3RlXG4gKiBhbmQgaGF2ZSBubyBub3RlLCBzbyBvZmZlcmluZyB0aGUgY29tYmluYXRpb24gcHJvZHVjZWQgYSBjb3JyZWN0IGJ1dFxuICogdW5leHBsYWluZWQgZW1wdHkgcmVzdWx0IHNldCDigJQgXCJUb3RhbDogMCBvZiA0MDFcIiB3aXRoIG5vdGhpbmcgc2F5aW5nIHdoeVxuICogKCM0Nzc3KS4gRGlzYWJsaW5nIHRoZSBpbnB1dCBzdGF0ZXMgdGhlIGV4Y2x1c2lvbiBpbiB0aGUgY29udHJvbCBpbnN0ZWFkLlxuICpcbiAqIEEgbm8tb3AgZm9yIGEgdXNlciB3aXRob3V0IHRoZSBub3RlcyBmZWF0dXJlLCB3aG9zZSBwYWdlIGNhcnJpZXMgbm9uZSBvZlxuICogdGhlc2UgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gc3luY05vdGVQcmVzZW5jZUV4Y2x1c2l2aXR5KG9wdGlvbnMpIHtcbiAgY29uc3Qgbm90ZUZpbHRlckVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmlsdGVyLWJ5LW5vdGUnKTtcbiAgaWYgKCFub3RlRmlsdGVyRWxlbSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHVuYXZhaWxhYmxlID0gKG9wdGlvbnMuZmlsdGVycz8ubm90ZT8uaGFzID8/ICcnKSA9PT0gTk9URV9QUkVTRU5DRV9XSVRIT1VUO1xuXG4gIG5vdGVGaWx0ZXJFbGVtLmRpc2FibGVkID0gdW5hdmFpbGFibGU7XG5cbiAgY29uc3Qgbm90ZUZpbHRlckJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWx0ZXItbm90ZSBidXR0b24nKTtcbiAgaWYgKG5vdGVGaWx0ZXJCdXR0b24pIHtcbiAgICBub3RlRmlsdGVyQnV0dG9uLmRpc2FibGVkID0gdW5hdmFpbGFibGU7XG4gIH1cblxuICBjb25zdCBub3RlRmlsdGVyQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbHRlci1ub3RlJyk7XG4gIGlmIChub3RlRmlsdGVyQ29udGFpbmVyKSB7XG4gICAgbm90ZUZpbHRlckNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdub3RlLXRleHQtdW5hdmFpbGFibGUnLCB1bmF2YWlsYWJsZSk7XG4gIH1cblxuICAvLyBBIGRpc2FibGVkIGlucHV0IHdpdGggbm8gZXhwbGFuYXRpb24gaXMgaXRzIG93biBkZWZlY3QsIHNvIHRoZSByZWFzb24gaXNcbiAgLy8gc3RhdGVkIG5leHQgdG8gaXQgcmF0aGVyIHRoYW4gbGVmdCB0byBiZSBpbmZlcnJlZC4gKCM0Nzc3KVxuICBjb25zdCBub3RpY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbm90ZS10ZXh0LXVuYXZhaWxhYmxlLW5vdGljZScpO1xuICBpZiAobm90aWNlKSB7XG4gICAgbm90aWNlLnN0eWxlLmRpc3BsYXkgPSB1bmF2YWlsYWJsZSA/ICcnIDogJ25vbmUnO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGZpbHRlciB0eXBlcyB3aG9zZSBhY2NvcmRpb24gaXMgYWN0dWFsbHkgcmVuZGVyZWQgb24gdGhlIHBhZ2UuXG4gKlxuICogQnVpbHQgZnJvbSB0aGUgRE9NIHJhdGhlciB0aGFuIGhhcmRjb2RlZCwgYmVjYXVzZSB0aGUgbm90ZSBzZWN0aW9uIGlzXG4gKiBzZXJ2ZXItZ2F0ZWQgYmVoaW5kIEZFQVRVUkVfTk9URVM6IGEgbm9uLWFsbG93bGlzdGVkIHVzZXIgcmVjZWl2ZXMgbm8gbm9
390ZVxuICogbWFya3VwIGF0IGFsbC4gQSBoYXJkY29kZWQgbGlzdCBpbmNsdWRpbmcgJ25vdGUnIHdvdWxkIGRlcmVmZXJlbmNlIGEgbnVsbFxuICogaW5kaWNhdG9yIGljb24gYW5kIHRha2UgdGhlIFdIT0xFIGZpbHRlciBwYW5lbCBkb3duIGZvciB0aGF0IHVzZXIsIG5vdCBqdXN0XG4gKiB0aGUgbm90ZSBzZWN0aW9uLiAoIzQ0OTEpXG4gKlxuICogQHJldHVybnMge3N0cmluZ1tdfSBUaGUgc3Vic2V0IG9mIEZJTFRFUl9UWVBFUyBwcmVzZW50IGluIHRoZSBET00uXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcmVkRmlsdGVyVHlwZXMoKSB7XG4gIHJldHVybiBGSUxURVJfVFlQRVMuZmlsdGVyKFxuICAgIGZpbHRlclR5cGUgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZmlsdGVyVHlwZX0tZmlsdGVyLWluZGljYXRvcmApICE9PSBudWxsXG4gICk7XG59XG5cbi8qKlxuICogY3JlYXRlIGEgdGFnIGZpbHRlciBlbGVtZW50LiBpZiBhY3Rpb24gaXMgJ2FkZCcsIHRoZSBldmVudCBoYW5kbGVyIHdpbGwgaGFuZGxlIGFkZGluZyB0aGUgdGFnXG4gKiB0byB0aGUgZmlsdGVyIGxpc3QgZnJvbSB0aGUgJ1lvdXIgVGFncycgY29sbGVjdGlvbi4gSWYgYWN0aW9uIGlzIHJlbW92ZSwgdGhlIGhhbmRsZXIgd2lsbCBoYW5kbGVcbiAqIHJlbW92aW5nIHRoZSB0YWcgZnJvbSB0aGUgZmlsdGVyIGxpc3QgYW5kIGFkZGluZyBiYWNrIHRvIHRoZSAnWW91ciBUYWdzJyBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHRhZ0RhdGFcbiAqIEBwYXJhbSBhY3Rpb24gLy8gWydhZGQnICwgJ3JlbW92ZSddXG4gKiBAcmV0dXJucyB7SFRNTERpdkVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlclRhZ0VsZW1lbnQodGFnRGF0YSwgYWN0aW9uID0gJ2FkZCcpIHtcbiAgY29uc3QgeyBjb2xvciwgaWQsIGxhc3RVcGRhdGVkLCB0ZXh0LCB1c2FnZSB9ID0gdGFnRGF0YTtcblxuICAvLyBjcmVhdGUgYSB0YWcgZWxlbWVudFxuICBjb25zdCB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdGFnLmNsYXNzTGlzdC5hZGQoJ3RhZycsIGAke2NvbG9yfWApO1xuXG4gIHRhZy5kYXRhc2V0LnRhZ0lkID0gaWQ7XG4gIHRhZy5kYXRhc2V0LmNvbG9yID0gY29sb3I7XG4gIHRhZy5kYXRhc2V0Lmxhc3RVcGRhdGVkID0gbGFzdFVwZGF0ZWQ7XG4gIHRhZy5kYXRhc2V0LnRleHQgPSB0ZXh0O1xuICB0YWcuZGF0YXNldC51c2FnZSA9IHVzYWdlO1xuICB0YWcuZGF0YXNldC5hY3Rpb24gPSBhY3Rpb247XG5cbiAgY29uc3QgbmFtZVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIG5hbWVTcGFuLmlubmVySFRNTCA9IHRleHQ7XG4gIHRhZy5hcHBlbmRDaGlsZChuYW1lU3Bhbik7XG5cbiAgLy8gQWRkIHVzYWdlIGNvdW50IHNwYW4gdG8gbWF0Y2ggUEhQLXJlbmRlcmVkIHRhZ3NcbiAgY29uc3QgdXNhZ2VTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICB1c2FnZVNwYW4uY2xhc3NOYW1lID0gJ3RhZy11c2FnZSc7XG4gIHVzYWdlU3Bhbi50ZXh0Q29udGVudCA9IHVzYWdlID8/IDA7XG4gIHRhZy5hcHBlbmRDaGlsZCh1c2FnZVNwYW4pO1xuXG4gIHRhZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIGRpc2FibGVGaWx0ZXJzKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZpbHRlclRhZ0NsaWNrSGFuZGxlcihldmVudCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuYWJsZUZpbHRlcnMoKTtcbiAgICB9XG4gIH0pXG5cbiAgLy8gUHJldmVudCBhZGRIYW5kbGVyc1RvVGFnc0luRmlsdGVyIGZyb20gYWRkaW5nIGEgZHVwbGljYXRlIGhhbmRsZXJcbiAgdGFnLmRhdGFzZXQubGlzdGVuZXJBdHRhY2hlZCA9ICd0cnVlJztcblxuICByZXR1cm4gdGFnO1xufVxuXG4vKipcbiAqIEhhbmRsZXIgdG8gYWRkIG9yIHJlbW92ZSBhIHRhZyBmcm9tIHRoZSB0YWdzIGZpbHRlciBsaXN0LlxuICpcbiAqIEBwYXJhbSBldmVudFxuICovXG5hc3luYyBmdW5jdGlvbiBmaWx0ZXJUYWdDbGlja0hhbmRsZXIoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICBsZXQgeyB0YXJnZXQ6IHRhZyB9ID0gZXZlbnQ7XG4gIGlmKHRhZy5ub2RlTmFtZSA9PT0gJ1NQQU4nKSB7XG4gICAgdGFnID0gdGFnLmNsb3Nlc3QoJy50YWcnKTtcbiAgfVxuXG4gIC8vIERldGVybWluZSBpZiB3ZSdyZSBhZGRpbmcgb3IgcmVtb3ZpbmcgYmVmb3JlIHRoZSBtb3ZlIGNoYW5nZXMgdGhlIGFjdGlvblxuICBjb25zdCBpc1JlbW92aW5nID0gdGFnLmRhdGFzZXQuYWN0aW9uID09PSAncmVtb3ZlJztcblxuICBtb3ZlVGFnRmlsdGVyVGFnRWxlbWVudCh0YWcpO1xuXG4gIC8vIFJlLXJlbmRlciB0aGUgXCJZb3VyIFRhZ3NcIiBzZWN0aW9uIHdpdGggcmVtYWluaW5nIGF2YWlsYWJsZSB0YWdzXG4gIHJlZnJlc2hBdmFpbGFibGVUYWdzTGlzdCgpO1xuXG4gIGNvbnN0IG9wdGlvbnMgPSBzZXRPcHRpb25WYWx1ZXMoKTtcbiAgYXdhaXQgdXBkYXRlQ29sbGVjdGlvbihvcHRpb25zKTtcblxuICBlbXBoYXNpemVGaWx0ZXJlZFRhZ3NPbkFubm90YXRpb25zKCk7XG4gIG1hbmFnZUZpbHRlckFjY29yZGlvbnMoKTtcbn1cblxuLyoqXG4gKiBNb3ZlIGEgdGFnIGZpbHRlciBlbGVtZW50IGJldHdlZW4gZXhpc3RpbmcgYW5kIHN1Z2dlc3RlZCBhcmVhcy5cbiAqXG4gKiBAcGFyYW0gdGFnXG4gKi9cbmZ1bmN0aW9uIG1vdmVUYWdGaWx0ZXJUYWdFbGVtZW50KHRhZykge1xuICBjb25zdCB7IGRhdGFzZXQ6IHsgYWN0aW9uIH0gfSA9IHRhZztcblxuICBsZXQgc2VsZWN0ZWRUYWdzQ29sbGVjdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWxlY3RlZC10YWdzJyk7XG4gIGxldCB1c2VyVGFnc0NvbGxlY3Rpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhpc3RpbmctdGFncycpO1xuICBpZiAoYWN0aW9uID09PSAnYWRkJykge1xuICAgIHNlbGVjdGVkVGFnc0NvbGxlY3Rpb24gPSByZW1vdmVOb25DaGFyYWN0ZXJOb2RlcyhzZWxlY3RlZFRhZ3NDb2xsZWN0aW9uKTtcblxuICAgIGlmIChzZWxlY3RlZFRhZ3NDb2xsZWN0aW9uLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZWxlY3RlZFRhZ3NDb2xsZWN0aW9uLmFwcGVuZENoaWxkKHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkVGFnc0NvbGxlY3Rpb24uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmJlZ2luJywgdGFnKTtcbiAgICB9XG5cbiAgICAvLyBzd2FwIGFjdGlvblxuICAgI
39HRhZy5kYXRhc2V0LmFjdGlvbiA9ICdyZW1vdmUnO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcbiAgICB1c2VyVGFnc0NvbGxlY3Rpb24gPSByZW1vdmVOb25DaGFyYWN0ZXJOb2Rlcyh1c2VyVGFnc0NvbGxlY3Rpb24pO1xuICAgIGlmICh1c2VyVGFnc0NvbGxlY3Rpb24uY2hpbGROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHVzZXJUYWdzQ29sbGVjdGlvbi5hcHBlbmRDaGlsZCh0YWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyVGFnc0NvbGxlY3Rpb24uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmJlZ2luJywgdGFnKTtcbiAgICB9XG5cbiAgICAvLyBzd2FwIGFjdGlvblxuICAgIHRhZy5kYXRhc2V0LmFjdGlvbiA9ICdhZGQnO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBjYXNlIHNlbnNpdGl2aXR5IHNlbGVjdGlvbiBmcm9tIHRleHQgc2Vuc2l0aXZpdHkgZmlsdGVyIHJhZGlvIGJ1dHRvbnMuXG4gKlxuICogQHBhcmFtIHNlbGVjdG9yR3JvdXBcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFRleHRTZW5zaXRpdml0eShzZWxlY3Rvckdyb3VwKSB7XG4gIGxldCBzZWxlY3Rpb24gPSAnc2Vuc2l0aXZlJztcbiAgc2VsZWN0b3JHcm91cC5mb3JFYWNoKChyYWRpbykgPT4ge1xuICAgIGlmIChyYWRpby5jaGVja2VkKSB7XG4gICAgICBzZWxlY3Rpb24gPSByYWRpby52YWx1ZTtcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHNlbGVjdGlvbjtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIGNvbGxlY3Rpb24gb2YgQW5ub3RhdGlvbnMgYmFzZWQgb24gcGFnaW5nIC8gc29ydGluZyAvIGZpbHRlcmluZyBzZWxlY3RlZC5cbiAqIGNhbGxzIGFkZEFjdGlvbkhhbmRsZXJzIGFmdGVyIHRoZSBjb2xsZWN0aW9uIGlzIHVwZGF0ZWRcbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8e3N1Y2Nlc3M6IGJvb2xlYW59Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ29sbGVjdGlvbihvcHRpb25zKSB7XG4gIGNvbnN0IHsgY29sbGVjdGlvbjogeyBwYWdpbmF0b3JOYW1lLCBwYWdpbmF0aW9uQ29udHJvbHNTZWxlY3RvciB9IH0gPSBvcHRpb25zO1xuICBjb25zdCB7IHNwaW5uZXI6IHNwaW5uZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gIC8vIEd1YXJkIGFnYWluc3QgbWlzc2luZyBzcGlubmVyIG9wdGlvbnNcbiAgbGV0IHNwaW5uZXIgPSBudWxsO1xuICBsZXQgdGFyZ2V0U2VsZWN0b3IgPSBudWxsO1xuICBpZiAoc3Bpbm5lck9wdGlvbnMpIHtcbiAgICAvLyBzcHJlYWQgYXNzaWdubWVudCB1c2VkIHRvIGVuc3VyZSBjb3JyZWN0IG9yZGVyIG9mIHBhcmFtcyBpbiBTcGlubmVyIGNvbnN0cnVjdGlvblxuICAgIGNvbnN0IHsgbmFtZSwgaW5zZXJ0UG9zaXRpb24gPSAnYWZ0ZXJlbmQnLCB3aXRoV3JhcHBlciA9IGZhbHNlIH0gPSBzcGlubmVyT3B0aW9ucztcbiAgICB0YXJnZXRTZWxlY3RvciA9IHNwaW5uZXJPcHRpb25zLnRhcmdldFNlbGVjdG9yID8/IG51bGw7XG4gICAgc3Bpbm5lciA9IG5ldyBTcGlubmVyKG5hbWUsIHRhcmdldFNlbGVjdG9yLCBpbnNlcnRQb3NpdGlvbiwgd2l0aFdyYXBwZXIpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBsZXQgY29sbGVjdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYWdpbmF0ZWQtY29sbGVjdGlvbl0nKTtcbiAgICBsZXQgcGFnaW5hdGlvbkNvbnRyb2xzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgJHtwYWdpbmF0aW9uQ29udHJvbHNTZWxlY3Rvcn1gKVxuICAgIGxldCBzb3J0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjc29ydC1ieVwiKTtcblxuICAgIGlmIChzb3J0RWxlbWVudCkge1xuICAgICAgb3B0aW9ucy5zb3J0ID0gc29ydEVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgc3Bpbm5lcj8uYWRkKCk7XG5cbiAgICBsZXQgZGF0YSA9IHtwYWdpbmF0b3JOYW1lLCBvcHRpb25zfTtcbiAgICBsZXQgdXJsID0gY29sbGVjdGlvbkVsZW1lbnQuZGF0YXNldC5yZWZyZXNoVXJsO1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBuZXcgRmV0Y2hIZWxwZXJzKCkuZmV0Y2hEYXRhKCdQT1NUJywgdXJsLCBkYXRhKTtcbiAgICBsZXQge3N1Y2Nlc3MsIG1lc3NhZ2VzfSA9IHJlc3VsdDtcblxuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAvLyBzZXQgdGhlIHBhZ2UgcGFyYW0gdG8gJzEnIG9uIHVybFxuICAgICAgLy8gY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgLy8gcGFyYW1zLmRlbGV0ZSgncGFnZScpO1xuICAgICAgLy8gcGFyYW1zLmFwcGVuZCgncGFnZScsICcxJyk7XG4gICAgICAvLyB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCBgJHtsb2NhdGlvbi5wYXRobmFtZX0/JHtwYXJhbXN9YCk7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCBgJHtsb2NhdGlvbi5wYXRobmFtZX1gKTtcblxuICAgICAgLyogdXBkYXRlIGNvbGxlY3Rpb24gZWxlbWVudCB3aXRoIG5ldyByb3dzLCByZWxhdGVkIGF0dHJpYnV0ZXMgYW5kIGV2ZW50IGhhbmRsZXJzICovXG4gICAgICBjb25zdCBuZXdDb2xsZWN0aW9uSG9sZGVyPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG5ld0NvbGxlY3Rpb25Ib2xkZXIuaW5uZXJIVE1MID0gcmVzdWx0Wydjb2xsZWN0aW9uJ107XG4gICAgICBjb25zdCBuZXdDb2xsZWN0aW9uTm9kZSA9IG5ld0NvbGxlY3Rpb25Ib2xkZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICBjb2xsZWN0aW9uRWxlbWVudC5yZXBsYWNlV2l0aChuZXdDb2xsZWN0aW9uTm9kZSk7XG5cbiAgICAgIC8vIFdyaXRlIGNhbm9uaWNhbCBzdGF0ZSBvbnRvIHRoZSBORVcgaW4tRE9NIG5vZGUg4oCUIHRoZSBvbGQgY29sbGVjdGlvbkVsZW1lbnRcbiAgICAgIC8vIGlzIG5vdyBkZXRhY2hlZCwgc28gd3JpdGVzIHRvIGl0IG5ldmVyIHJlYWNoIHRoZSBsaXZlIERPTSAoIzI5MTApXG4gICAgICBuZXdDb2xsZWN0aW9uTm9kZS5kYXRhc2V0LmNvbGxlY3Rpb24gPSBKU09OLnN0cmluZ2lmeShvcHRpb25zKTtcbiAgICAgIC8vIHJlZnJlc2gtcGFnaW5hdGVkLWxpc3QucGhwIGVjaG9lcyB0aGUgb3B0aW9ucyBiYWNrIGFzIGEgSlNPTiBvYmplY3QsIHNvXG4gICAgICAvLyByZXN1bHRbJ29wdGlvbnMnXSBhcnJpdmVzIGFzIGEgcGFyc2VkIEpTIG9iamVjdC4gQSBkYXRhc2V0IHByb3BlcnR5IG9ubHlcbiAgICAgIC8vIHN0b3JlcyBzdHJpbmdzIOKAlCBhc3NpZ25pbmcgdGhlIG9iamVjdCBkaXJlY3RseSBjb2VyY2VkIGl0IHRvIHRoZSBsaXRlcmFsXG4gICAgICAvLyBcIltvYmplY3QgT2JqZWN0XVwiLCB3aGljaCB0aGUgbmV4dCBnZXRDdXJyZW50T3B0aW9ucygpIHRoZW4gZmFpbGVkIHRvXG4gICAgICAvLyBKU09OLnBhcnNlLiBUaGF0IGVtcHR5L3VucGFyc2VhYmxlIHN0YXRlIGlzIHdoYXQgZHJvdmUgdGhlIHNldE9wdGlvblZhbHVlc1xuICAgICAgLy8gcmVjdXJzaW9uLiBTZXJpYWxpemUgb2JqZWN0czsgcGFzcyB0aHJvdWdoIGFuIGFscmVhZHktc2VyaWFsaXplZCBzdHJpbmcuICgjMzA3NilcbiAgICAgIGNvbnN0IGNhbm9uaWNhbE9wdGlvbnMgPSByZXN1bHRbJ29wdGlvbnMnXSA/PyBvcHRpb25zO1xuICAgICAgbmV3Q29sbGVjdGlvbk5vZGUuZGF0YXNldC5vcHRpb25zID0gdHlwZW9mIGNhbm9uaWNhbE9wdGlvbnMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gY2Fub25pY2FsT3B0aW9uc1xuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KGNhbm9uaWNhbE9wdGlvbnMpO1xuXG4gICAgICAvKiBhZGQgZXZlbnQgaGFuZGxlcnMgZm9yIGVsZW1lbnRzIGluIHRoZSBuZXcgY29sbGVjdGlvbiAqL1xuICAgICAgYXdhaXQgYWRkQW5ub3RhdGlvbnNBY3Rpb25IYW5kbGVycygpO1xuICAgICAgYWRkTWFya1RhZ3NGdWxsVmlld0hhbmRsZXIoKTtcblxuICAgICAgLy8gUmUtYXBwbHkgYmF0Y2gtZWRpdCBjaGVja2JveGVzIHRvIHRoZSByZXBhaW50ZWQgY29sbGVjdGlvbiAoIzMwNTEpXG4gICAgICBidWxrRWRpdENvbnRyb2xsZXI/LnN5bmNBZnRlclJlcGFpbnQoKTtcblxuICAgICAgLy8gR2F0ZSB0YWcgbWFuYWdlbWVudCBpY29ucyBiZWhpbmQgZXhwZXJpbWVudGFsIGZlYXR1cmVcbiAgICAgIGdhdGVUYWdNYW5hZ2VtZW50SWNvbnMoKTtcblxuICAgICAgLy8gdXBkYXRlIHRvdGFsc1xuICAgICAgbGV0IHRvdGFsc0VsZW09IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hbm5vdGF0aW9uLWl0ZW1zJyk7XG4gICAgICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0ZW1wLmlubmVySFRNTCA9IHJlc3VsdFsndG90YWwnXTtcbiAgICAgIHRvdGFsc0VsZW0ucmVwbGFjZVdpdGgodGVtcC5maXJzdENoaWxkKTtcblxuICAgICAgLy8gdXBkYXRlIG5hdmlnYXRpb24gY29udHJvbHNcbiAgICAgIGxldCBuYXYgPSByZXN1bHRbJ25hdiddLnRvU3RyaW5nKCk7XG4gICAgICBsZXQgbm
39V3TmF2ID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQobmF2KTtcbiAgICAgIHBhZ2luYXRpb25Db250cm9scy5yZXBsYWNlV2l0aChuZXdOYXYpO1xuXG4gICAgICBhd2FpdCBhZGRQYWdpbmF0aW9uTmF2aWdhdGlvbkhhbmRsZXJzKHBhZ2luYXRvck5hbWUpO1xuXG4gICAgICAvLyB0b2dnbGUgdGhlIFwiZXZlcnkgdGVybSBpcyBhIGNvbW1vbiB3b3JkXCIgbm90aWNlLiBUaGUgc2VydmVyIGlzIHRoZVxuICAgICAgLy8gYXV0aG9yaXRhdGl2ZSBzb3VyY2U6IGl0IGlzIG9ubHkgdHJ1ZSB3aGVuIFwiSWdub3JlIGNvbW1vbiB3b3Jkc1wiIGlzXG4gICAgICAvLyBjaGVja2VkIEFORCBldmVyeSBlbnRlcmVkIHRlcm0gaXMgYSBzdG9wd29yZC4gKCMzMzU0KVxuICAgICAgdG9nZ2xlVGV4dEZpbHRlckFsbE5vaXNlTm90aWNlKHJlc3VsdFsndGV4dEZpbHRlckFsbE5vaXNlJ10gPT09IHRydWUpO1xuICAgICAgdG9nZ2xlTm90ZUZpbHRlckFsbE5vaXNlTm90aWNlKHJlc3VsdFsnbm90ZUZpbHRlckFsbE5vaXNlJ10gPT09IHRydWUpO1xuXG4gICAgICAvLyBkaXNwbGF5IGFueSBtZXNzYWdlcyBhdmFpbGFibGVcbiAgICAgIGlmIChtZXNzYWdlcykge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IG1lc3NhZ2VzLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIGxldCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UobWVzc2FnZSwgJ3dhcm5pbmcnLCB0cnVlLCA1KTtcbiAgICAgICAgYXdhaXQgbm90aWNlLmNyZWF0ZSh7fSwgdHJ1ZSk7XG4gICAgICAgIG5vdGljZS5yZW1vdmUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gcmUtaW5pdCBmb3VuZGF0aW9uXG4gICAgICBqUXVlcnkoZG9jdW1lbnQpLmZvdW5kYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1lc3NhZ2UgPSB0KCdlcnJvcl91cGRhdGluZ19jb2xsZWN0aW9uJykgfHwgJ1RoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGUgY29sbGVjdGlvbi4nO1xuICAgICAgbGV0IG5vdGljZSA9IG5ldyBBc3luY05vdGljZShtZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgIGxldCBzdGFjayA9IHJlc3VsdFsnZXJyb3InXS5zdGFjay50b1N0cmluZygpO1xuICAgICAgYXdhaXQgbm90aWNlLmNyZWF0ZSh7bWVzc2FnZSwgc3RhY2t9LCB0cnVlKTtcbiAgICAgIG5vdGljZS5yZW1vdmUoKTtcblxuICAgICAgaWYgKHRhcmdldFNlbGVjdG9yKSB7XG4gICAgICAgIGxldCByZWdleCA9IC8oXFxbLipdKS87XG4gICAgICAgIGxldCB0YXJnZXQgPSB0YXJnZXRTZWxlY3Rvci5tYXRjaChyZWdleCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCR7dGFyZ2V0WzFdfWApPy5jbG9zZXN0KCdbZGF0YS1hbm5vdGF0aW9uXScpO1xuICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy51c2VyLWhpZ2hsaWdodCcpLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGVsZW1lbnQuZGF0YXNldC5jdXJyZW50Q29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICBzcGlubmVyPy5yZW1vdmUoKTtcblxuICAgICAgLy8gQSBzZXJ2ZXItcmVwb3J0ZWQgZmFpbHVyZSBtdXN0IHJlYWNoIHRoZSBjYWxsZXIgYXMgYSBmYWlsdXJlLiBGYWxsaW5nXG4gICAgICAvLyB0aHJvdWdoIHRvIHRoZSBzdWNjZXNzIHJldHVybiB0b2xkIGFubm90YXRpb25BY3Rpb25IYW5kbGVyIGFuZCB0aGUgbm90ZVxuICAgICAgLy8gZWRpdG9yIHRoYXQgYSByZWplY3RlZCB3cml0ZSBoYWQgc3VjY2VlZGVkLCBzbyB0aGUgY29sb3VyIGhhbmRsZXIgbmV2ZXJcbiAgICAgIC8vIHNob3dlZCBpdHMgb3duIG5vdGljZSBhbmQgdGhlIG5vdGUgZWRpdG9yIGNsb3NlZCBvbiBhIHNpbGVudCBmYWlsdXJlLlxuICAgICAgLy8gVGhlIGhhcmRlbmluZyBpbiAjNDQ5MSByZW1vdmVkIHRoZSBpbmNpZGVudGFsIFR5cGVFcnJvciB0aGF0IHVzZWQgdG9cbiAgICAgIC8vIG1hc2sgdGhpcy4gKCM0NDg4KVxuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9XG4gICAgc3Bpbm5lcj8ucmVtb3ZlKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtlcnJvcn1gKTtcbiAgICBsZXQgbWVzc2FnZSA9IHQoJ2Vycm9yX3VwZGF0aW5nX2xpc3QnKSB8fCAnVGhlcmUgd2FzIGFuIGVycm9yIHVwZGF0aW5nIHRoZSBhbm5vdGF0aW9ucyBsaXN0LiBQbGVhc2UgcmVmcmVzaCB0aGUgcGFnZS4nO1xuICAgIGxldCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UobWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgbGV0IHN0YWNrID0gZXJyb3Iuc3RhY2sudG9TdHJpbmcoKTtcbiAgICBhd2FpdCBub3RpY2UuY3JlYXRlKHttZXNzYWdlLCBlcnJvciwgc3RhY2t9LCB0cnVlKTtcbiAgICBub3RpY2UucmVtb3ZlKDUpO1xuXG4gICAgaWYgKHRhcmdldFNlbGVjdG9yKSB7XG4gICAgICBsZXQgcmVnZXggPSAvKFxcWy4qXSkvO1xuICAgICAgbGV0IHRhcmdldCA9IHRhcmdldFNlbGVjdG9yLm1hdGNoKHJlZ2V4KTtcbiAgICAgIGlmKHRhcmdldCkge1xuICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCR7dGFyZ2V0WzFdfWApPy5jbG9zZXN0KCdbZGF0YS1hbm5vdGF0aW9uXScpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnVzZXItaGlnaGxpZ2h0Jykuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZWxlbWVudC5kYXRhc2V0LmN1cnJlbnRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNwaW5uZXI/LnJlbW92ZSgpO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gIH1cblxuICBzcGlubmVyPy5yZW1vdmUoKTtcbiAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgb3B0aW9ucyBmcm9tIHRoZSBjb2xsZWN0aW9uIGVsZW1lbnQncyBkYXRhc2V0IGluIERPTS5cbiAqIEByZXR1cm5zIHsqfVxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0Q3VycmVudE9wdGlvbnMoKSB7XG4gIGNvbnN0IGNvbGxlY3Rpb25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFnaW5hdGVkLWNvbGxlY3Rpb25dJyk7XG4gIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gY29sbGVjdGlvbkVsZW1lbnQ/LmRhdGFzZXQ/Lm9wdGlvbnMgPz8ge307XG4gIGxldCBvcHRpb25zID0ge307XG5cbiAgdHJ5IHtcbiAgICBpZiAoY3VycmVudE9wdGlvbnMpIHtcblxuICAgICAgY29uc3QganNvbiA9IGNvbGxlY3Rpb25FbGVtZW50Py5kYXRhc2V0Py5vcHRpb25zID8/ICcnO1xuICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgb3B0aW9ucyA9IHN0cnVjdHVyZWRDbG9uZShkYXRhKTtcblxuICAgICAgaWYgKG9wdGlvbnMuZmlsdGVycykge1xuICAgICAgICBvcHRpb25zLmZpbHRlcnMgPSB7fTtcbiAgICAgICAgb3B0aW9ucy5maWx0ZXJzLmNvbG9ycyA9IGRhdGEuZmlsdGVyc1snY29sb3JzJ10gPz8gW107XG4gICAgICAgIG9wdGlvbnMuZmlsdGVycy50ZXh0ID0gZGF0YS5maWx0ZXJzLnRleHQgPz8geyBncm91cGluZzogJ2FsbCcsIHNlbnNpdGl2aXR5OiAnaW5zZW5zaXRpdmUnLCB3b3JkczogJycsIGV4Y2x1ZGVOb2lzZVdvcmRzOiBmYWxzZSB9O1xuICAgICAgICBvcHRpb25zLmZpbHRlcnMudGFncyA9IGRhdGEuZmlsdGVycy50YWdzID8/IHsgZ3JvdXBpbmc6ICdhbGwnLCBpZHM6IFtdIH07XG5cbiAgICAgICAgLy8gQ29waWVkIHRocm91Z2ggb25seSB3aGVuIHByZXNlbnQsIG5ldmVyIGRlZmF1bHRlZCBpbjogYW4gb3B0aW9ucyBhcnJheVxuICAgICAgICAvLyBwZXJzaXN0ZWQgYmVmb3JlIHRoZSBub3RlIGZpbHRlciBzaGlwcGVkIHN0YXlzIG5vdGUtbGVzcywgc28gdGhlIHNlcnZlclxuICAgICAgICAvLyBrZWVwcyBkZWNpZGluZyB0aGUgbm90ZSBkZWZhdWx0cyByYXRoZXIgdGhhbiB0aGUgY2xpZW50IGFzc2VydGluZyB0aGVtLiAoIzQ0OTEpXG4gICAgICAgIGlmIChkYXRhLmZpbHRlcnMubm90ZSkge1xuICAgICAgICAgIG9wdGlvbnMuZmlsdGVycy5ub3RlID0gZGF0YS5maWx0ZXJzLm5vdGU7XG4gICAgICAgI
39H1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gZGF0YXNldCBvcHRpb25zIHlldCAoZW1wdHkvd2hpdGVzcGFjZSBhdHRyaWJ1dGUpOiByZXR1cm4gYSBzYW5lXG4gICAgICAvLyBkZWZhdWx0IHNrZWxldG9uIHJhdGhlciB0aGFuIGNhbGxpbmcgc2V0T3B0aW9uVmFsdWVzKCksIHdoaWNoIHdvdWxkXG4gICAgICAvLyBjYWxsIGJhY2sgaW50byBnZXRDdXJyZW50T3B0aW9ucygpIGFuZCByaXNrIG11dHVhbCByZWN1cnNpb24uICgjMzA3NilcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucygpO1xuICAgIH1cblxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEFuIHVucGFyc2VhYmxlIGRhdGFzZXQub3B0aW9ucyAoZS5nLiB0aGUgY29lcmNlZCBcIltvYmplY3QgT2JqZWN0XVwiIHN0cmluZ1xuICAgIC8vIGEgbWlzc2luZyBKU09OLnN0cmluZ2lmeSB1c2VkIHRvIGxlYXZlIGJlaGluZCkgbXVzdCBkZWdyYWRlIHRvIGRlZmF1bHRzLFxuICAgIC8vIG5ldmVyIHRvIHt9IOKAlCBhbiBlbXB0eSBvYmplY3QgcmUtdHJpZ2dlcmVkIHRoZSBzZXRPcHRpb25WYWx1ZXMgcmVjdXJzaW9uLiAoIzMwNzYpXG4gICAgY29uc29sZS5lcnJvcihgRXJyb3IgcGFyc2luZyBhbm5vdGF0aW9uIGNvbGxlY3Rpb24gb3B0aW9uczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucygpO1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21wbGV0ZSBkZWZhdWx0IG9wdGlvbnMgc2tlbGV0b24gd2l0aG91dCB0b3VjaGluZyBmaWx0ZXIvc29ydCBzdGF0ZVxuICogaW5mZXJlbmNlLiBVc2VkIGFzIHRoZSBub24tcmVjdXJzaXZlIGJhc2UgY2FzZSBmb3Igc2V0T3B0aW9uVmFsdWVzKCkgYW5kIHRoZVxuICogZmFsbGJhY2sgZm9yIGdldEN1cnJlbnRPcHRpb25zKCkgd2hlbiB0aGUgY29sbGVjdGlvbiBoYXMgbm8gdXNhYmxlIGRhdGFzZXRcbiAqIG9wdGlvbnMuIFBhZ2luYXRvciBpZGVudGlmaWVycyBhcmUgcmVjb3ZlcmVkIGZyb20gdGhlIERPTSB3aGVuIHByZXNlbnQgc28gYVxuICogc3Vic2VxdWVudCB1cGRhdGVDb2xsZWN0aW9uKCkgY2FuIHN0aWxsIHRhcmdldCB0aGUgcmlnaHQgcmVmcmVzaCBlbmRwb2ludC5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBIGZ1bGx5LWZvcm1lZCBvcHRpb25zIG9iamVjdCB3aXRoIGRlZmF1bHQgZmlsdGVycy5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdE9wdGlvbnMoKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgc29ydDogJycsXG4gICAgY29sbGVjdGlvbjoge1xuICAgICAgc3R5bGU6ICdsaXN0JyxcbiAgICAgIHNvcnQ6ICcnLFxuICAgICAgaXRlbXNQZXJQYWdlOiAxMCxcbiAgICAgIHBhZ2luYXRvck5hbWU6ICcnLFxuICAgICAgcGFnaW5hdGlvbkNvbnRyb2xzU2VsZWN0b3I6ICcnLFxuICAgIH0sXG4gICAgZmlsdGVyczogZGVmYXVsdEZpbHRlcnMoKSxcbiAgfTtcblxuICBjb25zdCBuYXZFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbmF2W2RhdGEtcGFnaW5hdG9yLW5hbWVdJyk7XG4gIGlmIChuYXZFbGVtKSB7XG4gICAgY29uc3QgcGFnaW5hdG9yTmFtZSA9IG5hdkVsZW0uZGF0YXNldC5wYWdpbmF0b3JOYW1lO1xuICAgIG9wdGlvbnMuY29sbGVjdGlvbi5wYWdpbmF0b3JOYW1lID0gcGFnaW5hdG9yTmFtZTtcbiAgICBvcHRpb25zLmNvbGxlY3Rpb24ucGFnaW5hdGlvbkNvbnRyb2xzU2VsZWN0b3IgPSBgbmF2IyR7cGFnaW5hdG9yTmFtZX0tbmF2YDtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRlZmF1bHQgYW5ub3RhdGlvbnMgZmlsdGVycy5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gRGVmYXVsdCBmaWx0ZXJzIG9iamVjdCB3aXRoIHR3byBwcm9wZXJ0aWVzOiB0ZXh0IGFuZCBjb2xvcnMuXG4gKiAgICAgICAgICAgICAgICAgICBUaGUgdGV4dCBwcm9wZXJ0eSBjb250YWlucyBhbiBvYmplY3Qgd2l0aCB0aHJlZSBwcm9wZXJ0aWVzOiB3b3Jkcywgc2Vuc2l0aXZpdHksIGFuZCBncm91cGluZy5cbiAqICAgICAgICAgICAgICAgICAgIC0gVGhlIHdvcmRzIHByb3BlcnR5IGlzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiAgICAgICAgICAgICAgICAgICAtIFRoZSBzZW5zaXRpdml0eSBwcm9wZXJ0eSBpcyBhIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgY2FzZSBzZW5zaXRpdml0eSBmb3IgdGV4dCBtYXRjaGluZy5cbiAqICAgICAgICAgICAgICAgICAgIC0gVGhlIGdyb3VwaW5nIHByb3BlcnR5IGlzIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBncm91cGluZyBiZWhhdmlvciBmb3IgdGV4dCBtYXRjaGluZy5cbiAqICAgICAgICAgICAgICAgICAgIFRoZSBjb2xvcnMgcHJvcGVydHkgaXMgYW4gYXJyYXkgb2YgY29sb3IgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVycygpIHtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiB7XG4gICAgICBzZW5zaXRpdml0eTogJ2luc2Vuc2l0aXZlJyxcbiAgICAgIGdyb3VwaW5nOiAnYWxsJyxcbiAgICAgIHdvcmRzOiAnJyxcbiAgICAgIGV4Y2x1ZGVOb2lzZVdvcmRzOiBmYWxzZVxuICAgIH0sXG4gICAgbm90ZToge1xuICAgICAgc2Vuc2l0aXZpdHk6ICdpbnNlbnNpdGl2ZScsXG4gICAgICBncm91cGluZzogJ2FsbCcsXG4gICAgICB3b3JkczogJycsXG4gICAgICBleGNsdWRlTm9pc2VXb3JkczogZmFsc2UsXG4gICAgICBoYXM6ICcnXG4gICAgfSxcbiAgICBjb2xvcnM6IFtdLFxuICAgIHRhZ3M6IHtcbiAgICAgIGdyb3VwaW5nOiAnYW55JyxcbiAgICAgIGlkczogW11cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXJrcyBhcnJheSBmcm9tIHNlc3Npb25TdG9yYWdlXG4gKiBAcmV0dXJucyB7YW55fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0U2VjdGlvbk1hcmtzRnJvbVNlc3Npb25TdG9yYWdlKCkge1xuICBsZXQgc2Vzc2lvbk1hcmtzID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnbWFya3MnKTtcbiAgaWYgKCFzZXNzaW9uTWFya3MpIHtcbiAgICBzZXNzaW9uTWFya3MgPSBjbGVhck1hcmtPYmplY3RJblNlc3Npb24oKTtcbiAgfVxuICByZXR1cm4gSl
39NPTi5wYXJzZShzZXNzaW9uTWFya3MpO1xufVxuXG4vKipcbiAqIENsZWFyIHRoZSBtYXJrIG9iamVjdCBpbiBzZXNzaW9uIHN0b3JhZ2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbGVhck1hcmtPYmplY3RJblNlc3Npb24oKSB7XG4gIGxldCBtYXJrcyA9IEpTT04uc3RyaW5naWZ5KFtdKTtcbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnbWFya3MnLCBtYXJrcyk7XG5cbiAgcmV0dXJuIG1hcmtzO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIG1hcmtzLCBvbiB0aGUgaGlnaGxpZ2h0cyBtZW51LlxuICovXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZU9mSGlnaGxpZ2h0c01lbnVEZWxldGVCdXR0b25zKG1hcmtzQ291bnQpIHtcbiAgY29uc3QgZGVsZXRlQWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3JlbW92ZS1hbGwtYW5ub3RhdGlvbnMnKTtcbiAgY29uc3QgZGVsZXRlTGFzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyZW1vdmUtbGFzdC1hbm5vdGF0aW9uJyk7XG5cbiAgLy8gVGhlIGhpZ2hsaWdodHMgbWVudSBpcyBhYnNlbnQgb24gcGFnZXMgdGhhdCBsb2FkIHRoaXMgbW9kdWxlIHdpdGhvdXQgdGhlXG4gIC8vIGFubm90YXRpb25zIHRvb2xiYXIgbWFya3VwICgjNDA0NikuXG4gIGlmICghZGVsZXRlQWxsIHx8ICFkZWxldGVMYXN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVsZXRlQWxsVGV4dCA9IGRlbGV0ZUFsbC5xdWVyeVNlbGVjdG9yKCcjY291bnQnKTtcblxuICAvLyBFbXB0eSwgbm90ICcoMCknOiBib29rLXRvb2xiYXIucGhwIHJlbmRlcnMgbm8gY291bnQgYXQgYWxsIGZvciBhIHNlY3Rpb25cbiAgLy8gd2l0aCBubyBoaWdobGlnaHRzLCBzbyBhIGNsZWFyZWQgc3BhbiBtYXRjaGVzIGEgZnJlc2ggcGFnZSBsb2FkICgjNDEwMCkuXG4gIGxldCB0ZXh0ID0gJyc7XG5cbiAgaWYgKG1hcmtzQ291bnQgPiAwKSB7XG4gICAgdGV4dCA9IGAoJHttYXJrc0NvdW50fSlgO1xuXG4gICAgLy8gdXBkYXRlIHZpc2liaWxpdHkgb2YgYnV0dG9uc1xuICAgIGRlbGV0ZUFsbC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgZGVsZXRlTGFzdC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHZpc2liaWxpdHkgb2YgYnV0dG9uc1xuICAgIGRlbGV0ZUFsbC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gICAgZGVsZXRlTGFzdC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XG4gIH1cblxuICAvLyB1cGRhdGUgYnV0dG9uIHRleHQg4oCUIHRleHRDb250ZW50LCBub3QgaW5uZXJUZXh0OiB0aGUgbGF0dGVyIGlzIG5vdFxuICAvLyBpbXBsZW1lbnRlZCBpbiBqc2RvbSwgc28gdGhlIGJlaGF2aW91ciBjb3VsZCBub3QgYmUgdGVzdGVkICgjNDEwMCkuXG4gIGlmIChkZWxldGVBbGxUZXh0KSB7XG4gICAgZGVsZXRlQWxsVGV4dC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGaWx0ZXIgdGFncyBiYXNlZCBvbiBzZWFyY2ggdGV4dCBwcmVmaXggKGNhc2UtaW5zZW5zaXRpdmUpLlxuICogRXhjbHVkZXMgYWxyZWFkeSBzZWxlY3RlZCB0YWdzIGFuZCBudWxsIGVudHJpZXMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYWxsVGFncyAtIEFycmF5IG9mIHRhZyBvYmplY3RzIHdpdGggJ3RleHQnIHByb3BlcnR5XG4gKiBAcGFyYW0ge0FycmF5fSBzZWxlY3RlZFRhZ3MgLSBBcnJheSBvZiBhbHJlYWR5IHNlbGVjdGVkIHRhZyBvYmplY3RzXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoVGV4dCAtIFRleHQgdG8gZmlsdGVyIGJ5IChwcmVmaXggbWF0Y2gpXG4gKiBAcmV0dXJucyB7QXJyYXl9IEZpbHRlcmVkIHRhZ3MgdGhhdCBtYXRjaCB0aGUgc2VhcmNoIHByZWZpeCBhbmQgYXJlbid0IHNlbGVjdGVkXG4gKi9cbmZ1bmN0aW9uIGZpbHRlclRhZ3NCeVByZWZpeChhbGxUYWdzLCBzZWxlY3RlZFRhZ3MsIHNlYXJjaFRleHQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFsbFRhZ3MpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3Qgc2VsZWN0ZWRUZXh0cyA9IG5ldyBTZXQoKHNlbGVjdGVkVGFncyB8fCBbXSkubWFwKHQgPT4gdD8udGV4dCkuZmlsdGVyKEJvb2xlYW4pKTtcbiAgY29uc3Qgc2VhcmNoID0gKHNlYXJjaFRleHQgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIGFsbFRhZ3NcbiAgICAuZmlsdGVyKHRhZyA9PiB0YWcgJiYgdGFnLnRleHQpIC8vIG51bGwgZ3VhcmRcbiAgICAuZmlsdGVyKHRhZyA9PiAhc2VsZWN0ZWRUZXh0cy5oYXModGFnLnRleHQpKSAvLyBleGNsdWRlIHNlbGVjdGVkXG4gICAgLmZpbHRlcih0YWcgPT4gdGFnLnRleHQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHNlYXJjaCkpOyAvLyBwcmVmaXggbWF0Y2hcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgdGFncyBtYW5hZ2VtZW50IGRpdiB3aXRoIHVwZGF0ZWQgc3VnZ2VzdGVkIHRhZ3MuXG4gKlxuICogQHBhcmFtIGV2ZW50XG4gKiBAcGFyYW0gc29ydEJ5IC0gb25lIG9mOiAoJ25hbWUnLCAndGltZScsICd1c2FnZScpOyBkZWZhdWx0OiAnbmFtZSdcbiAqIEBwYXJhbSBkaXJlY3Rpb24gLSBvbmUgb2Y6ICgnYXNjJywgJ2Rlc2MnKTsgZGVmYXVsdDogJ2FzYydcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFnRmlsdGVyRWxlbWVudHMoZXZlbnQsIHNvcnRCeSA9ICduYW1lJywgZGlyZWN0aW9uID0gJ2FzYycpIHtcbiAgY29uc3QgdGV4dElucHV0RWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWx0ZXItYnktdGFnJyk7XG4gIGNvbnN0IGlucHV0VGV4dCA9IHRleHRJbnB1dEVsZW0udmFsdWU7XG4gIGNvbnN0IGV4aXN0aW5nVGFnc1dyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhpc3RpbmctdGFncycpO1xuICAvLyBjb25zdCBleGlzdGluZ1RhZ3MgPSBleGlzdGluZ1RhZ3NXcmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWcnKTtcbiAgY29uc3QgYWxsVGFnc0RhdGEgPSAoSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyVGFncycpKSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGNvbnN0IHNlbGVjdGVkVGFnRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQtdGFncyAudGFnJyk7XG4gIGxldCBzZWxlY3RlZFRhZ3MgPSBBcnJheS5mcm9tKHNlbGVjdGVkVGFnRWxlbXMpLm1hcCgodGFnKSA9PiB7XG4gICAgbGV0IHsgZGF0YXNldDogeyBjb2xvciwgaWQsIGxhc3RVcGRhdGVkLCB0ZXh0LCB1c2FnZSB9IH0gPSB0YWc7XG4gICAgcmV0dXJuIHsgY29sb3IsIGlkLCBsYXN0VXBkYXRlZCwgdGV4dCwgdXNhZ2UgfTtcbiAgfSlcblxuICAvKiBtYW5hZ2UgdGFncyBtYW5hZ2VtZW50IHZhcmlhYmxlcyAqL1xuICBjb25zdCBzb3J0RnVuY3Rpb24gPSB0YWdzU29ydGluZ0Z1bmN0aW9uKHNvcnRCeSwgZGlyZWN0aW9uKTtcblxuICAvLyBmaWx0ZXIoKSBmdW5jdGlvbiB0byByZW1vdmUgdGFncyBhbHJlYWR5IGFkZGVkIHRvIG1hcmtcbiAgY29uc3QgZmlsdGVyQWxyZWFkeUFkZGVkVGFncyA9ICh0YWcpID0+IHRhZyAmJiAhc2VsZWN0ZWRUYWdzLnNvbWUoKHNlbGVjdGVkVGFnKSA9PiBzZWxlY3RlZFRhZy50ZXh0ID09PSB0YWcudGV4dCk7XG5cbiAgbGV0IGZpbHRlcmVkVGFnc1xuICAgID0gYWxsVGFnc0RhdGFcbiAgICAuZmlsdGVyKGZpbHRlckFscmVhZHlBZGRlZFRhZ3MpXG4gICAgLnNvcnQoc29ydEZ1bmN0aW9uKTtcblxuICAvLyBncmFiIHByZXZpb3VzIHRleHQgaW5wdXQgdmFsdWUsIHNhdmUgY3VycmVudFxuICBjb25zdCBwcmV2aW91c0lucHV0VGV4dENvdW50ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnY3VycmVudC1tYXJrLW5ldy10YWctdGV4dC1jb3VudCcpO1xuICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdjdXJyZW50LW1hcmstbmV3LXRhZy10ZXh0LWNvdW50JywgaW5wdXRUZXh0Lmxlbmd0aCk7XG5cbiAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdlIGtlZXAgYW5kIHVzZSBhIGZpbHRlcmVkIHRhZ3MgbGlzdCBpbnN0ZWFkIG9mIGFsd2F5cyByZWNoZWNraW5nIHRoZSBmdWxsXG4gIC8vIHRhZ3MgbGlzdC4gRGVjaWRlIHdoZW4gd2UgbmVlZCB0byByZXNldCB0aGUgZmlsdGVyZWQgdGFncyBsaXN0LlxuICBsZXQgcmVzZXRUYWdzTGlzdFxuICAgID0gKChmaWx0ZXJlZFRhZ3MubGVuZ3RoID8/I
39DApID09PSAwKSB8fCAvLyBpZiB0aGUgZmlsdGVyZWQgVGFnIExpc3QgaXMgZW1wdHlcbiAgICAodGV4dElucHV0RWxlbS52YWx1ZS5sZW5ndGggPT09IDApIHx8IC8vIGlmIHRoZXJlIGFyZSBubyBjaGFyYWN0ZXJzIGluIHRoZSBuZXcgdGFnIGlucHV0IHRleHQgZmllbGRcbiAgICAocHJldmlvdXNJbnB1dFRleHRDb3VudCA+IHRleHRJbnB1dEVsZW0udmFsdWUubGVuZ3RoKTsgLy8gaWYgdGhlIHVzZXIgcmVtb3ZlZCBhIGNoYXJhY3RlclxuXG4gIGlmIChyZXNldFRhZ3NMaXN0KSB7XG4gICAgLy8gY29weSBieSB2YWx1ZSwgbm90IHJlZmVyZW5jZSAtIHN0aWxsIGV4Y2x1ZGUgYWxyZWFkeSBzZWxlY3RlZCB0YWdzXG4gICAgZmlsdGVyZWRUYWdzID0gWy4uLmFsbFRhZ3NEYXRhXS5maWx0ZXIoZmlsdGVyQWxyZWFkeUFkZGVkVGFncykuc29ydChzb3J0RnVuY3Rpb24pO1xuICB9XG5cbiAgLy8gbGlzdCBvZiBhbGwgdmlzaWJsZSB0YWcgbmFtZXM6XG4gIC8vICgxKSBmcm9tIGZpbHRlcmVkIHRhZ3MgbGlzdFxuICAvLyAoMikgZXhpc3RpbmcgdGFnc1xuICAvLyAoMykgbmV3bHkgYWRkZWQgdGFncyB0aGF0IGhhdmUgbm90IGJlZW4gc2F2ZWQuXG4gIGNvbnN0IGFsbFRhZ0VsZW1zID0gZmlsdGVyZWRUYWdzLmNvbmNhdChzZWxlY3RlZFRhZ3MpO1xuICBjb25zdCB2aXNpYmxlVGFnTmFtZXNNYXAgPSBuZXcgTWFwKCk7XG4gIGFsbFRhZ0VsZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICB2aXNpYmxlVGFnTmFtZXNNYXAuc2V0KGl0ZW0udGV4dCwge2lkOiBpdGVtLmlkLCBjb2xvcjogaXRlbS5jb2xvcn0pO1xuICB9KTtcblxuICAvLyBtYW5hZ2Ugc3VnZ2VzdGVkIHRhZ3NcbiAgbGV0IHRhZ0RpdjtcblxuICAvLyBzdWdnZXN0aW9ucyBkaXZcbiAgbGV0IG5ld0V4aXN0aW5nVGFnc1dyYXBwZXIgPSBleGlzdGluZ1RhZ3NXcmFwcGVyLmNsb25lTm9kZSgpO1xuXG4gIGxldCB0YWdUZXh0cyA9IGFycmF5Q29sdW1uKGFsbFRhZ3NEYXRhLCAndGV4dCcpO1xuICBpZiAoKGZpbHRlcmVkVGFncz8ubGVuZ3RoID8/IDApID4gMCkge1xuICAgIC8vIGNsZWFyIHRoZSBmaWx0ZXJlZCB0YWdzIGxpc3QgYW5kIGZpbGwgd2l0aCByZW1haW5pbmcgcG9zc2libGUgbWF0Y2hlcywgYmVsb3dcbiAgICBmb3IgKGxldCB0YWdEYXRhIG9mIGZpbHRlcmVkVGFncykge1xuICAgICAgbGV0IHt0ZXh0fSA9IHRhZ0RhdGE7XG5cbiAgICAgIGlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0ZXh0SW5wdXRFbGVtLnZhbHVlLnRvTG93ZXJDYXNlKCkpICYmIHRhZ1RleHRzLmluY2x1ZGVzKHRleHQpKSB7XG4gICAgICAgIHRhZ0RpdiA9IGNyZWF0ZUZpbHRlclRhZ0VsZW1lbnQodGFnRGF0YSk7XG4gICAgICAgIHRhZ0Rpdi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgYFVzYWdlOiAke3RhZ0RhdGEudXNhZ2UgPz8gMH1gKTtcbiAgICAgICAgdGFnRGl2LnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsIHRhZ0RhdGEuaWQpO1xuICAgICAgICBuZXdFeGlzdGluZ1RhZ3NXcmFwcGVyLmFwcGVuZENoaWxkKHRhZ0Rpdik7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlVGFnRWxlbSA9IHRhZ0Rpdi5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YWctdHlwZT1cImRlbGV0ZVwiXScpO1xuICAgICAgICBpZihkZWxldGVUYWdFbGVtKSB7XG4gICAgICAgICAgZGVsZXRlVGFnRWxlbS5yZW1vdmUoKTtcbiAgICAgICAgICB0YWdEaXYuYXBwZW5kQ2hpbGQobmV3RXhpc3RpbmdUYWdzV3JhcHBlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobmV3RXhpc3RpbmdUYWdzV3JhcHBlci5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICB3aGlsZSAoZXhpc3RpbmdUYWdzV3JhcHBlci5maXJzdENoaWxkKSB7XG4gICAgICBleGlzdGluZ1RhZ3NXcmFwcGVyLnJlbW92ZUNoaWxkKGV4aXN0aW5nVGFnc1dyYXBwZXIuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIGV4aXN0aW5nVGFnc1dyYXBwZXIucmVwbGFjZVdpdGgobmV3RXhpc3RpbmdUYWdzV3JhcHBlcik7XG4gICAgLy8gUmUtYXR0YWNoIGNsaWNrIGhhbmRsZXJzIHRvIHRoZSBuZXdseSBhZGRlZCB0YWcgZWxlbWVudHNcbiAgICBhZGRIYW5kbGVyc1RvVGFnc0luRmlsdGVyKCk7XG4gIH0gZWxzZSB7XG4gICAgcmVtb3ZlQWxsQ2hpbGROb2RlcyhleGlzdGluZ1RhZ3NXcmFwcGVyKTtcblxuICAgIGNvbnN0IG5vbmVTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIG5vbmVTcGFuLmlubmVyVGV4dCA9IHQoJ25vX3N1Z2dlc3Rpb25zJykgfHwgJ05vIHN1Z2dlc3Rpb25zLic7XG4gICAgZXhpc3RpbmdUYWdzV3JhcHBlci5hcHBlbmRDaGlsZChub25lU3Bhbik7XG4gIH1cbn1cblxuLyoqXG4gKiBVdGlsaXR5IG1ldGhvZCB0byByZW1vdmUgZW1wdHkgbm9kZXMgKCcnLCAnXFxuJywgb3IgJ1xcdCcpIGZyb20gYSBOb2RlTGlzdFxuICogQHBhcmFtIGNvbGxlY3Rpb25XcmFwcGVyXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZU5vbkNoYXJhY3Rlck5vZGVzKGNvbGxlY3Rpb25XcmFwcGVyKSB7XG4gIGNvbGxlY3Rpb25XcmFwcGVyLmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICBpZihub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiBub2RlLnRleHRDb250ZW50LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGNvbGxlY3Rpb25XcmFwcGVyO1xufVxuXG4vKipcbiAqIGZldGNoIHVzZXIgdGFncyBkYXRhIGZyb20gREIgaWYgaXQgaGFzIG5vdCBiZWVuIGFscmVhZHkgbG9hZGVkIGludG8gc2Vzc2lvbiBzdG9yYWdlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoVXNlclRhZ3MoKSB7XG4gIGlmKCFzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyVGFncycpKSB7XG4gICAgbGV0IGZldGNoU3VjY2VzcyA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbGxlY3Rpb25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY29sbGVjdGlvbl0nKTtcbiAgICBsZXQgdXJsID0gJyc7XG5cbiAgICBpZihjb2xsZWN0aW9uRWxlbWVudCkge1xuICAgICAgdXJsID0gY29sbGVjdGlvbkVsZW1lbnQuZGF0YXNldC5mZXRjaFVybDtcblxuICAgICAgbGV0IGRhdGEgPSB7IGFjdGlvbjogJ2xvYWQnIH07XG4gICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbm
39V3IEZldGNoSGVscGVycygpLmZldGNoRGF0YSgnUE9TVCcsIHVybCwgZGF0YSk7XG4gICAgICBsZXQge3N1Y2Nlc3MsIHRhZ3N9ID0gcmVzdWx0O1xuICAgICAgaWYoc3VjY2Vzcykge1xuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd1c2VyVGFncycsIEpTT04uc3RyaW5naWZ5KHRhZ3MpKTtcbiAgICAgICAgZmV0Y2hTdWNjZXNzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZighZmV0Y2hTdWNjZXNzKSB7XG4gICAgICBjb25zdCBtc2cgPSB0KCdjb3VsZF9ub3RfbG9hZF90YWdzJykgfHwgXCJDb3VsZCBub3QgbG9hZCB5b3VyIHRhZyBjb2xsZWN0aW9uLlwiO1xuICAgICAgY29uc3Qgbm90aWNlID0gbmV3IEFzeW5jTm90aWNlKG1zZywgJ3dhcm5pbmcnKTtcbiAgICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoe30sIHRydWUpO1xuICAgICAgbm90aWNlLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgY29sb3JzIHdlIGFyZSBmaWx0ZXJpbmcgYnksIHdpdGggdGhlIGNvbG9yIGZpbHRlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIGNvbG9yRmlsdGVyU2VsZWN0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zLmZpbHRlcnMuY29sb3JzO1xufVxuXG4vKiogcmV0dXJuIHRoZSB0YWcgbmFtZXMgb2YgYWxsIHRhZ3Mgd2UgYXJlIGZpbHRlcmluZyBieSwgd2l0aCB0aGUgdGFncyBmaWx0ZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gdGFnc0ZpbHRlck5hbWVzKG9wdGlvbnMpIHtcbiAgY29uc3QgdGFnSWRzID0gb3B0aW9ucy5maWx0ZXJzLnRhZ3MuaWRzO1xuICBjb25zdCB0YWdzID0gKEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndXNlclRhZ3MnKSkgfHwgW10pLmZpbHRlcihCb29sZWFuKTtcbiAgaWYodGFncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsZXQgdGFnTmFtZXMgPSBbXTtcbiAgdGFnSWRzLmZvckVhY2goKHRhZ0lkKSA9PiB7XG4gICAgbGV0IHRhZ0RhdGEgPSB0YWdzLmZpbmQoKHRhZykgPT4ge1xuICAgICAgcmV0dXJuIHRhZyAmJiB0YWcuaWQgPT09IHRhZ0lkO1xuICAgIH0pO1xuXG4gICAgaWYgKHRhZ0RhdGEpIHtcbiAgICAgIHRhZ05hbWVzLnB1c2godGFnRGF0YS50ZXh0KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0YWdOYW1lcztcbn1cblxuLyoqIHJldHVybiB0aGUgY29udGVudCB3b3JkcyB3ZSBhcmUgZmlsdGVyaW5nIGJ5LCB3aXRoIHRoZSB0ZXh0IGZpbHRlci5cbiAqXG4gKiBTcGxpdHMgb24gd2hpdGVzcGFjZSBhbmQgY29tbWFzIGFuZCBkcm9wcyBub2lzZSB3b3JkcyAvIGxvbmUgbGV0dGVycyBzbyB0aGVcbiAqIGhlYWRlciBjb3VudCByZWZsZWN0cyB0aGUgd29yZHMgYWN0dWFsbHkgbWF0Y2hlZCBieSB0aGUgcXVlcnkgKCMyOTEyKS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiB0ZXh0RmlsdGVyV29yZHMob3B0aW9ucykge1xuICBjb25zdCB3b3JkcyA9IG9wdGlvbnMuZmlsdGVycy50ZXh0LndvcmRzO1xuXG4gIGlmICghd29yZHMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gZmlsdGVyTm9pc2VXb3JkcyhnZXRVbmlxdWVXb3Jkcyh3b3JkcykpO1xufVxuXG4vKiogcmV0dXJuIHRoZSBub3RlIHdvcmRzIHdlIGFyZSBmaWx0ZXJpbmcgYnksIHdpdGggdGhlIG5vdGUgZmlsdGVyLlxuICpcbiAqIE1pcnJvcnMgdGV4dEZpbHRlcldvcmRzKCk6IHNwbGl0cyBvbiB3aGl0ZXNwYWNlIGFuZCBjb21tYXMgYW5kIGRyb3BzIG5vaXNlXG4gKiB3b3JkcyAvIGxvbmUgbGV0dGVycyBzbyB0aGUgYWNjb3JkaW9uIGhlYWRlciBjb3VudCByZWZsZWN0cyB0aGUgdGVybXMgdGhhdFxuICogYWN0dWFsbHkgcmVhY2ggdGhlIHByZWRpY2F0ZS4gKCM0NDkxKVxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmZ1bmN0aW9uIG5vdGVGaWx0ZXJXb3JkcyhvcHRpb25zKSB7XG4gIGNvbnN0IHdvcmRzID0gb3B0aW9ucy5maWx0ZXJzLm5vdGU/LndvcmRzO1xuXG4gIGlmICghd29yZHMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gZmlsdGVyTm9pc2VXb3JkcyhnZXRVbmlxdWVXb3Jkcyh3b3JkcykpO1xufVxuXG4vKipcbiAqIE1hbmFnZSB0aGUgY29sb3IgZmlsdGVyIGFjY29yZGlvbiBoZWFkZXIgZGV0YWlscy5cbiAqIElmIHRoZSBmaWx0ZXIgaXMgZW5hYmxlZCwgYWRkIGRldGFpbHMgb2YgaG93IG1hbnkgY29sb3JzIHdlIGFyZSBmaWx0ZXJpbmcgYnksIHRvIHRoZSB0aXRsZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGZpbHRlcklzRW5hYmxlZFxuICogQHBhcmFtIGZpbHRlckluZGljYXRvckljb25cbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ29sb3JGaWx0ZXJBY2NvcmRpb25IZWFkZXIob3B0aW9ucywgZmlsdGVySXNFbmFibGVkLCBmaWx0ZXJJbmRpY2F0b3JJY29uKSB7XG4gIC8vIHVwZGF0ZSB0aGUgYWNjb3JkaW9uIGhlYWRlciB3aGVuIGZpbHRlcmluZ1xuICBjb25zdCBmaWx0ZXJUaXRsZVNwYW4gPSBmaWx0ZXJJbmRpY2F0b3JJY29uPy5uZXh0RWxlbWVudFNpYmxpbmc7XG4gIGlmICghZmlsdGVyVGl0bGVTcGFuKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZmlsdGVyVGl0bGVTcGFuLmlubmVySFRNTCA9IFwiJm5ic3A7XCIgKyAodCgnZmlsdGVyX2J5X2NvbG9yJykgfHwgXCJGaWx0ZXIgYnkgY29sb3JcIik7XG5cbiAgaWYoZmlsdGVySXNFbmFibGVkKSB7XG4gICAgLy8gYWRkIG51bWJlciBvZiBjb2xvcnMgdG8gdGl0bGVcbiAgICBjb25zdCBmaWx0ZXJDb2xvcnMgPSBjb2xvckZpbHRlclNlbGVjdGlvbnMob3B0aW9ucyk7XG4gICAgaWYoZmlsdGVyQ29sb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gZmlsdGVyQ29sb3JzLmxlbmd0aCA9PT0gMSA/ICh0KCdjb2xvcl9vbmUnKSB8fCAnY29sb3InKSA6ICh0KCdjb2xvcl9vdGhlcicpIHx8ICdjb2xvcnMnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gZmlsdGVyVGl0bGVTcGFuLmNoaWxkTm9kZXNbMF07XG4gICAgICBmaWx0ZXJUaXRsZVNwYW4uaW5uZXJIVE1MID0gYCR7dGl0bGUudGV4dENvbnRlbnR9OiAke2ZpbHRlckNvbG9ycy5sZW5ndGh9ICR7Y29sb3J9YDtcbiAgICB9XG4gI
39H1cbn1cblxuXG4vKipcbiAqIE1hbmFnZSB0aGUgdGFncyBmaWx0ZXIgYWNjb3JkaW9uIGhlYWRlciBkZXRhaWxzLlxuICogSWYgdGhlIGZpbHRlciBpcyBlbmFibGVkLCBhZGQgZGV0YWlscyBvZiBob3cgbWFueSB0YWdzIHdlIGFyZSBmaWx0ZXJpbmcgYnksIHRvIHRoZSB0aXRsZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGZpbHRlcklzRW5hYmxlZFxuICogQHBhcmFtIGZpbHRlckluZGljYXRvckljb25cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFnc0ZpbHRlckFjY29yZGlvbkhlYWRlcihvcHRpb25zLCBmaWx0ZXJJc0VuYWJsZWQsIGZpbHRlckluZGljYXRvckljb24pIHtcbiAgLy8gdXBkYXRlIHRoZSBhY2NvcmRpb24gaGVhZGVyIHdoZW4gZmlsdGVyaW5nXG4gIGNvbnN0IGZpbHRlclRpdGxlU3BhbiA9IGZpbHRlckluZGljYXRvckljb24/Lm5leHRFbGVtZW50U2libGluZztcbiAgaWYgKCFmaWx0ZXJUaXRsZVNwYW4pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmaWx0ZXJUaXRsZVNwYW4uaW5uZXJIVE1MID0gXCImbmJzcDtcIiArICh0KCdmaWx0ZXJfYnlfdGFnJykgfHwgXCJGaWx0ZXIgYnkgdGFnXCIpO1xuXG4gIGlmKGZpbHRlcklzRW5hYmxlZCkge1xuICAgIC8vIGFkZCBudW1iZXIgb2YgdGFncyB0byB0aXRsZVxuICAgIGNvbnN0IGZpbHRlcmVkVGFnTmFtZXM9IHRhZ3NGaWx0ZXJOYW1lcyhvcHRpb25zKTtcbiAgICBpZihmaWx0ZXJlZFRhZ05hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHRhZyA9IGZpbHRlcmVkVGFnTmFtZXMubGVuZ3RoID09PSAxID8gKHQoJ3RhZ19vbmUnKSB8fCAndGFnJykgOiAodCgndGFnX290aGVyJykgfHwgJ3RhZ3MnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gZmlsdGVyVGl0bGVTcGFuLmNoaWxkTm9kZXNbMF07XG4gICAgICBmaWx0ZXJUaXRsZVNwYW4uaW5uZXJIVE1MID0gYCR7dGl0bGUudGV4dENvbnRlbnR9OiAke2ZpbHRlcmVkVGFnTmFtZXMubGVuZ3RofSAke3RhZ30gKCR7b3B0aW9ucy5maWx0ZXJzLnRhZ3MuZ3JvdXBpbmd9KWA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWFuYWdlIHRoZSB0ZXh0IGZpbHRlciBhY2NvcmRpb24gaGVhZGVyIGRldGFpbHMuXG4gKiBJZiB0aGUgZmlsdGVyIGlzIGVuYWJsZWQsIGFkZCBkZXRhaWxzIG9mIGhvdyBtYW55IHdvcmRzIHdlIGFyZSBmaWx0ZXJpbmcgYnksIHRvIHRoZSB0aXRsZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIGZpbHRlcklzRW5hYmxlZFxuICogQHBhcmFtIGZpbHRlckluZGljYXRvckljb25cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGV4dEZpbHRlckFjY29yZGlvbkhlYWRlcihvcHRpb25zLCBmaWx0ZXJJc0VuYWJsZWQsIGZpbHRlckluZGljYXRvckljb24pIHtcbiAgLy8gdXBkYXRlIHRoZSBhY2NvcmRpb24gaGVhZGVyIHdoZW4gZmlsdGVyaW5nXG4gIGNvbnN0IGZpbHRlclRpdGxlU3BhbiA9IGZpbHRlckluZGljYXRvckljb24/Lm5leHRFbGVtZW50U2libGluZztcbiAgaWYgKCFmaWx0ZXJUaXRsZVNwYW4pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmaWx0ZXJUaXRsZVNwYW4uaW5uZXJIVE1MID0gXCImbmJzcDtcIiArICh0KCdmaWx0ZXJfYnlfdGV4dCcpIHx8IFwiRmlsdGVyIGJ5IHRleHRcIik7XG5cbiAgaWYoIWZpbHRlcklzRW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSBzYW1lIGRldGFpbHNbXSBzaGFwZSBhcyB0aGUgbm90ZSBoZWFkZXIgYmVsb3csIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0XG4gIC8vIGFwYXJ0IGFzIGVpdGhlciBncm93cyBhIGRldGFpbCB0aGUgb3RoZXIgZG9lcyBub3QgaGF2ZS4gKCM0Nzc4KVxuICBjb25zdCBkZXRhaWxzID0gW107XG4gIGNvbnN0IGZpbHRlcldvcmRzID0gdGV4dEZpbHRlcldvcmRzKG9wdGlvbnMpO1xuXG4gIGlmKGZpbHRlcldvcmRzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB3b3JkID0gZmlsdGVyV29yZHMubGVuZ3RoID09PSAxID8gKHQoJ3dvcmRfb25lJykgfHwgJ3dvcmQnKSA6ICh0KCd3b3JkX290aGVyJykgfHwgJ3dvcmRzJyk7XG4gICAgZGV0YWlscy5wdXNoKGAke2ZpbHRlcldvcmRzLmxlbmd0aH0gJHt3b3JkfSAoJHtvcHRpb25zLmZpbHRlcnMudGV4dC5ncm91cGluZ30pYCk7XG4gIH1cblxuICByZW5kZXJGaWx0ZXJBY2NvcmRpb25IZWFkZXIoZmlsdGVyVGl0bGVTcGFuLCBkZXRhaWxzLCBvcHRpb25zLmZpbHRlcnM/LnRleHQpO1xufVxuXG4vKipcbiAqIFdyaXRlIHRoZSBkZXRhaWxzIG9udG8gYSBmaWx0ZXIgY2FyZCBoZWFkZXIsIGZvbGxvd2VkIGJ5IGEgY2hpcCBmb3IgZXZlcnlcbiAqIHRvZ2dsZSB0aGF0IGlzIG9mZiBpdHMgZGVmYXVsdC5cbiAqXG4gKiBBIG5vLW9wIHdoZW4gdGhlcmUgYXJlIG5vIGRldGFpbHMsIHdoaWNoIGxlYXZlcyB0aGUgYmFyZSBjYXJkIHRpdGxlIHRoZVxuICogY2FsbGVyIGhhcyBhbHJlYWR5IHdyaXR0ZW4gaW4gcGxhY2UuICgjNDc3OClcbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBmaWx0ZXJUaXRsZVNwYW4gLSB0aGUgc3BhbiBob2xkaW5nIHRoZSBjYXJkIHRpdGxlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBkZXRhaWxzIC0gZGV0YWlsIHBocmFzZXMsIGpvaW5lZCB3aXRoIFwiLCBcIlxuICogQHBhcmFtIHtPYmplY3R9IFtmaWx0ZXJdIC0gdGhlIGZpbHRlciBibG9jayB3aG9zZSB0b2dnbGVzIGFyZSBjaGlwcGVkLCBpZiBhbnlcbiAqL1xuZnVuY3Rpb24gcmVuZGVyRmlsdGVyQWNjb3JkaW9uSGVhZGVyKGZpbHRlclRpdGxlU3BhbiwgZGV0YWlscywgZmlsdGVyKSB7XG4gIGlmKGRldGFpbHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdGl0bGUgPSBmaWx0ZXJUaXRsZVNwYW4uY2hpbGROb2Rlc1swXTtcbiAgZmlsdGVyVGl0bGVTcGFuLmlubmVySFRNTFxuICAgID0gYCR7dGl0bGUudGV4dENvbnRlbnR9OiAke2RldGFpbHMuam9pbignLCAnKX0ke25vbkRlZmF1bHRUb2dnbGVDaGlwcyhmaWx0ZXIpfWA7XG59XG5cbi8qKlxuICogQ2hpcHMgZm9yIHRoZSB0b2dnbGVzIHRoYXQgYXJlIG5vdCBvbiB0aGVpciBkZWZhdWx0IHNldHRpbmcuXG4gKlxuICogT25seSBhIGNoYW5nZWQgdG9nZ2xlIGlzIHJlcG9ydGVkLCBzbyBhIGhlYWRlciB3aXRoIGV2ZXJ5dGhpbmcgYXQgaXRzIGRlZmF1bHRcbiAqIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoZWFkZXIgdGhhdCBzaGlwcGVkIGJlZm9yZSBjaGlwcyBleGlzdGVkLiBHcm91cGluZ1xuICogaXMgZGVsaWJlcmF0ZWx5IGFic2VudDogdGhlIGRldGFpbHMgYWxyZWFkeSBuYW1lIGl0IGluIHdvcmRzLiAoIzQ3NzgpXG4gKlxuICogVGhlIGdseXBoIGlzIGxhbmd1YWdlLW5ldXRyYWwgYW5kIHR
39oZSBtZWFuaW5nIGlzIGNhcnJpZWQgYnkgdGhlIHRpdGxlIGFuZCB0aGVcbiAqIGFyaWEtbGFiZWwsIHNvIGEgcmVhZGVyIHdobyBkb2VzIG5vdCByZWNvZ25pc2UgdGhlIHN5bWJvbCBzdGlsbCBnZXRzIHRoZVxuICogcGhyYXNlIGFuZCBTcGFuaXNoIGRvZXMgbm90IGxlbmd0aGVuIHRoZSBoZWFkZXIuXG4gKlxuICogUmVhZCB3aXRoIHRyYW5zbGF0ZU9yVW5kZWZpbmVkKCksIG5vdCB0KCk6IHQoKSBlY2hvZXMgdGhlIGtleSBiYWNrIHdoZW4gaXQgaXNcbiAqIG1pc3NpbmcsIHNvIGB0KGtleSkgfHwgZmFsbGJhY2tgIHJlbmRlcnMgXCJmaWx0ZXJfY2hpcF9jYXNlX3NlbnNpdGl2ZVwiIGludG8gYW5cbiAqIGFyaWEtbGFiZWwgcmF0aGVyIHRoYW4gdGhlIEVuZ2xpc2ggcGhyYXNlICgjNDU5MikuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtmaWx0ZXJdIC0gb3B0aW9ucy5maWx0ZXJzLnRleHQgb3Igb3B0aW9ucy5maWx0ZXJzLm5vdGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEhUTUwsIG9yICcnIHdoZW4gZXZlcnkgdG9nZ2xlIGlzIGF0IGl0cyBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIG5vbkRlZmF1bHRUb2dnbGVDaGlwcyhmaWx0ZXIpIHtcbiAgY29uc3QgY2hpcHMgPSBbXTtcblxuICBpZihmaWx0ZXI/LnNlbnNpdGl2aXR5ID09PSAnc2Vuc2l0aXZlJykge1xuICAgIGNoaXBzLnB1c2goXG4gICAgICBmaWx0ZXJDaGlwKFxuICAgICAgICAnXFx1MUQwMGEnLFxuICAgICAgICB0cmFuc2xhdGVPclVuZGVmaW5lZCgnZmlsdGVyX2NoaXBfY2FzZV9zZW5zaXRpdmUnKSA/PyAnQ2FzZS1zZW5zaXRpdmUnXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGlmKGZpbHRlcj8uZXhjbHVkZU5vaXNlV29yZHMgPT09IHRydWUpIHtcbiAgICBjaGlwcy5wdXNoKFxuICAgICAgZmlsdGVyQ2hpcChcbiAgICAgICAgJ1xcdTIyOTgnLFxuICAgICAgICB0cmFuc2xhdGVPclVuZGVmaW5lZCgnZmlsdGVyX2NoaXBfaWdub3JlX2NvbW1vbl93b3JkcycpID8/ICdJZ25vcmluZyBjb21tb24gd29yZHMnXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBjaGlwcy5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBPbmUgaGVhZGVyIGNoaXA6
39IGEgZ2x5cGggdGhhdCBhbm5vdW5jZXMgaXRzZWxmIGFzIGl0cyB0cmFuc2xhdGVkIHBocmFzZS5cbiAqXG4gKiByb2xlPVwiaW1nXCIgd2l0aCBhbiBhcmlhLWxhYmVsIGlzIHdoYXQgc3RvcHMgYSBzY3JlZW4gcmVhZGVyIHNwZWxsaW5nIG91dCB0aGVcbiAqIGdseXBoLCBhbmQgdGhlIGNvbG91ciBvZiB0aGUgY2hpcCBjYXJyaWVzIG5vIG1lYW5pbmcgb2YgaXRzIG93bi4gKCM0Nzc4KVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBnbHlwaCAtIHRoZSB2aXNpYmxlIGNoYXJhY3RlclxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gdGhlIHRyYW5zbGF0ZWQgcGhyYXNlIGZvciB0aXRsZSBhbmQgYXJpYS1sYWJlbFxuICogQHJldHVybnMge3N0cmluZ30gSFRNTCBmb3IgdGhlIGNoaXAsIHdpdGggYSBsZWFkaW5nIHNwYWNlXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckNoaXAoZ2x5cGgsIGxhYmVsKSB7XG4gIGNvbnN0IHNhZmVMYWJlbCA9IGVzY2FwZUF0dHJpYnV0ZVZhbHVlKGxhYmVsKTtcblxuICByZXR1cm4gYCA8c3BhbiBjbGFzcz1cImZpbHRlci1jaGlwXCIgcm9sZT1cImltZ1wiIHRpdGxlPVwiJHtzYWZlTGFiZWx9XCJgXG4gICAgKyBgIGFyaWEtbGFiZWw9XCIke3NhZmVMYWJlbH1cIj4ke2dseXBofTwvc3Bhbj5gO1xufVxuXG4vKipcbiAqIEVzY2FwZSBhIHN0cmluZyBmb3IgdXNlIGluc2lkZSBhIGRvdWJsZS1xdW90ZWQgSFRNTCBhdHRyaWJ1dGUuXG4gKlxuICogVGhlIGNoaXAgbGFiZWxzIGNvbWUgZnJvbSB0aGUgdHJhbnNsYXRpb24gZmlsZXMgcmF0aGVyIHRoYW4gZnJvbSB1c2VyIGlucHV0LFxuICogYnV0IHRoZXkgYXJlIGludGVycG9sYXRlZCBpbnRvIG1hcmt1cCwgYW5kIGEgc3RyYXkgcXVvdGUgaW4gYSB0cmFuc2xhdGlvblxuICogd291bGQgb3RoZXJ3aXNlIGJyZWFrIHRoZSBhdHRyaWJ1dGUgaXQgc2l0cyBpbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUF0dHJpYnV0ZVZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlQWxsKCdcIicsICcmcXVvdDsnKVxuICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgIC5yZXBsYWNlQWxsKCc+JywgJyZndDsnKTtcbn1cblxuLyoqXG4gKiBNYW5hZ2UgdGhlIG5vdGUgZmlsdGVyIGFjY29yZGlvbiBoZWFkZXIgZGV0YWlscy5cbiAqIElmIHRoZSBmaWx0ZXIgaXMgZW5hYmxlZCwgYWRkIGRldGFpbHMgb2YgaG93IG1hbnkgd29yZHMgd2UgYXJlIGZpbHRlcmluZyBieSwgdG8gdGhlIHRpdGxlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gZmlsdGVySXNFbmFibGVkXG4gKiBAcGFyYW0gZmlsdGVySW5kaWNhdG9ySWNvblxuICovXG5mdW5jdGlvbiB1cGRhdGVOb3RlRmlsdGVyQWNjb3JkaW9uSGVhZGVyKG9wdGlvbnMsIGZpbHRlcklzRW5hYmxlZCwgZmlsdGVySW5kaWNhdG9ySWNvbikge1xuICAvLyB1cGRhdGUgdGhlIGFjY29yZGlvbiBoZWFkZXIgd2hlbiBmaWx0ZXJpbmdcbiAgY29uc3QgZmlsdGVyVGl0bGVTcGFuID0gZmlsdGVySW5kaWNhdG9ySWNvbj8ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICBpZiAoIWZpbHRlclRpdGxlU3Bhbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZpbHRlclRpdGxlU3Bhbi5pbm5lckhUTUwgPSBcIiZuYnNwO1wiICsgKHQoJ2ZpbHRlcl9ieV9ub3RlJykgfHwgXCJGaWx0ZXIgYnkgbm90ZVwiKTtcblxuICBpZighZmlsdGVySXNFbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gV29yZHMgb25seS4gUHJlc2VuY2UgbW92ZWQgdG8gaXRzIG93biBjYXJkLCB3aGljaCByZXBvcnRzIGl0cyBvd24gc3RhdGU6XG4gIC8vIHN0YXRpbmcgaXQgaGVyZSBhcyB3ZWxsIHJlbmRlcmVkIFwiRmlsdGVyIGJ5IG5vdGU6IGhhcyBhIG5vdGVcIiBhYm92ZSBhXG4gIC8vIGNvbnRyb2wgdGhhdCBhbHJlYWR5IHNhaWQgXCJIYXMgYSBub3RlXCIuICgjNDc3NylcbiAgY29uc3QgZGV0YWlscyA9IFtdO1xuICBjb25zdCBmaWx0ZXJXb3JkcyA9IG5vdGVGaWx0ZXJXb3JkcyhvcHRpb25zKTtcblxuICBpZihmaWx0ZXJXb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgd29yZCA9IGZpbHRlcldvcmRzLmxlbmd0aCA9PT0gMSA/ICh0KCd3b3JkX29uZScpIHx8ICd3b3JkJykgOiAodCgnd29yZF9vdGhlcicpIHx8ICd3b3JkcycpO1xuICAgIGRldGFpbHMucHVzaChgJHtmaWx0ZXJXb3Jkcy5sZW5ndGh9ICR7d29yZH0gKCR7b3B0aW9ucy5maWx0ZXJzLm5vdGUuZ3JvdXBpbmd9KWApO1xuICB9XG5cbiAgcmVuZGVyRmlsdGVyQWNjb3JkaW9uSGVhZGVyKGZpbHRlclRpdGxlU3BhbiwgZGV0YWlscywgb3B0aW9ucy5maWx0ZXJzPy5ub3RlKTtcbn1cblxuLyoqXG4gKiBNYW5hZ2UgdGhlIG5vdGUgcHJlc2VuY2UgYWNjb3JkaW9uIGhlYWRlciBkZXRhaWxzLlxuICpcbiAqIFRoZSBjYXJkIGNhcnJpZXMgbm8gdG9nZ2xlcyBvZiBpdHMgb3duLCBzbyBpdCB0YWtlcyBubyBjaGlwcy4gKCM0Nzc3KVxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gZmlsdGVySXNFbmFibGVkXG4gKiBAcGFyYW0gZmlsdGVySW5kaWNhdG9ySWNvblxuICovXG5mdW5jdGlvbiB1cGRhdGVOb3RlUHJlc2VuY2VGaWx0ZXJBY2NvcmRpb25IZWFkZXIob3B0aW9ucywgZmlsdGVySXNFbmFibGVkLCBmaWx0ZXJJbmRpY2F0b3JJY29uKSB7XG4gIGNvbnN0IGZpbHRlclRpdGxlU3BhbiA9IGZpbHRlckluZGljYXRvckljb24/Lm5leHRFbGVtZW50U2libGluZztcbiAgaWYgKCFmaWx0ZXJUaXRsZVNwYW4pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmaWx0ZXJUaXRsZVNwYW4uaW5uZXJIVE1MXG4gICAgPSBcIiZuYnNwO1wiICsgKHRyYW5zbGF0ZU9yVW5kZWZpbmVkKCdmaWx0ZXJfYnlfbm90ZV9wcmVzZW5jZScpID8/ICdGaWx0ZXIgYnkgbm90ZSBwcmVzZW5jZScpO1xuXG4gIGlmKCFmaWx0ZXJJc0VuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZXRhaWxzID0gW107XG4gIGNvbnN0IHByZXNlbmNlTGFiZWwgPSBub3RlUHJlc2VuY2VMYWJlbChvcHRpb25zKTtcblxuICBpZihwcmVzZW5jZUxhYmVsKSB7XG4gICAgZGV0YWlscy5wdXNoKHByZXNlbmNlTGFiZWwpO1xuICB9XG5cbiAgcmVuZGVyRmlsdGVyQWNjb3JkaW9uSGVhZGVyKGZpbHRlclRpdGxlU3BhbiwgZGV0YWlscyk7XG59XG5cbi8qKlxuICogVGhlIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgbm90ZSBwcmVzZW5jZSBzZWxlY3Rpb24sIG9yICcnIGZvciBubyBwcmVmZXJlbmNlLlxuICpcbiAqIFJlYWQgZGVmZW5zaXZlbHk6IGBoYXNgIGlzIGFic2VudCBmcm9tIGFueSBvcHRpb25zIGFycmF5IHBlcnNpc3RlZCBiZWZvcmUgdGhlXG4gKiB0cmktc3RhdGUgc2hpcHBlZCwgYW5kIGFuIHVucmVjb2duaXNlZCB2YWx1ZSBtZWFucyBubyBwcmVmZXJlbmNlLCBtYXRjaGluZ1xuICogaG93IFBhZ2luYXRpb25PcHRpb25zOjpnZXROb3RlSGFzRmlsdGVyKCkgcmVkdWNlcyBpdCBzZXJ2ZXItc2lkZS4gKCM0NDkyKVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBub3RlUHJlc2VuY2VMYWJlbChvcHRpb25zKSB7XG4gIHN3aXRjaChvcHRpb25zLmZpbHRlcnM/Lm5vdGU/LmhhcyA/PyAnJykge1xuICAgIGNhc2UgTk9URV9QUkVTRU5DRV9XSVRIOlxuICAgICAgcmV0dXJuIHQoJ25vdGVfcHJlc2VuY2Vfd2l0aCcpIHx8ICdoYXMgYSBub3RlJztcbiAgICBjYXNlIE5PVEVfUFJFU0VOQ0VfV0lUSE9VVDpcbiAgICAgIHJldHVybi
39B0KCdub3RlX3ByZXNlbmNlX3dpdGhvdXQnKSB8fCAnbm8gbm90ZSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBpcyBiZWluZyBmaWx0ZXJlZCBieSBhbnkgb2YgdGhlIGZpbHRlcnMuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzQ29sbGVjdGlvbkZpbHRlcmVkKCkge1xuICBjb25zdCB7IGZpbHRlcnMgfSA9IGdldEN1cnJlbnRPcHRpb25zKCk7XG4gIGNvbnN0IHsgY29sb3JzLCB0YWdzOiB7IGlkczogdGFnSWRzIH0sIHRleHQ6IHsgd29yZHMgfSB9ID0gZmlsdGVycztcblxuICAvLyBUaGUgbm90ZSBibG9jayBpcyByZWFkIGRlZmVuc2l2ZWx5IGJlY2F1c2UgaXQgaXMgYWJzZW50IGZyb20gYW55IG9wdGlvbnNcbiAgLy8gYXJyYXkgcGVyc2lzdGVkIGJlZm9yZSB0aGUgbm90ZSBmaWx0ZXIgc2hpcHBlZC4gKCM0NDkxKVxuICBjb25zdCBub3RlV29yZHMgPSBmaWx0ZXJzLm5vdGU/LndvcmRzID8/ICcnO1xuICBjb25zdCBub3RlUHJlc2VuY2UgPSBmaWx0ZXJzLm5vdGU/LmhhcyA/PyAnJztcblxuICByZXR1cm4gY29sb3JzLmxlbmd0aCA+IDAgfHwgdGFnSWRzLmxlbmd0aCA+IDAgfHwgd29yZHMubGVuZ3RoID4gMFxuICAgIHx8IG5vdGVXb3Jkcy5sZW5ndGggPiAwIHx8IG5vdGVQcmVzZW5jZSAhPT0gJyc7XG59XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgZmlsdGVycyB3aXRoIGFuIG92ZXJsYXkuIFRoaXMgcHJldmVudHMgbXVsdGlwbGUgY2xpY2tzIGJ5IHRoZSB1c2VycyB3aGlsZSBhIHByb2Nlc3MgaGFzbid0IGZpbmlzaGVkLlxuICovXG5mdW5jdGlvbiBkaXNhYmxlRmlsdGVycygpIHtcbiAgY29uc3QgZmlsdGVyc0NvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhbm5vdGF0aW9uLWZpbHRlcnMnKTtcblxuICBpbnNlcnRPdmVybGF5T25FbGVtZW50KGZpbHRlcnNDb250YWluZXIsICdmaWx0ZXJzLW92ZXJsYXknKTtcbn1cblxuLyoqXG4gKiBFbmFibGUgdGhlIGZpbHRlcnMgYnkgcmVtb3ZpbmcgdGhlIG92ZXJsYXksIGlmIHdoZW4gcHJlc2VudC5cbiAqL1xuZnVuY3Rpb24gZW5hYmxlRmlsdGVycygpIHtcbiAgcmVtb3ZlT3ZlcmxheU9uRWxlbWVudCgnZmlsdGVycy1vdmVybGF5Jylcbn1cblxuLyoqXG4gKiBHYXRlIHRhZyBtYW5hZ2VtZW50IGljb25zIGJlaGluZCBleHBlcmltZW50YWwgZmVhdHVyZS5cbiAqIEhpZGVzIHRhZyBpY29ucyBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoZSB0YWcgbWFuYWdlbWVudCBmZWF0dXJlLlxuICovXG5mdW5jdGlvbiBnYXRlVGFnTWFuYWdlbWVudEljb25zKCkge1xuICBjb25zdCBjb2xsZWN0aW9uV3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbGxlY3Rpb25dJyk7XG4gIGNvbnN0IGhhc1RhZ01hbmFnZW1lbnQgPSBjb2xsZWN0aW9uV3JhcHBlcj8uZGF0YXNldC5oYXNUYWdNYW5hZ2VtZW50ID09PSAndHJ1ZSc7XG5cbiAgaWYgKCFoYXNUYWdNYW5hZ2VtZW50KSB7XG4gICAgY29uc3QgdGFnSWNvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYW5ub3RhdGlvbi1vcHRpb25zIFtkYXRhLW5hbWU9XCJtYW5hZ2UtdGFnc1wiXScpO1xuICAgIHRhZ0ljb25zLmZvckVhY2goKGljb24pID0+IHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSBpY29uLmNsb3Nlc3QoJy5vdGhlci1vcHRpb25zJyk7XG4gICAgICBpZiAod3JhcHBlcikge1xuICAgICAgICB3cmFwcGVyLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGFkZEFubm90YXRpb25QYWdlRXZlbnRIYW5kbGVycywgYWRkQW5ub3RhdGlvbnNBY3Rpb25IYW5kbGVycywgYXBwQ29sb3JzLCBjbGVhckZpbHRlckNvbnRyb2xzLCBkZWZhdWx0RmlsdGVycywgZGVmYXVsdE9wdGlvbnMsXG4gIGVtcGhhc2l6ZUZpbHRlcmVkVGFnc09uQW5ub3RhdGlvbnMsIGZpbHRlclRhZ3NCeVByZWZpeCwgZ2V0Q3VycmVudE9wdGlvbnMsIGdldFNlY3Rpb25NYXJrc0Zyb21TZXNzaW9uU3RvcmFnZSwgY2xlYXJNYXJrT2JqZWN0SW5TZXNzaW9uLFxuICBmZXRjaFVzZXJUYWdzLCBpc0NvbGxlY3Rpb25GaWx0ZXJlZCwgaXNUeXBlRmlsdGVyZWQsIG1hbmFnZUZpbHRlckFjY29yZGlvbnMsIG5vdGVGaWx0ZXJXb3Jkcywgc2V0T3B0aW9uVmFsdWVzLCB0ZXh0RmlsdGVyV29yZHMsXG4gIHRvZ2dsZU5vdGVGaWx0ZXJBbGxOb2lzZU5vdGljZSwgdG9nZ2xlVGV4dEZpbHRlckFsbE5vaXNlTm90aWNlLCB1cGRhdGVDb2xsZWN0aW9uLCB1cGRhdGVTdGF0ZU9mSGlnaGxpZ2h0c01lbnVEZWxldGVCdXR0b25zXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/account/annotations.js\n");
40
41/***/ }),
42
43/***/ "./resources/js/account/last-locations-bulk-delete.js":
44/*!************************************************************!*\
45  !*** ./resources/js/account/last-locations-bulk-delete.js ***!
46  \************************************************************/
47/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
48
49eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   buildBulkPayload: () => (/* binding */ buildBulkPayload),\n/* harmony export */   collectSelectedIds: () => (/* binding */ collectSelectedIds),\n/* harmony export */   collectSelectedTitles: () => (/* binding */ collectSelectedTitles),\n/* harmony export */   createBulkDeleteController: () => (/* binding */ createBulkDeleteController),\n/* harmony export */   defaultConfirmRemove: () => (/* binding */ defaultConfirmRemove),\n/* harmony export */   rowTitle: () => (/* binding */ rowTitle)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/trim */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/filter */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/from */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/set */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/set.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/index-of */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/is-array */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/promise */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/promise.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _utilities_i18n__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utilities/i18n */ \"./resources/js/utilities/i18n.js\");\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _utilities_sticky_toolbar__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utilities/sticky-toolbar */ \"./resources/js/utilities/sticky-toolbar.js\");\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Batch-delete controller for the dashboard Continue Reading list — #3088.\n *\n * A delete-only clone of the annotations batch-edit controller (#3051). Adds an\n * edit mode to the Continue Reading table that lets a user select multiple\n * titles on the current page and Remove them in a single request, plus a\n * \"remove all matching\" mode that clears every (non-pinned) entry across pages.\n *\n * Rows are matched by their ENCRYPTED LastLocation id (data-last-location-id);\n * the id stays encrypted client-side and the server decrypts and re-checks\n * ownership on every delete. Pinned rows (data-pinned=\"1\") are protected: no\n * checkbox is injected and they are never selectable.\n */\n\n\n\n\nvar EDIT_MODE_CLASS = 'bulk-edit-active';\nvar CHECKBOX_CLASS = 'bulk-select-checkbox';\n\n/**\n * Build the batch-delete request payload. Ids stay encrypted — the server\n * decrypts and enforces the UserId ownership boundary.\n *\n * @param {Array<string>} ids - encrypted LastLocation ids (ignored when mode='all')\n * @param {string} mode - 'selected' | 'all'\n * @param {Object} options - the paginator options block (collection sort/page/etc.)\n * @returns {{ids: Array<string>, mode: string, options: Object}}\n */\nfunction buildBulkPayload(ids, mode) {\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  return {\n    ids: mode === 'all' ? [] : ids,\n    mode: mode,\n    options: options\n  };\n}\n\n/**\n * Read the checked, non-pinned rows and return their encrypted ids.\n *\n * @param {HTMLElement} collection - the [data-paginated-collection] element\n * @returns {Array<string>}\n */\nfunction collectSelectedIds(collection) {\n  var _context;\n  if (!collection) {\n    return [];\n  }\n  var selected = [];\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context = collection.querySelectorAll(\".\".concat(CHECKBOX_CLASS, \":checked\"))).call(_context, function (checkbox) {\n    var row = checkbox.closest('[data-last-location-id]');\n    if (!row || row.dataset.pinned === '1' || !row.dataset.lastLocationId) {\n      return;\n    }\n    selected.push(row.dataset.lastLocationId);\n  });\n  return selected;\n}\n\n/**\n * Read the plain-text title for a Continue Reading row. The title already lives\n * in the DOM (.book-title-info a) — read textContent (never innerHTML) so the\n * value is XSS-safe when rendered into the confirm modal (#3139).\n *\n * @param {HTMLElement} row\n * @returns {string}\n */\nfunction rowTitle(row) {\n  var _context2;\n  if (!row) {\n    return '';\n  }\n  var source = row.querySelector('.book-title-info a') || row.querySelector('.book-title-info') || row.querySelector('[headers=\"book-title\"] a') || row.querySelector('[headers=\"book-title\"]');\n  return source ? _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_3___default()(_context2 = source.textContent).call(_context2) : '';\n}\n\n/**\n * Read the checked, non-pinned rows and return their titles in DOM order. Mirror\n * of collectSelectedIds, used to list the titles being removed in the confirm\
49n * modal (#3139).\n *\n * @param {HTMLElement} collection - the [data-paginated-collection] element\n * @returns {Array<string>}\n */\nfunction collectSelectedTitles(collection) {\n  var _context3;\n  if (!collection) {\n    return [];\n  }\n  var titles = [];\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context3 = collection.querySelectorAll(\".\".concat(CHECKBOX_CLASS, \":checked\"))).call(_context3, function (checkbox) {\n    var row = checkbox.closest('[data-last-location-id]');\n    if (!row || row.dataset.pinned === '1' || !row.dataset.lastLocationId) {\n      return;\n    }\n    titles.push(rowTitle(row));\n  });\n  return titles;\n}\n\n/**\n * Create the batch-delete controller.\n *\n * @param {Object} deps\n * @param {(payload: Object) => Promise<{success: boolean}>} deps.applyBatch\n *        Sends one batch-delete request and repaints the list.\n * @param {(count: number, opts: {all: boolean}) => Promise<boolean>} [deps.confirmRemove]\n * @param {(message: string, type: string) => void} [deps.notify]\n * @returns {Object} controller\n */\nfunction createBulkDeleteController(deps) {\n  var _deps$confirmRemove, _deps$notify;\n  var applyBatch = deps.applyBatch;\n  var confirmRemove = (_deps$confirmRemove = deps.confirmRemove) !== null && _deps$confirmRemove !== void 0 ? _deps$confirmRemove : defaultConfirmRemove;\n  var notify = (_deps$notify = deps.notify) !== null && _deps$notify !== void 0 ? _deps$notify : defaultNotify;\n  var editMode = false;\n  var inFlight = false;\n  // Anchor row index for shift-click range selection (#3105).\n  var anchorIndex = null;\n  // Selected ids remembered across a sort repaint (#3137). captureSelection()\n  // snapshots them before the tbody is replaced; syncAfterRepaint() restores\n  // the still-present ones afterwards.\n  var rememberedIds = null;\n  var getWrapper = function getWrapper() {\n    return document.querySelector('[data-collection]');\n  };\n  var getCollection = function getCollection() {\n    return document.querySelector('[data-paginated-collection]');\n  };\n  var getToggle = function getToggle() {\n    return document.querySelector('[data-bulk-edit-toggle]');\n  };\n  var getToggleLabel = function getToggleLabel(toggle) {\n    return ((toggle === null || toggle === void 0 ? void 0 : toggle.closest('.bulk-edit-toggle-wrapper')) || (toggle === null || toggle === void 0 ? void 0 : toggle.parentElement) || document).querySelector('[data-bulk-edit-toggle-label]');\n  };\n  var getBar = function getBar() {\n    return document.querySelector('[data-bulk-action-bar]');\n  };\n  var getSelectAll = function getSelectAll() {\n    return document.querySelector('[data-bulk-select-all]');\n  };\n  var getSelectAllWrapper = function getSelectAllWrapper() {\n    return document.querySelector('[data-bulk-select-all-wrapper]');\n  };\n  var getCountElement = function getCountElement() {\n    return document.querySelector('[data-bulk-count]');\n  };\n  var getDeleteButton = function getDeleteButton() {\n    return document.querySelector('[data-bulk-delete]');\n  };\n  var getRemoveAllButton = function getRemoveAllButton() {\n    return document.querySelector('[data-bulk-remove-all]');\n  };\n\n  // Pins the toolbar directly below the sticky main nav while edit mode is\n  // active only (#3566).\n  var stickyToolbar = (0,_utilities_sticky_toolbar__WEBPACK_IMPORTED_MODULE_13__.createStickyToolbar)(function () {\n    return document.querySelector('[data-sticky-batch-toolbar]');\n  });\n\n  // Selectable rows: a real LastLocation row that is NOT pinned (pins protected).\n  var selectableRows = function selectableRows() {\n    var _context4;\n    var collection = getCollection();\n    if (!collection) {\n      return [];\n    }\n    return _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default()(_context4 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5___default()(collection.querySelectorAll('[data-last-location-id]'))).call(_context4, function (row) {\n      return row.dataset.lastLocationId && row.dataset.pinned !== '1';\n    });\n  };\n  var rowCheckboxes = function rowCheckboxes() {\n    var collection = getCollection();\n    if (!collection) {\n      return [];\n    }\n    return _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5___default()(collection.querySelectorAll(\".\".concat(CHECKBOX_CLASS)));\n  };\n\n  // Covers-off: the server drops the Covers column, so there is no natural place\n  // for the checkbox and the controller adds its own headerless first column.\n  //\n  // Detection is driven by the table's ACTUAL structure — a Covers header\n  // (th#book-image) or a cover cell (td[headers=\"book-image\"]) — rather than by\n  // the data-show-covers hint alone. Keying off the flag by itself let a\n  // covers-off table slip down the covers-on path (checkbox jammed into the\n  // title cell, no dedicated column), which shifted the body cells out of\n  // alignment with the header (#3138). The flag is only a fallback for the\n  // empty-list c
49ase where no rows exist to inspect.\n  var hasCoverColumn = function hasCoverColumn() {\n    var collection = getCollection();\n    if (!collection) {\n      return false;\n    }\n    if (collection.querySelector('thead th#book-image, td[headers=\"book-image\"]')) {\n      return true;\n    }\n    return collection.dataset.showCovers === '1';\n  };\n  var coversHidden = function coversHidden() {\n    return !hasCoverColumn();\n  };\n  function buildCheckboxLabel() {\n    var label = document.createElement('label');\n    label.className = 'bulk-select';\n    var checkbox = document.createElement('input');\n    checkbox.type = 'checkbox';\n    checkbox.className = CHECKBOX_CLASS;\n    checkbox.setAttribute('aria-label', (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_11__.t)('account_dashboard.select_item') || 'Select title');\n    var srText = document.createElement('span');\n    srText.className = 'show-for-sr';\n    srText.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_11__.t)('account_dashboard.select_item') || 'Select title';\n    label.appendChild(checkbox);\n    label.appendChild(srText);\n    return label;\n  }\n\n  // Every data row gets a leading cell (checkbox for selectable rows, empty for\n  // pinned rows) so the injected column stays aligned with the header.\n  function ensureCheckboxColumn() {\n    var _context5;\n    var collection = getCollection();\n    if (!collection) {\n      return;\n    }\n    var headerRow = collection.querySelector('thead tr');\n    if (headerRow && !headerRow.querySelector('.bulk-select-col')) {\n      var th = document.createElement('th');\n      th.className = 'bulk-select-col';\n      headerRow.insertAdjacentElement('afterbegin', th);\n    }\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context5 = collection.querySelectorAll('tr[data-last-location-id]')).call(_context5, function (row) {\n      if (!row.querySelector('.bulk-select-cell')) {\n        var cell = document.createElement('td');\n        cell.className = 'bulk-select-cell';\n        row.insertAdjacentElement('afterbegin', cell);\n      }\n    });\n  }\n  function injectCheckboxes() {\n    var _context6;\n    var coversOff = coversHidden();\n    if (coversOff) {\n      ensureCheckboxColumn();\n    }\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context6 = selectableRows()).call(_context6, function (row) {\n      if (row.querySelector(\".\".concat(CHECKBOX_CLASS))) {\n        return;\n      }\n      var label = buildCheckboxLabel();\n\n      // Covers on: place the control in the first cell (the Covers cell).\n      // Covers off: place it in the dedicated checkbox cell added above.\n      var target;\n      if (coversOff) {\n        target = row.querySelector('.bulk-select-cell');\n      } else {\n        target = row.tagName === 'TR' ? row.querySelector('td, th') : row;\n      }\n      (target !== null && target !== void 0 ? target : row).insertAdjacentElement('afterbegin', label);\n    });\n  }\n  function removeCheckboxes() {\n    var _context7, _context8;\n    var collection = getCollection();\n    if (!collection) {\n      return;\n    }\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context7 = collection.querySelectorAll('.bulk-select')).call(_context7, function (label) {\n      return label.remove();\n    });\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context8 = collection.querySelectorAll('td.bulk-select-cell')).call(_context8, function (cell) {\n      return cell.remove();\n    });\n\n    // Removing the injected header column can leave the table laid out for the\n    // old column count until the next reflow, so the header band renders\n    // mis-styled until a refresh (#3155). Force an immediate reflow when we\n    // actually tore down a covers-off column so the header re-lays-out at once.\n    var injectedHeaderCols = collection.querySelectorAll('th.bulk-select-col');\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(injectedHeaderCols
49).call(injectedHeaderCols, function (th) {\n      return th.remove();\n    });\n    if (injectedHeaderCols.length > 0) {\n      forceReflow(collection);\n    }\n  }\n\n  /**\n   * Force a synchronous table reflow so a structural change (a removed column)\n   * is laid out immediately rather than lingering with the old column widths.\n   *\n   * @param {HTMLElement} table\n   */\n  function forceReflow(table) {\n    var previousDisplay = table.style.display;\n    table.style.display = 'none';\n    // Reading a layout property between the two writes forces the reflow.\n    void table.offsetHeight;\n    table.style.display = previousDisplay;\n  }\n  function refreshSelectionUI() {\n    var boxes = rowCheckboxes();\n    var selectedCount = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default()(boxes).call(boxes, function (cb) {\n      return cb.checked;\n    }).length;\n    var countElement = getCountElement();\n    if (countElement) {\n      countElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_11__.t)('account_dashboard.selected_count', {\n        ':count': selectedCount\n      }) || \"\".concat(selectedCount, \" selected\");\n    }\n    setActionsEnabled(selectedCount > 0);\n    var selectAll = getSelectAll();\n    if (selectAll) {\n      selectAll.checked = boxes.length > 0 && selectedCount === boxes.length;\n      selectAll.indeterminate = selectedCount > 0 && selectedCount < boxes.length;\n    }\n  }\n  function setActionsEnabled(enabled) {\n    var control = getDeleteButton();\n    if (control) {\n      control.disabled = !enabled;\n      control.setAttribute('aria-disabled', enabled ? 'false' : 'true');\n    }\n  }\n\n  /**\n   * Set the checked state of every selectable checkbox between two row indices\n   * (inclusive), used by shift-click range selection.\n   *\n   * @param {number} fromIndex\n   * @param {number} toIndex\n   * @param {boolean} checked\n   */\n  function applyRangeSelection(fromIndex, toIndex, checked) {\n    var rows = selectableRows();\n    var start = Math.min(fromIndex, toIndex);\n    var end = Math.max(fromIndex, toIndex);\n    for (var i = start; i <= end; i += 1) {\n      var _rows$i;\n      var checkbox = (_rows$i = rows[i]) === null || _rows$i === void 0 ? void 0 : _rows$i.querySelector(\".\".concat(CHECKBOX_CLASS));\n      if (checkbox) {\n        checkbox.checked = checked;\n      }\n    }\n  }\n  function resetSelection() {\n    var _context9;\n    anchorIndex = null;\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context9 = rowCheckboxes()).call(_context9, function (cb) {\n      cb.checked = false;\n    });\n    var selectAll = getSelectAll();\n    if (selectAll) {\n      selectAll.checked = false;\n      selectAll.indeterminate = false;\n    }\n    refreshSelectionUI();\n  }\n\n  /**\n   * Snapshot the currently-selected encrypted ids so they can be restored after\n   * a repaint that replaces the tbody (the sort refresh). Must be called while\n   * the ORIGINAL rows are still in the DOM (#3137).\n   */\n  function captureSelection() {\n    rememberedIds = new (_babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_6___default())(collectSelectedIds(getCollection()));\n  }\n\n  /**\n   * Re-check every selectable row whose encrypted id is in `ids`; leave the rest\n   * unchecked. Rows no longer present are simply dropped from the selection\n   * (#3137). Refreshes the count / action-bar state to match.\n   *\n   * @param {Set<string>} ids\n   */\n  function restoreSelection(ids) {\n    var _context10;\n    anchorIndex = null;\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context10 = rowCheckboxes()).call(_context10, function (cb) {\n      var row = cb.closest('[data-last-location-id]');\n      cb.checked = !!(row && ids.has(row.dataset.lastLocationId));\n    });\n    refreshSelectionUI();\n  }\n  function enterEditMode() {\n    var _getWrapper, _getBar, _getSelectAllWrapper;\n    editMode = true;\n    (_getWrapper = getWrapper()) === null || _getWrapper === void 0 || _getWrapper.classList.add(EDIT_MODE_CLASS);\n    injectCheckboxes();\n    (_getBar = getBar()) === null || _getBar === void 0 || _getBar.classList.remove('hide');\n    (_getSelectAllWrapper = getSelectAllWrapper()) === null || _getSelectAllWrapper === void 0 || _getSelectAllWrapper.classList.remove('hide');\n    stickyToolbar.activate();\n    var toggle = getToggle();\n    if (toggle) {\n      toggle.setAttribute('aria-pressed', 'true');\n      toggle.classList.remove('icon-off');\n      toggle.classList.add('icon-on');\n      var label = getToggleLabel(toggle);\n      if (label) {\n        label.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_11__.t)('account_dashboard.done') || 'Done';\n      }\n    }\n    resetSelection();\n  }\n  function exitEditMode() {\n    var _getWrapper2, _getBar2, _getSelectAllWrapper2;\n    editMode = false;\n    removeCheckboxes();\n    (_getWrapper2 = getWrapper()) === null || _getWrapper2 === void 0 || _getWrapper2.classList.remove(EDIT_MODE_CLASS);\n    (_getBar2 = getBar()) === null || _getBar2 === void 0 || _getBar2.classList.add('hide');\n    (_getSelectAllWrapper2 = getSelectAllWrapper()) === null || _getSelectAllWrapper2 === void 0 || _getSelectAllWrapper2.classList.add('hide');\n    setActionsEnabled(false);\n    stickyToolbar.deactivate();\n    var toggle = getToggle();\n    if (toggle) {\n      toggle.setAttribute('aria-pressed', 'false');\n      toggle.classList.remove('icon-on');\n      toggle.classList.add('icon-off');\n      var label = getToggleLabel(toggle);\n      if (label) {\n        label.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_11__.t)('account_dashboard.edit_mode') || 'Edit';\n      }\n      toggle.focus();\n    }\n  }\n  function toggleEditMode() {\n    if (editMode) {\n      exitEditMode();\n    } else {\n      enterEditMode();\n    }\n  }\n  function onSelectAll() {\n    var _context11;\n    var selectAll = getSelectAll();\n    if (!selectAll) {\n      return;\n    }\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context11 = rowCheckboxes()).call(_context11, function (cb) {\n      cb.checked = selectAll.checked;\n    });\n    refreshSelectionUI();\n  }\n\n  /**\n   * Re-apply edit-mode DOM to a freshly-repainted collection. When the repaint\n   * leaves no selectable rows (everything removed), auto-exit edit mode.\n   *\n   * By default the selection is cleared (the delete path — the selected rows are\n   * gone). Pass {preserveSelection: true} for the sort path (#3137): the ids\n   * captured by captureSelection() are re-checked on the still-present rows.\n   *\n   * @param {{preserveSelection?: boolean}} [options]\n   */\n  function syncAfterRepaint() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (!editMode) {\n      return;\n    }\n    if (selectableRows().length === 0) {\n      rememberedIds = null;\n      exitEditMode();\n      return;\n    }\n    injectCheckboxes();\n    if (options.preserveSelection && rememberedIds) {\n      restoreSelection(rememberedIds);\n      rememberedIds = null;\n    } else {\n      resetSelection();\n    }\n  }\n\n  /**\n   * Read the current paginator options off the table so the repaint keeps the\n   * user's page, items-per-page, and sort.\n   *\n   * @returns {Object}\n   */\n  function currentOptions() {\n    var collection = getCollection();\n    if (!collection || !collection.dataset.options) {\n      return {};\n    }\n    try {\n      return JSON.parse(collection.dataset.options);\n    } catch (error) {\n      return {};\n    }\n  }\n  function submitRemove(_x) {\n    return _submitRemove.apply(this, arguments);\n  }\n  function _submitRemove() {\n    _submitRemove = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee(mode) {\n      var ids, titles, count, rows, confirmed, payload, result;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context13) {\n        while (1) switch (_context13.prev = _context13.next) {\n          case 0:\n            if (!inFlight) {\n              _context13.next = 2;\n              break;\n            }\n            return _context13.abrupt(\"return\");\n          case 2:\n            ids = [];\n            titles = [];\n            count = 0;\n            if (!(mode === 'all')) {\n              _context13.next = 11;\n              break;\n            }\n            // The DOM only holds the current page; list those titles under the\n            // stronger \"remove ALL\" warning (product decision, #3139).\n            rows = selectableRows();\n            count = rows.length; // best-effort; server reports authoritative count\n            titles = _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_8___default()(rows).call(rows, rowTitle);\n            _context13.next = 17;\n            break;\n          case 11:\n            ids = collectSelectedIds(getCollection());\n            titles = collectSelectedTitles(getCollection());\n            count = ids.length;\n            if (!(count === 0)) {\n              _context13.next = 17;\n              break;\n            }\n            notify((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_11__.t)('account_dashboard.bulk_none_selected') || 'Select at least one title.', 'warning');\n            return _context13.abrupt(\"return\");\n          case 17:\n            _context13.next = 19;\n            return confirmRemove(count, {\n              all: mode === 'all',\n              titles: titles\n            });\n          case 19:\n            confirmed = _context13.sent;\n            if (confirmed) {\n              _context13.next = 22;\n              break;\n            }\n            return _context13.abrupt(\"return\");\n          case 22:\n            payload = buildBulkPayload(ids, mode, currentOptions());\n            inFlight = true;
49\n            setActionsEnabled(false);\n            _context13.prev = 25;\n            _context13.next = 28;\n            return applyBatch(payload);\n          case 28:\n            result = _context13.sent;\n            // The collection tbody was repainted — re-apply edit-mode DOM.\n            syncAfterRepaint();\n            if (result && result.success === false) {\n              notify((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_11__.t)('account_dashboard.bulk_remove_error') || 'There was an error updating the list.', 'error');\n            }\n          case 31:\n            _context13.prev = 31;\n            inFlight = false;\n            refreshSelectionUI();\n            return _context13.finish(31);\n          case 35:\n          case \"end\":\n            return _context13.stop();\n        }\n      }, _callee, null, [[25,, 31, 35]]);\n    }));\n    return _submitRemove.apply(this, arguments);\n  }\n  function submitDelete() {\n    return submitRemove('selected');\n  }\n  function submitRemoveAll() {\n    return submitRemove('all');\n  }\n  function init() {\n    var _getSelectAll, _getDeleteButton, _getRemoveAllButton;\n    var toggle = getToggle();\n    if (!toggle) {\n      return; // page has no bulk-delete toolbar\n    }\n\n    // #3133: the annotations toolbar uses the same generic selectors. Bind only\n    // when this page actually has Continue Reading rows, so this controller can\n    // never latch onto (and clobber) the annotations toolbar.\n    if (!document.querySelector('[data-last-location-id]')) {\n      return;\n    }\n\n    // The generic paginator repaints only the tbody (fresh rows carry no\n    // checkbox column). Re-apply edit-mode DOM so the covers-off checkbox column\n    // stays aligned after a page or items-per-page change (#3153). Selection is\n    // page-scoped, so the default reset in syncAfterRepaint() is correct here.\n    document.addEventListener('collection:repainted', function () {\n      syncAfterRepaint();\n    });\n\n    // Delegate on document so a click anywhere in the toggle survives re-renders.\n    document.addEventListener('click', function (event) {\n      if (event.target.closest('[data-bulk-edit-toggle]')) {\n        event.preventDefault();\n        toggleEditMode();\n      }\n    });\n    (_getSelectAll = getSelectAll()) === null || _getSelectAll === void 0 || _getSelectAll.addEventListener('change', onSelectAll);\n    (_getDeleteButton = getDeleteButton()) === null || _getDeleteButton === void 0 || _getDeleteButton.addEventListener('click', function (event) {\n      event.preventDefault();\n      submitDelete();\n    });\n    (_getRemoveAllButton = getRemoveAllButton()) === null || _getRemoveAllButton === void 0 || _getRemoveAllButton.addEventListener('click', function (event) {\n      event.preventDefault();\n      submitRemoveAll();\n    });\n\n    // Delegate row-checkbox changes and whole-row clicks on the stable wrapper.\n    var wrapper = getWrapper();\n    if (wrapper) {\n      wrapper.addEventListener('change', function (event) {\n        if (editMode && event.target.classList.contains(CHECKBOX_CLASS)) {\n          refreshSelectionUI();\n        }\n      });\n      wrapper.addEventListener('click', function (event) {\n        var _context12;\n        if (!editMode) {\n          return;\n        }\n        var row = event.target.closest('[data-last-location-id]');\n        if (!row || row.dataset.pinned === '1' || !row.dataset.lastLocationId) {\n          return;\n        }\n        var checkbox = row.querySelector(\".\".concat(CHECKBOX_CLASS));\n        if (!checkbox) {\n          return;\n        }\n\n        // A click on the checkbox itself toggles natively; clicks elsewhere in\n        // the row toggle here. Other interactive controls (links, buttons) keep\n        // their normal behavior.\n        var onCheckbox = event.target.closest('.bulk-select') !== null;\n        var onInteractive = event.target.closest('a, button, input') !== null;\n        if (onInteractive && !onCheckbox) {\n          return;\n        }\n        if (!onCheckbox) {\n          checkbox.checked = !checkbox.checked;\n        }\n        var index = _babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_7___default()(_context12 = selectableRows()).call(_context12, row);\n        if (event.shiftKey && anchorIndex !== null && anchorIndex !== index) {\n          applyRangeSelection(anchorIndex, index, checkbox.checked);\n        } else {\n          anchorIndex = index;\n        }\n        refreshSelectionUI();\n      });\n    }\n  }\n  return {\n    init: init,\n    enterEditMode: enterEditMode,\n    exitEditMode: exitEditMode,\n    toggleEditMode: toggleEditMode,\n    refreshSelectionUI: refreshSelectionUI,\n    captureSelection: captureSelection,\n    syncAfterRepaint: syncAfterRepaint,\n    submitDelete: submitDelete,\n    submitRemoveAll: submitRemoveAll,\n    getSelectedIds: function getSelectedIds() {\
49n      return collectSelectedIds(getCollection());\n    }\n  };\n}\n\n/**\n * Populate the confirm modal's scrollable list with the titles being removed.\n * Titles are inserted via textContent (never innerHTML) so any markup in a\n * title is inert text, and each <li> carries a title attribute so a truncated\n * (ellipsized) row still shows the full text on hover (#3139). The container is\n * hidden when there are no titles.\n *\n * @param {HTMLElement} modal\n * @param {Array<string>} titles\n */\nfunction populateBulkDeleteList(modal, titles) {\n  var listEl = modal.querySelector('[data-bulk-delete-list]');\n  if (!listEl) {\n    return;\n  }\n  listEl.textContent = '';\n  var hasTitles = titles.length > 0;\n  listEl.hidden = !hasTitles;\n  listEl.classList.toggle('hide', !hasTitles);\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(titles).call(titles, function (title) {\n    var li = document.createElement('li');\n    li.textContent = title;\n    li.setAttribute('title', title);\n    listEl.appendChild(li);\n  });\n}\n\n/**\n * Default confirm gate using the Foundation reveal modal. The \"all\" mode uses a\n * stronger message so the across-pages remove is never a surprise. When titles\n * are supplied they are listed in a scrollable list inside the modal (#3139).\n *\n * @param {number} count\n * @param {{all: boolean, titles?: Array<string>}} opts\n * @returns {Promise<boolean>}\n */\nfunction defaultConfirmRemove(count) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var modal = document.querySelector('[data-bulk-delete-modal]');\n  var titles = _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_9___default()(opts.titles) ? opts.titles : [];\n  var message = opts.all ? (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_11__.t)('account_dashboard.bulk_remove_all_confirm', {\n    ':count': count\n  }) || \"Remove ALL \".concat(count, \" titles from your Continue Reading list?\") : (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_11__.t)('account_dashboard.bulk_remove_confirm', {\n    ':count': count\n  }) || \"Remove \".concat(count, \" titles from your Continue Reading list?\");\n  if (modal) {\n    var messageEl = modal.querySelector('[data-bulk-delete-message]');\n    if (messageEl) {\n      messageEl.textContent = message;\n    }\n    populateBulkDeleteList(modal, titles);\n  }\n  if (!modal || typeof jQuery === 'undefined') {\n    // eslint-disable-next-line no-alert\n    return _babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_10___default().resolve(window.confirm(message));\n  }\n  return new (_babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_10___default())(function (resolve) {\n    var confirmButton = modal.querySelector('[data-bulk-delete-confirm]');\n    var $modal = jQuery(modal);\n    var settled = false;\n    var finish = function finish(result) {\n      if (settled) {\n        return;\n      }\n      settled = true;\n      confirmButton === null || confirmButton === void 0 || confirmButton.removeEventListener('click', onConfirm);\n      $modal.off('closed.zf.reveal', onClose);\n      resolve(result);\n    };\n\n    // Settle with `true` BEFORE closing the reveal so the synchronous\n    // 'closed.zf.reveal' onClose does not short-circuit the confirm (#3051).\n    var onConfirm = function onConfirm() {\n      finish(true);\n      $modal.foundation('close');\n    };\n    var onClose = function onClose() {\n      return finish(false);\n    };\n    confirmButton === null || confirmButton === void 0 || confirmButton.addEventListener('click', onConfirm);\n    $modal.on('closed.zf.reveal', onClose);\n    $modal.foundation('open');\n  });\n}\n\n/**\n * Default notice implementation.\n *\n * @param {string} message\n * @param {string} type\n */\nfunction defaultNotify(message, type) {\n  var notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_12__.AsyncNotice(message, type);\n  notice.create({});\n  notice.remove(4);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWNjb3VudC9sYXN0LWxvY2F0aW9ucy1idWxrLWRlbGV0ZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0F
49BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0F
49BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy9hY2NvdW50L2xhc3QtbG9jYXRpb25zLWJ1bGstZGVsZXRlLmpzPzIwODAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXRjaC1kZWxldGUgY29udHJvbGxlciBmb3IgdGhlIGRhc2hib2FyZCBDb250aW51ZSBSZWFkaW5nIGxpc3Qg4oCUICMzMDg4LlxuICpcbiAqIEEgZGVsZXRlLW9ubHkgY2xvbmUgb2YgdGhlIGFubm90YXRpb25zIGJhdGNoLWVkaXQgY29udHJvbGxlciAoIzMwNTEpLiBBZGRzIGFuXG4gKiBlZGl0IG1vZGUgdG8gdGhlIENvbnRpbnVlIFJlYWRpbmcgdGFibGUgdGhhdCBsZXRzIGEgdXNlciBzZWxlY3QgbXVsdGlwbGVcbiAqIHRpdGxlcyBvbiB0aGUgY3VycmVudCBwYWdlIGFuZCBSZW1vdmUgdGhlbSBpbiBhIHNpbmdsZSByZXF1ZXN0LCBwbHVzIGFcbiAqIFwicmVtb3ZlIGFsbCBtYXRjaGluZ1wiIG1vZGUgdGhhdCBjbGVhcnMgZXZlcnkgKG5vbi1waW5uZWQpIGVudHJ5IGFjcm9zcyBwYWdlcy5cbiAqXG4gKiBSb3dzIGFyZSBtYXRjaGVkIGJ5IHRoZWlyIEVOQ1JZUFRFRCBMYXN0TG9jYXRpb24gaWQgKGRhdGEtbGFzdC1sb2NhdGlvbi1pZCk7XG4gKiB0aGUgaWQgc3RheXMgZW5jcnlwdGVkIGNsaWVudC1zaWRlIGFuZCB0aGUgc2VydmVyIGRlY3J5cHRzIGFuZCByZS1jaGVja3NcbiAqIG93bmVyc2hpcCBvbiBldmVyeSBkZWxldGUuIFBpbm5lZCByb3dzIChkYXRhLXBpbm5lZD1cIjFcIikgYXJlIHByb3RlY3RlZDogbm9cbiAqIGNoZWNrYm94IGlzIGluamVjdGVkIGFuZCB0aGV5IGFyZSBuZXZlciBzZWxlY3RhYmxlLlxuICovXG5cbmltcG9ydCB7IHQgfSBmcm9tICcuLi91dGlsaXRpZXMvaTE4bic7XG5pbXBvcnQgeyBBc3luY05vdGljZSB9IGZyb20gJy4uL25vdGljZXMvbm90aWNlJztcbmltcG9ydCB7IGNyZWF0ZVN0aWNreVRvb2xiYXIgfSBmcm9tICcuLi91dGlsaXRpZXMvc3RpY2t5LXRvb2xiYXInO1xuXG5jb25zdCBFRElUX01PREVfQ0xBU1MgPSAnYnVsay1lZGl0LWFjdGl2ZSc7XG5jb25zdCBDSEVDS0JPWF9DTEFTUyA9ICdidWxrLXNlbGVjdC1jaGVja2JveCc7XG5cbi8qKlxuICogQnVpbGQgdGhlIGJhdGNoLWRlbGV0ZSByZXF1ZXN0IHBheWxvYWQuIElkcyBzdGF5IGVuY3J5cHRlZCDigJQgdGhlIHNlcnZlclxuICogZGVjcnlwdHMgYW5kIGVuZm9yY2VzIHRoZSBVc2VySWQgb3duZXJzaGlwIGJvdW5kYXJ5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gaWRzIC0gZW5jcnlwdGVkIExhc3RMb2NhdGlvbiBpZHMgKGlnbm9yZWQgd2hlbiBtb2RlPSdhbGwnKVxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGUgLSAnc2VsZWN0ZWQnIHwgJ2FsbCdcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gdGhlIHBhZ2luYXRvciBvcHRpb25zIGJsb2NrIChjb2xsZWN0aW9uIHNvcnQvcGFnZS9ldGMuKVxuICogQHJldHVybnMge3tpZHM6IEFycmF5PHN0cmluZz4sIG1vZGU6IHN0cmluZywgb3B0aW9uczogT2JqZWN0fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQnVsa1BheWxvYWQoaWRzLCBtb2RlLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHsgaWRzOiBtb2RlID09PSAnYWxsJyA/IFtdIDogaWRzLCBtb2RlLCBvcHRpb25zIH07XG59XG5cbi8qKlxuICogUmVhZCB0aGUgY2hlY2tlZCwgbm9uLXBpbm5lZCByb3dzIGFuZCByZXR1cm4gdGhlaXIgZW5jcnlwdGVkIGlkcy5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb2xsZWN0aW9uIC0gdGhlIFtkYXRhLXBhZ2luYXRlZC1jb2xsZWN0aW9uXSBlbGVtZW50XG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RTZWxlY3RlZElkcyhjb2xsZWN0aW9uKSB7XG4gIGlmICghY29sbGVjdGlvbikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHNlbGVjdGVkID0gW107XG4gIGNvbGxlY3Rpb24ucXVlcnlTZWxlY3RvckFsbChgLiR7Q0hFQ0tCT1hfQ0xBU1N9OmNoZWNrZWRgKS5mb3JFYWNoKChjaGVja2JveCkgPT4ge1xuICAgIGNvbnN0IHJvdyA9IGNoZWNrYm94LmNsb3Nlc3QoJ1tkYXRhLWxhc3QtbG9jYXRpb24taWRdJyk7XG4gICAgaWYgKCFyb3cgfHwgcm93LmRhdGFzZXQucGlubmVkID09PSAnMScgfHwgIXJvdy5kYXRhc2V0Lmxhc3RMb2NhdGlvbklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlbGVjdGVkLnB1c2gocm93LmRhdGFzZXQubGFzdExvY2F0aW9uSWQpO1xuICB9KTtcblxuICByZXR1cm4gc2VsZWN0ZWQ7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgcGxhaW4tdGV4dCB0aXRsZSBmb3IgYSBDb250aW51ZSBSZWFkaW5nIHJvdy4gVGhlIHRpdGxlIGFscmVhZHkgbGl2ZXNcbiAqIGluIHRoZSBET00gKC5ib29rLXRpdGxlLWluZm8gYSkg4oCUIHJlYWQgdGV4dENvbnRlbnQgKG5ldmVyIGlubmVySFRNTCkgc28gdGhlXG4gKiB2YWx1ZSBpcyBYU1Mtc2FmZSB3aGVuIHJlbmRlcmVkIGludG8gdGhlIGNvbmZpcm0gbW9kYWwgKCMzMTM5KS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByb3dcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3dUaXRsZShyb3cpIHtcbiAgaWYgKCFyb3cpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3Qgc291cmNlID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5ib29rLXRpdGxlLWluZm8gYScpXG4gICAgfHwgcm93LnF1ZXJ5U2VsZWN0b3IoJy5ib29rLXRpdGxlLWluZm8nKVxuICAgIHx8IHJvdy5xdWVyeVNlbGVjdG9yKCdbaGVhZGVycz1cImJvb2stdGl0bGVcIl0gYScpXG4gICAgfHwgcm93LnF1ZXJ5U2VsZWN0b3IoJ1toZWFkZXJzPVwiYm9vay10aXRsZVwiXScpO1xuICByZXR1cm4gc291cmNlID8gc291cmNlLnRleHRDb250ZW50LnRyaW0oKSA6ICcnO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIGNoZWNrZWQsIG5vbi1waW5uZWQgcm93cyBhbmQgcmV0dXJuIHRoZWlyIHRpdGxlcyBpbiBET00gb3JkZXIuIE1pcnJvclxuICogb2YgY29sbGVjdFNlbGVjdGVkSWRzLCB1c2VkIHRvIGxpc3QgdGhlIHRpdGxlcyBiZWluZyByZW1vdmVkIGluIHRoZSBjb25maXJtXG4gKiBtb2RhbCAoIzMxMzkpLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbGxlY3Rpb24gLSB0aGUgW2R
49hdGEtcGFnaW5hdGVkLWNvbGxlY3Rpb25dIGVsZW1lbnRcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFNlbGVjdGVkVGl0bGVzKGNvbGxlY3Rpb24pIHtcbiAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgdGl0bGVzID0gW107XG4gIGNvbGxlY3Rpb24ucXVlcnlTZWxlY3RvckFsbChgLiR7Q0hFQ0tCT1hfQ0xBU1N9OmNoZWNrZWRgKS5mb3JFYWNoKChjaGVja2JveCkgPT4ge1xuICAgIGNvbnN0IHJvdyA9IGNoZWNrYm94LmNsb3Nlc3QoJ1tkYXRhLWxhc3QtbG9jYXRpb24taWRdJyk7XG4gICAgaWYgKCFyb3cgfHwgcm93LmRhdGFzZXQucGlubmVkID09PSAnMScgfHwgIXJvdy5kYXRhc2V0Lmxhc3RMb2NhdGlvbklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRpdGxlcy5wdXNoKHJvd1RpdGxlKHJvdykpO1xuICB9KTtcblxuICByZXR1cm4gdGl0bGVzO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgYmF0Y2gtZGVsZXRlIGNvbnRyb2xsZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlcHNcbiAqIEBwYXJhbSB7KHBheWxvYWQ6IE9iamVjdCkgPT4gUHJvbWlzZTx7c3VjY2VzczogYm9vbGVhbn0+fSBkZXBzLmFwcGx5QmF0Y2hcbiAqICAgICAgICBTZW5kcyBvbmUgYmF0Y2gtZGVsZXRlIHJlcXVlc3QgYW5kIHJlcGFpbnRzIHRoZSBsaXN0LlxuICogQHBhcmFtIHsoY291bnQ6IG51bWJlciwgb3B0czoge2FsbDogYm9vbGVhbn0pID0+IFByb21pc2U8Ym9vbGVhbj59IFtkZXBzLmNvbmZpcm1SZW1vdmVdXG4gKiBAcGFyYW0geyhtZXNzYWdlOiBzdHJpbmcsIHR5cGU6IHN0cmluZykgPT4gdm9pZH0gW2RlcHMubm90aWZ5XVxuICogQHJldHVybnMge09iamVjdH0gY29udHJvbGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQnVsa0RlbGV0ZUNvbnRyb2xsZXIoZGVwcykge1xuICBjb25zdCB7IGFwcGx5QmF0Y2ggfSA9IGRlcHM7XG4gIGNvbnN0IGNvbmZpcm1SZW1vdmUgPSBkZXBzLmNvbmZpcm1SZW1vdmUgPz8gZGVmYXVsdENvbmZpcm1SZW1vdmU7XG4gIGNvbnN0IG5vdGlmeSA9IGRlcHMubm90aWZ5ID8/IGRlZmF1bHROb3RpZnk7XG5cbiAgbGV0IGVkaXRNb2RlID0gZmFsc2U7XG4gIGxldCBpbkZsaWdodCA9IGZhbHNlO1xuICAvLyBBbmNob3Igcm93IGluZGV4IGZvciBzaGlmdC1jbGljayByYW5nZSBzZWxlY3Rpb24gKCMzMTA1KS5cbiAgbGV0IGFuY2hvckluZGV4ID0gbnVsbDtcbiAgLy8gU2VsZWN0ZWQgaWRzIHJlbWVtYmVyZWQgYWNyb3NzIGEgc29ydCByZXBhaW50ICgjMzEzNykuIGNhcHR1cmVTZWxlY3Rpb24oKVxuICAvLyBzbmFwc2hvdHMgdGhlbSBiZWZvcmUgdGhlIHRib2R5IGlzIHJlcGxhY2VkOyBzeW5jQWZ0ZXJSZXBhaW50KCkgcmVzdG9yZXNcbiAgLy8gdGhlIHN0aWxsLXByZXNlbnQgb25lcyBhZnRlcndhcmRzLlxuICBsZXQgcmVtZW1iZXJlZElkcyA9IG51bGw7XG5cbiAgY29uc3QgZ2V0V3JhcHBlciA9ICgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbGxlY3Rpb25dJyk7XG4gIGNvbnN0IGdldENvbGxlY3Rpb24gPSAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYWdpbmF0ZWQtY29sbGVjdGlvbl0nKTtcbiAgY29uc3QgZ2V0VG9nZ2xlID0gKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1lZGl0LXRvZ2dsZV0nKTtcbiAgY29uc3QgZ2V0VG9nZ2xlTGFiZWwgPSAodG9nZ2xlKSA9PlxuICAgICh0b2dnbGU/LmNsb3Nlc3QoJy5idWxrLWVkaXQtdG9nZ2xlLXdyYXBwZXInKSB8fCB0b2dnbGU/LnBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQpXG4gICAgICAucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1lZGl0LXRvZ2dsZS1sYWJlbF0nKTtcbiAgY29uc3QgZ2V0QmFyID0gKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1hY3Rpb24tYmFyXScpO1xuICBjb25zdCBnZXRTZWxlY3RBbGwgPSAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1idWxrLXNlbGVjdC1hbGxdJyk7XG4gIGNvbnN0IGdldFNlbGVjdEFsbFdyYXBwZXIgPSAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1idWxrLXNlbGVjdC1hbGwtd3JhcHBlcl0nKTtcbiAgY29uc3QgZ2V0Q291bnRFbGVtZW50ID0gKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1jb3VudF0nKTtcbiAgY29uc3QgZ2V0RGVsZXRlQnV0dG9uID0gKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1kZWxldGVdJyk7XG4gIGNvbnN0IGdldFJlbW92ZUFsbEJ1dHRvbiA9ICgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWJ1bGstcmVtb3ZlLWFsbF0nKTtcblxuICAvLyBQaW5zIHRoZSB0b29sYmFyIGRpcmVjdGx5IGJlbG93IHRoZSBzdGlja3kgbWFpbiBuYXYgd2hpbGUgZWRpdCBtb2RlIGlzXG4gIC8vIGFjdGl2ZSBvbmx5ICgjMzU2NikuXG4gIGNvbnN0IHN0aWNreVRvb2xiYXIgPSBjcmVhdGVTdGlja3lUb29sYmFyKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXN0aWNreS1iYXRjaC10b29sYmFyXScpKTtcblxuICAvLyBTZWxlY3RhYmxlIHJvd3M6IGEgcmVhbCBMYXN0TG9jYXRpb24gcm93IHRoYXQgaXMgTk9UIHBpbm5lZCAocGlucyBwcm90ZWN0ZWQpLlxuICBjb25zdCBzZWxlY3RhYmxlUm93cyA9ICgpID0+IHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gZ2V0Q29sbGVjdGlvbigpO1xuICAgIGlmICghY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShjb2xsZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWxhc3QtbG9jYXRpb24taWRdJykpXG4gICAgICAuZmlsdGVyKChyb3cpID0+IHJvdy5kYXRhc2V0Lmxhc3RMb2NhdGlvbklkICYmIHJvdy5kYXRhc2V0LnBpbm5lZCAhPT0gJzEnKTtcbiAgfTtcblxuICBjb25zdCByb3dDaGVja2JveGVzID0gKCkgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uKCk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybi
49BBcnJheS5mcm9tKGNvbGxlY3Rpb24ucXVlcnlTZWxlY3RvckFsbChgLiR7Q0hFQ0tCT1hfQ0xBU1N9YCkpO1xuICB9O1xuXG4gIC8vIENvdmVycy1vZmY6IHRoZSBzZXJ2ZXIgZHJvcHMgdGhlIENvdmVycyBjb2x1bW4sIHNvIHRoZXJlIGlzIG5vIG5hdHVyYWwgcGxhY2VcbiAgLy8gZm9yIHRoZSBjaGVja2JveCBhbmQgdGhlIGNvbnRyb2xsZXIgYWRkcyBpdHMgb3duIGhlYWRlcmxlc3MgZmlyc3QgY29sdW1uLlxuICAvL1xuICAvLyBEZXRlY3Rpb24gaXMgZHJpdmVuIGJ5IHRoZSB0YWJsZSdzIEFDVFVBTCBzdHJ1Y3R1cmUg4oCUIGEgQ292ZXJzIGhlYWRlclxuICAvLyAodGgjYm9vay1pbWFnZSkgb3IgYSBjb3ZlciBjZWxsICh0ZFtoZWFkZXJzPVwiYm9vay1pbWFnZVwiXSkg4oCUIHJhdGhlciB0aGFuIGJ5XG4gIC8vIHRoZSBkYXRhLXNob3ctY292ZXJzIGhpbnQgYWxvbmUuIEtleWluZyBvZmYgdGhlIGZsYWcgYnkgaXRzZWxmIGxldCBhXG4gIC8vIGNvdmVycy1vZmYgdGFibGUgc2xpcCBkb3duIHRoZSBjb3ZlcnMtb24gcGF0aCAoY2hlY2tib3ggamFtbWVkIGludG8gdGhlXG4gIC8vIHRpdGxlIGNlbGwsIG5vIGRlZGljYXRlZCBjb2x1bW4pLCB3aGljaCBzaGlmdGVkIHRoZSBib2R5IGNlbGxzIG91dCBvZlxuICAvLyBhbGlnbm1lbnQgd2l0aCB0aGUgaGVhZGVyICgjMzEzOCkuIFRoZSBmbGFnIGlzIG9ubHkgYSBmYWxsYmFjayBmb3IgdGhlXG4gIC8vIGVtcHR5LWxpc3QgY2FzZSB3aGVyZSBubyByb3dzIGV4aXN0IHRvIGluc3BlY3QuXG4gIGNvbnN0IGhhc0NvdmVyQ29sdW1uID0gKCkgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uKCk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb2xsZWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkIHRoI2Jvb2staW1hZ2UsIHRkW2hlYWRlcnM9XCJib29rLWltYWdlXCJdJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbi5kYXRhc2V0LnNob3dDb3ZlcnMgPT09ICcxJztcbiAgfTtcbiAgY29uc3QgY292ZXJzSGlkZGVuID0gKCkgPT4gIWhhc0NvdmVyQ29sdW1uKCk7XG5cbiAgZnVuY3Rpb24gYnVpbGRDaGVja2JveExhYmVsKCkge1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5jbGFzc05hbWUgPSAnYnVsay1zZWxlY3QnO1xuXG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9IENIRUNLQk9YX0NMQVNTO1xuICAgIGNoZWNrYm94LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQoJ2FjY291bnRfZGFzaGJvYXJkLnNlbGVjdF9pdGVtJykgfHwgJ1NlbGVjdCB0aXRsZScpO1xuXG4gICAgY29uc3Qgc3JUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNyVGV4dC5jbGFzc05hbWUgPSAnc2hvdy1mb3Itc3InO1xuICAgIHNyVGV4dC50ZXh0Q29udGVudCA9IHQoJ2FjY291bnRfZGFzaGJvYXJkLnNlbGVjdF9pdGVtJykgfHwgJ1NlbGVjdCB0aXRsZSc7XG5cbiAgICBsYWJlbC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoc3JUZXh0KTtcbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICAvLyBFdmVyeSBkYXRhIHJvdyBnZXRzIGEgbGVhZGluZyBjZWxsIChjaGVja2JveCBmb3Igc2VsZWN0YWJsZSByb3dzLCBlbXB0eSBmb3JcbiAgLy8gcGlubmVkIHJvd3MpIHNvIHRoZSBpbmplY3RlZCBjb2x1bW4gc3RheXMgYWxpZ25lZCB3aXRoIHRoZSBoZWFkZXIuXG4gIGZ1bmN0aW9uIGVuc3VyZUNoZWNrYm94Q29sdW1uKCkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uKCk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVyUm93ID0gY29sbGVjdGlvbi5xdWVyeVNlbGVjdG9yKCd0aGVhZCB0cicpO1xuICAgIGlmIChoZWFkZXJSb3cgJiYgIWhlYWRlclJvdy5xdWVyeVNlbGVjdG9yKCcuYnVsay1zZWxlY3QtY29sJykpIHtcbiAgICAgIGNvbnN0IHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcbiAgICAgIHRoLmNsYXNzTmFtZSA9ICdidWxrLXNlbGVjdC1jb2wnO1xuICAgICAgaGVhZGVyUm93Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJiZWdpbicsIHRoKTtcbiAgICB9XG5cbiAgICBjb2xsZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyW2RhdGEtbGFzdC1sb2NhdGlvbi1pZF0nKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmICghcm93LnF1ZXJ5U2VsZWN0b3IoJy5idWxrLXNlbGVjdC1jZWxsJykpIHtcbiAgICAgICAgY29uc3QgY2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7XG4gICAgICAgIGNlbGwuY2xhc3NOYW1lID0gJ2J1bGstc2VsZWN0LWNlbGwnO1xuICAgICAgICByb3cuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmJlZ2luJywgY2VsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbmplY3RDaGVja2JveGVzKCkge1xuICAgIGNvbnN0IGNvdmVyc09mZiA9IGNvdmVyc0hpZGRlbigpO1xuICAgIGlmIChjb3ZlcnNPZmYpIHtcbiAgICAgIGVuc3VyZUNoZWNrYm94Q29sdW1uKCk7XG4gICAgfVxuXG4gICAgc2VsZWN0YWJsZVJvd3MoKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChyb3cucXVlcnlTZWxlY3RvcihgLiR7Q0hFQ0tCT1hfQ0xBU1N9YCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYWJlbCA9IGJ1aWxkQ2hlY2tib3hMYWJlbCgpO1xuXG4gICAgICAvLyBDb3ZlcnMgb246IHBsYWNlIHRoZSBjb250cm9sIGluIHRoZSBmaXJzdCBjZWxsICh0aGUgQ292ZXJzIGNlbGwpLlxuICAgICAgLy8gQ292ZXJzIG9mZjogcGxhY2UgaXQgaW4gdGhlIGRlZGljYXRlZCBjaGVja2JveCBjZWxsIGFkZGVkIGFib3ZlLlxuICAgICAgbGV0IHRhcmdldDtcbiAgICAgIGlmIChjb3ZlcnNPZmYpIHtcbiAgICAgICAgdGFyZ2V0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5idWxrLXNlbGVjdC1jZWxsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSByb3cudGFnTmFtZSA9PT0gJ1RSJyA/IHJvdy5xdWVyeVNlbGVjdG9yKCd0ZCwgdGgnKSA6IHJvdztcbiAgICAgIH1cbiAgICAgICh0YXJnZXQgPz8gcm93KS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyYmVnaW4nLCBsYWJlbCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVDaGVja2JveGVzKCkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uKCk7XG4gICAgaWYgKCFjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbGxlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnLmJ1bGstc2VsZWN0JykuZm9yRWFjaCgobGFiZWwpID0+IGxhYmVsLnJlbW92ZSgpKTtcbiAgICBjb2xsZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLmJ1bGstc2VsZWN0LWNlbGwnKS5mb3JFYWNoKChjZWxsKSA9PiBjZWxsLnJlbW92ZSgpKTtcblxuICAgIC8vIFJlbW92aW5nIHRoZSBpbmplY3RlZCBoZWFkZXIgY29sdW1uIGNhbiBsZWF2ZSB0aGUgdGFibGUgbGFpZCBvdXQgZm9yIHRoZVxuICAgIC8vIG9sZCBjb2x1bW4gY291bnQgdW50aWwgdGhlIG5leHQgcmVmbG93LCBzbyB0aGUgaGVhZGVyIGJhbmQgcmVuZGVyc1xuICAgIC8vIG1pcy1zdHlsZWQgdW50aWwgYSByZWZyZXNoICgjMzE1NSkuIEZvcmNlIGFuIGltbWVkaWF0ZSByZWZsb3cgd2hlbiB3ZVxuICAgIC8vIGFjdHVhbGx5IHRvcmUgZG93biBhIGNvdmVycy1vZmYgY29sdW1uIHNvIHRoZSBoZWFkZXIgcmUtbGF5cy1vdXQgYXQgb25jZS5cbiAgICBjb25zdCBpbmplY3RlZEhlYWRlckNvbHMgPSBjb2xsZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoLmJ1bGstc2VsZWN0LWNvbCcpO1xuICAgIGluamVjdGVkSGVhZGVyQ29scy5mb3JFYWNoKCh0aCkgPT4gdGgucmVtb3ZlKCkpO1xuICAgIGlmIChpbmplY3RlZEhlYWRlckNvbHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yY2VSZWZsb3coY29sbGVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIGEgc3luY2hyb25vdXMgdGFibGUgcmVmbG93IHNvIGEgc3RydWN0dXJhbCBjaGFuZ2UgKGEgcmVtb3ZlZCBjb2x1bW4pXG4gICAqIGlzIGxhaWQgb3V0IGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGxpbmdlcmluZyB3aXRoIHRoZSBvbGQgY29sdW1uIHdpZHRocy5cbiAgICpcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFibGVcbiAgICovXG4gIGZ1bmN0aW9uIGZvcmNlUmVmbG93KHRhYmxlKSB7XG4gICAgY29uc3QgcHJldmlvdXNEaXNwbGF5ID0gdGFibGUuc3R5bGUuZGlzcGxheTtcbiAgICB0YWJsZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIC8vIFJlYWRpbmcgYSBsYXlvdXQgcHJvcGVydHkgYmV0d2VlbiB0aGUgdHdvIHdyaXRlcyBmb3JjZXMgdGhlIHJlZmxvdy5cbiAgICB2b2lkIHRhYmxlLm9mZnNldEhlaWdodDtcbiAgICB0YWJsZS5zdHlsZS5kaXNwbGF5ID0gcHJldmlvdXNEaXNwbGF5O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVmcmVzaFNlbGVjdGlvblVJKCkge1xuICAgIGNvbnN0IGJveGVzID0gcm93Q2hlY2tib3hlcygpO1xuICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBib3hlcy5maWx0ZXIoKGNiKSA9PiBjYi5jaGVja2VkKS5sZW5ndGg7XG5cbiAgICBjb25zdCBjb3VudEVsZW1lbnQgPSBnZXRDb3VudEVsZW1lbnQoKTtcbiAgICBpZiAoY291bnRFbGVtZW50KSB7XG4gICAgICBjb3VudEVsZW1lbnQudGV4dENvbnRlbnQgPSB0KCdhY2NvdW50X2Rhc2hib2FyZC5zZWxlY3RlZF9jb3VudCcsIHsgJzpjb3VudCc6IHNlbGVjdGVkQ291bnQgfSlcbiAgICAgICAgfHwgYCR7c2VsZWN0ZWRDb3VudH0gc2VsZWN0ZWRgO1xuICAgIH1cblxuICAgI
49HNldEFjdGlvbnNFbmFibGVkKHNlbGVjdGVkQ291bnQgPiAwKTtcblxuICAgIGNvbnN0IHNlbGVjdEFsbCA9IGdldFNlbGVjdEFsbCgpO1xuICAgIGlmIChzZWxlY3RBbGwpIHtcbiAgICAgIHNlbGVjdEFsbC5jaGVja2VkID0gYm94ZXMubGVuZ3RoID4gMCAmJiBzZWxlY3RlZENvdW50ID09PSBib3hlcy5sZW5ndGg7XG4gICAgICBzZWxlY3RBbGwuaW5kZXRlcm1pbmF0ZSA9IHNlbGVjdGVkQ291bnQgPiAwICYmIHNlbGVjdGVkQ291bnQgPCBib3hlcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0QWN0aW9uc0VuYWJsZWQoZW5hYmxlZCkge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBnZXREZWxldGVCdXR0b24oKTtcbiAgICBpZiAoY29udHJvbCkge1xuICAgICAgY29udHJvbC5kaXNhYmxlZCA9ICFlbmFibGVkO1xuICAgICAgY29udHJvbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCBlbmFibGVkID8gJ2ZhbHNlJyA6ICd0cnVlJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBldmVyeSBzZWxlY3RhYmxlIGNoZWNrYm94IGJldHdlZW4gdHdvIHJvdyBpbmRpY2VzXG4gICAqIChpbmNsdXNpdmUpLCB1c2VkIGJ5IHNoaWZ0LWNsaWNrIHJhbmdlIHNlbGVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleFxuICAgKiBAcGFyYW0ge251bWJlcn0gdG9JbmRleFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5UmFuZ2VTZWxlY3Rpb24oZnJvbUluZGV4LCB0b0luZGV4LCBjaGVja2VkKSB7XG4gICAgY29uc3Qgcm93cyA9IHNlbGVjdGFibGVSb3dzKCk7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1pbihmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KGZyb21JbmRleCwgdG9JbmRleCk7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBjaGVja2JveCA9IHJvd3NbaV0/LnF1ZXJ5U2VsZWN0b3IoYC4ke0NIRUNLQk9YX0NMQVNTfWApO1xuICAgICAgaWYgKGNoZWNrYm94KSB7XG4gICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSBjaGVja2VkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0U2VsZWN0aW9uKCkge1xuICAgIGFuY2hvckluZGV4ID0gbnVsbDtcbiAgICByb3dDaGVja2JveGVzKCkuZm9yRWFjaCgoY2IpID0+IHsgY2IuY2hlY2tlZCA9IGZhbHNlOyB9KTtcbiAgICBjb25zdCBzZWxlY3RBbGwgPSBnZXRTZWxlY3RBbGwoKTtcbiAgICBpZiAoc2VsZWN0QWxsKSB7XG4gICAgICBzZWxlY3RBbGwuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgc2VsZWN0QWxsLmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmVmcmVzaFNlbGVjdGlvblVJKCk7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3QgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCBlbmNyeXB0ZWQgaWRzIHNvIHRoZXkgY2FuIGJlIHJlc3RvcmVkIGFmdGVyXG4gICAqIGEgcmVwYWludCB0aGF0IHJlcGxhY2VzIHRoZSB0Ym9keSAodGhlIHNvcnQgcmVmcmVzaCkuIE11c3QgYmUgY2FsbGVkIHdoaWxlXG4gICAqIHRoZSBPUklHSU5BTCByb3dzIGFyZSBzdGlsbCBpbiB0aGUgRE9NICgjMzEzNykuXG4gICAqL1xuICBmdW5jdGlvbiBjYXB0dXJlU2VsZWN0aW9uKCkge1xuICAgIHJlbWVtYmVyZWRJZHMgPSBuZXcgU2V0KGNvbGxlY3RTZWxlY3RlZElkcyhnZXRDb2xsZWN0aW9uKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1jaGVjayBldmVyeSBzZWxlY3RhYmxlIHJvdyB3aG9zZSBlbmNyeXB0ZWQgaWQgaXMgaW4gYGlkc2A7IGxlYXZlIHRoZSByZXN0XG4gICAqIHVuY2hlY2tlZC4gUm93cyBubyBsb25nZXIgcHJlc2VudCBhcmUgc2ltcGx5IGRyb3BwZWQgZnJvbSB0aGUgc2VsZWN0aW9uXG4gICAqICgjMzEzNykuIFJlZnJlc2hlcyB0aGUgY291bnQgLyBhY3Rpb24tYmFyIHN0YXRlIHRvIG1hdGNoLlxuICAgKlxuICAgKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBpZHNcbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVTZWxlY3Rpb24oaWRzKSB7XG4gICAgYW5jaG9ySW5kZXggPSBudWxsO1xuICAgIHJvd0NoZWNrYm94ZXMoKS5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgY29uc3Qgcm93ID0gY2IuY2xvc2VzdCgnW2RhdGEtbGFzdC1sb2NhdGlvbi1pZF0nKTtcbiAgICAgIGNiLmNoZWNrZWQgPSAhIShyb3cgJiYgaWRzLmhhcyhyb3cuZGF0YXNldC5sYXN0TG9jYXRpb25JZCkpO1xuICAgIH0pO1xuICAgIHJlZnJlc2hTZWxlY3Rpb25VSSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZW50ZXJFZGl0TW9kZSgpIHtcbiAgICBlZGl0TW9kZSA9IHRydWU7XG4gICAgZ2V0V3JhcHBlcigpPy5jbGFzc0xpc3QuYWRkKEVESVRfTU9ERV9DTEFTUyk7XG4gICAgaW5qZWN0Q2hlY2tib3hlcygpO1xuICAgIGdldEJhcigpPy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgZ2V0U2VsZWN0QWxsV3JhcHBlcigpPy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgc3RpY2t5VG9vbGJhci5hY3RpdmF0ZSgpO1xuXG4gICAgY29uc3QgdG9nZ2xlID0gZ2V0VG9nZ2xlKCk7XG4gICAgaWYgKHRvZ2dsZSkge1xuICAgICAgdG9nZ2xlLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcbiAgICAgIHRvZ2dsZS5jbGFzc0xpc3QucmVtb3ZlKCdpY29uLW9mZicpO1xuICAgICAgdG9nZ2xlLmNsYXNzTGlzdC5hZGQoJ2ljb24tb24nKTtcbiAgICAgIGNvbnN0IGxhYmVsID0gZ2V0VG9nZ2xlTGFiZWwodG9nZ2xlKTtcbiAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHQoJ2FjY291bnRfZGFzaGJvYXJkLmRvbmUnKSB8fCAnRG9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXRFZGl0TW9kZSgpIHtcbiAgICBlZGl0TW9kZSA9IGZhbHNlO1xuICAgIHJlbW92ZUNoZWNrYm94ZXMoKTtcbiAgICBnZXRXcmFwcGVyKCk/LmNsYXNzTGlzdC5yZW1vdmUoRURJVF9NT0RFX0NMQVNTKTtcbiAgICBnZXRCYXIoKT8uY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgIGdldFNlbGVjdEFsbFdyYXBwZXIoKT8uY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgIHNldEFjdGlvbnNFbmFibGVkKGZhbHNlKTtcbiAgICBzdGlja3lUb29sYmFyLmRlYWN0aXZhdGUoKTtcblxuICAgIGNvbnN0IHRvZ2dsZSA9IGdldFRvZ2dsZSgpO1xuICAgIGlmICh0b2dnbGUpIHtcbiAgICAgIHRvZ2dsZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICAgICAgdG9nZ2xlLmNsYXNzTGlzdC5yZW1vdmUoJ2ljb24tb24nKTtcbiAgICAgIHRvZ2dsZS5jbGFzc0xpc3QuYWRkKCdpY29uLW9mZicpO1xuICAgICAgY29uc3QgbGFiZWwgPSBnZXRUb2dnbGVMYWJlbCh0b2dnbGUpO1xuICAgICAgaWYgKGxhYmVsKSB7XG4gICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gdCgnYWNjb3VudF9kYXNoYm9hcmQuZWRpdF9tb2RlJykgfHwgJ0VkaXQnO1xuICAgICAgfVxuICAgICAgdG9nZ2xlLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlRWRpdE1vZGUoKSB7XG4gICAgaWYgKGVkaXRNb2RlKSB7XG4gICAgICBleGl0RWRpdE1vZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJFZGl0TW9kZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uU2VsZWN0QWxsKCkge1xuICAgIGNvbnN0IHNlbGVjdEFsbCA9IGdldFNlbGVjdEFsbCgpO1xuICAgIGlmICghc2VsZWN0QWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd0NoZWNrYm94ZXMoKS5mb3JFYWNoKChjYikgPT4geyBjYi5jaGVja2VkID0gc2VsZWN0QWxsLmNoZWNrZWQ7IH0pO1xuICAgIHJlZnJlc2hTZWxlY3Rpb25VSSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLWFwcGx5IGVkaXQtbW9kZSBET00gdG8gYSBmcmVzaGx5LXJlcGFpbnRlZCBjb2xsZWN0aW9uLiBXaGVuIHRoZSByZXBhaW50XG4gICAqIGxlYXZlcyBubyBzZWxlY3RhYmxlIHJvd3MgKGV2ZXJ5dGhpbmcgcmVtb3ZlZCksIGF1dG8tZXhpdCBlZGl0IG1vZGUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIHNlbGVjdGlvbiBpcyBjbGVhcmVkICh0aGUgZGVsZXRlIHBhdGgg4oCUIHRoZSBzZWxlY3RlZCByb3dzIGFyZVxuICAgKiBnb25lKS4gUGFzcyB7cHJlc2VydmVTZWxlY3Rpb246IHRydWV9IGZvciB0aGUgc29ydCBwYXRoICgjMzEzNyk6IHRoZSBpZHNcbiAgICogY2FwdHVyZWQgYnkgY2FwdHVyZVNlbGVjdGlvbigpIGFyZSByZS1jaGVja2VkIG9uIHRoZSBzdGlsbC1wcmVzZW50IHJvd3MuXG4gICAqXG4gICAqIEBwYXJhbSB7e3ByZXNlcnZlU2VsZWN0aW9uPzogYm9vbGVhbn19IFtvcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3luY0FmdGVyUmVwYWludChvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWVkaXRNb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZWxlY3RhYmxlUm93cygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVtZW1iZXJlZElkcyA9IG51bGw7XG4gICAgICBleGl0RWRpdE1vZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5qZWN0Q2hlY2tib3hlcygpO1xuICAgIGlmIChvcHRpb25zLnByZXNlcnZlU2VsZWN0aW9uICYmIHJlbWVtYmVyZWRJZHMpIHtcbiAgICAgIHJlc3RvcmVTZWxlY3Rpb24ocmVtZW1iZXJlZElkcyk7XG4gICAgICByZW1lbWJlcmVkSWRzID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXRTZWxlY3Rpb24oKTtcbiAgICB9XG4gI
49H1cblxuICAvKipcbiAgICogUmVhZCB0aGUgY3VycmVudCBwYWdpbmF0b3Igb3B0aW9ucyBvZmYgdGhlIHRhYmxlIHNvIHRoZSByZXBhaW50IGtlZXBzIHRoZVxuICAgKiB1c2VyJ3MgcGFnZSwgaXRlbXMtcGVyLXBhZ2UsIGFuZCBzb3J0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gY3VycmVudE9wdGlvbnMoKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IGdldENvbGxlY3Rpb24oKTtcbiAgICBpZiAoIWNvbGxlY3Rpb24gfHwgIWNvbGxlY3Rpb24uZGF0YXNldC5vcHRpb25zKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShjb2xsZWN0aW9uLmRhdGFzZXQub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdWJtaXRSZW1vdmUobW9kZSkge1xuICAgIGlmIChpbkZsaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpZHMgPSBbXTtcbiAgICBsZXQgdGl0bGVzID0gW107XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIGlmIChtb2RlID09PSAnYWxsJykge1xuICAgICAgLy8gVGhlIERPTSBvbmx5IGhvbGRzIHRoZSBjdXJyZW50IHBhZ2U7IGxpc3QgdGhvc2UgdGl0bGVzIHVuZGVyIHRoZVxuICAgICAgLy8gc3Ryb25nZXIgXCJyZW1vdmUgQUxMXCIgd2FybmluZyAocHJvZHVjdCBkZWNpc2lvbiwgIzMxMzkpLlxuICAgICAgY29uc3Qgcm93cyA9IHNlbGVjdGFibGVSb3dzKCk7XG4gICAgICBjb3VudCA9IHJvd3MubGVuZ3RoOyAvLyBiZXN0LWVmZm9ydDsgc2VydmVyIHJlcG9ydHMgYXV0aG9yaXRhdGl2ZSBjb3VudFxuICAgICAgdGl0bGVzID0gcm93cy5tYXAocm93VGl0bGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZHMgPSBjb2xsZWN0U2VsZWN0ZWRJZHMoZ2V0Q29sbGVjdGlvbigpKTtcbiAgICAgIHRpdGxlcyA9IGNvbGxlY3RTZWxlY3RlZFRpdGxlcyhnZXRDb2xsZWN0aW9uKCkpO1xuICAgICAgY291bnQgPSBpZHMubGVuZ3RoO1xuICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgIG5vdGlmeSh0KCdhY2NvdW50X2Rhc2hib2FyZC5idWxrX25vbmVfc2VsZWN0ZWQnKSB8fCAnU2VsZWN0IGF0IGxlYXN0IG9uZSB0aXRsZS4nLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybVJlbW92ZShjb3VudCwgeyBhbGw6IG1vZGUgPT09ICdhbGwnLCB0aXRsZXMgfSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0gYnVpbGRCdWxrUGF5bG9hZChpZHMsIG1vZGUsIGN1cnJlbnRPcHRpb25zKCkpO1xuXG4gICAgaW5GbGlnaHQgPSB0cnVlO1xuICAgIHNldEFjdGlvbnNFbmFibGVkKGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwbHlCYXRjaChwYXlsb2FkKTtcblxuICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gdGJvZHkgd2FzIHJlcGFpbnRlZCDigJQgcmUtYXBwbHkgZWRpdC1tb2RlIERPTS5cbiAgICAgIHN5bmNBZnRlclJlcGFpbnQoKTtcblxuICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgbm90aWZ5KHQoJ2FjY291bnRfZGFzaGJvYXJkLmJ1bGtfcmVtb3ZlX2Vycm9yJykgfHwgJ1RoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGUgbGlzdC4nLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgIHJlZnJlc2hTZWxlY3Rpb25VSSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN1Ym1pdERlbGV0ZSgpIHtcbiAgICByZXR1cm4gc3VibWl0UmVtb3ZlKCdzZWxlY3RlZCcpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3VibWl0UmVtb3ZlQWxsKCkge1xuICAgIHJldHVybiBzdWJtaXRSZW1vdmUoJ2FsbCcpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBjb25zdCB0b2dnbGUgPSBnZXRUb2dnbGUoKTtcbiAgICBpZiAoIXRvZ2dsZSkge1xuICAgICAgcmV0dXJuOyAvLyBwYWdlIGhhcyBubyBidWxrLWRlbGV0ZSB0b29sYmFyXG4gICAgfVxuXG4gICAgLy8gIzMxMzM6IHRoZSBhbm5vdGF0aW9ucyB0b29sYmFyIHVzZXMgdGhlIHNhbWUgZ2VuZXJpYyBzZWxlY3RvcnMuIEJpbmQgb25seVxuICAgIC8vIHdoZW4gdGhpcyBwYWdlIGFjdHVhbGx5IGhhcyBDb250aW51ZSBSZWFkaW5nIHJvd3MsIHNvIHRoaXMgY29udHJvbGxlciBjYW5cbiAgICAvLyBuZXZlciBsYXRjaCBvbnRvIChhbmQgY2xvYmJlcikgdGhlIGFubm90YXRpb25zIHRvb2xiYXIuXG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1sYXN0LWxvY2F0aW9uLWlkXScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGdlbmVyaWMgcGFnaW5hdG9yIHJlcGFpbnRzIG9ubHkgdGhlIHRib2R5IChmcmVzaCByb3dzIGNhcnJ5IG5vXG4gICAgLy8gY2hlY2tib3ggY29sdW1uKS4gUmUtYXBwbHkgZWRpdC1tb2RlIERPTSBzbyB0aGUgY292ZXJzLW9mZiBjaGVja2JveCBjb2x1bW5cbiAgICAvLyBzdGF5cyBhbGlnbmVkIGFmdGVyIGEgcGFnZSBvciBpdGVtcy1wZXItcGFn
49ZSBjaGFuZ2UgKCMzMTUzKS4gU2VsZWN0aW9uIGlzXG4gICAgLy8gcGFnZS1zY29wZWQsIHNvIHRoZSBkZWZhdWx0IHJlc2V0IGluIHN5bmNBZnRlclJlcGFpbnQoKSBpcyBjb3JyZWN0IGhlcmUuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29sbGVjdGlvbjpyZXBhaW50ZWQnLCAoKSA9PiB7XG4gICAgICBzeW5jQWZ0ZXJSZXBhaW50KCk7XG4gICAgfSk7XG5cbiAgICAvLyBEZWxlZ2F0ZSBvbiBkb2N1bWVudCBzbyBhIGNsaWNrIGFueXdoZXJlIGluIHRoZSB0b2dnbGUgc3Vydml2ZXMgcmUtcmVuZGVycy5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbG9zZXN0KCdbZGF0YS1idWxrLWVkaXQtdG9nZ2xlXScpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRvZ2dsZUVkaXRNb2RlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBnZXRTZWxlY3RBbGwoKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25TZWxlY3RBbGwpO1xuXG4gICAgZ2V0RGVsZXRlQnV0dG9uKCk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0RGVsZXRlKCk7XG4gICAgfSk7XG5cbiAgICBnZXRSZW1vdmVBbGxCdXR0b24oKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzdWJtaXRSZW1vdmVBbGwoKTtcbiAgICB9KTtcblxuICAgIC8vIERlbGVnYXRlIHJvdy1jaGVja2JveCBjaGFuZ2VzIGFuZCB3aG9sZS1yb3cgY2xpY2tzIG9uIHRoZSBzdGFibGUgd3JhcHBlci5cbiAgICBjb25zdCB3cmFwcGVyID0gZ2V0V3JhcHBlcigpO1xuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICB3cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZWRpdE1vZGUgJiYgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDSEVDS0JPWF9DTEFTUykpIHtcbiAgICAgICAgICByZWZyZXNoU2VsZWN0aW9uVUkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFlZGl0TW9kZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3cgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnW2RhdGEtbGFzdC1sb2NhdGlvbi1pZF0nKTtcbiAgICAgICAgaWYgKCFyb3cgfHwgcm93LmRhdGFzZXQucGlubmVkID09PSAnMScgfHwgIXJvdy5kYXRhc2V0Lmxhc3RMb2NhdGlvbklkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoZWNrYm94ID0gcm93LnF1ZXJ5U2VsZWN0b3IoYC4ke0NIRUNLQk9YX0NMQVNTfWApO1xuICAgICAgICBpZiAoIWNoZWNrYm94KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBjbGljayBvbiB0aGUgY2hlY2tib3ggaXRzZWxmIHRvZ2dsZXMgbmF0aXZlbHk7IGNsaWNrcyBlbHNld2hlcmUgaW5cbiAgICAgICAgLy8gdGhlIHJvdyB0b2dnbGUgaGVyZS4gT3RoZXIgaW50ZXJhY3RpdmUgY29udHJvbHMgKGxpbmtzLCBidXR0b25zKSBrZWVwXG4gICAgICAgIC8vIHRoZWlyIG5vcm1hbCBiZWhhdmlvci5cbiAgICAgICAgY29uc3Qgb25DaGVja2JveCA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuYnVsay1zZWxlY3QnKSAhPT0gbnVsbDtcbiAgICAgICAgY29uc3Qgb25JbnRlcmFjdGl2ZSA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCdhLCBidXR0b24sIGlucHV0JykgIT09IG51bGw7XG4gICAgICAgIGlmIChvbkludGVyYWN0aXZlICYmICFvbkNoZWNrYm94KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb25DaGVja2JveCkge1xuICAgICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSAhY2hlY2tib3guY2hlY2tlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0YWJsZVJvd3MoKS5pbmRleE9mKHJvdyk7XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiBhbmNob3JJbmRleCAhPT0gbnVsbCAmJiBhbmNob3JJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAgICBhcHBseVJhbmdlU2VsZWN0aW9uKGFuY2hvckluZGV4LCBpbmRleCwgY2hlY2tib3guY2hlY2tlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYW5jaG9ySW5kZXggPSBpbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZnJlc2hTZWxlY3Rpb25VSSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpbml0LFxuICAgIGVudGVyRWRpdE1vZGUsXG4gICAgZXhpdEVkaXRNb2RlLFxuICAgIHRvZ2dsZUVkaXRNb2RlLFxuICAgIHJlZnJlc2hTZWxlY3Rpb25VSSxcbiAgICBjYXB0dXJlU2VsZWN0aW9uLFxuICAgIHN5bmNBZnRlclJlcGFpbnQsXG4gICAgc3VibWl0RGVsZXRlLFxuICAgIHN1Ym1pdFJlbW92ZUFsbCxcbiAgICBnZXRTZWxlY3RlZElkczogKCkgPT4gY29sbGVjdFNlbGVjdGVkSWRzKGdldENvbGxlY3Rpb24oKSksXG4gIH07XG59XG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGNvbmZpcm0gbW9kYWwncyBzY3JvbGxhYmxlIGxpc3Qgd2l0aCB0aGUgdGl0bGVzIGJlaW5nIHJlbW92ZWQuXG4gKiBUaXRsZXMgYXJlIGluc2VydGVkIHZpYSB0ZXh0Q29udGVudCAobmV2ZXIgaW5uZXJIVE1MKSBzbyBhbnkgbWFya3VwIGluIGFcbiAqIHRpdGxlIGlzIGluZXJ0IHRleHQsIGFuZCBlYWNoIDxsaT4gY2FycmllcyBhIHRpdGxlIGF0dHJpYnV0ZSBzbyBhIHRydW5jYXRlZFxuICogKGVsbGlwc2l6ZWQpIHJvdyBzdGlsbCBzaG93cyB0aGUgZnVsbCB0ZXh0IG9uIGhvdmVyICgjMzEzOSkuIFRoZSBjb250YWluZXIgaXNcbiAqIGhpZGRlbiB3aGVuIHRoZXJlIGFyZSBubyB0aXRsZXMuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGl0bGVzXG4gKi9cbmZ1bmN0aW9uIHBvcHVsYXRlQnVsa0RlbGV0ZUxpc3QobW9kYWwsIHRpdGxlcykge1xuICBjb25zdCBsaXN0RWwgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1idWxrLWRlbGV0ZS1saXN0XScpO1xuICBpZiAoIWxpc3RFbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxpc3RFbC50ZXh0Q29udGVudCA9ICcnO1xuICBjb25zdCBoYXNUaXRsZXMgPSB0aXRsZXMubGVuZ3RoID4gMDtcbiAgbGlzdEVsLmhpZGRlbiA9ICFoYXNUaXRsZXM7XG4gIGxpc3RFbC5jbGFzc0xpc3QudG9nZ2xlKCdoaWRlJywgIWhhc1RpdGxlcyk7XG5cbiAgdGl0bGVzLmZvckVhY2goKHRpdGxlKSA9PiB7XG4gICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGxpLnRleHRDb250ZW50ID0gdGl0bGU7XG4gICAgbGkuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRpdGxlKTtcbiAgICBsaXN0RWwuYXBwZW5kQ2hpbGQobGkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpcm0gZ2F0ZSB1c2luZyB0aGUgRm91bmRhdGlvbiByZXZlYWwgbW9kYWwuIFRoZSBcImFsbFwiIG1vZGUgdXNlcyBhXG4gKiBzdHJvbmdlciBtZXNzYWdlIHNvIHRoZSBhY3Jvc3MtcGFnZXMgcmVtb3ZlIGlzIG5ldmVyIGEgc3VycHJpc2UuIFdoZW4gdGl0bGVzXG4gKiBhcmUgc3VwcGxpZWQgdGhleSBhcmUgbGlzdGVkIGluIGEgc2Nyb2xsYWJsZSBsaXN0IGluc2lkZSB0aGUgbW9kYWwgKCMzMTM5KS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnRcbiAqIEBwYXJhbSB7e2FsbDogYm9vbGVhbiwgdGl0bGVzPzogQXJyYXk8c3RyaW5nPn19IG9wdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdENvbmZpcm1SZW1vdmUoY291bnQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWJ1bGstZGVsZXRlLW1vZGFsXScpO1xuICBjb25zdCB0aXRsZXMgPSBBcnJheS5pc0FycmF
495KG9wdHMudGl0bGVzKSA/IG9wdHMudGl0bGVzIDogW107XG4gIGNvbnN0IG1lc3NhZ2UgPSBvcHRzLmFsbFxuICAgID8gKHQoJ2FjY291bnRfZGFzaGJvYXJkLmJ1bGtfcmVtb3ZlX2FsbF9jb25maXJtJywgeyAnOmNvdW50JzogY291bnQgfSlcbiAgICAgIHx8IGBSZW1vdmUgQUxMICR7Y291bnR9IHRpdGxlcyBmcm9tIHlvdXIgQ29udGludWUgUmVhZGluZyBsaXN0P2ApXG4gICAgOiAodCgnYWNjb3VudF9kYXNoYm9hcmQuYnVsa19yZW1vdmVfY29uZmlybScsIHsgJzpjb3VudCc6IGNvdW50IH0pXG4gICAgICB8fCBgUmVtb3ZlICR7Y291bnR9IHRpdGxlcyBmcm9tIHlvdXIgQ29udGludWUgUmVhZGluZyBsaXN0P2ApO1xuXG4gIGlmIChtb2RhbCkge1xuICAgIGNvbnN0IG1lc3NhZ2VFbCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWJ1bGstZGVsZXRlLW1lc3NhZ2VdJyk7XG4gICAgaWYgKG1lc3NhZ2VFbCkge1xuICAgICAgbWVzc2FnZUVsLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICB9XG4gICAgcG9wdWxhdGVCdWxrRGVsZXRlTGlzdChtb2RhbCwgdGl0bGVzKTtcbiAgfVxuXG4gIGlmICghbW9kYWwgfHwgdHlwZW9mIGpRdWVyeSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYWxlcnRcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGNvbmZpcm1CdXR0b24gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1idWxrLWRlbGV0ZS1jb25maXJtXScpO1xuICAgIGNvbnN0ICRtb2RhbCA9IGpRdWVyeShtb2RhbCk7XG4gICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGZpbmlzaCA9IChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgY29uZmlybUJ1dHRvbj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNvbmZpcm0pO1xuICAgICAgJG1vZGFsLm9mZignY2xvc2VkLnpmLnJldmVhbCcsIG9uQ2xvc2UpO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH07XG5cbiAgICAvLyBTZXR0bGUgd2l0aCBgdHJ1ZWAgQkVGT1JFIGNsb3NpbmcgdGhlIHJldmVhbCBzbyB0aGUgc3luY2hyb25vdXNcbiAgICAvLyAnY2xvc2VkLnpmLnJldmVhbCcgb25DbG9zZSBkb2VzIG5vdCBzaG9ydC1jaXJjdWl0IHRoZSBjb25maXJtICgjMzA1MSkuXG4gICAgY29uc3Qgb25Db25maXJtID0gKCkgPT4ge1xuICAgICAgZmluaXNoKHRydWUpO1xuICAgICAgJG1vZGFsLmZvdW5kYXRpb24oJ2Nsb3NlJyk7XG4gICAgfTtcbiAgICBjb25zdCBvbkNsb3NlID0gKCkgPT4gZmluaXNoKGZhbHNlKTtcblxuICAgIGNvbmZpcm1CdXR0b24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25Db25maXJtKTtcbiAgICAkbW9kYWwub24oJ2Nsb3NlZC56Zi5yZXZlYWwnLCBvbkNsb3NlKTtcbiAgICAkbW9kYWwuZm91bmRhdGlvbignb3BlbicpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IG5vdGljZSBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdE5vdGlmeShtZXNzYWdlLCB0eXBlKSB7XG4gIGNvbnN0IG5vdGljZSA9IG5ldyBBc3luY05vdGljZShtZXNzYWdlLCB0eXBlKTtcbiAgbm90aWNlLmNyZWF0ZSh7fSk7XG4gIG5vdGljZS5yZW1vdmUoNCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/account/last-locations-bulk-delete.js\n");
50
51/***/ }),
52
53/***/ "./resources/js/account/last-locations.js":
54/*!************************************************!*\
55  !*** ./resources/js/account/last-locations.js ***!
56  \************************************************/
57/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
58
59eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   addPinEventHandlers: () => (/* binding */ addPinEventHandlers),\n/* harmony export */   initCoverImageFallback: () => (/* binding */ initCoverImageFallback),\n/* harmony export */   initLastLocationsBatchDelete: () => (/* binding */ initLastLocationsBatchDelete),\n/* harmony export */   replaceCoverImageWithPlaceholder: () => (/* binding */ replaceCoverImageWithPlaceholder)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/json/stringify */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _books_last_locations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../books/last-locations */ \"./resources/js/books/last-locations.js\");\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _pagination__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../pagination */ \"./resources/js/pagination.js\");\n/* harmony import */ var _last_locations_bulk_delete__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./last-locations-bulk-delete */ \"./resources/js/account/last-locations-bulk-delete.js\");\n/* harmony import */ var _utilities_general__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utilities/general */ \"./resources/js/utilities/general.js\");\n/* harmony import */ var _spinner__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../spinner */ \"./resources/js/spinner.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n// The batch-edit controller for the Continue Reading table, when the toolbar\n// has initialized on this page (#3565). Pinning stays enabled in edit mode, so\n// the pin handler needs a way to re-apply edit-mode checkboxes to the fresh\n// rows it paints in - this is that seam. Stays null on pages where\n// initLastLocationsBatchDelete() never gets past its early-return guard.\nvar activeBatchController = null;\nfunction addPinEventHandlers() {\n  // add event listeners to pins after updating table rows\n  var pins = document.querySelectorAll('div.pin a');\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(pins).call(pins, function (pin) {\n    pin.addEventListener('click', /*#__PURE__*/function () {\n      var _ref = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee(e) {\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n          while (1) switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return pinClickListener(e, pin, 'last-locations');\n            case 2:\n            case \"end\":\n              return _context.stop();\n          }\n        }, _callee);\n      }));\n      return function (_x) {\n        return _ref.apply(this, arguments);\n      };\n    }());\n  });\n}\n\n/**\n * Click event Listener for a given pin. Render a spinner, pin the title and update the table rows.\n *\n * @param e\n * @param pin\n * @param paginatorName\n * @returns {Promise<void>}\n */\nfunction pinClickListener(_x2, _x3, _x4) {\n  return _pinClickListener.apply(this, arguments);\n}\n/**\n * update the 'Continue Reading' table with updated rows.\n *\n * @param table\n * @param result\n */\nfunction _pinClickListener() {\n  _pinClickListener = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee4(e, pin, paginatorName) {\n    var _activeBatchControlle, spinner, isPinned, table, options, currentPage, url, itemsPerPageElem, itemsPerPage, l, id, result, _result$msg, message, notice, msg, _notice;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee4$(_context5) {\n      while (1) switch (_context5.prev = _context5.next) {\n        case 0:\n          e.preventDefault();\n          _context5.prev = 1;\n          // show spinner\n          spinner = document.createElement('span');\n          spinner.classList.add('loader');\n          pin.parentElement.insertAdjacentElement('beforeend', spinner);\n\n          // handle click on pin\n          isPinned = pin.classList.contains('is-pinned');\n          table = document.querySelector(\"#\".concat(paginatorName, \"-collection\"));\n          options = JSON.parse(table.dataset.options);\n          currentPage = options.collection.currentPage;\n          url = table.dataset.updateUrl;\n          itemsPerPageElem = document.querySelector(\"#\".concat(paginatorName, \"-items-per-page\"));\n          itemsPerPage = itemsPerPageElem.value; // Snapshot the current selection BEFORE the fetch/repaint replaces the\n          // tbody, so the selected titles survive a pin/unpin made in edit mode\n          // (#3565), the same way a sort repaint already preserves it (#3137).\n          (_activeBatchControlle = activeBatchController) === null || _activeBatchControlle === void 0 || _activeBatchControlle.captureSelection();\n\n          // async call to update 'Pinned' column on DB record\n          l = new _books_last_locations__WEBPACK_IMPORTED_MODULE_4__.LastLocation({\n            url: url\n          });\n          id = pin.parentElement.dataset.id;\n          _context5.next = 17;\n          return l.save({\n            id: id,\n            currentPage: currentPage,\n            itemsPerPage: itemsPerPage,\n            pinned: !isPinned,\n            options: options\n          });\n        case 17:\n          result = _context5.sent;
59\n          if (!result.success) {\n            _context5.next = 22;\n            break;\n          }\n          updateTableContent(table, result); // this currently also remove the spinner since the content is replacec\n          _context5.next = 27;\n          break;\n        case 22:\n          // console.log(result['msg']);\n          message = (_result$msg = result['msg']) !== null && _result$msg !== void 0 ? _result$msg : 'There was an error updating this record.';\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_5__.AsyncNotice(message, 'error');\n          _context5.next = 26;\n          return notice.create({}, true);\n        case 26:\n          notice.remove();\n        case 27:\n          _context5.next = 29;\n          return spinner.remove();\n        case 29:\n          _context5.next = 39;\n          break;\n        case 31:\n          _context5.prev = 31;\n          _context5.t0 = _context5[\"catch\"](1);\n          msg = 'There was an error updating this record.';\n          console.error(\"msg: \".concat(_context5.t0.message, \".\"));\n          _notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_5__.AsyncNotice(msg, 'error');\n          _context5.next = 38;\n          return _notice.create({}, true);\n        case 38:\n          _notice.remove();\n        case 39:\n        case \"end\":\n          return _context5.stop();\n      }\n    }, _callee4, null, [[1, 31]]);\n  }));\n  return _pinClickListener.apply(this, arguments);\n}\nfunction updateTableContent(table, result) {\n  // update the last locations collection\n  table.tBodies[0].innerHTML = result.rows;\n  addPinEventHandlers();\n\n  // The fresh rows carry no checkbox column - re-apply edit-mode DOM and\n  // restore the current selection the same way the sort handler does (#3137,\n  // #3565). Safe no-op when batch-edit never initialized on this page, or\n  // when the table isn't currently in edit mode.\n  if (activeBatchController) {\n    activeBatchController.syncAfterRepaint({\n      preserveSelection: true\n    });\n  }\n}\n\n/**\n * Repaint the Continue Reading table after a batch delete or sort change:\n * swap the rows, total count, and pagination controls, then re-attach the pin\n * handlers to the fresh rows.\n *\n * @param {HTMLElement} table  the [data-paginated-collection] table\n * @param {Object} result      the JSON response (rows, total, nav)\n * @returns {Promise<void>}\n */\nfunction repaintTable(_x5, _x6) {\n  return _repaintTable.apply(this, arguments);\n}\n/**\n * Swap a broken cover <img> for the icon placeholder anchor markup, keeping\n * the original link href and the cover-type tooltip (#3800). Written as a\n * standalone, reusable function - Bookmarks/Completed tables render the same\n * cover markup and are expected to reuse this in a follow-up ticket.\n *\n * @param {HTMLImageElement} img the cover <img> that failed to load\n */\nfunction _repaintTable() {\n  _repaintTable = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee5(table, result) {\n    var paginatorName, totals, nav, fragment;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee5$(_context6) {\n      while (1) switch (_context6.prev = _context6.next) {\n        case 0:\n          if (result.rows != null && table.tBodies[0]) {\n            table.tBodies[0].innerHTML = result.rows;\n          }\n          paginatorName = table.dataset.paginatorName || 'last-locations';\n          if (result.total != null) {\n            totals = document.querySelector('.annotation-items');\n            if (totals) {\n              totals.outerHTML = result.total;\n            }\n          }\n          if (!(result.nav != null)) {\n            _context6.next = 10;\n            break;\n          }\n          nav = document.querySelector(\"nav#\".concat(paginatorName, \"-nav\"));\n          if (!nav) {\n            _context6.next = 10;\n            break;\n          }\n          fragment = document.createRange().createContextualFragment(result.nav);\n          nav.replaceWith(fragment);\n          _context6.next = 10;\n          return (0,_pagination__WEBPACK_IMPORTED_MODULE_7__.addPaginationNavigationHandlers)(paginatorName);\n        case 10:\n          addPinEventHandlers();\n        case 11:\n        case \"end\":\n          return _context6.stop();\n      }\n    }, _callee5);\n  }));\n  return _repaintTable.apply(this, arguments);\n}\nfunction replaceCoverImageWithPlaceholder(img) {\n  var anchor = img.closest('a');\n  if (!anchor) {\n    return;\n  }\n  var href = anchor.getAttribute('href') || '#';\n  var title = anchor.getAttribute('title');\n  var placeholder = document.createElement('a');\n  placeholder.setAttribute('href', href);\n  placeholder.classList.add('book-cover-placeholder');\n  if (title) {\n    placeholder.setAttribute('title', title);\n  }\n  placeholder.innerHTML = '<i class=\"fa-solid fa-book\"></i>';\n  anchor.replaceWith(placeholder);\n}\n\n/**\n * Whether a cover <img> has already failed to load. `complete` is true both\n * for a successfully-loaded image and for one that failed before the page\
59n * finished parsing it; `naturalWidth === 0` disambiguates the failure case\n * (#3839).\n *\n * @param {HTMLImageElement} img\n * @returns {boolean}\n */\nfunction hasCoverImageFailed(img) {\n  return img.complete && img.naturalWidth === 0;\n}\n\n/**\n * Attach a capture-phase delegated `error` listener so a cover <img> with a\n * dead URL (#3800) swaps to the icon placeholder instead of rendering its\n * alt text. Image `error` events don't bubble, so this MUST use the capture\n * phase; delegating on document.body means the listener also covers rows\n * painted later by pagination/sort/batch-delete repaints.\n *\n * #3839: a cover can fail to load BEFORE this listener attaches (a cached\n * 404, a fast failure, or an early DOM position racing init) - in that case\n * the `error` event already fired and is never seen here. Sweep the covers\n * already on the page at init time and swap any that are already broken, so\n * the fallback doesn't depend on winning that race.\n */\nfunction initCoverImageFallback() {\n  var _context2;\n  document.body.addEventListener('error', function (event) {\n    var img = event.target;\n    if (!(img instanceof HTMLImageElement) || !img.hasAttribute('data-cover-fallback')) {\n      return;\n    }\n    replaceCoverImageWithPlaceholder(img);\n  }, true);\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context2 = document.querySelectorAll('img[data-cover-fallback]')).call(_context2, function (img) {\n    if (hasCoverImageFailed(img)) {\n      replaceCoverImageWithPlaceholder(img);\n    }\n  });\n}\n\n/**\n * Initialize the dashboard Continue Reading batch-delete controller and the\n * oldest/newest-first sort control (#3088). No-op when the toolbar is absent.\n */\nfunction initLastLocationsBatchDelete() {\n  var toggle = document.querySelector('[data-bulk-edit-toggle]');\n  var container = document.querySelector('[data-collection]');\n  var table = document.querySelector('[data-paginated-collection]');\n\n  // #3133: the Annotations page renders a toolbar with these same generic\n  // selectors but no Continue Reading rows. account/main.js calls this init on\n  // every /account* page, so bail unless real Continue Reading content is\n  // present — otherwise this controller clobbers the annotations toolbar.\n  var hasLastLocations = document.querySelector('[data-last-location-id]');\n  if (!toggle || !container || !table || !hasLastLocations) {\n    return;\n  }\n  var batchDeleteUrl = container.dataset.batchDeleteUrl;\n  var controller = (0,_last_locations_bulk_delete__WEBPACK_IMPORTED_MODULE_8__.createBulkDeleteController)({\n    applyBatch: function () {\n      var _applyBatch = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2(payload) {\n        var result, _result$deleted, _result$skipped, _window$__i18n, _window$__i18n2, removed, skipped, msg, notice;\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context3) {\n          while (1) switch (_context3.prev = _context3.next) {\n            case 0:\n              _context3.next = 2;\n              return new _fetch_helpers__WEBPACK_IMPORTED_MODULE_6__[\"default\"]().fetchData('POST', batchDeleteUrl, payload, {\n                mutating: true,\n                dataLabel: 'reading list'\n              });\n            case 2:\n              result = _context3.sent;\n              if (!(result && result.success)) {\n                _context3.next = 14;\n                break;\n              }\n              _context3.next = 6;\n              return repaintTable(table, result);\n            case 6:\n              removed = Number((_result$deleted = result.deleted) !== null && _result$deleted !== void 0 ? _result$deleted : 0);\n              skipped = Number((_result$skipped = result.skipped) !== null && _result$skipped !== void 0 ? _result$skipped : 0);\n              msg = skipped > 0 ? ((_window$__i18n = window.__i18n) === null || _window$__i18n === void 0 || (_window$__i18n = _window$__i18n.account_dashboard) === null || _window$__i18n === void 0 ? void 0 : _window$__i18n.bulk_remove_result_skipped) || 'Titles removed.' : ((_window$__i18n2 = window.__i18n) === null || _window$__i18n2 === void 0 || (_window$__i18n2 = _window$__i18n2.account_dashboard) === null || _window$__i18n2 === void 0 ? void 0 : _window$__i18n2.bulk_remove_result) || 'Titles removed.';\n              notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_5__.AsyncNotice(msg, 'success');\n              _context3.next = 12;\n              return notice.create({}, true);\n            case 12:\n              notice.remove(4);\n              // Reference the counts so linters/readers see they inform the notice.\n              void removed;\n            case 14:\n              return _context3.abrupt(\"return\", result);\n            case 15:\n            case \"end\":\n              return _context3.stop();\n          }\n        }, _callee2);\n      }));\n      function applyBatch(_x7) {\n        return _applyBatch.apply(this, arguments);\n      }\n      return applyBatch;\n    }()\n  });\n  controller.init();\n\n  // Give the pin handler (defined outside this closure) a way to reach the\n  // controller so it can re-apply edit-mode checkboxes after its own repaint\n  // (#3565). Only reach
59able once batch-edit has genuinely initialized here.\n  activeBatchController = controller;\n\n  // Oldest/newest-first sort: post the chosen sort through the refresh path.\n  var sortToggle = document.querySelector('[data-sort-toggle]');\n  if (sortToggle) {\n    sortToggle.addEventListener('change', /*#__PURE__*/function () {\n      var _ref2 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee3(event) {\n        var refreshUrl, options, collectionContainer, sortSelect, sortSpinner, result;\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee3$(_context4) {\n          while (1) switch (_context4.prev = _context4.next) {\n            case 0:\n              refreshUrl = table.dataset.refreshUrl || table.dataset.updateUrl;\n              options = {};\n              try {\n                options = JSON.parse(table.dataset.options || '{}');\n              } catch (error) {\n                options = {};\n              }\n              options.collection = options.collection || {};\n              options.collection.sort = event.target.value;\n              options.collection.currentPage = '1';\n\n              // Snapshot the current selection BEFORE the fetch/repaint replaces the\n              // tbody, so the selected titles survive a sort made in edit mode (#3137).\n              controller.captureSelection();\n\n              // #3582/#3593/#3595: block clicks on pins/checkboxes/pagination while\n              // the sort refresh is in flight (same blocking overlay already proven\n              // on the Annotations batch-edit actions), and show the original small\n              // brown Spinner-class box directly over the Sort dropdown itself -\n              // the same box the Show control already used before #3582. That box\n              // is opaque and absolutely positioned on top of the select, so it\n              // already blocks clicks/reopening the dropdown without any extra\n              // overlay or CSS (confirmed in a real browser).\n              //\n              // #3595: the box is a DOM *sibling* of the select, but its CSS\n              // positions it relative to the nearest positioned ancestor (the\n              // `.last-locations-sort` wrapper, which also contains the \"Sort:\"\n              // label) - not the select itself. If that wrapper is wider than the\n              // select, the fixed-width box only covers part of it. Pin the box's\n              // exact position/size to the select's own rect right after adding it.\n              collectionContainer = document.querySelector('[data-collection]');\n              sortSelect = event.target;\n              sortSpinner = new _spinner__WEBPACK_IMPORTED_MODULE_10__.Spinner('last-locations-sort-spinner', \"#\".concat(sortSelect.id), 'beforebegin', false);\n              (0,_utilities_general__WEBPACK_IMPORTED_MODULE_9__.insertOverlayOnElement)(collectionContainer, 'last-locations-table-overlay', true);\n              sortSpinner.add();\n              (0,_utilities_general__WEBPACK_IMPORTED_MODULE_9__.pinSpinnerOverElement)('last-locations-sort-spinner', sortSelect);\n              _context4.prev = 13;\n              _context4.next = 16;\n              return new _fetch_helpers__WEBPACK_IMPORTED_MODULE_6__[\"default\"]().fetchData('POST', refreshUrl, {\n                options: options\n              });\n            case 16:\n              result = _context4.sent;\n              if (!(result && result.success)) {\n                _context4.next = 22;\n                break;\n              }\n              _context4.next = 20;\n              return repaintTable(table, result);\n            case 20:\n              table.dataset.options = _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_3___default()(options);\n              // The tbody was replaced — re-apply edit-mode checkboxes (#3103) and\n              // re-check the titles that were selected before the sort (#3137).\n              controller.syncAfterRepaint({\n                preserveSelection: true\n              });\n            case 22:\n              _context4.prev = 22;\n              (0,_utilities_general__WEBPACK_IMPORTED_MODULE_9__.removeOverlayOnElement)('last-locations-table-overlay');\n              _context4.next = 26;\n              return sortSpinner.remove();\n            case 26:\n              return _context4.finish(22);\n            case 27:\n            case \"end\":\n              return _context4.stop();\n          }\n        }, _callee3, null, [[13,, 22, 27]]);\n      }));\n      return function (_x8) {\n        return _ref2.apply(this, arguments);\n      };\n    }());\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWNjb3VudC9sYXN0LWxvY2F0aW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
59BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFRQTtBQUFBO0FBbURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFuREE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVNBO0FBQUE7QUEwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBQUE7QUExQkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFVQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQW5CQTtBQUFBO0FBQUE7QUFBQTtBQW9CQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL2FjY291bnQvbGFzdC1sb2NhdGlvbnMuanM/OGVjOSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xhc3RMb2NhdGlvbn0gZnJvbSBcIi4uL2Jvb2tzL2xhc3QtbG9jYXRpb25zXCI7XG5pbXBvcnQge0FzeW5jTm90aWNlfSBmcm9tIFwiLi4vbm90aWNlcy9ub3RpY2VcIjtcbmltcG9ydCBGZXRjaEhlbHBlcnMgZnJvbSBcIi4uL2ZldGNoLWhlbHBlcnNcIjtcbmltcG9ydCB7YWRkUGFnaW5hdGlvbk5hdmlnYXRpb25IYW5kbGVyc30gZnJvbSBcIi4uL3BhZ2luYXRpb25cIjtcbmltcG9ydCB7Y3JlYXRlQnVsa0RlbGV0ZUNvbnRyb2xsZXJ9IGZyb20gXCIuL2xhc3QtbG9jYXRpb25zLWJ1bGstZGVsZXRlXCI7XG5pbXBvcnQge2luc2VydE92ZXJsYXlPbkVsZW1lbnQsIHJlbW92ZU92ZXJsYXlPbkVsZW1lbnQsIHBpblNwaW5uZXJPdmVyRWxlbWVudH0gZnJvbSBcIi4uL3V0aWxpdGllcy9nZW5lcmFsXCI7XG5pbXBvcnQge1NwaW5uZXJ9IGZyb20gXCIuLi9zcGlubmVyXCI7XG5cbi8vIFRoZSBiYXRjaC1lZGl0IGNvbnRyb2xsZXIgZm9yIHRoZSBDb250aW51ZSBSZWFkaW5nIHRhYmxlLCB3aGVuIHRoZSB0b29sYmFyXG4vLyBoYXMgaW5pdGlhbGl6ZWQgb24gdGhpcyBwYWdlICgjMzU2NSkuIFBpbm5pbmcgc3RheXMgZW5hYmxlZCBpbiBlZGl0IG1vZGUsIHNvXG4vLyB0aGUgcGluIGhhbmRsZXIgbmVlZHMgYSB3YXkgdG8gcmUtYXBwbHkgZWRpdC1tb2RlIGNoZWNrYm94ZXMgdG8gdGhlIGZyZXNoXG4vLyByb3dzIGl0IHBhaW50cyBpbiAtIHRoaXMgaXMgdGhhdCBzZWFtLiBTdGF5cyBudWxsIG9uIHBhZ2VzIHdoZXJlXG4vLyBpbml0TGFzdExvY2F0aW9uc0JhdGNoRGVsZXRlKCkgbmV2ZXIgZ2V0cyBwYXN0IGl0cyBlYXJseS1yZXR1cm4gZ3VhcmQuXG5sZXQgYWN0aXZlQmF0Y2hDb250cm9sbGVyID0gbnVsbDtcblxuZnVuY3Rpb24gYWRkUGluRXZlbnRIYW5kbGVycygpIHtcbiAgLy8gYWRkIGV2ZW50IGxpc3RlbmVycyB0byBwaW5zIGFmdGVyIHVwZGF0aW5nIHRhYmxlIHJvd3NcbiAgY29uc3QgcGlucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Rpdi5waW4gYScpO1xuICBwaW5zLmZvckVhY2goKHBpbikgPT4ge1xuICAgIHBpbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChlKSA9PiB7XG4gICAgICBhd2FpdCBwaW5DbGlja0xpc3RlbmVyKGUsIHBpbiwgJ2xhc3QtbG9jYXRpb25zJyk7XG4gICAgfSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDbGljayBldmVudCBMaXN0ZW5lciBmb3IgYSBnaXZlbiBwaW4uIFJlbmRlciBhIHNwaW5uZXIsIHBpbiB0aGUgdGl0bGUgYW5kIHVwZGF0ZSB0aGUgdGFibGUgcm93cy5cbiAqXG4gKiBAcGFyYW0gZVxuICogQHBhcmFtIHBpblxuICogQHBhcmFtIHBhZ2luYXRvck5hbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBwaW5DbGlja0xpc3RlbmVyKGUsIHBpbiwgcGFnaW5hdG9yTmFtZSkge1xuICBlLnByZXZlbn
59REZWZhdWx0KCk7XG4gIHRyeSB7XG4gICAgLy8gc2hvdyBzcGlubmVyXG4gICAgbGV0IHNwaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgc3Bpbm5lci5jbGFzc0xpc3QuYWRkKCdsb2FkZXInKTtcblxuICAgIHBpbi5wYXJlbnRFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlZW5kJywgc3Bpbm5lcik7XG5cbiAgICAvLyBoYW5kbGUgY2xpY2sgb24gcGluXG4gICAgbGV0IGlzUGlubmVkID0gKHBpbi5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLXBpbm5lZCcpKTtcblxuICAgIGxldCB0YWJsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3BhZ2luYXRvck5hbWV9LWNvbGxlY3Rpb25gKTtcbiAgICBsZXQgb3B0aW9ucyA9IEpTT04ucGFyc2UodGFibGUuZGF0YXNldC5vcHRpb25zKTtcbiAgICBsZXQgY3VycmVudFBhZ2UgPSBvcHRpb25zLmNvbGxlY3Rpb24uY3VycmVudFBhZ2U7XG4gICAgbGV0IHVybCA9IHRhYmxlLmRhdGFzZXQudXBkYXRlVXJsO1xuICAgIGxldCBpdGVtc1BlclBhZ2VFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cGFnaW5hdG9yTmFtZX0taXRlbXMtcGVyLXBhZ2VgKTtcbiAgICBsZXQgaXRlbXNQZXJQYWdlID0gaXRlbXNQZXJQYWdlRWxlbS52YWx1ZTtcblxuICAgIC8vIFNuYXBzaG90IHRoZSBjdXJyZW50IHNlbGVjdGlvbiBCRUZPUkUgdGhlIGZldGNoL3JlcGFpbnQgcmVwbGFjZXMgdGhlXG4gICAgLy8gdGJvZHksIHNvIHRoZSBzZWxlY3RlZCB0aXRsZXMgc3Vydml2ZSBhIHBpbi91bnBpbiBtYWRlIGluIGVkaXQgbW9kZVxuICAgIC8vICgjMzU2NSksIHRoZSBzYW1lIHdheSBhIHNvcnQgcmVwYWludCBhbHJlYWR5IHByZXNlcnZlcyBpdCAoIzMxMzcpLlxuICAgIGFjdGl2ZUJhdGNoQ29udHJvbGxlcj8uY2FwdHVyZVNlbGVjdGlvbigpO1xuXG4gICAgLy8gYXN5bmMgY2FsbCB0byB1cGRhdGUgJ1Bpbm5lZCcgY29sdW1uIG9uIERCIHJlY29yZFxuICAgIGxldCBsID0gbmV3IExhc3RMb2NhdGlvbih7dXJsOiB1cmx9KTtcbiAgICBsZXQgaWQgPSBwaW4ucGFyZW50RWxlbWVudC5kYXRhc2V0LmlkO1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBsLnNhdmUoe2lkLCBjdXJyZW50UGFnZSwgaXRlbXNQZXJQYWdlLCBwaW5uZWQ6ICFpc1Bpbm5lZCwgb3B0aW9uc30pO1xuICAgIGlmKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB1cGRhdGVUYWJsZUNvbnRlbnQodGFibGUsIHJlc3VsdCk7IC8vIHRoaXMgY3VycmVudGx5IGFsc28gcmVtb3ZlIHRoZSBzcGlubmVyIHNpbmNlIHRoZSBjb250ZW50IGlzIHJlcGxhY2VjXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdFsnbXNnJ10pO1xuICAgICAgbGV0IG1lc3NhZ2UgPSByZXN1bHRbJ21zZyddID8/ICdUaGVyZSB3YXMgYW4gZXJyb3IgdXBkYXRpbmcgdGhpcyByZWNvcmQuJztcbiAgICAgIGxldCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UobWVzc2FnZSwgJ2Vycm9yJyk7XG5cbiAgICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoe30sIHRydWUpO1xuICAgICAgbm90aWNlLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIGF3YWl0IHNwaW5uZXIucmVtb3ZlKCk7XG5cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxldCBtc2cgPSAnVGhlcmUgd2FzIGFuIGVycm9yIHVwZGF0aW5nIHRoaXMgcmVjb3JkLic7XG4gICAgY29uc29sZS5lcnJvcihgbXNnOiAke2Vycm9yLm1lc3NhZ2V9LmApO1xuXG4gICAgbGV0IG5vdGljZSA9IG5ldyBBc3luY05vdGljZShtc2csICdlcnJvcicpO1xuICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoe30sIHRydWUpO1xuICAgIG5vdGljZS5yZW1vdmUoKTtcbiAgfVxufVxuXG4vKipcbiAqIHVwZGF0ZSB0aGUgJ0NvbnRpbnVlIFJlYWRpbmcnIHRhYmxlIHdpdGggdXBkYXRlZCByb3dzLlxuICpcbiAqIEBwYXJhbSB0YWJsZVxuICogQHBhcmFtIHJlc3VsdFxuICovXG5mdW5jdGlvbiB1cGRhdGVUYWJsZUNvbnRlbnQodGFibGUsIHJlc3VsdCkge1xuICAvLyB1cGRhdGUgdGhlIGxhc3QgbG9jYXRpb25zIGNvbGxlY3Rpb25cbiAgdGFibGUudEJvZGllc1swXS5pbm5lckhUTUwgPSByZXN1bHQucm93cztcblxuICBhZGRQaW5FdmVudEhhbmRsZXJzKCk7XG5cbiAgLy8gVGhlIGZyZXNoIHJvd3MgY2Fycnkgbm8gY2hlY2tib3ggY29sdW1uIC0gcmUtYXBwbHkgZWRpdC1tb2RlIERPTSBhbmRcbiAgLy8gcmVzdG9yZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gdGhlIHNhbWUgd2F5IHRoZSBzb3J0IGhhbmRsZXIgZG9lcyAoIzMxMzcsXG4gIC8vICMzNTY1KS4gU2FmZSBuby1vcCB3aGVuIGJhdGNoLWVkaXQgbmV2ZXIgaW5pdGlhbGl6ZWQgb24gdGhpcyBwYWdlLCBvclxuICAvLyB3aGVuIHRoZSB0YWJsZSBpc24ndCBjdXJyZW50bHkgaW4gZWRpdCBtb2RlLlxuICBpZiAoYWN0aXZlQmF0Y2hDb250cm9sbGVyKSB7XG4gICAgYWN0aXZlQmF0Y2hDb250cm9sbGVyLnN5bmNBZnRlclJlcGFpbnQoeyBwcmVzZXJ2ZVNlbGVjdGlvbjogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcGFpbnQgdGhlIENvbnRpbnVlIFJlYWRpbmcgdGFibGUgYWZ0ZXIgYSBiYXRjaCBkZWxldGUgb3Igc29ydCBjaGFuZ2U6XG4gKiBzd2FwIHRoZSByb3dzLCB0b3RhbCBjb3VudCwgYW5kIHBhZ2luYXRpb24gY29udHJvbHMsIHRoZW4gcmUtYXR0YWNoIHRoZSBwaW5cbiAqIGhhbmRsZXJzIHRvIHRoZSBmcmVzaCByb3dzLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhYmxlICB0aGUgW2RhdGEtcGFnaW5hdGVkLWNvbGxlY3Rpb25dIHRhYmxlXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzdWx0ICAgICAgdGhlIEpTT04gcmVzcG9uc2UgKHJvd3MsIHRvdGFsLCBuYXYpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWludFRhYmxlKHRhYmxlLCByZXN1bHQpIHtcbiAgaWYgKHJlc3VsdC5yb3dzICE9IG51bGwgJiYgdGFibGUudEJvZGllc1swXSkge1xuICAgIHRhYmxlLnRCb2RpZXNbMF0uaW5uZXJIVE1MID0gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBjb25zdCBwYWdpbmF0b3JOYW1lID0gdGFibGUuZGF0YXNldC5wYWdpbmF0b3JOYW1lIHx8ICdsYXN0LWxvY2F0aW9ucyc7XG5cbiAgaWYgKHJlc3VsdC50b3RhbCAhPSBudWxsKSB7XG4gICAgY29uc3QgdG90YWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFubm90YXRpb24taXRlbXMnKTtcbiAgICBpZiAodG90YWxzKSB7XG4gICAgICB0b3RhbHMub3V0ZXJIVE1MID0gcmVzdWx0LnRvdGFsO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXN1bHQubmF2ICE9IG51bGwpIHtcbiAgICBjb25zdCBuYXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBuYXYjJHtwYWdpbmF0b3JOYW1lfS1uYXZgKTtcbiAgICBpZiAobmF2KSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHJlc3VsdC5uYXYpO1xuICAgICAgbmF2LnJlcGxhY2VXaXRoKGZyYWdtZW50KTtcbiAgICAgIGF3YWl0IGFkZFBhZ2luYXRpb25OYXZpZ2F0aW9uSGFuZGxlcnMocGFnaW5hdG9yTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgYWRkUGluRXZlbnRIYW5kbGVycygpO1xufVxuXG4vKipcbiAqIFN3YXAgYSBicm9rZW4gY292ZXIgPGltZz4gZm9yIHRoZSBpY29uIHBsYWNlaG9sZG
59VyIGFuY2hvciBtYXJrdXAsIGtlZXBpbmdcbiAqIHRoZSBvcmlnaW5hbCBsaW5rIGhyZWYgYW5kIHRoZSBjb3Zlci10eXBlIHRvb2x0aXAgKCMzODAwKS4gV3JpdHRlbiBhcyBhXG4gKiBzdGFuZGFsb25lLCByZXVzYWJsZSBmdW5jdGlvbiAtIEJvb2ttYXJrcy9Db21wbGV0ZWQgdGFibGVzIHJlbmRlciB0aGUgc2FtZVxuICogY292ZXIgbWFya3VwIGFuZCBhcmUgZXhwZWN0ZWQgdG8gcmV1c2UgdGhpcyBpbiBhIGZvbGxvdy11cCB0aWNrZXQuXG4gKlxuICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50fSBpbWcgdGhlIGNvdmVyIDxpbWc+IHRoYXQgZmFpbGVkIHRvIGxvYWRcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUNvdmVySW1hZ2VXaXRoUGxhY2Vob2xkZXIoaW1nKSB7XG4gIGNvbnN0IGFuY2hvciA9IGltZy5jbG9zZXN0KCdhJyk7XG5cbiAgaWYgKCFhbmNob3IpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBocmVmID0gYW5jaG9yLmdldEF0dHJpYnV0ZSgnaHJlZicpIHx8ICcjJztcbiAgY29uc3QgdGl0bGUgPSBhbmNob3IuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuXG4gIGNvbnN0IHBsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICBwbGFjZWhvbGRlci5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZCgnYm9vay1jb3Zlci1wbGFjZWhvbGRlcicpO1xuXG4gIGlmICh0aXRsZSkge1xuICAgIHBsYWNlaG9sZGVyLnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aXRsZSk7XG4gIH1cblxuICBwbGFjZWhvbGRlci5pbm5lckhUTUwgPSAnPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1ib29rXCI+PC9pPic7XG5cbiAgYW5jaG9yLnJlcGxhY2VXaXRoKHBsYWNlaG9sZGVyKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgY292ZXIgPGltZz4gaGFzIGFscmVhZHkgZmFpbGVkIHRvIGxvYWQuIGBjb21wbGV0ZWAgaXMgdHJ1ZSBib3RoXG4gKiBmb3IgYSBzdWNjZXNzZnVsbHktbG9hZGVkIGltYWdlIGFuZCBmb3Igb25lIHRoYXQgZmFpbGVkIGJlZm9yZSB0aGUgcGFnZVxuICogZmluaXNoZWQgcGFyc2luZyBpdDsgYG5hdHVyYWxXaWR0aCA9PT0gMGAgZGlzYW1iaWd1YXRlcyB0aGUgZmFpbHVyZSBjYXNlXG4gKiAoIzM4MzkpLlxuICpcbiAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudH0gaW1nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaGFzQ292ZXJJbWFnZUZhaWxlZChpbWcpIHtcbiAgcmV0dXJuIGltZy5jb21wbGV0ZSAmJiBpbWcubmF0dXJhbFdpZHRoID09PSAwO1xufVxuXG4vKipcbiAqIEF0dGFjaCBhIGNhcHR1cmUtcGhhc2UgZGVsZWdhdGVkIGBlcnJvcmAgbGlzdGVuZXIgc28gYSBjb3ZlciA8aW1nPiB3aXRoIGFcbiAqIGRlYWQgVVJMICgjMzgwMCkgc3dhcHMgdG8gdGhlIGljb24gcGxhY2Vob2xkZXIgaW5zdGVhZCBvZiByZW5kZXJpbmcgaXRzXG4gKiBhbHQgdGV4dC4gSW1hZ2UgYGVycm9yYCBldmVudHMgZG9uJ3QgYnViYmxlLCBzbyB0aGlzIE1VU1QgdXNlIHRoZSBjYXB0dXJlXG4gKiBwaGFzZTsgZGVsZWdhdGluZyBvbiBkb2N1bWVudC5ib2R5IG1lYW5zIHRoZSBsaXN0ZW5lciBhbHNvIGNvdmVycyByb3dzXG4gKiBwYWludGVkIGxhdGVyIGJ5IHBhZ2luYXRpb24vc29ydC9iYXRjaC1kZWxldGUgcmVwYWludHMuXG4gKlxuICogIzM4Mzk6IGEgY292ZXIgY2FuIGZhaWwgdG8gbG9hZCBCRUZPUkUgdGhpcyBsaXN0ZW5lciBhdHRhY2hlcyAoYSBjYWNoZWRcbiAqIDQwNCwgYSBmYXN0IGZhaWx1cmUsIG9yIGFuIGVhcmx5IERPTSBwb3NpdGlvbiByYWNpbmcgaW5pdCkgLSBpbiB0aGF0IGNhc2VcbiAqIHRoZSBgZXJyb3JgIGV2ZW50IGFscmVhZHkgZmlyZWQgYW5kIGlzIG5ldmVyIHNlZW4gaGVyZS4gU3dlZXAgdGhlIGNvdmVyc1xuICogYWxyZWFkeSBvbiB0aGUgcGFnZSBhdCBpbml0IHRpbWUgYW5kIHN3YXAgYW55IHRoYXQgYXJlIGFscmVhZHkgYnJva2VuLCBzb1xuICogdGhlIGZhbGxiYWNrIGRvZXNuJ3QgZGVwZW5kIG9uIHdpbm5pbmcgdGhhdCByYWNlLlxuICovXG5mdW5jdGlvbiBpbml0Q292ZXJJbWFnZUZhbGxiYWNrKCkge1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgaW1nID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgaWYgKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkgfHwgIWltZy5oYXNBdHRyaWJ1dGUoJ2RhdGEtY292ZXItZmFsbGJhY2snKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlcGxhY2VDb3ZlckltYWdlV2l0aFBsYWNlaG9sZGVyKGltZyk7XG4gIH0sIHRydWUpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZ1tkYXRhLWNvdmVyLWZhbGxiYWNrXScpLmZvckVhY2goKGltZykgPT4ge1xuICAgIGlmIChoYXNDb3ZlckltYWdlRmFpbGVkKGltZykpIHtcbiAgICAgIHJlcGxhY2VDb3ZlckltYWdlV2l0aFBsYWNlaG9sZGVyKGltZyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBkYXNoYm9hcmQgQ29udGludWUgUmVhZGluZyBiYXRjaC1kZWxldGUgY29udHJvbGxlciBhbmQgdGhlXG4gKiBvbGRlc3QvbmV3ZXN0LWZpcnN0IHNvcnQgY29udHJvbCAoIzMwODgpLiBOby1vcCB3aGVuIHRoZSB0b29sYmFyIGlzIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gaW5pdExhc3RMb2NhdGlvbnNCYXRjaERlbGV0ZSgpIHtcbiAgY29uc3QgdG9nZ2xlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYnVsay1lZGl0LXRvZ2dsZV0nKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY29sbGVjdGlvbl0nKTtcbiAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYWdpbmF0ZWQtY29sbGVjdGlvbl0nKTtcblxuICAvLyAjMzEzMzogdGhlIEFubm90YXRpb25zIHBhZ2UgcmVuZGVycyBhIHRvb2xiYXIgd2l0aCB0aGVzZSBzYW1lIGdlbmVyaWNcbiAgLy8gc2VsZWN0b3JzIGJ1dCBubyBDb250aW51ZSBSZWFkaW5nIHJvd3MuIGFjY291bnQvbWFpbi5qcyBjYWxscyB0aGlzIGluaXQgb25cbiAgLy8gZXZlcnkgL2FjY291bnQqIHBhZ2UsIHNvIGJhaWwgdW5sZXNzIHJlYWwgQ29udGludWUgUmVhZGluZyBjb250ZW50IGlzXG4gIC8vIHByZXNlbnQg4oCUIG90aGVyd2lzZSB0aGlzIGNvbnRyb2xsZXIgY2xvYmJlcnMgdGhlIGFubm90YXRpb25zIHRvb2xiYXIuXG4gIGNvbnN0IGhhc0xhc3RMb2NhdGlvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1sYXN0LWxvY2F0aW9uLWlkXScpO1xuXG4gIGlmICghdG9nZ2xlIHx8ICFjb250YWluZXIgfHwgIXRhYmxlIHx8ICFoYXNMYXN0TG9jYXRpb25zKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYmF0Y2hEZWxldGVVcmwgPSBjb250YWluZXIuZGF0YXNldC5iYXRjaERlbGV0ZVVybDtcblxuICBjb25zdCBjb250cm9sbGVyID0gY3JlYXRlQnVsa0RlbGV0ZUNvbnRyb2xsZXIoe1xuICAgIGFwcGx5QmF0Y2g6IGFzeW5jIChwYXlsb2FkKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBuZXcgRmV0Y2hIZWxwZXJzKCkuZmV0Y2hEYXRhKCdQT1NUJywgYmF0Y2hEZWxldGVVcmwsIHBheWxvYWQsIHttdXRhdGluZzogdHJ1ZSwgZGF0YUxhYmVsOiAncmVhZGluZyBsaXN0J30pO1xuXG4gICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGF3YWl0IHJlcGFpbnRUYWJsZSh0YWJsZSwgcmVzdWx0KTtcblxuICAgICAgICBjb25zdCByZW1vdmVkID0gTnVtYmVyKHJlc3VsdC5kZWxldGVkID8/IDApO1xuICAgICAgICBjb25zdCBza2lwcGVkID0gTnVtYmVyKHJlc3VsdC5za2lwcGVkID8/IDApO1xuICAgICAgICBjb25zdCBtc2cgPSBza2lwcGVkID4gMFxuICAgICAgICAgID8gKHdpbmRvdy5fX2kxOG4/LmFjY291bnRfZGFzaGJvYXJkPy5idWxrX3JlbW92ZV9yZXN1bHRfc2tpcHBlZCB8fCAnVGl0bGVzIHJlbW92ZWQuJylcbiAgICAgICAgICA6ICh3aW5kb3cuX19pMThuPy5hY2NvdW50X2Rhc2hib2FyZD8uYnVsa19yZW1vdmVfcmVzdWx0IHx8ICdUaXRsZXMgcmVtb3ZlZC4nKTtcbiAgICAgICAgY29uc3Qgbm90aWNlID0gbmV3IEFzeW5jTm90aWNlKG1zZywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgYXdhaXQgbm90aWNlLmNyZWF0ZSh7fSwgdHJ1ZSk7XG4gICAgICAgIG5vdGljZS5yZW1vdmUoNCk7XG4gICAgICAgIC8vIFJlZmVyZW5jZSB0aGUgY291bnRzIHNvIGxpbnRlcnMvcmVhZGVycyBzZWUgdGhleSBpbmZvcm0gdGhlIG5vdGljZS5cbiAgICAgICAgdm9pZCByZW1vdmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnRyb2xsZXIuaW5pdCgpO1xuXG4gIC8vIEdpdmUgdGhlIHBpbiBoYW5kbGVyIChkZWZpbmVkIG91dHNpZGUgdGhpcyBjbG9zdXJlKSBhIHdheSB0byByZWFjaCB0aGVcbiAgLy8gY29udHJvbGxlciBzbyBpdCBjYW4gcmUtYXBwbHkgZWRpdC1tb2RlIGNoZWNrYm94ZXMgYWZ0ZXIgaXRzIG93biByZXBhaW50XG4gIC8vICgjMzU2NSkuIE9ubHkgcmVhY2hhYmxlIG9uY2UgYmF0Y2gtZWRpdCBoYXMgZ2VudWluZWx5IGluaXRpYWxpemVkIGhlcmUuXG4gIGFjdGl2ZUJhdGNoQ29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG5cbiAgLy8gT2xkZXN0L25ld2VzdC1maXJzdCBzb3J0OiBwb3N0IHRoZSBjaG9zZW4gc29ydCB0aHJvdWdoIHRoZSByZWZyZXNoIHBhdGguXG4gIGNvbnN0IHNvcnRUb2dnbGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zb3J0LXRvZ2dsZV0nKTtcbiAgaWYgKHNvcnRUb2dnbGUpIHtcbiAgICBzb3J0VG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2N
59oYW5nZScsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgcmVmcmVzaFVybCA9IHRhYmxlLmRhdGFzZXQucmVmcmVzaFVybCB8fCB0YWJsZS5kYXRhc2V0LnVwZGF0ZVVybDtcbiAgICAgIGxldCBvcHRpb25zID0ge307XG4gICAgICB0cnkge1xuICAgICAgICBvcHRpb25zID0gSlNPTi5wYXJzZSh0YWJsZS5kYXRhc2V0Lm9wdGlvbnMgfHwgJ3t9Jyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgICB9XG4gICAgICBvcHRpb25zLmNvbGxlY3Rpb24gPSBvcHRpb25zLmNvbGxlY3Rpb24gfHwge307XG4gICAgICBvcHRpb25zLmNvbGxlY3Rpb24uc29ydCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgIG9wdGlvbnMuY29sbGVjdGlvbi5jdXJyZW50UGFnZSA9ICcxJztcblxuICAgICAgLy8gU25hcHNob3QgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIEJFRk9SRSB0aGUgZmV0Y2gvcmVwYWludCByZXBsYWNlcyB0aGVcbiAgICAgIC8vIHRib2R5LCBzbyB0aGUgc2VsZWN0ZWQgdGl0bGVzIHN1cnZpdmUgYSBzb3J0IG1hZGUgaW4gZWRpdCBtb2RlICgjMzEzNykuXG4gICAgICBjb250cm9sbGVyLmNhcHR1cmVTZWxlY3Rpb24oKTtcblxuICAgICAgLy8gIzM1ODIvIzM1OTMvIzM1OTU6IGJsb2NrIGNsaWNrcyBvbiBwaW5zL2NoZWNrYm94ZXMvcGFnaW5hdGlvbiB3aGlsZVxuICAgICAgLy8gdGhlIHNvcnQgcmVmcmVzaCBpcyBpbiBmbGlnaHQgKHNhbWUgYmxvY2tpbmcgb3ZlcmxheSBhbHJlYWR5IHByb3ZlblxuICAgICAgLy8gb24gdGhlIEFubm90YXRpb25zIGJhdGNoLWVkaXQgYWN0aW9ucyksIGFuZCBzaG93IHRoZSBvcmlnaW5hbCBzbWFsbFxuICAgICAgLy8gYnJvd24gU3Bpbm5lci1jbGFzcyBib3ggZGlyZWN0bHkgb3ZlciB0aGUgU29ydCBkcm9wZG93biBpdHNlbGYgLVxuICAgICAgLy8gdGhlIHNhbWUgYm94IHRoZSBTaG93IGNvbnRyb2wgYWxyZWFkeSB1c2VkIGJlZm9yZSAjMzU4Mi4gVGhhdCBib3hcbiAgICAgIC8vIGlzIG9wYXF1ZSBhbmQgYWJzb2x1dGVseSBwb3NpdGlvbmVkIG9uIHRvcCBvZiB0aGUgc2VsZWN0LCBzbyBpdFxuICAgICAgLy8gYWxyZWFkeSBibG9ja3MgY2xpY2tzL3Jlb3BlbmluZyB0aGUgZHJvcGRvd24gd2l0aG91dCBhbnkgZXh0cmFcbiAgICAgIC8vIG92ZXJsYXkgb3IgQ1NTIChjb25maXJtZWQgaW4gYSByZWFsIGJyb3dzZXIpLlxuICAgICAgLy9cbiAgICAgIC8vICMzNTk1OiB0aGUgYm94IGlzIGEgRE9NICpzaWJsaW5nKiBvZiB0aGUgc2VsZWN0LCBidXQgaXRzIENTU1xuICAgICAgLy8gcG9zaXRpb25zIGl0IHJlbGF0aXZlIHRvIHRoZSBuZWFyZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgKHRoZVxuICAgICAgLy8gYC5sYXN0LWxvY2F0aW9ucy1zb3J0YCB3cmFwcGVyLCB3aGljaCBhbHNvIGNvbnRhaW5zIHRoZSBcIlNvcnQ6XCJcbiAgICAgIC8vIGxhYmVsKSAtIG5vdCB0aGUgc2VsZWN0IGl0c2VsZi4gSWYgdGhhdCB3cmFwcGVyIGlzIHdpZGVyIHRoYW4gdGhlXG4gICAgICAvLyBzZWxlY3QsIHRoZSBmaXhlZC13aWR0aCBib3ggb25seSBjb3ZlcnMgcGFydCBvZiBpdC4gUGluIHRoZSBib3gnc1xuICAgICAgLy8gZXhhY3QgcG9zaXRpb24vc2l6ZSB0byB0aGUgc2VsZWN0J3Mgb3duIHJlY3QgcmlnaHQgYWZ0ZXIgYWRkaW5nIGl0LlxuICAgICAgY29uc3QgY29sbGVjdGlvbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbGxlY3Rpb25dJyk7XG4gICAgICBjb25zdCBzb3J0U2VsZWN0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgY29uc3Qgc29ydFNwaW5uZXIgPSBuZXcgU3Bpbm5lcignbGFzdC1sb2NhdGlvbnMtc29ydC1zcGlubmVyJywgYCMke3NvcnRTZWxlY3QuaWR9YCwgJ2JlZm9yZWJlZ2luJywgZmFsc2UpO1xuXG4gICAgICBpbnNlcnRPdmVybGF5T25FbGVtZW50KGNvbGxlY3Rpb25Db250YWluZXIsICdsYXN0LWxvY2F0aW9ucy10YWJsZS1vdmVybGF5JywgdHJ1ZSk7XG4gICAgICBzb3J0U3Bpbm5lci5hZGQoKTtcbiAgICAgIHBpblNwaW5uZXJPdmVyRWxlbWVudCgnbGFzdC1sb2NhdGlvbnMtc29ydC1zcGlubmVyJywgc29ydFNlbGVjdCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ldyBGZXRjaEhlbHBlcnMoKS5mZXRjaERhdGEoJ1BPU1QnLCByZWZyZXNoVXJsLCB7IG9wdGlvbnMgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIGF3YWl0IHJlcGFpbnRUYWJsZSh0YWJsZSwgcmVzdWx0KTtcbiAgICAgICAgICB0YWJsZS5kYXRhc2V0Lm9wdGlvbnMgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zKTtcbiAgICAgICAgICAvLyBUaGUgdGJvZHkgd2FzIHJlcGxhY2VkIOKAlCByZS1hcHBseSBlZGl0LW1vZGUgY2hlY2tib3hlcyAoIzMxMDMpIGFuZFxuICAgICAgICAgIC8vIHJlLWNoZWNrIHRoZSB0aXRsZXMgdGhhdCB3ZXJlIHNlbGVjdGVkIGJlZm9yZSB0aGUgc29ydCAoIzMxMzcpLlxuICAgICAgICAgIGNvbnRyb2xsZXIuc3luY0FmdGVyUmVwYWludCh7IHByZXNlcnZlU2VsZWN0aW9uOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZW1vdmVPdmVybGF5T25FbGVtZW50KCdsYXN0LWxvY2F0aW9ucy10YWJsZS1vdmVybGF5Jyk7XG4gICAgICAgIGF3YWl0IHNvcnRTcGlubmVyLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGFkZFBpbkV2ZW50SGFuZGxlcnMsXG4gIGluaXRMYXN0TG9jYXRpb25zQmF0Y2hEZWxldGUsXG4gIGluaXRDb3ZlckltYWdlRmFsbGJhY2ssXG4gIHJlcGxhY2VDb3ZlckltYWdlV2l0aFBsYWNlaG9sZGVyLFxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/account/last-locations.js\n");
60
61/***/ }),
62
63/***/ "./resources/js/account/password-toggle-collision-guard.js":
64/*!*****************************************************************!*\
65  !*** ./resources/js/account/password-toggle-collision-guard.js ***!
66  \*****************************************************************/
67/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
68
69eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   installPasswordToggleCollisionGuard: () => (/* binding */ installPasswordToggleCollisionGuard)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/createForOfIteratorHelper */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/createForOfIteratorHelper.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_weak_set__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/weak-set */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/weak-set.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_weak_set__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_weak_set__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n/**\n * Defensive positioning guard for password-manager browser extensions\n * (KeePassXC observed) that inject their own icon into a password field,\n * colliding with our eye (show/hide) toggle (#3496).\n *\n * Watches each `.password-toggle` wrapper for injected nodes that aren't our\n * own input or eye-toggle icon. Detection is intentionally generic (any\n * unrecognized injected element), not hardcoded to KeePassXC's markup —\n * other password managers inject similarly shaped absolutely-positioned\n * overlays. When one is detected, `password-toggle--extension-icon` is added\n * to the wrapper so CSS can shift our icon left, keeping both visible.\n */\n\nvar OWN_ELEMENT_SELECTOR = 'input, .field-icon, .toggle-password';\nvar COLLISION_CLASS = 'password-toggle--extension-icon';\nvar observedWrappers = new (_babel_runtime_corejs3_core_js_stable_weak_set__WEBPACK_IMPORTED_MODULE_1___default())();\nfunction isOwnElement(node) {\n  return !(node instanceof Element) || node.matches(OWN_ELEMENT_SELECTOR);\n}\nfunction watchWrapper(wrapper) {\n  if (observedWrappers.has(wrapper)) return;\n  observedWrappers.add(wrapper);\n  var observer = new MutationObserver(function (mutations) {\n    var _iterator = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(mutations),\n      _step;\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var mutation = _step.value;\n        var _iterator2 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(mutation.addedNodes),\n          _step2;\n        try {\n          for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n            var node = _step2.value;\n            if (!isOwnElement(node)) {\n              wrapper.classList.add(COLLISION_CLASS);\n              return;\n            }\n          }\n        } catch (err) {\n          _iterator2.e(err);\n        } finally {\n          _iterator2.f();\n        }\n      }\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n  });\n  observer.observe(wrapper, {\n    childList: true\n  });\n}\n\n/**\n * Installs the collision guard on every `.password-toggle` wrapper found\n * within `root`. Idempotent per wrapper — safe to call repeatedly (e.g. after\n * re-rendering part of the page).\n *\n * @param {ParentNode} root Search root, defaults to the whole document\n */\nfunction installPasswordToggleCollisionGuard() {\
69n  var _context;\n  var root = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n  if (!root || typeof root.querySelectorAll !== 'function') return;\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context = root.querySelectorAll('.password-toggle')).call(_context, watchWrapper);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWNjb3VudC9wYXNzd29yZC10b2dnbGUtY29sbGlzaW9uLWd1YXJkLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy9hY2NvdW50L3Bhc3N3b3JkLXRvZ2dsZS1jb2xsaXNpb24tZ3VhcmQuanM/OTViYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmVuc2l2ZSBwb3NpdGlvbmluZyBndWFyZCBmb3IgcGFzc3dvcmQtbWFuYWdlciBicm93c2VyIGV4dGVuc2lvbnNcbiAqIChLZWVQYXNzWEMgb2JzZXJ2ZWQpIHRoYXQgaW5qZWN0IHRoZWlyIG93biBpY29uIGludG8gYSBwYXNzd29yZCBmaWVsZCxcbiAqIGNvbGxpZGluZyB3aXRoIG91ciBleWUgKHNob3cvaGlkZSkgdG9nZ2xlICgjMzQ5NikuXG4gKlxuICogV2F0Y2hlcyBlYWNoIGAucGFzc3dvcmQtdG9nZ2xlYCB3cmFwcGVyIGZvciBpbmplY3RlZCBub2RlcyB0aGF0IGFyZW4ndCBvdXJcbiAqIG93biBpbnB1dCBvciBleWUtdG9nZ2xlIGljb24uIERldGVjdGlvbiBpcyBpbnRlbnRpb25hbGx5IGdlbmVyaWMgKGFueVxuICogdW5yZWNvZ25pemVkIGluamVjdGVkIGVsZW1lbnQpLCBub3QgaGFyZGNvZGVkIHRvIEtlZVBhc3NYQydzIG1hcmt1cCDigJRcbiAqIG90aGVyIHBhc3N3b3JkIG1hbmFnZXJzIGluamVjdCBzaW1pbGFybHkgc2hhcGVkIGFic29sdXRlbHktcG9zaXRpb25lZFxuICogb3ZlcmxheXMuIFdoZW4gb25lIGlzIGRldGVjdGVkLCBgcGFzc3dvcmQtdG9nZ2xlLS1leHRlbnNpb24taWNvbmAgaXMgYWRkZWRcbiAqIHRvIHRoZSB3cmFwcGVyIHNvIENTUyBjYW4gc2hpZnQgb3VyIGljb24gbGVmdCwga2VlcGluZyBib3RoIHZpc2libGUuXG4gKi9cblxuY29uc3QgT1dOX0VMRU1FTlRfU0VMRUNUT1IgPSAnaW5wdXQsIC5maWVsZC1pY29uLCAudG9nZ2xlLXBhc3N3b3JkJztcbmNvbnN0IENPTExJU0lPTl9DTEFTUyA9ICdwYXNzd29yZC10b2dnbGUtLWV4dGVuc2lvbi1pY29uJztcblxuY29uc3Qgb2JzZXJ2ZWRXcmFwcGVycyA9IG5ldyBXZWFrU2V0KCk7XG5cbmZ1bmN0aW9uIGlzT3duRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHx8IG5vZGUubWF0Y2hlcyhPV05fRUxFTUVOVF9TRUxFQ1RPUik7XG59XG5cbmZ1bmN0aW9uIHdhdGNoV3JhcHBlcih3cmFwcGVyKSB7XG4gICAgaWYgKG9ic2VydmVkV3JhcHBlcnMuaGFzKHdyYXBwZXIpKSByZXR1cm47XG4gICAgb2JzZXJ2ZWRXcmFwcGVycy5hZGQod3JhcHBlcik7XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBtdXRhdGlvbi5hZGRlZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc093bkVsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKENPTExJU0lPTl9DTEFTUyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUod3JhcHBlciwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIGNvbGxpc2lvbiBndWFyZCBvbiBldmVyeSBgLnBhc3N3b3JkLXRvZ2dsZWAgd3JhcHBlciBmb3VuZFxuICogd2l0aGluIGByb290YC4gSWRlbXBvdGVudCBwZXIgd3JhcHBlciDigJQgc2FmZSB0byBjYWxsIHJlcGVhdGVkbHkgKGUuZy4gYWZ0ZXJcbiAqIHJlLXJlbmRlcmluZyBwYXJ0IG9mIHRoZSBwYWdlKS5cbiAqXG4gKiBAcGFyYW0ge1BhcmVudE5vZGV9IHJvb3QgU2VhcmNoIHJvb3QsIGRlZmF1bHRzIHRvIHRoZSB3aG9sZSBkb2N1bWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbFBhc3N3b3JkVG9nZ2xlQ29sbGlzaW9uR3VhcmQocm9vdCA9IGRvY3VtZW50KSB7XG4gICAgaWYgKCFyb290IHx8IHR5cGVvZiByb290LnF1ZXJ5U2VsZWN0b3JBbGwgIT09ICdmdW5jdGlvbicpIHJldHVybjtcblxuICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLnBhc3N3b3JkLXRvZ2dsZScpLmZvckVhY2god2F0Y2hXcmFwcGVyKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/account/password-toggle-collision-guard.js\n");
70
71/***/ }),
72
73/***/ "./resources/js/account/sign-in-validation.js":
74/*!****************************************************!*\
75  !*** ./resources/js/account/sign-in-validation.js ***!
76  \****************************************************/
77/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
78
79eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getSignInValidationError: () => (/* binding */ getSignInValidationError),\n/* harmony export */   getSignInValidationErrors: () => (/* binding */ getSignInValidationErrors),\n/* harmony export */   messageForError: () => (/* binding */ messageForError),\n/* harmony export */   wireSignInValidation: () => (/* binding */ wireSignInValidation)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/trim */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/filter */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/includes */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _utilities_i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utilities/i18n */ \"./resources/js/utilities/i18n.js\");\n\n\n\n\n\n\n/**\n * Client-side validation for the sign-in form.\n *\n * The sign-in form (rendered in the header `#signin-dropdown` and on\n * `sign-in/new.php`) previously relied solely on the browser's native HTML5\n * `required` attribute. For the username field — the first control at the top\n * of the dropdown-pane — the native validation bubble is clipped off-screen, so\n * an empty username produced no visible feedback (#3463).\n *\n * #3463 surfaced the message as a floating notice, but the notice did not\n * appear on the staging RC (unreliable path, not yet root-caused). This module\n * now renders the messages inline — an `error-msg` span directly below each\n * blank field, cleared as the user types (#3489).\n */\n\n\nvar ERROR_SPAN_NAME = 'signin-field-error';\nvar REQUIRED_FIELDS = ['username', 'password'];\n\n/**\n * Inspect a sign-in form and return the empty-required-field errors, if any.\n *\n * Pure function: reads the form's username/password values and returns a\n * descriptor for each blank required field, in form order.\n *\n * @param {HTMLFormElement} form\n * @returns {Array<{field: string, messageKey: string}>}\n */\nfunction getSignInValidationErrors(form) {\n  var _context;\n  if (!form) {\n    return [];\n  }\n  var errors = [];\n  var username = form.querySelector('[name=\"username\"]');\n  var password = form.querySelector('[name=\"password\"]');\n  if (!username || _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_0___default()(_context = username.value).call(_context) === '') {\n    errors.push({\n      field: 'username',\n      messageKey: 'sign_in_error_username_required'\n    });\n  }\n  if (!password || password.value === '') {\n    errors.push({\n      field: 'password',\n      messageKey: 'sign_in_error_password_required'\n    });\n  }\n  return errors;\n}\n\n/**\n * Return the first empty-required-field error, or null when the form is valid.\n *\n * Kept for callers (app.js loading-overlay guard) that only need a yes/no.\n *\n * @param {HTMLFormElement} form\n * @returns {{field: string, messageKey: string}|null}\n */\nfunction getSignInValidationError(form) {\n  var _getSignInValidationE;\n  return (_getSignInValidationE = getSignInValidationErrors(form)[0]) !== null && _getSignInValidationE !== void 0 ? _getSignInValidationE : null;\n}\n\n/**\n * Resolve the user-facing message for a validation error, with an English fallback.\n *\n * @param {{messageKey: string}} error\n * @param {function(string): string} [translate=t]\n * @returns {string}\n */\nfunction messageForError(error) {\n  var _fallbacks$error$mess;\n  var translate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _utilities_i18n__WEBPACK_IMPORTED_MODULE_6__.t;\n  var fallbacks = {\n    sign_in_error_username_required: 'Username is required.',\n    sign_in_error_password_required: 'Password is required.'\n  };\n  var fallback = (_fallbacks$error$mess = fallbacks[error.messageKey]) !== null && _fallbacks$error$mess !== void 0 ? _fallbacks$error$mess : 'This field is required.';\n  var translated = translate(error.messageKey);\n\n  // The client i18n t() returns the key itself when a translation is missing;\n  // fall back to English so the raw key is never shown.\n  return translated === error.messageKey ? fallback : translated;\n}\n\n/**\n * Find the inline error span for a field, if one is currently rendered.\n *\n * @param {HTMLFormElement} form\n * @param {string} fieldName\n * @returns {HTMLElement|null}\n */\nfunction findFieldErrorSpan(form, fieldName) {\n  var _context2;\n  return form.querySelector(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1___default()(_context2 = \"[data-name=\\\"\".concat(ERROR_SPAN_NAME, \"\\\"][data-field=\\\"\")).call(_context2, fieldName, \"\\\"]\"));\n}\n\n/**\n * Render (or update) the inline error message directly below a field.\n *\n * The span is inserted after the input itself, or after its `.password-toggle`\n * wrapper, so it works in both render locations of the form (header dropdown\n * and sign-in page) without template changes. Idempotent: reuses an existing\n * span rather than duplicating it.\n *\n * @param {HTMLFormElement} form\n * @param {string} fieldName\n * @param {string} message\n */\nfunction showFieldError(form, fieldName, message) {\n  var input = form.querySelector(\"[name=\\\"\".concat(fieldName, \"\\\"]\"));\n  if (!input) {\n    return;\n  }\n  var span = findFieldErrorSpan(form, fieldName);
79\n  if (!span) {\n    var _input$closest;\n    span = document.createElement('span');\n    span.className = 'error-msg';\n    span.id = \"signin-\".concat(fieldName, \"-error\");\n    span.setAttribute('data-name', ERROR_SPAN_NAME);\n    span.setAttribute('data-field', fieldName);\n    span.setAttribute('aria-live', 'polite');\n    var anchor = (_input$closest = input.closest('.password-toggle')) !== null && _input$closest !== void 0 ? _input$closest : input;\n    anchor.insertAdjacentElement('afterend', span);\n  }\n  span.textContent = message;\n  input.setAttribute('aria-describedby', span.id);\n}\n\n/**\n * Remove a field's inline error message and its aria linkage, if present.\n *\n * @param {HTMLFormElement} form\n * @param {string} fieldName\n */\nfunction clearFieldError(form, fieldName) {\n  var span = findFieldErrorSpan(form, fieldName);\n  if (span) {\n    span.remove();\n  }\n  var input = form.querySelector(\"[name=\\\"\".concat(fieldName, \"\\\"]\"));\n  if (input && input.getAttribute('aria-describedby') === \"signin-\".concat(fieldName, \"-error\")) {\n    input.removeAttribute('aria-describedby');\n  }\n}\n\n/**\n * Attach empty-field validation to a sign-in form.\n *\n * On submit, blank required fields block submission and each gets an inline\n * `error-msg` span rendered directly below it; focus moves to the first\n * offending field. Typing in a field clears its message, as does a subsequent\n * valid submit. Returns false when there is no form to wire.\n *\n * @param {HTMLFormElement} form\n * @param {Object} [deps]\n * @param {function(string): string} [deps.translate=t]\n * @returns {boolean} whether a handler was attached\n */\nfunction wireSignInValidation(form) {\n  var _deps$translate;\n  var deps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  if (!form) {\n    return false;\n  }\n  var translate = (_deps$translate = deps.translate) !== null && _deps$translate !== void 0 ? _deps$translate : _utilities_i18n__WEBPACK_IMPORTED_MODULE_6__.t;\n\n  // Native bubbles for the top-most field are clipped in the dropdown-pane; we\n  // own the messaging instead (#3463).\n  form.setAttribute('novalidate', 'novalidate');\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(REQUIRED_FIELDS).call(REQUIRED_FIELDS, function (fieldName) {\n    var input = form.querySelector(\"[name=\\\"\".concat(fieldName, \"\\\"]\"));\n    if (input) {\n      input.addEventListener('input', function () {\n        return clearFieldError(form, fieldName);\n      });\n    }\n  });\n  form.addEventListener('submit', function (event) {\n    var _context3;\n    var errors = getSignInValidationErrors(form);\n    var errorFields = _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_3___default()(errors).call(errors, function (error) {\n      return error.field;\n    });\n\n    // Clear stale messages for fields that are now valid.\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context3 = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default()(REQUIRED_FIELDS).call(REQUIRED_FIELDS, function (fieldName) {\n      return !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_5___default()(errorFields).call(errorFields, fieldName);\n    })).call(_context3, function (fieldName) {\n      return clearFieldError(form, fieldName);\n    });\n    if (errors.length === 0) {\n      return;\n    }\n    event.preventDefault();\n    event.stopImmediatePropagation();\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(errors).call(errors, function (error) {\n      showFieldError(form, error.field, messageForError(error, translate));\n    });\n    var firstField = form.querySelector(\"[name=\\\"\".concat(errors[0].field, \"\\\"]\"));\n    if (firstField) {\n      firstField.focus();\n    }\n  });\n  return true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWNjb3VudC9zaWduLWluLXZhbGlkYXRpb24uanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7O0F
79BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL2FjY291bnQvc2lnbi1pbi12YWxpZGF0aW9uLmpzP2U3OTMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGllbnQtc2lkZSB2YWxpZGF0aW9uIGZvciB0aGUgc2lnbi1pbiBmb3JtLlxuICpcbiAqIFRoZSBzaWduLWluIGZvcm0gKHJlbmRlcmVkIGluIHRoZSBoZWFkZXIgYCNzaWduaW4tZHJvcGRvd25gIGFuZCBvblxuICogYHNpZ24taW4vbmV3LnBocGApIHByZXZpb3VzbHkgcmVsaWVkIHNvbGVseSBvbiB0aGUgYnJvd3NlcidzIG5hdGl2ZSBIVE1MNVxuICogYHJlcXVpcmVkYCBhdHRyaWJ1dGUuIEZvciB0aGUgdXNlcm5hbWUgZmllbGQg4oCUIHRoZSBmaXJzdCBjb250cm9sIGF0IHRoZSB0b3BcbiAqIG9mIHRoZSBkcm9wZG93bi1wYW5lIOKAlCB0aGUgbmF0aXZlIHZhbGlkYXRpb24gYnViYmxlIGlzIGNsaXBwZWQgb2ZmLXNjcmVlbiwgc29cbiAqIGFuIGVtcHR5IHVzZXJuYW1lIHByb2R1Y2VkIG5vIHZpc2libGUgZmVlZGJhY2sgKCMzNDYzKS5cbiAqXG4gKiAjMzQ2MyBzdXJmYWNlZCB0aGUgbWVzc2FnZSBhcyBhIGZsb2F0aW5nIG5vdGljZSwgYnV0IHRoZSBub3RpY2UgZGlkIG5vdFxuICogYXBwZWFyIG9uIHRoZSBzdGFnaW5nIFJDICh1bnJlbGlhYmxlIHBhdGgsIG5vdCB5ZXQgcm9vdC1jYXVzZWQpLiBUaGlzIG1vZHVsZVxuICogbm93IHJlbmRlcnMgdGhlIG1lc3NhZ2VzIGlubGluZSDigJQgYW4gYGVycm9yLW1zZ2Agc3BhbiBkaXJlY3RseSBiZWxvdyBlYWNoXG4gKiBibGFuayBmaWVsZCwgY2xlYXJlZCBhcyB0aGUgdXNlciB0eXBlcyAoIzM0ODkpLlxuICovXG5cbmltcG9ydCB7IHQgfSBmcm9tICcuLi91dGlsaXRpZXMvaTE4bic7XG5cbmNvbnN0IEVSUk9SX1NQQU5fTkFNRSA9ICdzaWduaW4tZmllbGQtZXJyb3InO1xuY29uc3QgUkVRVUlSRURfRklFTERTID0gWyd1c2VybmFtZScsICdwYXNzd29yZCddO1xuXG4vKipcbiAqIEluc3BlY3QgYSBzaWduLWluIGZvcm0gYW5kIHJldHVybiB0aGUgZW1wdHktcmVxdWlyZWQtZmllbGQgZXJyb3JzLCBpZiBhbnkuXG4gKlxuICogUHVyZSBmdW5jdGlvbjogcmVhZHMgdGhlIGZvcm0ncyB1c2VybmFtZS9wYXNzd29yZCB2YWx1ZXMgYW5kIHJldHVybnMgYVxuICogZGVzY3JpcHRvciBmb3IgZWFjaCBibGFuayByZXF1aXJlZCBmaWVsZCwgaW4gZm9ybSBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge0hUTUxGb3JtRWxlbWVudH0gZm9ybVxuICogQHJldHVybnMge0FycmF5PHtmaWVsZDogc3RyaW5nLCBtZXNzYWdlS2V5OiBzdHJpbmd9Pn1cbiAqL1xuZnVuY3Rpb24gZ2V0U2lnbkluVmFsaWRhdGlvbkVycm9ycyhmb3JtKSB7XG4gIGlmICghZm9ybSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGVycm9ycyA9IFtdO1xuICBjb25zdCB1c2VybmFtZSA9IGZvcm0ucXVlcnlTZWxlY3RvcignW25hbWU9XCJ1c2VybmFtZVwiXScpO1xuICBjb25zdCBwYXNzd29yZCA9IGZvcm0ucXVlcnlTZWxlY3RvcignW25hbWU9XCJwYXNzd29yZFwiXScpO1xuXG4gIGlmICghdXNlcm5hbWUgfHwgdXNlcm5hbWUudmFsdWUudHJpbSgpID09PSAnJykge1xuICAgIGVycm9ycy5wdXNoKHsgZmllbGQ6ICd1c2VybmFtZScsIG1lc3NhZ2VLZXk6ICdzaWduX2luX2Vycm9yX3VzZXJuYW1lX3JlcXVpcmVkJyB9KTtcbiAgfVxuXG4gIGlmICghcGFzc3dvcmQgfHwgcGFzc3dvcmQudmFsdWUgPT09ICcnKSB7XG4gICAgZXJyb3JzLnB1c2goeyBmaWVsZDogJ3Bhc3N3b3JkJywgbWVzc2FnZUtleTogJ3NpZ25faW5fZXJyb3JfcGFzc3dvcmRfcmVxdWlyZWQnIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGZpcnN0IGVtcHR5LXJlcXVpcmVkLWZpZWxkIGVycm9yLCBvciBudWxsIHdoZW4gdGhlIGZvcm0gaXMgdmFsaWQuXG4gKlxuICogS2VwdCBmb3IgY2FsbGVycyAoYXBwLmpzIGxvYWRpbmctb3ZlcmxheSBndWFyZCkgdGhhdCBvbmx5IG5lZWQgYSB5ZXMvbm8uXG4gKlxuICogQHBhcmFtIHtIVE1MRm9ybUVsZW1lbnR9IGZvcm1cbiAqIEByZXR1cm5zIHt7ZmllbGQ6IHN0cmluZywgbWVzc2FnZUtleTogc3RyaW5nfXxudWxsfVxuICovXG5mdW5jdGlvbiBnZXRTaWduSW5WYWxpZGF0aW9uRXJyb3IoZm9ybSkge1xuICByZXR1cm4gZ2V0U2lnbkluVmFsaWRhdGlvbkVycm9ycyhmb3JtKVswXSA/PyBudWxsO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHVzZXItZmFjaW5nIG1lc3NhZ2UgZm9yIGEgdmFsaWRhdGlvbiBlcnJvciwgd2l0aCBhbiBFbmdsaXNoIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7e21lc3NhZ2VLZXk6IHN0cmluZ319IGVycm9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6IHN0cmluZ30gW3RyYW5zbGF0ZT10XVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gbWVzc2FnZUZvckVycm9yKGVycm9yLCB0cmFuc2xhdGUgPSB0KSB7XG4gIGNvbnN0IGZhbGxiYWNrcyA9IHtcbiAgICBzaWduX2luX2Vycm9yX3VzZXJuYW1lX3JlcXVpcmVkOiAnVXNlcm5hbWUgaXMgcmVxdWlyZWQuJyxcbiAgICBzaWduX2luX2Vycm9yX3Bhc3N3b3JkX3JlcXVpcmVkOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQuJyxcbiAgfTtcblxuICBjb25zdCBmYWxsYmFjayA9IGZhbGxiYWNrc1tlcnJvci5tZXNzYWdlS2V5XSA/PyAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4nO1xuICBjb25zdCB0cmFuc2xhdGVkID0gdHJhbnNsYXRlKGVycm9yLm1lc3NhZ2VLZXkpO1xuXG4gIC8vIFRoZSBjbGllbnQgaTE4biB0KCkgcmV0dXJucyB0aGUga2V5IGl0c2VsZiB3aGVuIGEgdHJhbnNsYXRpb24gaXMgbWlzc2luZztcbiAgLy8gZmFsbCBiYWNrIHRvIEVuZ2xpc2ggc28gdGhlIHJhdyBrZXkgaXMgbmV2ZXIgc2hvd24uXG4gIHJldHVybi
79B0cmFuc2xhdGVkID09PSBlcnJvci5tZXNzYWdlS2V5ID8gZmFsbGJhY2sgOiB0cmFuc2xhdGVkO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGlubGluZSBlcnJvciBzcGFuIGZvciBhIGZpZWxkLCBpZiBvbmUgaXMgY3VycmVudGx5IHJlbmRlcmVkLlxuICpcbiAqIEBwYXJhbSB7SFRNTEZvcm1FbGVtZW50fSBmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cbiAqL1xuZnVuY3Rpb24gZmluZEZpZWxkRXJyb3JTcGFuKGZvcm0sIGZpZWxkTmFtZSkge1xuICByZXR1cm4gZm9ybS5xdWVyeVNlbGVjdG9yKFxuICAgIGBbZGF0YS1uYW1lPVwiJHtFUlJPUl9TUEFOX05BTUV9XCJdW2RhdGEtZmllbGQ9XCIke2ZpZWxkTmFtZX1cIl1gLFxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlciAob3IgdXBkYXRlKSB0aGUgaW5saW5lIGVycm9yIG1lc3NhZ2UgZGlyZWN0bHkgYmVsb3cgYSBmaWVsZC5cbiAqXG4gKiBUaGUgc3BhbiBpcyBpbnNlcnRlZCBhZnRlciB0aGUgaW5wdXQgaXRzZWxmLCBvciBhZnRlciBpdHMgYC5wYXNzd29yZC10b2dnbGVgXG4gKiB3cmFwcGVyLCBzbyBpdCB3b3JrcyBpbiBib3RoIHJlbmRlciBsb2NhdGlvbnMgb2YgdGhlIGZvcm0gKGhlYWRlciBkcm9wZG93blxuICogYW5kIHNpZ24taW4gcGFnZSkgd2l0aG91dCB0ZW1wbGF0ZSBjaGFuZ2VzLiBJZGVtcG90ZW50OiByZXVzZXMgYW4gZXhpc3RpbmdcbiAqIHNwYW4gcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcgaXQuXG4gKlxuICogQHBhcmFtIHtIVE1MRm9ybUVsZW1lbnR9IGZvcm1cbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWVsZE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIHNob3dGaWVsZEVycm9yKGZvcm0sIGZpZWxkTmFtZSwgbWVzc2FnZSkge1xuICBjb25zdCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke2ZpZWxkTmFtZX1cIl1gKTtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzcGFuID0gZmluZEZpZWxkRXJyb3JTcGFuKGZvcm0sIGZpZWxkTmFtZSk7XG4gIGlmICghc3Bhbikge1xuICAgIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgc3Bhbi5jbGFzc05hbWUgPSAnZXJyb3ItbXNnJztcbiAgICBzcGFuLmlkID0gYHNpZ25pbi0ke2ZpZWxkTmFtZX0tZXJyb3JgO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnLCBFUlJPUl9TUEFOX05BTUUpO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLWZpZWxkJywgZmllbGROYW1lKTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgJ3BvbGl0ZScpO1xuXG4gICAgY29uc3QgYW5jaG9yID0gaW5wdXQuY2xvc2VzdCgnLnBhc3N3b3JkLXRvZ2dsZScpID8/IGlucHV0O1xuICAgIGFuY2hvci5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgc3Bhbik7XG4gIH1cblxuICBzcGFuLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgaW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jywgc3Bhbi5pZCk7XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgZmllbGQncyBpbmxpbmUgZXJyb3IgbWVzc2FnZSBhbmQgaXRzIGFyaWEgbGlua2FnZSwgaWYgcHJlc2VudC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxGb3JtRWxlbWVudH0gZm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZVxuICovXG5mdW5jdGlvbiBjbGVhckZpZWxkRXJyb3IoZm9ybSwgZmllbGROYW1lKSB7XG4gIGNvbnN0IHNwYW4gPSBmaW5kRmllbGRFcnJvclNwYW4oZm9ybSwgZmllbGROYW1lKTtcbiAgaWYgKHNwYW4pIHtcbiAgICBzcGFuLnJlbW92ZSgpO1xuICB9XG5cbiAgY29uc3QgaW5wdXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPVwiJHtmaWVsZE5hbWV9XCJdYCk7XG4gIGlmIChpbnB1dCAmJiBpbnB1dC5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKSA9PT0gYHNpZ25pbi0ke2ZpZWxkTmFtZX0tZXJyb3JgKSB7XG4gICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRhY2ggZW1wdHktZmllbGQgdmFsaWRhdGlvbiB0byBhIHNpZ24taW4gZm9ybS5cbiAqXG4gKiBPbiBzdWJtaXQsIGJsYW5rIHJlcXVpcmVkIGZpZWxkcyBibG9jayBzdWJtaXNzaW9uIGFuZCBlYWNoIGdldHMgYW4gaW5saW5lXG4gKiBgZXJyb3ItbXNnYCBzcGFuIHJlbmRlcmVkIGRpcmVjdGx5IGJlbG93IGl0OyBmb2N1cyBtb3ZlcyB0byB0aGUgZmlyc3RcbiAqIG9mZmVuZGluZyBmaWVsZC4gVHlwaW5nIGluIGEgZmllbGQgY2xlYXJzIGl0cyBtZXNzYWdlLCBhcyBkb2VzIGEgc3Vic2VxdWVudFxuICogdmFsaWQgc3VibWl0LiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlcmUgaXMgbm8gZm9ybSB0byB3aXJlLlxuICpcbiAqIEBwYXJhbSB7SFRNTEZvcm1FbGVtZW50fSBmb3JtXG4gKiBAcGFyYW0ge09iamVjdH0gW2RlcHNdXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6IHN0cmluZ30gW2RlcHMudHJhbnNsYXRlPXRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciBhIGhhbmRsZXIgd2FzIGF0dGFjaGVkXG4gKi9cbmZ1bmN0aW9uIHdpcmVTaWduSW5WYWxpZGF0aW9uKGZvcm0sIGRlcHMgPSB7fSkge1xuICBpZiAoIWZvcm0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB0cmFuc2xhdGUgPSBkZXBzLnRyYW5zbGF0ZSA/PyB0O1xuXG4gIC8vIE5hdGl2ZSBidWJibGVzIGZvciB0aGUgdG9wLW1vc3QgZmllbGQgYXJlIGNsaXBwZWQgaW4gdGhlIGRyb3Bkb3duLXBhbmU7IHdlXG4gIC8vIG93biB0aGUgbWVzc2FnaW5nIGluc3RlYWQgKCMzNDYzKS5cbiAgZm9ybS5zZXRBdHRyaWJ1dGUoJ25vdmFsaWRhdGUnLCAnbm92YWxpZGF0ZScpO1xuXG4gIFJFUVVJUkVEX0ZJRUxEUy5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcbiAgICBjb25zdCBpbnB1dCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke2ZpZWxkTmFtZX1cIl1gKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4gY2xlYXJGaWVsZEVycm9yKGZvcm0sIGZpZWxkTmFtZSkpO1xuICAgIH1cbiAgfSk7XG5cbiAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZXZlbnQpID0+IHtcbiAgICBjb25zdCBlcnJvcnMgPSBnZXRTaWduSW5WYWxpZGF0aW9uRXJyb3JzKGZvcm0pO1xuICAgIGNvbnN0IGVycm9yRmllbGRzID0gZXJyb3JzLm1hcCgoZXJyb3IpID0+IGVycm9yLmZpZWxkKTtcblxuICAgIC8vIENsZWFyIHN0YWxlIG1lc3NhZ2VzIGZvciBmaWVsZHMgdGh
79hdCBhcmUgbm93IHZhbGlkLlxuICAgIFJFUVVJUkVEX0ZJRUxEUy5maWx0ZXIoKGZpZWxkTmFtZSkgPT4gIWVycm9yRmllbGRzLmluY2x1ZGVzKGZpZWxkTmFtZSkpXG4gICAgICAuZm9yRWFjaCgoZmllbGROYW1lKSA9PiBjbGVhckZpZWxkRXJyb3IoZm9ybSwgZmllbGROYW1lKSk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICBlcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgIHNob3dGaWVsZEVycm9yKGZvcm0sIGVycm9yLmZpZWxkLCBtZXNzYWdlRm9yRXJyb3IoZXJyb3IsIHRyYW5zbGF0ZSkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZmlyc3RGaWVsZCA9IGZvcm0ucXVlcnlTZWxlY3RvcihgW25hbWU9XCIke2Vycm9yc1swXS5maWVsZH1cIl1gKTtcbiAgICBpZiAoZmlyc3RGaWVsZCkge1xuICAgICAgZmlyc3RGaWVsZC5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCB7XG4gIGdldFNpZ25JblZhbGlkYXRpb25FcnJvcixcbiAgZ2V0U2lnbkluVmFsaWRhdGlvbkVycm9ycyxcbiAgbWVzc2FnZUZvckVycm9yLFxuICB3aXJlU2lnbkluVmFsaWRhdGlvbixcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/account/sign-in-validation.js\n");
80
81/***/ }),
82
83/***/ "./resources/js/account/tags/functions.js":
84/*!************************************************!*\
85  !*** ./resources/js/account/tags/functions.js ***!
86  \************************************************/
87/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
88
89eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   INPUT_TEXT_LIMIT: () => (/* binding */ INPUT_TEXT_LIMIT),\n/* harmony export */   deleteTag: () => (/* binding */ deleteTag),\n/* harmony export */   disableAddNewButton: () => (/* binding */ disableAddNewButton),\n/* harmony export */   ensureSensibleValues: () => (/* binding */ ensureSensibleValues),\n/* harmony export */   existingTagClickEventHandler: () => (/* binding */ existingTagClickEventHandler),\n/* harmony export */   findCurrentTagCopyInSaveModal: () => (/* binding */ findCurrentTagCopyInSaveModal),\n/* harmony export */   findNewTagElement: () => (/* binding */ findNewTagElement),\n/* harmony export */   findTagOnPageById: () => (/* binding */ findTagOnPageById),\n/* harmony export */   findTagOnPageByText: () => (/* binding */ findTagOnPageByText),\n/* harmony export */   isParentVisible: () => (/* binding */ isParentVisible),\n/* harmony export */   isTagManagementOnReader: () => (/* binding */ isTagManagementOnReader),\n/* harmony export */   manageModalElementsOnInputChange: () => (/* binding */ manageModalElementsOnInputChange),\n/* harmony export */   manageSaveModalVisibility: () => (/* binding */ manageSaveModalVisibility),\n/* harmony export */   manageTextCountElement: () => (/* binding */ manageTextCountElement),\n/* harmony export */   prepSaveModalForTagCreation: () => (/* binding */ prepSaveModalForTagCreation),\n/* harmony export */   prepSaveModalForTagEditing: () => (/* binding */ prepSaveModalForTagEditing),\n/* harmony export */   removeSpotlightFromTags: () => (/* binding */ removeSpotlightFromTags),\n/* harmony export */   resetAndCloseSaveModal: () => (/* binding */ resetAndCloseSaveModal),\n/* harmony export */   saveButtonHandler: () => (/* binding */ saveButtonHandler),\n/* harmony export */   saveModalInputTextHandler: () => (/* binding */ saveModalInputTextHandler),\n/* harmony export */   sortHandler: () => (/* binding */ sortHandler),\n/* harmony export */   sortTagsByNameSortingFunction: () => (/* binding */ sortTagsByNameSortingFunction),\n/* harmony export */   spotlightTag: () => (/* binding */ spotlightTag),\n/* harmony export */   tagsSortingFunction: () => (/* binding */ tagsSortingFunction),\n/* harmony export */   transformTagElementData: () => (/* binding */ transformTagElementData),\n/* harmony export */   updateOriginalTagColor: () => (/* binding */ updateOriginalTagColor)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/toConsumableArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/parse-int */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/from */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/sort */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/sort.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/includes */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/slice */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_assign__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/object/assign */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/object/assign.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_assign__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_object_assign__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/object/keys */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js/instance/replace-all */ \"./node_modules/@babel/runtime-corejs3/core-js/instance/replace-all.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _utilities_general__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../utilities/general */ \"./resources/js/utilities/general.js\");\n/* harmony import */ var _utilities_i18n__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../utilities/i18n */ \"./resources/js/utilities/i18n.js\");\n/* harmony import */ var _utilities_debug__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../utilities/debug */ \"./resources/js/utilities/debug.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar _createLogger = (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_17__.createLogger)('tag-functions'),\n  log = _createLogger.log;\n\n// The number of characters a tag is allowed to have\nvar INPUT_TEXT_LIMIT = 50;\n\n/**\n * Sort the user tag elements.\n *\n * @param event\n *\n * @returns {Promise<string>}\n */\nfunction sortHandler(_x) {\n  return _sortHandler.apply(this, arguments);\n}\n\n/**\n * Close and reset the save modal\n *\n * @param saveTagModal\n */\nfunction _sortHandler() {\n  _sortHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee(event) {\n    var _event$target$dataset, sortBy, sortDirection, toggler, direction, existingTagsDiv, _context4, _context5;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context6) {\n      while (1) switch (_context6.prev = _context6.next) {\n        case 0:\n          event.preventDefault();\n          _event$target$dataset = event.target.dataset, sortBy = _event$target$dataset.sortBy, sortDirection = _event$target$dataset.sortDirection;\n          toggler = {\n            'asc': 'desc',\n            'desc': 'asc'\n          };\n          direction = sortDirection; // if the selected sort option already has a class set, we need to toggle the direction\n          if (event.target.closest('li').classList.length > 0) {\n            direction = toggler[sortDirection];\n          }\n\n          // sort the tags\n          existingTagsDiv = document.querySelector('.existing-tags');\n          if (existingTagsDiv) {\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(_context4 = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_7___default()(_context5 = (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(existingTagsDiv.children)).call(_context5, tagsSortingFunction(sortBy, direction, 'element'))).call(_context4, function (node) {\n              return existingTagsDiv.appendChild(node);\n            });\n          } else {\n            console.error('Could not sort tags.');\n          }\n          event.target.dataset.sortDirection = direction;\n          return _context6.abrupt(\"return\", direction);\n        case 9:\n        case \"end\":\n          return _context6.stop();\n      }\n    }, _callee);\n  }));\n  return _sortHandler.apply(this, arguments);\n}\nfunction resetAndCloseSaveModal(saveTagModal) {\n  // remove displayed tag copy, if present\n  var copyTagWrapper = saveTagModal.querySelector('#copy-tag-wrapper');\n  if (copyTagWrapper) {\n    var _context;\n    copyTagWrapper.classList.add('hide');\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(_context = copyTagWrapper.childNodes).call(_context, function (element) {\n      element.remove();\n    });\n  }\n  if (saveTagModal) {\n    // remove ignore attribute\n    saveTagModal.removeAttribute('ignoreClick');\n\n    // ensure info modals are hidden\n    var newTagInfoModal = saveTagModal.querySelector('#new-tag-info');\n    if (newTagInfoModal) {\n      newTagInfoModal.style.display = 'none';\n    }\n    var modifyTagInfoModal = saveTagModal.querySelector('#modify-tag-info');\n    if (modifyTagInfoModal) {\n      modifyTagInfoModal.style.display = 'none';\n    }\n\n    // hide the modal\n    saveTagModal.classList.add('hide');\n\n    // reset text input\n    var textInput = saveTagModal.querySelector('input[type=\"text\"]');\n    if (textInput) {\n      textInput.value = '';\n    }\n\n    // reset new tag div\n    var newTagDiv = findNewTagElement();\n    if (newTagDiv) {\n      var _newTagDiv$classList;\n      // reset classes\n      (_newTagDiv$classList = newTagDiv.classList).remove.apply(_newTagDiv$classList, (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(newTagDiv.classList));\n      newTagDiv.classList.add('tag', 'default');\n\n      // reset data attributes\n      newTagDiv.setAttribute('data-tag-color', 'default');\n      newTagDiv.setAttribute('data-tag-text', '');\n      newTagDiv.setAttribute('data-tag-id', '');\n\n      // clear text\n      var tagSpan = newTagDiv.querySelector('.tag-text');\n      if (tagSpan) {\n        tagSpan.textContent = '';\n      }\n\n      // clear tag copy\n      var tagCopy = saveTagModal.querySelector('[data-tag-copy]');\n      if (tagCopy) {\n        var _tagCopy$classList;\n        (_tagCopy$classList = tagCopy.classList).remove.apply(_tagCopy$classList, (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(tagCopy.classList));\n        tagCopy.classList.add('tag', 'copy');\n        tagCopy.textContent = '';\n      }\n    }\n\n    // reset color selector to 'default'\n    var colorsWrapper = saveTagModal.querySelector('.tag-colors-wrapper');\n    if (colorsWrapper) {\n      var currentlySelected = colorsWrapper.querySelector('.selected');\n      var defaultColor = colorsWrapper.querySelector('[data-tag-color=\"default\"]');\n      if (currentlySelected && currentlySelected !== defaultColor) {\n        currentlySelected.classList.remove('selected');\n      }\n      if (defaultColor && !defaultColor.classList.contains('selected')) {\n        defaultColor.classList.add('selected');\n      }\n    }\n    enableAddNewButton();\n  }\n}\n\n/**\n * Set the text count to red when it exceeds INPUT_TEXT_LIMIT;
89 Remove color\n * if it is within the limit.\n *\n * @param text\n * @param textCountSpan\n */\nfunction manageTextCountElement(text, textCountSpan) {\n  if (text.length === INPUT_TEXT_LIMIT) {\n    textCountSpan.textContent = text.length;\n    if (!textCountSpan.classList.contains('red')) {\n      textCountSpan.classList.add('red');\n    }\n  } else {\n    textCountSpan.textContent = text.length;\n    textCountSpan.classList.remove('red');\n  }\n}\n\n/**\n * Event handler - text input keyup\n *\n * @param event\n * @returns {Promise<void>}\n */\nfunction saveModalInputTextHandler(_x2) {\n  return _saveModalInputTextHandler.apply(this, arguments);\n}\n\n/**\n * Set the save modal title.\n * @param title\n */\nfunction _saveModalInputTextHandler() {\n  _saveModalInputTextHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee2(event) {\n    var saveTagModal, text, newTagDiv, textCountSpan, noticeDiv, noticeElement;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee2$(_context7) {\n      while (1) switch (_context7.prev = _context7.next) {\n        case 0:\n          event.preventDefault();\n          saveTagModal = document.querySelector('#save-tag-modal');\n          text = event.target.value;\n          newTagDiv = findNewTagElement();\n          textCountSpan = saveTagModal.querySelector('.text-count span');\n          noticeDiv = document.querySelector('[data-notice]');\n          noticeElement = noticeDiv === null || noticeDiv === void 0 ? void 0 : noticeDiv.querySelector('.tm-notice'); // manage input length control\n          if (!(text.length > INPUT_TEXT_LIMIT)) {\n            _context7.next = 11;\n            break;\n          }\n          event.target.value = _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_9___default()(text).call(text, 0, INPUT_TEXT_LIMIT);\n          _context7.next = 20;\n          break;\n        case 11:\n          manageTextCountElement(text, textCountSpan);\n          if (!(event.key === 'Enter')) {\n            _context7.next = 17;\n            break;\n          }\n          _context7.next = 15;\n          return saveButtonHandler();\n        case 15:\n          _context7.next = 20;\n          break;\n        case 17:\n          disableSaveButton();\n          if (text.length === 0) {\n            if (noticeDiv) {\n              noticeElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('no_changes_made') || 'No changes made';\n              noticeDiv.classList.remove('hide');\n            }\n          }\n          manageModalElementsOnInputChange(newTagDiv, text);\n        case 20:\n        case \"end\":\n          return _context7.stop();\n      }\n    }, _callee2);\n  }));\n  return _saveModalInputTextHandler.apply(this, arguments);\n}\nfunction setModalTitle(title) {\n  var modalTitle = document.querySelector('[data-modal-title] span');\n  if (modalTitle) {\n    modalTitle.textContent = title;\n  }\n}\n\n/**\n * Manage which info modal we display when clicking on the info icon by the save modal title\n * @param action\n */\nfunction showTitleToolTip(action) {\n  var info_link = document.querySelector('[data-modal-title] a');\n  if (action === 'create') {\n    info_link.removeEventListener('click', showModifyInfoModal);\n    info_link.addEventListener('click', showCreateInfoModal);\n  }\n\n  // show 'modify' info modal\n  if (action === 'modify') {\n    info_link.removeEventListener('click', showCreateInfoModal);\n    info_link.addEventListener('click', showModifyInfoModal);\n  }\n}\n\n/**\n * Event handler for showing the \"create\" info modal in the save modal\n * @param event\n */\nfunction showCreateInfoModal(event) {\n  event.preventDefault();\n  var create_info_modal = document.querySelector('[data-create-info-modal]');\n  var modify_info_modal = document.querySelector('[data-modify-info-modal]');\n  if (create_info_modal && modify_info_modal) {\n    create_info_modal.style.display = 'inline';\n    modify_info_modal.style.display = 'none';\n  }\n}\n\n/**\n * Event handler for showing the \"modify\" info modal in the save modal\n *\n * @param event\n */\nfunction showModifyInfoModal(event) {\n  event.preventDefault();\n  var create_info_modal = document.querySelector('[data-create-info-modal]');\n  var modify_info_modal = document.querySelector('[data-modify-info-modal]');\n  if (create_info_modal && modify_info_modal) {\n    create_info_modal.style.display = 'none';\n    modify_info_modal.style.display = 'inline';\n  }\n}\n\n/**\n * Toggles the visibility of the save tag modal and the 'Add New' button when appropriate.\n *\n * @param saveTagModal\n * @param triggerElement (Either the 'Add new' button or an existing tag, that has been clicked on)\n */\nfunction manageSaveModalVisibility(saveTagModal, triggerElement) {\n  if (saveTagModal) {\n    if (saveTagModal.classList.contains('hide')) {\n      // determine if triggerElement should be disabled\n\n      if (triggerElement.id === 'new-tag-button') {\n        triggerElement.classList.add('disabled');\n        triggerElement.setAttribute('disabled', 'disabled');\n      }\n\n      // show new tag modal\n      saveTagModal.classList.remove('hide');\n\n      // set focus\n      var inputElement = saveTagModal.querySelector('input#save-tag');\n      if (inputElement) {\n        inputElement.focus();\n      }\n    }\n  }\n}\n\n/**\n * Enable the 'Add New' tag button.\n */\nfunction enableAddNewButton() {\n  var newTagButton = document.querySelector('#new-tag-button');\n  if (newTagButton) {\n    newTagButton.classList.remove('disabled');\n    newTagButton.removeAttribute('disabled');\n  }\n}\n\n/**\n * Disable the 'Add New' tag button.\n *\n */\nfunction disableAddNewButton() {\n  var newTagButton = document.querySelector('#new-tag-button');\n  if (newTagButton) {\n    newTagButton.classList.add('disabled');\n    newTagButton.setAttribute('disabled', 'disabled');\n  }\n}\n\n/**\n * Disable the 'Save' button in the Save modal.\n */\nfunction disableSaveButton() {\n  var saveButton = document.querySelector('#save-button');\n  if (saveButton) {\n    saveButton.classList.add('disabled');\n    saveButton.setAttribute('disabled', 'disabled');\n  }\n}\n\n/**\n *  Enable the 'Save' button in the Save modal.\n *\n */\nfunction enableSaveButton() {\n  var saveButton = document.querySelector('#save-button');\n  if (saveButton) {\n    saveButton.classList.remove('disabled');\n    saveButton.removeAttribute('disabled');\n  }\n}\n\n/**\n * Disable the 'Delete' button\n */\nfunction disableDeleteButton() {\n  var deleteButton = document.querySelector('#delete-button');\n  if (deleteButton) {\n    deleteButton.classList.add('disabled');\n    deleteButton.setAttribute('disabled', 'disabled');\n  }\n}\n\n/**\n * Enable the 'Delete' button on the save modal.\n */\nfunction enableDeleteButton() {\n  var deleteButton = document.querySelector('#delete-button');\n  if (deleteButton) {\n    deleteButton.classList.remove('disabled', 'hide');\n    deleteButton.removeAttribute('disabled');\n  }\n}\n\n/**\n * Hide the delete button in the save modal.\n */\nfunction hideDeleteButton() {\n  var deleteButton = document.querySelector('#delete-button');\n  if (deleteButton) {\n    deleteButton.classList.add('hide');\n  }\n}\n\n/**\n * Initialize the save modal for tag creation:\n * - Sets the modal title\n * - Sets the modal action property to 'create'\n * - Ensures default color selected and empty input text field.\n * - set handler for save button\n *\n * @param saveTagModal\n */\nfunction prepSaveModalForTagCreation(saveTagModal) {\n  var textCountSpan = saveTagModal.querySelector('.text-count span');\n  textCountSpan.textContent = '0';\n  saveTagModal.dataset.action = 'create';\n  setModalTitle((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('add_new_tag') || 'Add New Tag');\n  showTitleToolTip('create');\n  var form = document.querySelector('#annotations-form');\n  if (form) {\n    form.remove();\n  }\n  clearSaveModal(saveTagModal);\n  disableAddNewButton();\n  hideDeleteButton();\n}\n\n/**\n * Clear elements on the save modal.\n none*\n * @param saveTagModal\n */\nfunction clearSaveModal(saveTagModal) {\n  // remove the tag copy\n  var tagCopy = document.querySelector('[data-tag-copy]');\n  if (tagCopy) {\n    tagCopy.remove();\n  }\n\n  // remove tag copy tooltip\n  // const tagCopyTooltip = document.querySelector('#tag-copy-tooltip');\n  // if(tagCopyTooltip) {\n  //   tagCopyTooltip.remove();\n  // }\n\n  // clear the text field\n  var inputElement = saveTagModal.querySelector('input#save-tag');\n  inputElement.value = '';\n\n  // clear new tag div\n  var newTagDiv = findNewTagElement();\n  if (newTagDiv) {\n    var _newTagDiv$classList2;\n    (_newTagDiv$classList2 = newTagDiv.classList).remove.apply(_newTagDiv$classList2, (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(newTagDiv.classList));\n    newTagDiv.classList.add('tag', 'default', 'hide');\n  }\n\n  // clear notice text\n  var noticeDiv = document.querySelector('[data-notice]');\n  var noticeSpan = noticeDiv.querySelector('.tm-notice');\n  if (noticeSpan) {\n    noticeSpan.textContent = '';\n  }\n  var count = document.querySelector('#annotations-count');\n  if (count) {\n    count.textContent = '0';\n  }\n\n  // remove tag copy form\n  var form = document.querySelector('#annotations-form');\n  if (form) {\n    form.remove();\n  }\n  setColorSelector('default');\n  manageModalElementsOnInputChange(newTagDiv, '');\n}\n\n/**\n * Initialize the save modal to edit a tag.\n * - Sets the modal title\n * - renders the tag to be updated\n * - Enable the Delete button\n * - Set the input text value and the colors selector 'selected' color to the text and color\n *   of the tag we are going to edit.\n *\n * @param saveTagModal\n * @param tagToUpdate\n */\nfunction prepSaveModalForTagEditing(saveTagModal, tagToUpdate) {\n  clearSaveModal(saveTagModal);\n  var textCountSpan = saveTagModal.querySelector('.text-count span');\n  var inputElement = saveTagModal.querySelector('input#save-tag');\n  var newTagDiv = findNewTagElement();\n  saveTagModal.dataset.action = 'update';\n  setModalTitle((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('modify_tag') || 'Modify Tag');\n  showTitleToolTip('modify');\n\n  /* display tag being updated */\n  var tagCopy = createCopyOfExistingTag(extractTagProperties(tagToUpdate), true, true);\n  var _tagCopy$dataset = tagCopy.dataset,\n    color = _tagCopy$dataset.tagColor,\n    id = _tagCopy$dataset.tagId,\n    text = _tagCopy$dataset.tagText,\n    usage = _tagCopy$dataset.tagUsage;\n  var copyTagWrapper = saveTagModal.querySelector('#copy-tag-wrapper');\n  if (copyTagWrapper) {\n    copyTagWrapper.classList.remove('hide');\n    copyTagWrapper.appendChild(tagCopy);\n  }\n  if (_babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4___default()(usage) > 0) {\n    // make info icon visible\n  }\n\n  // set text input\n  if (inputElement) {\n    inputElement.value = text;\n    textCountSpan.textContent = text.length;\n\n    // handle counter color\n    textCountSpan.classList.remove('red');\n    if (text.length >= INPUT_TEXT_LIMIT) {\n      textCountSpan.classList.add('red');\n    }\n  }\n\n  // set current color on color selector\n  setColorSelector(color);\n  if (newTagDiv) {\n    // set color class\n    newTagDiv.classList.remove('default');\n    newTagDiv.classList.add(color);\n\n    // set new tag div properties\n    newTagDiv.setAttribute('data-tag-color', color);\n    newTagDiv.setAttribute('data-tag-id', id);\n    newTagDiv.setAttribute('data-tag-text', text);\n\n    // display text\n    var tagSpan = document.querySelector('.new-tag .tag-text');\n    if (tagSpan) {\n      tagSpan.textContent = text;\n    }\n\n    // display div\n    newTagDiv.classList.remove('hide');\n  }\n  disableAddNewButton();\n  disableSaveButton();\n  enableDeleteButton();\n}\n\n/**\n * Handles the click on the save modal 'Save' button.\n * Figures out if we are creating a new tag or updating an existing tag and hands off control to the appropriate\n * function to handle the action.\n *\n */\nfunction saveButtonHandler() {\n  return _saveButtonHandler.apply(this, arguments);\n}\n\n/**\n * Sets the color selector element to a given color.\n *\n * @param color\n */\nfunction _saveButtonHandler() {\n  _saveButtonHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee3() {\n    var _saveTagModal$dataset;\n    var saveButton, saveTagModal, noticeDiv, noticeElement, inputTextElement, action, originalProps, tagCopy, existingTag, newTagDiv, newProps, _context8, _action, _newTagDiv, modalContent;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee3$(_context9) {\n      while (1) switch (_context9.prev = _context9.next) {\n        case 0:\n          saveButton = document.querySelector('#save-button');\n          saveTagModal = document.querySelector('#save-tag-modal');\n          noticeDiv = document.querySelector('[data-notice]');\n          noticeElement = noticeDiv === null || noticeDiv === void 0 ? void 0 : noticeDiv.querySelector('.tm-notice');\n          inputTextElement = document.querySelector('#save-tag'); // Get the action first to determine comparison strategy\n          action = saveTagModal === null || saveTagModal === void 0 || (_saveTagModal$dataset = saveTagModal.dataset) === null || _saveTagModal$dataset === void 0 ? void 0 : _saveTagModal$dataset.action; // Get original properties for comparison\n          // In update mode, use tagCopy (which stores original values before editing)\n          // In create mode, check if a tag with this text already exists\n          if (action === 'update') {\n            tagCopy = saveTagModal.querySelector('[data-tag-copy]');\n            originalProps = extractTagProperties(tagCopy);\n          } else {\n            existingTag = findTagOnPageByText(inputTextElement.value);\n            originalProps = extractTagProperties(existingTag);\n          }\n          newTagDiv = findNewTagElement();\n          newProps = extractTagProperties(newTagDiv);\n          if (!(inputTextElement.value.length === 0)) {\n            _context9.next = 14;\n            break;\n          }\n          if (!noticeElement) {\n            _context9.next = 14;\n            break;\n          }\n          noticeDiv.classList.remove('hide');\n          noticeElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('enter_tag_name') || 'Enter a tag name before submitting';\n          return _context9.abrupt(\"return\");\n        case 14:\n          if (!(originalProps.text === newProps.text && originalProps.color === newProps.color)) {\n            _context9.next = 21;\n            break;\n          }\n          if (!noticeElement) {\n            _context9.next = 19;\n            break;\n          }\n          noticeDiv.classList.remove('hide');\n          noticeElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('no_changes_made') || '
89No changes made';\n          return _context9.abrupt(\"return\");\n        case 19:\n          _context9.next = 26;\n          break;\n        case 21:\n          if (!(inputTextElement.value.length === 0)) {\n            _context9.next = 26;\n            break;\n          }\n          if (!noticeElement) {\n            _context9.next = 26;\n            break;\n          }\n          noticeDiv.classList.remove('hide');\n          noticeElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('enter_tag_name') || 'Enter a tag name before submitting';\n          return _context9.abrupt(\"return\");\n        case 26:\n          if (!saveTagModal) {\n            _context9.next = 45;\n            break;\n          }\n          _action = saveTagModal.dataset.action; // guard clause\n          if (!(!_action || !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_8___default()(_context8 = ['create', 'update']).call(_context8, _action))) {\n            _context9.next = 31;\n            break;\n          }\n          log(\"Don't know if we are creating or updating...\");\n          return _context9.abrupt(\"return\");\n        case 31:\n          _newTagDiv = findNewTagElement();\n          if (!(saveButton && !saveButton.classList.contains('disabled'))) {\n            _context9.next = 45;\n            break;\n          }\n          // Show overlay with spinner during save operation\n          modalContent = saveTagModal.querySelector('.reveal-content') || saveTagModal;\n          (0,_utilities_general__WEBPACK_IMPORTED_MODULE_15__.insertOverlayOnElement)(modalContent, 'save-tag-overlay');\n          _context9.prev = 35;\n          if (!(_action === 'create')) {\n            _context9.next = 39;\n            break;\n          }\n          _context9.next = 39;\n          return createTag(_newTagDiv);\n        case 39:\n          if (!(_action === 'update')) {\n            _context9.next = 42;\n            break;\n          }\n          _context9.next = 42;\n          return updateTag(_newTagDiv);\n        case 42:\n          _context9.prev = 42;\n          (0,_utilities_general__WEBPACK_IMPORTED_MODULE_15__.removeOverlayOnElement)('save-tag-overlay');\n          return _context9.finish(42);\n        case 45:\n          resetAndCloseSaveModal(saveTagModal);\n        case 46:\n        case \"end\":\n          return _context9.stop();\n      }\n    }, _callee3, null, [[35,, 42, 45]]);\n  }));\n  return _saveButtonHandler.apply(this, arguments);\n}\nfunction setColorSelector(color) {\n  var saveTagModal = document.querySelector('#save-tag-modal');\n  var colorsWrapper = saveTagModal.querySelector('.tag-colors-wrapper');\n  if (colorsWrapper) {\n    var currentlySelected = colorsWrapper.querySelector('.selected');\n    var toSelect = colorsWrapper.querySelector(\"[data-tag-color=\\\"\".concat(color, \"\\\"]\"));\n\n    // if we have the right color selected\n    if (currentlySelected === toSelect) {\n      return;\n    }\n    currentlySelected.classList.remove('selected');\n    toSelect.classList.add('selected');\n  }\n}\n\n/**\n * Check if a user tag already exists with the text. If id provided, search by id.\n *\n * @param tagText\n * @param tagId\n * @returns {*|null}\n */\nfunction findTagOnPage(tagText) {\n  var _existingTagsCollecti;\n  var tagId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  var existingTagsCollection = document.querySelector('.existing-tags');\n  var action = existingTagsCollection === null || existingTagsCollection === void 0 || (_existingTagsCollecti = existingTagsCollection.dataset) === null || _existingTagsCollecti === void 0 ? void 0 : _existingTagsCollecti.action;\n  var selector = \".existing-tags .tag:not([data-tag-type='delete'])\";\n\n  // if there is a suggested tags collection on the page, add those tags\n  var suggestedTagsCollection = document.querySelector('.suggested-tags');\n  if (suggestedTagsCollection) {\n    selector = \"\".concat(selector, \", .suggested-tags .tag:not([data-tag-type='delete'])\");\n  }\n\n  // On Update, include the copy-tag element in the list of tags before search\n  if (existingTagsCollection && action === 'update') {\n    selector = \".existing-tags .tag, [data-tag-copy]\";\n  }\n  var tags = document.querySelectorAll(selector);\n  if (tags) {\n    var allTags = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_5___default()(tags);\n    var existingTag = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_6___default()(allTags).call(allTags, function (tag) {\n      var _tag$dataset = tag.dataset,\n        id = _tag$dataset.tagId,\n        text = _tag$dataset.tagText;\n\n      // search by id\n      if (tagId && id) {\n        return tagId === id;\n      }\n\n      // search by tag text\n      return tagText === text; // && newTagColor === color;\n    });\n    if (existingTag) {\n      return existingTag;\n    }\n  }\n  return null;\n}
89\n\n/**\n * Find a tag on the page by tag text.\n *\n * @param text\n * @returns {*|null}\n */\nfunction findTagOnPageByText(text) {\n  return findTagOnPage(text);\n}\n\n/**\n *\n * Find tag on page by tag id.\n * @param id\n * @returns {*|null}\n */\nfunction findTagOnPageById(id) {\n  return findTagOnPage('', id);\n}\n\n/**\n * Update the color of the original tag on the page (behind the modal).\n * Called when user selects a color in the Modify Tag modal.\n *\n * @param tagId - The ID of the tag being modified\n * @param newColor - The new color to apply\n */\nfunction updateOriginalTagColor(tagId, newColor) {\n  if (!tagId) return;\n  var originalTag = findTagOnPageById(tagId);\n  if (!originalTag) return;\n\n  // Color classes that can be on a tag\n  var colorClasses = ['default', 'yellow', 'orange', 'gold', 'green', 'teal', 'blue', 'purple', 'pink', 'red', 'gray'];\n\n  // Remove existing color classes\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(colorClasses).call(colorClasses, function (color) {\n    return originalTag.classList.remove(color);\n  });\n\n  // Add the new color class\n  originalTag.classList.add(newColor);\n  originalTag.dataset.tagColor = newColor;\n}\n\n/**\n * Find the element for creating a new tag.\n *\n * @returns {Element|null}\n */\nfunction findNewTagElement() {\n  var element;\n  if (isTagManagementOnReader()) {\n    element = document.querySelector('.tag[data-type=\"new\"]');\n  } else {\n    element = document.querySelector('.tag[data-save-tag]');\n  }\n  if (element) {\n    return element;\n  }\n  return null;\n}\n\n/**\n * Manage elements in Save modal whenever the text in the input text field change.\n * - Update the new tag div with text from text input.\n * - If the tag exists already, disable the 'Add' button and\n * - Display a notice when appropriate.\n *\n * @param newTagDiv\n * @param newTagText\n */\nfunction manageModalElementsOnInputChange(newTagDiv, newTagText) {\n  var noticeDiv = document.querySelector('[data-notice]');\n  var noticeElement = noticeDiv.querySelector('.tm-notice');\n  var saveModal = document.querySelector('#save-tag-modal');\n  var action = saveModal.getAttribute('data-action');\n  var tagSpan = document.querySelector('.tag-text');\n  var existingTag = findTagOnPageByText(newTagText);\n  // let noticeTagElement = null;\n\n  if (noticeDiv) {\n    // removeTagExistsNoticeElement();\n    noticeElement.textContent = '';\n  }\n\n  // Set tag text and icon\n  if (tagSpan) {\n    tagSpan.textContent = newTagText;\n  }\n  newTagDiv.setAttribute('data-tag-text', newTagText);\n  if (newTagText.length > 0) {\n    disableAddNewButton();\n    newTagDiv.classList.remove('hide');\n\n    // if a tag already exists with the text in the input field\n    var existingTagWithSameText = findTagOnPageByText(newTagText);\n    if (existingTagWithSameText) {\n      var props = extractTagProperties(existingTagWithSameText);\n      // noticeTagElement = createCopyOfExistingTag(props, true);\n    }\n    if (existingTagWithSameText) {\n      var _existingTagWithSameT = existingTagWithSameText.dataset,\n        existingText = _existingTagWithSameT.tagText,\n        existingId = _existingTagWithSameT.tagId;\n      var _newTagDiv$dataset = newTagDiv.dataset,\n        newColor = _newTagDiv$dataset.tagColor,\n        newText = _newTagDiv$dataset.tagText;\n      if (action === 'create') {\n        // the text of new tags should be unique\n        if (existingText === newText) {\n          spotlightTag(existingTag);\n          disableSaveButton();\n          noticeElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('tag_already_exists') || \"Tag already exists\";\n          noticeDiv.classList.remove('hide');\n        } else {\n          removeSpotlightFromTags(existingTag);\n          noticeElement.textContent = '';\n          noticeDiv.classList.remove('hide');\n          enableSaveButton();\n        }\n      }\n      if (action === 'update') {\n        var copyOfThisTag = saveModal.querySelector('[data-tag-copy]');\n        var _copyOfThisTag$datase = copyOfThisTag.dataset,\n          thisColor = _copyOfThisTag$datase.tagColor,\n          thisText = _copyOfThisTag$datase.tagText,\n          thisId = _copyOfThisTag$datase.tagId;\n        var textChanged = thisText !== newText;\n        var colorChanged = thisColor !== newColor;\n        var noChangeToCurrentTag = thisId === existingId && !textChanged && !colorChanged;\n        var changesToCurrentTag = thisId === existingId && (textChanged || colorChanged && !textChanged);\n        if (noChangeToCurrentTag) {\n          spotlightTag(existingTag);\n          disableSaveButton();\n          noticeElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('no_change') || 'No change';\n          noticeDiv.classList.remove('hide');\n          // noticeDiv.insertBefore(noticeTagElement, noticeDiv.firstChild);\n          disableElement(newTagDiv);\n        } else if (changesToCurrentTag) {\n          removeSpotlightFromTags(existingTag);\n          noticeDiv.classList.add('hide');\n          enableSaveButton();\n          // removeTagExistsNoticeElement();\n          enableElement(newTagDiv);\n        } else {\n          spotlightTag(existingTag);\n          disableSaveButton();\n          noticeElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('tags_must_be_unique') || \"Tags must be uniquely named\";\n          noticeDiv.classList.remove('hide');\n          disableElement(newTagDiv);\n          //spotlight existing tag\n        }\n      }\n    }\n    // if the text for the new tag is unique - allow update\n    else {\n      removeSpotlightFromTags();\n      noticeDiv.classList.add('hide');\n      enableSaveButton();\n      enableElement(newTagDiv);\n    }\n  } else {\n    removeSpotlightFromTags(existingTag);\n    // if newTagText.length === 0\n    newTagDiv.classList.add('hide');\n    noticeDiv.classList.add('hide');\n  }\n}\n\n/**\n * Make a copy of the tag div to display in the notice div.\n *\n * @param tagProperties\n * @param showUsage\n * @param withLinkToAnnotationsPage\n * @param withCopyDataAttribute\n */\nfunction createCopyOfExistingTag(tagProperties) {\n  var showUsage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n  var withLinkToAnnotationsPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n  var withCopyDataAttribute = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n  var color = tagProperties.color,\n    id = tagProperties.id,\n    lastUpdated = tagProperties.lastUpdated,\n    text = tagProperties.text,\n    usage = tagProperties.usage;\n  var tag = document.createElement('div');\n  if (withCopyDataAttribute) {\n    tag.setAttribute('data-tag-copy', '');\n  }\n  tag.setAttribute('data-tag-color', color);\n  tag.setAttribute('data-tag-id', id);\n  tag.setAttribute('data-tag-text', text);\n  tag.setAttribute('data-tag-last-updated', lastUpdated);\n  tag.setAttribute('data-tag-usage', usage);\n  tag.setAttribute('tab-index', '0');\n\n  // <span class='tag-usage'>{$tag['Usage']}</span>\n  tag.classList.add('tag', 'copy', \"\".concat(color));\n  var span = document.createElement('span');\n  span.textContent = text;\n  tag.appendChild(span);\n  if (showUsage) {\n    // tag.textContent = text;\n    var usageSpan = document.createElement('span');\n    usageSpan.classList.add('tag-usage');\n    usageSpan.textContent = usage;\n    tag.appendChild(usageSpan);\n  }\n  if (withLinkToAnnotationsPage) {\n    if (_babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4___default()(usage) > 0) {\n      var copyTagWrapper = document.querySelector('#copy-tag-wrapper');\n      var form = document.querySelector('#annotations-form');\n      if (!form) {\n        form = document.createElement('form');\n        var hidden = document.createElement('input');\n        hidden.setAttribute('type', 'hidden');\n        hidden.setAttribute('name', 'tagId');
89\n        hidden.setAttribute('value', id);\n\n        // create form for link to annotations page\n        var url = copyTagWrapper.dataset.url;\n        form.id = 'annotations-form';\n        form.setAttribute('method', 'POST');\n        form.setAttribute('action', url);\n        form.appendChild(hidden);\n        copyTagWrapper.parentElement.append(form);\n        tag.addEventListener('click', function (event) {\n          event.preventDefault();\n          if (confirm((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('confirm_navigate_annotations') || \"By clicking on the 'Continue' button you will be taken to the\\nAnnotations page filtered by this tag. Any unsaved changes to this tag will be lost.\")) {\n            // Use centered overlay spinner for navigation\n            var saveTagModal = document.querySelector('#save-tag-modal');\n            (0,_utilities_general__WEBPACK_IMPORTED_MODULE_15__.insertOverlayOnElement)(saveTagModal, 'filter-tag-overlay');\n            form.submit();\n          }\n        });\n      }\n    }\n  }\n  return tag;\n}\n\n/**\n * Look for and return the tag in the notice div that is a copy of an existing user tag.\n *\n * @returns {Element|null}\n */\nfunction findTagCopyElementInNoticeDiv() {\n  var noticeElement = document.querySelector('[data-notice]');\n  if (noticeElement) {\n    var copyElement = noticeElement.querySelector('[data-tag-copy]');\n    if (copyElement) {\n      return copyElement;\n    }\n  }\n  return null;\n}\n\n/**\n * Find the element that is a copy of the tag being updated.\n *\n * @returns {*}\n */\nfunction findCurrentTagCopyInSaveModal() {\n  var copyElement = document.querySelector('#save-tag-modal [data-tag-copy]');\n  if (copyElement) {\n    return copyElement;\n  }\n  return null;\n}\n\n/**\n * Remove copy of existing tag in notice div.\n */\n// function removeTagExistsNoticeElement() {\n//   const copyTag = findTagCopyElementInNoticeDiv();\n//   if(copyTag) {\n//     copyTag.remove();\n//   }\n// }\n\n/**\n * Handle adding a new tag from the tags management page\n *\n * @param tag\n * @returns {Promise<void>}\n */\nfunction createTag(_x3) {\n  return _createTag.apply(this, arguments);\n}\n/**\n * Delete the selected tag.\n *\n * @param tag\n * @returns {Promise<void>}\n */\nfunction _createTag() {\n  _createTag = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee4(tag) {\n    var action;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee4$(_context10) {\n      while (1) switch (_context10.prev = _context10.next) {\n        case 0:\n          action = 'create';\n          _context10.next = 3;\n          return persistTag(action, tag);\n        case 3:\n        case \"end\":\n          return _context10.stop();\n      }\n    }, _callee4);\n  }));\n  return _createTag.apply(this, arguments);\n}\nfunction deleteTag(_x4) {\n  return _deleteTag.apply(this, arguments);\n}\n\n/**\n * Set up call to persist tag update.\n *\n * @param tag\n * @returns {Promise<void>}\n */\nfunction _deleteTag() {\n  _deleteTag = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee5(tag) {\n    var action;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee5$(_context11) {\n      while (1) switch (_context11.prev = _context11.next) {\n        case 0:\n          action = 'delete';\n          _context11.next = 3;\n          return persistTag(action, tag);\n        case 3:\n        case \"end\":\n          return _context11.stop();\n      }\n    }, _callee5);\n  }));\n  return _deleteTag.apply(this, arguments);\n}\nfunction updateTag(_x5) {\n  return _updateTag.apply(this, arguments);\n}\n/**\n * Persist the tag data to the database.\n *\n * @param action\n * @param tag\n * @returns {Promise<void>}\n */\nfunction _updateTag() {\n  _updateTag = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee6(tag) {\n    var action;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee6$(_context12) {\n      while (1) switch (_context12.prev = _context12.next) {\n        case 0:\n          action = 'update';\n          _context12.next = 3;\n          return persistTag(action, tag);\n        case 3:\n        case \"end\":\n          return _context12.stop();\n      }\n    }, _callee6);\n  }));
89\n  return _updateTag.apply(this, arguments);\n}\nfunction persistTag(_x6, _x7) {\n  return _persistTag.apply(this, arguments);\n}\nfunction _persistTag() {\n  _persistTag = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee7(action, tag) {\n    var saveModal, _tag$dataset3, color, _tag$dataset3$tagId, id, text, data, url, result, success, messages, msg, _context13, _context14, _context15, data_clone, type, notice;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee7$(_context16) {\n      while (1) switch (_context16.prev = _context16.next) {\n        case 0:\n          // Note: Overlay spinner is handled by saveButtonHandler() - no separate spinner needed here\n          saveModal = document.querySelector('#save-tag-modal');\n          _tag$dataset3 = tag.dataset, color = _tag$dataset3.tagColor, _tag$dataset3$tagId = _tag$dataset3.tagId, id = _tag$dataset3$tagId === void 0 ? null : _tag$dataset3$tagId, text = _tag$dataset3.tagText; // ensure the tag not longer than the limit\n          text = _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_9___default()(text).call(text, 0, INPUT_TEXT_LIMIT);\n          data = {\n            action: action,\n            id: id,\n            color: color,\n            text: text\n          };\n          url = saveModal.dataset.url; // async fetch\n          _context16.next = 7;\n          return new _fetch_helpers__WEBPACK_IMPORTED_MODULE_13__[\"default\"]().fetchData('POST', url, data, {\n            mutating: true,\n            dataLabel: 'tags'\n          });\n        case 7:\n          result = _context16.sent;\n          success = result.success, messages = result.messages; // handle response\n          msg = '';
89\n          if (success) {\n            msg = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_16__.t)('tag_action_successful', {\n              ':action': (0,_utilities_general__WEBPACK_IMPORTED_MODULE_15__.capitalize)(action)\n            }) || \"\".concat((0,_utilities_general__WEBPACK_IMPORTED_MODULE_15__.capitalize)(action), \" action successful.\");\n\n            // if we didn't get back the id of the tag modified grab it from the data variable\n            data_clone = _babel_runtime_corejs3_core_js_stable_object_assign__WEBPACK_IMPORTED_MODULE_10___default()({}, data);\n            delete data_clone.action;\n            if (action === 'create' && !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_8___default()(_context13 = _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_11___default()(result)).call(_context13, 'created')) {\n              result[action_response] = data_clone;\n            } else if (action === 'delete' && !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_8___default()(_context14 = _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_11___default()(result)).call(_context14, 'deleted')) {\n              result[action_response] = data_clone;\n            } else if (action === 'update' && !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_8___default()(_context15 = _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_11___default()(result)).call(_context15, 'updated')) {\n              result[action_response] = clone;\n            }\n            updateTagCollection(action, result);\n          }\n\n          // handle messages\n          if (messages) {\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(messages).call(messages, function (message) {\n              console.error(message);\n              msg += \"\".concat(message, \"\\n\");\n            });\n            _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_12___default()(msg).call(msg, \"\\n\", '<br />');\n          }\n          type = result['success'] ? 'info' : 'warning';\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_14__.AsyncNotice(msg, type);\n          _context16.next = 16;\n          return notice.create({}, true);\n        case 16:\n          notice.remove();\n        case 17:\n        case \"end\":\n          return _context16.stop();\n      }\n    }, _callee7);\n  }));\n  return _persistTag.apply(this, arguments);\n}\nfunction updateTagCollection(action, result) {\n  var tagsCollection = document.querySelector('.existing-tags');\n  var tag;\n  if (action === 'create') {\n    // add tag in current sort position\n    var created = result.created;\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(created).call(created, function (tag) {\n      var tagElement = createCopyOfExistingTag(tag, true);\n      tagElement.classList.remove('copy');\n      tagElement.removeAttribute('data-tag-copy');\n      tagElement.addEventListener('click', function (event) {\n        existingTagClickEventHandler(event);\n      });\n      tagsCollection.appendChild(tagElement);\n    });\n    var sortElement = document.querySelector('#sort-tags');\n    var sortSelected = sortElement.querySelector('li[class] a');\n    if (sortSelected) {\n      var _context2, _context3;\n      var _sortSelected$dataset = sortSelected.dataset,\n        sortBy = _sortSelected$dataset.sortBy,\n        sortDirection = _sortSelected$dataset.sortDirection;\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(_context2 = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_7___default()(_context3 = (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(tagsCollection.children)).call(_context3, tagsSortingFunction(sortBy, sortDirection, 'element'))).call(_context2, function (node) {\n        return tagsCollection.appendChild(node);\n      });\n    }\n  }\n  if (action === 'update') {\n    // update the tag\n    var updated = result.updated;\n    if (updated) {\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(updated).call(updated, function (tagProperties) {\n        tag = findTagOnPageById(tagProperties.id);\n        if (tag) {\n          // set up properties of new tag element\n          var existingTagProperties = extractTagProperties(tag);\n          var updatedTag = createCopyOfExistingTag(existingTagProperties, true, false, false);\n\n          // remove copy class (used for modal display, not tag list)\n          updatedTag.classList.remove('copy');\n\n          // update color\n          updatedTag.setAttribute('data-tag-color', tagProperties.color);\n          updatedTag.classList.replace(existingTagProperties.color, tagProperties.color);\n\n          // update last updated\n          updatedTag.setAttribute('data-tag-last-updated', tagProperties.lastUpdated);\n\n          // update text\n          var textElement = document.createTextNode(tagProperties.text);\n          updatedTag.setAttribute('data-tag-text', tagProperties.text);\n          updatedTag.childNodes[0].replaceWith(textElement);\n\n          // click event handler\n          updatedTag.addEventListener('click', function (event) {\n            existingTagClickEventHandler(event);\n          });\n          tag.replaceWith(updatedTag);\n        }\n      });\n    }\n  }\n  if (action === 'delete') {\n    // remove the tag\n    var deleted = result.deleted;\n    if (deleted) {\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(deleted).call(deleted, function (id) {\n        tag = findTagOnPageById(id);\n        if (tag) {\n          tag.remove();\n        }\n      });\n    }\n  }\n\n  // update count\n  var total = document.querySelector('.annotation-items #total');\n  if (total) {\n    var tags = document.querySelectorAll('.existing-tags .tag');\n    total.textContent = tags ? tags.length : '--';\n  }\n  var saveModal = document.querySelector('#save-tag-modal');\n  if (saveModal) {\n    resetAndCloseSaveModal(saveModal);\n  }\n}\n\n/**\n * Extract the tag properties from a tag element's dataset. If tagElement is null, return object with\n * blank tag properties.\n *\n * @param tagElement\n * @returns {{lastUpdated, color, usage, id, text}}\n */\nfunction extractTagProperties(tagElement) {\n  if (tagElement) {\n    var _tagElement$dataset = tagElement.dataset,\n      _tagElement$dataset$t = _tagElement$dataset.tagColor,\n      originalColor = _tagElement$dataset$t === void 0 ? '' : _tagElement$dataset$t,\n      _tagElement$dataset$t2 = _tagElement$dataset.tagId,\n      id = _tagElement$dataset$t2 === void 0 ? '' : _tagElement$dataset$t2,\n      _tagElement$dataset$t3 = _tagElement$dataset.tagLastUpdated,\n      lastUpdated = _tagElement$dataset$t3 === void 0 ? '' : _tagElement$dataset$t3,\n      _tagElement$dataset$t4 = _tagElement$dataset.tagText,\n      text = _tagElement$dataset$t4 === void 0 ? '' : _tagElement$dataset$t4,\n      _tagElement$dataset$t5 = _tagElement$dataset.tagUsage,\n      usage = _tagElement$dataset$t5 === void 0 ? '0' : _tagElement$dataset$t5;\n    var color = originalColor.length === 0 ? 'default' : originalColor;\n    return {\n      color: color,\n      id: id,\n      lastUpdated: lastUpdated,\n      text: text,\n      usage: usage\n    };\n  }\n  return {\n    color: '',\n    lastUpdated: '',\n    id: '',\n    text: '',\n    usage: '0'\n  };\n}\n\n/**\n * Event handler for click on existing tag in tags collection.\n *\n * @param event\n */\nfunction existingTagClickEventHandler(event) {\n  event.stopPropagation();\n  var saveTagModal = document.querySelector('#save-tag-modal');\n  // if modal is showing\n  if (!saveTagModal.classList.contains('hide')) {\n    // if click is outside the active modal,\n    if (!saveTagModal.contains(event.target)) {\n      return;\n    }\n  }\n  var tagElement = event.target;\n  if (tagElement.tagName === 'SPAN') {\n    tagElement = tagElement.parentNode;\n  }\n  prepSaveModalForTagEditing(saveTagModal, tagElement);\n  manageSaveModalVisibility(saveTagModal, tagElement);\n}\n\n/**\n * Disable an element by handling the 'disabled' attribute and class.\n *\n * @param element\n */\nfunction disableElement(element) {\n  element.setAttribute('disabled', 'true');\n  if (!element.classList.contains('disabled')) {\n    element.classList.add('disabled');\n  }\n}\n\n/**\n * Enable an element by handling the 'disabled' attribute and class.\n *\n * @param element\n */\nfunction enableElement(element) {\n  element.removeAttribute('disabled');\n  element.classList.remove('disabled');\n}\n\n/**\n * Visually mark tag as in edit mode.\n *\n * @param tag\n */\nfunction spotlightTag(tag) {\n  if (tag) {\n    tag.classList.add('highlighted');\n    tag.dataset.highlighted = 'true';\n    // await asyncSleep(2000, removeSpotlightFromTags(tag);\n    // removeSpotlightFromTags(tag);\n  }\n}\n\n/**\n * Clear highlighted style from tag.\n * - resets border width\n * - clears and hides the new tag element\n * If no target element is passed in, check the page for any elements with the data attribute 'data-highlighted'\n *\n * @param targetElement\n */\nfunction removeSpotlightFromTags() {\n  var targetElement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n  if (targetElement) {\n    targetElement.classList.remove('highlighted');\n    targetElement.removeAttribute('highlighted');\n  } else {\n    var spotLightedCollection = document.querySelectorAll(\"[data-highlighted]\");\n    if (spotLightedCollection) {\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(spotLightedCollection).call(spotLightedCollection, function (tag) {\n        removeSpotlightFromTags(tag);\n      });\n    }\n  }\n}\n\n/**\n * Is the current context the reader or the tags management page.\n * Checks the location pathname.\n *\n * @returns {boolean}\n */\nfunction isTagManagementOnReader() {\n  var pathname = window.location.pathname;\n  return _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_8___default()(pathname).call(pathname, 'reader.php');\n}\n\n/**\n * Returns the sorting function to use for sorting tag, based on two criteria, sortBy and direction.\n *\n * @param sortBy - sort attribute ('name','time','usage')\n * @param direction - ('asc', 'desc')\n * @param elementItem\n */\nfunction tagsSortingFunction(sortBy, direction) {\n  var elementItem = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'array';\n  if (sortBy === 'color') {\n    return sortTagsByColorSortingFunction(direction, elementItem);\n  } else if (sortBy === 'usage') {\n    return sortTagsByMostUsedSortingFunction(direction, elementItem);\n  } else if (sortBy === 'time') {\n    return sortTagsByMostRecentSortingFunction(direction, elementItem);\n  } else {\n    return sortTagsByNameSortingFunction(direction, elementItem);\n  }\n}\n\n/**\n * Sorting function to use with sort() that sorts tags by color.\n * @returns {number}\n */\nfunction sortTagsByColorSortingFunction(direction, elementItem) {\n  return generalSortingFunction('color', direction, elementItem);\n}\n\n/**\n * Sorting function to use with sort() that sorts tags alphabetically.\n * @returns {number}\n */\nfunction sortTagsByNameSortingFunction(direction, elementItem) {\n  return generalSortingFunction('name', direction, elementItem);\n}\n\n/**\n * Sorting function to use with sort() that sorts by the creation date of the tags.\n * @returns {number}\n */\nfunction sortTagsByMostRecentSortingFunction(direction, elementItem) {\n  return generalSortingFunction('time', direction, elementItem);\n}\n\n/**\n * Sorting function to use with sort() that sorts by how many times the tag has been applied to an annotation.\n * @param direction\n * @param elementItem\n * @returns {number}\n */\nfunction sortTagsByMostUsedSortingFunction(direction, elementItem) {\n  return generalSortingFunction('usage', direction, elementItem);\n}\n\n/**\n * Create an object of tag attributes from a tag Dom element\n * Add sensible default values for text, color, and usage, if missing.\n *\n * @param tag\n * @returns {{lastUpdated, color, usage, text}}\n */\nfunction transformTagElementData(tag) {\n  var _tag$dataset2 = tag.dataset,\n    _tag$dataset2$tagColo = _tag$dataset2.tagColor,\n    color = _tag$dataset2$tagColo === void 0 ? 'gray' : _tag$dataset2$tagColo,\n    lastUpdated = _tag$dataset2.tagLastUpdated,\n    _tag$dataset2$tagText = _tag$dataset2.tagText,\n    text = _tag$dataset2$tagText === void 0 ? '' : _tag$dataset2$tagText,\n    _tag$dataset2$tagUsag = _tag$dataset2.tagUsage,\n    usage = _tag$dataset2$tagUsag === void 0 ? 0 : _tag$dataset2$tagUsag;\n  return {\n    color: color,\n    lastUpdated: lastUpdated,\n    text: text,\n    usage: usage\n  };\n}\n\n/**\n * Function for sort() method when sorting words (tags).\n *\n * @param {string} type (one of: 'alpha', 'usage', 'time'(one of: 'alpha', 'usage', 'time')\n * @param {string} direction\n * @param elementItem\n * @returns {number}\n */\nfunction generalSortingFunction(type, direction) {\n  var elementItem = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'array';\n  var first, second, ascending, descending;\n  return function (a, b) {\n    var firstItem = a;\n    var secondItem = b;\n    // for all sort options except alpha, do a secondary alpha sort\n    var secondaryLevelSort = true;\n    if (elementItem === 'element') {\n      firstItem = transformTagElementData(a);\n      secondItem = transformTagElementData(b);\n    }\n    firstItem = ensureSensibleValues(firstItem);\n    secondItem = ensureSensibleValues(secondItem);\n    if (type === 'color') {\n      first = firstItem.color;\n      second = secondItem.color;\n    } else if (type === 'usage') {\n      first = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4___default()(firstItem.usage);\n      second = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4___default()(secondItem.usage);\n    } else if (type === 'time') {\n      first = Date.parse(firstItem.lastUpdated);\n      second = Date.parse(secondItem.lastUpdated);\n    } else {\n      // default is alpha sort\n      secondaryLevelSort = false;\n      first = firstItem.text.toLowerCase();\n      second = secondItem.text.toLowerCase();\n    }\n    if (direction === 'asc') {\n      ascending = first < second;\n      descending = first > second;\n    } else if (direction === 'desc') {\n      ascending = first > second;\n      descending = first < second;\n    }
89 else {\n      // for an invalid sort value, don't change anything.\n      return 0;\n    }\n    // first value comes first\n    if (ascending) {\n      return -1;\n    }\n\n    // second value comes first\n    if (descending) {\n      return 1;\n    }\n\n    // if the values are the same, do the secondary alpha sort\n    if (secondaryLevelSort) {\n      return String(firstItem.text).localeCompare(String(secondItem.text));\n    }\n    return 0;\n  };\n}\n\n/**\n * Helper: check if parent is visible\n */\nfunction isParentVisible(element) {\n  return !element.classList.contains('hide') && !element.hasAttribute('disabled');\n}\n\n/**\n * ensure sensible defaults to avoid errors\n */\nfunction ensureSensibleValues(tagData) {\n  if (!tagData) {\n    return {\n      color: 'gray',\n      lastUpdated: '',\n      text: '',\n      usage: '0'\n    };\n  }\n  var color = tagData.color;\n  var lastUpdated = tagData.lastUpdated;\n  var text = tagData.text;\n  var usage = tagData.usage;\n  color = color !== null && color !== void 0 ? color : 'gray';\n  text = (text !== null && text !== void 0 ? text : '').toLowerCase();\n  usage = usage !== null && usage !== void 0 ? usage : '0';\n  return {\n    color: color,\n    lastUpdated: lastUpdated,\n    text: text,\n    usage: usage\n  };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWNjb3VudC90YWdzL2Z1bmN0aW9ucy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBMkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUFBO0FBM0JBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQWdDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQUE7QUFoQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
89BRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBOEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUFBO0FBOUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBRkE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFNQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQU5BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQVFBO0FBQUE7QUFBQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBTkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFRQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUFBO0FBTkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFTQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0F
89BRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy9hY2NvdW50L3RhZ3MvZnVuY3Rpb25zLmpzPzQxOGMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEZldGNoSGVscGVycyBmcm9tIFwiLi4vLi4vZmV0Y2gtaGVscGVyc1wiO1xuaW1wb3J0IHtBc3luY05vdGljZX0gZnJvbSBcIi4uLy4uL25vdGljZXMvbm90aWNlXCI7XG5pbXBvcnQge2NhcGl0YWxpemUsIGluc2VydE92ZXJsYXlPbkVsZW1lbnQsIHJlbW92ZU92ZXJsYXlPbkVsZW1lbnR9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvZ2VuZXJhbFwiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvaTE4blwiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9kZWJ1Z1wiO1xuY29uc3QgeyBsb2cgfSA9IGNyZWF0ZUxvZ2dlcigndGFnLWZ1bmN0aW9ucycpO1xuXG4vLyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYSB0YWcgaXMgYWxsb3dlZCB0byBoYXZlXG5leHBvcnQgY29uc3QgSU5QVVRfVEVYVF9MSU1JVCA9IDUwO1xuXG4vKipcbiAqIFNvcnQgdGhlIHVzZXIgdGFnIGVsZW1lbnRzLlxuICpcbiAqIEBwYXJhbSBldmVudFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzb3J0SGFuZGxlcihldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCB7IGRhdGFzZXQ6IHsgc29ydEJ5LCBzb3J0RGlyZWN0aW9uIH0gfSA9IGV2ZW50LnRhcmdldDtcbiAgICBjb25zdCB0b2dnbGVyID0geydhc2MnOiAnZGVzYycsICdkZXNjJzogJ2FzYyd9O1xuXG4gICAgbGV0IGRpcmVjdGlvbiA9IHNvcnREaXJlY3Rpb247XG5cbiAgICAvLyBpZiB0aGUgc2VsZWN0ZWQgc29ydCBvcHRpb24gYWxyZWFkeSBoYXMgYSBjbGFzcyBzZXQsIHdlIG5lZWQgdG8gdG9nZ2xlIHRoZSBkaXJlY3Rpb25cbiAgICBpZihldmVudC50YXJnZXQuY2xvc2VzdCgnbGknKS5jbGFzc0xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICBkaXJlY3Rpb24gPSB0b2dnbGVyW3NvcnREaXJlY3Rpb25dO1xuICAgIH1cblxuICAgIC8vIHNvcnQgdGhlIHRhZ3NcbiAgICBjb25zdCBleGlzdGluZ1RhZ3NEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhpc3RpbmctdGFncycpO1xuICAgIGlmKGV4aXN0aW5nVGFnc0Rpdikge1xuICAgICAgICBbLi4uZXhpc3RpbmdUYWdzRGl2LmNoaWxkcmVuXVxuICAgICAgICAgICAgLnNvcnQodGFnc1NvcnRpbmdGdW5jdGlvbihzb3J0QnksIGRpcmVjdGlvbiwgJ2VsZW1lbnQnKSlcbiAgICAgICAgICAgIC5mb3JFYWNoKG5vZGUgPT4gZXhpc3RpbmdUYWdzRGl2LmFwcGVuZENoaWxkKG5vZGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3Qgc29ydCB0YWdzLicpO1xuICAgIH1cblxuICAgIGV2ZW50LnRhcmdldC5kYXRhc2V0LnNvcnREaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgcmV0dXJuIGRpcmVjdGlvbjtcbn1cblxuLyoqXG4gKiBDbG9zZSBhbmQgcmVzZXQgdGhlIHNhdmUgbW9kYWxcbiAqXG4gKiBAcGFyYW0gc2F2ZVRhZ01vZGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldEFuZENsb3NlU2F2ZU1vZGFsKHNhdmVUYWdNb2RhbCkge1xuICAgIC8vIHJlbW92ZSBkaXNwbGF5ZWQgdGFnIGNvcHksIGlmIHByZXNlbnRcbiAgICBjb25zdCBjb3B5VGFnV3JhcHBlciA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCcjY29weS10YWctd3JhcHBlcicpO1xuICAgIGlmKGNvcHlUYWdXcmFwcGVyKSB7XG4gICAgICAgIGNvcHlUYWdXcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICAgICAgY29weVRhZ1dyYXBwZXIuY2hpbGROb2Rlcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIGlmKHNhdmVUYWdNb2RhbCkge1xuICAgICAgICAvLyByZW1vdmUgaWdub3JlIGF0dHJpYnV0ZVxuICAgICAgICBzYXZlVGFnTW9kYWwucmVtb3ZlQXR0cmlidXRlKCdpZ25vcmVDbGljaycpO1xuXG4gICAgICAgIC8vIGVuc3VyZSBpbmZvIG1vZGFscyBhcmUgaGlkZGVuXG4gICAgICAgIGNvbnN0IG5ld1RhZ0luZm9Nb2RhbCA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCcjbmV3LXRhZy1pbmZvJyk7XG4gICAgICAgIGlmKG5ld1RhZ0luZm9Nb2RhbCkge1xuICAgICAgICAgICAgbmV3VGFnSW5mb01vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgI
89H1cblxuICAgICAgICBjb25zdCBtb2RpZnlUYWdJbmZvTW9kYWwgPSBzYXZlVGFnTW9kYWwucXVlcnlTZWxlY3RvcignI21vZGlmeS10YWctaW5mbycpO1xuICAgICAgICBpZihtb2RpZnlUYWdJbmZvTW9kYWwpIHtcbiAgICAgICAgICAgIG1vZGlmeVRhZ0luZm9Nb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGlkZSB0aGUgbW9kYWxcbiAgICAgICAgc2F2ZVRhZ01vZGFsLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcblxuICAgICAgICAvLyByZXNldCB0ZXh0IGlucHV0XG4gICAgICAgIGNvbnN0IHRleHRJbnB1dCA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwidGV4dFwiXScpO1xuICAgICAgICBpZiAodGV4dElucHV0KSB7XG4gICAgICAgICAgICB0ZXh0SW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlc2V0IG5ldyB0YWcgZGl2XG4gICAgICAgIGNvbnN0IG5ld1RhZ0RpdiA9IGZpbmROZXdUYWdFbGVtZW50KCk7XG4gICAgICAgIGlmKG5ld1RhZ0Rpdikge1xuICAgICAgICAgICAgLy8gcmVzZXQgY2xhc3Nlc1xuICAgICAgICAgICAgbmV3VGFnRGl2LmNsYXNzTGlzdC5yZW1vdmUoLi4ubmV3VGFnRGl2LmNsYXNzTGlzdCk7XG4gICAgICAgICAgICBuZXdUYWdEaXYuY2xhc3NMaXN0LmFkZCgndGFnJywgJ2RlZmF1bHQnKTtcblxuICAgICAgICAgICAgLy8gcmVzZXQgZGF0YSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBuZXdUYWdEaXYuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy1jb2xvcicsICdkZWZhdWx0Jyk7XG4gICAgICAgICAgICBuZXdUYWdEaXYuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy10ZXh0JywgJycpO1xuICAgICAgICAgICAgbmV3VGFnRGl2LnNldEF0dHJpYnV0ZSgnZGF0YS10YWctaWQnLCAnJyk7XG5cbiAgICAgICAgICAgIC8vIGNsZWFyIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRhZ1NwYW4gPSBuZXdUYWdEaXYucXVlcnlTZWxlY3RvcignLnRhZy10ZXh0Jyk7XG4gICAgICAgICAgICBpZih0YWdTcGFuKSB7XG4gICAgICAgICAgICAgICAgdGFnU3Bhbi50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjbGVhciB0YWcgY29weVxuICAgICAgICAgICAgY29uc3QgdGFnQ29weSA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YWctY29weV0nKTtcbiAgICAgICAgICAgIGlmKHRhZ0NvcHkpIHtcbiAgICAgICAgICAgICAgICB0YWdDb3B5LmNsYXNzTGlzdC5yZW1vdmUoLi4udGFnQ29weS5jbGFzc0xpc3QpO1xuICAgICAgICAgICAgICAgIHRhZ0NvcHkuY2xhc3NMaXN0LmFkZCgndGFnJywnY29weScpO1xuICAgICAgICAgICAgICAgIHRhZ0NvcHkudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlc2V0IGNvbG9yIHNlbGVjdG9yIHRvICdkZWZhdWx0J1xuICAgICAgICBjb25zdCBjb2xvcnNXcmFwcGVyID0gc2F2ZVRhZ01vZGFsLnF1ZXJ5U2VsZWN0b3IoJy50YWctY29sb3JzLXdyYXBwZXInKTtcbiAgICAgICAgaWYgKGNvbG9yc1dyYXBwZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRseVNlbGVjdGVkID0gY29sb3JzV3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRDb2xvciA9IGNvbG9yc1dyYXBwZXIucXVlcnlTZWxlY3RvcignW2RhdGEtdGFnLWNvbG9yPVwiZGVmYXVsdFwiXScpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRseVNlbGVjdGVkICYmIGN1cnJlbnRseVNlbGVjdGVkICE9PSBkZWZhdWx0Q29sb3IpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlTZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRDb2xvciAmJiAhZGVmYXVsdENvbG9yLmNsYXNzTGlzdC5jb250YWlucygnc2VsZWN0ZWQnKSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRDb2xvci5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZW5hYmxlQWRkTmV3QnV0dG9uKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFNldCB0aGUgdGV4dCBjb3VudCB0byByZWQgd2hlbiBpdCBleGNlZWRzIElOUFVUX1RFWFRfTElNSVQ7IFJlbW92ZSBjb2xvclxuICogaWYgaXQgaXMgd2l0aGluIHRoZSBsaW1pdC5cbiAqXG4gKiBAcGFyYW0gdGV4dFxuICogQHBhcmFtIHRleHRDb3VudFNwYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbmFnZVRleHRDb3VudEVsZW1lbnQodGV4dCwgdGV4dENvdW50U3Bhbikge1xuICAgIGlmKHRleHQubGVuZ3RoID09PSBJTlBVVF9URVhUX0xJTUlUKSB7XG4gICAgICAgIHRleHRDb3VudFNwYW4udGV4dENvbnRlbnQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgaWYgKCF0ZXh0Q291bnRTcGFuLmNsYXNzTGlzdC5jb250YWlucygncmVkJykpIHtcbiAgICAgICAgICAgIHRleHRDb3VudFNwYW4uY2xhc3NMaXN0LmFkZCgncmVkJyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0Q291bnRTcGFuLnRleHRDb250ZW50ID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIHRleHRDb3VudFNwYW4uY2xhc3NMaXN0LnJlbW92ZSgncmVkJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEV2ZW50IGhhbmRsZXIgLSB0ZXh0IGlucHV0IGtleXVwXG4gKlxuICogQHBhcmFtIGV2ZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVNb2RhbElucHV0VGV4dEhhbmRsZXIoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3Qgc2F2ZVRhZ01vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NhdmUtdGFnLW1vZGFsJyk7XG4gICAgY29uc3QgeyB0YXJnZXQ6IHsgdmFsdWU6IHRleHQgfSB9ID0gZXZlbnQ7XG4gICAgY29uc3QgbmV3VGFnRGl2ID0gZmluZE5ld1RhZ0VsZW1lbnQoKTtcbiAgICBjb25zdCB0ZXh0Q291bnRTcGFuID0gc2F2ZVRhZ01vZGFsLnF1
89ZXJ5U2VsZWN0b3IoJy50ZXh0LWNvdW50IHNwYW4nKTtcbiAgICBjb25zdCBub3RpY2VEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1ub3RpY2VdJyk7XG4gICAgY29uc3Qgbm90aWNlRWxlbWVudCA9IG5vdGljZURpdj8ucXVlcnlTZWxlY3RvcignLnRtLW5vdGljZScpO1xuXG4gICAgLy8gbWFuYWdlIGlucHV0IGxlbmd0aCBjb250cm9sXG4gICAgaWYodGV4dC5sZW5ndGggPiBJTlBVVF9URVhUX0xJTUlUKSB7XG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IHRleHQuc2xpY2UoMCwgSU5QVVRfVEVYVF9MSU1JVCk7XG4gICAgfSAgZWxzZSB7XG4gICAgICAgIG1hbmFnZVRleHRDb3VudEVsZW1lbnQodGV4dCwgdGV4dENvdW50U3Bhbik7XG5cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgYXdhaXQgc2F2ZUJ1dHRvbkhhbmRsZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc2FibGVTYXZlQnV0dG9uKCk7XG4gICAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAobm90aWNlRGl2KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGljZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0KCdub19jaGFuZ2VzX21hZGUnKSB8fCAnTm8gY2hhbmdlcyBtYWRlJztcbiAgICAgICAgICAgICAgICAgICAgbm90aWNlRGl2LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1hbmFnZU1vZGFsRWxlbWVudHNPbklucHV0Q2hhbmdlKG5ld1RhZ0RpdiwgdGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogU2V0IHRoZSBzYXZlIG1vZGFsIHRpdGxlLlxuICogQHBhcmFtIHRpdGxlXG4gKi9cbmZ1bmN0aW9uIHNldE1vZGFsVGl0bGUodGl0bGUpIHtcbiAgICBjb25zdCBtb2RhbFRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtbW9kYWwtdGl0bGVdIHNwYW4nKTtcblxuICAgIGlmKG1vZGFsVGl0bGUpIHtcbiAgICAgICAgbW9kYWxUaXRsZS50ZXh0Q29udGVudCA9IHRpdGxlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNYW5hZ2Ugd2hpY2ggaW5mbyBtb2RhbCB3ZSBkaXNwbGF5IHdoZW4gY2xpY2tpbmcgb24gdGhlIGluZm8gaWNvbiBieSB0aGUgc2F2ZSBtb2RhbCB0aXRsZVxuICogQHBhcmFtIGFjdGlvblxuICovXG5mdW5jdGlvbiBzaG93VGl0bGVUb29sVGlwKGFjdGlvbikge1xuICAgIGNvbnN0IGluZm9fbGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vZGFsLXRpdGxlXSBhJyk7XG5cbiAgICBpZiAoYWN0aW9uID09PSAnY3JlYXRlJykge1xuICAgICAgICBpbmZvX2xpbmsucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzaG93TW9kaWZ5SW5mb01vZGFsKTtcbiAgICAgICAgaW5mb19saW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2hvd0NyZWF0ZUluZm9Nb2RhbCk7XG4gICAgfVxuXG4gICAgLy8gc2hvdyAnbW9kaWZ5JyBpbmZvIG1vZGFsXG4gICAgaWYgKGFjdGlvbiA9PT0gJ21vZGlmeScpIHtcbiAgICAgICAgaW5mb19saW5rLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc2hvd0NyZWF0ZUluZm9Nb2RhbCk7XG4gICAgICAgIGluZm9fbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dNb2RpZnlJbmZvTW9kYWwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFdmVudCBoYW5kbGVyIGZvciBzaG93aW5nIHRoZSBcImNyZWF0ZVwiIGluZm8gbW9kYWwgaW4gdGhlIHNhdmUgbW9kYWxcbiAqIEBwYXJhbSBldmVudFxuICovXG5mdW5jdGlvbiBzaG93Q3JlYXRlSW5mb01vZGFsKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IGNyZWF0ZV9pbmZvX21vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY3JlYXRlLWluZm8tbW9kYWxdJyk7XG4gICAgY29uc3QgbW9kaWZ5X2luZm9fbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1tb2RpZnktaW5mby1tb2RhbF0nKTtcblxuICAgIGlmKGNyZWF0ZV9pbmZvX21vZGFsICYmIG1vZGlmeV9pbmZvX21vZGFsKSB7XG4gICAgICAgIGNyZWF0ZV9pbmZvX21vZGFsLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcbiAgICAgICAgbW9kaWZ5X2luZm9fbW9kYWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG59XG5cbi8qKlxuICogRXZlbnQgaGFuZGxlciBmb3Igc2hvd2luZyB0aGUgXCJtb2RpZnlcIiBpbmZvIG1vZGFsIGluIHRoZSBzYXZlIG1vZGFsXG4gKlxuICogQHBhcmFtIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHNob3dNb2RpZnlJbmZvTW9kYWwoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgY3JlYXRlX2luZm9fbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jcmVhdGUtaW5mby1tb2RhbF0nKTtcbiAgICBjb25zdCBtb2RpZnlfaW5mb19tb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1vZGlmeS1pbmZvLW1vZGFsXScpO1xuXG4gICAgaWYoY3JlYXRlX2luZm9fbW9kYWwgJiYgbW9kaWZ5X2luZm9fbW9kYWwpIHtcbiAgICAgICAgY3JlYXRlX2luZm9fbW9kYWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgbW9kaWZ5X2luZm9fbW9kYWwuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUb2dnbGVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzYXZlIHRhZyBtb2RhbCBhbmQgdGhlICdBZGQgTmV3JyBidXR0b24gd2hlbiBhcHByb3ByaWF0ZS5cbiAqXG4gKiBAcGFyYW0gc2F2ZVRhZ01vZGFsXG4gKiBAcGFyYW0gdHJpZ2dlckVsZW1lbnQgKEVpdGhlciB0aGUgJ0FkZCBuZXcnIGJ1dHRvbiBvciBhbiBleGlzdGluZyB0YWcsIHRoYXQgaGFzIGJlZW4gY2xpY2tlZCBvbilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbmFnZVNhdmVNb2RhbFZpc2liaWxpdHkoc2F2ZVRhZ01vZGFsLCB0cmlnZ2VyRWxlbWVudCkge1xuICAgIGlmKHNhdmVUYWdNb2RhbCkge1xuICAgICAgICBpZihzYXZlVGFnTW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRlJykpIHtcbiAgICAgICAgICAgIC8vIGRldGVybWluZSBpZiB0cmlnZ2VyRWxlbWVudCBzaG91bGQgYmUgZGlzYWJsZWRcblxuICAgICAgICAgICAgaWYodHJpZ2dlckVsZW1lbnQuaWQgPT09ICduZXctdGFnLWJ1dHRvbicpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgI
89HRyaWdnZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc2hvdyBuZXcgdGFnIG1vZGFsXG4gICAgICAgICAgICBzYXZlVGFnTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuXG4gICAgICAgICAgICAvLyBzZXQgZm9jdXNcbiAgICAgICAgICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCNzYXZlLXRhZycpO1xuICAgICAgICAgICAgaWYoaW5wdXRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogRW5hYmxlIHRoZSAnQWRkIE5ldycgdGFnIGJ1dHRvbi5cbiAqL1xuZnVuY3Rpb24gZW5hYmxlQWRkTmV3QnV0dG9uKCkge1xuICAgIGNvbnN0IG5ld1RhZ0J1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNuZXctdGFnLWJ1dHRvbicpO1xuXG4gICAgaWYobmV3VGFnQnV0dG9uKSB7XG4gICAgICAgIG5ld1RhZ0J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcpO1xuICAgICAgICBuZXdUYWdCdXR0b24ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlIHRoZSAnQWRkIE5ldycgdGFnIGJ1dHRvbi5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlQWRkTmV3QnV0dG9uKCkge1xuICAgIGNvbnN0IG5ld1RhZ0J1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNuZXctdGFnLWJ1dHRvbicpO1xuXG4gICAgaWYobmV3VGFnQnV0dG9uKSB7XG4gICAgICAgIG5ld1RhZ0J1dHRvbi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgICAgICBuZXdUYWdCdXR0b24uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlIHRoZSAnU2F2ZScgYnV0dG9uIGluIHRoZSBTYXZlIG1vZGFsLlxuICovXG5mdW5jdGlvbiBkaXNhYmxlU2F2ZUJ1dHRvbigpIHtcbiAgICBjb25zdCBzYXZlQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NhdmUtYnV0dG9uJyk7XG4gICAgaWYgKHNhdmVCdXR0b24pIHtcbiAgICAgICAgc2F2ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgICAgICBzYXZlQnV0dG9uLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICB9XG59XG5cbi8qKlxuICogIEVuYWJsZSB0aGUgJ1NhdmUnIGJ1dHRvbiBpbiB0aGUgU2F2ZSBtb2RhbC5cbiAqXG4gKi9cbmZ1bmN0aW9uIGVuYWJsZVNhdmVCdXR0b24oKSB7XG4gICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzYXZlLWJ1dHRvbicpO1xuICAgIGlmIChzYXZlQnV0dG9uKSB7XG4gICAgICAgIHNhdmVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgc2F2ZUJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIERpc2FibGUgdGhlICdEZWxldGUnIGJ1dHRvblxuICovXG5mdW5jdGlvbiBkaXNhYmxlRGVsZXRlQnV0dG9uKCkge1xuICAgIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWxldGUtYnV0dG9uJyk7XG4gICAgaWYoZGVsZXRlQnV0dG9uKSB7XG4gICAgICAgIGRlbGV0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgICAgICBkZWxldGVCdXR0b24uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFbmFibGUgdGhlICdEZWxldGUnIGJ1dHRvbiBvbiB0aGUgc2F2ZSBtb2RhbC5cbiAqL1xuZnVuY3Rpb24gZW5hYmxlRGVsZXRlQnV0dG9uKCkge1xuICAgIGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWxldGUtYnV0dG9uJyk7XG4gICAgaWYoZGVsZXRlQnV0dG9uKSB7XG4gICAgICAgIGRlbGV0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdkaXNhYmxlZCcsICdoaWRlJyk7XG4gICAgICAgIGRlbGV0ZUJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhpZGUgdGhlIGRlbGV0ZSBidXR0b24gaW4gdGhlIHNhdmUgbW9kYWwuXG4gKi9cbmZ1bmN0aW9uIGhpZGVEZWxldGVCdXR0b24oKSB7XG4gICAgY29uc3QgZGVsZXRlQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlbGV0ZS1idXR0b24nKTtcbiAgICBpZihkZWxldGVCdXR0b24pIHtcbiAgICAgICAgZGVsZXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgc2F2ZSBtb2RhbCBmb3IgdGFnIGNyZWF0aW9uOlxuICogLSBTZXRzIHRoZSBtb2RhbCB0aXRsZVxuICogLSBTZXRzIHRoZSBtb2RhbCBhY3Rpb24gcHJvcGVydHkgdG8gJ2NyZWF0ZSdcbiAqIC0gRW5zdXJlcyBkZWZhdWx0IGNvbG9yIHNlbGVjdGVkIGFuZCBlbXB0eSBpbnB1dCB0ZXh0IGZpZWxkLlxuICogLSBzZXQgaGFuZGxlciBmb3Igc2F2ZSBidXR0b25cbiAqXG4gKiBAcGFyYW0gc2F2ZVRhZ01vZGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwU2F2ZU1vZGFsRm9yVGFnQ3JlYXRpb24oc2F2ZVRhZ01vZGFsKSB7XG4gICAgY29uc3QgdGV4dENvdW50U3BhbiA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCcudGV4dC1jb3VudCBzcGFuJyk7XG4gICAgdGV4dENvdW50U3Bhbi50ZXh0Q29udGVudCA9ICcwJztcblxuICAgIHNhdmVUYWdNb2RhbC5kYXRhc2V0LmFjdGlvbiA9ICdjcmVhdGUnO1xuICAgIHNldE1vZGFsVGl0bGUodCgnYWRkX25ld190YWcnKSB8fCAnQWRkIE5ldyBUYWcnKTtcbiAgICBzaG93VGl0bGVUb29sVGlwKCdjcmVhdGUnKTtcblxuICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYW5ub3RhdGlvbnMtZm9ybScpO1xuICAgIGlmKGZvcm0pIHtcbiAgICAgICAgZm9ybS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBjbGVhclNhdmVNb2RhbChzYXZlVGFnTW9kYWwpO1xuICAgIGRpc2FibGVBZGROZXdCdXR0b24oKTtcbiAgICBoaWRlRGVsZXRlQnV0dG9uKCk7XG59XG5cbi8qKlxuICogQ2xlYXIgZWxlbWVudHMgb24gdGhlIHNhdmUgbW9kYWwuXG4gbm9uZSpcbiAqIEBwYXJhbSBzYXZlVGFnTW9kYWxcbiAqL1xuZnVuY3Rpb24gY2xlYXJTYXZlTW9kYWwoc2F2ZVRhZ01vZGFsKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSB0YWcgY29weVxuICAgIGNvbnN0IHRhZ0NvcHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YWctY29weV0nKTtcbiAgICBpZih0YWdDb3B5KSB7XG4gICAgICAgI
89HRhZ0NvcHkucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHRhZyBjb3B5IHRvb2x0aXBcbiAgICAvLyBjb25zdCB0YWdDb3B5VG9vbHRpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0YWctY29weS10b29sdGlwJyk7XG4gICAgLy8gaWYodGFnQ29weVRvb2x0aXApIHtcbiAgICAvLyAgIHRhZ0NvcHlUb29sdGlwLnJlbW92ZSgpO1xuICAgIC8vIH1cblxuICAgIC8vIGNsZWFyIHRoZSB0ZXh0IGZpZWxkXG4gICAgY29uc3QgaW5wdXRFbGVtZW50ID0gc2F2ZVRhZ01vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0I3NhdmUtdGFnJyk7XG4gICAgaW5wdXRFbGVtZW50LnZhbHVlID0gJyc7XG5cbiAgICAvLyBjbGVhciBuZXcgdGFnIGRpdlxuICAgIGNvbnN0IG5ld1RhZ0RpdiA9IGZpbmROZXdUYWdFbGVtZW50KCk7XG4gICAgaWYobmV3VGFnRGl2KSB7XG4gICAgICAgIG5ld1RhZ0Rpdi5jbGFzc0xpc3QucmVtb3ZlKC4uLm5ld1RhZ0Rpdi5jbGFzc0xpc3QpO1xuICAgICAgICBuZXdUYWdEaXYuY2xhc3NMaXN0LmFkZCgndGFnJywgJ2RlZmF1bHQnLCAnaGlkZScpO1xuICAgIH1cblxuICAgIC8vIGNsZWFyIG5vdGljZSB0ZXh0XG4gICAgY29uc3Qgbm90aWNlRGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtbm90aWNlXScpO1xuICAgIGNvbnN0IG5vdGljZVNwYW4gPSBub3RpY2VEaXYucXVlcnlTZWxlY3RvcignLnRtLW5vdGljZScpO1xuICAgIGlmKG5vdGljZVNwYW4pIHtcbiAgICAgICAgbm90aWNlU3Bhbi50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Fubm90YXRpb25zLWNvdW50JylcbiAgICBpZihjb3VudCkge1xuICAgICAgICBjb3VudC50ZXh0Q29udGVudCA9ICcwJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdGFnIGNvcHkgZm9ybVxuICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYW5ub3RhdGlvbnMtZm9ybScpO1xuICAgIGlmKGZvcm0pIHtcbiAgICAgICAgZm9ybS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBzZXRDb2xvclNlbGVjdG9yKCdkZWZhdWx0Jyk7XG4gICAgbWFuYWdlTW9kYWxFbGVtZW50c09uSW5wdXRDaGFuZ2UobmV3VGFnRGl2LCAnJyk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgc2F2ZSBtb2RhbCB0byBlZGl0IGEgdGFnLlxuICogLSBTZXRzIHRoZSBtb2RhbCB0aXRsZVxuICogLSByZW5kZXJzIHRoZSB0YWcgdG8gYmUgdXBkYXRlZFxuICogLSBFbmFibGUgdGhlIERlbGV0ZSBidXR0b25cbiAqIC0gU2V0IHRoZSBpbnB1dCB0ZXh0IHZhbHVlIGFuZCB0aGUgY29sb3JzIHNlbGVjdG9yICdzZWxlY3RlZCcgY29sb3IgdG8gdGhlIHRleHQgYW5kIGNvbG9yXG4gKiAgIG9mIHRoZSB0YWcgd2UgYXJlIGdvaW5nIHRvIGVkaXQuXG4gKlxuICogQHBhcmFtIHNhdmVUYWdNb2RhbFxuICogQHBhcmFtIHRhZ1RvVXBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwU2F2ZU1vZGFsRm9yVGFnRWRpdGluZyhzYXZlVGFnTW9kYWwsIHRhZ1RvVXBkYXRlKSB7XG4gICAgY2xlYXJTYXZlTW9kYWwoc2F2ZVRhZ01vZGFsKTtcblxuICAgIGNvbnN0IHRleHRDb3VudFNwYW4gPSBzYXZlVGFnTW9kYWwucXVlcnlTZWxlY3RvcignLnRleHQtY291bnQgc3BhbicpO1xuICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCNzYXZlLXRhZycpO1xuICAgIGNvbnN0IG5ld1RhZ0RpdiA9IGZpbmROZXdUYWdFbGVtZW50KCk7XG5cbiAgICBzYXZlVGFnTW9kYWwuZGF0YXNldC5hY3Rpb24gPSAndXBkYXRlJztcbiAgICBzZXRNb2RhbFRpdGxlKHQoJ21vZGlmeV90YWcnKSB8fCAnTW9kaWZ5IFRhZycpO1xuICAgIHNob3dUaXRsZVRvb2xUaXAoJ21vZGlmeScpO1xuXG4gICAgLyogZGlzcGxheSB0YWcgYmVpbmcgdXBkYXRlZCAqL1xuICAgIGNvbnN0IHRhZ0NvcHkgPSBjcmVhdGVDb3B5T2ZFeGlzdGluZ1RhZyhleHRyYWN0VGFnUHJvcGVydGllcyh0YWdUb1VwZGF0ZSksIHRydWUsIHRydWUpO1xuICAgIGNvbnN0IHtkYXRhc2V0OiB7dGFnQ29sb3I6IGNvbG9yLCB0YWdJZDogaWQsIHRhZ1RleHQ6IHRleHQsIHRhZ1VzYWdlOiB1c2FnZX19ID0gdGFnQ29weTtcbiAgICBjb25zdCBjb3B5VGFnV3JhcHBlciA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCcjY29weS10YWctd3JhcHBlcicpO1xuICAgIGlmIChjb3B5VGFnV3JhcHBlcikge1xuICAgICAgICBjb3B5VGFnV3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgICAgIGNvcHlUYWdXcmFwcGVyLmFwcGVuZENoaWxkKHRhZ0NvcHkpO1xuICAgIH1cblxuICAgIGlmIChwYXJzZUludCh1c2FnZSkgPiAwKSB7XG4gICAgICAgIC8vIG1ha2UgaW5mbyBpY29uIHZpc2libGVcbiAgICB9XG5cbiAgICAvLyBzZXQgdGV4dCBpbnB1dFxuICAgIGlmIChpbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgaW5wdXRFbGVtZW50LnZhbHVlID0gdGV4dDtcbiAgICAgICAgdGV4dENvdW50U3Bhbi50ZXh0Q29udGVudCA9IHRleHQubGVuZ3RoO1xuXG4gICAgICAgIC8vIGhhbmRsZSBjb3VudGVyIGNvbG9yXG4gICAgICAgIHRleHRDb3VudFNwYW4uY2xhc3NMaXN0LnJlbW92ZSgncmVkJyk7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA+PSBJTlBVVF9URVhUX0xJTUlUKSB7XG4gICAgICAgICAgICB0ZXh0Q291bnRTcGFuLmNsYXNzTGlzdC5hZGQoJ3JlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IGN1cnJlbnQgY29sb3Igb24gY29sb3Igc2VsZWN0b3JcbiAgICBzZXRDb2xvclNlbGVjdG9yKGNvbG9yKTtcblxuICAgIGlmIChuZXdUYWdEaXYpIHtcbiAgICAgICAgLy8gc2V0IGNvbG9yIGNsYXNzXG4gICAgICAgIG5ld1RhZ0Rpdi5jbGFzc0xpc3QucmVtb3ZlKCdkZWZhdWx0Jyk7XG4gICAgICAgIG5ld1RhZ0Rpdi5jbGFzc0xpc3QuYWRkKGNvbG9yKVxuXG4gICAgICAgIC8vIHNldCBuZXcgdGFnIGRpdiBwcm9wZXJ0aWVzXG4gICAgICAgIG5ld1RhZ0Rpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWNvbG9yJywgY29sb3IpO1xuICAgICAgICBuZXdUYWdEaXYuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy1pZCcsIGlkKTtcbiAgICAgICAgbmV3VGFnRGl2LnNldEF0dHJpYnV0ZSgnZGF0YS10YWctdGV4dCcsIHRleHQpO1xuXG4gICAgICAgIC8vIGRpc3BsYXkgdGV4dFxuICAgICAgICBjb25zdCB0YWdTcGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5ldy10YWcgLnRhZy10ZXh0Jyk7XG4gICAgICAgIGlmICh0YWdTcGFuKSB7XG4gICAgICAgICAgICB0YWdTcGFuLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRpc3BsYXkgZGl2XG4gICAgICAgIG5ld1RhZ0Rpdi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgfVxuXG4gICAgZGlzYWJsZUFkZE5ld0J1dHRvbigpO1xuICAgIGRpc2FibGVTYXZlQnV0dG9uKCk7XG4gICAgZW5hYmxlRGVsZXRlQnV0dG9uKCk7XG59XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgY2xpY2sgb24gdGhlIHNhdmUgbW9kYWwgJ1NhdmUnIGJ1dHRvbi5cbiAqIEZpZ3VyZXMgb3V0IGlmIHdlIGFyZSBjcmVhdGluZyBhIG5ldyB0YWcgb3IgdXBkYXRpbmcgYW4gZXhpc3RpbmcgdGFnIGFuZCBoYW5kcyBvZmYgY29udHJvbCB0byB0aGUgYXBwcm9wcmlhdGVcbiAqIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgYWN0aW9uLlxuICpcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVCdXR0b25IYW5kbGVyKCkge1xuICAgIGNvbnN0IHNhdmVCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2F2ZS1idXR0b24nKTtcbiAgICBjb25zdCBzYXZlVGFnTW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2F2ZS10YWctbW9kYWwnKTtcbiAgICBjb25zdCBub3RpY2VEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1ub3RpY2VdJyk7XG4gICAgY29uc3Qgbm90aWNlRWxlbWVudCA9IG5vdGljZURpdj8ucXVlcnlTZWxlY3RvcignLnRtLW5vdGljZScpO1xuICAgIGNvbnN0IGlucHV0VGV4dEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2F2ZS10YWcnKTtcblxuICAgIC8vIEdldCB0aGUgYWN0aW9uIGZpcnN0IHRvIGRldGVybWluZSBjb21wYXJpc29uIHN0cmF0ZWd5XG4gICAgY29uc3QgYWN0aW9uID0gc2F2ZVRhZ01vZGFsPy5kYXRhc2V0Py5hY3Rpb247XG5cbiAgICAvLyBHZXQgb3JpZ2luYWwgcHJvcGVydGllcyBmb3IgY29tcGFyaXNvblxuICAgIC8vIEluIHVwZGF0ZSBtb2RlLCB1c2UgdGFnQ29weSAod2hpY2ggc3RvcmVzIG9yaWdpbmFsIHZhbHVlcyBiZWZvcmUgZWRpdGluZylcbiAgICAvLyBJbiBjcmVhdGUgbW9kZSwgY2hlY2sgaWYgYSB0YWcgd2l0aCB0aGlzIHRleHQgYWxyZWFkeSBleGlzdHNcbiAgICBsZXQgb3JpZ2luYWxQcm9wcztcbiAgICBpZiAoYWN0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgICBjb25zdCB0YWdDb3B5ID0gc2F2ZVRhZ01vZGFsLnF1
89ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRhZy1jb3B5XScpO1xuICAgICAgICBvcmlnaW5hbFByb3BzID0gZXh0cmFjdFRhZ1Byb3BlcnRpZXModGFnQ29weSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdUYWcgPSBmaW5kVGFnT25QYWdlQnlUZXh0KGlucHV0VGV4dEVsZW1lbnQudmFsdWUpO1xuICAgICAgICBvcmlnaW5hbFByb3BzID0gZXh0cmFjdFRhZ1Byb3BlcnRpZXMoZXhpc3RpbmdUYWcpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1RhZ0RpdiA9IGZpbmROZXdUYWdFbGVtZW50KCk7XG4gICAgY29uc3QgbmV3UHJvcHMgPSBleHRyYWN0VGFnUHJvcGVydGllcyhuZXdUYWdEaXYpO1xuXG4gICAgaWYoaW5wdXRUZXh0RWxlbWVudC52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKG5vdGljZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIG5vdGljZURpdi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgICAgICAgICBub3RpY2VFbGVtZW50LnRleHRDb250ZW50ID0gdCgnZW50ZXJfdGFnX25hbWUnKSB8fCAnRW50ZXIgYSB0YWcgbmFtZSBiZWZvcmUgc3VibWl0dGluZyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3JpZ2luYWxQcm9wcy50ZXh0ID09PSBuZXdQcm9wcy50ZXh0ICYmIG9yaWdpbmFsUHJvcHMuY29sb3IgPT09IG5ld1Byb3BzLmNvbG9yKSB7XG4gICAgICAgIGlmIChub3RpY2VFbGVtZW50KSB7XG4gICAgICAgICAgICBub3RpY2VEaXYuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgICAgICAgbm90aWNlRWxlbWVudC50ZXh0Q29udGVudCA9IHQoJ25vX2NoYW5nZXNfbWFkZScpIHx8ICdObyBjaGFuZ2VzIG1hZGUnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChpbnB1dFRleHRFbGVtZW50LnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAobm90aWNlRWxlbWVudCkge1xuICAgICAgICAgICAgbm90aWNlRGl2LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcbiAgICAgICAgICAgIG5vdGljZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0KCdlbnRlcl90YWdfbmFtZScpIHx8ICdFbnRlciBhIHRhZyBuYW1lIGJlZm9yZSBzdWJtaXR0aW5nJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZihzYXZlVGFnTW9kYWwpIHtcbiAgICAgICAgbGV0IHsgZGF0YXNldDogeyBhY3Rpb24gfSB9ID0gc2F2ZVRhZ01vZGFsO1xuXG4gICAgICAgIC8vIGd1YXJkIGNsYXVzZVxuICAgICAgICBpZiAoIWFjdGlvbiB8fCAhWydjcmVhdGUnLCAndXBkYXRlJ10uaW5jbHVkZXMoYWN0aW9uKSkgeyBsb2coXCJEb24ndCBrbm93IGlmIHdlIGFyZSBjcmVhdGluZyBvciB1cGRhdGluZy4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld1RhZ0RpdiA9IGZpbmROZXdUYWdFbGVtZW50KCk7XG4gICAgICAgIGlmIChzYXZlQnV0dG9uICYmICFzYXZlQnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgLy8gU2hvdyBvdmVybGF5IHdpdGggc3Bpbm5lciBkdXJpbmcgc2F2ZSBvcGVyYXRpb25cbiAgICAgICAgICAgIGNvbnN0IG1vZGFsQ29udGVudCA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCcucmV2ZWFsLWNvbnRlbnQnKSB8fCBzYXZlVGFnTW9kYWw7XG4gICAgICAgICAgICBpbnNlcnRPdmVybGF5T25FbGVtZW50KG1vZGFsQ29udGVudCwgJ3NhdmUtdGFnLW92ZXJsYXknKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnY3JlYXRlJykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVUYWcobmV3VGFnRGl2KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGUgbmV3IHRhZyBkaXYgZW5jYXBzdWxhdGVzIHRoZSBjaGFuZ2VzIHRvIHRoZSB0YWcgd2UncmUgdXBkYXRpbmdcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlVGFnKG5ld1RhZ0Rpdik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZW1vdmVPdmVybGF5T25FbGVtZW50KCdzYXZlLXRhZy1vdmVybGF5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldEFuZENsb3NlU2F2ZU1vZGFsKHNhdmVUYWdNb2RhbCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgY29sb3Igc2VsZWN0b3IgZWxlbWVudCB0byBhIGdpdmVuIGNvbG9yLlxuICpcbiAqIEBwYXJhbSBjb2xvclxuICovXG5mdW5jdGlvbiBzZXRDb2xvclNlbGVjdG9yKGNvbG9yKSB7XG4gICAgY29uc3Qgc2F2ZVRhZ01vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NhdmUtdGFnLW1vZGFsJyk7XG4gICAgY29uc3QgY29sb3JzV3JhcHBlciA9IHNhdmVUYWdNb2RhbC5xdWVyeVNlbGVjdG9yKCcudGFnLWNvbG9ycy13cmFwcGVyJyk7XG5cbiAgICBpZiAoY29sb3JzV3JhcHBlcikge1xuICAgICAgICBjb25zdCBjdXJyZW50bHlTZWxlY3RlZCA9IGNvbG9yc1dyYXBwZXIucXVlcnlTZWxlY3RvcignLnNlbGVjdGVkJyk7XG4gICAgICAgIGNvbnN0IHRvU2VsZWN0ID0gY29sb3JzV3JhcHBlci5xdWVyeVNlbGVjdG9yKGBbZGF0YS10YWctY29sb3I9XCIke2NvbG9yfVwiXWApO1xuXG4gICAgICAgIC8vIGlmIHdlIGhhdmUgdGhlIHJpZ2h0IGNvbG9yIHNlbGVjdGVkXG4gICAgICAgIGlmIChjdXJyZW50bHlTZWxlY3RlZCA9PT0gdG9TZWxlY3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRseVNlbGVjdGVkLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICAgIHRvU2VsZWN0LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgdXNlciB0YWcgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgdGV4dC4gSWYgaWQgcHJvdmlkZWQsIHNlYXJjaCBieSBpZC5cbiAqXG4gKiBAcGFyYW0gdGFnVGV4dFxuICogQHBhcmFtIHRhZ0lkXG4gKiBAcmV0dXJucyB7KnxudWxsfVxuICovXG5mdW5jdGlvbiBmaW5kVGFnT25QYWdlKHRhZ1RleHQsIHRhZ0lkID0gbnVsbCkge1xuICAgIGNvbnN0IGV4aXN0aW5nVGFnc0NvbGxlY3Rpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhpc3RpbmctdGFncycpO1xuICAgIGNvbnN0IGFjdGlvbiA9IGV4aXN0aW5nVGFnc0NvbGxlY3Rpb24/LmRhdGFzZXQ/LmFjdGlvbjtcbiAgICBsZXQgc2VsZWN0b3IgPSBcIi5leGlzdGluZy10YWdzIC50YWc6bm90KFtkYXRhLXRhZy10eXBlPSdkZWxldGUnXSlcIjtcblxuICAgIC8vIGlmIHRoZXJlIGlzIGEgc3VnZ2VzdGVkIHRhZ3MgY29sbGVjdGlvbiBvbiB0aGUgcGFnZSwgYWRkIHRob3NlIHRhZ3NcbiAgICBjb25zdCBzdWdnZXN0ZWRUYWdzQ29sbGVjdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdWdnZXN0ZWQtdGFncycpO1xuICAgIGlmIChzdWdnZXN0ZWRUYWdzQ29sbGVjdGlvbikge1xuICAgICAgc2VsZWN0b3IgPSBgJHtzZWxlY3Rvcn0sIC5zdWdnZXN0ZWQtdGFncyAudGFnOm5vdChbZGF0YS10YWctdHlwZT0nZGVsZXRlJ10pYDtcbiAgICB9XG5cbiAgICAvLyBPbiBVcGRhdGUsIGluY2x1ZGUgdGhlIGNvcHktdGFnIGVsZW1lbnQgaW4gdGhlIGxpc3Qgb2YgdGFncyBiZWZvcmUgc2VhcmNoXG4gICAgaWYgKGV4aXN0aW5nVGFnc0NvbGxlY3Rpb24gJiYgYWN0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgICBzZWxlY3RvciA9IFwiLmV4aXN0aW5nLXRhZ3MgLnRhZywgW2RhdGEtdGFnLWNvcHldXCI7XG4gICAgfVxuXG4gICAgY29uc3QgdGFncyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgIGlmICh0YWdzKSB7XG4gICAgICAgIGNvbnN0IGFsbFRhZ3MgPSBBcnJheS5mcm9tKHRhZ3MpO1xuICAgICAgICBjb25zdCBleGlzdGluZ1RhZyA9IGFsbFRhZ3MuZmluZCgodGFnKSA9PiB7XG4gICAgICAgICAgICBsZXQge2RhdGFzZXQ6IHt0YWdJZDogaWQsIHRhZ1RleHQ6IHRleHR9fSA9IHRhZztcblxuICAgICAgICAgICAgLy8gc2VhcmNoIGJ5IGlkXG4gICAgICAgICAgICBpZiAodGFnSWQgJiYgaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnSWQgPT09IGlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZWFyY2ggYnkgdGFnIHRleHRcbiAgICAgICAgICAgI
89HJldHVybiB0YWdUZXh0ID09PSB0ZXh0OyAvLyAmJiBuZXdUYWdDb2xvciA9PT0gY29sb3I7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGV4aXN0aW5nVGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdUYWc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBGaW5kIGEgdGFnIG9uIHRoZSBwYWdlIGJ5IHRhZyB0ZXh0LlxuICpcbiAqIEBwYXJhbSB0ZXh0XG4gKiBAcmV0dXJucyB7KnxudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFRhZ09uUGFnZUJ5VGV4dCh0ZXh0KSB7XG4gICAgcmV0dXJuIGZpbmRUYWdPblBhZ2UodGV4dCk7XG59XG5cbi8qKlxuICpcbiAqIEZpbmQgdGFnIG9uIHBhZ2UgYnkgdGFnIGlkLlxuICogQHBhcmFtIGlkXG4gKiBAcmV0dXJucyB7KnxudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFRhZ09uUGFnZUJ5SWQoaWQpIHtcbiAgICByZXR1cm4gZmluZFRhZ09uUGFnZSgnJywgaWQpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgY29sb3Igb2YgdGhlIG9yaWdpbmFsIHRhZyBvbiB0aGUgcGFnZSAoYmVoaW5kIHRoZSBtb2RhbCkuXG4gKiBDYWxsZWQgd2hlbiB1c2VyIHNlbGVjdHMgYSBjb2xvciBpbiB0aGUgTW9kaWZ5IFRhZyBtb2RhbC5cbiAqXG4gKiBAcGFyYW0gdGFnSWQgLSBUaGUgSUQgb2YgdGhlIHRhZyBiZWluZyBtb2RpZmllZFxuICogQHBhcmFtIG5ld0NvbG9yIC0gVGhlIG5ldyBjb2xvciB0byBhcHBseVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlT3JpZ2luYWxUYWdDb2xvcih0YWdJZCwgbmV3Q29sb3IpIHtcbiAgICBpZiAoIXRhZ0lkKSByZXR1cm47XG5cbiAgICBjb25zdCBvcmlnaW5hbFRhZyA9IGZpbmRUYWdPblBhZ2VCeUlkKHRhZ0lkKTtcbiAgICBpZiAoIW9yaWdpbmFsVGFnKSByZXR1cm47XG5cbiAgICAvLyBDb2xvciBjbGFzc2VzIHRoYXQgY2FuIGJlIG9uIGEgdGFnXG4gICAgY29uc3QgY29sb3JDbGFzc2VzID0gWydkZWZhdWx0JywgJ3llbGxvdycsICdvcmFuZ2UnLCAnZ29sZCcsICdncmVlbicsICd0ZWFsJywgJ2JsdWUnLCAncHVycGxlJywgJ3BpbmsnLCAncmVkJywgJ2dyYXknXTtcblxuICAgIC8vIFJlbW92ZSBleGlzdGluZyBjb2xvciBjbGFzc2VzXG4gICAgY29sb3JDbGFzc2VzLmZvckVhY2goY29sb3IgPT4gb3JpZ2luYWxUYWcuY2xhc3NMaXN0LnJlbW92ZShjb2xvcikpO1xuXG4gICAgLy8gQWRkIHRoZSBuZXcgY29sb3IgY2xhc3NcbiAgICBvcmlnaW5hbFRhZy5jbGFzc0xpc3QuYWRkKG5ld0NvbG9yKTtcbiAgICBvcmlnaW5hbFRhZy5kYXRhc2V0LnRhZ0NvbG9yID0gbmV3Q29sb3I7XG59XG5cbi8qKlxuICogRmluZCB0aGUgZWxlbWVudCBmb3IgY3JlYXRpbmcgYSBuZXcgdGFnLlxuICpcbiAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTmV3VGFnRWxlbWVudCgpIHtcbiAgICBsZXQgZWxlbWVudDtcbiAgICBpZiggaXNUYWdNYW5hZ2VtZW50T25SZWFkZXIoKSkge1xuICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGFnW2RhdGEtdHlwZT1cIm5ld1wiXScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGFnW2RhdGEtc2F2ZS10YWddJyk7XG4gICAgfVxuXG4gICAgaWYoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBNYW5hZ2UgZWxlbWVudHMgaW4gU2F2ZSBtb2RhbCB3aGVuZXZlciB0aGUgdGV4dCBpbiB0aGUgaW5wdXQgdGV4dCBmaWVsZCBjaGFuZ2UuXG4gKiAtIFVwZGF0ZSB0aGUgbmV3IHRhZyBkaXYgd2l0aCB0ZXh0IGZyb20gdGV4dCBpbnB1dC5cbiAqIC0gSWYgdGhlIHRhZyBleGlzdHMgYWxyZWFkeSwgZGlzYWJsZSB0aGUgJ0FkZCcgYnV0dG9uIGFuZFxuICogLSBEaXNwbGF5IGEgbm90aWNlIHdoZW4gYXBwcm9wcmlhdGUuXG4gKlxuICogQHBhcmFtIG5ld1RhZ0RpdlxuICogQHBhcmFtIG5ld1RhZ1RleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hbmFnZU1vZGFsRWxlbWVudHNPbklucHV0Q2hhbmdlKG5ld1RhZ0RpdiwgbmV3VGFnVGV4dCkge1xuICAgIGNvbnN0IG5vdGljZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5vdGljZV0nKTtcbiAgICBjb25zdCBub3RpY2VFbGVtZW50ID0gbm90aWNlRGl2LnF1ZXJ5U2VsZWN0b3IoJy50bS1ub3RpY2UnKTtcblxuICAgIGNvbnN0IHNhdmVNb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzYXZlLXRhZy1tb2RhbCcpO1xuICAgIGNvbnN0IGFjdGlvbiA9IHNhdmVNb2RhbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWN0aW9uJyk7XG5cbiAgICBjb25zdCB0YWdTcGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhZy10ZXh0Jyk7XG4gICAgY29uc3QgZXhpc3RpbmdUYWcgPSBmaW5kVGFnT25QYWdlQnlUZXh0KG5ld1RhZ1RleHQpO1xuICAgIC8vIGxldCBub3RpY2VUYWdFbGVtZW50ID0gbnVsbDtcblxuICAgIGlmKG5vdGljZURpdikge1xuICAgICAgICAvLyByZW1vdmVUYWdFeGlzdHNOb3RpY2VFbGVtZW50KCk7XG4gICAgICAgIG5vdGljZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnJztcbiAgICB9XG5cbiAgICAvLyBTZXQgdGFnIHRleHQgYW5kIGljb25cbiAgICBpZih0YWdTcGFuKSB7XG4gICAgICAgIHRhZ1NwYW4udGV4dENvbnRlbnQgPSBuZXdUYWdUZXh0O1xuICAgIH1cblxuICAgIG5ld1RhZ0Rpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLXRleHQnLCBuZXdUYWdUZXh0KTtcblxuICAgIGlmKG5ld1RhZ1RleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBkaXNhYmxlQWRkTmV3QnV0dG9uKCk7XG4gICAgICAgIG5ld1RhZ0Rpdi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG5cbiAgICAgICAgLy8gaWYgYSB0YWcgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgdGV4dCBpbiB0aGUgaW5wdXQgZmllbGRcbiAgICAgICAgbGV0IGV4aXN0aW5nVGFnV2l0aFNhbWVUZXh0ID0gZmluZFRhZ09uUGFnZUJ5VGV4dChuZXdUYWdUZXh0KTtcbiAgICAgICAgaWYoZXhpc3RpbmdUYWdXaXRoU2FtZVRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZXh0cmFjdFRhZ1Byb3BlcnRpZXMoZXhpc3R
89pbmdUYWdXaXRoU2FtZVRleHQpO1xuICAgICAgICAgICAgLy8gbm90aWNlVGFnRWxlbWVudCA9IGNyZWF0ZUNvcHlPZkV4aXN0aW5nVGFnKHByb3BzLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGV4aXN0aW5nVGFnV2l0aFNhbWVUZXh0KSB7XG4gICAgICAgICAgICBsZXQgeyBkYXRhc2V0OiB7dGFnVGV4dDogZXhpc3RpbmdUZXh0LCB0YWdJZDogZXhpc3RpbmdJZCB9IH0gPSBleGlzdGluZ1RhZ1dpdGhTYW1lVGV4dDtcbiAgICAgICAgICAgIGxldCB7IGRhdGFzZXQ6IHsgdGFnQ29sb3I6IG5ld0NvbG9yLCB0YWdUZXh0OiBuZXdUZXh0IH0gfSA9IG5ld1RhZ0RpdjtcblxuICAgICAgICAgICAgaWYoYWN0aW9uID09PSAnY3JlYXRlJykge1xuICAgICAgICAgICAgICAgIC8vIHRoZSB0ZXh0IG9mIG5ldyB0YWdzIHNob3VsZCBiZSB1bmlxdWVcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUZXh0ID09PSBuZXdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNwb3RsaWdodFRhZyhleGlzdGluZ1RhZyk7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVTYXZlQnV0dG9uKCk7XG4gICAgICAgICAgICAgICAgICAgIG5vdGljZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0KCd0YWdfYWxyZWFkeV9leGlzdHMnKSB8fCBcIlRhZyBhbHJlYWR5IGV4aXN0c1wiO1xuICAgICAgICAgICAgICAgICAgICBub3RpY2VEaXYuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVNwb3RsaWdodEZyb21UYWdzKGV4aXN0aW5nVGFnKTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWNlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBub3RpY2VEaXYuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVTYXZlQnV0dG9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihhY3Rpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29weU9mVGhpc1RhZyA9IHNhdmVNb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YWctY29weV0nKTtcbiAgICAgICAgICAgICAgICBsZXQgeyBkYXRhc2V0OiB7IHRhZ0NvbG9yOiB0aGlzQ29sb3IsIHRhZ1RleHQ6IHRoaXNUZXh0LCB0YWdJZDogdGhpc0lkIH0gfSA9IGNvcHlPZlRoaXNUYWc7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Q2hhbmdlZCA9IHRoaXNUZXh0ICE9PSBuZXdUZXh0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yQ2hhbmdlZCA9IHRoaXNDb2xvciAhPT0gbmV3Q29sb3I7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9DaGFuZ2VUb0N1cnJlbnRUYWcgPSAodGhpc0lkID09PSBleGlzdGluZ0lkKSAmJiAhdGV4dENoYW5nZWQgJiYgIWNvbG9yQ2hhbmdlZDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzVG9DdXJyZW50VGFnID0gKHRoaXNJZCA9PT0gZXhpc3RpbmdJZCkgJiYgKHRleHRDaGFuZ2VkIHx8IChjb2xvckNoYW5nZWQgJiYgIXRleHRDaGFuZ2VkKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9DaGFuZ2VUb0N1cnJlbnRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3BvdGxpZ2h0VGFnKGV4aXN0aW5nVGFnKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVNhdmVCdXR0b24oKTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWNlRWxlbWVudC50ZXh0Q29udGVudCA9IHQoJ25vX2NoYW5nZScpIHx8ICdObyBjaGFuZ2UnO1xuICAgICAgICAgICAgICAgICAgICBub3RpY2VEaXYuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgICAgICAgICAgICAgICAvLyBub3RpY2VEaXYuaW5zZXJ0QmVmb3JlKG5vdGljZVRhZ0VsZW1lbnQsIG5vdGljZURpdi5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUVsZW1lbnQobmV3VGFnRGl2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZXNUb0N1cnJlbnRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU3BvdGxpZ2h0RnJvbVRhZ3MoZXhpc3RpbmdUYWcpO1xuICAgICAgICAgICAgICAgICAgICBub3RpY2VEaXYuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVTYXZlQnV0dG9uKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZVRhZ0V4aXN0c05vdGljZUVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlRWxlbWVudChuZXdUYWdEaXYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNwb3RsaWdodFRhZyhleGlzdGluZ1RhZyk7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVTYXZlQnV0dG9uKCk7XG4gICAgICAgICAgICAgICAgICAgIG5vdGljZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0KCd0YWdzX211c3RfYmVfdW5pcXVlJykgfHwgXCJUYWdzIG11c3QgYmUgdW5pcXVlbHkgbmFtZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgbm90aWNlRGl2LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUVsZW1lbnQobmV3VGFnRGl2KTtcbiAgICAgICAgICAgICAgICAgICAgLy9zcG90bGlnaHQgZXhpc3RpbmcgdGFnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHRoZSB0ZXh0IGZvciB0aGUgbmV3IHRhZyBpcyB1bmlxdWUgLSBhbGxvdyB1cGRhdGVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVTcG90bGlnaHRGcm9tVGFncygpO1xuICAgICAgICAgICAgbm90aWNlRGl2LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICAgICAgICAgIGVuYWJsZVNhdmVCdXR0b24oKTtcbiAgICAgICAgICAgIGVuYWJsZUVsZW1lbnQobmV3VGFnRGl2KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZVNwb3RsaWdodEZyb21UYWdzKGV4aXN0aW5nVGFnKTtcbiAgICAgICAgLy8gaWYgbmV3VGFnVGV4dC5sZW5ndGggPT09IDBcbiAgICAgICAgbmV3VGFnRGl2LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICAgICAgbm90aWNlRGl2LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICB9XG59XG5cbi8qKlxuICogTWFrZSBhIGNvcHkgb2YgdGhlIHRhZyBkaXYgdG8gZGlzcGxheSBpbiB0aGUgbm90aWNlIGRpdi5cbiAqXG4gKiBAcGFyYW0gdGFnUHJvcGVydGllc1xuICogQHBhcmFtIHNob3dVc2FnZVxuICogQHBhcmFtIHdpdGhMaW5rVG9Bbm5vdGF0aW9uc1BhZ2VcbiAqIEBwYXJhbSB3aXRoQ29weURhdGFBdHRyaWJ1dGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29weU9mRXhpc3RpbmdUYWcoXG4gIHRhZ1Byb3BlcnRpZXMsXG4gIHNob3dVc2FnZSA9IGZhbHNlLFxuICB3aXRoTGlua1RvQW5ub3RhdGlvbnNQYWdlID0gZmFsc2UsXG4gIHdpdGhDb3B5RGF0YUF0dHJpYnV0ZSA9IHRydWUpIHtcbiAgICBjb25zdCB7IGNvbG9yLCBpZCwgbGFzdFVwZGF0ZWQsIHRleHQsIHVzYWdlIH0gPSB0YWdQcm9wZXJ0aWVzO1xuICAgIGNvbnN0IHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgaWYod2l0aENvcHlEYXRhQXR0cmlidXRlKSB7XG4gICAgICAgI
89HRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWNvcHknLCAnJyk7XG4gICAgfVxuXG4gICAgdGFnLnNldEF0dHJpYnV0ZSgnZGF0YS10YWctY29sb3InLCBjb2xvcik7XG4gICAgdGFnLnNldEF0dHJpYnV0ZSgnZGF0YS10YWctaWQnLCBpZCk7XG4gICAgdGFnLnNldEF0dHJpYnV0ZSgnZGF0YS10YWctdGV4dCcsIHRleHQpO1xuICAgIHRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWxhc3QtdXBkYXRlZCcsIGxhc3RVcGRhdGVkKTtcbiAgICB0YWcuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy11c2FnZScsIHVzYWdlKTtcbiAgICB0YWcuc2V0QXR0cmlidXRlKCd0YWItaW5kZXgnLCAnMCcpO1xuXG4gICAgLy8gPHNwYW4gY2xhc3M9J3RhZy11c2FnZSc+eyR0YWdbJ1VzYWdlJ119PC9zcGFuPlxuICAgIHRhZy5jbGFzc0xpc3QuYWRkKCd0YWcnLCAnY29weScsIGAke2NvbG9yfWApO1xuICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgc3Bhbi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgdGFnLmFwcGVuZENoaWxkKHNwYW4pO1xuXG4gICAgaWYoc2hvd1VzYWdlKSB7XG4gICAgICAgIC8vIHRhZy50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgIGNvbnN0IHVzYWdlU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdXNhZ2VTcGFuLmNsYXNzTGlzdC5hZGQoJ3RhZy11c2FnZScpO1xuICAgICAgICB1c2FnZVNwYW4udGV4dENvbnRlbnQgPSB1c2FnZTtcbiAgICAgICAgdGFnLmFwcGVuZENoaWxkKHVzYWdlU3Bhbik7XG4gICAgfVxuXG4gICAgaWYod2l0aExpbmtUb0Fubm90YXRpb25zUGFnZSkge1xuICAgICAgICBpZihwYXJzZUludCh1c2FnZSkgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjb3B5VGFnV3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb3B5LXRhZy13cmFwcGVyJyk7XG4gICAgICAgICAgICBsZXQgZm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhbm5vdGF0aW9ucy1mb3JtJyk7XG4gICAgICAgICAgICBpZiAoIWZvcm0pIHtcbiAgICAgICAgICAgICAgICBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhpZGRlbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICAgICAgaGlkZGVuLnNldEF0dHJpYnV0ZSgndHlwZScsICdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICBoaWRkZW4uc2V0QXR0cmlidXRlKCduYW1lJywgJ3RhZ0lkJyk7XG4gICAgICAgICAgICAgICAgaGlkZGVuLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBpZCk7XG5cbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybSBmb3IgbGluayB0byBhbm5vdGF0aW9ucyBwYWdlXG4gICAgICAgICAgICAgICAgbGV0IHtkYXRhc2V0OiB7dXJsfX0gPSBjb3B5VGFnV3JhcHBlcjtcblxuICAgICAgICAgICAgICAgIGZvcm0uaWQgPSAnYW5ub3RhdGlvbnMtZm9ybSc7XG4gICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ21ldGhvZCcsICdQT1NUJyk7XG4gICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2FjdGlvbicsIHVybCk7XG4gICAgICAgICAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW4pO1xuXG4gICAgICAgICAgICAgICAgY29weVRhZ1dyYXBwZXIucGFyZW50RWxlbWVudC5hcHBlbmQoZm9ybSk7XG4gICAgICAgICAgICAgICAgdGFnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKGNvbmZpcm0odCgnY29uZmlybV9uYXZpZ2F0ZV9hbm5vdGF0aW9ucycpIHx8IFwiQnkgY2xpY2tpbmcgb24gdGhlICdDb250aW51ZScgYnV0dG9uIHlvdSB3aWxsIGJlIHRha2VuIHRvIHRoZVxcbkFubm90YXRpb25zIHBhZ2UgZmlsdGVyZWQgYnkgdGhpcyB0YWcuIEFueSB1bnNhdmVkIGNoYW5nZXMgdG8gdGhpcyB0YWcgd2lsbCBiZSBsb3N0LlwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY2VudGVyZWQgb3ZlcmxheSBzcGlubmVyIGZvciBuYXZpZ2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYXZlVGFnTW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2F2ZS10YWctbW9kYWwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydE92ZXJsYXlPbkVsZW1lbnQoc2F2ZVRhZ01vZGFsLCAnZmlsdGVyLXRhZy1vdmVybGF5Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZztcbn1cblxuLyoqXG4gKiBMb29rIGZvciBhbmQgcmV0dXJuIHRoZSB0YWcgaW4gdGhlIG5vdGljZSBkaXYgdGhhdCBpcyBhIGNvcHkgb2YgYW4gZXhpc3RpbmcgdXNlciB0YWcuXG4gKlxuICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAqL1xuZnVuY3Rpb24gZmluZFRhZ0NvcHlFbGVtZW50SW5Ob3RpY2VEaXYoKSB7XG4gICAgY29uc3Qgbm90aWNlRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5vdGljZV0nKVxuICAgIGlmKG5vdGljZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29weUVsZW1lbnQgPSBub3RpY2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRhZy1jb3B5XScpO1xuICAgICAgICBpZihjb3B5RWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcHlFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogRmluZCB0aGUgZWxlbWVudCB0aGF0IGlzIGEgY29weSBvZiB0aGUgdGFnIGJlaW5nIHVwZGF0ZWQuXG4gKlxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ3VycmVudFRhZ0NvcHlJblNhdmVNb2RhbCgpIHtcbiAgICBjb25zdCBjb3B5RWxlbWVudD0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NhdmUtdGFnLW1vZGFsIFtkYXRhLXRhZy1jb3B5XScpO1xuXG4gICAgaWYoY29weUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvcHlFbGVtZW50O1xuICAgIH1cblxuICAgI
89HJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlbW92ZSBjb3B5IG9mIGV4aXN0aW5nIHRhZyBpbiBub3RpY2UgZGl2LlxuICovXG4vLyBmdW5jdGlvbiByZW1vdmVUYWdFeGlzdHNOb3RpY2VFbGVtZW50KCkge1xuLy8gICBjb25zdCBjb3B5VGFnID0gZmluZFRhZ0NvcHlFbGVtZW50SW5Ob3RpY2VEaXYoKTtcbi8vICAgaWYoY29weVRhZykge1xuLy8gICAgIGNvcHlUYWcucmVtb3ZlKCk7XG4vLyAgIH1cbi8vIH1cblxuLyoqXG4gKiBIYW5kbGUgYWRkaW5nIGEgbmV3IHRhZyBmcm9tIHRoZSB0YWdzIG1hbmFnZW1lbnQgcGFnZVxuICpcbiAqIEBwYXJhbSB0YWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUYWcodGFnKSB7XG4gICAgY29uc3QgYWN0aW9uID0gJ2NyZWF0ZSc7XG5cbiAgICBhd2FpdCBwZXJzaXN0VGFnKGFjdGlvbiwgdGFnKTtcbn1cblxuLyoqXG4gKiBEZWxldGUgdGhlIHNlbGVjdGVkIHRhZy5cbiAqXG4gKiBAcGFyYW0gdGFnXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVRhZyh0YWcpIHtcbiAgICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlJztcblxuICAgIGF3YWl0IHBlcnNpc3RUYWcoYWN0aW9uLCB0YWcpO1xufVxuXG4vKipcbiAqIFNldCB1cCBjYWxsIHRvIHBlcnNpc3QgdGFnIHVwZGF0ZS5cbiAqXG4gKiBAcGFyYW0gdGFnXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlVGFnKHRhZykge1xuICAgIGNvbnN0IGFjdGlvbiA9ICd1cGRhdGUnO1xuXG4gICAgYXdhaXQgcGVyc2lzdFRhZyhhY3Rpb24sIHRhZyk7XG59XG5cbi8qKlxuICogUGVyc2lzdCB0aGUgdGFnIGRhdGEgdG8gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSB0YWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0VGFnKGFjdGlvbiwgdGFnKSB7XG4gICAgLy8gTm90ZTogT3ZlcmxheSBzcGlubmVyIGlzIGhhbmRsZWQgYnkgc2F2ZUJ1dHRvbkhhbmRsZXIoKSAtIG5vIHNlcGFyYXRlIHNwaW5uZXIgbmVlZGVkIGhlcmVcbiAgICBjb25zdCBzYXZlTW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2F2ZS10YWctbW9kYWwnKTtcbiAgICBsZXQge2RhdGFzZXQ6IHt0YWdDb2xvcjogY29sb3IsIHRhZ0lkOiBpZCA9IG51bGwsIHRhZ1RleHQ6IHRleHR9fSA9IHRhZztcblxuICAgIC8vIGVuc3VyZSB0aGUgdGFnIG5vdCBsb25nZXIgdGhhbiB0aGUgbGltaXRcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBJTlBVVF9URVhUX0xJTUlUKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7YWN0aW9uLCBpZCwgY29sb3IsIHRleHR9O1xuICAgIGxldCB7ZGF0YXNldDoge3VybH19ID0gc2F2ZU1vZGFsO1xuXG4gICAgLy8gYXN5bmMgZmV0Y2hcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbmV3IEZldGNoSGVscGVycygpLmZldGNoRGF0YSgnUE9TVCcsIHVybCwgZGF0YSwge211dGF0aW5nOiB0cnVlLCBkYXRhTGFiZWw6ICd0YWdzJ30pO1xuICAgIGxldCB7c3VjY2VzcywgbWVzc2FnZXN9ID0gcmVzdWx0O1xuXG4gICAgLy8gaGFuZGxlIHJlc3BvbnNlXG4gICAgbGV0IG1zZyA9ICcnO1xuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgIG1zZyA9IHQoJ3RhZ19hY3Rpb25fc3VjY2Vzc2Z1bCcsIHsnOmFjdGlvbic6IGNhcGl0YWxpemUoYWN0aW9uKX0pIHx8IGAke2NhcGl0YWxpemUoYWN0aW9uKX0gYWN0aW9uIHN1Y2Nlc3NmdWwuYDtcblxuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGJhY2sgdGhlIGlkIG9mIHRoZSB0YWcgbW9kaWZpZWQgZ3JhYiBpdCBmcm9tIHRoZSBkYXRhIHZhcmlhYmxlXG4gICAgICAgIGNvbnN0IGRhdGFfY2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhKTtcbiAgICAgICAgZGVsZXRlIGRhdGFfY2xvbmUuYWN0aW9uO1xuICAgICAgICBpZihhY3Rpb24gPT09ICdjcmVhdGUnICYmICFPYmplY3Qua2V5cyhyZXN1bHQpLmluY2x1ZGVzKCdjcmVhdGVkJykpIHtcbiAgICAgICAgICAgIHJlc3VsdFthY3Rpb25fcmVzcG9uc2VdID0gZGF0YV9jbG9uZTtcbiAgICAgICAgfSBlbHNlIGlmKGFjdGlvbiA9PT0gJ2RlbGV0ZScgJiYgIU9iamVjdC5rZXlzKHJlc3VsdCkuaW5jbHVkZXMoJ2RlbGV0ZWQnKSkge1xuICAgICAgICAgICAgcmVzdWx0W2FjdGlvbl9yZXNwb25zZV0gPSBkYXRhX2Nsb25lO1xuICAgICAgICB9IGVsc2UgaWYoYWN0aW9uID09PSAndXBkYXRlJyAmJiAhT2JqZWN0LmtleXMocmVzdWx0KS5pbmNsdWRlcygndXBkYXRlZCcpKSB7XG4gICAgICAgICAgICByZXN1bHRbYWN0aW9uX3Jlc3BvbnNlXSA9IGNsb25lO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlVGFnQ29sbGVjdGlvbihhY3Rpb24sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIG1lc3NhZ2VzXG4gICAgaWYobWVzc2FnZXMpIHtcblxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgbXNnICs9IGAke21lc3NhZ2V9XFxuYDtcbiAgICAgICAgfSlcbiAgICAgICAgbXNnLnJlcGxhY2VBbGwoXCJcXG5cIiwgJzxiciAvPicpO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSByZXN1bHRbJ3N1Y2Nlc3MnXSA/ICdpbmZvJyA6ICd3YXJuaW5nJztcbiAgICBjb25zdCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UobXNnLCB0eXBlKTtcblxuICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoe30sIHRydWUpO1xuICAgIG5vdGljZS5yZW1vdmUoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVGFnQ29sbGVjdGlvbihhY3Rpb24sIHJlc3VsdCkge1xuICAgIGNvbnN0IHRhZ3NDb2xsZWN0aW9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4aXN0aW5nLXRhZ3MnKTtcblxuICAgIGxldCB0YWc7XG5cbiAgICBpZihhY3Rpb24gPT09ICdjcmVhdGUnKSB7XG4gICAgICAgIC8vIGFkZCB0YWcgaW4gY3VycmVudCBzb3J0IHBvc2l0aW9uXG4gICAgICAgIGxldCB7IGNyZWF0ZWQgfSA9IHJlc3VsdDtcbiAgICAgICAgY3JlYXRlZC5mb3JFYWNoKCh0YWcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ0VsZW1lbnQgPSBjcmVhdGVDb3B5T2ZFeGlzdGluZ1RhZyh0YWcsIHRydWUpO1xuICAgICAgICAgICAgdGFnRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdjb3B5Jyk7XG4gICAgICAgICAgICB0YWdFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10YWctY29weScpO1xuXG4gICAgICAgICAgICB0YWdFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdUYWdDbGlja0V2ZW50SGFuZGxlcihldmVudCk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0YWdzQ29sbGVjdGlvbi5hcHBlbmRDaGlsZCh0YWdFbGVtZW50KTtcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzb3J0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzb3J0LXRhZ3MnKTtcbiAgICAgICAgY29uc3Qgc29ydFNlbGVjdGVkID0gc29ydEVsZW1lbnQucXVlcnlTZWxlY3RvcignbGlbY2xhc3NdIGEnKTtcblxuICAgICAgICBpZihzb3J0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YXNldDogeyBzb3J0QnksIHNvcnREaXJlY3Rpb24gfSB9ID0gc29ydFNlbGVjdGVkO1xuXG4gICAgICAgICAgICBbLi4udGFnc0NvbGxlY3Rpb24uY2hpbGRyZW5dXG4gICAgICAgICAgICAgICAgLnNvcnQodGFnc1NvcnRpbmdGdW5jdGlvbihzb3J0QnksIHNvcnREaXJlY3Rpb24sICdlbGVtZW50JykpXG4gICAgICAgICAgICAgICAgLmZvckVhY2gobm9kZSA9PiB0YWdzQ29sbGVjdGlvbi5hcHBlbmRDaGlsZChub2RlKSk7XG4gICAgICAgI
89H1cbiAgICB9XG5cbiAgICBpZihhY3Rpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgdGFnXG4gICAgICAgIGxldCB7IHVwZGF0ZWQgfSA9IHJlc3VsdDtcbiAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgIHVwZGF0ZWQuZm9yRWFjaCgodGFnUHJvcGVydGllcyA9PiB7XG4gICAgICAgICAgICAgICAgdGFnID0gZmluZFRhZ09uUGFnZUJ5SWQodGFnUHJvcGVydGllcy5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKHRhZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdXAgcHJvcGVydGllcyBvZiBuZXcgdGFnIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYWdQcm9wZXJ0aWVzID0gZXh0cmFjdFRhZ1Byb3BlcnRpZXModGFnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFRhZyA9IGNyZWF0ZUNvcHlPZkV4aXN0aW5nVGFnKGV4aXN0aW5nVGFnUHJvcGVydGllcywgdHJ1ZSwgZmFsc2UsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgY29weSBjbGFzcyAodXNlZCBmb3IgbW9kYWwgZGlzcGxheSwgbm90IHRhZyBsaXN0KVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkVGFnLmNsYXNzTGlzdC5yZW1vdmUoJ2NvcHknKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY29sb3JcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWNvbG9yJywgdGFnUHJvcGVydGllcy5jb2xvcik7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRUYWcuY2xhc3NMaXN0LnJlcGxhY2UoZXhpc3RpbmdUYWdQcm9wZXJ0aWVzLmNvbG9yLCB0YWdQcm9wZXJ0aWVzLmNvbG9yKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbGFzdCB1cGRhdGVkXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRUYWcuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy1sYXN0LXVwZGF0ZWQnLCB0YWdQcm9wZXJ0aWVzLmxhc3RVcGRhdGVkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGV4dFxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRhZ1Byb3BlcnRpZXMudGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRUYWcuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy10ZXh0JywgdGFnUHJvcGVydGllcy50ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFRhZy5jaGlsZE5vZGVzWzBdLnJlcGxhY2VXaXRoKHRleHRFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBldmVudCBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRUYWcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFnQ2xpY2tFdmVudEhhbmRsZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIHRhZy5yZXBsYWNlV2l0aCh1cGRhdGVkVGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmKGFjdGlvbiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0YWdcbiAgICAgICAgbGV0IHsgZGVsZXRlZCB9ID0gcmVzdWx0O1xuICAgICAgICBpZihkZWxldGVkKSB7XG4gICAgICAgICAgICBkZWxldGVkLmZvckVhY2goKGlkID0+IHtcbiAgICAgICAgICAgICAgICB0YWcgPSBmaW5kVGFnT25QYWdlQnlJZChpZCk7XG4gICAgICAgICAgICAgICAgaWYgKHRhZykge1xuICAgICAgICAgICAgICAgICAgICB0YWcucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgY291bnRcbiAgICBjb25zdCB0b3RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hbm5vdGF0aW9uLWl0ZW1zICN0b3RhbCcpO1xuICAgIGlmKHRvdGFsKSB7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhpc3RpbmctdGFncyAudGFnJyk7XG4gICAgICAgIHRvdGFsLnRleHRDb250ZW50ID0gdGFncyA/IHRhZ3MubGVuZ3RoIDogJy0tJztcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlTW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2F2ZS10YWctbW9kYWwnKTtcbiAgICBpZihzYXZlTW9kYWwpIHtcbiAgICAgICAgcmVzZXRBbmRDbG9zZVNhdmVNb2RhbChzYXZlTW9kYWwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSB0YWcgcHJvcGVydGllcyBmcm9tIGEgdGFnIGVsZW1lbnQncyBkYXRhc2V0LiBJZiB0YWdFbGVtZW50IGlzIG51bGwsIHJldHVybiBvYmplY3Qgd2l0aFxuICogYmxhbmsgdGFnIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHRhZ0VsZW1lbnRcbiAqIEByZXR1cm5zIHt7bGFzdFVwZGF0ZWQsIGNvbG9yLCB1c2FnZSwgaWQsIHRleHR9fVxuICovXG5mdW5jdGlvbiBleHRyYWN0VGFnUHJvcGVydGllcyh0YWdFbGVtZW50KSB7XG4gICAgaWYodGFnRWxlbWVudCkge1xuICAgICAgICBsZXQge1xuICAgICAgICAgICAgZGF0YXNldDpcbiAgICAgICAgICAgICAgICB7IHRhZ0NvbG9yOiBvcmlnaW5hbENvbG9yID0gJycsXG4gICAgICAgICAgICAgICAgICB0YWdJZDogaWQgPSAnJyxcbiAgICAgICAgICAgICAgICAgIHRhZ0xhc3RVcGRhdGVkOiBsYXN0VXBkYXRlZCA9ICcnLFxuICAgICAgICAgICAgICAgICAgdGFnVGV4dDogdGV4dCA9ICcnLFxuICAgICAgICAgICAgICAgICAgdGFnVXNhZ2U6IHVzYWdlID0gJzAnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9ID0gdGFnRWxlbWVudDtcbiAgICAgICAgY29uc3QgY29sb3IgPSBvcmlnaW5hbENvbG9yLmxlbmd0aCA9PT0gMCA/ICdkZWZhdWx0JyA6IG9yaWdpbmFsQ29sb3I7XG5cbiAgICAgICAgcmV0dXJuIHtjb2xvciwgaWQsIGxhc3RVcGRhdGVkLCB0ZXh0LCB1c2FnZX07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29sb3I6ICcnLCBsYXN0VXBkYXRlZDogJycsIGlkOiAnJywgdGV4dDogJycsIHVzYWdlOiAnMCd9XG59XG5cbi8qKlxuICogRXZlbnQgaGFuZGxlciBmb3IgY2xpY2sgb24gZXhpc3RpbmcgdGFnIGluIHRhZ3MgY29sbGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXZlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0aW5nVGFnQ2xpY2tFdmVudEhhbmRsZXIoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHNhdmVUYWdNb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzYXZlLXRhZy1tb2RhbCcpO1xuICAgIC8vIGlmIG1vZGFsIGlzIHNob3dpbmdcbiAgICBpZighc2F2ZVRhZ01vZGFsLmNsYXNzTGlzdC5jb250YWlucygnaGlkZScpKSB7XG4gICAgICAgIC8vIGlmIGNsaWNrIGlzIG91dHNpZGUgdGhlIGFjdGl2ZSBtb2RhbCxcbiAgICAgICAgaWYgKCFzY
89XZlVGFnTW9kYWwuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRhZ0VsZW1lbnQgPSBldmVudC50YXJnZXQ7XG4gICAgaWYodGFnRWxlbWVudC50YWdOYW1lID09PSAnU1BBTicpIHtcbiAgICAgICAgdGFnRWxlbWVudCA9IHRhZ0VsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICBwcmVwU2F2ZU1vZGFsRm9yVGFnRWRpdGluZyhzYXZlVGFnTW9kYWwsIHRhZ0VsZW1lbnQpO1xuICAgIG1hbmFnZVNhdmVNb2RhbFZpc2liaWxpdHkoc2F2ZVRhZ01vZGFsLCB0YWdFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBEaXNhYmxlIGFuIGVsZW1lbnQgYnkgaGFuZGxpbmcgdGhlICdkaXNhYmxlZCcgYXR0cmlidXRlIGFuZCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudFxuICovXG5mdW5jdGlvbiBkaXNhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgICBpZighZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkaXNhYmxlZCcpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFbmFibGUgYW4gZWxlbWVudCBieSBoYW5kbGluZyB0aGUgJ2Rpc2FibGVkJyBhdHRyaWJ1dGUgYW5kIGNsYXNzLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGVuYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZGlzYWJsZWQnKTtcbn1cblxuLyoqXG4gKiBWaXN1YWxseSBtYXJrIHRhZyBhcyBpbiBlZGl0IG1vZGUuXG4gKlxuICogQHBhcmFtIHRhZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3BvdGxpZ2h0VGFnKHRhZykge1xuICAgIGlmICh0YWcpIHtcbiAgICAgICAgdGFnLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodGVkJyk7XG4gICAgICAgIHRhZy5kYXRhc2V0LmhpZ2hsaWdodGVkID0gJ3RydWUnO1xuICAgICAgICAvLyBhd2FpdCBhc3luY1NsZWVwKDIwMDAsIHJlbW92ZVNwb3RsaWdodEZyb21UYWdzKHRhZyk7XG4gICAgICAgIC8vIHJlbW92ZVNwb3RsaWdodEZyb21UYWdzKHRhZyk7XG4gICAgfVxufVxuXG4vKipcbiAqIENsZWFyIGhpZ2hsaWdodGVkIHN0eWxlIGZyb20gdGFnLlxuICogLSByZXNldHMgYm9yZGVyIHdpZHRoXG4gKiAtIGNsZWFycyBhbmQgaGlkZXMgdGhlIG5ldyB0YWcgZWxlbWVudFxuICogSWYgbm8gdGFyZ2V0IGVsZW1lbnQgaXMgcGFzc2VkIGluLCBjaGVjayB0aGUgcGFnZSBmb3IgYW55IGVsZW1lbnRzIHdpdGggdGhlIGRhdGEgYXR0cmlidXRlICdkYXRhLWhpZ2hsaWdodGVkJ1xuICpcbiAqIEBwYXJhbSB0YXJnZXRFbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTcG90bGlnaHRGcm9tVGFncyh0YXJnZXRFbGVtZW50ID0gbnVsbCkge1xuICAgIGlmICh0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgICAgICAgdGFyZ2V0RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2hpZ2hsaWdodGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3BvdExpZ2h0ZWRDb2xsZWN0aW9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtaGlnaGxpZ2h0ZWRdYCk7XG4gICAgICAgIGlmIChzcG90TGlnaHRlZENvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHNwb3RMaWdodGVkQ29sbGVjdGlvbi5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU3BvdGxpZ2h0RnJvbVRhZ3ModGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogSXMgdGhlIGN1cnJlbnQgY29udGV4dCB0aGUgcmVhZGVyIG9yIHRoZSB0YWdzIG1hbmFnZW1lbnQgcGFnZS5cbiAqIENoZWNrcyB0aGUgbG9jYXRpb24gcGF0aG5hbWUuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ01hbmFnZW1lbnRPblJlYWRlcigpIHtcbiAgICBjb25zdCBwYXRobmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcblxuICAgIHJldHVybiBwYXRobmFtZS5pbmNsdWRlcygncmVhZGVyLnBocCcpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNvcnRpbmcgZnVuY3Rpb24gdG8gdXNlIGZvciBzb3J0aW5nIHRhZywgYmFzZWQgb24gdHdvIGNyaXRlcmlhLCBzb3J0QnkgYW5kIGRpcmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gc29ydEJ5IC0gc29ydCBhdHRyaWJ1dGUgKCduYW1lJywndGltZScsJ3VzYWdlJylcbiAqIEBwYXJhbSBkaXJlY3Rpb24gLSAoJ2FzYycsICdkZXNjJylcbiAqIEBwYXJhbSBlbGVtZW50SXRlbVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnc1NvcnRpbmdGdW5jdGlvbihzb3J0QnksIGRpcmVjdGlvbiwgZWxlbWVudEl0ZW0gPSAnYXJyYXknKSB7XG4gICAgaWYoc29ydEJ5ID09PSAnY29sb3InKSB7XG4gICAgICAgIHJldHVybiBzb3J0VGFnc0J5Q29sb3JTb3J0aW5nRnVuY3Rpb24oZGlyZWN0aW9uLCBlbGVtZW50SXRlbSk7XG4gICAgfSBlbHNlIGlmIChzb3J0QnkgPT09ICd1c2FnZScpIHtcbiAgICAgICAgcmV0dXJuIHNvcnRUYWdzQnlNb3N0VXNlZFNvcnRpbmdGdW5jdGlvbihkaXJlY3Rpb24sIGVsZW1lbnRJdGVtKTtcbiAgICB9IGVsc2UgaWYgKHNvcnRCeSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgIHJldHVybiBzb3J0VGFnc0J5TW9zdFJlY2VudFNvcnRpbmdGdW5jdGlvbihkaXJlY3Rpb24sIGVsZW1lbnRJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc29ydFRhZ3NCeU5hbWVTb3J0aW5nRnVuY3Rpb24oZGlyZWN0aW9uLCBlbGVtZW50SXRlbSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFNvcnRpbmcgZnVuY3Rpb24gdG8gdXNlIHdpdGggc29ydCgpIHRoYXQgc29ydHMgdGFncyBieSBjb2xvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHNvcnRUYWdzQnlDb2xvclNvcnRpbmdGdW5jdGlvbihkaXJlY3Rpb24sIGVsZW1lbnRJdGVtKSB7XG4gICAgcmV0dXJuIGdlbmVyYWxTb3J0aW5nRnVuY3Rpb24oJ2NvbG9yJywgZGlyZWN0aW9uLCBlbGVtZW50SXRlbSk7XG59XG5cbi8qKlxuICogU29ydGluZyBmdW5jdGlvbiB0byB1c2Ugd2l0aCBzb3J0KCkgdGhhdCBzb3J0cyB0YWdzIGFscGhhYmV0aWNhbGx5LlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRUYWdzQnlOYW1lU29ydGluZ0Z1bmN0aW9uKGRpcmVjdGlvbiwgZWxlbWVudEl0ZW0pIHtcbiAgICByZXR1cm4gZ2VuZXJhbFNvcnRpbmdGdW5jdGlvbignbmFtZScsIGRpcmVjdGlvbiwgZWxlbWVudEl0ZW0pO1xufVxuXG4vKipcbiAqIFNvcnRpbmcgZnVuY3Rpb24gdG8gdXNlIHdpdGggc29ydCgpIHRoYXQgc29ydHMgYnkgdGhlIGNyZWF0aW9uIGRhdGUgb2YgdGhlIHRhZ3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBzb3J0VGFnc0J5TW9zdFJlY2VudFNvcnRpbmdGdW5jdGlvbihkaXJlY3Rpb24sIGVsZW1lbnRJdGVtKSB7XG4gICAgcmV0dXJuIGdlbmVyYWxTb3J0aW5nRnVuY3Rpb24oJ3RpbWUnLCBkaXJlY3Rpb24sIGVsZW1lbnRJdGVtKTtcbn1cblxuLyoqXG4gKiBTb3J0aW5nIGZ1bmN0aW9uIHRvIHVzZSB3aXRoIHNvcnQoKSB0aGF0IHNvcnRzIGJ5IGhvdyBtYW55IHRpbWVzIHRoZSB0YWcgaGFzIGJlZW4gYXBwbGllZCB0byBhbiBhbm5vdGF0aW9uLlxuICogQHBhcmFtIGRpcmVjdGlvblxuICogQHBhcmFtIGVsZW1lbnRJdGVtXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBzb3J0VGFnc0J5TW9zdFVzZWRTb3J0aW5nRnVuY3Rpb24oZGlyZWN0aW9uLCBlbGVtZW50SXRlbSkge1xuICAgIHJldHVybi
89BnZW5lcmFsU29ydGluZ0Z1bmN0aW9uKCd1c2FnZScsIGRpcmVjdGlvbiwgZWxlbWVudEl0ZW0pO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBvYmplY3Qgb2YgdGFnIGF0dHJpYnV0ZXMgZnJvbSBhIHRhZyBEb20gZWxlbWVudFxuICogQWRkIHNlbnNpYmxlIGRlZmF1bHQgdmFsdWVzIGZvciB0ZXh0LCBjb2xvciwgYW5kIHVzYWdlLCBpZiBtaXNzaW5nLlxuICpcbiAqIEBwYXJhbSB0YWdcbiAqIEByZXR1cm5zIHt7bGFzdFVwZGF0ZWQsIGNvbG9yLCB1c2FnZSwgdGV4dH19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1UYWdFbGVtZW50RGF0YSh0YWcpIHtcbiAgICBsZXQge1xuICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgICB0YWdDb2xvcjogY29sb3IgPSAnZ3JheScsXG4gICAgICAgICAgICB0YWdMYXN0VXBkYXRlZDogbGFzdFVwZGF0ZWQsXG4gICAgICAgICAgICB0YWdUZXh0OiB0ZXh0ID0gJycsXG4gICAgICAgICAgICB0YWdVc2FnZTogdXNhZ2UgPSAwIH0gfSA9IHRhZztcbiAgICByZXR1cm4geyBjb2xvciwgbGFzdFVwZGF0ZWQsIHRleHQsIHVzYWdlIH07XG59XG5cbi8qKlxuICogRnVuY3Rpb24gZm9yIHNvcnQoKSBtZXRob2Qgd2hlbiBzb3J0aW5nIHdvcmRzICh0YWdzKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAob25lIG9mOiAnYWxwaGEnLCAndXNhZ2UnLCAndGltZScob25lIG9mOiAnYWxwaGEnLCAndXNhZ2UnLCAndGltZScpXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyZWN0aW9uXG4gKiBAcGFyYW0gZWxlbWVudEl0ZW1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYWxTb3J0aW5nRnVuY3Rpb24odHlwZSwgZGlyZWN0aW9uLCBlbGVtZW50SXRlbT0gJ2FycmF5Jykge1xuICAgIGxldCBmaXJzdCwgc2Vjb25kLCBhc2NlbmRpbmcsIGRlc2NlbmRpbmc7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgbGV0IGZpcnN0SXRlbSA9IGE7XG4gICAgICAgIGxldCBzZWNvbmRJdGVtID0gYjtcbiAgICAgICAgLy8gZm9yIGFsbCBzb3J0IG9wdGlvbnMgZXhjZXB0IGFscGhhLCBkbyBhIHNlY29uZGFyeSBhbHBoYSBzb3J0XG4gICAgICAgIGxldCBzZWNvbmRhcnlMZXZlbFNvcnQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChlbGVtZW50SXRlbSA9PT0gJ2VsZW1lbnQnKSB7XG4gICAgICAgICAgICBmaXJzdEl0ZW0gPSB0cmFuc2Zvcm1UYWdFbGVtZW50RGF0YShhKTtcbiAgICAgICAgICAgIHNlY29uZEl0ZW0gPSB0cmFuc2Zvcm1UYWdFbGVtZW50RGF0YShiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpcnN0SXRlbSA9IGVuc3VyZVNlbnNpYmxlVmFsdWVzKGZpcnN0SXRlbSk7XG4gICAgICAgIHNlY29uZEl0ZW0gPSBlbnN1cmVTZW5zaWJsZVZhbHVlcyhzZWNvbmRJdGVtKTtcblxuICAgICAgICBpZih0eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICBmaXJzdCA9IGZpcnN0SXRlbS5jb2xvcjtcbiAgICAgICAgICAgIHNlY29uZCA9IHNlY29uZEl0ZW0uY29sb3I7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3VzYWdlJykge1xuICAgICAgICAgICAgZmlyc3QgPSBwYXJzZUludChmaXJzdEl0ZW0udXNhZ2UpO1xuICAgICAgICAgICAgc2Vjb25kID0gcGFyc2VJbnQoc2Vjb25kSXRlbS51c2FnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICBmaXJzdCA9IERhdGUucGFyc2UoZmlyc3RJdGVtLmxhc3RVcGRhdGVkKTtcbiAgICAgICAgICAgIHNlY29uZCA9IERhdGUucGFyc2Uoc2Vjb25kSXRlbS5sYXN0VXBkYXRlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0IGlzIGFscGhhIHNvcnRcbiAgICAgICAgICAgIHNlY29uZGFyeUxldmVsU29ydCA9IGZhbHNlXG4gICAgICAgICAgICBmaXJzdCA9IGZpcnN0SXRlbS50ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBzZWNvbmQgPSBzZWNvbmRJdGVtLnRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdhc2MnKSB7XG4gICAgICAgICAgICBhc2NlbmRpbmcgPSBmaXJzdCA8IHNlY29uZDtcbiAgICAgICAgICAgIGRlc2NlbmRpbmcgPSBmaXJzdCA+IHNlY29uZDtcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdkZXNjJykge1xuICAgICAgICAgICAgYXNjZW5kaW5nID0gZmlyc3QgPiBzZWNvbmQ7XG4gICAgICAgICAgICBkZXNjZW5kaW5nID0gZmlyc3QgPCBzZWNvbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmb3IgYW4gaW52YWxpZCBzb3J0IHZhbHVlLCBkb24ndCBjaGFuZ2UgYW55dGhpbmcuXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaXJzdCB2YWx1ZSBjb21lcyBmaXJzdFxuICAgICAgICBpZiAoYXNjZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZWNvbmQgdmFsdWUgY29tZXMgZmlyc3RcbiAgICAgICAgaWYgKGRlc2NlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWUsIGRvIHRoZSBzZWNvbmRhcnkgYWxwaGEgc29ydFxuICAgICAgICBpZihzZWNvbmRhcnlMZXZlbFNvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZmlyc3RJdGVtLnRleHQpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKHNlY29uZEl0ZW0udGV4dCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuXG5cbi8qKlxuICogSGVscGVyOiBjaGVjayBpZiBwYXJlbnQgaXMgdmlzaWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJlbnRWaXNpYmxlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gIWVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRlJykgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xufVxuXG4vKipcbiAqIGVuc3VyZSBzZW5zaWJsZSBkZWZhdWx0cyB0byBhdm9pZCBlcnJvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVNlbnNpYmxlVmFsdWVzICh0YWdEYXRhKSB7XG4gICAgaWYgKCF0YWdEYXRhKSB7XG4gICAgICAgI
89HJldHVybiB7IGNvbG9yOiAnZ3JheScsIGxhc3RVcGRhdGVkOiAnJywgdGV4dDogJycsIHVzYWdlOiAnMCcgfTtcbiAgICB9XG5cbiAgICBsZXQgY29sb3IgPSB0YWdEYXRhLmNvbG9yO1xuICAgIGxldCBsYXN0VXBkYXRlZCA9IHRhZ0RhdGEubGFzdFVwZGF0ZWQ7XG4gICAgbGV0IHRleHQgPSB0YWdEYXRhLnRleHQ7XG4gICAgbGV0IHVzYWdlID0gdGFnRGF0YS51c2FnZTtcblxuICAgIGNvbG9yID0gY29sb3IgPz8gJ2dyYXknO1xuICAgIHRleHQgPSAodGV4dCA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICB1c2FnZSA9IHVzYWdlID8/ICcwJztcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yLFxuICAgICAgICBsYXN0VXBkYXRlZCxcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdXNhZ2VcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/account/tags/functions.js\n");
90
91/***/ }),
92
93/***/ "./resources/js/annotations/account-tag-save.js":
94/*!******************************************************!*\
95  !*** ./resources/js/annotations/account-tag-save.js ***!
96  \******************************************************/
97/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
98
99eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   annotationCardFor: () => (/* binding */ annotationCardFor),\n/* harmony export */   assignedTagIdsFor: () => (/* binding */ assignedTagIdsFor),\n/* harmony export */   readAccountMark: () => (/* binding */ readAccountMark),\n/* harmony export */   saveAccountAnnotationTags: () => (/* binding */ saveAccountAnnotationTags),\n/* harmony export */   syncAnnotationCardTags: () => (/* binding */ syncAnnotationCardTags)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/toConsumableArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/filter */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _tags_request__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./tags-request */ \"./resources/js/annotations/tags-request.js\");\n\n\n\n\n\n\n\n/**\n * Saving the tags on ONE annotation from the account Annotations page (#4368).\n *\n * The page's per-annotation tag controls used to save through\n * `UserMar
99ks.initialize()`, which reads `.section-content` and `.current-info`\n * — elements that live only in the reader's reading column and are never\n * created at runtime. The save could not work there at all.\n *\n * The replacement is the single-mark read-modify-write the reader panel's tag\n * tray already uses: one `tags` action posted to refresh-paginated-list.php,\n * applied by UserMark::modifyMarks through the shared mutate helper. That\n * closure sets only `['tags']` and returns the mark otherwise byte-identical,\n * so the note and the colour riding inside the same annotation object are\n * never rewritten. Nothing here ever posts a marks ARRAY — that is the\n * whole-section shape, and the note-loss risk lives there, not here.\n *\n * The save deliberately does NOT repaint the collection: a repaint would tear\n * down the tag tray the user is still working in. The card's own chips are\n * reconciled in place instead.\n */\n\n\n\n/**\n * The annotation card carrying a mark id, in either collection style.\n *\n * Matched by walking `[data-annotation]` rather than with an attribute\n * selector: the ids are ciphertext and can carry characters a CSS selector\n * would have to escape.\n *\n * @param {string} markId encrypted mark id\n * @returns {HTMLElement|null}\n */\nfunction annotationCardFor(markId) {\n  var _find, _context;\n  var wanted = String(markId !== null && markId !== void 0 ? markId : '');\n  if (wanted === '') return null;\n  return (_find = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_3___default()(_context = (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(document.querySelectorAll('[data-annotation]'))).call(_context, function (card) {\n    return card.dataset.markId === wanted;\n  })) !== null && _find !== void 0 ? _find : null;\n}\n\n/**\n * The tag-management tray for a mark, the one createTagManagementControls\n * builds. The server also renders a `[data-controls-for=\"tags\"]` \"view all\"\n * popup keyed by `data-ref`, so the `data-id` match matters.\n *\n * @param {string} markId encrypted mark id\n * @returns {HTMLElement|null}\n */\nfunction tagTrayFor(markId) {\n  var _find2, _context2;\n  var wanted = String(markId !== null && markId !== void 0 ? markId : '');\n  return (_find2 = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_3___default()(_context2 = (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(document.querySelectorAll('[data-controls-for=\"tags\"][data-id]'))).call(_context2, function (tray) {\n    return tray.dataset.id === wanted;\n  })) !== null && _find2 !== void 0 ? _find2 : null;\n}\n\n/**\n * The encrypted ids the `tags` action needs, read off the card.\n *\n * `hid` lives only on the card's edit anchor — the same place the recolor and\n * delete actions read it from.\n *\n * @param {string} markId encrypted mark id\n * @returns {{hid: string, userMarkId: string, markId: string}|null}\n */\nfunction readAccountMark(markId) {\n  var _edit$dataset$hid, _ref, _edit$dataset$userMar, _card$dataset$markId;\n  var card = annotationCardFor(markId);\n  if (!card) return null;\n  var edit = card.querySelector('.user-mark-edit');\n  return {\n    hid: (_edit$dataset$hid = edit === null || edit === void 0 ? void 0 : edit.dataset.hid) !== null && _edit$dataset$hid !== void 0 ? _edit$dataset$hid : '',\n    userMarkId: (_ref = (_edit$dataset$userMar = edit === null || edit === void 0 ? void 0 : edit.dataset.userMarkRecordId) !== null && _edit$dataset$userMar !== void 0 ? _edit$dataset$userMar : card.dataset.userMarkRecordId) !== null && _ref !== void 0 ? _ref : '',\n    markId: (_card$dataset$markId = card.dataset.markId) !== null && _card$dataset$markId !== void 0 ? _card$dataset$markId : ''\n  };\n}\n\n/**\n * The tag ids the tray currently assigns to a mark.\n *\n * The remove handler hides a tag with `.hide` and only removes the element\n * once the save is confirmed, so a hidden tag is one the user just took off.\n * The \"Delete All\" control is a `.tag` too and carries no tag id.\n *\n * @param {string} markId encrypted mark id\n * @returns {string[]}\n */\nfunction assignedTagIdsFor(markId) {\n  var _context3, _context4;\n  return _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default()(_context3 = _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5___default()(_context4 = visibleTrayTags(markId)).call(_context4, function (tag) {\n    var _tag$dataset$tagId;\n    return String((_tag$dataset$tagId = tag.dataset.tagId) !== null && _tag$dataset$tagId !== void 0 ? _tag$dataset$tagId : '');\n  })).call(_context3, Boolean);\n}\n\n/**\n * The tray tags a save should persist: everything not hidden by the remove\n * handler, and n
99ot the \"Delete All\" control.\n *\n * @param {string} markId encrypted mark id\n * @returns {HTMLElement[]}\n */\nfunction visibleTrayTags(markId) {\n  var _context5, _context6;\n  var tray = tagTrayFor(markId);\n  if (!tray) return [];\n  return _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default()(_context5 = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default()(_context6 = (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(tray.querySelectorAll('.existing-tags .tag'))).call(_context6, function (tag) {\n    return !tag.classList.contains('hide');\n  })).call(_context5, function (tag) {\n    return tag.dataset.tagType !== 'delete';\n  });\n}\n\n/**\n * Persist the tray's current tag assignment for one annotation.\n *\n * @param {string} markId encrypted mark id\n * @returns {Promise<{success: boolean}>}\n */\nfunction saveAccountAnnotationTags(_x) {\n  return _saveAccountAnnotationTags.apply(this, arguments);\n}\n\n/**\n * Reconcile the card's visible tag chips with the tray, without a repaint.\n *\n * Chips that survive are MOVED rather than rebuilt so the usage counts, the\n * last-updated stamp and any active filter highlight they carry are kept.\n *\n * @param {string} markId encrypted mark id\n * @returns {void}\n */\nfunction _saveAccountAnnotationTags() {\n  _saveAccountAnnotationTags = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().mark(function _callee(markId) {\n    var _collection$dataset$r;\n    var mark, collection, url, body, _FetchHelpers, fetchData, response;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_2___default().wrap(function _callee$(_context10) {\n      while (1) switch (_context10.prev = _context10.next) {\n        case 0:\n          mark = readAccountMark(markId);\n          collection = document.querySelector('[data-paginated-collection]');\n          url = (_collection$dataset$r = collection === null || collection === void 0 ? void 0 : collection.dataset.refreshUrl) !== null && _collection$dataset$r !== void 0 ? _collection$dataset$r : '';\n          if (!(!mark || url === '')) {\n            _context10.next = 5;\n            break;\n          }\n          return _context10.abrupt(\"return\", {\n            success: false\n          });\n        case 5:\n          if (tagTrayFor(markId)) {\n            _context10.next = 7;\n            break;\n          }\n          return _context10.abrupt(\"return\", {\n            success: false\n          });\n        case 7:\n          body = (0,_tags_request__WEBPACK_IMPORTED_MODULE_8__.buildTagsBody)(mark, assignedTagIdsFor(markId));\n          _context10.prev = 8;\n          _FetchHelpers = new _fetch_helpers__WEBPACK_IMPORTED_MODULE_7__[\"default\"](), fetchData = _FetchHelpers.fetchData;\n          _context10.next = 12;\n          return fetchData('POST', url, body, {\n            mutating: true,\n            dataLabel: 'annotations'\n          });\n        case 12:\n          response = _context10.sent;\n          return _context10.abrupt(\"return\", {\n            success: !!(response && response.result && response.result.success)\n          });\n        case 16:\n          _context10.prev = 16;\n          _context10.t0 = _context10[\"catch\"](8);\n          return _context10.abrupt(\"return\", {\n            success: false\n          });\n        case 19:\n        case \"end\":\n          return _context10.stop();\n      }\n    }, _callee, null, [[8, 16]]);\n  }));\n  return _saveAccountAnnotationTags.apply(this, arguments);\n}\nfunction syncAnnotationCardTags(markId) {\n  var _context7, _context8, _context9;\n  var card = annotationCardFor(markId);\n  var chipsHolder = card === null || card === void 0 ? void 0 : card.querySelector('.show-tags');\n  if (!card || !chipsHolder || !tagTrayFor(markId)) return;\n  var existing = new (_babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_6___default())(_babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5___default()(_context7 = (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(chipsHolder.querySelectorAll('.tag'))).call(_context7, function (chip) {\n    var _chip$dataset$id;\n    return [String((_chip$dataset$id = chip.dataset.id) !== null && _chip$dataset$id !== void 0 ? _chip$dataset$id : ''), chip];\n  }));\n  var chips = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_4___default()(_context8 = _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5___default()(_context9 = visibleTrayTags(markId)).call(_context9, function (tag) {\n    var _tag$dataset$tagId2, _existing$get, _tag$dataset$tagText, _tag$dataset$tagColor;\n    var id = String((_tag$dataset$tagId2 = tag.dataset.tagId) !== null && _tag$dataset$tagId2 !== void 0 ? _tag$dataset$tagId2 : '');\n    if (id === '') return null;\n    return (_existing$get = existing.get(id)) !== null && _existing$get !== void 0 ? _existing$get : buildChip(id, (_tag$dataset$tagText = tag.dataset.tagText) !== null && _tag$dataset$tagText !== void 0 ? _tag$dataset$tagText : '', (_tag$dataset$tagColor = tag.dataset.tagColor) !== null && _tag$dataset$tagColor !== void 0 ? _tag$dataset$tagColor : '');\n  })).call(_context8, Boolean);\n  chipsHolder.replaceChildren.apply(chipsHolder, (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(chips));\n}
99\n\n/**\n * A card chip in the shape UserMark::renderCollection emits.\n *\n * @param {string} id\n * @param {string} text\n * @param {string} color\n * @returns {HTMLElement}\n */\nfunction buildChip(id, text, color) {\n  var chip = document.createElement('div');\n  chip.classList.add('tag');\n  if (color) chip.classList.add(color);\n  chip.dataset.id = id;\n  chip.dataset.color = color;\n  chip.dataset.text = text;\n  var span = document.createElement('span');\n  span.dataset.color = color;\n  span.dataset.text = text;\n  span.textContent = text;\n  chip.appendChild(span);\n  return chip;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYW5ub3RhdGlvbnMvYWNjb3VudC10YWctc2F2ZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQUFBO0FBMUJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQVdBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL2Fubm90YXRpb25zL2FjY291bnQtdGFnLXNhdmUuanM/ZjhiOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNhdmluZyB0aGUgdGFncyBvbiBPTkUgYW5ub3RhdGlvbiBmcm9tIHRoZSBhY2NvdW50IEFubm90YXRpb25zIHBhZ2UgKCM0MzY4KS5cbiAqXG4gKiBUaGUgcGFnZSdzIHBlci1hbm5vdGF0aW9uIHRhZyBjb250cm9scyB1c2VkIHRvIHNhdmUgdGhyb3VnaFxuICogYFVzZXJNYXJrcy5pbml0aWFsaXplKClgLCB3aGljaCByZWFkcyBgLnNlY3Rpb24tY29udGVudGAgYW5kIGAuY3VycmVudC1pbmZvYFxuICog4oCUIGVsZW1lbnRzIHRoYXQgbGl2ZSBvbmx5IGluIHRoZSByZWFkZXIncyByZWFkaW5nIGNvbHVtbiBhbmQgYXJlIG5ldmVyXG4gKiBjcmVhdGVkIGF0IHJ1bnRpbWUuIFRoZSBzYXZlIGNvdWxkIG5vdCB3b3JrIHRoZXJlIGF0IGFsbC5cbiAqXG4gKiBUaGUgcmVwbGFjZW1lbnQgaXMgdGhlIHNpbmdsZS1tYXJrIHJlYWQtbW9kaWZ5LXdyaXRlIHRoZSByZWFkZXIgcGFuZWwncyB0YWdcbiAqIHRyYXkgYWxyZWFkeSB1c2VzOiBvbmUgYHRhZ3NgIGFjdGlvbiBwb3N0ZWQgdG8gcmVmcmVzaC1wYWdpbmF0ZWQtbGlzdC5waHAsXG4gKiBhcHBsaWVkIGJ5IFVzZXJNYXJrOjptb2RpZnlNYXJrcyB0aHJvdWdoIHRoZSBzaGFyZWQgbXV0YXRlIGhlbHBlci4gVGhhdFxuICogY2xvc3VyZSBzZXRzIG9ubHkgYFsndGFncyddYCBhbmQgcmV0dXJucyB0aGUgbWFyayBvdGhlcndpc2UgYnl0ZS1pZGVudGljYWwsXG4gKiBzbyB0aGUgbm90ZSBhbmQgdGhlIGNvbG91ciByaWRpbmcgaW5zaWRlIHRoZSBzYW1lIGFubm90YXRpb24gb2JqZWN0IGFyZVxuICogbmV2ZXIgcmV3cml0dGVuLiBOb3RoaW5nIGhlcmUgZXZlciBwb3N0cyBhIG1hcmtzIEFSUkFZIOKAlCB0aGF0IGlzIHRoZVxuICogd2hvbGUtc2VjdGlvbiBzaGFwZSwgYW5kIHRoZSBub3RlLWxvc3MgcmlzayBsaXZlcyB0aGVyZSwgbm90IGhlcmUuXG4gKlxuICogVGhlIHNhdmUgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIHJlcGFpbnQgdGhlIGNvbGxlY3Rpb246IGEgcmVwYWludCB3b3VsZCB0ZWFyXG4gKiBkb3duIHRoZSB0YWcgdHJheSB0aGUgdXNlciBpcyBzdGlsbCB3b3JraW5nIGluLiBUaGUgY2FyZCdzIG93biBjaGlwcyBhcmVcbiAqIHJlY29uY2lsZWQgaW4gcGxhY2UgaW5zdGVhZC5cbiAqL1xuaW1wb3J0IEZldGNoSGVscGVycyBmcm9tICcuLi9mZXRjaC1oZWxwZXJzJztcbmltcG9ydCB7IGJ1aWxkVGFnc0JvZHkgfSBmcm9tICcuL3RhZ3MtcmVxdWVzdCc7XG5cbi8qKlxuICogVGhlIGFubm90YXRpb24gY2FyZCBjYXJyeWluZyBhIG
991hcmsgaWQsIGluIGVpdGhlciBjb2xsZWN0aW9uIHN0eWxlLlxuICpcbiAqIE1hdGNoZWQgYnkgd2Fsa2luZyBgW2RhdGEtYW5ub3RhdGlvbl1gIHJhdGhlciB0aGFuIHdpdGggYW4gYXR0cmlidXRlXG4gKiBzZWxlY3RvcjogdGhlIGlkcyBhcmUgY2lwaGVydGV4dCBhbmQgY2FuIGNhcnJ5IGNoYXJhY3RlcnMgYSBDU1Mgc2VsZWN0b3JcbiAqIHdvdWxkIGhhdmUgdG8gZXNjYXBlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrSWQgZW5jcnlwdGVkIG1hcmsgaWRcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5ub3RhdGlvbkNhcmRGb3IobWFya0lkKSB7XG4gICAgY29uc3Qgd2FudGVkID0gU3RyaW5nKG1hcmtJZCA/PyAnJyk7XG5cbiAgICBpZiAod2FudGVkID09PSAnJykgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFubm90YXRpb25dJyldXG4gICAgICAgIC5maW5kKChjYXJkKSA9PiBjYXJkLmRhdGFzZXQubWFya0lkID09PSB3YW50ZWQpID8/IG51bGw7XG59XG5cbi8qKlxuICogVGhlIHRhZy1tYW5hZ2VtZW50IHRyYXkgZm9yIGEgbWFyaywgdGhlIG9uZSBjcmVhdGVUYWdNYW5hZ2VtZW50Q29udHJvbHNcbiAqIGJ1aWxkcy4gVGhlIHNlcnZlciBhbHNvIHJlbmRlcnMgYSBgW2RhdGEtY29udHJvbHMtZm9yPVwidGFnc1wiXWAgXCJ2aWV3IGFsbFwiXG4gKiBwb3B1cCBrZXllZCBieSBgZGF0YS1yZWZgLCBzbyB0aGUgYGRhdGEtaWRgIG1hdGNoIG1hdHRlcnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmtJZCBlbmNyeXB0ZWQgbWFyayBpZFxuICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XG4gKi9cbmZ1bmN0aW9uIHRhZ1RyYXlGb3IobWFya0lkKSB7XG4gICAgY29uc3Qgd2FudGVkID0gU3RyaW5nKG1hcmtJZCA/PyAnJyk7XG5cbiAgICByZXR1cm4gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWNvbnRyb2xzLWZvcj1cInRhZ3NcIl1bZGF0YS1pZF0nKV1cbiAgICAgICAgLmZpbmQoKHRyYXkpID0+IHRyYXkuZGF0YXNldC5pZCA9PT0gd2FudGVkKSA/PyBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBlbmNyeXB0ZWQgaWRzIHRoZSBgdGFnc2AgYWN0aW9uIG5lZWRzLCByZWFkIG9mZiB0aGUgY2FyZC5cbiAqXG4gKiBgaGlkYCBsaXZlcyBvbmx5IG9uIHRoZSBjYXJkJ3MgZWRpdCBhbmNob3Ig4oCUIHRoZSBzYW1lIHBsYWNlIHRoZSByZWNvbG9yIGFuZFxuICogZGVsZXRlIGFjdGlvbnMgcmVhZCBpdCBmcm9tLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrSWQgZW5jcnlwdGVkIG1hcmsgaWRcbiAqIEByZXR1cm5zIHt7aGlkOiBzdHJpbmcsIHVzZXJNYXJrSWQ6IHN0cmluZywgbWFya0lkOiBzdHJpbmd9fG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQWNjb3VudE1hcmsobWFya0lkKSB7XG4gICAgY29uc3QgY2FyZCA9IGFubm90YXRpb25DYXJkRm9yKG1hcmtJZCk7XG5cbiAgICBpZiAoIWNhcmQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZWRpdCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnVzZXItbWFyay1lZGl0Jyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBoaWQ6IGVkaXQ/LmRhdGFzZXQuaGlkID8/ICcnLFxuICAgICAgICB1c2VyTWFya0lkOiBlZGl0Py5kYXRhc2V0LnVzZXJNYXJrUmVjb3JkSWQgPz8gY2FyZC5kYXRhc2V0LnVzZXJNYXJrUmVjb3JkSWQgPz8gJycsXG4gICAgICAgIG1hcmtJZDogY2FyZC5kYXRhc2V0Lm1hcmtJZCA/PyAnJyxcbiAgICB9O1xufVxuXG4vKipcbiAqIFRoZSB0YWcgaWRzIHRoZSB0cmF5IGN1cnJlbnRseSBhc3NpZ25zIHRvIGEgbWFyay5cbiAqXG4gKiBUaGUgcmVtb3ZlIGhhbmRsZXIgaGlkZXMgYSB0YWcgd2l0aCBgLmhpZGVgIGFuZCBvbmx5IHJlbW92ZXMgdGhlIGVsZW1lbnRcbiAqIG9uY2UgdGhlIHNhdmUgaXMgY29uZmlybWVkLCBzbyBhIGhpZGRlbiB0YWcgaXMgb25lIHRoZSB1c2VyIGp1c3QgdG9vayBvZmYuXG4gKiBUaGUgXCJEZWxldGUgQWxsXCIgY29udHJvbCBpcyBhIGAudGFnYCB0b28gYW5kIGNhcnJpZXMgbm8gdGFnIGlkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrSWQgZW5jcnlwdGVkIG1hcmsgaWRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbmVkVGFnSWRzRm9yKG1hcmtJZCkge1xuICAgIHJldHVybiB2aXNpYmxlVHJheVRhZ3MobWFya0lkKVxuICAgICAgICAubWFwKCh0YWcpID0+IFN0cmluZyh0YWcuZGF0YXNldC50YWdJZCA/PyAnJykpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbi8qKlxuICogVGhlIHRyYXkgdGFncyBhIHNhdmUgc2hvdWxkIHBlcnNpc3Q6IGV2ZXJ5dGhpbmcgbm90IGhpZGRlbiBieSB0aGUgcmVtb3ZlXG4gKiBoYW5kbGVyLCBhbmQgbm90IHRoZSBcIkRlbGV0ZSBBbGxcIiBjb250cm9sLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrSWQgZW5jcnlwdGVkIG1hcmsgaWRcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfVxuICovXG5mdW5jdGlvbiB2aXNpYmxlVHJheVRhZ3MobWFya0lkKSB7XG4gICAgY29uc3QgdHJheSA9IHRhZ1RyYXlGb3IobWFya0lkKTtcblxuICAgIGlmICghdHJheSkgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIFsuLi50cmF5LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leGlzdGluZy10YWdzIC50YWcnKV1cbiAgICAgICAgLmZpbHRlcigodGFnKSA9PiAhdGFnLmNsYXNzTGlzdC5jb250YWlucygnaGlkZScpKVxuICAgICAgICAuZmlsdGVyKCh0YWcpID0+IHRhZy5kYXRhc2V0LnRhZ1R5cGUgIT09ICdkZWxldGUnKTtcbn1cblxuLyoqXG4gKiBQZXJzaXN0IHRoZSB0cmF5J3MgY3VycmVudCB0YWcgYXNzaWdubWVudCBmb3Igb25lIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmtJZCBlbmNyeXB0ZWQgbWFyayBpZFxuICogQHJldHVybnMge1Byb21pc2U8e3N1Y2Nlc3M6IGJvb2xlYW59Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVBY2NvdW50QW5ub3RhdGlvblRhZ3MobWFya0lkKSB7XG4gICAgY29uc3QgbWFyayA9IHJlYWRBY2NvdW50TWFyayhtYXJrSWQpO1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYWdpbmF0ZWQtY29sbGVjdGlvbl0nKTtcbiAgICBjb25zdCB1cmwgPSBjb2xsZWN0aW9uPy5kYXRhc2V0LnJlZnJlc2hVcmwgPz8gJyc7XG5cbiAgICBpZiAoIW1hcmsgfHwgdXJsID09PSAnJykgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcblxuICAgIC8vIFRoZSBwb3N0ZWQgbGlzdCBJUyB0aGUgbmV3IGFzc2lnbm1lbnQg4oCUIHRoZSBzZXJ2ZXIgY2xvc3VyZSByZXBsYWNlc1xuICAgIC8vIGB0YWdzYCB3aG9sZXNhbGUg4oCUIHNvIGEgdHJheSB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBmaW5kIHJlYWRzIGFzIFwibm9cbiAgICAvLyB0YWdzXCIgYW5kIHdvdWxkIGVyYXNlIGV2ZXJ5IHRhZyBvbiB0aGUgYW5ub3RhdGlvbi4gQW4gZW1wdHkgdHJheSB0aGF0XG4gICAgLy8gSVMgcHJlc2VudCBpcyBhIHJlYWwgaW5zdHJ1Y3Rpb24gYW5kIHN0aWxsIHBvc3RzOyBhIG1pc3Npbmcgb25lIGlzIG5vdFxuICAgIC8vIGFuIGluc3RydWN0aW9uIGF0IGFsbCwgc28gaXQgZmFpbHMgbG91ZGx5IGluc3RlYWQgKCM0NDYzKS
995cbiAgICBpZiAoIXRhZ1RyYXlGb3IobWFya0lkKSkgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcblxuICAgIGNvbnN0IGJvZHkgPSBidWlsZFRhZ3NCb2R5KG1hcmssIGFzc2lnbmVkVGFnSWRzRm9yKG1hcmtJZCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBmZXRjaERhdGEgfSA9IG5ldyBGZXRjaEhlbHBlcnMoKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaERhdGEoJ1BPU1QnLCB1cmwsIGJvZHksIHsgbXV0YXRpbmc6IHRydWUsIGRhdGFMYWJlbDogJ2Fubm90YXRpb25zJyB9KTtcblxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiAhIShyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQgJiYgcmVzcG9uc2UucmVzdWx0LnN1Y2Nlc3MpIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgfVxufVxuXG4vKipcbiAqIFJlY29uY2lsZSB0aGUgY2FyZCdzIHZpc2libGUgdGFnIGNoaXBzIHdpdGggdGhlIHRyYXksIHdpdGhvdXQgYSByZXBhaW50LlxuICpcbiAqIENoaXBzIHRoYXQgc3Vydml2ZSBhcmUgTU9WRUQgcmF0aGVyIHRoYW4gcmVidWlsdCBzbyB0aGUgdXNhZ2UgY291bnRzLCB0aGVcbiAqIGxhc3QtdXBkYXRlZCBzdGFtcCBhbmQgYW55IGFjdGl2ZSBmaWx0ZXIgaGlnaGxpZ2h0IHRoZXkgY2FycnkgYXJlIGtlcHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmtJZCBlbmNyeXB0ZWQgbWFyayBpZFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW5jQW5ub3RhdGlvbkNhcmRUYWdzKG1hcmtJZCkge1xuICAgIGNvbnN0IGNhcmQgPSBhbm5vdGF0aW9uQ2FyZEZvcihtYXJrSWQpO1xuICAgIGNvbnN0IGNoaXBzSG9sZGVyID0gY2FyZD8ucXVlcnlTZWxlY3RvcignLnNob3ctdGFncycpO1xuXG4gICAgaWYgKCFjYXJkIHx8ICFjaGlwc0hvbGRlciB8fCAhdGFnVHJheUZvcihtYXJrSWQpKSByZXR1cm47XG5cbiAgICBjb25zdCBleGlzdGluZyA9IG5ldyBNYXAoXG4gICAgICAgIFsuLi5jaGlwc0hvbGRlci5xdWVyeVNlbGVjdG9yQWxsKCcudGFnJyldLm1hcCgoY2hpcCkgPT4gW1N0cmluZyhjaGlwLmRhdGFzZXQuaWQgPz8gJycpLCBjaGlwXSlcbiAgICApO1xuXG4gICAgY29uc3QgY2hpcHMgPSB2aXNpYmxlVHJheVRhZ3MobWFya0lkKVxuICAgICAgICAubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gU3RyaW5nKHRhZy5kYXRhc2V0LnRhZ0lkID8/ICcnKTtcblxuICAgICAgICAgICAgaWYgKGlkID09PSAnJykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZy5nZXQoaWQpID8/IGJ1aWxkQ2hpcChpZCwgdGFnLmRhdGFzZXQudGFnVGV4dCA/PyAnJywgdGFnLmRhdGFzZXQudGFnQ29sb3IgPz8gJycpO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgY2hpcHNIb2xkZXIucmVwbGFjZUNoaWxkcmVuKC4uLmNoaXBzKTtcbn1cblxuLyoqXG4gKiBBIGNhcmQgY2hpcCBpbiB0aGUgc2hhcGUgVXNlck1hcms6OnJlbmRlckNvbGxlY3Rpb24gZW1pdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkQ2hpcChpZCwgdGV4dCwgY29sb3IpIHtcbiAgICBjb25zdCBjaGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY2hpcC5jbGFzc0xpc3QuYWRkKCd0YWcnKTtcblxuICAgIGlmIChjb2xvcikgY2hpcC5jbGFzc0xpc3QuYWRkKGNvbG9yKTtcblxuICAgIGNoaXAuZGF0YXNldC5pZCA9IGlkO1xuICAgIGNoaXAuZGF0YXNldC5jb2xvciA9IGNvbG9yO1xuICAgIGNoaXAuZGF0YXNldC50ZXh0ID0gdGV4dDtcblxuICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgc3Bhbi5kYXRhc2V0LmNvbG9yID0gY29sb3I7XG4gICAgc3Bhbi5kYXRhc2V0LnRleHQgPSB0ZXh0O1xuICAgIHNwYW4udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIGNoaXAuYXBwZW5kQ2hpbGQoc3Bhbik7XG5cbiAgICByZXR1cm4gY2hpcDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/annotations/account-tag-save.js\n");
100
101/***/ }),
102
103/***/ "./resources/js/annotations/manage-tags.js":
104/*!*************************************************!*\
105  !*** ./resources/js/annotations/manage-tags.js ***!
106  \*************************************************/
107/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
108
109eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   addNewTagHandler: () => (/* binding */ addNewTagHandler),\n/* harmony export */   applySortDirectionToSpan: () => (/* binding */ applySortDirectionToSpan),\n/* harmony export */   arrayColumn: () => (/* binding */ arrayColumn),\n/* harmony export */   cancelTagEdit: () => (/* binding */ cancelTagEdit),\n/* harmony export */   changeColorHandler: () => (/* binding */ changeColorHandler),\n/* harmony export */   changeNewTagDivColor: () => (/* binding */ changeNewTagDivColor),\n/* harmony export */   createNewTagDiv: () => (/* binding */ createNewTagDiv),\n/* harmony export */   createSortOptionSpan: () => (/* binding */ createSortOptionSpan),\n/* harmony export */   createTagManagementControls: () => (/* binding */ createTagManagementControls),\n/* harmony export */   currentSuggestedTagsSortProperties: () => (/* binding */ currentSuggestedTagsSortProperties),\n/* harmony export */   findOptionsDivForMark: () => (/* binding */ findOptionsDivForMark),\n/* harmony export */   findTagManagementDivForMark: () => (/* binding */ findTagManagementDivForMark),\n/* harmony export */   handleSortOptionClick: () => (/* binding */ handleSortOptionClick),\n/* harmony export */   initializeTagSessionStorageVariables: () => (/* binding */ initializeTagSessionStorageVariables),\n/* harmony export */   isTagManagementOnReader: () => (/* reexport safe */ _account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.isTagManagementOnReader),\n/* harmony export */   removeAllChildNodes: () => (/* binding */ removeAllChildNodes),\n/* harmony export */   removeSpotlightFromTags: () => (/* reexport safe */ _account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.removeSpotlightFromTags),\n/* harmony export */   removeTagHandler: () => (/* binding */ removeTagHandler),\n/* harmony export */   renderTagsOnOptionsDiv: () => (/* binding */ renderTagsOnOptionsDiv),\n/* harmony export */   saveTags: () => (/* binding */ saveTags),\n/* harmony export */   sortSuggestedTags: () => (/* binding */ sortSuggestedTags),\n/* harmony export */   spotlightTag: () => (/* reexport safe */ _account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.spotlightTag),\n/* harmony export */   tagsSortingFunction: () => (/* reexport safe */ _account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.tagsSortingFunction),\n/* harmony export */   updateTagInOptionsDiv: () => (/* binding */ updateTagInOptionsDiv),\n/* harmony export */   updateTagManagementElements: () => (/* binding */ updateTagManagementElements)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/objectSpread2 */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/objectSpread2.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/typeof */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/typeof.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/toConsumableArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/createForOfIteratorHelper */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/createForOfIteratorHelper.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/slicedToArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find-index */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find-index.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find_index__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find_index__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/from */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_entries__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/entries */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/entries.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_entries__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_entries__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/object/keys */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/includes */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/trim */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/sort */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/sort.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/some */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/filter */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/json/stringify */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_starts_with__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/starts-with */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_starts_with__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_starts_with__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/is-array */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_22__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/index-of */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_23__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_splice__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/splice */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_splice__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_splice__WEBPACK_IMPORTED_MODULE_24__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_25__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/parse-int */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_26__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/slice */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_27__);\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _books_user_marks__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../books/user-marks */ \"./resources/js/books/user-marks.js\");\n/* harmony import */ var _spinner__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../spinner */ \"./resources/js/spinner.js\");\n/* harmony import */ var _utilities_general__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../utilities/general */ \"./resources/js/utilities/general.js\");\n/* harmony import */ var _session_storage__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./session-storage */ \"./resources/js/annotations/session-storage.js\");\n/* harmony import */ var _account_tags_functions__WEBPACK_IMPORTED_MODULE_33__ = 
109__webpack_require__(/*! ../account/tags/functions */ \"./resources/js/account/tags/functions.js\");\n/* harmony import */ var _account_tag_save__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./account-tag-save */ \"./resources/js/annotations/account-tag-save.js\");\n/* harmony import */ var _note_tag_marker__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./note-tag-marker */ \"./resources/js/annotations/note-tag-marker.js\");\n/* harmony import */ var _utilities_i18n__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../utilities/i18n */ \"./resources/js/utilities/i18n.js\");\n/* harmony import */ var _utilities_debug__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../utilities/debug */ \"./resources/js/utilities/debug.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar _createLogger = (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_37__.createLogger)('manage-tags'),\n  log = _createLogger.log;\n\n// The chips an annotation card shows for the tags it already carries. Two\n// markups, one meaning: the reader writes `.tags-wrapper` (renderTagsOnOptionsDiv)\n// and the account Annotations page writes `.show-tags` (UserMark::renderCollection).\n// Matching only the reader's left the account tray empty, and an empty tray is\n// not cosmetic — the save posts what the tray shows, so it would have wiped\n// every tag on the annotation (#4368).\nvar ASSIGNED_TAG_CHIP_SELECTOR = '.tags-wrapper .tag, .show-tags .tag';\n\n// Sensible default sort direction for each suggested-tags sort option.\n// Name reads best ascending (A-Z); recency and usage read best descending\n// (most recent / most used first).\nvar SORT_DEFAULT_DIRECTIONS = {\n  name: 'asc',\n  time: 'desc',\n  usage: 'desc'\n};\n\n// FontAwesome glyph per sort option and direction. Name and time keep a\n// distinct base glyph (letters / size bars) with the arrow direction showing\n// ascending vs descending. Usage uses a rising vs falling chart line\n// (most used / least used).\nvar SORT_ICON_CLASSES = {\n  name: {\
109n    asc: 'fa-arrow-down-a-z',\n    desc: 'fa-arrow-up-a-z'\n  },\n  time: {\n    asc: 'fa-arrow-up-wide-short',\n    desc: 'fa-arrow-down-wide-short'\n  },\n  usage: {\n    asc: 'fa-chart-line-down',\n    desc: 'fa-chart-line'\n  }\n};\n\n// i18n key + English fallback for each sort option and direction tooltip.\nvar SORT_TITLE_KEYS = {\n  name: {\n    asc: ['sort_az', 'Sort A-Z'],\n    desc: ['sort_za', 'Sort Z-A']\n  },\n  time: {\n    asc: ['sort_least_recent', 'Sort by Least Recent'],\n    desc: ['sort_most_recent', 'Sort by Most Recent']\n  },\n  usage: {\n    asc: ['sort_least_used', 'Sort by Least Used'],\n    desc: ['sort_most_used', 'Sort by Most Used']\n  }\n};\n\n/**\n * Render the tags management controls in the DOM.\n *\n * @param event\n * @param {Event} event\n * @param {string} targetPage\n */\nfunction createTagManagementControls(_x, _x2) {\n  return _createTagManagementControls.apply(this, arguments);\n}\n/**\n * Listener to key events; handles 'Enter', 'ArrowLeft', 'ArrowRight'\n * @param event\n * @param inputTextElem\n * @param markId\n */\nfunction _createTagManagementControls() {\n  _createTagManagementControls = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee5(event, targetPage) {\n    var optionsDiv, _optionsDiv$dataset$m, markId, msg, notice, manageTagsArea, inputTextElem, suggestedTagsWrapper, existingTagsWrapper, p, controlsDiv, a, i, marks, markData, userMarkRecordId, tags, annotationWrapper, _annotationWrapper$da, _markId, _annotationWrapper$da2, annotationMarkRecordId, markTagsElements, showUsage, existingTagsArea, textSpan, textCount, denominator, newTagWrapper, tagData, newTagDiv, noticeWrapper, noticeElement, colorControlsElem, sortTitleDiv, sortOptionsDiv, nameSortSpan, suggestedTagsDiv, noneSpan, sortRowDiv;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee5$(_context26) {\n      while (1) switch (_context26.prev = _context26.next) {\n        case 0:\n          /** main tags controls div **/\n          optionsDiv = event.target.closest('.annotation-options');\n          _optionsDiv$dataset$m = optionsDiv.dataset.markId, markId = _optionsDiv$dataset$m === void 0 ? null : _optionsDiv$dataset$m; // guard clause - return if we do not have a mark id to attach to\n          if (markId) {\n            _context26.next = 9;\n            break;\n          }\n          msg = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('error_loading_tag_controls') || 'There was a problem loading the tag management controls for this annotation.';\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_28__.AsyncNotice(msg, 'error');\n          _context26.next = 7;\n          return notice.create({}, true);\n        case 7:\n          notice.remove();\n          return _context26.abrupt(\"return\", null);\n        case 9:\n          /** main div container for the tags management controls **/\n          controlsDiv = document.createElement('div');\n          controlsDiv.setAttribute('data-id', markId);\n          controlsDiv.classList.add('annotation-options');\n          controlsDiv.classList.add('no-actions-top');\n          controlsDiv.setAttribute('data-controls-for', 'tags');\n          controlsDiv.setAttribute('data-initial-open', 'true');\n\n          // 'x' button to close the options div\n          a = document.createElement('a');\n          a.classList.add('close-button');\n          i = document.createElement('i');\n          i.classList.value = 'fas fa-times-circle';\n          i.setAttribute('aria-hidden', 'true');\n          a.appendChild(i);\n\n          // event to hide the options div\n          a.addEventListener('click', function (event) {\n            event.preventDefault();\n            event.stopPropagation();\n            controlsDiv.classList.add('hide');\n          });\n          controlsDiv.append(a);\n\n          // 1st element - existing tags wrapper - markData needed: id, tags (ids)\n\n          if (targetPage === 'reader') {\n            marks = (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.getSectionMarksFromSessionStorage)();\n            markData = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_25___default()(marks).call(marks, function (element) {\n              return _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_26___default()(element.i
109d) === _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_26___default()(markId);\n            });\n            markData.tags = markData.tags ? markData.tags : [];\n          } else {\n            // targetPage === 'annotations'\n            tags = [];\n            annotationWrapper = event.target.closest('[data-annotation]');\n            if (annotationWrapper) {\n              _annotationWrapper$da = annotationWrapper.dataset, _markId = _annotationWrapper$da.markId, _annotationWrapper$da2 = _annotationWrapper$da.userMarkRecordId, annotationMarkRecordId = _annotationWrapper$da2 === void 0 ? null : _annotationWrapper$da2;\n              userMarkRecordId = annotationMarkRecordId;\n              markTagsElements = annotationWrapper.querySelectorAll(ASSIGNED_TAG_CHIP_SELECTOR);\n              if (markTagsElements) {\n                _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(markTagsElements).call(markTagsElements, function (tag) {\n                  var _tag$dataset = tag.dataset,\n                    id = _tag$dataset.id,\n                    color = _tag$dataset.color,\n                    usage = _tag$dataset.usage,\n                    lastUpdated = _tag$dataset.lastUpdated,\n                    text = _tag$dataset.text;\n                  // ensureSensibleValues defaults the display fields and drops\n                  // everything else, `id` included — and the id is the one field the\n                  // save cannot do without, so it is carried across explicitly (#4368).\n                  tags.push((0,_babel_runtime_corejs3_helpers_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({\n                    id: id\n                  }, (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.ensureSensibleValues)({\n                    color: color,\n                    id: id,\n                    lastUpdated: lastUpdated,\n                    text: text,\n                    usage: usage\n                  })));\n                });\n              }\n              markData = {\n                'id': _markId,\n                tags: tags\n              };\n            }\n          }\n\n          // assigned tags label\n          p = document.createElement('p');\n          p.classList.add('title');\n          p.setAttribute('data-label-type', 'assigned');\n          p.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('assigned_tags') || 'Assigned Tags';\n\n          // container with existing tags\n          showUsage = true;\n          existingTagsWrapper = renderExistingTags(markData, 'tags', showUsage);\n          if (markData.tags.length > 4) {\n            createDeleteAllButton(existingTagsWrapper, markData);\n          }\n\n          // wrapper for existing tags area\n          existingTagsArea = document.createElement('div');\n          existingTagsArea.classList.add('add-edit-tag-area');\n          existingTagsArea.appendChild(p);\n          existingTagsArea.appendChild(existingTagsWrapper);\n          controlsDiv.append(existingTagsArea);\n\n          /** tags management area **/\n          manageTagsArea = document.createElement('div');\n          manageTagsArea.classList.add('add-edit-tag-area');\n\n          // 1st element - input field\n          inputTextElem = document.createElement('input');\n          inputTextElem.setAttribute('type', 'text');\n          inputTextElem.setAttribute('data-id', 'tag-input');\n          inputTextElem.setAttribute('placeholder', (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('add_a_tag') || 'Add a tag');\n          inputTextElem.focus();\n\n          /* event handler - text input keyup */\n          inputTextElem.addEventListener('keyup', /*#__PURE__*/function () {\n            var _ref4 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee4(event) {\n              var textCountSpan, noticeDiv, noticeElement, text, _currentSuggestedTags2, sortBy, direction;\n              return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee4$(_context25) {\n                while (1) switch (_context25.prev = _context25.next) {\n                  case 0:\n                    event.preventDefault();\n\n                    // update the text count\n                    textCountSpan = document.querySelector('.text-count span');\n                    noticeDiv = document.querySelector('[data-notice]');\n                    noticeElement = noticeDiv === null || noticeDiv === void 0 ? void 0 : noticeDiv.querySelector('.tm-notice');\n                    text = event.target.value;\n                    if (text.length >
109 50) {\n                      event.target.value = _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_27___default()(text).call(text, 0, 50);\n                    } else {\n                      (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.manageTextCountElement)(text, textCountSpan);\n                      // 'Enter' key handled below\n                      if (event.key !== 'Enter') {\n                        noticeElement.textContent = '';\n                        // const notice = document.querySelector('.tm-notice');\n                        // if(notice && notice.textContent === 'Tag already exists') {\n                        //   return;\n                        // }\n                        _currentSuggestedTags2 = currentSuggestedTagsSortProperties(markId), sortBy = _currentSuggestedTags2.sortBy, direction = _currentSuggestedTags2.direction;\n                        updateTagManagementElements(markId, sortBy, direction, userMarkRecordId);\n                      }\n                    }\n                  case 6:\n                  case \"end\":\n                    return _context25.stop();\n                }\n              }, _callee4);\n            }));\n            return function (_x20) {\n              return _ref4.apply(this, arguments);\n            };\n          }());\n\n          // 2nd element -  Text count\n          textSpan = document.createElement('span');\n          textSpan.innerText = '0';\n          textCount = document.createElement('div');\n          textCount.classList.add('text-count');\n          textCount.appendChild(textSpan);\n          denominator = document.createTextNode('/50');\n          textCount.appendChild(denominator);\n\n          // 3rd element - new tag wrapper\n          newTagWrapper = document.createElement('div');\n          tagData = {\n            color: 'default',\n            id: null,\n            lastUpdated: null,\n            text: '',\n            usage: '0'\n          }; // new tag div\n          newTagDiv = createNewTagDiv(markId, 'new', tagData);\n          newTagWrapper.classList.add('new-tag');\n          newTagWrapper.appendChild(newTagDiv);\n          noticeWrapper = document.createElement('div');\n          noticeWrapper.setAttribute('data-notice', '');\n          noticeWrapper.classList.add('hide');\n          noticeElement = document.createElement('div');\n          noticeElement.classList.add('tm-notice');\n          noticeWrapper.appendChild(noticeElement);\n          newTagWrapper.appendChild(noticeWrapper);\n\n          // 4th element - suggestions area\n          suggestedTagsWrapper = document.createElement('div');\n          suggestedTagsWrapper.classList.add('suggested-tags-wrapper');\n\n          // color controls\n          colorControlsElem = createColorControls(markId); // 1st element - label & sort controls\n          // Sort row Title\n          sortTitleDiv = document.createElement('div');\n          sortTitleDiv.classList.add('auto-cell');\n          p = document.createElement('p');\n          p.classList.add('title');\n          p.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('suggestions') || 'Suggestions';\n          sortTitleDiv.appendChild(p);\n          sortOptionsDiv = document.createElement('div');\n          sortOptionsDiv.classList.add('auto', 'cell', 'sort-options');\n\n          // Sort A-Z icon (active by default)\n          nameSortSpan = createSortOptionSpan('name');\n          nameSortSpan.classList.add('sorted');\n          sortOptionsDiv.appendChild(nameSortSpan);\n\n          // Sort by recency icon\n          sortOptionsDiv.appendChild(createSortOptionSpan('time'));\n\n          // Sort by usage icon\n          sortOptionsDiv.appendChild(createSortOptionSpan('usage'));\n\n          // 2nd element - suggested tags div\n          suggestedTagsDiv = document.createElement('div');\n          suggestedTagsDiv.classList.add('suggested-tags');\n\n          // initial no contents span\n          noneSpan = document.createElement('span');\n          noneSpan.innerHTML = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('no_suggestions') || 'No suggestions.';\n          suggestedTagsDiv.appendChild(noneSpan);\n\n          // Suggested tags title and Sort options\n          sortRowDiv = document.createElement('div');\n          sortRowDiv.classList.add('grid-x');\n          sortRowDiv.appendChild(sortTitleDiv);\n          sortRowDiv.appendChild(sortOptionsDiv);\n          suggestedTagsWrapper.appendChild(sortRowDiv);\n          suggestedTagsWrapper.appendChild(suggestedTagsDiv);\n\n          // add the suggested tags wrapper to the main manage tags div\n          manageTagsArea.appendChild(inputTextElem);\n          manageTagsArea.appendChild(textCount);\n          manageTagsArea.appendChild(newTagWrapper);\n          manageTagsArea.appendChild(colorControlsElem);\n          manageTagsArea.appendChild(suggestedTagsWrapper);\n\n          // manage tags area to main controls div\n          controlsDiv.appendChild(manageTagsArea);\n\n          /*** handle 'Enter' press ***/\n          //\n          // Bound to the TRAY, not to `document` (#4591).\n          //\n          // The document binding was never removed — `removeEventListener` appeared\n          // nowhere in this file — so every tray opened left another global listener\n          // behind, each closing over its own markId. Once those marks were deleted\n          // the orphans threw on every keystroke, and they accumulated per tray open.\n          //\n          // Pairing the add with a remove at each teardown site would work until\n          // someone added a seventh one. Binding here means the handler is collected\n          // with the node, at every removal site including ones not yet written.\n          //\n          // Safe because no interaction this handler serves can start outside the\n          // tray: the add-tag branch is gated on `document.activeElement ===\n          // inputTextElem`, the other Enter branch needs the colour selector focused,\n          // Escape only acts while the colour popup is open, and the arrow keys drive\n          // that same selector — all of which live inside `controlsDiv`.\n          controlsDiv.addEventListener('keyup', function (event) {\n            keyUpListener(event, inputTextElem, markId);\n          });\n          return _context26.abrupt(\"return\", controlsDiv);\n        case 98:\n        case \"end\":\n          return _context26.stop();\n      }\n    }, _callee5);\n  }));\n  return _createTagManagementControls.apply(this, arguments);\n}\nfunction keyUpListener(_x3, _x4, _x5) {\n  return _keyUpListener.apply(this, arguments);\n}\n/**\n * Listener for arrow keys when the tags color palette is visible\n */\nfunction _keyUpListener() {\n  _keyUpListener = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee6(event, inputTextElem, markId) {\n    var _context30;\n    var noticeDiv, noticeElement, markElem, newTagColorsDiv, newTagColorsWrapper, selectedColor, defaultColorElem, _c
109ontext27, _context28, _context29, inputText, existingTags, alreadyAssigned, suggestions, match;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee6$(_context31) {\n      while (1) switch (_context31.prev = _context31.next) {\n        case 0:\n          noticeDiv = document.querySelector('[data-notice]');\n          noticeElement = noticeDiv === null || noticeDiv === void 0 ? void 0 : noticeDiv.querySelector('.tm-notice'); // findMarkElementFor, not getMarkElement: the tray this listener is bound to\n          // hangs off a card on the account Annotations page, where there is no <mark>.\n          // getMarkElement() returned null for every keystroke there, so the guard below\n          // swallowed the whole keyboard path — Enter never opened the colour picker and\n          // a new tag could not be created at all (#4853).\n          markElem = findMarkElementFor(markId); // The mark can be gone — merged away, deleted, re-rendered — while a keystroke\n          // is still in flight (#4591). The guard below covers newTagColorsDiv, and the\n          // two lines after this one already use optional chaining; this line was the\n          // only one left unguarded, and it is the one that threw.\n          if (markElem) {\n            _context31.next = 5;\n            break;\n          }\n          return _context31.abrupt(\"return\");\n        case 5:\n          newTagColorsDiv = markElem.querySelector('[data-color-popup]');\n          newTagColorsWrapper = newTagColorsDiv === null || newTagColorsDiv === void 0 ? void 0 : newTagColorsDiv.querySelector('.tag-colors-wrapper');\n          selectedColor = newTagColorsDiv === null || newTagColorsDiv === void 0 ? void 0 : newTagColorsDiv.querySelector('.selected');\n          if (newTagColorsDiv) {\n            _context31.next = 10;\n            break;\n          }\n          return _context31.abrupt(\"return\");\n        case 10:\n          if (event.key === 'Escape') {\n            if (!newTagColorsDiv.classList.contains('hide')) {\n              selectedColor.classList.remove('selected');\n              defaultColorElem = newTagColorsDiv.querySelector('.tag.default');\n              defaultColorElem.classList.add('selected');\n              newTagColorsDiv.classList.add('hide');\n              inputTextElem.focus();\n            }\n          }\n          if (!(event.key === 'Enter')) {\n            _context31.next = 39;\n            break;\n          }\n          if (!(document.activeElement === inputTextElem)) {\n            _context31.next = 36;\n            break;\n          }\n          inputText = _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_14___default()(_context27 = inputTextElem.value).call(_context27);\n          if (!(inputText.length === 0)) {\n            _context31.next = 19;\n            break;\n          }\n          noticeElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('no_text_entered') || 'No text entered.';\n          noticeElement.classList.remove('hide');\n          noticeDiv.classList.remove('hide');\n          return _context31.abrupt(\"return\");\n        case 19:\n          // fetch fresh existing tags every time 'Enter' is pressed\n          existingTags = markElem.querySelectorAll('.existing-tags .tag');\n          alreadyAssigned = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_25___default()(_context28 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8___default()(existingTags)).call(_context28, function (tag) {\n            var text = tag.dataset.tagText;\n            text = text ? text.toLowerCase() : '[blank]';\n            return text === inputText.toLowerCase();\n          });\n          if (!alreadyAssigned) {\n            _context31.next = 26;\n            break;\n          }\n          noticeElement.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('tag_already_assigned_notice') || 'Tag already assigned.';\n          noticeElement.classList.remove('hide');\n          noticeDiv.classList.remove('hide');\n          return _context31.abrupt(\"return\");
109\n        case 26:\n          // Check suggested tags\n          suggestions = markElem.querySelectorAll('.suggested-tags .tag');\n          match = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_25___default()(_context29 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8___default()(suggestions)).call(_context29, function (tag) {\n            var _tag$dataset$tagText;\n            return ((_tag$dataset$tagText = tag.dataset.tagText) === null || _tag$dataset$tagText === void 0 ? void 0 : _tag$dataset$tagText.toLowerCase()) === inputText.toLowerCase();\n          });\n          if (!match) {\n            _context31.next = 31;\n            break;\n          }\n          match.click();\n          return _context31.abrupt(\"return\");\n        case 31:\n          // No match found → show color picker\n          newTagColorsDiv.classList.remove('hide');\n          if (!newTagColorsWrapper.hasAttribute('tabindex')) {\n            newTagColorsWrapper.setAttribute('tabindex', '0');\n          }\n          newTagColorsWrapper.focus();\n          _context31.next = 39;\n          break;\n        case 36:\n          if (!isTagColorSelectorForMarkVisible(markId)) {\n            _context31.next = 39;\n            break;\n          }\n          _context31.next = 39;\n          return handleTagColorSelectionEnter(event, markId);\n        case 39:\n          if (_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_13___default()(_context30 = ['ArrowLeft', 'ArrowRight']).call(_context30, event.key)) {\n            tagColorSelectorArrowEventHandler(event, markId);\n          }\n        case 40:\n        case \"end\":\n          return _context31.stop();\n      }\n    }, _callee6);\n  }));\n  return _keyUpListener.apply(this, arguments);\n}\nfunction tagColorSelectorArrowEventHandler(event, markId) {\n  var _context;\n  // 'Enter' handled elsewhere\n  if (event.key === 'Enter') {\n    return;\n  }\n\n  // Listen for keyup\n  var colorSelectorWrapper = document.querySelector(\".tag-colors-wrapper[data-mark-id=\\\"\".concat(markId, \"\\\"]\"));\n  var colorSelector = colorSelectorWrapper.closest('.color-selector');\n  var children = colorSelectorWrapper.children;\n\n  // guard clauses\n  if (!(0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.isParentVisible)(colorSelector)) return;\n  // if (!colorSelectorWrapper.contains(document.activeElement)) return;\n\n  // get the current index of teh selected child before handling key\n  var selectedIndex = _babel_runtime_corejs3_core_js_stable_instance_find_index__WEBPACK_IMPORTED_MODULE_7___default()(_context = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8___default()(children)).call(_context, function (child) {\n    return child.classList.contains('selected');\n  });\n\n  // fallback to 0 if none are selected\n  if (selectedIndex === -1) selectedIndex = 0;\n  var newColor = 'default';\n  if (event.key === 'ArrowLeft') {\n    selectedIndex = (selectedIndex - 1 + children.length) % children.length; // wrap around\n    newColor = updateSelectedColorOnTagColorPicker(colorSelectorWrapper, selectedIndex);\n  } else if (event.key === 'ArrowRight') {\n    selectedIndex = (selectedIndex + 1) % children.length; // wrap around\n    newColor = updateSelectedColorOnTagColorPicker(colorSelectorWrapper, selectedIndex);\n  }\n\n  // update the new tag element color\n  var newTagDiv = document.querySelector(_newTagElementSelector(markId));\n  if (newTagDiv) {\n    changeNewTagDivColor(newColor, newTagDiv);\n  }\n}\n\n/**\n * Move the selector bar to the color that is currently selected.\n * @param colorSelector\n * @param index\n */\nfunction updateSelectedColorOnTagColorPicker(colorSelector, index) {\n  var color = 'default';\n  var colorElement = colorSelector.querySelectorAll('.tag');\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(colorElement).call(colorElement, function (elem, i) {\n    if (i === index) {\n      elem.classList.add('selected');\n      elem.focus();\n      color = elem.dataset.tagColor;\n    } else {\n      elem.classList.remove('selected');\n    }\n  });\n  return color;\n}\n\n/**\n * Event handler for 'Enter' key on tag color selection\n * @param event\n * @param markId\n *\n * @returns {Promise<void>}
109\n */\nfunction handleTagColorSelectionEnter(_x6, _x7) {\n  return _handleTagColorSelectionEnter.apply(this, arguments);\n}\n/**\n * Check if the tag color selector for a given mark is visible.\n * @returns {boolean}\n */\nfunction _handleTagColorSelectionEnter() {\n  _handleTagColorSelectionEnter = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee7(event, markId) {\n    var tagManagementDiv;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee7$(_context32) {\n      while (1) switch (_context32.prev = _context32.next) {\n        case 0:\n          tagManagementDiv = findTagManagementDivForMark(markId);\n          _context32.next = 3;\n          return addNewTagHandler(event, tagManagementDiv, 'new');\n        case 3:\n        case \"end\":\n          return _context32.stop();\n      }\n    }, _callee7);\n  }));\n  return _handleTagColorSelectionEnter.apply(this, arguments);\n}\nfunction isTagColorSelectorForMarkVisible(markId) {\n  var tagsColorWrapper = document.querySelector(\".tag-colors-wrapper[data-mark-id=\\\"\".concat(markId, \"\\\"]\"));\n  if (!tagsColorWrapper) {\n    return false;\n  }\n  var colorSelector = tagsColorWrapper.closest('.color-selector');\n  if (!colorSelector) {\n    return false;\n  }\n  var classList = colorSelector.classList;\n  return !classList.contains('hide') && colorSelector.parentElement !== null;\n}\n\n/**\n * Apply a sort direction to a sort-option span: persist it in data-direction,\n * swap the FontAwesome glyph, and set the direction-appropriate tooltip.\n *\n * @param span - the sort-option span element\n * @param sortBy - one of: ('name', 'time', 'usage')\n * @param direction - one of: ('asc', 'desc')\n */\nfunction applySortDirectionToSpan(span, sortBy, direction) {\n  span.dataset.direction = direction;\n  var _SORT_TITLE_KEYS$sort = (0,_babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(SORT_TITLE_KEYS[sortBy][direction], 2),\n    titleKey = _SORT_TITLE_KEYS$sort[0],\n    titleFallback = _SORT_TITLE_KEYS$sort[1];\n  span.setAttribute('title', (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)(titleKey) || titleFallback);\n  var icon = span.querySelector('i');\n  if (icon) {\n    var glyphs = SORT_ICON_CLASSES[sortBy];\n    icon.classList.remove(glyphs.asc, glyphs.desc);\n    icon.classList.add(glyphs[direction]);\n  }\n}\n\n/**\n * Build a suggested-tags sort-option span for the given sort option, wired to\n * the toggle click handler and rendered at its default direction.\n *\n * @param sortBy - one of: ('name', 'time', 'usage')\n * @returns {HTMLSpanElement}\n */\nfunction createSortOptionSpan(sortBy) {\n  var span = document.createElement('span');\n  span.setAttribute('data-sort-by', sortBy);\n  var icon = document.createElement('i');\n  icon.classList.add('fa-solid');\n  span.appendChild(icon);\n  applySortDirectionToSpan(span, sortBy, SORT_DEFAULT_DIRECTIONS[sortBy]);\n  span.addEventListener('click', handleSortOptionClick);\n  return span;\n}\n\n/**\n * Click handler for a suggested-tags sort option. Clicking the currently\n * active option flips its direction (asc<->desc); clicking a different option\n * selects it at its sensible default direction.\n *\n * @param event\n */\nfunction handleSortOptionClick(event) {\n  var _context2;\n  event.preventDefault();\n  var span = event.target;\n  if (span.nodeName.toLowerCase() === 'i') {\n    span = span.closest('[data-sort-by]');\n  }\n  var _span = span,\n    sortBy = _span.dataset.sortBy;\n  var direction;\n  if (span.classList.contains('sorted')) {\n    direction = span.dataset.direction === 'asc' ? 'desc' : 'asc';\n  } else {\n    direction = SORT_DEFAULT_DIRECTIONS[sortBy] || 'asc';\n  }\n  applySortDirectionToSpan(span, sortBy, direction);\n  log(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10___default()(_context2 = \"sort by \".concat(sortBy, \" \")).call(_context2, direction));\n  sortSuggestedTags(span, sortBy, direction);\n}\n\n/**\n * Sort the suggested tags by the option selected.\n * The sortSelectionElement is the sort button clicked on by teh user\n * set the clicked on sort button as active.\n * @param sortSelectionElement\n * @param sortBy - one of: ('name', 'time', 'usage')\n * @param direction - one nof: ('asc', 'desc')\n */\nfunction sortSuggestedTags(sortSelectionElement, sortBy, direction) {\n  // The sort buttons are built into the tray, and the tray carries the mark id\n  // on both surfaces. Reading it off a <mark> ancestor meant every sort click on\n  // the account Annotations page hit the guard below and did nothing (#4853).\n  var tray = sortSelectionElement.closest('[data-controls-for=\"tags\"][data-id]');\n  var markId = tray === null || tray === void 0 ? void 0 : tray.dataset.id;\n\n  // guard clause\n  if (markId === null || markId === undefined) {\n    return;\n  }\n\n  // remove the 'sorted' class from all the sort buttons\n  var sortOptionsWrapper = sortSelectionElement.closest('.sort-options');\n  var sortOptionsElements = sortOptionsWrapper.querySelectorAll('[data-sort-by]');\n  if (sortOptionsElements) {\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(sortOptionsElements).call(sortOptionsElements, function (element) {\n      element.classList.remove('sorted');\n    });\n  }\n\n  // set the target span button as sorted\n  if (sortSelectionElement.nodeName.toLowerCase() === 'i') {\n    sortSelectionElement = sortSelectionElement.closest('[data-sort-by]');\n  }\n  sortSelectionElement.classList.add('sorted');\n\n  // clear the suggested tags area\n  resetSuggestedTags(markId);\n\n  // sort the tags\n  updateTagManagementElements(markId, sortBy, direction);\n}\n\n/**\n * Find a mark in the session storage array, by mark id.\n *\n * @param markId\n * @returns {*}\n */\nfunction findMarkInSession(markId) {\n  var marks = JSON.parse(sessionStorage.getItem('marks'));\n  return (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.findMarkInSectionCollectionInSe
109ssionStorage)(marks, markId);\n}\n\n/**\n * Remove a tag from a mark's variables in session storage.\n * The mark record in 'marks' should be updated.\n *\n * @param markData\n * @param tagText\n */\nfunction removeTagFromMarkInSessionStorage(markData, tagText) {\n  var _context3;\n  // The account Annotations page has no section collection to keep in step —\n  // its marks are never in `sessionStorage['marks']` — so there is nothing to\n  // remove and no mark object to read tags off (#4368).\n  if (!(markData !== null && markData !== void 0 && markData.tags)) {\n    return;\n  }\n  var allMarks = (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.getSectionMarksFromSessionStorage)();\n  var _iterator = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_babel_runtime_corejs3_core_js_stable_instance_entries__WEBPACK_IMPORTED_MODULE_11___default()(_context3 = markData.tags).call(_context3)),\n    _step;\n  try {\n    for (_iterator.s(); !(_step = _iterator.n()).done;) {\n      var _step$value = (0,_babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_step.value, 2),\n        _index = _step$value[0],\n        tag = _step$value[1];\n      if (tagText === tag.text) {\n        markData.tags = removeFirstOccurrenceFromArray(markData.tags, tag);\n        (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.updateMarkInSectionCollectionInSessionStorage)(allMarks, markData);\n      }\n    }\n  } catch (err) {\n    _iterator.e(err);\n  } finally {\n    _iterator.f();\n  }\n}\n\n/**\n * Run a tag mutation with the tag-management popup's busy state owned in ONE\n * place.\n *\n * The overlay (and its spinner) goes up before the mutation and comes down in\n * a `finally`, so no branch of the mutation - an early exit, a failed save, or\n * a thrown error - can leave the popup blocked (#4402). Errors are re-thrown\n * after the teardown: a silent catch here would hide the next defect the same\n * way this one hid.\n *\n * @param markId\n * @param mutate - receives the tag-management div (may be null) and does the work\n * @returns {Promise<*>} whatever `mutate` returns\n */\nfunction withTagMutationOverlay(_x8, _x9) {\n  return _withTagMutationOverlay.apply(this, arguments);\n}\n/**\n * Handler for removing a tag from a mark:\n * - Update session variables\n * - remove the tag element from the tags area\n * - reset the controls to create a new tag\n * - re-renders suggested tags.\n *\n * @param event\n * @param markId\n */\nfunction _withTagMutationOverlay() {\n  _withTagMutationOverlay = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee8(markId, mutate) {\n    var tagManagementElem, overlayId;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee8$(_context33) {\n      while (1) switch (_context33.prev = _context33.next) {\n        case 0:\n          tagManagementElem = findTagManagementDivForMark(markId);\n          overlayId = \"overlay-\".concat(markId);\n          if (tagManagementElem) {\n            (0,_utilities_general__WEBPACK_IMPORTED_MODULE_31__.insertOverlayOnElement)(tagManagementElem, overlayId);\n          }\n          _context33.prev = 3;\n          _context33.next = 6;\n          return mutate(tagManagementElem);\n        case 6:\n          return _context33.abrupt(\"return\", _context33.sent);\n        case 7:\n          _context33.prev = 7;\n          (0,_utilities_general__WEBPACK_IMPORTED_MODULE_31__.removeOverlayOnElement)(overlayId);\n          return _context33.finish(7);\n        case 10:\n        case \"end\":\n          return _context33.stop();\n      }\n    }, _callee8, null, [[3,, 7, 10]]);\n  }));\n  return _withTagMutationOverlay.apply(this, arguments);\n}\nfunction removeTagHandler(_x10, _x11) {\n  return _removeTagHandler.apply(this, arguments);\n}\n/**\n * Reset tags edit mode; close the edit tags div and display the options div.\n * Ensure session variables are reset.\n *\n * @param controlsForTagsElement\n */\nfunction _removeTagHandler() {\n  _removeTagHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee10(event, markId) {\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee10$(_context40) {\n      while (1) switch (_context40.prev = _context40.next) {\n        case 0:\n          event.preventDefault();\n          return _context40.abrupt(\"return\", withTagMutationOverlay(markId, /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee9() {\n            var target, _event$target2, nodeName, parentNode, tagText, deletingAll, assignedTagsElem, allMarks, tagElement, span, text, currentMarkSessionState, markData, _context34, _context35, deleteAllTag, _yield$saveTags, success, _context36, _findMarkInSession, _assignedTagsElem, markObject, _currentSuggestedTags3, sortBy, direction, msg, _context37, _context38, _deleteAllTag, notice;\n            return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee9$(_context39) {\n              while (1) switch (_context39.prev = _context39.next) {\n                case 0:\n                  target = event.target, _event$target2 = event.target, nodeName = _event$target2.nodeName, parentNode = _event$target2.parentNode, tagText = _event$target2.dataset.tagText;\n                  deletingAll = tagText === ((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('delete_all') || 'Delete All'); // guard clause\n                  if (!(markId === null || markId === undefined)) {\n                    _context39.next = 4;\n                    break;\n                  }\n                  return _context39.abrupt(\"return\");\n                case 4:\n                  assignedTagsElem = findExistingTagsDivForMark(markId);\n                  allMarks = (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.getSectionMarksFromSessionStorage)();\n                  tagElement = target;\n                  if (nodeName === 'SPAN') {\n                    text = tagText;\n                    tagElement = parentNode;\n                  } else if (nodeName === 'I') {\n                    span = target.parentElement.querySelector('span');\n                    text = span.dataset.tagText;\n                    tagElement = parentNode;\n                  } else {\n                    span = tagElement.querySelector('span');\n                    text = span.dataset.tagText;\n                  }\n\n                  // save mark state in case we have to revert\n                  currentMarkSessionState = findMarkInSession(markId); // hide tags until result of delete\n                  if (deletingAll) {\n                    markData = findMarkInSession(markId);\n                    if (assignedTagsElem) {\n                      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(_context34 = assignedTagsElem.childNodes).call(_context34, function (tag) {\n                        var _tag$dataset2 = tag.dataset,\n                          text = _tag$dataset2.tagText,\n                          tagType = _tag$dataset2.tagType;\n                        tag.classList.add('hide');\n                        if (tagType !== 'delete') {\n                          var _tagText = text;\n                          if (!_tagText) {\n                            var _tag$querySelector;\n                            _tagText = (_tag$querySelector = tag.querySelector('span')) === null || _tag$querySelector === void 0 ? void 0 : _tag$querySelector.dataset.tagText;\n                          }\n                          removeTagFromMarkInSessionStorage(markD
109ata, _tagText);\n                        }\n                      });\n                    }\n                  } else {\n                    removeTagFromMarkInSessionStorage(currentMarkSessionState, text);\n                    // hide tag\n                    tagElement.classList.add('hide');\n                    // hide 'delete all' when necessary\n                    deleteAllTag = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_25___default()(_context35 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8___default()(assignedTagsElem.childNodes)).call(_context35, function (tag) {\n                      return tag.dataset.tagType === 'delete';\n                    });\n                    if (deleteAllTag && assignedTagsElem.childNodes.length <= 6) {\n                      deleteAllTag.classList.add('hide');\n                    }\n                  }\n\n                  // save removal\n                  _context39.next = 12;\n                  return saveTags(markId);\n                case 12:\n                  _yield$saveTags = _context39.sent;\n                  success = _yield$saveTags.success;\n                  if (!success) {\n                    _context39.next = 20;\n                    break;\n                  }\n                  if (deletingAll) {\n                    if (assignedTagsElem) {\n                      // remove the tag element from the existing tags area\n                      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(_context36 = assignedTagsElem.childNodes).call(_context36, function (tagElement) {\n                        tagElement = assignedTagsElem.childNodes[0];\n                        tagElement.remove();\n                      });\n                    }\n                  } else {\n                    tagElement.remove();\n                    _assignedTagsElem = findExistingTagsDivForMark(markId);\n                    markObject = (_findMarkInSession = findMarkInSession(markId)) !== null && _findMarkInSession !== void 0 ? _findMarkInSession : {\n                      id: markId\n                    };\n                    manageDeleteAllButton(_assignedTagsElem, markObject);\n                  }\n                  _currentSuggestedTags3 = currentSuggestedTagsSortProperties(markId), sortBy = _currentSuggestedTags3.sortBy, direction = _currentSuggestedTags3.direction;\n                  updateTagManagementElements(markId, sortBy, direction);\n                  _context39.next = 28;\n                  break;\n                case 20:\n                  msg = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('error_removing_tag') || 'There was an error removing this tag.'; // Restore session state to pre-removal state\n                  if (currentMarkSessionState) {\n                    (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.updateMarkInSectionCollectionInSessionStorage)(allMarks, currentMarkSessionState);\n                  }\n                  if (deletingAll) {\n                    msg = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('error_removing_all_tags') || 'There was an error removing all the tags on this annotation.';\n                    if (assignedTagsElem) {\n                      // un-hide the tag elements from the existing tags area\n                      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(_context37 = assignedTagsElem.childNodes).call(_context37, function (tagElement) {\n                        tagElement.classList.remove('hide');\n                      });\n                    }\n                  } else {\n                    // un-hide the single tag element\n                    tagElement.classList.remove('hide');\n\n                    // restore 'delete all' button visibility if it was hidden\n                    _deleteAllTag = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_25___default()(_context38 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8___default()(assignedTagsElem.childNodes)).call(_context38, function (tag) {\n                      return tag.dataset.tagType === 'delete';\n                    });\n                    if (_deleteAllTag) {\n                      _deleteAllTag.classList.remove('hide');\n                    }\n                  }\n                  notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_28__.AsyncNotice(msg, 'warning');\n                  if (!notice) {\n                    _context39.next = 28;\n                    break;\n                  }\n                  _context39.next = 27;\n                  return notice.create({}, true);\n                case 27:\n                  notice.remove();\n                case 28:\n                case \"end\":\n                  return _context39.stop();\n              }\n            }, _callee9);\n          }))));\n        case 2:\n        case \"end\":\n          return _context40.stop();\n      }\n    }, _callee10);\n  }));\n  return _removeTagHandler.apply(this, arguments);\n}
109\nfunction cancelTagEdit(controlsForTagsElement) {\n  var markId = controlsForTagsElement.dataset.id;\n  var selector = \"[data-controls-for=\\\"annotation\\\"][data-id=\\\"\".concat(markId, \"\\\"]\");\n  var annotationControls = document.querySelector(selector);\n\n  // reset the new tag controls\n  var markElem = getMarkElement(markId);\n  cancelNewTagCreation(markElem);\n  controlsForTagsElement.classList.add('hide');\n  if (annotationControls) {\n    annotationControls.classList.remove('hide');\n  }\n\n  // The defensive \"ensure spinner is removed\" sweep that used to live here has\n  // been dropped (#4402). It looked for `.save-tag` as a CLASS, while Spinner\n  // marks its box with `data-name=\"save-tag\"`, so it never matched anything -\n  // and it dereferenced getMarkElement() without a null check. saveTags() now\n  // removes that spinner in a `finally`, which is the only owner it needs.\n}\n\n/**\n * Clear tag text input and hide new tag control.\n *\n * @param markElem\n */\nfunction cancelNewTagCreation(markElem) {\n  // clear and hide new tag control\n  var newTagElem = getNewTagDiv(markElem);\n  newTagElem.querySelector('span').innerText = '';\n  newTagElem.classList.add('hide');\n\n  // reset new tag control color\n  updateColorOnElement(newTagElem, 'default');\n\n  // clear text input\n  document.querySelector('.add-edit-tag-area input').value = '';\n\n  // reset suggested tags\n  var _markElem$dataset = markElem.dataset,\n    _markElem$dataset$mar = _markElem$dataset.markId,\n    markId = _markElem$dataset$mar === void 0 ? null : _markElem$dataset$mar,\n    _markElem$dataset$id = _markElem$dataset.id,\n    id = _markElem$dataset$id === void 0 ? null : _markElem$dataset$id;\n  markId = markId !== null && markId !== void 0 ? markId : id;\n  resetSuggestedTags(markId);\n\n  // session storage management\n  sessionStorage.removeItem('current-mark-new-tag-text-count');\n  sessionStorage.removeItem('filtered-tags');\n}\n\n/**\n * returns the color keys or words used to represent the tag color options.\n *\n * @returns {string[]}\n */\nfunction colorWords() {\n  var _context4;\n  return _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10___default()(_context4 = ['default']).call(_context4, _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_12___default()((0,_utilities_general__WEBPACK_IMPORTED_MODULE_31__.appColors)()));\n}\n\n/**\n * Find color class in an element's classList. If not found, returns false.\n *\n * @param classList\n * @returns {*|boolean}\n */\nfunction findColorClassInClassList(classList) {\n  var _iterator2 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_babel_runtime_corejs3_core_js_stable_instance_entries__WEBPACK_IMPORTED_MODULE_11___default()(classList).call(classList)),\n    _step2;\n  try {\n    for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n      var _context5;\n      var _step2$value = (0,_babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_step2.value, 2),\n        _index = _step2$value[0],\n        aClass = _step2$value[1];\n      if (_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_13___default()(_context5 = colorWords()).call(_context5, aClass)) {\n        return aClass;\n      }\n    }\n  } catch (err) {\n    _iterator2.e(err);\n  } finally {\n    _iterator2.f();\n  }\n  return false;\n}\n\n/**\n * Swap out the color edit controls with event handlers targeting the correct element\n * (new tag , or existing tag).\n *\n */\nfunction changeTagColorControls(markId) {\n  var tagColors = document.querySelector('[data-color-popup]');\n\n  // update color controls - swap color controls back to new tag element\n  var newTagColors = createColorControls(markId);\n\n  // Change color controls to modify the selected tag\n  tagColors.replaceWith(newTagColors);\n  tagColors.classList.add('hide');\n}\n\n/**\n * Renders the controls to change the selected color for a tag.\n * The target can be either the new tag element or an existing tag element.\n * @param markId\n * @returns {HTMLDivElement}\n */\nfunction createColorControls(markId) {\n  var wrapper = document.createElement('div');\n  wrapper.classList.add('color-selector', 'hide');\n  wrapper.setAttribute('data-color-popup', '');\n\n  // 1st element - section label\n  var p = document.createElement('p');\n  p.classList.add('directive');\n  p.setAttribute('data-tag-colors-label', '');\n  p.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('select_tag_color') || 'Select tag color:';\n  wrapper.appendChild(p);\n  // 2nd element - color controls\n  var newTagColors = document.createElement('div');\n  newTagColors.classList.add('tag-colors-wrapper');\n  newTagColors.setAttribute('data-mark-id', markId);\n\n  //TODO: fetch colors from site variables\n  var _iterator3 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(colorWords()),\n    _step3;\n  try {\n    for (_iterator3.s();
109 !(_step3 = _iterator3.n()).done;) {\n      var color = _step3.value;\n      var colorChangeElem = document.createElement('div');\n      if (color === 'default') {\n        colorChangeElem.classList.add('selected');\n      }\n      colorChangeElem.classList.add('tag');\n      colorChangeElem = updateColorOnElement(colorChangeElem, color);\n\n      // event handler - change tag color - if we just edited an existing tag,\n      // target element should be changed back\n      colorChangeElem.addEventListener('pointerup', /*#__PURE__*/function () {\n        var _ref = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee(event) {\n          var tagManagementDiv, newTag;\n          return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee$(_context6) {\n            while (1) switch (_context6.prev = _context6.next) {\n              case 0:\n                event.preventDefault();\n                tagManagementDiv = findTagManagementDivForMark(markId);\n                newTag = document.querySelector('.new-tag .tag'); // const { dataset: { tagColor } } = event.target;\n                // const wrapper = document.querySelector('.tag-colors-wrapper');\n                changeColorHandler(event);\n                // wrapper.querySelector(`[data-tag-color=${tagColor}]`);\n\n                // const mark = event.target.closest('mark');\n                _context6.next = 6;\n                return addNewTagHandler(event, tagManagementDiv, 'new');\n              case 6:\n              case \"end\":\n                return _context6.stop();\n            }\n          }, _callee);\n        }));\n        return function (_x12) {\n          return _ref.apply(this, arguments);\n        };\n      }());\n      newTagColors.appendChild(colorChangeElem);\n    }\n\n    // new tag color selector controls\n  } catch (err) {\n    _iterator3.e(err);\n  } finally {\n    _iterator3.f();\n  }\n  wrapper.appendChild(newTagColors);\n  return wrapper;\n}\n\n/**\n * Named handler for changing color of a target element.\n * Changes the color of the target element based on the event target's set color.\n * Also sorts suggestions by the given color\n *\n * @param event\n */\nfunction changeColorHandler(event) {\n  var _context7;\n  event.preventDefault();\n  var target = event.target;\n  var wrapper = target.closest('[data-controls-for=\"tags\"]');\n  var markId = wrapper.dataset.id;\n  // Scoped to the tray, not to a <mark>: the new-tag element is built into the\n  // tray itself, and the account Annotations page renders an annotation as a\n  // card with no <mark> anywhere on it, so `closest('mark')` returned null and\n  // this line threw (#4853). The tray is also the tighter scope in the reader —\n  // a multi-parent highlight paints one <mark> per block, and only one of them\n  // carries the tray.\n  var newTagDiv = wrapper.querySelector(_newTagElementSelector(markId));\n  var tagColor = detectNewColor(event, newTagDiv);\n  if (newTagDiv) {\n    changeNewTagDivColor(tagColor, newTagDiv);\n  }\n  var tagText = _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_14___default()(_context7 = newTagDiv.innerText).call(_context7);\n\n  // `text` and `color`, not `tagText`/`tagColor`: both consumers below read a\n  // tag object's own keys, so the old shape matched nothing and the recolour\n  // was a no-op on either surface (#4853).\n  var tagData = {\n    text: tagText,\n    color: tagColor\n  };\n  var tagType = newTagDiv.dataset.tagType;\n  var markData = findMarkInSession(markId);\n  if (tagType === 'existing') {\n    changeTagColorInMark(markData, tagData);\n    updateTagInOptionsDiv(markId, tagData);\n  }\n\n  // The account Annotations page keeps no section collection — its marks are\n  // never in `sessionStorage['marks']` — so there is no mark object to write\n  // back, and indexOfMarkInSession() dereferences the one it is handed (#4853).\n  // Same reasoning as removeTagFromMarkInSessionStorage() (#4368): the card's\n  // save reads the tray, not the session.\n  if (markD
109ata) {\n    var allMarks = (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.getSectionMarksFromSessionStorage)();\n    (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.updateMarkInSectionCollectionInSessionStorage)(allMarks, markData);\n  }\n  var _currentSuggestedTags = currentSuggestedTagsSortProperties(markId),\n    sortBy = _currentSuggestedTags.sortBy,\n    direction = _currentSuggestedTags.direction;\n  updateTagManagementElements(markId, sortBy, direction);\n}\n\n/**\n * Tag color can either be selected by clicking on a color selector or with the arrow keys then pressing\n * 'Enter'. When selecting the color by clicking, we grab the color from the event target\n * @param event\n * @param newTagDiv\n * @returns {string}\n */\nfunction detectNewColor() {\n  var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n  var newTagDiv = arguments.length > 1 ? arguments[1] : undefined;\n  var color = 'default';\n\n  // attempt to fetch new color from event target (color selector div clicked)\n  if (event) {\n    var _event$target = event.target,\n      classList = _event$target.classList,\n      tagName = _event$target.tagName,\n      tagColor = _event$target.dataset.tagColor;\n    if (tagName === 'DIV' && classList.contains('tag') && tagColor) {\n      color = tagColor;\n    }\n  } else {\n    // get the color of the new tag element\n    var _tagColor = newTagDiv.dataset.tagColor;\n    color = _tagColor;\n  }\n  return color;\n}\n\n/**\n * Update a tag div element's color - both the class and data attribute.\n * If no previousColor is given, it checks the classList to see if a color exists.\n *\n * @param element\n * @param newColor\n * @param previousColor\n */\nfunction updateColorOnElement(element, newColor) {\n  var previousColor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n  // ensure there is no color class in the classList\n  if (!previousColor) {\n    var _iterator4 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(colorWords()),\n      _step4;\n    try {\n      for (_iterator4.s();
109 !(_step4 = _iterator4.n()).done;) {\n        var color = _step4.value;\n        if (element.classList.contains(color)) {\n          previousColor = color;\n          break;\n        }\n      }\n    } catch (err) {\n      _iterator4.e(err);\n    } finally {\n      _iterator4.f();\n    }\n  }\n  element.dataset.tagColor = newColor;\n  if (previousColor) {\n    element.classList.replace(previousColor, newColor);\n  } else if (newColor) {\n    element.classList.add(newColor);\n  }\n  return element;\n}\n\n/**\n * Save updated tag data for mark to the database.\n *\n * Two surfaces share this function and they do not share a save path (#4368).\n * The reader body persists the WHOLE section through UserMarks, which reads\n * `.section-content`, `.current-info` and `sessionStorage['marks']`. The\n * account Annotations page has none of those, so it takes the single-mark\n * `tags` read-modify-write instead (#4463), posted to the same\n * refresh-paginated-list.php its recolor, delete and note actions already\n * use. That action touches only this mark's `tags` and leaves the note and\n * colour riding inside the same annotation object byte-identical.\n *\n * @param markId\n * @returns {Promise<Object>}\n */\nfunction saveTags(_x13) {\n  return _saveTags.apply(this, arguments);\n}\n/**\n * Persist the mark's tags and reflect the saved state in session storage and\n * in the marks' options divs. Called only by saveTags(), which owns the\n * spinner around it.\n *\n * @param markId\n * @returns {Promise<Object>} the save response\n */\nfunction _saveTags() {\n  _saveTags = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee11(markId) {\n    var spinner;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee11$(_context41) {\n      while (1) switch (_context41.prev = _context41.next) {\n        case 0:\n          spinner = new _spinner__WEBPACK_IMPORTED_MODULE_30__.Spinner('save-tag', '[data-controls-for=\"tags\"] .close-button', 'afterend', false);\n          spinner.add();\n          _context41.prev = 2;\n          _context41.next = 5;\n          return saveTagsForMark(markId);\n        case 5:\n          return _context41.abrupt(\"return\", _context41.sent);\n        case 6:\n          _context41.prev = 6;\n          _context41.next = 9;\n          return spinner.remove();\n        case 9:\n          return _context41.finish(6);\n        case 10:\n        case \"end\":\n          return _context41.stop();\n      }\n    }, _callee11, null, [[2,, 6, 10]]);\n  }));\n  return _saveTags.apply(this, arguments);\n}\nfunction saveTagsForMark(_x14) {\n  return _saveTagsForMark.apply(this, arguments);\n}\n/**\n * Handler to add a new  tag. Created the tag div and adds it to the DOM.\n * Clears the 'filtered-tags' session storage variable.\n *\n * @param event\n * @param tagManagementDiv\n * @param tagType\n */\nfunction _saveTagsForMark() {\n  _saveTagsForMark = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee12(markId) {\n    var accountResult, notice, mark, tagsOnly, u, result, allMarks, markElem, optionsWrapper, _iterator11, _step11, _loop2, _notice;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee12$(_context43) {\n      while (1) switch (_context43.prev = _context43.next) {\n        case 0:\n          if (!(0,_account_tag_save__WEBPACK_IMPORTED_MODULE_34__.annotationCardFor)(markId)) {\n            _context43.next = 13;\n            break;\n          }\n          _context43.next = 3;\n          return (0,_account_tag_save__WEBPACK_IMPORTED_MODULE_34__.saveAccountAnnotationTags)(markId);\n        case 3:\n          accountResult = _context43.sent;\n          if (!accountResult.success) {\n            _context43.next = 8;\n            break;\n          }\n          (0,_account_tag_save__WEBPACK_IMPORTED_MODULE_34__.syncAnnotationCardTags)(markId);\n          _context43.next = 12;\n          break;\n        case 8:\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_28__.AsyncNotice((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('error_saving_tags') || 'There was an error saving your tags.', 'error');\n          _context43.next = 11;\n          return notice.create({}, true);\n        case 11:\n          notice.remove();\n        case 12:\n          return _context43.abrupt(\"return\", accountResult);\n        case 13:\n          mark = findMarkInSession(markId);\n          tagsOnly = true;\n          u = new _books_user_marks__WEBPACK_IMPORTED_MODULE_29__[\"default\"]();\n          u.initialize(tagsOnly);\n          _context43.next = 19;\n          return u.saveMarks([mark]);\n        case 19:\n          result = _context43.sent;
109\n          if (!result.success) {\n            _context43.next = 43;\n            break;\n          }\n          // update user tags list\n          if (result.tags) {\n            sessionStorage.setItem('userTags', _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_20___default()(result.tags));\n          }\n\n          // update marks collection\n          allMarks = (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.getSectionMarksFromSessionStorage)(); // update tags on optionsDivs\n          //\n          // A 'tagsOnly' save returns the WHOLE section's marks, not just the one\n          // saved (src/books/fetch/marks.php). Stored annotations that never\n          // rendered - a failed anchor, a queued mark, a stale content id - have no\n          // `mark[data-id]` in the DOM, so `getMarkElement()` returns null for them.\n          // Dereferencing that null threw out of here and stranded both the popup\n          // overlay and this spinner (#4402). Nothing to re-render, so skip it.\n          _iterator11 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(result.marks);\n          _context43.prev = 24;\n          _loop2 = /*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _loop2() {\n            var mark, wrappers;\n            return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _loop2$(_context42) {\n              while (1) switch (_context42.prev = _context42.next) {\n                case 0:\n                  mark = _step11.value;\n                  (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.updateMarkInSectionCollectionInSessionStorage)(allMarks, mark);\n                  markElem = getMarkElement(mark.id);\n                  if (markElem) {\n                    _context42.next = 6;\n                    break;\n                  }\n                  log(\"saveTags: mark \".concat(mark.id, \" is not painted in this section - skipping its options div\"));\n                  return _context42.abrupt(\"return\", 1);\n                case 6:\n                  // Gutter note/tag marker (#4466): keep the reader's margin icons in step\n                  // with the tags just saved, so adding the first tag or removing the last\n                  // one shows up without a page refresh. applyNoteTagMarker() clears any\n                  // existing marker for the id first and returns null when the mark has\n                  // neither a note nor tags, so this one call covers both directions and\n                  // leaves a note-only mark's icon alone.\n                  // reflow: the saved mark may have gained its first tag next to a\n                  // line-mate that already has an icon, which needs the line regrouped.\n                  (0,_note_tag_marker__WEBPACK_IMPORTED_MODULE_35__.applyNoteTagMarker)(document, mark, {\n                    reflow: true\n                  });\n\n                  // A multi-parent highlight renders as one <mark> PER BLOCK, and each\n                  // segment carries its own options div with the same data-mark-id. Using\n                  // getMarkElement()'s single element refreshed the chips on one segment\n                  // only, so the other segments of the same annotation showed stale tags\n                  // until a reload (#4470 QC).\n                  wrappers = document.querySelectorAll(\"[data-controls-for=\\\"annotation\\\"][data-mark-id=\\\"\".concat(String(mark.id).replace(/[\"\\\\]/g, '\\\\$&'), \"\\\"] .other-options-wrapper\"));\n                  if (wrappers.length > 0) {\n                    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(wrappers).call(wrappers, function (wrapper) {\n                      return renderTagsOnOptionsDiv(mark, wrapper);\n                    });\n                  } else {\n                    // Fallback for a popup built without the attribute: better one segment\n                    // refreshed than none.\n                    optionsWrapper = markElem.querySelector('[data-controls-for=\"annotation\"] .other-options-wrapper');\n                    if (optionsWrapper) {\n                      renderTagsOnOptionsDiv(mark, optionsWrapper);\n                    }\n                  }\n                case 9:\n                case \"end\":\n                  return _context42.stop();\n              }\n            }, _loop2);\n          });\n          _iterator11.s();\n        case 27:\n          if ((_step11 = _iterator11.n()).done) {\n            _context43.next = 33;\n            break;\n          }\n          return _context43.delegateYield(_loop2(), \"t0\", 29);\n        case 29:\n          if (!_context43.t0) {\n            _context43.next = 31;\n            break;\n          }\n          return _context43.abrupt(\"continue\", 31);\n        case 31:\n          _context43.next = 27;\n          break;\n        case 33:\n          _context43.next = 38;\n          break;\n        case 35:\n          _context43.prev = 35;\n          _context43.t1 = _context43[\"catch\"](24);\n          _iterator11.e(_context43.t1);\n        case 38:\n          _context43.prev = 38;\n          _iterator11.f();\n          return _context43.finish(38);\n        case 41:\n          _context43.next = 47;\n          break;\n        case 43:\n          _notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_28__.AsyncNotice((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('error_saving_tags') || 'There was an error saving your tags.', 'error');\n          _context43.next = 46;\n          return _notice.create({}, true);\n        case 46:\n          _notice.remove();\n        case 47:\n          return _context43.abrupt(\"return\", result);\n        case 48:\n        case \"end\":\n          return _context43.stop();\n      }\n    }, _callee12, null, [[24, 35, 38, 41]]);\n  }));\n  return _saveTagsForMark.apply(this, arguments);\n}
109\nfunction addNewTagHandler(_x15, _x16, _x17) {\n  return _addNewTagHandler.apply(this, arguments);\n}\n/**\n * Update tag color in mark tag.\n *\n * @param markData\n * @param tag\n */\nfunction _addNewTagHandler() {\n  _addNewTagHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee15(event, tagManagementDiv, tagType) {\n    var _newTag$dataset2, _Array$from$find, _context44;\n    var mark, existingTags, markId, userMarkRecordId, id, _tagManagementDiv$clo, userHighlight, _userHighlight$datase, _id, markRecordId, newTag, _ref6, _ref6$tagText, tagText, alreadyAdded;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee15$(_context47) {\n      while (1) switch (_context47.prev = _context47.next) {\n        case 0:\n          event.preventDefault();\n          mark = tagManagementDiv.closest('mark'); // The account Annotations page has no <mark> to hang the tray off — its\n          // annotations are cards. Both surfaces do carry the tray itself, so the\n          // already-added check reads the assigned tags from there instead (#4368).\n          existingTags = (mark !== null && mark !== void 0 ? mark : tagManagementDiv).querySelectorAll('.existing-tags .tag'); // TODO: Update to manage diff bet. reader / annotations page requests (user userMarkRecordId)\n          // tag details - handle requests from the reader or the annotations page\n          // Resolved BEFORE the new-tag lookup below: createNewTagDiv keys that\n          // element on the mark id, which off the account page's card is not\n          // `mark.dataset.id` — there is no <mark> there at all (#4368).\n          markId = null;\n          if (mark) {\n            id = mark.dataset.id;\n            markId = id;\n          } else {\n            // Anchored on the tray, not on the event target: for a suggested tag the\n            // click handler runs changeColorHandler() first, which re-renders the\n            // suggestions list, so the clicked element is already detached from the\n            // card by the time this runs and `closest()` finds nothing (#4853).\n            userHighlight = (_tagManagementDiv$clo = tagManagementDiv.closest('.user-highlight')) !== null && _tagManagementDiv$clo !== void 0 ? _tagManagementDiv$clo : event.target.closest('.user-highlight');\n            if (userHighlight) {\n              _userHighlight$datase = userHighlight.dataset, _id = _userHighlight$datase.markId, markRecordId = _userHighlight$datase.userMarkRecordId;\n              markId = _id;\n              userMarkRecordId = markRecordId;\n            }\n          }\n\n          // Keyed on the new-tag element's own data-mark-id handle, not on its\n          // data-tag-id. createNewTagDiv used to overwrite data-tag-id with the mark id\n          // purely so this lookup would find it, which made assignedTagIdsFor() post a\n          // MARK id where a tag id belongs (#4853). _newTagElementSelector is the same\n          // handle the colour handler and the arrow keys already use.\n          newTag = document.querySelector(_newTagElementSelector(markId));\n          _ref6 = (_newTag$dataset2 = newTag === null || newTag === void 0 ? void 0 : newTag.dataset) !== null && _newTag$dataset2 !== void 0 ? _newTag$dataset2 : {}, _ref6$tagText = _ref6.tagText, tagText = _ref6$tagText === void 0 ? null : _ref6$tagText;\n          alreadyAdded = (_Array$from$find = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_25___default()(_context44 = _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8___default()(existingTags)).call(_context44, function (tag) {\n            return tag.dataset.tagText === tagText;\n          })) !== null && _Array$from$find !== void 0 ? _Array$from$find : false; // exit if tag is already added\n          if (!alreadyAdded) {\n            _context47.next = 10;\n            break;\n          }\n          return _context47.abrupt(\"return\");\n        case 10:\n          return _context47.abrupt(\"return\", withTagMutationOverlay(markId, /*#__PURE__*/function () {\n            var _ref7 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee14(tagManagementElem) {\n              var targetElement, markElem, _targetElement, _targetElement$datase, color, id, lastUpdated, usage, text, tag, alreadyAddedTag, _currentSuggestedTags4, sortBy, direction, _findMarkInSession2, tagElement, i, tagSpan, assignedTagsElem, deleteButton, currentTags, markObject, marks, markData, markDataCopy, _yield$saveTags2, success, newTagColor, _markElem, _currentSuggestedTags5, _sortBy, _direction, msg, notice, textInput;\n              return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee14$(_context46) {\n                while (1) switch (_context46.prev = _context46.next) {\n                  case 0:\n                    if (tagType === 'new') {\n                      markElem = findMarkElementFor(markId);\n                      targetElement = getNewTagDiv(markElem);\n                      targetElement.removeAttribute('data-current-color');\n                    } else {\n                      targetElement = event.target;\n                      if (!userMarkRecordId && targetElement.nodeName === 'SPAN') {\n                        targetElement = event.target.parentElement;\n                      }\n                    }\n\n                    // tag object\n                    _targetElement = targetElement, _targetElement$datase = _targetElement.dataset, color = _targetElement$datase.tagColor, id = _targetElement$datase.tagId, lastUpdated = _targetElement$datase.tagLastUpdated, usage = _targetElement$datase.tagUsage, text = _targetElement$datase.tagText;\n                    tag = {\n                      id: id,\n                      text: text,\n                      color: color,\n                      lastUpdated: lastUpdated,\n                      usage: usage\n                    };\n                    alreadyAddedTag = findTagInExistingTags(markId, text, color);\n                    if (!alreadyAddedTag) {\n                      _context46.next = 10;\n                      break;\n                    }\n                    // spotlight tag in assigned tags area\n                    (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.spotlightTag)(alreadyAddedTag);\n                    _currentSuggestedTags4 = currentSuggestedTagsSortProperties(markId), sortBy = _currentSuggestedTags4.sortBy, direction = _currentSuggestedTags4.direction;\n                    updateTagManagementElements(markId, sortBy, direction);\n                    _context46.next = 58;\n                    break;\n                  case 10:\n                    (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.removeSpotlightFromTags)();\n\n                    /** add tag to UI **/\n\n                    // button to remove\n                    i = document.createElement('i');\n                    i.classList.add('fa-solid', 'fa-xmark');\n                    tagElement = document.createElement('div');\n                    tagElement.classList.add('tag', color);\n                    tagElement.setAttribute('data-tag-type', 'existing');\n                    tagElement.setAttribute('data-tag-text', text);\n                    // data-tag-id matches what renderExistingTags writes, so a tag that was\n                    // just added is indistinguishable from one that was already there. The\n                    // account page's save reads the tray, and without this the new tag would\n                    // be posted as if it had never been added (#4368).\n                    if (id) {\n                      tagElement.setAttribute('data-tag-id', id);\n                    }\n                    // The MARK id: insertAlphabetically() resolves the assigned-tags div from\n                    // this attribute when the tray is empty, so a tag id here made adding the\n                    // first tag fail. It only ever worked because data-tag-id and data-mark-id\n                    // both carried the mark id (#4853).\n                    tagElement.setAttribute('data-mark-id', markId);\n                    tagElement.setAttribute('title', \"Usage: \".concat(usage));\n                    tagElement = updateColorOnElement(tagElement, color);\n                    tagSpan = document.createElement('span');\n                    tagSpan.setAttribute('data-tag-text', text);\n                    tagSpan.setAttribute('data-tag-color', color);\n                    tagSpan.textContent = text;\n                    tagElement.appendChild(tagSpan);\n                    tagElement.appendChild(i);\n\n                    // delete handler - editing an existing tag\n                    tagElement.addEventListener('click', /*#__PURE__*/function () {\n                      var _ref8 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee13(event) {\n                        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee13$(_context45) {\n                          while (1) switch (_context45.prev = _context45.next) {\n                            case 0:\n                              _context45.next = 2;\n                              return removeTagHandler(event, markId);\n                            case 2:\n                            case \"end\":\n                              return _context45.stop();\n                          }\n                        }, _callee13);\n                      }));\n                      return function (_x22) {\n                        return _ref8.apply(this, arguments);\n                      };\n                    }());\n\n                    // add to tags div\n                    assignedTagsElem = findExistingTagsDivForMark(markId);\n                    deleteButton = assignedTagsElem.querySelector('[data-tag-type=\"delete\"]');\n                    if (deleteButton) {\n                      deleteButton.insertAdjacentElement('beforebegin', tagElement);\n                    } else {\n                      // loop through existing tags, insert tag at sorted position\n                      currentTags = assignedTagsElem.querySelectorAll('.tag');\n                      insertAlphabetically(currentTags, tagElement);\n                    }\n                    markObject = (_findMarkInSession2 = findMarkInSession(markId)) !== null && _findMarkInSession2 !== void 0 ? _findMarkInSession2 : {\n                      id: markId\n                    };\n                    manageDeleteAllButton(assignedTagsElem, markObject);\n\n                    // find mark in session storage. The account Annotations page keeps no\n                    // section collection, so there is no mark to update there and the whole\n                    // bookkeeping block is skipped (#4368).\n                    marks = JSON.parse(sessionStorage.getItem('marks'));\n                    markData = (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.findMarkInSectionCollectionInSe
109ssionStorage)(marks, markId);\n                    markDataCopy = markData ? _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_20___default()(markData) : null;\n                    if (markData) {\n                      // add tag to mark details\n                      if (markData.tags) {\n                        markData.tags.push(tag);\n                      } else {\n                        markData.tags = [tag];\n                      }\n\n                      // update mark in session\n                      (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.updateMarkInSectionCollectionInSessionStorage)(marks, markData);\n                    }\n                    _context46.next = 39;\n                    return saveTags(markId);\n                  case 39:\n                    _yield$saveTags2 = _context46.sent;\n                    success = _yield$saveTags2.success;\n                    if (!success) {\n                      _context46.next = 52;\n                      break;\n                    }\n                    // update session variables\n                    initializeTagSessionStorageVariables(markId);\n\n                    // change back the color controls to focus on the new tag element\n                    changeTagColorControls(markId);\n\n                    // clear color on new tag element\n                    newTagColor = findColorClassInClassList(targetElement.classList);\n                    updateColorOnElement(targetElement, newTagColor, 'default');\n                    // findMarkElementFor, not getMarkElement: the account page's tray hangs\n                    // off a card, not a <mark> (#4368).\n                    _markElem = findMarkElementFor(markId);\n                    cancelNewTagCreation(_markElem);\n                    _currentSuggestedTags5 = currentSuggestedTagsSortProperties(markId), _sortBy = _currentSuggestedTags5.sortBy, _direction = _currentSuggestedTags5.direction;\n                    updateTagManagementElements(markId, _sortBy, _direction);\n                    _context46.next = 58;\n                    break;\n                  case 52:\n                    msg = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('error_adding_tag') || 'There was a problem adding this tag.';\n                    notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_28__.AsyncNotice(msg, 'warning');\n                    _context46.next = 56;\n                    return notice.create({}, true);\n                  case 56:\n                    // restore the pre-add mark in session; updateMarkInSectionCollectionInSessionStorage\n                    // expects a mark OBJECT, so parse the snapshot back into one\n                    if (markDataCopy) {\n                      (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.updateMarkInSectionCollectionInSessionStorage)(marks, JSON.parse(markDataCopy));\n                    }\n                    notice.remove();\n                  case 58:\n                    textInput = tagManagementElem === null || tagManagementElem === void 0 ? void 0 : tagManagementElem.querySelector('[data-id=\"tag-input\"]');\n                    textInput === null || textInput === void 0 || textInput.focus();\n                  case 60:\n                  case \"end\":\n                    return _context46.stop();\n                }\n              }, _callee14);\n            }));\n            return function (_x21) {\n              return _ref7.apply(this, arguments);\n            };\n          }()));\n        case 11:\n        case \"end\":\n          return _context47.stop();\n      }\n    }, _callee15);\n  }));\n  return _addNewTagHandler.apply(this, arguments);\n}\nfunction changeTagColorInMark(markData, tag) {\n  // The account Annotations page has no section collection, so there is no mark\n  // object to recolour there (#4853).\n  if (markData !== null && markData !== void 0 && markData.tags) {\n    var _iterator5 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(markData.tags),\n      _step5;\n    try {\n      for (_iterator5.s();
109 !(_step5 = _iterator5.n()).done;) {\n        var markTag = _step5.value;\n        if (markTag.text === tag.text) {\n          markTag.color = tag.color;\n        }\n      }\n    } catch (err) {\n      _iterator5.e(err);\n    } finally {\n      _iterator5.f();\n    }\n  }\n}\n\n/**\n * Update the color on the assigned-tag chip for a mark.\n *\n * Keyed on the mark id rather than on the click that started it: the event\n * target was only ever used to walk up to a `<mark>`, which does not exist on\n * the account Annotations page (#4853). ASSIGNED_TAG_CHIP_SELECTOR covers both\n * chip markups — the reader's `.tags-wrapper` and the card's `.show-tags`.\n *\n * @param markId\n * @param tag {{text: string, color: string}}\n */\nfunction updateTagInOptionsDiv(markId, tag) {\n  var markElem = findMarkElementFor(markId);\n  if (!markElem) {\n    return;\n  }\n  var _iterator6 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(markElem.querySelectorAll(ASSIGNED_TAG_CHIP_SELECTOR)),\n    _step6;\n  try {\n    for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n      var _context8;\n      var tagElem = _step6.value;\n      if (_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_14___default()(_context8 = tagElem.innerText).call(_context8) === tag.text) {\n        updateColorOnElement(tagElem, tag.color);\n      }\n    }\n  } catch (err) {\n    _iterator6.e(err);\n  } finally {\n    _iterator6.f();\n  }\n}\n\n/**\n * Render tags on the options div or the manage tags div.\n * The 'target' can be either 'tags', 'annotation'.\n *\n * @param markData\n * @param target\n * @param showUsage\n * @returns {HTMLDivElement}\n */\nfunction renderExistingTags(markData, target) {\n  var _markData$tags;\n  var showUsage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n  var tagsDiv = document.createElement('div');\n  var marksCount = markData !== null && markData !== void 0 && (_markData$tags = markData.tags) !== null && _markData$tags !== void 0 && _markData$tags.length ? markData.tags.length : 0;\n  var markId = markData.id;\n  tagsDiv.classList.add('existing-tags');\n\n  // if mark has tags\n  if (marksCount > 0) {\n    var _context9;\n    // loop through tags on mark - create tag elements\n    // render existing tags\n    var sorted = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default()(_context9 = markData.tags).call(_context9, (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.tagsSortingFunction)('name', 'asc'));\n    var _iterator7 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_babel_runtime_corejs3_core_js_stable_instance_entries__WEBPACK_IMPORTED_MODULE_11___default()(sorted).call(sorted)),\n      _step7;\n    try {\n      var _loop = function _loop() {\n        var _step7$value = (0,_babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_step7.value, 2),\n          index = _step7$value[0],\n          tagObject = _step7$value[1];\n        /* Sample tag: <div className=\"tag default\" data-id=\"1' data-type='existing' data-tag-color='red>\n                         <span>divinity</span>\n                         <i className=\"fa-solid fa-xmark\"></i>\n                       </div>\n         */\n        var i;\n        var text = tagObject.text === undefined ? '!' : tagObject.text;\n        var color = tagObject.color === undefined ? '!' : tagObject.color;\n        var usage = tagObject.usage === undefined ? '!' : tagObject.usage;\n        if (target === 'tags') {\n          i = document.createElement('i');\n          i.classList.add('fa-solid', 'fa-xmark');\n          i.setAttribute('data-id', index.toString());\n        }\n\n        // tag div\n        var tagElement = document.createElement('div');\n        tagElement.classList.add('tag', 'default');\n        tagElement.setAttribute('data-tag-id', tagObject.id);\n        tagElement.setAttribute('data-tag-type', 'existing');\n        tagElement.setAttribute('data-tag-text', text);\n        tagElement.setAttribute('title', \"Usage: \".concat(usage));\n        tagElement = updateColorOnElement(tagElement, color);\n        var span = document.createElement('span');\n        span.setAttribute('data-tag-text', text);\n        span.setAttribute('data-tag-color', color);\n        span.textContent = text;\n\n        //TODO: @carolynl, somehow the class 'show-for-sr' is being added automatically, but that class is making\n        //      the span content invisible...\n        span.classList.remove('show-for-sr');\n        tagElement.appendChild(span);\n        if (showUsage) {\n          var usageSpan = document.createElement('span');\n          usageSpan.classList.add('tag-usage');\n          usageSpan.innerHTML = usage;\n        }\n        if (target === 'tags') {\n          tagElement.appendChild(i);\n        }\n\n        // event handler\n        tagElement.addEventListener('click', /*#__PURE__*/function () {\n          var _ref2 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee2(event) {\n            return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee2$(_context10) {\n              while (1) switch (_context10.prev = _context10.next) {\n                case 0:\n                  tagObject.markId = markId;\n                  _context10.next = 3;\n                  return removeTagHandler(event, markId);\n                case 3:\n                case \"end\":\n                  return _context10.stop();\n              }\n            }, _callee2);\n          }));\n          return function (_x18) {\n            return _ref2.apply(this, arguments);\n          };\n        }());\n        tagsDiv.appendChild(tagElement);\n      };\n      for (_iterator7.s();
109 !(_step7 = _iterator7.n()).done;) {\n        _loop();\n      }\n    } catch (err) {\n      _iterator7.e(err);\n    } finally {\n      _iterator7.f();\n    }\n  }\n  return tagsDiv;\n}\n\n/**\n * create a tag element in the DOM.\n *\n * @param markId\n * @param tagData\n * @param tagType\n * @param showUsage\n * @returns {any}\n */\nfunction createNewTagDiv(markId, tagType, tagData) {\n  var showUsage = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n  var newTag = document.createElement('div');\n  var color, newTagDiv, text;\n  newTag.id = '';\n  newTag.classList.add('tag');\n  newTag.setAttribute('data-tag-type', tagType);\n  if (tagType === 'delete') {\n    newTag.setAttribute('title', (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('delete_all_tags_title') || 'Delete all tags');\n    newTag.classList.add('delete');\n    text = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('delete_all') || 'Delete All';\n  } else {\n    newTag.setAttribute('data-tag-color', tagData.color);\n    newTag.setAttribute('data-tag-last-updated', tagData.lastUpdated);\n    newTag.setAttribute('data-tag-text', tagData.text);\n    newTag.setAttribute('data-tag-usage', tagData.usage);\n    newTag.setAttribute('title', \"Usage: \".concat(tagData.usage));\n\n    // data-tag-id is the TAG's id and nothing else. A brand-new tag has no id\n    // yet, so it carries no attribute rather than the string \"null\" — the tag\n    // ids read off the tray are posted verbatim as the annotation's whole tag\n    // assignment (#4853).\n    if (tagData.id) {\n      newTag.setAttribute('data-tag-id', tagData.id);\n    }\n\n    // The lookup handle. It is deliberately NOT data-tag-id: the element has to\n    // be findable by the mark it belongs to, and overloading the tag id with\n    // that job is what posted a mark id as a tag id (#4853).\n    newTag.dataset.markId = markId;\n    if (tagType === 'new') {\n      if (newTagDiv) {\n        newTagDiv = findMarkElementFor(markId);\n        color = newTagDiv.dataset.color;\n        text = newTagDiv.textContent;\n      } else {\n        color = \"default\";\n        text = \"\";\n      }\n      newTag.classList.add('hide');\n    } else {\n      color = tagData.color;\n      text = tagData.text;\n    }\n  }\n  var newTagSpan = document.createElement('span');\n  newTagSpan.setAttribute('data-tag-text', text);\n  if (tagType !== 'delete') {\n    newTagSpan.setAttribute('data-tag-color', color);\n  }\n  newTagSpan.textContent = text;\n  newTag = updateColorOnElement(newTag, color);\n\n  // click event handler\n  newTag.addEventListener('click', /*#__PURE__*/function () {\n    var _ref3 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_5__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().mark(function _callee3(event) {\n      var deleteAll, tagManagementDiv, markElem, colorSelector, colorSelectorWrapper;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_6___default().wrap(function _callee3$(_context11) {\n        while (1) switch (_context11.prev = _context11.next) {\n          case 0:\n            event.preventDefault();\n\n            // disable all tags so no other action occurs until this click is handled properly\n            if (!(tagType === 'delete')) {\n              _context11.next = 13;\n              break;\n            }\n            // warning to user\n            log('are you sure notice');\n\n            // delete all tags\n            log('delete all tags');\n\n            // guard clause\n            deleteAll = confirm((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('confirm_delete_all_tags') || 'Are you sure you want to delete all the tags on this annotation?');\n            if (!deleteAll) {\n              _context11.next = 10;\n              break;\n            }\n            _context11.next = 8;\n            return removeTagHandler(event, markId);\n          case 8:\n            _context11.next = 11;\n            break;\n          case 10:\n            log(\"cancel 'delete all'\");\n          case 11:\n            _context11.next = 26;\n            break;\n          case 13:\n            if (!(tagType === 'suggested')) {\n              _context11.next = 20;\n              break;\n            }\n            tagManagementDiv = findTagManagementDivForMark(markId);\n            changeColorHandler(event);\n            _context11.next = 18;\n            return addNewTagHandler(event, tagManagementDiv, tagType);\n          case 18:\n            _context11.next = 26;\n            break;\n          case 20:\n            // show the color selector & set focus on the wrapper\n            //\n            // findMarkElementFor, not getMarkElement: clicking the new-tag chip is\n            // how the colour picker is opened with the mouse, and on the account\n            // Annotations page the chip sits in a card, not a <mark> (#4853).\n            markElem = findMarkElementFor(markId);\n            colorSelector = markElem.querySelector('[data-color-popup]');\n            colorSelectorWrapper = colorSelector.querySelector('.tag-colors-wrapper');\n            colorSelector.classList.remove('hide');\n            if (!colorSelectorWrapper.hasAttribute('tabindex')) {\n              colorSelectorWrapper.setAttribute('tabindex', '0');\n            }
109\n            colorSelectorWrapper.focus();\n          case 26:\n          case \"end\":\n            return _context11.stop();\n        }\n      }, _callee3);\n    }));\n    return function (_x19) {\n      return _ref3.apply(this, arguments);\n    };\n  }());\n  var i = document.createElement('i');\n  // Add text span\n  newTag.appendChild(newTagSpan);\n  if (tagType === 'delete') {\n    i.classList.add('fa-solid', 'fa-trash-alt');\n    newTag.appendChild(i);\n  }\n  if (showUsage) {\n    var usageSpan = document.createElement('span');\n    usageSpan.classList.add('tag-usage');\n    usageSpan.innerHTML = tagData.usage;\n    newTag.appendChild(usageSpan);\n  }\n  if (tagType === 'new') {\n    i.classList.add('fa-solid', 'fa-plus');\n    newTag.appendChild(i);\n  }\n  return newTag;\n}\n\n/**\n * Remove all the childNodes of a parent element.\n *\n * @param parent\n */\nfunction removeAllChildNodes(parent) {\n  while (parent.firstChild) {\n    parent.removeChild(parent.firstChild);\n  }\n}\n\n/**\n * Remove tags from suggested tags div.\n * This is used when a new tag has been added and the suggestions area needs to be cleared.\n *\n * @param markId\n */\nfunction resetSuggestedTags(markId) {\n  // findMarkElementFor, not getMarkElement: on the account Annotations page\n  // the tray lives in a card, and there is no <mark> to find (#4368).\n  var markElem = findMarkElementFor(markId);\n  var wrapper = markElem.querySelector('.suggested-tags');\n  while (wrapper.firstChild) {\n    wrapper.removeChild(wrapper.firstChild);\n  }\n  var noneSpan = document.createElement('span');\n  noneSpan.innerText = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('no_suggestions') || 'No suggestions.';\n  wrapper.appendChild(noneSpan);\n}\n\n/**\n * JS version of PHP array_column() method.\n *\n * @param input\n * @param columnKey\n * @returns {*}\n */\nfunction arrayColumn(input, columnKey) {\n  // guard clause\n  if (input === null || input === undefined) {\n    return '';\n  }\n  return _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_16___default()(input).call(input, function (value, _index) {\n    return value[columnKey];\n  });\n}\n\n/**\n * Return new tag div for the mark in tag edit mode.\n * @param markElem\n * @returns {Element}\n */\nfunction getNewTagDiv(markElem) {\n  var _markElem$dataset2 = markElem.dataset,\n    _markElem$dataset2$ma = _markElem$dataset2.markId,\n    markId = _markElem$dataset2$ma === void 0 ? null : _markElem$dataset2$ma,\n    _markElem$dataset2$id = _markElem$dataset2.id,\n    id = _markElem$dataset2$id === void 0 ? null : _markElem$dataset2$id;\n  var markElemId = markId !== null && markId !== void 0 ? markId : id;\n  return markElem.querySelector(\".new-tag .tag[data-mark-id=\\\"\".concat(markElemId, \"\\\"\"));\n}\n\n/**\n * Generate the tags management div with updated suggested tags.\n *\n * @param markId\n * @param sortBy - one of: ('name', 'time', 'usage'); default: 'name'\n * @param direction - one of: ('asc', 'desc'); default: 'asc'\n * @param userMarkRecordId\n */\nfunction updateTagManagementElements(markId) {\n  var _JSON$parse, _context13, _filteredTags$length, _filteredTags$length2, _filteredTags;\n  var sortBy = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'name';\n  var direction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'asc';\n  var userMarkRecordId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n  var CURRENT_MARK_NEW_TAG_TEXT_COUNT_KEY = 'current-mark-new-tag-text-count';\n  var FILTERED_TAGS_LIST_KEY = 'filtered-tags';\n  var USER_TAGS_LIST_KEY = 'userTags';\n  var allTags = (_JSON$parse = JSON.parse(sessionStorage.getItem(USER_TAGS_LIST_KEY))) !== null && _JSON$parse !== void 0 ? _JSON$parse : [];\n  var markElem = findMarkElementFor(markId, userMarkRecordId);\n  var textInputElem = markElem.querySelector('[data-controls-for=\"tags\"] [data-id=\"tag-input\"]');\n  var newTagColorsDiv = markElem.querySelector('[data-color-popup]');\n  var inputText = textInputElem.value;\n  var markData = null;\n  var markTags = [];\n  // The card is looked up by mark id alone, not by the record 
109id the caller\n  // may or may not have passed: the remove and add handlers call back in with\n  // three arguments, and reading the section collection instead would find\n  // nothing on the account page and throw on the missing mark (#4368).\n  var annotationCard = (0,_account_tag_save__WEBPACK_IMPORTED_MODULE_34__.annotationCardFor)(markId);\n  if (annotationCard) {\n    var _context12;\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(_context12 = annotationCard.querySelectorAll(ASSIGNED_TAG_CHIP_SELECTOR)).call(_context12, function (tagElement) {\n      var _tagElement$dataset = tagElement.dataset,\n        id = _tagElement$dataset.id,\n        color = _tagElement$dataset.color,\n        text = _tagElement$dataset.text,\n        usage = _tagElement$dataset.usage,\n        lastUpdated = _tagElement$dataset.lastUpdated;\n      markTags.push({\n        id: id,\n        color: color,\n        text: text,\n        usage: usage,\n        lastUpdated: lastUpdated\n      });\n    });\n  } else {\n    var _markData$tags2;\n    markData = findMarkInSession(markId);\n    markTags = (_markData$tags2 = markData.tags) !== null && _markData$tags2 !== void 0 ? _markData$tags2 : [];\n  }\n  var selectedColor = currentSelectedColor(markId);\n\n  // hide the tag colors management\n  if (!newTagColorsDiv.classList.contains('hide')) {\n    newTagColorsDiv.classList.add('hide');\n  }\n\n  /* manage tags management variables */\n  // filter() function to remove tags already added to mark\n  var filterAlreadyAddedTags = function filterAlreadyAddedTags(tag) {\n    return !_babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_17___default()(markTags).call(markTags, function (markTag) {\n      return markTag.text === tag.text;\n    });\n  };\n\n  // filter() function to remove tags without selected color\n  // const filterSelectedColorTags = (tag) =>  tag.color === selectedColor;\n\n  var filteredTags = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default()(_context13 = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_18___default()(allTags).call(allTags, filterAlreadyAddedTags)).call(_context13, (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.tagsSortingFunction)(sortBy, direction));\n\n  // put back trimmed text so we don't have spaces\n  textInputElem.value = inputText;\n\n  // grab previous text input value, save current\n  var previousTextInputValue = sessionStorage.getItem(CURRENT_MARK_NEW_TAG_TEXT_COUNT_KEY);\n  sessionStorage.setItem(CURRENT_MARK_NEW_TAG_TEXT_COUNT_KEY, inputText.length);\n\n  // hide the colors palette when there's no text in the input field\n  if ((textInputElem === null || textInputElem === void 0 ? void 0 : textInputElem.value.length) === 0) {\n    if (!newTagColorsDiv.classList.contains('hide')) {\n      newTagColorsDiv.classList.add('hide');\n    }\n    textInputElem.focus();\n  }\n\n  // For performance reasons, we keep and use a filtered tags list instead of always rechecking the full\n  // tags list. Decide when we need to reset the filtered tags list.\n  var resetTagsList = ((_filteredTags$length = filteredTags.length) !== null && _filteredTags$length !== void 0 ? _filteredTags$length : 0) === 0 // if the filtered Tag List is empty\n  || textInputElem.value.length === 0 // if there are no characters in the new tag input text field\n  || previousTextInputValue > textInputElem.value.length; // if the user removed a character\n\n  if (resetTagsList) {\n    var _context14;\n    // copy by value, not reference\n    filteredTags = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default()(_context14 = (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(allTags)).call(_context14, (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.tagsSortingFunction)(sortBy, direction));\n  }\n\n  // list of all visible tag names:\n  // (1) from filtered tags list\n  // (2) existing tags\n  // (3) newly added tags that have not been saved.\n  var all = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10___default()(filteredTags).call(filteredTags, markTags);\n  var visibleTagNamesMap = new (_babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_19___default())();\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(all).call(all, function (item) {\n    visibleTagNamesMap.set(item.text, {\n      id: item.id,\n      color: item.color\n    });\n  });\n\n  // manage suggested tags\n  var tagDiv;\n  var suggestedTagsDiv = markElem.querySelector('[data-controls-for=\"tags\"] .suggested-tags');\n\n  // suggestions div\n  var newSuggestedTagsDiv = suggestedTagsDiv.cloneNode();\n  var tagTexts = arrayColumn(markTags, 'text');\n  if (((_filteredTags$length2 = (_filteredTags = filteredTags) === null || _filteredTags === void 0 ? void 0 : _filteredTags.length) !== null && _filteredTags$length2 !== void 0 ? _filteredTags$length2 : 0) > 0) {\n    var _context15;\n    // clear the filtered tags list and fill with remaining possible matches, below\n    var temp = [];\n    var _iterator8 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(filteredTags),\n      _step8;\n    try {\n      for (_iterator8.s();
109 !(_step8 = _iterator8.n()).done;) {\n        var _context16;\n        var tagData = _step8.value;\n        var text = tagData.text;\n        if (text && _babel_runtime_corejs3_core_js_stable_instance_starts_with__WEBPACK_IMPORTED_MODULE_21___default()(_context16 = text.toLowerCase()).call(_context16, textInputElem.value.toLowerCase()) && !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_13___default()(tagTexts).call(tagTexts, text)) {\n          var _tagData$usage;\n          temp.push(tagData);\n          // create suggested tag with tag data\n          var showUsage = true;\n          tagDiv = createNewTagDiv(markId, 'suggested', tagData, showUsage);\n          tagDiv.setAttribute('title', \"Usage: \".concat((_tagData$usage = tagData.usage) !== null && _tagData$usage !== void 0 ? _tagData$usage : 0));\n          newSuggestedTagsDiv.appendChild(tagDiv);\n          var deleteTagElem = tagDiv.querySelector('[data-tag-type=\"delete\"]');\n          if (deleteTagElem) {\n            deleteTagElem.remove();\n            tagDiv.appendChild(newSuggestedTagsDiv);\n          }\n        }\n      }\n    } catch (err) {\n      _iterator8.e(err);\n    } finally {\n      _iterator8.f();\n    }\n    sessionStorage.setItem(FILTERED_TAGS_LIST_KEY, _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_20___default()(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10___default()(_context15 = []).call(_context15, temp)));\n  }\n  if (newSuggestedTagsDiv.childNodes.length > 0) {\n    suggestedTagsDiv.replaceChildren();\n    suggestedTagsDiv.replaceWith(newSuggestedTagsDiv);\n  } else {\n    removeAllChildNodes(suggestedTagsDiv);\n    var noneSpan = document.createElement('span');\n    noneSpan.innerText = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('no_suggestions') || 'No suggestions.';\n    suggestedTagsDiv.appendChild(noneSpan);\n  }\n  if (textInputElem) {\n    var newTag = getNewTagDiv(markElem);\n    var newTagWrapper = newTag.parentElement;\n    var noticeElement = newTagWrapper.querySelector('.tm-notice');\n    var alreadyAddedTag = findTagInExistingTags(markId, inputText);\n    var existingTag = (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.findTagOnPageByText)(inputText);\n    var newTagSpan = newTagWrapper.querySelector('span');\n    newTagSpan.setAttribute('data-tag-text', inputText);\n    newTag.setAttribute('data-tag-text', inputText);\n    newTagSpan.textContent = inputText;\n\n    // manage new tag details\n    var _newTag$dataset = newTag.dataset,\n      newTagColor = _newTag$dataset.tagColor,\n      _newTag$dataset$curre = _newTag$dataset.currentColor,\n      newTagCurrentColor = _newTag$dataset$curre === void 0 ? null : _newTag$dataset$curre;\n    if (visibleTagNamesMap.has(inputText)) {\n      var matchingTagData = visibleTagNamesMap.get(inputText);\n      // set new tag color to match existing tag (set current color in dataset)\n      newTag.setAttribute('data-current-color', newTagColor);\n      newTag.setAttribute('data-tag-color', matchingTagData.color);\n      newTag.setAttribute('data-tag-text', inputText);\n      newTag.classList.replace(newTagColor, matchingTagData.color);\n      var onReader = (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.isTagManagementOnReader)();\n      var message = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('tag_must_be_unique') || 'Tag must be uniquely named';\n      var tagStatus = isTagAddedOrSuggested(existingTag);\n\n      // handling an event on the reader\n      if (onReader) {\n        if (tagStatus === 'suggested') {\n          message = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('tag_already_exists') || 'Tag already exists';\n        }\n\n        // added\n        else {\n          message = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('tag_already_assigned') || 'Tag already assigned';\n        }\n      }\n      (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.spotlightTag)(existingTag);\n      disableNewTagDiv(markElem);\n      setNewTagNotice(markElem, message);\n      if (alreadyAddedTag) {\n        (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.spotlightTag)(alreadyAddedTag);\n      }\n    } else {\n      (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.removeSpotlightFromTags)();\n\n      // control visibility of new tag div\n      clearNewTagNotice(markId);\n      if (newTag && textInputElem.value.length > 0) {\n        // ensure new tag element has selected color\n        if (selectedColor) {\n          newTag.setAttribute('data-tag-color', selectedColor);\n          var disabled = newTag.classList.contains('disabled') ? 'disabled' : '';\n          newTag.className = '';\n          newTag.classList.add('tag', selectedColor);\n          if (disabled) {\n            newTag.classList.add(disabled);\n          }\n        }\n        enableNewTagDiv(markElem);\n      } else {\n        disableNewTagDiv(markElem);\n        clearNewTagNotice(markId);\n      }\n    }\n\n    // update tag name with contents of input text field\n    if (inputText) {\n      newTag.setAttribute('data-tag-text', inputText);\n      newTagSpan.textContent = inputText;\n    }\n  }\n}\n\n/**\n * Fin the user highlight element on Account Annotations page with the given markId and userMarkRecordId.\n *\n * @param markId\n * @param userMarkRecordId\n * @returns {Element}\n */\nfunction getUserHighlight(markId, userMarkRecordId) {\n  var _context17;\n  return document.querySelector(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10___default()(_context17 = \"[data-mark-id=\\\"\".concat(markId, \"\\\"][data-user-mark-record-id=\\\"\")).call(_context17, userMarkRecordId, \"\\\"]\"));\n}\n\n/**\n * Initialize session storage variables related to tags.\n */\nfunction initializeTagSessionStorageVariables(markId) {\n  var _JSON$parse2, _mark$tags, _context18;\n  var marks = (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.getSectionMarksFromSessionStorage)();\n  var mark = (0,_session_storage__WEBPACK_IMPORTED_MODULE_32__.findMarkInSectionCollectionInSe
109ssionStorage)(marks, markId);\n  var allTagsJson = sessionStorage.getItem('userTags');\n  var allTags = (_JSON$parse2 = JSON.parse(allTagsJson)) !== null && _JSON$parse2 !== void 0 ? _JSON$parse2 : [];\n  var markTags = (_mark$tags = mark === null || mark === void 0 ? void 0 : mark.tags) !== null && _mark$tags !== void 0 ? _mark$tags : [];\n  var filteredTags = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default()(_context18 = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_18___default()(allTags).call(allTags, function (tag) {\n    return !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_13___default()(markTags).call(markTags, tag);\n  })).call(_context18, _account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.sortTagsByNameSortingFunction);\n\n  // initialize session storage variables\n  sessionStorage.setItem('filtered-tags', _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_20___default()(filteredTags));\n}\n\n/**\n * Add tags to the options div.\n *\n * @param markObject\n * @param optionsWrapper\n */\nfunction renderTagsOnOptionsDiv(markObject, optionsWrapper) {\n  var _optionsWrapper$close, _staleWrappers$shift, _markObject$tags;\n  // Scope to the segment that OWNS this wrapper, not to getMarkElement().\n  //\n  // A multi-block highlight renders as one <mark> PER BLOCK, each with the same\n  // data-id and its own popup (annotations.js `_createMarkElement`). #4470 made\n  // saveTags() loop over every popup, but this function still resolved its mark\n  // with getMarkElement() — `document.querySelector`, so ALWAYS the FIRST\n  // segment whichever wrapper it was handed. The removal below therefore deleted\n  // what the PREVIOUS call had just inserted into segment 1, and the reader saw\n  // chips on some taps and not others (#4571).\n  //\n  // Multi-level outline highlights (#4134) cross many short blocks, which is why\n  // this surfaced there first rather than on ordinary prose.\n  //\n  // The fallback keeps the Annotations page working, where a card is not a\n  // <mark> at all and there is exactly one wrapper per annotation.\n  var markElem = (_optionsWrapper$close = optionsWrapper === null || optionsWrapper === void 0 ? void 0 : optionsWrapper.closest(\"mark[data-id=\\\"\".concat(String(markObject.id).replace(/[\"\\\\]/g, '\\\\$&'), \"\\\"]\"))) !== null && _optionsWrapper$close !== void 0 ? _optionsWrapper$close : getMarkElement(markObject.id);\n  var wrapperClass = 'tags-wrapper';\n  var tagsWrapper;\n\n  // Collect EVERY stale wrapper for this segment before touching the DOM — the\n  // same remove/insert asymmetry as #4402/#4470/#4571, a third time (#4628).\n  //\n  // The removal used to be `markElem.querySelector()`, so it saw the first match\n  // inside markElem and nothing else. The insert below is on `optionsWrapper`,\n  // which is NOT necessarily inside markElem (the account page, and any mark\n  // whose popup is a sibling rather than a child). A wrapper that lands outside\n  // markElem is then invisible to every later removal and the chips accumulate.\n  //\n  // Do not \"simplify\" this back to a single querySelector.\n  var staleWrappers = _staleTagWrappers(markElem, optionsWrapper, wrapperClass);\n\n  // Keep the first one as the anchor so a wrapper already sitting in its own\n  // place (server-rendered on the Annotations page) is replaced there rather\n  // than relocated next to optionsWrapper. The rest are leftovers.\n  var anchorWrapper = (_staleWrappers$shift = staleWrappers.shift()) !== null && _staleWrappers$shift !== void 0 ? _staleWrappers$shift : null;\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(staleWrappers).call(staleWrappers, function (staleWrapper) {\n    return staleWrapper.remove();\n  });\n\n  // add mark tags if tags present\n  if (((_markObject$tags = markObject.tags) === null || _markObject$tags === void 0 ? void 0 : _markObject$tags.length) > 0) {\n    var tagElem;\n    tagsWrapper = document.createElement('div');\n    tagsWrapper.classList.add(wrapperClass, 'reader');\n\n    // sort and loop through tags on mark - create tag elements\n    if (markObject.tags) {\n      var _context19;\n      // One chip per TAG, not one per array entry (#4628).\n      //\n      // This loop used to paint the list verbatim, so any duplicate that reached\n      // it — a scalar entry `_mergeMarkTags()` deliberately keeps, a legacy blob,\n      // a future write path — showed the same tag two or three times until the\n      // next page load. That is the re-opened half of #4628: the merge-side\n      // dedupe holds for object-shaped tags, and the earlier render fix\n      // (#4628, wrapper sweeping) addressed how many WRAPPERS survive a\n      // re-render, never how many chips one render draws.\n      //\n      // `_dedupeTagsForRender` copies, so `markObject.tags` is left exactly as it\n      // was. Nothing here may become a storage write: the mark's list is what\n      // gets saved, and the rule is that showing a tag twice beats losing one.\n      var tagsList = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_15___default()(_context19 = _dedupeTagsForRender(markObject.tags)).call(_context19, (0,_account_tags_functions__WEBPACK_IMPORTED_MODULE_33__.tagsSortingFunction)('name', 'asc'));\n      var _iterator9 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(_babel_runtime_corejs3_core_js_stable_instance_entries__WEBPACK_IMPORTED_MODULE_11___default()(tagsList).call(tagsList)),\n        _step9;
109\n      try {\n        for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n          var _step9$value = (0,_babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(_step9.value, 2),\n            _index = _step9$value[0],\n            tag = _step9$value[1];\n          var text = tag.text ? tag.text : '[blank]';\n          tagElem = document.createElement('div');\n          tagElem.classList.add('tag', \"\".concat(tag.color));\n          var textSpan = document.createElement('span');\n          textSpan.innerText = text;\n          tagElem.appendChild(textSpan);\n          tagsWrapper.appendChild(tagElem);\n        }\n      } catch (err) {\n        _iterator9.e(err);\n      } finally {\n        _iterator9.f();\n      }\n    }\n\n    // if present, replace in place; otherwise insert next to the options wrapper\n    if (anchorWrapper) {\n      anchorWrapper.replaceWith(tagsWrapper);\n    } else {\n      optionsWrapper.insertAdjacentElement('afterend', tagsWrapper);\n    }\n  } else if (anchorWrapper) {\n    // the last tag came off the mark — the wrapper goes with it\n    anchorWrapper.remove();\n  }\n}\n\n/**\n * The tags to DRAW for one mark: one entry per tag identity (#4628).\n *\n * Display only. The returned array is a copy and the caller's list is never\n * mutated, so no storage path can lose a tag through this — which is the whole\n * reason the dedupe is allowed to live here at all.\n *\n * The key is the tag ID, normalised to a trimmed string, never the label:\n *\n *   - `Tags.id` is an `int` in the schema but PDO hands it back as a STRING, so\n *     `7` and `'7'` are the same tag and a raw `Set` keyed on `id` keeps both.\n *   - Two genuinely DIFFERENT tags may share a name. There is no unique index on\n *     `Tags(UserId, Name)` and production holds 35 same-name groups (one user\n *     owns 28 tags named `Note!`), so collapsing on the label would hide a real\n *     assignment. That guard matters more than the dedupe.\n *\n * An entry with no usable id is always drawn — unidentifiable is not duplicate.\n * A bare scalar entry IS its id, so it collapses onto the matching object, and\n * on a collision the entry that carries display text wins the slot: rendering\n * `[blank]` for a tag whose text is right there is worse than either duplicate.\n *\n * @param {*} tags The mark's tags list, in stored order.\n * @returns {Array} The entries to draw, first occurrence's position preserved.\n * @private\n */\nfunction _dedupeTagsForRender(tags) {\n  if (!_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_22___default()(tags)) {\n    return [];\n  }\n  var slotForId = new (_babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_19___default())();\n  var forRender = [];\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_9___default()(tags).call(tags, function (tag) {\n    var idKey = _renderTagIdKey(tag);\n    if (idKey === null) {\n      forRender.push(tag);\n      return;\n    }\n    if (!slotForId.has(idKey)) {\n      slotForId.set(idKey, forRender.push(tag) - 1);\n      return;\n    }\n    var slot = slotForId.get(idKey);\n    if (!_tagCanBeLabelled(forRender[slot]) && _tagCanBeLabelled(tag)) {\n      forRender[slot] = tag;\n    }\n  });\n  return forRender;\n}\n\n/**\n * A tag entry's identity for the chip render, or null when it has none.\n *\n * @param {*} tag An entry from a mark's tags list.\n * @returns {string|null} The id as a trimmed string, or null.\n * @private\n */\nfunction _renderTagIdKey(tag) {\n  var _context20;\n  var rawId = typeof tag === 'string' || typeof tag === 'number' ? tag : tag && (0,_babel_runtime_corejs3_helpers_typeof__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(tag) === 'object' ? tag.id : null;\n  if (rawId === null || rawId === undefined) {\n    return null;\n  }\n  var idKey = _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_14___default()(_context20 = String(rawId)).call(_context20);\n  return idKey === '' ? null : idKey;\n}\n\n/**\n * Does this entry carry text the chip can show?\n *\n * @param {*} tag An entry from a mark's tags list.\n * @returns {boolean}\n * @private\n */\nfunction _tagCanBeLabelled(tag) {\n  var _context21;\n  return Boolean(tag) && (0,_babel_runtime_corejs3_helpers_typeof__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(tag) === 'object' && typeof tag.text === 'string' && _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_14___default()(_context21 = tag.text).call(_context21) !== '';\n}\n\n/**\n * Every `.tags-wrapper` a previous render could have left behind for one segment.\n *\n * Two places have to be swept, because the removal and the insert were never\n * scoped to the same element (#4628):\n *\n *   - inside `markElem`, where a wrapper lands when the popup is a child of the\n *     <mark> — and where a server-rendered wrapper sits on the Annotations page;\n *   - immediately after `optionsWrapper`, where `insertAdjacentElement` puts it,\n *     which is OUTSIDE `markElem` whenever the popup is a sibling of the <mark>.\n *\n * `markElem` is null-guarded because an unpainted mark has no element (#4402).\n *\n * @param {Element|null} markElem The <mark> segment owning this popup, if painted.\n * @param {Element|null} optionsWrapper The popup the wrapper is rendered against.\n * @param {string}
109 wrapperClass The wrapper's class name.\n * @returns {Element[]} Stale wrappers in document order, markElem's first.\n * @private\n */\nfunction _staleTagWrappers(markElem, optionsWrapper, wrapperClass) {\n  var wrappers = markElem ? _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_8___default()(markElem.querySelectorAll(\".\".concat(wrapperClass))) : [];\n  var sibling = optionsWrapper === null || optionsWrapper === void 0 ? void 0 : optionsWrapper.nextElementSibling;\n  while ((_sibling = sibling) !== null && _sibling !== void 0 && (_sibling = _sibling.classList) !== null && _sibling !== void 0 && _sibling.contains(wrapperClass)) {\n    var _sibling;\n    if (!_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_13___default()(wrappers).call(wrappers, sibling)) {\n      wrappers.push(sibling);\n    }\n    sibling = sibling.nextElementSibling;\n  }\n  return wrappers;\n}\n\n/**\n * Returns the mark element in the dom with the given id.\n *\n * @param markId\n * @returns {Element}\n */\nfunction getMarkElement(markId) {\n  return document.querySelector(\"mark[data-id=\\\"\".concat(markId, \"\\\"]\"));\n}\n\n/**\n * Element selector for new tag div element.\n *\n * @returns {string}\n * @private\n */\nfunction _newTagElementSelector(markId) {\n  return \".tag[data-tag-type=\\\"new\\\"][data-mark-id=\\\"\".concat(markId, \"\\\"]\");\n}\n\n/** Add or remove the 'delete all' button from the assigned tags area\n *\n * @param assignedTagsDiv\n * @param markData\n */\nfunction manageDeleteAllButton(assignedTagsDiv, markData) {\n  var deleteTagElem = assignedTagsDiv.querySelector('[data-tag-type=\"delete\"]');\n  var currentTags = assignedTagsDiv.querySelectorAll(\".tag:not([data-tag-type=\\\"delete\\\"])\");\n\n  // guard clause\n  if (!assignedTagsDiv) {\n    return;\n  }\n\n  // we show the delete all button if there are more than 4 tags on the mark\n  if (currentTags.length > 4) {\n    if (deleteTagElem) {\n      return;\n    }\n    createDeleteAllButton(assignedTagsDiv, markData);\n  } else {\n    if (deleteTagElem) {\n      deleteTagElem.remove();\n    }\n  }\n}\n\n/**\n * Create the delete all tags button.\n *\n * @param assignedTagsDiv\n * @param markData\n */\nfunction createDeleteAllButton(assignedTagsDiv, markData) {\n  var deleteTagElem = createNewTagDiv(markData.id, 'delete', {\n    text: (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_36__.t)('delete_all') || 'Delete All'\n  });\n  assignedTagsDiv.appendChild(deleteTagElem);\n}\n\n/**\n * Return the options div for a given mark in DOM by markId\n *\n * @param markId\n * @returns {Element|null}\n */\nfunction findOptionsDivForMark(markId) {\n  var div = document.querySelector(\"[data-id=\\\"\".concat(markId, \"\\\"] [data-controls-for=\\\"annotation\\\"]\"));\n  if (div) {\n    return div;\n  }\n  return null;\n}\n\n/**\n * Return the tags management div in DOM by markId\n *\n * @param markId\n * @returns {Element|null}\n */\nfunction findTagManagementDivForMark(markId) {\n  var div = document.querySelector(\"[data-id=\\\"\".concat(markId, \"\\\"][data-controls-for=\\\"tags\\\"]\"));\n  if (div) {\n    return div;\n  }\n  return null;\n}\n\n/** Return the existing tags div for the given mark.\n *\n * @param markId\n * @returns {Element|null}\n */\nfunction findExistingTagsDivForMark(markId) {\n  var div = findTagManagementDivForMark(markId);\n  if (div) {\n    return div.querySelector('.existing-tags');\n  }\n  return null;\n}\n\n/**\n * Return the tag element from existing tags, if found. Otherwise, return null.\n *\n * @param markId\n * @param text\n * @param color\n * @returns {HTMLElement|boolean}\n */\nfunction findTagInExistingTags(markId, text) {\n  var color = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n  var div = findExistingTagsDivForMark(markId);\n  if (!div) {\n    return false;\n  }\n  var selector = \".tag span[data-tag-text=\\\"\".concat(text, \"\\\"]\");\n  if (color) {\n    var _context22;\n    selector = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10___default()(_context22 = \"\".concat(selector, \"[data-tag-color=\\\"\")).call(_context22, color, \"\\\"]\");\n  }\n  var elem = div.querySelector(selector);\n  if (elem) {\n    return elem.parentElement;\n  }\n  return false;\n}\n\n/**\n * Find a specific tag in assign Tags div by color and text.\n *\n * @param assignedTagsElem\n * @param tagData\n *\n * @returns {Element|null}\n */\nfunction findTagInAssignedTagsDivForMark(assignedTagsElem, tagData) {\n  var _context23;\n  // return null if div not found\n  if (assignedTagsElem === null) {\n    return null;\n  }\n  var color = tagData.color,\n    text = tagData.text;\n  var span = assignedTagsElem.querySelector(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_10___default()(_context23 = \"[data-tag-text=\\\"\".concat(text, \"\\\"][data-tag-color=\\\"\")).call(_context23, color, \"\\\"]\"));
109\n  if (span === null) {\n    return null;\n  }\n  return span.closest('.tag');\n}\n\n/**\n * Toggle the visibility of the mark management divs. Either show the annotation div or the options div, hide the other.\n *\n * @param markId\n * @param divToShow - one of: ('annotation', 'tags')\n */\nfunction toggleVisibilityOfMarkManagementDivs(markId, divToShow) {\n  var optionsDiv = findOptionsDivForMark(markId);\n  var tagManagementDiv = findTagManagementDivForMark(markId);\n  if (divToShow === 'annotation') {\n    tagManagementDiv.classList.add('hide');\n    optionsDiv.classList.remove('hide');\n    return;\n  }\n  if (divToShow === 'tags') {\n    optionsDiv.classList.add('hide');\n    tagManagementDiv.classList.remove('hide');\n  }\n}\n\n/**\n * Insert a tag in its correct alphabetical order.\n *\n * @param currentTags\n * @param tagElement\n */\nfunction insertAlphabetically(currentTags, tagElement) {\n  if (currentTags.length === 0) {\n    var assignedTagsElem = findExistingTagsDivForMark(tagElement.dataset.markId);\n    assignedTagsElem.appendChild(tagElement);\n    return;\n  }\n  var _iterator10 = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(currentTags),\n    _step10;\n  try {\n    for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n      var currentTag = _step10.value;\n      var sort = compare(currentTag.textContent, tagElement.textContent);\n      if (sort > -1) {\n        currentTag.insertAdjacentElement('beforebegin', tagElement);\n        return;\n      }\n    }\n\n    // if not inserted, insert at end\n  } catch (err) {\n    _iterator10.e(err);\n  } finally {\n    _iterator10.f();\n  }\n  var last = currentTags.item(currentTags.length - 1);\n  last.insertAdjacentElement('afterend', tagElement);\n}\n\n/**\n * Removes the given item from array\n * @param array\n * @param value\n */\nfunction removeFirstOccurrenceFromArray(array, value) {\n  var index = _babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_23___default()(array).call(array, value);\n  if (index > -1) {\n    _babel_runtime_corejs3_core_js_stable_instance_splice__WEBPACK_IMPORTED_MODULE_24___default()(array).call(array, index, 1);\n  }\n  return array;\n}\n\n/**\n * Return the color currently selected in the tag color control. if none is selected, return null.\n *\n * @param markId\n * @returns {null|string}\n */\nfunction currentSelectedColor(markId) {\n  var tagsDiv = findTagManagementDivForMark(markId);\n  var selectedColorElem = tagsDiv.querySelector('.tag-colors-wrapper .tag.selected');\n  if (selectedColorElem) {\n    return selectedColorElem.dataset.tagColor;\n  }\n  return null;\n}\n\n/**\n * Method to change the color of a new Tag div according to the color selector clicked or selected.\n *\n * @param newColor\n * @param newTagDiv\n */\nfunction changeNewTagDivColor(newColor, newTagDiv) {\n  var _context24;\n  var markId = newTagDiv.dataset.markId;\n  var colorsWrapper, selector;\n  if (markId) {\n    selector = \".tag-colors-wrapper[data-mark-id=\\\"\".concat(markId, \"\\\"]\");\n  } else {\n    selector = '.tag-colors-wrapper';\n  }\n  colorsWrapper = document.querySelector(selector);\n  var selectedColorElem = colorsWrapper.querySelector('.selected');\n  var tagColor = selectedColorElem.dataset.tagColor;\n\n  // previous, new color\n  var previousColor = findColorClassInClassList(newTagDiv.classList);\n  if (_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_13___default()(_context24 = colorWords()).call(_context24, tagColor)) {\n    var currentElem = colorsWrapper.querySelector('.selected');\n\n    // handle click to set or unset a color selection\n    if (currentElem) {\n      currentElem.classList.remove('selected');\n    }\n    var newElem = colorsWrapper.querySelector(\"[data-tag-color=\\\"\".concat(newColor, \"\\\"]\"));\n    if (newElem) {\n      newElem.classList.add('selected');\n      newTagDiv.classList.remove(tagColor);\n\n      // update color classes, data-attributes\n      newTagDiv.classList.add(newColor);\n      newTagDiv.setAttribute('data-tag-color', newColor);\n      var span = newTagDiv.querySelector('span');\n      span.setAttribute('data-tag-color', newColor);\n    }\n\n    // update new tag element with color\n    updateColorOnElement(newTagDiv, newColor, previousColor);\n  }\n}\n\n/**\n * Returns the sort properties for the suggested tags that are currently active on the DOM.\n * Finds the sort button that is selected and reads its properties.\n *\n * @param markId\n * @returns {{sortBy: string, direction: string}|{sortBy, direction: string}}\n */\nfunction currentSuggestedTagsSortProperties(markId) {\n  var tagsDiv = findTagManagementDivForMark(markId);\n  // return default sort values if div not present\n  if (!tagsDiv) {\n    return {\n      sortBy: 'name',\n      direction: 'asc'\n    };\n  }\n  var sortElem = tagsDiv.querySelector('.sorted[data-sort-by]');\n  if (!sortElem) {\n    return {\n      sortBy: 'name',\n      direction: 'asc'\n    };\n  }\n  var _sortElem$dataset = sortElem.dataset,\n    sortBy = _sortElem$dataset.sortBy,\n    _sortElem$dataset$dir = _sortElem$dataset.direction,\n    direction = _sortElem$dataset$dir === void 0 ? 'asc' : _sortElem$dataset$dir;\n  return {\n    sortBy: sortBy,\n    direction: direction\n  };\n}
109\n\n/**\n * Simple compare function for sort(), toSorted()\n * @param a\n * @param b\n * @returns {number}\n */\nfunction compare(a, b) {\n  if (a < b) {\n    return -1;\n  }\n  if (a > b) {\n    return 1;\n  }\n  return 0;\n}\n\n/**\n * Disable a mark's new tag div in the tags management pane.\n * @param markElem\n */\nfunction disableNewTagDiv(markElem) {\n  var newTag = getNewTagDiv(markElem);\n  if (newTag) {\n    var _newTag$classList;\n    newTag.classList.add('hide');\n    newTag.setAttribute('disabled', 'true');\n    if (!(newTag !== null && newTag !== void 0 && (_newTag$classList = newTag.classList) !== null && _newTag$classList !== void 0 && _newTag$classList.contains('disabled'))) {\n      newTag.classList.add('disabled');\n    }\n    var plusLink = newTag.querySelector('.fa-plus');\n    if (plusLink) {\n      plusLink.classList.add('hide');\n    }\n  }\n}\n\n/**\n * Hide a mark's new tag div in the tag management pane.\n *\n * @param markElem\n */\nfunction hideNewTagDiv(markElem) {\n  var newTag = getNewTagDiv(markElem);\n  if (newTag) {\n    var _newTag$classList2;\n    if (!(newTag !== null && newTag !== void 0 && (_newTag$classList2 = newTag.classList) !== null && _newTag$classList2 !== void 0 && _newTag$classList2.contains('hide'))) {\n      newTag.classList.add('hide');\n    }\n  }\n}\n\n/**\n * Enable a mark's new tag div in the tags management pane.\n * @param markElem\n */\nfunction enableNewTagDiv(markElem) {\n  var newTag = getNewTagDiv(markElem);\n  newTag.removeAttribute('disabled');\n  newTag.classList.remove('disabled');\n  newTag.classList.remove('hide');\n  var plusLink = newTag.querySelector('.fa-plus');\n  if (plusLink) {\n    plusLink.classList.remove('hide');\n  }\n}\n\n/**\n * Clear the new tag notices element for a given mark.\n * Finds the tag management div by the mark id.\n *\n * @param markId\n */\nfunction clearNewTagNotice(markId) {\n  var tagsManagementElement = findTagManagementDivForMark(markId);\n  var newTagNotice = tagsManagementElement.querySelector('.tm-notice');\n  var plusLink = tagsManagementElement.querySelector('.fa-plus');\n  if (newTagNotice) {\n    if (!newTagNotice.classList.contains('hide')) {\n      newTagNotice.classList.add('hide');\n    }\n    newTagNotice.textContent = '';\n  }\n  if (plusLink) {\n    plusLink.classList.add('hide');\n  }\n}\n\n/**\n * Set the new tag notice element for a given mark.\n * Finds the tag management div in the mark Element.\n *\n * @param markElem\n * @param text\n */\nfunction setNewTagNotice(markElem, text) {\n  var _markElem$dataset3 = markElem.dataset,\n    _markElem$dataset3$ma = _markElem$dataset3.markId,\n    markId = _markElem$dataset3$ma === void 0 ? null : _markElem$dataset3$ma,\n    _markElem$dataset3$id = _markElem$dataset3.id,\n    id = _markElem$dataset3$id === void 0 ? null : _markElem$dataset3$id;\n  var markElemId = markId !== null && markId !== void 0 ? markId : id;\n  var tagsManagementElement = findTagManagementDivForMark(markElemId);\n  var newTagWrapper = getNewTagDiv(markElem).parentElement;\n  var newTagNoticeWrapper = newTagWrapper.querySelector('[data-notice]');\n  var newTagNotice = newTagNoticeWrapper.querySelector('.tm-notice');\n  var plusLink = tagsManagementElement.querySelector('.fa-plus');\n  if (plusLink) {\n    plusLink.classList.add('hide');\n  }\n  if (newTagNoticeWrapper && newTagNotice) {\n    newTagNotice.textContent = text;\n    if (newTagNoticeWrapper.classList.contains('hide')) {\n      newTagNoticeWrapper.classList.remove('hide');\n    }\n  }\n}\n\n/**\n * Returns one of the following:\n * - 'added' if the tag has been assigned to the mark in question.\n * - 'suggested' if the tag has not been assigned to the mark in question.\n * - 'neither' if neither case is true (error case).\n *\n * @param tag\n * @returns {string}\n */\nfunction isTagAddedOrSuggested(tag) {\n  var response = 'neither';\n  if (!tag) {\n    return response;\n  }\n  var parent = tag.parentElement;\n  if (!parent) {\n    return response;\n  }\n  if (parent.classList.contains('existing-tags')) {\n    response = 'added';\n  }\n  if (parent.classList.contains('suggested-tags')) {\n    response = 'suggested';\n  }\n  return response;\n}\n\n/**\n * Find the mark Element on the page for a mark id. This function is used on the reader as well as on the\n * Annotations page. On the Annotations page, we the elements have a secondary data attribute - userMarkRecordId.\n * If a userMarkRecordId is provided, search for the mark element with that attribute. This is needed b/c\n * mark is not atomic on this, only on a 
109section in the reader.\n * @param markId\n * @param userMarkRecordId\n * @returns {Element}\n */\nfunction findMarkElementFor(markId) {\n  var _getMarkElement;\n  var userMarkRecordId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  if (userMarkRecordId) {\n    return getUserHighlight(markId, userMarkRecordId);\n  }\n\n  // The account Annotations page has no <mark> to fall back on. Its card holds\n  // the same tray, so callers that only know the mark id still find it (#4368).\n  return (_getMarkElement = getMarkElement(markId)) !== null && _getMarkElement !== void 0 ? _getMarkElement : (0,_account_tag_save__WEBPACK_IMPORTED_MODULE_34__.annotationCardFor)(markId);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYW5ub3RhdGlvbnMvbWFuYWdlLXRhZ3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFVQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFPQTtBQUFBO0FBcVBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFyUEE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBUUE7QUFBQTtBQXFGQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBckZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
109BRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFHQTtBQUFBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBT0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFBQTtBQUxBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFiQTtBQWNBO0FBQUE7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVRBO0FBQUE7QUFmQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFZQTtBQUFBO0FBc0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUF0SUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBOztBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
109BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFkQTtBQWVBO0FBQUE7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBQUE7QUFuQkE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQU9BO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQVVBO0FBQUE7QUE0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBQUE7QUE1RkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBVUE7QUFBQTtBQXNNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBdE1BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQUE7QUFXQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUVBOztBQUVBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBSUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
109BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUF0REE7QUFBQTtBQUFBO0FBc0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQUE7QUFGQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBOztBQUVBOztBQUtBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0F
109BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL2Fubm90YXRpb25zL21hbmFnZS10YWdzLmpzPzgzYzciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3luY05vdGljZX0gZnJvbSBcIi4uL25vdGljZXMvbm90aWNlXCI7XG5pbXBvcnQgVXNlck1hcmtzIGZyb20gXCIuLi9ib29rcy91c2VyLW1hcmtzXCI7XG5pbXBvcnQge1NwaW5uZXJ9IGZyb20gXCIuLi9zcGlubmVyXCI7XG5pbXBvcnQge2FwcENvbG9ycywgaW5zZXJ0T3ZlcmxheU9uRWxlbWVudCwgcmVtb3ZlT3ZlcmxheU9uRWxlbWVudH0gZnJvbSBcIi4uL3V0aWxpdGllcy9nZW5lcmFsXCI7XG5pbXBvcnQge1xuICBmaW5kTWFya0luU2VjdGlvbkNvbGxlY3Rpb25JblNlc3Npb25TdG9yYWdlLFxuICBnZXRTZWN0aW9uTWFya3NGcm9tU2Vzc2lvblN0b3JhZ2UsXG4gIHVwZGF0ZU1hcmtJblNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZVxufSBmcm9tICcuL3Nlc3Npb24tc3RvcmFnZSc7XG5pbXBvcnQge1xuICBmaW5kVGFnT25QYWdlQnlUZXh0LFxuICBtYW5hZ2VUZXh0Q291bnRFbGVtZW50LFxuICBpc1RhZ01hbmFnZW1lbnRPblJlYWRlcixcbiAgc29ydFRhZ3NCeU5hbWVTb3J0aW5nRnVuY3Rpb24sXG4gIHNwb3RsaWdodFRhZyxcbiAgcmVtb3ZlU3BvdGxpZ2h0RnJvbVRhZ3MsXG4gIHRhZ3NTb3J0aW5nRnVuY3Rpb24sXG4gIGlzUGFyZW50VmlzaWJsZSwgZW5zdXJlU2Vuc2libGVWYWx1ZXNcbn0gZnJvbSBcIi4uL2FjY291bnQvdGFncy9mdW5jdGlvbnNcIjtcbmltcG9ydCB7XG4gIGFubm90YXRpb25DYXJkRm9yLFxuICBzYXZlQWNjb3VudEFubm90YXRpb25UYWdzLFxuICBzeW5jQW5ub3RhdGlvbkNhcmRUYWdzXG59IGZyb20gJy4vYWNjb3VudC10YWctc2F2ZSc7XG5pbXBvcnQgeyBhcHBseU5vdGVUYWdNYXJrZXIgfSBmcm9tIFwiLi9ub3RlLXRhZy1tYXJrZXJc
109IjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2kxOG5cIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuLi91dGlsaXRpZXMvZGVidWdcIjtcbmNvbnN0IHsgbG9nIH0gPSBjcmVhdGVMb2dnZXIoJ21hbmFnZS10YWdzJyk7XG5cbi8vIFRoZSBjaGlwcyBhbiBhbm5vdGF0aW9uIGNhcmQgc2hvd3MgZm9yIHRoZSB0YWdzIGl0IGFscmVhZHkgY2Fycmllcy4gVHdvXG4vLyBtYXJrdXBzLCBvbmUgbWVhbmluZzogdGhlIHJlYWRlciB3cml0ZXMgYC50YWdzLXdyYXBwZXJgIChyZW5kZXJUYWdzT25PcHRpb25zRGl2KVxuLy8gYW5kIHRoZSBhY2NvdW50IEFubm90YXRpb25zIHBhZ2Ugd3JpdGVzIGAuc2hvdy10YWdzYCAoVXNlck1hcms6OnJlbmRlckNvbGxlY3Rpb24pLlxuLy8gTWF0Y2hpbmcgb25seSB0aGUgcmVhZGVyJ3MgbGVmdCB0aGUgYWNjb3VudCB0cmF5IGVtcHR5LCBhbmQgYW4gZW1wdHkgdHJheSBpc1xuLy8gbm90IGNvc21ldGljIOKAlCB0aGUgc2F2ZSBwb3N0cyB3aGF0IHRoZSB0cmF5IHNob3dzLCBzbyBpdCB3b3VsZCBoYXZlIHdpcGVkXG4vLyBldmVyeSB0YWcgb24gdGhlIGFubm90YXRpb24gKCM0MzY4KS5cbmNvbnN0IEFTU0lHTkVEX1RBR19DSElQX1NFTEVDVE9SID0gJy50YWdzLXdyYXBwZXIgLnRhZywgLnNob3ctdGFncyAudGFnJztcblxuLy8gU2Vuc2libGUgZGVmYXVsdCBzb3J0IGRpcmVjdGlvbiBmb3IgZWFjaCBzdWdnZXN0ZWQtdGFncyBzb3J0IG9wdGlvbi5cbi8vIE5hbWUgcmVhZHMgYmVzdCBhc2NlbmRpbmcgKEEtWik7IHJlY2VuY3kgYW5kIHVzYWdlIHJlYWQgYmVzdCBkZXNjZW5kaW5nXG4vLyAobW9zdCByZWNlbnQgLyBtb3N0IHVzZWQgZmlyc3QpLlxuY29uc3QgU09SVF9ERUZBVUxUX0RJUkVDVElPTlMgPSB7IG5hbWU6ICdhc2MnLCB0aW1lOiAnZGVzYycsIHVzYWdlOiAnZGVzYycgfTtcblxuLy8gRm9udEF3ZXNvbWUgZ2x5cGggcGVyIHNvcnQgb3B0aW9uIGFuZCBkaXJlY3Rpb24uIE5hbWUgYW5kIHRpbWUga2VlcCBhXG4vLyBkaXN0aW5jdCBiYXNlIGdseXBoIChsZXR0ZXJzIC8gc2l6ZSBiYXJzKSB3aXRoIHRoZSBhcnJvdyBkaXJlY3Rpb24gc2hvd2luZ1xuLy8gYXNjZW5kaW5nIHZzIGRlc2NlbmRpbmcuIFVzYWdlIHVzZXMgYSByaXNpbmcgdnMgZmFsbGluZyBjaGFydCBsaW5lXG4vLyAobW9zdCB1c2VkIC8gbGVhc3QgdXNlZCkuXG5jb25zdCBTT1JUX0lDT05fQ0xBU1NFUyA9IHtcbiAgbmFtZTogeyBhc2M6ICdmYS1hcnJvdy1kb3duLWEteicsIGRlc2M6ICdmYS1hcnJvdy11cC1hLXonIH0sXG4gIHRpbWU6IHsgYXNjOiAnZmEtYXJyb3ctdXAtd2lkZS1zaG9ydCcsIGRlc2M6ICdmYS1hcnJvdy1kb3duLXdpZGUtc2hvcnQnIH0sXG4gIHVzYWdlOiB7IGFzYzogJ2ZhLWNoYXJ0LWxpbmUtZG93bicsIGRlc2M6ICdmYS1jaGFydC1saW5lJyB9LFxufTtcblxuLy8gaTE4biBrZXkgKyBFbmdsaXNoIGZhbGxiYWNrIGZvciBlYWNoIHNvcnQgb3B0aW9uIGFuZCBkaXJlY3Rpb24gdG9vbHRpcC5cbmNvbnN0IFNPUlRfVElUTEVfS0VZUyA9IHtcbiAgbmFtZTogeyBhc2M6IFsnc29ydF9heicsICdTb3J0IEEtWiddLCBkZXNjOiBbJ3NvcnRfemEnLCAnU29ydCBaLUEnXSB9LFxuICB0aW1lOiB7XG4gICAgYXNjOiBbJ3NvcnRfbGVhc3RfcmVjZW50JywgJ1NvcnQgYnkgTGVhc3QgUmVjZW50J10sXG4gICAgZGVzYzogWydzb3J0X21vc3RfcmVjZW50JywgJ1NvcnQgYnkgTW9zdCBSZWNlbnQnXSxcbiAgfSxcbiAgdXNhZ2U6IHtcbiAgICBhc2M6IFsnc29ydF9sZWFzdF91c2VkJywgJ1NvcnQgYnkgTGVhc3QgVXNlZCddLFxuICAgIGRlc2M6IFsnc29ydF9tb3N0X3VzZWQnLCAnU29ydCBieSBNb3N0IFVzZWQnXSxcbiAgfSxcbn07XG5cbi8qKlxuICogUmVuZGVyIHRoZSB0YWdzIG1hbmFnZW1lbnQgY29udHJvbHMgaW4gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0UGFnZVxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUYWdNYW5hZ2VtZW50Q29udHJvbHMoZXZlbnQsIHRhcmdldFBhZ2UpIHtcbiAgLyoqIG1haW4gdGFncyBjb250cm9scyBkaXYgKiovXG4gIGNvbnN0IG9wdGlvbnNEaXYgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLmFubm90YXRpb24tb3B0aW9ucycpO1xuXG4gIGNvbnN0IHtkYXRhc2V0OiB7bWFya0lkID0gbnVsbH19ID0gb3B0aW9uc0RpdjtcbiAgLy8gZ3VhcmQgY2xhdXNlIC0gcmV0dXJuIGlmIHdlIGRvIG5vdCBoYXZlIGEgbWFyayBpZCB0byBhdHRhY2ggdG9cbiAgaWYgKCFtYXJrSWQpIHtcbiAgICBsZXQgbXNnID0gdCgnZXJyb3JfbG9hZGluZ190YWdfY29udHJvbHMnKSB8fCAnVGhlcmUgd2FzIGEgcHJvYmxlbSBsb2FkaW5nIHRoZSB0YWcgbWFuYWdlbWVudCBjb250cm9scyBmb3IgdGhpcyBhbm5vdGF0aW9uLic7XG4gICAgbGV0IG5vdGljZSA9IG5ldyBBc3luY05vdGljZShtc2csICdlcnJvcicpO1xuICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoe30sIHRydWUpO1xuICAgIG5vdGljZS5yZW1vdmUoKTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IG1hbmFnZVRhZ3NBcmVhLCBpbnB1dFRleHRFbGVtLCBzdWdnZXN0ZWRUYWdzV3JhcHBlciwgZXhpc3RpbmdUYWdzV3JhcHBlciwgcDtcblxuICAvKiogbWFpbiBkaXYgY29udGFpbmVyIGZvciB0aGUgdGFncyBtYW5hZ2VtZW50IGNvbnRyb2xzICoqL1xuICBjb25zdCBjb250cm9sc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjb250cm9sc0Rpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCBtYXJrSWQpO1xuICBjb250cm9sc0Rpdi5jbGFzc0xpc3QuYWRkKCdhbm5vdGF0aW9uLW9wdGlvbnMnKTtcbiAgY29udHJvbHNEaXYuY2xhc3NMaXN0LmFkZCgnbm8tYWN0aW9ucy10b3AnKTtcbiAgY29udHJvbHNEaXYuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRyb2xzLWZvcicsICd0YWdzJyk7XG4gIGNvbnRyb2xzRGl2LnNldEF0dHJpYnV0ZSgnZGF0YS1pbml0aWFsLW9wZW4nLCAndHJ1ZScpO1xuXG4gIC8vICd4JyBidXR0b24gdG8gY2xvc2UgdGhlIG9wdGlvbnMgZGl2XG4gIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gIGEuY2xhc3NMaXN0LmFkZCgnY2xvc2UtYnV0dG9uJyk7XG5cbiAgbGV0IGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XG4gIGkuY2xhc3NMaXN0LnZhbHVlID0gJ2ZhcyBmYS10aW1lcy1jaXJjbGUnO
1091xuICBpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICBhLmFwcGVuZENoaWxkKGkpO1xuXG4gIC8vIGV2ZW50IHRvIGhpZGUgdGhlIG9wdGlvbnMgZGl2XG4gIGEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29udHJvbHNEaXYuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICB9KTtcblxuICBjb250cm9sc0Rpdi5hcHBlbmQoYSk7XG5cbiAgLy8gMXN0IGVsZW1lbnQgLSBleGlzdGluZyB0YWdzIHdyYXBwZXIgLSBtYXJrRGF0YSBuZWVkZWQ6IGlkLCB0YWdzIChpZHMpXG4gIGxldCBtYXJrcywgbWFya0RhdGEsIHVzZXJNYXJrUmVjb3JkSWQ7XG4gIGlmICh0YXJnZXRQYWdlID09PSAncmVhZGVyJykge1xuICAgIG1hcmtzID0gZ2V0U2VjdGlvbk1hcmtzRnJvbVNlc3Npb25TdG9yYWdlKCk7XG4gICAgbWFya0RhdGEgPSBtYXJrcy5maW5kKChlbGVtZW50KSA9PiBwYXJzZUludChlbGVtZW50LmlkKSA9PT0gcGFyc2VJbnQobWFya0lkKSk7XG4gICAgbWFya0RhdGEudGFncyA9IG1hcmtEYXRhLnRhZ3MgPyBtYXJrRGF0YS50YWdzIDogW107XG4gIH0gZWxzZSB7XG4gICAgLy8gdGFyZ2V0UGFnZSA9PT0gJ2Fubm90YXRpb25zJ1xuICAgIGxldCB0YWdzID0gW107XG4gICAgY29uc3QgYW5ub3RhdGlvbldyYXBwZXIgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnW2RhdGEtYW5ub3RhdGlvbl0nKTtcbiAgICBpZiAoYW5ub3RhdGlvbldyYXBwZXIpIHtcbiAgICAgIGNvbnN0IHsgZGF0YXNldDogeyBtYXJrSWQsIHVzZXJNYXJrUmVjb3JkSWQ6IGFubm90YXRpb25NYXJrUmVjb3JkSWQgPSBudWxsIH0gfSA9IGFubm90YXRpb25XcmFwcGVyO1xuICAgICAgdXNlck1hcmtSZWNvcmRJZCA9IGFubm90YXRpb25NYXJrUmVjb3JkSWQ7XG5cbiAgICAgIGNvbnN0IG1hcmtUYWdzRWxlbWVudHMgPSBhbm5vdGF0aW9uV3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKEFTU0lHTkVEX1RBR19DSElQX1NFTEVDVE9SKTtcbiAgICAgIGlmKG1hcmtUYWdzRWxlbWVudHMpIHtcbiAgICAgICAgbWFya1RhZ3NFbGVtZW50cy5mb3JFYWNoKCh0YWcpID0+IHtcbiAgICAgICAgICBsZXQgeyBkYXRhc2V0OiB7IGlkLCBjb2xvciwgdXNhZ2UsIGxhc3RVcGRhdGVkLCB0ZXh0IH0gfSA9IHRhZztcbiAgICAgICAgICAvLyBlbnN1cmVTZW5zaWJsZVZhbHVlcyBkZWZhdWx0cyB0aGUgZGlzcGxheSBmaWVsZHMgYW5kIGRyb3BzXG4gICAgICAgICAgLy8gZXZlcnl0aGluZyBlbHNlLCBgaWRgIGluY2x1ZGVkIOKAlCBhbmQgdGhlIGlkIGlzIHRoZSBvbmUgZmllbGQgdGhlXG4gICAgICAgICAgLy8gc2F2ZSBjYW5ub3QgZG8gd2l0aG91dCwgc28gaXQgaXMgY2FycmllZCBhY3Jvc3MgZXhwbGljaXRseSAoIzQzNjgpLlxuICAgICAgICAgIHRhZ3MucHVzaCh7aWQsIC4uLmVuc3VyZVNlbnNpYmxlVmFsdWVzKHtjb2xvciwgaWQsIGxhc3RVcGRhdGVkLCB0ZXh0LCB1c2FnZX0pfSk7XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIG1hcmtEYXRhID0geydpZCc6IG1hcmtJZCwgdGFnc307XG4gICAgfVxuICB9XG5cbiAgLy8gYXNzaWduZWQgdGFncyBsYWJlbFxuICBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICBwLmNsYXNzTGlzdC5hZGQoJ3RpdGxlJyk7XG4gIHAuc2V0QXR0cmlidXRlKCdkYXRhLWxhYmVsLXR5cGUnLCAnYXNzaWduZWQnKTtcbiAgcC50ZXh0Q29udGVudCA9IHQoJ2Fzc2lnbmVkX3RhZ3MnKSB8fCAnQXNzaWduZWQgVGFncyc7XG5cbiAgLy8gY29udGFpbmVyIHdpdGggZXhpc3RpbmcgdGFnc1xuICBjb25zdCBzaG93VXNhZ2UgPSB0cnVlO1xuICBleGlzdGluZ1RhZ3NXcmFwcGVyID0gcmVuZGVyRXhpc3RpbmdUYWdzKG1hcmtEYXRhLCAndGFncycsIHNob3dVc2FnZSk7XG4gIGlmIChtYXJrRGF0YS50YWdzLmxlbmd0aCA+IDQpIHtcbiAgICBjcmVhdGVEZWxldGVBbGxCdXR0b24oZXhpc3RpbmdUYWdzV3JhcHBlciwgbWFya0RhdGEpO1xuICB9XG5cbiAgLy8gd3JhcHBlciBmb3IgZXhpc3RpbmcgdGFncyBhcmVhXG4gIGNvbnN0IGV4aXN0aW5nVGFnc0FyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZXhpc3RpbmdUYWdzQXJlYS5jbGFzc0xpc3QuYWRkKCdhZGQtZWRpdC10YWctYXJlYScpO1xuXG4gIGV4aXN0aW5nVGFnc0FyZWEuYXBwZW5kQ2hpbGQocCk7XG4gIGV4aXN0aW5nVGFnc0FyZWEuYXBwZW5kQ2hpbGQoZXhpc3RpbmdUYWdzV3JhcHBlcik7XG4gIGNvbnRyb2xzRGl2LmFwcGVuZChleGlzdGluZ1RhZ3NBcmVhKTtcblxuICAvKiogdGFncyBtYW5hZ2VtZW50IGFyZWEgKiovXG4gIG1hbmFnZVRhZ3NBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG1hbmFnZVRhZ3NBcmVhLmNsYXNzTGlzdC5hZGQoJ2FkZC1lZGl0LXRhZy1hcmVhJyk7XG5cbiAgLy8gMXN0IGVsZW1lbnQgLSBpbnB1dCBmaWVsZFxuICBpbnB1dFRleHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgaW5wdXRUZXh0RWxlbS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dCcpO1xuICBpbnB1dFRleHRFbGVtLnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsICd0YWctaW5wdXQnKTtcbiAgaW5wdXRUZXh0RWxlbS5zZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZG
109VyJywgdCgnYWRkX2FfdGFnJykgfHwgJ0FkZCBhIHRhZycpO1xuICBpbnB1dFRleHRFbGVtLmZvY3VzKCk7XG5cbiAgLyogZXZlbnQgaGFuZGxlciAtIHRleHQgaW5wdXQga2V5dXAgKi9cbiAgaW5wdXRUZXh0RWxlbS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHRleHQgY291bnRcbiAgICBjb25zdCB0ZXh0Q291bnRTcGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRleHQtY291bnQgc3BhbicpO1xuICAgIGNvbnN0IG5vdGljZURpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW5vdGljZV0nKTtcbiAgICBjb25zdCBub3RpY2VFbGVtZW50ID0gbm90aWNlRGl2Py5xdWVyeVNlbGVjdG9yKCcudG0tbm90aWNlJyk7XG4gICAgY29uc3QgeyB0YXJnZXQ6IHsgdmFsdWU6IHRleHQgfSB9ID0gZXZlbnQ7XG5cbiAgICBpZih0ZXh0Lmxlbmd0aCA+IDUwKSB7XG4gICAgICBldmVudC50YXJnZXQudmFsdWUgPSB0ZXh0LnNsaWNlKDAsIDUwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFuYWdlVGV4dENvdW50RWxlbWVudCh0ZXh0LCB0ZXh0Q291bnRTcGFuKTtcbiAgICAgIC8vICdFbnRlcicga2V5IGhhbmRsZWQgYmVsb3dcbiAgICAgIGlmIChldmVudC5rZXkgIT09ICdFbnRlcicpIHtcbiAgICAgICAgbm90aWNlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAvLyBjb25zdCBub3RpY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG0tbm90aWNlJyk7XG4gICAgICAgIC8vIGlmKG5vdGljZSAmJiBub3RpY2UudGV4dENvbnRlbnQgPT09ICdUYWcgYWxyZWFkeSBleGlzdHMnKSB7XG4gICAgICAgIC8vICAgcmV0dXJuO1xuICAgICAgICAvLyB9XG4gICAgICAgIGNvbnN0IHsgc29ydEJ5LCBkaXJlY3Rpb24gfSA9IGN1cnJlbnRTdWdnZXN0ZWRUYWdzU29ydFByb3BlcnRpZXMobWFya0lkKTtcbiAgICAgICAgdXBkYXRlVGFnTWFuYWdlbWVudEVsZW1lbnRzKG1hcmtJZCwgc29ydEJ5LCBkaXJlY3Rpb24sIHVzZXJNYXJrUmVjb3JkSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICAvLyAybmQgZWxlbWVudCAtICBUZXh0IGNvdW50XG4gIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICB0ZXh0U3Bhbi5pbm5lclRleHQgPSAnMCc7XG5cbiAgY29uc3QgdGV4dENvdW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRleHRDb3VudC5jbGFzc0xpc3QuYWRkKCd0ZXh0LWNvdW50Jyk7XG4gIHRleHRDb3VudC5hcHBlbmRDaGlsZCh0ZXh0U3Bhbik7XG5cbiAgY29uc3QgZGVub21pbmF0b3IgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnLzUwJyk7XG4gIHRleHRDb3VudC5hcHBlbmRDaGlsZChkZW5vbWluYXRvcik7XG5cbiAgLy8gM3JkIGVsZW1lbnQgLSBuZXcgdGFnIHdyYXBwZXJcbiAgY29uc3QgbmV3VGFnV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjb25zdCB0YWdEYXRhID0ge2NvbG9yOiAnZGVmYXVsdCcsIGlkOiBudWxsLCBsYXN0VXBkYXRlZDogbnVsbCwgdGV4dDogJycsICB1c2FnZTogJzAnfTtcblxuICAvLyBuZXcgdGFnIGRpdlxuICBjb25zdCBuZXdUYWdEaXYgPSBjcmVhdGVOZXdUYWdEaXYobWFya0lkLCAnbmV3JywgdGFnRGF0YSk7XG4gIG5ld1RhZ1dyYXBwZXIuY2xhc3NMaXN0LmFkZCgnbmV3LXRhZycpO1xuICBuZXdUYWdXcmFwcGVyLmFwcGVuZENoaWxkKG5ld1RhZ0Rpdik7XG5cbiAgY29uc3Qgbm90aWNlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBub3RpY2VXcmFwcGVyLnNldEF0dHJpYnV0ZSgnZGF0YS1ub3RpY2UnLCAnJyk7XG4gIG5vdGljZVdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuXG4gIGNvbnN0IG5vdGljZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbm90aWNlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0bS1ub3RpY2UnKTtcbiAgbm90aWNlV3JhcHBlci5hcHBlbmRDaGlsZChub3RpY2VFbGVtZW50KTtcbiAgbmV3VGFnV3JhcHBlci5hcHBlbmRDaGlsZChub3RpY2VXcmFwcGVyKTtcblxuICAvLyA0dGggZWxlbWVudCAtIHN1Z2dlc3Rpb25zIGFyZWFcbiAgc3VnZ2VzdGVkVGFnc1dyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc3VnZ2VzdGVkVGFnc1dyYXBwZXIuY2xhc3NMaXN0LmFkZCgnc3VnZ2VzdGVkLXRhZ3Mtd3JhcHBlcicpO1xuXG4gIC8vIGNvbG9yIGNvbnRyb2xzXG4gIGNvbnN0IGNvbG9yQ29udHJvbHNFbGVtID0gY3JlYXRlQ29sb3JDb250cm9scyhtYXJrSWQpO1xuXG4gIC8vIDFzdCBlbGVtZW50IC0gbGFiZWwgJiBzb3J0IGNvbnRyb2xzXG4gIC8vIFNvcnQgcm93IFRpdGxlXG4gIGxldCBzb3J0VGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc29ydFRpdGxlRGl2LmNsYXNzTGlzdC5hZGQoJ2F1dG8tY2VsbCcpO1xuXG4gIHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gIHAuY2xhc3NMaXN0LmFkZCgndGl0bGUnKTtcbiAgcC50ZXh0Q29udGVudCA9IHQoJ3N1Z2dlc3Rpb25zJykgfHwgJ1N1Z2dlc3Rpb25zJztcblxuICBzb3J0VGl0bGVEaXYuYXBwZW5kQ2hpbGQocCk7XG5cbiAgbGV0IHNvcnRPcHRpb25zRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHNvcnRPcHRpb25zRGl2LmNsYXNzTGlzdC5hZGQoJ2F1dG8nLCAnY2VsbCcsICdzb3J0LW9wdGlvbnMnKTtcblxuICAvLyBTb3J0IEEtWiBpY29uIChhY3RpdmUgYnkgZGVmYXVsdClcbiAgY29uc3QgbmFtZVNvcnRTcGFuID0gY3JlYXRlU29ydE9wdGlvblNwYW4oJ25hbWUnKTtcbiAgbmFtZVNvcnRTcGFuLmNsYXNzTGlzdC5hZGQoJ3NvcnRlZCcpO1xuICBzb3J0T3B0aW9uc0Rpdi5hcHBlbmRDaGlsZChuYW1lU29ydFNwYW4pO1xuXG4gIC8vIFNvcnQgYnkgcmVjZW5jeSBpY29uXG4gIHNvcnRPcHRpb25zRGl2LmFwcGVuZENoaWxkKGNyZWF0ZVNvcnRPcHRpb25TcGFuKCd0aW1lJykpO1xuXG4gIC8vIFNvcnQgYnkgdXN
109hZ2UgaWNvblxuICBzb3J0T3B0aW9uc0Rpdi5hcHBlbmRDaGlsZChjcmVhdGVTb3J0T3B0aW9uU3BhbigndXNhZ2UnKSk7XG5cbiAgLy8gMm5kIGVsZW1lbnQgLSBzdWdnZXN0ZWQgdGFncyBkaXZcbiAgY29uc3Qgc3VnZ2VzdGVkVGFnc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBzdWdnZXN0ZWRUYWdzRGl2LmNsYXNzTGlzdC5hZGQoJ3N1Z2dlc3RlZC10YWdzJyk7XG5cbiAgLy8gaW5pdGlhbCBubyBjb250ZW50cyBzcGFuXG4gIGNvbnN0IG5vbmVTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICBub25lU3Bhbi5pbm5lckhUTUwgPSB0KCdub19zdWdnZXN0aW9ucycpIHx8ICdObyBzdWdnZXN0aW9ucy4nO1xuXG4gIHN1Z2dlc3RlZFRhZ3NEaXYuYXBwZW5kQ2hpbGQobm9uZVNwYW4pO1xuXG4gIC8vIFN1Z2dlc3RlZCB0YWdzIHRpdGxlIGFuZCBTb3J0IG9wdGlvbnNcbiAgbGV0IHNvcnRSb3dEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc29ydFJvd0Rpdi5jbGFzc0xpc3QuYWRkKCdncmlkLXgnKTtcbiAgc29ydFJvd0Rpdi5hcHBlbmRDaGlsZChzb3J0VGl0bGVEaXYpO1xuICBzb3J0Um93RGl2LmFwcGVuZENoaWxkKHNvcnRPcHRpb25zRGl2KTtcblxuICBzdWdnZXN0ZWRUYWdzV3JhcHBlci5hcHBlbmRDaGlsZChzb3J0Um93RGl2KTtcbiAgc3VnZ2VzdGVkVGFnc1dyYXBwZXIuYXBwZW5kQ2hpbGQoc3VnZ2VzdGVkVGFnc0Rpdik7XG5cbiAgLy8gYWRkIHRoZSBzdWdnZXN0ZWQgdGFncyB3cmFwcGVyIHRvIHRoZSBtYWluIG1hbmFnZSB0YWdzIGRpdlxuICBtYW5hZ2VUYWdzQXJlYS5hcHBlbmRDaGlsZChpbnB1dFRleHRFbGVtKTtcbiAgbWFuYWdlVGFnc0FyZWEuYXBwZW5kQ2hpbGQodGV4dENvdW50KTtcbiAgbWFuYWdlVGFnc0FyZWEuYXBwZW5kQ2hpbGQobmV3VGFnV3JhcHBlcik7XG4gIG1hbmFnZVRhZ3NBcmVhLmFwcGVuZENoaWxkKGNvbG9yQ29udHJvbHNFbGVtKTtcbiAgbWFuYWdlVGFnc0FyZWEuYXBwZW5kQ2hpbGQoc3VnZ2VzdGVkVGFnc1dyYXBwZXIpO1xuXG4gIC8vIG1hbmFnZSB0YWdzIGFyZWEgdG8gbWFpbiBjb250cm9scyBkaXZcbiAgY29udHJvbHNEaXYuYXBwZW5kQ2hpbGQobWFuYWdlVGFnc0FyZWEpO1xuXG4gIC8qKiogaGFuZGxlICdFbnRlcicgcHJlc3MgKioqL1xuICAvL1xuICAvLyBCb3VuZCB0byB0aGUgVFJBWSwgbm90IHRvIGBkb2N1bWVudGAgKCM0NTkxKS5cbiAgLy9cbiAgLy8gVGhlIGRvY3VtZW50IGJpbmRpbmcgd2FzIG5ldmVyIHJlbW92ZWQg4oCUIGByZW1vdmVFdmVudExpc3RlbmVyYCBhcHBlYXJlZFxuICAvLyBub3doZXJlIGluIHRoaXMgZmlsZSDigJQgc28gZXZlcnkgdHJheSBvcGVuZWQgbGVmdCBhbm90aGVyIGdsb2JhbCBsaXN0ZW5lclxuICAvLyBiZWhpbmQsIGVhY2ggY2xvc2luZyBvdmVyIGl0cyBvd24gbWFya0lkLiBPbmNlIHRob3NlIG1hcmtzIHdlcmUgZGVsZXRlZFxuICAvLyB0aGUgb3JwaGFucyB0aHJldyBvbiBldmVyeSBrZXlzdHJva2UsIGFuZCB0aGV5IGFjY3VtdWxhdGVkIHBlciB0cmF5IG9wZW4uXG4gIC8vXG4gIC8vIFBhaXJpbmcgdGhlIGFkZCB3aXRoIGEgcmVtb3ZlIGF0IGVhY2ggdGVhcmRvd24gc2l0ZSB3b3VsZCB3b3JrIHVudGlsXG4gIC8vIHNvbWVvbmUgYWRkZWQgYSBzZXZlbnRoIG9uZS4gQmluZGluZyBoZXJlIG1lYW5zIHRoZSBoYW5kbGVyIGlzIGNvbGxlY3RlZFxuICAvLyB3aXRoIHRoZSBub2RlLCBhdCBldmVyeSByZW1vdmFsIHNpdGUgaW5jbHVkaW5nIG9uZXMgbm90IHlldCB3cml0dGVuLlxuICAvL1xuICAvLyBTYWZlIGJlY2F1c2Ugbm8gaW50ZXJhY3Rpb24gdGhpcyBoYW5kbGVyIHNlcnZlcyBjYW4gc3RhcnQgb3V0c2lkZSB0aGVcbiAgLy8gdHJheTogdGhlIGFkZC10YWcgYnJhbmNoIGlzIGdhdGVkIG9uIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PVxuICAvLyBpbnB1dFRleHRFbGVtYCwgdGhlIG90aGVyIEVudGVyIGJyYW5jaCBuZWVkcyB0aGUgY29sb3VyIHNlbGVjdG9yIGZvY3VzZWQsXG4gIC8vIEVzY2FwZSBvbmx5IGFjdHMgd2hpbGUgdGhlIGNvbG91ciBwb3B1cCBpcyBvcGVuLCBhbmQgdGhlIGFycm93IGtleXMgZHJpdmVcbiAgLy8gdGhhdCBzYW1lIHNlbGVjdG9yIOKAlCBhbGwgb2Ygd2hpY2ggbGl2ZSBpbnNpZGUgYGNvbnRyb2xzRGl2YC5cbiAgY29udHJvbHNEaXYuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHsga2V5VXBMaXN0ZW5lcihldmVudCwgaW5wdXRUZXh0RWxlbSwgbWFya0lkKTsgfSk7XG5cbiAgcmV0dXJuIGNvbnRyb2xzRGl2O1xufVxuXG4vKipcbiAqIExpc3RlbmVyIHRvIGtleSBldmVudHM7IGhhbmRsZXMgJ0VudGVyJywgJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0J1xuICogQHBhcmFtIGV2ZW50XG4gKiBAcGFyYW0gaW5wdXRUZXh0RWxlbVxuICogQHBhcmFtIG1hcmtJZFxuICovXG5hc3luYyBmdW5jdGlvbiBrZXlVcExpc3RlbmVyKGV2ZW50LCBpbnB1dFRleHRFbGVtLCBtYXJrSWQpIHtcbiAgY29uc3Qgbm90aWNlRGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtbm90aWNlXScpO1xuICBjb25zdCBub3RpY2VFbGVtZW50ID0gbm90aWNlRGl2Py5xdWVyeVNlbGVjdG9yKCcudG0tbm90aWNlJyk7XG4gIC8vIGZpbmRNYXJrRWxlbWVudEZvciwgbm90IGdldE1hcmtFbGVtZW50OiB0aGUgdHJheSB0aGlzIGxpc3RlbmVyIGlzIGJvdW5kIHRvXG4gIC8vIGhhbmdzIG9mZiBhIGNhcmQgb24gdGhlIGFjY291bnQgQW5ub3RhdGlvbnMgcGFnZSwgd2hlcmUgdGhlcmUgaXMgbm8gPG1hcms+LlxuICAvLyBnZXRNYXJrRWxlbWVudCgpIHJldHVybmVkIG51bGwgZm9yIGV2ZXJ5IGtleXN0cm9rZSB0aGVyZSwgc28gdGhlIGd1YXJkIGJlbG93XG4gIC8vIHN3YWxsb3dlZCB0aGUgd2hvbGUga2V5Ym9hcmQgcGF0aCDigJQgRW50ZXIgbmV2ZXIgb3BlbmVkIHRoZSBjb2xvdXIgcGlja2VyIGFuZFxuICAvLyBhIG5ldyB0YWcgY291bGQgbm90IGJlIGNyZWF0ZWQgYXQgYWxsICgjNDg1MykuXG4gIGNvbnN0IG1hcmtFbGVtID0gZmluZE1hcmtFbGVtZW50Rm9yKG1hcmtJZCk7XG5cbiAgLy8gVGhlIG1hcmsgY2FuIGJlIGdvbmUg4oCUIG1lcmdlZCBhd2F5LCBkZWxldGVkLCByZS1yZW5kZXJlZCDigJQgd2hpbGUgYSBrZXlzdHJva2VcbiAgLy8gaXMgc3RpbGwgaW4gZmxpZ2h0ICgjNDU5MSkuIFRoZSBndWFyZCBiZWxvdyBjb3ZlcnMgbmV3VGFnQ29sb3JzRGl2LCBhbmQgdGhlXG4gIC8vIHR3byBsaW5lcyBhZnRlciB0aGlzIG9uZSBhbHJlYWR5IHVzZSBvcHRpb25hbCBjaGFpbmluZzsgdGhpcyBsaW5lIHdhcyB0aGVcbiAgLy8gb25seSBvbmUgbGVmdCB1bmd1YXJkZWQsIGFuZCBpdCBpcyB0aGUgb25lIHRoYXQgdGhyZXcuXG4gIGlmICghbWFya0VsZW0pIHJldHVybjtcblxuICBjb25zdCBuZXdUYWdDb2xvcnNEaXYgPSBtYXJrRWxlbS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb2xvci1wb3B1cF0nKTtcbiAgY29uc3QgbmV3VGFnQ29sb3JzV3JhcHBlciA9IG5ld1RhZ0NvbG9yc0Rpdj8ucXVlcnlTZWxlY3RvcignLnRhZy1jb2xvcnMtd3JhcHBlcicpO1xuICBjb25zdCBzZWxlY3RlZENvbG9yID0gbmV3VGFnQ29sb3JzRGl2Py5xdWVyeVNlbGVjdG9yKCcuc2VsZWN0ZWQnKTtcblxuICBpZighbmV3VGFnQ29sb3JzRGl2KSByZXR1cm47XG5cbiAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICBpZiAoIW5ld1RhZ0NvbG9yc0Rpdi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUnKSkge1xuICAgICAgc2VsZWN0ZWRDb2xvci5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgICAgY29uc3QgZGVmYXVsdENvbG9yRWxlbSA9IG5ld1RhZ0NvbG9yc0Rpdi5xdWVyeVNlbGVjdG9yKCcudGFnLmRlZmF1bHQnKTtcbiAgICAgIGRlZmF1bHRDb2xvckVsZW0uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgIG5ld1RhZ0NvbG9yc0Rpdi5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgICBpbnB1dFRleHRFbGVtLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBpbnB1dFRleHRFbGVtKSB7XG4gICAgICBjb25zdCBpbnB1dFRleHQgPSBpbnB1dFRleHRFbGVtLnZhbHVlLnRyaW0oKTtcblxuICAgICAgaWYgKGlucHV0VGV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbm90aWNlRWxlbWVudC50ZXh0Q29udGVudCA9IHQoJ25vX3RleHRfZW50ZXJlZCcpIHx8ICdObyB0ZXh0IGVudGVyZWQuJztcbiAgICAgICAgbm90aWNlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgICAgIG5vdGljZURpdi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgICAgI
109HJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gZmV0Y2ggZnJlc2ggZXhpc3RpbmcgdGFncyBldmVyeSB0aW1lICdFbnRlcicgaXMgcHJlc3NlZFxuICAgICAgY29uc3QgZXhpc3RpbmdUYWdzID0gbWFya0VsZW0ucXVlcnlTZWxlY3RvckFsbCgnLmV4aXN0aW5nLXRhZ3MgLnRhZycpO1xuICAgICAgY29uc3QgYWxyZWFkeUFzc2lnbmVkID0gQXJyYXkuZnJvbShleGlzdGluZ1RhZ3MpLmZpbmQodGFnID0+IHtcbiAgICAgICAgbGV0IHRleHQgPSB0YWcuZGF0YXNldC50YWdUZXh0XG4gICAgICAgIHRleHQgPSB0ZXh0ID8gdGV4dC50b0xvd2VyQ2FzZSgpIDogJ1tibGFua10nO1xuXG4gICAgICAgIHJldHVybiB0ZXh0ID09PSBpbnB1dFRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYWxyZWFkeUFzc2lnbmVkKSB7XG4gICAgICAgIG5vdGljZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0KCd0YWdfYWxyZWFkeV9hc3NpZ25lZF9ub3RpY2UnKSB8fCAnVGFnIGFscmVhZHkgYXNzaWduZWQuJztcbiAgICAgICAgbm90aWNlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgICAgIG5vdGljZURpdi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgc3VnZ2VzdGVkIHRhZ3NcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gbWFya0VsZW0ucXVlcnlTZWxlY3RvckFsbCgnLnN1Z2dlc3RlZC10YWdzIC50YWcnKTtcbiAgICAgIGNvbnN0IG1hdGNoID0gQXJyYXkuZnJvbShzdWdnZXN0aW9ucykuZmluZCh0YWcgPT5cbiAgICAgICAgICB0YWcuZGF0YXNldC50YWdUZXh0Py50b0xvd2VyQ2FzZSgpID09PSBpbnB1dFRleHQudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIG1hdGNoLmNsaWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTm8gbWF0Y2ggZm91bmQg4oaSIHNob3cgY29sb3IgcGlja2VyXG4gICAgICBuZXdUYWdDb2xvcnNEaXYuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgaWYgKCFuZXdUYWdDb2xvcnNXcmFwcGVyLmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKSkge1xuICAgICAgICBuZXdUYWdDb2xvcnNXcmFwcGVyLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgfVxuICAgICAgbmV3VGFnQ29sb3JzV3JhcHBlci5mb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoaXNUYWdDb2xvclNlbGVjdG9yRm9yTWFya1Zpc2libGUobWFya0lkKSkgey8vJiYgbmV3VGFnQ29sb3JzV3JhcHBlci5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KVxuICAgICAgYXdhaXQgaGFuZGxlVGFnQ29sb3JTZWxlY3Rpb25FbnRlcihldmVudCwgbWFya0lkKTtcbiAgICB9XG4gIH1cblxuICBpZiAoWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCddLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICB0YWdDb2xvclNlbGVjdG9yQXJyb3dFdmVudEhhbmRsZXIoZXZlbnQsIG1hcmtJZCk7XG4gIH1cbn1cbi8qKlxuICogTGlzdGVuZXIgZm9yIGFycm93IGtleXMgd2hlbiB0aGUgdGFncyBjb2xvciBwYWxldHRlIGlzIHZpc2libGVcbiAqL1xuZnVuY3Rpb24gdGFnQ29sb3JTZWxlY3RvckFycm93RXZlbnRIYW5kbGVyKGV2ZW50LCBtYXJrSWQpIHtcbiAgLy8gJ0VudGVyJyBoYW5kbGVkIGVsc2V3aGVyZVxuICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGtleXVwXG4gICAgY29uc3QgY29sb3JTZWxlY3RvcldyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGFnLWNvbG9ycy13cmFwcGVyW2RhdGEtbWFyay1pZD1cIiR7bWFya0lkfVwiXWApXG4gICAgY29uc3QgY29sb3JTZWxlY3RvciA9IGNvbG9yU2VsZWN0b3JXcmFwcGVyLmNsb3Nlc3QoJy5jb2xvci1zZWxlY3RvcicpO1xuICAgIGNvbnN0IHtjaGlsZHJlbn0gPSBjb2xvclNlbGVjdG9yV3JhcHBlcjtcblxuICAgIC8vIGd1YXJkIGNsYXVzZXNcbiAgICBpZiAoIWlzUGFyZW50VmlzaWJsZShjb2xvclNlbGVjdG9yKSkgcmV0dXJuO1xuICAgIC8vIGlmICghY29sb3JTZWxlY3RvcldyYXBwZXIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHJldHVybjtcblxuICAgIC8vIGdldCB0aGUgY3VycmVudCBpbmRleCBvZiB0ZWggc2VsZWN0ZWQgY2hpbGQgYmVmb3JlIGhhbmRsaW5nIGtleVxuICAgIGxldCBzZWxlY3RlZEluZGV4XG4gICAgICAgID0gQXJyYXlcbiAgICAgICAgLmZyb20oY2hpbGRyZW4pXG4gICAgICAgIC5maW5kSW5kZXgoY2hpbGQgPT4gY2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWxlY3RlZCcpKTtcblxuICAgIC8vIGZhbGxiYWNrIHRvIDAgaWYgbm9uZSBhcmUgc2VsZWN0ZWRcbiAgICBpZiAoc2VsZWN0ZWRJbmRleCA9PT0gLTEpIHNlbGVjdGVkSW5kZXggPSAwO1xuXG4gICAgbGV0IG5ld0NvbG9yID0gJ2RlZmF1bHQnO1xuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnKSB7XG4gICAgICBzZWxlY3RlZEluZGV4ID0gKHNlbGVjdGVkSW5kZXggLSAxICsgY2hpbGRyZW4ubGVuZ3RoKSAlIGNoaWxkcmVuLmxlbmd0aDsgLy8gd3JhcCBhcm91bmRcbiAgICAgIG5ld0NvbG9yID0gdXBkYXRlU2VsZWN0ZWRDb2xvck9uVGFnQ29sb3JQaWNrZXIoY29sb3JTZWxlY3RvcldyYXBwZXIsIHNlbGVjdGVkSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcpIHtcbiAgICAgIHNlbGVjdGVkSW5kZXggPSAoc2VsZWN0ZWRJbmRleCArIDEpICUgY2hpbGRyZW4ubGVuZ3RoOyAvLyB3cmFwIGFyb3VuZFxuICAgICAgbmV3Q29sb3IgPSB1cGRhdGVTZWxlY3RlZENvbG9yT25UYWdDb2xvclBpY2tlcihjb2xvclNlbGVjdG9yV3JhcHBlciwgc2VsZWN0ZWRJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHRoZSBuZXcgdGFnIGVsZW1lbnQgY29sb3JcbiAgICBjb25zdCBuZXdUYWdEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKF9uZXdUYWdFbGVtZW50U2VsZWN0b3IobWFya0lkKSk7XG5cbiAgICBpZihuZXdUYWdEaXYpIHtcbiAgICAgIGNoYW5nZU5ld1RhZ0RpdkNvbG9yKG5ld0NvbG9yLCBuZXdUYWdEaXYpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNb3ZlIHRoZSBzZWxlY3RvciBiYXIgdG8gdGhlIGNvbG9yIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkLlxuICogQHBhcmFtIGNvbG9yU2VsZWN0b3JcbiAqIEBwYXJhbSBpbmRleFxuICovXG5mdW5jdGlvbiB1cGRhdGVTZWxlY3RlZENvbG9yT25UYWdDb2xvclBpY2tlciAoY29sb3JTZWxlY3RvciwgaW5kZXgpIHtcbiAgbGV0IGNvbG9yID0gJ2RlZmF1bHQnO1xuXG4gIGNvbnN0IGNvbG9yRWxlbWVudCA9IGNvbG9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbCgnLnRhZycpO1xuICBjb2xvckVsZW1lbnQuZm9yRWFjaCgoZWxlbSwgaSkgPT4ge1xuICAgIGlmIChpID09PSBpbmRleCkge1xuICAgICAgZWxlbS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgZWxlbS5mb2N1cygpO1xuICAgICAgY29sb3IgPSBlbGVtLmRhdGFzZXQudGFnQ29sb3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICB9XG4gI
109H0pO1xuXG4gIHJldHVybiBjb2xvcjtcbn1cblxuLyoqXG4gKiBFdmVudCBoYW5kbGVyIGZvciAnRW50ZXInIGtleSBvbiB0YWcgY29sb3Igc2VsZWN0aW9uXG4gKiBAcGFyYW0gZXZlbnRcbiAqIEBwYXJhbSBtYXJrSWRcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlVGFnQ29sb3JTZWxlY3Rpb25FbnRlcihldmVudCwgbWFya0lkKSB7XG4gIGNvbnN0IHRhZ01hbmFnZW1lbnREaXYgPSBmaW5kVGFnTWFuYWdlbWVudERpdkZvck1hcmsobWFya0lkKTtcbiAgYXdhaXQgYWRkTmV3VGFnSGFuZGxlcihldmVudCwgdGFnTWFuYWdlbWVudERpdiwgJ25ldycpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB0YWcgY29sb3Igc2VsZWN0b3IgZm9yIGEgZ2l2ZW4gbWFyayBpcyB2aXNpYmxlLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVGFnQ29sb3JTZWxlY3RvckZvck1hcmtWaXNpYmxlKG1hcmtJZCkge1xuICBjb25zdCB0YWdzQ29sb3JXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRhZy1jb2xvcnMtd3JhcHBlcltkYXRhLW1hcmstaWQ9XCIke21hcmtJZH1cIl1gKTtcblxuICBpZighdGFnc0NvbG9yV3JhcHBlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvbG9yU2VsZWN0b3IgPSB0YWdzQ29sb3JXcmFwcGVyLmNsb3Nlc3QoJy5jb2xvci1zZWxlY3RvcicpO1xuICBpZighY29sb3JTZWxlY3Rvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHsgY2xhc3NMaXN0IH0gPSBjb2xvclNlbGVjdG9yO1xuXG4gIHJldHVybiAhY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRlJykgJiYgY29sb3JTZWxlY3Rvci5wYXJlbnRFbGVtZW50ICE9PSBudWxsO1xufVxuXG4vKipcbiAqIEFwcGx5IGEgc29ydCBkaXJlY3Rpb24gdG8gYSBzb3J0LW9wdGlvbiBzcGFuOiBwZXJzaXN0IGl0IGluIGRhdGEtZGlyZWN0aW9uLFxuICogc3dhcCB0aGUgRm9udEF3ZXNvbWUgZ2x5cGgsIGFuZCBzZXQgdGhlIGRpcmVjdGlvbi1hcHByb3ByaWF0ZSB0b29sdGlwLlxuICpcbiAqIEBwYXJhbSBzcGFuIC0gdGhlIHNvcnQtb3B0aW9uIHNwYW4gZWxlbWVudFxuICogQHBhcmFtIHNvcnRCeSAtIG9uZSBvZjogKCduYW1lJywgJ3RpbWUnLCAndXNhZ2UnKVxuICogQHBhcmFtIGRpcmVjdGlvbiAtIG9uZSBvZjogKCdhc2MnLCAnZGVzYycpXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U29ydERpcmVjdGlvblRvU3BhbihzcGFuLCBzb3J0QnksIGRpcmVjdGlvbikge1xuICBzcGFuLmRhdGFzZXQuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuXG4gIGNvbnN0IFt0aXRsZUtleSwgdGl0bGVGYWxsYmFja10gPSBTT1JUX1RJVExFX0tFWVNbc29ydEJ5XVtkaXJlY3Rpb25dO1xuICBzcGFuLnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0KHRpdGxlS2V5KSB8fCB0aXRsZUZhbGxiYWNrKTtcblxuICBjb25zdCBpY29uID0gc3Bhbi5xdWVyeVNlbGVjdG9yKCdpJyk7XG4gIGlmIChpY29uKSB7XG4gICAgY29uc3QgZ2x5cGhzID0gU09SVF9JQ09OX0NMQVNTRVNbc29ydEJ5XTtcbiAgICBpY29uLmNsYXNzTGlzdC5yZW1vdmUoZ2x5cGhzLmFzYywgZ2x5cGhzLmRlc2MpO1xuICAgIGljb24uY2xhc3NMaXN0LmFkZChnbHlwaHNbZGlyZWN0aW9uXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBhIHN1Z2dlc3RlZC10YWdzIHNvcnQtb3B0aW9uIHNwYW4gZm9yIHRoZSBnaXZlbiBzb3J0IG9wdGlvbiwgd2lyZWQgdG9cbiAqIHRoZSB0b2dnbGUgY2xpY2sgaGFuZGxlciBhbmQgcmVuZGVyZWQgYXQgaXRzIGRlZmF1bHQgZGlyZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBzb3J0QnkgLSBvbmUgb2Y6ICgnbmFtZScsICd0aW1lJywgJ3VzYWdlJylcbiAqIEByZXR1cm5zIHtIVE1MU3BhbkVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNvcnRPcHRpb25TcGFuKHNvcnRCeSkge1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICBzcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS1zb3J0LWJ5Jywgc29ydEJ5KTtcblxuICBjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xuICBpY29uLmNsYXNzTGlzdC5hZGQoJ2ZhLXNvbGlkJyk7XG4gIHNwYW4uYXBwZW5kQ2hpbGQoaWNvbik7XG5cbiAgYXBwbHlTb3J0RGlyZWN0aW9uVG9TcGFuKHNwYW4sIHNvcnRCeSwgU09SVF9ERUZBVUxUX0RJUkVDVElPTlNbc29ydEJ5XSk7XG4gIHNwYW4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVTb3J0T3B0aW9uQ2xpY2spO1xuXG4gIHJldHVybiBzcGFuO1xufVxuXG4vKipcbiAqIENsaWNrIGhhbmRsZXIgZm9yIGEgc3VnZ2VzdGVkLXRhZ3Mgc29ydCBvcHRpb24uIENsaWNraW5nIHRoZSBjdXJyZW50bHlcbiAqIGFjdGl2ZSBvcHRpb24gZmxpcHMgaXRzIGRpcmVjdGlvbiAoYXNjPC0+ZGVzYyk7IGNsaWNraW5nIGEgZGlmZmVyZW50IG9wdGlvblxuICogc2VsZWN0cyBpdCBhdCBpdHMgc2Vuc2libGUgZGVmYXVsdCBkaXJlY3Rpb24uXG4gKlxuICogQHBhcmFtIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVNvcnRPcHRpb25DbGljayhldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGxldCBzcGFuID0gZXZlbnQudGFyZ2V0O1xuICBpZiAoc3Bhbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaScpIHtcbiAgICBzcGFuID0gc3Bhbi5jbG9zZXN0KCdbZGF0YS1zb3J0LWJ5XScpO1xuICB9XG5cbiAgY29uc3QgeyBkYXRhc2V0OiB7IHNvcnRCeSB9IH0gPSBzcGFuO1xuICBsZXQgZGlyZWN0aW9uO1xuICBpZiAoc3Bhbi5jbGFzc0xpc3QuY29udGFpbnMoJ3NvcnRlZCcpKSB7XG4gICAgZGlyZWN0aW9uID0gc3Bhbi5kYXRhc2V0LmRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcbiAgfSBlbHNlIHtcbiAgICBkaXJlY3Rpb24gPSBTT1JUX0RFRkFVTFRfRElSRUNUSU9OU1tzb3J0QnldIHx8ICdhc2MnO1xuICB9XG5cbiAgYXBwbHlTb3J0RGlyZWN0aW9uVG9TcGFuKHNwYW4sIHNvcnRCeSwgZGlyZWN0aW9uKTtcblxuICBsb2coYHNvcnQgYnkgJHtzb3J0Qnl9ICR7ZGlyZWN0aW9ufWApO1xuICBzb3J0U3VnZ2VzdGVkVGFncyhzcGFuLCBzb3J0QnksIGRpcmVjdGlvbik7XG59XG5cbi8qKlxuICogU29ydCB0aGUgc3VnZ2VzdGVkIHRhZ3MgYnkgdGhlIG9wdGlvbiBzZWxlY3RlZC5cbiAqIFRoZSBzb3J0U2VsZWN0aW9uRWxlbWVudCBpcyB0aGUgc29ydCBidXR0b24gY2xpY2tlZCBvbiBieSB0ZWggdXNlclxuICogc2V0IHRoZSBjbGlja2VkIG9uIHNvcnQgYnV0dG9uIGFzIGFjdGl2ZS5cbiAqIEBwYXJhbSBzb3J0U2VsZWN0aW9uRWxlbWVudFxuICogQHBhcmFtIHNvcnRCeSAtIG9uZSBvZjogKCduYW1lJywgJ3RpbWUnLCAndXNhZ2UnKVxuICogQHBhcmFtIGRpcmVjdGlvbiAtIG9uZSBub2Y6ICgnYXNjJywgJ2Rlc2MnKVxuICovXG5mdW5jdGlvbiBzb3J0U3VnZ2VzdGVkVGFncyhzb3J0U2VsZWN0aW9uRWxlbWVudCwgc29ydEJ5LCBkaXJlY3Rpb24pIHtcbiAgLy8gVGhlIHNvcnQgYnV0dG9ucyBhcmUgYnVpbHQgaW50byB0aGUgdHJheSwgYW5kIHR
109oZSB0cmF5IGNhcnJpZXMgdGhlIG1hcmsgaWRcbiAgLy8gb24gYm90aCBzdXJmYWNlcy4gUmVhZGluZyBpdCBvZmYgYSA8bWFyaz4gYW5jZXN0b3IgbWVhbnQgZXZlcnkgc29ydCBjbGljayBvblxuICAvLyB0aGUgYWNjb3VudCBBbm5vdGF0aW9ucyBwYWdlIGhpdCB0aGUgZ3VhcmQgYmVsb3cgYW5kIGRpZCBub3RoaW5nICgjNDg1MykuXG4gIGNvbnN0IHRyYXkgPSBzb3J0U2VsZWN0aW9uRWxlbWVudC5jbG9zZXN0KCdbZGF0YS1jb250cm9scy1mb3I9XCJ0YWdzXCJdW2RhdGEtaWRdJyk7XG4gIGNvbnN0IG1hcmtJZCA9IHRyYXk/LmRhdGFzZXQuaWQ7XG5cbiAgLy8gZ3VhcmQgY2xhdXNlXG4gIGlmKG1hcmtJZCA9PT0gbnVsbCB8fCBtYXJrSWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHJlbW92ZSB0aGUgJ3NvcnRlZCcgY2xhc3MgZnJvbSBhbGwgdGhlIHNvcnQgYnV0dG9uc1xuICBjb25zdCBzb3J0T3B0aW9uc1dyYXBwZXIgPSBzb3J0U2VsZWN0aW9uRWxlbWVudC5jbG9zZXN0KCcuc29ydC1vcHRpb25zJyk7XG4gIGNvbnN0IHNvcnRPcHRpb25zRWxlbWVudHMgPSBzb3J0T3B0aW9uc1dyYXBwZXIucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc29ydC1ieV0nKTtcbiAgaWYoc29ydE9wdGlvbnNFbGVtZW50cykge1xuICAgIHNvcnRPcHRpb25zRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc29ydGVkJyk7XG4gICAgfSlcbiAgfVxuXG4gIC8vIHNldCB0aGUgdGFyZ2V0IHNwYW4gYnV0dG9uIGFzIHNvcnRlZFxuICBpZihzb3J0U2VsZWN0aW9uRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaScpIHtcbiAgIHNvcnRTZWxlY3Rpb25FbGVtZW50ID0gc29ydFNlbGVjdGlvbkVsZW1lbnQuY2xvc2VzdCgnW2RhdGEtc29ydC1ieV0nKTtcbiAgfVxuXG4gIHNvcnRTZWxlY3Rpb25FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NvcnRlZCcpO1xuXG4gIC8vIGNsZWFyIHRoZSBzdWdnZXN0ZWQgdGFncyBhcmVhXG4gIHJlc2V0U3VnZ2VzdGVkVGFncyhtYXJrSWQpO1xuXG4gIC8vIHNvcnQgdGhlIHRhZ3NcbiAgdXBkYXRlVGFnTWFuYWdlbWVudEVsZW1lbnRzKG1hcmtJZCwgc29ydEJ5LCBkaXJlY3Rpb24pO1xufVxuXG4vKipcbiAqIEZpbmQgYS
109BtYXJrIGluIHRoZSBzZXNzaW9uIHN0b3JhZ2UgYXJyYXksIGJ5IG1hcmsgaWQuXG4gKlxuICogQHBhcmFtIG1hcmtJZFxuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIGZpbmRNYXJrSW5TZXNzaW9uKG1hcmtJZCkge1xuICBsZXQgbWFya3MgPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ21hcmtzJykpO1xuXG4gIHJldHVybiAgZmluZE1hcmtJblNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZShtYXJrcywgbWFya0lkKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSB0YWcgZnJvbSBhIG1hcmsncyB2YXJpYWJsZXMgaW4gc2Vzc2lvbiBzdG9yYWdlLlxuICogVGhlIG1hcmsgcmVjb3JkIGluICdtYXJrcycgc2hvdWxkIGJlIHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIG1hcmtEYXRhXG4gKiBAcGFyYW0gdGFnVGV4dFxuICovXG5mdW5jdGlvbiByZW1vdmVUYWdGcm9tTWFya0luU2Vzc2lvblN0b3JhZ2UobWFya0RhdGEsIHRhZ1RleHQpIHtcbiAgLy8gVGhlIGFjY291bnQgQW5ub3RhdGlvbnMgcGFnZSBoYXMgbm8gc2VjdGlvbiBjb2xsZWN0aW9uIHRvIGtlZXAgaW4gc3RlcCDigJRcbiAgLy8gaXRzIG1hcmtzIGFyZSBuZXZlciBpbiBgc2Vzc2lvblN0b3JhZ2VbJ21hcmtzJ11gIOKAlCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gIC8vIHJlbW92ZSBhbmQgbm8gbWFyayBvYmplY3QgdG8gcmVhZCB0YWdzIG9mZiAoIzQzNjgpLlxuICBpZiAoIW1hcmtEYXRhPy50YWdzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWxsTWFya3MgPSBnZXRTZWN0aW9uTWFya3NGcm9tU2Vzc2lvblN0b3JhZ2UoKTtcbiAgZm9yKGxldCBbX2luZGV4LCB0YWddIG9mIG1hcmtEYXRhLnRhZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHRhZ1RleHQgPT09IHRhZy50ZXh0KSB7XG4gICAgICBtYXJrRGF0YS50YWdzID0gcmVtb3ZlRmlyc3RPY2N1cnJlbmNlRnJvbUFycmF5KG1hcmtEYXRhLnRhZ3MsIHRhZyk7XG4gICAgICB1cGRhdGVNYXJrSW5TZWN0aW9uQ29sbGVjdGlvbkluU2Vzc2lvblN0b3JhZ2UoYWxsTWFya3MsIG1hcmtEYXRhKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gYSB0YWcgbXV0YXRpb24gd2l0aCB0aGUgdGFnLW1hbmFnZW1lbnQgcG9wdXAncyBidXN5IHN0YXRlIG93bmVkIGluIE9ORVxuICogcGxhY2UuXG4gKlxuICogVGhlIG92ZXJsYXkgKGFuZCBpdHMgc3Bpbm5lcikgZ29lcyB1cCBiZWZvcmUgdGhlIG11dGF0aW9uIGFuZCBjb21lcyBkb3duIGluXG4gKiBhIGBmaW5hbGx5YCwgc28gbm8gYnJhbmNoIG9mIHRoZSBtdXRhdGlvbiAtIGFuIGVhcmx5IGV4aXQsIGEgZmFpbGVkIHNhdmUsIG9yXG4gKiBhIHRocm93biBlcnJvciAtIGNhbiBsZWF2ZSB0aGUgcG9wdXAgYmxvY2tlZCAoIzQ0MDIpLiBFcnJvcnMgYXJlIHJlLXRocm93blxuICogYWZ0ZXIgdGhlIHRlYXJkb3duOiBhIHNpbGVudCBjYXRjaCBoZXJlIHdvdWxkIGhpZGUgdGhlIG5leHQgZGVmZWN0IHRoZSBzYW1lXG4gKiB3YXkgdGhpcyBvbmUgaGlkLlxuICpcbiAqIEBwYXJhbSBtYXJrSWRcbiAqIEBwYXJhbSBtdXRhdGUgLSByZWNlaXZlcyB0aGUgdGFnLW1hbmFnZW1lbnQgZGl2IChtYXkgYmUgbnVsbCkgYW5kIGRvZXMgdGhlIHdvcmtcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fSB3aGF0ZXZlciBgbXV0YXRlYCByZXR1cm5zXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdpdGhUYWdNdXRhdGlvbk92ZXJsYXkobWFya0lkLCBtdXRhdGUpIHtcbiAgY29uc3QgdGFnTWFuYWdlbWVudEVsZW0gPSBmaW5kVGFnTWFuYWdlbWVudERpdkZvck1hcmsobWFya0lkKTtcbiAgY29uc3Qgb3ZlcmxheUlkID0gYG92ZXJsYXktJHttYXJrSWR9YDtcblxuICBpZiAodGFnTWFuYWdlbWVudEVsZW0pIHtcbiAgICBpbnNlcnRPdmVybGF5T25FbGVtZW50KHRhZ01hbmFnZW1lbnRFbGVtLCBvdmVybGF5SWQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgbXV0YXRlKHRhZ01hbmFnZW1lbnRFbGVtKTtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW1vdmVPdmVybGF5T25FbGVtZW50KG92ZXJsYXlJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGVyIGZvciByZW1vdmluZyBhIHRhZyBmcm9tIGEgbWFyazpcbiAqIC0gVXBkYXRlIHNlc3Npb24gdmFyaWFibGVzXG4gKiAtIHJlbW92ZSB0aGUgdGFnIGVsZW1lbnQgZnJvbSB0aGUgdGFncyBhcmVhXG4gKiAtIHJlc2V0IHRoZSBjb250cm9scyB0byBjcmVhdGUgYSBuZXcgdGFnXG4gKiAtIHJlLXJlbmRlcnMgc3VnZ2VzdGVkIHRhZ3MuXG4gKlxuICogQHBhcmFtIGV2ZW50XG4gKiBAcGFyYW0gbWFya0lkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVRhZ0hhbmRsZXIoZXZlbnQsIG1hcmtJZCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIHJldHVybiB3aXRoVGFnTXV0YXRpb25PdmVybGF5KG1hcmtJZCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCB0YXJnZXQ6IHsgbm9kZU5hbWUsIHBhcmVudE5vZGUsIGRhdGFzZXQ6IHsgdGFnVGV4dCB9IH0gfSA9IGV2ZW50O1xuICAgIGNvbnN0IGRlbGV0aW5nQWxsID0gdGFnVGV4dCA9PT0gKHQoJ2RlbGV0ZV9hbGwnKSB8fCAnRGVsZXRlIEFsbCcpO1xuXG4gICAgLy8gZ3VhcmQgY2xhdXNlXG4gICAgaWYgKG1hcmtJZCA9PT0gbnVsbCB8fCBtYXJrSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFzc2lnbmVkVGFnc0VsZW0gPSBmaW5kRXhpc3RpbmdUYWdzRGl2Rm9yTWFyayhtYXJrSWQpO1xuICAgIGNvbnN0IGFsbE1hcmtzID0gZ2V0U2VjdGlvbk1hcmtzRnJvbVNlc3Npb25TdG9yYWdlKCk7XG5cbiAgICBsZXQgdGFnRWxlbWVudCA9IHRhcmdldDtcbiAgICBsZXQgc3BhbiwgdGV4dDtcblxuICAgIGlmIChub2RlTmFtZSA9PT0gJ1NQQU4nKSB7XG4gICAgICB0ZXh0ID0gdGFnVGV4dDtcbiAgICAgIHRhZ0VsZW1lbnQgPSBwYXJlbnROb2RlO1xuICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09ICdJJykge1xuICAgICAgc3BhbiA9IHRhcmdldC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKTsgdGV4dCA9IHNwYW4uZGF0YXNldC50YWdUZXh0O1xuICAgICAgdGFnRWxlbWVudCA9IHBhcmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYW4gPSB0YWdFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKTtcbiAgICAgIHRleHQgPSBzcGFuLmRhdGFzZXQudGFnVGV4dDtcbiAgICB9XG5cbiAgICAvLyBzYXZlIG1hcmsgc3RhdGUgaW4gY2FzZSB3ZSBoYXZlIHRvIHJldmVydFxuICAgIGNvbnN0IGN1cnJlbnRNYXJrU2Vzc2lvblN0YXRlID0gZmluZE1hcmtJblNlc3Npb24obWFya0lkKTtcblxuICAgIC8vIGhpZGUgdGFncyB1bnRpbCByZXN1bHQgb2YgZGVsZXRlXG4gICAgaWYgKGRlbGV0aW5nQWxsKSB7XG4gICAgICBjb25zdCBtYXJrRGF0YSA9IGZpbmRNYXJrSW5TZXNzaW9uKG1hcmtJZCk7XG4gICAgICBpZiAoYXNzaWduZWRUYWdzRWxlbSkge1xuICAgICAgICBhc3NpZ25lZFRhZ3NFbGVtXG4gICAgICAgICAgICAuY2hpbGROb2Rlc1xuICAgICAgICAgICAgLmZvckVhY2goXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKHRhZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGF0YXNldDogeyB0YWdUZXh0OiB0ZXh0LCB0YWdUeXBlIH0gfSA9IHRhZztcbiAgICAgICAgICAgICAgICB0YWcuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgICAgICAgICAgICAgIGlmICh0YWdUeXBlICE9PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgICAgICAgbGV0IHRhZ1RleHQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgICAgaWYoIXRhZ1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFnVGV4dCA9IHRhZy5xdWVyeVNlbGVjdG9yKCdzcGFuJyk/LmRhdGFzZXQudGFnVGV4dDtcbiAgICAgICAgICAgICAgICAgI
109H1cbiAgICAgICAgICAgICAgICAgIHJlbW92ZVRhZ0Zyb21NYXJrSW5TZXNzaW9uU3RvcmFnZShtYXJrRGF0YSwgdGFnVGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbW92ZVRhZ0Zyb21NYXJrSW5TZXNzaW9uU3RvcmFnZShjdXJyZW50TWFya1Nlc3Npb25TdGF0ZSwgdGV4dCk7XG4gICAgICAvLyBoaWRlIHRhZ1xuICAgICAgdGFnRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgICAvLyBoaWRlICdkZWxldGUgYWxsJyB3aGVuIG5lY2Vzc2FyeVxuICAgICAgY29uc3QgZGVsZXRlQWxsVGFnXG4gICAgICAgICAgPSBBcnJheVxuICAgICAgICAgIC5mcm9tKGFzc2lnbmVkVGFnc0VsZW0uY2hpbGROb2RlcylcbiAgICAgICAgICAuZmluZCh0YWcgPT4gdGFnLmRhdGFzZXQudGFnVHlwZSA9PT0gJ2RlbGV0ZScpO1xuICAgICAgaWYgKGRlbGV0ZUFsbFRhZyAmJiBhc3NpZ25lZFRhZ3NFbGVtLmNoaWxkTm9kZXMubGVuZ3RoIDw9IDYpIHtcbiAgICAgICAgZGVsZXRlQWxsVGFnLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzYXZlIHJlbW92YWxcbiAgICBjb25zdCB7IHN1Y2Nlc3MgfSA9IGF3YWl0IHNhdmVUYWdzKG1hcmtJZCk7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIGlmIChkZWxldGluZ0FsbCkge1xuICAgICAgICBpZiAoYXNzaWduZWRUYWdzRWxlbSkge1xuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgdGFnIGVsZW1lbnQgZnJvbSB0aGUgZXhpc3RpbmcgdGFncyBhcmVhXG4gICAgICAgICAgYXNzaWduZWRUYWdzRWxlbVxuICAgICAgICAgICAgICAuY2hpbGROb2Rlc1xuICAgICAgICAgICAgICAuZm9yRWFjaChcbiAgICAgICAgICAgICAgICBmdW5jdGlvbih0YWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgdGFnRWxlbWVudCA9IGFzc2lnbmVkVGFnc0VsZW0uY2hpbGROb2Rlc1swXTtcbiAgICAgICAgICAgICAgICAgICB0YWdFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdFbGVtZW50LnJlbW92ZSgpO1xuXG4gICAgICAgIGNvbnN0IGFzc2lnbmVkVGFnc0VsZW0gPSBmaW5kRXhpc3RpbmdUYWdzRGl2Rm9yTWFyayhtYXJrSWQpO1xuICAgICAgICBjb25zdCBtYXJrT2JqZWN0ID0gZmluZE1hcmtJblNlc3Npb24obWFya0lkKSA/PyB7IGlkOiBtYXJrSWQgfTtcbiAgICAgICAgbWFuYWdlRGVsZXRlQWxsQnV0dG9uKGFzc2lnbmVkVGFnc0VsZW0sIG1hcmtPYmplY3QpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHNvcnRCeSwgZGlyZWN0aW9uIH0gPSBjdXJyZW50U3VnZ2VzdGVkVGFnc1NvcnRQcm9wZXJ0aWVzKG1hcmtJZCk7XG4gICAgICB1cGRhdGVUYWdNYW5hZ2VtZW50RWxlbWVudHMobWFya0lkLCBzb3J0QnksIGRpcmVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBtc2cgPSB0KCdlcnJvcl9yZW1vdmluZ190YWcnKSB8fCAnVGhlcmUgd2FzIGFuIGVycm9yIHJlbW92aW5nIHRoaXMgdGFnLic7XG4gICAgICAvLyBSZXN0b3JlIHNlc3Npb24gc3RhdGUgdG8gcHJlLXJlbW92YWwgc3RhdGVcbiAgICAgIGlmIChjdXJyZW50TWFya1Nlc3Npb25TdGF0ZSkge1xuICAgICAgICB1cGRhdGVNYXJrSW5TZWN0aW9uQ29sbGVjdGlvbkluU2Vzc2lvblN0b3JhZ2UoYWxsTWFya3MsIGN1cnJlbnRNYXJrU2Vzc2lvblN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbGV0aW5nQWxsKSB7XG4gICAgICAgIG1zZyA9IHQoJ2Vycm9yX3JlbW92aW5nX2FsbF90YWdzJykgfHwgJ1RoZXJlIHdhcyBhbiBlcnJvciByZW1vdmluZyBhbGwgdGhlIHRhZ3Mgb24gdGhpcyBhbm5vdGF0aW9uLic7XG5cbiAgICAgICAgaWYgKGFzc2lnbmVkVGFnc0VsZW0pIHtcbiAgICAgICAgICAvLyB1bi1oaWRlIHRoZSB0YWcgZWxlbWVudHMgZnJvbSB0aGUgZXhpc3RpbmcgdGFncyBhcmVhXG4gICAgICAgICAgYXNzaWduZWRUYWdzRWxlbVxuICAgICAgICAgICAgICAuY2hpbGROb2Rlc1xuICAgICAgICAgICAgICAuZm9yRWFjaChcbiAgICAgICAgICAgICAgICBmdW5jdGlvbih0YWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICB0YWdFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdW4taGlkZSB0aGUgc2luZ2xlIHRhZyBlbGVtZW50XG4gICAgICAgIHRhZ0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuXG4gICAgICAgIC8vIHJlc3RvcmUgJ2RlbGV0ZSBhbGwnIGJ1dHRvbiB2aXNpYmlsaXR5IGlmIGl0IHdhcyBoaWRkZW5cbiAgICAgICAgY29uc3QgZGVsZXRlQWxsVGFnXG4gICAgICAgICAgICA9IEFycmF5XG4gICAgICAgICAgICAuZnJvbShhc3NpZ25lZFRhZ3NFbGVtLmNoaWxkTm9kZXMpXG4gICAgICAgICAgICAuZmluZCh0YWcgPT4gdGFnLmRhdGFzZXQudGFnVHlwZSA9PT0gJ2RlbGV0ZScpO1xuICAgICAgICBpZiAoZGVsZXRlQWxsVGFnKSB7XG4gICAgICAgICAgZGVsZXRlQWxsVGFnLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UobXNnLCd3YXJuaW5nJyk7XG4gICAgICBpZiAobm90aWNlKSB7XG4gICAgICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoe30sIHRydWUpO1xuICAgICAgICBub3RpY2UucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNldCB0YWdzIGVkaXQgbW9kZTsgY2xvc2UgdGhlIGVkaXQgdGFncyBkaXYgYW5kIGRpc3BsYXkgdGhlIG9wdGlvbnMgZGl2LlxuICogRW5zdXJlIHNlc3Npb24gdmFyaWFibGVzIGFyZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gY29udHJvbHNGb3JUYWdzRWxlbWVudFxuICovXG5mdW5jdGlvbiBjYW5jZWxUYWdFZGl0KGNvbnRyb2xzRm9yVGFnc0VsZW1lbnQpIHtcbiAgY29uc3QgeyBkYXRhc2V0OiB7IGlkOiBtYXJrSWQgfSB9ID0gY29udHJvbHNGb3JUYWdzRWxlbWVudDtcbiAgY29uc3Qgc2VsZWN0b3IgPSBgW2RhdGEtY29udHJvbHMtZm9yPVwiYW5ub3RhdGlvblwiXVtkYXRhLWlkPVwiJHttYXJrSWR9XCJdYDtcbiAgY29uc3QgYW5ub3RhdGlvbkNvbnRyb2xzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG5cbiAgLy8gcmVzZXQgdGhlIG5ldyB0YWcgY29udHJvbHNcbiAgY29uc3QgbWFya0VsZW0gP
109SBnZXRNYXJrRWxlbWVudChtYXJrSWQpO1xuICBjYW5jZWxOZXdUYWdDcmVhdGlvbihtYXJrRWxlbSk7XG5cbiAgY29udHJvbHNGb3JUYWdzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gIGlmIChhbm5vdGF0aW9uQ29udHJvbHMpIHtcbiAgICBhbm5vdGF0aW9uQ29udHJvbHMuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICB9XG5cbiAgLy8gVGhlIGRlZmVuc2l2ZSBcImVuc3VyZSBzcGlubmVyIGlzIHJlbW92ZWRcIiBzd2VlcCB0aGF0IHVzZWQgdG8gbGl2ZSBoZXJlIGhhc1xuICAvLyBiZWVuIGRyb3BwZWQgKCM0NDAyKS4gSXQgbG9va2VkIGZvciBgLnNhdmUtdGFnYCBhcyBhIENMQVNTLCB3aGlsZSBTcGlubmVyXG4gIC8vIG1hcmtzIGl0cyBib3ggd2l0aCBgZGF0YS1uYW1lPVwic2F2ZS10YWdcImAsIHNvIGl0IG5ldmVyIG1hdGNoZWQgYW55dGhpbmcgLVxuICAvLyBhbmQgaXQgZGVyZWZlcmVuY2VkIGdldE1hcmtFbGVtZW50KCkgd2l0aG91dCBhIG51bGwgY2hlY2suIHNhdmVUYWdzKCkgbm93XG4gIC8vIHJlbW92ZXMgdGhhdCBzcGlubmVyIGluIGEgYGZpbmFsbHlgLCB3aGljaCBpcyB0aGUgb25seSBvd25lciBpdCBuZWVkcy5cbn1cblxuLyoqXG4gKiBDbGVhciB0YWcgdGV4dCBpbnB1dCBhbmQgaGlkZSBuZXcgdGFnIGNvbnRyb2wuXG4gKlxuICogQHBhcmFtIG1hcmtFbGVtXG4gKi9cbmZ1bmN0aW9uIGNhbmNlbE5ld1RhZ0NyZWF0aW9uKG1hcmtFbGVtKSB7XG4gIC8vIGNsZWFyIGFuZCBoaWRlIG5ldyB0YWcgY29udHJvbFxuICBjb25zdCBuZXdUYWdFbGVtID0gZ2V0TmV3VGFnRGl2KG1hcmtFbGVtKTtcbiAgbmV3VGFnRWxlbS5xdWVyeVNlbGVjdG9yKCdzcGFuJykuaW5uZXJUZXh0ID0gJyc7XG4gIG5ld1RhZ0VsZW0uY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuXG4gIC8vIHJlc2V0IG5ldyB0YWcgY29udHJvbCBjb2xvclxuICB1cGRhdGVDb2xvck9uRWxlbWVudChuZXdUYWdFbGVtLCAnZGVmYXVsdCcpO1xuXG4gIC8vIGNsZWFyIHRleHQgaW5wdXRcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFkZC1lZGl0LXRhZy1hcmVhIGlucHV0JykudmFsdWUgPSAnJztcblxuICAvLyByZXNldCBzdWdnZXN0ZWQgdGFnc1xuICBsZXQgeyBkYXRhc2V0OiB7IG1hcmtJZCA9IG51bGwsIGlkID0gbnVsbCB9IH0gPSBtYXJrRWxlbTtcbiAgbWFya0lkID0gbWFya0lkID8/IGlkO1xuICByZXNldFN1Z2dlc3RlZFRhZ3MobWFya0lkKTtcblxuICAvLyBzZXNzaW9uIHN0b3JhZ2UgbWFuYWdlbWVudFxuICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdjdXJyZW50LW1hcmstbmV3LXRhZy10ZXh0LWNvdW50Jyk7XG4gIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2ZpbHRlcmVkLXRhZ3MnKTtcbn1cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBjb2xvciBrZXlzIG9yIHdvcmRzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0YWcgY29sb3Igb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmZ1bmN0aW9uIGNvbG9yV29yZHMoKSB7XG4gIHJldHVybiBbJ2RlZmF1bHQnXS5jb25jYXQoT2JqZWN0LmtleXMoYXBwQ29sb3JzKCkpKTtcbn1cblxuLyoqXG4gKiBGaW5kIGNvbG9yIGNsYXNzIGluIGFuIGVsZW1lbnQncyBjbGFzc0xpc3QuIElmIG5vdCBmb3VuZCwgcmV0dXJucyBmYWxzZS5cbiAqXG4gKiBAcGFyYW0gY2xhc3NMaXN0XG4gKiBAcmV0dXJucyB7Knxib29sZWFufVxuICovXG5mdW5jdGlvbiBmaW5kQ29sb3JDbGFzc0luQ2xhc3NMaXN0KGNsYXNzTGlzdCkge1xuICBmb3IgKGxldCBbX2luZGV4LCBhQ2xhc3NdIG9mIGNsYXNzTGlzdC5lbnRyaWVzKCkpIHtcbiAgICBpZiAoY29sb3JXb3JkcygpLmluY2x1ZGVzKGFDbGFzcykpIHtcbiAgICAgIHJldHVybiBhQ2xhc3M7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFN3YXAgb3V0IHRoZSBjb2xvciBlZGl0IGNvbnRyb2xzIHdpdGggZXZlbnQgaGFuZGxlcnMgdGFyZ2V0aW5nIHRoZSBjb3JyZWN0IGVsZW1lbnRcbiAqIChuZXcgdGFnICwgb3IgZXhpc3RpbmcgdGFnKS5cbiAqXG4gKi9cbmZ1bmN0aW9uIGNoYW5nZVRhZ0NvbG9yQ29udHJvbHMobWFya0lkKSB7XG4gIGNvbnN0IHRhZ0NvbG9ycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbG9yLXBvcHVwXScpO1xuXG4gIC8vIHVwZGF0ZSBjb2xvciBjb250cm9scyAtIHN3YXAgY29sb3IgY29udHJvbHMgYmFjayB0byBuZXcgdGFnIGVsZW1lbnRcbiAgY29uc3QgbmV3VGFnQ29sb3JzID0gY3JlYXRlQ29sb3JDb250cm9scyhtYXJrSWQpO1xuXG4gIC8vIENoYW5nZSBjb2xvciBjb250cm9scyB0byBtb2RpZnkgdGhlIHNlbGVjdGVkIHRhZ1xuICB0YWdDb2xvcnMucmVwbGFjZVdpdGgobmV3VGFnQ29sb3JzKTtcblxuICB0YWdDb2xvcnMuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGNvbnRyb2xzIHRvIGNoYW5nZSB0aGUgc2VsZWN0ZWQgY29sb3IgZm9yIGEgdGFnLlxuICogVGhlIHRhcmdldCBjYW4gYmUgZWl0aGVyIHRoZSBuZXcgdGFnIGVsZW1lbnQgb3IgYW4gZXhpc3RpbmcgdGFnIGVsZW1lbnQuXG4gKiBAcGFyYW0gbWFya0lkXG4gKiBAcmV0dXJucyB7SFRNTERpdkVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbG9yQ29udHJvbHMobWFya0lkKSB7XG4gIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdjb2xvci1zZWxlY3RvcicsICdoaWRlJyk7XG4gIHdyYXBwZXIuc2V0QXR0cmlidXRlKCdkYXRhLWNvbG9yLXBvcHVwJywgJycpO1xuXG4gIC8vIDFzdCBlbGVtZW50IC0gc2VjdGlvbiBsYWJlbFxuICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICBwLmNsYXNzTGlzdC5hZGQoJ2RpcmVjdGl2ZScpO1xuICBwLnNldEF0dHJpYnV0ZSgnZGF0YS10YWctY29sb3JzLWxhYmVsJywgJycpO1xuICBwLnRleHRDb250ZW50ID0gdCgnc2VsZWN0X3RhZ19jb2xvcicpIHx8ICdTZWxlY3QgdGFnIGNvbG9yOic7XG5cbiAgd3JhcHBlci5hcHBlbmRDaGlsZChwKTtcbiAgLy8gMm5kIGVsZW1lbnQgLSBjb2xvciBjb250cm9sc1xuICBjb25zdCBuZXdUYWdDb2xvcnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbmV3VGFnQ29sb3JzLmNsYXNzTGlzdC5hZGQoJ3RhZy1jb2xvcnMtd3JhcHBlcicpO1xuICBuZXdUYWdDb2xvcnMuc2V0QXR0cmlidXRlKCdkYXRhLW1hcmstaWQnLCBtYXJrSWQpO1xuXG4gIC8vVE9ETzogZmV0Y2ggY29sb3JzIGZyb20gc2l0ZSB2YXJpYWJsZXNcbiAgZm9yIChsZXQgY29sb3Igb2YgY29sb3JXb3JkcygpKSB7XG4gICAgbGV0IGNvbG9yQ2hhbmdlRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGlmIChjb2xvciA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICBjb2xvckNoYW5nZUVsZW0uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICB9XG4gICAgY29sb3JDaGFuZ2VFbGVtLmNsYXNzTGlzdC5hZGQoJ3RhZycpO1xuICAgIGNvbG9yQ2hhbmdlRWxlbSA9IHVwZGF0ZUNvbG9yT25FbGVtZW50KGNvbG9yQ2hhbmdlRWxlbSwgY29sb3IpO1xuXG4gICAgLy8gZXZlbnQgaGFuZGxlciAtIGNoYW5nZSB0YWcgY29sb3IgLSBpZiB3ZSBqdXN0IGVkaXRlZCBhbiBleGlzdGluZyB0YWcsXG4gICAgLy8gdGFyZ2V0IGVsZW1lbnQgc2hvdWxkIGJlIGNoYW5nZWQgYmFja1xuICAgIGNvbG9yQ2hhbmdlRWxlbS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbn
109REZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IHRhZ01hbmFnZW1lbnREaXYgPSBmaW5kVGFnTWFuYWdlbWVudERpdkZvck1hcmsobWFya0lkKTtcbiAgICAgIGNvbnN0IG5ld1RhZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uZXctdGFnIC50YWcnKTtcblxuICAgICAgLy8gY29uc3QgeyBkYXRhc2V0OiB7IHRhZ0NvbG9yIH0gfSA9IGV2ZW50LnRhcmdldDtcbiAgICAgIC8vIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGFnLWNvbG9ycy13cmFwcGVyJyk7XG5cbiAgICAgIGNoYW5nZUNvbG9ySGFuZGxlcihldmVudCk7XG4gICAgICAvLyB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXRhZy1jb2xvcj0ke3RhZ0NvbG9yfV1gKTtcblxuICAgICAgLy8gY29uc3QgbWFyayA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCdtYXJrJyk7XG4gICAgICAgIGF3YWl0IGFkZE5ld1RhZ0hhbmRsZXIoZXZlbnQsIHRhZ01hbmFnZW1lbnREaXYsICduZXcnKTtcbiAgICAgIC8vIH1cbiAgICB9KTtcblxuICAgIG5ld1RhZ0NvbG9ycy5hcHBlbmRDaGlsZChjb2xvckNoYW5nZUVsZW0pO1xuICB9XG5cbiAgLy8gbmV3IHRhZyBjb2xvciBzZWxlY3RvciBjb250cm9sc1xuICB3cmFwcGVyLmFwcGVuZENoaWxkKG5ld1RhZ0NvbG9ycyk7XG5cbiByZXR1cm4gIHdyYXBwZXI7XG59XG5cbi8qKlxuICogTmFtZWQgaGFuZGxlciBmb3IgY2hhbmdpbmcgY29sb3Igb2YgYSB0YXJnZXQgZWxlbWVudC5cbiAqIENoYW5nZXMgdGhlIGNvbG9yIG9mIHRoZSB0YXJnZXQgZWxlbWVudCBiYXNlZCBvbiB0aGUgZXZlbnQgdGFyZ2V0J3Mgc2V0IGNvbG9yLlxuICogQWxzbyBzb3J0cyBzdWdnZXN0aW9ucyBieSB0aGUgZ2l2ZW4gY29sb3JcbiAqXG4gKiBAcGFyYW0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gY2hhbmdlQ29sb3JIYW5kbGVyKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgY29uc3QgeyB0YXJnZXQgfSA9IGV2ZW50O1xuICBjb25zdCB3cmFwcGVyID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWNvbnRyb2xzLWZvcj1cInRhZ3NcIl0nKTtcbiAgY29uc3QgeyBkYXRhc2V0OiB7IGlkOiBtYXJrSWQgfSB9ID0gd3JhcHBlcjtcbiAgLy8gU2NvcGVkIHRvIHRoZSB0cmF5LCBub3QgdG8gYSA8bWFyaz46IHRoZSBuZXctdGFnIGVsZW1lbnQgaXMgYnVpbHQgaW50byB0aGVcbiAgLy8gdHJheSBpdHNlbGYsIGFuZCB0aGUgYWNjb3VudCBBbm5vdGF0aW9ucyBwYWdlIHJlbmRlcnMgYW4gYW5ub3RhdGlvbiBhcyBhXG4gIC8vIGNhcmQgd2l0aCBubyA8bWFyaz4gYW55d2hlcmUgb24gaXQsIHNvIGBjbG9zZXN0KCdtYXJrJylgIHJldHVybmVkIG51bGwgYW5kXG4gIC8vIHRoaXMgbGluZSB0aHJldyAoIzQ4NTMpLiBUaGUgdHJheSBpcyBhbHNvIHRoZSB0aWdodGVyIHNjb3BlIGluIHRoZSByZWFkZXIg4oCUXG4gIC8vIGEgbXVsdGktcGFyZW50IGhpZ2hsaWdodCBwYWludHMgb25lIDxtYXJrPiBwZXIgYmxvY2ssIGFuZCBvbmx5IG9uZSBvZiB0aGVtXG4gIC8vIGNhcnJpZXMgdGhlIHRyYXkuXG4gIGNvbnN0IG5ld1RhZ0RpdiA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcihfbmV3VGFnRWxlbWVudFNlbGVjdG9yKG1hcmtJZCkpO1xuICBjb25zdCB0YWdDb2xvciA9IGRldGVjdE5ld0NvbG9yKGV2ZW50LCBuZXdUYWdEaXYpO1xuXG4gIGlmKG5ld1RhZ0Rpdikge1xuICAgIGNoYW5nZU5ld1RhZ0RpdkNvbG9yKHRhZ0NvbG9yLCBuZXdUYWdEaXYpO1xuICB9XG5cbiAgbGV0IHRhZ1RleHQgPSBuZXdUYWdEaXYuaW5uZXJUZXh0LnRyaW0oKTtcblxuICAvLyBgdGV4dGAgYW5kIGBjb2xvcmAsIG5vdCBgdGFnVGV4dGAvYHRhZ0NvbG9yYDogYm90aCBjb25zdW1lcnMgYmVsb3cgcmVhZCBhXG4gIC8vIHRhZyBvYmplY3QncyBvd24ga2V5cywgc28gdGhlIG9sZCBzaGFwZSBtYXRjaGVkIG5vdGhpbmcgYW5kIHRoZSByZWNvbG91clxuICAvLyB3YXMgYSBuby1vcCBvbiBlaXRoZXIgc3VyZmFjZSAoIzQ4NTMpLlxuICBjb25zdCB0YWdEYXRhID0geyB0ZXh0OiB0YWdUZXh0LCBjb2xvcjogdGFnQ29sb3IgfTtcbiAgY29uc3QgeyBkYXRhc2V0OiB7IHRhZ1R5cGUgfSB9ID0gbmV3VGFnRGl2O1xuXG4gIGNvbnN0IG1hcmtEYXRhID0gZmluZE1hcmtJblNlc3Npb24obWFya0lkKTtcbiAgaWYodGFnVHlwZSA9PT0gJ2V4aXN0aW5nJykge1xuICAgIGNoYW5nZVRhZ0NvbG9ySW5NYXJrKG1hcmtEYXRhLCB0YWdEYXRhKTtcbiAgICB1cGRhdGVUYWdJbk9wdGlvbnNEaXYobWFya0lkLCB0YWdEYXRhKTtcbiAgfVxuXG4gIC8vIFRoZSBhY2NvdW50IEFubm90YXRpb25zIHBhZ2Uga2VlcHMgbm8gc2VjdGlvbiBjb2xsZWN0aW9uIOKAlCBpdHMgbWFya3MgYXJlXG4gIC8vIG5ldmVyIGluIGBzZXNzaW9uU3RvcmFnZVsnbWFya3MnXWAg4oCUIHNvIHRoZXJlIGlzIG5vIG1hcmsgb2JqZWN0IHRvIH
109dyaXRlXG4gIC8vIGJhY2ssIGFuZCBpbmRleE9mTWFya0luU2Vzc2lvbigpIGRlcmVmZXJlbmNlcyB0aGUgb25lIGl0IGlzIGhhbmRlZCAoIzQ4NTMpLlxuICAvLyBTYW1lIHJlYXNvbmluZyBhcyByZW1vdmVUYWdGcm9tTWFya0luU2Vzc2lvblN0b3JhZ2UoKSAoIzQzNjgpOiB0aGUgY2FyZCdzXG4gIC8vIHNhdmUgcmVhZHMgdGhlIHRyYXksIG5vdCB0aGUgc2Vzc2lvbi5cbiAgaWYgKG1hcmtEYXRhKSB7XG4gICAgY29uc3QgYWxsTWFya3MgPSBnZXRTZWN0aW9uTWFya3NGcm9tU2Vzc2lvblN0b3JhZ2UoKTtcbiAgICB1cGRhdGVNYXJrSW5TZWN0aW9uQ29sbGVjdGlvbkluU2Vzc2lvblN0b3JhZ2UoYWxsTWFya3MsIG1hcmtEYXRhKTtcbiAgfVxuXG4gIGxldCB7IHNvcnRCeSwgZGlyZWN0aW9uIH0gPSBjdXJyZW50U3VnZ2VzdGVkVGFnc1NvcnRQcm9wZXJ0aWVzKG1hcmtJZCk7XG4gIHVwZGF0ZVRhZ01hbmFnZW1lbnRFbGVtZW50cyhtYXJrSWQsIHNvcnRCeSwgZGlyZWN0aW9uKTtcbn1cblxuLyoqXG4gKiBUYWcgY29sb3IgY2FuIGVpdGhlciBiZSBzZWxlY3RlZCBieSBjbGlja2luZyBvbiBhIGNvbG9yIHNlbGVjdG9yIG9yIHdpdGggdGhlIGFycm93IGtleXMgdGhlbiBwcmVzc2luZ1xuICogJ0VudGVyJy4gV2hlbiBzZWxlY3RpbmcgdGhlIGNvbG9yIGJ5IGNsaWNraW5nLCB3ZSBncmFiIHRoZSBjb2xvciBmcm9tIHRoZSBldmVudCB0YXJnZXRcbiAqIEBwYXJhbSBldmVudFxuICogQHBhcmFtIG5ld1RhZ0RpdlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0TmV3Q29sb3IoZXZlbnQgPSBudWxsLCBuZXdUYWdEaXYpIHtcbiAgbGV0IGNvbG9yID0gJ2RlZmF1bHQnO1xuXG4gIC8vIGF0dGVtcHQgdG8gZmV0Y2ggbmV3IGNvbG9yIGZyb20gZXZlbnQgdGFyZ2V0IChjb2xvciBzZWxlY3RvciBkaXYgY2xpY2tlZClcbiAgaWYoZXZlbnQpIHtcbiAgICBjb25zdCB7IHRhcmdldDogeyBjbGFzc0xpc3QsIHRhZ05hbWUsIGRhdGFzZXQ6IHsgdGFnQ29sb3IgfSB9IH0gPSBldmVudDtcblxuICAgIGlmKHRhZ05hbWUgPT09ICdESVYnICYmIGNsYXNzTGlzdC5jb250YWlucygndGFnJykgJiYgdGFnQ29sb3IpIHtcbiAgICAgIGNvbG9yID0gdGFnQ29sb3I7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGdldCB0aGUgY29sb3Igb2YgdGhlIG5ldyB0YWcgZWxlbWVudFxuICAgIGxldCB7IGRhdGFzZXQ6IHsgdGFnQ29sb3IgfSB9ID0gbmV3VGFnRGl2O1xuICAgIGNvbG9yID0gdGFnQ29sb3I7XG4gIH1cblxuICByZXR1cm4gY29sb3I7XG59XG5cbi8qKlxuICogVXBkYXRlIGEgdGFnIGRpdiBlbGVtZW50J3MgY29sb3IgLSBib3RoIHRoZSBjbGFzcyBhbmQgZGF0YSBhdHRyaWJ1dGUuXG4gKiBJZiBubyBwcmV2aW91c0NvbG9yIGlzIGdpdmVuLCBpdCBjaGVja3MgdGhlIGNsYXNzTGlzdCB0byBzZWUgaWYgYSBjb2xvciBleGlzdHMuXG4gKlxuICogQHBhcmFtIGVsZW1lbnRcbiAqIEBwYXJhbSBuZXdDb2xvclxuICogQHBhcmFtIHByZXZpb3VzQ29sb3JcbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ29sb3JPbkVsZW1lbnQoZWxlbWVudCwgbmV3Q29sb3IsIHByZXZpb3VzQ29sb3IgPSBudWxsKSB7XG4gIC8vIGVuc3VyZSB0aGVyZSBpcyBubyBjb2xvciBjbGFzcyBpbiB0aGUgY2xhc3NMaXN0XG4gIGlmICghcHJldmlvdXNDb2xvcikge1xuICAgIGZvcihsZXQgY29sb3Igb2YgY29sb3JXb3JkcygpKSB7XG4gICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY29sb3IpKSB7XG4gICAgICAgIHByZXZpb3VzQ29sb3IgPSBjb2xvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZWxlbWVudC5kYXRhc2V0LnRhZ0NvbG9yID0gbmV3Q29sb3I7XG5cbiAgaWYgKHByZXZpb3VzQ29sb3IpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZXBsYWNlKHByZXZpb3VzQ29sb3IsIG5ld0NvbG9yKTtcbiAgfSBlbHNlIGlmIChuZXdDb2xvcikge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChuZXdDb2xvcik7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBTYXZlIHVwZGF0ZWQgdGFnIGRhdGEgZm9yIG1hcmsgdG8gdGhlIGRhdGFiYXNlLlxuICpcbiAqIFR3byBzdXJmYWNlcyBzaGFyZSB0aGlzIGZ1bmN0aW9uIGFuZCB0aGV5IGRvIG5vdCBzaGFyZSBhIHNhdmUgcGF0aCAoIzQzNjgpLlxuICogVGhlIHJlYWRlciBib2R5IHBlcnNpc3RzIHRoZSBXSE9MRSBzZWN0aW9uIHRocm91Z2ggVXNlck1hcmtzLCB3aGljaCByZWFkc1xuICogYC5zZWN0aW9uLWNvbnRlbnRgLCBgLmN1cnJlbnQtaW5mb2AgYW5kIGBzZXNzaW9uU3RvcmFnZVsnbWFya3MnXWAuIFRoZVxuICogYWNjb3VudCBBbm5vdGF0aW9ucyBwYWdlIGhhcyBub25lIG9mIHRob3NlLCBzbyBpdCB0YWtlcyB0aGUgc2luZ2xlLW1hcmtcbiAqIGB0YWdzYCByZWFkLW1vZGlmeS13cml0ZSBpbnN0ZWFkICgjNDQ2MyksIHBvc3RlZCB0byB0aGUgc2FtZVxuICog
109cmVmcmVzaC1wYWdpbmF0ZWQtbGlzdC5waHAgaXRzIHJlY29sb3IsIGRlbGV0ZSBhbmQgbm90ZSBhY3Rpb25zIGFscmVhZHlcbiAqIHVzZS4gVGhhdCBhY3Rpb24gdG91Y2hlcyBvbmx5IHRoaXMgbWFyaydzIGB0YWdzYCBhbmQgbGVhdmVzIHRoZSBub3RlIGFuZFxuICogY29sb3VyIHJpZGluZyBpbnNpZGUgdGhlIHNhbWUgYW5ub3RhdGlvbiBvYmplY3QgYnl0ZS1pZGVudGljYWwuXG4gKlxuICogQHBhcmFtIG1hcmtJZFxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZVRhZ3MobWFya0lkKSB7XG4gIGxldCBzcGlubmVyXG4gICAgPSBuZXcgU3Bpbm5lcihcbiAgICAnc2F2ZS10YWcnLFxuICAgICdbZGF0YS1jb250cm9scy1mb3I9XCJ0YWdzXCJdIC5jbG9zZS1idXR0b24nLFxuICAgICdhZnRlcmVuZCcsXG4gICAgZmFsc2UpO1xuXG4gIHNwaW5uZXIuYWRkKCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgc2F2ZVRhZ3NGb3JNYXJrKG1hcmtJZCk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gVGhlIHNwaW5uZXIncyBvd25lciBpcyB0aGlzIGBmaW5hbGx5YCwgc28gbm8gYnJhbmNoIC0gaW5jbHVkaW5nIGEgdGhyb3dcbiAgICAvLyBvdXQgb2YgdGhlIHNhdmUgb3IgaXRzIERPTSB1cGRhdGVzIC0gY2FuIGxlYXZlIGl0IHNwaW5uaW5nIGZvcmV2ZXIgKCM0NDAyKS5cbiAgICBhd2FpdCBzcGlubmVyLnJlbW92ZSgpO1xuICB9XG59XG5cbi8qKlxuICogUGVyc2lzdCB0aGUgbWFyaydzIHRhZ3MgYW5kIHJlZmxlY3QgdGhlIHNhdmVkIHN0YXRlIGluIHNlc3Npb24gc3RvcmFnZSBhbmRcbiAqIGluIHRoZSBtYXJrcycgb3B0aW9ucyBkaXZzLiBDYWxsZWQgb25seSBieSBzYXZlVGFncygpLCB3aGljaCBvd25zIHRoZVxuICogc3Bpbm5lciBhcm91bmQgaXQuXG4gKlxuICogQHBhcmFtIG1hcmtJZFxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gdGhlIHNhdmUgcmVzcG9uc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZVRhZ3NGb3JNYXJrKG1hcmtJZCkge1xuICAvLyBBbiBhbm5vdGF0aW9uIGNhcmQgY2FycnlpbmcgdGhpcyBtYXJrIGlkIG1lYW5zIHdlIGFyZSBvbiB0aGUgYWNjb3VudFxuICAvLyBBbm5vdGF0aW9ucyBwYWdlOiB0aGUgcmVhZGVyIGJvZHkgcmVuZGVycyA8bWFyaz4gZWxlbWVudHMsIG5ldmVyIGNhcmRzLlxuICAvLyBUaGUgc3Bpbm5lciBpcyBub3QgdG9ybiBkb3duIGhlcmUgLSBzYXZlVGFncygpIG93bnMgaXQgaW4gYSBgZmluYWxseWBcbiAgLy8gdGhhdCBjb3ZlcnMgdGhpcyBicmFuY2ggdG9vICgjNDQwMikuXG4gIGlmIChhbm5vdGF0aW9uQ2FyZEZvcihtYXJrSWQpKSB7XG4gICAgY29uc3QgYWNjb3VudFJlc3VsdCA9IGF3YWl0IHNhdmVBY2NvdW50QW5ub3RhdGlvblRhZ3MobWFya0lkKTtcblxuICAgIGlmIChhY2NvdW50UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHN5bmNBbm5vdGF0aW9uQ2FyZFRhZ3MobWFya0lkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm90aWNlID0gbmV3IEFzeW5jTm90aWNlKHQoJ2Vycm9yX3NhdmluZ190YWdzJykgfHwgJ1RoZXJlIHdhcyBhbiBlcnJvciBzYXZpbmcgeW91ciB0YWdzLicsICdlcnJvcicpO1xuICAgICAgYXdhaXQgbm90aWNlLmNyZWF0ZSh7fSwgdHJ1ZSk7XG4gICAgICBub3RpY2UucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY291bnRSZXN1bHQ7XG4gIH1cblxuICBsZXQgbWFyayA9IGZpbmRNYXJrSW5TZXNzaW9uKG1hcmtJZCk7XG4gIGNvbnN0IHRhZ3NPbmx5ID0gdHJ1ZTtcblxuICBjb25zdCB1ID0gbmV3IFVzZXJNYXJrcygpO1xuICB1LmluaXRpYWxpemUodGFnc09ubHkpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHUuc2F2ZU1hcmtzKFttYXJrXSk7XG5cbiAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgLy8gdXBkYXRlIHVzZXIgdGFncyBsaXN0XG4gICAgaWYgKHJlc3VsdC50YWdzKSB7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd1c2VyVGFncycsIEpTT04uc3RyaW5naWZ5KHJlc3VsdC50YWdzKSk7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIG1hcmtzIGNvbGxlY3Rpb25cbiAgICBsZXQgYWxsTWFya3MgPSBnZXRTZWN0aW9uTWFya3NGcm9tU2Vzc2lvblN0b3JhZ2UoKTtcblxuICAgIC8vIHVwZGF0ZSB0YWdzIG9uIG9wdGlvbnNEaXZzXG4gICAgLy9cbiAgICAvLyBBICd0YWdzT25seScgc2F2ZSByZXR1cm5zIHRoZSBXSE9MRSBzZWN0aW9uJ3MgbWFya3MsIG5vdCBqdXN0IHRoZSBvbmVcbiAgICAvLyBzYXZlZCAoc3JjL2Jvb2tzL2ZldGNoL21hcmtzLnBocCkuIFN0b3JlZCBhbm5vdGF0aW9ucyB0aGF0IG5ldmVyXG4gICAgLy8gcmVuZGVyZWQgLSBhIGZhaWxlZCBhbmNob3IsIGEgcXVldWVkIG1hcmssIGEgc3RhbGUgY29udGVudCBpZCAtIGhhdmUgbm9cbiAgICAvLyBgbWFya1tkYXRhLWlkXWAgaW4gdGhlIERPTSwgc28gYGdldE1hcmtFbGVtZW50KClgIHJldHVybnMgbnVsbCBmb3IgdGhlbS5cbiAgICAvLyBEZXJlZmVyZW5jaW5nIHRoYXQgbnVsbCB0aHJldyBvdXQgb2YgaGVyZSBhbmQgc3RyYW5kZWQgYm90aCB0aGUgcG9wdXBcbiAgICAvLyBvdmVybGF5IGFuZCB0aGlzIHNwaW5uZXIgKCM0NDAyKS4gTm90aGluZyB0byByZS1yZW5kZXIsIHNvIHNraXAgaXQuXG4gICAgbGV0IG1hcmtFbGVtLCBvcHRpb25zV3JhcHBlcjtcbiAgICBmb3IgKGxldCBtYXJrIG9mIHJlc3VsdC5tYXJrcykge1xuICAgICAgdXBkYXRlTWFya0luU2VjdGlvbkNvbGxlY3Rpb25JblNlc3Npb25TdG9yYWdlKGFsbE1hcmtzLCBtYXJrKTtcbiAgICAgIG1hcmtFbGVtID0gZ2V0TWFya0VsZW1lbnQobWFyay5pZCk7XG4gICAgICBpZiAoIW1hcmtFbGVtKSB7XG4gICAgICAgIGxvZyhgc2F2ZVRhZ3M6IG1hcmsgJHttYXJrLmlkfSBpcyBub3QgcGFpbnRlZCBpbiB0aGlzIHNlY3Rpb24gLSBza2lwcGluZyBpdHMgb3B0aW9ucyBkaXZgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEd1dHRlciBub3RlL3RhZyBtYXJrZXIgKCM0NDY2KToga2VlcCB0aGUgcmVhZGVyJ3MgbWFyZ2luIGljb25zIGluIHN0ZXBcbiAgICAgIC8vIHdpdGggdGhlIHRhZ3MganVzdCBzYXZlZCwgc28gYWRkaW5nIHRoZSBmaXJzdCB0YWcgb3IgcmVtb3ZpbmcgdGhlIGxhc3RcbiAgICAgIC8vIG9uZSBzaG93cyB1cCB3aXRob3V0IGEgcGFnZSByZWZyZXNoLiBhcHBseU5vdGVUYWdNYXJrZXIoKSBjbGVhcnMgYW55XG4gICAgICAvLyBleGlzdGluZyBtYXJrZXIgZm9yIHRoZSBpZCBmaXJzdCBhbmQgcmV0dXJucyBudWxsIHdoZW4gdGhlIG1hcmsgaGFzXG4gICAgICAvLyBuZWl0aGVyIGEgbm90ZSBub3IgdGFncywgc28gdGhpcyBvbmUgY2FsbCBjb3ZlcnMgYm90aCBkaXJlY3Rpb25zIGFuZFxuICAgICAgLy8gbGVhdmVzIGEgbm90ZS1vbmx5IG1hcmsncyBpY29uIGFsb25lLlxuICAgICAgLy8gcmVmbG93OiB0aGUgc2F2ZWQgbWFyayBtYXkgaGF2ZSBnYWluZWQgaXRzIGZpcnN0IHRhZyBuZXh0IHRvIGFcbiAgICAgIC8vIGxpbmUtbWF0ZSB0aGF0IGFscmVhZHkgaGFzIGFuIGljb24sIHdoaWNoIG5lZWRzIHRoZSBsaW5lIHJlZ3JvdXBlZC5cbiAgICAgIGFwcGx5Tm90ZVRhZ01hcmtlcihkb2N1bWVudCwgbWFyaywgeyByZWZsb3c6IHRydWUgfSk7XG5cbiAgICAgIC8vIEEgbXVsdGktcGFyZW50IGhpZ2hsaWdodCByZW5kZXJzIGFzIG9uZSA8bWFyaz4gUEVSIEJMT0NLLCBhbmQgZWFjaFxuICAgICAgLy8gc2VnbWVudCBjYXJyaWVzIGl0cyBvd24gb3B0aW9ucyBkaXYgd2l0aCB0aGUgc2FtZSBkYXRhLW1hcmstaWQuIFVzaW5nXG4gICAgICAvLyBnZXRNYXJrRWxlbWVudCgpJ3Mgc2luZ2xlIGVsZW1lbnQgcmVmcmVzaGVkIHRoZSBjaGlwcyBvbiBvbmUgc2VnbWVudFxuICAgICAgLy8gb25seSwgc28gdGhlIG90aGVyIHNlZ21lbnRzIG9mIHRoZSBzYW1lIGFubm90YXRpb24gc2hvd2VkIHN0YWxlIHRhZ3NcbiAgICAgIC8vIHVudGlsIGEgcmVsb2FkICgjNDQ3MCBRQykuXG4gICAgICBjb25zdCB3cmFwcGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgIGBbZGF0YS1jb250cm9scy1mb3I9XCJhbm5vdGF0aW9uXCJdW2RhdGEtbWFyay1pZD1cIiR7U3RyaW5nKG1hcmsuaWQpLnJlcGxhY2UoL1tcIlxcXFxdL2csICdcXFxcJCYnKX1cIl0gLm90aGVyLW9wdGlvbnMtd3JhcHBlcmBcbiAgICAgICk7XG5cbiAgICAgIGlmICh3cmFwcGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgI
109HdyYXBwZXJzLmZvckVhY2goKHdyYXBwZXIpID0+IHJlbmRlclRhZ3NPbk9wdGlvbnNEaXYobWFyaywgd3JhcHBlcikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgZm9yIGEgcG9wdXAgYnVpbHQgd2l0aG91dCB0aGUgYXR0cmlidXRlOiBiZXR0ZXIgb25lIHNlZ21lbnRcbiAgICAgICAgLy8gcmVmcmVzaGVkIHRoYW4gbm9uZS5cbiAgICAgICAgb3B0aW9uc1dyYXBwZXIgPSBtYXJrRWxlbS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1jb250cm9scy1mb3I9XCJhbm5vdGF0aW9uXCJdIC5vdGhlci1vcHRpb25zLXdyYXBwZXInKTtcbiAgICAgICAgaWYgKG9wdGlvbnNXcmFwcGVyKSB7XG4gICAgICAgICAgcmVuZGVyVGFnc09uT3B0aW9uc0RpdihtYXJrLCBvcHRpb25zV3JhcHBlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgbm90aWNlID0gbmV3IEFzeW5jTm90aWNlKHQoJ2Vycm9yX3NhdmluZ190YWdzJykgfHwgJ1RoZXJlIHdhcyBhbiBlcnJvciBzYXZpbmcgeW91ciB0YWdzLicsICdlcnJvcicpO1xuICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoe30sIHRydWUpO1xuICAgIG5vdGljZS5yZW1vdmUoKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogSGFuZGxlciB0byBhZGQgYSBuZXcgIHRhZy4gQ3JlYXRlZCB0aGUgdGFnIGRpdiBhbmQgYWRkcyBpdCB0byB0aGUgRE9NLlxuICogQ2xlYXJzIHRoZSAnZmlsdGVyZWQtdGFncycgc2Vzc2lvbiBzdG9yYWdlIHZhcmlhYmxlLlxuICpcbiAqIEBwYXJhbSBldmVudFxuICogQHBhcmFtIHRhZ01hbmFnZW1lbnREaXZcbiAqIEBwYXJhbSB0YWdUeXBlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFkZE5ld1RhZ0hhbmRsZXIoZXZlbnQsIHRhZ01hbmFnZW1lbnREaXYsIHRhZ1R5cGUpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICBjb25zdCBtYXJrID0gdGFnTWFuYWdlbWVudERpdi5jbG9zZXN0KCdtYXJrJyk7XG4gIC8vIFRoZSBhY2NvdW50IEFubm90YXRpb25zIHBhZ2UgaGFzIG5vIDxtYXJrPiB0byBoYW5nIHRoZSB0cmF5IG9mZiDigJQgaXRzXG4gIC8vIGFubm90YXRpb25zIGFyZSBjYXJkcy4gQm90aCBzdXJmYWNlcyBkbyBjYXJyeSB0aGUgdHJheSBpdHNlbGYsIHNvIHRoZVxuICAvLyBhbHJlYWR5LWFkZGVkIGNoZWNrIHJlYWRzIHRoZSBhc3NpZ25lZCB0YWdzIGZyb20gdGhlcmUgaW5zdGVhZCAoIzQzNjgpLlxuICBjb25zdCBleGlzdGluZ1RhZ3MgPSAobWFyayA/PyB0YWdNYW5hZ2VtZW50RGl2KS5xdWVyeVNlbGVjdG9yQWxsKCcuZXhpc3RpbmctdGFncyAudGFnJyk7XG4gIC8vIFRPRE86IFVwZGF0ZSB0byBtYW5hZ2UgZGlmZiBiZXQuIHJlYWRlciAvIGFubm90YXRpb25zIHBhZ2UgcmVxdWVzdHMgKHVzZXIgdXNlck1hcmtSZWNvcmRJZClcbiAgLy8gdGFnIGRldGFpbHMgLSBoYW5kbGUgcmVxdWVzdHMgZnJvbSB0aGUgcmVhZGVyIG9yIHRoZSBhbm5vdGF0aW9ucyBwYWdlXG4gIC8vIFJlc29sdmVkIEJFRk9S
109RSB0aGUgbmV3LXRhZyBsb29rdXAgYmVsb3c6IGNyZWF0ZU5ld1RhZ0RpdiBrZXlzIHRoYXRcbiAgLy8gZWxlbWVudCBvbiB0aGUgbWFyayBpZCwgd2hpY2ggb2ZmIHRoZSBhY2NvdW50IHBhZ2UncyBjYXJkIGlzIG5vdFxuICAvLyBgbWFyay5kYXRhc2V0LmlkYCDigJQgdGhlcmUgaXMgbm8gPG1hcms+IHRoZXJlIGF0IGFsbCAoIzQzNjgpLlxuICBsZXQgbWFya0lkID0gbnVsbCwgdXNlck1hcmtSZWNvcmRJZDtcbiAgaWYobWFyaykge1xuICAgIGNvbnN0IHtkYXRhc2V0OiB7aWR9fSA9IG1hcms7XG4gICAgbWFya0lkID0gaWQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gQW5jaG9yZWQgb24gdGhlIHRyYXksIG5vdCBvbiB0aGUgZXZlbnQgdGFyZ2V0OiBmb3IgYSBzdWdnZXN0ZWQgdGFnIHRoZVxuICAgIC8vIGNsaWNrIGhhbmRsZXIgcnVucyBjaGFuZ2VDb2xvckhhbmRsZXIoKSBmaXJzdCwgd2hpY2ggcmUtcmVuZGVycyB0aGVcbiAgICAvLyBzdWdnZXN0aW9ucyBsaXN0LCBzbyB0aGUgY2xpY2tlZCBlbGVtZW50IGlzIGFscmVhZHkgZGV0YWNoZWQgZnJvbSB0aGVcbiAgICAvLyBjYXJkIGJ5IHRoZSB0aW1lIHRoaXMgcnVucyBhbmQgYGNsb3Nlc3QoKWAgZmluZHMgbm90aGluZyAoIzQ4NTMpLlxuICAgIGNvbnN0IHVzZXJIaWdobGlnaHQgPSB0YWdNYW5hZ2VtZW50RGl2LmNsb3Nlc3QoJy51c2VyLWhpZ2hsaWdodCcpXG4gICAgICA/PyBldmVudC50YXJnZXQuY2xvc2VzdCgnLnVzZXItaGlnaGxpZ2h0Jyk7XG4gICAgaWYgKHVzZXJIaWdobGlnaHQpIHtcbiAgICAgIGNvbnN0IHtkYXRhc2V0OiB7bWFya0lkOiBpZCwgdXNlck1hcmtSZWNvcmRJZDogbWFya1JlY29yZElkfX0gPSB1c2VySGlnaGxpZ2h0O1xuICAgICAgbWFya0lkID0gaWQ7XG4gICAgICB1c2VyTWFya1JlY29yZElkID0gbWFya1JlY29yZElkO1xuICAgIH1cbiAgfVxuXG4gIC8vIEtleWVkIG9uIHRoZSBuZXctdGFnIGVsZW1lbnQncyBvd24gZGF0YS1tYXJrLWlkIGhhbmRsZSwgbm90IG9uIGl0c1xuICAvLyBkYXRhLXRhZy1pZC4gY3JlYXRlTmV3VGFnRGl2IHVzZWQgdG8gb3ZlcndyaXRlIGRhdGEtdGFnLWlkIHdpdGggdGhlIG1hcmsgaWRcbiAgLy8gcHVyZWx5IHNvIHRoaXMgbG9va3VwIHdvdWxkIGZpbmQgaXQsIHdoaWNoIG1hZGUgYXNzaWduZWRUYWdJZHNGb3IoKSBwb3N0IGFcbiAgLy8gTUFSSyBpZCB3aGVyZSBhIHRhZyBpZCBiZWxvbmdzICgjNDg1MykuIF9uZXdUYWdFbGVtZW50U2VsZWN0b3IgaXMgdGhlIHNhbWVcbiAgLy8gaGFuZGxlIHRoZSBjb2xvdXIgaGFuZGxlciBhbmQgdGhlIGFycm93IGtleXMgYWxyZWFkeSB1c2UuXG4gIGNvbnN0IG5ld1RhZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoX25ld1RhZ0VsZW1lbnRTZWxlY3RvcihtYXJrSWQpKTtcbiAgY29uc3QgeyB0YWdUZXh0ID0gbnVsbCB9ID0gbmV3VGFnPy5kYXRhc2V0ID8/IHt9O1xuICBjb25zdCBhbHJlYWR5QWRkZWQgPSBBcnJheS5mcm9tKGV4aXN0aW5nVGFncykuZmluZCgodGFnKSA9PiB7XG4gICAgcmV0dXJuIHRhZy5kYXRhc2V0LnRhZ1RleHQgPT09IHRhZ1RleHQ7XG4gIH0pID8/IGZhbHNlO1xuXG4gIC8vIGV4aXQgaWYgdGFnIGlzIGFscmVhZHkgYWRkZWRcbiAgaWYoYWxyZWFkeUFkZGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHdpdGhUYWdNdXRhdGlvbk92ZXJsYXkobWFya0lkLCBhc3luYyAodGFnTWFuYWdlbWVudEVsZW0pID0+IHtcbiAgICBsZXQgdGFyZ2V0RWxlbWVudDtcbiAgICBpZiAodGFnVHlwZSA9PT0gJ25ldycpIHtcbiAgICAgIGNvbnN0IG1hcmtFbGVtID0gZmluZE1hcmtFbGVtZW50Rm9yKG1hcmtJZCk7XG4gICAgICB0YXJnZXRFbGVtZW50ID0gZ2V0TmV3VGFnRGl2KG1hcmtFbGVtKTtcbiAgICAgIHRhcmdldEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWN1cnJlbnQtY29sb3InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0RWxlbWVudCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgaWYoIXVzZXJNYXJrUmVjb3JkSWQgJiYgdGFyZ2V0RWxlbWVudC5ub2RlTmFtZSA9PT0gJ1NQQU4nKSB7XG4gICAgICAgIHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIHRhZyBvYmplY3RcbiAgICBjb25zdCB7XG4gICAgICBkYXRhc2V0OiB7XG4gICAgICAgIHRhZ0NvbG9yOiBjb2xvcixcbiAgICAgICAgdGFnSWQ6IGlkLFxuICAgICAgICB0YWdMYXN0VXBkYXRlZDogbGFzdFVwZGF0ZWQsXG4gICAgICAgIHRhZ1VzYWdlOiB1c2FnZSxcbiAgICAgICAgdGFnVGV4dDogdGV4dFxuICAgICAgfVxuICAgIH0gPSB0YXJnZXRFbGVtZW50O1xuXG4gICAgbGV0IHRhZyA9IHsgaWQsIHRleHQsIGNvbG9yLCBsYXN0VXBkYXRlZCwgdXNhZ2V9O1xuXG4gICAgY29uc3QgYWxyZWFkeUFkZGVkVGFnID0gZmluZFRhZ0luRXhpc3RpbmdUYWdzKG1hcmtJZCwgdGV4dCwgY29sb3IpO1xuICAgIGlmIChhbHJlYWR5QWRkZWRUYWcpIHtcbiAgICAgIC8vIHNwb3RsaWdodCB0YWcgaW4gYXNzaWduZWQgdGFncyBhcmVhXG4gICAgICBzcG90bGlnaHRUYWcoYWxyZWFkeUFkZGVkVGFnKTtcblxuICAgICAgY29uc3QgeyBzb3J0QnksIGRpcmVjdGlvbiB9ID0gY3VycmVudFN1Z2dlc3RlZFRhZ3NTb3J0UHJvcGVydGllcyhtYXJrSWQpO1xuICAgICAgdXBkYXRlVGFnTWFuYWdlbWVudEVsZW1lbnRzKG1hcmtJZCwgc29ydEJ5LCBkaXJlY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVTcG90bGlnaHRGcm9tVGFncygpO1xuXG4gICAgICAvKiogYWRkIHRhZyB0byBVSSAqKi9cbiAgICAgIGxldCB0YWdFbGVtZW50LCBpO1xuXG4gICAgICAvLyBidXR0b24gdG8gcmVtb3ZlXG4gICAgICBpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xuICAgICAgaS5jbGFzc0xpc3QuYWRkKCdmYS1zb2xpZCcsICdmYS14bWFyaycpO1xuXG4gICAgICB0YWdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0YWdFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RhZycsIGNvbG9yKTtcbiAgICAgIHRhZ0VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy10eXBlJywgJ2V4aXN0aW5nJyk7XG4gICAgICB0YWdFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS10YWctdGV4dCcsIHRleHQpO1xuICAgICAgLy8gZGF0YS10YWctaWQgbWF0Y2hlcyB3aGF0IHJlbmRlckV4aXN0aW5nVGFncyB3cml0ZXMsIHNvIGEgdGFnIHRoYXQgd2FzXG4gICAgICAvLyBqdXN0IGFkZGVkIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gb25lIHRoYXQgd2FzIGFscmVhZHkgdGhlcmUuIFRoZVxuICAgICAgLy8gYWNjb3VudCBwYWdlJ3Mgc2F2ZSByZWFkcyB0aGUgdHJheSwgYW5kIHdpdGhvdXQgdGhpcyB0aGUgbmV3IHRhZyB3b3VsZFxuICAgICAgLy8gYmUgcG9zdGVkIGFzIGlmIGl0IGhhZCBuZXZlciBiZWVuIGFkZGVkICgjNDM2OCkuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGFnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWlkJywgaWQpO1xuICAgICAgfVxuICAgICAgLy8gVGhlIE1BUksgaWQ6IGluc2VydEFscGhhYmV0aWNhbGx5KCkgcmVzb2x2ZXMgdGhlIGFzc2lnbmVkLXRhZ3MgZGl2IGZyb21cbiAgICAgIC8vIHRoaXMgYXR0cmlidXRlIHdoZW4gdGhlIHRyYXkgaXMgZW1wdHksIHNvIGEgdGFnIGlkIGhlcmUgbWFkZSBhZGRpbmcgdGhlXG4gICAgICAvLyBmaXJzdCB0YWcgZmFpbC4gSXQgb25seSBldmVyIHdvcmtlZCBiZWNhdXNlIGRhdGEtdGFnLWlkIGFuZCBkYXRhLW1hcmstaWRcbiAgICAgIC8vIGJvdGggY2FycmllZCB0aGUgbWFyayBpZCAoIzQ4NTMpLlxuICAgICAgdGFnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWFyay1pZCcsIG1hcmtJZCk7XG4gICAgICB0YWdFbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCBgVXNhZ2U6ICR7dXNhZ2V9YCk7XG4gICAgICB0YWdFbGVtZW50ID0gdXBkYXRlQ29sb3JPbkVsZW1lbnQodGFnRWxlbWVudCwgY29sb3IpO1xuXG4gICAgICBjb25zdCB0YWdTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgdGFnU3Bhbi5zZXRB
109dHRyaWJ1dGUoJ2RhdGEtdGFnLXRleHQnLCB0ZXh0KTtcbiAgICAgIHRhZ1NwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXRhZy1jb2xvcicsIGNvbG9yKTtcbiAgICAgIHRhZ1NwYW4udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgdGFnRWxlbWVudC5hcHBlbmRDaGlsZCh0YWdTcGFuKTtcbiAgICAgIHRhZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoaSk7XG5cbiAgICAgIC8vIGRlbGV0ZSBoYW5kbGVyIC0gZWRpdGluZyBhbiBleGlzdGluZyB0YWdcbiAgICAgIHRhZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgICBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJlbW92ZVRhZ0hhbmRsZXIoZXZlbnQsIG1hcmtJZCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIGFkZCB0byB0YWdzIGRpdlxuICAgICAgY29uc3QgYXNzaWduZWRUYWdzRWxlbSA9IGZpbmRFeGlzdGluZ1RhZ3NEaXZGb3JNYXJrKG1hcmtJZCk7XG4gICAgICBjb25zdCBkZWxldGVCdXR0b24gPSBhc3NpZ25lZFRhZ3NFbGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRhZy10eXBlPVwiZGVsZXRlXCJdJyk7XG5cbiAgICAgIGlmIChkZWxldGVCdXR0b24pIHtcbiAgICAgICAgZGVsZXRlQnV0dG9uLmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCB0YWdFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBleGlzdGluZyB0YWdzLCBpbnNlcnQgdGFnIGF0IHNvcnRlZCBwb3NpdGlvblxuICAgICAgICBjb25zdCBjdXJyZW50VGFncyA9IGFzc2lnbmVkVGFnc0VsZW0ucXVlcnlTZWxlY3RvckFsbCgnLnRhZycpO1xuICAgICAgICBpbnNlcnRBbHBoYWJldGljYWxseShjdXJyZW50VGFncywgdGFnRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcmtPYmplY3QgPSBmaW5kTWFya0luU2Vzc2lvbihtYXJrSWQpID8/IHsgaWQ6IG1hcmtJZCB9O1xuICAgICAgbWFuYWdlRGVsZXRlQWxsQnV0dG9uKGFzc2lnbmVkVGFnc0VsZW0sIG1hcmtPYmplY3QpO1xuXG4gICAgICAvLyBmaW5kIG1hcmsgaW4gc2Vzc2lvbiBzdG9yYWdlLiBUaGUgYWNjb3VudCBBbm5vdGF0aW9ucyBwYWdlIGtlZXBzIG5vXG4gICAgICAvLyBzZWN0aW9uIGNvbGxlY3Rpb24sIHNvIHRoZXJlIGlzIG5vIG1hcmsgdG8gdXBkYXRlIHRoZXJlIGFuZCB0aGUgd2hvbGVcbiAgICAgIC8vIGJvb2trZWVwaW5nIGJsb2NrIGlzIHNraXBwZWQgKCM0MzY4KS5cbiAgICAgIGxldCBtYXJrcyA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnbWFya3MnKSk7XG4gICAgICBsZXQgbWFya0RhdGEgPSBmaW5kTWFya0luU2VjdGlvbkNvbGxlY3Rpb25JblNlc3Npb25TdG9yYWdlKG1hcmtzLCBtYXJrSWQpO1xuICAgICAgY29uc3QgbWFya0RhdGFDb3B5ID0gbWFya0RhdGEgPyBKU09OLnN0cmluZ2lmeShtYXJrRGF0YSkgOiBudWxsO1xuXG4gICAgICBpZiAobWFya0RhdGEpIHtcbiAgICAgICAgLy8gYWRkIHRhZyB0byBtYXJrIGRldGFpbHNcbiAgICAgICAgaWYgKG1hcmtEYXRhLnRhZ3MpIHtcbiAgICAgICAgICBtYXJrRGF0YS50YWdzLnB1c2godGFnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXJrRGF0YS50YWdzID0gW3RhZ107XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgbWFyayBpbiBzZXNzaW9uXG4gICAgICAgIHVwZGF0ZU1hcmtJblNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZShtYXJrcywgbWFya0RhdGEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHN1Y2Nlc3MgfSA9IGF3YWl0IHNhdmVUYWdzKG1hcmtJZCk7XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAvLyB1cGRhdGUgc2Vzc2lvbiB2YXJpYWJsZXNcbiAgICAgICAgaW5pdGlhbGl6ZVRhZ1Nlc3Npb25TdG9yYWdlVmFyaWFibGVzKG1hcmtJZCk7XG5cbiAgICAgICAgLy8gY2hhbmdlIGJhY2sgdGhlIGNvbG9yIGNvbnRyb2xzIHRvIGZvY3VzIG9uIHRoZSBuZXcgdGFnIGVsZW1lbnRcbiAgICAgICAgY2hhbmdlVGFnQ29sb3JDb250cm9scyhtYXJrSWQpO1xuXG4gICAgICAgIC8vIGNsZWFyIGNvbG9yIG9uIG5ldyB0YWcgZWxlbWVudFxuICAgICAgICBsZXQgbmV3VGFnQ29sb3IgPSBmaW5kQ29sb3JDbGFzc0luQ2xhc3NMaXN0KHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0KTtcbiAgICAgICAgdXBkYXRlQ29sb3JPbkVsZW1lbnQodGFyZ2V0RWxlbWVudCwgbmV3VGFnQ29sb3IsICdkZWZhdWx0Jyk7XG4gICAgICAgIC8vIGZpbmRNYXJrRWxlbWVudEZvciwgbm90IGdldE1hcmtFbGVtZW50OiB0aGUgYWNjb3VudCBwYWdlJ3MgdHJheSBoYW5nc1xuICAgICAgICAvLyBvZmYgYSBjYXJkLCBub3QgYSA8bWFyaz4gKCM0MzY4KS5cbiAgICAgICAgY29uc3QgbWFya0VsZW0gPSBmaW5kTWFya0VsZW1lbnRGb3IobWFya0lkKTtcbiAgICAgICAgY2FuY2VsTmV3VGFnQ3JlYXRpb24obWFya0VsZW0pO1xuXG4gICAgICAgIGNvbnN0IHsgc29ydEJ5LCBkaXJlY3Rpb24gfSA9IGN1cnJlbnRTdWdnZXN0ZWRUYWdzU29ydFByb3BlcnRpZXMobWFya0lkKTtcbiAgICAgICAgdXBkYXRlVGFnTWFuYWdlbWVudEVsZW1lbnRzKG1hcmtJZCwgc29ydEJ5LCBkaXJlY3Rpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbXNnID0gdCgnZXJyb3JfYWRkaW5nX3RhZycpIHx8ICdUaGVyZSB3YXMgYSBwcm9ibGVtIGFkZGluZyB0aGlzIHRhZy4nO1xuICAgICAgICBjb25zdCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UobXNnLCAnd2FybmluZycpO1xuICAgICAgICBhd2FpdCBub3RpY2UuY3JlYXRlKHt9LCB0cnVlKTtcblxuICAgICAgICAvLyByZXN0b3JlIHRoZSBwcmUtYWRkIG1hcmsgaW4gc2Vzc2lvbjsgdXBkYXRlTWFya0luU2VjdGlvbkNvbGxlY3Rpb25JblNlc3Npb25TdG9yYWdlXG4gICAgICAgIC8vIGV4cGVjdHMgYSBtYXJrIE9CSkVDVCwgc28gcGFyc2UgdGhlIHNuYXBzaG90IGJhY2sgaW50byBvbmVcbiAgICAgICAgaWYgKG1hcmtEYXRhQ29weSkge1xuICAgICAgICAgIHVwZGF0ZU1hcmtJblNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZShtYXJrcywgSlNPTi5wYXJzZShtYXJrRGF0YUNvcHkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vdGljZS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0SW5wdXQgPSB0YWdNYW5hZ2VtZW50RWxlbT8ucXVlcnlTZWxlY3RvcignW2RhdGEtaWQ9XCJ0YWctaW5wdXRcIl0nKTtcbiAgICB0ZXh0SW5wdXQ/LmZvY3VzKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0YWcgY29sb3IgaW4gbWFyayB0YWcuXG4gKlxuICogQHBhcmFtIG1hcmtEYXRhXG4gKiBAcGFyYW0gdGFnXG4gKi9cbmZ1bmN0aW9uIGNoYW5nZVRhZ0NvbG9ySW5NYXJrKG1hcmtEYXRhLCB0YWcpIHtcbiAgLy8gVGhlIGFjY291bnQgQW5ub3RhdGlvbnMgcGFn
109ZSBoYXMgbm8gc2VjdGlvbiBjb2xsZWN0aW9uLCBzbyB0aGVyZSBpcyBubyBtYXJrXG4gIC8vIG9iamVjdCB0byByZWNvbG91ciB0aGVyZSAoIzQ4NTMpLlxuICBpZiAobWFya0RhdGE/LnRhZ3MpIHtcbiAgICBmb3IgKGxldCBtYXJrVGFnIG9mIG1hcmtEYXRhLnRhZ3MpIHtcbiAgICAgIGlmIChtYXJrVGFnLnRleHQgPT09IHRhZy50ZXh0KSB7XG4gICAgICAgIG1hcmtUYWcuY29sb3IgPSB0YWcuY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSBjb2xvciBvbiB0aGUgYXNzaWduZWQtdGFnIGNoaXAgZm9yIGEgbWFyay5cbiAqXG4gKiBLZXllZCBvbiB0aGUgbWFyayBpZCByYXRoZXIgdGhhbiBvbiB0aGUgY2xpY2sgdGhhdCBzdGFydGVkIGl0OiB0aGUgZXZlbnRcbiAqIHRhcmdldCB3YXMgb25seSBldmVyIHVzZWQgdG8gd2FsayB1cCB0byBhIGA8bWFyaz5gLCB3aGljaCBkb2VzIG5vdCBleGlzdCBvblxuICogdGhlIGFjY291bnQgQW5ub3RhdGlvbnMgcGFnZSAoIzQ4NTMpLiBBU1NJR05FRF9UQUdfQ0hJUF9TRUxFQ1RPUiBjb3ZlcnMgYm90aFxuICogY2hpcCBtYXJrdXBzIOKAlCB0aGUgcmVhZGVyJ3MgYC50YWdzLXdyYXBwZXJgIGFuZCB0aGUgY2FyZCdzIGAuc2hvdy10YWdzYC5cbiAqXG4gKiBAcGFyYW0gbWFya0lkXG4gKiBAcGFyYW0gdGFnIHt7dGV4dDogc3RyaW5nLCBjb2xvcjogc3RyaW5nfX1cbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFnSW5PcHRpb25zRGl2KG1hcmtJZCwgdGFnKSB7XG4gIGNvbnN0IG1hcmtFbGVtID0gZmluZE1hcmtFbGVtZW50Rm9yKG1hcmtJZCk7XG5cbiAgaWYgKCFtYXJrRWxlbSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAobGV0IHRhZ0VsZW0gb2YgbWFya0VsZW0ucXVlcnlTZWxlY3RvckFsbChBU1NJR05FRF9UQUdfQ0hJUF9TRUxFQ1RPUikpIHtcbiAgICBpZiAodGFnRWxlbS5pbm5lclRleHQudHJpbSgpID09PSB0YWcudGV4dCkge1xuICAgICAgdXBkYXRlQ29sb3JPbkVsZW1lbnQodGFnRWxlbSwgdGFnLmNvbG9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXIgdGFncyBvbiB0aGUgb3B0aW9ucyBkaXYgb3IgdGhlIG1hbmFnZSB0YWdzIGRpdi5cbiAqIFRoZSAndGFyZ2V0JyBjYW4gYmUgZWl0aGVyICd0YWdzJywgJ2Fubm90YXRpb24nLlxuICpcbiAqIEBwYXJhbSBtYXJrRGF0YVxuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIHNob3dVc2FnZVxuICogQHJldHVybnMge0hUTUxEaXZFbGVtZW50fVxuICovXG5mdW5jdGlvbiByZW5kZXJFeGlzdGluZ1RhZ3MobWFya0RhdGEsIHRhcmdldCwgc2hvd1VzYWdlID0gZmFsc2UpIHtcbiAgY29uc3QgdGFnc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjb25zdCBtYXJrc0NvdW50ID0gbWFya0RhdGE/LnRhZ3M/Lmxlbmd0aCA/IG1hcmtEYXRhLnRhZ3MubGVuZ3RoIDogMDtcbiAgY29uc3QgbWFya0lkID0gbWFya0RhdGEuaWQ7XG5cbiAgdGFnc0Rpdi5jbGFzc0xpc3QuYWRkKCdleGlzdGluZy10YWdzJyk7XG5cbiAgLy8gaWYgbWFyayBoYXMgdGFnc1xuICBpZiAobWFya3NDb3VudCA+IDApIHtcbiAgICAvLyBsb29wIHRocm91Z2ggdGFncyBvbiBtYXJrIC0gY3JlYXRlIHRhZyBlbGVtZW50c1xuICAgIC8vIHJlbmRlciBleGlzdGluZyB0YWdzXG4gICAgY29uc3Qgc29ydGVkID0gbWFya0RhdGEudGFncy5zb3J0KHRhZ3NTb3J0aW5nRnVuY3Rpb24oJ25hbWUnLCAnYXNjJykpO1xuICAgIGZvciAobGV0IFtpbmRleCwgdGFnT2JqZWN0XSBvZiBzb3J0ZWQuZW50cmllcygpKSB7XG4gICAgICAvKiBTYW1wbGUgdGFnOiA8ZGl2IGNsYXNzTmFtZT1cInRhZyBkZWZhdWx0XCIgZGF0YS1pZD1cIjEnIGRhdGEtdHlwZT0nZXhpc3RpbmcnIGRhdGEtdGFnLWNvbG9yPSdyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPmRpdmluaXR5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1zb2xpZCBmYS14bWFya1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICovXG4gICAgICBsZXQgaTtcbiAgICAgIGNvbnN0IHRleHQgPSB0YWdPYmplY3QudGV4dCA9PT0gdW5kZWZpbmVkID8gJyEnIDogdGFnT2JqZWN0LnRleHQ7XG4gICAgICBjb25zdCBjb2xvciA9IHRhZ09iamVjdC5jb2xvciA9PT0gdW5kZWZpbmVkID8gJyEnIDogdGFnT2JqZWN0LmNvbG9yO1xuICAgICAgY29uc3QgdXNhZ2UgPSB0YWdPYmplY3QudXNhZ2UgPT09IHVuZGVmaW5lZCA/ICchJyA6IHRhZ09iamVjdC51c2FnZTtcblxuICAgICAgaWYgKHRhcmdldCA9PT0gJ3RhZ3MnKSB7XG4gICAgICAgIGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XG4gICAgICAgIGkuY2xhc3NMaXN0LmFkZCgnZmEtc29saWQnLCAnZmEteG1hcmsnKTtcbiAgICAgICAgaS5zZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnLCBpbmRleC50b1N0cmluZygpKTtcbiAgICAgIH1cblxuICAgICAgLy8gdGFnIGRpdlxuICAgICAgbGV0IHRhZ0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRhZ0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGFnJywgJ2RlZmF1bHQnKTtcbiAgICAgIHRhZ0VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy1pZCcsIHRhZ09iamVjdC5pZCk7XG4gICAgICB0YWdFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS10YWctdHlwZScsICdleGlzdGluZycpO1xuICAgICAgdGFnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLXRleHQnLCB0ZXh0KTtcbiAgICAgIHRhZ0VsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIGBVc2FnZTogJHt1c2FnZX1gKTtcbiAgICAgIHRhZ0VsZW1lbnQgPSB1cGRhdGVDb2xvck9uRWxlbWVudCh0YWdFbGVtZW50LCBjb2xvcik7XG5cbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS10YWctdGV4dCcsIHRleHQpO1xuICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWNvbG9yJywgY29sb3IpO1xuICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHRleHQ7XG5cbiAgICAgIC8vVE9ETzogQGNhcm9seW5sLCBzb21laG93IHRoZSBjbGFzcyAnc2hvdy1mb3Itc3InIGlzIGJlaW5nIGFkZGVkIGF1dG9tYXRpY2FsbHksIGJ1dCB0aGF0IGNsYXNzIGlzIG1ha2luZ1xuICAgICAgLy8gICAgICB0aGUgc3BhbiBjb250ZW50IGludmlzaWJsZS4uLlxuICAgICAgc3B
109hbi5jbGFzc0xpc3QucmVtb3ZlKCdzaG93LWZvci1zcicpO1xuXG4gICAgICB0YWdFbGVtZW50LmFwcGVuZENoaWxkKHNwYW4pO1xuXG4gICAgICBpZihzaG93VXNhZ2UpIHtcbiAgICAgICAgY29uc3QgdXNhZ2VTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB1c2FnZVNwYW4uY2xhc3NMaXN0LmFkZCgndGFnLXVzYWdlJyk7XG4gICAgICAgIHVzYWdlU3Bhbi5pbm5lckhUTUwgPSB1c2FnZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRhcmdldCA9PT0gJ3RhZ3MnKSB7XG4gICAgICAgIHRhZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoaSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGV2ZW50IGhhbmRsZXJcbiAgICAgIHRhZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgdGFnT2JqZWN0Lm1hcmtJZCA9IG1hcmtJZDtcbiAgICAgICAgYXdhaXQgcmVtb3ZlVGFnSGFuZGxlcihldmVudCwgbWFya0lkKTtcbiAgICAgIH0pXG5cbiAgICAgIHRhZ3NEaXYuYXBwZW5kQ2hpbGQodGFnRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhZ3NEaXY7XG59XG5cbi8qKlxuICogY3JlYXRlIGEgdGFnIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0gbWFya0lkXG4gKiBAcGFyYW0gdGFnRGF0YVxuICogQHBhcmFtIHRhZ1R5cGVcbiAqIEBwYXJhbSBzaG93VXNhZ2VcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU5ld1RhZ0RpdihtYXJrSWQsIHRhZ1R5cGUsIHRhZ0RhdGEsIHNob3dVc2FnZSA9IGZhbHNlKSB7XG4gIGxldCBuZXdUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgbGV0IGNvbG9yLCBuZXdUYWdEaXYsIHRleHQ7XG5cbiAgbmV3VGFnLmlkID0gJyc7XG4gIG5ld1RhZy5jbGFzc0xpc3QuYWRkKCd0YWcnKTtcbiAgbmV3VGFnLnNldEF0dHJpYnV0ZSgnZGF0YS10YWctdHlwZScsIHRhZ1R5cGUpO1xuXG4gIGlmICh0YWdUeXBlID09PSAnZGVsZXRlJykge1xuICAgIG5ld1RhZy5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdCgnZGVsZXRlX2FsbF90YWdzX3RpdGxlJykgfHwgJ0RlbGV0ZSBhbGwgdGFncycpO1xuICAgIG5ld1RhZy5jbGFzc0xpc3QuYWRkKCdkZWxldGUnKTtcbiAgICB0ZXh0ID0gdCgnZGVsZXRlX2FsbCcpIHx8ICdEZWxldGUgQWxsJztcbiAgfSBlbHNlIHtcbiAgICBuZXdUYWcuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy1jb2xvcicsIHRhZ0RhdGEuY29sb3IpO1xuICAgIG5ld1RhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWxhc3QtdXBkYXRlZCcsIHRhZ0RhdGEubGFzdFVwZGF0ZWQpO1xuICAgIG5ld1RhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLXRleHQnLCB0YWdEYXRhLnRleHQpO1xuICAgIG5ld1RhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLXVzYWdlJywgdGFnRGF0YS51c2FnZSk7XG4gICAgbmV3VGFnLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBgVXNhZ2U6ICR7dGFnRGF0YS51c2FnZX1gKTtcblxuICAgIC8vIGRhdGEtdGFnLWlkIGlzIHRoZSBUQUcncyBpZCBhbmQgbm90aGluZyBlbHNlLiBBIGJyYW5kLW5ldyB0YWcgaGFzIG5vIGlkXG4gICAgLy8geWV0LCBzbyBpdCBjYXJyaWVzIG5vIGF0dHJpYnV0ZSByYXRoZXIgdGhhbiB0aGUgc3RyaW5nIFwibnVsbFwiIOKAlCB0aGUgdGFnXG4gICAgLy8gaWRzIHJlYWQgb2ZmIHRoZSB0cmF5IGFyZSBwb3N0ZWQgdmVyYmF0aW0gYXMgdGhlIGFubm90YXRpb24ncyB3aG9sZSB0YWdcbiAgICAvLyBhc3NpZ25tZW50ICgjNDg1MykuXG4gICAgaWYgKHRhZ0RhdGEuaWQpIHtcbiAgICAgIG5ld1RhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWlkJywgdGFnRGF0YS5pZCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxvb2t1cCBoYW5kbGUuIEl0IGlzIGRlbGliZXJhdGVseSBOT1QgZGF0YS10YWctaWQ6IHRoZSBlbGVtZW50IGhhcyB0b1xuICAgIC8vIGJlIGZpbmRhYmxlIGJ5IHRoZSBtYXJrIGl0IGJlbG9uZ3MgdG8sIGFuZCBvdmVybG9hZGluZyB0aGUgdGFnIGlkIHdpdGhcbiAgICAvLyB0aGF0IGpvYiBpcyB3aGF0IHBvc3RlZCBhIG1hcmsgaWQgYXMgYSB0YWcgaWQgKCM0ODUzKS5cbiAgICBuZXdUYWcuZGF0YXNldC5tYXJrSWQgPSBtYXJrSWQ7XG5cbiAgICBpZiAodGFnVHlwZSA9PT0gJ25ldycpIHtcbiAgICAgIGlmIChuZXdUYWdEaXYpIHtcbiAgICAgICAgbmV3VGFnRGl2ID0gZmluZE1hcmtFbGVtZW50Rm9yKG1hcmtJZCk7XG4gICAgICAgIGNvbG9yID0gbmV3VGFnRGl2LmRhdGFzZXQuY29sb3I7XG4gICAgICAgIHRleHQgPSBuZXdUYWdEaXYudGV4dENvbnRlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xvciA9IFwiZGVmYXVsdFwiO1xuICAgICAgICB0ZXh0ID0gXCJcIjtcbiAgICAgIH1cbiAgICAgIG5ld1RhZy5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbG9yID0gdGFnRGF0YS5jb2xvcjtcbiAgICAgIHRleHQgPSB0YWdEYXRhLnRleHQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV3VGFnU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgbmV3VGFnU3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLXRleHQnLCB0ZXh0KSA7XG4gIGlmICh0YWdUeXBlICE9PSAnZGVsZXRlJykge1xuICAgIG5ld1RhZ1NwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXRhZy1jb2xvcicsIGNvbG9yKTtcbiAgfVxuICBuZXdUYWdTcGFuLnRleHRDb250ZW50ID0gdGV4dDtcblxuICBuZXdUYWcgPSB1cGRhdGVDb2xvck9uRWxlbWVudChuZXdUYWcsIGNvbG9yKTtcblxuICAvLyBjbGljayBldmVudCBoYW5kbGVyXG4gIG5ld1RhZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBkaXNhYmxlIGFsbCB0YWdzIHNvIG5vIG90aGVyIGFjdGlvbiBvY2N1cnMgdW50aWwgdGhpcyBjbGljayBpcyBoYW5kbGVkIHByb3Blcmx5XG4gICAgaWYgKHRhZ1R5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAvLyB3YXJuaW5nIHRvIHVzZXJcbiAgICAgIGxvZygnYXJlIHlvdSBzdXJlIG5vdGljZScpO1xuXG4gICAgICAvLyBkZWxldGUgYWxsIHRhZ3NcbiAgICAgIGxvZygnZGVsZXRlIGFsbCB0YWdzJyk7XG5cbiAgICAgIC8vIGd1YXJkIGNsYXVzZVxuICAgICAgbGV0IGRlbGV0ZUFsbCA9IGNvbmZpcm0odCgnY29uZmlybV9kZWxldGVfYWxsX3RhZ3MnKSB8fCAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBhbGwgdGhlIHRhZ3Mgb24gdGhpcyBhbm5vdGF0aW9uPycpO1xuICAgICAgaWYgKGRlbGV0ZUFsbCkge1xuICAgICAgICBhd2FpdCByZW1vdmVUYWdIYW5kbGVyKGV2ZW50LCBtYXJrSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKFwiY2FuY2VsICdk
109ZWxldGUgYWxsJ1wiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRhZ1R5cGUgPT09ICdzdWdnZXN0ZWQnKSB7XG4gICAgICBjb25zdCB0YWdNYW5hZ2VtZW50RGl2ID0gZmluZFRhZ01hbmFnZW1lbnREaXZGb3JNYXJrKG1hcmtJZCk7XG4gICAgICBjaGFuZ2VDb2xvckhhbmRsZXIoZXZlbnQpO1xuICAgICAgYXdhaXQgYWRkTmV3VGFnSGFuZGxlcihldmVudCwgdGFnTWFuYWdlbWVudERpdiwgdGFnVHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNob3cgdGhlIGNvbG9yIHNlbGVjdG9yICYgc2V0IGZvY3VzIG9uIHRoZSB3cmFwcGVyXG4gICAgICAvL1xuICAgICAgLy8gZmluZE1hcmtFbGVtZW50Rm9yLCBub3QgZ2V0TWFya0VsZW1lbnQ6IGNsaWNraW5nIHRoZSBuZXctdGFnIGNoaXAgaXNcbiAgICAgIC8vIGhvdyB0aGUgY29sb3VyIHBpY2tlciBpcyBvcGVuZWQgd2l0aCB0aGUgbW91c2UsIGFuZCBvbiB0aGUgYWNjb3VudFxuICAgICAgLy8gQW5ub3RhdGlvbnMgcGFnZSB0aGUgY2hpcCBzaXRzIGluIGEgY2FyZCwgbm90IGEgPG1hcms+ICgjNDg1MykuXG4gICAgICBjb25zdCBtYXJrRWxlbSA9IGZpbmRNYXJrRWxlbWVudEZvcihtYXJrSWQpO1xuICAgICAgY29uc3QgY29sb3JTZWxlY3RvciA9IG1hcmtFbGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbG9yLXBvcHVwXScpO1xuICAgICAgY29uc3QgY29sb3JTZWxlY3RvcldyYXBwZXIgPSBjb2xvclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3IoJy50YWctY29sb3JzLXdyYXBwZXInKTtcblxuICAgICAgY29sb3JTZWxlY3Rvci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gICAgICBpZiAoIWNvbG9yU2VsZWN0b3JXcmFwcGVyLmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKSkge1xuICAgICAgICBjb2xvclNlbGVjdG9yV3JhcHBlci5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgIH1cbiAgICAgIGNvbG9yU2VsZWN0b3JXcmFwcGVyLmZvY3VzKCk7XG4gICAgfVxuICB9KVxuXG4gIGNvbnN0IGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XG4gIC8vIEFkZCB0ZXh0IHNwYW5cbiAgbmV3VGFnLmFwcGVuZENoaWxkKG5ld1RhZ1NwYW4pO1xuICBpZiAodGFnVHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICBpLmNsYXNzTGlzdC5hZGQoJ2ZhLXNvbGlkJywgJ2ZhLXRyYXNoLWFsdCcpO1xuICAgIG5ld1RhZy5hcHBlbmRDaGlsZChpKTtcbiAgfVxuXG4gIGlmKHNob3dVc2FnZSkge1xuICAgIGNvbnN0IHVzYWdlU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB1c2FnZVNwYW4uY2xhc3NMaXN0LmFkZCgndGFnLXVzYWdlJyk7XG4gICAgdXNhZ2VTcGFuLmlubmVySFRNTCA9IHRhZ0RhdGEudXNhZ2U7XG5cbiAgICBuZXdUYWcuYXBwZW5kQ2hpbGQodXNhZ2VTcGFuKTtcbiAgfVxuXG4gIGlmICh0YWdUeXBlID09PSAnbmV3Jykge1xuICAgIGkuY2xhc3NMaXN0LmFkZCgnZmEtc29saWQnLCAnZmEtcGx1cycpO1xuICAgIG5ld1RhZy5hcHBlbmRDaGlsZChpKTtcbiAgfVxuXG4gIHJldHVybiBuZXdUYWc7XG59XG5cbi8qKlxuICogUmVtb3ZlIGFsbCB0aGUgY2hpbGROb2RlcyBvZiBhIHBhcmVudCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBwYXJlbnRcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQWxsQ2hpbGROb2RlcyhwYXJlbnQpIHtcbiAgd2hpbGUgKHBhcmVudC5maXJzdENoaWxkKSB7XG4gICAgcGFyZW50LnJlbW92ZUNoaWxkKHBhcmVudC5maXJzdENoaWxkKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSB0YWdzIGZyb20gc3VnZ2VzdGVkIHRhZ3MgZGl2LlxuICogVGhpcyBpcyB1c2VkIHdoZW4gYSBuZXcgdGFnIGhhcyBiZWVuIGFkZGVkIGFuZCB0aGUgc3VnZ2VzdGlvbnMgYXJlYSBuZWVkcyB0byBiZSBjbGVhcmVkLlxuICpcbiAqIEBwYXJhbSBtYXJrSWRcbiAqL1xuZnVuY3Rpb24gcmVzZXRTdWdnZXN0ZWRUYWdzKG1hcmtJZCkge1xuICAvLyBmaW5kTWFya0VsZW1lbnRGb3IsIG5vdCBnZXRNYXJrRWxlbWVudDogb24gdGhlIGFjY291bnQgQW5ub3RhdGlvbnMgcGFnZVxuICAvLyB0aGUgdHJheSBsaXZlcyBpbiBhIGNhcmQsIGFuZCB0aGVyZSBpcyBubyA8bWFyaz4gdG8gZmluZCAoIzQzNjgpLlxuICBjb25zdCBtYXJrRWxlbSA9IGZpbmRNYXJrRWxlbWVudEZvcihtYXJrSWQpO1xuICBjb25zdCB3cmFwcGVyID0gbWFya0VsZW0ucXVlcnlTZWxlY3RvcignLnN1Z2dlc3RlZC10YWdzJyk7XG5cbiAgd2hpbGUgKHdyYXBwZXIuZmlyc3RDaGlsZCkge1xuICAgIHdyYXBwZXIucmVtb3ZlQ2hpbGQod3JhcHBlci5maXJzdENoaWxkKTtcbiAgfVxuXG4gIGNvbnN0IG5vbmVTcGFuPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIG5vbmVTcGFuLmlubmVyVGV4dCA9IHQoJ25vX3N1Z2dlc3Rpb25zJykgfHwgJ05vIHN1Z2dlc3Rpb25zLic7XG4gIHdyYXBwZXIuYXBwZW5kQ2hpbGQobm9uZVNwYW4pO1xufVxuXG4vKipcbiAqIEpTIHZlcnNpb24gb2YgUEhQIGFycmF5X2NvbHVtbigpIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0gaW5wdXRcbiAqIEBwYXJhbSBjb2x1bW5LZXlcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBhcnJheUNvbHVtbiAoaW5wdXQsIGNvbHVtbktleSkge1xuICAvLyBndWFyZCBjbGF1c2VcbiAgaWYgKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gaW5wdXQubWFwKGZ1bmN0aW9uKHZhbHVlLCBfaW5kZXgpIHtcbiAgICByZXR1cm4gdmFsdWVbY29sdW1uS2V5XTtcbiAgfSlcbn1cblxuLyoqXG4gKiBSZXR1cm4gbmV3IHRhZyBkaXYgZm9yIHRoZSBtYXJrIGluIHRhZyBlZGl0IG1vZGUuXG4gKiBAcGFyYW0gbWFya0VsZW1cbiAqIEByZXR1cm5zIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBnZXROZXdUYWdEaXYobWFya0VsZW0pIHtcbiAgY29uc3QgeyBkYXRhc2V0OiB7IG1hcmtJZCA9IG51bGwsIGlkID0gbnVsbCB9IH0gPSBtYXJrRWxlbTtcbiAgY29uc3QgbWFya0VsZW1JZCA9IG1hcmtJZCA/PyBpZDtcbiAgcmV0dXJuIG1hcmtFbGVtLnF1ZXJ5U2VsZWN0b3IoYC5uZXctdGFnIC50YWdbZGF0YS1tYXJrLWlkPVwiJHttYXJrRWxlbUlkfVwiYCk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgdGhlIHRhZ3MgbWFuYWdlbWVudCBkaXYgd2l0aCB1cGRhdGVkIHN1Z2dlc3RlZCB0YWdzLlxuICpcbiAqIEBwYXJhbSBtYXJrSWRcbiAqIEBwYXJhbSBzb3J0QnkgLSBvbmUgb2Y6ICgnbmFtZScsICd0aW1lJywgJ3VzYWdlJyk7IGRlZmF1bHQ6ICduYW1lJ1xuICogQHBhcmFtIGRpcmVjdGlvbiAtIG9uZSBvZjogKCdhc2MnLCAnZGVzYycpOyBkZWZhdWx0OiAnYXNjJ1xuICogQHBhcmFtIHVzZXJNYXJrUmVjb3JkSWRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlVGFnTWFuYWdlbWVudEVsZW1lbnRzKFxuICAgIG1hcmtJZCxcbiAgICBzb3J0QnkgPSAnbmFtZScsXG4gICAgZGlyZWN0aW9uID0gJ2FzYycsXG4gICAgdXNlck1hcmtSZWNvcmRJZCA9IG51bGwpIHtcbiAgY29uc3QgQ1VSUkVOVF9NQVJLX05FV19UQUdfVEVYVF9DT1VOVF9LRVkgPSAnY3VycmVudC1tYXJrLW5ldy10YWctdGV4dC1jb3VudCc7XG4gIGNvbnN0IEZJTFRFUkVEX1RBR1NfTElTVF9LRVkgPSAnZmlsdGVyZWQtdGFncyc7XG4gIGNvbnN0IFVTRVJfVEFHU19MSVNUX0tFWSA9ICd1c2VyVGFncyc7XG4gIGNvbnN0IGFsbFRhZ3MgPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oVVNFUl9UQUdTX0xJU1RfS0VZKSkgPz8gW107XG5cbiAgY29uc3QgbWFya0VsZW0gP
109SBmaW5kTWFya0VsZW1lbnRGb3IobWFya0lkLCB1c2VyTWFya1JlY29yZElkKTtcbiAgY29uc3QgdGV4dElucHV0RWxlbSA9IG1hcmtFbGVtLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbnRyb2xzLWZvcj1cInRhZ3NcIl0gW2RhdGEtaWQ9XCJ0YWctaW5wdXRcIl0nKTtcbiAgY29uc3QgbmV3VGFnQ29sb3JzRGl2ID0gbWFya0VsZW0ucXVlcnlTZWxlY3RvcignW2RhdGEtY29sb3ItcG9wdXBdJyk7XG4gIGxldCBpbnB1dFRleHQgPSB0ZXh0SW5wdXRFbGVtLnZhbHVlO1xuXG5cbiAgbGV0IG1hcmtEYXRhID0gbnVsbDtcbiAgbGV0IG1hcmtUYWdzID0gW107XG4gIC8vIFRoZSBjYXJkIGlzIGxvb2tlZCB1cCBieSBtYXJrIGlkIGFsb25lLCBub3QgYnkgdGhlIHJlY29yZCBpZCB0aGUgY2FsbGVyXG4gIC8vIG1heSBvciBtYXkgbm90IGhhdmUgcGFzc2VkOiB0aGUgcmVtb3ZlIGFuZCBhZGQgaGFuZGxlcnMgY2FsbCBiYWNrIGluIHdpdGhcbiAgLy8gdGhyZWUgYXJndW1lbnRzLCBhbmQgcmVhZGluZyB0aGUgc2VjdGlvbiBjb2xsZWN0aW9uIGluc3RlYWQgd291bGQgZmluZFxuICAvLyBub3RoaW5nIG9uIHRoZSBhY2NvdW50IHBhZ2UgYW5kIHRocm93IG9uIHRoZSBtaXNzaW5nIG1hcmsgKCM0MzY4KS5cbiAgY29uc3QgYW5ub3RhdGlvbkNhcmQgPSBhbm5vdGF0aW9uQ2FyZEZvcihtYXJrSWQpO1xuXG4gIGlmIChhbm5vdGF0aW9uQ2FyZCkge1xuICAgIGFubm90YXRpb25DYXJkLnF1ZXJ5U2VsZWN0b3JBbGwoQVNTSUdORURfVEFHX0NISVBfU0VMRUNUT1IpLmZvckVhY2goKHRhZ0VsZW1lbnQpID0+IHtcbiAgICAgIGxldCB7IGRhdGFzZXQ6IHsgaWQsIGNvbG9yLCB0ZXh0LCB1c2FnZSwgbGFzdFVwZGF0ZWQgfSB9ID0gdGFnRWxlbWVudDtcbiAgICAgIG1hcmtUYWdzLnB1c2goe2lkLCBjb2xvciwgdGV4dCwgdXNhZ2UsIGxhc3RVcGRhdGVkIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG1hcmtEYXRhID0gZmluZE1hcmtJblNlc3Npb24obWFya0lkKTtcbiAgICBtYXJrVGFncyA9IG1hcmtEYXRhLnRhZ3MgPz8gW107XG4gIH1cblxuXG4gIGNvbnN0IHNlbGVjdGVkQ29sb3IgPSBjdXJyZW50U2VsZWN0ZWRDb2xvcihtYXJrSWQpO1xuXG4gIC8vIGhpZGUgdGhlIHRhZyBjb2xvcnMgbWFuYWdlbWVudFxuICBpZiAoIW5ld1RhZ0NvbG9yc0Rpdi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUnKSkge1xuICAgIG5ld1RhZ0NvbG9yc0Rpdi5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gIH1cblxuICAvKiBtYW5hZ2UgdGFncyBtYW5hZ2VtZW50IHZhcmlhYmxlcyAqL1xuICAvLyBmaWx0ZXIoKSBmdW5jdGlvbiB0byByZW1vdmUgdGFncyBhbHJlYWR5IGFkZGVkIHRvIG1hcmtcbiAgY29uc3QgZmlsdGVyQWxyZWFkeUFkZGVkVGFncyA9ICh0YWcpID0+ICFtYXJrVGFncy5zb21lKChtYXJrVGFnKSA9PiBtYXJrVGFnLnRleHQgPT09IHRhZy50ZXh0KTtcblxuICAvLyBmaWx0ZXIoKSBmdW5jdGlvbiB0byByZW1vdmUgdGFncyB3aXRob3V0IHNlbGVjdGVkIGNvbG9yXG4gIC8vIGNvbnN0IGZpbHRlclNlbGVjdGVkQ29sb3JUYWdzID0gKHRhZykgPT4gIHRhZy5jb2xvciA9PT0gc2VsZWN0ZWRDb2xvcjtcblxuICBsZXQgZmlsdGVyZWRUYWdzXG4gICAgPSBhbGxUYWdzXG4gICAgLmZpbHRlcihmaWx0ZXJBbHJlYWR5QWRkZWRUYWdzKVxuICAgIC5zb3J0KHRhZ3NTb3J0aW5nRnVuY3Rpb24oc29ydEJ5LGRpcmVjdGlvbikpO1xuXG4gIC8vIHB1dCBiYWNrIHRyaW1tZWQgdGV4dCBzbyB3ZSBkb24ndCBoYXZlIHNwYWNlc1xuICB0ZXh0SW5wdXRFbGVtLnZhbHVlID0gaW5wdXRUZXh0O1xuXG4gIC8vIGdyYWIgcHJldmlvdXMgdGV4dCBpbnB1dCB2YWx1ZSwgc2F2ZSBjdXJyZW50XG4gIGNvbnN0IHByZXZpb3VzVGV4dElucHV0VmFsdWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKENVUlJFTlRfTUFSS19ORVdfVEFHX1RFWFRfQ09VTlRfS0VZKTtcbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShDVVJSRU5UX01BUktfTkVXX1RBR19URVhUX0NPVU5UX0tFWSwgaW5wdXRUZXh0Lmxlbmd0aCk7XG5cbiAgLy8gaGlkZSB0aGUgY29sb3JzIHBhbGV0dGUgd2hlbiB0aGVyZSdzIG5vIHRleHQgaW4gdGhlIGlucHV0IGZpZWxkXG4gIGlmICh0ZXh0SW5wdXRFbGVtPy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoIW5ld1RhZ0NvbG9yc0Rpdi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUnKSkge1xuICAgICAgbmV3VGFnQ29sb3JzRGl2LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICB9XG4gICAgdGV4dElucHV0RWxlbS5mb2N1cygpO1xuICB9XG5cbiAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdlIGtlZXAgYW5kIHVzZSBhIGZpbHRlcmVkIHRhZ3MgbGlzdCBpbnN0ZWFkIG9mIGFsd2F5cyByZWNoZWNraW5nIHRoZSBmdWxsXG4gIC8vIHRhZ3MgbGlzdC4gRGVjaWRlIHdoZW4gd2UgbmVlZCB0byByZXNldCB0aGUgZmlsdGVyZWQgdGFncyBsaXN0LlxuICBsZXQgcmVzZXRUYWdzTGlzdFxuICAgID0gKChmaWx0ZXJlZFRhZ3MubGVuZ3RoID8/IDApID09PSAwKSAvLyBpZiB0aGUgZmlsdGVyZWQgVGFnIExpc3QgaXMgZW1wdHlcbiAgICB8fCAodGV4dElucHV0RWxlbS52YWx1ZS5sZW5ndGggPT09IDApIC8vIGlmIHRoZXJlIGFyZSBubyBjaGFyYWN0ZXJzIGluIHRoZSBuZXcgdGFnIGlucHV0IHRleHQgZmllbGRcbiAgICB8fCAocHJldmlvdXNUZXh0SW5wdXRWYWx1ZSA+IHRleHRJbnB1dEVsZW0udmFsdWUubGVuZ3RoKTsgLy8gaWYgdGhlIHVzZXIgcmVtb3ZlZCBhIGNoYXJhY3RlclxuXG4gIGlmIChyZXNldFRhZ3NMaXN0KSB7XG4gICAgLy8gY29weSBieSB2YWx1ZSwgbm90IHJlZmVyZW5jZVxuICAgIGZpbHRlcmVkVGFncyA9IFsuLi5hbGxUYWdzXS5zb3J0KHRhZ3NTb3J0aW5nRnVuY3Rpb24oc29ydEJ5LCBkaXJlY3Rpb24pKTtcbiAgfVxuXG4gIC8vIGxpc3Qgb2YgYWxsIHZpc2libGUgdGFnIG5hbWVzOlxuICAvLyAoMSkgZnJvbSBmaWx0ZXJlZCB0YWdzIGxpc3RcbiAgLy8gKDIpIGV4aXN0aW5nIHRhZ3NcbiAgLy8gKDMpIG5ld2x5IGFkZGVkIHRhZ3MgdGhhdCBoYXZlIG5vdCBiZWVuIHNhdmVkLlxuICBjb25zdCBhbGwgPSBmaWx0ZXJlZFRhZ3MuY29uY2F0KG1hcmtUYWdzKTtcbiAgY29uc3QgdmlzaWJsZVRhZ05hbWVzTWFwID0gbmV3IE1hcCgpO1xuICBhbGwuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIHZpc2libGVUYWdOYW1lc01hcC5zZXQoaXRlbS50ZXh0LCB7aWQ6IGl0ZW0uaWQsIGNvbG9yOiBpdGVtLmNvbG9yfSk7XG4gIH0pO1xuXG4gIC8vIG1hbmFnZSBzdWdnZXN0ZWQgdGFnc1xuICBsZXQgdGFnRGl2O1xuICBjb25zdCBzdWdnZXN0ZWRUYWdzRGl2ID0gbWFya0VsZW0ucXVlcnlTZWxlY3RvcignW2RhdGEtY29udHJvbHMtZm9yPVwidGFnc1wiXSAuc3VnZ2VzdGVkLXRhZ3MnKTtcblxuICAvLyBzdWdnZXN0aW9ucyBkaXZcbiAgbGV0IG5ld1N1Z2dlc3RlZFRhZ3NEaXYgPSBzdWdnZXN0ZWRUYWdzRGl2LmNsb25lTm9kZSgpO1xuXG4gIGxldCB0YWdUZXh0cyA9IGFycmF5Q29sdW1uKG1hcmtUYWdzLCAn
109dGV4dCcpO1xuICBpZiAoKGZpbHRlcmVkVGFncz8ubGVuZ3RoID8/IDApID4gMCkge1xuICAgIC8vIGNsZWFyIHRoZSBmaWx0ZXJlZCB0YWdzIGxpc3QgYW5kIGZpbGwgd2l0aCByZW1haW5pbmcgcG9zc2libGUgbWF0Y2hlcywgYmVsb3dcbiAgICBsZXQgdGVtcCA9IFtdO1xuXG4gICAgZm9yIChsZXQgdGFnRGF0YSBvZiBmaWx0ZXJlZFRhZ3MpIHtcbiAgICAgIGxldCB7dGV4dH0gPSB0YWdEYXRhO1xuXG4gICAgICBpZiAodGV4dCAmJiB0ZXh0LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0ZXh0SW5wdXRFbGVtLnZhbHVlLnRvTG93ZXJDYXNlKCkpICYmICF0YWdUZXh0cy5pbmNsdWRlcyh0ZXh0KSkge1xuICAgICAgICB0ZW1wLnB1c2godGFnRGF0YSk7XG4gICAgICAgIC8vIGNyZWF0ZSBzdWdnZXN0ZWQgdGFnIHdpdGggdGFnIGRhdGFcbiAgICAgICAgY29uc3Qgc2hvd1VzYWdlID0gdHJ1ZTtcbiAgICAgICAgdGFnRGl2ID0gY3JlYXRlTmV3VGFnRGl2KG1hcmtJZCwgJ3N1Z2dlc3RlZCcsIHRhZ0RhdGEsIHNob3dVc2FnZSk7XG4gICAgICAgIHRhZ0Rpdi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgYFVzYWdlOiAke3RhZ0RhdGEudXNhZ2UgPz8gMH1gKTtcbiAgICAgICAgbmV3U3VnZ2VzdGVkVGFnc0Rpdi5hcHBlbmRDaGlsZCh0YWdEaXYpO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZVRhZ0VsZW0gPSB0YWdEaXYucXVlcnlTZWxlY3RvcignW2RhdGEtdGFnLXR5cGU9XCJkZWxldGVcIl0nKTtcbiAgICAgICAgaWYgKGRlbGV0ZVRhZ0VsZW0pIHtcbiAgICAgICAgICBkZWxldGVUYWdFbGVtLnJlbW92ZSgpO1xuICAgICAgICAgIHRhZ0Rpdi5hcHBlbmRDaGlsZChuZXdTdWdnZXN0ZWRUYWdzRGl2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKEZJTFRFUkVEX1RBR1NfTElTVF9LRVksIEpTT04uc3RyaW5naWZ5KFsuLi50ZW1wXSkpO1xuICB9XG5cbiAgaWYgKG5ld1N1Z2dlc3RlZFRhZ3NEaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgc3VnZ2VzdGVkVGFnc0Rpdi5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICBzdWdnZXN0ZWRUYWdzRGl2LnJlcGxhY2VXaXRoKG5ld1N1Z2dlc3RlZFRhZ3NEaXYpO1xuICB9IGVsc2Uge1xuICAgIHJlbW92ZUFsbENoaWxkTm9kZXMoc3VnZ2VzdGVkVGFnc0Rpdik7XG5cbiAgICBjb25zdCBub25lU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBub25lU3Bhbi5pbm5lclRleHQgPSB0KCdub19zdWdnZXN0aW9ucycpIHx8ICdObyBzdWdnZXN0aW9ucy4nO1xuICAgIHN1Z2dlc3RlZFRhZ3NEaXYuYXBwZW5kQ2hpbGQobm9uZVNwYW4pO1xuICB9XG5cbiAgaWYgKHRleHRJbnB1dEVsZW0pIHtcbiAgICBjb25zdCBuZXdUYWcgPSBnZXROZXdUYWdEaXYobWFya0VsZW0pO1xuICAgIGNvbnN0IG5ld1RhZ1dyYXBwZXIgPSBuZXdUYWcucGFyZW50RWxlbWVudDtcbiAgICBjb25zdCBub3RpY2VFbGVtZW50ID0gbmV3VGFnV3JhcHBlci5xdWVyeVNlbGVjdG9yKCcudG0tbm90aWNlJyk7XG4gICAgY29uc3QgYWxyZWFkeUFkZGVkVGFnID0gZmluZFRhZ0luRXhpc3RpbmdUYWdzKG1hcmtJZCwgaW5wdXRUZXh0KTtcbiAgICBjb25zdCBleGlzdGluZ1RhZyA9IGZpbmRUYWdPblBhZ2VCeVRleHQoaW5wdXRUZXh0KTtcblxuICAgIGxldCBuZXdUYWdTcGFuID0gbmV3VGFnV3JhcHBlci5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XG4gICAgbmV3VGFnU3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLXRleHQnLCBpbnB1dFRleHQpO1xuICAgIG5ld1RhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLXRleHQnLCBpbnB1dFRleHQpXG4gICAgbmV3VGFnU3Bhbi50ZXh0Q29udGVudCA9IGlucHV0VGV4dDtcblxuICAgIC8vIG1hbmFnZSBuZXcgdGFnIGRldGFpbHNcbiAgICBsZXQge2RhdGFzZXQ6IHt0YWdDb2xvcjogbmV3VGFnQ29sb3IsIGN1cnJlbnRDb2xvcjogbmV3VGFnQ3VycmVudENvbG9yID0gbnVsbH19ID0gbmV3VGFnO1xuICAgIGlmICh2aXNpYmxlVGFnTmFtZXNNYXAuaGFzKGlucHV0VGV4dCkpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nVGFnRGF0YSA9IHZpc2libGVUYWdOYW1lc01hcC5nZXQoaW5wdXRUZXh0KTtcbiAgICAgIC8vIHNldCBuZXcgdGFnIGNvbG9yIHRvIG1hdGNoIGV4aXN0aW5nIHRhZyAoc2V0IGN1cnJlbnQgY29sb3IgaW4gZGF0YXNldClcbiAgICAgIG5ld1RhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtY3VycmVudC1jb2xvcicsIG5ld1RhZ0NvbG9yKTtcbiAgICAgIG5ld1RhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWNvbG9yJywgbWF0Y2hpbmdUYWdEYXRhLmNvbG9yKTtcbiAgICAgIG5ld1RhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLXRleHQnLCBpbnB1dFRleHQpO1xuXG4gICAgICBuZXdUYWcuY2xhc3NMaXN0LnJlcGxhY2UobmV3VGFnQ29sb3IsIG1hdGNoaW5nVGFnRGF0YS5jb2xvcik7XG5cbiAgICAgIGNvbnN0IG9uUmVhZGVyID0gaXNUYWdNYW5hZ2VtZW50T25SZWFkZXIoKTtcbiAgICAgIGxldCBtZXNzYWdlID0gdCgndGFnX211c3RfYmVfdW5pcXVlJykgfHwgJ1RhZyBtdXN0IGJlIHVuaXF1ZWx5IG5hbWVkJztcbiAgICAgIGNvbnN0IHRhZ1N0YXR1cyA9IGlzVGFnQWRkZWRPclN1Z2dlc3RlZChleGlzdGluZ1RhZyk7XG5cbiAgICAgIC8vIGhhbmRsaW5nIGFuIGV2ZW50IG9uIHRoZSByZWFkZXJcbiAgICAgIGlmIChvblJlYWRlcikge1xuICAgICAgICBpZiAodGFnU3RhdHVzID09PSAnc3VnZ2VzdGVkJykge1xuICAgICAgICAgIG1lc3NhZ2UgPSB0KCd0YWdfYWxyZWFkeV9leGlzdHMnKSB8fCAnVGFnIGFscmVhZHkgZXhpc3RzJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZGVkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIG1lc3NhZ2UgPSB0KCd0YWdfYWxyZWFkeV9hc3NpZ25lZCcpIHx8ICdUYWcgYWxyZWFkeSBhc3NpZ25lZCc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3BvdGxpZ2h0VGFnKGV4aXN0aW5nVGFnKTtcbiAgICAgIGRpc2FibGVOZXdUYWdEaXYobWFya0VsZW0pO1xuICAgICAgc2V0TmV3VGFnTm90aWNlKG1hcmtFbGVtLCBtZXNzYWdlKTtcblxuICAgICAgaWYgKGFscmVhZHlBZGRlZFRhZykge1xuICAgICAgICBzcG9
1090bGlnaHRUYWcoYWxyZWFkeUFkZGVkVGFnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlU3BvdGxpZ2h0RnJvbVRhZ3MoKTtcblxuICAgICAgLy8gY29udHJvbCB2aXNpYmlsaXR5IG9mIG5ldyB0YWcgZGl2XG4gICAgICBjbGVhck5ld1RhZ05vdGljZShtYXJrSWQpO1xuICAgICAgaWYgKG5ld1RhZyAmJiB0ZXh0SW5wdXRFbGVtLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gZW5zdXJlIG5ldyB0YWcgZWxlbWVudCBoYXMgc2VsZWN0ZWQgY29sb3JcbiAgICAgICAgaWYgKHNlbGVjdGVkQ29sb3IpIHtcbiAgICAgICAgICBuZXdUYWcuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy1jb2xvcicsIHNlbGVjdGVkQ29sb3IpO1xuICAgICAgICAgIGNvbnN0IGRpc2FibGVkID0gbmV3VGFnLmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSA/ICdkaXNhYmxlZCcgOiAnJztcblxuICAgICAgICAgIG5ld1RhZy5jbGFzc05hbWUgPSAnJztcbiAgICAgICAgICBuZXdUYWcuY2xhc3NMaXN0LmFkZCgndGFnJywgc2VsZWN0ZWRDb2xvcik7XG4gICAgICAgICAgaWYoZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIG5ld1RhZy5jbGFzc0xpc3QuYWRkKGRpc2FibGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlTmV3VGFnRGl2KG1hcmtFbGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc2FibGVOZXdUYWdEaXYobWFya0VsZW0pO1xuICAgICAgICBjbGVhck5ld1RhZ05vdGljZShtYXJrSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHVwZGF0ZSB0YWcgbmFtZSB3aXRoIGNvbnRlbnRzIG9mIGlucHV0IHRleHQgZmllbGRcbiAgICBpZiAoaW5wdXRUZXh0KSB7XG4gICAgICBuZXdUYWcuc2V0QXR0cmlidXRlKCdkYXRhLXRhZy10ZXh0JywgaW5wdXRUZXh0KTtcbiAgICAgIG5ld1RhZ1NwYW4udGV4dENvbnRlbnQgPSBpbnB1dFRleHQ7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmluIHRoZSB1c2VyIGhpZ2hsaWdodCBlbGVtZW50IG9uIEFjY291bnQgQW5ub3RhdGlvbnMgcGFnZSB3aXRoIHRoZSBnaXZlbiBtYXJrSWQgYW5kIHVzZXJNYXJrUmVjb3JkSWQuXG4gKlxuICogQHBhcmFtIG1hcmtJZFxuICogQHBhcmFtIHVzZXJNYXJrUmVjb3JkSWRcbiAqIEByZXR1cm5zIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBnZXRVc2VySGlnaGxpZ2h0KG1hcmtJZCwgdXNlck1hcmtSZWNvcmRJZCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtbWFyay1pZD1cIiR7bWFya0lkfVwiXVtkYXRhLXVzZXItbWFyay1yZWNvcmQtaWQ9XCIke3VzZXJNYXJrUmVjb3JkSWR9XCJdYCk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBzZXNzaW9uIHN0b3JhZ2UgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdGFncy5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZVRhZ1Nlc3Npb25TdG9yYWdlVmFyaWFibGVzKG1hcmtJZCkge1xuICBjb25zdCBtYXJrcyA9IGdldFNlY3Rpb25NYXJrc0Zyb21TZXNzaW9uU3RvcmFnZSgpO1xuICBjb25zdCBtYXJrID0gZmluZE1hcmtJblNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZShtYXJrcywgbWFya0lkKTtcbiAgY29uc3QgYWxsVGFnc0pzb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyVGFncycpO1xuICBjb25zdCBhbGxUYWdzID0gSlNPTi5wYXJzZShhbGxUYWdzSnNvbikgPz8gW107XG4gIGNvbnN0IG1hcmtUYWdzID0gbWFyaz8udGFncyA/PyBbXTtcblxuICBsZXQgZmlsdGVyZWRUYWdzXG4gICAgPSBhbGxUYWdzXG4gICAgICAuZmlsdGVyKCh0YWcpID0+ICFtYXJrVGFncy5pbmNsdWRlcyh0YWcpKVxuICAgICAgLnNvcnQoc29ydFRhZ3NCeU5hbWVTb3J0aW5nRnVuY3Rpb24pO1xuXG4gIC8vIGluaXRpYWxpemUgc2Vzc2lvbiBzdG9yYWdlIHZhcmlhYmxlc1xuICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdmaWx0ZXJlZC10YWdzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWRUYWdzKSk7XG59XG5cbi8qKlxuICogQWRkIHRhZ3MgdG8gdGhlIG9wdGlvbnMgZGl2LlxuICpcbiAqIEBwYXJhbSBtYXJrT2JqZWN0XG4gKiBAcGFyYW0gb3B0aW9uc1dyYXBwZXJcbiAqL1xuZnVuY3Rpb24gcmVuZGVyVGFnc09uT3B0aW9uc0RpdihtYXJrT2JqZWN0LCBvcHRpb25zV3JhcHBlcikge1xuICAvLyBTY29wZSB0byB0aGUgc2VnbWVudCB0aGF0IE9XTlMgdGhpcyB3cmFwcGVyLCBub3QgdG8gZ2V0TWFya0VsZW1lbnQoKS5cbiAgLy9cbiAgLy8gQSBtdWx0aS1ibG9jayBoaWdobGlnaHQgcmVuZGVycyBhcyBvbmUgPG1hcms+IFBFUiBCTE9DSywgZWFjaCB3aXRoIHRoZSBzYW1lXG4gIC8vIGRhdGEtaWQgYW5kIGl0cyBvd24gcG9wdXAgKGFubm90YXRpb25zLmpzIGBfY3JlYXRlTWFya0VsZW1lbnRgKS4gIzQ0NzAgbWFkZVxuICAvLyBzYXZlVGFncygpIGxvb3Agb3ZlciBldmVyeSBwb3B1cCwgYnV0IHRoaXMgZnVuY3Rpb24gc3RpbGwgcmVzb2x2ZWQgaXRzIG1hcmtcbiAgLy8gd2l0aCBnZXRNYXJrRWxlbWVudCgpIOKAlCBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAsIHNvIEFMV0FZUyB0aGUgRklSU1RcbiAgLy8gc2VnbWVudCB3aGljaGV2ZXIgd3JhcHBlciBpdCB3YXMgaGFuZGVkLiBUaGUgcmVtb3ZhbCBiZWxvdyB0aGVyZWZvcmUgZGVsZXRlZFxuICAvLyB3aGF0IHRoZSBQUkVWSU9VUyBjYWxsIGhhZCBqdXN0IGluc2VydGVkIGludG8gc2VnbWVudCAxLCBhbmQgdGhlIHJlYWRlciBzYXdcbiAgLy8gY2hpcHMgb24gc29tZSB0YXBzIGFuZCBub3Qgb3RoZXJzICgjNDU3MSkuXG4gIC8vXG4gIC8vIE11bHRpLWxldmVsIG91dGxpbmUgaGlnaGxpZ2h0cyAoIzQxMzQpIGNyb3NzIG1hbnkgc2hvcnQgYmxvY2tzLCB3aGljaCBpcyB3aHlcbiAgLy8gdGhpcyBzdXJmYWNlZCB0aGVyZSBmaXJzdCByYXRoZXIgdGhhbiBvbiBvcmRpbmFyeSBwcm9zZS5cbiAgLy9cbiAgLy8gVGhlIGZhbGxiYWNrIGtlZXBzIHRoZSBBbm5vdGF0aW9ucyBwYWdlIHdvcmtpbmcsIHdoZXJlIGEgY2FyZCBpcyBub3QgYVxuICAvLyA8bWFyaz4gYXQgYWxsIGFuZCB0aGVyZSBpcyBleGFjdGx5IG9uZSB3cmFwcGVyIHBlciBhbm5vdGF0aW9uLlxuICBjb25zdCBtYXJrRWxlbSA9IG9wdGlvbnNXcmFwcGVyPy5jbG9zZXN0KGBtYXJrW2RhdGEtaWQ9XCIke1N0cmluZyhtYXJrT2JqZWN0LmlkKS5yZXBsYWNlKC9bXCJcXFxcXS9nLCAnXFxcXCQmJyl9XCJdYClcbiAgICA/PyBnZXRNYXJrRWxlbWVudChtYXJrT2JqZWN0LmlkKTtcbiAgY29uc3Qgd3JhcHBlckNsYXNzID0gJ3RhZ3Mtd3JhcHBlcic7XG4gIGxldCB0YWdzV3JhcHBlcjtcblxuICAvLyBDb2xsZWN0IEVWRVJZIHN0YWxlIHdyYXBwZXIgZm9yIHRoaXMgc2VnbWVudCBiZWZvcmUgdG91Y2hpbmcgdGhlIERPTSDigJQgdGhlXG4gIC8vIHNhbWUgcmVtb3ZlL2luc2VydCBhc3ltbWV0cnkgYXMgIzQ0MDIvIzQ0NzAvIzQ1NzEsIGEgdGhpcmQgdGltZSAoIzQ2MjgpLlxuICAvL1xuICAvLyBUaGUgcmVtb3ZhbCB1c2VkIHRvIGJlIGBtYXJrRWxlbS5xdWVyeVNlbGVjdG9yKClgLCBzbyBpdCBzYXcgdGhlIGZpcnN0IG1hdGNoXG4gIC8vIGluc2lkZSBtYXJrRWxlbSBhbmQgbm90aGluZyBlbHNlLiBUaGUgaW5zZXJ0IGJlbG93IGlzIG9uIGBvcHRpb25zV3JhcHBlcmAsXG4gIC8vIHdoaWNoIGlzIE5PVCBuZWNlc3NhcmlseSBpbnNpZGUgbWFya0VsZW0gKHRoZSBhY2NvdW50IHBhZ2UsIGFuZCBhbnkgbWFya1xuICAvLyB3aG9zZSBwb3B1cCBpcyBhIHNpYmxpbmcgcmF0aGVyIHR
109oYW4gYSBjaGlsZCkuIEEgd3JhcHBlciB0aGF0IGxhbmRzIG91dHNpZGVcbiAgLy8gbWFya0VsZW0gaXMgdGhlbiBpbnZpc2libGUgdG8gZXZlcnkgbGF0ZXIgcmVtb3ZhbCBhbmQgdGhlIGNoaXBzIGFjY3VtdWxhdGUuXG4gIC8vXG4gIC8vIERvIG5vdCBcInNpbXBsaWZ5XCIgdGhpcyBiYWNrIHRvIGEgc2luZ2xlIHF1ZXJ5U2VsZWN0b3IuXG4gIGNvbnN0IHN0YWxlV3JhcHBlcnMgPSBfc3RhbGVUYWdXcmFwcGVycyhtYXJrRWxlbSwgb3B0aW9uc1dyYXBwZXIsIHdyYXBwZXJDbGFzcyk7XG5cbiAgLy8gS2VlcCB0aGUgZmlyc3Qgb25lIGFzIHRoZSBhbmNob3Igc28gYSB3cmFwcGVyIGFscmVhZHkgc2l0dGluZyBpbiBpdHMgb3duXG4gIC8vIHBsYWNlIChzZXJ2ZXItcmVuZGVyZWQgb24gdGhlIEFubm90YXRpb25zIHBhZ2UpIGlzIHJlcGxhY2VkIHRoZXJlIHJhdGhlclxuICAvLyB0aGFuIHJlbG9jYXRlZCBuZXh0IHRvIG9wdGlvbnNXcmFwcGVyLiBUaGUgcmVzdCBhcmUgbGVmdG92ZXJzLlxuICBjb25zdCBhbmNob3JXcmFwcGVyID0gc3RhbGVXcmFwcGVycy5zaGlmdCgpID8/IG51bGw7XG4gIHN0YWxlV3JhcHBlcnMuZm9yRWFjaCgoc3RhbGVXcmFwcGVyKSA9PiBzdGFsZVdyYXBwZXIucmVtb3ZlKCkpO1xuXG4gIC8vIGFkZCBtYXJrIHRhZ3MgaWYgdGFncyBwcmVzZW50XG4gIGlmIChtYXJrT2JqZWN0LnRhZ3M/Lmxlbmd0aCA+IDApIHtcbiAgICBsZXQgdGFnRWxlbTtcbiAgICB0YWdzV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRhZ3NXcmFwcGVyLmNsYXNzTGlzdC5hZGQod3JhcHBlckNsYXNzLCdyZWFkZXInKTtcblxuICAgIC8vIHNvcnQgYW5kIGxvb3AgdGhyb3VnaCB0YWdzIG9uIG1hcmsgLSBjcmVhdGUgdGFnIGVsZW1lbnRzXG4gICAgaWYgKG1hcmtPYmplY3QudGFncykge1xuICAgICAgLy8gT25lIGNoaXAgcGVyIFRBRywgbm90IG9uZSBwZXIgYXJyYXkgZW50cnkgKCM0NjI4KS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGxvb3AgdXNlZCB0byBwYWludCB0aGUgbGlzdCB2ZXJiYXRpbSwgc28gYW55IGR1cGxpY2F0ZSB0aGF0IHJlYWNoZWRcbiAgICAgIC8vIGl0IOKAlCBhIHNjYWxhciBlbnRyeSBgX21lcmdlTWFya1RhZ3MoKWAgZGVsaWJlcmF0ZWx5IGtlZXBzLCBhIGxlZ2FjeSBibG9iLFxuICAgICAgLy8gYSBmdXR1cmUgd3JpdGUgcGF0aCDigJQgc2hvd2VkIHRoZSBzYW1lIHRhZyB0d28gb3IgdGhyZWUgdGltZXMgdW50aWwgdGhlXG4gICAgICAvLyBuZXh0IHBhZ2UgbG9hZC4gVGhhdCBpcyB0aGUgcmUtb3BlbmVkIGhhbGYgb2YgIzQ2Mjg6IHRoZSBtZXJnZS1zaWRlXG4gICAgICAvLyBkZWR1cGUgaG9sZHMgZm9yIG9iamVjdC1zaGFwZWQgdGFncywgYW5kIHR
109oZSBlYXJsaWVyIHJlbmRlciBmaXhcbiAgICAgIC8vICgjNDYyOCwgd3JhcHBlciBzd2VlcGluZykgYWRkcmVzc2VkIGhvdyBtYW55IFdSQVBQRVJTIHN1cnZpdmUgYVxuICAgICAgLy8gcmUtcmVuZGVyLCBuZXZlciBob3cgbWFueSBjaGlwcyBvbmUgcmVuZGVyIGRyYXdzLlxuICAgICAgLy9cbiAgICAgIC8vIGBfZGVkdXBlVGFnc0ZvclJlbmRlcmAgY29waWVzLCBzbyBgbWFya09iamVjdC50YWdzYCBpcyBsZWZ0IGV4YWN0bHkgYXMgaXRcbiAgICAgIC8vIHdhcy4gTm90aGluZyBoZXJlIG1heSBiZWNvbWUgYSBzdG9yYWdlIHdyaXRlOiB0aGUgbWFyaydzIGxpc3QgaXMgd2hhdFxuICAgICAgLy8gZ2V0cyBzYXZlZCwgYW5kIHRoZSBydWxlIGlzIHRoYXQgc2hvd2luZyBhIHRhZyB0d2ljZSBiZWF0cyBsb3Npbmcgb25lLlxuICAgICAgbGV0IHRhZ3NMaXN0ID0gX2RlZHVwZVRhZ3NGb3JSZW5kZXIobWFya09iamVjdC50YWdzKS5zb3J0KHRhZ3NTb3J0aW5nRnVuY3Rpb24oJ25hbWUnLCAnYXNjJykpO1xuICAgICAgZm9yIChsZXQgW19pbmRleCwgdGFnXSBvZiB0YWdzTGlzdC5lbnRyaWVzKCkpIHtcbiAgICAgICAgbGV0IHRleHQgPSB0YWcudGV4dCA/IHRhZy50ZXh0IDogJ1tibGFua10nO1xuICAgICAgICB0YWdFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRhZ0VsZW0uY2xhc3NMaXN0LmFkZCgndGFnJywgYCR7dGFnLmNvbG9yfWApO1xuICAgICAgICBjb25zdCB0ZXh0U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGV4dFNwYW4uaW5uZXJUZXh0ID0gdGV4dDtcbiAgICAgICAgdGFnRWxlbS5hcHBlbmRDaGlsZCh0ZXh0U3Bhbik7XG5cbiAgICAgICAgdGFnc1dyYXBwZXIuYXBwZW5kQ2hpbGQodGFnRWxlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgcHJlc2VudCwgcmVwbGFjZSBpbiBwbGFjZTsgb3RoZXJ3aXNlIGluc2VydCBuZXh0IHRvIHRoZSBvcHRpb25zIHdyYXBwZXJcbiAgICBpZiAoYW5jaG9yV3JhcHBlcikge1xuICAgICAgYW5jaG9yV3JhcHBlci5yZXBsYWNlV2l0aCh0YWdzV3JhcHBlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnNXcmFwcGVyLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0YWdzV3JhcHBlcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFuY2hvcldyYXBwZXIpIHtcbiAgICAvLyB0aGUgbGFzdCB0YWcgY2FtZSBvZmYgdGhlIG1hcmsg4oCUIHRoZSB3cmFwcGVyIGdvZXMgd2l0aCBpdFxuICAgIGFuY2hvcldyYXBwZXIucmVtb3ZlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgdGFncyB0byBEUkFXIGZvciBvbmUgbWFyazogb25lIGVudHJ5IHBlciB0YWcgaWRlbnRpdHkgKCM0NjI4KS5cbiAqXG4gKiBEaXNwbGF5IG9ubHkuIFRoZSByZXR1cm5lZCBhcnJheSBpcyBhIGNvcHkgYW5kIHRoZSBjYWxsZXIncyBsaXN0IGlzIG5ldmVyXG4gKiBtdXRhdGVkLCBzbyBubyBzdG9yYWdlIHBhdGggY2FuIGxvc2UgYSB0YWcgdGhyb3VnaCB0aGlzIOKAlCB3aGljaCBpcyB0aGUgd2hvbGVcbiAqIHJlYXNvbiB0aGUgZGVkdXBlIGlzIGFsbG93ZWQgdG8gbGl2ZSBoZXJlIGF0IGFsbC5cbiAqXG4gKiBUaGUga2V5IGlzIHRoZSB0YWcgSUQsIG5vcm1hbGlzZWQgdG8gYSB0cmltbWVkIHN0cmluZywgbmV2ZXIgdGhlIGxhYmVsOlxuICpcbiAqICAgLSBgVGFncy5pZGAgaXMgYW4gYGludGAgaW4gdGhlIHNjaGVtYSBidXQgUERPIGhhbmRzIGl0IGJhY2sgYXMgYSBTVFJJTkcsIHNvXG4gKiAgICAgYDdgIGFuZCBgJzcnYCBhcmUgdGhlIHNhbWUgdGFnIGFuZCBhIHJhdyBgU2V0YCBrZXllZCBvbiBgaWRgIGtlZXBzIGJvdGguXG4gKiAgIC0gVHdvIGdlbnVpbmVseSBESUZGRVJFTlQgdGFncyBtYXkgc2hhcmUgYSBuYW1lLiBUaGVyZSBpcyBubyB1bmlxdWUgaW5kZXggb25cbiAqICAgICBgVGFncyhVc2VySWQsIE5hbWUpYCBhbmQgcHJvZHVjdGlvbiBob2xkcyAzNSBzYW1lLW5hbWUgZ3JvdXBzIChvbmUgdXNlclxuICogICAgIG93bnMgMjggdGFncyBuYW1lZCBgTm90ZSFgKSwgc28gY29sbGFwc2luZyBvbiB0aGUgbGFiZWwgd291bGQgaGlkZSBhIHJlYWxcbiAqICAgICBhc3NpZ25tZW50LiBUaGF0IGd1YXJkIG1hdHRlcnMgbW9yZSB0aGFuIHRoZSBkZWR1cGUuXG4gKlxuICogQW4gZW50cnkgd2l0aCBubyB1c2FibGUgaWQgaXMgYWx3YXlzIGRyYXduIOKAlCB1bmlkZW50aWZpYWJsZSBpcyBub3QgZHVwbGljYXRlLlxuICogQSBiYXJlIHNjYWxhciBlbnRyeSBJUyBpdHMgaWQsIHNvIGl0IGNvbGxhcHNlcyBvbnRvIHRoZSBtYXRjaGluZyBvYmplY3QsIGFuZFxuICogb24gYSBjb2xsaXNpb24gdGhlIGVudHJ5IHRoYXQgY2FycmllcyBkaXNwbGF5IHRleHQgd2lucyB0aGUgc2xvdDogcmVuZGVyaW5nXG4gKiBgW2JsYW5rXWAgZm9yIGEgdGFnIHdob3NlIHRleHQgaXMgcmlnaHQgdGhlcmUgaXMgd29yc2UgdGhhbiBlaXRoZXIgZHVwbGljYXRlLlxuICpcbiAqIEBwYXJhbSB7Kn0gdGFncyBUaGUgbWFyaydzIHRhZ3MgbGlzdCwgaW4gc3RvcmVkIG9yZGVyLlxuICogQHJldHVybnMge0FycmF5fSBUaGUgZW50cmllcyB0byBkcmF3LCBmaXJzdCBvY2N1cnJlbmNlJ3MgcG9zaXRpb24gcHJlc2VydmVkLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2RlZHVwZVRhZ3NGb3JSZW5kZXIodGFncykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodGFncykpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBzbG90Rm9ySWQgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGZvclJlbmRlciA9IFtdO1xuXG4gIHRhZ3MuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgY29uc3QgaWRLZXkgPSBfcmVuZGVyVGFnSWRLZXkodGFnKTtcblxuICAgIGlmIChpZEtleSA9PT0gbnVsbCkge1xuICAgICAgZm9yUmVuZGVyLnB1c2godGFnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc2xvdEZvcklkLmhhcyhpZEtleSkpIHtcbiAgICAgIHNsb3RGb3JJZC5zZXQoaWRLZXksIGZvclJlbmRlci5wdXNoKHRhZykgLSAxKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNsb3QgPSBzbG90Rm9ySWQuZ2V0KGlkS2V5KTtcbiAgICBpZiAoIV90YWdDYW5CZUxhYmVsbGVkKGZvclJlbmRlcltzbG90XSkgJiYgX3RhZ0NhbkJlTGFiZWxsZWQodGFnKSkge1xuICAgICAgZm9yUmVuZGVyW3Nsb3RdID0gdGFnO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZvclJlbmRlcjtcbn1cblxuLyoqXG4gKiBBIHRhZyBlbnRyeSdzIGlkZW50aXR5IGZvciB0aGUgY2hpcCByZW5kZXIsIG9yIG51bGwgd2hlbiBpdCBoYXMgbm9uZS5cbiAqXG4gKiBAcGFyYW0geyp9IHRhZyBBbiBlbnRyeSBmcm9tIGEgbWFyaydzIHRhZ3MgbGlzdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gVGhlIGlkIGFzIGEgdHJpbW1lZCBzdHJpbmcsIG9yIG51bGwuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcmVuZGVyVGFnSWRLZXkodGFnKSB7XG4gIGNvbnN0IHJhd0lkID0gKHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0YWcgPT09ICdudW1iZXInKVxuICAgID8gdGFnXG4gICAgOiAodGFnICYmIHR5cGVvZiB0YWcgPT09ICdvYmplY3QnID8gdGFnLmlkIDogbnVsbCk7XG5cbiAgaWYgKHJhd0lkID09PSBudWxsIHx8IHJhd0lkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGlkS2V5ID0gU3RyaW5nKHJhd0lkKS50cmltKCk7XG5cbiAgcmV0dXJuIGlkS2V5ID09PSAnJyA/IG51bGwgOiBpZEtleTtcbn1cblxuLyoqXG4gKiBEb2VzIHRoaXMgZW50cnkgY2FycnkgdGV4dCB0aGUgY2hpcCBjYW4gc2hvdz9cbiAqXG4gKiBAcGFyYW0geyp9IHRhZyBBbiBlbnRyeSBmcm9tIGEgbWFyaydzIHRhZ3MgbGlzdC5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX3RhZ0NhbkJlTGFiZWxsZWQodGFnKSB7XG4gIHJldHVybi
109BCb29sZWFuKHRhZykgJiYgdHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhZy50ZXh0ID09PSAnc3RyaW5nJyAmJiB0YWcudGV4dC50cmltKCkgIT09ICcnO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGAudGFncy13cmFwcGVyYCBhIHByZXZpb3VzIHJlbmRlciBjb3VsZCBoYXZlIGxlZnQgYmVoaW5kIGZvciBvbmUgc2VnbWVudC5cbiAqXG4gKiBUd28gcGxhY2VzIGhhdmUgdG8gYmUgc3dlcHQsIGJlY2F1c2UgdGhlIHJlbW92YWwgYW5kIHRoZSBpbnNlcnQgd2VyZSBuZXZlclxuICogc2NvcGVkIHRvIHRoZSBzYW1lIGVsZW1lbnQgKCM0NjI4KTpcbiAqXG4gKiAgIC0gaW5zaWRlIGBtYXJrRWxlbWAsIHdoZXJlIGEgd3JhcHBlciBsYW5kcyB3aGVuIHRoZSBwb3B1cCBpcyBhIGNoaWxkIG9mIHRoZVxuICogICAgIDxtYXJrPiDigJQgYW5kIHdoZXJlIGEgc2VydmVyLXJlbmRlcmVkIHdyYXBwZXIgc2l0cyBvbiB0aGUgQW5ub3RhdGlvbnMgcGFnZTtcbiAqICAgLSBpbW1lZGlhdGVseSBhZnRlciBgb3B0aW9uc1dyYXBwZXJgLCB3aGVyZSBgaW5zZXJ0QWRqYWNlbnRFbGVtZW50YCBwdXRzIGl0LFxuICogICAgIHdoaWNoIGlzIE9VVFNJREUgYG1hcmtFbGVtYCB3aGVuZXZlciB0aGUgcG9wdXAgaXMgYSBzaWJsaW5nIG9mIHRoZSA8bWFyaz4uXG4gKlxuICogYG1hcmtFbGVtYCBpcyBudWxsLWd1YXJkZWQgYmVjYXVzZSBhbiB1bnBhaW50ZWQgbWFyayBoYXMgbm8gZWxlbWVudCAoIzQ0MDIpLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudHxudWxsfSBtYXJrRWxlbSBUaGUgPG1hcms+IHNlZ21lbnQgb3duaW5nIHRoaXMgcG9wdXAsIGlmIHBhaW50ZWQuXG4gKiBAcGFyYW0ge0VsZW1lbnR8bnVsbH0gb3B0aW9uc1dyYXBwZXIgVGhlIHBvcHVwIHRoZSB3cmFwcGVyIGlzIHJlbmRlcmVkIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gd3JhcHBlckNsYXNzIFRoZSB3cmFwcGVyJ3MgY2xhc3MgbmFtZS5cbiAqIEByZXR1cm5zIHtFbGVtZW50W119IFN0YWxlIHdyYXBwZXJzIGluIGRvY3VtZW50IG9yZGVyLCBtYXJrRWxlbSdzIGZpcnN0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX3N0YWxlVGFnV3JhcHBlcnMobWFya0VsZW0sIG9wdGlvbnNXcmFwcGVyLCB3cmFwcGVyQ2xhc3MpIHtcbiAgY29uc3Qgd3JhcHBlcnMgPSBtYXJrRWxlbSA/IEFycmF5LmZyb20obWFya0VsZW0ucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlckNsYXNzfWApKSA6IFtdO1xuXG4gIGxldCBzaWJsaW5nID0gb3B0aW9uc1dyYXBwZXI/Lm5leHRFbGVtZW50U2libGluZztcbiAgd2hpbGUgKHNpYmxpbmc/LmNsYXNzTGlzdD8uY29udGFpbnMod3JhcHBlckNsYXNzKSkge1xuICAgIGlmICghd3JhcHBlcnMuaW5jbHVkZXMoc2libGluZykpIHtcbiAgICAgIHdyYXBwZXJzLnB1c2goc2libGluZyk7XG4gICAgfVxuICAgIHNpYmxpbmcgPSBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZztcbiAgfVxuXG4gIHJldHVybiB3cmFwcGVycztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXJrIGVsZW1lbnQgaW4gdGhlIGRvbSB3aXRoIHRoZSBnaXZlbiBpZC5cbiAqXG4gKiBAcGFyYW0gbWFya0lkXG4gKiBAcmV0dXJucyB7RWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gZ2V0TWFya0VsZW1lbnQobWFya0lkKSB7XG4gIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBtYXJrW2RhdGEtaWQ9XCIke21hcmtJZH1cIl1gKTtcbn1cblxuLyoqXG4gKiBFbGVtZW50IHNlbGVjdG9yIGZvciBuZXcgdGFnIGRpdiBlbGVtZW50LlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfbmV3VGFnRWxlbWVudFNlbGVjdG9yKG1hcmtJZCkge1xuICByZXR1cm4gYC50YWdbZGF0YS10YWctdHlwZT1cIm5ld1wiXVtkYXRhLW1hcmstaWQ9XCIke21hcmtJZH1cIl1gO1xufVxuXG4vKiogQWRkIG9yIHJlbW92ZSB0aGUgJ2RlbGV0ZSBhbGwnIGJ1dHRvbiBmcm9tIHRoZSBhc3NpZ25lZCB0YWdzIGFyZWFcbiAqXG4gKiBAcGFyYW0gYXNzaWduZWRUYWdzRGl2XG4gKiBAcGFyYW0gbWFya0RhdGFcbiAqL1xuZnVuY3Rpb24gbWFuYWdlRGVsZXRlQWxsQnV0dG9uKGFzc2lnbmVkVGFnc0RpdiwgbWFya0RhdGEpIHtcbiAgY29uc3QgZGVsZXRlVGFnRWxlbSA9IGFzc2lnbmVkVGFnc0Rpdi5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YWctdHlwZT1cImRlbGV0ZVwiXScpO1xuICBjb25zdCBjdXJyZW50VGFncyA9IGFzc2lnbmVkVGFnc0Rpdi5xdWVyeVNlbGVjdG9yQWxsKGAudGFnOm5vdChbZGF0YS10YWctdHlwZT1cImRlbGV0ZVwiXSlgKTtcblxuICAvLyBndWFyZCBjbGF1c2VcbiAgaWYgKCFhc3NpZ25lZFRhZ3NEaXYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyB3ZSBzaG93IHRoZSBkZWxldGUgYWxsIGJ1dHRvbiBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDQgdGFncyBvbiB0aGUgbWFya1xuICBpZiAoY3VycmVudFRhZ3MubGVuZ3RoICA+IDQpIHtcbiAgICBpZiAoZGVsZXRlVGFnRWxlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNyZWF0ZURlbGV0ZUFsbEJ1dHRvbihhc3NpZ25lZFRhZ3NEaXYsIG1hcmtEYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVsZXRlVGFnRWxlbSkge1xuICAgICAgZGVsZXRlVGFnRWxlbS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIGRlbGV0ZSBhbGwgdGFncyBidXR0b24uXG4gKlxuICogQHBhcmFtIGFzc2lnbmVkVGFnc0RpdlxuICogQHBhcmFtIG1hcmtEYXRhXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURlbGV0ZUFsbEJ1dHRvbihhc3NpZ25lZFRhZ3NEaXYsIG1hcmtEYXRhKSB7XG4gIGNvbnN0IGRlbGV0ZVRhZ0VsZW0gPSBjcmVhdGVOZXdUYWdEaXYobWFya0RhdGEuaWQsICdkZWxldGUnLCB7dGV4dDogdCgnZGVsZXRlX2FsbCcpIHx8ICdEZWxldGUgQWxsJ30pO1xuICBhc3NpZ25lZFRhZ3NEaXYuYXBwZW5kQ2hpbGQoZGVsZXRlVGFnRWxlbSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBvcHRpb25zIGRpdiBmb3IgYSBnaXZlbiBtYXJrIGluIERPTSBieSBtYXJrSWRcbiAqXG4gKiBAcGFyYW0gbWFya0lkXG4gKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICovXG5mdW5jdGlvbiBmaW5kT3B0aW9uc0RpdkZvck1hcmsobWFya0lkKSB7XG4gIGNvbnN0IGRpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWlkPVwiJHttYXJrSWR9XCJdIFtkYXRhLWNvbnRyb2xzLWZvcj1cImFubm90YXRpb25cIl1gKTtcbiAgaWYgKGRpdikge1xuICAgIHJldHVybi
109BkaXY7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHRhZ3MgbWFuYWdlbWVudCBkaXYgaW4gRE9NIGJ5IG1hcmtJZFxuICpcbiAqIEBwYXJhbSBtYXJrSWRcbiAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gKi9cbmZ1bmN0aW9uIGZpbmRUYWdNYW5hZ2VtZW50RGl2Rm9yTWFyayhtYXJrSWQpIHtcbiAgY29uc3QgZGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtaWQ9XCIke21hcmtJZH1cIl1bZGF0YS1jb250cm9scy1mb3I9XCJ0YWdzXCJdYCk7XG5cbiAgaWYgKGRpdikge1xuICAgIHJldHVybiBkaXY7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIFJldHVybiB0aGUgZXhpc3RpbmcgdGFncyBkaXYgZm9yIHRoZSBnaXZlbiBtYXJrLlxuICpcbiAqIEBwYXJhbSBtYXJrSWRcbiAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gKi9cbmZ1bmN0aW9uIGZpbmRFeGlzdGluZ1RhZ3NEaXZGb3JNYXJrKG1hcmtJZCkge1xuICBjb25zdCBkaXYgPSBmaW5kVGFnTWFuYWdlbWVudERpdkZvck1hcmsobWFya0lkKTtcbiAgaWYgKGRpdikge1xuICAgIHJldHVybiBkaXYucXVlcnlTZWxlY3RvcignLmV4aXN0aW5nLXRhZ3MnKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgdGFnIGVsZW1lbnQgZnJvbSBleGlzdGluZyB0YWdzLCBpZiBmb3VuZC4gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbC5cbiAqXG4gKiBAcGFyYW0gbWFya0lkXG4gKiBAcGFyYW0gdGV4dFxuICogQHBhcmFtIGNvbG9yXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZmluZFRhZ0luRXhpc3RpbmdUYWdzKG1hcmtJZCwgdGV4dCwgY29sb3I9bnVsbCkge1xuICBjb25zdCBkaXYgPSBmaW5kRXhpc3RpbmdUYWdzRGl2Rm9yTWFyayhtYXJrSWQpO1xuXG4gIGlmICghZGl2KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IHNlbGVjdG9yID0gYC50YWcgc3BhbltkYXRhLXRhZy10ZXh0PVwiJHt0ZXh0fVwiXWA7XG4gIGlmIChjb2xvcikge1xuICAgIHNlbGVjdG9yID0gIGAke3NlbGVjdG9yfVtkYXRhLXRhZy1jb2xvcj1cIiR7Y29sb3J9XCJdYDtcbiAgfVxuXG4gIGNvbnN0IGVsZW0gPSBkaXYucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIGlmIChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0ucGFyZW50RWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBGaW5kIGEgc3BlY2lmaWMgdGFnIGluIGFzc2lnbiBUYWdzIGRpdiBieSBjb2xvciBhbmQgdGV4dC5cbiAqXG4gKiBAcGFyYW0gYXNzaWduZWRUYWdzRWxlbVxuICogQHBhcmFtIHRhZ0RhdGFcbiAqXG4gKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICovXG5mdW5jdGlvbiBmaW5kVGFnSW5Bc3NpZ25lZFRhZ3NEaXZGb3JNYXJrKGFzc2lnbmVkVGFnc0VsZW0sIHRhZ0RhdGEpIHtcbiAgLy8gcmV0dXJuIG51bGwgaWYgZGl2IG5vdCBmb3VuZFxuICBpZiAoYXNzaWduZWRUYWdzRWxlbSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IHsgY29sb3IsIHRleHQgfSA9IHRhZ0RhdGE7XG4gIGNvbnN0IHNwYW4gPSBhc3NpZ25lZFRhZ3NFbGVtLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXRhZy10ZXh0PVwiJHt0ZXh0fVwiXVtkYXRhLXRhZy1jb2xvcj1cIiR7Y29sb3J9XCJdYCk7XG4gIGlmIChzcGFuID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gc3Bhbi5jbG9zZXN0KCcudGFnJyk7XG59XG5cbi8qKlxuICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBtYXJrIG1hbmFnZW1lbnQgZGl2cy4gRWl0aGVyIHNob3cgdGhlIGFubm90YXRpb24gZGl2IG9yIHRoZSBvcHRpb25zIGRpdiwgaGlkZSB0aGUgb3RoZXIuXG4gKlxuICogQHBhcmFtIG1hcmtJZFxuICogQHBhcmFtIGRpdlRvU2hvdyAtIG9uZSBvZjogKCdhbm5vdGF0aW9uJywgJ3RhZ3MnKVxuICovXG5mdW5jdGlvbiB0b2dnbGVWaXNpYmlsaXR5T2ZNYXJrTWFuYWdlbWVudERpdnMobWFya0lkLCBkaXZUb1Nob3cpIHtcbiAgY29uc3Qgb3B0aW9uc0RpdiA9IGZpbmRPcHRpb25zRGl2Rm9yTWFyayhtYXJrSWQpO1xuICBjb25zdCB0YWdNYW5hZ2VtZW50RGl2ID0gZmluZFRhZ01hbmFnZW1lbnREaXZGb3JNYXJrKG1hcmtJZCk7XG5cbiAgaWYgKGRpdlRvU2hvdyA9PT0gJ2Fubm90YXRpb24nKSB7XG4gICAgdGFnTWFuYWdlbWVudERpdi5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgb3B0aW9uc0Rpdi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZGl2VG9TaG93ID09PSAndGFncycpIHtcbiAgICBvcHRpb25zRGl2LmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICB0YWdNYW5hZ2VtZW50RGl2LmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcbiAgfVxufVxuXG4vKipcbiAqIEluc2VydCBhIHRhZyBpbiBpdHMgY29ycmVjdCBhbHBoYWJldGljYWwgb3JkZXIuXG4gKlxuICogQHBhcmFtIGN1cnJlbnRUYWdzXG4gKiBAcGFyYW0gdGFnRWxlbWVudFxuICovXG5mdW5jdGlvbiBpbnNlcnRBbHBoYWJldGljYWxseShjdXJyZW50VGFncywgdGFnRWxlbWVudCkge1xuICBpZiAoY3VycmVudFRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc3QgYXNzaWduZWRUYWdzRWxlbSA9IGZpbmRFeGlzdGluZ1RhZ3NEaXZGb3JNYXJrKHRhZ0VsZW1lbnQuZGF0YXNldC5tYXJrSWQpO1xuICAgIGFzc2lnbmVkVGFnc0VsZW0uYXBwZW5kQ2hpbGQodGFnRWxlbWVudCk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IobGV0IGN1cnJlbnRUYWcgb2YgY3VycmVudFRhZ3MpIHtcbiAgICBsZXQgc29ydCA9IGNvbXBhcmUoY3VycmVudFRhZy50ZXh0Q29udGVudCwgdGFnRWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgaWYoc29ydCA+IC0xKSB7XG4gICAgICBjdXJyZW50VGFnLmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLHRhZ0VsZW1lbnQpO1xuXG4gICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBpZiBub3QgaW5zZXJ0ZWQsIGluc2VydCBhdCBlbmRcbiAgY29uc3QgbGFzdCA9IGN1cnJlbnRUYWdzLml0ZW0oY3VycmVudFRhZ3MubGVuZ3RoIC0gMSk7XG4gIGxhc3QuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRhZ0VsZW1lbnQpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGdpdmVuIGl0ZW0gZnJvbSBhcnJheVxuICogQHBhcmFtIGFycmF5XG4gKiBAcGFyYW0gdmFsdWVcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRmlyc3RPY2N1cnJlbmNlRnJvbUFycmF5KGFycmF5LCB2YWx1ZSkge1xuICBjb25zdCBpbmRleCA9IGFycmF5LmluZGV4T2YodmFsdWUpO1xuICBpZiAoaW5kZXggPiAtMSkge1xuICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vKipcbiAqIFJldHVybi
109B0aGUgY29sb3IgY3VycmVudGx5IHNlbGVjdGVkIGluIHRoZSB0YWcgY29sb3IgY29udHJvbC4gaWYgbm9uZSBpcyBzZWxlY3RlZCwgcmV0dXJuIG51bGwuXG4gKlxuICogQHBhcmFtIG1hcmtJZFxuICogQHJldHVybnMge251bGx8c3RyaW5nfVxuICovXG5mdW5jdGlvbiBjdXJyZW50U2VsZWN0ZWRDb2xvcihtYXJrSWQpIHtcbiAgY29uc3QgdGFnc0RpdiA9IGZpbmRUYWdNYW5hZ2VtZW50RGl2Rm9yTWFyayhtYXJrSWQpO1xuICBjb25zdCBzZWxlY3RlZENvbG9yRWxlbSA9IHRhZ3NEaXYucXVlcnlTZWxlY3RvcignLnRhZy1jb2xvcnMtd3JhcHBlciAudGFnLnNlbGVjdGVkJyk7XG4gIGlmKHNlbGVjdGVkQ29sb3JFbGVtKSB7XG4gICAgcmV0dXJuIHNlbGVjdGVkQ29sb3JFbGVtLmRhdGFzZXQudGFnQ29sb3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBNZXRob2QgdG8gY2hhbmdlIHRoZSBjb2xvciBvZiBhIG5ldyBUYWcgZGl2IGFjY29yZGluZyB0byB0aGUgY29sb3Igc2VsZWN0b3IgY2xpY2tlZCBvciBzZWxlY3RlZC5cbiAqXG4gKiBAcGFyYW0gbmV3Q29sb3JcbiAqIEBwYXJhbSBuZXdUYWdEaXZcbiAqL1xuZnVuY3Rpb24gY2hhbmdlTmV3VGFnRGl2Q29sb3IobmV3Q29sb3IsIG5ld1RhZ0Rpdikge1xuICBjb25zdCB7IGRhdGFzZXQ6IHsgbWFya0lkIH0gfSA9IG5ld1RhZ0RpdjtcbiAgbGV0IGNvbG9yc1dyYXBwZXIsIHNlbGVjdG9yO1xuXG4gIGlmKG1hcmtJZCkge1xuICAgIHNlbGVjdG9yID0gIGAudGFnLWNvbG9ycy13cmFwcGVyW2RhdGEtbWFyay1pZD1cIiR7bWFya0lkfVwiXWA7XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0b3IgPSAnLnRhZy1jb2xvcnMtd3JhcHBlcic7XG4gIH1cbiAgY29sb3JzV3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICBjb25zdCBzZWxlY3RlZENvbG9yRWxlbSA9IGNvbG9yc1dyYXBwZXIucXVlcnlTZWxlY3RvcignLnNlbGVjdGVkJyk7XG4gIGNvbnN0IHsgZGF0YXNldDogeyB0YWdDb2xvciB9IH0gPSBzZWxlY3RlZENvbG9yRWxlbTtcblxuICAvLyBwcmV2aW91cywgbmV3IGNvbG9yXG4gIGxldCBwcmV2aW91c0NvbG9yID0gZmluZENvbG9yQ2xhc3NJbkNsYXNzTGlzdChuZXdUYWdEaXYuY2xhc3NMaXN0KTtcblxuICBpZiAoY29sb3JXb3JkcygpLmluY2x1ZGVzKHRhZ0NvbG9yKSkge1xuICAgIGxldCBjdXJyZW50RWxlbSA9IGNvbG9yc1dyYXBwZXIucXVlcnlTZWxlY3RvcignLnNlbGVjdGVkJyk7XG5cbiAgICAvLyBoYW5kbGUgY2xpY2sgdG8gc2V0IG9yIHVuc2V0IGEgY29sb3Igc2VsZWN0aW9uXG4gICAgaWYgKGN1cnJlbnRFbGVtKSB7XG4gICAgICBjdXJyZW50RWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0VsZW0gPSBjb2xvcnNXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXRhZy1jb2xvcj1cIiR7bmV3Q29sb3J9XCJdYCk7XG4gICAgaWYobmV3RWxlbSkge1xuICAgICAgbmV3RWxlbS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuXG4gICAgICBuZXdUYWdEaXYuY2xhc3NMaXN0LnJlbW92ZSh0YWdDb2xvcik7XG5cbiAgICAgIC8vIHVwZGF0ZSBjb2xvciBjbGFzc2VzLCBkYXRhLWF0dHJpYnV0ZXNcbiAgICAgIG5ld1RhZ0Rpdi5jbGFzc0xpc3QuYWRkKG5ld0NvbG9yKTtcbiAgICAgIG5ld1RhZ0Rpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFnLWNvbG9yJywgbmV3Q29sb3IpO1xuICAgICAgY29uc3Qgc3BhbiA9IG5ld1RhZ0Rpdi5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XG4gICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS10YWctY29sb3InLCBuZXdDb2xvcik7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIG5ldyB0YWcgZWxlbWVudCB3aXRoIGNvbG9yXG4gICAgdXBkYXRlQ29sb3JPbkVsZW1lbnQobmV3VGFnRGl2LCBuZXdDb2xvciwgcHJldmlvdXNDb2xvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzb3J0IHByb3BlcnRpZXMgZm9yIHRoZSBzdWdnZXN0ZWQgdGFncyB0aGF0IGFyZSBjdXJyZW50bHkgYWN0aXZlIG9uIHRoZSBET00uXG4gKiBGaW5kcyB0aGUgc29ydCBidXR0b24gdGhhdCBpcyBzZWxlY3RlZCBhbmQgcmVhZHMgaXRzIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIG1hcmtJZFxuICogQHJldHVybnMge3tzb3J0Qnk6IHN0cmluZywgZGlyZWN0aW9uOiBzdHJpbmd9fHtzb3J0QnksIGRpcmVjdGlvbjogc3RyaW5nfX1cbiAqL1xuZnVuY3Rpb24gY3VycmVudFN1Z2dlc3RlZFRhZ3NTb3J0UHJvcGVydGllcyhtYXJrSWQpIHtcbiAgY29uc3QgdGFnc0RpdiA9IGZpbmRUYWdNYW5hZ2VtZW50RGl2Rm9yTWFyayhtYXJrSWQpO1xuICAvLyByZXR1cm4gZGVmYXVsdCBzb3J0IHZhbHVlcyBpZiBkaXYgbm90IHByZXNlbnRcbiAgaWYoIXRhZ3NEaXYpIHtcbiAgICByZXR1cm4geyBzb3J0Qnk6ICduYW1lJywgZGlyZWN0aW9uOiAnYXNjJyB9O1xuICB9XG5cbiAgY29uc3Qgc29ydEVsZW0gPSB0YWdzRGl2LnF1ZXJ5U2VsZWN0b3IoJy5zb3J0ZWRbZGF0YS1zb3J0LWJ5XScpO1xuICBpZiAoIXNvcnRFbGVtKSB7XG4gICAgcmV0dXJuIHsgc29ydEJ5OiAnbmFtZScsIGRpcmVjdGlvbjogJ2FzYycgfTtcbiAgfVxuXG4gIGNvbnN0IHsgZGF0YXNldDogeyBzb3J0QnksIGRpcmVjdGlvbiA9ICdhc2MnIH0gfSA9IHNvcnRFbGVtO1xuXG4gIHJldHVybiB7IHNvcnRCeSwgZGlyZWN0aW9uIH07XG59XG5cbi8qKlxuICogU2ltcGxlIGNvbXBhcmUgZnVuY3Rpb24gZm9yIHNvcnQoKSwgdG9Tb3J0ZWQoKVxuICogQHBhcmFtIGFcbiAqIEBwYXJhbSBiXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgaWYoYSA8IGIpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBpZihhID4gYikge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogRGlzYWJsZSBhIG1hcmsncyBuZXcgdGFnIGRpdiBpbiB0aGUgdGFncyBtYW5hZ2VtZW50IHBhbmUuXG4gKiBAcGFyYW0gbWFya0VsZW1cbiAqL1xuZnVuY3Rpb24gZGlzYWJsZU5ld1RhZ0RpdihtYXJrRWxlbSkge1xuICBjb25zdCBuZXdUYWcgPSBnZXROZXdUYWdEaXYobWFya0VsZW0pO1xuXG4gIGlmKG5ld1RhZykge1xuICAgIG5ld1RhZy5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgbmV3VGFnLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAndHJ1ZScpO1xuXG4gICAgaWYoIW5ld1RhZz8uY2xhc3NMaXN0Py5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgICAgbmV3VGFnLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGx1c0xpbmsgPSBuZXdUYWcucXVlcnlTZWxlY3RvcignLmZhLXBsdXMnKTtcbiAgICBpZihwbHVzTGluaykge1xuICAgICAgcGx1c0xpbmsuY2xhc3NMaXN0LmFkZCgnaGlkZScpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEhpZGUgYSBtYXJrJ3MgbmV3IHRhZyBkaXYgaW4gdGhlIHRhZyBtYW5hZ2VtZW50IHBhbmUuXG4gKlxuICogQHBhcmFtIG1hcmtFbGVtXG4gKi9cbmZ1bmN0aW9uIGhpZGVOZXdUYWdEaXYobWFya0VsZW0pIHtcbiAgY29uc3QgbmV3VGFnID0gZ2V0TmV3VGFnRGl2KG1hcmtFbGVtKTtcbiAgaWYgKG5ld1RhZykge1xuICAgIGlmICghbmV3VGFnPy5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdoaWRlJykpIHtcbiAgICAgIG5ld1RhZy5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRW5hYmxlIGEgbWFyaydzIG5ldyB0YWcgZGl2IGluIHRoZSB0YWdzIG1hbmFnZW1lbnQgcGFuZS5cbiAqIEBwYXJhbSBtYXJrRWxlbVxuICovXG5mdW5jdGlvbiBlbmFibGVOZXdUYWdEaXYobWFya0VsZW0pIHtcbiAgY29uc3QgbmV3VGFnID0gZ2V0TmV3VGFnRGl2KG1hcmtFbGVtKTtcblxuICBuZXdUYWcucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICBuZXdUYWcuY2xhc3NMaXN0LnJlbW92ZSgnZGlzYWJsZWQnKTtcbiAgbmV3VGFnLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcblxuICBjb25zdCBwbHVzTGluayA9IG5ld1RhZy5xdWVyeVNlbGVjdG9yKCcuZmEtcGx1cycpO1xuICBpZiAocGx1c0xpbmspIHtcbiAgICBwbHVzTGluay5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhciB0aGUgbmV3IHRhZyBub3RpY2VzIGVsZW1lbnQgZm9yIGEgZ2l2ZW4gbWFyay5cbiAqIEZpbmRzIHRoZSB0YWcgbWFuYWdlbWVudCBkaXYgYnkgdGhlIG1hcmsgaWQuXG4gKlxuICogQHBhcmFtIG1hcmtJZFxuICovXG5mdW5jdGlvbiBjbGVhck5ld1RhZ05vdGljZShtYXJrSWQpIHtcbiAgY29uc3QgdGFnc01hbmFnZW1lbnRFbGVtZW50ID0gZmluZFRhZ01hbmFnZW1lbnREaXZGb3JNYXJrKG1hcmtJZCk7XG4gIGNvbnN0IG5ld1RhZ05vdGljZSA9IHRhZ3NNYW5hZ2VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudG0tbm90aWNlJyk7XG4gIGNvbnN0IHBsdXNMaW5rID0gdGFnc01hbmFnZW1lbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mYS1wbHVzJyk7XG5cbiAgaWYobmV3VGFnTm90aWNlKSB7XG4gICAgaWYoIW5ld1RhZ05vdGljZS5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUnKSkge1xuICAgICAgbmV3VGFnTm90aWNlLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICB9XG4gICAgbmV3VGFnTm90aWNlLnRleHRDb250ZW50ID0gJyc7XG4gIH1cblxuICBpZihwbHVzTGluaykge1xuICAgIHBsdXNMaW5rLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCB0aGUgbmV3IHRhZyBub3RpY2UgZWxlbWVudCBmb3IgYSBnaXZlbiBtYXJrLlxuICogRmluZHMgdGhlIHRhZyBtYW5hZ2VtZW50IGRpdiBpbiB0aGUgbWFyayBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSBtYXJrRWxlbVxuICogQHBhcmFtIHRleHRcbiAqL1xuZnVuY3Rpb24gc2V0TmV3VGFnTm90aWNlKG1hcmtFbGVtLCB0ZXh0KSB7XG4gIGNvbnN0IHsgZGF0YXNldDogeyBtYXJrSWQgPSBudWxsLCBpZCA9IG51bGwgfSB9ID0gbWFya0VsZW07XG4gIGNvbnN0IG1hcmtFbGVtSWQgPSBtYXJrSWQgPz8gaWQ7XG4gIGNvbnN0IHRhZ3NNYW5hZ2VtZW50RWxlbWVudCA9IGZpbmRUYWdNYW5hZ2VtZW50RGl2Rm9yTWFyayhtYXJrRWxlbUlkKTtcbiAgY29uc3QgbmV3VGFnV3JhcHBlciA9IGdldE5ld1RhZ0RpdihtYXJrRWxlbSkucGFyZW50RWxlbWVudDtcbiAgY29uc3QgbmV3VGFnTm90aWNlV3JhcHBlciA9IG5ld1RhZ1dyYXBwZXIucXVlcnlTZWxlY3RvcignW2RhdGEtbm90aWNlXScpO1xuICBjb25zdCBuZXdUYWdOb3RpY2UgPSBuZXdUYWdOb3RpY2VXcmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy50bS1ub3RpY2UnKTtcbiAgY29uc3QgcGx1c0xpbmsgPSB0YWdzTWFuYWdlbWVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZhLXBsdXMnKTtcbiAgaWYocGx1c0xpbmspIHtcbiAgICBwbHVzTGluay5jbGFzc0xpc3QuYWRkKCdoaWRlJyk7XG4gIH1cblxuICBpZihuZXdUYWdOb3RpY2VXcmFwcGVyICYmIG5ld1RhZ05vdGljZSkge1xuICAgIG5ld1RhZ05vdGljZS50ZXh0Q29udGVudCA9IHRleHQ7XG5cbiAgICBpZihuZXdUYWdOb3RpY2VXcmFwcGVyLmNsYXNzTGlzdC5jb250YWlucygnaGlkZScpKSB7XG4gICAgICBuZXdUYWdOb3RpY2VXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGUnKTtcbiAgICB9XG4gI
109H1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICogLSAnYWRkZWQnIGlmIHRoZSB0YWcgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIG1hcmsgaW4gcXVlc3Rpb24uXG4gKiAtICdzdWdnZXN0ZWQnIGlmIHRoZSB0YWcgaGFzIG5vdCBiZWVuIGFzc2lnbmVkIHRvIHRoZSBtYXJrIGluIHF1ZXN0aW9uLlxuICogLSAnbmVpdGhlcicgaWYgbmVpdGhlciBjYXNlIGlzIHRydWUgKGVycm9yIGNhc2UpLlxuICpcbiAqIEBwYXJhbSB0YWdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGlzVGFnQWRkZWRPclN1Z2dlc3RlZCh0YWcpIHtcbiAgbGV0IHJlc3BvbnNlID0gJ25laXRoZXInO1xuICBpZiAoIXRhZykge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IHBhcmVudCA9IHRhZy5wYXJlbnRFbGVtZW50O1xuICBpZiAoIXBhcmVudCkge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdleGlzdGluZy10YWdzJykpIHtcbiAgICByZXNwb25zZSA9ICdhZGRlZCc7XG4gIH1cblxuICBpZiAocGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnc3VnZ2VzdGVkLXRhZ3MnKSkge1xuICAgIHJlc3BvbnNlID0gJ3N1Z2dlc3RlZCc7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogRmluZCB0aGUgbWFyayBFbGVtZW50IG9uIHRoZSBwYWdlIGZvciBhIG1hcmsgaWQuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbiB0aGUgcmVhZGVyIGFzIHdlbGwgYXMgb24gdGhlXG4gKiBBbm5vdGF0aW9ucyBwYWdlLiBPbiB0aGUgQW5ub3RhdGlvbnMgcGFnZSwgd2UgdGhlIGVsZW1lbnRzIGhhdmUgYSBzZWNvbmRhcnkgZGF0YSBhdHRyaWJ1dGUgLSB1c2VyTWFya1JlY29yZElkLlxuICogSWYgYSB1c2VyTWFya1JlY29yZElkIGlzIHByb3ZpZGVkLCBzZWFyY2ggZm9yIHRoZSBtYXJrIGVsZW1lbnQgd2l0aCB0aGF0IGF0dHJpYnV0ZS4gVGhpcyBpcyBuZWVkZWQgYi9jXG4gKiBtYXJrIGlzIG5vdCBhdG9taWMgb24gdGhpcywgb25seSBvbiBhIHNlY3Rpb24gaW4gdGhlIHJlYWRlci5cbiAqIEBwYXJhbSBtYXJrSWRcbiAqIEBwYXJhbSB1c2VyTWFya1JlY29yZElkXG4gKiBAcmV0dXJucyB7RWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gZmluZE1hcmtFbGVtZW50Rm9yKG1hcmtJZCwgdXNlck1hcmtSZWNvcmRJZCA9IG51bGwpIHtcbiAgaWYgKHVzZXJNYXJrUmVjb3JkSWQpIHtcbiAgICByZXR1cm4gZ2V0VXNlckhpZ2hsaWdodChtYXJrSWQsIHVzZXJNYXJrUmVjb3JkSWQpO1xuICB9XG5cbiAgLy8gVGhlIGFjY291bnQgQW5ub3RhdGlvbnMgcGFnZSBoYXMgbm8gPG1hcms+IHRvIGZhbGwgYmFjayBvbi4gSXRzIGNhcmQgaG9sZHNcbiAgLy8gdGhlIHNhbWUgdHJheSwgc28gY2FsbGVycyB0aGF0IG9ubHkga25vdyB0aGUgbWFyayBpZCBzdGlsbCBmaW5kIGl0ICgjNDM2OCkuXG4gIHJldHVybiBnZXRNYXJrRWxlbWVudChtYXJrSWQpID8/IGFubm90YXRpb25DYXJkRm9yKG1hcmtJZCk7XG59XG5cbmV4cG9ydCB7XG4gIGFkZE5ld1RhZ0hhbmRsZXIsIHJlbW92ZVRhZ0hhbmRsZXIsIGFycmF5Q29sdW1uLCBjaGFuZ2VOZXdUYWdEaXZDb2xvciwgY3JlYXRlTmV3VGFnRGl2LCBjcmVhdGVUYWdNYW5hZ2VtZW50Q29udHJvbHMsXG4gIHVwZGF0ZVRhZ01hbmFnZW1lbnRFbGVtZW50cywgY2FuY2VsVGFnRWRpdCwgaW5pdGlhbGl6ZVRhZ1Nlc3Npb25TdG9yYWdlVmFyaWFibGVzLCBmaW5kT3B0aW9uc0RpdkZvck1hcmssXG4gIGZpbmRUYWdNYW5hZ2VtZW50RGl2Rm9yTWFyaywgc3BvdGxpZ2h0VGFnLCByZW1vdmVTcG90bGlnaHRGcm9tVGFncywgcmVtb3ZlQWxsQ2hpbGROb2RlcywgcmVuZGVyVGFnc09uT3B0aW9uc0RpdixcbiAgc2F2ZVRhZ3MsIHRhZ3NTb3J0aW5nRnVuY3Rpb24sIGlzVGFnTWFuYWdlbWVudE9uUmVhZGVyLFxuICBjcmVhdGVTb3J0T3B0aW9uU3BhbiwgaGFuZGxlU29ydE9wdGlvbkNsaWNrLCBhcHBseVNvcnREaXJlY3Rpb25Ub1NwYW4sXG4gIHNvcnRTdWdnZXN0ZWRUYWdzLCBjdXJyZW50U3VnZ2VzdGVkVGFnc1NvcnRQcm9wZXJ0aWVzLFxuICAvLyBFeHBvcnRlZCBmb3IgdGhlIEFubm90YXRpb25zLXBhZ2UgcmVncmVzc2lvbiB0ZXN0cyAoIzQ4NTMpLiBjaGFuZ2VDb2xvckhhbmRsZXJcbiAgLy8gaXMgb25seSBldmVyIHJlYWNoZWQgdGhyb3VnaCBhIERPTSBsaXN0ZW5lciwgYW5kIHVwZGF0ZVRhZ0luT3B0aW9uc0RpdiBpc1xuICAvLyByZWFjaGVkIG9ubHkgZnJvbSB0aGUgb25lIGJyYW5jaCBiZWxvdyBpdCwgc28gbmVpdGhlciBjYW4gYmUgY292ZXJlZCB0aHJvdWdoXG4gIC8vIHRoZSBtb2R1bGUncyBvd24gc3VyZmFjZS5cbiAgY2hhbmdlQ29sb3JIYW5kbGVyLCB1cGRhdGVUYWdJbk9wdGlvbnNEaXZ9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/annotations/manage-tags.js\n");
110
111/***/ }),
112
113/***/ "./resources/js/annotations/note-editor.js":
114/*!*************************************************!*\
115  !*** ./resources/js/annotations/note-editor.js ***!
116  \*************************************************/
117/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
118
119eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   createInFlightGuard: () => (/* binding */ createInFlightGuard),\n/* harmony export */   createNoteEditor: () => (/* binding */ createNoteEditor),\n/* harmony export */   focusNoteTextarea: () => (/* binding */ focusNoteTextarea),\n/* harmony export */   positionEditorNearAnchor: () => (/* binding */ positionEditorNearAnchor),\n/* harmony export */   saveNoteWithRollback: () => (/* binding */ saveNoteWithRollback)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _note_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./note-utils */ \"./resources/js/annotations/note-utils.js\");\n/* harmony import */ var _utilities_draggable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utilities/draggable */ \"./resources/js/utilities/draggable.js\");\n\n\n/**\n * Hardened note editor for annotation notes (#3080).\n *\n * Hardening built in:\n *  - optimistic update with ROLLBACK on a failed save (#2006)\n *  - in-flight guard so concurrent saves cannot race (#2006)\n *  - try/finally teardown of the busy state so the editor never gets stuck\n *  - the `note` stays a plain string end-to-end (never an object → dataset; #3076)\n */\n\n\n\n\n// Gap between the editor and its anchor, and the minimum margin the editor\n// keeps from the viewport edges (#3083).\nvar ANCHOR_GAP_PX = 8;\nvar VIEWPORT_MARGIN_PX = 8;\n\n/**\n * Clamp a value into an inclusive range. When min > max (the element is wider\n * or taller than the available space) the lower bound wins so the top/left\n * edge stays visible.\n *\n * @param {number} value\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\nfunction clamp(value, min, max) {\n  if (max < min) {\n    return min;\n  }\n  return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Position an already-mounted editor panel near its source anchor, in pixels,\n * with no centering transform (#3083).\n *\n * The editor must already be appended to the document so it can be measured.\n * Placement is tried right-of, then left-of, then below the anchor, picking the\n * first that fits horizontally; the chosen position is always clamped so the\n * whole panel stays on-screen. When the anchor is missing it falls back to a\n * top-centered on-screen position.\n *\n * @param {HTMLElement} editorEl The floating editor panel (already in the DOM).\n * @param {HTMLElement|null} anchorEl The element to open beside (card, popup, mark).\n * @param {Object} [options]\n * @param {boolean} [options.overlayAnchor=false] When true, open the editor\n *   directly over the anch
119or (tops aligned, horizontally centered on the\n *   anchor's centre) so it visually REPLACES the anchor rather than sitting\n *   beside it — used for the reader options popup (#3080).\n * @returns {void}\n */\nfunction positionEditorNearAnchor(editorEl, anchorEl) {\n  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n    _ref$overlayAnchor = _ref.overlayAnchor,\n    overlayAnchor = _ref$overlayAnchor === void 0 ? false : _ref$overlayAnchor;\n  if (!editorEl) {\n    return;\n  }\n\n  // Anchor placement below is computed in viewport coordinates, so the panel\n  // must be viewport-fixed for those left/top values to land where intended.\n  // Force it inline (beats any cascade rule that could leave it absolutely\n  // positioned inside an offset container and shift the panel). (#3080)\n  editorEl.style.position = 'fixed';\n  var viewportWidth = window.innerWidth || 0;\n  var viewportHeight = window.innerHeight || 0;\n  var editorRect = editorEl.getBoundingClientRect();\n  var editorWidth = editorRect.width;\n  var editorHeight = editorRect.height;\n  var maxLeft = viewportWidth - editorWidth - VIEWPORT_MARGIN_PX;\n  var maxTop = viewportHeight - editorHeight - VIEWPORT_MARGIN_PX;\n  editorEl.style.transform = 'none';\n  var anchorRect = anchorEl && typeof anchorEl.getBoundingClientRect === 'function' ? anchorEl.getBoundingClientRect() : null;\n  if (!anchorRect) {\n    // No anchor: open top-centered, fully on-screen.\n    var fallbackLeft = (viewportWidth - editorWidth) / 2;\n    editorEl.style.left = \"\".concat(clamp(fallbackLeft, VIEWPORT_MARGIN_PX, maxLeft), \"px\");\n    editorEl.style.top = \"\".concat(VIEWPORT_MARGIN_PX, \"px\");\n    return;\n  }\n  if (overlayAnchor) {\n    // Overlay the anchor: align tops and centre the editor horizontally on the\n    // anchor's centre so it looks like it takes the anchor's place (#3080).\n    var overlayLeft = anchorRect.left + anchorRect.width / 2 - editorWidth / 2;\n    editorEl.style.left = \"\".concat(clamp(overlayLeft, VIEWPORT_MARGIN_PX, maxLeft), \"px\");\n    editorEl.style.top = \"\".concat(clamp(anchorRect.top, VIEWPORT_MARGIN_PX, maxTop), \"px\");\n    return;\n  }\n  var rightLeft = anchorRect.right + ANCHOR_GAP_PX;\n  var leftLeft = anchorRect.left - editorWidth - ANCHOR_GAP_PX;\n  var fitsRight = rightLeft + editorWidth <= viewportWidth - VIEWPORT_MARGIN_PX;\n  var fitsLeft = leftLeft >= VIEWPORT_MARGIN_PX;\n  var left;\n  var top;\n  if (fitsRight) {\n    left = rightLeft;\n    top = anchorRect.top;\n  } else if (fitsLeft) {\n    left = leftLeft;\n    top = anchorRect.top;\n  } else {\n    // Neither side fits: drop the editor below the anchor.\n    left = anchorRect.left;\n    top = anchorRect.bottom + ANCHOR_GAP_PX;\n  }\n  editorEl.style.left = \"\".concat(clamp(left, VIEWPORT_MARGIN_PX, maxLeft), \"px\");\n  editorEl.style.top = \"\".concat(clamp(top, VIEWPORT_MARGIN_PX, maxTop), \"px\");\n}\n\n/**\n * Create a guard that runs an async task but ignores calls made while a task is\n * already running. Returns a `run` function that resolves to the task result,\n * or undefined when a call was skipped because one was in flight.\n *\n * @returns {{ run: (task: () => Promise<*>) => Promise<*>, isBusy: () => boolean }}\n */\nfunction createInFlightGuard() {\n  var busy = false;\n  return {\n    isBusy: function isBusy() {\n      return busy;\n    },\n    run: function () {\n      var _run = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee(task) {\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n          while (1) switch (_context.prev = _context.next) {\n            case 0:\n              if (!busy) {\n                _context.next = 2;\n                break;\n              }\n              return _context.abrupt(\"return\", undefined);\n            case 2:\n              busy = true;\n              _context.prev = 3;\n              _context.next = 6;\n              return task();\n            case 6:\n              return _context.abrupt(\"return\", _context.sent);\n            case 7:\n              _context.prev = 7;\n              busy = false;\n              return _context.finish(7);\n            case 10:\n            case \"end\":\n              return _context.stop();\n          }\n        }, _callee, null, [[3,, 7, 10]]);\n      }));\n      function run(_x) {\n        return _run.apply(this, arguments);\n      }\n      return run;\n    }()\n  };\n}\n\n/**\n * Apply an optimistic note change, persist it, and roll back on failure (#2006).\n *\n * @param {Object} params\n * @param {() => void} params.apply    Mutate local state (session storage) now.\n * @param {() => Promise<*>} params.persist Persist to the server.\n * @param {() => void} params.rollback Restore local state if persist fails.\n * @returns {Promise<*>} The persist result.\n * @throws Re-throws the persist error after rolling back.\n */\nfunction saveNoteWithRollback(_x2) {\n  return _saveNoteWithRollback.apply(this, arguments);\n}\n\n/**\n * Move focus into an editor's note textarea, caret after any existing text, so\n * the user can type immediately without clicking (#3080).\n *\n * Deliberately inert rather than throwing in every degenerate case — a focus\n * convenience must never be able to break the editor.\n *\n * @param {HTMLElement|null} root Element containing the [data-note-textarea].\n * @returns {boolean}
119 True when focus was moved into the textarea.\n */\nfunction _saveNoteWithRollback() {\n  _saveNoteWithRollback = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee4(_ref2) {\n    var apply, persist, rollback;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee4$(_context4) {\n      while (1) switch (_context4.prev = _context4.next) {\n        case 0:\n          apply = _ref2.apply, persist = _ref2.persist, rollback = _ref2.rollback;\n          apply();\n          _context4.prev = 2;\n          _context4.next = 5;\n          return persist();\n        case 5:\n          return _context4.abrupt(\"return\", _context4.sent);\n        case 8:\n          _context4.prev = 8;\n          _context4.t0 = _context4[\"catch\"](2);\n          rollback();\n          throw _context4.t0;\n        case 12:\n        case \"end\":\n          return _context4.stop();\n      }\n    }, _callee4, null, [[2, 8]]);\n  }));\n  return _saveNoteWithRollback.apply(this, arguments);\n}\nfunction focusNoteTextarea(root) {\n  var _root$querySelector, _textarea$value;\n  var textarea = root === null || root === void 0 || (_root$querySelector = root.querySelector) === null || _root$querySelector === void 0 ? void 0 : _root$querySelector.call(root, '[data-note-textarea]');\n  if (!textarea || typeof textarea.focus !== 'function' || textarea.isConnected === false) {\n    return false;\n  }\n\n  // The editor is position:fixed and anchored beside its annotation (#3083); a\n  // plain focus() may scroll the reader to reveal it and undo that anchoring.\n  // Engines that reject the options object fall back to a bare focus().\n  try {\n    textarea.focus({\n      preventScroll: true\n    });\n  } catch (err) {\n    textarea.focus();\n  }\n  var caretPosition = ((_textarea$value = textarea.value) !== null && _textarea$value !== void 0 ? _textarea$value : '').length;\n  if (typeof textarea.setSelectionRange === 'function') {\n    try {\n      textarea.setSelectionRange(caretPosition, caretPosition);\n    } catch (err) {\n      // Selection ranges are unsupported on some controls — the focus stands.\n    }\n  }\n  return true;\n}\n\n/**\n * Create the note editor element.\n *\n * The editor is decoupled from annotations.js internals via injected async\n * callbacks so it can be unit-tested. `saveNote(text)` and `deleteNote()` must\n * return promises; the editor manages the busy state, in-flight guard, and\n * teardown. Persistence rollback is the caller's responsibility inside those\n * callbacks (see saveNoteWithRollback).\n *\n * @param {Object} params\n * @param {string} params.markId\n * @param {string} [params.userMarkRecordId]\n * @param {string} [params.initialValue='']\n * @param {Object|null} [params.i18n=null]\n * @param {(text: string) => Promise<*>} params.saveNote\n * @param {() => Promise<*>} params.deleteNote\n * @param {(err: Error) => void} [params.onError]\n * @returns {HTMLElement} The editor wrapper element.\n */\nfunction createNoteEditor(_ref3) {\n  var _requestAnimationFram;\n  var markId = _ref3.markId,\n    userMarkRecordId = _ref3.userMarkRecordId,\n    _ref3$initialValue = _ref3.initialValue,\n    initialValue = _ref3$initialValue === void 0 ? '' : _ref3$initialValue,\n    _ref3$i18n = _ref3.i18n,\n    i18n = _ref3$i18n === void 0 ? null : _ref3$i18n,\n    saveNote = _ref3.saveNote,\n    deleteNote = _ref3.deleteNote,\n    _ref3$onError = _ref3.onError,\n    onError = _ref3$onError === void 0 ? function () {} : _ref3$onError;\n  var t = function t(key, fallback) {\n    var _i18n$t, _i18n$t2;\n    return (_i18n$t = i18n === null || i18n === void 0 || (_i18n$t2 = i18n.t) === null || _i18n$t2 === void 0 ? void 0 : _i18n$t2.call(i18n, key)) !== null && _i18n$t !== void 0 ? _i18n$t : fallback;\n  };\n  var guard = createInFlightGuard();\n  var wrapper = document.createElement('div');\n  wrapper.className = 'annotation-options note-editor-active';\n  wrapper.dataset.markId = markId;\n  if (userMarkRecordId) {\n    wrapper.dataset.userMarkRecordId = userMarkRecordId;\n  }\n  wrapper.dataset.controlsFor = 'note';\n\n  // Header: drag handle (move icon).\n  // The whole header is the drag handle; the move icon is the visible affordance.\n  // Close now lives in the icon footer alongside delete/save, mirroring the tags\n  // modal (which has cancel in its footer and no header ×).\n  var header = document.createElement('div');\n  header.className = 'note-editor-header';\n  var dragHandle = document.createElement('span');\n  dragHandle.className = 'note-editor-drag-handle';\n  dragHandle.setAttribute('role', 'button');\n  dragHandle.setAttribute('aria-label', t('annotations.note_move', 'Move note editor'));\n  dragHandle.title = t('annotations.note_move', 'Move note editor');\n  dragHandle.innerHTML = '<i class=\"fa-solid fa-up-down-left-right\" aria-hidden=\"true\"></i>';\n  header.appendChild(dragHandle);\n  wrapper.appendChild(header);\n\n  // Textarea — value is always a plain string.\n  var inputDiv = document.createElement('div');\n  inputDiv.className = 'note-input';\n  var textarea = document.createElement('textarea');\n  textarea.setAttribute('data-note-textarea', '');\n  textarea.placeholder = t('annotations.note_placeholder', 'Type your note here');\n  textarea.rows = 8;\n  textarea.value = (0,_note_utils__WEBPACK_IMPORTED_MODULE_2__.normalizeNote)(initialValue);\n  inputDiv.appendChild(textarea);\n  wrapper.appendChild(inputDiv);
119\n\n  // Busy overlay\n  var overlay = document.createElement('div');\n  overlay.className = 'note-editor-overlay';\n  overlay.style.display = 'none';\n  wrapper.appendChild(overlay);\n  var setBusy = function setBusy(isBusy) {\n    overlay.style.display = isBusy ? 'block' : 'none';\n    saveBtn.disabled = isBusy;\n    deleteBtn.disabled = isBusy;\n  };\n\n  // Icon action footer — mirrors the tags modal's .action-buttons (a muted\n  // ×-circle cancel, a red trash delete, a green floppy-disk save) so the two\n  // surfaces feel cohesive (#3083). Scoped classes avoid colliding\n  // with the tags modal's #cancel-button / #delete-button / #save-button ids.\n  var makeIconButton = function makeIconButton(_ref4) {\n    var className = _ref4.className,\n      icon = _ref4.icon,\n      labelKey = _ref4.labelKey,\n      labelFallback = _ref4.labelFallback,\n      dataAttr = _ref4.dataAttr;\n    var label = t(labelKey, labelFallback);\n    var btn = document.createElement('button');\n    btn.type = 'button';\n    btn.className = className;\n    if (dataAttr) {\n      btn.setAttribute(dataAttr, '');\n    }\n    btn.setAttribute('aria-label', label);\n    btn.title = label;\n    btn.innerHTML = \"<i class=\\\"\".concat(icon, \"\\\" aria-hidden=\\\"true\\\"></i>\");\n    var srText = document.createElement('span');\n    srText.className = 'show-for-sr';\n    srText.textContent = label;\n    btn.appendChild(srText);\n    return btn;\n  };\n  var actions = document.createElement('div');\n  actions.className = 'note-editor-actions';\n  var cancelBtn = makeIconButton({\n    className: 'note-action-cancel',\n    icon: 'fa-solid fa-circle-xmark fa-xl',\n    labelKey: 'annotations.note_close',\n    labelFallback: 'Close',\n    dataAttr: 'data-note-cancel'\n  });\n  var deleteBtn = makeIconButton({\n    className: 'note-action-delete',\n    icon: 'fa-solid fa-trash-can fa-xl',\n    labelKey: 'annotations.note_delete',\n    labelFallback: 'Delete Note',\n    dataAttr: 'data-note-delete'\n  });\n  var saveBtn = makeIconButton({\n    className: 'note-action-save',\n    icon: 'fa-solid fa-floppy-disk fa-xl',\n    labelKey: 'annotations.note_save',\n    labelFallback: 'Save Note',\n    dataAttr: 'data-note-save'\n  });\n  actions.append(cancelBtn, deleteBtn, saveBtn);\n  wrapper.appendChild(actions);\n  var handleSave = function handleSave() {\n    return guard.run(/*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2() {\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context2) {\n        while (1) switch (_context2.prev = _context2.next) {\n          case 0:\n            setBusy(true);\n            _context2.prev = 1;\n            _context2.next = 4;\n            return saveNote((0,_note_utils__WEBPACK_IMPORTED_MODULE_2__.normalizeNote)(textarea.value));\n          case 4:\n            wrapper.remove();\n            _context2.next = 10;\n            break;\n          case 7:\n            _context2.prev = 7;\n            _context2.t0 = _context2[\"catch\"](1);\n            onError(_context2.t0);\n          case 10:\n            _context2.prev = 10;\n            setBusy(false);\n            return _context2.finish(10);\n          case 13:\n          case \"end\":\n            return _context2.stop();\n        }\n      }, _callee2, null, [[1, 7, 10, 13]]);\n    })));\n  };\n  var handleDelete = function handleDelete() {\n    return guard.run(/*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee3() {\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee3$(_context3) {\n        while (1) switch (_context3.prev = _context3.next) {\n          case 0:\n            if (window.confirm(t('annotations.note_delete_confirm', 'Are you sure you want to delete this note?'))) {\n              _context3.next = 2;\n              break;\n            }\n            return _context3.abrupt(\"return\");\n          case 2:\n            setBusy(true);\n            _context3.prev = 3;\n            _context3.next = 6;\n            return deleteNote();\n          case 6:\n            wrapper.remove();\n            _context3.next = 12;\n            break;\n          case 9:\n            _context3.prev = 9;\n            _context3.t0 = _context3[\"catch\"](3);\n            onError(_context3.t0);\n          case 12:\n            _context3.prev = 12;\n            setBusy(false);\n            return _context3.finish(12);\n          case 15:\n          case \"end\":\n            return _context3.stop();\n        }\n      }, _callee3, null, [[3, 9, 12, 15]]);\n    }
119)));\n  };\n  cancelBtn.addEventListener('click', function () {\n    return wrapper.remove();\n  });\n  saveBtn.addEventListener('click', handleSave);\n  deleteBtn.addEventListener('click', handleDelete);\n\n  // The editor is a floating panel dragged by its header (move icon affordance).\n  (0,_utilities_draggable__WEBPACK_IMPORTED_MODULE_3__.makeDraggable)(wrapper, header, {\n    clampToViewport: true\n  });\n\n  // Typing should start without a click (#3080). Deferred to the next frame so\n  // focus lands after the caller has mounted the panel and\n  // positionEditorNearAnchor() has placed it.\n  (_requestAnimationFram = requestAnimationFrame) === null || _requestAnimationFram === void 0 || _requestAnimationFram(function () {\n    return focusNoteTextarea(wrapper);\n  });\n  return wrapper;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYW5ub3RhdGlvbnMvbm90ZS1lZGl0b3IuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBWkE7QUFBQTtBQUFBO0FBQUE7QUFhQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBOztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFBQTtBQVhBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQVlBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTtBQUFBO0FBTkE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvYW5ub3RhdGlvbnMvbm90ZS1lZGl0b3IuanM/OTg3YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhhcmRlbmVkIG5vdGUgZWRpdG9yIGZvciBhbm5vdGF0aW9uIG5vdGVzICgjMzA4MCkuXG4gKlxuICogSGFyZGVuaW5nIGJ1aWx0IGluOlxuICogIC0gb3B0aW1pc3RpYyB1cGRhdGUgd2l0aCBST0xMQkFDSyBvbiBhIGZhaWxlZCBzYXZlICgjMjAwNilcbiAqICAtIGluLWZsaWdodCBndWFyZCBzbyBjb25jdXJyZW50IHNhdmVzIGNhbm5vdCByYWNlICgjMjAwNilcbiAqICAtIHRyeS9maW5hbGx5IHRlYXJkb3duIG9mIHRoZSBidXN5IHN0YXRlIHNvIHRoZSBlZGl0b3IgbmV2ZXIgZ2V0cyBzdHVja1xuICogIC0gdGhlIGBub3RlYCBzdGF5cyBhIHBsYWluIHN0cmluZyBlbmQtdG8tZW5kIChuZXZlciBhbiBvYmplY3Qg4oaSIGRhdGFzZXQ7ICMzMDc2KVxuICovXG5cbmltcG9ydCB7
119IG5vcm1hbGl6ZU5vdGUgfSBmcm9tICcuL25vdGUtdXRpbHMnO1xuaW1wb3J0IHsgbWFrZURyYWdnYWJsZSB9IGZyb20gJy4uL3V0aWxpdGllcy9kcmFnZ2FibGUnO1xuXG4vLyBHYXAgYmV0d2VlbiB0aGUgZWRpdG9yIGFuZCBpdHMgYW5jaG9yLCBhbmQgdGhlIG1pbmltdW0gbWFyZ2luIHRoZSBlZGl0b3Jcbi8vIGtlZXBzIGZyb20gdGhlIHZpZXdwb3J0IGVkZ2VzICgjMzA4MykuXG5jb25zdCBBTkNIT1JfR0FQX1BYID0gODtcbmNvbnN0IFZJRVdQT1JUX01BUkdJTl9QWCA9IDg7XG5cbi8qKlxuICogQ2xhbXAgYSB2YWx1ZSBpbnRvIGFuIGluY2x1c2l2ZSByYW5nZS4gV2hlbiBtaW4gPiBtYXggKHRoZSBlbGVtZW50IGlzIHdpZGVyXG4gKiBvciB0YWxsZXIgdGhhbiB0aGUgYXZhaWxhYmxlIHNwYWNlKSB0aGUgbG93ZXIgYm91bmQgd2lucyBzbyB0aGUgdG9wL2xlZnRcbiAqIGVkZ2Ugc3RheXMgdmlzaWJsZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4sIG1heCkge1xuICBpZiAobWF4IDwgbWluKSB7XG4gICAgcmV0dXJuIG1pbjtcbiAgfVxuXG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2YWx1ZSwgbWluKSwgbWF4KTtcbn1cblxuLyoqXG4gKiBQb3NpdGlvbiBhbiBhbHJlYWR5LW1vdW50ZWQgZWRpdG9yIHBhbmVsIG5lYXIgaXRzIHNvdXJjZSBhbmNob3IsIGluIHBpeGVscyxcbiAqIHdpdGggbm8gY2VudGVyaW5nIHRyYW5zZm9ybSAoIzMwODMpLlxuICpcbiAqIFRoZSBlZGl0b3IgbXVzdCBhbHJlYWR5IGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudCBzbyBpdCBjYW4gYmUgbWVhc3VyZWQuXG4gKiBQbGFjZW1lbnQgaXMgdHJpZWQgcmlnaHQtb2YsIHRoZW4gbGVmdC1vZiwgdGhlbiBiZWxvdyB0aGUgYW5jaG9yLCBwaWNraW5nIHRoZVxuICogZmlyc3QgdGhhdCBmaXRzIGhvcml6b250YWxseTsgdGhlIGNob3NlbiBwb3NpdGlvbiBpcyBhbHdheXMgY2xhbXBlZCBzbyB0aGVcbiAqIHdob2xlIHBhbmVsIHN0YXlzIG9uLXNjcmVlbi4gV2hlbiB0aGUgYW5jaG9yIGlzIG1pc3NpbmcgaXQgZmFsbHMgYmFjayB0byBhXG4gKiB0b3AtY2VudGVyZWQgb24tc2NyZWVuIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVkaXRvckVsIFRoZSBmbG9hdGluZyBlZGl0b3IgcGFuZWwgKGFscmVhZHkgaW4gdGhlIERPTSkuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGFuY2hvckVsIFRoZSBlbGVtZW50IHRvIG9wZW4gYmVzaWRlIChjYXJkLCBwb3B1cCwgbWFyaykuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm92ZXJsYXlBbmNob3I9ZmFsc2VdIFdoZW4gdHJ1ZSwgb3BlbiB0aGUgZWRpdG9yXG4gKiAgIGRpcmVjdGx5IG92ZXIgdGhlIGFuY2hvciAodG9wcyBhbGlnbmVkLCBob3Jpem9udGFsbHkgY2VudGVyZWQgb24gdGhlXG4gKiAgIGFuY2hvcidzIGNlbnRyZSkgc28gaXQgdmlzdWFsbHkgUkVQTEFDRVMgdGhlIGFuY2hvciByYXRoZXIgdGhhbiBzaXR0aW5nXG4gKiAgIGJlc2lkZSBpdCDigJQgdXNlZCBmb3IgdGhlIHJlYWRlciBvcHRpb25zIHBvcHVwICgjMzA4MCkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aW9uRWRpdG9yTmVhckFuY2hvcihlZGl0b3JFbCwgYW5jaG9yRWwsIHsgb3ZlcmxheUFuY2hvciA9IGZhbHNlIH0gPSB7fSkge1xuICBpZiAoIWVkaXRvckVsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQW5jaG9yIHBsYWNlbWVudCBiZWxvdyBpcyBjb21wdXRlZCBpbiB2aWV3cG9ydCBjb29yZGluYXRlcywgc28gdGhlIHBhbmVsXG4gIC8vIG11c3QgYmUgdmlld3BvcnQtZml4ZWQgZm9yIHRob3NlIGxlZnQvdG9wIHZhbHVlcyB0byBsYW5kIHdoZXJlIGludGVuZGVkLlxuICAvLyBGb3JjZSBpdCBpbmxpbmUgKGJlYXRzIGFueSBjYXNjYWRlIHJ1bGUgdGhhdCBjb3VsZCBsZWF2ZSBpdCBhYnNvbHV0ZWx5XG4gIC8vIHBvc2l0aW9uZWQgaW5zaWRlIGFuIG9mZnNldCBjb250YWluZXIgYW5kIHNoaWZ0IHRoZSBwYW5lbCkuICgjMzA4MClcbiAgZWRpdG9yRWwuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuXG4gIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwO1xuICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCAwO1xuICBjb25zdCBlZGl0b3JSZWN0ID0gZWRpdG9yRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IGVkaXRvcldpZHRoID0gZWRpdG9yUmVjdC53aWR0aDtcbiAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gZWRpdG9yUmVjdC5oZWlnaHQ7XG5cbiAgY29uc3QgbWF4TGVmdCA9IHZpZXdwb3J0V2lkdGggLSBlZGl0b3JXaWR0aCAtIFZJRVdQT1JUX01BUkdJTl9QWDtcbiAgY29uc3QgbWF4VG9wID0gdmlld3BvcnRIZWlnaHQgLSBlZGl0b3JIZWlnaHQgLSBWSUVXUE9SVF9NQVJHSU5fUFg7XG5cbiAgZWRpdG9yRWwuc3R5bGUudHJhbnNmb3JtID0gJ25vbmUnO1xuXG4gIGNvbnN0IGFuY2hvclJlY3QgPVxuICAgIGFuY2hvckVsICYmIHR5cGVvZiBhbmNob3JFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbidcbiAgICAgID8gYW5jaG9yRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIDogbnVsbDtcblxuICBpZiAoIWFuY2hvclJlY3QpIHtcbiAgICAvLyBObyBhbmNob3I6IG9wZW4gdG9wLWNlbnRlcmVkLCBmdWxseSBvbi1zY3JlZW4uXG4gICAgY29uc3QgZmFsbGJhY2tMZWZ0ID0gKHZpZXdwb3J0V2lkdGggLSBlZGl0b3JXaWR0aCkgLyAyO1xuICAgIGVkaXRvckVsLnN0eWxlLmxlZnQgPSBgJHtjbGFtcChmYWxsYmFja0xlZnQsIFZJRVdQT1JUX01BUkdJTl9QWCwgbWF4TGVmdCl9cHhgO1xuICAgIGVkaXRvckVsLnN0eWxlLnRvcCA9IGAke1ZJRVdQT1JUX01BUkdJTl9QWH1weGA7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3ZlcmxheUFuY2hvcikge1xuICAgIC8vIE92ZXJsYXkgdGhlIGFuY2hvcjogYWxpZ24gdG9wcyBhbmQgY2VudHJlIHRoZSBlZGl0b3IgaG9yaXpvbn
119RhbGx5IG9uIHRoZVxuICAgIC8vIGFuY2hvcidzIGNlbnRyZSBzbyBpdCBsb29rcyBsaWtlIGl0IHRha2VzIHRoZSBhbmNob3IncyBwbGFjZSAoIzMwODApLlxuICAgIGNvbnN0IG92ZXJsYXlMZWZ0ID0gYW5jaG9yUmVjdC5sZWZ0ICsgYW5jaG9yUmVjdC53aWR0aCAvIDIgLSBlZGl0b3JXaWR0aCAvIDI7XG4gICAgZWRpdG9yRWwuc3R5bGUubGVmdCA9IGAke2NsYW1wKG92ZXJsYXlMZWZ0LCBWSUVXUE9SVF9NQVJHSU5fUFgsIG1heExlZnQpfXB4YDtcbiAgICBlZGl0b3JFbC5zdHlsZS50b3AgPSBgJHtjbGFtcChhbmNob3JSZWN0LnRvcCwgVklFV1BPUlRfTUFSR0lOX1BYLCBtYXhUb3ApfXB4YDtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJpZ2h0TGVmdCA9IGFuY2hvclJlY3QucmlnaHQgKyBBTkNIT1JfR0FQX1BYO1xuICBjb25zdCBsZWZ0TGVmdCA9IGFuY2hvclJlY3QubGVmdCAtIGVkaXRvcldpZHRoIC0gQU5DSE9SX0dBUF9QWDtcblxuICBjb25zdCBmaXRzUmlnaHQgPSByaWdodExlZnQgKyBlZGl0b3JXaWR0aCA8PSB2aWV3cG9ydFdpZHRoIC0gVklFV1BPUlRfTUFSR0lOX1BYO1xuICBjb25zdCBmaXRzTGVmdCA9IGxlZnRMZWZ0ID49IFZJRVdQT1JUX01BUkdJTl9QWDtcblxuICBsZXQgbGVmdDtcbiAgbGV0IHRvcDtcblxuICBpZiAoZml0c1JpZ2h0KSB7XG4gICAgbGVmdCA9IHJpZ2h0TGVmdDtcbiAgICB0b3AgPSBhbmNob3JSZWN0LnRvcDtcbiAgfSBlbHNlIGlmIChmaXRzTGVmdCkge1xuICAgIGxlZnQgPSBsZWZ0TGVmdDtcbiAgICB0b3AgPSBhbmNob3JSZWN0LnRvcDtcbiAgfSBlbHNlIHtcbiAgICAvLyBOZWl0aGVyIHNpZGUgZml0czogZHJvcCB0aGUgZWRpdG9yIGJlbG93IHRoZSBhbmNob3IuXG4gICAgbGVmdCA9IGFuY2hvclJlY3QubGVmdDtcbiAgICB0b3AgPSBhbmNob3JSZWN0LmJvdHRvbSArIEFOQ0hPUl9HQVBfUFg7XG4gIH1cblxuICBlZGl0b3JFbC5zdHlsZS5sZWZ0ID0gYCR7Y2xhbXAobGVmdCwgVklFV1BPUlRfTUFSR0lOX1BYLCBtYXhMZWZ0KX1weGA7XG4gIGVkaXRvckVsLnN0eWxlLnRvcCA9IGAke2NsYW1wKHRvcCwgVklFV1BPUlRfTUFSR0lOX1BYLCBtYXhUb3ApfXB4YDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBndWFyZCB0aGF0IHJ1bnMgYW4gYXN5bmMgdGFzayBidXQgaWdub3JlcyBjYWxscyBtYWRlIHdoaWxlIGEgdGFzayBpc1xuICogYWxyZWFkeSBydW5uaW5nLiBSZXR1cm5zIGEgYHJ1bmAgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyB0byB0aGUgdGFzayByZXN1bHQsXG4gKiBvciB1bmRlZmluZWQgd2hlbiBhIGNhbGwgd2FzIHNraXBwZWQgYmVjYXVzZSBvbmUgd2FzIGluIGZsaWdodC5cbiAqXG4gKiBAcmV0dXJucyB7eyBydW46ICh0YXNrOiAoKSA9PiBQcm9taXNlPCo+KSA9PiBQcm9taXNlPCo+LCBpc0J1c3k6ICgpID0+IGJvb2xlYW4gfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluRmxpZ2h0R3VhcmQoKSB7XG4gIGxldCBidXN5ID0gZmFsc2U7XG5cbiAgcmV0dXJuIHtcbiAgICBpc0J1c3k6ICgpID0+IGJ1c3ksXG4gICAgcnVuOiBhc3luYyAodGFzaykgPT4ge1xuICAgICAgaWYgKGJ1c3kpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgYnVzeSA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0YXNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBidXN5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBBcHBseSBhbiBvcHRpbWlzdGljIG5vdGUgY2hhbmdlLCBwZXJzaXN0IGl0LCBhbmQgcm9sbCBiYWNrIG9uIGZhaWx1cmUgKCMyMDA2KS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IHBhcmFtcy5hcHBseSAgICBNdXRhdGUgbG9jYWwgc3RhdGUgKHNlc3Npb24gc3RvcmFnZSkgbm93LlxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPCo+fSBwYXJhbXMucGVyc2lzdCBQZXJzaXN0IHRvIHRoZSBzZXJ2ZXIuXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IHBhcmFtcy5yb2xsYmFjayBSZXN0b3JlIGxvY2FsIHN0YXRlIGlmIHBlcnNpc3QgZmFpbHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwqPn0gVGhlIHBlcnNpc3QgcmVzdWx0LlxuICogQHRocm93cyBSZS10aHJvd3MgdGhlIHBlcnNpc3QgZXJyb3IgYWZ0ZXIgcm9sbGluZyBiYWNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZU5vdGVXaXRoUm9sbGJhY2soeyBhcHBseSwgcGVyc2lzdCwgcm9sbGJhY2sgfSkge1xuICBhcHBseSgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHBlcnNpc3QoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcm9sbGJhY2soKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLyoqXG4gKiBNb3ZlIGZvY3VzIGludG8gYW4gZWRpdG9yJ3Mgbm90ZSB0ZXh0YXJlYSwgY2FyZXQgYWZ0ZXIgYW55IGV4aXN0aW5nIHRleHQsIHNvXG4gKiB0aGUgdXNlciBjYW4gdHlwZSBpbW1lZGlhdGVseSB3aXRob3V0IGNsaWNraW5nICgjMzA4MCkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGluZXJ0IHJhdGhlciB0aGFuIHRocm93aW5nIGluIGV2ZXJ5IGRlZ2VuZXJhdGUgY2FzZSDigJQgYSBmb2N1c1xuICogY29udmVuaWVuY2UgbXVzdCBuZXZlciBiZSBhYmxlIHRvIGJyZWFrIHRoZSBlZGl0b3IuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSByb290IEVsZW1lbnQgY29udGFpbmluZyB0aGUgW2RhdGEtbm90ZS10ZXh0YXJlYV0uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIGZvY3VzIHdhcyBtb3ZlZCBpbnRvIHRoZSB0ZXh0YXJlYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvY3VzTm90ZVRleHRhcmVhKHJvb3QpIHtcbiAgY29uc3QgdGV4dGFyZWEgPSByb290Py5xdWVyeVNlbGVjdG9yPy4oJ1tkYXRhLW5vdGUtdGV4dGFyZWFdJyk7XG5cbiAgaWYgKCF0ZXh0YXJlYSB8fCB0eXBlb2YgdGV4dGFyZWEuZm9jdXMgIT09ICdmdW5jdGlvbicgfHwgdGV4dGFyZWEuaXNDb25uZWN0ZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGhlIGVkaXRvciBpcyBwb3NpdGlvbjpmaXhlZCBhbmQgYW5jaG9yZWQgYmVzaWRlIGl0cyBhbm5vdGF0aW9uICgjMzA4Myk7IGFcbiAgLy8gcGxhaW4gZm9jdXMoKSBtYXkgc2Nyb2xsIHRoZSByZWFkZXIgdG8gcmV2ZWFsIGl0IGFuZCB1bmRvIHRoYXQgYW5jaG9yaW5nLlxuICAvLyBFbmdpbmVzIHRoYXQgcmVqZWN0IHRoZSBvcHRpb25zIG9iamVjdCBmYWxsIGJhY2sgdG8gYSBiYXJlIGZvY3VzKCkuXG4gI
119HRyeSB7XG4gICAgdGV4dGFyZWEuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0ZXh0YXJlYS5mb2N1cygpO1xuICB9XG5cbiAgY29uc3QgY2FyZXRQb3NpdGlvbiA9ICh0ZXh0YXJlYS52YWx1ZSA/PyAnJykubGVuZ3RoO1xuXG4gIGlmICh0eXBlb2YgdGV4dGFyZWEuc2V0U2VsZWN0aW9uUmFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgdGV4dGFyZWEuc2V0U2VsZWN0aW9uUmFuZ2UoY2FyZXRQb3NpdGlvbiwgY2FyZXRQb3NpdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBTZWxlY3Rpb24gcmFuZ2VzIGFyZSB1bnN1cHBvcnRlZCBvbiBzb21lIGNvbnRyb2xzIOKAlCB0aGUgZm9jdXMgc3RhbmRzLlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgbm90ZSBlZGl0b3IgZWxlbWVudC5cbiAqXG4gKiBUaGUgZWRpdG9yIGlzIGRlY291cGxlZCBmcm9tIGFubm90YXRpb25zLmpzIGludGVybmFscyB2aWEgaW5qZWN0ZWQgYXN5bmNcbiAqIGNhbGxiYWNrcyBzbyBpdCBjYW4gYmUgdW5pdC10ZXN0ZWQuIGBzYXZlTm90ZSh0ZXh0KWAgYW5kIGBkZWxldGVOb3RlKClgIG11c3RcbiAqIHJldHVybiBwcm9taXNlczsgdGhlIGVkaXRvciBtYW5hZ2VzIHRoZSBidXN5IHN0YXRlLCBpbi1mbGlnaHQgZ3VhcmQsIGFuZFxuICogdGVhcmRvd24uIFBlcnNpc3RlbmNlIHJvbGxiYWNrIGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSBpbnNpZGUgdGhvc2VcbiAqIGNhbGxiYWNrcyAoc2VlIHNhdmVOb3RlV2l0aFJvbGxiYWNrKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm1hcmtJZFxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMudXNlck1hcmtSZWNvcmRJZF1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLmluaXRpYWxWYWx1ZT0nJ11cbiAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IFtwYXJhbXMuaTE4bj1udWxsXVxuICogQHBhcmFtIHsodGV4dDogc3RyaW5nKSA9PiBQcm9taXNlPCo+fSBwYXJhbXMuc2F2ZU5vdGVcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTwqPn0gcGFyYW1zLmRlbGV0ZU5vdGVcbiAqIEBwYXJhbSB7KGVycjogRXJyb3IpID0+IHZvaWR9IFtwYXJhbXMub25FcnJvcl1cbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIGVkaXRvciB3cmFwcGVyIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOb3RlRWRpdG9yKHtcbiAgbWFya0lkLFxuICB1c2VyTWFya1JlY29yZElkLFxuICBpbml0aWFsVmFsdWUgPSAnJyxcbiAgaTE4biA9IG51bGwsXG4gIHNhdmVOb3RlLFxuICBkZWxldGVOb3RlLFxuICBvbkVycm9yID0gKCkgPT4ge30sXG59KSB7XG4gIGNvbnN0IHQgPSAoa2V5LCBmYWxsYmFjaykgPT4gaTE4bj8udD8uKGtleSkgPz8gZmFsbGJhY2s7XG4gIGNvbnN0IGd1YXJkID0gY3JlYXRlSW5GbGlnaHRHdWFyZCgpO1xuXG4gIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgd3JhcHBlci5jbGFzc05hbWUgPSAnYW5ub3RhdGlvbi1vcHRpb25zIG5vdGUtZWRpdG9yLWFjdGl2ZSc7XG4gIHdyYXBwZXIuZGF0YXNldC5tYXJrSWQgPSBtYXJrSWQ7XG5cbiAgaWYgKHVzZXJNYXJrUmVjb3JkSWQpIHtcbiAgICB3cmFwcGVyLmRhdGFzZXQudXNlck1hcmtSZWNvcmRJZCA9IHVzZXJNYXJrUmVjb3JkSWQ7XG4gIH1cblxuICB3cmFwcGVyLmRhdGFzZXQuY29udHJvbHNGb3IgPSAnbm90ZSc7XG5cbiAgLy8gSGVhZGVyOiBkcmFnIGhhbmRsZSAobW92ZSBpY29uKS5cbiAgLy8gVGhlIHdob2xlIGhlYWRlciBpcyB0aGUgZHJhZyBoYW5kbGU7IHRoZSBtb3ZlIGljb24gaXMgdGhlIHZpc2libGUgYWZmb3JkYW5jZS5cbiAgLy8gQ2xvc2Ugbm93IGxpdmVzIGluIHRoZSBpY29uIGZvb3RlciBhbG9uZ3NpZGUgZGVsZXRlL3NhdmUsIG1pcnJvcmluZyB0aGUgdGFnc1xuICAvLyBtb2RhbCAod2hpY2ggaGFzIGNhbmNlbCBpbiBpdHMgZm9vdGVyIGFuZCBubyBoZWFkZXIgw5cpLlxuICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgaGVhZGVyLmNsYXNzTmFtZSA9ICdub3RlLWVkaXRvci1oZWFkZXInO1xuXG4gIGNvbnN0IGRyYWdIYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIGRyYWdIYW5kbGUuY2xhc3NOYW1lID0gJ25vdGUtZWRpdG9yLWRyYWctaGFuZGxlJztcbiAgZHJhZ0hhbmRsZS5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJyk7XG4gIGRyYWdIYW5kbGUuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdCgnYW5ub3RhdGlvbnMubm90ZV9tb3ZlJywgJ01vdmUgbm90ZSBlZGl0b3InKSk7XG4gIGRyYWdIYW5kbGUudGl0bGUgPSB0KCdhbm5vdGF0aW9ucy5ub3RlX21vdmUnLCAnTW92ZSBub3RlIGVkaXRvcicpO1xuICBkcmFnSGFuZGxlLmlubmVySFRNTCA9ICc8aSBjbGFzcz1cImZhLXNvbGlkIGZhLXVwLWRvd24tbGVmdC1yaWdodFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4nO1xuICBoZWFkZXIuYXBwZW5kQ2hpbGQoZHJhZ0hhbmRsZSk7XG5cbiAgd3JhcHBlci5hcHBlbmRDaGlsZChoZWFkZXIpO1xuXG4gIC8vIFRleHRhcmVhIOKAlCB2YWx1ZSBpcyBhbHdheXMgYSBwbGFpbiBzdHJpbmcuXG4gIGNvbnN0IGlucHV0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGlucHV0RGl2LmNsYXNzTmFtZSA9ICdub3RlLWlucHV0JztcbiAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICB0ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2RhdGEtbm90ZS10ZXh0YXJlYScsICcnKTtcbiAgdGV4dGFyZWEucGxhY2Vob2xkZXIgPSB0KCdhbm5vdGF0aW9ucy5ub3RlX3BsYWNlaG9sZG
119VyJywgJ1R5cGUgeW91ciBub3RlIGhlcmUnKTtcbiAgdGV4dGFyZWEucm93cyA9IDg7XG4gIHRleHRhcmVhLnZhbHVlID0gbm9ybWFsaXplTm90ZShpbml0aWFsVmFsdWUpO1xuICBpbnB1dERpdi5hcHBlbmRDaGlsZCh0ZXh0YXJlYSk7XG4gIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaW5wdXREaXYpO1xuXG4gIC8vIEJ1c3kgb3ZlcmxheVxuICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuY2xhc3NOYW1lID0gJ25vdGUtZWRpdG9yLW92ZXJsYXknO1xuICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHdyYXBwZXIuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG5cbiAgY29uc3Qgc2V0QnVzeSA9IChpc0J1c3kpID0+IHtcbiAgICBvdmVybGF5LnN0eWxlLmRpc3BsYXkgPSBpc0J1c3kgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIHNhdmVCdG4uZGlzYWJsZWQgPSBpc0J1c3k7XG4gICAgZGVsZXRlQnRuLmRpc2FibGVkID0gaXNCdXN5O1xuICB9O1xuXG4gIC8vIEljb24gYWN0aW9uIGZvb3RlciDigJQgbWlycm9ycyB0aGUgdGFncyBtb2RhbCdzIC5hY3Rpb24tYnV0dG9ucyAoYSBtdXRlZFxuICAvLyDDly1jaXJjbGUgY2FuY2VsLCBhIHJlZCB0cmFzaCBkZWxldGUsIGEgZ3JlZW4gZmxvcHB5LWRpc2sgc2F2ZSkgc28gdGhlIHR3b1xuICAvLyBzdXJmYWNlcyBmZWVsIGNvaGVzaXZlICgjMzA4MykuIFNjb3BlZCBjbGFzc2VzIGF2b2lkIGNvbGxpZGluZ1xuICAvLyB3aXRoIHRoZSB0YWdzIG1vZGFsJ3MgI2NhbmNlbC1idXR0b24gLyAjZGVsZXRlLWJ1dHRvbiAvICNzYXZlLWJ1dHRvbiBpZHMuXG4gIGNvbnN0IG1ha2VJY29uQnV0dG9uID0gKHsgY2xhc3NOYW1lLCBpY29uLCBsYWJlbEtleSwgbGFiZWxGYWxsYmFjaywgZGF0YUF0dHIgfSkgPT4ge1xuICAgIGNvbnN0IGxhYmVsID0gdChsYWJlbEtleSwgbGFiZWxGYWxsYmFjayk7XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnRuLnR5cGUgPSAnYnV0dG9uJztcbiAgICBidG4uY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuXG4gICAgaWYgKGRhdGFBdHRyKSB7XG4gICAgICBidG4uc2V0QXR0cmlidXRlKGRhdGFBdHRyLCAnJyk7XG4gICAgfVxuXG4gICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGxhYmVsKTtcbiAgICBidG4udGl0bGUgPSBsYWJlbDtcbiAgICBidG4uaW5uZXJIVE1MID0gYDxpIGNsYXNzPVwiJHtpY29ufVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5gO1xuXG4gICAgY29uc3Qgc3JUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNyVGV4dC5jbGFzc05hbWUgPSAnc2hvdy1mb3Itc3InO1xuICAgIHNyVGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICAgIGJ0bi5hcHBlbmRDaGlsZChzclRleHQpO1xuXG4gICAgcmV0dXJuIGJ0bjtcbiAgfTtcblxuICBjb25zdCBhY3Rpb25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGFjdGlvbnMuY2xhc3NOYW1lID0gJ25vdGUtZWRpdG9yLWFjdGlvbnMnO1xuXG4gIGNvbnN0IGNhbmNlbEJ0biA9IG1ha2VJY29uQnV0dG9uKHtcbiAgICBjbGFzc05hbWU6ICdub3RlLWFjdGlvbi1jYW5jZWwnLFxuICAgIGljb246ICdmYS1zb2xpZCBmYS1jaXJjbGUteG1hcmsgZmEteGwnLFxuICAgIGxhYmVsS2V5OiAnYW5ub3RhdGlvbnMubm90ZV9jbG9zZScsXG4gICAgbGFiZWxGYWxsYmFjazogJ0Nsb3NlJyxcbiAgICBkYXRhQXR0cjogJ2RhdGEtbm90ZS1jYW5jZWwnLFxuICB9KTtcblxuICBjb25zdCBkZWxldGVCdG4gPSBtYWtlSWNvbkJ1dHRvbih7XG4gICAgY2xhc3NOYW1lOiAnbm90ZS1hY3Rpb24tZGVsZXRlJyxcbiAgICBpY29uOiAnZmEtc29saWQgZmEtdHJhc2gtY2FuIGZhLXhsJyxcbiAgICBsYWJlbEtleTogJ2Fubm90YXRpb25zLm5vdGVfZGVsZXRlJyxcbiAgICBsYWJlbEZhbGxiYWNrOiAnRGVsZXRlIE5vdGUnLFxuICAgIGRhdGFBdHRyOiAnZGF0YS1ub3RlLWRlbGV0ZScsXG4gIH0pO1xuXG4gIGNvbnN0IHNhdmVCdG4gPSBtYWtlSWNvbkJ1dHRvbih7XG4gICAgY2xhc3NOYW1lOiAnbm90ZS1hY3Rpb24tc2F2ZScsXG4gICAgaWNvbjogJ2ZhLXNvbGlkIGZhLWZsb3BweS1kaXNrIGZhLXhsJyxcbiAgICBsYWJlbEtleTogJ2Fubm90YXRpb25zLm5vdGVfc2F2ZScsXG4gICAgbGFiZWxGYWxsYmFjazogJ1NhdmUgTm90ZScsXG4gICAgZGF0YUF0dHI6ICdkYXRhLW5vdGUtc2F2ZScsXG4gIH0pO1xuXG4gIGFjdGlvbnMuYXBwZW5kKGNhbmNlbEJ0biwgZGVsZXRlQnRuLCBzYXZlQnRuKTtcbiAgd3JhcHBlci5hcHBlbmRDaGlsZChhY3Rpb25zKTtcblxuICBjb25zdCBoYW5kbGVTYXZlID0gKCkgPT5cbiAgICBndWFyZC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgc2V0QnVzeSh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2F2ZU5vdGUobm9ybWFsaXplTm90ZSh0ZXh0YXJlYS52YWx1ZSkpO1xuICAgICAgICB3cmFwcGVyLnJlbW92ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldEJ1c3koZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZSA9ICgpID0+XG4gICAgZ3VhcmQucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hbGVydFxuICAgICAgaWYgKCF3aW5kb3cuY29uZmlybSh0KCdhbm5vdGF0aW9ucy5ub3RlX2RlbGV0ZV9jb25maXJtJywgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBub3RlPycpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldEJ1c3kodHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZU5vdGUoKTtcbiAgICAgICAgd3JhcHBlci5yZW1vdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRCdXN5KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB3cmFwcGVyLnJlbW92ZSgpKTtcbiAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVNhdmUpO1xuICBkZWxldGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVEZWxldGUpO1xuXG4gIC8vIFRoZSBlZGl0b3IgaXMgYSBmbG9hdGluZyBwYW5lbCBkcmFnZ2VkIGJ5IGl0cyBoZWFkZXIgKG1vdmUgaWNvbiBhZmZvcmRhbmNlKS5cbiAgbWFrZURyYWdnYWJsZSh3cmFwcGVyLCBoZWFkZXIsIHsgY2xhbXBUb1ZpZXdwb3J0OiB0cnVlIH0pO1xuXG4gIC8vIFR5cGluZyBzaG91bGQgc3RhcnQgd2l0aG91dCBh
119IGNsaWNrICgjMzA4MCkuIERlZmVycmVkIHRvIHRoZSBuZXh0IGZyYW1lIHNvXG4gIC8vIGZvY3VzIGxhbmRzIGFmdGVyIHRoZSBjYWxsZXIgaGFzIG1vdW50ZWQgdGhlIHBhbmVsIGFuZFxuICAvLyBwb3NpdGlvbkVkaXRvck5lYXJBbmNob3IoKSBoYXMgcGxhY2VkIGl0LlxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/LigoKSA9PiBmb2N1c05vdGVUZXh0YXJlYSh3cmFwcGVyKSk7XG5cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/annotations/note-editor.js\n");
120
121/***/ }),
122
123/***/ "./resources/js/annotations/note-tag-marker.js":
124/*!*****************************************************!*\
125  !*** ./resources/js/annotations/note-tag-marker.js ***!
126  \*****************************************************/
127/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
128
129eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   BOOKMARK_GLYPH_CLASS: () => (/* binding */ BOOKMARK_GLYPH_CLASS),\n/* harmony export */   BOOKMARK_MARKER_CLASS: () => (/* binding */ BOOKMARK_MARKER_CLASS),\n/* harmony export */   CLUSTERED_CLASS: () => (/* binding */ CLUSTERED_CLASS),\n/* harmony export */   CLUSTER_BOOKMARK_MARKS_ATTR: () => (/* binding */ CLUSTER_BOOKMARK_MARKS_ATTR),\n/* harmony export */   CLUSTER_CLASS: () => (/* binding */ CLUSTER_CLASS),\n/* harmony export */   CLUSTER_COUNT_ATTR: () => (/* binding */ CLUSTER_COUNT_ATTR),\n/* harmony export */   CLUSTER_GLYPH_COUNT_ATTR: () => (/* binding */ CLUSTER_GLYPH_COUNT_ATTR),\n/* harmony export */   CLUSTER_MEMBER_ATTR: () => (/* binding */ CLUSTER_MEMBER_ATTR),\n/* harmony export */   CLUSTER_NOTE_MARKS_ATTR: () => (/* binding */ CLUSTER_NOTE_MARKS_ATTR),\n/* harmony export */   CLUSTER_STYLE_ATTR: () => (/* binding */ CLUSTER_STYLE_ATTR),\n/* harmony export */   CLUSTER_TAG_MARKS_ATTR: () => (/* binding */ CLUSTER_TAG_MARKS_ATTR),\n/* harmony export */   GUTTER_CLUSTER_MARKER_WIDTH_PX: () => (/* binding */ GUTTER_CLUSTER_MARKER_WIDTH_PX),\n/* harmony export */   GUTTER_GAP_PX: () => (/* binding */ GUTTER_GAP_PX),\n/* harmony export */   GUTTER_RESERVE_FLOOR_PX: () => (/* binding */ GUTTER_RESERVE_FLOOR_PX),\n/* harmony export */   GUTTER_RESERVE_PX: () => (/* binding */ GUTTER_RESERVE_PX),\n/* harmony export */   MARKER_BOOKMARK_ATTR: () => (/* binding */ MARKER_BOOKMARK_ATTR),\n/* harmony export */   MARKER_CLASS: () => (/* binding */ MARKER_CLASS),\n/* harmony export */   MARKER_NOTE_ATTR: () => (/* binding */ MARKER_NOTE_ATTR),\n/* harmony export */   MARKER_TAG_COUNT_ATTR: () => (/* binding */ MARKER_TAG_COUNT_ATTR),\n/* harmony export */   PHONE_GUTTER_MARKER_WIDTH_PX: () => (/* binding */ PHONE_GUTTER_MARKER_WIDTH_PX),\n/* harmony export */   PHONE_GUTTER_RESERVE_BASE_PX: () => (/* binding */ PHONE_GUTTER_RESERVE_BASE_PX),\n/* harmony export */   PHONE_GUTTER_RESERVE_EM: () => (/* binding */ PHONE_GUTTER_RESERVE_EM),\n/* harmony export */   PHONE_GUTTER_RESERVE_PX: () => (/* binding */ PHONE_GUTTER_RESERVE_PX),\n/* harmony export */   REFLOW_EVENT: () => (/* binding */ REFLOW_EVENT),\n/* harmony export */   TRUNCATION_MARKER_CLASS: () => (/* binding */ TRUNCATION_MARKER_CLASS),\n/* harmony export */   applyNoteTagMarker: () => (/* binding */ applyNoteTagMarker),\n/* harmony export */   applyTruncationMarker: () => (/* binding */ applyTruncationMarker),\n/* harmony export */   buildBookmarkMarker: () => (/* binding */ buildBookmarkMarker),\n/* harmony export */   buildNoteTagMarker: () => (/* binding */ buildNoteTagMarker),\n/* harmony export */   buildTruncationMarker: () => (/* binding */ buildTruncationMarker),\n/* harmony export */   clusterComposition: () => (/* binding */ clusterComposition),\n/* harmony export */   clusterNoteTagMarkers: () => (/* binding */ clusterNoteTagMarkers),\n/* harmony export */   getClusterPresentation: () => (/* binding */ getClusterPresentation),\n/* harmony export */   initNoteTagMarkerReflow: () => (/* binding */ initNoteTagMarkerReflow),\n/* harmony export */   isBookmarkMarker: () => (/* binding */ isBookmarkMarker),\n/* harmony export */   markHasNote: () => (/* binding */ markHasNote),\n/* harmony export */   markHasTags: () => (/* binding */ markHasTags),\n/* harmony export */   positionNoteTagMarker: () => (/* binding */ positionNoteTagMarker),\n/* harmony export */   repositionNoteTagMarkers: () => (/* binding */ repositionNoteTagMarkers),\n/* harmony export */   setClusterPresentation: () => (/* binding */ setClusterPresentation)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_toArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/toArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/toArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/trim */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/is-array */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/from */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/filter */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_number_parse_int__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/number/parse-int */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/number/parse-int.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_number_parse_int__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_number_parse_int__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/parse-float */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/slice */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/some */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _utilities_i18n__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utilities/i18n */ \"./resources/js/utilities/i18n.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Reader note/tag marker (#3094, right-margin placement #3127).\n *\n * A subtle, muted icon that marks a highlight carrying a note and/or tags so a\n * reader can tell — while reading, before clicking — which highlights have:\n *\n *   - fa-note-sticky  when the mark has a 
129non-empty note\n *   - fa-tag          when the mark has tags\n *   - both            when it has both\n *   - nothing         when it has neither\n *\n * The marker is appended to the highlight's FIRST rendered <mark> segment and\n * positioned absolutely into the right margin / gutter, vertically aligned to\n * the first line of the highlight, so it never obstructs the running text\n * (which the old inline placement did when a highlight wrapped or ended\n * mid-paragraph). The position is JS-computed from the first segment's rect and\n * must be recomputed on window resize and reader font-size / theme changes —\n * see initNoteTagMarkerReflow() and repositionNoteTagMarkers().\n *\n * The marker reuses the highlight's existing open path: it stays a DOM child of\n * the <mark>, whose click handler (capture phase) opens the options popup / note\n * editor, so a tap/click on the marker engages the highlight without any extra\n * wiring even though it is visually lifted into the gutter. Keyboard users get\n * the same behaviour via Enter/Space.\n *\n * CRITICAL — restore safety (#2806): highlight restore counts CHARACTERS via\n * char-based textOffsets. The marker is a zero-text element (icons only, labels\n * live in attributes), so keeping it inside the <mark> adds no text and never\n * shifts the offsets of this or any later mark. It is added to a single visual\n * segment only (a mark id can render as multiple <mark> segments) and\n * re-application is idempotent, so a repaint never duplicates it.\n *\n * Decoupled from annotations.js internals (takes a plain mark shape + optional\n * i18n adapter) so it can be unit-tested in isolation.\n */\n\n\nvar MARKER_CLASS = 'annotation-note-marker';\n// The truncation warning shares MARKER_CLASS so the gutter positioning and the\n// reflow pass below cover it too, and adds its own class so the two markers can\n// be told apart when refreshing one without disturbing the other (#4300).\nvar TRUNCATION_MARKER_CLASS = 'annotation-truncation-marker';\nvar ICON_CLASS = 'annotation-note-marker__icon';\n// A marker standing in for every note/tag marker on its line (#4469). Its\n// count is rendered by a ::after pseudo-element reading data-mark-count —\n// never as text, which would shift char-based textOffsets (#2806).\nvar CLUSTER_CLASS = 'annotation-marker-cluster';\n// A marker folded into the cluster above it: kept in the DOM (hidden by CSS)\n// rather than deleted, so the next reflow can rebuild the grouping from the\n// per-mark markers when a re-wrap puts them on different lines.\nvar CLUSTERED_CLASS = 'annotation-marker-clustered';\nvar CLUSTER_COUNT_ATTR = 'data-mark-count';\n// ⚠ THROWAWAY A/B (#4517). Two candidate cluster presentations, switchable from\n// the chooser so stakeholders can compare them live:\n//   'union'  — union glyphs + one mark count, composition stated in the label\n//   'counts' — a count beside EACH glyph, no combined badge\n// #4517 deletes the loser, this attribute, and the switch. Do not build on it.\nvar CLUSTER_STYLE_ATTR = 'data-cluster-style';\nvar CLUSTER_STYLE_STORAGE_KEY = 'mb.clusterPresentationAB';\nvar CLUSTER_STYLE_DEFAULT = 'union';\n// Per-glyph count for the 'counts' presentation. An attribute, never text —\n// Font Awesome draws the glyph with ::before, so ::after is free (#2806).\nvar CLUSTER_GLYPH_COUNT_ATTR = 'data-glyph-count';\n// How many MARKS on the line carry each property. Aggregated from the folded\n// markers' own data-has-note / data-tag-count, which the chooser already reads.\nvar CLUSTER_NOTE_MARKS_ATTR = 'data-note-marks';\nvar CLUSTER_TAG_MARKS_ATTR = 'data-tag-marks';\n// Which cluster a folded marker belongs to, recorded at collapse time. The\n// chooser (#4470) has to enumerate exactly one line's markers, and document-order\n// adjacency (\"the hidden markers after this cluster\") is not a membership test —\n// a page with several clustered lines gives no boundary between them.\nvar CLUSTER_MEMBER_ATTR = 'data-cluster-of';\n// What the mark carries, parked on the marker so the chooser can label a row\n// without re-reading the mark. Attributes are invisible to the char-based\n// textOffsets walk (#2806); a tag count rendered as text would not be.\nvar MARKER_NOTE_ATTR = 'data-has-note';\nvar MARKER_TAG_COUNT_ATTR = 'data-tag-count';
129\n// Marks a glyph borrowed from a line-mate, so unclustering can take back\n// exactly what clustering added and leave the marker's own glyphs alone.\nvar CLUSTER_ICON_ATTR = 'data-cluster-icon';\n// The marker's own label, parked while the cluster label is in use.\nvar CLUSTER_PREV_LABEL_ATTR = 'data-cluster-prev-label';\nvar NOTE_GLYPH_CLASS = 'fa-note-sticky';\nvar TAG_GLYPH_CLASS = 'fa-tag';\n// Reader bookmark folded into the same gutter cluster (#4707, epic #1548). A\n// bookmark is a POSITION on a line, not an annotation, so it carries its own\n// glyph and its own count, but it still folds into the ONE cluster icon a line's\n// note/tag markers already collapse into — never a second icon in the gutter.\nvar BOOKMARK_MARKER_CLASS = 'annotation-bookmark-marker';\nvar BOOKMARK_GLYPH_CLASS = 'fa-bookmark';\n// Parked on the marker so the count logic and the chooser can tell a bookmark\n// from a note/tag marker without re-reading the source object. An attribute, not\n// text — invisible to the char-based textOffsets walk (#2806).\nvar MARKER_BOOKMARK_ATTR = 'data-is-bookmark';\n// How many BOOKMARKS on the line the cluster folded in, mirrored on the cluster\n// exactly the way data-note-marks / data-tag-marks are (#4707).\nvar CLUSTER_BOOKMARK_MARKS_ATTR = 'data-bookmark-marks';\n// A bookmark marker's data-marker-for is prefixed so it can never collide with a\n// highlight's numeric mark id: applyNoteTagMarker() removes markers by\n// `[data-marker-for=\"<id>\"]`, and an un-prefixed bookmark sharing a mark's id\n// would be torn down by a note/tag repaint.\nvar BOOKMARK_MARKER_FOR_PREFIX = 'bookmark-';\nvar CONTENT_WRAPPER_SELECTOR = '#content-wrapper';\n// The rendered text column — NOT #ministry-text, which is a plain block filling\n// the grid cell (book-text.scss:3). The running text is `.section`, capped at\n// 80ch and centred (book-text.scss:229-231), so on a desktop width it is far\n// narrower than its parent and #ministry-text's right edge is nowhere near the\n// text's (#4451: measured 1006 vs 1225 at a 1280 viewport).\nvar TEXT_COLUMN_SELECTOR = '#ministry-text .section';\n// The right-hand line of the gutter: the marker may sit past the text but must\n// not cross this. #ministry-text is the element that produces it — the <hr>\n// under the book title (reader.php) and the bookmark icon (reader-bookmark.php,\n// `text-align: right`) are both its direct children, so all three share a right\n// edge and that edge is the line the ticket names.\nvar GUTTER_EDGE_SELECTOR = '#ministry-text';\nvar REFLOW_EVENT = 'annotations:reflow-markers';\n// Space between the reader text column's right edge and the marker, so the\n// icons sit clearly off the text in the gutter.\nvar GUTTER_GAP_PX = 8;\n\n/**\n * The widest a gutter marker ever gets, in CSS pixels (#4545, method from #4533).\n *\n * NOT a single glyph. A note-only or tags-only marker is one glyph and a\n * note+tags marker is two, but when several annotated highlights share a LINE\n * they collapse into one cluster marker carrying both glyphs plus a count badge\n * — nearly three times the single-glyph marker. Sizing the gutter from anything\n * narrower is wrong the moment a cluster forms, which is how the defect hides:\n * a cluster needs two annotated highlights on one line to appear at all.\n *\n * Measured in a real engine at 360px and 390px viewports with the real Font\n * Awesome webfont: one glyph 16px, note+tags 28px, cluster 42.58px (48.16px if\n * the badge ever carries a two-digit count). Rounded up to 48 so a sub-pixel or\n * font-dependent widening does not put the marker straight back over the text.\n *\n * RE-MEASURED at 360/390/639/640/768/1024 (#4788), which asked whether 48 was\n * inherited rather than earned. It is earned: one glyph 14-16px, note+tags\n * 27-28px, cluster 42.58px at every width, and 48.16px for a two-digit count.\n * The marker is NARROWER above the phone breakpoint, not wider, so 48 bounds\n * every viewport. It is not oversized and shrinking it would buy ~5px of column\n * against the widest thing it has to hold.\n *\n * RE-MEASURED after #4824 shrank the glyph 10% (0.72em -> 0.648em), same six\n * widths: one glyph 13-16px, note+tags 25-27px, cluster 40.58px at >=640 and\n * 41.58px at <=639, two-digit count 46.16px / 47.16px. Phone runs 1px wider\n * than desktop because #4824 widened the phone padding so the 10% glyph\n * reduction did not shrink the touch target.\n *\n * The two-digit case NO LONGER overhangs. Before #4824 it measured 48.16px,\n * 0.16px past this budget and held only by the 56px reserve; it is now 46.16px\n * and inside. The budget stays at 48 anyway — the headroom guards a\n * font-dependent widening, and #4517 could add a per-glyph count that is wider\n * than the single union badge these figures assume.\n *\n * The tests still assert the two-digit cluster against the RESERVE rather than\n * this budget, which is now a stricter check than it needs to be — deliberately\n * left that way.\n *\n * This is a BUDGET, not a measurement the code reads back: the stylesheet\n * mirrors it to reserve the gutter (book-text.scss), and\n * tests/e2e/note-tag-marker-gutter.stylesheet.spec.js re-measures the real\n * cluster against it, so a restyle that widens the marker or narrows the gutter\n * fails there instead of silently landing on the running text again.\n */\nvar GUTTER_CLUSTER_MARKER_WIDTH_PX = 48;\n\n/**\n * The gutter the stylesheet must reserve for those markers (#4545, widened in\n * scope by #4788).\n *\n * positionNoteTagMarker() places from `columnRect.right + GUTTER_GAP_PX` and\n * right-aligns inside the gutter's far line when that overflows, so the room a\n * marker needs is the gap plus its own width. There is no second gap on the far\n * side: a clamped marker sits flush against that line, which is #ministry-text's\n * edge, itself already inset from the screen by the grid's padding.\n *\n * Named PHONE_GUTTER_RESERVE_PX until #4788, because #4545 reserved it below\n * 640px only. Measurement showed wider viewports need it too — at 640px and\n * 768px the 80ch cap on .section has not engaged, so the column fills its\n * parent and the marker was clamped 11px into the running text. book-text.scss\n * now reserves it at every width; below 640px on the right alone, above it on\n * both sides so the column stays centred.\n *\n * ⚠ AS OF #4826 THIS IS THE 1rem CASE, NOT THE WHOLE RULE — exactly as\n * PHONE_GUTTER_RESERVE_PX already was. book-text.scss reserves\n * `max(52px, 3.5em)` from 640px up, which resolves to 56px only while the\n * reader font size is 1rem. 3.5em was chosen because it IS 56px at 1rem, so\n * the default-size layout every earlier ticket measured is unchanged.\n */\nvar GUTTER_RESERVE_PX = GUTTER_GAP_PX + GUTTER_CLUSTER_MARKER_WIDTH_PX;\n\n/**\n * The floor under that em term, in CSS pixels (#4826).\n *\n * `3.5em` is narrower than the widest marker below roughly 0.93rem, because\n * the marker is an affine function of the reader size rather than a\n * proportional one — it carries fixed padding that does not shrink with the\n * glyph. Measured in Chromium with the real Font Awesome webfont at 640 and\n * 768px, the two-digit cluster plus its 8px gap needs 51.03px at 0.9rem,\n * 51.27px at 0.92rem and 52.1px at the 0.93rem crossover, against a 3.5em term\n * worth only 50.4px at 0.9rem. 52 covers every reader size below the crossover\n * — the requirement falls as the font shrinks, so the crossover is the worst\n * case — and it is still load-bearing at 0.3rem, where 3.5em is 16.8px.\n *\n * Nothing reads this at runtime. It exists so the Sass mirror in\n * book-text.scss has something to be checked against, the same way\n * PHONE_GUTTER_RESERVE_PX does for the phone rule.\n */\nvar GUTTER_RESERVE_FLOOR_PX = 52;\n\n/**\n * The same budget at PHONE widths, where ONE glyph is painted (#4831, #4713).\n *\n * The 48px above is set by a cluster carrying a two-digit count badge. app.scss\n * suppresses that badge below 640px (#4831) and paints a single glyph below it\n * (#4713), so the widest shape a phone can render is one glyph — never a pair,\n * and never a badge.\n *\n * Re-measured in Chromium with the real Font Awesome webfont at 360/390/414,\n * identical at all three:\n *\n *   note only            11.00px   fa-note-sticky\n *   tags only            11.00px   fa-tag\
129n *   bookmark only        10.00px   fa-bookmark\n *   note AND tags        14.00px   fa-layer-group  <- the widest phone shape\n *\n * 15 rounds that up by a pixel, for the same reason 48 rounds up the desktop\n * worst case: a sub-pixel or font-dependent widening must not put the marker\n * back over the text.\n *\n * ⚠ RE-MEASURED AT 15 BY #4840, WHICH NARROWED THE MARKER BOX ITSELF. The\n * figures above were 16 / 16 / 15 / 17 / 19 against a 20px budget while the\n * phone padding was `6px 3.5px`; it is now `7px 1px`, trading 2.5px per side\n * of width for 2px of tap-target HEIGHT — which the gutter does not pay for,\n * because vertical padding costs it nothing (#4545). See the phone block in\n * app.scss for the accessibility trade, which is real and is written out\n * there rather than implied here.\n *\n * The truncation warning is not re-listed because it could not be re-measured\n * on that pass; it was 17px at the old padding, so it is ~12px now. It has\n * never set this budget — the combined glyph is the widest shape at every\n * reader size — so the omission changes nothing that depends on this number.\n *\n * ⚠ THE BOTH-CASE GLYPH IS WIDER THAN EITHER GLYPH IT REPLACES, which is why\n * this is 20 and not 17. fa-layer-group is a 576-unit glyph against 448 for\n * fa-note-sticky and fa-tag; a narrower combined mark would buy 3px more, and\n * was not worth a silhouette that reads as \"one of the other two\" at 10px.\n * The measured saving is still 8px per side against #4831's 28px budget.\n *\n * WHY ONE GLYPH IS THE RIGHT THING TO DROP TO: the reserve is a permanent cost\n * on every line, both sides; the second glyph is a distinction that a varying\n * single glyph can carry instead. What is NOT acceptable is dropping to one\n * UNDIFFERENTIATED glyph — that loses the note-vs-tag signal #3094 exists for,\n * on every annotated line. See the phone block in app.scss.\n */\nvar PHONE_GUTTER_MARKER_WIDTH_PX = 15;\n\n/**\n * The phone gutter the stylesheet reserves — 28px at the default reader size.\n *\n * ⚠ THIS IS THE 1rem CASE, NOT THE WHOLE RULE. book-text.scss reserves\n * `calc(11px + 0.75em)`, which is 23px only while the reader font size is 1rem.\n * The em term is mandatory rather than decorative: font-size.js:159-200 steps\n * the reader size with no clamp and the glyph is 0.648em, so the marker width\n * tracks it at roughly 2 + 12F px, while a flat px reserve does not move.\n * positionNoteTagMarker() below right-aligns into whatever room is left rather\n * than hiding or wrapping, so an undersized reserve walks the icon onto the\n * running text — the #4788 signature, reproduced against this reserve by the\n * flat-23px red control in the gutter spec.\n *\n * Nothing here changes behaviour: no code path reads these. They exist so the\n * Sass mirror in book-text.scss has something to be checked against, and\n * tests/e2e/note-tag-marker-gutter.stylesheet.spec.js asserts the computed\n * phone margin equals this value at 1rem and re-measures the em term across a\n * font-size sweep.\n */\nvar PHONE_GUTTER_RESERVE_PX = GUTTER_GAP_PX + PHONE_GUTTER_MARKER_WIDTH_PX;\n\n/**\n * The two terms of the phone reserve's AFFINE expression (#4840).\n *\n * These replace PHONE_GUTTER_RESERVE_FLOOR_PX, which existed because the rule\n * was `max(floor, em)`. It is now `calc(11px + 0.75em)` and an affine\n * expression has no floor — so the constant was not renumbered, it was\n * retired.\n *\n * WHY THE max() HAD TO GO, which is the whole of #4840's width win: the\n * requirement is `gap + marker`, and the marker carries fixed padding that\n * does not scale with the glyph, so the requirement is AFFINE in the reader\n * size F. A `max()` of a constant and a pure proportional can touch an affine\n * line at exactly one point and must overshoot everywhere else, by more and\n * more as F grows. Measured against the old `max(24px, 1.75em)`: it reserved\n * 56px at 2.0rem for a 38px requirement — 18px per side, 36px of reading\n * column, spent on nothing.\n *\n * AND THE max() WAS 0.8px SHORT AT 0.9rem (25.19px against a 26px\n * requirement), so the clamp fired there and the marker came to rest 7.17px\n * from the text while every other size got the full 8px gap. The affine\n * expression clears the requirement at every size, so the gap is now exactly\n * 8.00px everywhere — that defect is fixed by construction, not patched.\n *\n * Measured in Chromium with the real webfont at 360/390/414 across 0.3-3.0rem;\n * the full table is beside the Sass variables in book-text.scss. The spare\n * room never goes negative and never exceeds 2px, with the worst realistic\n * case 0.80px at 0.90rem.\n *\n * ⚠ DO NOT RE-FIT THESE FROM THE GLYPH SIZE. The widths behind them are\n * integers the engine produced, and a fit derived from `0.648em` alone\n * undershoots four of the eleven samples — which is precisely the mistake\n * #4826 documents. Re-measure instead.\n *\n * Nothing reads these at runtime; they are the mirror the Sass values are\n * checked against.\n */\nvar PHONE_GUTTER_RESERVE_BASE_PX = 11;\nvar PHONE_GUTTER_RESERVE_EM = 0.75;\nvar RESIZE_DEBOUNCE_MS = 100;\n// How close two anchor tops must be to count as the same line when grouping for\n// a cluster (#4707
129). A bookmark marker's block anchor and a note marker's inline\n// anchor report one visual line's top a pixel or two apart; a real line-height\n// is an order of magnitude larger, so this never merges two distinct lines.\nvar LINE_GROUP_TOLERANCE_PX = 3;\n// Vertical separation when a highlight's note/tag marker and its truncation\n// warning resolve to the same line — a single-line, single-segment highlight.\nvar MARKER_COLLISION_OFFSET_PX = 16;\nvar reflowInstalled = false;\n\n/**\n * Whether a mark carries a non-empty note.\n *\n * @param {Object} mark\n * @returns {boolean}\n */\nfunction markHasNote(mark) {\n  var _context;\n  return typeof (mark === null || mark === void 0 ? void 0 : mark.note) === 'string' && _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default()(_context = mark.note).call(_context).length > 0;\n}\n\n/**\n * Whether a mark carries one or more tags.\n *\n * @param {Object} mark\n * @returns {boolean}\n */\nfunction markHasTags(mark) {\n  return _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_2___default()(mark === null || mark === void 0 ? void 0 : mark.tags) && mark.tags.length > 0;\n}\n\n/**\n * Resolve a translation, falling back to English when the key is missing.\n * The shared t() helper returns the key itself when unresolved, so an\n * identical return is treated as \"not found\".\n *\n * @param {Object|null} i18n  Adapter with a t(key) method, or null.\n * @param {string} key\n * @param {string} fallback\n * @returns {string}\n */\nfunction translate(i18n, key, fallback) {\n  var resolver = typeof (i18n === null || i18n === void 0 ? void 0 : i18n.t) === 'function' ? i18n.t : _utilities_i18n__WEBPACK_IMPORTED_MODULE_13__.t;\n  var value = resolver(key);\n  return value && value !== key ? value : fallback;\n}\n\n/**\n * Build the inline marker element for a mark, or null when the mark has no\n * note and no tags.\n *\n * @param {Object} mark  Mark shape with optional `note` (string) and `tags` (array).\n * @param {Object} [params]\n * @param {Object|null} [params.i18n=null]  Object with a t(key) method, or null.\n * @returns {HTMLElement|null}\n */\nfunction buildNoteTagMarker(mark) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n    _ref$i18n = _ref.i18n,\n    i18n = _ref$i18n === void 0 ? null : _ref$i18n;\n  var hasNote = markHasNote(mark);\n  var hasTags = markHasTags(mark);\n  if (!hasNote && !hasTags) {\n    return null;\n  }\n  var noteLabel = translate(i18n, 'annotations.has_note', 'Has a note');\n  var tagsLabel = translate(i18n, 'annotations.has_tags', 'Has tags');\n  var labels = [];\n  if (hasNote) {\n    labels.push(noteLabel);\n  }\n  if (hasTags) {\n    labels.push(tagsLabel);\n  }\n  var label = labels.join(', ');\n  var marker = _buildMarkerShell(mark.id, label);\n  if (hasNote) {\n    marker.setAttribute(MARKER_NOTE_ATTR, 'true');\n    marker.appendChild(_buildIcon(NOTE_GLYPH_CLASS));\n  }\n  if (hasTags) {\n    marker.setAttribute(MARKER_TAG_COUNT_ATTR, String(mark.tags.length));\n    marker.appendChild(_buildIcon(TAG_GLYPH_CLASS));\n  }\n  return marker;\n}\n\n/**\n * Build the gutter marker for a reader bookmark (#4707, epic #1548).\n *\n * Same zero-text contract as every gutter marker: the bookmark's name lives in\n * attributes and the aria-label, never as a text node, so it can sit inside the\n * running content without shifting the char-based textOffsets restore relies on\n * (#2806). It carries the bookmark glyph and folds into the same same-line\n * cluster as note/tag markers, adding to the count rather than a second icon.\n *\n * @param {Object} bookmark  Bookmark shape with `id` and optional `name`.\n * @param {Object} [params]\n * @param {Object|null} [params.i18n=null]  Object with a t(key) method, or null.\n * @returns {HTMLElement|null}  The marker, or null when the bookmark has no id.\n */\nfunction buildBookmarkMarker(bookmark) {\n  var _context2, _context3;\n  var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n    _ref2$i18n = _ref2.i18n,\n    i18n = _ref2$i18n === void 0 ? null : _ref2$i18n;\n  if (!bookmark || bookmark.id === undefined || bookmark.id === null) {\n    return null;\n  }\n  var rawName = typeof bookmark.name === 'string' ? _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default()(_context2 = bookmark.name).call(_context2) : '';\n  var name = rawName || translate(i18n, 'annotations.bookmark_default_name', 'Bookmark');\n  var label = translate(i18n, 'annotations.bookmark_marker_label', 'Bookmark: :name').replace(':name', name);\n  var marker = _buildMarkerShell(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default()(_context3 = \"\".concat(BOOKMARK_MARKER_FOR_PREFIX)).call(_context3, bookmark.id), label);\n  marker.classList.add(BOOKMARK_MARKER_CLASS);\n  marker.setAttribute(MARKER_BOOKMARK_ATTR, 'true');\n  marker.setAttribute('data-bookmark-id', String(bookmark.id));\n  marker.setAttribute('data-bookmark-name', name);\n  marker.appendChild(_buildIcon(BOOKMARK_GLYPH_CLASS));\n  return marker;\n}\n\n/**\n * Whether a gutter marker stands for a bookmark rather than a 
129note/tag mark.\n *\n * @param {HTMLElement} marker\n * @returns {boolean}\n */\nfunction isBookmarkMarker(marker) {\n  return typeof (marker === null || marker === void 0 ? void 0 : marker.getAttribute) === 'function' && marker.getAttribute(MARKER_BOOKMARK_ATTR) === 'true';\n}\n\n/**\n * The composition of a line's gutter markers: the total plus how many carry a\n * note, carry tags, or are a bookmark (#4707).\n *\n * Pure attribute reads — no layout — so the cluster COUNT logic can be\n * unit-tested without a real engine. `_collapseLine()` uses it as the single\n * source of the numbers it writes onto the cluster, and the same numbers gate\n * which glyphs the union carries.\n *\n * @param {Iterable<HTMLElement>} markers\n * @returns {{total: number, noteMarks: number, tagMarks: number, bookmarkMarks: number}}\n */\nfunction clusterComposition(markers) {\n  var list = _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_2___default()(markers) ? markers : _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_4___default()(markers || []);\n  var noteMarks = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5___default()(list).call(list, function (marker) {\n    var _marker$getAttribute;\n    return (marker === null || marker === void 0 || (_marker$getAttribute = marker.getAttribute) === null || _marker$getAttribute === void 0 ? void 0 : _marker$getAttribute.call(marker, MARKER_NOTE_ATTR)) === 'true';\n  }).length;\n  var tagMarks = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5___default()(list).call(list, function (marker) {\n    var _marker$getAttribute2;\n    return (_babel_runtime_corejs3_core_js_stable_number_parse_int__WEBPACK_IMPORTED_MODULE_6___default()((marker === null || marker === void 0 || (_marker$getAttribute2 = marker.getAttribute) === null || _marker$getAttribute2 === void 0 ? void 0 : _marker$getAttribute2.call(marker, MARKER_TAG_COUNT_ATTR)) || '0', 10) || 0) > 0;\n  }).length;\n  var bookmarkMarks = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5___default()(list).call(list, function (marker) {\n    return isBookmarkMarker(marker);\n  }).length;\n  return {\n    total: list.length,\n    noteMarks: noteMarks,\n    tagMarks: tagMarks,\n    bookmarkMarks: bookmarkMarks\n  };\n}\n\n/**\n * Build the shared gutter-marker shell: a zero-text, keyboard-reachable span\n * whose label lives entirely in attributes (#2806).\n *\n * @param {string|number} markId\n * @param {string} label\n * @returns {HTMLElement}\n * @private\n */\nfunction _buildMarkerShell(markId, label) {\n  var marker = document.createElement('span');\n  marker.className = MARKER_CLASS;\n  marker.setAttribute('data-marker-for', String(markId));\n  marker.setAttribute('role', 'button');\n  marker.setAttribute('tabindex', '0');\n  marker.setAttribute('aria-label', label);\n  marker.title = label;\n\n  // Do not start a text selection when the reader presses on the marker; the\n  // click still fires and bubbles/captures to the <mark> to open the options.\n  marker.addEventListener('mousedown', function (event) {\n    event.preventDefault();\n  });\n\n  // Keyboard parity: Enter/Space engage the highlight, same as a click.\n  marker.addEventListener('keydown', function (event) {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      marker.click();\n    }\n  });\n  return marker;\n}\n\n/**\n * Build the truncation warning marker for a partially rendered highlight (#4300).\n *\n * A highlight that anchored in some of its blocks but not all is kept rather\n * than discarded, so it must say so: this triangle sits in the gutter at the END\n * of what did render, where the highlight was cut short. The note/tag marker\n * anchors to the highlight's first line, this one to its last, so a highlight\n * carrying a note AND a truncation shows both without them overlapping.\n *\n * Zero-text, like every gutter marker — highlight restore counts characters\n * (#2806), so a label in the text would shift this mark's offsets and those of\n * every later mark on the page.\n *\n * @param {Object} mark  Mark shape with `id`.\n * @param {Object} [params]\n * @param {Object|null} [params.i18n=null]  Object with a t(key) method, or null.\n * @returns {HTMLElement}\n */\nfunction buildTruncationMarker(mark) {\n  var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n    _ref3$i18n = _ref3.i18n,\n    i18n = _ref3$i18n === void 0 ? null : _ref3$i18n;\n  var label = translate(i18n, 'annotations.highlight_truncated', 'Part of this highlight could not be shown');\n  var marker = _buildMarkerShell(mark === null || mark === void 0 ? void 0 : mark.id, label);\n  marker.classList.add(TRUNCATION_MARKER_CLASS);\n  marker.setAttribute('data-anchor-line', 'last');\n  marker.appendChild(_buildIcon('fa-triangle-exclamation'));\n  return marker;\n}\n\n/**\n * Apply (or refresh) the truncation warning for a mark within a root element.\n *\n * A no-op unless the render path flagged a segment with data-truncated, so a\n * fully rendered highlight never shows a warning. Idempotent: an existing\n * warning for this mark id is removed first, and the note/tag marker is left\n * alone.\n *\n * @param {ParentNode} root\n * @param {Object} mark  Mark shape with `id`.\n * @param {Object} [options]  Passed through to buildTruncationMarker.\n * @returns {HTMLElement|null}\n */\nfunction applyTruncationMarker(root, mark) {\n  var _context4, _context5;\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  if (!root || mark === null || mark === undefined || mark.id === undefined || mark.id === null) {\n    return null;\n  }\n  var markerFor = String(mark.id);\n  var markerForSelector = markerFor.replace(/[\"\\\\]/g, '\\\\$&');\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context4 = root.querySelectorAll(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default()(_context5 = \".\".concat(TRUNCATION_MARKER_CLASS, \"[data-marker-for=\\\"\")).call(_context5, markerForSelector, \"\\\"]\"))).call(_context4, function (el) {\n    return el.remove();\n  });\n  var truncated = root.querySelectorAll(\"mark[data-id=\\\"\".concat(markerForSelector, \"\\\"][data-truncated]\"));\n  if (truncated.length === 0) {\n    return null;\n  }\n\n  // Anchor to the LAST flagged segment: that is where the highlight stopped.\n  var segment = truncated[truncated.length - 1];\n  var marker = buildTruncationMarker(mark, options);\n  segment.appendChild(marker);\n  positionNoteTagMarker(marker);\n  return marker;\n}\n\n/**\n * Build a decorative FontAwesome icon (announced via the marker's aria-label).\n *\n * @param {string} glyphClass\n * @returns {HTMLElement}\n * @private\n */\nfunction _buildIcon(glyphClass) {\n  var _context6;\n  var icon = document.createElement('i');\n  icon.className = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default()(_context6 = \"fa-solid \".concat(glyphClass, \" \")).call(_context6, ICON_CLASS);\n  icon.setAttribute('aria-hidden', 'true');\n  return icon;\n}\n\n/**\n * Apply (or refresh) the marker for a mark within a root element.\n *\n * Idempotent: any existing marker for this mark id is removed first, so a\n * repaint never duplicates the marker and a note/tags removal clears it. The\n * marker lands on the FIRST <mark> segment for the id (document order) and is\n * then positioned into the right gutter aligned to that segment's first line.\n *\n * @param {ParentNode} root  Element/document to search within.\n * @param {Object} mark      Mark shape with `id` and optional `note`/`tags`.\n * @param {Object} [options] Passed through to buildNoteTagMarker (e.g. { i18n }).\n * @returns {HTMLElement|null}  The applied marker, or null when none was added.\n */\nfunction applyNoteTagMarker(root, mark) {\n  var _context7, _context8, _context9;\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  // A user-driven change (saving a note, saving tags) must re-measure and\n  // regroup the WHOLE line, not just this mark. See regroupIfNeeded() below.\n  var reflow = options.reflow === true;\n  if (!root || mark === null || mark === undefined || mark.id === undefined || mark.id === null) {\n    return null;\n  }\n  var markerFor = String(mark.id);\n  // Escape the string-special chars for a quoted attribute-value selector so a\n  // non-numeric id can never break the selector or throw a SyntaxError.\n  var markerForSelector = markerFor.replace(/[\"\\\\]/g, '\\\\$&');\n\n  // Removing a marker that was part of a cluster invalidates that cluster: it\n  // either carried the count for its line or was hidden behind one, so the\n  // line has to be regrouped once the new marker is 
129in place (#4469). Only\n  // that case pays for a regrouping pass, so the render loop's first paint —\n  // where nothing is clustered yet — does not do it once per mark.\n  var wasClustered = false;\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context7 = root.querySelectorAll(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default()(_context8 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default()(_context9 = \".\".concat(MARKER_CLASS, \"[data-marker-for=\\\"\")).call(_context9, markerForSelector, \"\\\"]:not(.\")).call(_context8, TRUNCATION_MARKER_CLASS, \")\"))).call(_context7, function (el) {\n    wasClustered = wasClustered || el.classList.contains(CLUSTER_CLASS) || el.classList.contains(CLUSTERED_CLASS);\n    el.remove();\n  });\n  var regroupIfNeeded = function regroupIfNeeded(result) {\n    if (reflow) {\n      // wasClustered cannot see this case: a mark gaining its FIRST note or tag\n      // has no previous marker to inspect, so it is false, no regrouping ran,\n      // and the new icon landed on the same gutter point as a line-mate's —\n      // invisible behind it, with no cluster and no count. Removing the last\n      // note/tag has the mirror problem: the line keeps a stale grouping.\n      // Only a full pass re-measures every marker and rebuilds the grouping,\n      // and it also unfolds hidden markers so they have a box to measure.\n      // Confined to the update paths so the render loop's first paint still\n      // pays for exactly one clustering pass rather than one per mark.\n      repositionNoteTagMarkers(root);\n    } else if (wasClustered) {\n      clusterNoteTagMarkers(root);\n    }\n    return result;\n  };\n  var segments = root.querySelectorAll(\"mark[data-id=\\\"\".concat(markerForSelector, \"\\\"]\"));\n  if (segments.length === 0) {\n    return regroupIfNeeded(null);\n  }\n  var marker = buildNoteTagMarker(mark, options);\n  if (!marker) {\n    return regroupIfNeeded(null);\n  }\n\n  // Anchor to the FIRST segment: its first line is where the highlight begins,\n  // which is where the gutter icon should sit.\n  segments[0].appendChild(marker);\n  positionNoteTagMarker(marker);\n  return regroupIfNeeded(marker);\n}\n\n/**\n * Position a single marker into the right gutter, aligned to the first line of\n * its owning <mark> segment.\n *\n * THREE reference elements are involved and no two of them are the same\n * element. Conflating any pair of them has already shipped a bug, so keep them\n * apart:\n *\n *   - the ORIGIN (#4414), which the browser resolves the marker's top/left\n *     against. For an absolutely positioned element that is its nearest\n *     POSITIONED ancestor, which is the <mark> itself: annotations.js gives\n *     every rendered mark an inline `position: relative` so the options popup —\n *     a child of the <mark> since #618 — has a containing block. Measuring\n *     against #content-wrapper while the browser resolved against the <mark>\n *     put the marker hundreds of pixels off-screen, silently: it was created,\n *     styled and visible, and only its coordinates were wrong.\n *   - the BOUNDS (#4414), which is the reader content column\n *     (#content-wrapper). This is the outer extent the marker may travel to,\n *     and does not change with whatever the origin happens to be.\n *   - the GUTTER TARGET (#4451), which is the rendered text column the marker\n *     aims to 
129sit just past (TEXT_COLUMN_SELECTOR), together with the line it\n *     may not cross on the far side (GUTTER_EDGE_SELECTOR). This is NOT the\n *     bounds: the bounds is the full-width wrapper, so clamping against it\n *     alone never fired and let the marker sit far out in the page margin.\n *     It is NOT the origin either — it moves with the reader's layout, not\n *     with which <mark> the marker happens to hang off.\n *\n * The horizontal placement prefers the space just past the text column's right\n * edge (the gutter), and keeps the whole marker inside the gutter's far line.\n * On narrow / mobile widths where there is no room for it there, it falls back\n * to just past the end of the highlight's first line, clamped inside the bounds\n * so it never runs off-screen.\n *\n * Safe to call with a null/detached marker (no-op) and safe under jsdom (rects\n * read as zero); the real alignment is verified in a browser.\n *\n * @param {HTMLElement|null} marker\n * @returns {void}\n */\nfunction positionNoteTagMarker(marker) {\n  if (!marker || typeof marker.getBoundingClientRect !== 'function') {\n    return;\n  }\n  var segment = marker.parentElement;\n  if (!segment || typeof segment.getBoundingClientRect !== 'function') {\n    return;\n  }\n  var bounds = _boundsFor(segment);\n  if (!bounds || typeof bounds.getBoundingClientRect !== 'function') {\n    return;\n  }\n\n  // Set the position BEFORE resolving the origin: offsetParent answers for the\n  // element's current position value, and an absolutely positioned element is\n  // the only case whose answer we want.\n  marker.style.position = 'absolute';\n  var origin = _originFor(marker, segment, bounds);\n  var originRect = origin.getBoundingClientRect();\n  var boundsRect = bounds.getBoundingClientRect();\n  var lineRects = typeof segment.getClientRects === 'function' ? segment.getClientRects() : [];\n  // The truncation warning marks where the highlight was cut short, so it aligns\n  // to the segment's LAST line; every other marker aligns to its first (#4300).\n  var anchorsToLastLine = marker.getAttribute('data-anchor-line') === 'last';\n  var fallbackRect = segment.getBoundingClientRect();\n  var firstLine = lineRects.length ? lineRects[anchorsToLastLine ? lineRects.length - 1 : 0] : fallbackRect;\n  var anchorTop = Math.round(firstLine.top);\n  var top = anchorTop + _collisionOffsetFor(marker, bounds, anchorTop);\n  marker.style.top = \"\".concat(Math.round(top - originRect.top), \"px\");\n\n  // GUTTER TARGET — the rendered text column, and the line on its far side.\n  // The highlight's own first line is the fallback for content that renders no\n  // .section (the reader always does; a stray caller might not).\n  var textColumn = _resolveGutterElement(segment, bounds, TEXT_COLUMN_SELECTOR);\n  var columnRect = textColumn ? textColumn.getBoundingClientRect() : firstLine;\n  var gutterEdge = _resolveGutterElement(segment, bounds, GUTTER_EDGE_SELECTOR);\n  // Never past the bounds, whatever the gutter edge reports.\n  var gutterRight = gutterEdge ? Math.min(gutterEdge.getBoundingClientRect().right, boundsRect.right) : boundsRect.right;\n  var markerWidth = marker.offsetWidth || 0;\n  // Worked out in VIEWPORT space, where the gutter and the bounds live, then\n  // converted into the origin's space at the very end.\n  var left = columnRect.right + GUTTER_GAP_PX;\n\n  // No room in the gutter (mobile, or a panel that has taken it): right-align\n  // the marker in whatever room is left, still measured from the LAYOUT — never\n  // from the highlight (#4533).\n  //\n  // This used to pin the marker past `firstLine.right`, the end of the\n  // highlight's own line box, which makes `left` depend on WHERE ON THE LINE\n  // the reader happened to highlight. A highlight near the START of a line put\n  // its icons in the middle of the running text: measured at a 390px viewport,\n  // a highlight ending at x=98.8 got its marker at x=107, mid-paragraph.\n  //\n  // Only a highlight's VERTICAL position may influence its marker. `top` above\n  // is anchored to the highlight's own line and must stay that way; `left` is a\n  // property of the gutter, and two marks on one line therefore resolve to the\n  // same x at every width — which is what lets clustering group them (#4499).\n  if (left + markerWidth > gutterRight) {\n    left = Math.max(boundsRect.left, gutterRight - markerWidth);\n  }\n  marker.style.left = \"\".concat(Math.round(left - originRect.left), \"px\");\n  _snapToViewportPoint(marker, origin, left, top);\n}\n\n/**\n * Correct the marker onto the viewport point it was computed for, when the\n * ORIGIN is an inline box that has been split across lines.\n *\n * A wrapped <mark> generates several inline boxes, and the containing block\n * they establish is NOT the union rect that getBoundingClientRect() reports:\n * Chromium resolves `left` against the FIRST box's start edge, and the two\n * disagree by the whole indent of that first line. Measured on a wrapped\n * highlight at a 390px viewport (#4451): rects [225..362] and [28..56], union\n * left 28, resolved-against left 225 — so a correctly computed, correctly\n * clamped position landed 197px off-screen. Engines differ here (the spec asks\n * for the union), so rather than reimplement any one engine's rule, this reads\n * the position the browser actually produced and closes the residual.\n *\n * Deliberately ski
129pped for an unfragmented origin — the overwhelmingly common\n * case — so the extra layout read is only paid where it is needed, and skipped\n * again where there is no layout at all (jsdom reports empty rects).\n *\n * @param {HTMLElement} marker\n * @param {Element} origin\n * @param {number} intendedLeft  Viewport x the marker's left edge should land on.\n * @param {number} intendedTop   Viewport y the marker's top edge should land on.\n * @returns {void}\n * @private\n */\nfunction _snapToViewportPoint(marker, origin, intendedLeft, intendedTop) {\n  var fragments = typeof origin.getClientRects === 'function' ? origin.getClientRects() : [];\n  if (fragments.length < 2) {\n    return;\n  }\n  var placed = marker.getBoundingClientRect();\n  if (!placed.width && !placed.height) {\n    return;\n  }\n  marker.style.left = \"\".concat(Math.round((_babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_8___default()(marker.style.left) || 0) + (intendedLeft - placed.left)), \"px\");\n  marker.style.top = \"\".concat(Math.round((_babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_8___default()(marker.style.top) || 0) + (intendedTop - placed.top)), \"px\");\n}\n\n/**\n * Resolve one of the gutter-defining elements for a marker.\n *\n * Prefers the segment's own ancestor over a lookup from the bounds, so a marker\n * always measures the column it is actually sitting in rather than the first\n * match anywhere on the page.\n *\n * @param {Element} segment  The <mark> the marker belongs to.\n * @param {Element} bounds\n * @param {string} selector\n * @returns {Element|null}\n * @private\n */\nfunction _resolveGutterElement(segment, bounds, selector) {\n  return typeof segment.closest === 'function' && segment.closest(selector) || typeof bounds.querySelector === 'function' && bounds.querySelector(selector) || null;\n}\n\n/**\n * The reader content column a marker is placed within — the gutter it aims for\n * and the extent it is clamped to, independent of what it is positioned against.\n *\n * @param {Element} segment  The <mark> the marker belongs to.\n * @returns {Element|null}\n * @private\n */\nfunction _boundsFor(segment) {\n  return typeof segment.closest === 'function' && segment.closest(CONTENT_WRAPPER_SELECTOR) || segment.offsetParent || segment.parentElement || null;\n}\n\n/**\n * The element the browser resolves an absolutely positioned marker against.\n *\n * Prefers the browser's own answer (offsetParent), then an explicitly computed\n * nearest positioned ancestor — which is what jsdom and any other layout-less\n * environment can still answer — and only then the content wrapper, whose\n * `position: relative` (#3127) is what makes that last fallback meaningful.\n *\n * @param {HTMLElement} marker\n * @param {Element} segment\n * @param {Element} bounds\n * @returns {Element}\n * @private\n */\nfunction _originFor(marker, segment, bounds) {\n  var offsetParent = marker.offsetParent;\n  if (offsetParent && typeof offsetParent.getBoundingClientRect === 'function') {\n    return offsetParent;\n  }\n  return _nearestPositionedAncestor(segment) || bounds;\n}\n\n/**\n * Walk up from an element to the first ancestor with a non-static position.\n *\n * Only `position` is considered: a transform / filter / will-change ancestor\n * also establishes a containing block, but the reader content uses none of\n * those, and offsetParent — preferred above — does not account for them either.\n *\n * @param {Element} element\n * @returns {Element|null}\n * @private\n */\nfunction _nearestPositionedAncestor(element) {\n  var _element$ownerDocumen;\n  var view = (_element$ownerDocumen = element.ownerDocument) === null || _element$ownerDocumen === void 0 ? void 0 : _element$ownerDocumen.defaultView;\n  if (!view || typeof view.getComputedStyle !== 'function') {\n    return null;\n  }\n  var node = element;\n  while (node && node.nodeType === 1 && node !== element.ownerDocument.documentElement) {\n    var _view$getComputedStyl = view.getComputedStyle(node),\n      position = _view$getComputedStyl.position;\n    if (position && position !== 'static') {\n      return node;\n    }\n    node = node.parentElement;\n  }\n  return null;\n}\n\n/**\n * Nudge a truncation warning clear of its highlight's note/tag marker when both\n * resolve to the same line — a single-line, single-segment highlight can carry\n * a note and a truncation at once.\n *\n * Compares the two markers' ANCHOR lines, never the
129ir current positions: a\n * marker that has already been nudged no longer overlaps, so reading live rects\n * would drop the offset on the next reflow and put it back on the one after,\n * making the icon flicker between two positions on every resize.\n *\n * The comparison is made in VIEWPORT space (#4414). The two markers hang off\n * different <mark> segments — first line vs last — so each is positioned\n * against a different containing block, and tops expressed in their own origins\n * are not comparable.\n *\n * @param {HTMLElement} marker\n * @param {Element} bounds  The reader content column to search for the companion.\n * @param {number} anchorTop  This marker's anchor line top, in viewport space.\n * @returns {number} Pixels to add to the computed top.\n * @private\n */\nfunction _collisionOffsetFor(marker, bounds, anchorTop) {\n  var _context10, _context11;\n  if (!marker.classList.contains(TRUNCATION_MARKER_CLASS)) {\n    return 0;\n  }\n  var markerFor = (marker.getAttribute('data-marker-for') || '').replace(/[\"\\\\]/g, '\\\\$&');\n  var companion = typeof bounds.querySelector === 'function' ? bounds.querySelector(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default()(_context10 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default()(_context11 = \".\".concat(MARKER_CLASS, \"[data-marker-for=\\\"\")).call(_context11, markerFor, \"\\\"]:not(.\")).call(_context10, TRUNCATION_MARKER_CLASS, \")\")) : null;\n  var companionSegment = companion === null || companion === void 0 ? void 0 : companion.parentElement;\n  if (!companionSegment || typeof companionSegment.getClientRects !== 'function') {\n    return 0;\n  }\n  var rects = companionSegment.getClientRects();\n  var companionLine = rects.length ? rects[0] : companionSegment.getBoundingClientRect();\n  var companionTop = Math.round(companionLine.top);\n  return companionTop === anchorTop ? MARKER_COLLISION_OFFSET_PX : 0;\n}\n\n/**\n * Recompute the gutter position of every marker within a root (default:\n * document). Called after layout changes — window resize, reader font-size or\n * theme changes — so the icons stay aligned to their highlight's first line.\n *\n * @param {ParentNode} [root=document]\n * @returns {void}\n */\nfunction repositionNoteTagMarkers() {\n  var _context12;\n  var root = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n  var scope = root || document;\n  if (typeof scope.querySelectorAll !== 'function') {\n    return;\n  }\n  // Take any existing clusters apart BEFORE measuring: a folded marker is\n  // hidden, and a hidden element has no box to position against.\n  _unclusterNoteTagMarkers(scope);\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context12 = scope.querySelectorAll(\".\".concat(MARKER_CLASS))).call(_context12, function (marker) {\n    return positionNoteTagMarker(marker);\n  });\n  clusterNoteTagMarkers(scope);\n}\n\n/**\n * Collapse the note/tag markers that share a line into a single cluster\n * marker carrying a count (#4469).\n *\n * A gutter marker normally resolves the text column's right edge plus the gap\n * for x, and a y taken from its anchor line, so two highlights on one line put\n * their markers on exactly the same point: the lower one is invisible AND\n * unclickable. This is the interim fix — the chooser that lets a reader pick\n * between them is #4470. Until then the cluster IS the first mark's own\n * marker, so the existing \"let the click reach the <mark>\" path opens that\n * highlight with no extra wiring.\n *\n * Sharing a line is a NECESSARY but not a SUFFICIENT reason to fold (#4499):\n * the shared x holds only while the gutter placement succeeds, and where it\n * does not the markers sit side by side. So a line is grouped by anchor top and\n * then split again by which markers actually overlap — see _collidingGroups().\n *\n * Lines are compared in VIEWPORT space (#4414): markers hang off different\n * <mark>
129 segments with different containing blocks, so tops expressed in their\n * own origins are not comparable.\n *\n * The folded markers are HIDDEN, not deleted. A resize re-wraps the lines and\n * the grouping has to be recomputed from scratch; a pass that destroyed its own\n * inputs could never give a marker back when its line-mate moved away.\n *\n * Truncation warnings are excluded deliberately: they are amber and report a\n * problem rather than a property, and burying one in a count would hide it.\n *\n * Idempotent — each run starts by taking the previous run's clusters apart, so\n * it rebuilds from the per-mark markers and can never cluster a cluster.\n *\n * @param {ParentNode} [root=document]\n * @param {Object} [params]\n * @param {Object|null} [params.i18n=null]  Object with a t(key) method, or null.\n * @returns {void}\n */\n/**\n * ⚠ THROWAWAY A/B (#4517). The cluster presentation currently selected.\n *\n * Persisted so it survives navigation during a stakeholder walkthrough. Storage\n * can throw (Safari private mode), so every access is guarded and falls back to\n * the default rather than breaking the reader.\n *\n * @returns {'union'|'counts'}\n */\nfunction getClusterPresentation() {\n  try {\n    var stored = typeof localStorage !== 'undefined' ? localStorage.getItem(CLUSTER_STYLE_STORAGE_KEY) : null;\n    return stored === 'counts' || stored === 'union' ? stored : CLUSTER_STYLE_DEFAULT;\n  } catch (error) {\n    return CLUSTER_STYLE_DEFAULT;\n  }\n}\n\n/**\n * ⚠ THROWAWAY A/B (#4517). Select a cluster presentation.\n *\n * @param {'union'|'counts'} mode\n * @returns {void}\n */\nfunction setClusterPresentation(mode) {\n  if (mode !== 'union' && mode !== 'counts') {\n    return;\n  }\n  try {\n    if (typeof localStorage !== 'undefined') {\n      localStorage.setItem(CLUSTER_STYLE_STORAGE_KEY, mode);\n    }\n  } catch (error) {\n    // Non-fatal: the presentation still applies for this page view.\n  }\n}\nfunction clusterNoteTagMarkers() {\n  var _context13, _context14;\n  var root = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n  var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n    _ref4$i18n = _ref4.i18n,\n    i18n = _ref4$i18n === void 0 ? null : _ref4$i18n;\n  var scope = root || document;\n  if (typeof scope.querySelectorAll !== 'function') {\n    return;\n  }\n  _unclusterNoteTagMarkers(scope);\n  var lines = new (_babel_runtime_corejs3_core_js_stable_map__WEBPACK_IMPORTED_MODULE_9___default())();\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context13 = scope.querySelectorAll(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default()(_context14 = \".\".concat(MARKER_CLASS, \":not(.\")).call(_context14, TRUNCATION_MARKER_CLASS, \")\"))).call(_context13, function (marker) {\n    var anchorTop = _anchorTopFor(marker);\n    if (anchorTop === null) {\n      return;\n    }\n    // Snap to a nearby existing line rather than keying on an exact top\n    // (#4707). A note/tag marker anchors to its <mark> (an inline box) while a\n    // bookmark marker anchors to its content <p>/<li> (a block box), and the\n    // two report the SAME visual line's top a pixel apart. Distinct text lines\n    // are a whole line-height apart, so a few-pixel tolerance groups the mixed\n    // box types without ever merging two real lines. `_collidingGroups()` then\n    // still splits anything that does not actually overlap.\n    var nearestTop = _nearestLineKey(lines, anchorTop);\n    var key = nearestTop === null ? anchorTop : nearestTop;\n    var line = lines.get(key);\n    if (line) {\n      line.push(marker);\n    } else {\n      lines.set(key, [marker]);\n    }\n  });\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(lines).call(lines, function (markers) {\n    var _context15;\n    if (markers.length < 2) {\n      return;\n    }\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context15 = _collidingGroups(markers)).call(_context15, function (group) {\n      if (group.length > 1) {\n        _collapseLine(group, {\n          i18n: i18n\n        });\n      }\n    });\n  });\n}\n\n/**\n * Split one line's markers into the sets that actually sit on top of each other.\n *\n * Sharing an anchor line is NOT the same as coinciding (#4499). Every marker\n * resolves the same gutter x only while the gutter placement succeeds; where\n * there is no room for it there, positionNoteTagMarker() falls back to just past\n * the end of each highlight's OWN first line, which is a per-highlight x. At a\n * 390px viewport that measured x 276-298 for one marker and x 345-367 for its\n * line-mate: side by side, both drawn, both clickable. Folding one of those away\n * destroys a working marker and leaves the reader with fewer icons than before\n * clustering existed.\n *\n * Markers are visited in document order and each joins the first group it\n * overlaps, so a line with two separate pile-ups yields two clusters rather than\n * one bogus one.\n *\n * @param {HTMLElement[]} markers  One line's markers, in document order.\n * @returns {HTMLElement[][]} One group per pile-up; singletons stay unclustered.\n * @private\n */\nfunction _collidingGroups(markers) {\n  var groups = [];\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(markers).call(markers, function (marker) {\n    var group = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_10___default()(groups).call(groups, function (members) {\n      return _markersCoincide(members[0], marker);\n    });\n    if (group) {\n      group.push(marker);\n    } else {\n      groups.push([marker]);\n    }\n  });\n  return groups;\n}\n\n/**\n * Do two markers occupy the same space on screen?\n *\n * An unmeasurable box — jsdom, or an element with no layout — reports zeros,\n * which cannot be told apart from a real box at the origin. Those are treated as\n * coinciding, which keeps the anch
129or-line grouping this replaces: the module's\n * standing rule is that a layout-less environment must not change behaviour.\n *\n * @param {HTMLElement} first\n * @param {HTMLElement} second\n * @returns {boolean}\n * @private\n */\nfunction _markersCoincide(first, second) {\n  var a = first.getBoundingClientRect();\n  var b = second.getBoundingClientRect();\n  if (!a.width && !a.height || !b.width && !b.height) {\n    return true;\n  }\n  return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;\n}\n\n/**\n * The existing line-group key within tolerance of a top, or null when none is\n * close enough. The closest key wins, so a marker never joins a farther line\n * when a nearer one exists (#4707).\n *\n * @param {Map<number, HTMLElement[]>} lines\n * @param {number} top\n * @returns {number|null}\n * @private\n */\nfunction _nearestLineKey(lines, top) {\n  var best = null;\n  var bestDistance = LINE_GROUP_TOLERANCE_PX + 1;\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(lines).call(lines, function (markers, key) {\n    var distance = Math.abs(key - top);\n    if (distance <= LINE_GROUP_TOLERANCE_PX && distance < bestDistance) {\n      best = key;\n      bestDistance = distance;\n    }\n  });\n  return best;\n}\n\n/**\n * The viewport top of a marker's anchor line, or null when the segment has no\n * layout to read.\n *\n * A layout-less environment (jsdom, or content that is not displayed) reports\n * every rect as zero, which would fold every marker on the page into one bogus\n * cluster. Refusing to group an unlaid-out segment keeps that from happening.\n *\n * @param {HTMLElement} marker\n * @returns {number|null}\n * @private\n */\nfunction _anchorTopFor(marker) {\n  var segment = marker.parentElement;\n  if (!segment || typeof segment.getBoundingClientRect !== 'function') {\n    return null;\n  }\n  var rects = typeof segment.getClientRects === 'function' ? segment.getClientRects() : [];\n  var line = rects.length ? rects[0] : segment.getBoundingClientRect();\n  if (!line || !line.width && !line.height) {\n    return null;\n  }\n  return Math.round(line.top);\n}\n\n/**\n * Turn one line's markers into a single cluster: the first keeps its place and\n * takes the union of the line's glyphs plus the count, the rest are hidden.\n *\n * @param {HTMLElement[]} markers  Two or more markers sharing an anchor line.\n * @param {Object} [params]\n * @param {Object|null} [params.i18n=null]  Object with a t(key) method, or null.\n * @returns {void}\n * @private\n */\nfunction _collapseLine(markers) {\n  var _context16;\n  var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n    _ref5$i18n = _ref5.i18n,\n    i18n = _ref5$i18n === void 0 ? null : _ref5$i18n;\n  var _markers = (0,_babel_runtime_corejs3_helpers_toArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(markers),\n    cluster = _markers[0],\n    folded = _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_11___default()(_markers).call(_markers, 1);\n  var clusterFor = cluster.getAttribute('data-marker-for') || '';\n  // Read BEFORE anything changes: a marker that was never drawable in the first\n  // place (a layout-less environment) says nothing about whether folding broke\n  // it, so the fail-safe below must not fire for it.\n  var wasDrawn = _isDrawn(cluster);\n\n  // The line's composition, aggregated from the markers' OWN attributes — used\n  // both to bound the glyph union below and, unchanged, to label the cluster.\n  var _clusterComposition = clusterComposition(markers),\n    noteMarks = _clusterComposition.noteMarks,\n    tagMarks = _clusterComposition.tagMarks,\n    bookmarkMarks = _clusterComposition.bookmarkMarks;\n  var hasAnnotations = noteMarks > 0 || tagMarks > 0;\n  if (_babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_12___default()(markers).call(markers, function (marker) {\n    return _hasGlyph(marker, NOTE_GLYPH_CLASS);\n  }) && !_hasGlyph(cluster, NOTE_GLYPH_CLASS)) {\n    var icon = _buildIcon(NOTE_GLYPH_CLASS);\n    icon.setAttribute(CLUSTER_ICON_ATTR, 'true');\n    cluster.insertBefore(icon, cluster.firstChild);\n  }\n  if (_babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_12___default()(markers).call(markers, function (marker) {\n    return _hasGlyph(marker, TAG_GLYPH_CLASS);\n  }) && !_hasGlyph(cluster, TAG_GLYPH_CLASS)) {\n    var _icon = _buildIcon(TAG_GLYPH_CLASS);\n    _icon.setAttribute(CLUSTER_ICON_ATTR, 'true');\n    cluster.appendChild(_icon);\n  }\n  // A bookmark contributes its glyph ONLY to a bookmark-only cluster (#4707
129).\n  // When the line also carries note/tag glyphs, showing a third glyph would push\n  // the cluster past the 48px gutter budget the phone layout reserves (#4545) —\n  // so on a mixed line the bookmark rides in the COUNT and the modal's bookmark\n  // section instead, keeping the width cost of this phase zero. A mixed line's\n  // survivor is always an annotation marker (a bookmark marker is appended after\n  // the <mark> in document order), so this never has to strip a survivor's own\n  // bookmark glyph.\n  if (!hasAnnotations && _babel_runtime_corejs3_core_js_stable_instance_some__WEBPACK_IMPORTED_MODULE_12___default()(markers).call(markers, function (marker) {\n    return _hasGlyph(marker, BOOKMARK_GLYPH_CLASS);\n  }) && !_hasGlyph(cluster, BOOKMARK_GLYPH_CLASS)) {\n    var _icon2 = _buildIcon(BOOKMARK_GLYPH_CLASS);\n    _icon2.setAttribute(CLUSTER_ICON_ATTR, 'true');\n    cluster.insertBefore(_icon2, cluster.firstChild);\n  }\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(folded).call(folded, function (marker) {\n    marker.classList.add(CLUSTERED_CLASS);\n    // Explicit membership, so the chooser can ask for exactly this line's\n    // markers rather than inferring it from document-order adjacency.\n    marker.setAttribute(CLUSTER_MEMBER_ATTR, clusterFor);\n  });\n  cluster.classList.add(CLUSTER_CLASS);\n  cluster.setAttribute(CLUSTER_COUNT_ATTR, String(markers.length));\n  cluster.setAttribute(CLUSTER_PREV_LABEL_ATTR, cluster.getAttribute('aria-label') || '');\n\n  // These counts survive the glyph union above, which discards the composition\n  // the chooser and the label need.\n  cluster.setAttribute(CLUSTER_NOTE_MARKS_ATTR, String(noteMarks));\n  cluster.setAttribute(CLUSTER_TAG_MARKS_ATTR, String(tagMarks));\n  cluster.setAttribute(CLUSTER_BOOKMARK_MARKS_ATTR, String(bookmarkMarks));\n\n  // ⚠ THROWAWAY A/B (#4517) — selects which presentation the CSS renders.\n  var presentation = getClusterPresentation();\n  cluster.setAttribute(CLUSTER_STYLE_ATTR, presentation);\n  _applyGlyphCounts(cluster, {\n    presentation: presentation,\n    noteMarks: noteMarks,\n    tagMarks: tagMarks\n  });\n\n  // The label states the ACTUAL composition, which the glyphs cannot: a line\n  // with one noted mark and two tagged ones looks identical to one where both\n  // carry both. Parts are emitted only when non-zero, so it never reads\n  // \"0 with a note\".\n  var detailParts = [];\n  if (bookmarkMarks > 0) {\n    detailParts.push(translate(i18n, 'annotations.cluster_marker_bookmarks', ':count bookmarks').replace(':count', String(bookmarkMarks)));\n  }\n  if (noteMarks > 0) {\n    detailParts.push(translate(i18n, 'annotations.cluster_marker_notes', ':count with a note').replace(':count', String(noteMarks)));\n  }\n  if (tagMarks > 0) {\n    detailParts.push(translate(i18n, 'annotations.cluster_marker_tags', ':count with tags').replace(':count', String(tagMarks)));\n  }\n  var base = translate(i18n, 'annotations.cluster_marker_label', ':count highlights on this line').replace(':count', String(markers.length));\n  var label = detailParts.length > 0 ? _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_3___default()(_context16 = \"\".concat(base, \" \\u2014 \")).call(_context16, detailParts.join(', ')) : base;\n  cluster.setAttribute('aria-label', label);\n  cluster.title = label;\n\n  // Re-clamp (#4499). The count badge and any borrowed glyph are added above,\n  // AFTER the position was computed, so the gutter clamp in\n  // positionNoteTagMarker() was worked out for a box ~30px narrower than the one\n  // that ends up on screen (measured 16px -> 46px). At an 820px viewport that\n  // put the cluster 25px past the gutter edge it is clamped never to cross, out\n  // over the page margin.\n  positionNoteTagMarker(cluster);\n\n  // A line must never come out of clustering with nothing drawn in it (#4499).\n  // The survivor is chosen by document order and its drawability was never\n  // checked, so anything that makes it unrenderable took the whole line's icons\n  // with it — strictly worse than the overlap clustering replaced, because an\n  // overlap still leaves one icon to click. Undoing the fold here restores the\n  // pre-#4469 behaviour for that line instead.\n  if (!wasDrawn || _isDrawn(cluster)) {\n    return;\n  }\n  _restoreClusterMarker(cluster);\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(folded).call(folded, function (marker) {\n    return _restoreFoldedMarker(marker);\n  });\n}\n\n/**\n * Does this element generate a box the reader can see?\n *\n * @param {HTMLElement} element\n * @returns {boolean}\n * @private\n */\nfunction _isDrawn(element) {\n  return typeof element.getClientRects === 'function' && element.getClientRects().length > 0;\n}\n\n/**\n * Whether a marker already shows a given glyph.\n *\n * @param {HTMLElement} marker\n * @param {string} glyphClass\n * @returns {boolean}\n * @private\n */\n/**\n * ⚠ THROWAWAY A/B (#4517). Put a per-glyph count on the cluster's icons for the\n * 'counts' presentation, and strip it for 'union'.\n *\n * The count is an ATTRIBUTE, drawn by CSS as an ::after pseudo-element — never a\n * text node. Highlight restore counts CHARACTERS via char-based textOffsets\n * (#2806), so a literal \"2\" inside the <mark> would shift this mark's offsets\n * and every later mark's on the page. Font Awesome draws its glyph with\n * ::before, so ::after is free.\n *\n * @param {HTMLElement} cluster\n * @param {Object} params\n * @param {'union'|'counts'} params.presentation\n * @param {number} params.noteMarks\n * @param {number} params.tagMarks\n * @returns {void}\n * @private\n */\nfunction _applyGlyphCounts(cluster, _ref6) {\n  var _context17;\n  var presentation = _ref6.presentation,\n    noteMarks = _ref6.noteMarks,\n    tagMarks = _ref6.tagMarks;\n  var noteIcon = cluster.querySelector(\".\".concat(NOTE_GLYPH_CLASS));\n  var tagIcon = cluster.querySelector(\".\".concat(TAG_GLYPH_CLASS));\n\n  // Always clear first: switching presentation must not leave a stale c
129ount.\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context17 = [noteIcon, tagIcon]).call(_context17, function (icon) {\n    return icon === null || icon === void 0 ? void 0 : icon.removeAttribute(CLUSTER_GLYPH_COUNT_ATTR);\n  });\n  if (presentation !== 'counts') {\n    return;\n  }\n  if (noteIcon && noteMarks > 0) {\n    noteIcon.setAttribute(CLUSTER_GLYPH_COUNT_ATTR, String(noteMarks));\n  }\n  if (tagIcon && tagMarks > 0) {\n    tagIcon.setAttribute(CLUSTER_GLYPH_COUNT_ATTR, String(tagMarks));\n  }\n}\nfunction _hasGlyph(marker, glyphClass) {\n  return Boolean(marker.querySelector(\".\".concat(glyphClass)));\n}\n\n/**\n * Restore every clustered marker to its own glyphs, label and visibility.\n *\n * Takes back exactly what _collapseLine() added — the borrowed glyphs carry a\n * marker attribute — so a marker that has been clustered and uncluttered is\n * indistinguishable from one that never was.\n *\n * @param {ParentNode} scope\n * @returns {void}\n * @private\n */\nfunction _unclusterNoteTagMarkers(scope) {\n  var _context18, _context19;\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context18 = scope.querySelectorAll(\".\".concat(CLUSTER_CLASS))).call(_context18, function (cluster) {\n    return _restoreClusterMarker(cluster);\n  });\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context19 = scope.querySelectorAll(\".\".concat(CLUSTERED_CLASS))).call(_context19, function (marker) {\n    return _restoreFoldedMarker(marker);\n  });\n}\n\n/**\n * Give one cluster back its own glyphs, count-free label and plain identity.\n *\n * @param {HTMLElement} cluster\n * @returns {void}\n * @private\n */\nfunction _restoreClusterMarker(cluster) {\n  var _context20, _context21;\n  cluster.classList.remove(CLUSTER_CLASS);\n  cluster.removeAttribute(CLUSTER_COUNT_ATTR);\n  // ⚠ THROWAWAY A/B (#4517) — an unclustered marker must carry no cluster state.\n  cluster.removeAttribute(CLUSTER_STYLE_ATTR);\n  cluster.removeAttribute(CLUSTER_NOTE_MARKS_ATTR);\n  cluster.removeAttribute(CLUSTER_TAG_MARKS_ATTR);\n  cluster.removeAttribute(CLUSTER_BOOKMARK_MARKS_ATTR);\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context20 = cluster.querySelectorAll(\"[\".concat(CLUSTER_GLYPH_COUNT_ATTR, \"]\"))).call(_context20, function (icon) {\n    return icon.removeAttribute(CLUSTER_GLYPH_COUNT_ATTR);\n  });\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_7___default()(_context21 = cluster.querySelectorAll(\"[\".concat(CLUSTER_ICON_ATTR, \"]\"))).call(_context21, function (icon) {\n    return icon.remove();\n  });\n  var ownLabel = cluster.getAttribute(CLUSTER_PREV_LABEL_ATTR);\n  if (ownLabel !== null) {\n    cluster.setAttribute('aria-label', ownLabel);\n    cluster.title = ownLabel;\n    cluster.removeAttribute(CLUSTER_PREV_LABEL_ATTR);\n  }\n}\n\n/**\n * Put one folded marker back on screen.\n *\n * @param {HTMLElement} marker\n * @returns {void}\n * @private\n */\nfunction _restoreFoldedMarker(marker) {\n  marker.classList.remove(CLUSTERED_CLASS);\n  // Membership is recorded at collapse time so the chooser can enumerate one\n  // line's markers (#4470). Clearing it here leaves an unclustered marker\n  // indistinguishable from one that was never folded, and covers the #4499\n  // fail-safe unfold path for free.\n  marker.removeAttribute(CLUSTER_MEMBER_ATTR);\n}\n\n/**\n * Install the one-time reflow wiring so gutter markers re-align after layout\n * changes: a debounced window resize listener and a custom reflow event other\n * modules (e.g. font-size.js) can dispatch after changing reader layout.\n *\n * Idempotent — repeated calls register the listeners only once.\n *\n * @param {Window} [win=window]\n * @returns {void}\n */\nfunction initNoteTagMarkerReflow() {\n  var win = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : typeof window !== 'undefined' ? window : null;\n  if (reflowInstalled || !win || typeof win.addEventListener !== 'function') {\n    return;\n  }\n  reflowInstalled = true;\n  var timer = null;
129\n  var scheduleReposition = function scheduleReposition() {\n    if (timer !== null && typeof win.clearTimeout === 'function') {\n      win.clearTimeout(timer);\n    }\n    timer = win.setTimeout(function () {\n      timer = null;\n      repositionNoteTagMarkers();\n    }, RESIZE_DEBOUNCE_MS);\n  };\n  win.addEventListener('resize', scheduleReposition);\n  win.addEventListener(REFLOW_EVENT, function () {\n    return repositionNoteTagMarkers();\n  });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYW5ub3RhdGlvbnMvbm90ZS10YWctbWFya2VyLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0F
129BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUtBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0F
129BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUtBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL2Fubm90YXRpb25zL25vdGUtdGFnLW1hcmtlci5qcz8wZDA3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVhZGVyIG5vdGUvdGFnIG1hcmtlciAoIzMwOTQsIHJpZ2h0LW1hcmdpbiBwbGFjZW1lbnQgIzMxMjcpLlxuICpcbiAqIEEgc3VidGxlLCBtdXRlZCBpY29uIHRoYXQgbWFya3MgYSBoaWdobGlnaHQgY2FycnlpbmcgYSBub3RlIGFuZC9vciB0YWdzIHNvIGFcbiAqIHJlYWRlciBjYW4gdGVsbCDigJQgd2hpbGUgcmVhZGluZywgYmVmb3JlIGNsaWNraW5nIOKAlCB3aGljaCBoaWdobGlnaHRzIGhhdmU6XG4gKlxuICogICAtIGZhLW5vdGUtc3RpY2t5ICB3aGVuIHRoZSBtYXJrIGhhcyBhIG5vbi1lbXB0eSBub3RlXG4gKiAgIC0gZmEtdGFnICAgICAgICAgIHdoZW4gdGhlIG1hcmsgaGFzIHRhZ3NcbiAqICAgLSBib3RoICAgICAgICAgICAgd2hlbiBpdCBoYXMgYm90aFxuICogICAtIG5vdGhpbmcgICAgICAgICB3aGVuIGl0IGhhcyBuZWl0aGVyXG4gKlxuICogVGhlIG1hcmtlciBpcyBhcHBlbmRlZCB0byB0aGUgaGlnaGxpZ2h0J3MgRklSU1QgcmVuZGVyZWQgPG1hcms+IHNlZ21lbnQgYW5kXG4gKiBwb3NpdGlvbmVkIGFic29sdXRlbHkgaW50byB0aGUgcmlnaHQgbWFyZ2luIC8gZ3V0dGVyLCB2ZXJ0aWNhbGx5IGFsaWduZWQgdG9cbiAqIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBoaWdobGlnaHQsIHNvIGl0IG5ldmVyIG9ic3RydWN0cyB0aGUgcnVubmluZyB0ZXh0XG4gKiAod2hpY2ggdGhlIG9sZCBpbmxpbmUgcGxhY2VtZW50IGRpZCB3aGVuIGEgaGlnaGxpZ2h0IHdyYXBwZWQgb3IgZW5kZWRcbiAqIG1pZC1wYXJhZ3JhcGgpLiBUaGUgcG9zaXRpb24gaXMgSlMtY29tcHV0ZWQgZnJvbSB0aGUgZmlyc3Qgc2VnbWVudCdzIHJlY3QgYW5kXG4gKiBtdXN0IGJlIHJlY29tcHV0ZWQgb24gd2luZG93IHJlc2l6ZSBhbmQgcmVhZGVyIGZvbnQtc2l6ZSAvIHRoZW1lIGNoYW5nZXMg4oCUXG4gKiBzZWUgaW5pdE5vdGVUYWdNYXJrZXJSZWZsb3coKSBhbmQgcmVwb3NpdGlvbk5vdGVUYWdNYXJrZXJzKCkuXG4gKlxuICogVGhlIG1hcmtlciByZXVzZXMgdGhlIGhpZ2hsaWdodCdzIGV4aXN0aW5nIG9wZW4gcGF0aDogaXQgc3RheXMgYSBET00gY2hpbGQgb2ZcbiAqIHRoZSA8bWFyaz4sIHdob3NlIGNsaWNrIGhhbmRsZXIgKGNhcHR1cmUgcGhhc2UpIG9wZW5zIHRoZSBvcHRpb25zIHBvcHVwIC8gbm90ZVxuICogZWRpdG9yLCBzbyBhIHRhcC9jbGljayBvbiB0aGUgbWFya2VyIGVuZ2FnZXMgdGhlIGhpZ2hsaWdodCB3aXRob3V0IGFueSBleHRyYVxuICogd2lyaW5nIGV2ZW4gdGhvdWdoIGl0IGlzIHZpc3VhbGx5IGxpZnRlZCBpbnRvIHRoZSBndXR0ZXIuIEtleWJvYXJkIHVzZXJzIGdldFxuICogdGhlIHNhbWUgYmVoYXZpb3VyIHZpYSBFbnRlci9TcGFjZS5cbiAqXG4gKiBDUklUSUNBTCDigJQgcmVzdG9yZSBzYWZldHkgKCMyODA2KTogaGlnaGxpZ2h0IHJlc3RvcmUgY291bnRzIENIQVJBQ1RFUlMgdmlhXG4gKiBjaGFyLWJhc2VkIHRleHRPZmZzZXRzLiBUaGUgbWFya2VyIGlzIGEgemVyby10ZXh0IGVsZW1lbnQgKGljb25zIG9ubHksIGxhYmVsc1xuICogbGl2ZSBpbiBhdHRyaWJ1dGVzKSwgc28ga2VlcGluZyBpdCBpbnNpZGUgdGhlIDxtYXJrPiBhZGRzIG5vIHRleHQgYW5kIG5ldmVyXG4gKiBzaGlmdHMgdGhlIG9mZnNldHMgb2YgdGhpcyBvciBhbnkgbGF0ZXIgbWFyay4gSXQgaXMgYWRkZWQgdG8gYSBzaW5nbGUgdmlzdWFsXG4gKiBzZWdtZW50IG9ubHkgKGEgbWFyayBpZCBjYW4gcmVuZGVyIGFzIG11bHRpcGxlIDxtYXJrPiBzZWdtZW50cykgYW5kXG4gKiByZS1hcHBsaWNhdGlvbiBpcyBpZGVtcG90ZW50LCBzbyBhIHJlcGFpbnQgbmV2ZXIgZHVwbGljYXRlcyBpdC5cbiAqXG4gKiBEZWNvdXBsZWQgZnJvbSBhbm5vdGF0aW9ucy5qcyBpbnRlcm5hbHMgKHRha2VzIGEgcGxhaW4gbWFyayBzaGFwZSArIG9wdGlvbmFsXG4gKiBpMThuIGFkYXB0ZXIpIHNvIGl0IGNhbiBiZSB1bml0LXRlc3RlZCBpbiBpc29sYXRpb24uXG4gKi9cblxuaW1wb3J0IHsgdCB9IGZyb20gXCIuLi91dGlsaXRpZXMvaTE4blwiO1xuXG5jb25zdCBNQVJLRVJfQ0xBU1MgPSAnYW5ub3RhdGlvbi1ub3RlLW1hcmtlcic7XG4vLyBUaGUgdHJ1bmNhdGlvbiB3YXJuaW5nIHNoYXJlcyBNQVJLRVJfQ0xBU1Mgc28gdGhlIGd1dHRlciBwb3NpdGlvbmluZyBhbmQgdGhlXG4vLyByZWZsb3cgcGFzcyBiZWxvdyBjb3ZlciBpdCB0b28sIGFuZCBhZGRzIGl0cyBvd24gY2xhc3Mgc28gdGhlIHR3byBtYXJrZXJzIGNhblxuLy8gYmUgdG9sZCBhcGFydCB3aGVuIHJlZnJlc2hpbmcgb25lIHdpdGhvdXQgZGlzdHVyYmluZyB0aGUgb3RoZXIgKCM0MzAwKS5cbmNvbnN0IFRSVU5DQVRJT05fTUFSS0VSX0NMQVNTID0gJ2Fubm90YXRpb24tdHJ1bmNhdGlvbi1tYXJrZXInO1xuY29uc3QgSUNPTl9DTEFTUyA9ICdhbm5vdGF0aW9uLW5vdGUtbWFya2VyX19pY29uJztcbi8vIEEgbWFya2VyIHN0YW5kaW5nIGluIGZvciBldmVyeSBub3RlL3RhZyBtYXJrZXIgb24gaXRzIGxpbmUgKCM0NDY5KS4gSXRzXG4vLyBjb3VudCBpcyByZW5kZXJlZCBieSBhIDo6YWZ0ZXIgcHNldWRvLWVsZW1lbnQgcmVhZGluZyBkYXRhLW1hcmstY291bnQg4oCUXG4vLyBuZXZlciBhcyB0ZXh0LCB3aGljaCB3b3VsZCBzaGlmdCBjaGFyLWJhc2VkIHRleHRPZmZzZXRzICgjMjgwNikuXG5jb25zdCBDTFVTVEVSX0NMQVNTID0gJ2Fubm90YXRpb24tbWFya2VyLWNsdXN0ZXInO1xuLy8gQSBtYXJrZXIgZm9sZGVkIGludG8gdGhlIGNsdXN0ZXIgYWJvdmUgaXQ6IGtlcHQgaW4gdGhlIERPTSAoaGlkZGVuIGJ5IENTUylcbi8vIHJhdGhlciB0aGFuIGRlbGV0ZWQsIHNvIHRoZSBuZXh0IHJlZmxvdyBjYW4gcmVidWlsZCB0aGUgZ3JvdXBpbmcgZnJvbSB0aGVcbi8vIHBlci1tYXJrIG1hcmtlcnMgd2hlbiBhIHJlLXdyYXAgcHV0cyB0aGVtIG9uIGRpZmZlcmVudCBsaW5lcy5cbmNvbnN0IENMVVNURVJFRF9DTEFTUyA9ICdhbm5vdGF0aW9uLW1hcmtlci1jbHVzdGVyZWQnO1xuY29uc3QgQ0xVU1RFUl9DT1VOVF9BVFRSID0gJ2RhdGEtbWFyay1jb3VudCc7XG4vLyDimqAgVEhST1dBV0FZIEEvQiAoIzQ1MTcpLiBUd28gY2FuZGlkYXRlIGNsdXN0ZXIgcHJlc2VudGF0aW9ucywgc3dpdGNoYWJsZSBmcm9tXG4vLyB0aGUgY2hvb3NlciBzbyBzdGFrZWhvbGRlcnMgY2FuIGNvbXBhcmUgdGhlbSBsaXZlOlxuLy8gICAndW5pb24nICDigJQgdW5pb24gZ2x5cGhzICsgb25lIG1hcmsgY291bnQsIGNvbXBvc2l0aW9uIHN0YXRlZCBpbiB0aGUgbGFiZWxcbi8vICAgJ2NvdW50cycg4oCUIGEgY291bnQgYmVzaWRlIEVBQ0ggZ2x5cGgsIG5vIGNvbWJpbmVkIGJhZGdlXG4vLyAjNDUxNyBkZWxldGVzIHRoZSBsb3NlciwgdGhpcyBhdHRyaWJ1dGUsIGFuZCB0aGUgc3dpdGNoLiBEbyBub3QgYnVpbGQgb24gaXQuXG5jb25zdCBDTFVTVEVSX1NUWUxFX0FUVFIgPSAnZGF0YS1jbHVzdGVyLXN0eWxlJztcbmNvbnN0IENMVVNURVJfU1RZTEVfU1RPUkFHRV9LRVkgPSAnbWIuY2x1c3RlclByZXNlbnRhdGlvbkFCJztcbmNvbnN0IENMVVNURVJfU1RZTEVfREVGQVVMVCA9ICd1bmlvbic7XG4vLyBQZXItZ2x5cGggY291bnQgZm9yIHRoZSAnY291bnRzJyBwcmVzZW50YXRpb24uIEFuIGF0dHJpYnV0ZSwgbmV2ZXIgdGV4dCDigJRcbi8vIEZvbnQgQXdlc29tZSBkcmF3cyB0aGUgZ2x5cGggd2l0aCA6OmJlZm9yZSwgc28gOjphZnRlciBpcyBmcmVlICgjMjgwNikuXG5jb25zdCBDTFVTVEVSX0dMWVBIX0NPVU5UX0FUVFIgPSAnZGF0YS1nbHlwaC1jb3VudCc7XG4vLyBIb3cgbWFueSBNQVJLUyBvbiB0aGUgbGluZSBjYXJyeSBlYWNoIHByb3BlcnR5LiBBZ2dyZWdhdGVkIGZyb20gdGhlIGZvbGRlZFxuLy8gbWFya2Vycycgb3duIGRhdGEtaGFzLW5vdGUgLyBkYXRhLXRhZy1jb3VudCwgd2hpY2ggdGhlIGNob29zZXIgYWxyZWFkeSByZWFkcy5cbmNvbnN0IENMVVNURVJfTk9URV9NQVJLU19BVFRSID0gJ2RhdGEtbm90ZS1tYXJrcyc7XG5jb25zdCBDTFVTVEVSX1RBR19NQVJLU19BVFRSID0gJ2RhdGEtdGFnLW1hcmtzJztcbi8vIFdoaWNoIGNsdXN0ZXIgYSBmb2xkZWQgbWFya2VyIGJlbG9uZ3MgdG8sIHJlY29yZGVkIGF0IGNvbGxhcHNlIHRpbWUuIFRoZVxuLy8gY2hvb3NlciAoIzQ0NzApIGhhcyB0byBlbnVtZXJhdGUgZXhhY3RseSBvbmUgbGluZSdzIG1hcmtlcnMsIGFuZCBkb2N1bWVudC1vcmRlclxuLy8gYWRqYWNlbmN5IChcInRoZSBoaWRkZW4gbWFya2VycyBhZnRlciB0aGlzIGNsdXN0ZXJcIikgaXMgbm90IGEgbWVtYmVyc2hpcCB0ZXN0IOKAlFxuLy8gYSBwYWdlIHdpdGggc2V2ZXJhbCBjbHVzdGVyZWQgbGluZXMgZ2l2ZXMgbm8gYm91bmRhcnkgYmV0d2VlbiB0aGVtLlxuY29uc3QgQ0xVU1RFUl9NRU1CRVJfQVRUUiA9ICdkYXRhLWNsdXN0ZXItb2YnO1xuLy8gV2hhdCB0aGUgbWFyayBjYXJyaWVzLCBwYXJrZWQgb24gdGhlIG1hcmtlciBzbyB0aGUgY2hvb3NlciBjYW4gbGFiZWwgYSByb3dcbi8vIHdpdGhvdXQgcmUtcmVhZGluZyB0aGUgbWFyay4gQXR0cmlidXRlcyBhcmUgaW52aXNpYmxlIHRvIH
129RoZSBjaGFyLWJhc2VkXG4vLyB0ZXh0T2Zmc2V0cyB3YWxrICgjMjgwNik7IGEgdGFnIGNvdW50IHJlbmRlcmVkIGFzIHRleHQgd291bGQgbm90IGJlLlxuY29uc3QgTUFSS0VSX05PVEVfQVRUUiA9ICdkYXRhLWhhcy1ub3RlJztcbmNvbnN0IE1BUktFUl9UQUdfQ09VTlRfQVRUUiA9ICdkYXRhLXRhZy1jb3VudCc7XG4vLyBNYXJrcyBhIGdseXBoIGJvcnJvd2VkIGZyb20gYSBsaW5lLW1hdGUsIHNvIHVuY2x1c3RlcmluZyBjYW4gdGFrZSBiYWNrXG4vLyBleGFjdGx5IHdoYXQgY2x1c3RlcmluZyBhZGRlZCBhbmQgbGVhdmUgdGhlIG1hcmtlcidzIG93biBnbHlwaHMgYWxvbmUuXG5jb25zdCBDTFVTVEVSX0lDT05fQVRUUiA9ICdkYXRhLWNsdXN0ZXItaWNvbic7XG4vLyBUaGUgbWFya2VyJ3Mgb3duIGxhYmVsLCBwYXJrZWQgd2hpbGUgdGhlIGNsdXN0ZXIgbGFiZWwgaXMgaW4gdXNlLlxuY29uc3QgQ0xVU1RFUl9QUkVWX0xBQkVMX0FUVFIgPSAnZGF0YS1jbHVzdGVyLXByZXYtbGFiZWwnO1xuY29uc3QgTk9URV9HTFlQSF9DTEFTUyA9ICdmYS1ub3RlLXN0aWNreSc7XG5jb25zdCBUQUdfR0xZUEhfQ0xBU1MgPSAnZmEtdGFnJztcbi8vIFJlYWRlciBib29rbWFyayBmb2xkZWQgaW50byB0aGUgc2FtZSBndXR0ZXIgY2x1c3RlciAoIzQ3MDcsIGVwaWMgIzE1NDgpLiBBXG4vLyBib29rbWFyayBpcyBhIFBPU0lUSU9OIG9uIGEgbGluZSwgbm90IGFuIGFubm90YXRpb24sIHNvIGl0IGNhcnJpZXMgaXRzIG93blxuLy8gZ2x5cGggYW5kIGl0cyBvd24gY291bnQsIGJ1dCBpdCBzdGlsbCBmb2xkcyBpbnRvIHRoZSBPTkUgY2x1c3RlciBpY29uIGEgbGluZSdzXG4vLyBub3RlL3RhZyBtYXJrZXJzIGFscmVhZHkgY29sbGFwc2UgaW50byDigJQgbmV2ZXIgYSBzZWNvbmQgaWNvbiBpbiB0aGUgZ3V0dGVyLlxuY29uc3QgQk9PS01BUktfTUFSS0VSX0NMQVNTID0gJ2Fubm90YXRpb24tYm9va21hcmstbWFya2VyJztcbmNvbnN0IEJPT0tNQVJLX0dMWVBIX0NMQVNTID0gJ2ZhLWJvb2ttYXJrJztcbi8vIFBhcmtlZCBvbiB0aGUgbWFya2VyIHNvIHRoZSBjb3VudCBsb2dpYyBhbmQgdGhlIGNob29zZXIgY2FuIHRlbGwgYSBib29rbWFya1xuLy8gZnJvbSBhIG5vdGUvdGFnIG1hcmtlciB3aXRob3V0IHJlLXJlYWRpbmcgdGhlIHNvdXJjZSBvYmplY3QuIEFuIGF0dHJpYnV0ZSwgbm90XG4vLyB0ZXh0IOKAlCBpbnZpc2libGUgdG8gdGhlIGNoYXItYmFzZWQgdGV4dE9mZnNldHMgd2FsayAoIzI4MDYpLlxuY29uc3QgTUFSS0VSX0JPT0tNQVJLX0FUVFIgPSAnZGF0YS1pcy1ib29rbWFyayc7XG4vLyBIb3cgbWFueSBCT09LTUFSS1Mgb24gdGhlIGxpbmUgdGhlIGNsdXN0ZXIgZm9sZGVkIGluLCBtaXJyb3JlZCBvbiB0aGUgY2x1c3RlclxuLy8gZXhhY3RseSB0aGUgd2F5IGRhdGEtbm90ZS1tYXJrcyAvIGRhdGEtdGFnLW1hcmtzIGFyZSAoIzQ3MDcpLlxuY29uc3QgQ0xVU1RFUl9CT09LTUFSS19NQVJLU19BVFRSID0gJ2RhdGEtYm9va21hcmstbWFya3MnO1xuLy8gQSBib29rbWFyayBtYXJrZXIncyBkYXRhLW1hcmtlci1mb3IgaXMgcHJlZml4ZWQgc28gaXQgY2FuIG5ldmVyIGNvbGxpZGUgd2l0aCBhXG4vLyBoaWdobGlnaHQncyBudW1lcmljIG1hcmsgaWQ6IGFwcGx5Tm90ZVRhZ01hcmtlcigpIHJlbW92ZXMgbWFya2VycyBieVxuLy8gYFtkYXRhLW1hcmtlci1mb3I9XCI8aWQ+XCJdYCwgYW5kIGFuIHVuLXByZWZpeGVkIGJvb2ttYXJrIHNoYXJpbmcgYSBtYXJrJ3MgaWRcbi8vIHdvdWxkIGJlIHRvcm4gZG93biBieSBhIG5vdGUvdGFnIHJlcGFpbnQuXG5jb25zdCBCT09LTUFSS19NQVJLRVJfRk9SX1BSRUZJWCA9ICdib29rbWFyay0nO1xuY29uc3QgQ09OVEVOVF9XUkFQUEVSX1NFTEVDVE9SID0gJyNjb250ZW50LXdyYXBwZXInO1xuLy8gVGhlIHJlbmRlcmVkIHRleHQgY29sdW1uIOKAlCBOT1QgI21pbmlzdHJ5LXRleHQsIHdoaWNoIGlzIGEgcGxhaW4gYmxvY2sgZmlsbGluZ1xuLy8gdGhlIGdyaWQgY2VsbCAoYm9vay10ZXh0LnNjc3M6MykuIFRoZSBydW5uaW5nIHRleHQgaXMgYC5zZWN0aW9uYCwgY2FwcGVkIGF0XG4vLyA4MGNoIGFuZCBjZW50cmVkIChib29rLXRleHQuc2NzczoyMjktMjMxKSwgc28gb24gYSBkZXNrdG9wIHdpZHRoIGl0IGlzIGZhclxuLy8gbmFycm93ZXIgdGhhbiBpdHMgcGFyZW50IGFuZCAjbWluaXN0cnktdGV4dCdzIHJpZ2h0IGVkZ2UgaXMgbm93aGVyZSBuZWFyIHRoZVxuLy8gdGV4dCdzICgjNDQ1MTogbWVhc3VyZWQgMTAwNiB2cyAxMjI1IGF0IGEgMTI4MCB2aWV3cG9ydCkuXG5jb25zdCBURVhUX0NPTFVNTl9TRUxFQ1RPUiA9ICcjbWluaXN0cnktdGV4dCAuc2VjdGlvbic7XG4vLyBUaGUgcmlnaHQtaGFuZCBsaW5lIG9mIHRoZSBndXR0ZXI6IHRoZSBtYXJrZXIgbWF5IHNpdCBwYXN0IHRoZSB0ZXh0IGJ1dCBtdXN0XG4vLyBub3QgY3Jvc3MgdGhpcy4gI21pbmlzdHJ5LXRleHQgaXMgdGhlIGVsZW1lbnQgdGhhdCBwcm9kdWNlcyBpdCDigJQgdGhlIDxocj5cbi8vIHVuZGVyIHRoZSBib29rIHRpdGxlIChyZWFkZXIucGhwKSBhbmQgdGhlIGJvb2ttYXJrIGljb24gKHJlYWRlci1ib29rbWFyay5waHAsXG4vLyBgdGV4dC1hbGlnbjogcmlnaHRgKSBhcmUgYm90aCBpdHMgZGlyZWN0IGNoaWxkcmVuLCBzbyBhbGwgdGhyZWUgc2hhcmUgYSByaWdodFxuLy8gZWRnZSBhbmQgdGhhdCBlZGdlIGlzIHRoZSBsaW5lIHRoZSB0aWNrZXQgbmFtZXMuXG5jb25zdCBHVVRURVJfRURHRV9TRUxFQ1RPUiA9ICcjbWluaXN0cnktdGV4dCc7XG5jb25zdCBSRUZMT1dfRVZFTlQgPSAnYW5ub3RhdGlvbnM6cmVmbG93LW1hcmtlcnMnO1xuLy8gU3BhY2UgYmV0d2VlbiB0aGUgcmVhZGVyIHRleHQgY29sdW1uJ3MgcmlnaHQgZWRnZSBhbmQgdGhlIG1hcmtlciwgc28gdGhlXG4vLyBpY29ucyBzaXQgY2xlYXJseSBvZmYgdGhlIHRleHQgaW4gdGhlIGd1dHRlci5cbmV4cG9ydCBjb25zdCBHVVRURVJfR0FQX1BYID0gODtcblxuLyoqXG4gKiBUaGUgd2lkZXN0IGEgZ3V0dGVyIG1hcmtlciBldmVyIGdldHMsIGluIENTUyBwaXhlbHMgKCM0NTQ1LCBtZXRob2QgZnJvbSAjNDUzMykuXG4gKlxuICogTk9UIGEgc2luZ2xlIGdseXBoLiBBIG5vdGUtb25seSBvciB0YWdzLW9ubHkgbWFya2VyIGlzIG9uZSBnbHlwaCBhbmQgYVxuICogbm90ZSt0YWdzIG1hcmtlciBpcyB0d28sIGJ1dCB3aGVuIHNldmVyYWwgYW5ub3RhdGVkIGhpZ2hsaWdodHMgc2hhcmUgYSBMSU5FXG4gKiB0aGV5IGNvbGxhcHNlIGludG8gb25lIGNsdXN0ZXIgbWFya2VyIGNhcnJ5aW5nIGJvdGggZ2x5cGhzIHBsdXMgYSBjb3VudCBiYWRnZVxuICog4oCUIG5lYXJseSB0aHJlZSB0aW1lcyB0aGUgc2luZ2xlLWdseXBoIG1hcmtlci4gU2l6aW5nIHRoZSBndXR0ZXIgZnJvbSBhbnl0aGluZ1xuICogbmFycm93ZXIgaXMgd3JvbmcgdGhlIG1vbWVudCBhIGNsdXN0ZXIgZm9ybXMsIHdoaWNoIGlzIGhvdyB0aGUgZGVmZWN0IGhpZGVzOlxuICogYSBjbHVzdGVyIG5lZWRzIHR3byBhbm5vdGF0ZWQgaGlnaGxpZ2h0cyBvbiBvbmUgbGluZSB0byBhcHBlYXIgYXQgYWxsLlxuICpcbiAqIE1lYXN1cmVkIGluIGEgcmVhbCBlbmdpbmUgYXQgMzYwcHggYW5kIDM5MHB4IHZpZXdwb3J0cyB3aXRoIHRoZSByZWFsIEZvbnRcbiAqIEF3ZXNvbWUgd2ViZm9udDogb25lIGdseXBoIDE2cHgsIG5vdGUrdGFncyAyOHB4LCBjbHVzdGVyIDQyLjU4cHggKDQ4LjE2cHggaWZcbiAqIHRoZSBiYWRnZSBldmVyIGNhcnJpZXMgYSB0d28tZGlnaXQgY291bnQpLiBSb3VuZGVkIHVwIHRvIDQ4IHNvIGEgc3ViLXBpeGVsIG9yXG4gKiBmb250LWRlcGVuZGVudCB3aWRlbmluZyBkb2VzIG5vdCBwdXQgdGhlIG1hcmtlciBzdHJhaWdodCBiYWNrIG92ZXIgdGhlIHRleHQuXG4gKlxuICogUkUtTUVBU1VSRUQgYXQgMzYwLzM5MC82MzkvNjQwLzc2OC8xMDI0ICgjNDc4OCksIHdoaWNoIGFza2VkIHdoZXRoZXIgNDggd2FzXG4gKiBpbmhlcml0ZWQgcmF0aGVyIHR
129oYW4gZWFybmVkLiBJdCBpcyBlYXJuZWQ6IG9uZSBnbHlwaCAxNC0xNnB4LCBub3RlK3RhZ3NcbiAqIDI3LTI4cHgsIGNsdXN0ZXIgNDIuNThweCBhdCBldmVyeSB3aWR0aCwgYW5kIDQ4LjE2cHggZm9yIGEgdHdvLWRpZ2l0IGNvdW50LlxuICogVGhlIG1hcmtlciBpcyBOQVJST1dFUiBhYm92ZSB0aGUgcGhvbmUgYnJlYWtwb2ludCwgbm90IHdpZGVyLCBzbyA0OCBib3VuZHNcbiAqIGV2ZXJ5IHZpZXdwb3J0LiBJdCBpcyBub3Qgb3ZlcnNpemVkIGFuZCBzaHJpbmtpbmcgaXQgd291bGQgYnV5IH41cHggb2YgY29sdW1uXG4gKiBhZ2FpbnN0IHRoZSB3aWRlc3QgdGhpbmcgaXQgaGFzIHRvIGhvbGQuXG4gKlxuICogUkUtTUVBU1VSRUQgYWZ0ZXIgIzQ4MjQgc2hyYW5rIHRoZSBnbHlwaCAxMCUgKDAuNzJlbSAtPiAwLjY0OGVtKSwgc2FtZSBzaXhcbiAqIHdpZHRoczogb25lIGdseXBoIDEzLTE2cHgsIG5vdGUrdGFncyAyNS0yN3B4LCBjbHVzdGVyIDQwLjU4cHggYXQgPj02NDAgYW5kXG4gKiA0MS41OHB4IGF0IDw9NjM5LCB0d28tZGlnaXQgY291bnQgNDYuMTZweCAvIDQ3LjE2cHguIFBob25lIHJ1bnMgMXB4IHdpZGVyXG4gKiB0aGFuIGRlc2t0b3AgYmVjYXVzZSAjNDgyNCB3aWRlbmVkIHRoZSBwaG9uZSBwYWRkaW5nIHNvIHRoZSAxMCUgZ2x5cGhcbiAqIHJlZHVjdGlvbiBkaWQgbm90IHNocmluayB0aGUgdG91Y2ggdGFyZ2V0LlxuICpcbiAqIFRoZSB0d28tZGlnaXQgY2FzZSBOTyBMT05HRVIgb3ZlcmhhbmdzLiBCZWZvcmUgIzQ4MjQgaXQgbWVhc3VyZWQgNDguMTZweCxcbiAqIDAuMTZweCBwYXN0IHRoaXMgYnVkZ2V0IGFuZCBoZWxkIG9ubHkgYnkgdGhlIDU2cHggcmVzZXJ2ZTsgaXQgaXMgbm93IDQ2LjE2cHhcbiAqIGFuZCBpbnNpZGUuIFRoZSBidWRnZXQgc3RheXMgYXQgNDggYW55d2F5IOKAlCB0aGUgaGVhZHJvb20gZ3VhcmRzIGFcbiAqIGZvbnQtZGVwZW5kZW50IHdpZGVuaW5nLCBhbmQgIzQ1MTcgY291bGQgYWRkIGEgcGVyLWdseXBoIGNvdW50IHRoYXQgaXMgd2lkZXJcbiAqIHRoYW4gdGhlIHNpbmdsZSB1bmlvbiBiYWRnZSB0aGVzZSBmaWd1cmVzIGFzc3VtZS5cbiAqXG4gKiBUaGUgdGVzdHMgc3RpbGwgYXNzZXJ0IHRoZSB0d28tZGlnaXQgY2x1c3RlciBhZ2FpbnN0IHRoZSBSRVNFUlZFIHJhdGhlciB0aGFuXG4gKiB0aGlzIGJ1ZGdldCwgd2hpY2ggaXMgbm93IGEgc3RyaWN0ZXIgY2hlY2sgdGhhbiBpdCBuZWVkcyB0byBiZSDigJQgZGVsaWJlcmF0ZWx5XG4gKiBsZWZ0IHRoYXQgd2F5LlxuICpcbiAqIFRoaXMgaXMgYSBCVURHRVQsIG5vdCBhIG1lYXN1cmVtZW50IHRoZSBjb2RlIHJlYWRzIGJhY2s6IHRoZSBzdHlsZXNoZWV0XG4gKiBtaXJyb3JzIGl0IHRvIHJlc2VydmUgdGhlIGd1dHRlciAoYm9vay10ZXh0LnNjc3MpLCBhbmRcbiAqIHRlc3RzL2UyZS9ub3RlLXRhZy1tYXJrZXItZ3V0dGVyLnN0eWxlc2hlZXQuc3BlYy5qcyByZS1tZWFzdXJlcyB0aGUgcmVhbFxuICogY2x1c3RlciBhZ2FpbnN0IGl0LCBzbyBhIHJlc3R5bGUgdGhhdCB3aWRlbnMgdGhlIG1hcmtlciBvciBuYXJyb3dzIHRoZSBndXR0ZXJcbiAqIGZhaWxzIHRoZXJlIGluc3RlYWQgb2Ygc2lsZW50bHkgbGFuZGluZyBvbiB0aGUgcnVubmluZyB0ZXh0IGFnYWluLlxuICovXG5leHBvcnQgY29uc3QgR1VUVEVSX0NMVVNURVJfTUFSS0VSX1dJRFRIX1BYID0gNDg7XG5cbi8qKlxuICogVGhlIGd1dHRlciB0aGUgc3R5bGVzaGVldCBtdXN0IHJlc2VydmUgZm9yIHRob3NlIG1hcmtlcnMgKCM0NTQ1LCB3aWRlbmVkIGluXG4gKiBzY29wZSBieSAjNDc4OCkuXG4gKlxuICogcG9zaXRpb25Ob3RlVGFnTWFya2VyKCkgcGxhY2VzIGZyb20gYGNvbHVtblJlY3QucmlnaHQgKyBHVVRURVJfR0FQX1BYYCBhbmRcbiAqIHJpZ2h0LWFsaWducyBpbnNpZGUgdGhlIGd1dHRlcidzIGZhciBsaW5lIHdoZW4gdGhhdCBvdmVyZmxvd3MsIHNvIHRoZSByb29tIGFcbiAqIG1hcmtlciBuZWVkcyBpcyB0aGUgZ2FwIHBsdXMgaXRzIG93biB3aWR0aC4gVGhlcmUgaXMgbm8gc2Vjb25kIGdhcCBvbiB0aGUgZmFyXG4gKiBzaWRlOiBhIGNsYW1wZWQgbWFya2VyIHNpdHMgZmx1c2ggYWdhaW5zdCB0aGF0IGxpbmUsIHdoaWNoIGlzICNtaW5pc3RyeS10ZXh0J3NcbiAqIGVkZ2UsIGl0c2VsZiBhbHJlYWR5IGluc2V0IGZyb20gdGhlIHNjcmVlbiBieSB0aGUgZ3JpZCdzIHBhZGRpbmcuXG4gKlxuICogTmFtZWQgUEhPTkVfR1VUVEVSX1JFU0VSVkVfUFggdW50aWwgIzQ3ODgsIGJlY2F1c2UgIzQ1NDUgcmVzZXJ2ZWQgaXQgYmVsb3dcbiAqIDY0MHB4IG9ubHkuIE1lYXN1cmVtZW50IHNob3dlZCB3aWRlciB2aWV3cG9ydHMgbmVlZCBpdCB0b28g4oCUIGF0IDY0MHB4IGFuZFxuICogNzY4cHggdGhlIDgwY2ggY2FwIG9uIC5zZWN0aW9uIGhhcyBub3QgZW5nYWdlZCwgc28gdGhlIGNvbHVtbiBmaWxscyBpdHNcbiAqIHBhcmVudCBhbmQgdGhlIG1hcmtlciB3YXMgY2xhbXBlZCAxMXB4IGludG8gdGhlIHJ1bm5pbmcgdGV4dC4gYm9vay10ZXh0LnNjc3NcbiAqIG5vdyByZXNlcnZlcyBpdCBhdCBldmVyeSB3aWR0aDsgYmVsb3cgNjQwcHggb24gdGhlIHJpZ2h0IGFsb25lLCBhYm92ZSBpdCBvblxuICogYm90aCBzaWRlcyBzbyB0aGUgY29sdW1uIHN0YXlzIGNlbnRyZWQuXG4gKlxuICog4pqgIEFTIE9GICM0ODI2IFRISVMgSVMgVEhFIDFyZW0gQ0FTRSwgTk9UIFRIRSBXSE9MRSBSVUxFIOKAlCBleGFjdGx5IGFzXG4gKiBQSE9ORV9HVVRURVJfUkVTRVJWRV9QWCBhbHJlYWR5IHdhcy4gYm9vay10ZXh0LnNjc3MgcmVzZXJ2ZXNcbiAqIGBtYXgoNTJweCwgMy41ZW0pYCBmcm9tIDY0MHB4IHVwLCB3aGljaCByZXNvbHZlcyB0byA1NnB4IG9ubHkgd2hpbGUgdGhlXG4gKiByZWFkZXIgZm9udCBzaXplIGlzIDFyZW0uIDMuNWVtIHdhcyBjaG9zZW4gYmVjYXVzZSBpdCBJUyA1NnB4IGF0IDFyZW0sIHNvXG4gKiB0aGUgZGVmYXVsdC1zaXplIGxheW91dCBldmVyeSBlYXJsaWVyIHRpY2tldCBtZWFzdXJlZCBpcyB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBHVVRURVJfUkVTRVJWRV9QWCA9IEdVVFRFUl9HQVBfUFggKyBHVVRURVJfQ0xVU1RFUl9NQVJLRVJfV0lEVEhfUFg7XG5cbi8qKlxuICogVGhlIGZsb29yIHVuZGVyIHRoYXQgZW0gdGVybSwgaW4gQ1NTIHBpeGVscyAoIzQ4MjYpLlxuICpcbiAqIGAzLjVlbWAgaXMgbmFycm93ZXIgdGhhbiB0aGUgd2lkZXN0IG1hcmtlciBiZWxvdyByb3VnaGx5IDAuOTNyZW0sIGJlY2F1c2VcbiAqIHRoZSBtYXJrZXIgaXMgYW4gYWZmaW5lIGZ1bmN0aW9uIG9mIHRoZSByZWFkZXIgc2l6ZSByYXRoZXIgdGhhbiBhXG4gKiBwcm9wb3J0aW9uYWwgb25lIOKAlCBpdCBjYXJyaWVzIGZpeGVkIHBhZGRpbmcgdGhhdCBkb2VzIG5vdCBzaHJpbmsgd2l0aCB0aGVcbiAqIGdseXBoLiBNZWFzdXJlZCBpbiBDaHJvbWl1bSB3aXRoIHRoZSByZWFsIEZvbnQgQXdlc29tZSB3ZWJmb250IGF0IDY0MCBhbmRcbiAqIDc2OHB4LCB0aGUgdHdvLWRpZ2l0IGNsdXN0ZXIgcGx1cyBpdHMgOHB4IGdhcCBuZWVkcyA1MS4wM3B4IGF0IDAuOXJlbSxcbiAqIDUxLjI3cHggYXQgMC45MnJlbSBhbmQgNTIuMXB4IGF0IHRoZSAwLjkzcmVtIGNyb3Nzb3ZlciwgYWdhaW5zdCBhIDMuNWVtIHRlcm1cbiAqIHdvcnRoIG9ubHkgNTAuNHB4IGF0IDAuOXJlbS4gNTIgY292ZXJzIGV2ZXJ5IHJlYWRlciBzaXplIGJlbG93IHRoZSBjcm9zc292ZXJcbiAqIOKAlCB0aGUgcmVxdWlyZW1lbnQgZmFsbHMgYXMgdGhlIGZvbnQgc2hyaW5rcywgc28gdGhlIGNyb3Nzb3ZlciBpcyB0aGUgd29yc3RcbiAqIGNhc2Ug4oCUIGFuZCBpdCBpcyBzdGlsbCBsb2FkLWJlYXJpbmcgYXQgMC4zcmVtLCB3aGVyZSAzLjVlbSBpcyAxNi44cHguXG4gKlxuICogTm90aGluZyByZWFkcyB0aGlzIGF0IHJ1bnRpbWUuIEl0IGV4aXN0cyBzbyB0aGUgU2FzcyBtaXJyb3IgaW5cbiAqIGJvb2stdGV4dC5zY3NzIGhhcyBzb21ldGhpbmcgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0LCB0aGUgc2FtZSB3YXlcbiAqIFBIT05FX0dVVFRFUl9SRVNFUlZFX1BYIGRvZXMgZm9yIHRoZSBwaG9uZSBydWxlLlxuICovXG5leHBvcnQgY29uc3QgR1VUVEVSX1JFU0VSVkVfRkxPT1JfUFggPSA1MjtcblxuLyoqXG4gKiBUaGUgc2FtZSBidWRnZXQgYXQgUEhPTkUgd2lkdGhzLCB3aGVyZSBPTkUgZ2x5cGggaXMgcGFpbnRlZCAoIzQ4MzEsICM0NzEzKS5cbiAqXG4gKiBUaGUgNDhweCBhYm92ZSBpcyBzZXQgYnkgYSBjbHVzdGVyIGNhcnJ5aW5nIGEgdHdvLWRpZ2l0IGNvdW50IGJhZGdlLiBhc
129HAuc2Nzc1xuICogc3VwcHJlc3NlcyB0aGF0IGJhZGdlIGJlbG93IDY0MHB4ICgjNDgzMSkgYW5kIHBhaW50cyBhIHNpbmdsZSBnbHlwaCBiZWxvdyBpdFxuICogKCM0NzEzKSwgc28gdGhlIHdpZGVzdCBzaGFwZSBhIHBob25lIGNhbiByZW5kZXIgaXMgb25lIGdseXBoIOKAlCBuZXZlciBhIHBhaXIsXG4gKiBhbmQgbmV2ZXIgYSBiYWRnZS5cbiAqXG4gKiBSZS1tZWFzdXJlZCBpbiBDaHJvbWl1bSB3aXRoIHRoZSByZWFsIEZvbnQgQXdlc29tZSB3ZWJmb250IGF0IDM2MC8zOTAvNDE0LFxuICogaWRlbnRpY2FsIGF0IGFsbCB0aHJlZTpcbiAqXG4gKiAgIG5vdGUgb25seSAgICAgICAgICAgIDExLjAwcHggICBmYS1ub3RlLXN0aWNreVxuICogICB0YWdzIG9ubHkgICAgICAgICAgICAxMS4wMHB4ICAgZmEtdGFnXG4gKiAgIGJvb2ttYXJrIG9ubHkgICAgICAgIDEwLjAwcHggICBmYS1ib29rbWFya1xuICogICBub3RlIEFORCB0YWdzICAgICAgICAxNC4wMHB4ICAgZmEtbGF5ZXItZ3JvdXAgIDwtIHRoZSB3aWRlc3QgcGhvbmUgc2hhcGVcbiAqXG4gKiAxNSByb3VuZHMgdGhhdCB1cCBieSBhIHBpeGVsLCBmb3IgdGhlIHNhbWUgcmVhc29uIDQ4IHJvdW5kcyB1cCB0aGUgZGVza3RvcFxuICogd29yc3QgY2FzZTogYSBzdWItcGl4ZWwgb3IgZm9udC1kZXBlbmRlbnQgd2lkZW5pbmcgbXVzdCBub3QgcHV0IHRoZSBtYXJrZXJcbiAqIGJhY2sgb3ZlciB0aGUgdGV4dC5cbiAqXG4gKiDimqAgUkUtTUVBU1VSRUQgQVQgMTUgQlkgIzQ4NDAsIFdISUNIIE5BUlJPV0VEIFRIRSBNQVJLRVIgQk9YIElUU0VMRi4gVGhlXG4gKiBmaWd1cmVzIGFib3ZlIHdlcmUgMTYgLyAxNiAvIDE1IC8gMTcgLyAxOSBhZ2FpbnN0IGEgMjBweCBidWRnZXQgd2hpbGUgdGhlXG4gKiBwaG9uZSBwYWRkaW5nIHdhcyBgNnB4IDMuNXB4YDsgaXQgaXMgbm93IGA3cHggMXB4YCwgdHJhZGluZyAyLjVweCBwZXIgc2lkZVxuICogb2Ygd2lkdGggZm9yIDJweCBvZiB0YXAtdGFyZ2V0IEhFSUdIVCDigJQgd2hpY2ggdGhlIGd1dHRlciBkb2VzIG5vdCBwYXkgZm9yLFxuICogYmVjYXVzZSB2ZXJ0aWNhbCBwYWRkaW5nIGNvc3RzIGl0IG5vdGhpbmcgKCM0NTQ1KS4gU2VlIHRoZSBwaG9uZSBibG9jayBpblxuICogYXBwLnNjc3MgZm9yIHRoZSBhY2Nlc3NpYmlsaXR5IHRyYWRlLCB3aGljaCBpcyByZWFsIGFuZCBpcyB3cml0dGVuIG91dFxuICogdGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBoZXJlLlxuICpcbiAqIFRoZSB0cnVuY2F0aW9uIHdhcm5pbmcgaXMgbm90IHJlLWxpc3RlZCBiZWNhdXNlIGl0IGNvdWxkIG5vdCBiZSByZS1tZWFzdXJlZFxuICogb24gdGhhdCBwYXNzOyBpdCB3YXMgMTdweCBhdCB0aGUgb2xkIHBhZGRpbmcsIHNvIGl0IGlzIH4xMnB4IG5vdy4gSXQgaGFzXG4gKiBuZXZlciBzZXQgdGhpcyBidWRnZXQg4oCUIHRoZSBjb21iaW5lZCBnbHlwaCBpcyB0aGUgd2lkZXN0IHNoYXBlIGF0IGV2ZXJ5XG4gKiByZWFkZXIgc2l6ZSDigJQgc28gdGhlIG9taXNzaW9uIGNoYW5nZXMgbm90aGluZyB0aGF0IGRlcGVuZHMgb24gdGhpcyBudW1iZXIuXG4gKlxuICog4pqgIFRIRSBCT1RILUNBU0UgR0xZUEggSVMgV0lERVIgVEhBTiBFSVRIRVIgR0xZUEggSVQgUkVQTEFDRVMsIHdoaWNoIGlzIHdoeVxuICogdGhpcyBpcyAyMCBhbmQgbm90IDE3LiBmYS1sYXllci1ncm91cCBpcyBhIDU3Ni11bml0IGdseXBoIGFnYWluc3QgNDQ4IGZvclxuICogZmEtbm90ZS1zdGlja3kgYW5kIGZhLXRhZzsgYSBuYXJyb3dlciBjb21iaW5lZCBtYXJrIHdvdWxkIGJ1eSAzcHggbW9yZSwgYW5kXG4gKiB3YXMgbm90IHdvcnRoIGEgc2lsaG91ZXR0ZSB0aGF0IHJlYWRzIGFzIFwib25lIG9mIHRoZSBvdGhlciB0d29cIiBhdCAxMHB4LlxuICogVGhlIG1lYXN1cmVkIHNhdmluZyBpcyBzdGlsbCA4cHggcGVyIHNpZGUgYWdhaW5zdCAjNDgzMSdzIDI4cHggYnVkZ2V0LlxuICpcbiAqIFdIWSBPTkUgR0xZUEggSVMgVEhFIFJJR0hUIFRISU5HIFRPIERST1AgVE86IHRoZSByZXNlcnZlIGlzIGEgcGVybWFuZW50IGNvc3RcbiAqIG9uIGV2ZXJ5IGxpbmUsIGJvdGggc2lkZXM7IHRoZSBzZWNvbmQgZ2x5cGggaXMgYSBkaXN0aW5jdGlvbiB0aGF0IGEgdmFyeWluZ1xuICogc2luZ2xlIGdseXBoIGNhbiBjYXJyeSBpbnN0ZWFkLiBXaGF0IGlzIE5PVCBhY2NlcHRhYmxlIGlzIGRyb3BwaW5nIHRvIG9uZVxuICogVU5ESUZGRVJFTlRJQVRFRCBnbHlwaCDigJQgdGhhdCBsb3NlcyB0aGUgbm90ZS12cy10YWcgc2lnbmFsICMzMDk0IGV4aXN0cyBmb3IsXG4gKiBvbiBldmVyeSBhbm5vdGF0ZWQgbGluZS4gU2VlIHRoZSBwaG9uZSBibG9jayBpbiBhcHAuc2Nzcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBIT05FX0dVVFRFUl9NQVJLRVJfV0lEVEhfUFggPSAxNTtcblxuLyoqXG4gKiBUaGUgcGhvbmUgZ3V0dGVyIHR
129oZSBzdHlsZXNoZWV0IHJlc2VydmVzIOKAlCAyOHB4IGF0IHRoZSBkZWZhdWx0IHJlYWRlciBzaXplLlxuICpcbiAqIOKaoCBUSElTIElTIFRIRSAxcmVtIENBU0UsIE5PVCBUSEUgV0hPTEUgUlVMRS4gYm9vay10ZXh0LnNjc3MgcmVzZXJ2ZXNcbiAqIGBjYWxjKDExcHggKyAwLjc1ZW0pYCwgd2hpY2ggaXMgMjNweCBvbmx5IHdoaWxlIHRoZSByZWFkZXIgZm9udCBzaXplIGlzIDFyZW0uXG4gKiBUaGUgZW0gdGVybSBpcyBtYW5kYXRvcnkgcmF0aGVyIHRoYW4gZGVjb3JhdGl2ZTogZm9udC1zaXplLmpzOjE1OS0yMDAgc3RlcHNcbiAqIHRoZSByZWFkZXIgc2l6ZSB3aXRoIG5vIGNsYW1wIGFuZCB0aGUgZ2x5cGggaXMgMC42NDhlbSwgc28gdGhlIG1hcmtlciB3aWR0aFxuICogdHJhY2tzIGl0IGF0IHJvdWdobHkgMiArIDEyRiBweCwgd2hpbGUgYSBmbGF0IHB4IHJlc2VydmUgZG9lcyBub3QgbW92ZS5cbiAqIHBvc2l0aW9uTm90ZVRhZ01hcmtlcigpIGJlbG93IHJpZ2h0LWFsaWducyBpbnRvIHdoYXRldmVyIHJvb20gaXMgbGVmdCByYXRoZXJcbiAqIHRoYW4gaGlkaW5nIG9yIHdyYXBwaW5nLCBzbyBhbiB1bmRlcnNpemVkIHJlc2VydmUgd2Fsa3MgdGhlIGljb24gb250byB0aGVcbiAqIHJ1bm5pbmcgdGV4dCDigJQgdGhlICM0Nzg4IHNpZ25hdHVyZSwgcmVwcm9kdWNlZCBhZ2FpbnN0IHRoaXMgcmVzZXJ2ZSBieSB0aGVcbiAqIGZsYXQtMjNweCByZWQgY29udHJvbCBpbiB0aGUgZ3V0dGVyIHNwZWMuXG4gKlxuICogTm90aGluZyBoZXJlIGNoYW5nZXMgYmVoYXZpb3VyOiBubyBjb2RlIHBhdGggcmVhZHMgdGhlc2UuIFRoZXkgZXhpc3Qgc28gdGhlXG4gKiBTYXNzIG1pcnJvciBpbiBib29rLXRleHQuc2NzcyBoYXMgc29tZXRoaW5nIHRvIGJlIGNoZWNrZWQgYWdhaW5zdCwgYW5kXG4gKiB0ZXN0cy9lMmUvbm90ZS10YWctbWFya2VyLWd1dHRlci5zdHlsZXNoZWV0LnNwZWMuanMgYXNzZXJ0cyB0aGUgY29tcHV0ZWRcbiAqIHBob25lIG1hcmdpbiBlcXVhbHMgdGhpcyB2YWx1ZSBhdCAxcmVtIGFuZCByZS1tZWFzdXJlcyB0aGUgZW0gdGVybSBhY3Jvc3MgYVxuICogZm9udC1zaXplIHN3ZWVwLlxuICovXG5leHBvcnQgY29uc3QgUEhPTkVfR1VUVEVSX1JFU0VSVkVfUFggPSBHVVRURVJfR0FQX1BYICsgUEhPTkVfR1VUVEVSX01BUktFUl9XSURUSF9QWDtcblxuLyoqXG4gKiBUaGUgdHdvIHRlcm1zIG9mIHRoZSBwaG9uZSByZXNlcnZlJ3MgQUZGSU5FIGV4cHJlc3Npb24gKCM0ODQwKS5cbiAqXG4gKiBUaGVzZSByZXBsYWNlIFBIT05FX0dVVFRFUl9SRVNFUlZFX0ZMT09SX1BYLCB3aGljaCBleGlzdGVkIGJlY2F1c2UgdGhlIHJ1bGVcbiAqIHdhcyBgbWF4KGZsb29yLCBlbSlgLiBJdCBpcyBub3cgYGNhbGMoMTFweCArIDAuNzVlbSlgIGFuZCBhbiBhZmZpbmVcbiAqIGV4cHJlc3Npb24gaGFzIG5vIGZsb29yIOKAlCBzbyB0aGUgY29uc3RhbnQgd2FzIG5vdCByZW51bWJlcmVkLCBpdCB3YXNcbiAqIHJldGlyZWQuXG4gKlxuICogV0hZIFRIRSBtYXgoKSBIQUQgVE8gR08sIHdoaWNoIGlzIHRoZSB3aG9sZSBvZiAjNDg0MCdzIHdpZHRoIHdpbjogdGhlXG4gKiByZXF1aXJlbWVudCBpcyBgZ2FwICsgbWFya2VyYCwgYW5kIHRoZSBtYXJrZXIgY2FycmllcyBmaXhlZCBwYWRkaW5nIHRoYXRcbiAqIGRvZXMgbm90IHNjYWxlIHdpdGggdGhlIGdseXBoLCBzbyB0aGUgcmVxdWlyZW1lbnQgaXMgQUZGSU5FIGluIHRoZSByZWFkZXJcbiAqIHNpemUgRi4gQSBgbWF4KClgIG9mIGEgY29uc3RhbnQgYW5kIGEgcHVyZSBwcm9wb3J0aW9uYWwgY2FuIHRvdWNoIGFuIGFmZmluZVxuICogbGluZSBhdCBleGFjdGx5IG9uZSBwb2ludCBhbmQgbXVzdCBvdmVyc2hvb3QgZXZlcnl3aGVyZSBlbHNlLCBieSBtb3JlIGFuZFxuICogbW9yZSBhcyBGIGdyb3dzLiBNZWFzdXJlZCBhZ2FpbnN0IHRoZSBvbGQgYG1heCgyNHB4LCAxLjc1ZW0pYDogaXQgcmVzZXJ2ZWRcbiAqIDU2cHggYXQgMi4wcmVtIGZvciBhIDM4cHggcmVxdWlyZW1lbnQg4oCUIDE4cHggcGVyIHNpZGUsIDM2cHggb2YgcmVhZGluZ1xuICogY29sdW1uLCBzcGVudCBvbiBub3RoaW5nLlxuICpcbiAqIEFORCBUSEUgbWF4KCkgV0FTIDAuOHB4IFNIT1JUIEFUIDAuOXJlbSAoMjUuMTlweCBhZ2FpbnN0IGEgMjZweFxuICogcmVxdWlyZW1lbnQpLCBzbyB0aGUgY2xhbXAgZmlyZWQgdGhlcmUgYW5kIHRoZSBtYXJrZXIgY2FtZSB0byByZXN0IDcuMTdweFxuICogZnJvbSB0aGUgdGV4dCB3aGlsZSBldmVyeSBvdGhlciBzaXplIGdvdCB0aGUgZnVsbCA4cHggZ2FwLiBUaGUgYWZmaW5lXG4gKiBleHByZXNzaW9uIGNsZWFycyB0aGUgcmVxdWlyZW1lbnQgYXQgZXZlcnkgc2l6ZSwgc28gdGhlIGdhcCBpcyBub3cgZXhhY3RseVxuICogOC4wMHB4IGV2ZXJ5d2hlcmUg4oCUIHRoYXQgZGVmZWN0IGlzIGZpeGVkIGJ5IGNvbnN0cnVjdGlvbiwgbm90IHBhdGNoZWQuXG4gKlxuICogTWVhc3VyZWQgaW4gQ2hyb21pdW0gd2l0aCB0aGUgcmVhbCB3ZWJmb250IGF0IDM2MC8zOTAvNDE0IGFjcm9zcyAwLjMtMy4wcmVtO1xuICogdGhlIGZ1bGwgdGFibGUgaXMgYmVzaWRlIHRoZSBTYXNzIHZhcmlhYmxlcyBpbiBib29rLXRleHQuc2Nzcy4gVGhlIHNwYXJlXG4gKiByb29tIG5ldmVyIGdvZXMgbmVnYXRpdmUgYW5kIG5ldmVyIGV4Y2VlZHMgMnB4LCB3aXRoIHRoZSB3b3JzdCByZWFsaXN0aWNcbiAqIGNhc2UgMC44MHB4IGF0IDAuOTByZW0uXG4gKlxuICog4pqgIERPIE5PVCBSRS1GSVQgVEhFU0UgRlJPTSBUSEUgR0xZUEggU0laRS4gVGhlIHdpZHRocyBiZWhpbmQgdGhlbSBhcmVcbiAqIGludGVnZXJzIHRoZSBlbmdpbmUgcHJvZHVjZWQsIGFuZCBhIGZpdCBkZXJpdmVkIGZyb20gYDAuNjQ4ZW1gIGFsb25lXG4gKiB1bmRlcnNob290cyBmb3VyIG9mIHRoZSBlbGV2ZW4gc2FtcGxlcyDigJQgd2hpY2ggaXMgcHJlY2lzZWx5IHRoZSBtaXN0YWtlXG4gKiAjNDgyNiBkb2N1bWVudHMuIFJlLW1lYXN1cmUgaW5zdGVhZC5cbiAqXG4gKiBOb3RoaW5nIHJlYWRzIHRoZXNlIGF0IHJ1bnRpbWU7IHRoZXkgYXJlIHRoZSBtaXJyb3IgdGhlIFNhc3MgdmFsdWVzIGFyZVxuICogY2hlY2tlZCBhZ2FpbnN0LlxuICovXG5leHBvcnQgY29uc3QgUEhPTkVfR1VUVEVSX1JFU0VSVkVfQkFTRV9QWCA9IDExO1xuZXhwb3J0IGNvbnN0IFBIT05FX0dVVFRFUl9SRVNFUlZFX0VNID0gMC43NTtcbmNvbnN0IFJFU0laRV9ERUJPVU5DRV9NUyA9IDEwMDtcbi8vIEhvdyBjbG9zZSB0d28gYW5jaG9yIHRvcHMgbXVzdCBiZSB0byBjb3VudCBhcyB0aGUgc2FtZSBsaW5lIHdoZW4gZ3JvdXBpbmcgZm9yXG4vLyBhIGNsdXN0ZXIgKCM0NzA3KS4gQSBib29rbWFyayBtYXJrZXIncyBibG9jayBhbmNob3IgYW5kIGEgbm90ZSBtYXJrZXIncyBpbmxpbmVcbi8vIGFuY2hvciByZXBvcnQgb25lIHZpc3VhbCBsaW5lJ3MgdG9wIGEgcGl4ZWwgb3IgdHdvIGFwYXJ0OyBhIHJlYWwgbGluZS1oZWlnaHRcbi8vIGlzIGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBsYXJnZXIsIHNvIHRoaXMgbmV2ZXIgbWVyZ2VzIHR3byBkaXN0aW5jdCBsaW5lcy5cbmNvbnN0IExJTkVfR1JPVVBfVE9MRVJBTkNFX1BYID0gMztcbi8vIFZlcnRpY2FsIHNlcGFyYXRpb24gd2hlbiBhIGhpZ2hsaWdodCdzIG5vdGUvdGFnIG1hcmtlciBhbmQgaXRzIHRydW5jYXRpb25cbi8vIHdhcm5pbmcgcmVzb2x2ZSB0byB0aGUgc2FtZSBsaW5lIOKAlCBhIHNpbmdsZS1saW5lLCBzaW5nbGUtc2VnbWVudCBoaWdobGlnaHQuXG5jb25zdCBNQVJLRVJfQ09MTElTSU9OX09GRlNFVF9QWCA9IDE2O1xuXG5sZXQgcmVmbG93SW5zdGFsbGVkID0gZmFsc2U7XG5cbi8qKlxuICogV2hldGhlciBhIG1hcmsgY2FycmllcyBhIG5vbi1lbXB0eSBub3RlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXJrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtIYXNOb3RlKG1hcmspIHtcbiAgcmV0dXJuIHR5cGVvZiBtYXJrPy5ub3RlID09PSAnc3RyaW5nJyAmJiBtYXJrLm5vdGUudHJpbSgpLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogV2hldGhlciBhIG1hcmsgY2FycmllcyBvbmUgb3IgbW9yZSB0YWdzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXJrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtIYXNUYWdzKG1hcmspIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWFyaz8udGFncykgJiYgbWFyay50YWdzLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHRyYW5zbGF0aW9uLCBmYWxsaW5nIGJhY2sgdG8gRW5nbGlzaCB3aGVuIHRoZSBrZXkgaXMgbWlzc2luZy5cbiAqIFRoZSBzaGFyZWQgdCgpIGhlbHBlciByZXR1cm5zIHRoZSBrZXkgaXRzZWxmIHdoZW4gdW5yZXNvbHZlZCwgc28gYW5cbiAqIGlkZW50aWNhbCByZXR1cm4gaXMgdHJlYXRlZCBhcyBcIm5vdCBmb3VuZFwiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IGkxOG4gIEFkYXB0ZXIgd2l0aCBhIHQoa2V5KSBtZXRob2QsIG9yIG51bGwuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gZmFsbGJhY2tcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZShpMThuLCBrZXksIGZhbGxiYWNrKSB7XG4gIGNvbnN0IHJlc29sdmVyID0gdHlwZW9mIGkxOG4/LnQgPT09ICdmdW5jdGlvbicgPyBpMThuLnQgOiB0O1xuICBjb25zdCB2YWx1ZSA9IHJlc29sdmVyKGtleSk7XG4gIHJldHVybi
129B2YWx1ZSAmJiB2YWx1ZSAhPT0ga2V5ID8gdmFsdWUgOiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgaW5saW5lIG1hcmtlciBlbGVtZW50IGZvciBhIG1hcmssIG9yIG51bGwgd2hlbiB0aGUgbWFyayBoYXMgbm9cbiAqIG5vdGUgYW5kIG5vIHRhZ3MuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1hcmsgIE1hcmsgc2hhcGUgd2l0aCBvcHRpb25hbCBgbm90ZWAgKHN0cmluZykgYW5kIGB0YWdzYCAoYXJyYXkpLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAcGFyYW0ge09iamVjdHxudWxsfSBbcGFyYW1zLmkxOG49bnVsbF0gIE9iamVjdCB3aXRoIGEgdChrZXkpIG1ldGhvZCwgb3IgbnVsbC5cbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGROb3RlVGFnTWFya2VyKG1hcmssIHsgaTE4biA9IG51bGwgfSA9IHt9KSB7XG4gIGNvbnN0IGhhc05vdGUgPSBtYXJrSGFzTm90ZShtYXJrKTtcbiAgY29uc3QgaGFzVGFncyA9IG1hcmtIYXNUYWdzKG1hcmspO1xuXG4gIGlmICghaGFzTm90ZSAmJiAhaGFzVGFncykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgbm90ZUxhYmVsID0gdHJhbnNsYXRlKGkxOG4sICdhbm5vdGF0aW9ucy5oYXNfbm90ZScsICdIYXMgYSBub3RlJyk7XG4gIGNvbnN0IHRhZ3NMYWJlbCA9IHRyYW5zbGF0ZShpMThuLCAnYW5ub3RhdGlvbnMuaGFzX3RhZ3MnLCAnSGFzIHRhZ3MnKTtcblxuICBjb25zdCBsYWJlbHMgPSBbXTtcbiAgaWYgKGhhc05vdGUpIHtcbiAgICBsYWJlbHMucHVzaChub3RlTGFiZWwpO1xuICB9XG4gIGlmIChoYXNUYWdzKSB7XG4gICAgbGFiZWxzLnB1c2godGFnc0xhYmVsKTtcbiAgfVxuICBjb25zdCBsYWJlbCA9IGxhYmVscy5qb2luKCcsICcpO1xuXG4gIGNvbnN0IG1hcmtlciA9IF9idWlsZE1hcmtlclNoZWxsKG1hcmsuaWQsIGxhYmVsKTtcblxuICBpZiAoaGFzTm90ZSkge1xuICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoTUFSS0VSX05PVEVfQVRUUiwgJ3RydWUnKTtcbiAgICBtYXJrZXIuYXBwZW5kQ2hpbGQoX2J1aWxkSWNvbihOT1RFX0dMWVBIX0NMQVNTKSk7XG4gIH1cbiAgaWYgKGhhc1RhZ3MpIHtcbiAgICBtYXJrZXIuc2V0QXR0cmlidXRlKE1BUktFUl9UQUdfQ09VTlRfQVRUUiwgU3RyaW5nKG1hcmsudGFncy5sZW5ndGgpKTtcbiAgICBtYXJrZXIuYXBwZW5kQ2hpbGQoX2J1aWxkSWNvbihUQUdfR0xZUEhfQ0xBU1MpKTtcbiAgfVxuXG4gIHJldHVybiBtYXJrZXI7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGd1dHRlciBtYXJrZXIgZm9yIGEgcmVhZGVyIGJvb2ttYXJrICgjNDcwNywgZXBpYyAjMTU0OCkuXG4gKlxuICogU2FtZSB6ZXJvLXRleHQgY29udHJhY3QgYXMgZXZlcnkgZ3V0dGVyIG1hcmtlcjogdGhlIGJvb2ttYXJrJ3MgbmFtZSBsaXZlcyBpblxuICogYXR0cmlidXRlcyBhbmQgdGhlIGFyaWEtbGFiZWwsIG5ldmVyIGFzIGEgdGV4dCBub2RlLCBzbyBpdCBjYW4gc2l0IGluc2lkZSB0aGVcbiAqIHJ1bm5pbmcgY29udGVudCB3aXRob3V0IHNoaWZ0aW5nIHRoZSBjaGFyLWJhc2VkIHRleHRPZmZzZXRzIHJlc3RvcmUgcmVsaWVzIG9uXG4gKiAoIzI4MDYpLiBJdCBjYXJyaWVzIHRoZSBib29rbWFyayBnbHlwaCBhbmQgZm9sZHMgaW50byB0aGUgc2FtZSBzYW1lLWxpbmVcbiAqIGNsdXN0ZXIgYXMgbm90ZS90YWcgbWFya2VycywgYWRkaW5nIHRvIHRoZSBjb3VudCByYXRoZXIgdGhhbiBhIHNlY29uZCBpY29uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBib29rbWFyayAgQm9va21hcmsgc2hhcGUgd2l0aCBgaWRgIGFuZCBvcHRpb25hbCBgbmFtZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc11cbiAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IFtwYXJhbXMuaTE4bj1udWxsXSAgT2JqZWN0IHdpdGggYSB0KGtleSkgbWV0aG9kLCBvciBudWxsLlxuICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9ICBUaGUgbWFya2VyLCBvciBudWxsIHdoZW4gdGhlIGJvb2ttYXJrIGhhcyBubyBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQm9va21hcmtNYXJrZXIoYm9va21hcmssIHsgaTE4biA9IG51bGwgfSA9IHt9KSB7XG4gIGlmICghYm9va21hcmsgfHwgYm9va21hcmsuaWQgPT09IHVuZGVmaW5lZCB8fCBib29rbWFyay5pZCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcmF3TmFtZSA9IHR5cGVvZiBib29rbWFyay5uYW1lID09PSAnc3RyaW5nJyA/IGJvb2ttYXJrLm5hbWUudHJpbSgpIDogJyc7XG4gIGNvbnN0IG5hbWUgPSByYXdOYW1lIHx8IHRyYW5zbGF0ZShpMThuLCAnYW5ub3RhdGlvbnMuYm9va21hcmtfZGVmYXVsdF9uYW1lJywgJ0Jvb2ttYXJrJyk7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNsYXRlKGkxOG4sICdhbm5vdGF0aW9ucy5ib29rbWFya19tYXJrZXJfbGFiZWwnLCAnQm9va21hcms6IDpuYW1lJylcbiAgICAucmVwbGFjZSgnOm5hbWUnLCBuYW1lKTtcblxuICBjb25zdCBtYXJrZXIgPSBfYnVpbGRNYXJrZXJTaGVsbChgJHtCT09LTUFSS19NQVJLRVJfRk9SX1BSRUZJWH0ke2Jvb2ttYXJrLmlkfWAsIGxhYmVsKTtcbiAgbWFya2VyLmNsYXNzTGlzdC5hZGQoQk9PS01BUktfTUFSS0VSX0NMQVNTKTtcbiAgbWFya2VyLnNldEF0dHJpYnV0ZShNQVJLRVJfQk9PS01BUktfQVRUUiwgJ3RydWUnKTtcbiAgbWFya2VyLnNldEF0dHJpYnV0ZSgnZGF0YS1ib29rbWFyay1pZCcsIFN0cmluZyhib29rbWFyay5pZCkpO1xuICBtYXJrZXIuc2V0QXR0cmlidXRlKCdkYXRhLWJvb2ttYXJrLW5hbWUnLCBuYW1lKTtcbiAgbWFya2VyLmFwcGVuZENoaWxkKF9idWlsZEljb24oQk9PS01BUktfR0xZUEhfQ0xBU1MpKTtcblxuICByZXR1cm4gbWFya2VyO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBndXR0ZXIgbWFya2VyIHN0YW5kcyBmb3IgYSBib29rbWFyayByYXRoZXIgdGhhbiBhIG5vdGUvdGFnIG1hcmsuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbWFya2VyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQm9va21hcmtNYXJrZXIobWFya2VyKSB7XG4gIHJldHVybi
129B0eXBlb2YgbWFya2VyPy5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbidcbiAgICAmJiBtYXJrZXIuZ2V0QXR0cmlidXRlKE1BUktFUl9CT09LTUFSS19BVFRSKSA9PT0gJ3RydWUnO1xufVxuXG4vKipcbiAqIFRoZSBjb21wb3NpdGlvbiBvZiBhIGxpbmUncyBndXR0ZXIgbWFya2VyczogdGhlIHRvdGFsIHBsdXMgaG93IG1hbnkgY2FycnkgYVxuICogbm90ZSwgY2FycnkgdGFncywgb3IgYXJlIGEgYm9va21hcmsgKCM0NzA3KS5cbiAqXG4gKiBQdXJlIGF0dHJpYnV0ZSByZWFkcyDigJQgbm8gbGF5b3V0IOKAlCBzbyB0aGUgY2x1c3RlciBDT1VOVCBsb2dpYyBjYW4gYmVcbiAqIHVuaXQtdGVzdGVkIHdpdGhvdXQgYSByZWFsIGVuZ2luZS4gYF9jb2xsYXBzZUxpbmUoKWAgdXNlcyBpdCBhcyB0aGUgc2luZ2xlXG4gKiBzb3VyY2Ugb2YgdGhlIG51bWJlcnMgaXQgd3JpdGVzIG9udG8gdGhlIGNsdXN0ZXIsIGFuZCB0aGUgc2FtZSBudW1iZXJzIGdhdGVcbiAqIHdoaWNoIGdseXBocyB0aGUgdW5pb24gY2Fycmllcy5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEhUTUxFbGVtZW50Pn0gbWFya2Vyc1xuICogQHJldHVybnMge3t0b3RhbDogbnVtYmVyLCBub3RlTWFya3M6IG51bWJlciwgdGFnTWFya3M6IG51bWJlciwgYm9va21hcmtNYXJrczogbnVtYmVyfX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsdXN0ZXJDb21wb3NpdGlvbihtYXJrZXJzKSB7XG4gIGNvbnN0IGxpc3QgPSBBcnJheS5pc0FycmF5KG1hcmtlcnMpID8gbWFya2VycyA6IEFycmF5LmZyb20obWFya2VycyB8fCBbXSk7XG5cbiAgY29uc3Qgbm90ZU1hcmtzID0gbGlzdC5maWx0ZXIoXG4gICAgKG1hcmtlcikgPT4gbWFya2VyPy5nZXRBdHRyaWJ1dGU/LihNQVJLRVJfTk9URV9BVFRSKSA9PT0gJ3RydWUnXG4gICkubGVuZ3RoO1xuICBjb25zdCB0YWdNYXJrcyA9IGxpc3QuZmlsdGVyKFxuICAgIChtYXJrZXIpID0+IChOdW1iZXIucGFyc2VJbnQobWFya2VyPy5nZXRBdHRyaWJ1dGU/LihNQVJLRVJfVEFHX0NPVU5UX0FUVFIpIHx8ICcwJywgMTApIHx8IDApID4gMFxuICApLmxlbmd0aDtcbiAgY29uc3QgYm9va21hcmtNYXJrcyA9IGxpc3QuZmlsdGVyKChtYXJrZXIpID0+IGlzQm9va21hcmtNYXJrZXIobWFya2VyKSkubGVuZ3RoO1xuXG4gIHJldHVybiB7IHRvdGFsOiBsaXN0Lmxlbmd0aCwgbm90ZU1hcmtzLCB0YWdNYXJrcywgYm9va21hcmtNYXJrcyB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzaGFyZWQgZ3V0dGVyLW1hcmtlciBzaGVsbDogYSB6ZXJvLXRleHQsIGtleWJvYXJkLXJlYWNoYWJsZSBzcGFuXG4gKiB3aG9zZSBsYWJlbCBsaXZlcyBlbnRpcmVseSBpbiBhdHRyaWJ1dGVzICgjMjgwNikuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBtYXJrSWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge0hUTUxFbGVtZW50fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2J1aWxkTWFya2VyU2hlbGwobWFya0lkLCBsYWJlbCkge1xuICBjb25zdCBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gIG1hcmtlci5jbGFzc05hbWUgPSBNQVJLRVJfQ0xBU1M7XG4gIG1hcmtlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWFya2VyLWZvcicsIFN0cmluZyhtYXJrSWQpKTtcbiAgbWFya2VyLnNldEF0dHJpYnV0ZSgncm9sZScsICdidXR0b24nKTtcbiAgbWFya2VyLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICBtYXJrZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgbGFiZWwpO1xuICBtYXJrZXIudGl0bGUgPSBsYWJlbDtcblxuICAvLyBEbyBub3Qgc3RhcnQgYSB0ZXh0IHNlbGVjdGlvbiB3aGVuIHRoZSByZWFkZXIgcHJlc3NlcyBvbiB0aGUgbWFya2VyOyB0aGVcbiAgLy8gY2xpY2sgc3RpbGwgZmlyZXMgYW5kIGJ1YmJsZXMvY2FwdHVyZXMgdG8gdGhlIDxtYXJrPiB0byBvcGVuIHRoZSBvcHRpb25zLlxuICBtYXJrZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgLy8gS2V5Ym9hcmQgcGFyaXR5OiBFbnRlci9TcGFjZSBlbmdhZ2UgdGhlIGhpZ2hsaWdodCwgc2FtZSBhcyBhIGNsaWNrLlxuICBtYXJrZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBtYXJrZXIuY2xpY2soKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBtYXJrZXI7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHRydW5jYXRpb24gd2FybmluZyBtYXJrZXIgZm9yIGEgcGFydGlhbGx5IHJlbmRlcmVkIGhpZ2hsaWdodCAoIzQzMDApLlxuICpcbiAqIEEgaGlnaGxpZ2h0IHRoYXQgYW5jaG9yZWQgaW4gc29tZSBvZiBpdHMgYmxvY2tzIGJ1dCBub3QgYWxsIGlzIGtlcHQgcmF0aGVyXG4gKiB0aGFuIGRpc2NhcmRlZCwgc28gaXQgbXVzdCBzYXkgc286IHRoaXMgdHJpYW5nbGUgc2l0cyBpbiB0aGUgZ3V0dGVyIGF0IHRoZSBFTkRcbiAqIG9mIHdoYXQgZGlkIHJlbmRlciwgd2hlcmUgdGhlIGhpZ2hsaWdodCB3YXMgY3V0IHNob3J0LiBUaGUgbm90ZS90YWcgbWFya2VyXG4gKiBhbmNob3JzIHRvIHRoZSBoaWdobGlnaHQncyBmaXJzdCBsaW5lLCB0aGlzIG9uZSB0byBpdHMgbGFzdCwgc28gYSBoaWdobGlnaHRcbiAqIGNhcnJ5aW5nIGEgbm90ZSBBTkQgYSB0cnVuY2F0aW9uIHNob3dzIGJvdGggd2l0aG91dCB0aGVtIG92ZXJsYXBwaW5nLlxuICpcbiAqIFplcm8tdGV4dCwgbGlrZSBldmVyeSBndXR0ZXIgbWFya2VyIOKAlCBoaWdobGlnaHQgcmVzdG9yZSBjb3VudHMgY2hhcmFjdGVyc1xuICogKCMyODA2KSwgc28gYSBsYWJlbCBpbiB0aGUgdGV4dCB3b3VsZCBzaGlmdCB0aGlzIG1hcmsncyBvZmZzZXRzIGFuZCB0aG9zZSBvZlxuICogZXZlcnkgbGF0ZXIgbWFyayBvbiB0aGUgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWFyayAgTWFyayBzaGFwZSB3aXRoIGBpZGAuXG4gKiBAcGFyYW0ge09
129iamVjdH0gW3BhcmFtc11cbiAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IFtwYXJhbXMuaTE4bj1udWxsXSAgT2JqZWN0IHdpdGggYSB0KGtleSkgbWV0aG9kLCBvciBudWxsLlxuICogQHJldHVybnMge0hUTUxFbGVtZW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUcnVuY2F0aW9uTWFya2VyKG1hcmssIHsgaTE4biA9IG51bGwgfSA9IHt9KSB7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNsYXRlKFxuICAgIGkxOG4sXG4gICAgJ2Fubm90YXRpb25zLmhpZ2hsaWdodF90cnVuY2F0ZWQnLFxuICAgICdQYXJ0IG9mIHRoaXMgaGlnaGxpZ2h0IGNvdWxkIG5vdCBiZSBzaG93bidcbiAgKTtcblxuICBjb25zdCBtYXJrZXIgPSBfYnVpbGRNYXJrZXJTaGVsbChtYXJrPy5pZCwgbGFiZWwpO1xuICBtYXJrZXIuY2xhc3NMaXN0LmFkZChUUlVOQ0FUSU9OX01BUktFUl9DTEFTUyk7XG4gIG1hcmtlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5jaG9yLWxpbmUnLCAnbGFzdCcpO1xuICBtYXJrZXIuYXBwZW5kQ2hpbGQoX2J1aWxkSWNvbignZmEtdHJpYW5nbGUtZXhjbGFtYXRpb24nKSk7XG5cbiAgcmV0dXJuIG1hcmtlcjtcbn1cblxuLyoqXG4gKiBBcHBseSAob3IgcmVmcmVzaCkgdGhlIHRydW5jYXRpb24gd2FybmluZyBmb3IgYSBtYXJrIHdpdGhpbiBhIHJvb3QgZWxlbWVudC5cbiAqXG4gKiBBIG5vLW9wIHVubGVzcyB0aGUgcmVuZGVyIHBhdGggZmxhZ2dlZCBhIHNlZ21lbnQgd2l0aCBkYXRhLXRydW5jYXRlZCwgc28gYVxuICogZnVsbHkgcmVuZGVyZWQgaGlnaGxpZ2h0IG5ldmVyIHNob3dzIGEgd2FybmluZy4gSWRlbXBvdGVudDogYW4gZXhpc3RpbmdcbiAqIHdhcm5pbmcgZm9yIHRoaXMgbWFyayBpZCBpcyByZW1vdmVkIGZpcnN0LCBhbmQgdGhlIG5vdGUvdGFnIG1hcmtlciBpcyBsZWZ0XG4gKiBhbG9uZS5cbiAqXG4gKiBAcGFyYW0ge1BhcmVudE5vZGV9IHJvb3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXJrICBNYXJrIHNoYXBlIHdpdGggYGlkYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gIFBhc3NlZCB0aHJvdWdoIHRvIGJ1aWxkVHJ1bmNhdGlvbk1hcmtlci5cbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUcnVuY2F0aW9uTWFya2VyKHJvb3QsIG1hcmssIG9wdGlvbnMgPSB7fSkge1xuICBpZiAoIXJvb3QgfHwgbWFyayA9PT0gbnVsbCB8fCBtYXJrID09PSB1bmRlZmluZWQgfHwgbWFyay5pZCA9PT0gdW5kZWZpbmVkIHx8IG1hcmsuaWQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG1hcmtlckZvciA9IFN0cmluZyhtYXJrLmlkKTtcbiAgY29uc3QgbWFya2VyRm9yU2VsZWN0b3IgPSBtYXJrZXJGb3IucmVwbGFjZSgvW1wiXFxcXF0vZywgJ1xcXFwkJicpO1xuXG4gIHJvb3RcbiAgICAucXVlcnlTZWxlY3RvckFsbChgLiR7VFJVTkNBVElPTl9NQVJLRVJfQ0xBU1N9W2RhdGEtbWFya2VyLWZvcj1cIiR7bWFya2VyRm9yU2VsZWN0b3J9XCJdYClcbiAgICAuZm9yRWFjaCgoZWwpID0+IGVsLnJlbW92ZSgpKTtcblxuICBjb25zdCB0cnVuY2F0ZWQgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoYG1hcmtbZGF0YS1pZD1cIiR7bWFya2VyRm9yU2VsZWN0b3J9XCJdW2RhdGEtdHJ1bmNhdGVkXWApO1xuICBpZiAodHJ1bmNhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQW5jaG9yIHRvIHRoZSB
129MQVNUIGZsYWdnZWQgc2VnbWVudDogdGhhdCBpcyB3aGVyZSB0aGUgaGlnaGxpZ2h0IHN0b3BwZWQuXG4gIGNvbnN0IHNlZ21lbnQgPSB0cnVuY2F0ZWRbdHJ1bmNhdGVkLmxlbmd0aCAtIDFdO1xuICBjb25zdCBtYXJrZXIgPSBidWlsZFRydW5jYXRpb25NYXJrZXIobWFyaywgb3B0aW9ucyk7XG4gIHNlZ21lbnQuYXBwZW5kQ2hpbGQobWFya2VyKTtcbiAgcG9zaXRpb25Ob3RlVGFnTWFya2VyKG1hcmtlcik7XG5cbiAgcmV0dXJuIG1hcmtlcjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGRlY29yYXRpdmUgRm9udEF3ZXNvbWUgaWNvbiAoYW5ub3VuY2VkIHZpYSB0aGUgbWFya2VyJ3MgYXJpYS1sYWJlbCkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGdseXBoQ2xhc3NcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9idWlsZEljb24oZ2x5cGhDbGFzcykge1xuICBjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xuICBpY29uLmNsYXNzTmFtZSA9IGBmYS1zb2xpZCAke2dseXBoQ2xhc3N9ICR7SUNPTl9DTEFTU31gO1xuICBpY29uLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICByZXR1cm4gaWNvbjtcbn1cblxuLyoqXG4gKiBBcHBseSAob3IgcmVmcmVzaCkgdGhlIG1hcmtlciBmb3IgYSBtYXJrIHdpdGhpbiBhIHJvb3QgZWxlbWVudC5cbiAqXG4gKiBJZGVtcG90ZW50OiBhbnkgZXhpc3RpbmcgbWFya2VyIGZvciB0aGlzIG1hcmsgaWQgaXMgcmVtb3ZlZCBmaXJzdCwgc28gYVxuICogcmVwYWludCBuZXZlciBkdXBsaWNhdGVzIHRoZSBtYXJrZXIgYW5kIGEgbm90ZS90YWdzIHJlbW92YWwgY2xlYXJzIGl0LiBUaGVcbiAqIG1hcmtlciBsYW5kcyBvbiB0aGUgRklSU1QgPG1hcms+IHNlZ21lbnQgZm9yIHRoZSBpZCAoZG9jdW1lbnQgb3JkZXIpIGFuZCBpc1xuICogdGhlbiBwb3NpdGlvbmVkIGludG8gdGhlIHJpZ2h0IGd1dHRlciBhbGlnbmVkIHRvIHRoYXQgc2VnbWVudCdzIGZpcnN0IGxpbmUuXG4gKlxuICogQHBhcmFtIHtQYXJlbnROb2RlfSByb290ICBFbGVtZW50L2RvY3VtZW50IHRvIHNlYXJjaCB3aXRoaW4uXG4gKiBAcGFyYW0ge09iamVjdH0gbWFyayAgICAgIE1hcmsgc2hhcGUgd2l0aCBgaWRgIGFuZCBvcHRpb25hbCBgbm90ZWAvYHRhZ3NgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBQYXNzZWQgdGhyb3VnaCB0byBidWlsZE5vdGVUYWdNYXJrZXIgKGUuZy4geyBpMThuIH0pLlxuICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9ICBUaGUgYXBwbGllZCBtYXJrZXIsIG9yIG51bGwgd2hlbiBub25lIHdhcyBhZGRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5Tm90ZVRhZ01hcmtlcihyb290LCBtYXJrLCBvcHRpb25zID0ge30pIHtcbiAgLy8gQSB1c2VyLWRyaXZlbiBjaGFuZ2UgKHNhdmluZyBhIG5vdGUsIHNhdmluZyB0YWdzKSBtdXN0IHJlLW1lYXN1cmUgYW5kXG4gIC8vIHJlZ3JvdXAgdGhlIFdIT0xFIGxpbmUsIG5vdCBqdXN0IHRoaXMgbWFyay4gU2VlIHJlZ3JvdXBJZk5lZWRlZCgpIGJlbG93LlxuICBjb25zdCByZWZsb3cgPSBvcHRpb25zLnJlZmxvdyA9PT0gdHJ1ZTtcbiAgaWYgKCFyb290IHx8IG1hcmsgPT09IG51bGwgfHwgbWFyayA9PT0gdW5kZWZpbmVkIHx8IG1hcmsuaWQgPT09IHVuZGVmaW5lZCB8fCBtYXJrLmlkID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYXJrZXJGb3IgPSBTdHJpbmcobWFyay5pZCk7XG4gIC8vIEVzY2FwZSB0aGUgc3RyaW5nLXNwZWNpYWwgY2hhcnMgZm9yIGEgcXVvdGVkIGF0dHJpYnV0ZS12YWx1ZSBzZWxlY3RvciBzbyBhXG4gIC8vIG5vbi1udW1lcmljIGlkIGNhbiBuZXZlciBicmVhayB0aGUgc2VsZWN0b3Igb3IgdGhyb3cgYSBTeW50YXhFcnJvci5cbiAgY29uc3QgbWFya2VyRm9yU2VsZWN0b3IgPSBtYXJrZXJGb3IucmVwbGFjZSgvW1wiXFxcXF0vZywgJ1xcXFwkJicpO1xuXG4gIC8vIFJlbW92aW5nIGEgbWFya2VyIHRoYXQgd2FzIHBhcnQgb2YgYSBjbHVzdGVyIGludmFsaWRhdGVzIHRoYXQgY2x1c3RlcjogaXRcbiAgLy8gZWl0aGVyIGNhcnJpZWQgdGhlIGNvdW50IGZvciBpdHMgbGluZSBvciB3YXMgaGlkZGVuIGJlaGluZCBvbmUsIHNvIHRoZVxuICAvLyBsaW5lIGhhcyB0byBiZSByZWdyb3VwZWQgb25jZSB0aGUgbmV3IG1hcmtlciBpcyBpbiBwbGFjZSAoIzQ0NjkpLiBPbmx5XG4gIC8vIHRoYXQgY2FzZSBwYXlzIGZvciBhIHJlZ3JvdXBpbmcgcGFzcywgc28gdGhlIHJlbmRlciBsb29wJ3MgZmlyc3QgcGFpbnQg4oCUXG4gIC8vIHdoZXJlIG5vdGhpbmcgaXMgY2x1c3RlcmVkIHlldCDigJQgZG9lcyBub3QgZG8gaXQgb25jZSBwZXIgbWFyay5cbiAgbGV0IHdhc0NsdXN0ZXJlZCA9IGZhbHNlO1xuICByb290XG4gICAgLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBgLiR7TUFSS0VSX0NMQVNTfVtkYXRhLW1hcmtlci1mb3I9XCIke21hcmtlckZvclNlbGVjdG9yfVwiXTpub3QoLiR7VFJVTkNBVElPTl9NQVJLRVJfQ0xBU1N9KWBcbiAgICApXG4gICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICB3YXNDbHVzdGVyZWQgPVxuICAgICAgICB3YXNDbHVzdGVyZWQgfHxcbiAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKENMVVNURVJfQ0xBU1MpIHx8XG4gICAgICAgIGVsLmNsYXNzTGlzdC5jb250YWlucyhDTFVTVEVSRURfQ0xBU1MpO1xuICAgICAgZWwucmVtb3ZlKCk7XG4gICAgfSk7XG5cbiAgY29uc3QgcmVncm91cElmTmVlZGVkID0gKHJlc3VsdCkgPT4ge1xuICAgIGlmIChyZWZsb3cpIHtcbiAgICAgIC8vIHdhc0NsdXN0ZXJlZCBjYW5ub3Qgc2VlIHRoaXMgY2FzZTogYSBtYXJrIGdhaW5pbmcgaXRzIEZJUlNUIG5vdGUgb3IgdGFnXG4gICAgICAvLyBoYXMgbm8gcHJldmlvdXMgbWFya2VyIHRvIGluc3BlY3QsIHNvIGl0IGlzIGZhbHNlLCBubyByZWdyb3VwaW5nIHJhbixcbiAgICAgIC8vIGFuZCB0aGUgbmV3IGljb24gbGFuZGVkIG9uIHRoZSBzYW1lIGd1dHRlciBwb2ludCBhcyBhIGxpbmUtbWF0ZSdzIOKAlFxuICAgICAgLy8gaW52aXNpYmxlIGJlaGluZCBpdCwgd2l0aCBubyBjbHVzdGVyIGFuZCBubyBjb3VudC4gUmVtb3ZpbmcgdGhlIGxhc3RcbiAgICAgIC8vIG5vdGUvdGFnIGhhcyB0aGUgbWlycm9yIHByb2JsZW06IHRoZSBsaW5lIGtlZXBzIGEgc3RhbGUgZ3JvdXBpbmcuXG4gICAgICAvLyBPbmx5IGEgZnVsbCBwYXNzIHJlLW
1291lYXN1cmVzIGV2ZXJ5IG1hcmtlciBhbmQgcmVidWlsZHMgdGhlIGdyb3VwaW5nLFxuICAgICAgLy8gYW5kIGl0IGFsc28gdW5mb2xkcyBoaWRkZW4gbWFya2VycyBzbyB0aGV5IGhhdmUgYSBib3ggdG8gbWVhc3VyZS5cbiAgICAgIC8vIENvbmZpbmVkIHRvIHRoZSB1cGRhdGUgcGF0aHMgc28gdGhlIHJlbmRlciBsb29wJ3MgZmlyc3QgcGFpbnQgc3RpbGxcbiAgICAgIC8vIHBheXMgZm9yIGV4YWN0bHkgb25lIGNsdXN0ZXJpbmcgcGFzcyByYXRoZXIgdGhhbiBvbmUgcGVyIG1hcmsuXG4gICAgICByZXBvc2l0aW9uTm90ZVRhZ01hcmtlcnMocm9vdCk7XG4gICAgfSBlbHNlIGlmICh3YXNDbHVzdGVyZWQpIHtcbiAgICAgIGNsdXN0ZXJOb3RlVGFnTWFya2Vycyhyb290KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBjb25zdCBzZWdtZW50cyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbChgbWFya1tkYXRhLWlkPVwiJHttYXJrZXJGb3JTZWxlY3Rvcn1cIl1gKTtcbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiByZWdyb3VwSWZOZWVkZWQobnVsbCk7XG4gIH1cblxuICBjb25zdCBtYXJrZXIgPSBidWlsZE5vdGVUYWdNYXJrZXIobWFyaywgb3B0aW9ucyk7XG4gIGlmICghbWFya2VyKSB7XG4gICAgcmV0dXJuIHJlZ3JvdXBJZk5lZWRlZChudWxsKTtcbiAgfVxuXG4gIC8vIEFuY2hvciB0byB0aGUgRklSU1Qgc2VnbWVudDogaXRzIGZpcnN0IGxpbmUgaXMgd2hlcmUgdGhlIGhpZ2hsaWdodCBiZWdpbnMsXG4gIC8vIHdoaWNoIGlzIHdoZXJlIHRoZSBndXR0ZXIgaWNvbiBzaG91bGQgc2l0LlxuICBzZWdtZW50c1swXS5hcHBlbmRDaGlsZChtYXJrZXIpO1xuICBwb3NpdGlvbk5vdGVUYWdNYXJrZXIobWFya2VyKTtcbiAgcmV0dXJuIHJlZ3JvdXBJZk5lZWRlZChtYXJrZXIpO1xufVxuXG4vKipcbiAqIFBvc2l0aW9uIGEgc2luZ2xlIG1hcmtlciBpbnRvIHRoZSByaWdodCBndXR0ZXIsIGFsaWduZWQgdG8gdGhlIGZpcnN0IGxpbmUgb2ZcbiAqIGl0cyBvd25pbmcgPG1hcms+IHNlZ21lbnQuXG4gKlxuICogVEhSRUUgcmVmZXJlbmNlIGVsZW1lbnRzIGFyZSBpbnZvbHZlZCBhbmQgbm8gdHdvIG9mIHRoZW0gYXJlIHRoZSBzYW1lXG4gKiBlbGVtZW50LiBDb25mbGF0aW5nIGFueSBwYWlyIG9mIHRoZW0gaGFzIGFscmVhZHkgc2hpcHBlZCBhIGJ1Zywgc28ga2VlcCB0aGVtXG4gKiBhcGFydDpcbiAqXG4gKiAgIC0gdGhlIE9SSUdJTiAoIzQ0MTQpLCB3aGljaCB0aGUgYnJvd3NlciByZXNvbHZlcyB0aGUgbWFya2VyJ3MgdG9wL2xlZnRcbiAqICAgICBhZ2FpbnN0LiBGb3IgYW4gYWJzb2x1dGVseSBwb3NpdGlvbmVkIGVsZW1lbnQgdGhhdCBpcyBpdHMgbmVhcmVzdFxuICogICAgIFBPU0lUSU9ORUQgYW5jZXN0b3IsIHdoaWNoIGlzIHRoZSA8bWFyaz4gaXRzZWxmOiBhbm5vdGF0aW9ucy5qcyBnaXZlc1xuICogICAgIGV2ZXJ5IHJlbmRlcmVkIG1hcmsgYW4gaW5saW5lIGBwb3NpdGlvbjogcmVsYXRpdmVgIHNvIHRoZSBvcHRpb25zIHBvcHVwIOKAlFxuICogICAgIGEgY2hpbGQgb2YgdGhlIDxtYXJrPiBzaW5jZSAjNjE4IOKAlCBoYXMgYSBjb250YWluaW5nIGJsb2NrLiBNZWFzdXJpbmdcbiAqICAgICBhZ2FpbnN0ICNjb250ZW50LXdyYXBwZXIgd2hpbGUgdGhlIGJyb3dzZXIgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgPG1hcms+XG4gKiAgICAgcHV0IHRoZSBtYXJrZXIgaHVuZHJlZHMgb2YgcGl4ZWxzIG9mZi1zY3JlZW4sIHNpbGVudGx5OiBpdCB3YXMgY3JlYXRlZCxcbiAqICAgICBzdHlsZWQgYW5kIHZpc2libGUsIGFuZCBvbmx5IGl0cyBjb29yZGluYXRlcyB3ZXJlIHdyb25nLlxuICogICAtIHRoZSBCT1VORFMgKCM0NDE0KSwgd2hpY2ggaXMgdGhlIHJlYWRlciBjb250ZW50IGNvbHVtblxuICogICAgICgjY29udGVudC13cmFwcGVyKS4gVGhpcyBpcyB0aGUgb3V0ZXIgZXh0ZW50IHRoZSBtYXJrZXIgbWF5IHRyYXZlbCB0byxcbiAqICAgICBhbmQgZG9lcyBub3QgY2hhbmdlIHdpdGggd2hhdGV2ZXIgdGhlIG9yaWdpbiBoYXBwZW5zIHRvIGJlLlxuICogICAtIHRoZSBHVVRURVIgVEFSR0VUICgjNDQ1MSksIHdoaWNoIGlzIHRoZSByZW5kZXJlZCB0ZXh0IGNvbHVtbiB0aGUgbWFya2VyXG4gKiAgICAgYWltcyB0byBzaXQganVzdCBwYXN0IChURVhUX0NPTFVNTl9TRUxFQ1RPUiksIHRvZ2V0aGVyIHdpdGggdGhlIGxpbmUgaXRcbiAqICAgICBtYXkgbm90IGNyb3NzIG9uIHRoZSBmYXIgc2lkZSAoR1VUVEVSX0VER0VfU0VMRUNUT1IpLiBUaGlzIGlzIE5PVCB0aGVcbiAqICAgICBib3VuZHM6IHRoZSBib3VuZHMgaXMgdGhlIGZ1bGwtd2lkdGggd3JhcHBlciwgc28gY2xhbXBpbmcgYWdhaW5zdCBpdFxuICogICAgIGFsb25lIG5ldmVyIGZpcmVkIGFuZCBsZXQgdGhlIG1hcmtlciBzaXQgZmFyIG91dCBpbiB0aGUgcGFnZSBtYXJnaW4uXG4gKiAgICAgSXQgaXMgTk9UIHRoZSBvcmlnaW4gZWl0aGVyIOKAlCBpdCBtb3ZlcyB3aXRoIHRoZSByZWFkZXIncyBsYXlvdXQsIG5vdFxuICogICAgIHdpdGggd2hpY2ggPG1hcms+IHRoZSBtYXJrZXIgaGFwcGVucyB0byBoYW5nIG9mZi5cbiAqXG4gKiBUaGUgaG9yaXpvbnRhbCBwbGFjZW1lbnQgcHJlZmVycyB0aGUgc3BhY2UganVzdCBwYXN0IHRoZSB0ZXh0IGNvbHVtbidzIHJpZ2h0XG4gKiBlZGdlICh0aGUgZ3V0dGVyKSwgYW5kIGtlZXBzIHRoZSB3aG9sZSBtYXJrZXIgaW5zaWRlIHRoZSBndXR0ZXIncyBmYXIgbGluZS5cbiAqIE9uIG5hcnJvdyAvIG1vYmlsZSB3aWR0aHMgd2hlcmUgdGhlcmUgaXMgbm8gcm9vbSBmb3IgaXQgdGhlcmUsIGl0IGZhbGxzIGJhY2tcbiAqIHRvIGp1c3QgcGFzdCB0aGUgZW5kIG9mIHRoZSBoaWdobGlnaHQncyBmaXJzdCBsaW5lLCBjbGFtcGVkIGluc2lkZSB0aGUgYm91bmRzXG4gKiBzbyBpdCBuZXZlciBydW5zIG9mZi1zY3JlZW4uXG4gKlxuICogU2FmZSB0byBjYWxsIHdpdGggYSBudWxsL2RldGFjaGVkIG1hcmtlciAobm8tb3ApIGFuZCBzYWZlIHVuZGVyIGpzZG9tIChyZWN0c1xuICogcmVhZCBhcyB6ZXJvKTsgdGhlIHJlYWwgYWxpZ25tZW50IGlzIHZlcmlmaWVkIGluIGEgYnJvd3Nlci5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IG1hcmtlclxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGlvbk5vdGVUYWdNYXJrZXIobWFya2VyKSB7XG4gIGlmICghbWFya2VyIHx8IHR5cGVvZiBtYXJrZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2VnbWVudCA9IG1hcmtlci5wYXJlbnRFbGVtZW50O1xuICBpZiAoIXNlZ21lbnQgfHwgdHlwZW9mIHNlZ21lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYm91bmRzID0gX2JvdW5kc0ZvcihzZWdtZW50KTtcbiAgaWYgKCFib3VuZHMgfHwgdHlwZW9mIGJvdW5kcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBTZXQgdGhlIHBvc2l0aW9uIEJFRk9SRSByZXNvbHZpbmcgdGhlIG9yaWdpbjogb2Zmc2V0UGFyZW50IGFuc3dlcnMgZm9yIHRoZVxuICAvLyBlbGVtZW50J3MgY3VycmVudCBwb3NpdGlvbiB2YWx1ZSwgYW5kIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGVtZW50IGlzXG4gIC8vIHRoZSBvbmx5IGNhc2Ugd2hvc2UgYW5zd2VyIHdlIHdhbnQuXG4gIG1hcmtlci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cbiAgY29uc3Qgb3JpZ2luID0gX29yaWdpbkZvcihtYXJrZXIsIHNlZ21lbnQsIGJvdW5kcyk7XG4gIGNvbnN0IG9yaWdpblJlY3QgPSBvcmlnaW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IGJvdW5kc1JlY3QgPSBib3VuZHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgY29uc3QgbGluZVJlY3RzID0gdHlwZW9mIHNlZ21lbnQuZ2V0Q2xpZW50UmVjdHMgPT09ICdmdW5jdGlvbicgPyBzZWdtZW50LmdldENsaWVudFJlY3RzKCkgOiBbXTtcbiAgLy8gVGhlIHRydW5jYXRpb24gd2FybmluZyBtYXJrcyB3aGVyZSB0aGUgaGlnaGxpZ2h0IHdhcyBjdXQgc2hvcnQsIHNvIGl0IGFsaWduc1xuICAvLyB0byB0aGUgc2VnbWVudCdzIExBU1QgbGluZTsgZXZlcnkgb3RoZXIgbWFya2VyIGFsaWducyB0byBpdHMgZmlyc3QgKCM0MzAwKS5cbiAgY29uc3QgYW5jaG9yc1RvTGFzdExpbmUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWFuY2hvci1saW5lJykgPT09ICdsYXN0JztcbiAgY29uc3QgZmFsbGJhY2tSZWN0ID0gc2VnbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgZmlyc3RMaW5lID0gbGluZVJlY3RzLmxlbmd0aFxuICAgID8gbGluZVJlY3RzW2FuY2hvcnNUb0xhc3RMaW5lID8gbGluZVJlY3RzLmxlbmd0aCAtIDEgOiAwXVxuICAgIDogZmFsbGJhY2tSZWN0O1xuXG4gIGNvbnN0IGFuY2hvclRvcCA9IE1hdGgucm91bmQoZmlyc3RMaW5l
129LnRvcCk7XG4gIGNvbnN0IHRvcCA9IGFuY2hvclRvcCArIF9jb2xsaXNpb25PZmZzZXRGb3IobWFya2VyLCBib3VuZHMsIGFuY2hvclRvcCk7XG5cbiAgbWFya2VyLnN0eWxlLnRvcCA9IGAke01hdGgucm91bmQodG9wIC0gb3JpZ2luUmVjdC50b3ApfXB4YDtcblxuICAvLyBHVVRURVIgVEFSR0VUIOKAlCB0aGUgcmVuZGVyZWQgdGV4dCBjb2x1bW4sIGFuZCB0aGUgbGluZSBvbiBpdHMgZmFyIHNpZGUuXG4gIC8vIFRoZSBoaWdobGlnaHQncyBvd24gZmlyc3QgbGluZSBpcyB0aGUgZmFsbGJhY2sgZm9yIGNvbnRlbnQgdGhhdCByZW5kZXJzIG5vXG4gIC8vIC5zZWN0aW9uICh0aGUgcmVhZGVyIGFsd2F5cyBkb2VzOyBhIHN0cmF5IGNhbGxlciBtaWdodCBub3QpLlxuICBjb25zdCB0ZXh0Q29sdW1uID0gX3Jlc29sdmVHdXR0ZXJFbGVtZW50KHNlZ21lbnQsIGJvdW5kcywgVEVYVF9DT0xVTU5fU0VMRUNUT1IpO1xuICBjb25zdCBjb2x1bW5SZWN0ID0gdGV4dENvbHVtbiA/IHRleHRDb2x1bW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgOiBmaXJzdExpbmU7XG4gIGNvbnN0IGd1dHRlckVkZ2UgPSBfcmVzb2x2ZUd1dHRlckVsZW1lbnQoc2VnbWVudCwgYm91bmRzLCBHVVRURVJfRURHRV9TRUxFQ1RPUik7XG4gIC8vIE5ldmVyIHBhc3QgdGhlIGJvdW5kcywgd2hhdGV2ZXIgdGhlIGd1dHRlciBlZGdlIHJlcG9ydHMuXG4gIGNvbnN0IGd1dHRlclJpZ2h0ID0gZ3V0dGVyRWRnZVxuICAgID8gTWF0aC5taW4oZ3V0dGVyRWRnZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCwgYm91bmRzUmVjdC5yaWdodClcbiAgICA6IGJvdW5kc1JlY3QucmlnaHQ7XG5cbiAgY29uc3QgbWFya2VyV2lkdGggPSBtYXJrZXIub2Zmc2V0V2lkdGggfHwgMDtcbiAgLy8gV29ya2VkIG91dCBpbiBWSUVXUE9SVCBzcGFjZSwgd2hlcmUgdGhlIGd1dHRlciBhbmQgdGhlIGJvdW5kcyBsaXZlLCB0aGVuXG4gIC8vIGNvbnZlcnRlZCBpbnRvIHRoZSBvcmlnaW4ncyBzcGFjZSBhdCB0aGUgdmVyeSBlbmQuXG4gIGxldCBsZWZ0ID0gY29sdW1uUmVjdC5yaWdodCArIEdVVFRFUl9HQVBfUFg7XG5cbiAgLy8gTm8gcm9vbSBpbiB0aGUgZ3V0dGVyIChtb2JpbGUsIG9yIGEgcGFuZWwgdGhhdCBoYXMgdGFrZW4gaXQpOiByaWdodC1hbGlnblxuICAvLyB0aGUgbWFya2VyIGluIHdoYXRldmVyIHJvb20gaXMgbGVmdCwgc3RpbGwgbWVhc3VyZWQgZnJvbSB0aGUgTEFZT1VUIOKAlCBuZXZlclxuICAvLyBmcm9tIHRoZSBoaWdobGlnaHQgKCM0NTMzKS5cbiAgLy9cbiAgLy8gVGhpcyB1c2VkIHRvIHBpbiB0aGUgbWFya2VyIHBhc3QgYGZpcnN0TGluZS5yaWdodGAsIHRoZSBlbmQgb2YgdGhlXG4gIC8vIGhpZ2hsaWdodCdzIG93biBsaW5lIGJveCwgd2hpY2ggbWFrZXMgYGxlZnRgIGRlcGVuZCBvbiBXSEVSRSBPTiBUSEUgTElORVxuICAvLyB0aGUgcmVhZGVyIGhhcHBlbmVkIHRvIGhpZ2hsaWdodC4gQSBoaWdobGlnaHQgbmVhciB0aGUgU1RBUlQgb2YgYSBsaW5lIHB1dFxuICAvLyBpdHMgaWNvbnMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcnVubmluZyB0ZXh0OiBtZWFzdXJlZCBhdCBhIDM5MHB4IHZpZXdwb3J0LFxuICAvLyBhIGhpZ2hsaWdodCBlbmRpbmcgYXQgeD05OC44IGdvdCBpdHMgbWFya2VyIGF0IHg9MTA3LCBtaWQtcGFyYWdyYXBoLlxuICAvL1xuICAvLyBPbmx5IGEgaGlnaGxpZ2h0J3MgVkVSVElDQUwgcG9zaXRpb24gbWF5IGluZmx1ZW5jZSBpdHMgbWFya2VyLiBgdG9wYCBhYm92ZVxuICAvLyBpcyBhbmNob3JlZCB0byB0aGUgaGlnaGxpZ2h0J3Mgb3duIGxpbmUgYW5kIG11c3Qgc3RheSB0aGF0IHdheTsgYGxlZnRgIGlzIGFcbiAgLy8gcHJvcGVydHkgb2YgdGhlIGd1dHRlciwgYW5kIHR3byBtYXJrcyBvbiBvbmUgbGluZSB0aGVyZWZvcmUgcmVzb2x2ZSB0byB0aGVcbiAgLy8gc2FtZSB4IGF0IGV2ZXJ5IHdpZHRoIOKAlCB3aGljaCBpcyB3aGF0IGxldHMgY2x1c3RlcmluZyBncm91cCB0aGVtICgjNDQ5OSkuXG4gIGlmIChsZWZ0ICsgbWFya2VyV2lkdGggPiBndXR0ZXJSaWdodCkge1xuICAgIGxlZnQgPSBNYXRoLm1heChib3VuZHNSZWN0LmxlZnQsIGd1dHRlclJpZ2h0IC0gbWFya2VyV2lkdGgpO1xuICB9XG5cbiAgbWFya2VyLnN0eWxlLmxlZnQgPSBgJHtNYXRoLnJvdW5kKGxlZnQgLSBvcmlnaW5SZWN0LmxlZnQpfXB4YDtcblxuICBfc25hcFRvVmlld3BvcnRQb2ludChtYXJrZXIsIG9yaWdpbiwgbGVmdCwgdG9wKTtcbn1cblxuLyoqXG4gKiBDb3JyZWN0IHRoZSBtYXJrZXIgb250byB0aGUgdmlld3BvcnQgcG9pbnQgaXQgd2FzIGNvbXB1dGVkIGZvciwgd2hlbiB0aGVcbiAqIE9SSUdJTiBpcyBhbiBpbmxpbmUgYm94IHRoYXQgaGFzIGJlZW4gc3BsaXQgYWNyb3NzIGxpbmVzLlxuICpcbiAqIEEgd3JhcHBlZCA8bWFyaz4gZ2VuZXJhdGVzIHNldmVyYWwgaW5saW5lIGJveGVzLCBhbmQgdGhlIGNvbnRhaW5pbmcgYmxvY2tcbiAqIHRoZXkgZXN0YWJsaXNoIGlzIE5PVCB0aGUgdW5pb24gcmVjdCB0aGF0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHJlcG9ydHM6XG4gKiBDaHJvbWl1bSByZXNvbHZlcyBgbGVmdGAgYWdhaW5zdCB0aGUgRklSU1QgYm94J3Mgc3RhcnQgZWRnZSwgYW5kIHRoZSB0d29cbiAqIGRpc2FncmVlIGJ5IHRoZSB3aG9sZSBpbmRlbnQgb2YgdGhhdCBmaXJzdCBsaW5lLiBNZWFzdXJlZCBvbiBhIHdyYXBwZWRcbiAqIGhpZ2hsaWdodCBhdCBhIDM5MHB4IHZpZXdwb3J0ICgjNDQ1MSk6IHJlY3RzIFsyMjUuLjM2Ml0gYW5kIFsyOC4uNTZdLCB1bmlvblxuICogbGVmdCAyOCwgcmVzb2x2ZWQtYWdhaW5zdCBsZWZ0IDIyNSDigJQgc28gYSBjb3JyZWN0bHkgY29tcHV0ZWQsIGNvcnJlY3RseVxuICogY2xhbXBlZCBwb3NpdGlvbiBsYW5kZWQgMTk3cHggb2ZmLXNjcmVlbi4gRW5naW5lcyBkaWZmZXIgaGVyZSAodGhlIHNwZWMgYXNrc1xuICogZm9yIHRoZSB1bmlvbiksIHNvIHJhdGhlciB0aGFuIHJlaW1wbGVtZW50IGFueSBvbmUgZW5naW5lJ3MgcnVsZSwgdGhpcyByZWFkc1xuICogdGhlIHBvc2l0aW9uIHRoZSBicm93c2VyIGFjdHVhbGx5IHByb2R1Y2VkIGFuZCBjbG9zZXMgdGhlIHJlc2lkdWFsLlxuICpcbiAqIERlbGliZXJhdGVseSBza2lwcGVkIGZvciBhbiB1bmZyYWdtZW50ZWQgb3JpZ2luIOKAlCB0aGUgb3ZlcndoZWxtaW5nbHkgY29tbW9uXG4gKiBjYXNlIOKAlCBzbyB0aGUgZXh0cmEgbGF5b3V0IHJlYWQgaXMgb25seSBwYWlkIHdoZXJlIGl0IGlzIG5lZWRlZCwgYW5kIHNraXBwZWRcbiAqIGFnYWluIHdoZXJlIHRoZXJlIGlzIG5vIGxheW91dCBhdCBhbGwgKGpzZG9tIHJlcG9ydHMgZW1wdHkgcmVjdHMpLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG1hcmtlclxuICogQHBhcmFtIHtFbGVtZW50fSBvcmlnaW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlbmRlZExlZnQgIFZpZXdwb3J0IHggdGhlIG1hcmtlcidzIGxlZnQgZWRnZSBzaG91bGQgbGFuZCBvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbnRlbmRlZFRvcCAgIFZpZXdwb3J0IHkgdGhlIG1hcmtlcidzIHRvcCBlZGdlIHNob3VsZCBsYW5kIG9uLlxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfc25hcFRvVmlld3BvcnRQb2ludChtYXJrZXIsIG9yaWdpbiwgaW50ZW5kZWRMZWZ0LCBpbnRlbmRlZFRvcCkge1xuICBjb25zdCBmcmFnbWVudHMgPSB0eXBlb2Ygb3JpZ2luLmdldENsaWVudFJlY3RzID09PSAnZnVuY3Rpb24nID8gb3JpZ2luLmdldENsaWVudFJlY3RzKCkgOiBbXTtcbiAgaWYgKGZyYWdtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGxhY2VkID0gbWFya2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBpZiAoIXBsYWNlZC53aWR0aCAmJiAhcGxhY2VkLmhlaWdodCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG1hcmtlci5zdHlsZS5sZWZ0ID0gYCR7TWF0aC5yb3VuZCgocGFyc2VGbG9hdChtYXJrZXIuc3R5bGUubGVmdCkgfHwgMCkgKyAoaW50ZW5kZWRMZWZ0IC0gcGxhY2VkLmxlZnQpKX1weGA7XG4gIG1hcmtlci5zdHlsZS50b3AgPSBgJHtNYXRoLnJvdW5kKChwYXJzZU
129Zsb2F0KG1hcmtlci5zdHlsZS50b3ApIHx8IDApICsgKGludGVuZGVkVG9wIC0gcGxhY2VkLnRvcCkpfXB4YDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9uZSBvZiB0aGUgZ3V0dGVyLWRlZmluaW5nIGVsZW1lbnRzIGZvciBhIG1hcmtlci5cbiAqXG4gKiBQcmVmZXJzIHRoZSBzZWdtZW50J3Mgb3duIGFuY2VzdG9yIG92ZXIgYSBsb29rdXAgZnJvbSB0aGUgYm91bmRzLCBzbyBhIG1hcmtlclxuICogYWx3YXlzIG1lYXN1cmVzIHRoZSBjb2x1bW4gaXQgaXMgYWN0dWFsbHkgc2l0dGluZyBpbiByYXRoZXIgdGhhbiB0aGUgZmlyc3RcbiAqIG1hdGNoIGFueXdoZXJlIG9uIHRoZSBwYWdlLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gc2VnbWVudCAgVGhlIDxtYXJrPiB0aGUgbWFya2VyIGJlbG9uZ3MgdG8uXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJvdW5kc1xuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX3Jlc29sdmVHdXR0ZXJFbGVtZW50KHNlZ21lbnQsIGJvdW5kcywgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIChcbiAgICAodHlwZW9mIHNlZ21lbnQuY2xvc2VzdCA9PT0gJ2Z1bmN0aW9uJyAmJiBzZWdtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKSB8fFxuICAgICh0eXBlb2YgYm91bmRzLnF1ZXJ5U2VsZWN0b3IgPT09ICdmdW5jdGlvbicgJiYgYm91bmRzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKSB8fFxuICAgIG51bGxcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgcmVhZGVyIGNvbnRlbnQgY29sdW1uIGEgbWFya2VyIGlzIHBsYWNlZCB3aXRoaW4g4oCUIHRoZSBndXR0ZXIgaXQgYWltcyBmb3JcbiAqIGFuZCB0aGUgZXh0ZW50IGl0IGlzIGNsYW1wZWQgdG8sIGluZGVwZW5kZW50IG9mIHdoYXQgaXQgaXMgcG9zaXRpb25lZCBhZ2FpbnN0LlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gc2VnbWVudCAgVGhlIDxtYXJrPiB0aGUgbWFya2VyIGJlbG9uZ3MgdG8uXG4gKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2JvdW5kc0ZvcihzZWdtZW50KSB7XG4gIHJldHVybiAoXG4gICAgKHR5cGVvZiBzZWdtZW50LmNsb3Nlc3QgPT09ICdmdW5jdGlvbicgJiYgc2VnbWVudC5jbG9zZXN0KENPTlRFTlRfV1JBUFBFUl9TRUxFQ1RPUikpIHx8XG4gICAgc2VnbWVudC5vZmZzZXRQYXJlbnQgfHxcbiAgICBzZWdtZW50LnBhcmVudEVsZW1lbnQgfHxcbiAgICBudWxsXG4gICk7XG59XG5cbi8qKlxuICogVGhlIGVsZW1lbnQgdGhlIGJyb3dzZXIgcmVzb2x2ZXMgYW4gYWJzb2x1dGVseSBwb3NpdGlvbmVkIG1hcmtlciBhZ2FpbnN0LlxuICpcbiAqIFByZWZlcnMgdGhlIGJyb3dzZXIncyBvd24gYW5zd2VyIChvZmZzZXRQYXJlbnQpLCB0aGVuIGFuIGV4cGxpY2l0bHkgY29tcHV0ZWRcbiAqIG5lYXJlc3QgcG9zaXRpb25lZCBhbmNlc3RvciDigJQgd2hpY2ggaXMgd2hhdCBqc2RvbSBhbmQgYW55IG90aGVyIGxheW91dC1sZXNzXG4gKiBlbnZpcm9ubWVudCBjYW4gc3RpbGwgYW5zd2VyIOKAlCBhbmQgb25seSB0aGVuIHRoZSBjb250ZW50IHdyYXBwZXIsIHdob3NlXG4gKiBgcG9zaXRpb246IHJlbGF0aXZlYCAoIzMxMjcpIGlzIHdoYXQgbWFrZXMgdGhhdCBsYXN0IGZhbGxiYWNrIG1lYW5pbmdmdWwuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbWFya2VyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHNlZ21lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gYm91bmRzXG4gKiBAcmV0dXJucyB7RWxlbWVudH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9vcmlnaW5Gb3IobWFya2VyLCBzZWdtZW50LCBib3VuZHMpIHtcbiAgY29uc3Qgb2Zmc2V0UGFyZW50ID0gbWFya2VyLm9mZnNldFBhcmVudDtcbiAgaWYgKG9mZnNldFBhcmVudCAmJiB0eXBlb2Ygb2Zmc2V0UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvZmZzZXRQYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gX25lYXJlc3RQb3NpdGlvbmVkQW5jZXN0b3Ioc2VnbWVudCkgfHwgYm91bmRzO1xufVxuXG4vKipcbiAqIFdhbGsgdXAgZnJvbSBhbiBlbGVtZW50IHRvIHRoZSBmaXJzdCBhbmNlc3RvciB3aXRoIGEgbm9uLXN0YXRpYyBwb3NpdGlvbi5cbiAqXG4gKiBPbmx5IGBwb3NpdGlvbmAgaXMgY29uc2lkZXJlZDogYSB0cmFuc2Zvcm0gLyBmaWx0ZXIgLyB3aWxsLWNoYW5nZSBhbmNlc3RvclxuICogYWxzbyBlc3RhYmxpc2hlcyBhIGNvbnRhaW5pbmcgYmxvY2ssIGJ1dCB0aGUgcmVhZGVyIGNvbnRlbnQgdXNlcyBub25lIG9mXG4gKiB0aG9zZSwgYW5kIG9mZnNldFBhcmVudCDigJQgcHJlZmVycmVkIGFib3ZlIOKAlCBkb2VzIG5vdCBhY2NvdW50IGZvciB0aGVtIGVpdGhlci5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfbmVhcmVzdFBvc2l0aW9uZWRBbmNlc3RvcihlbGVtZW50KSB7XG4gIGNvbnN0IHZpZXcgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ/LmRlZmF1bHRWaWV3O1xuICBpZiAoIXZpZXcgfHwgdHlwZW9mIHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IG5vZGUgPSBlbGVtZW50O1xuICB3aGlsZSAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUgIT09IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICBjb25zdCB7IHBvc2l0aW9uIH0gPSB2aWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgaWYgKHBvc2l0aW9uICYmIHBvc2l0aW9uICE9PSAnc3RhdGljJykge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBOdWRnZSBhIHRydW5jYXRpb24gd2FybmluZyBjbGVhciBvZiBpdHMgaGlnaGxpZ2h0J3Mgbm90ZS90YWcgbWFya2VyIHdoZW4gYm90aFxuICogcmVzb2x2ZSB0byB0aGUgc2FtZSBsaW5lIOKAlCBhIHNpbmdsZS1saW5lLCBzaW5nbGUtc2VnbWVudCBoaWdobGlnaHQgY2FuIGNhcnJ5XG4gKiBhIG5vdGUgYW5kIGEgdHJ1bmNhdGlvbiBhdCBvbmNlLlxuICpcbiAqIENvbXBhcmVzIHRoZSB0d28gbWFya2VycycgQU5DSE9SIGxpbmVzLCBuZXZlciB0aGVpciBjdXJyZW50IHBvc2l0aW9uczogYVxuICogbWFya2VyIHR
129oYXQgaGFzIGFscmVhZHkgYmVlbiBudWRnZWQgbm8gbG9uZ2VyIG92ZXJsYXBzLCBzbyByZWFkaW5nIGxpdmUgcmVjdHNcbiAqIHdvdWxkIGRyb3AgdGhlIG9mZnNldCBvbiB0aGUgbmV4dCByZWZsb3cgYW5kIHB1dCBpdCBiYWNrIG9uIHRoZSBvbmUgYWZ0ZXIsXG4gKiBtYWtpbmcgdGhlIGljb24gZmxpY2tlciBiZXR3ZWVuIHR3byBwb3NpdGlvbnMgb24gZXZlcnkgcmVzaXplLlxuICpcbiAqIFRoZSBjb21wYXJpc29uIGlzIG1hZGUgaW4gVklFV1BPUlQgc3BhY2UgKCM0NDE0KS4gVGhlIHR3byBtYXJrZXJzIGhhbmcgb2ZmXG4gKiBkaWZmZXJlbnQgPG1hcms+IHNlZ21lbnRzIOKAlCBmaXJzdCBsaW5lIHZzIGxhc3Qg4oCUIHNvIGVhY2ggaXMgcG9zaXRpb25lZFxuICogYWdhaW5zdCBhIGRpZmZlcmVudCBjb250YWluaW5nIGJsb2NrLCBhbmQgdG9wcyBleHByZXNzZWQgaW4gdGhlaXIgb3duIG9yaWdpbnNcbiAqIGFyZSBub3QgY29tcGFyYWJsZS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtYXJrZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gYm91bmRzICBUaGUgcmVhZGVyIGNvbnRlbnQgY29sdW1uIHRvIHNlYXJjaCBmb3IgdGhlIGNvbXBhbmlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhbmNob3JUb3AgIFRoaXMgbWFya2VyJ3MgYW5jaG9yIGxpbmUgdG9wLCBpbiB2aWV3cG9ydCBzcGFjZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFBpeGVscyB0byBhZGQgdG8gdGhlIGNvbXB1dGVkIHRvcC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9jb2xsaXNpb25PZmZzZXRGb3IobWFya2VyLCBib3VuZHMsIGFuY2hvclRvcCkge1xuICBpZiAoIW1hcmtlci5jbGFzc0xpc3QuY29udGFpbnMoVFJVTkNBVElPTl9NQVJLRVJfQ0xBU1MpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBtYXJrZXJGb3IgPSAobWFya2VyLmdldEF0dHJpYnV0ZSgnZGF0YS1tYXJrZXItZm9yJykgfHwgJycpLnJlcGxhY2UoL1tcIlxcXFxdL2csICdcXFxcJCYnKTtcbiAgY29uc3QgY29tcGFuaW9uID1cbiAgICB0eXBlb2YgYm91bmRzLnF1ZXJ5U2VsZWN0b3IgPT09ICdmdW5jdGlvbidcbiAgICAgID8gYm91bmRzLnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke01BUktFUl9DTEFTU31bZGF0YS1tYXJrZXItZm9yPVwiJHttYXJrZXJGb3J9XCJdOm5vdCguJHtUUlVOQ0FUSU9OX01BUktFUl9DTEFTU30pYFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIGNvbnN0IGNvbXBhbmlvblNlZ21lbnQgPSBjb21wYW5pb24/LnBhcmVudEVsZW1lbnQ7XG4gIGlmICghY29tcGFuaW9uU2VnbWVudCB8fCB0eXBlb2YgY29tcGFuaW9uU2VnbWVudC5nZXRDbGllbnRSZWN0cyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmVjdHMgPSBjb21wYW5pb25TZWdtZW50LmdldENsaWVudFJlY3RzKCk7XG4gIGNvbnN0IGNvbXBhbmlvbkxpbmUgPSByZWN0cy5sZW5ndGggPyByZWN0c1swXSA6IGNvbXBhbmlvblNlZ21lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IGNvbXBhbmlvblRvcCA9IE1hdGgucm91bmQoY29tcGFuaW9uTGluZS50b3ApO1xuXG4gIHJldHVybiBjb21wYW5pb25Ub3AgPT09IGFuY2hvclRvcCA/IE1BUktFUl9DT0xMSVNJT
12905fT0ZGU0VUX1BYIDogMDtcbn1cblxuLyoqXG4gKiBSZWNvbXB1dGUgdGhlIGd1dHRlciBwb3NpdGlvbiBvZiBldmVyeSBtYXJrZXIgd2l0aGluIGEgcm9vdCAoZGVmYXVsdDpcbiAqIGRvY3VtZW50KS4gQ2FsbGVkIGFmdGVyIGxheW91dCBjaGFuZ2VzIOKAlCB3aW5kb3cgcmVzaXplLCByZWFkZXIgZm9udC1zaXplIG9yXG4gKiB0aGVtZSBjaGFuZ2VzIOKAlCBzbyB0aGUgaWNvbnMgc3RheSBhbGlnbmVkIHRvIHRoZWlyIGhpZ2hsaWdodCdzIGZpcnN0IGxpbmUuXG4gKlxuICogQHBhcmFtIHtQYXJlbnROb2RlfSBbcm9vdD1kb2N1bWVudF1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwb3NpdGlvbk5vdGVUYWdNYXJrZXJzKHJvb3QgPSBkb2N1bWVudCkge1xuICBjb25zdCBzY29wZSA9IHJvb3QgfHwgZG9jdW1lbnQ7XG4gIGlmICh0eXBlb2Ygc2NvcGUucXVlcnlTZWxlY3RvckFsbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBUYWtlIGFueSBleGlzdGluZyBjbHVzdGVycyBhcGFydCBCRUZPUkUgbWVhc3VyaW5nOiBhIGZvbGRlZCBtYXJrZXIgaXNcbiAgLy8gaGlkZGVuLCBhbmQgYSBoaWRkZW4gZWxlbWVudCBoYXMgbm8gYm94IHRvIHBvc2l0aW9uIGFnYWluc3QuXG4gIF91bmNsdXN0ZXJOb3RlVGFnTWFya2VycyhzY29wZSk7XG4gIHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke01BUktFUl9DTEFTU31gKS5mb3JFYWNoKChtYXJrZXIpID0+IHBvc2l0aW9uTm90ZVRhZ01hcmtlcihtYXJrZXIpKTtcbiAgY2x1c3Rlck5vdGVUYWdNYXJrZXJzKHNjb3BlKTtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZSB0aGUgbm90ZS90YWcgbWFya2VycyB0aGF0IHNoYXJlIGEgbGluZSBpbnRvIGEgc2luZ2xlIGNsdXN0ZXJcbiAqIG1hcmtlciBjYXJyeWluZyBhIGNvdW50ICgjNDQ2OSkuXG4gKlxuICogQSBndXR0ZXIgbWFya2VyIG5vcm1hbGx5IHJlc29sdmVzIHRoZSB0ZXh0IGNvbHVtbidzIHJpZ2h0IGVkZ2UgcGx1cyB0aGUgZ2FwXG4gKiBmb3IgeCwgYW5kIGEgeSB0YWtlbiBmcm9tIGl0cyBhbmNob3IgbGluZSwgc28gdHdvIGhpZ2hsaWdodHMgb24gb25lIGxpbmUgcHV0XG4gKiB0aGVpciBtYXJrZXJzIG9uIGV4YWN0bHkgdGhlIHNhbWUgcG9pbnQ6IHRoZSBsb3dlciBvbmUgaXMgaW52aXNpYmxlIEFORFxuICogdW5jbGlja2FibGUuIFRoaXMgaXMgdGhlIGludGVyaW0gZml4IOKAlCB0aGUgY2hvb3NlciB0aGF0IGxldHMgYSByZWFkZXIgcGlja1xuICogYmV0d2VlbiB0aGVtIGlzICM0NDcwLiBVbnRpbCB0aGVuIHRoZSBjbHVzdGVyIElTIHRoZSBmaXJzdCBtYXJrJ3Mgb3duXG4gKiBtYXJrZXIsIHNvIHRoZSBleGlzdGluZyBcImxldCB0aGUgY2xpY2sgcmVhY2ggdGhlIDxtYXJrPlwiIHBhdGggb3BlbnMgdGhhdFxuICogaGlnaGxpZ2h0IHdpdGggbm8gZXh0cmEgd2lyaW5nLlxuICpcbiAqIFNoYXJpbmcgYSBsaW5lIGlzIGEgTkVDRVNTQVJZIGJ1dCBub3QgYSBTVUZGSUNJRU5UIHJlYXNvbiB0byBmb2xkICgjNDQ5OSk6XG4gKiB0aGUgc2hhcmVkIHggaG9sZHMgb25seSB3aGlsZSB0aGUgZ3V0dGVyIHBsYWNlbWVudCBzdWNjZWVkcywgYW5kIHdoZXJlIGl0XG4gKiBkb2VzIG5vdCB0aGUgbWFya2VycyBzaXQgc2lkZSBieSBzaWRlLiBTbyBhIGxpbmUgaXMgZ3JvdXBlZCBieSBhbmNob3IgdG9wIGFuZFxuICogdGhlbiBzcGxpdCBhZ2FpbiBieSB3aGljaCBtYXJrZXJzIGFjdHVhbGx5IG92ZXJsYXAg4oCUIHNlZSBfY29sbGlkaW5nR3JvdXBzKCkuXG4gKlxuICogTGluZXMgYXJlIGNvbXBhcmVkIGluIFZJRVdQT1JUIHNwYWNlICgjNDQxNCk6IG1hcmtlcnMgaGFuZyBvZmYgZGlmZmVyZW50XG4gKiA8bWFyaz4gc2VnbWVudHMgd2l0aCBkaWZmZXJlbnQgY29udGFpbmluZyBibG9ja3MsIHNvIHRvcHMgZXhwcmVzc2VkIGluIHRoZWlyXG4gKiBvd24gb3JpZ2lucyBhcmUgbm90IGNvbXBhcmFibGUuXG4gKlxuICogVGhlIGZvbGRlZCBtYXJrZXJzIGFyZSBISURERU4sIG5vdCBkZWxldGVkLiBBIHJlc2l6ZSByZS13cmFwcyB0aGUgbGluZXMgYW5kXG4gKiB0aGUgZ3JvdXBpbmcgaGFzIHRvIGJlIHJlY29tcHV0ZWQgZnJvbSBzY3JhdGNoOyBhIHBhc3MgdGhhdCBkZXN0cm95ZWQgaXRzIG93blxuICogaW5wdXRzIGNvdWxkIG5ldmVyIGdpdmUgYSBtYXJrZXIgYmFjayB3aGVuIGl0cyBsaW5lLW1hdGUgbW92ZWQgYXdheS5cbiAqXG4gKiBUcnVuY2F0aW9uIHdhcm5pbmdzIGFyZSBleGNsdWRlZCBkZWxpYmVyYXRlbHk6IHRoZXkgYXJlIGFtYmVyIGFuZCByZXBvcnQgYVxuICogcHJvYmxlbSByYXRoZXIgdGhhbiBhIHByb3BlcnR5LCBhbmQgYnVyeWluZyBvbmUgaW4gYSBjb3VudCB3b3VsZCBoaWRlIGl0LlxuICpcbiAqIElkZW1wb3RlbnQg4oCUIGVhY2ggcnVuIHN0YXJ0cyBieSB0YWtpbmcgdGhlIHByZXZpb3VzIHJ1bidzIGNsdXN0ZXJzIGFwYXJ0LCBzb1xuICogaXQgcmVidWlsZHMgZnJvbSB0aGUgcGVyLW1hcmsgbWFya2VycyBhbmQgY2FuIG5ldmVyIGNsdXN0ZXIgYSBjbHVzdGVyLlxuICpcbiAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gW3Jvb3Q9ZG9jdW1lbnRdXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc11cbiAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IFtwYXJhbXMuaTE4bj1udWxsXSAgT2JqZWN0IHdpdGggYSB0KGtleSkgbWV0aG9kLCBvciBudWxsLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbi8qKlxuICog4pqgIFRIUk9XQVdBWSBBL0IgKCM0NTE3KS4gVGhlIGNsdXN0ZXIgcHJlc2VudGF0aW9uIGN1cnJlbnRseSBzZWxlY3RlZC5cbiAqXG4gKiBQZXJzaXN0ZWQgc28gaXQgc3Vydml2ZXMgbmF2aWdhdGlvbiBkdXJpbmcgYSBzdGFrZWhvbGRlciB3YWxrdGhyb3VnaC4gU3RvcmFnZVxuICogY2FuIHRocm93IChTYWZhcmkgcHJpdmF0ZSBtb2RlKSwgc28gZXZlcnkgYWNjZXNzIGlzIGd1YXJkZWQgYW5kIGZhbGxzIGJhY2sgdG9cbiAqIHRoZSBkZWZhdWx0IHJhdGhlciB0aGFuIGJyZWFraW5nIHRoZSByZWFkZXIuXG4gKlxuICogQHJldHVybnMgeyd1bmlvbid8J2NvdW50cyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbHVzdGVyUHJlc2VudGF0aW9uKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHN0b3JlZCA9IHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnXG4gICAgICA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENMVVNURVJfU1RZTEVfU1RPUkFHRV9LRVkpXG4gICAgICA6IG51bGw7XG5cbiAgICByZXR1cm4gc3RvcmVkID09PSAnY291bnRzJyB8fCBzdG9yZWQgPT09ICd1bmlvbicgPyBzdG9yZWQgOiBDTFVTVEVSX1NUWUxFX0RFRkFVTFQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIENMVVNURVJfU1RZTEVfREVGQVVMVDtcbiAgfVxufVxuXG4vKipcbiAqIOKaoCBUSFJPV0FXQVkgQS9CICgjNDUxNykuIFNlbGVjdCBhIGNsdXN0ZXIgcHJlc2VudGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7J3VuaW9uJ3wnY291bnRzJ30gbW9kZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDbHVzdGVyUHJlc2VudGF0aW9uKG1vZGUpIHtcbiAgaWYgKG1vZGUgIT09ICd1bmlvbicgJiYgbW9kZSAhPT0gJ2NvdW50cycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGlmICh0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ0xVU1RFUl9TVFlMRV9TVE9SQUdFX0tFWSwgbW9kZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE5vbi1mYXRhbDogdGhlIHByZXNlbnRhdGlvbiBzdGlsbCBhcHBsaWVzIGZvciB0aGlzIHBhZ2Ugdmlldy5cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2x1c3Rlck5vdGVUYWdNYXJrZXJzKHJvb3QgPSBkb2N1bWVudCwgeyBpMThuID0gbnVsbCB9ID0ge30pIHtcbiAgY29uc3Qgc2NvcGUgPSByb290IHx8IGRvY3VtZW50O1xuICBpZiAodHlwZW9mIHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBfdW5jbHVzdGVyTm90ZVRhZ01hcmtlcnMoc2NvcGUpO1xuXG4gIGNvbnN0IGxpbmVzID0gbmV3IE1hcCgpO1xuICBzY29wZVxuICAgIC5xdWVyeVNlbGVjdG9yQWxsKGAuJHtNQVJLRVJfQ0xBU1N9Om5vdCguJHtUUlVOQ0FUSU9OX01BUktFUl9DTEFT
129U30pYClcbiAgICAuZm9yRWFjaCgobWFya2VyKSA9PiB7XG4gICAgICBjb25zdCBhbmNob3JUb3AgPSBfYW5jaG9yVG9wRm9yKG1hcmtlcik7XG4gICAgICBpZiAoYW5jaG9yVG9wID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFNuYXAgdG8gYSBuZWFyYnkgZXhpc3RpbmcgbGluZSByYXRoZXIgdGhhbiBrZXlpbmcgb24gYW4gZXhhY3QgdG9wXG4gICAgICAvLyAoIzQ3MDcpLiBBIG5vdGUvdGFnIG1hcmtlciBhbmNob3JzIHRvIGl0cyA8bWFyaz4gKGFuIGlubGluZSBib3gpIHdoaWxlIGFcbiAgICAgIC8vIGJvb2ttYXJrIG1hcmtlciBhbmNob3JzIHRvIGl0cyBjb250ZW50IDxwPi88bGk+IChhIGJsb2NrIGJveCksIGFuZCB0aGVcbiAgICAgIC8vIHR3byByZXBvcnQgdGhlIFNBTUUgdmlzdWFsIGxpbmUncyB0b3AgYSBwaXhlbCBhcGFydC4gRGlzdGluY3QgdGV4dCBsaW5lc1xuICAgICAgLy8gYXJlIGEgd2hvbGUgbGluZS1oZWlnaHQgYXBhcnQsIHNvIGEgZmV3LXBpeGVsIHRvbGVyYW5jZSBncm91cHMgdGhlIG1peGVkXG4gICAgICAvLyBib3ggdHlwZXMgd2l0aG91dCBldmVyIG1lcmdpbmcgdHdvIHJlYWwgbGluZXMuIGBfY29sbGlkaW5nR3JvdXBzKClgIHRoZW5cbiAgICAgIC8vIHN0aWxsIHNwbGl0cyBhbnl0aGluZyB0aGF0IGRvZXMgbm90IGFjdHVhbGx5IG92ZXJsYXAuXG4gICAgICBjb25zdCBuZWFyZXN0VG9wID0gX25lYXJlc3RMaW5lS2V5KGxpbmVzLCBhbmNob3JUb3ApO1xuICAgICAgY29uc3Qga2V5ID0gbmVhcmVzdFRvcCA9PT0gbnVsbCA/IGFuY2hvclRvcCA6IG5lYXJlc3RUb3A7XG4gICAgICBjb25zdCBsaW5lID0gbGluZXMuZ2V0KGtleSk7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBsaW5lLnB1c2gobWFya2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnNldChrZXksIFttYXJrZXJdKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBsaW5lcy5mb3JFYWNoKChtYXJrZXJzKSA9PiB7XG4gICAgaWYgKG1hcmtlcnMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfY29sbGlkaW5nR3JvdXBzKG1hcmtlcnMpLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBpZiAoZ3JvdXAubGVuZ3RoID4gMSkge1xuICAgICAgICBfY29sbGFwc2VMaW5lKGdyb3VwLCB7IGkxOG4gfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0IG9uZSBsaW5lJ3MgbWFya2VycyBpbnRvIHRoZSBzZXRzIHRoYXQgYWN0dWFsbHkgc2l0IG9uIHRvcCBvZiBlYWNoIG90aGVyLlxuICpcbiAqIFNoYXJpbmcgYW4gYW5jaG9yIGxpbmUgaXMgTk9UIHRoZSBzYW1lIGFzIGNvaW5jaWRpbmcgKCM0NDk5KS4gRXZlcnkgbWFya2VyXG4gKiByZXNvbHZlcyB0aGUgc2FtZSBndXR0ZXIgeCBvbmx5IHdoaWxlIHRoZSBndXR0ZXIgcGxhY2VtZW50IHN1Y2NlZWRzOyB3aGVyZVxuICogdGhlcmUgaXMgbm8gcm9vbSBmb3IgaXQgdGhlcmUsIHBvc2l0aW9uTm90ZVRhZ01hcmtlcigpIGZhbGxzIGJhY2sgdG8ganVzdCBwYXN0XG4gKiB0aGUgZW5kIG9mIGVhY2ggaGlnaGxpZ2h0J3MgT1dOIGZpcnN0IGxpbmUsIHdoaWNoIGlzIGEgcGVyLWhpZ2hsaWdodCB4LiBBdCBhXG4gKiAzOTBweCB2aWV3cG9ydCB0aGF0IG1lYXN1cmVkIHggMjc2LTI5OCBmb3Igb25lIG1hcmtlciBhbmQgeCAzNDUtMzY3IGZvciBpdHNcbiAqIGxpbmUtbWF0ZTogc2lkZSBieSBzaWRlLCBib3RoIGRyYXduLCBib3RoIGNsaWNrYWJsZS4gRm9sZGluZyBvbmUgb2YgdGhvc2UgYXdheVxuICogZGVzdHJveXMgYSB3b3JraW5nIG1hcmtlciBhbmQgbGVhdmVzIHRoZSByZWFkZXIgd2l0aCBmZXdlciBpY29ucyB0aGFuIGJlZm9yZVxuICogY2x1c3RlcmluZyBleGlzdGVkLlxuICpcbiAqIE1hcmtlcnMgYXJlIHZpc2l0ZWQgaW4gZG9jdW1lbnQgb3JkZXIgYW5kIGVhY2ggam9pbnMgdGhlIGZpcnN0IGdyb3VwIGl0XG4gKiBvdmVybGFwcywgc28gYSBsaW5lIHdpdGggdHdvIHNlcGFyYXRlIHBpbGUtdXBzIHlpZWxkcyB0d28gY2x1c3RlcnMgcmF0aGVyIHRoYW5cbiAqIG9uZSBib2d1cyBvbmUuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudFtdfSBtYXJrZXJzICBPbmUgbGluZSdzIG1hcmtlcnMsIGluIGRvY3VtZW50IG9yZGVyLlxuICogQHJldHVybnMge0hUTUxFbGVtZW50W11bXX0gT25lIGdyb3VwIHBlciBwaWxlLXVwOyBzaW5nbGV0b25zIHN0YXkgdW5jbHVzdGVyZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfY29sbGlkaW5nR3JvdXBzKG1hcmtlcnMpIHtcbiAgY29uc3QgZ3JvdXBzID0gW107XG5cbiAgbWFya2Vycy5mb3JFYWNoKChtYXJrZXIpID0+IHtcbiAgICBjb25zdCBncm91cCA9IGdyb3Vwcy5maW5kKChtZW1iZXJzKSA9PiBfbWFya2Vyc0NvaW5jaWRlKG1lbWJlcnNbMF0sIG1hcmtlcikpO1xuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAucHVzaChtYXJrZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBncm91cHMucHVzaChbbWFya2VyXSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG4vKipcbiAqIERvIHR3byBtYXJrZXJzIG9jY3VweSB0aGUgc2FtZSBzcGFjZSBvbiBzY3JlZW4/XG4gKlxuICogQW4gdW5tZWFzdXJhYmxlIGJveCDigJQganNkb20sIG9yIGFuIGVsZW1lbnQgd2l0aCBubyBsYXlvdXQg4oCUIHJlcG9ydHMgemVyb3MsXG4gKiB3aGljaCBjYW5ub3QgYmUgdG9sZCBhcGFydCBmcm9tIGEgcmVhbCBib3ggYXQgdGhlIG9yaWdpbi4gVGhvc2UgYXJlIHRyZWF0ZWQgYXNcbiAqIGNvaW5jaWRpbmcsIHdoaWNoIGtlZXBzIHRoZSBhbmNob3ItbGluZSBncm91cGluZyB0aGlzIHJlcGxhY2VzO
129iB0aGUgbW9kdWxlJ3NcbiAqIHN0YW5kaW5nIHJ1bGUgaXMgdGhhdCBhIGxheW91dC1sZXNzIGVudmlyb25tZW50IG11c3Qgbm90IGNoYW5nZSBiZWhhdmlvdXIuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZmlyc3RcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNlY29uZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfbWFya2Vyc0NvaW5jaWRlKGZpcnN0LCBzZWNvbmQpIHtcbiAgY29uc3QgYSA9IGZpcnN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBiID0gc2Vjb25kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIGlmICgoIWEud2lkdGggJiYgIWEuaGVpZ2h0KSB8fCAoIWIud2lkdGggJiYgIWIuaGVpZ2h0KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGEubGVmdCA8IGIucmlnaHQgJiYgYi5sZWZ0IDwgYS5yaWdodCAmJiBhLnRvcCA8IGIuYm90dG9tICYmIGIudG9wIDwgYS5ib3R0b207XG59XG5cbi8qKlxuICogVGhlIGV4aXN0aW5nIGxpbmUtZ3JvdXAga2V5IHdpdGhpbiB0b2xlcmFuY2Ugb2YgYSB0b3AsIG9yIG51bGwgd2hlbiBub25lIGlzXG4gKiBjbG9zZSBlbm91Z2guIFRoZSBjbG9zZXN0IGtleSB3aW5zLCBzbyBhIG1hcmtlciBuZXZlciBqb2lucyBhIGZhcnRoZXIgbGluZVxuICogd2hlbiBhIG5lYXJlciBvbmUgZXhpc3RzICgjNDcwNykuXG4gKlxuICogQHBhcmFtIHtNYXA8bnVtYmVyLCBIVE1MRWxlbWVudFtdPn0gbGluZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3BcbiAqIEByZXR1cm5zIHtudW1iZXJ8bnVsbH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9uZWFyZXN0TGluZUtleShsaW5lcywgdG9wKSB7XG4gIGxldCBiZXN0ID0gbnVsbDtcbiAgbGV0IGJlc3REaXN0YW5jZSA9IExJTkVfR1JPVVBfVE9MRVJBTkNFX1BYICsgMTtcblxuICBsaW5lcy5mb3JFYWNoKChtYXJrZXJzLCBrZXkpID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGtleSAtIHRvcCk7XG4gICAgaWYgKGRpc3RhbmNlIDw9IExJTkVfR1JPVVBfVE9MRVJBTkNFX1BYICYmIGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICBiZXN0ID0ga2V5O1xuICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYmVzdDtcbn1cblxuLyoqXG4gKiBUaGUgdmlld3BvcnQgdG9wIG9mIGEgbWFya2VyJ3MgYW5jaG9yIGxpbmUsIG9yIG51bGwgd2hlbiB0aGUgc2VnbWVudCBoYXMgbm9cbiAqIGxheW91dCB0byByZWFkLlxuICpcbiAqIEEgbGF5b3V0LWxlc3MgZW52aXJvbm1lbnQgKGpzZG9tLCBvciBjb250ZW50IHRoYXQgaXMgbm90IGRpc3BsYXllZCkgcmVwb3J0c1xuICogZXZlcnkgcmVjdCBhcyB6ZXJvLCB3aGljaCB3b3VsZCBmb2xkIGV2ZXJ5IG1hcmtlciBvbiB0aGUgcGFnZSBpbnRvIG9uZSBib2d1c1xuICogY2x1c3Rlci4gUmVmdXNpbmcgdG8gZ3JvdXAgYW4gdW5sYWlkLW91dCBzZWdtZW50IGtlZXBzIHRoYXQgZnJvbSBoYXBwZW5pbmcuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbWFya2VyXG4gKiBAcmV0dXJucyB7bnVtYmVyfG51bGx9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfYW5jaG9yVG9wRm9yKG1hcmtlcikge1xuICBjb25zdCBzZWdtZW50ID0gbWFya2VyLnBhcmVudEVsZW1lbnQ7XG4gIGlmICghc2VnbWVudCB8fCB0eXBlb2Ygc2VnbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHJlY3RzID0gdHlwZW9mIHNlZ21lbnQuZ2V0Q2xpZW50UmVjdHMgPT09ICdmdW5jdGlvbicgPyBzZWdtZW50LmdldENsaWVudFJlY3RzKCkgOiBbXTtcbiAgY29uc3QgbGluZSA9IHJlY3RzLmxlbmd0aCA/IHJlY3RzWzBdIDogc2VnbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgaWYgKCFsaW5lIHx8ICghbGluZS53aWR0aCAmJiAhbGluZS5oZWlnaHQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gTWF0aC5yb3VuZChsaW5lLnRvcCk7XG59XG5cbi8qKlxuICogVHVybiBvbmUgbGluZSdzIG1hcmtlcnMgaW50byBhIHNpbmdsZSBjbHVzdGVyOiB0aGUgZmlyc3Qga2VlcHMgaXRzIHBsYWNlIGFuZFxuICogdGFrZXMgdGhlIHVuaW9uIG9mIHRoZSBsaW5lJ3MgZ2x5cGhzIHBsdXMgdGhlIGNvdW50LCB0aGUgcmVzdCBhcmUgaGlkZGVuLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gbWFya2VycyAgVHdvIG9yIG1vcmUgbWFya2VycyBzaGFyaW5nIGFuIGFuY2hvciBsaW5lLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAcGFyYW0ge09iamVjdHxudWxsfSBbcGFyYW1zLmkxOG49bnVsbF0gIE9iamVjdCB3aXRoIGEgdChrZXkpIG1ldGhvZCwgb3IgbnVsbC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2NvbGxhcHNlTGluZShtYXJrZXJzLCB7IGkxOG4gPSBudWxsIH0gPSB7fSkge1xuICBjb25zdCBbY2x1c3RlciwgLi4uZm9sZGVkXSA9IG1hcmtlcnM7XG4gIGNvbnN0IGNsdXN0ZXJGb3IgPSBjbHVzdGVyLmdldEF0dHJpYnV0ZSgnZGF0YS1tYXJrZXItZm9yJykgfHwgJyc7XG4gIC8vIFJlYWQgQkVGT1JFIGFueXRoaW5nIGNoYW5nZXM6IGEgbWFya2VyIHRoYXQgd2FzIG5ldmVyIGRyYXdhYmxlIGluIHRoZSBmaXJzdFxuICAvLyBwbGFjZSAoYSBsYXlvdXQtbGVzcyBlbnZpcm9ubWVudCkgc2F5cyBub3RoaW5nIGFib3V0IHdoZXRoZXIgZm9sZGluZyBicm9rZVxuICAvLyBpdCwgc28gdGhlIGZhaWwtc2FmZSBiZWxvdyBtdXN0IG5vdCBmaXJlIGZvciBpdC5cbiAgY29uc3Qgd2FzRHJhd24gPSBfaXNEcmF3bihjbHVzdGVyKTtcblxuICAvLyBUaGUgbGluZSdzIGNvbXBvc2l0aW9uLCBhZ2dyZWdhdGVkIGZyb20gdGhlIG1hcmtlcnMnIE9XTiBhdHRyaWJ1dGVzIOKAlCB1c2VkXG4gIC8vIGJvdGggdG8gYm91bmQgdGhlIGdseXBoIHVuaW9uIGJlbG93IGFuZCwgdW5jaGFuZ2VkLCB0byBsYWJlbCB0aGUgY2x1c3Rlci5cbiAgY29uc3QgeyBub3RlTWFya3MsIHRhZ01hcmtzLCBib29rbWFya01hcmtzIH0gPSBjbHVzdGVyQ29tcG9zaXRpb24obWFya2Vycyk7XG4gIGNvbnN0IGhhc0Fubm90YXRpb25zID0gbm90ZU1hcmtzID4gMCB8fCB0YWdNYXJrcyA+IDA7XG5cbiAgaWYgKG1hcmtlcnMuc29tZSgobWFya2VyKSA9PiBfaGFzR2x5cGgobWFya2VyLCBOT1RFX0dMWVBIX0NMQVNTKSkgJiYgIV9oYXNHbHlwaChjbHVzdGVyLCBOT1RFX0dMWVBIX0NMQVNTKSkge1xuICAgIGNvbnN0IGljb24gPSBfYnVpbGRJY29uKE5PVEVfR0xZUEhfQ0xBU1MpO1xuICAgIGljb24uc2V0QXR0cmlidXRlKENMVVNURVJfSUNPTl9BVFRSLCAndHJ1ZScpO1xuICAgIGNsdXN0ZXIuaW5zZXJ0QmVmb3JlKGljb24sIGNsdXN0ZXIuZmlyc3RDaGlsZCk7XG4gIH1cbiAgaWYgKG1hcmtlcnMuc29tZSgobWFya2VyKSA9PiBfaGFzR2x5cGgobWFya2VyLCBUQUdfR0xZUEhfQ0xBU1MpKSAmJiAhX2hhc0dseXBoKGNsdXN0ZXIsIFRBR19HTFlQSF9DTEFTUykpIHtcbiAgICBjb25zdCBpY29uID0gX2J1aWxkSWNvb
129ihUQUdfR0xZUEhfQ0xBU1MpO1xuICAgIGljb24uc2V0QXR0cmlidXRlKENMVVNURVJfSUNPTl9BVFRSLCAndHJ1ZScpO1xuICAgIGNsdXN0ZXIuYXBwZW5kQ2hpbGQoaWNvbik7XG4gIH1cbiAgLy8gQSBib29rbWFyayBjb250cmlidXRlcyBpdHMgZ2x5cGggT05MWSB0byBhIGJvb2ttYXJrLW9ubHkgY2x1c3RlciAoIzQ3MDcpLlxuICAvLyBXaGVuIHRoZSBsaW5lIGFsc28gY2FycmllcyBub3RlL3RhZyBnbHlwaHMsIHNob3dpbmcgYSB0aGlyZCBnbHlwaCB3b3VsZCBwdXNoXG4gIC8vIHRoZSBjbHVzdGVyIHBhc3QgdGhlIDQ4cHggZ3V0dGVyIGJ1ZGdldCB0aGUgcGhvbmUgbGF5b3V0IHJlc2VydmVzICgjNDU0NSkg4oCUXG4gIC8vIHNvIG9uIGEgbWl4ZWQgbGluZSB0aGUgYm9va21hcmsgcmlkZXMgaW4gdGhlIENPVU5UIGFuZCB0aGUgbW9kYWwncyBib29rbWFya1xuICAvLyBzZWN0aW9uIGluc3RlYWQsIGtlZXBpbmcgdGhlIHdpZHRoIGNvc3Qgb2YgdGhpcyBwaGFzZSB6ZXJvLiBBIG1peGVkIGxpbmUnc1xuICAvLyBzdXJ2aXZvciBpcyBhbHdheXMgYW4gYW5ub3RhdGlvbiBtYXJrZXIgKGEgYm9va21hcmsgbWFya2VyIGlzIGFwcGVuZGVkIGFmdGVyXG4gIC8vIHRoZSA8bWFyaz4gaW4gZG9jdW1lbnQgb3JkZXIpLCBzbyB0aGlzIG5ldmVyIGhhcyB0byBzdHJpcCBhIHN1cnZpdm9yJ3Mgb3duXG4gIC8vIGJvb2ttYXJrIGdseXBoLlxuICBpZiAoXG4gICAgIWhhc0Fubm90YXRpb25zXG4gICAgJiYgbWFya2Vycy5zb21lKChtYXJrZXIpID0+IF9oYXNHbHlwaChtYXJrZXIsIEJPT0tNQVJLX0dMWVBIX0NMQVNTKSlcbiAgICAmJiAhX2hhc0dseXBoKGNsdXN0ZXIsIEJPT0tNQVJLX0dMWVBIX0NMQVNTKVxuICApIHtcbiAgICBjb25zdCBpY29uID0gX2J1aWxkSWNvbihCT09LTUFSS19HTFlQSF9DTEFTUyk7XG4gICAgaWNvbi5zZXRBdHRyaWJ1dGUoQ0xVU1RFUl9JQ09OX0FUVFIsICd0cnVlJyk7XG4gICAgY2x1c3Rlci5pbnNlcnRCZWZvcmUoaWNvbiwgY2x1c3Rlci5maXJzdENoaWxkKTtcbiAgfVxuXG4gIGZvbGRlZC5mb3JFYWNoKChtYXJrZXIpID0+IHtcbiAgICBtYXJrZXIuY2xhc3NMaXN0LmFkZChDTFVTVEVSRURfQ0xBU1MpO1xuICAgIC8vIEV4cGxpY2l0IG1lbWJlcnNoaXAsIHNvIHRoZSBjaG9vc2VyIGNhbiBhc2sgZm9yIGV4YWN0bHkgdGhpcyBsaW5lJ3NcbiAgICAvLyBtYXJrZXJzIHJhdGhlciB0aGFuIGluZmVycmluZyBpdCBmcm9tIGRvY3VtZW50LW9yZGVyIGFkamFjZW5jeS5cbiAgICBtYXJrZXIuc2V0QXR0cmlidXRlKENMVVNURVJfTUVNQkVSX0FUVFIsIGNsdXN0ZXJGb3IpO1xuICB9KTtcblxuICBjbHVzdGVyLmNsYXNzTGlzdC5hZGQoQ0xVU1RFUl9DTEFTUyk7XG4gIGNsdXN0ZXIuc2V0QXR0cmlidXRlKENMVVNURVJfQ09VTlRfQVRUUiwgU3RyaW5nKG1hcmtlcnMubGVuZ3RoKSk7XG4gIGNsdXN0ZXIuc2V0QXR0cmlidXRlKENMVVNURVJfUFJFVl9MQUJFTF9BVFRSLCBjbHVzdGVyLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpIHx8ICcnKTtcblxuICAvLyBUaGVzZSBjb3VudHMgc3Vydml2ZSB0aGUgZ2x5cGggdW5pb24gYWJvdmUsIHdoaWNoIGRpc2NhcmRzIHRoZSBjb21wb3NpdGlvblxuICAvLyB0aGUgY2hvb3NlciBhbmQgdGhlIGxhYmVsIG5lZWQuXG4gIGNsdXN0ZXIuc2V0QXR0cmlidXRlKENMVVNURVJfTk9URV9NQVJLU19BVFRSLCBTdHJpbmcobm90ZU1hcmtzKSk7XG4gIGNsdXN0ZXIuc2V0QXR0cmlidXRlKENMVVNURVJfVEFHX01BUktTX0FUVFIsIFN0cmluZyh0YWdNYXJrcykpO1xuICBjbHVzdGVyLnNldEF0dHJpYnV0ZShDTFVTVEVSX0JPT0tNQVJLX01BUktTX0FUVFIsIFN0cmluZyhib29rbWFya01hcmtzKSk7XG5cbiAgLy8g4pqgIFRIUk9XQVdBWSBBL0IgKCM0NTE3KSDigJQgc2VsZWN0cyB3aGljaCBwcmVzZW50YXRpb24gdGhlIENTUyByZW5kZXJzLlxuICBjb25zdCBwcmVzZW50YXRpb24gPSBnZXRDbHVzdGVyUHJlc2VudGF0aW9uKCk7XG4gIGNsdXN0ZXIuc2V0QXR0cmlidXRlKENMVVNURVJfU1RZTEVfQVRUUiwgcHJlc2VudGF0aW9uKTtcbiAgX2FwcGx5R2x5cGhDb3VudHMoY2x1c3RlciwgeyBwcmVzZW50YXRpb24sIG5vdGVNYXJrcywgdGFnTWFya3MgfSk7XG5cbiAgLy8gVGhlIGxhYmVsIHN0YXRlcyB0aGUgQUNUVUFMIGNvbXBvc2l0aW9uLCB3aGljaCB0aGUgZ2x5cGhzIGNhbm5vdDogYSBsaW5lXG4gIC8vIHdpdGggb25lIG5vdGVkIG1hcmsgYW5kIHR3byB0YWdnZWQgb25lcyBsb29rcyBpZGVudGljYWwgdG8gb25lIHdoZXJlIGJvdGhcbiAgLy8gY2FycnkgYm90aC4gUGFydHMgYXJlIGVtaXR0ZWQgb25seSB3aGVuIG5vbi16ZXJvLCBzbyBpdCBuZXZlciByZWFkc1xuICAvLyBcIjAgd2l0aCBhIG5vdGVcIi5cbiAgY29uc3QgZGV0YWlsUGFydHMgPSBbXTtcblxuICBpZiAoYm9va21hcmtNYXJrcyA+IDApIHtcbiAgICBkZXRhaWxQYXJ0cy5wdXNoKFxuICAgICAgdHJhbnNsYXRlKGkxOG4sICdhbm5vdGF0aW9ucy5jbHVzdGVyX21hcmtlcl9ib29rbWFya3MnLCAnOmNvdW50IGJvb2ttYXJrcycpXG4gICAgICAgIC5yZXBsYWNlKCc6Y291bnQnLCBTdHJpbmcoYm9va21hcmtNYXJrcykpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChub3RlTWFya3MgPiAwKSB7XG4gICAgZGV0YWlsUGFydHMucHVzaChcbiAgICAgIHRyYW5zbGF0ZShpMThuLCAnYW5ub3RhdGlvbnMuY2x1c3Rlcl9tYXJrZXJfbm90ZXMnLCAnOmNvdW50IHdpdGggYSBub3RlJylcbiAgICAgICAgLnJlcGxhY2UoJzpjb3VudCcsIFN0cmluZyhub3RlTWFya3MpKVxuICAgICk7XG4gIH1cblxuICBpZiAodGFnTWFya3MgPiAwKSB7XG4gICAgZGV0YWlsUGFydHMucHVzaChcbiAgICAgIHRyYW5zbGF0ZShpMThuLCAnYW5ub3RhdGlvbnMuY2x1c3Rlcl9tYXJrZXJfdGFncycsICc6Y291bnQgd2l0aCB0YWdzJylcbiAgICAgICAgLnJlcGxhY2UoJzpjb3VudCcsIFN0cmluZyh0YWdNYXJrcykpXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGJhc2UgPSB0cmFuc2xhdGUoXG4gICAgaTE4bixcbiAgICAnYW5ub3RhdGlvbnMuY2x1c3Rlcl9tYXJrZXJfbGFiZWwnLFxuICAgICc6Y291bnQgaGlnaGxpZ2h0cyBvbiB0aGlzIGxpbmUnXG4gICkucmVwbGFjZSgnOmNvdW50JywgU3RyaW5nKG1hcmtlcnMubGVuZ3RoKSk7XG4gIGNvbnN0IGxhYmVsID0gZGV0YWlsUGFydHMubGVuZ3RoID4gMCA/IGAke2Jhc2V9IOKAlCAke2RldGFpbFBhcnRzLmpvaW4oJywgJyl9YCA6IGJhc2U7XG4gIGNsdXN0ZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgbGFiZWwpO1xuICBjbHVzdGVyLnRpdGxlID0gbGFiZWw7XG5cbiAgLy8gUmUtY2xhbXAgKCM0NDk5KS4gVGhlIGNvdW50IGJhZGdlIGFuZCBhbnkgYm9ycm93ZWQgZ2x5cGggYXJlIGFkZGVkIGFib3ZlLFxuICAvLyBBRlRFUiB0aGUgcG9zaXRpb24gd2FzIGNvbXB1dGVkLCBzbyB0aGUgZ3V0dGVyIGNsYW1wIGluXG4gIC8vIHBvc2l0aW9uTm90ZVRhZ01hcmtlcigpIHdhcyB3b3JrZWQgb3V0IGZvciBhIGJveCB+MzBweCBuYXJyb3dlciB0aGFuIHRoZSBvbmVcbiAgLy8gdGhhdCBlbmRzIHVwIG9uIHNjcmVlbiAobWVhc3VyZWQgMTZweCAtPiA0NnB4KS4gQXQgYW4gODIwcHggdmlld3BvcnQgdGh
129hdFxuICAvLyBwdXQgdGhlIGNsdXN0ZXIgMjVweCBwYXN0IHRoZSBndXR0ZXIgZWRnZSBpdCBpcyBjbGFtcGVkIG5ldmVyIHRvIGNyb3NzLCBvdXRcbiAgLy8gb3ZlciB0aGUgcGFnZSBtYXJnaW4uXG4gIHBvc2l0aW9uTm90ZVRhZ01hcmtlcihjbHVzdGVyKTtcblxuICAvLyBBIGxpbmUgbXVzdCBuZXZlciBjb21lIG91dCBvZiBjbHVzdGVyaW5nIHdpdGggbm90aGluZyBkcmF3biBpbiBpdCAoIzQ0OTkpLlxuICAvLyBUaGUgc3Vydml2b3IgaXMgY2hvc2VuIGJ5IGRvY3VtZW50IG9yZGVyIGFuZCBpdHMgZHJhd2FiaWxpdHkgd2FzIG5ldmVyXG4gIC8vIGNoZWNrZWQsIHNvIGFueXRoaW5nIHRoYXQgbWFrZXMgaXQgdW5yZW5kZXJhYmxlIHRvb2sgdGhlIHdob2xlIGxpbmUncyBpY29uc1xuICAvLyB3aXRoIGl0IOKAlCBzdHJpY3RseSB3b3JzZSB0aGFuIHRoZSBvdmVybGFwIGNsdXN0ZXJpbmcgcmVwbGFjZWQsIGJlY2F1c2UgYW5cbiAgLy8gb3ZlcmxhcCBzdGlsbCBsZWF2ZXMgb25lIGljb24gdG8gY2xpY2suIFVuZG9pbmcgdGhlIGZvbGQgaGVyZSByZXN0b3JlcyB0aGVcbiAgLy8gcHJlLSM0NDY5IGJlaGF2aW91ciBmb3IgdGhhdCBsaW5lIGluc3RlYWQuXG4gIGlmICghd2FzRHJhd24gfHwgX2lzRHJhd24oY2x1c3RlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBfcmVzdG9yZUNsdXN0ZXJNYXJrZXIoY2x1c3Rlcik7XG4gIGZvbGRlZC5mb3JFYWNoKChtYXJrZXIpID0+IF9yZXN0b3JlRm9sZGVkTWFya2VyKG1hcmtlcikpO1xufVxuXG4vKipcbiAqIERvZXMgdGhpcyBlbGVtZW50IGdlbmVyYXRlIGEgYm94IHRoZSByZWFkZXIgY2FuIHNlZT9cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9pc0RyYXduKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBlbGVtZW50LmdldENsaWVudFJlY3RzID09PSAnZnVuY3Rpb24nICYmIGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBtYXJrZXIgYWxyZWFkeSBzaG93cyBhIGdpdmVuIGdseXBoLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG1hcmtlclxuICogQHBhcmFtIHtzdHJpbmd9IGdseXBoQ2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuLyoqXG4gKiDimqAgVEhST1dBV0FZIEEvQiAoIzQ1MTcpLiBQdXQgYSBwZXItZ2x5cGggY291bnQgb24gdGhlIGNsdXN0ZXIncyBpY29ucyBmb3IgdGhlXG4gKiAnY291bnRzJyBwcmVzZW50YXRpb24sIGFuZCBzdHJpcCBpdCBmb3IgJ3VuaW9uJy5cbiAqXG4gKiBUaGUgY291bnQgaXMgYW4gQVRUUklCVVRFLCBkcmF3biBieSBDU1MgYXMgYW4gOjphZnRlciBwc2V1ZG8tZWxlbWVudCDigJQgbmV2ZXIgYVxuICogdGV4dCBub2RlLiBIaWdobGlnaHQgcmVzdG9yZSBjb3VudHMgQ0hBUkFDVEVSUyB2aWEgY2hhci1iYXNlZCB0ZXh0T2Zmc2V0c1xuICogKCMyODA2KSwgc28gYSBsaXRlcmFsIFwiMlwiIGluc2lkZSB0aGUgPG1hcms+IHdvdWxkIHNoaWZ0IHRoaXMgbWFyaydzIG9mZnNldHNcbiAqIGFuZCBldmVyeSBsYXRlciBtYXJrJ3Mgb24gdGhlIHBhZ2UuIEZvbnQgQXdlc29tZSBkcmF3cyBpdHMgZ2x5cGggd2l0aFxuICogOjpiZWZvcmUsIHNvIDo6YWZ0ZXIgaXMgZnJlZS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjbHVzdGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0geyd1bmlvbid8J2NvdW50cyd9IHBhcmFtcy5wcmVzZW50YXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMubm90ZU1hcmtzXG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLnRhZ01hcmtzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9hcHBseUdseXBoQ291bnRzKGNsdXN0ZXIsIHsgcHJlc2VudGF0aW9uLCBub3RlTWFya3MsIHRhZ01hcmtzIH0pIHtcbiAgY29uc3Qgbm90ZUljb24gPSBjbHVzdGVyLnF1ZXJ5U2VsZWN0b3IoYC4ke05PVEVfR0xZUEhfQ0xBU1N9YCk7XG4gIGNvbnN0IHRhZ0ljb24gPSBjbHVzdGVyLnF1ZXJ5U2VsZWN0b3IoYC4ke1RBR19HTFlQSF9DTEFTU31gKTtcblxuICAvLyBBbHdheXMgY2xlYXIgZmlyc3Q6IHN3aXRjaGluZyBwcmVzZW50YXRpb24gbXVzdCBub3QgbGVhdmUgYSBzdGFsZSBjb3VudC5cbiAgW25vdGVJY29uLCB0YWdJY29uXS5mb3JFYWNoKChpY29uKSA9PiBpY29uPy5yZW1vdmVBdHRyaWJ1dGUoQ0xVU1RFUl9HTFlQSF9DT1VOVF9BVFRSKSk7XG5cbiAgaWYgKHByZXNlbnRhdGlvbiAhPT0gJ2NvdW50cycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAobm90ZUljb24gJiYgbm90ZU1hcmtzID4gMCkge1xuICAgIG5vdGVJY29uLnNldEF0dHJpYnV0ZShDTFVTVEVSX0dMWVBIX0NPVU5UX0FUVFIsIFN0cmluZyhub3RlTWFya3MpKTtcbiAgfVxuXG4gIGlmICh0YWdJY29uICYmIHRhZ01hcmtzID4gMCkge1xuICAgIHRhZ0ljb24uc2V0QXR0cmlidXRlKENMVVNURVJfR0xZUEhfQ09VTlRfQVRUUiwgU3RyaW5nKHRhZ01hcmtzKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2hhc0dseXBoKG1hcmtlciwgZ2x5cGhDbGFzcykge1xuICByZXR1cm4gQm9vbGVhbihtYXJrZXIucXVlcnlTZWxlY3RvcihgLiR7Z2x5cGhDbGFzc31gKSk7XG59XG5cbi8qKlxuICogUmVzdG9yZSBldmVyeSBjbHVzdGVyZWQgbWFya2VyIHRvIGl0cyBvd24gZ2x5cGhzLCBsYWJlbCBhbmQgdmlzaWJpbGl0eS5cbiAqXG4gKiBUYWtlcyBiYWNrIGV4YWN0bHkgd2hhdCBfY29sbGFwc2VMaW5lKCkgYWRkZWQg4oCUIHRoZSBib3Jyb3dlZCBnbHlwaHMgY2FycnkgYVxuICogbWFya2VyIGF0dHJpYnV0ZSDigJQgc28gYSBtYXJrZXIgdGhhdCBoYXMgYmVlbiBjbHVzdGVyZWQgYW5kIHVuY2x1dHRlcmVkIGlzXG4gKiBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG9uZSB0aGF0IG5ldmVyIHdhcy5cbiAqXG4gKiBAcGFyYW0ge1BhcmVudE5vZGV9IHNjb3BlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF91bmNsdXN0ZXJOb3RlVGFnTWFya2VycyhzY29wZSkge1xuICBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKGAuJHtDTFVTVEVSX0NMQVNTfWApLmZvckVhY2goKGNsdXN0ZXIpID0+IF9yZXN0b3JlQ2x1c3Rlck1hcmtlcihjbHVzdGVyKSk7XG4gIHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke0NMVVNURVJFRF9DTEFTU31gKS5mb3JFYWNoKChtYXJrZXIpID0+IF9yZXN0b3JlRm9sZGVkTWFya2VyKG1hcmtlcikpO1xufVxuXG4vKipcbiAqIEdpdmUgb25lIGNsdXN0ZXIgYmFjayBpdHMgb3duIGdseXBocywgY291bnQtZnJlZSBsYWJlbCBhbmQgcGxhaW4gaWRlbnRpdHkuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY2x1c3RlclxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcmVzdG9yZUNsdXN0ZXJNYXJrZXIoY2x1c3Rlcikge1xuICBjbHVzdGVyLmNsYXNzTGlzdC5yZW1vdmUoQ0xVU1RFUl9DTEFT
129Uyk7XG4gIGNsdXN0ZXIucmVtb3ZlQXR0cmlidXRlKENMVVNURVJfQ09VTlRfQVRUUik7XG4gIC8vIOKaoCBUSFJPV0FXQVkgQS9CICgjNDUxNykg4oCUIGFuIHVuY2x1c3RlcmVkIG1hcmtlciBtdXN0IGNhcnJ5IG5vIGNsdXN0ZXIgc3RhdGUuXG4gIGNsdXN0ZXIucmVtb3ZlQXR0cmlidXRlKENMVVNURVJfU1RZTEVfQVRUUik7XG4gIGNsdXN0ZXIucmVtb3ZlQXR0cmlidXRlKENMVVNURVJfTk9URV9NQVJLU19BVFRSKTtcbiAgY2x1c3Rlci5yZW1vdmVBdHRyaWJ1dGUoQ0xVU1RFUl9UQUdfTUFSS1NfQVRUUik7XG4gIGNsdXN0ZXIucmVtb3ZlQXR0cmlidXRlKENMVVNURVJfQk9PS01BUktfTUFSS1NfQVRUUik7XG4gIGNsdXN0ZXJcbiAgICAucXVlcnlTZWxlY3RvckFsbChgWyR7Q0xVU1RFUl9HTFlQSF9DT1VOVF9BVFRSfV1gKVxuICAgIC5mb3JFYWNoKChpY29uKSA9PiBpY29uLnJlbW92ZUF0dHJpYnV0ZShDTFVTVEVSX0dMWVBIX0NPVU5UX0FUVFIpKTtcbiAgY2x1c3Rlci5xdWVyeVNlbGVjdG9yQWxsKGBbJHtDTFVTVEVSX0lDT05fQVRUUn1dYCkuZm9yRWFjaCgoaWNvbikgPT4gaWNvbi5yZW1vdmUoKSk7XG5cbiAgY29uc3Qgb3duTGFiZWwgPSBjbHVzdGVyLmdldEF0dHJpYnV0ZShDTFVTVEVSX1BSRVZfTEFCRUxfQVRUUik7XG4gIGlmIChvd25MYWJlbCAhPT0gbnVsbCkge1xuICAgIGNsdXN0ZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgb3duTGFiZWwpO1xuICAgIGNsdXN0ZXIudGl0bGUgPSBvd25MYWJlbDtcbiAgICBjbHVzdGVyLnJlbW92ZUF0dHJpYnV0ZShDTFVTVEVSX1BSRVZfTEFCRUxfQVRUUik7XG4gIH1cbn1cblxuLyoqXG4gKiBQdXQgb25lIGZvbGRlZCBtYXJrZXIgYmFjayBvbiBzY3JlZW4uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbWFya2VyXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9yZXN0b3JlRm9sZGVkTWFya2VyKG1hcmtlcikge1xuICBtYXJrZXIuY2xhc3NMaXN0LnJlbW92ZShDTFVTVEVSRURfQ0xBU1MpO1xuICAvLyBNZW1iZXJzaGlwIGlzIHJlY29yZGVkIGF0IGNvbGxhcHNlIHRpbWUgc28gdGhlIGNob29zZXIgY2FuIGVudW1lcmF0ZSBvbmVcbiAgLy8gbGluZSdzIG1hcmtlcnMgKCM0NDcwKS4gQ2xlYXJpbmcgaXQgaGVyZSBsZWF2ZXMgYW4gdW5jbHVzdGVyZWQgbWFya2VyXG4gIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gb25lIHRoYXQgd2FzIG5ldmVyIGZvbGRlZCwgYW5kIGNvdmVycyB0aGUgIzQ0OTlcbiAgLy8gZmFpbC1zYWZlIHVuZm9sZCBwYXRoIGZvciBmcmVlLlxuICBtYXJrZXIucmVtb3ZlQXR0cmlidXRlKENMVVNURVJfTUVNQkVSX0FUVFIpO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdGhlIG9uZS10aW1lIHJlZmxvdyB3aXJpbmcgc28gZ3V0dGVyIG1hcmtlcnMgcmUtYWxpZ24gYWZ0ZXIgbGF5b3V0XG4gKiBjaGFuZ2VzOiBhIGRlYm91bmNlZCB3aW5kb3cgcmVzaXplIGxpc3RlbmVyIGFuZCBhIGN1c3RvbSByZWZsb3cgZXZlbnQgb3RoZXJcbiAqIG1vZHVsZXMgKGUuZy4gZm9udC1zaXplLmpzKSBjYW4gZGlzcGF0Y2ggYWZ0ZXIgY2hhbmdpbmcgcmVhZGVyIGxheW91dC5cbiAqXG4gKiBJZGVtcG90ZW50IOKAlCByZXBlYXRlZCBjYWxscyByZWdpc3RlciB0aGUgbGlzdGVuZXJzIG9ubHkgb25jZS5cbiAqXG4gKiBAcGFyYW0ge1dpbmRvd30gW3dpbj13aW5kb3ddXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXROb3RlVGFnTWFya2VyUmVmbG93KHdpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogbnVsbCkge1xuICBpZiAocmVmbG93SW5zdGFsbGVkIHx8ICF3aW4gfHwgdHlwZW9mIHdpbi5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlZmxvd0luc3RhbGxlZCA9IHRydWU7XG5cbiAgbGV0IHRpbWVyID0gbnVsbDtcbiAgY29uc3Qgc2NoZWR1bGVSZXBvc2l0aW9uID0gKCkgPT4ge1xuICAgIGlmICh0aW1lciAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luLmNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd2luLmNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuICAgIHRpbWVyID0gd2luLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgcmVwb3NpdGlvbk5vdGVUYWdNYXJrZXJzKCk7XG4gICAgfSwgUkVTSVpFX0RFQk9VTkNFX01TKTtcbiAgfTtcblxuICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgc2NoZWR1bGVSZXBvc2l0aW9uKTtcbiAgd2luLmFkZEV2ZW50TGlzdGVuZXIoUkVGTE9XX0VWRU5ULCAoKSA9PiByZXBvc2l0aW9uTm90ZVRhZ01hcmtlcnMoKSk7XG59XG5cbmV4cG9ydCB7XG4gIE1BUktFUl9DTEFTUyxcbiAgVFJVTkNBVElPTl9NQVJLRVJfQ0xBU1MsXG4gIENMVVNURVJfQ0xBU1MsXG4gIENMVVNURVJFRF9DTEFTUyxcbiAgQ0xVU1RFUl9NRU1CRVJfQVRUUixcbiAgQ0xVU1RFUl9DT1VOVF9BVFRSLFxuICBDTFVTVEVSX1NUWUxFX0FUVFIsXG4gIENMVVNURVJfR0xZUEhfQ09VTlRfQVRUUixcbiAgQ0xVU1RFUl9OT1RFX01BUktTX0FUVFIsXG4gIENMVVNURVJfVEFHX01BUktTX0FUVFIsXG4gIENMVVNURVJfQk9PS01BUktfTUFSS1NfQVRUUixcbiAgTUFSS0VSX05PVEVfQVRUUixcbiAgTUFSS0VSX1RBR19DT1VOVF9BVFRSLFxuICBNQVJLRVJfQk9PS01BUktfQVRUUixcbiAgQk9PS01BUktfTUFSS0VSX0NMQVNTLFxuICBCT09LTUFSS19HTFlQSF9DTEFTUyxcbiAgUkVGTE9XX0VWRU5ULFxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/annotations/note-tag-marker.js\n");
130
131/***/ }),
132
133/***/ "./resources/js/annotations/note-utils.js":
134/*!************************************************!*\
135  !*** ./resources/js/annotations/note-utils.js ***!
136  \************************************************/
137/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
138
139eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getNoteIconClass: () => (/* binding */ getNoteIconClass),\n/* harmony export */   normalizeNote: () => (/* binding */ normalizeNote),\n/* harmony export */   shouldIgnoreResizeHandle: () => (/* binding */ shouldIgnoreResizeHandle),\n/* harmony export */   updateMarkNote: () => (/* binding */ updateMarkNote)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/typeof */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/typeof.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/trim */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/is-array */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\n/**\n * Pure helpers for the experimental annotation notes feature (#3080).\n *\n * These functions hold no DOM or module state so they can be unit-tested in\n * isolation. The per-mark `note` is always a plain string — never an object —\n * so it can never be accidentally serialized into a dataset/string attribute\n * (the #3076 class of bug).\n */\n\n/**\n * FontAwesome icon class for the note button based on whether a note exists.\n *\n * @param {string} noteText\n * @returns {string}\n */\nfunction getNoteIconClass(noteText) {\n  var _context;\n  return noteText && _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default()(_context = String(noteText)).call(_context) ? 'fa-file-lines' : 'fa-file-circle-plus';\n}\n\n/**\n * Coerce any incoming note value to a trimmed plain string.\n * Guards against an object ever being stored as a note (#3076).\n *\n * @param {*} value\n * @returns {string}\n */\nfunction normalizeNote(value) {\n  var _context2;\n  if (value === null || value === undefined) {\n    return '';\n  }\n  if (typeof value === 'string') {\n    return _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default()(value).call(value);\n  }\n\n  // Never serialize an object/array into the note field.\n  if ((0,_babel_runtime_corejs3_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(value) === 'object') {\n    return '';\n  }\n  return _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default()(_context2 = String(value)).call(_context2);\n}
139\n\n/**\n * Set or remove the `note` string on the matching mark in a marks array.\n * A non-empty trimmed string is assigned; an empty note deletes the field.\n *\n * @param {Array<Object>} marks\n * @param {string|number} markId\n * @param {string} noteText\n * @returns {Object|null} The updated mark, or null if not found.\n */\nfunction updateMarkNote(marks, markId, noteText) {\n  if (!_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_2___default()(marks)) {\n    return null;\n  }\n  var mark = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_3___default()(marks).call(marks, function (m) {\n    return String(m.id) === String(markId);\n  });\n  if (!mark) {\n    return null;\n  }\n  var trimmed = normalizeNote(noteText);\n  if (trimmed) {\n    mark.note = trimmed;\n  } else {\n    delete mark.note;\n  }\n  return mark;\n}\n\n/**\n * Whether a pointer event occurred in the textarea's resize-handle corner.\n *\n * @param {MouseEvent|TouchEvent} e\n * @param {HTMLElement} el\n * @returns {boolean}\n */\nfunction shouldIgnoreResizeHandle(e, el) {\n  var _e$touches$0$clientX, _e$touches, _e$touches$0$clientY, _e$touches2;\n  var rect = el.getBoundingClientRect();\n  var clientX = (_e$touches$0$clientX = (_e$touches = e.touches) === null || _e$touches === void 0 || (_e$touches = _e$touches[0]) === null || _e$touches === void 0 ? void 0 : _e$touches.clientX) !== null && _e$touches$0$clientX !== void 0 ? _e$touches$0$clientX : e.clientX;\n  var clientY = (_e$touches$0$clientY = (_e$touches2 = e.touches) === null || _e$touches2 === void 0 || (_e$touches2 = _e$touches2[0]) === null || _e$touches2 === void 0 ? void 0 : _e$touches2.clientY) !== null && _e$touches$0$clientY !== void 0 ? _e$touches$0$clientY : e.clientY;\n  var x = clientX - rect.left;\n  var y = clientY - rect.top;\n  return rect.width - x <= 16 && rect.height - y <= 16;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYW5ub3RhdGlvbnMvbm90ZS11dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy9hbm5vdGF0aW9ucy9ub3RlLXV0aWxzLmpzPzRhMzciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIHRoZSBleHBlcmltZW50YWwgYW5ub3RhdGlvbiBub3RlcyBmZWF0dXJlICgjMzA4MCkuXG4gKlxuICogVGhlc2UgZnVuY3Rpb25zIGhvbGQgbm8gRE9NIG9yIG1vZHVsZSBzdGF0ZSBzbyB0aGV5IGNhbiBiZSB1bml0LXRlc3RlZCBpblxuICogaXNvbGF0aW9uLiBUaGUgcGVyLW1hcmsgYG5vdGVgIGlzIGFsd2F5cyBhIHBsYWluIHN0cmluZyDigJQgbmV2ZXIgYW4gb2JqZWN0IOKAlFxuICogc28gaXQgY2FuIG5ldmVyIGJlIGFjY2lkZW50YWxseSBzZXJpYWxpemVkIGludG8gYSBkYXRhc2V0L3N0cmluZyBhdHRyaWJ1dGVcbiAqICh0aGUgIzMwNzYgY2xhc3Mgb2YgYnVnKS5cbiAqL1xuXG4vKipcbiAqIEZvbnRBd2Vzb21lIGljb24gY2xhc3MgZm9yIHRoZSBub3RlIGJ1dHRvbiBiYXNlZCBvbiB3aGV0aGVyIGEgbm90ZSBleGlzdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5vdGVUZXh0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm90ZUljb25DbGFzcyhub3RlVGV4dCkge1xuICByZXR1cm4gbm90ZVRleHQgJiYgU3RyaW5nKG5vdGVUZXh0KS50cmltKCkgPyAnZmEtZmlsZS1saW5lcycgOiAnZmEtZmlsZS1jaXJjbGUtcGx1cyc7XG59XG5cbi8qKlxuICogQ29lcmNlIGFueSBpbmNvbWluZyBub3RlIHZhbHVlIHRvIGEgdHJpbW1lZCBwbGFpbiBzdHJpbmcuXG4gKiBHdWFyZHMgYWdhaW5zdCBhbiBvYmplY3QgZXZlciBiZWluZyBzdG9yZWQgYXMgYSBub3RlICgjMzA3NikuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU5vdGUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybi
139B2YWx1ZS50cmltKCk7XG4gIH1cblxuICAvLyBOZXZlciBzZXJpYWxpemUgYW4gb2JqZWN0L2FycmF5IGludG8gdGhlIG5vdGUgZmllbGQuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkudHJpbSgpO1xufVxuXG4vKipcbiAqIFNldCBvciByZW1vdmUgdGhlIGBub3RlYCBzdHJpbmcgb24gdGhlIG1hdGNoaW5nIG1hcmsgaW4gYSBtYXJrcyBhcnJheS5cbiAqIEEgbm9uLWVtcHR5IHRyaW1tZWQgc3RyaW5nIGlzIGFzc2lnbmVkOyBhbiBlbXB0eSBub3RlIGRlbGV0ZXMgdGhlIGZpZWxkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gbWFya3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbWFya0lkXG4gKiBAcGFyYW0ge3N0cmluZ30gbm90ZVRleHRcbiAqIEByZXR1cm5zIHtPYmplY3R8bnVsbH0gVGhlIHVwZGF0ZWQgbWFyaywgb3IgbnVsbCBpZiBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVNYXJrTm90ZShtYXJrcywgbWFya0lkLCBub3RlVGV4dCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobWFya3MpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYXJrID0gbWFya3MuZmluZCgobSkgPT4gU3RyaW5nKG0uaWQpID09PSBTdHJpbmcobWFya0lkKSk7XG5cbiAgaWYgKCFtYXJrKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gbm9ybWFsaXplTm90ZShub3RlVGV4dCk7XG5cbiAgaWYgKHRyaW1tZWQpIHtcbiAgICBtYXJrLm5vdGUgPSB0cmltbWVkO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBtYXJrLm5vdGU7XG4gIH1cblxuICByZXR1cm4gbWFyaztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcG9pbnRlciBldmVudCBvY2N1cnJlZCBpbiB0aGUgdGV4dGFyZWEncyByZXNpemUtaGFuZGxlIGNvcm5lci5cbiAqXG4gKiBAcGFyYW0ge01vdXNlRXZlbnR8VG91Y2hFdmVudH0gZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkSWdub3JlUmVzaXplSGFuZGxlKGUsIGVsKSB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgY2xpZW50WCA9IGUudG91Y2hlcz8uWzBdPy5jbGllbnRYID8/IGUuY2xpZW50WDtcbiAgY29uc3QgY2xpZW50WSA9IGUudG91Y2hlcz8uWzBdPy5jbGllbnRZID8/IGUuY2xpZW50WTtcbiAgY29uc3QgeCA9IGNsaWVudFggLSByZWN0LmxlZnQ7XG4gIGNvbnN0IHkgPSBjbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgcmV0dXJuIHJlY3Qud2lkdGggLSB4IDw9IDE2ICYmIHJlY3QuaGVpZ2h0IC0geSA8PSAxNjtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/annotations/note-utils.js\n");
140
141/***/ }),
142
143/***/ "./resources/js/annotations/session-storage.js":
144/*!*****************************************************!*\
145  !*** ./resources/js/annotations/session-storage.js ***!
146  \*****************************************************/
147/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
148
149eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   addMarkToSessionStorage: () => (/* binding */ addMarkToSessionStorage),\n/* harmony export */   addSectionMarkToCollectionInSessionStorage: () => (/* binding */ addSectionMarkToCollectionInSessionStorage),\n/* harmony export */   findMarkInSectionCollectionInSessionStorage: () => (/* binding */ findMarkInSectionCollectionInSessionStorage),\n/* harmony export */   getHighlightColor: () => (/* binding */ getHighlightColor),\n/* harmony export */   getSectionMarksFromSessionStorage: () => (/* reexport safe */ _account_annotations__WEBPACK_IMPORTED_MODULE_8__.getSectionMarksFromSessionStorage),\n/* harmony export */   isMarksHistoryFull: () => (/* binding */ isMarksHistoryFull),\n/* harmony export */   popFromMarksHistory: () => (/* binding */ popFromMarksHistory),\n/* harmony export */   popPreviousMarksState: () => (/* binding */ popPreviousMarksState),\n/* harmony export */   pushToMarkHistory: () => (/* binding */ pushToMarkHistory),\n/* harmony export */   removeMarkFromSectionCollectionInSessionStorage: () => (/* binding */ removeMarkFromSectionCollectionInSessionStorage),\n/* harmony export */   removeOldestFromMarksHistory: () => (/* binding */ removeOldestFromMarksHistory),\n/* harmony export */   sectionMarks: () => (/* binding */ sectionMarks),\n/* harmony export */   updateMarkInSectionCollectionInSessionStorage: () => (/* binding */ updateMarkInSectionCollectionInSessionStorage)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/json/stringify */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/is-array */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/parse-int */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find_index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find-index */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find-index.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find_index__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find_index__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/filter */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/sort */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/sort.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _utilities_general__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utilities/general */ \"./resources/js/utilities/general.js\");\n/* harmony import */ var _account_annotations__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../account/annotations */ \"./resources/js/account/annotations.js\");\n/* harmony import */ var _utilities_debug__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utilities/debug */ \"./resources/js/utilities/debug.js\");\n\n\n\n\n\n\n\n\n\n\nvar _createLogger = (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_9__.createLogger)('annotation-storage'),\n  log = _createLogger.log;\n\n/**\n * Add a mark to session\n * @param mark\n * @private\n */\nfunction addSectionMarkToCollectionInSe
149ssionStorage(mark) {\n  var marks = (0,_account_annotations__WEBPACK_IMPORTED_MODULE_8__.getSectionMarksFromSessionStorage)();\n  marks.push(mark);\n  sessionStorage.setItem('marks', _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(marks));\n}\n\n/**\n * Adds a mark to the session storage using the provided key.\n *\n * @param {string} key - The key to be used for storing the mark in the session storage.\n * @param {*} mark - The mark to be stored in the session storage.\n * @return {void} - This method does not return anything.\n */\nfunction addMarkToSessionStorage(key, mark) {\n  sessionStorage.setItem(key, _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(mark));\n}\n\n/**\n * Pushes the current state or marks (session storage marks variable) into the marks-history object.\n *\n * @return {void}\n */\nfunction pushToMarkHistory() {\n  var marks = JSON.parse(sessionStorage.getItem('marks'));\n  var history = JSON.parse(sessionStorage.getItem('marks-history'));\n\n  // initialize the history variable if necessary\n  if (!history) {\n    history = [];\n  }\n\n  // store the entire array of marks data on the section, if there's been a change\n  if (history.length === 0 || marks !== history[history.length - 1]) {\n    history.push(marks);\n  }\n  sessionStorage.setItem('marks-history', _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(history));\n\n  // keep a history of no more than 5 previous states\n  if (history.length > 5) {\n    removeOldestFromMarksHistory();\n  }\n}\n\n/**\n * Returns true if the have reach the number of marks history entries we want to keep in session.\n * @param maxToSTore\n * @returns {boolean}\n */\nfunction isMarksHistoryFull() {\n  var maxToSTore = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 5;\n  var history = JSON.parse(sessionStorage.getItem('marks-history'));\n  return history.length >= maxToSTore;\n}\n\n/**\n * Pop the previous marks state off 'marks-history'.\n *\n * Returns null when there is nothing to roll back to, so callers can tell\n * \"no previous state\" apart from \"the previous state was an empty section\".\n * Writing an empty array in the first case is destructive: a note lives inside\n * the same session blob as its highlight, so wiping 'marks' and then saving\n * takes the notes with it (#4114).\n *\n * @returns {string|null} JSON string of the previous state, or null when the\n *                        history is empty.\n */\nfunction popPreviousMarksState() {\n  var _JSON$parse;\n  var history = (_JSON$parse = JSON.parse(sessionStorage.getItem('marks-history'))) !== null && _JSON$parse !== void 0 ? _JSON$parse : [];\n  if (!_babel_runtime_corejs3_core_js_stable_array_is_array__WEBPACK_IMPORTED_MODULE_1___default()(history) || history.length === 0) {\n    return null;\n  }\n  var previousState = history.pop();\n  sessionStorage.setItem('marks-history', _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(history));\n  return _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(previousState);\n}\n\n/**\n * Legacy wrapper: always returns a JSON string, falling back to an empty\n * array when there is no history. Prefer popPreviousMarksState() on any path\n * that writes the result straight back into session storage.\n *\n * @returns {string}\n */\nfunction popFromMarksHistory() {\n  var _popPreviousMarksStat;\n  return (_popPreviousMarksStat = popPreviousMarksState()) !== null && _popPreviousMarksStat !== void 0 ? _popPreviousMarksStat : _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()([]);\n}\n\n/**\n * Removes the oldest element from the mark history if there [undoMax] or more entries in the array.\n *\n * @returns {string|boolean}\n */\nfunction removeOldestFromMarksHistory() {\n  var history = JSON.parse(sessionStorage.getItem('marks-history'));\n  var oldest;\n\n  // remove oldest entry\n  oldest = history.shift();\n  var updated = _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(history);\n  sessionStorage.setItem('marks-history', updated);\n  return _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(oldest);\n}\n\n/**\n * Find a mark object in session storage by mark ID\n * @param allMarks\n * @param markId\n * @returns {*}
149\n * @private\n */\nfunction findMarkInSectionCollectionInSessionStorage(allMarks, markId) {\n  // guar clause - if collection null, return null\n  if (!allMarks) {\n    return null;\n  }\n  return _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_2___default()(allMarks).call(allMarks, function (mark) {\n    var parsedItem = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_3___default()(mark.id);\n    var parsedSearch = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_3___default()(markId);\n    if (!isNaN(parsedItem) && !isNaN(parsedSearch)) {\n      return parsedItem === parsedSearch;\n    }\n    return String(mark.id) === String(markId);\n  });\n}\n\n/**\n * Update a mark in session Storage.\n * @param allMarks\n * @param markData\n * @private\n */\nfunction updateMarkInSectionCollectionInSessionStorage(allMarks, markData) {\n  var marks = sectionMarks(allMarks);\n  var index = indexOfMarkInSession(allMarks, markData);\n  marks[index] = markData;\n  sessionStorage.setItem('marks', _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(marks));\n}\n\n/**\n * Returns the index of the mark in the session array\n * @param allMarks\n * @param mark\n * @returns {*}\n * @private\n */\nfunction indexOfMarkInSession(allMarks, mark) {\n  var _context;\n  var id = mark.id;\n  return _babel_runtime_corejs3_core_js_stable_instance_find_index__WEBPACK_IMPORTED_MODULE_4___default()(_context = sectionMarks(allMarks)).call(_context, function (mark) {\n    return _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_3___default()(mark.id) === _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_3___default()(id);\n  });\n}\n\n/**\n * Find a mark in the marks session Storage array and remove it\n * returns the filtered array\n * @param allMarks\n * @param markId\n * @returns {*[]}\n * @private\n */\nfunction removeMarkFromSectionCollectionInSessionStorage(allMarks, markId) {\n  var filteredMarks = [];\n  if (markId) {\n    // filter the mark to delete; filteredMarks will contain all marks except the one we are deleting\n    filteredMarks = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5___default()(allMarks).call(allMarks, function (item) {\n      var _findMarkInSectionCol;\n      // if there was an error processing a new mark, it will have already been removed from storage;\n      // thus the optional chaining\n      return item.id !== ((_findMarkInSectionCol = findMarkInSectionCollectionInSessionStorage(allMarks, markId)) === null || _findMarkInSectionCol === void 0 ? void 0 : _findMarkInSectionCol.id);\n    });\n\n    // overwrite the marks array with the filtered array\n    sessionStorage.setItem('marks', _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_0___default()(filteredMarks));\n  }\n  return filteredMarks;\n}\n\n/**\n *\n * Filters and sorts the marks in the session object 'marks'.\n *\n * Return marks with the given contentId and sectionId, sorted by largest start range offset, in essence sorting\n * marks putting the furthest mark down the page first.\n * If no content / section ids are passed in, fetch them using helper methods\n * @param allMarks\n * @param htmlContentId\n * @returns {*}\n * @private\n */\nfunction sectionMarks(allMarks) {\n  var htmlContentId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  var filteredAndSorted = [];\n  try {\n    // set contentId, sectionId if null\n    htmlContentId = htmlContentId === null ? (0,_utilities_general__WEBPACK_IMPORTED_MODULE_7__.getCurrentHtmlContentId)() : htmlContentId;\n    var marks = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_5___default()(allMarks).call(allMarks, function (mark) {\n      return mark.htmlContentId === htmlContentId;\n    });\n    filteredAndSorted = _babel_runtime_corejs3_core_js_stable_instance_sort__WEBPACK_IMPORTED_MODULE_6___default()(marks).call(marks, function (a, b) {\n      return b.rangeOffsets.start - a.rangeOffsets.start;\n    });\n    if (!filteredAndSorted) {\n      // TODO: do we need this?\n      // clearMarkObjectInSession();\n      log(\"filteredAndSorted should not be empty but it is...\");\n    }\n  } catch (error) {\n    console.error(error.message);\n  }\n  return filteredAndSorted;\n}\n\n/**\n * Get the selected highlight color from session storage.\n * @returns {string}\n * @private\n */\nfunction getHighlightColor() {\n  var _sessionStorage$getIt;\n  return (_sessionStorage$getIt = sessionStorage.getItem('highlight-color')) !== null && _sessionStorage$getIt !== void 0 ? _sessionStorage$getIt : sessionStorage.getItem('default-highlight-color');\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYW5ub3RhdGlvbnMvc2Vzc2lvbi1zdG9yYWdlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
149BRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvYW5ub3RhdGlvbnMvc2Vzc2lvbi1zdG9yYWdlLmpzPzM5NmEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtnZXRDdXJyZW50SHRtbENvbnRlbnRJZH0gZnJvbSBcIi4uL3V0aWxpdGllcy9nZW5lcmFsXCI7XG5pbXBvcnQge2dldFNlY3Rpb25NYXJrc0Zyb21TZXNzaW9uU3RvcmFnZSwgY2xlYXJNYXJrT2JqZWN0SW5TZXNzaW9ufSBmcm9tIFwiLi4vYWNjb3VudC9hbm5vdGF0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9kZWJ1Z1wiO1xuY29uc3QgeyBsb2cgfSA9IGNyZWF0ZUxvZ2dlcignYW5ub3RhdGlvbi1zdG9yYWdlJyk7XG5cbi8qKlxuICogQWRkIGEgbWFyayB0byBzZXNzaW9uXG4gKiBAcGFyYW0gbWFya1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkU2VjdGlvbk1hcmtUb0NvbGxlY3Rpb25JblNlc3Npb25TdG9yYWdlKG1hcmspIHtcbiAgbGV0IG1hcmtzID0gZ2V0U2VjdGlvbk1hcmtzRnJvbVNlc3Npb25TdG9yYWdlKCk7XG4gIG1hcmtzLnB1c2gobWFyayk7XG5cbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnbWFya3MnLCBKU09OLnN0cmluZ2lmeShtYXJrcykpO1xufVxuXG4vKipcbiAqIEFkZHMgYSBtYXJrIHRvIHRoZSBzZXNzaW9uIHN0b3JhZ2UgdXNpbmcgdGhlIHByb3ZpZGVkIGtleS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byBiZSB1c2VkIGZvciBzdG9yaW5nIHRoZSBtYXJrIGluIHRoZSBzZXNzaW9uIHN0b3JhZ2UuXG4gKiBAcGFyYW0geyp9IG1hcmsgLSBUaGUgbWFyayB0byBiZSBzdG9yZWQgaW4gdGhlIHNlc3Npb24gc3RvcmFnZS5cbiAqIEByZXR1cm4ge3ZvaWR9IC0gVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLlxuICovXG5mdW5jdGlvbiBhZGRNYXJrVG9TZXNzaW9uU3RvcmFnZShrZXksIG1hcmspIHtcbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG1hcmspKTtcbn1cblxuLyoqXG4gKiBQdXNoZXMgdGhlIGN1cnJlbnQgc3RhdGUgb3IgbWFya3MgKHNlc3Npb24gc3RvcmFnZSBtYXJrcyB2YXJpYWJsZSkgaW50byB0aGUgbWFya3MtaGlzdG9yeSBvYmplY3QuXG4gKlxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gcHVzaFRvTWFya0hpc3RvcnkoKSB7XG4gIGNvbnN0IG1hcmtzID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdtYXJrcycpKTtcbiAgbGV0IGhpc3RvcnkgPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ21hcmtzLWhpc3RvcnknKSk7XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgaGlzdG9yeSB2YXJpYWJsZSBpZiBuZWNlc3NhcnlcbiAgaWYoIWhpc3RvcnkpIHtcbiAgICBoaXN0b3J5ID0gW107XG4gIH1cblxuICAvLyBzdG9yZSB0aGUgZW50aXJlIGFycmF5IG9mIG1hcmtzIGRhdGEgb24gdGhlIHNlY3Rpb24sIGlmIHRoZXJlJ3MgYmVlbiBhIGNoYW5nZVxuICBpZigoaGlzdG9yeS5sZW5ndGggPT09IDApIHx8IChtYXJrcyAhPT0gaGlzdG9yeVtoaXN0b3J5Lmxlbmd0aCAtIDFdKSkge1xuICAgIGhpc3RvcnkucHVzaChtYXJrcyk7XG4gIH1cblxuICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdtYXJrcy1oaXN0b3J5JywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeSkpO1xuXG4gIC8vIGtlZXAgYSBoaXN0b3J5IG9mIG5vIG1vcmUgdGhhbiA1IHByZXZpb3VzIHN0YXRlc1xuICBpZihoaXN0b3J5Lmxlbmd0aCA+IDUpIHtcbiAgICByZW1vdmVPbGRlc3RGcm9tTWFya3NIaXN0b3J5KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGhhdmUgcmVhY2ggdGhlIG51bWJlciBvZiBtYXJrcyBoaXN0b3J5IGVudHJpZXMgd2Ugd2FudCB0byBrZWVwIGluIHNlc3Npb24uXG4gKiBAcGFyYW0gbWF4VG9TVG9yZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTWFya3NIaXN0b3J5RnVsbChtYXhUb1NUb3JlID0gNSkge1xuICBsZXQgaGlzdG9yeSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnbWFya3MtaGlzdG9yeScpKTtcbiAgcmV0dXJuIGhpc3RvcnkubGVuZ3RoID49IG1heFRvU1Rvcm
149U7XG59XG5cbi8qKlxuICogUG9wIHRoZSBwcmV2aW91cyBtYXJrcyBzdGF0ZSBvZmYgJ21hcmtzLWhpc3RvcnknLlxuICpcbiAqIFJldHVybnMgbnVsbCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gcm9sbCBiYWNrIHRvLCBzbyBjYWxsZXJzIGNhbiB0ZWxsXG4gKiBcIm5vIHByZXZpb3VzIHN0YXRlXCIgYXBhcnQgZnJvbSBcInRoZSBwcmV2aW91cyBzdGF0ZSB3YXMgYW4gZW1wdHkgc2VjdGlvblwiLlxuICogV3JpdGluZyBhbiBlbXB0eSBhcnJheSBpbiB0aGUgZmlyc3QgY2FzZSBpcyBkZXN0cnVjdGl2ZTogYSBub3RlIGxpdmVzIGluc2lkZVxuICogdGhlIHNhbWUgc2Vzc2lvbiBibG9iIGFzIGl0cyBoaWdobGlnaHQsIHNvIHdpcGluZyAnbWFya3MnIGFuZCB0aGVuIHNhdmluZ1xuICogdGFrZXMgdGhlIG5vdGVzIHdpdGggaXQgKCM0MTE0KS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9IEpTT04gc3RyaW5nIG9mIHRoZSBwcmV2aW91cyBzdGF0ZSwgb3IgbnVsbCB3aGVuIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5IGlzIGVtcHR5LlxuICovXG5mdW5jdGlvbiBwb3BQcmV2aW91c01hcmtzU3RhdGUoKSB7XG4gIGNvbnN0IGhpc3RvcnkgPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ21hcmtzLWhpc3RvcnknKSkgPz8gW107XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGhpc3RvcnkpIHx8IGhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwcmV2aW91c1N0YXRlID0gaGlzdG9yeS5wb3AoKTtcbiAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnbWFya3MtaGlzdG9yeScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnkpKTtcblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJldmlvdXNTdGF0ZSk7XG59XG5cbi8qKlxuICogTGVnYWN5IHdyYXBwZXI6IGFsd2F5cyByZXR1cm5zIGEgSlNPTiBzdHJpbmcsIGZhbGxpbmcgYmFjayB0byBhbiBlbXB0eVxuICogYXJyYXkgd2hlbiB0aGVyZSBpcyBubyBoaXN0b3J5LiBQcmVmZXIgcG9wUHJldmlvdXNNYXJrc1N0YXRlKCkgb24gYW55IHBhdGhcbiAqIHRoYXQgd3JpdGVzIHRoZSByZXN1bHQgc3RyYWlnaHQgYmFjayBpbnRvIHNlc3Npb24gc3RvcmFnZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBwb3BGcm9tTWFya3NIaXN0b3J5KCkge1xuICByZXR1cm4gcG9wUHJldmlvdXNNYXJrc1N0YXRlKCkgPz8gSlNPTi5zdHJpbmdpZnkoW10pO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIG9sZGVzdCBlbGVtZW50IGZyb20gdGhlIG1hcmsgaGlzdG9yeSBpZiB0aGVyZSBbdW5kb01heF0gb3IgbW9yZSBlbnRyaWVzIGluIHRoZSBhcnJheS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfGJvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZU9sZGVzdEZyb21NYXJrc0hpc3RvcnkoKSB7XG4gIGxldCBoaXN0b3J5ID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdtYXJrcy1oaXN0b3J5JykpO1xuICBsZXQgb2xkZXN0O1xuXG4gICAgLy8gcmVtb3ZlIG9sZGVzdCBlbnRyeVxuICAgIG9sZGVzdCA9IGhpc3Rvcnkuc2hpZnQoKTtcblxuICAgIGxldCB1cGRhdGVkID0gSlNPTi5zdHJpbmdpZnkoaGlzdG9yeSk7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnbWFya3MtaGlzdG9yeScsIHVwZGF0ZWQpO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9sZGVzdCk7XG59XG5cbi8qKlxuICogRmluZCBhIG1hcmsgb2JqZWN0IGluIHNlc3Npb24gc3RvcmFnZSBieSBtYXJrIElEXG4gKiBAcGFyYW0gYWxsTWFya3NcbiAqIEBwYXJhbSBtYXJrSWRcbiAqIEByZXR1cm5zIHsqfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZmluZE1hcmtJblNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZShhbGxNYXJrcywgbWFya0lkKSB7XG4gIC8vIGd1YXIgY2xhdXNlIC0gaWYgY29sbGVjdGlvbiBudWxsLCByZXR1cm4gbnVsbFxuICBpZighYWxsTWFya3MpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBhbGxNYXJrcy5maW5kKChtYXJrKSA9PiB7XG4gICAgY29uc3QgcGFyc2VkSXRlbSAgID0gcGFyc2VJbnQobWFyay5pZCk7XG4gICAgY29uc3QgcGFyc2VkU2VhcmNoID0gcGFyc2VJbnQobWFya0lkKTtcbiAgICBpZiAoIWlzTmFOKHBhcnNlZEl0ZW0pICYmICFpc05hTihwYXJzZWRTZWFyY2gpKSB7XG4gICAgICByZXR1cm4gcGFyc2VkSXRlbSA9PT0gcGFyc2VkU2VhcmNoO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG1hcmsuaWQpID09PSBTdHJpbmcobWFya0lkKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGEgbWFyayBpbiBzZXNzaW9uIFN0b3JhZ2UuXG4gKiBAcGFyYW0gYWxsTWFya3NcbiAqIEBwYXJhbSBtYXJrRGF0YVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTWFya0luU2VjdGlvbkNvbGxlY3Rpb25JblNlc3Npb25TdG9yYWdlKGFsbE1hcmtzLCBtYXJrRGF0YSkge1xuICBsZXQgbWFya3MgPSBzZWN0aW9uTWFya3MoYWxsTWFya3MpO1xuICBjb25zdCBpbmRleCA9IGluZGV4T2ZNYXJrSW5TZXNzaW9uKGFsbE1hcmtzLCBtYXJrRGF0YSk7XG4gIG1hcmtzW2luZGV4XSA9IG1hcmtEYXRhO1xuICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdtYXJrcycsIEpTT04uc3RyaW5naWZ5KG1hcmtzKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hcmsgaW4gdGhlIHNlc3Npb24gYXJyYXlcbiAqIEBwYXJhbSBhbGxNYXJrc1xuICogQHBhcmFtIG1hcmtcbiAqIEByZXR1cm5zIHsqfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5kZXhPZk1hcmtJblNlc3Npb24oYWxsTWFya3MsIG1hcmspIHtcbiAgbGV0IGlkID0gbWFyay5pZDtcbiAgcmV0dXJuIHNlY3Rpb25NYXJrcyhhbGxNYXJrcykuZmluZEluZGV4KChtYXJrKSA9PiBwYXJzZUludChtYXJrLmlkKSA9PT0gcGFyc2VJbnQoaWQpKTtcbn1cblxuLyoqXG4gKiBGaW5kIGEgbWFyayBpbiB0aGUgbWFya3Mgc2Vzc2lvbiBTdG9yYWdlIGFycmF5IGFuZCByZW1vdmUgaXRcbiAqIHJldHVybnMgdGhlIGZpbHRlcmVkIGFycmF5XG4gKiBAcGFyYW0gYWxsTWFya3NcbiAqIEBwYXJhbSBtYXJrSWRcbiAqIEByZXR1cm5zIHsqW119XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZW1vdmVNYXJrRnJvbVNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZShhbGxNYXJrcywgbWFya0lkKSB7XG4gIGxldCBmaWx0ZXJlZE1hcmtzID0gW107XG4gIGlmIChtYXJrSWQpIHtcbiAgICAvLyBmaWx0ZXIgdGhlIG1hcmsgdG8gZGVsZXRlOyBmaWx0ZXJlZE1hcmtzIHdpbGwgY29udGFpbiBhbGwgbWFya3MgZXhjZXB0IHRoZSBvbmUgd2UgYXJlIGRlbGV0aW5nXG4gICAgZmlsdGVyZWRNYXJrcyA9IGFsbE1hcmtzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgLy8gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgYSBuZXcgbWFyaywgaXQgd2lsbCB
149oYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gc3RvcmFnZTtcbiAgICAgIC8vIHRodXMgdGhlIG9wdGlvbmFsIGNoYWluaW5nXG4gICAgICByZXR1cm4gaXRlbS5pZCAhPT0gZmluZE1hcmtJblNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZShhbGxNYXJrcywgbWFya0lkKT8uaWQ7XG4gICAgfSk7XG5cbiAgICAvLyBvdmVyd3JpdGUgdGhlIG1hcmtzIGFycmF5IHdpdGggdGhlIGZpbHRlcmVkIGFycmF5XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnbWFya3MnLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJlZE1hcmtzKSk7XG4gIH1cblxuICByZXR1cm4gZmlsdGVyZWRNYXJrcztcbn1cblxuLyoqXG4gKlxuICogRmlsdGVycyBhbmQgc29ydHMgdGhlIG1hcmtzIGluIHRoZSBzZXNzaW9uIG9iamVjdCAnbWFya3MnLlxuICpcbiAqIFJldHVybiBtYXJrcyB3aXRoIHRoZSBnaXZlbiBjb250ZW50SWQgYW5kIHNlY3Rpb25JZCwgc29ydGVkIGJ5IGxhcmdlc3Qgc3RhcnQgcmFuZ2Ugb2Zmc2V0LCBpbiBlc3NlbmNlIHNvcnRpbmdcbiAqIG1hcmtzIHB1dHRpbmcgdGhlIGZ1cnRoZXN0IG1hcmsgZG93biB0aGUgcGFnZSBmaXJzdC5cbiAqIElmIG5vIGNvbnRlbnQgLyBzZWN0aW9uIGlkcyBhcmUgcGFzc2VkIGluLCBmZXRjaCB0aGVtIHVzaW5nIGhlbHBlciBtZXRob2RzXG4gKiBAcGFyYW0gYWxsTWFya3NcbiAqIEBwYXJhbSBodG1sQ29udGVudElkXG4gKiBAcmV0dXJucyB7Kn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNlY3Rpb25NYXJrcyhhbGxNYXJrcywgaHRtbENvbnRlbnRJZCA9IG51bGwpIHtcbiAgbGV0IGZpbHRlcmVkQW5kU29ydGVkID0gW107XG5cbiAgdHJ5IHtcbiAgICAvLyBzZXQgY29udGVudElkLCBzZWN0aW9uSWQgaWYgbnVsbFxuICAgIGh0bWxDb250ZW50SWQgPSAoaHRtbENvbnRlbnRJZCA9PT0gbnVsbCkgPyBnZXRDdXJyZW50SHRtbENvbnRlbnRJZCgpIDogaHRtbENvbnRlbnRJZDtcblxuICAgIGxldCBtYXJrc1xuICAgICAgPSBhbGxNYXJrc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgbWFyayA9PiBtYXJrLmh0bWxDb250ZW50SWQgPT09IGh0bWxDb250ZW50SWRcbiAgICAgICk7XG4gICAgZmlsdGVyZWRBbmRTb3J0ZWQgPSBtYXJrcy5zb3J0KChhLCBiKSA9PiBiLnJhbmdlT2Zmc2V0cy5zdGFydCAtIGEucmFuZ2VPZmZzZXRzLnN0YXJ0KTtcblxuICAgIGlmICghZmlsdGVyZWRBbmRTb3J0ZWQpIHtcbiAgICAgIC8vIFRPRE86IGRvIHdlIG5lZWQgdGhpcz9cbiAgICAgIC8vIGNsZWFyTWFya09iamVjdEluU2Vzc2lvbigpO1xuICAgICAgbG9nKGBmaWx0ZXJlZEFuZFNvcnRlZCBzaG91bGQgbm90IGJlIGVtcHR5IGJ1dCBpdCBpcy4uLmApXG4gICAgfVxuICB9Y2F0Y2goZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICB9XG5cbiAgcmV0dXJuIGZpbHRlcmVkQW5kU29ydGVkO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc2VsZWN0ZWQgaGlnaGxpZ2h0IGNvbG9yIGZyb20gc2Vzc2lvbiBzdG9yYWdlLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldEhpZ2hsaWdodENvbG9yICgpIHtcbiAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2hpZ2hsaWdodC1jb2xvcicpXG4gICAgPz8gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZGVmYXVsdC1oaWdobGlnaHQtY29sb3InKTtcbn1cblxuZXhwb3J0IHtcbiAgYWRkTWFya1RvU2Vzc2lvblN0b3JhZ2UsIGFkZFNlY3Rpb25NYXJrVG9Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZSxcbiAgZmluZE1hcmtJblNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZSwgZ2V0SGlnaGxpZ2h0Q29sb3IsXG4gIGdldFNlY3Rpb25NYXJrc0Zyb21TZXNzaW9uU3RvcmFnZSwgaXNNYXJrc0hpc3RvcnlGdWxsLCBwdXNoVG9NYXJrSGlzdG9yeSwgcmVtb3ZlT2xkZXN0RnJvbU1hcmtzSGlzdG9yeSxcbiAgcG9wRnJvbU1hcmtzSGlzdG9yeSwgcG9wUHJldmlvdXNNYXJrc1N0YXRlLCByZW1vdmVNYXJrRnJvbVNlY3Rpb25Db2xsZWN0aW9uSW5TZXNzaW9uU3RvcmFnZSxcbiAgc2VjdGlvbk1hcmtzLCB1cGRhdGVNYXJrSW5TZWN0aW9uQ29sbGVjdGlvbkluU2Vzc2lvblN0b3JhZ2Vcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/annotations/session-storage.js\n");
150
151/***/ }),
152
153/***/ "./resources/js/annotations/tags-request.js":
154/*!**************************************************!*\
155  !*** ./resources/js/annotations/tags-request.js ***!
156  \**************************************************/
157/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
158
159eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   buildTagsBody: () => (/* binding */ buildTagsBody)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/toConsumableArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js\");\n\n/**\n * The single-mark `tags` request contract (#4367, #4368).\n *\n * Every surface that changes the tags on one annotation — the reader panel's\n * per-card tray and the account Annotations page's tag controls — posts the\n * SAME body to refresh-paginated-list.php, where UserMark::modifyMarks applies\n * it through the shared read-modify-write helper.\n *\n * It lives in its own module rather than in either caller so neither surface\n * has to import the other's controller to reuse the shape. A second, subtly\n * different body is exactly how the two surfaces would drift apart.\n */\n\n/**\n * Build the modifyCollection request body for one single-mark `tags` action,\n * shaped exactly as refresh-paginated-list.php → UserMark::modifyMarks expects.\n *\n * No `note` and no `color`: this action must leave both untouched, and the\n * server closure only ever reads `tagIds`. The server re-derives ownership of\n * every posted id, so the list is a request, not an instruction.\n *\n * @param {{hid: string, userMarkId: string, markId: string}} mark\n * @param {string[]} tagIds\n * @returns {Object}\n */\nfunction buildTagsBody(mark, tagIds) {\n  return {\n    paginatorName: 'annotations',\n    options: {\n      collection: {\n        paginatorName: 'annotations'\n      },\n      modifyCollection: {\n        type: 'UserMark',\n        marks: [{\n          action: 'tags',\n          htmlContentId: mark.hid,\n          userMarkId: mark.userMarkId,\n          markId: mark.markId,\n          tagIds: (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(tagIds)\n        }]\n      }\n    }\n  };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYW5ub3RhdGlvbnMvdGFncy1yZXF1ZXN0LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy9hbm5vdGF0aW9ucy90YWdzLXJlcXVlc3QuanM/NmE4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBzaW5nbGUtbWFyayBgdGFnc2AgcmVxdWVzdCBjb250cmFjdCAoIzQzNjcsICM0MzY4KS5cbiAqXG4gKiBFdmVyeSBzdXJmYWNlIHRoYXQgY2hhbmdlcyB0aGUgdGFncyBvbiBvbmUgYW5ub3RhdGlvbiDigJQgdGhlIHJlYWRlciBwYW5lbCdzXG4gKiBwZXItY2FyZCB0cmF5IGFuZCB0aGUgYWNjb3VudCBBbm5vdGF0aW9ucyBwYWdlJ3MgdGFnIGNvbnRyb2xzIOKAlCBwb3N0cyB0aGVcbiAqIFNBTUUgYm9keSB0byByZWZyZXNoLXBhZ2luYXRlZC1saXN0LnBocCwgd2hlcmUgVXNlck1hcms6Om1vZGlmeU1hcmtzIGFwcGxpZXNcbiAqIGl0IHRocm91Z2ggdGhlIHNoYXJlZCByZWFkLW1vZGlmeS13cml0ZSBoZWxwZXIuXG4gKlxuICogSXQgbGl2ZXMgaW4gaXRzIG93biBtb2R1bGUgcmF0aGVyIHRoYW4gaW4gZWl0aGVyIGNhbGxlciBzbyBuZWl0aGVyIHN1cmZhY2VcbiAqIGhhcyB0byBpbXBvcnQgdGhlIG90aGVyJ3MgY29udHJvbGxlciB0byByZXVzZSB0aGUgc2hhcGUuIEEgc2Vjb25kLCBzdWJ0bHlcbiAqIGRpZmZlcmVudCBib2R5IGlzIGV4YWN0bHkgaG93IHRoZSB0d28gc3VyZmFjZXMgd291bGQgZHJpZnQgYXBhcnQuXG4gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgbW9kaWZ5Q29sbGVjdGlvbiByZXF1ZXN0IGJvZHkgZm9yIG9uZSBzaW5nbGUtbWFyayBgdGFnc2AgYWN0aW9uLFxuICogc2hhcGVkIGV4YWN0bHkgYXMgcmVmcmVzaC1wYWdpbmF0ZWQtbGlzdC5waHAg4oaSIFVzZXJNYXJrOjptb2RpZnlNYXJrcyBleHBlY3RzLlxuICpcbiAqIE5vIGBub3RlYCBhbmQgbm8gYGNvbG9yYDogdGhpcyBhY3Rpb24gbXVzdCBsZWF2ZSBib3RoIHVudG91Y2hlZCwgYW5kIHR
159oZVxuICogc2VydmVyIGNsb3N1cmUgb25seSBldmVyIHJlYWRzIGB0YWdJZHNgLiBUaGUgc2VydmVyIHJlLWRlcml2ZXMgb3duZXJzaGlwIG9mXG4gKiBldmVyeSBwb3N0ZWQgaWQsIHNvIHRoZSBsaXN0IGlzIGEgcmVxdWVzdCwgbm90IGFuIGluc3RydWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7e2hpZDogc3RyaW5nLCB1c2VyTWFya0lkOiBzdHJpbmcsIG1hcmtJZDogc3RyaW5nfX0gbWFya1xuICogQHBhcmFtIHtzdHJpbmdbXX0gdGFnSWRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUYWdzQm9keShtYXJrLCB0YWdJZHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwYWdpbmF0b3JOYW1lOiAnYW5ub3RhdGlvbnMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB7IHBhZ2luYXRvck5hbWU6ICdhbm5vdGF0aW9ucycgfSxcbiAgICAgICAgICAgIG1vZGlmeUNvbGxlY3Rpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnVXNlck1hcmsnLFxuICAgICAgICAgICAgICAgIG1hcmtzOiBbe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICd0YWdzJyxcbiAgICAgICAgICAgICAgICAgICAgaHRtbENvbnRlbnRJZDogbWFyay5oaWQsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJNYXJrSWQ6IG1hcmsudXNlck1hcmtJZCxcbiAgICAgICAgICAgICAgICAgICAgbWFya0lkOiBtYXJrLm1hcmtJZCxcbiAgICAgICAgICAgICAgICAgICAgdGFnSWRzOiBbLi4udGFnSWRzXSxcbiAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/annotations/tags-request.js\n");
160
161/***/ }),
162
163/***/ "./resources/js/app.js":
164/*!*****************************!*\
165  !*** ./resources/js/app.js ***!
166  \*****************************/
167/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
168
169eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/object/keys */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_bind__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/bind */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_bind__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_bind__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/includes */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/set-timeout */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_url_search_params__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/url-search-params */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/url-search-params.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_url_search_params__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_url_search_params__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var what_input__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! what-input */ \"./node_modules/what-input/dist/what-input.js\");\n/* harmony import */ var what_input__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(what_input__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _utilities_cookies__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utilities/cookie
169s */ \"./resources/js/utilities/cookies.js\");\n/* harmony import */ var _utilities_general__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utilities/general */ \"./resources/js/utilities/general.js\");\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _utilities_i18n__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./utilities/i18n */ \"./resources/js/utilities/i18n.js\");\n/* harmony import */ var _pagination__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./pagination */ \"./resources/js/pagination.js\");\n/* harmony import */ var _account_annotations__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./account/annotations */ \"./resources/js/account/annotations.js\");\n/* harmony import */ var _account_last_locations__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./account/last-locations */ \"./resources/js/account/last-locations.js\");\n/* harmony import */ var _font_size__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./font-size */ \"./resources/js/font-size.js\");\n/* harmony import */ var _notices_functions__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./notices/functions */ \"./resources/js/notices/functions.js\");\n/* harmony import */ var _account_sign_in_validation__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./account/sign-in-validation */ \"./resources/js/account/sign-in-validation.js\");\n/* harmony import */ var _theme_theme_manager__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./theme/theme-manager */ \"./resources/js/theme/theme-manager.js\");\n/* harmony import */ var _utilities_bfcache_reload__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./utilities/bfcache-reload */ \"./resources/js/utilities/bfcache-reload.js\");\n/* harmony import */ var _utilities_debug__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./utilities/debug */ \"./resources/js/utilities/debug.js\");\n/* harmony import */ var _account_password_toggle_collision_guard__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./account/password-toggle-collision-guard */ \"./resources/js/account/password-toggle-collision-guard.js\");\n\nvar _context14;\n\n\n\n\n\n\n\n\n\n\n// for babel / Promises use: ref: https://github.com/babel/babel/issues/9853\n// see the following for other options: https://github.com/zloirock/core-js/blob/master/docs/2019-03-19-core-js-3-babel-and-a-look-into-the-future.md\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar _createLogger = (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_22__.createLogger)('app'),\n  log = _createLogger.log;\n\n// Reload bfcache-restored pages so they revalidate against the live session,\n// preventing a stale authenticated (dark theme / \"Sign Out\") view for signed-out\n// users on back/forward navigation. See utilities/bfcache-reload.js (#3337).\n(0,_utilities_bfcache_reload__WEBPACK_IMPORTED_MODULE_21__.registerBfcacheReload)();\n\n// Foundation JS relies on a global variable. In ES6, all imports are hoisted\n// to the top of the file so if we used`import` to import Foundation,\n// it would execute earlier than we have assigned the global variable.\n// This is why we have to use CommonJS require() here since it doesn't\n// have the hoisting behavior.\n\nwindow.jQuery = (jquery__WEBPACK_IMPORTED_MODULE_8___default());\n__webpack_require__(/*! foundation-sites */ \"./node_modules/foundation-sites/dist/js/foundation.esm.js\");\n\n// Initialise all foundation plugins within the main-nav\n//$('#main-nav').foundation();\n\n// Foundation plugins must be initialised after DOM is done loading\njquery__WEBPACK_IMPORTED_MODULE_8___default()(document).foundation();\n\n// Foundation now loaded in, let hover appearance work on the menu again\nvar mainNav = document.querySelector('#main-nav');\nif (mainNav) {\n  mainNav.classList.remove('foundation-loading');\n}\n\n/**\n * Run all necessary JS after page loads\n */\ndocument.addEventListener('DOMContentLoaded', function () {\n  var _context8, _context9, _context12, _context13;\n  // Handler to remove notices\n  (0,_notices_functions__WEBPACK_IMPORTED_MODULE_18__.removeNotices)();\n\n  // Pin the server-rendered flash (#notices-main) below the sticky nav. The positioning\n  // used to live only in the notices/main.js bundle, which no page loads — so server\n  // flashes sat hidden at top:0 behind the masthead (#3477).\n  (0,_notices_functions__WEBPACK_IMPORTED_MODULE_18__.initFloatingNotices)();\n\n  // if we signed in automatically, enable the Sign-out button\n  handleEnablingSignInButton();\n\n  // Appearance selector - use event delegation so it works even if Foundation moves elements\n  document.addEventListener('click', /*#__PURE__*/function () {\n    var _ref = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee(e) {\n      var _context, _c
169ontext2, _context3, _context4, _context5, _context6;\n      var btn, theme, themeIcons, mobileDropdown;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context7) {\n        while (1) switch (_context7.prev = _context7.next) {\n          case 0:\n            btn = e.target.closest('.appearance-btn');\n            if (btn) {\n              _context7.next = 3;\n              break;\n            }\n            return _context7.abrupt(\"return\");\n          case 3:\n            e.preventDefault();\n            e.stopPropagation(); // Prevent dropdown from closing\n            theme = btn.dataset.theme; // Update active state on all appearance buttons\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context = document.querySelectorAll('.appearance-btn')).call(_context, function (b) {\n              return b.classList.remove('active');\n            });\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context2 = document.querySelectorAll(\".appearance-btn[data-theme=\\\"\".concat(theme, \"\\\"]\"))).call(_context2, function (b) {\n              return b.classList.add('active');\n            });\n\n            // Update toggle icon in nav/admin appearance selectors and mobile header\n            themeIcons = {\n              light: 'fa-sun',\n              dark: 'fa-moon',\n              sepia: 'fa-scroll',\n              green: 'fa-leaf',\n              auto: 'fa-circle-half-stroke'\n            }; // Desktop nav and admin appearance toggles\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context3 = document.querySelectorAll('.nav-appearance .appearance-toggle i:first-child, .admin-appearance .appearance-toggle i:first-child')).call(_context3, function (icon) {\n              icon.className = \"fa-solid \".concat(themeIcons[theme] || 'fa-sun');\n            });\n            // Mobile header theme button icon\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context4 = document.querySelectorAll('.theme-button > a > i')).call(_context4, function (icon) {\n              icon.className = \"fa-solid \".concat(themeIcons[theme] || 'fa-sun');\n            });\n            // Reader toolbar theme toggle icon\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context5 = document.querySelectorAll('.toolbar-theme-selector .theme-toggle i')).call(_context5, function (icon) {\n              icon.className = \"fa-solid \".concat(themeIcons[theme] || 'fa-sun', \" fa-xl\");\n            });\n\n            // Close the appearance dropdown after selection\n            _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context6 = document.querySelectorAll('.nav-appearance, .admin-appearance')).call(_context6, function (el) {\n              return el.classList.remove('open');\n            });\n            // Close mobile theme dropdown (Foundation dropdown)\n            mobileDropdown = document.getElementById('mobile-theme-dropdown');\n            if (mobileDropdown && typeof Foundation !== 'undefined') {\n              jquery__WEBPACK_IMPORTED_MODULE_8___default()(mobileDropdown).foundation('close');\n            }\n\n            // Apply theme using theme-manager\n            _context7.next = 17;\n            return _theme_theme_manager__WEBPACK_IMPORTED_MODULE_20__[\"default\"].setTheme(theme, true);\n          case 17:\n          case \"end\":\n            return _context7.stop();\n        }\n      }, _callee);\n    }));\n    return function (_x) {\n      return _ref.apply(this, arguments);\n    };\n  }());\n\n  // Nav appearance selector toggle (main site)\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context8 = document.querySelectorAll('.nav-appearance .appearance-toggle')).call(_context8, function (toggle) {\n    toggle.addEventListener('click', function (e) {\n      e.preventDefault();\n      e.stopPropagation();\n      var container = toggle.closest('.nav-appearance');\n      container.classList.toggle('open');\n    });\n  });\n\n  // Mark nav appearance as ready (prevents flash of incorrectly positioned menu)\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context9 = document.querySelectorAll('.nav-appearance')).call(_context9, function (el) {\n    return el.classList.add('nav-ready');\n  });\n\n  // Close nav appearance selector when clicking outside\n  document.addEventListener('click', function (e) {\n    if (!e.target.closest('.nav-appearance')) {\n      var _context10;\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context10 = document.querySelectorAll('.nav-appearance')).call(_context10, function (el) {\n        return el.classList.remove('open');\n      });\n    }\n    // Also close toolbar theme selector when clicking outside\n    if (!e.target.closest('.toolbar-theme-selector')) {\n      var _context11;\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context11 = document.querySelectorAll('.toolbar-theme-selector')).call(_context11, function (el) {\n        return el.classList.remove('open');\n      });\n    }\n  });\n\n  // Toolbar theme selector toggle (book reader)\n  document.addEventListener('click', function (e) {\n    var toggle = e.target.closest('.toolbar-theme-selector .theme-toggle');\n    if (toggle) {\n      e.preventDefault();\n      e.stopPropagation();\n      var container = toggle.closest('.toolbar-theme-selector');\n      container.classList.toggle('open');\n    }\n  });\n\n  // Title filter form - show spinner on Filter/Reset buttons\n  var titleFilterForm = document.getElementById('title-filter-form');\n  if (titleFilterForm) {\n    // Filter button spinner\n    titleFilterForm.addEventListener('submit', function () {\n      var submitBtn = titleFilterForm.querySelector('input[type=\"submit\"]');\n      if (submitBtn) {\n        submitBtn.disabled = true;\n        submitBtn.style.opacity = '0.7';\n        submitBtn.style.cursor = 'not-allowed';\n        submitBtn.value = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_13__.t)('filtering') || 'Filtering...';\n      }\n    });\n\n    // Reset button spinner\n    var resetBtn = titleFilterForm.querySelector('.clear-button');\n    if (resetBtn) {\n      resetBtn.addEventListener('click', function () {\n        resetBtn.style.opacity = '0.7';\n        resetBtn.style.cursor = 'not-allowed';\n        resetBtn.style.pointerEvents = 'none';\n        resetBtn.textContent = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_13__.t)('resetting') || 'Resetting...';\n      });\n    }\n  }\n\n  // Page number search form - show spinner on Go To button\n  var pageNumberSearchForm = document.getElementById('page-number-search-form');\n  if (pageNumberSearchForm) {\n    pageNumberSearchForm.addEventListener('submit', function () {\n      var submitBtn = pageNumberSearchForm.querySelector('input[type=\"submit\"]');\n      if (submitBtn) {\n        submitBtn.disabled = true;\n        submitBtn.style.opacity = '0.7';\n        submitBtn.style.cursor = 'not-allowed';\n        submitBtn.value = (0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_13__.t)('searching') || 'Searching...';\n      }\n    });\n  }\n  var userPreferences = _utilities_general__WEBPACK_IMPORTED_MODULE_11__.userPreferences();\n  var au = false;\n  if (_babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_3___default()(userPreferences).length > 0) {\n    au = userPreferences.au === 'true';\n  }\n\n  // Pagination items-per-page selector:\n  //  - pass in the collection class, possibly from the items-per-page element (it should\n  //  - know what collection it belongs to)\n  var itemsSelect = document.querySelector('.items-per-page');\n  if (itemsSelect) {\n    itemsSelect.addEventListener('change', function (event) {\n      var target = event.target,\n        id = event.target.id;\n      var targetSelector = \"#\".concat(id);\n      var dataset = target.dataset;\n      var paginatorName = dataset.paginatorName;\n      var options = (0,_account_annotations__WEBPACK_IMPORTED_MODULE_15__.setOptionValues)();\n      options.spinner = {\n        targetSelector: targetSelector,\n        insertPosition: 'beforebegin'\n      };\n\n      // options for updating the collection\n      var hasPins, isEditable;\n      if (paginatorName === 'last-locations') {\n        hasPins = true;\n        isEditable = true;\n      } else {\n        hasPins = false;\n        isEditable = true;\n      }\n\n      // set up options\n      options = (0,_pagination__WEBPACK_IMPORTED_MODULE_14__.setCollectionOptions)(options, paginatorName, hasPins, isEditable);\n      (0,_pagination__WEBPACK_IMPORTED_MODULE_14__.itemsPerPageHandler)(event, options).then(function () {\n        var _options$collection$h;\n        // re-wire pin event handler\n        if ((_options$collection$h = options.collection.hasPins) !== null && _options$collection$h !== void 0 ? _options$collection$h : false) {\n          (0,_account_last_locations__WEBPACK_IMPORTED_MODULE_16__.addPinEventHandlers)();\n        }\n      });\n    });\n  }\n  var updateModal = jquery__WEBPACK_IMPORTED_MODULE_8___default()('#recent-updates');\n  if (updateModal.length >
169 0) {\n    var hideUpdateModal = true; // default to hide\n\n    // fetch their update modal visibility selection\n    if (au) {\n      var _userPreferences$Hide;\n      hideUpdateModal = (_userPreferences$Hide = userPreferences.HideUpdateModal) !== null && _userPreferences$Hide !== void 0 ? _userPreferences$Hide : true;\n    }\n\n    // Display modal\n    if (au && !hideUpdateModal) {\n      updateModal.foundation('open');\n    }\n  }\n\n  // click handler for updates modal 'Dismiss and close' button\n  var hideUpdatesBtn = document.querySelector('#hide-updates');\n  if (hideUpdatesBtn) {\n    hideUpdatesBtn.style.display = 'inline-block';\n    hideUpdatesBtn.addEventListener('click', function (event) {\n      recentUpdatesPopupHandler(updateModal[0].id, 'HideUpdateModal', true, event);\n    });\n  }\n  var updatesBtn = document.querySelector(\"[data-open='quick-tour']\");\n  if (updatesBtn) {\n    var btn = document.querySelector('#hide-tour');\n    updatesBtn.addEventListener('click', _babel_runtime_corejs3_core_js_stable_instance_bind__WEBPACK_IMPORTED_MODULE_4___default()(hideUpdatesPopupButton).call(hideUpdatesPopupButton, btn));\n  }\n  var tourModal = jquery__WEBPACK_IMPORTED_MODULE_8___default()('#quick-tour');\n  var now = new Date();\n  var launchCampaignEnded = now > new Date('July 22, 2022 12:00:00'); // 7/21/22 at noon, one day after launch end\n\n  var tourPopupCookieValue = _utilities_cookies__WEBPACK_IMPORTED_MODULE_10__.getCookie('showQuickTourPopUp');\n  var showPopUp = !launchCampaignEnded && !(tourPopupCookieValue === 'false');\n  // the Quick tour popup is also on the help page\n  var notOnHelpPage = !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_5___default()(_context12 = window.location.pathname).call(_context12, 'help');\n  // the Quick tour popup is also on the account/profile page\n  var notOnProfilePage = !_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_5___default()(_context13 = window.location.pathname).call(_context13, 'account');\n\n  // if the tour modal is on the page and there is no tour cookie set\n  if (tourModal && showPopUp && notOnHelpPage && notOnProfilePage) {\n    tourModal.foundation('open');\n  }\n\n  // click handler for tour video 'do-not-open-by-default' button\n  var hideTourBtn = document.querySelector('#hide-tour');\n  if (hideTourBtn) {\n    hideTourBtn.style.display = 'inline-block';\n    hideTourBtn.addEventListener('click', function (event) {\n      quickTourPopupHandler(event, tourModal);\n    });\n  }\n  var tourBtn = document.querySelector(\"[data-open='quick-tour']\");\n  if (tourBtn) {\n    tourBtn.addEventListener('click', hideDoNotOpenButton);\n  }\n  var lsmSearchOutlineBtn = document.querySelector(\"[data-submit='lsm-outlines']\");\n  if (lsmSearchOutlineBtn) {\n    lsmSearchOutlineBtn.addEventListener('click', function (e) {\n      e.preventDefault();\n      searchOutlinesButton(e);\n    });\n    lsmSearchOutlineBtn.addEventListener('submit', function (e) {\n      e.preventDefault();\n      searchOutlinesButton(e);\n    });\n  }\n\n  /** Discount Available Notice - Remember user selection to not show discount available notice on dashboard **/\n  var discount_notice = document.querySelector('#discount-notice');\n  if (discount_notice) {\n    // add event handler to close button on notice\n    discount_notice.querySelector('.close-button').addEventListener('click', function (event) {\n      saveModalUserSelectionHandler(event, [discount_notice[0].id, 'hideDiscountModal']);\n    });\n  }\n\n  // Clear sessionStorage on Sign-out\n  var signOutBtn = document.querySelector('#sign-out');\n  if (signOutBtn) {\n    signOutBtn.addEventListener('click', function () {\n      sessionStorage.clear();\n    });\n  }\n  jquery__WEBPACK_IMPORTED_MODULE_8___default()('body').prepend(\"<a href=\\\"#\\\" class=\\\"back-to-top\\\"><span class=\\\"show-for-sr\\\">\".concat((0,_utilities_i18n__WEBPACK_IMPORTED_MODULE_13__.t)('back_to_top') || 'Back to Top', \"</span></a>\"));\n  var amountScrolled = 300;\n  jquery__WEBPACK_IMPORTED_MODULE_8___default()(window).scroll(function () {\n    if (jquery__WEBPACK_IMPORTED_MODULE_8___default()(window).scrollTop() > amountScrolled) {\n      jquery__WEBPACK_IMPORTED_MODULE_8___default()('a.back-to-top').fadeIn('slow');\n    } else {\n      jquery__WEBPACK_IMPORTED_MODULE_8___default()('a.back-to-top').fadeOut('slow');\n    }\n  });\n  jquery__WEBPACK_IMPORTED_MODULE_8___default()('a.back-to-top').click(function () {\n    jquery__WEBPACK_IMPORTED_MODULE_8___default()('body, html').animate({\n      scrollTop: 0\n    }, 700);\n    return false;\n  });\n\n  // set session variable after initial sign-in load\n  initializationsOnInitialLogin();\n\n  // Auto-open sign-in dropdown when ?show_signin=1 parameter is present\n  // Used by email links (e.g., password change notifications)\n  autoOpenSignInDropdown();\n});\n\n/**\n * Handle click on password visibility 'eye' button\n */\n_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context14 = document.querySelectorAll(\".toggle-password\")).call(_context14, function (element) {\n  element.addEventListener(\"click\", function () {\n    // Switch on and off\n    element.classList.toggle(\"fa-eye-slash\");\n    element.classList.toggle(\"fa-eye\");\n    var input = this.previousElementSibling;\n    if (input.type === \"password\") {\n      input.type = \"text\";\n    } else {\n      input.type = \"password\";\n    }\n  });\n});\n\n// Defensive guard: shift our eye toggle left when a password-manager\n// extension (KeePassXC observed) injects its own icon into the field (#3496)\n(0,_account_password_toggle_collision_guard__WEBPACK_IMPORTED_MODULE_23__.installPasswordToggleCollisionGuard)(document);\n\n/**\n * Show loading overlay when sign-in form is submitted\n */\nvar signInForm = document.querySelector('form[action*=\"sign-in/post.php\"]');\nif (signInForm) {\n  // Empty-field validation must run before the loading overlay so a blank\n  // username surfaces a styled notice instead of the clipped native bubble (#3463).\n  (0,_account_sign_in_validation__WEBPACK_IMPORTED_MODULE_19__.wireSignInValidation)(signInForm);\n  signInForm.addEventListener('submit', function (e) {\n    // Skip the loading state when validation blocked the submit (#3463).\n    if ((0,_account_sign_in_validation__WEBPACK_IMPORTED_MODULE_19__.getSignInValidationError)(signInForm)) {\n      return;\n    }
169\n    var overlay = document.getElementById('sign-in-loading-overlay');\n    if (overlay) {\n      overlay.classList.add('active');\n    }\n\n    // Disable form inputs to prevent double submission\n    var submitButton = signInForm.querySelector('input[type=\"submit\"]');\n    if (submitButton) {\n      submitButton.disabled = true;\n    }\n  });\n}\n\n// Compensate for sticky nav leaving document flow when it becomes fixed.\n// Using MutationObserver instead of scroll listener eliminates the one-frame\n// lag between Foundation adding \"is-stuck\" and us applying the padding offset.\n// Also watches #reader-menu-wrapper for the windowshade collapse toggle so\n// padding is recalculated when the reader menu is minimized or expanded.\n(function () {\n  var sticky_wrapper = document.getElementById(\"sticky-wrapper\");\n  var content_wrapper = document.getElementById(\"content-wrapper\");\n  if (!sticky_wrapper || !content_wrapper) return;\n  function updatePadding() {\n    if (sticky_wrapper.classList.contains(\"is-stuck\")) {\n      content_wrapper.style.paddingTop = 1 + sticky_wrapper.offsetHeight + \"px\";\n    } else {\n      content_wrapper.style.paddingTop = \"\";\n    }\n  }\n  var observer = new MutationObserver(updatePadding);\n  observer.observe(sticky_wrapper, {\n    attributes: true,\n    attributeFilter: [\"class\"]\n  });\n\n  // Also observe reader-menu-wrapper for windowshade toggle (menu-minimized class).\n  // Re-run updatePadding after the CSS transition completes so offsetHeight is final.\n  var reader_menu = document.getElementById(\"reader-menu-wrapper\");\n  if (reader_menu) {\n    var readerObserver = new MutationObserver(function () {\n      updatePadding();\n      _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_6___default()(updatePadding, 550); // after 0.5s CSS transition\n    });\n    readerObserver.observe(reader_menu, {\n      attributes: true,\n      attributeFilter: [\"class\"]\n    });\n  }\n})();\n\n/**\n * save user option to dismiss a modal, so it doesn't show anymore.\n *\n * If the user closes the notice, it will not be displayed again on the dashboard and neither will\n * the user icon next to the username.\n * We also remove the user icon next to the username.\n */\nfunction saveModalUserSelectionHandler(event, options) {\n  var element = options[0];\n  var selection = options[1];\n  var url, data;\n  if (selection === 'hideDiscountModal') {\n    data = {\n      'hideDiscountNotice': true\n    };\n    url = element.dataset.updateUrl;\n  }\n  if (selection === 'HideUpdateModal') {\n    data = {\n      'HideUpdateModal': true\n    };\n    url = element.dataset.updateUrl;\n  }\n  new _fetch_helpers__WEBPACK_IMPORTED_MODULE_12__[\"default\"]().fetchData('POST', url, data).then(function (result) {\n    if (result.success) {\n      log(result.message);\n      document.querySelector('#user-notification-icon').style.display = 'none';\n    }\n  });\n}\n\n/**\n * Get the difference in days between two dates (javascript Date objects).\n *\n * @param a Date object\n * @param b Date object\n * @returns {number}\n */\nfunction dateDiffInDays(a, b) {\n  var _MS_PER_DAY = 1000 * 60 * 60 * 24;\n\n  // discard the time and time-zone info\n  var utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());\n  var utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());\n  return Math.floor((utc2 - utc1) / _MS_PER_DAY);\n}\n\n/**\n * Handler Recent Updates 'do not show again' button.\n * Keep cookie around when set for a year; we should definitely have at least 1 release every year.\n */\nfunction recentUpdatesPopupHandler(elementId, cookieName, option, event) {\n  event.preventDefault();\n\n  // Remember user selection to not show recent updates notice\n  var modal = document.querySelector(\"#\".concat(elementId));\n  if (modal) {\n    var data = {\n      'HideUpdateModal': true\n    };\n    var url = modal.dataset.updateUrl;\n    new _fetch_helpers__WEBPACK_IMPORTED_MODULE_12__[\"default\"]().fetchData('POST', url, data).then(function (result) {\n      if (result.success) {\
169n        log(\"Updated 'HideUpdateModal' user selection.\");\n      } else {\n        log(\"Could not update 'HideUpdateModal' user selection.\");\n      }\n    });\n  }\n  jquery__WEBPACK_IMPORTED_MODULE_8___default()(\"#\".concat(elementId)).foundation('close');\n}\n\n/**\n * Click handler to hide do-not-open-by-default when popup opened from Quick Tour button and not default open\n * @param btn\n */\nfunction hideUpdatesPopupButton(btn) {\n  btn.style.display = 'none';\n}\n\n/**\n * Handler for quick tour 'do not show again' button.\n */\nfunction quickTourPopupHandler(event, tourModal) {\n  event.preventDefault();\n  var now = new Date();\n  var launchCampaignEnd = new Date('July 22, 2022 12:00:00'); // 7/21/22 at noon, one day after launch end\n  var daysToLive = dateDiffInDays(now, launchCampaignEnd);\n  _utilities_cookies__WEBPACK_IMPORTED_MODULE_10__.setCookie('showQuickTourPopUp', false, daysToLive);\n  tourModal.foundation('close');\n}\n\n/**\n * Click handler to hide do-not-open-by-default when popup opened from Quick Tour button and not default open\n */\nfunction hideDoNotOpenButton() {\n  var btn = document.querySelector('#hide-tour');\n  btn.style.display = 'none';\n}\n\n/**\n * Search LSM outlines form, on help page\n */\nfunction searchOutlinesButton() {\n  var lsmSearchForm = document.getElementById('search_lsm_outlines_form');\n  var lsmSearchInput = document.getElementById('search_lsm_outlines_q').value;\n  if (lsmSearchInput !== '') {\n    lsmSearchForm.action = \"https://www.lsm.org/search.html?#gsc.tab=0&gsc.ref=more%3Aoutlines&gsc.q=\" + lsmSearchInput;\n    lsmSearchForm.submit();\n  }\n}\n\n/**\n * Enable the sign-out button once the user is signed in\n */\nfunction handleEnablingSignInButton() {\n  var userNameElem = document.querySelector('.username');\n  if (userNameElem) {\n    var signOutElem = document.querySelector('#sign-out');\n    if (signOutElem) {\n      signOutElem.removeAttribute('disabled');\n    }\n  }\n}\nfunction initializationsOnInitialLogin() {\n  var userNameElem = document.querySelector('.username');\n  if (userNameElem) {\n    (0,_utilities_cookies__WEBPACK_IMPORTED_MODULE_10__.setCookie)('loginInitialized', 'true');\n  }\n}\n\n/**\n * Auto-open sign-in dropdown when URL contains ?show_signin=1\n * Used by email links (password change notifications, etc.) to direct users to sign in\n */\nfunction autoOpenSignInDropdown() {\n  var urlParams = new (_babel_runtime_corejs3_core_js_stable_url_search_params__WEBPACK_IMPORTED_MODULE_7___default())(window.location.search);\n  if (urlParams.get('show_signin') !== '1') {\n    return;\n  }\n\n  // Find the sign-in button that triggers the dropdown\n  var signInButton = document.querySelector('[data-toggle=\"signin-dropdown\"]');\n  if (!signInButton) {\n    return;\n  }\n\n  // Trigger a click on the button to open the dropdown with proper positioning\n  signInButton.click();\n\n  // Focus the username input after dropdown opens\n  _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_6___default()(function () {\n    var signinDropdown = document.getElementById('signin-dropdown');\n    if (signinDropdown) {\n      var usernameInput = signinDropdown.querySelector('input[name=\"username\"]');\n      if (usernameInput) {\n        usernameInput.focus();\n      }\n    }\n  }, 100);\n\n  // Clean up URL parameter (removes ?show_signin=1 from address bar)\n  if (window.history && window.history.replaceState) {\n    var cleanUrl = window.location.pathname + window.location.hash;\n    window.history.replaceState({}, document.title, cleanUrl);\n  }\n}\n\n/** check footer.php for other JS used... **///# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYXBwLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0F
169BRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvYXBwLmpzPzZkNDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCAnd2hhdC1pbnB1dCc7XG5cbi8vIGZvciBiYWJlbCAvIFByb21pc2VzIHVzZTogcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvaXNzdWVzLzk4NTNcbi8vIHNlZSB0aGUgZm9sbG93aW5nIGZvciBvdGhlciBvcHRpb25zOiBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9ibG9iL21hc3Rlci9kb2NzLzIwMTktMDMtMTktY29yZS1qcy0zLWJhYmVsLWFuZC1hLWxvb2staW50by10aGUtZnV0dXJlLm1kXG5pbXBvcnQgJ2NvcmUtanMtcHVyZS9zdGFibGUvcHJvbWlzZSc7XG5pbXBvcnQgKiBhcyBjb29raWVzIGZyb20gXCIuL3V0aWxpdGllcy9jb29raWVzXCI7XG5pbXBvcnQgKiBhcyB1IGZyb20gXCIuL3V0aWxpdGllcy9nZW5lcmFsXCI7XG5pbXBvcnQgRmV0Y2hIZWxwZXJzIGZyb20gXCIuL2ZldGNoLWhlbHBlcnNcIjtcbmltcG9ydCB7dH0gZnJvbSBcIi4vdXRpbGl0aWVzL2kxOG5cIjtcbmltcG9ydCB7aXRlbXNQZXJQYWdlSGFuZGxlciwgc2V0Q29sbGVjdGlvbk9wdGlvbnN9IGZyb20gXCIuL3BhZ2luYX
169Rpb25cIjtcbmltcG9ydCB7c2V0T3B0aW9uVmFsdWVzfSBmcm9tIFwiLi9hY2NvdW50L2Fubm90YXRpb25zXCI7XG5pbXBvcnQge2FkZFBpbkV2ZW50SGFuZGxlcnN9IGZyb20gXCIuL2FjY291bnQvbGFzdC1sb2NhdGlvbnNcIjtcbmltcG9ydCB7Z2V0Q3VycmVudEZvbnRTaXplT25DbGllbnQsIHN0b3JlRm9udFNpemVUb1N0b3JhZ2VzfSBmcm9tIFwiLi9mb250LXNpemVcIjtcbmltcG9ydCB7Z2V0Q29va2llLCBzZXRDb29raWV9IGZyb20gXCIuL3V0aWxpdGllcy9jb29raWVzXCI7XG5pbXBvcnQge2luaXRGbG9hdGluZ05vdGljZXMsIHJlbW92ZU5vdGljZXN9IGZyb20gXCIuL25vdGljZXMvZnVuY3Rpb25zXCI7XG5pbXBvcnQge2dldFNpZ25JblZhbGlkYXRpb25FcnJvciwgd2lyZVNpZ25JblZhbGlkYXRpb259IGZyb20gXCIuL2FjY291bnQvc2lnbi1pbi12YWxpZGF0aW9uXCI7XG5pbXBvcnQgdGhlbWVNYW5hZ2VyIGZyb20gJy4vdGhlbWUvdGhlbWUtbWFuYWdlcic7XG5pbXBvcnQgeyByZWdpc3RlckJmY2FjaGVSZWxvYWQgfSBmcm9tICcuL3V0aWxpdGllcy9iZmNhY2hlLXJlbG9hZCc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuL3V0aWxpdGllcy9kZWJ1Zyc7XG5pbXBvcnQgeyBpbnN0YWxsUGFzc3dvcmRUb2dnbGVDb2xsaXNpb25HdWFyZCB9IGZyb20gJy4vYWNjb3VudC9wYXNzd29yZC10b2dnbGUtY29sbGlzaW9uLWd1YXJkJztcbmNvbnN0IHsgbG9nIH0gPSBjcmVhdGVMb2dnZXIoJ2FwcCcpO1xuXG4vLyBSZWxvYWQgYmZjYWNoZS1yZXN0b3JlZCBwYWdlcyBzbyB0aGV5IHJldmFsaWRhdGUgYWdhaW5zdCB0aGUgbGl2ZSBzZXNzaW9uLFxuLy8gcHJldmVudGluZyBhIHN0YWxlIGF1dGhlbnRpY2F0ZWQgKGRhcmsgdGhlbWUgLyBcIlNpZ24gT3V0XCIpIHZpZXcgZm9yIHNpZ25lZC1vdXRcbi8vIHVzZXJzIG9uIGJhY2svZm9yd2FyZCBuYXZpZ2F0aW9uLiBTZWUgdXRpbGl0aWVzL2JmY2FjaGUtcmVsb2FkLmpzICgjMzMzNykuXG5yZWdpc3RlckJmY2FjaGVSZWxvYWQoKTtcblxuLy8gRm91bmRhdGlvbiBKUyByZWxpZXMgb24gYSBnbG9iYWwgdmFyaWFibGUuIEluIEVTNiwgYWxsIGltcG9ydHMgYXJlIGhvaXN0ZWRcbi8vIHRvIHRoZSB0b3Agb2YgdGhlIGZpbGUgc28gaWYgd2UgdXNlZGBpbXBvcnRgIHRvIGltcG9ydCBGb3VuZGF0aW9uLFxuLy8gaXQgd291bGQgZXhlY3V0ZSBlYXJsaWVyIHR
169oYW4gd2UgaGF2ZSBhc3NpZ25lZCB0aGUgZ2xvYmFsIHZhcmlhYmxlLlxuLy8gVGhpcyBpcyB3aHkgd2UgaGF2ZSB0byB1c2UgQ29tbW9uSlMgcmVxdWlyZSgpIGhlcmUgc2luY2UgaXQgZG9lc24ndFxuLy8gaGF2ZSB0aGUgaG9pc3RpbmcgYmVoYXZpb3IuXG5cbndpbmRvdy5qUXVlcnkgPSAkO1xucmVxdWlyZSgnZm91bmRhdGlvbi1zaXRlcycpO1xuXG4vLyBJbml0aWFsaXNlIGFsbCBmb3VuZGF0aW9uIHBsdWdpbnMgd2l0aGluIHRoZSBtYWluLW5hdlxuLy8kKCcjbWFpbi1uYXYnKS5mb3VuZGF0aW9uKCk7XG5cbi8vIEZvdW5kYXRpb24gcGx1Z2lucyBtdXN0IGJlIGluaXRpYWxpc2VkIGFmdGVyIERPTSBpcyBkb25lIGxvYWRpbmdcbiQoZG9jdW1lbnQpLmZvdW5kYXRpb24oKTtcblxuLy8gRm91bmRhdGlvbiBub3cgbG9hZGVkIGluLCBsZXQgaG92ZXIgYXBwZWFyYW5jZSB3b3JrIG9uIHRoZSBtZW51IGFnYWluXG5sZXQgbWFpbk5hdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtYWluLW5hdicpO1xuaWYgKG1haW5OYXYpIHtcbiAgbWFpbk5hdi5jbGFzc0xpc3QucmVtb3ZlKCdmb3VuZGF0aW9uLWxvYWRpbmcnKTtcbn1cblxuLyoqXG4gKiBSdW4gYWxsIG5lY2Vzc2FyeSBKUyBhZnRlciBwYWdlIGxvYWRzXG4gKi9cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gIC8vIEhhbmRsZXIgdG8gcmVtb3ZlIG5vdGljZXNcbiAgcmVtb3ZlTm90aWNlcygpO1xuXG4gIC8vIFBpbiB0aGUgc2VydmVyLXJlbmRlcmVkIGZsYXNoICgjbm90aWNlcy1tYWluKSBiZWxvdyB0aGUgc3RpY2t5IG5hdi4gVGhlIHBvc2l0aW9uaW5nXG4gIC8vIHVzZWQgdG8gbGl2ZSBvbmx5IGluIHRoZSBub3RpY2VzL21haW4uanMgYnVuZGxlLCB3aGljaCBubyBwYWdlIGxvYWRzIOKAlCBzbyBzZXJ2ZXJcbiAgLy8gZmxhc2hlcyBzYXQgaGlkZGVuIGF0IHRvcDowIGJlaGluZCB0aGUgbWFzdGhlYWQgKCMzNDc3KS5cbiAgaW5pdEZsb2F0aW5nTm90aWNlcygpO1xuXG4gIC8vIGlmIHdlIHNpZ25lZCBpbiBhdXRvbWF0aWNhbGx5LCBlbmFibGUgdGhlIFNpZ24tb3V0IGJ1dHRvblxuICBoYW5kbGVFbmFibGluZ1NpZ25JbkJ1dHRvbigpO1xuXG4gIC8vIEFwcGVhcmFuY2Ugc2VsZWN0b3IgLSB1c2UgZXZlbnQgZGVsZWdhdGlvbiBzbyBpdCB3b3JrcyBldmVuIGlmIEZvdW5kYXRpb24gbW92ZXMgZWxlbWVudHNcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZSkgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5hcHBlYXJhbmNlLWJ0bicpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgLy8gUHJldmVudCBkcm9wZG93biBmcm9tIGNsb3NpbmdcblxuICAgIGNvbnN0IHRoZW1lID0gYnRuLmRhdGFzZXQudGhlbWU7XG5cbiAgICAvLyBVcGRhdGUgYWN0aXZlIHN0YXRlIG9uIGFsbCBhcHBlYXJhbmNlIGJ1dHRvbnNcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXBwZWFyYW5jZS1idG4nKS5mb3JFYWNoKGIgPT4gYi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLmFwcGVhcmFuY2UtYnRuW2RhdGEtdGhlbWU9XCIke3RoZW1lfVwiXWApLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpKTtcblxuICAgIC8vIFVwZGF0ZSB0b2dnbGUgaWNvbiBpbiBuYXYvYWRtaW4gYXBwZWFyYW5jZSBzZWxlY3RvcnMgYW5kIG1vYmlsZSBoZWFkZXJcbiAgICBjb25zdCB0aGVtZUljb25zID0ge1xuICAgICAgbGlnaHQ6ICdmYS1zdW4nLFxuICAgICAgZGFyazogJ2ZhLW1vb24nLFxuICAgICAgc2VwaWE6ICdmYS1zY3JvbGwnLFxuICAgICAgZ3JlZW46ICdmYS1sZWFmJyxcbiAgICAgIGF1dG86ICdmYS1jaXJjbGUtaGFsZi1zdHJva2UnXG4gICAgfTtcbiAgICAvLyBEZXNrdG9wIG5hdiBhbmQgYWRtaW4gYXBwZWFyYW5jZSB0b2dnbGVzXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5hdi1hcHBlYXJhbmNlIC5hcHBlYXJhbmNlLXRvZ2dsZSBpOmZpcnN0LWNoaWxkLCAuYWRtaW4tYXBwZWFyYW5jZSAuYXBwZWFyYW5jZS10b2dnbGUgaTpmaXJzdC1jaGlsZCcpLmZvckVhY2goaWNvbiA9PiB7XG4gICAgICBpY29uLmNsYXNzTmFtZSA9IGBmYS1zb2xpZCAke3RoZW1lSWNvbnNbdGhlbWVdIHx8ICdmYS1zdW4nfWA7XG4gICAgfSk7XG4gICAgLy8gTW9iaWxlIGhlYWRlciB0aGVtZSBidXR0b24gaWNvblxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGVtZS1idXR0b24gPiBhID4gaScpLmZvckVhY2goaWNvbiA9PiB7XG4gICAgICBpY29uLmNsYXNzTmFtZSA9IGBmYS1zb2xpZCAke3RoZW1lSWNvbnNbdGhlbWVdIHx8ICdmYS1zdW4nfWA7XG4gICAgfSk7XG4gICAgLy8gUmVhZGVyIHRvb2xiYXIgdGhlbWUgdG9nZ2xlIGljb25cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG9vbGJhci10aGVtZS1zZWxlY3RvciAudGhlbWUtdG9nZ2xlIGknKS5mb3JFYWNoKGljb24gPT4ge1xuICAgICAgaWNvbi5jbGFzc05hbWUgPSBgZmEtc29saWQgJHt0aGVtZUljb25zW3RoZW1lXSB8fCAnZmEtc3VuJ30gZmEteGxgO1xuICAgIH0pO1xuXG4gICAgLy8gQ2xvc2UgdGhlIGFwcGVhcmFuY2UgZHJvcGRvd24gYWZ0ZXIgc2VsZWN0aW9uXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5hdi1hcHBlYXJhbmNlLCAuYWRtaW4tYXBwZWFyYW5jZScpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpKTtcbiAgICAvLyBDbG9zZSBtb2JpbGUgdGhlbWUgZHJvcGRvd24gKEZvdW5kYXRpb24gZHJvcGRvd24pXG4gICAgY29uc3QgbW9iaWxlRHJvcGRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9iaWxlLXRoZW1lLWRyb3Bkb3duJyk7XG4gICAgaWYgKG1vYmlsZURyb3Bkb3duICYmIHR5cGVvZiBGb3VuZGF0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgJChtb2JpbGVEcm9wZG93bikuZm91bmRhdGlvbignY2xvc2UnKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSB0aGVtZSB1c2luZyB0aGVtZS1tYW5hZ2VyXG4gICAgYXdhaXQgdGhlbWVNYW5hZ2VyLnNldFRoZW1lKHRoZW1lLCB0cnVlKTtcbiAgfSk7XG5cbiAgLy8gTmF2IGFwcGVhcmFuY2Ugc2VsZWN0b3IgdG9nZ2xlIChtYWluIHNpdGUpXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYXYtYXBwZWFyYW5jZSAuYXBwZWFyYW5jZS10b2dnbGUnKS5mb3JFYWNoKHRvZ2dsZSA9PiB7XG4gICAgdG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSB0b2dnbGUuY2xvc2VzdCgnLm5hdi1hcHBlYXJhbmNlJyk7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnb3BlbicpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBNYXJrIG5hdiBhcHBlYXJhbmNlIGFzIHJlYWR5IChwcmV2ZW50cyBmbGFzaCBvZiBpbmNvcnJlY3RseSBwb3NpdGlvbmVkIG1lbnUpXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYXYtYXBwZWFyYW5jZScpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LmFkZCgnbmF2LXJlYWR5JykpO1xuXG4gIC8vIENsb3NlIG5hdiBhcHBlYXJhbmNlIHNlbGVjdG9yIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKCFlLnRhcmdldC5jbG9zZXN0KCcubmF2LWFwcGVhcmFuY2UnKSkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5hdi1hcHBlYXJhbmNlJykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJykpO1xuICAgIH1cbiAgICAvLyBBbHNvIGNsb3NlIHRvb2xiYXIgdGhlbWUgc2VsZWN0b3Igd2hlbiBjbGlja2luZyBvdXRzaWRlXG4gICAgaWYgKCFlLnRhcmdldC5jbG9zZXN0KCcudG9vbGJhci10aGVtZS1zZWxlY3RvcicpKSB7XG4gICAgICBkb2
169N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG9vbGJhci10aGVtZS1zZWxlY3RvcicpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRvb2xiYXIgdGhlbWUgc2VsZWN0b3IgdG9nZ2xlIChib29rIHJlYWRlcilcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IHRvZ2dsZSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy50b29sYmFyLXRoZW1lLXNlbGVjdG9yIC50aGVtZS10b2dnbGUnKTtcbiAgICBpZiAodG9nZ2xlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdG9nZ2xlLmNsb3Nlc3QoJy50b29sYmFyLXRoZW1lLXNlbGVjdG9yJyk7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnb3BlbicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVGl0bGUgZmlsdGVyIGZvcm0gLSBzaG93IHNwaW5uZXIgb24gRmlsdGVyL1Jlc2V0IGJ1dHRvbnNcbiAgY29uc3QgdGl0bGVGaWx0ZXJGb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpdGxlLWZpbHRlci1mb3JtJyk7XG4gIGlmICh0aXRsZUZpbHRlckZvcm0pIHtcbiAgICAvLyBGaWx0ZXIgYnV0dG9uIHNwaW5uZXJcbiAgICB0aXRsZUZpbHRlckZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBzdWJtaXRCdG4gPSB0aXRsZUZpbHRlckZvcm0ucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpO1xuICAgICAgaWYgKHN1Ym1pdEJ0bikge1xuICAgICAgICBzdWJtaXRCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBzdWJtaXRCdG4uc3R5bGUub3BhY2l0eSA9ICcwLjcnO1xuICAgICAgICBzdWJtaXRCdG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgICAgc3VibWl0QnRuLnZhbHVlID0gdCgnZmlsdGVyaW5nJykgfHwgJ0ZpbHRlcmluZy4uLic7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBSZXNldCBidXR0b24gc3Bpbm5lclxuICAgIGNvbnN0IHJlc2V0QnRuID0gdGl0bGVGaWx0ZXJGb3JtLnF1ZXJ5U2VsZWN0b3IoJy5jbGVhci1idXR0b24nKTtcbiAgICBpZiAocmVzZXRCdG4pIHtcbiAgICAgIHJlc2V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc2V0QnRuLnN0eWxlLm9wYWNpdHkgPSAnMC43JztcbiAgICAgICAgcmVzZXRCdG4uc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgICAgcmVzZXRCdG4uc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgcmVzZXRCdG4udGV4dENvbnRlbnQgPSB0KCdyZXNldHRpbmcnKSB8fCAnUmVzZXR0aW5nLi4uJztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhZ2UgbnVtYmVyIHNlYXJjaCBmb3JtIC0gc2hvdyBzcGlubmVyIG9uIEdvIFRvIGJ1dHRvblxuICBjb25zdCBwYWdlTnVtYmVyU2VhcmNoRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLW51bWJlci1zZWFyY2gtZm9ybScpO1xuICBpZiAocGFnZU51bWJlclNlYXJjaEZvcm0pIHtcbiAgICBwYWdlTnVtYmVyU2VhcmNoRm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHN1Ym1pdEJ0biA9IHBhZ2VOdW1iZXJTZWFyY2hGb3JtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0nKTtcbiAgICAgIGlmIChzdWJtaXRCdG4pIHtcbiAgICAgICAgc3VibWl0QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgc3VibWl0QnRuLnN0eWxlLm9wYWNpdHkgPSAnMC43JztcbiAgICAgICAgc3VibWl0QnRuLnN0eWxlLmN1cnNvciA9ICdub3QtYWxsb3dlZCc7XG4gICAgICAgIHN1Ym1pdEJ0bi52YWx1ZSA9IHQoJ3NlYXJjaGluZycpIHx8ICdTZWFyY2hpbmcuLi4nO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgdXNlclByZWZlcmVuY2VzID0gdS51c2VyUHJlZmVyZW5jZXMoKTtcbiAgbGV0IGF1ID0gZmFsc2U7XG4gIGlmIChPYmplY3Qua2V5cyh1c2VyUHJlZmVyZW5jZXMpLmxlbmd0aCA+IDApIHtcbiAgICBhdSA9IHVzZXJQcmVmZXJlbmNlcy5hdSA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLy8gUGFnaW5hdGlvbiBpdGVtcy1wZXItcGFn
169ZSBzZWxlY3RvcjpcbiAgLy8gIC0gcGFzcyBpbiB0aGUgY29sbGVjdGlvbiBjbGFzcywgcG9zc2libHkgZnJvbSB0aGUgaXRlbXMtcGVyLXBhZ2UgZWxlbWVudCAoaXQgc2hvdWxkXG4gIC8vICAtIGtub3cgd2hhdCBjb2xsZWN0aW9uIGl0IGJlbG9uZ3MgdG8pXG4gIGNvbnN0IGl0ZW1zU2VsZWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLml0ZW1zLXBlci1wYWdlJyk7XG4gIGlmKGl0ZW1zU2VsZWN0KSB7XG4gICAgaXRlbXNTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICBsZXQgeyB0YXJnZXQsIHRhcmdldDogeyBpZCB9IH0gPSBldmVudDtcbiAgICAgIGxldCB0YXJnZXRTZWxlY3RvciA9IGAjJHtpZH1gO1xuICAgICAgbGV0IHsgZGF0YXNldCB9ID0gdGFyZ2V0O1xuICAgICAgY29uc3QgcGFnaW5hdG9yTmFtZSA9IGRhdGFzZXQucGFnaW5hdG9yTmFtZTtcblxuICAgICAgbGV0IG9wdGlvbnMgPSBzZXRPcHRpb25WYWx1ZXMoKTtcbiAgICAgIG9wdGlvbnMuc3Bpbm5lciA9IHtcbiAgICAgICAgdGFyZ2V0U2VsZWN0b3IsXG4gICAgICAgIGluc2VydFBvc2l0aW9uOiAnYmVmb3JlYmVnaW4nLFxuICAgICAgfVxuXG4gICAgICAvLyBvcHRpb25zIGZvciB1cGRhdGluZyB0aGUgY29sbGVjdGlvblxuICAgICAgbGV0IGhhc1BpbnMsIGlzRWRpdGFibGU7XG5cbiAgICAgIGlmKHBhZ2luYXRvck5hbWUgPT09ICdsYXN0LWxvY2F0aW9ucycpIHtcbiAgICAgICAgaGFzUGlucyA9IHRydWU7XG4gICAgICAgIGlzRWRpdGFibGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzUGlucyA9IGZhbHNlO1xuICAgICAgICBpc0VkaXRhYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHVwIG9wdGlvbnNcbiAgICAgIG9wdGlvbnMgPSBzZXRDb2xsZWN0aW9uT3B0aW9ucyhvcHRpb25zLCBwYWdpbmF0b3JOYW1lLCBoYXNQaW5zLCBpc0VkaXRhYmxlKTtcbiAgICAgIGl0ZW1zUGVyUGFnZUhhbmRsZXIoZXZlbnQsIG9wdGlvbnMpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyByZS13aXJlIHBpbiBldmVudCBoYW5kbGVyXG4gICAgICAgICAgaWYgKG9wdGlvbnMuY29sbGVjdGlvbi5oYXNQaW5zID8/IGZhbHNlKSB7XG4gICAgICAgICAgICBhZGRQaW5FdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgdXBkYXRlTW9kYWwgPSAkKCcjcmVjZW50LXVwZGF0ZXMnKTtcbiAgaWYodXBkYXRlTW9kYWwubGVuZ3RoID4gMCkge1xuICAgIGxldCBoaWRlVXBkYXRlTW9kYWwgPSB0cnVlOyAvLyBkZWZhdWx0IHRvIGhpZGVcblxuICAgIC8vIGZldGNoIHRoZWlyIHVwZGF0ZSBtb2RhbCB2aXNpYmlsaXR5IHNlbGVjdGlvblxuICAgIGlmIChhdSkge1xuICAgICAgaGlkZVVwZGF0ZU1vZGFsID0gdXNlclByZWZlcmVuY2VzLkhpZGVVcGRhdGVNb2RhbCA/PyB0cnVlO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXkgbW9kYWxcbiAgICBpZiAoYXUgJiYgIWhpZGVVcGRhdGVNb2RhbCkge1xuICAgICAgdXBkYXRlTW9kYWwuZm91bmRhdGlvbignb3BlbicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNsaWNrIGhhbmRsZXIgZm9yIHVwZGF0ZXMgbW9kYWwgJ0Rpc21pc3MgYW5kIGNsb3NlJyBidXR0b25cbiAgbGV0IGhpZGVVcGRhdGVzQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2hpZGUtdXBkYXRlcycpO1xuICBpZihoaWRlVXBkYXRlc0J0bikge1xuICAgIGhpZGVVcGRhdGVzQnRuLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgICBoaWRlVXBkYXRlc0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgcmVjZW50VXBkYXRlc1BvcHVwSGFuZGxlcih1cGRhdGVNb2RhbFswXS5pZCwgJ0hpZGVVcGRhdGVNb2RhbCcsIHRydWUsIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIGxldCB1cGRhdGVzQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLW9wZW49J3F1aWNrLXRvdXInXVwiKTtcbiAgaWYodXBkYXRlc0J0bikge1xuICAgIGxldCBidG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaGlkZS10b3VyJyk7XG4gICAgdXBkYXRlc0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVVcGRhdGVzUG9wdXBCdXR0b24uYmluZChidG4pKTtcbiAgfVxuXG4gIGNvbnN0IHRvdXJNb2RhbCA9ICQoJyNxdWljay10b3VyJyk7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGxhdW5jaENhbXBhaWduRW5kZWQgPSBub3cgPiBuZXcgRGF0ZSgnSnVseSAyMiwgMjAyMiAxMjowMDowMCcpOyAvLyA3LzIxLzIyIGF0IG5vb24sIG9uZSBkYXkgYWZ0ZXIgbGF1bmNoIGVuZFxuXG4gIGNvbnN0IHRvdXJQb3B1cENvb2tpZVZhbHVlID0gY29va2llcy5nZXRDb29raWUoJ3Nob3dRdWlja1RvdXJQb3BVcCcpO1xuICBjb25zdCBzaG93UG9wVXAgPSAhbGF1bmNoQ2FtcGFpZ25FbmRlZCAmJiAhKHRvdXJQb3B1cENvb2tpZVZhbHVlID09PSAnZmFsc2UnKTtcbiAgLy8gdGhlIFF1aWNrIHRvdXIgcG9wdXAgaXMgYWxzbyBvbiB0aGUgaGVscCBwYWdlXG4gIGNvbnN0IG5vdE9uSGVscFBhZ2UgPSAhd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLmluY2x1ZGVzKCdoZWxwJyk7XG4gIC8vIHRoZSBRdWljayB0b3VyIHBvcHVwIGlzIGFsc28gb24gdGhlIGFjY291bnQvcHJvZmlsZSBwYWdlXG4gIGNvbnN0IG5vdE9uUHJvZmlsZVBhZ2UgPSAhd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLmluY2x1ZGVzKCdhY2NvdW50JylcblxuICAvLyBpZiB0aGUgdG91ciBtb2RhbCBpcyBvbiB0aGUgcGFnZSBhbmQgdGhlcmUgaXMgbm8gdG91ciBjb29raWUgc2V0XG4gIGlmKHRvdXJNb2RhbCAmJiBzaG93UG9wVXAgJiYgbm90T25IZWxwUGFnZSAmJiBub3RPblByb2ZpbGVQYWdlKSB7XG4gICAgdG91ck1vZGFsLmZvdW5kYXRpb24oJ29wZW4nKTtcbiAgfVxuXG4gIC8vIGNsaWNrIGhhbmRsZXIgZm9yIHRvdXIgdmlkZW8gJ2RvLW5vdC1vcGVuLWJ5LWRlZmF1bHQnIGJ1dHRvblxuICBsZXQgaGlkZVRvdXJCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaGlkZS10b3VyJyk7XG4gIGlmKGhpZGVUb3VyQnRuKSB7XG4gICAgaGlkZVRvdXJCdG4uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuICAgIGhpZGVUb3VyQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICBxdWlja1RvdXJQb3B1cEhhbmRsZXIoZXZlbnQsIHRvdXJNb2RhbCk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB0b3VyQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLW9wZW49J3F1aWNrLXRvdXInXVwiKTtcbiAgaWYodG91ckJ0bikge1xuICAgIHRvdXJCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlRG9Ob3RPcGVuQnV0dG9uKTtcbiAgfVxuXG4gIGNvbnN0IGxzbVNlYXJjaE91dGxpbmVCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtc3VibWl0PSdsc20tb3V0bGluZXMnXVwiKTtcbiAgaWYobHNtU2VhcmNoT3V0bGluZUJ0bikge1xuICAgIGxzbVNlYXJjaE91dGxpbmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2VhcmNoT3V0bGluZXNCdXR0b24oZSk7XG4gICAgfSk7XG4gICAgbHNtU2VhcmNoT3V0bGluZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2VhcmNoT3V0bGluZXNCdXR0b24oZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogRGlzY291bnQgQXZhaWxhYmxlIE5vdGljZSAtIFJlbWVtYmVyIHVzZXIgc2VsZWN0aW9uIHRvIG5vdCBzaG93IGRpc2NvdW50IGF2YWlsYWJsZSBub3RpY2Ugb24gZGFzaGJvYXJkICoqL1xuICBjb25zdCBkaXNjb3VudF9ub3RpY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGlzY291bnQtbm90aWNlJyk7XG4gIGlmKGRpc2NvdW50X25vdGljZSkge1xuICAgIC8vIGFkZCBldmVudCBoYW5kbGVyIHRvIGNsb3NlIGJ1dHRvbiBvbiBub3RpY2VcbiAgICBkaXNjb3VudF9ub3RpY2VcbiAgICAgIC5xdWVyeVNlbGVjdG9yKCcuY2xvc2UtYnV0dG9uJylcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICBzYXZlTW9kYWxVc2VyU2VsZWN0aW9uSGFuZGxlcihldmVudCwgW2Rpc2NvdW50X25vdGljZVswXS5pZCwgJ2hpZGVEaXNjb3VudE1vZGFsJ10pO1xuICAgICAgfSlcbiAgfVxuXG4gIC8vIENsZWFyIHNlc3Npb25TdG9yYWdlIG9uIFNpZ24tb3V0XG4gIGNvbnN0IHNpZ25PdXRCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2lnbi1vdXQnKTtcbiAgaWYoc2lnbk91dEJ0bikge1xuICAgIHNpZ25PdXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHNlc3Npb25TdG9yYWdlLmNsZWFyKCkgfSlcbiAgfVxuXG4gICQoJ2JvZHknKS5wcmVwZW5kKGA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYmFjay10by10b3BcIj48c3BhbiBjbGFzcz1cInNob3ctZm9yLXNyXCI+JHt0KCdiYWNrX3RvX3RvcCcpIHx8ICdCYWNrIHRvIFRvcCd9PC9zcGFuPjwvYT5gKTtcbiAgY29uc3QgYW1vdW50U2Nyb2xsZWQgPSAzMDA7XG4gICQod2luZG93KS5zY3JvbGwoZnVuY3Rpb24oKVxuICB7XHRpZiAoICQod2luZG93KS5zY3JvbGxUb3AoKSA+IGFtb3VudFNjcm9sbGVkIClcbiAgeyQoJ2EuYmFjay10by10b3AnKS5mYWRlSW4oJ3Nsb3cnKTt9XG4gIGVsc2VcbiAgeyQoJ2EuYmFjay10by10b3AnKS5mYWRlT3V0KCdzbG93Jyk7fVxuICB9KTtcbiAgJCgnYS5iYWNrLXRvLXRvcCcpLmNsaWNrKGZ1bmN0aW9uKCkge1xuICAgICQoJ2JvZHksIGh0bWwnKS5hbmltYXRlKHtzY3JvbGxUb3A6IDB9LCA3MDApO1xuICAgIHJldHVybi
169BmYWxzZTtcbiAgfSk7XG5cbiAgLy8gc2V0IHNlc3Npb24gdmFyaWFibGUgYWZ0ZXIgaW5pdGlhbCBzaWduLWluIGxvYWRcbiAgaW5pdGlhbGl6YXRpb25zT25Jbml0aWFsTG9naW4oKTtcblxuICAvLyBBdXRvLW9wZW4gc2lnbi1pbiBkcm9wZG93biB3aGVuID9zaG93X3NpZ25pbj0xIHBhcmFtZXRlciBpcyBwcmVzZW50XG4gIC8vIFVzZWQgYnkgZW1haWwgbGlua3MgKGUuZy4sIHBhc3N3b3JkIGNoYW5nZSBub3RpZmljYXRpb25zKVxuICBhdXRvT3BlblNpZ25JbkRyb3Bkb3duKCk7XG59KTtcblxuLyoqXG4gKiBIYW5kbGUgY2xpY2sgb24gcGFzc3dvcmQgdmlzaWJpbGl0eSAnZXllJyBidXR0b25cbiAqL1xuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi50b2dnbGUtcGFzc3dvcmRcIikuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKCkge1xuICAgIC8vIFN3aXRjaCBvbiBhbmQgb2ZmXG4gICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKFwiZmEtZXllLXNsYXNoXCIpO1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShcImZhLWV5ZVwiKTtcblxuICAgIGxldCBpbnB1dCA9IHRoaXMucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICBpZiAoaW5wdXQudHlwZSA9PT0gXCJwYXNzd29yZFwiKSB7XG4gICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0LnR5cGUgPSBcInBhc3N3b3JkXCI7XG4gICAgfVxuICB9KVxufSk7XG5cbi8vIERlZmVuc2l2ZSBndWFyZDogc2hpZnQgb3VyIGV5ZSB0b2dnbGUgbGVmdCB3aGVuIGEgcGFzc3dvcmQtbWFuYWdlclxuLy8gZXh0ZW5zaW9uIChLZWVQYXNzWEMgb2JzZXJ2ZWQpIGluamVjdHMgaXRzIG93biBpY29uIGludG8gdGhlIGZpZWxkICgjMzQ5Nilcbmluc3RhbGxQYXNzd29yZFRvZ2dsZUNvbGxpc2lvbkd1YXJkKGRvY3VtZW50KTtcblxuLyoqXG4gKiBTaG93IGxvYWRpbmcgb3ZlcmxheSB3aGVuIHNpZ24taW4gZm9ybSBpcyBzdWJtaXR0ZWRcbiAqL1xuY29uc3Qgc2lnbkluRm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm1bYWN0aW9uKj1cInNpZ24taW4vcG9zdC5waHBcIl0nKTtcbmlmIChzaWduSW5Gb3JtKSB7XG4gIC8vIEVtcHR5LWZpZWxkIHZhbGlkYXRpb24gbXVzdCBydW4gYmVmb3JlIHRoZSBsb2FkaW5nIG92ZXJsYXkgc28gYSBibGFua1xuICAvLyB1c2VybmFtZSBzdXJmYWNlcyBhIHN0eWxlZCBub3RpY2UgaW5zdGVhZCBvZiB0aGUgY2xpcHBlZCBuYXRpdmUgYnViYmxlICgjMzQ2MykuXG4gIHdpcmVTaWduSW5WYWxpZGF0aW9uKHNpZ25JbkZvcm0pO1xuXG4gIHNpZ25JbkZvcm0uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgZnVuY3Rpb24oZSkge1xuICAgIC8vIFNraXAgdGhlIGxvYWRpbmcgc3RhdGUgd2hlbiB2YWxpZGF0aW9uIGJsb2NrZWQgdGhlIHN1Ym1pdCAoIzM0NjMpLlxuICAgIGlmIChnZXRTaWduSW5WYWxpZGF0aW9uRXJyb3Ioc2lnbkluRm9ybSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZ24taW4tbG9hZGluZy1vdmVybGF5Jyk7XG4gICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBmb3JtIGlucHV0cyB0byBwcmV2ZW50IGRvdWJsZSBzdWJtaXNzaW9uXG4gICAgY29uc3Qgc3VibWl0QnV0dG9uID0gc2lnbkluRm9ybS5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwic3VibWl0XCJdJyk7XG4gICAgaWYgKHN1Ym1pdEJ1dHRvbikge1xuICAgICAgc3VibWl0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBDb21wZW5zYXRlIGZvciBzdGlja3kgbmF2IGxlYXZpbmcgZG9jdW1lbnQgZmxvdyB3aGVuIGl0IGJlY29tZXMgZml4ZWQuXG4vLyBVc2luZyBNdXRhdGlvbk9ic2VydmVyIGluc3RlYWQgb2Ygc2Nyb2xsIGxpc3RlbmVyIGVsaW1pbmF0ZXMgdGhlIG9uZS1mcmFtZVxuLy8gbGFnIGJldHdlZW4gRm91bmRhdGlvbiBhZGRpbmcgXCJpcy1zdHVja1wiIGFuZCB1cyBhcHBseWluZyB0aGUgcGFkZGluZyBvZmZzZXQuXG4vLyBBbHNvIHdhdGNoZXMgI3JlYWRlci1tZW51LXdyYXBwZXIgZm9yIHRoZSB3aW5kb3dzaGFkZSBjb2xsYXBzZSB0b2dnbGUgc29cbi8vIHBhZGRpbmcgaXMgcmVjYWxjdWxhdGVkIHdoZW4gdGhlIHJlYWRlciBtZW51IGlzIG1pbmltaXplZCBvciBleHBhbmRlZC5cbihmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHN0aWNreV93cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGlja3ktd3JhcHBlclwiKTtcbiAgY29uc3QgY29udGVudF93cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250ZW50LXdyYXBwZXJcIik7XG4gIGlmICghc3RpY2t5X3dyYXBwZXIgfHwgIWNvbnRlbnRfd3JhcHBlcikgcmV0dXJuO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZVBhZGRpbmcoKSB7XG4gICAgaWYgKHN0aWNreV93cmFwcGVyLmNsYXNzTGlzdC5jb250YWlucyhcImlzLXN0dWNrXCIpKSB7XG4gICAgICBjb250ZW50X3dyYXBwZXIuc3R5bGUucGFkZGluZ1RvcCA9ICgxICsgc3RpY2t5X3dyYXBwZXIub2Zmc2V0SGVpZ2h0KSArIFwicHhcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudF93cmFwcGVyLnN0eWxlLnBhZGRpbmdUb3AgPSBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodXBkYXRlUGFkZGluZyk7XG4gIG9ic2VydmVyLm9ic2VydmUoc3RpY2t5X3dyYXBwZXIsIHsgYXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbXCJjbGFzc1wiXSB9KTtcblxuICAvLyBBbHNvIG9ic2VydmUgcmVhZGVyLW1lbnUtd3JhcHBlciBmb3Igd2luZG93c2hhZGUgdG9nZ2xlIChtZW51LW1pbmltaXplZCBjbGFzcykuXG4gIC8vIFJlLXJ1biB1cGRhdGVQYWRkaW5nIGFmdGVyIHRoZSBDU1MgdHJhbnNpdGlvbiBjb21wbGV0ZXMgc28gb2Zmc2V0SGVpZ2h0IGlzIGZpbmFsLlxuICBjb25zdCByZWFkZXJfbWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmVhZGVyLW1lbnUtd3JhcHBlclwiKTtcbiAgaWYgKHJlYWRlcl9tZW51KSB7XG4gICAgY29uc3QgcmVhZGVyT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVQYWRkaW5nKCk7XG4gICAgICBzZXRUaW
1691lb3V0KHVwZGF0ZVBhZGRpbmcsIDU1MCk7IC8vIGFmdGVyIDAuNXMgQ1NTIHRyYW5zaXRpb25cbiAgICB9KTtcbiAgICByZWFkZXJPYnNlcnZlci5vYnNlcnZlKHJlYWRlcl9tZW51LCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogW1wiY2xhc3NcIl0gfSk7XG4gIH1cbn0pKCk7XG5cbi8qKlxuICogc2F2ZSB1c2VyIG9wdGlvbiB0byBkaXNtaXNzIGEgbW9kYWwsIHNvIGl0IGRvZXNuJ3Qgc2hvdyBhbnltb3JlLlxuICpcbiAqIElmIHRoZSB1c2VyIGNsb3NlcyB0aGUgbm90aWNlLCBpdCB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQgYWdhaW4gb24gdGhlIGRhc2hib2FyZCBhbmQgbmVpdGhlciB3aWxsXG4gKiB0aGUgdXNlciBpY29uIG5leHQgdG8gdGhlIHVzZXJuYW1lLlxuICogV2UgYWxzbyByZW1vdmUgdGhlIHVzZXIgaWNvbiBuZXh0IHRvIHRoZSB1c2VybmFtZS5cbiAqL1xuZnVuY3Rpb24gc2F2ZU1vZGFsVXNlclNlbGVjdGlvbkhhbmRsZXIoZXZlbnQsIG9wdGlvbnMpIHtcbiAgY29uc3QgZWxlbWVudCA9IG9wdGlvbnNbMF07XG4gIGNvbnN0IHNlbGVjdGlvbiA9IG9wdGlvbnNbMV07XG4gIGxldCB1cmwsIGRhdGE7XG4gIGlmKHNlbGVjdGlvbiA9PT0gJ2hpZGVEaXNjb3VudE1vZGFsJykge1xuICAgIGRhdGEgPSB7J2hpZGVEaXNjb3VudE5vdGljZSc6IHRydWV9XG4gICAgdXJsID0gZWxlbWVudC5kYXRhc2V0LnVwZGF0ZVVybDtcbiAgfVxuXG4gIGlmKHNlbGVjdGlvbiA9PT0gJ0hpZGVVcGRhdGVNb2RhbCcpIHtcbiAgICBkYXRhID0geydIaWRlVXBkYXRlTW9kYWwnOiB0cnVlfVxuICAgIHVybCA9IGVsZW1lbnQuZGF0YXNldC51cGRhdGVVcmw7XG4gIH1cblxuICBuZXcgRmV0Y2hIZWxwZXJzKCkuZmV0Y2hEYXRhKCdQT1NUJywgdXJsLCBkYXRhKVxuICAgIC50aGVuKCAocmVzdWx0KSA9PiB7XG4gICAgICBpZihyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBsb2cocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICBkb2
169N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdXNlci1ub3RpZmljYXRpb24taWNvbicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkaWZmZXJlbmNlIGluIGRheXMgYmV0d2VlbiB0d28gZGF0ZXMgKGphdmFzY3JpcHQgRGF0ZSBvYmplY3RzKS5cbiAqXG4gKiBAcGFyYW0gYSBEYXRlIG9iamVjdFxuICogQHBhcmFtIGIgRGF0ZSBvYmplY3RcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGRhdGVEaWZmSW5EYXlzKGEsIGIpIHtcbiAgY29uc3QgX01TX1BFUl9EQVkgPSAxMDAwICogNjAgKiA2MCAqIDI0O1xuXG4gIC8vIGRpc2NhcmQgdGhlIHRpbWUgYW5kIHRpbWUtem9uZSBpbmZvXG4gIGNvbnN0IHV0YzEgPSBEYXRlLlVUQyhhLmdldEZ1bGxZZWFyKCksIGEuZ2V0TW9udGgoKSwgYS5nZXREYXRlKCkpO1xuICBjb25zdCB1dGMyID0gRGF0ZS5VVEMoYi5nZXRGdWxsWWVhcigpLCBiLmdldE1vbnRoKCksIGIuZ2V0RGF0ZSgpKTtcblxuICByZXR1cm4gTWF0aC5mbG9vcigodXRjMiAtIHV0YzEpIC8gX01TX1BFUl9EQVkpO1xufVxuXG4vKipcbiAqIEhhbmRsZXIgUmVjZW50IFVwZGF0ZXMgJ2RvIG5vdCBzaG93IGFnYWluJyBidXR0b24uXG4gKiBLZWVwIGNvb2tpZSBhcm91bmQgd2hlbiBzZXQgZm9yIGEgeWVhcjsgd2Ugc2hvdWxkIGRlZmluaXRlbHkgaGF2ZSBhdCBsZWFzdCAxIHJlbGVhc2UgZXZlcnkgeWVhci5cbiAqL1xuZnVuY3Rpb24gcmVjZW50VXBkYXRlc1BvcHVwSGFuZGxlcihlbGVtZW50SWQsIGNvb2tpZU5hbWUsIG9wdGlvbiwgZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAvLyBSZW1lbWJlciB1c2VyIHNlbGVjdGlvbiB0byBub3Qgc2hvdyByZWNlbnQgdXBkYXRlcyBub3RpY2VcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtlbGVtZW50SWR9YCk7XG4gIGlmKG1vZGFsKSB7XG4gICAgY29uc3QgZGF0YSA9IHsnSGlkZVVwZGF0ZU1vZGFsJzogdHJ1ZX1cbiAgICBjb25zdCB1cmwgPSBtb2RhbC5kYXRhc2V0LnVwZGF0ZVVybDtcbiAgICBuZXcgRmV0Y2hIZWxwZXJzKCkuZmV0Y2hEYXRhKCdQT1NUJywgdXJsLCBkYXRhKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZihyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIGxvZyhcIlVwZGF0ZWQgJ0hpZGVVcGRhdGVNb2RhbCcgdXNlciBzZWxlY3Rpb24uXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZyhcIkNvdWxkIG5vdCB1cGRhdGUgJ0hpZGVVcGRhdGVNb2RhbCcgdXNlciBzZWxlY3Rpb24uXCIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gICQoYCMke2VsZW1lbnRJZH1gKS5mb3VuZGF0aW9uKCdjbG9zZScpO1xufVxuXG4vKipcbiAqIENsaWNrIGhhbmRsZXIgdG8gaGlkZSBkby1ub3Qtb3Blbi1ieS1kZWZhdWx0IHdoZW4gcG9wdXAgb3BlbmVkIGZyb20gUXVpY2sgVG91ciBidXR0b24gYW5kIG5vdCBkZWZhdWx0IG9wZW5cbiAqIEBwYXJhbSBidG5cbiAqL1xuZnVuY3Rpb24gaGlkZVVwZGF0ZXNQb3B1cEJ1dHRvbihidG4pIHtcbiAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cbi8qKlxuICogSGFuZGxlciBmb3IgcXVpY2sgdG91ciAnZG8gbm9
1690IHNob3cgYWdhaW4nIGJ1dHRvbi5cbiAqL1xuZnVuY3Rpb24gcXVpY2tUb3VyUG9wdXBIYW5kbGVyKGV2ZW50LCB0b3VyTW9kYWwpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCBsYXVuY2hDYW1wYWlnbkVuZCA9IG5ldyBEYXRlKCdKdWx5IDIyLCAyMDIyIDEyOjAwOjAwJyk7IC8vIDcvMjEvMjIgYXQgbm9vbiwgb25lIGRheSBhZnRlciBsYXVuY2ggZW5kXG4gIGNvbnN0IGRheXNUb0xpdmUgPSBkYXRlRGlmZkluRGF5cyhub3csIGxhdW5jaENhbXBhaWduRW5kKTtcblxuICBjb29raWVzLnNldENvb2tpZSgnc2hvd1F1aWNrVG91clBvcFVwJywgZmFsc2UsIGRheXNUb0xpdmUpO1xuXG4gIHRvdXJNb2RhbC5mb3VuZGF0aW9uKCdjbG9zZScpO1xufVxuXG4vKipcbiAqIENsaWNrIGhhbmRsZXIgdG8gaGlkZSBkby1ub3Qtb3Blbi1ieS1kZWZhdWx0IHdoZW4gcG9wdXAgb3BlbmVkIGZyb20gUXVpY2sgVG91ciBidXR0b24gYW5kIG5vdCBkZWZhdWx0IG9wZW5cbiAqL1xuZnVuY3Rpb24gaGlkZURvTm90T3BlbkJ1dHRvbigpIHtcbiAgbGV0IGJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNoaWRlLXRvdXInKTtcbiAgYnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cbi8qKlxuICogU2VhcmNoIExTTSBvdXRsaW5lcyBmb3JtLCBvbiBoZWxwIHBhZ2VcbiAqL1xuZnVuY3Rpb24gc2VhcmNoT3V0bGluZXNCdXR0b24oKSB7XG4gIGNvbnN0IGxzbVNlYXJjaEZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoX2xzbV9vdXRsaW5lc19mb3JtJyk7XG4gIGNvbnN0IGxzbVNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaF9sc21fb3V0bGluZXNfcScpLnZhbHVlO1xuICBpZiAobHNtU2VhcmNoSW5wdXQgIT09ICcnKSB7XG4gICAgbHNtU2VhcmNoRm9ybS5hY3Rpb24gPSBcImh0dHBzOi8vd3d3LmxzbS5vcmcvc2VhcmNoLmh0bWw/I2dzYy50YWI9MCZnc2MucmVmPW1vcmUlM0FvdXRsaW5lcyZnc2MucT1cIiArIGxzbVNlYXJjaElucHV0O1xuICAgIGxzbVNlYXJjaEZvcm0uc3VibWl0KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmFibGUgdGhlIHNpZ24tb3V0IGJ1dHRvbiBvbmNlIHRoZSB1c2VyIGlzIHNpZ25lZCBpblxuICovXG5mdW5jdGlvbiBoYW5kbGVFbmFibGluZ1NpZ25JbkJ1dHRvbigpIHtcbiAgY29uc3QgdXNlck5hbWVFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnVzZXJuYW1lJyk7XG4gIGlmKHVzZXJOYW1lRWxlbSkge1xuICAgIGNvbnN0IHNpZ25PdXRFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NpZ24tb3V0Jyk7XG4gICAgaWYgKHNpZ25PdXRFbGVtKSB7XG4gICAgICBzaWduT3V0RWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemF0aW9uc09uSW5pdGlhbExvZ2luKCkge1xuICBjb25zdCB1c2VyTmFtZUVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudXNlcm5hbWUnKTtcbiAgaWYodXNlck5hbWVFbGVtKSB7XG4gICBzZXRDb29raWUoJ2xvZ2luSW5pdGlhbGl6ZWQnLCAndHJ1ZScpO1xuICB9XG59XG5cbi8qKlxuICogQXV0by1vcGVuIHNpZ24taW4gZHJvcGRvd24gd2hlbiBVUkwgY29udGFpbnMgP3Nob3dfc2lnbmluPTFcbiAqIFVzZWQgYnkgZW1haWwgbGlua3MgKHBhc3N3b3JkIGNoYW5nZSBub3RpZmljYXRpb25zLCBldGMuKSB0byBkaXJlY3QgdXNlcnMgdG8gc2lnbiBpblxuICovXG5mdW5jdGlvbiBhdXRvT3BlblNpZ25JbkRyb3Bkb3duKCkge1xuICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG4gIGlmICh1cmxQYXJhbXMuZ2V0KCdzaG93X3NpZ25pbicpICE9PSAnMScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGaW5kIHRoZSBzaWduLWluIGJ1dHRvbiB0aGF0IHRyaWdnZXJzIHRoZSBkcm9wZG93blxuICBjb25zdCBzaWduSW5CdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b2dnbGU9XCJzaWduaW4tZHJvcGRvd25cIl0nKTtcbiAgaWYgKCFzaWduSW5CdXR0b24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUcmlnZ2VyIGEgY2xpY2sgb24gdGhlIGJ1dHRvbiB0byBvcGVuIHRoZSBkcm9wZG93biB3aXRoIHByb3BlciBwb3NpdGlvbmluZ1xuICBzaWduSW5CdXR0b24uY2xpY2soKTtcblxuICAvLyBGb2N1cyB0aGUgdXNlcm5hbWUgaW5wdXQgYWZ0ZXIgZHJvcGRvd24gb3BlbnNcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgY29uc3Qgc2lnbmluRHJvcGRvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lnbmluLWRyb3Bkb3duJyk7XG4gICAgaWYgKHNpZ25pbkRyb3Bkb3duKSB7XG4gICAgICBjb25zdCB1c2VybmFtZUlucHV0ID0gc2lnbmluRHJvcGRvd24ucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInVzZXJuYW1lXCJdJyk7XG4gICAgICBpZiAodXNlcm5hbWVJbnB1dCkge1xuICAgICAgICB1c2VybmFtZUlucHV0LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCAxMDApO1xuXG4gIC8vIENsZWFuIHVwIFVSTCBwYXJhbWV0ZXIgKHJlbW92ZXMgP3Nob3dfc2lnbmluPTEgZnJvbSBhZGRyZXNzIGJhcilcbiAgaWYgKHdpbmRvdy5oaXN0b3J5ICYmIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSkge1xuICAgIGNvbnN0IGNsZWFuVXJsID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLmhhc2g7XG4gICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBkb2N1bWVudC50aXRsZSwgY2xlYW5VcmwpO1xuICB9XG59XG5cbi8qKiBjaGVjayBmb290ZXIucGhwIGZvciBvdGhlciBKUyB1c2VkLi4uICoqL1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/app.js\n");
170
171/***/ }),
172
173/***/ "./resources/js/books/last-locations.js":
174/*!**********************************************!*\
175  !*** ./resources/js/books/last-locations.js ***!
176  \**********************************************/
177/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
178
179eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   LastLocation: () => (/* binding */ LastLocation)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _utilities_debug__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utilities/debug */ \"./resources/js/utilities/debug.js\");\n\n\n/*\n * Object for handling last-location feature\n * Initialize in main.js, if needed\n */\n\n\n\nvar _createLogger = (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_3__.createLogger)('last-locations'),\n  log = _createLogger.log;\n\n/**\n * Object that represents the last location (virtual section a user was on when they navigated away from a book).\n * @param options\n * @constructor\n */\nfunction LastLocation(options) {\n  var url = options.url;\n  var l = this;\n  l.fetchData = new _fetch_helpers__WEBPACK_IMPORTED_MODULE_2__[\"default\"]().fetchData;\n  l.initialize = function () {};\n\n  /**\n   * Save the user's last location information for the current book\n   * @returns {Promise<*>}\n   * @param data\n   */\n  l.save = /*#__PURE__*/function () {\n    var _ref = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee(data) {\n      var result;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n        while (1) switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return l.fetchData('POST', url, data);\n          case 2:\n            result = _context.sent;\n            if (result.success) {\n              log(\"Successfully updated Last Location: \".concat(result['id']));\n            } else {\n              console.error(\"Error updating Last Location \".concat(result['id'], \".\"));\n              // js log?\n            }\n            return _context.abrupt(\"return\", result);\n          case 5:\n          case \"end\":\n            return _context.stop();\n        }\n      }, _callee);\n    }));\n    return function (_x) {\n      return _ref.apply(this, arguments);\n    };\n  }();\n  l.refresh = /*#__PURE__*/function () {\n    var _ref2 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2(data) {\n      var result;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context2) {\n        while (1) switch (_context2.prev = _context2.next) {\n          case 0:\n            _context2.next = 2;\n            return l.fetchData('POST', url, data);\n          case 2:\n            result = _context2.sent;\n            if (result.success) {\n              log(\"Successfully refreshed the table contents for paginator \".concat(data['paginatorName']));\n            } else {\n              console.error(\"Error refreshing the table contents for paginator \".concat(data['paginatorName'], \".\"));\n              // js log?\n            }\n            return _context2.abrupt(\"return\", result);\n          case 5:\n          case \"end\":\n            return _context2.stop();\n        }\n      }, _callee2);\n    }));\n    return function (_x2) {\n      return _ref2.apply(this, arguments);\n    };\n  }();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYm9va3MvbGFzdC1sb2NhdGlvbnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL2Jvb2tzL2xhc3QtbG9jYXRpb25zLmpzPzQ1MGIiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE9iamVjdCBmb3IgaGFuZGxpbmcgbGFzdC1sb2NhdGlvbiBmZWF0dXJlXG4gKiBJbml0aWFsaXplIGluIG1haW4uanMsIGlmIG5lZWRlZFxuICovXG5cbmltcG9ydCBGZXRjaEhlbHBlcnMgZnJvbSBcIi4uL2ZldGNoLWhlbHBlcnNcIjtcbmltcG9ydCB7
179IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuLi91dGlsaXRpZXMvZGVidWdcIjtcbmNvbnN0IHsgbG9nIH0gPSBjcmVhdGVMb2dnZXIoJ2xhc3QtbG9jYXRpb25zJyk7XG5cbi8qKlxuICogT2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbGFzdCBsb2NhdGlvbiAodmlydHVhbCBzZWN0aW9uIGEgdXNlciB3YXMgb24gd2hlbiB0aGV5IG5hdmlnYXRlZCBhd2F5IGZyb20gYSBib29rKS5cbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gTGFzdExvY2F0aW9uKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHVybH0gPSBvcHRpb25zO1xuICAgIGxldCBsID0gdGhpcztcbiAgICBsLmZldGNoRGF0YSA9IG5ldyBGZXRjaEhlbHBlcnMoKS5mZXRjaERhdGE7XG5cbiAgICBsLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIHVzZXIncyBsYXN0IGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBib29rXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgICBsLnNhdmUgPSBhc3luYyBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGwuZmV0Y2hEYXRhKCdQT1NUJywgdXJsLCBkYXRhKTtcbiAgICAgICBpZihyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgbG9nKGBTdWNjZXNzZnVsbHkgdXBkYXRlZCBMYXN0IExvY2F0aW9uOiAke3Jlc3VsdFsnaWQnXX1gKTtcbiAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciB1cGRhdGluZyBMYXN0IExvY2F0aW9uICR7cmVzdWx0WydpZCddfS5gKTtcbiAgICAgICAgICAgLy8ganMgbG9nP1xuICAgICAgIH1cblxuICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gIGwucmVmcmVzaCA9IGFzeW5jIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbC5mZXRjaERhdGEoJ1BPU1QnLCB1cmwsIGRhdGEpO1xuICAgIGlmKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBsb2coYFN1Y2Nlc3NmdWxseSByZWZyZXNoZWQgdGhlIHRhYmxlIGNvbnRlbnRzIGZvciBwYWdpbmF0b3IgJHtkYXRhWydwYWdpbmF0b3JOYW1lJ119YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJlZnJlc2hpbmcgdGhlIHRhYmxlIGNvbnRlbnRzIGZvciBwYWdpbmF0b3IgJHtkYXRhWydwYWdpbmF0b3JOYW1lJ119LmApO1xuICAgICAgLy8ganMgbG9nP1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgTGFzdExvY2F0aW9uIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/books/last-locations.js\n");
180
181/***/ }),
182
183/***/ "./resources/js/books/user-marks.js":
184/*!******************************************!*\
185  !*** ./resources/js/books/user-marks.js ***!
186  \******************************************/
187/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
188
189eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */   isDeferredSaveResponse: () => (/* binding */ isDeferredSaveResponse)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _utilities_debug__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/debug */ \"./resources/js/utilities/debug.js\");\n/* harmony import */ var _utilities_challenge_aware_fetch__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utilities/challenge-aware-fetch */ \"./resources/js/utilities/challenge-aware-fetch.js\");\n\n\n/**\n * Object for handling user marks (annotations)\n * Initialize in main.js, if needed\n */\n\n\n\n\n\n\n/**\n * User mark object.\n *\n * Represents the collection of highlights (marks) an user has in a given book \"page\" (virtual section)\n * @constructor\n */\nfunction UserMarks() {\n  var u = this;\n\n  /**\n   * UserMark is initialized with values in '.section-content' and '.current-info' elements in the DOM\n   */\n  u.initialize = function () {\n    var tagsOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n    // Both elements are reader-only — they exist in the reading column and\n    // nowhere else. Destructuring `.dataset` straight off the query result\n    // threw `TypeError: Cannot destructure property 'dataset' of ... as it\n    // is null` on any page without them, before a single line of this\n    // object's own logic ran (#4368).\n    //\n    // That path is reachable today: the account Annotations page gets here\n    // through manage-tags.js `saveTags()`, and neither element exists under\n    // src/account/.\n    //\n    // Defaulting to an empty object leaves every derived field null, which\n    // is what the destructuring defaults already declare. It does NOT make\n    // a non-reader page able to save — `rootUrl` is still unknown, so the\n    // request fails — but it fails legibly instead of crashing opaquely.\n    var sectionContent = document.querySelector('.section-content');\n    var _ref = sectionContent !== null && sectionContent !== void 0 ? sectionContent : {\n        dataset: {}\n      },\n      _ref$dataset$rootUrl = _ref.dataset.rootUrl,\n      rootUrl = _ref$dataset$rootUrl === void 0 ? null : _ref$dataset$rootUrl;\n    var currentInfo = document.querySelector('.current-info');\n    var _ref2 = currentInfo !== null && currentInfo !== void 0 ? currentInfo : {\n        dataset: {}\n      },\n      _ref2$dataset = _ref2.dataset,\n      _ref2$dataset$content = _ref2$dataset.contentId,\n      contentId = _ref2$dataset$content === void 0 ? null : _ref2$dataset$content,\n      _ref2$dataset$htmlCon = _ref2$dataset.htmlContentId,\n      htmlContentId = _ref2$dataset$htmlCon === void 0 ? null : _ref2$dataset$htmlCon,\n      _ref2$dataset$section = _ref2$dataset.sectionId,\n      sectionId = _ref2$dataset$section === void 0 ? null : _ref2$dataset$section,\n      _ref2$dataset$userId = _ref2$dataset.userId,\n      userId = _ref2$dataset$userId === void 0 ? null : _ref2$dataset$userId;\n    u.contentId = contentId;\n    u.fetchData = new _fetch_helpers__WEBPACK_IMPORTED_MODULE_2__[\"default\"]().fetchData;\n    u.fetchUrl = rootUrl + 'books/fetch/marks.php';\n    u.htmlContentId = htmlContentId;\n    u.sectionId = sectionId;\n    u.tagsOnly = tagsOnly;\n    u.userId = userId;\n  };\n\n  /**\n   * Load all marks a user has on a \"page\" (virtual section)\n   * Sends the 'load' action along with the necessary data to fetch the desired collection of marks from the server\n   * Async call is sent to fetch/marks.php\n   * @returns {Promise<*>}\n   */\n  u.load = /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee() {\n    var data;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          data = {\n            'action': 'load',\n            'userId': u.userId,\n            'htmlContentId': u.htmlContentId,\n            'contentId': u.contentId,\n            'sectionId': u.sectionId\n          };\n          _context.next = 3;\n          return u.fetchData('POST', u.fetchUrl, data);\n        case 3:\n          return _context.abrupt(\"return\", _context.sent);\n        case 4:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n\n  /**\n   * Save the user's marks on a \"page\" (virtual section) to the database.\n   * Sends the async call to marks.php in a 'data' object. the 'marks' property holds the collection of marks as\n   * well as the necessary data in properties to uniquely associate the 'marks' collection to a given user and 'page'\n   * (virtual section).\n   * `deletedMarkIds` names the annotations the user intentionally removed in\n   * this save. The server refuses a save that drops an annotation carrying a\n   * note unless it was named here, because that note exists nowhere else\n   * (#4114).\n   *\n   * @param markData\n   * @param {Array} deletedMarkIds\n   * @returns {Promise<*>}\n   */\n  u.save = /*#__PURE__*/function () {\n    var _ref4 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2(markData) {\
189n      var deletedMarkIds,\n        data,\n        _args2 = arguments;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context2) {\n        while (1) switch (_context2.prev = _context2.next) {\n          case 0:\n            deletedMarkIds = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : [];\n            data = {\n              'userId': u.userId,\n              'htmlContentId': u.htmlContentId,\n              'contentId': u.contentId,\n              'sectionId': u.sectionId,\n              'marks': markData,\n              'deletedMarkIds': deletedMarkIds,\n              'tagsOnly': u.tagsOnly\n            };\n            _context2.next = 4;\n            return u.fetchData('POST', u.fetchUrl, data, {\n              mutating: true,\n              dataLabel: 'highlights'\n            });\n          case 4:\n            return _context2.abrupt(\"return\", _context2.sent);\n          case 5:\n          case \"end\":\n            return _context2.stop();\n        }\n      }, _callee2);\n    }));\n    return function (_x) {\n      return _ref4.apply(this, arguments);\n    };\n  }();\n\n  /**\n   * Write ONE mark's note, leaving the rest of the section untouched (#4455).\n   *\n   * The section save cannot express a note deletion: an omitted or empty note\n   * there means \"keep it\" (#3080), so the server restores the stored note.\n   * This names the mark and the note text, and the server read-modify-writes\n   * just that field.\n   *\n   * @param {string|number} markId\n   * @param {string} note Empty string deletes the note.\n   * @returns {Promise<*>}\n   */\n  u.saveNote = /*#__PURE__*/function () {\n    var _ref5 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee3(markId, note) {\n      var data;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee3$(_context3) {\n        while (1) switch (_context3.prev = _context3.next) {\n          case 0:\n            data = {\n              'action': 'note',\n              'userId': u.userId,\n              'htmlContentId': u.htmlContentId,\n              'contentId': u.contentId,\n              'sectionId': u.sectionId,\n              'markId': markId,\n              'note': note\n            };\n            _context3.next = 3;\n            return u.fetchData('POST', u.fetchUrl, data, {\n              mutating: true,\n              dataLabel: 'note'\n            });\n          case 3:\n            return _context3.abrupt(\"return\", _context3.sent);\n          case 4:\n          case \"end\":\n            return _context3.stop();\n        }\n      }, _callee3);\n    }));\n    return function (_x2, _x3) {\n      return _ref5.apply(this, arguments);\n    };\n  }();\n  u.saveMarks = /*#__PURE__*/function () {\n    var _ref6 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee4(marksData) {\n      var deletedMarkIds,\n        _marksData$length,\n        _response$error,\n        response,\n        _document$querySelect,\n        _document$querySelect2,\n        result,\n        root,\n        message,\n        notice,\n        stack,\n        _args4 = arguments;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee4$(_context4) {\n        while (1) switch (_context4.prev = _context4.next) {\n          case 0:\n            deletedMarkIds = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : [];\n            _context4.prev = 1;\n            (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_4__.debugLog)('[user-marks] saveMarks: sending', (_marksData$length = marksData === null || marksData === void 0 ? void 0 : marksData.length) !== null && _marksData$length !== void 0 ? _marksData$length : 0, 'marks');\n            _context4.next = 5;\n            return u.save(marksData, deletedMarkIds);\n          case 5:\n            response = _context4.sent;\n            (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_4__.debugLog)('[user-marks] s
189aveMarks: response', response === null || response === void 0 ? void 0 : response.success, (_response$error = response === null || response === void 0 ? void 0 : response.error) !== null && _response$error !== void 0 ? _response$error : '(no error)');\n            if (!response.success) {\n              _context4.next = 11;\n              break;\n            }\n            return _context4.abrupt(\"return\", response);\n          case 11:\n            if (!(0,_utilities_challenge_aware_fetch__WEBPACK_IMPORTED_MODULE_5__.isChallengeError)(response['error'])) {\n              _context4.next = 14;\n              break;\n            }\n            (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_4__.debugLog)('[user-marks] edge challenge detected — save deferred, marks retained in session storage');\n            return _context4.abrupt(\"return\", response);\n          case 14:\n            if (!(response['error'] === 'stale_session')) {\n              _context4.next = 18;\n              break;\n            }\n            (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_4__.debugLog)('[user-marks] stale_session detected — reloading page');\n            location.reload();\n            return _context4.abrupt(\"return\", response);\n          case 18:\n            if (!(response['error'] === 'Session expired.')) {\n              _context4.next = 25;\n              break;\n            }\n            (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_4__.debugLog)('[user-marks] Session expired — redirecting home');\n            _context4.next = 22;\n            return u.sessionTimeout();\n          case 22:\n            result = _context4.sent;\n            // Same reader-only selector as initialize() (#4368). This\n            // branch only runs on session expiry, so it is a narrower\n            // edge than the save path — but a non-reader page reaching\n            // it would crash instead of redirecting.\n            root = ((_document$querySelect = (_document$querySelect2 = document.querySelector('.section-content')) === null || _document$querySelect2 === void 0 || (_document$querySelect2 = _document$querySelect2.dataset) === null || _document$querySelect2 === void 0 ? void 0 : _document$querySelect2.rootUrl) !== null && _document$querySelect !== void 0 ? _document$querySelect : '') + 'books/async-redirect-home.php';\n            if (result['status'] === 'success') {\n              location.href = root;\n            }\n          case 25:\n            return _context4.abrupt(\"return\", response);\n          case 26:\n            _context4.next = 37;\n            break;\n          case 28:\n            _context4.prev = 28;\n            _context4.t0 = _context4[\"catch\"](1);\n            message = 'There was an error updating this annotation. The error has been reported.';\n            notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_3__.AsyncNotice(message, 'error');\n            stack = _context4.t0.stack.toString();\n            _context4.next = 35;\n            return notice.create({\n              message: message,\n              error: _context4.t0,\n              stack: stack\n            }, true);\n          case 35:\n            notice.remove(5);\n            return _context4.abrupt(\"return\", {\n              success: false\n            });\n          case 37:\n          case \"end\":\n            return _context4.stop();\n        }\n      }, _callee4, null, [[1, 28]]);\n    }));\n    return function (_x4) {\n      return _ref6.apply(this, arguments);\n    };\n  }();\n  u.sessionTimeout = /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee5() {\n    var _document$querySelect3, _document$querySelect4;\n    var data;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee5$(_context5) {\n      while (1) switch (_context5.prev = _context5.next) {\n        case 0:\n          u.url = ((_document$querySelect3 = (_document$querySelect4 = document.querySelector('.section-content')) === null || _document$querySelect4 === void 0 || (_document$querySelect4 = _document$querySelect4.dataset) === null || _document$querySelect4 === void 0 ? void 0 : _document$querySelect4.rootUrl) !== null && _document$querySelect3 !== void 0 ? _document$querySelect3 : '') + 'books/async-redirect-home.php';\n          data = {\n            'userId': u.userId,\n            'msg': 'Session timed out. Please sign in.'\n          };\n          _context5.next = 4;\n          return u.fetchData('POST', u.fetchUrl, data);\n        case 4:\n          return _context5.abrupt(\"return\", _context5.sent);\n        case 5:\n        case \"end\":\n          return _context5.stop();\n      }\n    }, _callee5);\n  }));\n}\n\n/**\n * True when a {success:false} save response is a DEFERRED save rather than a\n * genuine failure.\n *\n * Two outcomes look like failures but are handled elsewhere and must not be\n * reported to the user a second time, nor rolled back:\n *  - the #3244 edge challenge, where the shared reload notice has already been\n *    shown and the marks payload is deliberately retained in session storage\n *  - 'stale_session', which reloads the page\
189n *\n * @param {Object|null|undefined} response A saveMarks response.\n * @returns {boolean}\n */\nfunction isDeferredSaveResponse(response) {\n  var error = response === null || response === void 0 ? void 0 : response.error;\n  return (0,_utilities_challenge_aware_fetch__WEBPACK_IMPORTED_MODULE_5__.isChallengeError)(error) || error === 'stale_session';\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (UserMarks);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYm9va3MvdXNlci1tYXJrcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBTUE7QUFBQTtBQUFBO0FBTEE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFPQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvYm9va3MvdXNlci1tYXJrcy5qcz8yMjYyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT2JqZWN0IGZvciBoYW5kbGluZyB1c2VyIG1hcmtzIChhbm5vdGF0aW9ucylcbiAqIEluaXRpYWxpemUgaW4gbWFpbi5qcywgaWYgbmVlZGVkXG4gKi9cblxuaW1wb3J0IEZldGNoSGVscGVycyBmcm9tICcuLi9mZXRjaC1oZWxwZXJzJztcbmltcG9ydCB7QXN5bmNOb3RpY2V9IGZyb20gXCIuLi9ub3RpY2VzL25vdGljZVwiO1xuaW1wb3J0IHtkZWJ1Z0xvZ30gZnJvbSBcIi4uL3V0aWxpdGllcy9kZWJ1Z1wiO1xuaW1wb3J0IHtpc0NoYWxsZW5nZUVycm9yfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NoYWxsZW5nZS1hd2FyZS1mZXRjaFwiO1xuXG4vKipcbiAqIFVzZXIgbWFyayBvYmplY3QuXG4gKlxuICogUmVwcmVzZW50cyB0aGUgY29sbGVjdGlvbiBvZiBoaWdobGlnaHRzIChtYXJrcykgYW4gdXNlciBoYXMgaW4gYSBnaXZlbiBib29rIFwicGFnZVwiICh2aXJ0dWFsIHNlY3Rpb24pXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVXNlck1hcmtzKCkge1xuICAgIGxldCB1ID0gdGhpcztcblxuICAgIC8qKlxuICAgICAqIFVzZXJNYXJrIGlzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGluICcuc2VjdGlvbi1jb250ZW50JyBhbmQgJy5jdXJyZW50LWluZm8nIGVsZW1lbnRzIGluIHRoZSBET01cbiAgICAgKi9cbiAgICB1LmluaXRpYWxpemUgPSBmdW5jdGlvbih0YWdzT25seSA9IGZhbHNlKSB7XG4gICAgICAgIC8vIEJvdGggZWxlbWVudHMgYXJlIHJlYWRlci1vbmx5IOKAlCB0aGV5IGV4aXN0IGluIHRoZSByZWFkaW5nIGNvbHVtbiBhbmRcbiAgICAgICAgLy8gbm93aGVyZSBlbHNlLiBEZXN0cnVjdHVyaW5nIGAuZGF0YXNldGAgc3RyYWlnaHQgb2ZmIHRoZSBxdWVyeSByZXN1bHRcbiAgICAgICAgLy8gdGhyZXcgYFR5cGVFcnJvcjogQ2Fubm90IGRlc3RydWN0dXJlIHByb3BlcnR5ICdkYXRhc2V0JyBvZiAuLi4gYXMgaXRcbiAgICAgICAgLy8gaXMgbnVsbGAgb24gYW55IHBhZ2Ugd2l0aG91dCB0aGVtLCBiZWZvcmUgYSBzaW5nbGUgbGluZSBvZiB0aGlzXG4gICAgICAgIC8vIG9iamVjdCdzIG93biBsb2dpYyByYW4gKCM0MzY4KS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhh
189dCBwYXRoIGlzIHJlYWNoYWJsZSB0b2RheTogdGhlIGFjY291bnQgQW5ub3RhdGlvbnMgcGFnZSBnZXRzIGhlcmVcbiAgICAgICAgLy8gdGhyb3VnaCBtYW5hZ2UtdGFncy5qcyBgc2F2ZVRhZ3MoKWAsIGFuZCBuZWl0aGVyIGVsZW1lbnQgZXhpc3RzIHVuZGVyXG4gICAgICAgIC8vIHNyYy9hY2NvdW50Ly5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRGVmYXVsdGluZyB0byBhbiBlbXB0eSBvYmplY3QgbGVhdmVzIGV2ZXJ5IGRlcml2ZWQgZmllbGQgbnVsbCwgd2hpY2hcbiAgICAgICAgLy8gaXMgd2hhdCB0aGUgZGVzdHJ1Y3R1cmluZyBkZWZhdWx0cyBhbHJlYWR5IGRlY2xhcmUuIEl0IGRvZXMgTk9UIG1ha2VcbiAgICAgICAgLy8gYSBub24tcmVhZGVyIHBhZ2UgYWJsZSB0byBzYXZlIOKAlCBgcm9vdFVybGAgaXMgc3RpbGwgdW5rbm93biwgc28gdGhlXG4gICAgICAgIC8vIHJlcXVlc3QgZmFpbHMg4oCUIGJ1dCBpdCBmYWlscyBsZWdpYmx5IGluc3RlYWQgb2YgY3Jhc2hpbmcgb3BhcXVlbHkuXG4gICAgICAgIGNvbnN0IHNlY3Rpb25Db250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlY3Rpb24tY29udGVudCcpO1xuICAgICAgICBjb25zdCB7IGRhdGFzZXQ6IHsgcm9vdFVybCA9IG51bGwgfSB9ID0gc2VjdGlvbkNvbnRlbnQgPz8geyBkYXRhc2V0OiB7fSB9O1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmZvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmN1cnJlbnQtaW5mbycpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkYXRhc2V0OiB7XG4gICAgICAgICAgICAgICAgY29udGVudElkID0gbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQ29udGVudElkID0gbnVsbCxcbiAgICAgICAgICAgICAgICBzZWN0aW9uSWQgPSBudWxsLFxuICAgICAgICAgICAgICAgIHVzZXJJZCA9IG51bGwgfVxuICAgICAgICB9ID0gY3VycmVudEluZm8gPz8geyBkYXRhc2V0OiB7fSB9O1xuXG4gICAgICAgIHUuY29udGVudElkID0gY29udGVudElkO1xuICAgICAgICB1LmZldGNoRGF0YSA9IG5ldyBGZXRjaEhlbHBlcnMoKS5mZXRjaERhdGE7XG4gICAgICAgIHUuZmV0Y2hVcmwgPSByb290VXJsICsgJ2Jvb2tzL2ZldGNoL21hcmtzLnBocCc7XG4gICAgICAgIHUuaH
189RtbENvbnRlbnRJZCA9IGh0bWxDb250ZW50SWQ7XG4gICAgICAgIHUuc2VjdGlvbklkID0gc2VjdGlvbklkO1xuICAgICAgICB1LnRhZ3NPbmx5ID0gdGFnc09ubHk7XG4gICAgICAgIHUudXNlcklkID0gdXNlcklkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYWxsIG1hcmtzIGEgdXNlciBoYXMgb24gYSBcInBhZ2VcIiAodmlydHVhbCBzZWN0aW9uKVxuICAgICAqIFNlbmRzIHRoZSAnbG9hZCcgYWN0aW9uIGFsb25nIHdpdGggdGhlIG5lY2Vzc2FyeSBkYXRhIHRvIGZldGNoIHRoZSBkZXNpcmVkIGNvbGxlY3Rpb24gb2YgbWFya3MgZnJvbSB0aGUgc2VydmVyXG4gICAgICogQXN5bmMgY2FsbCBpcyBzZW50IHRvIGZldGNoL21hcmtzLnBocFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICAgICAqL1xuICAgIHUubG9hZCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICdhY3Rpb24nOiAnbG9hZCcsXG4gICAgICAgICAgICAndXNlcklkJzogdS51c2VySWQgLFxuICAgICAgICAgICAgJ2h0bWxDb250ZW50SWQnOiB1Lmh0bWxDb250ZW50SWQsXG4gICAgICAgICAgICAnY29udGVudElkJzogdS5jb250ZW50SWQsXG4gICAgICAgICAgICAnc2VjdGlvbklkJzogdS5zZWN0aW9uSWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB1LmZldGNoRGF0YSgnUE9TVCcsIHUuZmV0Y2hVcmwsIGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmUgdGhlIHVzZXIncyBtYXJrcyBvbiBhIFwicGFnZVwiICh2aXJ0dWFsIHNlY3Rpb24pIHRvIHRoZSBkYXRhYmFzZS5cbiAgICAgKiBTZW5kcyB0aGUgYXN5bmMgY2FsbCB0byBtYXJrcy5waHAgaW4gYSAnZGF0YScgb2JqZWN0LiB0aGUgJ21hcmtzJyBwcm9wZXJ0eSBob2xkcyB0aGUgY29sbGVjdGlvbiBvZiBtYXJrcyBhc1xuICAgICAqIHdlbGwgYXMgdGhlIG5lY2Vzc2FyeSBkYXRhIGluIHByb3BlcnRpZXMgdG8gdW5pcXVlbHkgYXNzb2NpYXRlIHRoZSAnbWFya3MnIGNvbGxlY3Rpb24gdG8gYSBnaXZlbiB1c2VyIGFuZCAncGFnZSdcbiAgICAgKiAodmlydHVhbCBzZWN0aW9uKS5cbiAgICAgKiBgZGVsZXRlZE1hcmtJZHNgIG5hbWVzIHRoZSBhbm5vdGF0aW9ucyB0aGUgdXNlciBpbnRlbnRpb25hbGx5IHJlbW92ZWQgaW5cbiAgICAgKiB0aGlzIHNhdmUuIFRoZSBzZXJ2ZXIgcmVmdXNlcyBhIHNhdmUgdGhhdCBkcm9wcyBhbiBhbm5vdGF0aW9uIGNhcnJ5aW5nIGFcbiAgICAgKiBub3RlIHVubGVzcyBpdCB3YXMgbmFtZWQgaGVyZSwgYmVjYXVzZSB0aGF0IG5vdGUgZXhpc3RzIG5vd2hlcmUgZWxzZVxuICAgICAqICgjNDExNCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFya0RhdGFcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBkZWxldGVkTWFya0lkc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICAgICAqL1xuICAgIHUuc2F2ZSA9IGFzeW5jIGZ1bmN0aW9uKG1hcmtEYXRhLCBkZWxldGVkTWFya0lkcyA9IFtdKSB7XG4gICAgICAgIGxldCBkYXRhXG4gICAgICAgICAgPSB7ICd1c2VySWQnOiB1LnVzZXJJZCxcbiAgICAgICAgICAgICAgJ2h0bWxDb250ZW50SWQnOiB1Lmh0bWxDb250ZW50SWQsXG4gICAgICAgICAgICAgICdjb250ZW50SWQnOiB1LmNvbnRlbnRJZCxcbiAgICAgICAgICAgICAgJ3NlY3Rpb25JZCc6IHUuc2VjdGlvbklkLFxuICAgICAgICAgICAgICAnbWFya3MnOiBtYXJrRGF0YSxcbiAgICAgICAgICAgICAgJ2RlbGV0ZWRNYXJrSWRzJzogZGVsZXRlZE1hcmtJZHMsXG4gICAgICAgICAgICAgICd0YWdzT25seSc6IHUudGFnc09ubHkgfTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHUuZmV0Y2hEYXRhKCdQT1NUJywgdS5mZXRjaFVybCwgZGF0YSwge211dGF0aW5nOiB0cnVlLCBkYXRhTGFiZWw6ICdoaWdobGlnaHRzJ30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIE9ORSBtYXJrJ3Mgbm90ZSwgbGVhdmluZyB0aGUgcmVzdCBvZiB0aGUgc2VjdGlvbiB1bnRvdWNoZWQgKCM0NDU1KS5cbiAgICAgKlxuICAgICAqIFRoZSBzZWN0aW9uIHNhdmUgY2Fubm90IGV4cHJlc3MgYSBub3RlIGRlbGV0aW9uOiBhbiBvbWl0dGVkIG9yIGVtcHR5IG5vdGVcbiAgICAgKiB0aGVyZSBtZWFucyBcImtlZXAgaXRcIiAoIzMwODApLCBzbyB0aGUgc2VydmVyIHJlc3RvcmVzIHRoZSBzdG9yZWQgbm90ZS5cbiAgICAgKiBUaGlzIG5hbWVzIHRoZSBtYXJrIGFuZCB0aGUgbm90ZSB0ZXh0LCBhbmQgdGhlIHNlcnZlciByZWFkLW1vZGlmeS13cml0ZXNcbiAgICAgKiBqdXN0IHRoYXQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IG1hcmtJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBub3RlIEVtcHR5IHN0cmluZyBkZWxldGVzIHRoZSBub3RlLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICAgICAqL1xuICAgIHUuc2F2ZU5vdGUgPSBhc3luYyBmdW5jdGlvbihtYXJrSWQsIG5vdGUpIHtcbiAgICAgICAgY29uc3QgZGF0YVxuICAgICAgICAgID0geyAnYWN0aW9uJzogJ25vdGUnLFxuICAgICAgICAgICAgICAndXNlcklkJzogdS51c2VySWQsXG4gICAgICAgICAgICAgICdodG1sQ29udGVudElkJzogdS5odG1sQ29udGVudElkLFxuICAgICAgICAgICAgICAnY29udGVudElkJzogdS5jb250ZW50SWQsXG4gICAgICAgICAgICAgICdzZWN0aW9uSWQnOiB1LnNlY3Rpb25JZCxcbiAgICAgICAgICAgICAgJ21hcmtJZCc6IG1hcmtJZCxcbiAgICAgICAgICAgICAgJ25vdGUnOiBub3RlIH07XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHUuZmV0Y2hEYXRhKCdQT1NUJywgdS5mZXRjaFVybCwgZGF0YSwge211dGF0aW5nOiB0cnVlLCBkYXRhTGFiZWw6ICdub3RlJ30pO1xuICAgIH1cblxuICAgIHUuc2F2ZU1hcmtzID0gYXN5bmMgZnVuY3Rpb24obWFya3NEYXRhLCBkZWxldGVkTWFya0lkcyA9IFtdKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZygnW3VzZXItbWFya3NdIHNhdmVNYXJrczogc2VuZGluZycsIG1hcmtzRGF0YT8ubGVuZ3RoID8/IDAsICdtYXJrcycpO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB1LnNhdmUobWFya3NEYXRhLCBkZWxldGVkTWFya0lkcyk7XG4gICAgICAgICAgICBkZWJ1Z0xvZygnW3VzZXItbWFya3NdIHNhdmVNYXJrczogcmVzcG9uc2UnLCByZXNwb25zZT8uc3VjY2VzcywgcmVzcG9uc2U/LmVycm9yID8/ICcobm8gZXJyb3IpJyk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgI
189HJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRWRnZSBjaGFsbGVuZ2UgKCMzMjQ0KTogdGhlIHNoYXJlZCByZWxvYWQgbm90aWNlIGhhcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgLy8gYmVlbiBzaG93biBieSB0aGUgZmV0Y2ggc2VhbS4gUmV0dXJuIHdpdGhvdXQgdGhlIGdlbmVyaWNcbiAgICAgICAgICAgICAgICAvLyBlcnJvci9zZXNzaW9uIGhhbmRsaW5nIOKAlCB0aGUgbWFya3MgcGF5bG9hZCBzdGF5cyBpbiBzZXNzaW9uXG4gICAgICAgICAgICAgICAgLy8gc3RvcmFnZSAocGx1cyB0aGUgIzI3NTYgY29hbGVzY2VkIHNhdmUgcXVldWUpLCBzbyBub3RoaW5nIGlzXG4gICAgICAgICAgICAgICAgLy8gcm9sbGVkIGJhY2sgb3IgZHJvcHBlZC5cbiAgICAgICAgICAgICAgICBpZiAoaXNDaGFsbGVuZ2VFcnJvcihyZXNwb25zZVsnZXJyb3InXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coJ1t1c2VyLW1hcmtzXSBlZGdlIGNoYWxsZW5nZSBkZXRlY3RlZCDigJQgc2F2ZSBkZWZlcnJlZCwgbWFya3MgcmV0YWluZWQgaW4gc2Vzc2lvbiBzdG9yYWdlJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VbJ2Vycm9yJ10gPT09ICdzdGFsZV9zZXNzaW9uJykge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZygnW3VzZXItbWFya3NdIHN0YWxlX3Nlc3Npb24gZGV0ZWN0ZWQg4oCUIHJlbG9hZGluZyBwYWdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlWydlcnJvciddID09PSAnU2Vzc2lvbiBleHBpcmVkLicpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2coJ1t1c2VyLW1hcmtzXSBTZXNzaW9uIGV4cGlyZWQg4oCUIHJlZGlyZWN0aW5nIGhvbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdS5zZXNzaW9uVGltZW91dCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHJlYWRlci1vbmx5IHNlbGVjdG9yIGFzIGluaXRpYWxpemUoKSAoIzQzNjgpLiBUaGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIGJyYW5jaCBvbmx5IHJ1bnMgb24gc2Vzc2lvbiBleHBpcnksIHNvIGl0IGlzIGEgbmFycm93ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gZWRnZSB0aGFuIHRoZSBzYXZlIHBhdGgg4oCUIGJ1dCBhIG5vbi1yZWFkZXIgcGFnZSByZWFjaGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBjcmFzaCBpbnN0ZWFkIG9mIHJlZGlyZWN0aW5nLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb290XG4gICAgICAgICAgICAgICAgICAgICAgPSAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlY3Rpb24tY29udGVudCcpPy5kYXRhc2V0Py5yb290VXJsID8/ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICsgJ2Jvb2tzL2FzeW5jLXJlZGlyZWN0LWhvbWUucGhwJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFsnc3RhdHVzJ10gPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHJvb3Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ1RoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGlzIGFubm90YXRpb24uIFRoZSBlcnJvciBoYXMgYmVlbiByZXBvcnRlZC4nO1xuICAgICAgICAgICAgY29uc3Qgbm90aWNlID0gbmV3IEFzeW5jTm90aWNlKG1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBlcnJvci5zdGFjay50b1N0cmluZygpO1xuXG4gICAgICAgICAgICBhd2FpdCBub3RpY2UuY3JlYXRlKHttZXNzYWdlLCBlcnJvciwgc3RhY2t9LCB0cnVlKTtcbiAgICAgICAgICAgIG5vdGljZS5yZW1vdmUoNSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1LnNlc3Npb25UaW1lb3V0ID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgICAgIHUudXJsID0gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWN0aW9uLWNvbnRlbnQnKT8uZGF0YXNldD8ucm9vdFVybCA/PyAnJykgKyAnYm9va3MvYXN5bmMtcmVkaXJlY3QtaG9tZS5waHAnO1xuICAgICAgICBsZXQgZGF0YSA9IHsgJ3VzZXJJZCc6IHUudXNlcklkLCAnbXNnJyA6ICdTZXNzaW9uIHRpbWVkIG91dC4gUGxlYXNlIHNpZ24gaW4uJyB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHUuZmV0Y2hEYXRhKCdQT1NUJywgdS5mZXRjaFVybCwgZGF0YSlcbiAgICB9XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGEge3N1Y2Nlc3M6ZmFsc2V9IHNhdmUgcmVzcG9uc2UgaXMgYSBERUZFUlJFRCBzYXZlIHJhdGhlciB0aGFuIGFcbiAqIGdlbnVpbmUgZmFpbHVyZS5cbiAqXG4gKiBUd28gb3V0Y29tZXMgbG9vayBsaWtlIGZhaWx1cmVzIGJ1dCBhcmUgaGFuZGxlZCBlbHNld2hlcmUgYW5kIG11c3Qgbm90IGJlXG4gKiByZXBvcnRlZCB0byB0aGUgdXNlciBhIHNlY29uZCB0aW1lLCBub3Igcm9sbGVkIGJhY2s6XG4gKiAgLSB0aGUgIzMyNDQgZWRnZSBjaGFsbGVuZ2UsIHdoZXJlIHRoZSBzaGFyZWQgcmVsb2FkIG5vdGljZSBoYXMgYWxyZWFkeSBiZWVuXG4gKiAgICBzaG93biBhbmQgdGhlIG1hcmtzIHBheWxvYWQgaXMgZGVsaWJlcmF0ZWx5IHJldGFpbmVkIGluIHNlc3Npb24gc3RvcmFnZVxuICogIC0gJ3N0YWxlX3Nlc3Npb24nLCB3aGljaCByZWxvYWRzIHRoZSBwYWdlXG4gKlxuICogQHBhcmFtIHtPYmplY3R8bnVsbHx1bmRlZmluZWR9IHJlc3BvbnNlIEEgc2F2ZU1hcmtzIHJlc3BvbnNlLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRGVmZXJyZWRTYXZlUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBjb25zdCBlcnJvciA9IHJlc3BvbnNlPy5lcnJvcjtcblxuICAgI
189HJldHVybiBpc0NoYWxsZW5nZUVycm9yKGVycm9yKSB8fCBlcnJvciA9PT0gJ3N0YWxlX3Nlc3Npb24nO1xufVxuXG5leHBvcnQgeyBpc0RlZmVycmVkU2F2ZVJlc3BvbnNlIH07XG5leHBvcnQgZGVmYXVsdCBVc2VyTWFya3M7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/books/user-marks.js\n");
190
191/***/ }),
192
193/***/ "./resources/js/fetch-helpers.js":
194/*!***************************************!*\
195  !*** ./resources/js/fetch-helpers.js ***!
196  \***************************************/
197/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
198
199eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/json/stringify */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utilities_challenge_aware_fetch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utilities/challenge-aware-fetch */ \"./resources/js/utilities/challenge-aware-fetch.js\");\n\n\n\n\n\n/**\n *  JS fetch helpers\n */\nfunction FetchHelpers() {\n  /**\n   * Fetch some data from the backend\n   * @param verb\n   * @param url\n   * @param data\n   * @param {Object} [challengeContext] - forwarded to assertNotChallenged so the\n   *        edge-challenge notice can be honest about unsaved data (#3340)\n   * @param {boolean} [challengeContext.mutating=false] - this call writes data\n   * @param {string} [challengeContext.dataLabel] - plain-words name of the data\n   * @param {boolean} [challengeContext.notify=true] - show the user-facing challenge\n   *        notice; diagnostics-only calls pass false so error reporting cannot\n   *        raise a notice about a notice (#4216)\n   * @returns {Promise<*>}\n   */\n  this.fetchData = /*#__PURE__*/function () {\n    var _ref = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee(verb, url) {\n      var data,\n        _ref2,\n        _ref2$mutating,\n        mutating,\n        dataLabel,\n        _ref2$notify,\n        notify,\n        csrfMeta,\n        headers,\n        options,\n        _args = arguments;\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n        while (1) switch (_context.prev = _context.next) {\n          case 0:\n            data = _args.length > 2 && _args[2] !== undefined ? _args[2] : {};\n            _ref2 = _args.length > 3 && _args[3] !== undefined ? _args[3] : {}, _ref2$mutating = _ref2.mutating, mutating = _ref2$mutating === void 0 ? false : _ref2$mutating, dataLabel = _ref2.dataLabel, _ref2$notify = _ref2.notify, notify = _ref2$notify === void 0 ? true : _ref2$notify;\n            csrfMeta = document.querySelector('meta[name=\"csrf-token\"]');\n            headers = {\n              'Content-Type': 'application/json',\n              'X-Requested-With': 'XmlHttpRequest',\n              'SameSite': 'None; Secure'\n            };\n            if (csrfMeta) {\n              headers['X-CSRF-Token'] = csrfMeta.content;\n            }\n            options = {\n              method: verb,\n              headers: headers\n            };\n            if (verb === 'POST') {\n              options.body = _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_2___default()(data);\n            }\n\n            // console.log(`fetch url: ${url}`);\n            _context.next = 9;\n            return fetch(url, options)\n            // Edge challenge (#3244): an HTML challenge page where JSON is\n            // expected shows the shared reload notice once and throws a\n            // ChallengeInterceptedError, which the catch below folds into the\n            // caller's own data object (payload retained, success=false).\n            .then(function (response) {\n              return (0,_utilities_challenge_aware_fetch__WEBPACK_IMPORTED_MODULE_3__.assertNotChallenged)(response, {\n                mutating: mutating,\n                dataLabel: dataLabel,\n                notify: notify\n              });\n            }
199).then(checkStatus).then(parseJSON).then(function (data) {\n              if (data['error']) {\n                console.error();\n                console.error(\"\".concat(data['error']));\n                return data;\n              } else {\n                return data;\n              }\n            })[\"catch\"](function (error) {\n              console.error('request failed', error);\n              document.body.style.cursor = 'default';\n              data['success'] = false;\n              data['error'] = error;\n              return data;\n            });\n          case 9:\n            return _context.abrupt(\"return\", _context.sent);\n          case 10:\n          case \"end\":\n            return _context.stop();\n        }\n      }, _callee);\n    }));\n    return function (_x, _x2) {\n      return _ref.apply(this, arguments);\n    };\n  }();\n  // private fetch API helper methods\n  var checkStatus = function checkStatus(response) {\n    if (response.status >= 200 && response.status < 300) {\n      return response;\n    } else {\n      var error = Error(response.statusText);\n      error.response = response;\n      throw error;\n    }\n  };\n  var parseJSON = function parseJSON(response) {\n    return response.json();\n  };\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FetchHelpers);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZmV0Y2gtaGVscGVycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL2ZldGNoLWhlbHBlcnMuanM/ZmFhMyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydE5vdENoYWxsZW5nZWR9IGZyb20gJy4vdXRpbGl0aWVzL2NoYWxsZW5nZS1hd2FyZS1mZXRjaCc7XG5cbi8qKlxuICogIEpTIGZldGNoIGhlbHBlcnNcbiAqL1xuZnVuY3Rpb24gRmV0Y2hIZWxwZXJzKCkge1xuICAgIC8qKlxuICAgICAqIEZldGNoIHNvbWUgZGF0YSBmcm9tIHRoZSBiYWNrZW5kXG4gICAgICogQHBhcmFtIHZlcmJcbiAgICAgKiBAcGFyYW0gdXJsXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2NoYWxsZW5nZUNvbnRleHRdIC0gZm9yd2FyZGVkIHRvIGFzc2VydE5vdENoYWxsZW5nZWQgc28gdGhlXG4gICAgICogICAgICAgIGVkZ2UtY2hhbGxlbmdlIG5vdGljZSBjYW4gYmUgaG9uZXN0IGFib3V0IHVuc2F2ZWQgZGF0YSAoIzMzNDApXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2hhbGxlbmdlQ29udGV4dC5tdXRhdGluZz1mYWxzZV0gLSB0aGlzIGNhbGwgd3JpdGVzIGRhdGFcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYWxsZW5nZUNvbnRleHQuZGF0YUxhYmVsXSAtIHBsYWluLXdvcmRzIG5hbWUgb2YgdGhlIGRhdGFcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFsbGVuZ2VDb250ZXh0Lm5vdGlmeT10cnVlXSAtIHNob3cgdGhlIHVzZXItZmFjaW5nIGNoYWxsZW5nZVxuICAgICAqICAgICAgICBub3RpY2U7IGRpYWdub3N0aWNzLW9ubHkgY2FsbHMgcGFzcyBmYWxzZSBzbyBlcnJvciByZXBvcnRpbmcgY2Fubm90XG4gICAgICogICAgICAgIHJhaXNlIGEgbm90aWNlIGFib3V0IGEgbm90aWNlICgjNDIxNilcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAgICAgKi9cbiAgICB0aGlzLmZldGNoRGF0YSA9IGFzeW5jIGZ1bmN0aW9uKHZlcmIsIHVybCwgZGF0YSA9IHt9LCB7bXV0YXRpbmcgPSBmYWxzZSwgZGF0YUxhYmVsLCBub3RpZnkgPSB0cnVlfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNzcmZNZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1htbEh0dHBSZXF1
199ZXN0JyxcbiAgICAgICAgICAgICdTYW1lU2l0ZSc6ICdOb25lOyBTZWN1cmUnXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGNzcmZNZXRhKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydYLUNTUkYtVG9rZW4nXSA9IGNzcmZNZXRhLmNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogdmVyYixcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmVyYiA9PT0gJ1BPU1QnKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBmZXRjaCB1cmw6ICR7dXJsfWApO1xuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKVxuICAgICAgICAgICAgLy8gRWRnZSBjaGFsbGVuZ2UgKCMzMjQ0KTogYW4gSFRNTCBjaGFsbGVuZ2UgcGFnZSB3aGVyZSBKU09OIGlzXG4gICAgICAgICAgICAvLyBleHBlY3RlZCBzaG93cyB0aGUgc2hhcmVkIHJlbG9hZCBub3RpY2Ugb25jZSBhbmQgdGhyb3dzIGFcbiAgICAgICAgICAgIC8vIENoYWxsZW5nZUludGVyY2VwdGVkRXJyb3IsIHdoaWNoIHRoZSBjYXRjaCBiZWxvdyBmb2xkcyBpbnRvIHRoZVxuICAgICAgICAgICAgLy8gY2FsbGVyJ3Mgb3duIGRhdGEgb2JqZWN0IChwYXlsb2FkIHJldGFpbmVkLCBzdWNjZXNzPWZhbHNlKS5cbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gYXNzZXJ0Tm90Q2hhbGxlbmdlZChyZXNwb25zZSwge211dGF0aW5nLCBkYXRhTGFiZWwsIG5vdGlmeX0pKVxuICAgICAgICAgICAgLnRoZW4oY2hlY2tTdGF0dXMpXG4gICAgICAgICAgICAudGhlbihwYXJzZUpTT04pXG4gICAgICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVsnZXJyb3InXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKClcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtkYXRhWydlcnJvciddfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3JlcXVlc3QgZmFpbGVkJywgZXJyb3IpXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgICAgICAgICAgICAgZGF0YVsnc3VjY2VzcyddID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZGF0YVsnZXJyb3InXSA9IGVycm9yO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gcHJpdmF0ZSBmZXRjaCBBUEkgaGVscGVyIG1ldGhvZHNcbiAgICBsZXQgY2hlY2tTdGF0dXMgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KVxuICAgICAgICAgICAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHBhcnNlSlNPTiA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmV0Y2hIZWxwZXJzO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/fetch-helpers.js\n");
200
201/***/ }),
202
203/***/ "./resources/js/font-size.js":
204/*!***********************************!*\
205  !*** ./resources/js/font-size.js ***!
206  \***********************************/
207/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
208
209eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getCurrentFontSizeOnClient: () => (/* binding */ getCurrentFontSizeOnClient),\n/* harmony export */   initialize: () => (/* binding */ initialize),\n/* harmony export */   resizeText: () => (/* binding */ resizeText),\n/* harmony export */   saveFontSizeToDB: () => (/* binding */ saveFontSizeToDB),\n/* harmony export */   storeFontSizeToStorages: () => (/* binding */ storeFontSizeToStorages)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/parse-float */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _utilities_cookies__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utilities/cookies */ \"./resources/js/utilities/cookies.js\");\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _utilities_general__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utilities/general */ \"./resources/js/utilities/general.js\");\n/* harmony import */ var _annotations_note_tag_marker__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./annotations/note-tag-marker */ \"./resources/js/annotations/note-tag-marker.js\");\n/* harmony import */ var _utilities_debug__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utilities/debug */ \"./resources/js/utilities/debug.js\");\n\n\n\n\n\n\n\n\n\nvar _createLogger = (0,_utilities_debug__WEBPACK_IMPORTED_MODULE_8__.createLogger)('font-size'),\n  log = _createLogger.log;\n\n/**\n * Get the current font-size for table of contents and reader. Check for a value, in this order:\n * - if signed in:\n *   - from session Storage\n *   - from cookie\n *   - specified element in the DOM.\n *   - default font size value of '1' (rem)\n *\n * @returns {string}\n */\nfunction getCurrentFontSizeOnClient() {\n  // from cookie\n  var cookieFontSize = (0,_utilities_cookies__WEBPACK_IMPORTED_MODULE_4__.getCookie)('fontSize');\n  if (cookieFontSize) {\n    return cookieFontSize;\n  }\n\n  // from local Storage\n  var localFontSize = localStorage.getItem('fontSize');\n  if (localFontSize) {\n    return localFontSize;\n  }\n\n  // from User Settings\n  var dbFontSize = (0,_utilities_general__WEBPACK_IMPORTED_MODULE_6__.getUserFontSizeFromUserSettings)();\n  if (dbFontSize) {\n    return dbFontSize;\n  }\n\n  // from CSS\n  var cssFontSize = fontSizeInMinistryTextElem();\n  if (cssFontSize) {\n    return cssFontSize.toString();\n  }\n  return '';\n}\n\n/**\n * Async fetch of the font-size stored in the User's settings\n *\n * @returns {Promise<string>}\n */\nfunction getFontSizeFromDB() {\n  return _getFontSizeFromDB.apply(this, arguments);\n}\n/**\n * Async set of the font-size to the User's settings\n *\n * @param fontSize\n * @returns {Promise<string>}\n */\nfunction _getFontSizeFromDB() {\n  _getFontSizeFromDB = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee() {\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          _context.next = 2;\n          return fontSizeFetch();\n        case 2:\n          return _context.abrupt(\"return\", _context.sent);\n        case 3:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return _getFontSizeFromDB.apply(this, arguments);\n}\nfunction saveFontSizeToDB(_x) {\n  return _saveFontSizeToDB.apply(this, arguments);\n}\n/**\n * Fetch call to backend to either fetch or save the font size.\n *\n * @param fontSize\n * @returns {Promise<string>}\n */\nfunction _saveFontSizeToDB() {\n  _saveFontSizeToDB = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2(fontSize) {\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context2) {\n      while (1) switch (_context2.prev = _context2.next) {\n        case 0:\n          _context2.next = 2;\n          return fontSizeFetch(fontSize);\n        case 2:\n          return _context2.abrupt(\"return\", _context2.sent);\n        case 3:\n        case \"end\":\n          return _context2.stop();\n      }\n    }, _callee2);\n  }));\n  return _saveFontSizeToDB.apply(this, arguments);\n}\nfunction fontSizeFetch() {\n  return _fontSizeFetch.apply(this, arguments);\n}\n/**\n * Grab the fontSize on the ministry text paragraph element.\n *\n * @returns {number}\n */\nfunction _fontSizeFetch() {\n  _fontSizeFetch = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee3() {\n    var fontSize,\n      info,\n      result,\n      _info$dataset,\n      userId,\n      fetchUrl,\n      url,\n      action,\n      data,\n      msg,\n      notice,\n      _args3 = arguments;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee3$(_context3) {\n      while (1) switch (_context3.prev = _context3.next) {\n        case 0:\n          fontSize = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : null;\n          info = document.querySelector('.current-info');
209\n          result = {\n            'success': false\n          };\n          if (!info) {\n            _context3.next = 12;\n            break;\n          }\n          _info$dataset = info.dataset, userId = _info$dataset.userId, fetchUrl = _info$dataset.fetchUrl;\n          url = \"\".concat(fetchUrl, \"font-size.php\");\n          action = 'get';\n          if (fontSize) {\n            action = 'post';\n          }\n          data = {\n            userId: userId,\n            action: action,\n            fontSize: fontSize\n          };\n          _context3.next = 11;\n          return new _fetch_helpers__WEBPACK_IMPORTED_MODULE_5__[\"default\"]().fetchData('POST', url, data);\n        case 11:\n          result = _context3.sent;\n        case 12:\n          if (!result.success) {\n            _context3.next = 16;\n            break;\n          }\n          return _context3.abrupt(\"return\", result.fontSize);\n        case 16:\n          msg = 'Font size could not be retrieved';\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_3__.AsyncNotice(msg);\n          _context3.next = 20;\n          return notice.create({}, true);\n        case 20:\n          notice.remove(5);\n        case 21:\n          return _context3.abrupt(\"return\", '');\n        case 22:\n        case \"end\":\n          return _context3.stop();\n      }\n    }, _callee3);\n  }));\n  return _fontSizeFetch.apply(this, arguments);\n}\nfunction fontSizeInMinistryTextElem() {\n  var ministryTextParagraph = document.querySelector('#ministry-text p');\n  if (ministryTextParagraph) {\n    var sizeFromCss = window.getComputedStyle(ministryTextParagraph).fontSize.toString();\n    var size = (sizeFromCss.substring(0, sizeFromCss.length - 2) / 12).toFixed(2);\n    return _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_2___default()(size);\n  }\n}\n\n/**\n * Initialize the font size display element.\n */\nfunction initialize(au) {\n  var fontSize = '1'; // init to 1rem;\n  var clientFontSize = getCurrentFontSizeOnClient();\n  var ministryTextElem = document.querySelector('#ministry-text');\n  if (ministryTextElem) {\n    var _ministryTextElem$dat = ministryTextElem.dataset.appSession,\n      appSession = _ministryTextElem$dat === void 0 ? 'false' : _ministryTextElem$dat;\n    appSession = appSession === 'true';\n    //if appSession, use font size from userSettings (DB)\n    if (appSession && au) {\n      fontSize = (0,_utilities_general__WEBPACK_IMPORTED_MODULE_6__.getUserFontSizeFromUserSettings)();\n    } else {\n      if (clientFontSize.length > 0) {\n        // cookie should not be set to 'null'\n        if (clientFontSize === 'null') {\n          (0,_utilities_cookies__WEBPACK_IMPORTED_MODULE_4__.setCookie)(\"fontSize\", fontSize, 86400 * 365, '/');\n        }\n        fontSize = clientFontSize;\n      }\n    }\n  }\n\n  // set the font-size on the client\n  storeFontSizeToStorages(fontSize);\n  var _document$querySelect = document.querySelector(\"#ministry-text\"),\n    ministryTextStyle = _document$querySelect.style;\n  var currentFontSizeElem = document.querySelector('#current-font-size');\n  if (currentFontSizeElem && ministryTextStyle) {\n    // set font size on font element\n    currentFontSizeElem.textContent = \"\".concat((fontSize * 12).toFixed(1), \"pt\");\n    ministryTextStyle.setProperty('font-size', \"\".concat(fontSize, \"rem\"));\n  }\n}\n\n/**\n * Method to resize the text on a book's Table of contents or a reader\n * @param multiplier\n */\nfunction resizeText(_x2, _x3) {\n  return _resizeText.apply(this, arguments);\n}\n/**\n * Store font size to session and cookie storage\n * @param fontSize\n * @param saveToDb\n */\nfunction _resizeText() {\n  _resizeText = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee4(multiplier, au) {\n    var ministryTextElem, currentFontSizeElem, _ministryTextElem$dat2, appSession, displayError, currentSize, newSizePt, newSizeValue, newSizeRem, notice;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee4$(_context4) {\n      while (1) switch (_context4.prev = _context4.next) {\n        case 0:\n          ministryTextElem = document.querySelector(\"#ministry-text\");\n          currentFontSizeElem = document.querySelector('#current-font-size');\n          _ministryTextElem$dat2 = ministryTextElem.dataset.appSession, appSession = _ministryTextElem$dat2 === void 0 ? 'false' : _ministryTextElem$dat2;\n          appSession = appSession === 'true'; // cast to boolean\n          displayError = false;\n          if (!currentFontSizeElem) {\n            _context4.next = 22;\n            break;\n          }\n          currentSize = getCurrentFontSizeOnClient();\n          if (multiplier === 0) {\n            newSizeValue = 1;\n          } else {\n            currentSize = currentSize ? currentSize : 1; // set default if necessary\n            newSizeValue = _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_2___default()((_babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_2___default()(currentSize) + multiplier * 0.1).toFixed(1));\n          }\n          if (!(typeof newSizeValue === 'number')) {\n            _context4.next = 19;\n            break;\n          }\n          newSizeRem = \"\".concat(newSizeValue.toString(), \"rem\");\n          newSizePt = \"\".concat((newSizeValue * 12).toFixed(1), \"pt\");\n\n          // store the new value\n          if (appSession) {\n            storeFontSizeToStorages(newSizeValue, au); // if app session, save to DB if authenticated\n          } else {\n            storeFontSizeToStorages(newSizeValue);\n          }\n\n          // change the font size on reader\n          ministryTextElem.style.setProperty('font-size', newSizeRem);\n\n          // change displayed font size\n          currentFontSizeElem.textContent = newSizePt;\n\n          // The reader text reflowed — re-align any gutter note/tag markers (#3127).\n          (0,_annotations_note_tag_marker__WEBPACK_IMPORTED_MODULE_7__.repositionNoteTagMarkers)();\n          log(\"new font-size: \".concat(newSizePt));\n          return _context4.abrupt(\"return\", newSizeValue);\n        case 19:\n          displayError = true;\n        case 20:\n          _context4.next = 23;\n          break;\n        case 22:\n          displayError = true;\n        case 23:\n          if (!displayError) {\n            _context4.next = 28;\n            break;\n          }\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_3__.AsyncNotice('Could not set font size setting.');\n          _context4.next = 27;\n          return notice.create({}, true);\n        case 27:\n          notice.remove();\n        case 28:\n        case \"end\":\n          return _context4.stop();\n      }\n    }, _callee4);\n  }));\n  return _resizeText.apply(this, arguments);\n}\nfunction storeFontSizeToStorages(fontSize) {\n  var saveToDb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n  (0,_utilities_cookies__WEBPACK_IMPORTED_MODULE_4__.setCookie)(\"fontSize\", fontSize, 86400 * 365, '/');\n  // sessionStorage.setItem(\"fontSize\", fontSize);\n  // localStorage.setItem('fontSize', fontSize);\n  if (saveToDb) {\n    saveFontSizeToDB(fontSize).then(function () {\n      log('Font-size saved to DB.');\n    });\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvZm9udC1zaXplLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
209BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFLQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFBQTtBQUpBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBUUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQUE7QUFKQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQVFBO0FBQUE7QUE4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQUE7QUE5QkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUlBO0FBQUE7QUF3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQUE7QUF4REE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFPQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy9mb250LXNpemUuanM/ZDk5MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jTm90aWNlfSBmcm9tIFwiLi9ub3RpY2VzL25vdGljZVwiO1xuaW1wb3J0IHtnZXRDb29raWUsIHNldENvb2tpZX0gZnJvbSBcIi4vdXRpbGl0aWVzL2Nvb2tpZXNcIjtcbmltcG9ydCBGZXRjaEhlbHBlcnMgZnJvbSBcIi4vZmV0Y2gtaGVscGVyc1wiO1xuaW1wb3J0IHtnZXRVc2VyRm9udFNpemVGcm9tVXNlclNldHRpbmdzfSBmcm9tIFwiLi91dGlsaXRpZXMvZ2VuZXJhbFwiO1xuaW1wb3J0IHtyZXBvc2l0aW9uTm90ZVRhZ01hcmtlcnN9IGZyb20gXCIuL2Fubm90YXRpb25zL25vdGUtdGFnLW1hcmtlclwiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4vdXRpbGl0aWVzL2RlYnVnXCI7XG5jb25zdCB7IGxvZyB9ID0gY3JlYXRlTG9nZ2VyKCdmb250LXNpemUnKTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgZm9udC1zaXplIGZvciB0YWJsZSBvZiBjb250ZW50cyBhbmQgcmVhZGVyLiBDaGVjayBmb3IgYSB2YWx1ZSwgaW4gdGhpcyBvcmRlcjpcbiAqIC0gaWYgc2lnbmVkIGluOlxuICogICAtIGZyb20gc2Vzc2lvbiBTdG9yYWdlXG4gKiAgIC0gZnJvbSBjb29raWVcbiAqICAgLSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgRE9NLlxuICogICAtIGRlZmF1bHQgZm9udCBzaXplIHZhbHVlIG9mICcxJyAocmVtKVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldEN1cnJlbnRGb250U2l6ZU9uQ2xpZW50KCkge1xuICAvLyBmcm9tIGNvb2tpZVxuICBjb25zdCBjb29raWVGb250U2l6ZSA9IGdldENvb2tpZSgnZm9udFNpemUnKTtcbiAgaWYgKGNvb2tpZUZvbnRTaXplKSB7XG4gICAgcmV0dXJuIGNvb2tpZUZvbnRTaXplO1xuICB9XG5cbiAgLy8gZnJvbSBsb2NhbCBTdG9yYWdlXG4gIGNvbnN0IGxvY2FsRm9udFNpemUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZm9udFNpemUnKTtcbiAgaWYgKGxvY2FsRm9udFNpemUpIHtcbiAgICByZXR1cm4gbG9jYWxGb250U2l6ZTtcbiAgfVxuXG4gIC8vIGZyb20gVXNlciBTZXR0aW5nc1xuICBjb25zdCBkYkZvbnRTaXplID0gZ2V0VXNlckZvbnRTaXplRnJvbVVzZXJTZXR0aW5ncygpO1xuICBpZiAoZGJGb250U2l6ZSkge1xuICAgIHJldHVybiBkYkZvbnRTaXplO1xuICB9XG5cbiAgLy8gZnJvbSBDU1NcbiAgY29uc3QgY3NzRm9udFNpemUgPSBmb250U2l6ZUluTWluaXN0cnlUZXh0RWxlbSgpO1xuICBpZiAoY3NzRm9udFNpemUpIHtcbiAgICByZXR1cm4gY3NzRm9udFNpemUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBBc3luYyBmZXRjaCBvZiB0aGUgZm9udC1zaXplIHN0b3JlZCBpbiB0aGUgVXNlcidzIHNldHRpbmdzXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Rm9udFNpemVGcm9tREIoKSB7XG4gIHJldHVybiBhd2FpdCBmb250U2l6ZUZldGNoKCk7XG59XG5cbi8qKlxuICogQXN5bmMgc2V0IG9mIHRoZSBmb250LXNpemUgdG8gdGhlIFVzZXIncyBzZXR0aW5nc1xuICpcbiAqIEBwYXJhbSBmb250U2l6ZVxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2F2ZUZvbnRTaXplVG9EQihmb250U2l6ZSkge1xuICByZXR1cm4gYXdhaXQgZm9udFNpemVGZXRjaC
209hmb250U2l6ZSk7XG59XG5cbi8qKlxuICogRmV0Y2ggY2FsbCB0byBiYWNrZW5kIHRvIGVpdGhlciBmZXRjaCBvciBzYXZlIHRoZSBmb250IHNpemUuXG4gKlxuICogQHBhcmFtIGZvbnRTaXplXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICovXG5hc3luYyBmdW5jdGlvbiBmb250U2l6ZUZldGNoKGZvbnRTaXplID0gbnVsbCkge1xuICBsZXQgaW5mbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jdXJyZW50LWluZm8nKTtcbiAgbGV0IHJlc3VsdCA9IHsnc3VjY2Vzcyc6IGZhbHNlfTtcblxuICBpZihpbmZvKSB7XG4gICAgY29uc3Qge3VzZXJJZCwgZmV0Y2hVcmx9ID0gaW5mby5kYXRhc2V0O1xuICAgIGNvbnN0IHVybCA9IGAke2ZldGNoVXJsfWZvbnQtc2l6ZS5waHBgO1xuICAgIGxldCBhY3Rpb24gPSAnZ2V0JztcblxuICAgIGlmIChmb250U2l6ZSkge1xuICAgICAgYWN0aW9uID0gJ3Bvc3QnO1xuICAgIH1cblxuICAgIGxldCBkYXRhID0ge3VzZXJJZCwgYWN0aW9uLCBmb250U2l6ZX07XG4gICAgcmVzdWx0ID0gYXdhaXQgbmV3IEZldGNoSGVscGVycygpLmZldGNoRGF0YSgnUE9TVCcsIHVybCwgZGF0YSk7XG4gIH1cblxuICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICByZXR1cm4gcmVzdWx0LmZvbnRTaXplO1xuICB9IGVsc2Uge1xuICAgIGxldCBtc2cgPSAnRm9udCBzaXplIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQnO1xuICAgIGxldCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UobXNnKTtcblxuICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoe30sIHRydWUpO1xuICAgIG5vdGljZS5yZW1vdmUoNSk7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogR3JhYiB0aGUgZm9udFNpemUgb24gdGhlIG1pbmlzdHJ5IHRleHQgcGFyYWdyYXBoIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZm9udFNpemVJbk1pbmlzdHJ5VGV4dEVsZW0oKSB7XG4gIGNvbnN0IG1pbmlzdHJ5VGV4dFBhcmFncmFwaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtaW5pc3RyeS10ZXh0IHAnKTtcbiAgaWYgKG1pbmlzdHJ5VGV4dFBhcmFncmFwaCkge1xuICAgIGxldCBzaXplRnJvbUNzcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG1pbmlzdHJ5VGV4dFBhcmFncmFwaCkuZm9udFNpemUudG9TdHJpbmcoKTtcbiAgICBsZXQgc2l6ZSA9IChzaXplRnJvbUNzcy5zdWJzdHJpbmcoMCwgc2l6ZUZyb21Dc3MubGVuZ3RoIC0gMikgLyAxMikudG9GaXhlZCgyKTtcblxuICAgIHJldHVybiBwYXJzZUZsb2F0KHNpemUpO1xuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgZm9udCBzaXplIGRpc3BsYXkgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZShhdSkge1xuICBsZXQgZm9udFNpemUgPSAnMSc7IC8vIGluaXQgdG8gMXJlbTtcbiAgY29uc3QgY2xpZW50Rm9udFNpemUgPSBnZXRDdXJyZW50Rm9udFNpemVPbkNsaWVudCgpO1xuXG4gIGNvbnN0IG1pbmlzdHJ5VGV4dEVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWluaXN0cnktdGV4dCcpO1xuICBpZihtaW5pc3RyeVRleHRFbGVtKSB7XG4gICAgbGV0IHsgZGF0YXNldDogeyBhcHBTZXNzaW9uID0gJ2ZhbHNlJyB9IH0gPSBtaW5pc3RyeVRleHRFbGVtO1xuICAgIGFwcFNlc3Npb24gPSAoYXBwU2Vzc2lvbiA9PT0gJ3RydWUnKTtcbiAgICAvL2lmIGFwcFNlc3Npb24sIHVzZSBmb250IHNpemUgZnJvbSB1c2VyU2V0dGluZ3MgKERCKVxuICAgIGlmKGFwcFNlc3Npb24gJiYgYXUpIHtcbiAgICAgIGZvbnRTaXplID0gZ2V0VXNlckZvbnRTaXplRnJvbVVzZXJTZXR0aW5ncygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2xpZW50Rm9udFNpemUubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBjb29raWUgc2hvdWxkIG5vdCBiZSBzZXQgdG8gJ251bGwnXG4gICAgICAgIGlmKGNsaWVudEZvbnRTaXplID09PSAnbnVsbCcpIHtcbiAgICAgICAgICBzZXRDb29raWUoXCJmb250U2l6ZVwiLCBmb250U2l6ZSwgODY0MDAgKiAzNjUsICcvJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb250U2l6ZSA9IGNsaWVudEZvbnRTaXplO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHNldCB0aGUgZm9udC1zaXplIG9uIHRoZSBjbGllbnRcbiAgc3RvcmVGb250U2l6ZVRvU3RvcmFnZXMoZm9udFNpemUpO1xuXG4gIGNvbnN0IHsgc3R5bGU6IG1pbmlzdHJ5VGV4dFN0eWxlIH0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI21pbmlzdHJ5LXRleHRcIik7XG4gIGNvbnN0IGN1cnJlbnRGb250U2l6ZUVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY3VycmVudC1mb250LXNpemUnKVxuXG4gIGlmIChjdXJyZW50Rm9udFNpemVFbGVtICYmIG1pbmlzdHJ5VGV4dFN0eWxlKSB7XG4gICAgLy8gc2V0IGZvbnQgc2l6ZSBvbiBmb250IGVsZW1lbnRcbiAgICBjdXJyZW50Rm9udFNpemVFbGVtLnRleHRDb250ZW50ID0gYCR7KChmb250U2l6ZSAqIDEyKS50b0ZpeGVkKDEpKX1wdGA7XG4gICAgbWluaXN0cnlUZXh0U3R5bGUuc2V0UHJvcGVydHkoJ2ZvbnQtc2l6ZScsIGAke2ZvbnRTaXplfXJlbWApO1xuICB9XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIHJlc2l6ZSB0aGUgdGV4dCBvbiBhIGJvb2sncyBUYWJsZSBvZiBjb250ZW50cyBvciBhIHJlYWRlclxuICogQHBhcmFtIG11bHRpcGxpZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzaXplVGV4dChtdWx0aXBsaWVyLCBhdSkge1xuICBjb25zdCBtaW5pc3RyeVRleHRFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNtaW5pc3RyeS10ZXh0XCIpO1xuICBjb25zdCBjdXJyZW50Rm9udFNpemVFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2N1cnJlbnQtZm9udC1zaXplJylcbiAgbGV0IHsgZGF0YXNldDogeyBhcHBTZXNzaW9uID0gJ2ZhbHNlJyB9IH0gPSBtaW5pc3RyeVRleHRFbGVtO1xuICBhcHBTZXNzaW9uID0gKGFwcFNlc3Npb24gPT09ICd0cnVlJyk7IC8vIGNhc3QgdG8gYm9vbGVhblxuICBsZXQgZGlzcGxheUVycm9yID0gZmFsc2U7XG5cbiAgaWYoY3VycmVudEZvbnRTaXplRWxlbSkge1xuICAgIGxldCBjdXJyZW50U2l6ZSA9IGdldEN1cnJlbnRGb250U2l6ZU9uQ2xpZW50KCk7XG4gICAgbGV0IG5ld1NpemVQdCwgbmV3U2l6ZVZhbHVlLCBuZXdTaXplUmVtO1xuXG4gICAgaWYgKG11bHRpcGxpZXIgPT09IDApIHtcbiAgICAgIG5ld1NpemVWYWx1ZSA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRTaXplID0gY3VycmVudFNpemUgPyBjdXJyZW50U2l6ZSA6IDE7IC8vIHNldCBkZWZhdWx0IGlmIG5lY2Vzc2FyeVxuICAgICAgbmV3
209U2l6ZVZhbHVlID0gcGFyc2VGbG9hdCgocGFyc2VGbG9hdChjdXJyZW50U2l6ZSkgKyAobXVsdGlwbGllciAqIDAuMSkpLnRvRml4ZWQoMSkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgKG5ld1NpemVWYWx1ZSkgPT09ICdudW1iZXInKSB7XG4gICAgICBuZXdTaXplUmVtID0gYCR7bmV3U2l6ZVZhbHVlLnRvU3RyaW5nKCl9cmVtYDtcbiAgICAgIG5ld1NpemVQdCA9IGAkeyhuZXdTaXplVmFsdWUgKiAxMikudG9GaXhlZCgxKX1wdGA7XG5cbiAgICAgIC8vIHN0b3JlIHRoZSBuZXcgdmFsdWVcbiAgICAgIGlmKGFwcFNlc3Npb24pIHtcbiAgICAgICAgc3RvcmVGb250U2l6ZVRvU3RvcmFnZXMobmV3U2l6ZVZhbHVlLCBhdSk7IC8vIGlmIGFwcCBzZXNzaW9uLCBzYXZlIHRvIERCIGlmIGF1dGhlbnRpY2F0ZWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0b3JlRm9udFNpemVUb1N0b3JhZ2VzKG5ld1NpemVWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNoYW5nZSB0aGUgZm9udCBzaXplIG9uIHJlYWRlclxuICAgICAgbWluaXN0cnlUZXh0RWxlbS5zdHlsZS5zZXRQcm9wZXJ0eSgnZm9udC1zaXplJywgbmV3U2l6ZVJlbSk7XG5cbiAgICAgIC8vIGNoYW5nZSBkaXNwbGF5ZWQgZm9udCBzaXplXG4gICAgICBjdXJyZW50Rm9udFNpemVFbGVtLnRleHRDb250ZW50ID0gbmV3U2l6ZVB0O1xuXG4gICAgICAvLyBUaGUgcmVhZGVyIHRleHQgcmVmbG93ZWQg4oCUIHJlLWFsaWduIGFueSBndXR0ZXIgbm90ZS90YWcgbWFya2VycyAoIzMxMjcpLlxuICAgICAgcmVwb3NpdGlvbk5vdGVUYWdNYXJrZXJzKCk7XG5cbiAgICAgIGxvZyhgbmV3IGZvbnQtc2l6ZTogJHtuZXdTaXplUHR9YCk7XG5cbiAgICAgIHJldHVybiBuZXdTaXplVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3BsYXlFcnJvciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRpc3BsYXlFcnJvciA9IHRydWU7XG4gIH1cblxuICBpZihkaXNwbGF5RXJyb3IpIHtcbiAgICBjb25zdCBub3RpY2UgPSBuZXcgQXN5bmNOb3RpY2UoJ0NvdWxkIG5vdCBzZXQgZm9udCBzaXplIHNldHRpbmcuJyk7XG4gICAgYXdhaXQgbm90aWNlLmNyZWF0ZSh7fSwgdHJ1ZSk7XG5cbiAgICBub3RpY2UucmVtb3ZlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdG9yZSBmb250IHNpemUgdG8gc2Vzc2lvbiBhbmQgY29va2llIHN0b3JhZ2VcbiAqIEBwYXJhbSBmb250U2l6ZVxuICogQHBhcmFtIHNhdmVUb0RiXG4gKi9cbmZ1bmN0aW9uIHN0b3JlRm9udFNpemVUb1N0b3JhZ2VzKGZvbnRTaXplLCBzYXZlVG9EYiA9IGZhbHNlKSB7XG4gIHNldENvb2tpZShcImZvbnRTaXplXCIsIGZvbnRTaXplLCA4NjQwMCAqIDM2NSwgJy8nKTtcbiAgLy8gc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcImZvbnRTaXplXCIsIGZvbnRTaXplKTtcbiAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2ZvbnRTaXplJywgZm9udFNpemUpO1xuICBpZihzYXZlVG9EYikge1xuICAgIHNhdmVGb250U2l6ZVRvREIoZm9udFNpemUpLnRoZW4oKCkgPT4geyBsb2coJ0ZvbnQtc2l6ZSBzYXZlZCB0byBEQi4nKTsgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgZ2V0Q3VycmVudEZvbnRTaXplT25DbGllbnQsIGluaXRpYWxpemUsIHJlc2l6ZVRleHQsIHN0b3JlRm9udFNpemVUb1N0b3JhZ2VzLCBzYXZlRm9udFNpemVUb0RCIH1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/font-size.js\n");
210
211/***/ }),
212
213/***/ "./resources/js/notices/functions.js":
214/*!*******************************************!*\
215  !*** ./resources/js/notices/functions.js ***!
216  \*******************************************/
217/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
218
219eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   applyFloatingTreatment: () => (/* binding */ applyFloatingTreatment),\n/* harmony export */   closeNoticeHandler: () => (/* binding */ closeNoticeHandler),\n/* harmony export */   displayNotice: () => (/* binding */ displayNotice),\n/* harmony export */   getCookie: () => (/* binding */ getCookie),\n/* harmony export */   getNavBottom: () => (/* binding */ getNavBottom),\n/* harmony export */   initFloatingNotices: () => (/* binding */ initFloatingNotices),\n/* harmony export */   removeNotices: () => (/* binding */ removeNotices),\n/* harmony export */   repositionFloatingNotices: () => (/* binding */ repositionFloatingNotices)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/toConsumableArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/set-timeout */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n/**\n * Click even handler for notices close button\n * sets 'subscription-notice' cookie to 'ack' when closed\n * allows us to track that the user conscientiously acknowledged the subscription notice by closing it\n */\nfunction closeNoticeHandler() {\n  var key = 'subscription-notice';\n  var cookieValue = getCookie(key);\n  if (!cookieValue) {\n    // set cookie with default duration (removed when browser is closed)\n    document.cookie = \"\".concat(key, \"=ack\");\n  }\n}\n\n/**\n * Get a cookie's value\n * Cookies are stored as a semi-colon-delimited string. There is no mechanism in JS to fetch a single cookie; You\n * have split the cookie string and loop through values looking for a particular cookie name\n * if cookie is not found, returns null\n * @param cookieName\n * @returns {string|null}\n */\nfunction getCookie(cookieName) {\n  var cookies = document.cookie.split('; ');\n  var cookieData = null;\n  for (var i = 0; i < cookies.length; i++) {\n    cookieData = cookies[i].split('=');\n    if (cookieName === cookieData[0]) {\n      return cookies[1];\n    }\n  }\n  return null;\n}\n\n/**\n * Measure the bottom edge of the lowest sticky element so notices can sit just below it.\n *\n * Reader pages expose `#menu-toggler` (the windowshade arrow, rendered last inside\n * `#reader-menu-wrapper`, after the reader sub-toolbar); every other page uses `#sticky-wrapper`.\n * Anchoring to `#menu-toggler` means the notice clears the arrow instead of sitting behind it\n * (#3460). Measured live so mobile nav-height changes and Foundation stuck/unstuck transitions\n * stay correct.\n *\n * @returns {number} pixels from the viewport top, clamped to >= 0\n */\nfunction getNavBottom() {\n  var anchorEl = document.querySelector('#menu-toggler') || document.querySelector('#sticky-wrapper');\n  var bottom = anchorEl ? anchorEl.getBoundingClientRect().bottom : 0;\n  return Math.max(bottom, 0);\n}\n\n/**\n * Pin a notices container fixed just below the sticky nav (the single site-wide treatment).\n * Sets the `--nav-bottom` custom property so the SCSS fallback and the JS-measured value agree.\n *\n * @param {HTMLElement} noticesDiv\n */\nfunction applyFloatingTreatment(noticesDiv) {\n  if (!noticesDiv) {\n    return;\n  }\n  noticesDiv.classList.add('output-notices--floating');\n  var navBottom = getNavBottom();\n  noticesDiv.style.setProperty('--nav-bottom', \"\".concat(navBottom, \"px\"));\n  noticesDiv.style.top = \"\".concat(navBottom, \"px\");\n}\n\n/**\n * Re-measure and re-apply the floating offset to the main notices container. Attach to\n * resize/scroll so the notice tracks the sticky nav as its he
219ight changes.\n */\nfunction repositionFloatingNotices() {\n  var noticesDiv = document.querySelector('#notices-main.output-notices--floating');\n  if (noticesDiv) {\n    applyFloatingTreatment(noticesDiv);\n  }\n}\n\n/**\n * Wire up the floating treatment for the server-rendered flash container (#notices-main).\n *\n * Pins the flash fixed just below the sticky nav and keeps it glued there as the nav's\n * height changes. This used to live inline in notices/main.js, but no page loads that\n * bundle — so the positioning never ran and server flashes sat hidden at top:0 behind\n * the masthead. Exported so app.js (loaded on every page) can call it (#3477).\n *\n * Safe to call on pages without a flash (returns early) and guarded against double-init,\n * so calling it from both app.js and notices/main.js is harmless.\n */\nfunction initFloatingNotices() {\n  var noticeElem = document.querySelector('#notices-main');\n  if (!noticeElem) {\n    return;\n  }\n\n  // Guard on the element itself (not module scope) — app.js and notices/main.js are\n  // separate webpack bundles, each with its own copy of this module.\n  if (noticeElem.dataset.floatingInit === 'true') {\n    return;\n  }\n  noticeElem.dataset.floatingInit = 'true';\n\n  // Pin the server-rendered flash fixed just below the sticky nav so it matches the async\n  // notice treatment and shows below the nav on load with no scroll jump (#3089).\n  applyFloatingTreatment(noticeElem);\n\n  // Keep the notice glued to the sticky nav as its height changes (mobile, Foundation stuck/unstuck).\n  window.addEventListener('resize', repositionFloatingNotices);\n  window.addEventListener('scroll', repositionFloatingNotices, {\n    passive: true\n  });\n\n  // Foundation wraps the nav in #sticky-wrapper during its OWN init, which can run after this\n  // runs — so the measurement above can be 0 and pin the notice at top:0 (behind the header)\n  // until the first scroll. Re-measure once layout + Foundation are ready so the notice sits\n  // below the nav even before any scroll (#3451). If the page already finished loading,\n  // re-measure immediately instead of waiting for a `load` event that will never fire.\n  if (document.readyState === 'complete') {\n    repositionFloatingNotices();\n  } else {\n    window.addEventListener('load', repositionFloatingNotices);\n  }\n\n  // At the very top of a page the `load` event may still fire before Foundation completes its\n  // first sticky layout pass, leaving the initial measurement stale (0) and the notice hidden\n  // behind the header until the first scroll. A double rAF defers the re-measure past Foundation's\n  // first layout frame so the notice sits below the green nav immediately at page top (#3460).\n  requestAnimationFrame(function () {\n    return requestAnimationFrame(repositionFloatingNotices);\n  });\n\n  // Track Foundation's stick/unstick transitions directly rather than relying on scroll\n  // granularity, so the notice stays pinned just below the nav the moment it becomes/stops being\n  // stuck. Foundation emits these on the window via jQuery, which is loaded site-wide (#3460).\n  if (window.jQuery) {\n    window.jQuery(window).on('sticky.zf.stuckto:top sticky.zf.unstuckfrom:top', repositionFloatingNotices);\n  }\n  var closeButton = noticeElem.querySelector('.close-button');\n  if (closeButton) {\n    closeButton.addEventListener('click', closeNoticeHandler);\n  }\n}\n\n/**\n * Remove notice after specified seconds.\n * @param seconds\n */\nfunction removeNotices(seconds) {\n  var _context;\n  var appSettingsElement = document.querySelector('[name=\"app-settings\"]');\n  var shouldFade = false;\n  if (appSettingsElement) {\n    var appSettings = JSON.parse(appSettingsElement.dataset.settings || '{}');\n    shouldFade = appSettings.FLASH_NOTICE_FADEOUT === 'true';\n  }\n  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_1___default()(_context = document.querySelectorAll('#notices-main .callout.notice')).call(_context, function (notice) {\n    // Sticky notices (marked `.not-set`) must NEVER auto-dismiss — they persist until the\n    // user dismisses them via the close button. This keeps flashes set just before a server\n    // redirect visible on the landing page instead of vanishing after ~5s (#3333).\n    if (notice.classList.contains('not-set')) {\n      return;\n    }\n\n    // if the notice has a custom duration, use that\n    var duration = notice.dataset.duration;\n    var timeout = duration !== null && duration !== void 0 ? duration : 5000;\n    if (shouldFade) {\n      // Optional: fade before removal\n      notice.style.transition = \"opacity \".concat(seconds, \"s ease\");\n      notice.style.opacity = '0';\n    }\n    _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_2___default()(function () {\n      notice.remove();\n    }, timeout);\n  });\n}\n\n/**\n * Display a message in the notices div.\n *\n * @param message\n * @param type\n * @param isSticky\n */\nfunction displayNotice(message, type) {\n  var _document$querySelect, _noticesDiv$querySele;\n  var isSticky = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  var notice_class;\n  switch (type) {\n    case 'warning':\n      notice_class = 'notice-warning';\n      break;\n    case 'error':\n      notice_class = 'notice-error';\n      break;\n    default:\n      notice_class = 'notice-info';\n      break;\n  }\n  var noticesDiv = (_document$querySelect = document.querySelector('#notices-main')) !== null && _document$querySelect !== void 0 ? _document$querySelect : false;\n  if (!noticesDiv) {\n    noticesDiv = document.createElement('div');\n    noticesDiv.id = 'notices-main';\n    noticesDiv.classList.value = 'output-notices';\n    document.body.appendChild(noticesDiv);\n  }\n\n  // Pin the container fixed just below the sticky nav — same treatment as AsyncNotice\n  // and the server flash partial. No scroll jump, no layout shift.\n  applyFloatingTreatment(noticesDiv);\n  var isError = notice_class === 'notice-error';\n  noticesDiv.setAttribute('role', isError ? 'alert' : 'status');\n  if (!isError) {\n    noticesDiv.setAttribute('aria-live', 'polite');\n  }\n  var notice = (_noticesDiv$querySele = noticesDiv.querySelector('.notice')) !== null && _noticesDiv$querySele !== void 0 ? _noticesDiv$querySele : false;\n  if (notice) {\n    var _notice$classList;\n    notice.querySelector('span').innerText = message;\n    // remove classes\n    (_notice$classList = notice.classList).remove.apply(_notice$classList, (0,_babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(notice.classList));\n    notice.classList.add('callout', 'notice');\n    if (isSticky) {\n      notice.classList.add('not-set');\n    }\n    notice.classList.add(notice_class);\n  } else {\n    var div, button, span, span2;\n    div = document.createElement('div');\n    div.classList.add('callout', 'notice');\n    if (isSticky) {\n      div.classList.add('not-set');\n    }\n    div.classList.add(notice_class);\n    div.setAttribute('data-closable', '');\n    span = document.createElement('span');\n    span.append(message);\n    div.append(span);\n    button = document.createElement('button');\n    button.classList.add('close-button');\n    button.setAttribute('aria-label', 'Dismiss alert');\n    button.setAttribute('type', 'button');\n    button.setAttribute('data-close', '');\n    // Remove THIS notice directly — removeNotices() now skips sticky (`.not-set`) notices,\n    // so the close button must dismiss its own element rather than delegate (#3333).\n    button.addEventListener('click', function () {\n      div.remove();\n    });\n    span2 = document.createElement('span');\n    span2.setAttribute('aria-hidden', 'true');\n    span2.innerHTML = '&times;';\n    button.append(span2);\n    div.append(button);\n    noticesDiv.append(div);\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbm90aWNlcy9mdW5jdGlvbnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
219BRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy9ub3RpY2VzL2Z1bmN0aW9ucy5qcz82ZTU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xpY2sgZXZlbiBoYW5kbGVyIGZvciBub3RpY2VzIGNsb3NlIGJ1dHRvblxuICogc2V0cyAnc3Vic2NyaXB0aW9uLW5vdGljZScgY29va2llIHRvICdhY2snIHdoZW4gY2xvc2VkXG4gKiBhbGxvd3MgdXMgdG8gdHJhY2sgdGhhdCB0aGUgdXNlciBjb25zY2llbnRpb3VzbHkgYWNrbm93bGVkZ2VkIHRoZSBzdWJzY3JpcHRpb24gbm90aWNlIGJ5IGNsb3NpbmcgaXRcbiAqL1xuZnVuY3Rpb24gY2xvc2VOb3RpY2VIYW5kbGVyKCkge1xuICBsZXQga2V5ID0gJ3N1YnNjcmlwdGlvbi1ub3RpY2UnO1xuICBsZXQgY29va2llVmFsdWUgPSBnZXRDb29raWUoa2V5KTtcblxuICBpZighY29va2llVmFsdWUpIHtcbiAgICAvLyBzZXQgY29va2llIHdpdGggZGVmYXVsdCBkdXJhdGlvbiAocmVtb3ZlZCB3aGVuIGJyb3dzZXIgaXMgY2xvc2VkKVxuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2tleX09YWNrYDtcbiAgfVxufVxuXG5cbi8qKlxuICogR2V0IGEgY29va2llJ3MgdmFsdWVcbiAqIENvb2tpZXMgYXJlIHN0b3JlZCBhcyBhIHNlbWktY29sb24tZGVsaW1pdGVkIHN0cmluZy4gVGhlcmUgaXMgbm8gbWVjaGFuaXNtIGluIEpTIHRvIGZldGNoIGEgc2luZ2xlIGNvb2tpZTsgWW91XG4gKiBoYXZlIHNwbGl0IHRoZSBjb29raWUgc3RyaW5nIGFuZCBsb29wIHRocm91Z2ggdmFsdWVzIGxvb2tpbmcgZm9yIGEgcGFydGljdWxhciBjb29raWUgbmFtZVxuICogaWYgY29va2llIGlzIG5vdCBmb3VuZCwgcmV0dXJucyBudWxsXG4gKiBAcGFyYW0gY29va2llTmFtZVxuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICovXG5mdW5jdGlvbiBnZXRDb29raWUoY29va2llTmFtZSkge1xuICBsZXQgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKTtcbiAgbGV0IGNvb2tpZURhdGEgPSBudWxsO1xuICBmb3IobGV0IGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuICAgIGNvb2tpZURhdGEgPSBjb29raWVzW2ldLnNwbGl0KCc9JylcbiAgICBpZihjb29raWVOYW1lID09PSBjb29raWVEYXRhWzBdKSB7XG4gICAgICByZXR1cm4gY29va2llc1sxXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBNZWFzdXJlIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgbG93ZXN0IHN0aWNreSBlbGVtZW50IHNvIG5vdGljZXMgY2FuIHNpdCBqdXN0IGJlbG93IGl0LlxuICpcbiAqIFJlYWRlciBwYWdlcyBleHBvc2UgYCNtZW51LXRvZ2dsZXJgICh0aGUgd2luZG93c2hhZGUgYXJyb3csIHJlbmRlcmVkIGxhc3QgaW5zaWRlXG4gKiBgI3JlYWRlci1tZW51LXdyYXBwZXJgLCBhZnRlciB0aGUgcmVhZGVyIHN1Yi10b29sYmFyKTsgZXZlcnkgb3RoZXIgcGFnZSB1c2VzIGAjc3RpY2t5LXdyYXBwZXJgLlxuICogQW5jaG9yaW5nIHRvIGAjbWVudS10b2dnbGVyYCBtZWFucyB0aGUgbm90aWNlIGNsZWFycyB0aGUgYXJyb3cgaW5zdGVhZCBvZiBzaXR0aW5nIGJlaGluZCBpdFxuICogKCMzNDYwKS4gTWVhc3VyZWQgbGl2ZSBzbyBtb2JpbGUgbmF2LWhlaWdodCBjaGFuZ2VzIGFuZCBGb3VuZGF0aW9uIHN0dWNrL3Vuc3R1Y2sgdHJhbnNpdGlvbnNcbiAqIHN0YXkgY29ycmVjdC5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBwaXhlbHMgZnJvbSB0aGUgdmlld3BvcnQgdG9wLCBjbGFtcGVkIHRvID49IDBcbiAqL1xuZnVuY3Rpb24gZ2V0TmF2Qm90dG9tKCkge1xuICBjb25zdCBhbmNob3JFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtZW51LXRvZ2dsZXInKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3RpY2t5LXdyYXBwZXInKTtcbiAgY29uc3QgYm90dG9tID0gYW5jaG9yRWwgPyBhbmNob3JFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gOiAwO1xuICByZXR1cm4gTWF0aC5tYXgoYm90dG9tLCAwKTtcbn1cblxuLyoqXG4gKiBQaW4gYSBub3RpY2VzIGNvbnRhaW5lciBmaXhlZCBqdXN0IGJlbG93IHRoZSBzdGlja3kgbmF2ICh0aGUgc2luZ2xlIHNpdGUtd2lkZSB0cmVhdG1lbnQpLlxuICogU2V0cyB0aGUgYC0tbmF2LWJvdHRvbWAgY3VzdG9tIHByb3BlcnR5IHNvIHRoZSBTQ1NTIGZhbGxiYWNrIGFuZCB0aGUgSlMtbWVhc3VyZWQgdmFsdWUgYWdyZWUuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm90aWNlc0RpdlxuICovXG5mdW5jdGlvbiBhcHBseUZsb2F0aW5nVHJlYXRtZW50KG5vdGljZXNEaXYpIHtcbiAgaWYgKCFub3RpY2VzRGl2KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG5vdGljZXNEaXYuY2xhc3NMaXN0LmFkZCgnb3V0cHV0LW5vdGljZXMtLWZsb2F0aW5nJyk7XG4gIGNvbnN0IG5hdkJvdHRvbSA9IGdldE5hdkJvdHRvbSgpO1xuICBub3RpY2VzRGl2LnN0eWxlLnNldFByb3BlcnR5KCctLW5hdi1ib3R0b20nLCBgJHtuYXZCb3R0b219cHhgKTtcbiAgbm90aWNlc0Rpdi5zdHlsZS50b3AgPSBgJHtuYXZCb3R0b219cHhgO1xufVxuXG4vKipcbiAqIFJlLW1lYXN1cmUgYW5kIHJlLWFwcGx5IHRoZSBmbG9hdGluZyBvZmZzZXQgdG8gdGhlIG1haW4gbm90aWNlcyBjb250YWluZXIuIEF0dGFjaCB0b1xuICogcmVzaXplL3Njcm9sbCBzbyB0aGUgbm90aWNlIHRyYWNrcyB0aGUgc3RpY2t5IG5hdiBhcyBpdHMgaGVpZ2h0IGNoYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIHJlcG9zaXRpb25GbG9hdGluZ05vdGljZXMoKSB7XG4gIGNvbnN0IG5vdGljZXNEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbm90aWNlcy1tYWluLm91dHB1dC1ub3RpY2VzLS1mbG9hdGluZycpO1xuICBpZiAobm90aWNlc0Rpdikge1xuICAgIGFwcGx5RmxvYXRpbmdUcmVhdG1lbnQobm90aWNlc0Rpdik7XG4gIH1cbn1cblxuLyoqXG4gKiBXaXJlIHVwIHRoZSBmbG9hdGluZyB0cmVhdG1lbnQgZm9yIHRoZSBzZXJ2ZXItcmVuZGVyZWQgZmxhc2ggY29udGFpbmVyICgjbm90aWNlcy1tYWluKS5cbiAqXG4gKiBQaW5zIHRoZSBmbGFzaCBmaXhlZCBqdXN0IGJlbG93IHRoZSBzdGlja3kgbmF2IGFuZCBrZWVwcyBpdCBnbHVlZCB0aGVyZSBhcyB0aGUgbmF2J3NcbiAqIGhlaWdodCBjaGFuZ2VzLiBUaGlzIHVzZWQgdG8gbGl2ZSBpbmxpbmUgaW4gbm90aWNlcy9tYWluLmpzLCBidXQgbm8gcGFnZSBsb2FkcyB0aGF0XG4gKiBidW5kbGUg4oCUIHNvIHRoZSBwb3NpdGlvbmluZyBuZXZlciByYW4gYW5kIHNlcnZlciBmbGFzaGVzIHNhdCBoaWRkZW4gYXQgdG9wOjAgYmVoaW5kXG4gKiB0aGUgbWFzdGhlYWQuIEV4cG9ydGVkIHNvIGFwcC5qcyAobG9hZGVkIG9uIGV2ZXJ5IHBhZ2UpIGNhbiBjYWxsIGl0ICgjMzQ3NykuXG4gKlxuICogU2FmZSB0byBjYWxsIG9uIHBhZ2VzIHdpdGhvdXQgYSBmbGFzaCAocmV0dXJucyBlYXJseSkgYW5kIGd1YXJkZWQgYWdhaW5zdCBkb3VibGUtaW5pdCxcbiAqIHNvIGNhbGxpbmcgaXQgZnJvbSBib3RoIGFwcC5qcyBhbmQgbm90aWNlcy9tYWluLmpzIGlzIGhhcm1sZXNzLlxuICovXG5mdW5jdGlvbiBpbml0RmxvYXRpbmdOb3RpY2VzKCkge1xuICBjb25zdCBub3RpY2VFbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcign
219I25vdGljZXMtbWFpbicpO1xuICBpZiAoIW5vdGljZUVsZW0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBHdWFyZCBvbiB0aGUgZWxlbWVudCBpdHNlbGYgKG5vdCBtb2R1bGUgc2NvcGUpIOKAlCBhcHAuanMgYW5kIG5vdGljZXMvbWFpbi5qcyBhcmVcbiAgLy8gc2VwYXJhdGUgd2VicGFjayBidW5kbGVzLCBlYWNoIHdpdGggaXRzIG93biBjb3B5IG9mIHRoaXMgbW9kdWxlLlxuICBpZiAobm90aWNlRWxlbS5kYXRhc2V0LmZsb2F0aW5nSW5pdCA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG5vdGljZUVsZW0uZGF0YXNldC5mbG9hdGluZ0luaXQgPSAndHJ1ZSc7XG5cbiAgLy8gUGluIHRoZSBzZXJ2ZXItcmVuZGVyZWQgZmxhc2ggZml4ZWQganVzdCBiZWxvdyB0aGUgc3RpY2t5IG5hdiBzbyBpdCBtYXRjaGVzIHRoZSBhc3luY1xuICAvLyBub3RpY2UgdHJlYXRtZW50IGFuZCBzaG93cyBiZWxvdyB0aGUgbmF2IG9uIGxvYWQgd2l0aCBubyBzY3JvbGwganVtcCAoIzMwODkpLlxuICBhcHBseUZsb2F0aW5nVHJlYXRtZW50KG5vdGljZUVsZW0pO1xuXG4gIC8vIEtlZXAgdGhlIG5vdGljZSBnbHVlZCB0byB0aGUgc3RpY2t5IG5hdiBhcyBpdHMgaGVpZ2h0IGNoYW5nZXMgKG1vYmlsZSwgRm91bmRhdGlvbiBzdHVjay91bnN0dWNrKS5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlcG9zaXRpb25GbG9hdGluZ05vdGljZXMpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgcmVwb3NpdGlvbkZsb2F0aW5nTm90aWNlcywge3Bhc3NpdmU6IHRydWV9KTtcblxuICAvLyBGb3VuZGF0aW9uIHdyYXBzIHRoZSBuYXYgaW4gI3N0aWNreS13cmFwcGVyIGR1cmluZyBpdHMgT1dOIGluaXQsIHdoaWNoIGNhbiBydW4gYWZ0ZXIgdGhpc1xuICAvLyBydW5zIOKAlCBzbyB0aGUgbWVhc3VyZW1lbnQgYWJvdmUgY2FuIGJlIDAgYW5kIHBpbiB0aGUgbm90aWNlIGF0IHRvcDowIChiZWhpbmQgdGhlIGhlYWRlcilcbiAgLy8gdW50aWwgdGhlIGZpcnN0IHNjcm9sbC4gUmUtbWVhc3VyZSBvbmNlIGxheW91dCArIEZvdW5kYXRpb24gYXJlIHJlYWR5IHNvIHRoZSBub3RpY2Ugc2l0c1xuICAvLyBiZWxvdyB0aGUgbmF2IGV2ZW4gYmVmb3JlIGFueSBzY3JvbGwgKCMzNDUxKS4gSWYgdGhlIHBhZ2UgYWxyZWFkeSBmaW5pc2hlZCBsb2FkaW5nLFxuICAvLyByZS1tZWFzdXJlIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgYSBgbG9hZGAgZXZlbnQgdGhhdCB3aWxsIG5ldmVyIGZpcmUuXG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgcmVwb3NpdGlvbkZsb2F0aW5nTm90aWNlcygpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVwb3NpdGlvbkZsb2F0aW5nTm90aWNlcyk7XG4gIH1cblxuICAvLyBBdCB0aGUgdmVyeSB0b3Agb2YgYSBwYWdlIHRoZSBgbG9hZGAgZXZlbnQgbWF5IHN0aWxsIGZpcmUgYmVmb3JlIEZvdW5kYXRpb24gY29tcGxldGVzIGl0c1xuICAvLyBmaXJzdCBzdGlja3kgbGF5b3V0IHBhc3MsIGxlYXZpbmcgdGhlIGluaXRpYWwgbWVhc3VyZW1lbnQgc3RhbGUgKDApIGFuZCB0aGUgbm90aWNlIGhpZGRlblxuICAvLyBiZWhpbmQgdGhlIGhlYWRlciB1bnRpbCB0aGUgZmlyc3Qgc2Nyb2xsLiBBIGRvdWJsZSByQUYgZGVmZXJzIHRoZSByZS1tZWFzdXJlIHBhc3QgRm91bmRhdGlvbidzXG4gIC8vIGZpcnN0IGxheW91dCBmcmFtZSBzbyB0aGUgbm90aWNlIHNpdHMgYmVsb3cgdGhlIGdyZWVuIG5hdiBpbW1lZGlhdGVseSBhdCBwYWdlIHRvcCAoIzM0NjApLlxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlcG9zaXRpb25GbG9hdGluZ05vdGljZXMpKTtcblxuICAvLyBUcmFjayBGb3VuZGF0aW9uJ3Mgc3RpY2svdW5zdGljayB0cmFuc2l0aW9ucyBkaXJlY3RseSByYXRoZXIgdGhhbiByZWx5aW5nIG9uIHNjcm9sbFxuICAvLyBncmFudWxhcml0eSwgc28gdGhlIG5vdGljZSBzdGF5cyBwaW5uZWQganVzdCBiZWxvdyB0aGUgbmF2IHRoZSBtb21lbnQgaXQgYmVjb21lcy9zdG9wcyBiZWluZ1xuICAvLyBzdHVjay4gRm91bmRhdGlvbiBlbWl0cyB0aGVzZSBvbiB0aGUgd2luZG93IHZpYSBqUXVlcnksIHdoaWNoIGlzIGxvYWRlZCBzaXRlLXdpZGUgKCMzNDYwKS5cbiAgaWYgKHdpbmRvdy5qUXVlcnkpIHtcbiAgICB3aW5kb3cualF1ZXJ5KHdpbmRvdykub24oJ3N0aWNreS56Zi5zdHVja3RvOnRvcCBzdGlja3kuemYudW5zdHVja2Zyb206dG9wJywgcmVwb3NpdGlvbkZsb2F0aW5nTm90aWNlcyk7XG4gIH1cblxuICBjb25zdCBjbG9zZUJ1dHRvbiA9IG5vdGljZUVsZW0ucXVlcnlTZWxlY3RvcignLmNsb3NlLWJ1dHRvbicpO1xuICBpZiAoY2xvc2VCdXR0b24pIHtcbiAgICBjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTm90aWNlSGFuZGxlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgbm90aWNlIGFmdGVyIHNwZWNpZmllZCBzZWNvbmRzLlxuICogQHBhcmFtIHNlY29uZHNcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlTm90aWNlcyhzZWNvbmRzKSB7XG4gIGNvbnN0IGFwcFNldHRpbmdzRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPVwiYXBwLXNldHRpbmdzXCJdJyk7XG4gIGxldCBzaG91bGRGYWRlID0gZmFsc2U7XG5cbiAgaWYgKGFwcFNldHRpbmdzRWxlbWVudCkge1xuICAgIGNvbnN0IGFwcFNldHRpbmdzID0gSlNPTi5wYXJzZShhcHBTZXR0aW5nc0VsZW1lbnQuZGF0YXNldC5zZXR0aW5ncyB8fCAne30nKTtcbiAgICBzaG91bGRGYWRlID0gYXBwU2V0dGluZ3MuRkxBU0hfTk9USUNFX0ZBREVPVVQgPT09ICd0cnVlJztcbiAgfVxuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNub3RpY2VzLW1haW4gLmNhbGxvdXQubm90aWNlJykuZm9yRWFjaCgobm90aWNlKSA9PiB7XG4gICAgLy8gU3RpY2t5IG5vdGljZXMgKG1hcmtlZCBgLm5vdC1zZXRgKSBtdXN0IE5FVkVSIGF1dG8tZGlzbWlzcyDigJQgdGhleSBwZXJzaXN0IHVudGlsIHRoZVxuICAgIC8vIHVzZXIgZGlzbWlzc2VzIHRoZW0gdmlhIHRoZSBjbG9zZSBidXR0b24uIFRoaXMga2VlcHMgZmxhc2hlcyBzZXQganVzdCBiZWZvcmUgYSBzZXJ2ZXJcbiAgICAvLyByZWRpcmVjdCB2aXNpYmxlIG9uIHRoZSBsYW5kaW5nIHBhZ2UgaW5zdGVhZCBvZiB2YW5pc2hpbmcgYWZ0ZXIgfjVzICgjMzMzMykuXG4gICAgaWYgKG5vdGljZS5jbGFzc0xpc3QuY29udGFpbnMoJ25vdC1zZXQnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBub3RpY2UgaGFzIGEgY3VzdG9tIGR1cmF0aW9uLCB1c2UgdGhhdFxuICAgIGNvbnN0IHsgZGF0YXNldDogeyBkdXJhdGlvbiB9IH0gPSBub3RpY2U7XG4gICAgY29uc3QgdGltZW91dCA9IGR1cmF0aW9uID8/IDUwMDA7XG5cbiAgICBpZiAoc2hvdWxkRmFkZSkge1xuICAgICAgLy8gT3B0aW9uYWw6IGZhZGUgYmVmb3JlIHJlbW92YWxcbiAgICAgIG5vdGljZS5zdHlsZS50cmFuc2l0aW9uID0gYG9wYWNpdHkgJHtzZWNvbmRzfXMgZWFzZWA7XG4gICAgICBub3RpY2Uuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICB9XG5cbiAgICBzZXRUaW
2191lb3V0KCgpID0+IHtcbiAgICAgIG5vdGljZS5yZW1vdmUoKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGlzcGxheSBhIG1lc3NhZ2UgaW4gdGhlIG5vdGljZXMgZGl2LlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlXG4gKiBAcGFyYW0gdHlwZVxuICogQHBhcmFtIGlzU3RpY2t5XG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlOb3RpY2UobWVzc2FnZSwgdHlwZSwgaXNTdGlja3kgPSB0cnVlKSB7XG4gIGxldCBub3RpY2VfY2xhc3M7XG4gIHN3aXRjaCh0eXBlKSB7XG4gICAgY2FzZSAnd2FybmluZyc6XG4gICAgICBub3RpY2VfY2xhc3MgPSAnbm90aWNlLXdhcm5pbmcnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZXJyb3InOlxuICAgICAgbm90aWNlX2NsYXNzID0gJ25vdGljZS1lcnJvcidcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBub3RpY2VfY2xhc3MgPSAnbm90aWNlLWluZm8nO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBsZXQgbm90aWNlc0RpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub3RpY2VzLW1haW4nKSA/PyBmYWxzZTtcblxuICBpZighbm90aWNlc0Rpdikge1xuICAgIG5vdGljZXNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub3RpY2VzRGl2LmlkID0gJ25vdGljZXMtbWFpbic7XG4gICAgbm90aWNlc0Rpdi5jbGFzc0xpc3QudmFsdWUgPSAnb3V0cHV0LW5vdGljZXMnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm90aWNlc0Rpdik7XG4gIH1cblxuICAvLyBQaW4gdGhlIGNvbnRhaW5lciBmaXhlZCBqdXN0IGJlbG93IHRoZSBzdGlja3kgbmF2IOKAlCBzYW1lIHRyZWF0bWVudCBhcyBBc3luY05vdGljZVxuICAvLyBhbmQgdGhlIHNlcnZlciBmbGFzaCBwYXJ0aWFsLiBObyBzY3JvbGwganVtcCwgbm8gbGF5b3V0IHNoaWZ0LlxuICBhcHBseUZsb2F0aW5nVHJlYXRtZW50KG5vdGljZXNEaXYpO1xuXG4gIGNvbnN0IGlzRXJyb3IgPSBub3RpY2VfY2xhc3MgPT09ICdub3RpY2UtZXJyb3InO1xuICBub3RpY2VzRGl2LnNldEF0dHJpYnV0ZSgncm9sZScsIGlzRXJyb3IgPyAnYWxlcnQnIDogJ3N0YXR1cycpO1xuICBpZiAoIWlzRXJyb3IpIHtcbiAgICBub3RpY2VzRGl2LnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgJ3BvbGl0ZScpO1xuICB9XG5cbiAgbGV0IG5vdGljZSA9IG5vdGljZXNEaXYucXVlcnlTZWxlY3RvcignLm5vdGljZScpID8/IGZhbHNlO1xuICBpZihub3RpY2UpIHtcbiAgICBub3RpY2UucXVlcnlTZWxlY3Rvcignc3BhbicpLmlubmVyVGV4dCA9IG1lc3NhZ2U7XG4gICAgLy8gcmVtb3ZlIGNsYXNzZXNcbiAgICBub3RpY2UuY2xhc3NMaXN0LnJlbW92ZSguLi5ub3RpY2UuY2xhc3NMaXN0KTtcbiAgICBub3RpY2UuY2xhc3NMaXN0LmFkZCgnY2FsbG91dCcsICdub3RpY2UnKTtcbiAgICBpZihpc1N0aWNreSkge1xuICAgICAgICBub3RpY2UuY2xhc3NMaXN0LmFkZCgnbm90LXNldCcpO1xuICAgIH1cbiAgICBub3RpY2UuY2xhc3NMaXN0LmFkZChub3RpY2VfY2xhc3MpO1xuICB9IGVsc2Uge1xuICAgIGxldCBkaXYsIGJ1dHRvbiwgc3Bhbiwgc3BhbjI7XG5cbiAgICBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuY2xhc3NMaXN0LmFkZCgnY2FsbG91dCcsICdub3RpY2UnKTtcblxuICAgIGlmKGlzU3RpY2t5KSB7XG4gICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnbm90LXNldCcpO1xuICAgIH1cblxuICAgIGRpdi5jbGFzc0xpc3QuYWRkKG5vdGljZV9jbGFzcyk7XG4gICAgZGl2LnNldEF0dHJpYnV0ZSgnZGF0YS1jbG9zYWJsZScsICcnKTtcblxuICAgIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgc3Bhbi5hcHBlbmQobWVzc2FnZSk7XG4gICAgZGl2LmFwcGVuZChzcGFuKTtcblxuICAgIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdjbG9zZS1idXR0b24nKTtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0Rpc21pc3MgYWxlcnQnKTtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKCd0eXBlJywgJ2J1dHRvbicpO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2xvc2UnLCAnJyk7XG4gICAgLy8gUmVtb3ZlIFRISVMgbm90aWNlIGRpcmVjdGx5IOKAlCByZW1vdmVOb3RpY2VzKCkgbm93IHNraXBzIHN0aWNreSAoYC5ub3Qtc2V0YCkgbm90aWNlcyxcbiAgICAvLyBzbyB0aGUgY2xvc2UgYnV0dG9uIG11c3QgZGlzbWlzcyBpdHMgb3duIGVsZW1lbnQgcmF0aGVyIHRoYW4gZGVsZWdhdGUgKCMzMzMzKS5cbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IGRpdi5yZW1vdmUoKTsgfSk7XG5cbiAgICBzcGFuMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGFuMi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICBzcGFuMi5pbm5lckhUTUwgPSAnJnRpbWVzOyc7XG5cbiAgICBidXR0b24uYXBwZW5kKHNwYW4yKTtcbiAgICBkaXYuYXBwZW5kKGJ1dHRvbik7XG5cbiAgICBub3RpY2VzRGl2LmFwcGVuZChkaXYpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGNsb3NlTm90aWNlSGFuZGxlcixcbiAgZ2V0Q29va2llLFxuICBkaXNwbGF5Tm90aWNlLFxuICByZW1vdmVOb3RpY2VzLFxuICBnZXROYXZCb3R0b20sXG4gIGFwcGx5RmxvYXRpbmdUcmVhdG1lbnQsXG4gIHJlcG9zaXRpb25GbG9hdGluZ05vdGljZXMsXG4gIGluaXRGbG9hdGluZ05vdGljZXMsXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/notices/functions.js\n");
220
221/***/ }),
222
223/***/ "./resources/js/notices/notice.js":
224/*!****************************************!*\
225  !*** ./resources/js/notices/notice.js ***!
226  \****************************************/
227/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
228
229eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   AsyncNotice: () => (/* binding */ AsyncNotice)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/includes */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/set-timeout */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./functions */ \"./resources/js/notices/functions.js\");\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n\n\n\n\n\n\n\n\n/**\n * Send a notice to the main notices div from JS.\n *\n * The notice renders fixed just below the sticky nav (always in view, zero scroll jump) and\n * logs to the server logs when the notice is of type 'warning' or 'error' — 'info' and\n * 'success' notices are not server-logged since nothing went wrong. Requires an element on\n * the DOM with a data-log-url attribute with the full path to the page that handles the\n * async call ('[PATH_FETCH]/log-frontend-error.php')\n * @param message\n * @param type // 'info', 'warning', 'error', or 'success'\n * @param isSticky\n * @param duration\n * @param context\n * @param floating // deprecated (#3089): fixed-below-nav is now the only behavior; kept for call-site compatibility\n * @constructor\n */\nfunction AsyncNotice(message) {\n  var _context, _document$querySelect;\n  var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'info';\n  var isSticky = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  var duration = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 2;\n  var context = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n  var floating = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
229\n  // if the type entered is not valid, default to 'info' type\n  this.type = _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_2___default()(_context = ['info', 'warning', 'error', 'success']).call(_context, type) ? \"notice-\".concat(type) : 'notice-info';\n  this.message = message ? message : 'There was an error.';\n  this.sticky = isSticky;\n  this.duration = duration; // seconds\n  this.context = context;\n  this.floating = floating;\n  this.logUrl = (_document$querySelect = document.querySelector('[data-log-url]')) === null || _document$querySelect === void 0 || (_document$querySelect = _document$querySelect.dataset) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.logUrl;\n\n  // Set by create() to the container it rendered, so callers can decorate the exact\n  // notice they produced instead of guessing at a DOM query (#4216).\n  this.noticeElement = null;\n  this.create = /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee() {\n    var _document$querySelect2;\n    var logContext,\n      show,\n      noticesDiv,\n      _args = arguments;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context2) {\n      while (1) switch (_context2.prev = _context2.next) {\n        case 0:\n          logContext = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};\n          show = _args.length > 1 && _args[1] !== undefined ? _args[1] : true;\n          // The remove -> append swap is SYNCHRONOUS on purpose (#4216). Any await between\n          // removing the old container and appending the new one leaves the page with no\n          // #notices-main, so a notice raised inside that window sees none and builds a\n          // second one — which is exactly what the challenged log POST below used to do.\n          // Nothing depends on the old 50ms gap (#1151): positioning is applied at append\n          // time and no CSS transition runs on the container.\n          (_document$querySelect2 = document.querySelector('#notices-main')) === null || _document$querySelect2 === void 0 || _document$querySelect2.remove();\n          noticesDiv = this._createNotice();\n          this.noticeElement = noticesDiv;\n          if (show) {\n            // Fixed-below-nav is the single behavior (#3089): the notice floats over the top sliver\n            // of content just below the sticky nav — never scrolls the page, never shifts layout.\n            (0,_functions__WEBPACK_IMPORTED_MODULE_5__.applyFloatingTreatment)(noticesDiv);\n            this._applyAccessibility(noticesDiv);\n            document.body.appendChild(noticesDiv);\n          }\n\n          // send log to server logs only for notices that indicate an actual problem\n          // (checked against the normalized this.type, matching what is actually displayed)\n          if (!(this.type === 'notice-warning' || this.type === 'notice-error')) {\n            _context2.next = 9;\n            break;\n          }\n          _context2.next = 9;\n          return this.log(logContext);\n        case 9:\n        case \"end\":\n          return _context2.stop();\n      }\n    }, _callee, this);\n  }));\n\n  /**\n   * Apply ARIA live-region semantics so screen readers announce the notice without stealing focus.\n   * Errors are assertive (role=alert); info/warning are polite (role=status + aria-live=polite).\n   *\n   * @param {HTMLElement} noticesDiv\n   * @private\n   */\n  this._applyAccessibility = function (noticesDiv) {\n    if (this.type === 'notice-error') {\n      noticesDiv.setAttribute('role', 'alert');\n    } else {\n      noticesDiv.setAttribute('role', 'status');\n      noticesDiv.setAttribute('aria-live', 'polite');\n    }\n  };\n\n  /**\n   * Create a new notices div with a given message\n   * @returns {HTMLDivElement}\n   * @private\n   */\n  this._createNotice = function () {\n    var _this = this;\n    var noticesDiv, div, button, p, span;\n    noticesDiv = document.createElement('div');\n    noticesDiv.id = 'notices-main';\n    noticesDiv.classList.add('output-notices');\n    div = document.createElement('div');\n    div.id = 'notice';\n\n    // classes\n    div.classList.add('callout', 'notice', this.type);\n    if (this.sticky) {\n      div.classList.add('not-set');\n    }\n    div.setAttribute('data-closable', '');\n\n    // close button\n    button = document.createElement('button');\n    button.classList.add('close-button');\n    button.setAttribute('aria-label', 'Dismiss alert');\n    button.setAttribute('type', 'button');\n    button.setAttribute('data-close', '');\n    button.addEventListener('click', function (event) {\n      event.stopImmediatePropagation();\n      _this.remove(0);\n    });\n\n    // 'x' span\n    span = document.createElement('span');\n    span.setAttribute('aria-hidden', 'true');\n    span.innerHTML = '&times;';\n    button.append(span);\n    div.append(button);\n\n    // message paragraph\n    p = document.createElement('p');\n    p.append(this.message);\n    div.append(p);\n    noticesDiv.append(div);\n    return noticesDiv;\n  };\n\n  /**\n   * Remove the current notice from the DOM. Defaults to removing notice within 2 seconds, if no value is passed.\n   *\n   * @param seconds\n   */\n  this.remove = function () {\n    var seconds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n    // favor seconds param here; if null, use this.duration value, which has a default\n    var milliseconds = (seconds !== null && seconds !== void 0 ? seconds : this.duration) * 1000;\n    var noticesDiv = document.querySelector('#notices-main');\n    if (noticesDiv) {\n      noticesDiv.style.opacity = '1.0';\n      noticesDiv.style.transition = \"opacity \" + seconds + \"s ease\";\n      var fade = 'false';
229\n      var appSettings = document.getElementsByName('app-settings');\n      if (appSettings.length > 0) {\n        var _appSettings$FLASH_NO;\n        appSettings = JSON.parse(appSettings[0].dataset.settings);\n        fade = (_appSettings$FLASH_NO = appSettings.FLASH_NOTICE_FADEOUT) !== null && _appSettings$FLASH_NO !== void 0 ? _appSettings$FLASH_NO : fade;\n      }\n      if (fade === 'true') {\n        noticesDiv.style.opacity = '0';\n      }\n      _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_3___default()(function () {\n        noticesDiv.style.opacity = '1';\n        noticesDiv.remove();\n      }, milliseconds);\n    }\n  };\n\n  /**\n   * Log the notice to the server log. Gets root url for PHP target from `.content-section` element.\n   * If missing, simply logs to console.\n   *\n   * Automatically extracts page location context (bookId, contentId, etc.) to help replicate errors.\n   *\n   * @returns {Promise<void>}\n   * @param logContext\n   */\n  this.log = /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2() {\n    var logContext,\n      _context4,\n      _context3,\n      _message,\n      level,\n      currentInfoEl,\n      data,\n      result,\n      msg,\n      _args2 = arguments;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context5) {\n      while (1) switch (_context5.prev = _context5.next) {\n        case 0:\n          logContext = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};\n          if (!this.logUrl) {\n            _context5.next = 13;\n            break;\n          }\n          _context3 = logContext ? logContext : this.context;\n          _message = logContext !== null && logContext !== void 0 && logContext.error ? _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_4___default()(_context4 = \"\".concat(logContext.error.message, \" (\")).call(_context4, logContext.error.stack.toString(), \")\") : this.message; // Extract log level from the normalized this.type (removes 'notice-' prefix),\n          // matching what is actually displayed rather than the raw constructor argument\n          level = this.type.replace('notice-', ''); // Automatically extract current page location info for better error replication\n          try {\n            currentInfoEl = document.querySelector('.current-info');\n            if (currentInfoEl && currentInfoEl.dataset) {\n              _context3.currentInfo = {\n                bookId: currentInfoEl.dataset.bookId,\n                contentId: currentInfoEl.dataset.contentId,\n                sectionId: currentInfoEl.dataset.sectionId,\n                htmlContentId: currentInfoEl.dataset.htmlContentId\n              };\n            }\n          } catch (e) {\n            // Don't fail logging if we can't extract page info\n            console.warn('Could not extract page location info for error log', e);\n          }\n          data = {\n            message: _message,\n            context: _context3,\n            level: level\n          }; // notify:false — this POST is diagnostics, not user intent. Under an edge\n          // challenge it is challenged too, and a notice for it would be a notice\n          // about a notice (#4216). Detection and logging of the failure are unchanged.\n          _context5.next = 9;\n          return new _fetch_helpers__WEBPACK_IMPORTED_MODULE_6__[\"default\"]().fetchData('POST', this.logUrl, data, {\n            notify: false\n          });\n        case 9:\n          result = _context5.sent;\n          if (result && !result.success) {\n            msg = \"Could not log the following error:\\n\".concat(_message);\n            console.error(\"\".concat(msg));\n          }\n          _context5.next = 14;\n          break;\n        case 13:\n          console.error('Log url missing.');\n        case 14:\n        case \"end\":\n          return _context5.stop();\n      }\n    }, _callee2, this);\n  }));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbm90aWNlcy9ub3RpY2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
229BRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvbm90aWNlcy9ub3RpY2UuanM/NzQwMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcGx5RmxvYXRpbmdUcmVhdG1lbnR9IGZyb20gXCIuL2Z1bmN0aW9uc1wiO1xuaW1wb3J0IEZldGNoSGVscGVycyBmcm9tIFwiLi4vZmV0Y2gtaGVscGVyc1wiO1xuXG4vKipcbiAqIFNlbmQgYSBub3RpY2UgdG8gdGhlIG1haW4gbm90aWNlcyBkaXYgZnJvbSBKUy5cbiAqXG4gKiBUaGUgbm90aWNlIHJlbmRlcnMgZml4ZWQganVzdCBiZWxvdyB0aGUgc3RpY2t5IG5hdiAoYWx3YXlzIGluIHZpZXcsIHplcm8gc2Nyb2xsIGp1bXApIGFuZFxuICogbG9ncyB0byB0aGUgc2VydmVyIGxvZ3Mgd2hlbiB0aGUgbm90aWNlIGlzIG9mIHR5cGUgJ3dhcm5pbmcnIG9yICdlcnJvcicg4oCUICdpbmZvJyBhbmRcbiAqICdzdWNjZXNzJyBub3RpY2VzIGFyZSBub3Qgc2VydmVyLWxvZ2dlZCBzaW5jZSBub3RoaW5nIHdlbnQgd3JvbmcuIFJlcXVpcmVzIGFuIGVsZW1lbnQgb25cbiAqIHRoZSBET00gd2l0aCBhIGRhdGEtbG9nLXVybCBhdHRyaWJ1dGUgd2l0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBwYWdlIHRoYXQgaGFuZGxlcyB0aGVcbiAqIGFzeW5jIGNhbGwgKCdbUEFUSF9GRVRDSF0vbG9nLWZyb250ZW5kLWVycm9yLnBocCcpXG4gKiBAcGFyYW0gbWVzc2FnZVxuICogQHBhcmFtIHR5cGUgLy8gJ2luZm8nLCAnd2FybmluZycsICdlcnJvcicsIG9yICdzdWNjZXNzJ1xuICogQHBhcmFtIGlzU3RpY2t5XG4gKiBAcGFyYW0gZHVyYXRpb25cbiAqIEBwYXJhbSBjb250ZXh0XG4gKiBAcGFyYW0gZmxvYXRpbmcgLy8gZGVwcmVjYXRlZCAoIzMwODkpOiBmaXhlZC1iZWxvdy1uYXYgaXMgbm93IHRoZSBvbmx5IGJlaGF2aW9yOyBrZXB0IGZvciBjYWxsLXNpdGUgY29tcGF0aWJpbGl0eVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEFzeW5jTm90aWNlKG1lc3NhZ2UsIHR5cGUgPSAnaW5mbycsIGlzU3RpY2t5ID0gdHJ1ZSwgZHVyYXRpb24gPSAyLCBjb250ZXh0ID0gW10sIGZsb2F0aW5nID0gZmFsc2UpIHtcbiAgLy8gaWYgdGhlIHR5cGUgZW50ZXJlZCBpcyBub3QgdmFsaWQsIGRlZmF1bHQgdG8gJ2luZm8nIHR5cGVcbiAgdGhpcy50eXBlID0gKFsnaW5mbycsICd3YXJuaW5nJywgJ2Vycm9yJywgJ3N1Y2Nlc3MnXS5pbmNsdWRlcyh0eXBlKSkgPyBgbm90aWNlLSR7dHlwZX1gIDogJ25vdGljZS1pbmZvJztcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSA/IG1lc3NhZ2UgOiAnVGhlcmUgd2FzIGFuIGVycm9yLic7XG4gIHRoaXMuc3RpY2t5ID0gaXNTdGlja3k7XG4gIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjsgLy8gc2Vjb25kc1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLmZsb2F0aW5nID0gZmxvYXRpbmc7XG5cbiAgdGhpcy5sb2dVcmwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1sb2ctdXJsXScpPy5kYXRhc2V0Py5sb2dVcmw7XG5cbiAgLy8gU2V0IGJ5IGNyZWF0ZSgpIHRvIHRoZSBjb250YWluZXIgaXQgcmVuZGVyZWQsIHNvIGNhbGxlcnMgY2FuIGRlY29yYXRlIHRoZSBleGFjdFxuICAvLyBub3RpY2UgdGhleSBwcm9kdWNlZCBpbnN0ZWFkIG9mIGd1ZXNzaW5nIGF0IGEgRE9NIHF1ZXJ5ICgjNDIxNikuXG4gIHRoaXMubm90aWNlRWxlbWVudCA9IG51bGw7XG5cbiAgdGhpcy5jcmVhdGUgPSBhc3luYyBmdW5jdGlvbiAoIGxvZ0NvbnRleHQgPSB7fSwgc2hvdyA9IHRydWUpIHtcbiAgICAvLyBUaGUgcmVtb3ZlIC0+IGFwcGVuZCBzd2FwIGlzIFNZTkNIUk9OT1VTIG9uIHB1cnBvc2UgKCM0MjE2KS4gQW55IGF3YWl0IGJldHdlZW5cbiAgICAvLyByZW1vdmluZyB0aGUgb2xkIGNvbnRhaW5lciBhbmQgYXBwZW5kaW5nIHRoZSBuZXcgb25lIGxlYXZlcyB0aGUgcGFnZSB3aXRoIG5vXG4gICAgLy8gI25vdGljZXMtbWFpbiwgc28gYSBub3RpY2UgcmFpc2VkIGluc2lkZSB0aGF0IHdpbmRvdyBzZWVzIG5vbmUgYW5kIGJ1aWxkcyBhXG4gICAgLy8gc2Vjb25kIG9uZSDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSBjaGFsbGVuZ2VkIGxvZyBQT1NUIGJlbG93IHVzZWQgdG8gZG8uXG4gICAgLy8gTm90aGluZyBkZXBlbmRzIG9uIHRoZSBvbGQgNTBtcyBnYXAgKCMxMTUxKTogcG9zaXRpb25pbmcgaXMgYXBwbGllZCBhdCBhcHBlbmRcbiAgICAvLyB0aW1lIGFuZCBubyBDU1MgdHJhbnNpdGlvbiBydW5zIG9uIHRoZSBjb250YWluZXIuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25vdGljZXMtbWFpbicpPy5yZW1vdmUoKTtcblxuICAgIGNvbnN0IG5vdGljZXNEaXYgPSB0aGlzLl9jcmVhdGVOb3RpY2UoKTtcbiAgICB0aGlzLm5vdGljZUVsZW1lbnQgPSBub3RpY2VzRGl2O1xuXG4gICAgaWYgKHNob3cpIHtcbiAgICAgIC8vIEZpeGVkLWJlbG93LW5hdiBpcyB0aGUgc2luZ2xlIGJlaGF2aW9yICgjMzA4OSk6IHRoZSBub3RpY2UgZmxvYXRzIG92ZXIgdGhlIHRvcCBzbGl2ZXJcbiAgICAgIC8vIG9mIGNvbnRlbnQganVzdCBiZWxvdyB0aGUgc3RpY2t5IG5hdiDigJQgbmV2ZXIgc2Nyb2xscyB0aGUgcGFnZSwgbmV2ZXIgc2hpZnRzIGxheW91dC5cbiAgICAgIGFwcGx5RmxvYXRpbmdUcmVhdG1lbnQobm90aWNlc0Rpdik7XG4gICAgICB0aGlzLl9hcHBseUFjY2Vzc2liaWxpdHkobm90aWNlc0Rpdik7XG4gICAgICBkb2
229N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5vdGljZXNEaXYpO1xuICAgIH1cblxuICAgIC8vIHNlbmQgbG9nIHRvIHNlcnZlciBsb2dzIG9ubHkgZm9yIG5vdGljZXMgdGhhdCBpbmRpY2F0ZSBhbiBhY3R1YWwgcHJvYmxlbVxuICAgIC8vIChjaGVja2VkIGFnYWluc3QgdGhlIG5vcm1hbGl6ZWQgdGhpcy50eXBlLCBtYXRjaGluZyB3aGF0IGlzIGFjdHVhbGx5IGRpc3BsYXllZClcbiAgICBpZiAodGhpcy50eXBlID09PSAnbm90aWNlLXdhcm5pbmcnIHx8IHRoaXMudHlwZSA9PT0gJ25vdGljZS1lcnJvcicpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9nKGxvZ0NvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBBUklBIGxpdmUtcmVnaW9uIHNlbWFudGljcyBzbyBzY3JlZW4gcmVhZGVycyBhbm5vdW5jZSB0aGUgbm90aWNlIHdpdGhvdXQgc3RlYWxpbmcgZm9jdXMuXG4gICAqIEVycm9ycyBhcmUgYXNzZXJ0aXZlIChyb2xlPWFsZXJ0KTsgaW5mby93YXJuaW5nIGFyZSBwb2xpdGUgKHJvbGU9c3RhdHVzICsgYXJpYS1saXZlPXBvbGl0ZSkuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vdGljZXNEaXZcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRoaXMuX2FwcGx5QWNjZXNzaWJpbGl0eSA9IGZ1bmN0aW9uIChub3RpY2VzRGl2KSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ25vdGljZS1lcnJvcicpIHtcbiAgICAgIG5vdGljZXNEaXYuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vdGljZXNEaXYuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xuICAgICAgbm90aWNlc0Rpdi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdwb2xpdGUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IG5vdGljZXMgZGl2IHdpdGggYSBnaXZlbiBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtIVE1MRGl2RWxlbWVudH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRoaXMuX2NyZWF0ZU5vdGljZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgbm90aWNlc0RpdiwgZGl2LCBidXR0b24sIHAsIHNwYW47XG5cbiAgICBub3RpY2VzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbm90aWNlc0Rpdi5pZCA9ICdub3RpY2VzLW1haW4nO1xuICAgIG5vdGljZXNEaXYuY2xhc3NMaXN0LmFkZCgnb3V0cHV0LW5vdGljZXMnKTtcblxuICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5pZCA9ICdub3RpY2UnO1xuXG4gICAgLy8gY2xhc3Nlc1xuICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdjYWxsb3V0JywgJ25vdGljZScsIHRoaXMudHlwZSk7XG4gICAgaWYgKHRoaXMuc3RpY2t5KSB7XG4gICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnbm90LXNldCcpO1xuICAgIH1cblxuICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2xvc2FibGUnLCAnJyk7XG5cbiAgICAvLyBjbG9zZSBidXR0b25cbiAgICBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnY2xvc2UtYnV0dG9uJyk7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdEaXNtaXNzIGFsZXJ0Jyk7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWNsb3NlJywgJycpO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLnJlbW92ZSgwKTtcbiAgICB9KTtcblxuICAgIC8vICd4JyBzcGFuXG4gICAgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGFuLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIHNwYW4uaW5uZXJIVE1MID0gJyZ0aW1lczsnO1xuXG4gICAgYnV0dG9uLmFwcGVuZChzcGFuKTtcbiAgICBkaXYuYXBwZW5kKGJ1dHRvbik7XG5cbiAgICAvLyBtZXNzYWdlIHBhcmFncmFwaFxuICAgIHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgcC5hcHBlbmQodGhpcy5tZXNzYWdlKTtcbiAgICBkaXYuYXBwZW5kKHApO1xuXG4gICAgbm90aWNlc0Rpdi5hcHBlbmQoZGl2KTtcblxuICAgIHJldHVybiBub3RpY2VzRGl2O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgY3VycmVudCBub3RpY2UgZnJvbSB0aGUgRE9NLiBEZWZhdWx0cyB0byByZW1vdmluZyBub3RpY2Ugd2l0aGluIDIgc2Vjb25kcywgaWYgbm8gdmFsdWUgaXMgcGFzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vjb25kc1xuICAgKi9cbiAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbiAoc2Vjb25kcyA9IG51bGwpIHtcbiAgICAvLyBmYXZvciBzZWNvbmRzIHBhcmFtIGhlcmU7IGlmIG51bGwsIHVzZSB0aGlzLmR1cmF0aW9uIHZhbHVlLCB3aGljaCBoYXMgYSBkZWZhdWx0XG4gICAgbGV0IG1pbGxpc2Vjb25kcyA9IChzZWNvbmRzID8/IHRoaXMuZHVyYXRpb24pICogMTAwMDtcblxuICAgIGxldCBub3RpY2VzRGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI25vdGljZXMtbWFpbicpO1xuXG4gICAgaWYgKG5vdGljZXNEaXYpIHtcbiAgICAgIG5vdGljZXNEaXYuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xuICAgICAgbm90aWNlc0Rpdi5zdHlsZS50cmFuc2l0aW9uID0gXCJvcGFjaXR5IFwiICsgc2Vjb25kcyArIFwicyBlYXNlXCI7XG5cbiAgICAgIGxldCBmYWRlID0gJ2ZhbHNlJztcbiAgICAgIGxldCBhcHBTZXR0aW5ncyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdhcHAtc2V0dGluZ3MnKTtcbiAgICAgIGlmIChhcHBTZXR0aW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFwcFNldHRpbmdzID0gSlNPTi5wYXJzZShhcHBTZXR0aW5nc1swXS5kYXRhc2V0LnNldHRpbmdzKTtcbiAgICAgICAgZmFkZSA9IGFwcFNldHRpbmdzLkZMQVNIX05PVElDRV9GQURFT1VUID8/IGZhZGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmYWRlID09PSAndHJ1ZScpIHtcbiAgICAgICAgbm90aWNlc0Rpdi5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW
2291lb3V0KCgpID0+IHtcbiAgICAgICAgbm90aWNlc0Rpdi5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICBub3RpY2VzRGl2LnJlbW92ZSgpO1xuICAgICAgfSwgbWlsbGlzZWNvbmRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9nIHRoZSBub3RpY2UgdG8gdGhlIHNlcnZlciBsb2cuIEdldHMgcm9vdCB1cmwgZm9yIFBIUCB0YXJnZXQgZnJvbSBgLmNvbnRlbnQtc2VjdGlvbmAgZWxlbWVudC5cbiAgICogSWYgbWlzc2luZywgc2ltcGx5IGxvZ3MgdG8gY29uc29sZS5cbiAgICpcbiAgICogQXV0b21hdGljYWxseSBleHRyYWN0cyBwYWdlIGxvY2F0aW9uIGNvbnRleHQgKGJvb2tJZCwgY29udGVudElkLCBldGMuKSB0byBoZWxwIHJlcGxpY2F0ZSBlcnJvcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAcGFyYW0gbG9nQ29udGV4dFxuICAgKi9cbiAgdGhpcy5sb2cgPSBhc3luYyBmdW5jdGlvbiAobG9nQ29udGV4dCA9IHt9KSB7XG4gICAgaWYgKHRoaXMubG9nVXJsKSB7XG4gICAgICBsZXQgY29udGV4dCA9IGxvZ0NvbnRleHQgPyBsb2dDb250ZXh0IDogdGhpcy5jb250ZXh0O1xuICAgICAgbGV0IG1lc3NhZ2UgPSBsb2dDb250ZXh0Py5lcnJvciA/IGAke2xvZ0NvbnRleHQuZXJyb3IubWVzc2FnZX0gKCR7bG9nQ29udGV4dC5lcnJvci5zdGFjay50b1N0cmluZygpfSlgICA6IHRoaXMubWVzc2FnZTtcbiAgICAgIC8vIEV4dHJhY3QgbG9nIGxldmVsIGZyb20gdGhlIG5vcm1hbGl6ZWQgdGhpcy50eXBlIChyZW1vdmVzICdub3RpY2UtJyBwcmVmaXgpLFxuICAgICAgLy8gbWF0Y2hpbmcgd2hhdCBpcyBhY3R1YWxseSBkaXNwbGF5ZWQgcmF0aGVyIHRoYW4gdGhlIHJhdyBjb25zdHJ1Y3RvciBhcmd1bWVudFxuICAgICAgbGV0IGxldmVsID0gdGhpcy50eXBlLnJlcGxhY2UoJ25vdGljZS0nLCAnJyk7XG5cbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZXh0cmFjdCBjdXJyZW50IHBhZ2UgbG9jYXRpb24gaW5mbyBmb3IgYmV0dGVyIGVycm9yIHJlcGxpY2F0aW9uXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjdXJyZW50SW5mb0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmN1cnJlbnQtaW5mbycpO1xuICAgICAgICBpZiAoY3VycmVudEluZm9FbCAmJiBjdXJyZW50SW5mb0VsLmRhdGFzZXQpIHtcbiAgICAgICAgICBjb250ZXh0LmN1cnJlbnRJbmZvID0ge1xuICAgICAgICAgICAgYm9va0lkOiBjdXJyZW50SW5mb0VsLmRhdGFzZXQuYm9va0lkLFxuICAgICAgICAgICAgY29udGVudElkOiBjdXJyZW50SW5mb0VsLmRhdGFzZXQuY29udGVudElkLFxuICAgICAgICAgICAgc2VjdGlvbklkOiBjdXJyZW50SW5mb0VsLmRhdGFzZXQuc2VjdGlvbklkLFxuICAgICAgICAgICAgaHRtbENvbnRlbnRJZDogY3VycmVudEluZm9FbC5kYXRhc2V0Lmh0bWxDb250ZW50SWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBEb24ndCBmYWlsIGxvZ2dpbmcgaWYgd2UgY2FuJ3QgZXh0cmFjdCBwYWdlIGluZm9cbiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZXh0cmFjdCBwYWdlIGxvY2F0aW9uIGluZm8gZm9yIGVycm9yIGxvZycsIGUpO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YSA9IHsgbWVzc2FnZSwgY29udGV4dCwgbGV2ZWwgfTtcbiAgICAgIC8vIG5vdGlmeTpmYWxzZSDigJQgdGhpcyBQT1NUIGlzIGRpYWdub3N0aWNzLCBub3QgdXNlciBpbnRlbnQuIFVuZGVyIGFuIGVkZ2VcbiAgICAgIC8vIGNoYWxsZW5nZSBpdCBpcyBjaGFsbGVuZ2VkIHRvbywgYW5kIGEgbm90aWNlIGZvciBpdCB3b3VsZCBiZSBhIG5vdGljZVxuICAgICAgLy8gYWJvdXQgYSBub3RpY2UgKCM0MjE2KS4gRGV0ZWN0aW9uIGFuZCBsb2dnaW5nIG9mIHRoZSBmYWlsdXJlIGFyZSB1bmNoYW5nZWQuXG4gICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbmV3IEZldGNoSGVscGVycygpLmZldGNoRGF0YSgnUE9TVCcsIHRoaXMubG9nVXJsLCBkYXRhLCB7bm90aWZ5OiBmYWxzZX0pO1xuXG4gICAgICBpZiAocmVzdWx0ICYmICFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBsZXQgbXNnID0gYENvdWxkIG5vdCBsb2cgdGhlIGZvbGxvd2luZyBlcnJvcjpcXG4ke21lc3NhZ2V9YDtcbiAgICAgICAgY29uc29sZS5lcnJvcihgJHttc2d9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xvZyB1cmwgbWlzc2luZy4nKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHtBc3luY05vdGljZX07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/notices/notice.js\n");
230
231/***/ }),
232
233/***/ "./resources/js/pagination.js":
234/*!************************************!*\
235  !*** ./resources/js/pagination.js ***!
236  \************************************/
237/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
238
239eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   addPaginationNavigationHandlers: () => (/* binding */ addPaginationNavigationHandlers),\n/* harmony export */   itemsPerPageHandler: () => (/* binding */ itemsPerPageHandler),\n/* harmony export */   paginationHandler: () => (/* binding */ paginationHandler),\n/* harmony export */   setCollectionOptions: () => (/* binding */ setCollectionOptions)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/set */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/set.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/parse-int */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_url_search_params__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/url-search-params */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/url-search-params.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_url_search_params__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_url_search_params__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/json/stringify */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _account_annotations__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./account/annotations */ \"./resources/js/account/annotations.js\");\n/* harmony import */ var _notices_functions__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./notices/functions */ \"./resources/js/notices/functions.js\");\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _spinner__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./spinner */ \"./resources/js/spinner.js\");\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _account_last_locations__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./account/last-locations */ \"./resources/js/account/last-locations.js\");\n/* harmony import */ var _utilities_general__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./utilities/general */ \"./resources/js/utilities/general.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Paginator names with a collection request in flight.\n *\n * #4480: the Spinner shown over the pagination nav is decorative - the page\
239n * numbers stay clickable, so without this guard a reader can queue several\n * fetches. On the Annotations page every fetch re-resolves highlight text for a\n * whole page of marks, which is the expensive operation the pagination exists to\n * bound, and the late responses can repaint the grid with a page the reader has\n * already left.\n */\nvar paginatorsInFlight = new (_babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_2___default())();\nvar BLOCKED_CONTROL_OPACITY = '0.5';\n\n/**\n * The controls a reader can use to start another collection request.\n *\n * @param {string} paginatorName\n * @returns {{nav: HTMLElement|null, list: HTMLElement|null, itemsPerPage: HTMLElement|null}}\n */\nfunction paginationControlElements(paginatorName) {\n  var nav = document.querySelector(\"nav#\".concat(paginatorName, \"-nav\"));\n  return {\n    nav: nav,\n    // The Spinner box is inserted as a child of the nav, so the dimming goes on\n    // the list of page numbers - dimming the nav would dim the spinner too.\n    list: nav ? nav.querySelector('ul.pagination') : null,\n    itemsPerPage: document.querySelector(\"#\".concat(paginatorName, \"-items-per-page\"))\n  };\n}\n\n/**\n * Take the paginator's controls out of service for the duration of a request.\n *\n * `pointer-events` stops the mouse, `tabindex`/`aria-disabled` stop the keyboard\n * and tell a screen reader the same thing the dimming tells a sighted reader.\n *\n * @param {string} paginatorName\n */\nfunction blockPaginationControls(paginatorName) {\n  paginatorsInFlight.add(paginatorName);\n  var _paginationControlEle = paginationControlElements(paginatorName),\n    nav = _paginationControlEle.nav,\n    list = _paginationControlEle.list,\n    itemsPerPage = _paginationControlEle.itemsPerPage;\n  if (nav) {\n    var _context;\n    nav.setAttribute('aria-disabled', 'true');\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(_context = nav.querySelectorAll('a[data-page-number]')).call(_context, function (link) {\n      link.setAttribute('tabindex', '-1');\n      link.setAttribute('aria-disabled', 'true');\n    });\n  }\n  if (list) {\n    list.style.pointerEvents = 'none';\n    list.style.opacity = BLOCKED_CONTROL_OPACITY;\n  }\n  if (itemsPerPage) {\n    itemsPerPage.style.pointerEvents = 'none';\n    itemsPerPage.setAttribute('aria-disabled', 'true');\n  }\n}\n\n/**\n * Put the paginator's controls back in service.\n *\n * Elements are looked up again rather than cached: a successful update replaces\n * the nav with freshly rendered markup, so the element blocked at the start of\n * the request is no longer in the document.\n *\n * @param {string} paginatorName\n */\nfunction releasePaginationControls(paginatorName) {\n  paginatorsInFlight[\"delete\"](paginatorName);\n  var _paginationControlEle2 = paginationControlElements(paginatorName),\n    nav = _paginationControlEle2.nav,\n    list = _paginationControlEle2.list,\n    itemsPerPage = _paginationControlEle2.itemsPerPage;\n  if (nav) {\n    var _context2;\n    nav.removeAttribute('aria-disabled');\n    _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_3___default()(_context2 = nav.querySelectorAll('a[data-page-number]')).call(_context2, function (link) {\n      link.removeAttribute('tabindex');\n      link.removeAttribute('aria-disabled');\n    });\n  }\n  if (list) {\n    list.style.pointerEvents = '';\n    list.style.opacity = '';\n  }\n  if (itemsPerPage) {\n    itemsPerPage.style.pointerEvents = '';\n    itemsPerPage.removeAttribute('aria-disabled');\n  }\n}\n\n/**\n * The paginator for tables has an Items Per Page dropdown selector that can be used\n * to let the user change the number of items displayed on the table.\n * The following event handler is added if the select.items_per_page element is found on the page\n * The dropdown can be found in /src/Models/Pagination::renderItemsPerPage()\n */\n\n/**\n * Event handler for the \"Items per Page\" select on top of a table\n * @param event\n * @param options\n * @returns {Promise<void>}\n */\nfunction itemsPerPageHandler(_x, _x2) {\n  return _itemsPerPageHandler.apply(this, arguments);\n}\n/**\n * Handles pagination event and updates the collection based on the selected page number.\n *\n * @param {Event} event - The event object representing the pagination event.\n * @returns {Promise<void>} - A Promise that resolves once the collection is updated.\n */\nfunction _itemsPerPageHandler() {\n  _itemsPerPageHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2(event, options) {\n    var refreshUrl, _options$collection, paginatorName, paginationControlsSelector, sortByElem, sort, data, useTableOverlay, c
239ollectionOverlayTarget, result, _context4, msg, notice;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context5) {\n      while (1) switch (_context5.prev = _context5.next) {\n        case 0:\n          event.preventDefault();\n          _context5.prev = 1;\n          refreshUrl = event.target.dataset.refreshUrl; // const paginatorName = event.target.dataset.paginatorName;\n          // const paginationControlsSelector = `nav#${paginatorName}-nav`;\n          _options$collection = options.collection, paginatorName = _options$collection.paginatorName, paginationControlsSelector = _options$collection.paginationControlsSelector;\n          sortByElem = document.querySelector('#sort-by');\n          sort = 'date-desc';\n          if (sortByElem) {\n            sort = sortByElem.value;\n            options.collection.sort = sort;\n          }\n          options.collection.paginatorName = paginatorName;\n          options.collection.paginationControlsSelector = paginationControlsSelector;\n          options.collection.itemsPerPage = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_4___default()(event.target.value);\n          options.spinner.name = \"\".concat(paginatorName, \"-paginator\");\n\n          // passing 'currentPage' as '1' so if you change the page size, you are back at the first page\n          // TODO: we could do the math to calculate how to adjust current page on an items-per-page change...\n          data = {\n            options: options,\n            currentPage: '1'\n          }; // Continue Reading (#3582, #3593): also block clicks on the pins/\n          // checkboxes/pagination in the table while the request is in flight,\n          // using the same blocking overlay already proven on the Annotations\n          // batch-edit actions, scoped to this paginator only. The Show control\n          // itself keeps its original, decorative Spinner-class treatment\n          // (handleCollectionUpdate below, anchored to the select via\n          // options.spinner) - that box is opaque and absolutely positioned on\n          // top of the select, so it already blocks clicks/reopening the\n          // dropdown without any extra overlay or CSS (confirmed in a real\n          // browser).\n          useTableOverlay = paginatorName === 'last-locations';\n          collectionOverlayTarget = useTableOverlay ? document.querySelector('[data-collection]') : null;\n          if (useTableOverlay) {\n            (0,_utilities_general__WEBPACK_IMPORTED_MODULE_14__.insertOverlayOnElement)(collectionOverlayTarget, 'last-locations-table-overlay', true);\n          }\n          _context5.prev = 15;\n          _context5.next = 18;\n          return handleCollectionUpdate(refreshUrl, data);\n        case 18:\n          result = _context5.sent;\n        case 19:\n          _context5.prev = 19;\n          if (useTableOverlay) {\n            (0,_utilities_general__WEBPACK_IMPORTED_MODULE_14__.removeOverlayOnElement)('last-locations-table-overlay');\n          }\n          return _context5.finish(19);\n        case 22:\n          _context5.next = 32;\n          break;\n        case 24:\n          _context5.prev = 24;\n          _context5.t0 = _context5[\"catch\"](1);\n          console.error(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_5___default()(_context4 = \"Error: \".concat(_context5.t0.message, \" on \")).call(_context4, _context5.t0.lineNumber));\n          msg = 'There was an error and the collection could not be updated.';\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_12__.AsyncNotice(msg, 'error');\n          _context5.next = 31;\n          return notice.create({}, true);\n        case 31:\n          notice.remove();\n        case 32:\n        case \"end\":\n          return _context5.stop();\n      }\n    }, _callee2, null, [[1, 24], [15,, 19, 22]]);\n  }));\n  return _itemsPerPageHandler.apply(this, arguments);\n}\nfunction paginationHandler(_x3) {\n  return _paginationHandler.apply(this, arguments);\n}\n/**\n * Process the change of collection items.\n *\n * @param url\n * @param data\n * @returns {Promise<{success: boolean}>}\n */\nfunction _paginationHandler() {\n  _paginationHandler = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee3(event) {\n    var anchor, navElem, _options$collection$i, paginatorName, paginationControlsSelector, itemsPerPageElem, collectionElem, refreshUrl, pageNumber, options, data, _context6, msg, notice;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee3$(_context7) {\n      while (1) switch (_context7.prev = _context7.next) {\n        case 0:\n          event.preventDefault();\n          anchor = event.target.closest('a[data-page-number]');\n          if (anchor) {\n            _context7.next = 4;\n            break;\n          }\n          return _context7.abrupt(\"return\");\n        case 4:\n          // click on disabled <li>, current-page <li>, or icon outside <a>\n          navElem = event.target.closest('nav');\n          if (!navElem) {\n            _context7.next = 34;\n            break;\n          }\n          _context7.prev = 6;\n          paginatorName = navElem.dataset.paginatorName;\n          paginationControlsSelector = \"nav#\".concat(paginatorName, \"-nav\");\n          itemsPerPageElem = document.querySelector(\"#\".concat(paginatorName, \"-items-per-page\"));\n          collectionElem = document.querySelector(\"#\".concat(paginatorName, \"-collection\"));\n          if (collectionElem) {\n            _context7.next = 13;\n            break;\n          }\n          return _context7.abrupt(\"return\");\n        case 13:\n          // collection element not in DOM\n          refreshUrl = collectionElem.dataset.refreshUrl;\n          pageNumber = anchor.dataset.pageNumber; // dataset.options is set by PHP on first load; fall back to building a minimal\n          // options object from the current DOM state if it is absent or empty\n          if (collectionElem.dataset.options) {\n            options = JSON.parse(collectionElem.dataset.options);\n          } else {\n            options = {\n              collection: {\n                paginatorName: paginatorName,\n                paginationControlsSelector: paginationControlsSelector,\n                itemsPerPage: itemsPerPageElem ? itemsPerPageElem.value : 10,\n                currentPage: pageNumber,\n                style: 'table'\n              },\n              spinner: {}\n            };\n          }\n          options.collection.currentPage = pageNumber;\n          options.collection.itemsPerPage = itemsPerPageElem ? itemsPerPageElem.value : (_options$collection$i = options.collection.itemsPerPage) !== null && _options$collection$i !== void 0 ? _options$collection$i : 10;\n          options.collection.paginationControlsSelector = \"\".concat(paginationControlsSelector);\n          options.collection.paginatorName = paginatorName;\n          options.spinner = {\n            name: \"\".concat(paginatorName, \"-spinner\"),\n            targetSelector: \"\".concat(paginationControlsSelector),\n            insertPosition: 'afterbegin',\n            withWrapper: false\n          };\n          data = {\n            options: options\n          };\n          _context7.next = 24;\n          return handleCollectionUpdate(refreshUrl, data);\n        case 24:\n          _context7.next = 34;\n          break;\n        case 26:\n          _context7.prev = 26;\n          _context7.t0 = _context7[\"catch\"](6);\n          console.error(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_5___default()(_context6 = \"Error: \".concat(_context7.t0.message, \" on \")).call(_context6, _context7.t0.lineNumber));\n          msg = 'There was an error and the collection could not be updated.';\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_12__.AsyncNotice(msg, 'error');\n          _context7.next = 33;\n          return notice.create({}, true);\n        case 33:\n          notice.remove();\n        case 34:\n        case \"end\":\n          return _context7.stop();\n      }\n    }, _callee3, null, [[6, 26]]);\n  }));\n  return _paginationHandler.apply(this, arguments);\n}\nfunction handleCollectionUpdate(_x4, _x5) {\n  return _handleCollectionUpdate.apply(this, arguments);\n}\n/**\n * Simple error handling with message.\n *\n * @param msg\n */\nfunction _handleCollectionUpdate() {\n  _handleCollectionUpdate = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee4(url, data) {\n    var options, _options$collection2, paginationControlsSelector, paginatorName, spinnerOptions, name, targetSelector, _spinnerOptions$inser, insertPosition, _spinnerOptions$withW, withWrapper, spinner, collectionElement, paginationControls, itemsElem, updateContent, result, _result$rows, _result$collection, notice, content_present, msg, params, _msg, totalsSpan, newNav, _msg2, _msg3;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee4$(_context8) {\n      while (1) switch (_context8.prev = _context8.next) {\n        case 0:\n          options = data.options;\n          _options$collection2 = options.collection, paginationControlsSelector = _options$collection2.paginationControlsSelector, paginatorName = _options$collection2.paginatorName, spinnerOptions = options.spinner;\n          name = spinnerOptions.name, targetSelector = spinnerOptions.targetSelector, _spinnerOptions$inser = spinnerOptions.insertPosition, insertPosition = _spinnerOptions$inser === void 0 ? 'afterend' : _spinnerOptions$inser, _spinnerOptions$withW = spinnerOptions.withWrapper, withWrapper = _spinnerOptions$withW === void 0 ? false : _spinnerOptions$withW; // #4480: belt and braces with the blocked controls below - this guard still\n          // holds if the CSS is ever removed, or if a request is started from code\n          // rather than from a click.\n          if (!paginatorsInFlight.has(p
239aginatorName)) {\n            _context8.next = 5;\n            break;\n          }\n          return _context8.abrupt(\"return\", {\n            success: false,\n            ignored: true\n          });\n        case 5:\n          spinner = new _spinner__WEBPACK_IMPORTED_MODULE_11__.Spinner(name, targetSelector, insertPosition, withWrapper);\n          blockPaginationControls(paginatorName);\n          _context8.prev = 7;\n          collectionElement = document.querySelector('[data-paginated-collection]');\n          paginationControls = document.querySelector(\"\".concat(paginationControlsSelector));\n          itemsElem = document.querySelector(\"#\".concat(paginatorName, \"-items-per-page\"));\n          updateContent = false; // add spinner\n          spinner.add();\n\n          // #3595: the Spinner box is a DOM sibling of the <select>, but its CSS\n          // positions it relative to the nearest positioned ancestor (the\n          // `.per-page-wrapper`, which also contains the \"Show:\" label) - not the\n          // select itself. If that wrapper is wider than the select, the\n          // fixed-width box drifts away from (or extends past) the control it's\n          // meant to cover. Pin it to the select's own rect so it always covers\n          // exactly the dropdown, regardless of the wrapper's width.\n          if (itemsElem && targetSelector === \"#\".concat(paginatorName, \"-items-per-page\")) {\n            (0,_utilities_general__WEBPACK_IMPORTED_MODULE_14__.pinSpinnerOverElement)(name, itemsElem);\n          }\n\n          // fetch & handle updated collection\n          _context8.next = 16;\n          return new _fetch_helpers__WEBPACK_IMPORTED_MODULE_10__[\"default\"]().fetchData('POST', url, data);\n        case 16:\n          result = _context8.sent;\n          if (!result.success) {\n            _context8.next = 60;\n            break;\n          }\n          // remove any previous notices, if any\n          notice = document.querySelector('#notices-main');\n          if (notice) {\n            notice.remove();\n          }\n\n          // check that we have content to update collection\n          content_present = options.collection.style === 'table' && ((_result$rows = result.rows) !== null && _result$rows !== void 0 ? _result$rows : '').length > 0 || ((_result$collection = result.collection) !== null && _result$collection !== void 0 ? _result$collection : '').length > 0;\n          if (!content_present) {\n            _context8.next = 25;\n            break;\n          }\n          updateContent = true;\n          _context8.next = 28;\n          break;\n        case 25:\n          msg = 'There was an error updating the collection';\n          _context8.next = 28;\n          return sendErrorNotices(msg);\n        case 28:\n          if (!updateContent) {\n            _context8.next = 58;\n            break;\n          }\n          // set the page param to '1' on url\n          params = new (_babel_runtime_corejs3_core_js_stable_url_search_params__WEBPACK_IMPORTED_MODULE_6___default())(location.search); // params.delete('page'); // no need to pass page number\n          // params.append('page', options.collection.currentPage);\n          // window.history.replaceState({}, '', `${location.pathname}?${params}`);\n          window.history.replaceState({}, '', \"\".concat(location.pathname));\n\n          // update collection element with new rows\n          if (options.collection.style === 'table') {\n            // replace table rows\n            if (result.rows) {\n              collectionElement.tBodies[0].innerHTML = result.rows;\n            } else {\n              // replace collection html\n              collectionElement.insertAdjacentHTML('beforebegin', result.collection);\n              collectionElement.remove();\n            }\n          } else {\n            // replace collection html\n            collectionElement.insertAdjacentHTML('beforebegin', result.collection);\n            collectionElement.remove();\n          }\n\n          // update itemsPerPage\n          if (!itemsElem) {\n            _context8.next = 36;\n            break;\n          }\n          itemsElem.value = result.itemsPerPage;\n          _context8.next = 39;\n          break;\n        case 36:\n          _msg = 'There was an error updating the collection.';\n          _context8.next = 39;\n          return sendErrorNotices(_msg);\n        case 39:\n          // update totals\n          totalsSpan = document.querySelector('.annotation-items');
239\n          if (totalsSpan) {\n            totalsSpan.innerHTML = result['total'];\n          }\n\n          // update navigation controls\n          newNav = document.createRange().createContextualFragment(result.nav);\n          if (!newNav) {\n            _context8.next = 48;\n            break;\n          }\n          paginationControls.replaceWith(newNav);\n          _context8.next = 46;\n          return addPaginationNavigationHandlers(paginatorName);\n        case 46:\n          _context8.next = 51;\n          break;\n        case 48:\n          _msg2 = 'There was an error updating pagination controls.';\n          _context8.next = 51;\n          return sendErrorNotices(_msg2);\n        case 51:\n          // update options data attribute\n          collectionElement.dataset.options = result.options;\n          _context8.next = 54;\n          return (0,_account_annotations__WEBPACK_IMPORTED_MODULE_8__.addAnnotationsActionHandlers)();\n        case 54:\n          if (paginatorName === 'last-locations') {\n            (0,_account_last_locations__WEBPACK_IMPORTED_MODULE_13__.addPinEventHandlers)();\n          }\n\n          // update collection wrapper\n          collectionElement.dataset.options = _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_7___default()(options);\n\n          // re-init foundation\n          jQuery(document).foundation();\n\n          // Notify interested controllers (e.g. the Continue Reading bulk-delete\n          // controller) that the collection was repainted so they can re-apply\n          // their own DOM to the fresh rows (#3153).\n          collectionElement.dispatchEvent(new CustomEvent('collection:repainted', {\n            bubbles: true,\n            detail: {\n              paginatorName: paginatorName\n            }\n          }));\n        case 58:\n          _context8.next = 63;\n          break;\n        case 60:\n          _msg3 = 'There was an error updating the collection.';\n          _context8.next = 63;\n          return sendErrorNotices(_msg3);\n        case 63:\n          _context8.next = 70;\n          break;\n        case 65:\n          _context8.prev = 65;\n          _context8.t0 = _context8[\"catch\"](7);\n          _context8.next = 69;\n          return sendErrorNotices(_context8.t0.message);\n        case 69:\n          return _context8.abrupt(\"return\", {\n            success: false\n          });\n        case 70:\n          _context8.prev = 70;\n          // #4480: a failed request must not strand the paginator disabled, and the\n          // spinner used to be left behind on the error path (its removal was\n          // commented out) - the same failure mode as #4402.\n          spinner.remove();\n          releasePaginationControls(paginatorName);\n          return _context8.finish(70);\n        case 74:\n          return _context8.abrupt(\"return\", {\n            success: true\n          });\n        case 75:\n        case \"end\":\n          return _context8.stop();\n      }\n    }, _callee4, null, [[7, 65, 70, 74]]);\n  }));\n  return _handleCollectionUpdate.apply(this, arguments);\n}\nfunction sendErrorNotices(_x6) {\n  return _sendErrorNotices.apply(this, arguments);\n}\n/**\n * Add collection-related options to the options object.\n *\n * @param options\n * @param paginatorName\n * @param hasPins\n * @param isEditable\n * @returns {*}\n */\nfunction _sendErrorNotices() {\n  _sendErrorNotices = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee5(msg) {\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee5$(_context9) {\n      while (1) switch (_context9.prev = _context9.next) {\n        case 0:\n          _context9.next = 2;\n          return (0,_notices_functions__WEBPACK_IMPORTED_MODULE_9__.displayNotice)(msg, 'error');\n        case 2:\n          console.error(msg);\n        case 3:\n        case \"end\":\n          return _context9.stop();\n      }\n    }, _callee5);\n  }));\n  return _sendErrorNotices.apply(this, arguments);\n}\nfunction setCollectionOptions(options, paginatorName) {\n  var hasPins = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n  var isEditable = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n  var newOptions = structuredClone(options);\n  newOptions.collection.paginatorName = paginatorName;\n  newOptions.collection.hasPins = hasPins;\n  newOptions.collection.isEditable = isEditable;\n  return newOptions;\n}\n\n/**\n * Adds event handlers to pagination links.\n *\n * @function addPaginationNavigationHandlers\n */\nfunction addPaginationNavigationHandlers(paginatorName) {\n  var nav = document.querySelector(\"nav[data-
239paginator-name=\\\"\".concat(paginatorName, \"\\\"]\"));\n  if (!nav) return;\n  nav.addEventListener('click', /*#__PURE__*/function () {\n    var _ref = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee(event) {\n      return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context3) {\n        while (1) switch (_context3.prev = _context3.next) {\n          case 0:\n            _context3.next = 2;\n            return paginationHandler(event);\n          case 2:\n          case \"end\":\n            return _context3.stop();\n        }\n      }, _callee);\n    }));\n    return function (_x7) {\n      return _ref.apply(this, arguments);\n    };\n  }());\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvcGFnaW5hdGlvbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBTUE7QUFBQTtBQTREQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBNURBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFRQTtBQUFBO0FBNERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFBQTtBQTVEQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFTQTtBQUFBO0FBa0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUFBO0FBbEpBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBRUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBT0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBQUE7QUFMQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFXQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0F
239BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvcGFnaW5hdGlvbi5qcz9hODVlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YWRkQW5ub3RhdGlvbnNBY3Rpb25IYW5kbGVycyB9IGZyb20gXCIuL2FjY291bnQvYW5ub3RhdGlvbnNcIjtcbmltcG9ydCB7ZGlzcGxheU5vdGljZX0gZnJvbSBcIi4vbm90aWNlcy9mdW5jdGlvbnNcIjtcbmltcG9ydCBGZXRjaEhlbHBlcnMgZnJvbSBcIi4vZmV0Y2gtaGVscGVyc1wiO1xuaW1wb3J0IHtTcGlubmVyfSBmcm9tIFwiLi9zcGlubmVyXCI7XG5pbXBvcnQge0FzeW5jTm90aWNlfSBmcm9tIFwiLi9ub3RpY2VzL25vdGljZVwiO1xuaW1wb3J0IHthZGRQaW5FdmVudEhhbmRsZXJzfSBmcm9tIFwiLi9hY2NvdW50L2xhc3QtbG9jYXRpb25zXCI7XG5pbXBvcnQge2luc2VydE92ZXJsYXlPbkVsZW1lbnQsIHJlbW92ZU92ZXJsYXlPbkVsZW1lbnQsIHBpblNwaW5uZXJPdmVyRWxlbWVudH0gZnJvbSBcIi4vdXRpbGl0aWVzL2dlbmVyYWxcIjtcblxuLyoqXG4gKiBQYWdpbmF0b3IgbmFtZXMgd2l0aCBhIGNvbGxlY3Rpb24gcmVxdWVzdCBpbiBmbGlnaHQuXG4gKlxuICogIzQ0ODA6IHRoZSBTcGlubmVyIHNob3duIG92ZXIgdGhlIHBhZ2luYXRpb24gbmF2IGlzIGRlY29yYXRpdmUgLSB0aGUgcGFnZVxuICogbnVtYmVycyBzdGF5IGNsaWNrYWJsZSwgc28gd2l0aG91dCB0aGlzIGd1YXJkIGEgcmVhZGVyIGNhbiBxdWV1ZSBzZXZlcmFsXG4gKiBmZXRjaGVzLiBPbiB0aGUgQW5ub3RhdGlvbnMgcGFnZSBldmVyeSBmZXRjaCByZS1yZXNvbHZlcyBoaWdobGlnaHQgdGV4dCBmb3IgYVxuICogd2hvbGUgcGFnZSBvZiBtYXJrcywgd2hpY2ggaXMgdGhlIGV4cGVuc2l2ZSBvcGVyYXRpb24gdGhlIHBhZ2luYXRpb24gZXhpc3RzIHRvXG4gKiBib3VuZCwgYW5kIHRoZSBsYXRlIHJlc3BvbnNlcyBjYW4gcmVwYWludCB0aGUgZ3JpZCB3aXRoIGEgcGFnZSB0aGUgcmVhZGVyIGhhc1xuICogYWxyZWFkeSBsZWZ0LlxuICovXG5jb25zdCBwYWdpbmF0b3JzSW5GbGlnaHQgPSBuZXcgU2V0KCk7XG5cbmNvbnN0IEJMT0NLRURfQ09OVFJPTF9PUEFDSVRZID0gJzAuNSc7XG5cbi8qKlxuICogVGhlIGNvbnRyb2xzIGEgcmVhZGVyIGNhbiB1c2UgdG8gc3RhcnQgYW5vdGhlciBjb2xsZWN0aW9uIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhZ2luYXRvck5hbWVcbiAqIEByZXR1cm5zIHt7bmF2OiBIVE1MRWxlbWVudHxudWxsLCBsaXN0OiBIVE1MRWxlbWVudHxudWxsLCBpdGVtc1BlclBhZ2U6IEhUTUxFbGVtZW50fG51bGx9fVxuICovXG5mdW5jdGlvbiBwYWdpbmF0aW9uQ29udHJvbEVsZW1lbnRzKHBhZ2luYXRvck5hbWUpIHtcbiAgY29uc3QgbmF2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbmF2IyR7cGFnaW5hdG9yTmFtZX0tbmF2YCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYXYsXG4gICAgLy8gVGhlIFNwaW5uZXIgYm94IGlzIGluc2VydGVkIGFzIGEgY2hpbGQgb2YgdGhlIG5hdiwgc28gdGhlIGRpbW1pbmcgZ29lcyBvblxuICAgIC8vIHRoZSBsaXN0IG9mIHBhZ2UgbnVtYmVycyAtIGRpbW1pbmcgdGhlIG5hdiB3b3VsZCBkaW0gdGhlIHNwaW5uZXIgdG9vLlxuICAgIGxpc3Q6IG5hdiA/IG5hdi5xdWVyeVNlbGVjdG9yKCd1bC5wYWdpbmF0aW9uJykgOiBudWxsLFxuICAgIGl0ZW1zUGVyUGFnZTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cGFnaW5hdG9yTmFtZX0taXRlbXMtcGVyLXBhZ2VgKVxuICB9O1xufVxuXG4vKipcbiAqIFRha2UgdGhlIHBhZ2luYXRvcidzIGNvbnRyb2xzIG91dCBvZiBzZXJ2aWNlIGZvciB0aGUgZHVyYXRpb24gb2YgYSByZXF1ZXN0LlxuICpcbiAqIGBwb2ludGVyLWV2ZW50c2Agc3RvcHMgdGhlIG1vdXNlLCBgdGFiaW5kZXhgL2BhcmlhLWRpc2FibGVkYCBzdG9wIHRoZSBrZXlib2FyZFxuICogYW5kIHRlbGwgYSBzY3JlZW4gcmVhZGVyIHRoZSBzYW1lIHRoaW5nIHRoZSBkaW1taW5nIHRlbGxzIGEgc2lnaHRlZCByZWFkZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhZ2luYXRvck5hbWVcbiAqL1xuZnVuY3Rpb24gYmxvY2tQYWdpbmF0aW9uQ29udHJvbHMocGFnaW5hdG9yTmFtZSkge1xuICBwYWdpbmF0b3JzSW5GbGlnaHQuYWRkKHBhZ2luYXRvck5hbWUpO1xuXG4gIGNvbnN0IHtuYXYsIGxpc3QsIGl0ZW1zUGVyUGFnZX0gPSBwYWdpbmF0aW9uQ29udHJvbEVsZW1lbnRzKHBhZ2luYXRvck5hbWUpO1xuXG4gIGlmIChuYXYpIHtcbiAgICBuYXYuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcbiAgICBuYXYucXVlcnlTZWxlY3RvckFsbCgnYVtkYXRhLXBhZ2UtbnVtYmVyXScpLmZvckVhY2gobGluayA9PiB7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChsaXN0KSB7XG4gICAgbGlzdC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIGxpc3Quc3R5bGUub3BhY2l0eSA9IEJMT0NLRURfQ09OVFJPTF9PUEFDSVRZO1xuICB9XG5cbiAgaWYgKGl0ZW1zUGVyUGFnZSkge1xuICAgIGl0ZW1zUGVyUGFnZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIGl0ZW1zUGVyUGFnZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpO1xuICB9XG59XG5cbi8qKlxuICogUHV0IHRoZSBwYWdpbmF0b3IncyBjb250cm9scyBiYWNrIGluIHNlcnZpY2UuXG4gKlxuICogRWxlbWVudHMgYXJlIGxvb2tlZCB1cCBhZ2FpbiByYXRoZXIgdGhhbiBjYWNoZWQ6IGEgc3VjY2Vzc2Z1bCB1cGRhdGUgcmVwbGFjZXNcbiAqIHRoZSBuYXYgd2l0aCBmcmVzaGx5IHJlbmRlcmVkIG1hcmt1cCwgc28gdGhlIGVsZW1lbnQgYmxvY2tlZCBhdCB0aGUgc3RhcnQgb2ZcbiAqIHRoZSByZXF1ZXN0IGlzIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhZ2luYXRvck5hbWVcbiAqL1xuZnVuY3Rpb24gcmVsZWFzZVBhZ2luYXRpb25Db250cm9scyhwYWdpbmF0b3JOYW1lKSB7XG4gIHBhZ2luYXRvcnNJbkZsaWdodC5kZWxldGUocGFnaW5hdG9yTmFtZSk7XG5cbiAgY29uc3Qge25hdiwgbGlzdCwgaXRlbXN
239QZXJQYWdlfSA9IHBhZ2luYXRpb25Db250cm9sRWxlbWVudHMocGFnaW5hdG9yTmFtZSk7XG5cbiAgaWYgKG5hdikge1xuICAgIG5hdi5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKTtcbiAgICBuYXYucXVlcnlTZWxlY3RvckFsbCgnYVtkYXRhLXBhZ2UtbnVtYmVyXScpLmZvckVhY2gobGluayA9PiB7XG4gICAgICBsaW5rLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAobGlzdCkge1xuICAgIGxpc3Quc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgIGxpc3Quc3R5bGUub3BhY2l0eSA9ICcnO1xuICB9XG5cbiAgaWYgKGl0ZW1zUGVyUGFnZSkge1xuICAgIGl0ZW1zUGVyUGFnZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgaXRlbXNQZXJQYWdlLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIHBhZ2luYXRvciBmb3IgdGFibGVzIGhhcyBhbiBJdGVtcyBQZXIgUGFnZSBkcm9wZG93biBzZWxlY3RvciB0aGF0IGNhbiBiZSB1c2VkXG4gKiB0byBsZXQgdGhlIHVzZXIgY2hhbmdlIHRoZSBudW1iZXIgb2YgaXRlbXMgZGlzcGxheWVkIG9uIHRoZSB0YWJsZS5cbiAqIFRoZSBmb2xsb3dpbmcgZXZlbnQgaGFuZGxlciBpcyBhZGRlZCBpZiB0aGUgc2VsZWN0Lml0ZW1zX3Blcl9wYWdlIGVsZW1lbnQgaXMgZm91bmQgb24gdGhlIHBhZ2VcbiAqIFRoZSBkcm9wZG93biBjYW4gYmUgZm91bmQgaW4gL3NyYy9Nb2RlbHMvUGFnaW5hdGlvbjo6cmVuZGVySXRlbXNQZXJQYWdlKClcbiAqL1xuXG4vKipcbiAqIEV2ZW50IGhhbmRsZXIgZm9yIHRoZSBcIkl0ZW1zIHBlciBQYWdlXCIgc2VsZWN0IG9uIHRvcCBvZiBhIHRhYmxlXG4gKiBAcGFyYW0gZXZlbnRcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXRlbXNQZXJQYWdlSGFuZGxlcihldmVudCwgb3B0aW9ucykge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB0cnkge1xuICAgIGNvbnN0IHJlZnJlc2hVcmwgPSBldmVudC50YXJnZXQuZGF0YXNldC5yZWZyZXNoVXJsO1xuICAgIC8vIGNvbnN0IHBhZ2luYXRvck5hbWUgPSBldmVudC50YXJnZXQuZGF0YXNldC5wYWdpbmF0b3JOYW1lO1xuICAgIC8vIGNvbnN0IHBhZ2luYXRpb25Db250cm9sc1NlbGVjdG9yID0gYG5hdiMke3BhZ2luYX
239Rvck5hbWV9LW5hdmA7XG4gICAgY29uc3Qge2NvbGxlY3Rpb246IHtwYWdpbmF0b3JOYW1lLCBwYWdpbmF0aW9uQ29udHJvbHNTZWxlY3Rvcn19ID0gb3B0aW9ucztcbiAgICBsZXQgc29ydEJ5RWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzb3J0LWJ5Jyk7XG4gICAgbGV0IHNvcnQgPSAnZGF0ZS1kZXNjJztcblxuICAgIGlmIChzb3J0QnlFbGVtKSB7XG4gICAgICBzb3J0ID0gc29ydEJ5RWxlbS52YWx1ZTtcbiAgICAgIG9wdGlvbnMuY29sbGVjdGlvbi5zb3J0ID0gc29ydDtcbiAgICB9XG5cbiAgICBvcHRpb25zLmNvbGxlY3Rpb24ucGFnaW5hdG9yTmFtZSA9IHBhZ2luYXRvck5hbWU7XG4gICAgb3B0aW9ucy5jb2xsZWN0aW9uLnBhZ2luYXRpb25Db250cm9sc1NlbGVjdG9yID0gcGFnaW5hdGlvbkNvbnRyb2xzU2VsZWN0b3I7XG4gICAgb3B0aW9ucy5jb2xsZWN0aW9uLml0ZW1zUGVyUGFnZSA9IHBhcnNlSW50KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgb3B0aW9ucy5zcGlubmVyLm5hbWUgPSBgJHtwYWdpbmF0b3JOYW1lfS1wYWdpbmF0b3JgO1xuXG4gICAgLy8gcGFzc2luZyAnY3VycmVudFBhZ2UnIGFzICcxJyBzbyBpZiB5b3UgY2hhbmdlIHRoZSBwYWdlIHNpemUsIHlvdSBhcmUgYmFjayBhdCB0aGUgZmlyc3QgcGFnZVxuICAgIC8vIFRPRE86IHdlIGNvdWxkIGRvIHRoZSBtYXRoIHRvIGNhbGN1bGF0ZSBob3cgdG8gYWRqdXN0IGN1cnJlbnQgcGFnZSBvbiBhbiBpdGVtcy1wZXItcGFnZSBjaGFuZ2UuLi5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgb3B0aW9ucyxcbiAgICAgIGN1cnJlbnRQYWdlOiAnMSdcbiAgICB9O1xuXG4gICAgLy8gQ29udGludWUgUmVhZGluZyAoIzM1ODIsICMzNTkzKTogYWxzbyBibG9jayBjbGlja3Mgb24gdGhlIHBpbnMvXG4gICAgLy8gY2hlY2tib3hlcy9wYWdpbmF0aW9uIGluIHRoZSB0YWJsZSB3aGlsZSB0aGUgcmVxdWVzdCBpcyBpbiBmbGlnaHQsXG4gICAgLy8gdXNpbmcgdGhlIHNhbWUgYmxvY2tpbmcgb3ZlcmxheSBhbHJlYWR5IHByb3ZlbiBvbiB0aGUgQW5ub3RhdGlvbnNcbiAgICAvLyBiYXRjaC1lZGl0IGFjdGlvbnMsIHNjb3BlZCB0byB0aGlzIHBhZ2luYXRvciBvbmx5LiBUaGUgU2hvdyBjb250cm9sXG4gICAgLy8gaXRzZWxmIGtlZXBzIGl0cyBvcmlnaW5hbCwgZGVjb3JhdGl2ZSBTcGlubmVyLWNsYXNzIHRyZWF0bWVudFxuICAgIC8vIChoYW5kbGVDb2xsZWN0aW9uVXBkYXRlIGJlbG93LCBhbmNob3JlZCB0byB0aGUgc2VsZWN0IHZpYVxuICAgIC8vIG9wdGlvbnMuc3Bpbm5lcikgLSB0aGF0IGJveCBpcyBvcGFxdWUgYW5kIGFic29sdXRlbHkgcG9zaXRpb25lZCBvblxuICAgIC8vIHRvcCBvZiB0aGUgc2VsZWN0LCBzbyBpdCBhbHJlYWR5IGJsb2NrcyBjbGlja3MvcmVvcGVuaW5nIHRoZVxuICAgIC8vIGRyb3Bkb3duIHdpdGhvdXQgYW55IGV4dHJhIG92ZXJsYXkgb3IgQ1NTIChjb25maXJtZWQgaW4gYSByZWFsXG4gICAgLy8gYnJvd3NlcikuXG4gICAgY29uc3QgdXNlVGFibGVPdmVybGF5ID0gcGFnaW5hdG9yTmFtZSA9PT0gJ2xhc3QtbG9jYXRpb25zJztcbiAgICBjb25zdCBjb2xsZWN0aW9uT3ZlcmxheVRhcmdldCA9IHVzZVRhYmxlT3ZlcmxheSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbGxlY3Rpb25dJykgOiBudWxsO1xuXG4gICAgaWYgKHVzZVRhYmxlT3ZlcmxheSkge1xuICAgICAgaW5zZXJ0T3ZlcmxheU9uRWxlbWVudChjb2xsZWN0aW9uT3ZlcmxheVRhcmdldCwgJ2xhc3QtbG9jYXRpb25zLXRhYmxlLW92ZXJsYXknLCB0cnVlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlQ29sbGVjdGlvblVwZGF0ZShyZWZyZXNoVXJsLCBkYXRhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHVzZVRhYmxlT3ZlcmxheSkge1xuICAgICAgICByZW1vdmVPdmVybGF5T25FbGVtZW50KCdsYXN0LWxvY2F0aW9ucy10YWJsZS1vdmVybGF5Jyk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9IG9uICR7ZXJyb3IubGluZU51bWJlcn1gKTtcbiAgICBjb25zdCBtc2cgPSAnVGhlcmUgd2FzIGFuIGVycm9yIGFuZCB0aGUgY29sbGVjdGlvbiBjb3VsZCBub3QgYmUgdXBkYXRlZC4nXG4gICAgY29uc3Qgbm90aWNlID0gbmV3IEFzeW5jTm90aWNlKG1zZywgJ2Vycm9yJyk7XG4gICAgYXdhaXQgbm90aWNlLmNyZWF0ZSh7fSwgdHJ1ZSk7XG4gICAgbm90aWNlLnJlbW92ZSgpO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyBwYWdpbmF0aW9uIGV2ZW50IGFuZCB1cGRhdGVzIHRoZSBjb2xsZWN0aW9uIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBwYWdlIG51bWJlci5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwYWdpbmF0aW9uIGV2ZW50LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY29sbGVjdGlvbiBpcyB1cGRhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwYWdpbmF0aW9uSGFuZGxlcihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGNvbnN0IGFuY2hvciA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCdhW2RhdGEtcGFnZS1udW1iZXJdJyk7XG4gIGlmICghYW5jaG9yKSByZXR1cm47IC8vIGNsaWNrIG9uIGRpc2FibGVkIDxsaT4sIGN1cnJlbnQtcGFnZSA8bGk+LCBvciBpY29uIG91dHNpZGUgPGE+XG5cbiAgY29uc3QgbmF2RWxlbSA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCduYXYnKTtcbiAgaWYgKG5hdkVsZW0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFnaW5hdG9yTmFtZSA9IG5hdkVsZW0uZGF0YXNldC5wYWdpbmF0b3JOYW1lO1xuICAgICAgY29uc3QgcGFnaW5hdGlvbkNvbnRyb2xzU2VsZWN0b3IgPSBgbmF2IyR7cGFnaW5hdG9yTmFtZX0tbmF2YDtcbiAgICAgIGNvbnN0IGl0ZW1zUGVyUGFnZUVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwYWdpbmF0b3JOYW1lfS1pdGVt
239cy1wZXItcGFnZWApO1xuICAgICAgY29uc3QgY29sbGVjdGlvbkVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwYWdpbmF0b3JOYW1lfS1jb2xsZWN0aW9uYCk7XG5cbiAgICAgIGlmICghY29sbGVjdGlvbkVsZW0pIHJldHVybjsgLy8gY29sbGVjdGlvbiBlbGVtZW50IG5vdCBpbiBET01cblxuICAgICAgY29uc3QgcmVmcmVzaFVybCA9IGNvbGxlY3Rpb25FbGVtLmRhdGFzZXQucmVmcmVzaFVybDtcbiAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBhbmNob3IuZGF0YXNldC5wYWdlTnVtYmVyO1xuXG4gICAgICAvLyBkYXRhc2V0Lm9wdGlvbnMgaXMgc2V0IGJ5IFBIUCBvbiBmaXJzdCBsb2FkOyBmYWxsIGJhY2sgdG8gYnVpbGRpbmcgYSBtaW5pbWFsXG4gICAgICAvLyBvcHRpb25zIG9iamVjdCBmcm9tIHRoZSBjdXJyZW50IERPTSBzdGF0ZSBpZiBpdCBpcyBhYnNlbnQgb3IgZW1wdHlcbiAgICAgIGxldCBvcHRpb25zO1xuICAgICAgaWYgKGNvbGxlY3Rpb25FbGVtLmRhdGFzZXQub3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gSlNPTi5wYXJzZShjb2xsZWN0aW9uRWxlbS5kYXRhc2V0Lm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB7XG4gICAgICAgICAgICBwYWdpbmF0b3JOYW1lLFxuICAgICAgICAgICAgcGFnaW5hdGlvbkNvbnRyb2xzU2VsZWN0b3IsXG4gICAgICAgICAgICBpdGVtc1BlclBhZ2U6IGl0ZW1zUGVyUGFnZUVsZW0gPyBpdGVtc1BlclBhZ2VFbGVtLnZhbHVlIDogMTAsXG4gICAgICAgICAgICBjdXJyZW50UGFnZTogcGFnZU51bWJlcixcbiAgICAgICAgICAgIHN0eWxlOiAndGFibGUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzcGlubmVyOiB7fVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBvcHRpb25zLmNvbGxlY3Rpb24uY3VycmVudFBhZ2UgPSBwYWdlTnVtYmVyO1xuICAgICAgb3B0aW9ucy5jb2xsZWN0aW9uLml0ZW1zUGVyUGFnZSA9IGl0ZW1zUGVyUGFnZUVsZW0gPyBpdGVtc1BlclBhZ2VFbGVtLnZhbHVlIDogKG9wdGlvbnMuY29sbGVjdGlvbi5pdGVtc1BlclBhZ2UgPz8gMTApO1xuICAgICAgb3B0aW9ucy5jb2xsZWN0aW9uLnBhZ2luYXRpb25Db250cm9sc1NlbGVjdG9yID0gYCR7cGFnaW5hdGlvbkNvbnRyb2xzU2VsZWN0b3J9YDtcbiAgICAgIG9wdGlvbnMuY29sbGVjdGlvbi5wYWdpbmF0b3JOYW1lID0gcGFnaW5hdG9yTmFtZTtcbiAgICAgIG9wdGlvbnMuc3Bpbm5lciA9IHtcbiAgICAgICAgbmFtZTogYCR7cGFnaW5hdG9yTmFtZX0tc3Bpbm5lcmAsXG4gICAgICAgIHRhcmdldFNlbGVjdG9yOiBgJHtwYWdpbmF0aW9uQ29udHJvbHNTZWxlY3Rvcn1gLFxuICAgICAgICBpbnNlcnRQb3NpdGlvbjogJ2FmdGVyYmVnaW4nLFxuICAgICAgICB3aXRoV3JhcHBlcjogZmFsc2VcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGRhdGEgPSB7IG9wdGlvbnMgfTtcbiAgICAgIGF3YWl0IGhhbmRsZUNvbGxlY3Rpb25VcGRhdGUocmVmcmVzaFVybCwgZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9IG9uICR7ZXJyb3IubGluZU51bWJlcn1gKTtcbiAgICAgIGNvbnN0IG1zZyA9ICdUaGVyZSB3YXMgYW4gZXJyb3IgYW5kIHRoZSBjb2xsZWN0aW9uIGNvdWxkIG5vdCBiZSB1cGRhdGVkLidcbiAgICAgIGNvbnN0IG5vdGljZSA9IG5ldyBBc3luY05vdGljZShtc2csICdlcnJvcicpO1xuICAgICAgYXdhaXQgbm90aWNlLmNyZWF0ZSh7fSwgdHJ1ZSk7XG4gICAgICBub3RpY2UucmVtb3ZlKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgY2hhbmdlIG9mIGNvbGxlY3Rpb24gaXRlbXMuXG4gKlxuICogQHBhcmFtIHVybFxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm5zIHtQcm9taXNlPHtzdWNjZXNzOiBib29sZWFufT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNvbGxlY3Rpb25VcGRhdGUgKHVybCwgZGF0YSkge1xuICBjb25zdCB7b3B0aW9uc30gPSBkYXRhO1xuICBjb25zdCB7IGNvbGxlY3Rpb246ICB7IHBhZ2luYXRpb25Db250cm9sc1NlbGVjdG9yLCBwYWdpbmF0b3JOYW1lIH0sIHNwaW5uZXI6IHNwaW5uZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuICBjb25zdCB7IG5hbWUsIHRhcmdldFNlbGVjdG9yLCBpbnNlcnRQb3NpdGlvbiA9ICdhZnRlcmVuZCcsIHdpdGhXcmFwcGVyID0gZmFsc2UgIH0gPSBzcGlubmVyT3B0aW9ucztcblxuICAvLyAjNDQ4MDogYmVsdCBhbmQgYnJhY2VzIHdpdGggdGhlIGJsb2NrZWQgY29udHJvbHMgYmVsb3cgLSB0aGlzIGd1YXJkIHN0aWxsXG4gIC8vIGhvbGRzIGlmIHRoZSBDU1MgaXMgZXZlciByZW1vdmVkLCBvciBpZiBhIHJlcXVlc3QgaXMgc3RhcnRlZCBmcm9tIGNvZGVcbiAgLy8gcmF0aGVyIHRoYW4gZnJvbSBhIGNsaWNrLlxuICBpZiAocGFnaW5hdG9yc0luRmxpZ2h0LmhhcyhwYWdpbmF0b3JOYW1lKSkge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBpZ25vcmVkOiB0cnVlIH07XG4gIH1cblxuICBjb25zdCBzcGlubmVyID0gbmV3IFNwaW5uZXIobmFtZSwgdGFyZ2V0U2VsZWN0b3IsIGluc2VydFBvc2l0aW9uLCB3aXRoV3JhcHBlcik7XG5cbiAgYmxvY2tQYWdpbmF0aW9uQ29udHJvbHMocGFnaW5hdG9yTmFtZSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb2xsZWN0aW9uRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhZ2luYXRlZC1jb2xsZWN0aW9uXScpO1xuICAgIGNvbnN0IHBhZ2luYXRpb25Db250cm9scyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCR7cGFnaW5hdGlvbkNvbnRyb2xzU2VsZWN0b3J9YClcbiAgICBjb25zdCBpdGVtc0VsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwYWdpbmF0b3JOYW1lfS1pdGVtcy1wZXItcGFn
239ZWApO1xuICAgIGxldCB1cGRhdGVDb250ZW50PSBmYWxzZTtcblxuICAgIC8vIGFkZCBzcGlubmVyXG4gICAgc3Bpbm5lci5hZGQoKTtcblxuICAgIC8vICMzNTk1OiB0aGUgU3Bpbm5lciBib3ggaXMgYSBET00gc2libGluZyBvZiB0aGUgPHNlbGVjdD4sIGJ1dCBpdHMgQ1NTXG4gICAgLy8gcG9zaXRpb25zIGl0IHJlbGF0aXZlIHRvIHRoZSBuZWFyZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgKHRoZVxuICAgIC8vIGAucGVyLXBhZ2Utd3JhcHBlcmAsIHdoaWNoIGFsc28gY29udGFpbnMgdGhlIFwiU2hvdzpcIiBsYWJlbCkgLSBub3QgdGhlXG4gICAgLy8gc2VsZWN0IGl0c2VsZi4gSWYgdGhhdCB3cmFwcGVyIGlzIHdpZGVyIHRoYW4gdGhlIHNlbGVjdCwgdGhlXG4gICAgLy8gZml4ZWQtd2lkdGggYm94IGRyaWZ0cyBhd2F5IGZyb20gKG9yIGV4dGVuZHMgcGFzdCkgdGhlIGNvbnRyb2wgaXQnc1xuICAgIC8vIG1lYW50IHRvIGNvdmVyLiBQaW4gaXQgdG8gdGhlIHNlbGVjdCdzIG93biByZWN0IHNvIGl0IGFsd2F5cyBjb3ZlcnNcbiAgICAvLyBleGFjdGx5IHRoZSBkcm9wZG93biwgcmVnYXJkbGVzcyBvZiB0aGUgd3JhcHBlcidzIHdpZHRoLlxuICAgIGlmIChpdGVtc0VsZW0gJiYgdGFyZ2V0U2VsZWN0b3IgPT09IGAjJHtwYWdpbmF0b3JOYW1lfS1pdGVtcy1wZXItcGFnZWApIHtcbiAgICAgIHBpblNwaW5uZXJPdmVyRWxlbWVudChuYW1lLCBpdGVtc0VsZW0pO1xuICAgIH1cblxuICAgIC8vIGZldGNoICYgaGFuZGxlIHVwZGF0ZWQgY29sbGVjdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ldyBGZXRjaEhlbHBlcnMoKS5mZXRjaERhdGEoJ1BPU1QnLCB1cmwsIGRhdGEpO1xuICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgLy8gcmVtb3ZlIGFueSBwcmV2aW91cyBub3RpY2VzLCBpZiBhbnlcbiAgICAgIGNvbnN0IG5vdGljZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNub3RpY2VzLW1haW4nKTtcbiAgICAgIGlmKG5vdGljZSkge1xuICAgICAgICBub3RpY2UucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIHRoYXQgd2UgaGF2ZSBjb250ZW50IHRvIHVwZGF0ZSBjb2xsZWN0aW9uXG4gICAgICBsZXQgY29udGVudF9wcmVzZW50XG4gICAgICA9IChvcHRpb25zLmNvbGxlY3Rpb24uc3R5bGUgPT09ICd0YWJsZScgJiYgKHJlc3VsdC5yb3dzID8/ICcnKS5sZW5ndGggPiAwKVxuICAgICAgfHwgKChyZXN1bHQuY29sbGVjdGlvbiA/PyAnJykubGVuZ3RoID4gMCk7XG4gICAgICBpZihjb250ZW50X3ByZXNlbnQpIHtcbiAgICAgICAgdXBkYXRlQ29udGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtc2cgPSAnVGhlcmUgd2FzIGFuIGVycm9yIHVwZGF0aW5nIHRoZSBjb2xsZWN0aW9uJztcbiAgICAgICAgYXdhaXQgc2VuZEVycm9yTm90aWNlcyhtc2cpO1xuICAgICAgfVxuXG4gICAgICBpZih1cGRhdGVDb250ZW50KSB7XG4gICAgICAgIC8vIHNldCB0aGUgcGFnZSBwYXJhbSB0byAnMScgb24gdXJsXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgLy8gcGFyYW1zLmRlbGV0ZSgncGFnZScpOyAvLyBubyBuZWVkIHRvIHBhc3MgcGFnZSBudW1iZXJcbiAgICAgICAgLy8gcGFyYW1zLmFwcGVuZCgncGFnZScsIG9wdGlvbnMuY29sbGVjdGlvbi5jdXJyZW50UGFnZSk7XG4gICAgICAgIC8vIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIGAke2xvY2F0aW9uLnBhdGhuYW1lfT8ke3BhcmFtc31gKTtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgYCR7bG9jYXRpb24ucGF0aG5hbWV9YCk7XG5cbiAgICAgICAgLy8gdXBkYXRlIGNvbGxlY3Rpb24gZWxlbWVudCB3aXRoIG5ldyByb3dzXG4gICAgICAgIGlmIChvcHRpb25zLmNvbGxlY3Rpb24uc3R5bGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAvLyByZXBsYWNlIHRhYmxlIHJvd3NcbiAgICAgICAgICBpZiAocmVzdWx0LnJvd3MpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25FbGVtZW50LnRCb2RpZXNbMF0uaW5uZXJIVE1MID0gcmVzdWx0LnJvd3M7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJlcGxhY2UgY29sbGVjdGlvbiBodG1sXG4gICAgICAgICAgICBjb2xsZWN0aW9uRWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWJlZ2luJywgcmVzdWx0LmNvbGxlY3Rpb24pO1xuICAgICAgICAgICAgY29sbGVjdGlvbkVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHJlcGxhY2UgY29sbGVjdGlvbiBodG1sXG4gICAgICAgICAgY29sbGVjdGlvbkVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmViZWdpbicsIHJlc3VsdC5jb2xsZWN0aW9uKTtcbiAgICAgICAgICBjb2xsZWN0aW9uRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBpdGVtc1BlclBhZ2VcbiAgICAgICAgaWYgKGl0ZW1zRWxlbSkge1xuICAgICAgICAgIGl0ZW1zRWxlbS52YWx1ZSA9IHJlc3VsdC5pdGVtc1BlclBhZ2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gJ1RoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGUgY29sbGVjdGlvbi4nO1xuICAgICAgICAgIGF3YWl0IHNlbmRFcnJvck5vdGljZXMobXNnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSB0b3RhbHNcbiAgICAgICAgbGV0IHRvdGFsc1NwYW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYW5ub3RhdGlvbi1pdGVtcycpO1xuICAgICAgICBpZih0b3RhbHNTcGFuKSB7XG4gICAgICAgICAgdG90YWxzU3Bhbi5pbm5lckhUTUwgPSByZXN1bHRbJ3RvdGFsJ107XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgbmF2aWdhdGlvbiBjb250cm9sc1xuICAgICAgICBjb25zdCBuZXdOYXYgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChyZXN1bHQubmF2KTtcbiAgICAgICAgaWYobmV3TmF2KSB7XG4gICAgICAgICAgcGFnaW5hdGlvbkNvbnRyb2xzLnJlcGxhY2VXaXRoKG5ld05hdik7XG4gICAgICAgICAgYXdhaXQgYWRkUGFnaW5hdGlvbk5hdmlnYXRpb25IYW5kbGVycyhwYWdpbmF0b3JOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBtc2cgPSAnVGhlcmUgd2FzIGFuIGVycm9yIHVwZGF0aW5nIHBhZ2luYXRpb24gY29udHJvbHMuJztcbiAgICAgICAgICBhd2FpdCBzZW5kRXJyb3JOb3RpY2VzKG1zZyk7XG4gICAgICAgI
239H1cblxuICAgICAgICAvLyB1cGRhdGUgb3B0aW9ucyBkYXRhIGF0dHJpYnV0ZVxuICAgICAgICBjb2xsZWN0aW9uRWxlbWVudC5kYXRhc2V0Lm9wdGlvbnMgPSByZXN1bHQub3B0aW9ucztcblxuICAgICAgICBhd2FpdCBhZGRBbm5vdGF0aW9uc0FjdGlvbkhhbmRsZXJzKCk7XG5cbiAgICAgICAgaWYocGFnaW5hdG9yTmFtZSA9PT0gJ2xhc3QtbG9jYXRpb25zJykge1xuICAgICAgICAgIGFkZFBpbkV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSBjb2xsZWN0aW9uIHdyYXBwZXJcbiAgICAgICAgY29sbGVjdGlvbkVsZW1lbnQuZGF0YXNldC5vcHRpb25zID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG5cbiAgICAgICAgLy8gcmUtaW5pdCBmb3VuZGF0aW9uXG4gICAgICAgIGpRdWVyeShkb2N1bWVudCkuZm91bmRhdGlvbigpO1xuXG4gICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIGNvbnRyb2xsZXJzIChlLmcuIHRoZSBDb250aW51ZSBSZWFkaW5nIGJ1bGstZGVsZXRlXG4gICAgICAgIC8vIGNvbnRyb2xsZXIpIHRoYXQgdGhlIGNvbGxlY3Rpb24gd2FzIHJlcGFpbnRlZCBzbyB0aGV5IGNhbiByZS1hcHBseVxuICAgICAgICAvLyB0aGVpciBvd24gRE9NIHRvIHRoZSBmcmVzaCByb3dzICgjMzE1MykuXG4gICAgICAgIGNvbGxlY3Rpb25FbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjb2xsZWN0aW9uOnJlcGFpbnRlZCcsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogeyBwYWdpbmF0b3JOYW1lIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtc2cgPSAnVGhlcmUgd2FzIGFuIGVycm9yIHVwZGF0aW5nIHRoZSBjb2xsZWN0aW9uLic7XG4gICAgICBhd2FpdCBzZW5kRXJyb3JOb3RpY2VzKG1zZyk7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgYXdhaXQgc2VuZEVycm9yTm90aWNlcyhlcnJvci5tZXNzYWdlKTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gIH0gZmluYWxseSB7XG4gICAgLy8gIzQ0ODA6IGEgZmFpbGVkIHJlcXVlc3QgbXVzdCBub3Qgc3RyYW5kIHRoZSBwYWdpbmF0b3IgZGlzYWJsZWQsIGFuZCB0aGVcbiAgICAvLyBzcGlubmVyIHVzZWQgdG8gYmUgbGVmdCBiZWhpbmQgb24gdGhlIGVycm9yIHBhdGggKGl0cyByZW1vdmFsIHdhc1xuICAgIC8vIGNvbW1lbnRlZCBvdXQpIC0gdGhlIHNhbWUgZmFpbHVyZSBtb2RlIGFzICM0NDAyLlxuICAgIHNwaW5uZXIucmVtb3ZlKCk7XG4gICAgcmVsZWFzZVBhZ2luYXRpb25Db250cm9scyhwYWdpbmF0b3JOYW1lKTtcbiAgfVxuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgZXJyb3IgaGFuZGxpbmcgd2l0aCBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBtc2dcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VuZEVycm9yTm90aWNlcyhtc2cpIHtcbiAgYXdhaXQgZGlzcGxheU5vdGljZShtc2csICdlcnJvcicpO1xuICBjb25zb2xlLmVycm9yKG1zZyk7XG59XG5cbi8qKlxuICogQWRkIGNvbGxlY3Rpb24tcmVsYXRlZCBvcHRpb25zIHRvIHRoZSBvcHRpb25zIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIHBhZ2luYXRvck5hbWVcbiAqIEBwYXJhbSBoYXNQaW5zXG4gKiBAcGFyYW0gaXNFZGl0YWJsZVxuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIHNldENvbGxlY3Rpb25PcHRpb25zKG9wdGlvbnMsIHBhZ2luYXRvck5hbWUsIGhhc1BpbnMgPSBmYWxzZSwgaXNFZGl0YWJsZSA9IGZhbHNlKSB7XG4gIGNvbnN0IG5ld09wdGlvbnMgPSBzdHJ1Y3R1cmVkQ2xvbmUob3B0aW9ucyk7XG5cbiAgbmV3T3B0aW9ucy5jb2xsZWN0aW9uLnBhZ2luYXRvck5hbWUgPSBwYWdpbmF0b3JOYW1lO1xuICBuZXdPcHRpb25zLmNvbGxlY3Rpb24uaGFzUGlucyA9IGhhc1BpbnM7XG4gIG5ld09wdGlvbnMuY29sbGVjdGlvbi5pc0VkaXRhYmxlID0gaXNFZGl0YWJsZTtcblxuICByZXR1cm4gbmV3T3B0aW9ucztcbn1cblxuLyoqXG4gKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHBhZ2luYXRpb24gbGlua3MuXG4gKlxuICogQGZ1bmN0aW9uIGFkZFBhZ2luYXRpb25OYXZpZ2F0aW9uSGFuZGxlcnNcbiAqL1xuZnVuY3Rpb24gYWRkUGFnaW5hdGlvbk5hdmlnYXRpb25IYW5kbGVycyhwYWdpbmF0b3JOYW1lKSB7XG4gIGNvbnN0IG5hdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG5hdltkYXRhLXBhZ2luYXRvci1uYW1lPVwiJHtwYWdpbmF0b3JOYW1lfVwiXWApO1xuICBpZiAoIW5hdikgcmV0dXJuO1xuICBuYXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICBhd2FpdCBwYWdpbmF0aW9uSGFuZGxlcihldmVudCk7XG4gIH0pO1xufVxuXG5leHBvcnQge2FkZFBhZ2luYXRpb25OYXZpZ2F0aW9uSGFuZGxlcnMsIGl0ZW1zUGVyUGFnZUhhbmRsZXIsIHBhZ2luYXRpb25IYW5kbGVyLCBzZXRDb2xsZWN0aW9uT3B0aW9uc31cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/pagination.js\n");
240
241/***/ }),
242
243/***/ "./resources/js/spinner.js":
244/*!*********************************!*\
245  !*** ./resources/js/spinner.js ***!
246  \*********************************/
247/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
248
249eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Spinner: () => (/* binding */ Spinner)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _utilities_general__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utilities/general */ \"./resources/js/utilities/general.js\");\n\n\n\n\n\n/**\n * Create a spinner that can be added and removed around a particular task.\n * @todo  Fix the debugWait feature.... currently not working\n * @param name            - A unique identifier for this spinner\n * @param targetSelector  - selector to target an element in the DOM that will serve as the anchor for the spinner\n * @param insertPosition  - where to insert the spinner in relation to the anchor element. Used with call to\n *                          Element.insertAdjacentElement() method\n * @param withWrapper\n * @param debugWait number\n * @constructor\n */\nfunction Spinner(name, targetSelector) {\n  var insertPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'afterend';\n  var withWrapper = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n  var debugWait = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n  this.name = name;\n  this.waitInMilliseconds = debugWait === 0 ? 0.05 * 1000 : debugWait * 1000; // add slight delay if 0\n  this.options = {\n    spinner: {\n      targetSelector: targetSelector,\n      insertPosition: insertPosition,\n      withWrapper: withWrapper\n    }\n  };\n\n  /**\n   * Adds the spinner to the DOM.\n   *\n   * @returns {void}\n   */\n  this.add = function () {\n    var spinnerOptions = this.options.spinner;\n    var targetSelector = spinnerOptions.targetSelector,\n      insertPosition = spinnerOptions.insertPosition,\n      _spinnerOptions$withW = spinnerOptions.withWrapper,\n      withWrapper = _spinnerOptions$withW === void 0 ? false : _spinnerOptions$withW;\n    var spinnerElem = document.querySelector(\".spinner-wrapper [data-name=\\\"\".concat(name, \"\\\"]\"));\n    if (!spinnerElem) {\n      // show spinner\n      var icon = document.createElement('i');\n      icon.classList.add('fa-solid', 'fa-spinner', 'fa-spin');\n      var spinner = document.createElement('div');\n      if (name) {\n        spinner.dataset.name = name;\n      }\n      spinner.classList.add('loading-on-top');\n      spinner.appendChild(icon);\n\n      // if debugging sleep is on\n      if (this.waitInMilliseconds > 50) {\n        spinner.style.backgroundColor = 'darkred';\n      }\n      var spinnerElements;
249\n\n      // in some cases, we may need to have the spinner in its own wrapper div\n      if (withWrapper) {\n        var wrapper = document.createElement('div');\n        wrapper.classList.add('spinner-wrapper');\n        wrapper.appendChild(spinner);\n        spinnerElements = wrapper;\n      } else {\n        spinnerElements = spinner;\n      }\n      var target = document.querySelector(\"\".concat(targetSelector));\n      if (target) {\n        target.insertAdjacentElement(insertPosition, spinnerElements);\n      }\n    }\n  };\n\n  /**\n   * Removes the spinner from the DOM.\n   * @returns {boolean} - Returns true if the item was successfully removed, false otherwise.\n   */\n  this.remove = /*#__PURE__*/(0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee() {\n    var _context,\n      _this = this;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context2) {\n      while (1) switch (_context2.prev = _context2.next) {\n        case 0:\n          _context2.next = 2;\n          return (0,_utilities_general__WEBPACK_IMPORTED_MODULE_3__.asyncSleep)(this.waitInMilliseconds);\n        case 2:\n          // using 'querySelectorAll' to ensure no spinner is left with this name attribute. This covers cases where an\n          // error may cause an extra spinner to be in the DOM.\n          _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_2___default()(_context = document.querySelectorAll(\"div[data-name='\".concat(this.name, \"']\"))).call(_context, function (elem) {\n            // special case - only spinner with static wrapper and non-spinner elements in it (requested by Carolyn)\n            if (elem.closest('[data-sort-by-wrapper]')) {\n              elem.remove();\n            } else {\n              // if the spinner has a wrapper, remove wrapper with the spinner (There are some elements with a spinner-wrapper class; these elements should not be removed)\n              if (_this.options.spinner.withWrapper && elem.parentElement.classList.contains('spinner-wrapper')) {\n                elem = elem.parentElement;\n              }\n              elem.remove();\n            }\n          });\n        case 3:\n        case \"end\":\n          return _context2.stop();\n      }\n    }, _callee, this);\n  }));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvc3Bpbm5lci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFGQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy9zcGlubmVyLmpzPzM1NDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3luY1NsZWVwfSBmcm9tIFwiLi91dGlsaXRpZXMvZ2VuZXJhbFwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIHNwaW5uZXIgdGhhdCBjYW4gYmUgYWRkZWQgYW5kIHJlbW92ZWQgYXJvdW5kIGEgcGFydGljdWxhciB0YXNrLlxuICogQHRvZG8gIEZpeCB0aGUgZGVidWdXYWl0IGZlYXR1cmUuLi4uIGN1cnJlbnRseSBub3Qgd29ya2luZ1xuICogQHBhcmFtIG5hbWUgICAgICAgICAgICAtIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgc3Bpbm5lclxuICogQHBhcmFtIHRhcmdldFNlbGVjdG9yICAtIHNlbGVjdG9yIHRvIHRhcmdldCBhbiBlbGVtZW50IGluIHRoZSBET00gdGhhdCB3aWxsIHNlcnZlIGFzIHRoZSBhbmNob3IgZm9yIHRoZSBzcGlubmVyXG4gKiBAcGFyYW0gaW5zZXJ0UG9zaXRpb24gIC0gd2hlcmUgdG8gaW5zZXJ0IHRoZSBzcGlubmVyIGluIHJlbGF0aW9uIHRvIHRoZSBhbmNob3IgZWxlbWVudC4gVXNlZCB3aXRoIGNhbGwgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgpIG1ldGhvZFxuICogQHBhcmFtIHdpdGhXcmFwcGVyXG4gKiBAcGFyYW0gZGVidWdXYWl0IG51bWJlclxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFNwaW5uZXIobmFtZSxcbiAgICAgICAgICAgICAgICAgdGFyZ2V0U2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgIGluc2VydFBvc2l0aW9uID0gJ2FmdGVyZW5kJyxcbiAgICAgICAgICAgICAgICAgd2l0aFdyYXBwZXIgPSBmYWxzZSAsXG4gICAgICAgICAgICAgICAgIGRlYnVnV2FpdCA9IDApIHtcbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy53YWl0SW5NaWxsaXNlY29uZHMgPSBkZWJ1Z1dhaXQgPT09IDAgPyAwLjA1ICogMTAwMCA6IGRlYnVnV2FpdCAqIDEwMDA7IC8vIGFkZCBzbGlnaHQgZGVsYXkgaWYgMFxuICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgc3Bpbm5lcjoge1xuICAgICAgdGFyZ2V0U2VsZWN0b3IsXG4gICAgICBpbnNlcnRQb3NpdGlvbixcbiAgICAgIHdpdGhXcmFwcGVyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIHNwaW5uZXIgdG8gdGhlIERPTS5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB0aGlzLmFkZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7c3Bpbm5lcjogc3Bpbm5lck9wdGlvbnN9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHt0YXJnZXRTZWxlY3RvciwgaW5zZXJ0UG9zaXRpb24sIHdpdGhXcmFwcGVyID0gZmFsc2V9ID0gc3Bpbm5lck9wdGlvbnM7XG4gICAgY29uc3Qgc3Bpbm5lckVsZW0gP
249SBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuc3Bpbm5lci13cmFwcGVyIFtkYXRhLW5hbWU9XCIke25hbWV9XCJdYCk7XG5cbiAgICBpZiAoIXNwaW5uZXJFbGVtKSB7XG4gICAgICAvLyBzaG93IHNwaW5uZXJcbiAgICAgIGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XG4gICAgICBpY29uLmNsYXNzTGlzdC5hZGQoJ2ZhLXNvbGlkJywgJ2ZhLXNwaW5uZXInLCAnZmEtc3BpbicpO1xuXG4gICAgICBjb25zdCBzcGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBzcGlubmVyLmRhdGFzZXQubmFtZSA9IG5hbWU7XG4gICAgICB9XG5cbiAgICAgIHNwaW5uZXIuY2xhc3NMaXN0LmFkZCgnbG9hZGluZy1vbi10b3AnKTtcbiAgICAgIHNwaW5uZXIuYXBwZW5kQ2hpbGQoaWNvbik7XG5cbiAgICAgIC8vIGlmIGRlYnVnZ2luZyBzbGVlcCBpcyBvblxuICAgICAgaWYodGhpcy53YWl0SW5NaWxsaXNlY29uZHMgPiA1MCkge1xuICAgICAgICBzcGlubmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdkYXJrcmVkJztcbiAgICAgIH1cblxuICAgICAgbGV0IHNwaW5uZXJFbGVtZW50cztcblxuICAgICAgLy8gaW4gc29tZSBjYXNlcywgd2UgbWF5IG5lZWQgdG8gaGF2ZSB0aGUgc3Bpbm5lciBpbiBpdHMgb3duIHdyYXBwZXIgZGl2XG4gICAgICBpZiAod2l0aFdyYXBwZXIpIHtcbiAgICAgICAgbGV0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdzcGlubmVyLXdyYXBwZXInKTtcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChzcGlubmVyKTtcblxuICAgICAgICBzcGlubmVyRWxlbWVudHMgPSB3cmFwcGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bpbm5lckVsZW1lbnRzID0gc3Bpbm5lcjtcbiAgICAgIH1cblxuICAgICAgbGV0IHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCR7dGFyZ2V0U2VsZWN0b3J9YCk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5pbnNlcnRBZGphY2VudEVsZW1lbnQoaW5zZXJ0UG9zaXRpb24sIHNwaW5uZXJFbGVtZW50cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHNwaW5uZXIgZnJvbSB0aGUgRE9NLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBSZXR1cm5zIHRydWUgaWYgdGhlIGl0ZW0gd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICB0aGlzLnJlbW92ZSA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIGF3YWl0IGFzeW5jU2xlZXAodGhpcy53YWl0SW5NaWxsaXNlY29uZHMpO1xuXG4gICAgLy8gdXNpbmcgJ3F1ZXJ5U2VsZWN0b3JBbGwnIHRvIGVuc3VyZSBubyBzcGlubmVyIGlzIGxlZnQgd2l0aCB0aGlzIG5hbWUgYXR0cmlidXRlLiBUaGlzIGNvdmVycyBjYXNlcyB3aGVyZSBhblxuICAgIC8vIGVycm9yIG1heSBjYXVzZSBhbiBleHRyYSBzcGlubmVyIHRvIGJlIGluIHRoZSBET00uXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgZGl2W2RhdGEtbmFtZT0nJHt0aGlzLm5hbWV9J11gKS5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAvLyBzcGVjaWFsIGNhc2UgLSBvbmx5IHNwaW5uZXIgd2l0aCBzdGF0aWMgd3JhcHBlciBhbmQgbm9uLXNwaW5uZXIgZWxlbWVudHMgaW4gaXQgKHJlcXVlc3RlZCBieSBDYXJvbHluKVxuICAgICAgaWYoZWxlbS5jbG9zZXN0KCdbZGF0YS1zb3J0LWJ5LXdyYXBwZXJdJykpIHtcbiAgICAgICAgZWxlbS5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBzcGlubmVyIGhhcyBhIHdyYXBwZXIsIHJlbW92ZSB3cmFwcGVyIHdpdGggdGhlIHNwaW5uZXIgKFRoZXJlIGFyZSBzb21lIGVsZW1lbnRzIHdpdGggYSBzcGlubmVyLXdyYXBwZXIgY2xhc3M7IHRoZXNlIGVsZW1lbnRzIHNob3VsZCBub3QgYmUgcmVtb3ZlZClcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zcGlubmVyLndpdGhXcmFwcGVyICYmIGVsZW0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NwaW5uZXItd3JhcHBlcicpKSB7XG4gICAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW0ucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQge1NwaW5uZXJ9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/spinner.js\n");
250
251/***/ }),
252
253/***/ "./resources/js/theme/theme-manager.js":
254/*!*********************************************!*\
255  !*** ./resources/js/theme/theme-manager.js ***!
256  \*********************************************/
257/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
258
259eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   DEFAULT_THEME: () => (/* binding */ DEFAULT_THEME),\n/* harmony export */   ThemeManager: () => (/* binding */ ThemeManager),\n/* harmony export */   VALID_THEMES: () => (/* binding */ VALID_THEMES),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/classCallCheck */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/classCallCheck.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/createClass */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/createClass.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/includes */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/for-each */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _fetch_helpers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../fetch-helpers */ \"./resources/js/fetch-helpers.js\");\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../notices/notice */ \"./resources/js/notices/notice.js\");\n\n\n\n\n\n\n\n/**\n * Theme Manager\n *\n * Handles theme switching for dark mode and reading themes.\n * Supports: light, dark, sepia, green, auto (system preference)\n */\n\n\n\nvar THEME_COOKIE_NAME = 'theme';\nvar THEME_STORAGE_KEY = 'ministrybooks-theme';\nvar VALID_THEMES = ['light', 'dark', 'sepia', 'green', 'auto'];\nvar DEFAULT_THEME = 'light';\nvar ThemeManager = /*#__PURE__*/function () {\n  function ThemeManager() {\n    var _this = this;\n    (0,_babel_runtime_corejs3_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(this, ThemeManager);
259\n    this.currentTheme = this.getStoredTheme() || DEFAULT_THEME;\n    this.systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)');\n\n    // Listen for system theme changes when using 'auto'\n    this.systemPrefersDark.addEventListener('change', function (e) {\n      if (_this.isThemeFeatureEnabled() && _this.currentTheme === 'auto') {\n        _this.applyTheme('auto');\n      }\n    });\n  }\n\n  /**\n   * Check if theme feature is enabled (set by server via data-theme-enabled attribute)\n   */\n  return (0,_babel_runtime_corejs3_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(ThemeManager, [{\n    key: \"isThemeFeatureEnabled\",\n    value: function isThemeFeatureEnabled() {\n      return document.documentElement.hasAttribute('data-theme-enabled');\n    }\n\n    /**\n     * Initialize theme on page load\n     */\n  }, {\n    key: \"init\",\n    value: function init() {\n      // Only apply stored theme if feature is enabled\n      // Otherwise, leave the server-rendered default (light)\n      if (this.isThemeFeatureEnabled()) {\n        this.applyTheme(this.currentTheme);\n        this.setupEventListeners();\n      }\n    }\n\n    /**\n     * Get stored theme from cookie or localStorage\n     */\n  }, {\n    key: \"getStoredTheme\",\n    value: function getStoredTheme() {\n      // Try cookie first (for server-side rendering)\n      var cookieTheme = this.getCookie(THEME_COOKIE_NAME);\n      if (cookieTheme && _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_4___default()(VALID_THEMES).call(VALID_THEMES, cookieTheme)) {\n        return cookieTheme;\n      }\n\n      // Fall back to localStorage\n      var localTheme = localStorage.getItem(THEME_STORAGE_KEY);\n      if (localTheme && _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_4___default()(VALID_THEMES).call(VALID_THEMES, localTheme)) {\n        return localTheme;\n      }\n      return null;\n    }\n\n    /**\n     * Apply theme to document\n     */\n  }, {\n    key: \"applyTheme\",\n    value: function applyTheme(theme) {\n      if (!_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_4___default()(VALID_THEMES).call(VALID_THEMES, theme)) {\n        theme = DEFAULT_THEME;\n      }\n      document.documentElement.removeAttribute('data-theme');\n      document.documentElement.setAttribute('data-theme', theme);\n      this.updateMetaThemeColor(theme);\n      this.updateThemeIcons(theme);\n      this.currentTheme = theme;\n    }\n\n    /**\n     * Update theme icons in nav bar and reader toolbar\n     */\n  }, {\n    key: \"updateThemeIcons\",\n    value: function updateThemeIcons(theme) {\n      var _context, _context2, _context3, _context4;\n      var iconMap = {\n        light: 'fa-sun',\n        dark: 'fa-moon',\n        sepia: 'fa-scroll',\n        green: 'fa-leaf',\n        auto: 'fa-circle-half-stroke'\n      };\n      var iconClass = iconMap[theme] || iconMap.light;\n\n      // Desktop nav toggle icon\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_5___default()(_context = document.querySelectorAll('.appearance-toggle > i:first-child')).call(_context, function (icon) {\n        icon.className = \"fa-solid \".concat(iconClass);\n      });\n\n      // Mobile header toggle icon\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_5___default()(_context2 = document.querySelectorAll('.theme-button > a > i')).call(_context2, function (icon) {\n        icon.className = \"fa-solid \".concat(iconClass);\n      });\n\n      // Reader toolbar toggle icon\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_5___default()(_context3 = document.querySelectorAll('.theme-toggle > i')).call(_context3, function (icon) {\n        icon.className = \"fa-solid \".concat(iconClass, \" fa-xl\");\n      });\n\n      // Update active state on appearance buttons\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_5___default()(_context4 = document.querySelectorAll('.appearance-btn')).call(_context4, function (btn) {\n        btn.classList.toggle('active', btn.dataset.theme === theme);\n      });\n    }\n\n    /**\n     * Set and persist theme to cookie/localStorage\n     */\n  }, {\n    key: \"setTheme\",\n    value: (function () {\n      var _setTheme = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().mark(function _callee(theme) {\n        var saveToDb,\n          _args = arguments;\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().wrap(function _callee$(_context5) {\n          while (1) switch (_context5.prev = _context5.next) {\n            case 0:\n              saveToDb = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;\n              if (!_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_4___default()(VALID_THEMES).call(VALID_THEMES, theme)) {\n                theme = DEFAULT_THEME;\n              }\n              this.applyTheme(theme);\n              this.setCookie(THEME_COOKIE_NAME, theme, 365, '/');\n              localStorage.setItem(THEME_STORAGE_KEY, theme);\n              if (!saveToDb) {\n                _context5.next = 8;\n                break;\n              }\n              _context5.next = 8;\n              return this.saveThemeToDb(theme);\n            case 8:\n              window.dispatchEvent(new CustomEvent('themechange', {\n                detail: {\n                  theme: theme\n                }\n              }));\n            case 9:\n            case \"end\":\n              return _context5.stop();\n          }\n        }, _callee, this);\n      }));
259\n      function setTheme(_x) {\n        return _setTheme.apply(this, arguments);\n      }\n      return setTheme;\n    }()\n    /**\n     * Save theme preference to database\n     */\n    )\n  }, {\n    key: \"saveThemeToDb\",\n    value: (function () {\n      var _saveThemeToDb = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().mark(function _callee2(theme) {\n        var _wrapper$dataset;\n        var wrapper, url, data, response, notice;\n        return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().wrap(function _callee2$(_context6) {\n          while (1) switch (_context6.prev = _context6.next) {\n            case 0:\n              wrapper = document.querySelector('#user-settings-wrapper');\n              url = wrapper === null || wrapper === void 0 || (_wrapper$dataset = wrapper.dataset) === null || _wrapper$dataset === void 0 ? void 0 : _wrapper$dataset.url;\n              if (url) {\n                _context6.next = 4;\n                break;\n              }\n              return _context6.abrupt(\"return\", false);\n            case 4:\n              _context6.prev = 4;\n              data = {\n                ThemePreference: theme\n              };\n              _context6.next = 8;\n              return new _fetch_helpers__WEBPACK_IMPORTED_MODULE_7__[\"default\"]().fetchData('POST', url, data);\n            case 8:\n              response = _context6.sent;\n              if (response.success) {\n                _context6.next = 13;\n                break;\n              }\n              notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_8__.AsyncNotice('Failed to save theme preference', 'error');\n              notice.create().then(function () {\n                return notice.remove(3);\n              });\n              return _context6.abrupt(\"return\", false);\n            case 13:\n              return _context6.abrupt(\"return\", true);\n            case 16:\n              _context6.prev = 16;\n              _context6.t0 = _context6[\"catch\"](4);\n              console.error('Failed to save theme preference:', _context6.t0);\n              return _context6.abrupt(\"return\", false);\n            case 20:\n            case \"end\":\n              return _context6.stop();\n          }\n        }, _callee2, null, [[4, 16]]);\n      }));\n      function saveThemeToDb(_x2) {\n        return _saveThemeToDb.apply(this, arguments);\n      }\n      return saveThemeToDb;\n    }()\n    /**\n     * Update meta theme-color for mobile browsers\n     */\n    )\n  }, {\n    key: \"updateMetaThemeColor\",\n    value: function updateMetaThemeColor(theme) {\n      var colors = {\n        light: '#ffffff',\n        dark: '#1a1a1a',\n        sepia: '#f4ecd8',\n        green: '#d4e8d1',\n        auto: this.systemPrefersDark.matches ? '#1a1a1a' : '#ffffff'\n      };\n      var metaThemeColor = document.querySelector('meta[name=\"theme-color\"]');\n      if (!metaThemeColor) {\n        metaThemeColor = document.createElement('meta');\n        metaThemeColor.name = 'theme-color';\n        document.head.appendChild(metaThemeColor);\n      }\n      metaThemeColor.content = colors[theme] || colors.light;\n    }\n\n    /**\n     * Setup event listeners for theme selectors\n     */\n  }, {\n    key: \"setupEventListeners\",\n    value: function setupEventListeners() {\n      var _this2 = this;\n      var themeInputs = document.querySelectorAll('input[name=\"theme-preference\"]');\n      _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_5___default()(themeInputs).call(themeInputs, function (input) {\n        input.addEventListener('change', /*#__PURE__*/function () {\n          var _ref = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().mark(function _callee3(e) {\n            var _context7, _e$target$closest;\n            var selectedTheme;\n            return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().wrap(function _callee3$(_context8) {\n              while (1) switch (_context8.prev = _context8.next) {\n                case 0:\n                  selectedTheme = e.target.value;\n                  _context8.next = 3;\n                  return _this2.setTheme(selectedTheme, true);\n                case 3:\n                  _babel_runtime_corejs3_core_js_stable_instance_for_each__WEBPACK_IMPORTED_MODULE_5___default()(_context7 = document.querySelectorAll('.theme-option')).call(_context7, function (opt) {\n                    return opt.classList.remove('selected');\n                  });\n                  (_e$target$closest = e.target.closest('.theme-option')) === null || _e$target$closest === void 0 || _e$target$closest.classList.add('selected');\n                case 5:\n                case \"end\":\n                  return _context8.stop();\n              }\n            }, _callee3);\n          }));\n          return function (_x3) {\n            return _ref.apply(this, arguments);\n          };\n        }());\n      });\n    }\n\n    /**\n     * Get current effective theme (resolves 'auto' to actual theme)\n     */\n  }, {\n    key: \"getEffectiveTheme\",\n    value: function getEffectiveTheme(
259) {\n      if (this.currentTheme === 'auto') {\n        return this.systemPrefersDark.matches ? 'dark' : 'light';\n      }\n      return this.currentTheme;\n    }\n\n    /**\n     * Get cookie value\n     */\n  }, {\n    key: \"getCookie\",\n    value: function getCookie(name) {\n      var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));\n      return match ? match[2] : null;\n    }\n\n    /**\n     * Set cookie value\n     */\n  }, {\n    key: \"setCookie\",\n    value: function setCookie(name, value, days) {\n      var _context9, _context10, _context11;\n      var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n      var expires = new Date();\n      expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);\n      document.cookie = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_6___default()(_context9 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_6___default()(_context10 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_6___default()(_context11 = \"\".concat(name, \"=\")).call(_context11, value, \";expires=\")).call(_context10, expires.toUTCString(), \";path=\")).call(_context9, path);\n    }\n  }]);\n}(); // Create singleton instance\nvar themeManager = new ThemeManager();\n\n// Initialize on DOM ready\nif (document.readyState === 'loading') {\n  document.addEventListener('DOMContentLoaded', function () {\n    return themeManager.init();\n  });\n} else {\n  themeManager.init();\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (themeManager);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdGhlbWUvdGhlbWUtbWFuYWdlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQWRBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBckJBO0FBQUE7QUFBQTtBQUFBO0FBdUJBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBSUE7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy90aGVtZS90aGVtZS1tYW5hZ2VyLmpzP2Y4NzAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGVtZSBNYW5hZ2VyXG4gKlxuICogSGFuZGxlcyB0aGVtZSBzd2l0Y2hpbmcgZm9yIGRhcmsgbW9kZSBhbmQgcmVhZGluZyB0aGVtZXMuXG4gKiBTdXBwb3J0czogbGlnaHQsIGRhcmssIHNlcGlhLCBncmVlbiwgYXV0byAoc3lzdGVtIHByZWZlcmVuY2UpXG4gKi9cblxuaW1wb3J0IEZldGNoSGVscGVycyBmcm9tICcuLi9mZXRjaC1oZWxwZXJzJztcbmltcG9ydCB7
259IEFzeW5jTm90aWNlIH0gZnJvbSAnLi4vbm90aWNlcy9ub3RpY2UnO1xuXG5jb25zdCBUSEVNRV9DT09LSUVfTkFNRSA9ICd0aGVtZSc7XG5jb25zdCBUSEVNRV9TVE9SQUdFX0tFWSA9ICdtaW5pc3RyeWJvb2tzLXRoZW1lJztcbmNvbnN0IFZBTElEX1RIRU1FUyA9IFsnbGlnaHQnLCAnZGFyaycsICdzZXBpYScsICdncmVlbicsICdhdXRvJ107XG5jb25zdCBERUZBVUxUX1RIRU1FID0gJ2xpZ2h0JztcblxuY2xhc3MgVGhlbWVNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jdXJyZW50VGhlbWUgPSB0aGlzLmdldFN0b3JlZFRoZW1lKCkgfHwgREVGQVVMVF9USEVNRTtcbiAgICB0aGlzLnN5c3RlbVByZWZlcnNEYXJrID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKTtcblxuICAgIC8vIExpc3RlbiBmb3Igc3lzdGVtIHRoZW1lIGNoYW5nZXMgd2hlbiB1c2luZyAnYXV0bydcbiAgICB0aGlzLnN5c3RlbVByZWZlcnNEYXJrLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RoZW1lRmVhdHVyZUVuYWJsZWQoKSAmJiB0aGlzLmN1cnJlbnRUaGVtZSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHRoaXMuYXBwbHlUaGVtZSgnYXV0bycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZW1lIGZlYXR1cmUgaXMgZW5hYmxlZCAoc2V0IGJ5IHNlcnZlciB2aWEgZGF0YS10aGVtZS1lbmFibGVkIGF0dHJpYnV0ZSlcbiAgICovXG4gIGlzVGhlbWVGZWF0dXJlRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS10aGVtZS1lbmFibGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGVtZSBvbiBwYWdlIGxvYWRcbiAgICovXG4gIGluaXQoKSB7XG4gICAgLy8gT25seSBhcHBseSBzdG9yZWQgdGhlbWUgaWYgZmVhdHVyZSBpcyBlbmFibGVkXG4gICAgLy8gT3RoZXJ3aXNlLCBsZWF2ZSB0aGUgc2VydmVyLXJlbmRlcmVkIGRlZmF1bHQgKGxpZ2h0KVxuICAgIGlmICh0aGlzLmlzVGhlbWVGZWF0dXJlRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmFwcGx5VGhlbWUodGhpcy5jdXJyZW50VGhlbWUpO1xuICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdG9yZWQgdGhlbWUgZnJvbSBjb29raWUgb3IgbG9jYWxTdG9yYWdlXG4gICAqL1xuICBnZXRTdG9yZWRUaGVtZSgpIHtcbiAgICAvLyBUcnkgY29va2llIGZpcnN0IChmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nKVxuICAgIGNvbnN0IGNvb2tpZVRoZW1lID0gdGhpcy5nZXRDb29raWUoVEhFTUVfQ09PS0lFX05BTUUpO1xuICAgIGlmIChjb29raWVUaGVtZSAmJiBWQUxJRF9USEVNRVMuaW5jbHVkZXMoY29va2llVGhlbWUpKSB7XG4gICAgICByZXR1cm4gY29va2llVGhlbWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIGxvY2FsU3RvcmFnZVxuICAgIGNvbnN0IGxvY2FsVGhlbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShUSEVNRV9TVE9SQUdFX0tFWSk7XG4gICAgaWYgKGxvY2FsVGhlbWUgJiYgVkFMSURfVEhFTUVTLmluY2x1ZGVzKGxvY2FsVGhlbWUpKSB7XG4gICAgICByZXR1cm4gbG9jYWxUaGVtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGVtZSB0byBkb2N1bWVudFxuICAgKi9cbiAgYXBwbHlUaGVtZSh0aGVtZSkge1xuICAgIGlmICghVkFMSURfVEhFTUVTLmluY2x1ZGVzKHRoZW1lKSkge1xuICAgICAgdGhlbWUgPSBERUZBVUxUX1RIRU1FO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnKTtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRoZW1lJywgdGhlbWUpO1xuICAgIHRoaXMudXBkYXRlTWV0YVRoZW1lQ29sb3IodGhlbWUpO1xuICAgIHRoaXMudXBkYXRlVGhlbWVJY29ucyh0aGVtZSk7XG4gICAgdGhpcy5jdXJyZW50VGhlbWUgPSB0aGVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlbWUgaWNvbnMgaW4gbmF2IGJhciBhbmQgcmVhZGVyIHRvb2xiYXJcbiAgICovXG4gIHVwZGF0ZVRoZW1lSWNvbnModGhlbWUpIHtcbiAgICBjb25zdCBpY29uTWFwID0ge1xuICAgICAgbGlnaHQ6ICdmYS1zdW4nLFxuICAgICAgZGFyazogJ2ZhLW1vb24nLFxuICAgICAgc2VwaWE6ICdmYS1zY3JvbGwnLFxuICAgICAgZ3JlZW46ICdmYS1sZWFmJyxcbiAgICAgIGF1dG86ICdmYS1jaXJjbGUtaGFsZi1zdHJva2UnLFxuICAgIH07XG4gICAgY29uc3QgaWNvbkNsYXNzID0gaWNvbk1hcFt0aGVtZV0gfHwgaWNvbk1hcC5saWdodDtcblxuICAgIC8vIERlc2t0b3AgbmF2IHRvZ2dsZSBpY29uXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFwcGVhcmFuY2UtdG9nZ2xlID4gaTpmaXJzdC1jaGlsZCcpLmZvckVhY2goaWNvbiA9PiB7XG4gICAgICBpY29uLmNsYXNzTmFtZSA9IGBmYS1zb2xpZCAke2ljb25DbGFzc31gO1xuICAgIH0pO1xuXG4gICAgLy8gTW9iaWxlIGhlYWRlciB0b2dnbGUgaWNvblxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGVtZS1idXR0b24gPiBhID4gaScpLmZvckVhY2goaWNvbiA9PiB7XG4gICAgICBpY29uLmNsYXNzTmFtZSA9IGBmYS1zb2xpZCAke2ljb25DbGFzc31gO1xuICAgIH0pO1xuXG4gICAgLy8gUmVhZGVyIHRvb2xiYXIgdG9nZ2xlIGljb25cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlbWUtdG9nZ2xlID4gaScpLmZvckVhY2goaWNvbiA9PiB7XG4gICAgICBpY29uLmNsYXNzTmFtZSA9IGBmYS1zb2xpZCAke2ljb25DbGFzc30gZmEteGxgO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIGFjdGl2ZSBzdGF0ZSBvbiBhcHBlYXJhbmNlIGJ1dHRvbnNcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYXBwZWFyYW5jZS1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uY2x
259hc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmRhdGFzZXQudGhlbWUgPT09IHRoZW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYW5kIHBlcnNpc3QgdGhlbWUgdG8gY29va2llL2xvY2FsU3RvcmFnZVxuICAgKi9cbiAgYXN5bmMgc2V0VGhlbWUodGhlbWUsIHNhdmVUb0RiID0gZmFsc2UpIHtcbiAgICBpZiAoIVZBTElEX1RIRU1FUy5pbmNsdWRlcyh0aGVtZSkpIHtcbiAgICAgIHRoZW1lID0gREVGQVVMVF9USEVNRTtcbiAgICB9XG5cbiAgICB0aGlzLmFwcGx5VGhlbWUodGhlbWUpO1xuICAgIHRoaXMuc2V0Q29va2llKFRIRU1FX0NPT0tJRV9OQU1FLCB0aGVtZSwgMzY1LCAnLycpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFRIRU1FX1NUT1JBR0VfS0VZLCB0aGVtZSk7XG5cbiAgICBpZiAoc2F2ZVRvRGIpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZVRoZW1lVG9EYih0aGVtZSk7XG4gICAgfVxuXG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCd0aGVtZWNoYW5nZScsIHsgZGV0YWlsOiB7IHRoZW1lIH0gfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlbWUgcHJlZmVyZW5jZSB0byBkYXRhYmFzZVxuICAgKi9cbiAgYXN5bmMgc2F2ZVRoZW1lVG9EYih0aGVtZSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdXNlci1zZXR0aW5ncy13cmFwcGVyJyk7XG4gICAgY29uc3QgdXJsID0gd3JhcHBlcj8uZGF0YXNldD8udXJsO1xuXG4gICAgaWYgKCF1cmwpIHJldHVybiBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0geyBUaGVtZVByZWZlcmVuY2U6IHRoZW1lIH07XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5ldyBGZXRjaEhlbHBlcnMoKS5mZXRjaERhdGEoJ1BPU1QnLCB1cmwsIGRhdGEpO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3Qgbm90aWNlID0gbmV3IEFzeW5jTm90aWNlKCdGYWlsZWQgdG8gc2F2ZSB0aGVtZSBwcmVmZXJlbmNlJywgJ2Vycm9yJyk7XG4gICAgICAgIG5vdGljZS5jcmVhdGUoKS50aGVuKCgpID0+IG5vdGljZS5yZW1vdmUoMykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc2F2ZSB0aGVtZSBwcmVmZXJlbmNlOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1ldGEgdGhlbWUtY29sb3IgZm9yIG1vYmlsZSBicm93c2Vyc1xuICAgKi9cbiAgdXBkYXRlTWV0YVRoZW1lQ29sb3IodGhlbWUpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB7XG4gICAgICBsaWdodDogJyNmZmZmZmYnLFxuICAgICAgZGFyazogJyMxYTFhMWEnLFxuICAgICAgc2VwaWE6ICcjZjRlY2Q4JyxcbiAgICAgIGdyZWVuOiAnI2Q0ZThkMScsXG4gICAgICBhdXRvOiB0aGlzLnN5c3RlbVByZWZlcnNEYXJrLm1hdGNoZXMgPyAnIzFhMWExYScgOiAnI2ZmZmZmZidcbiAgICB9O1xuXG4gICAgbGV0IG1ldGFUaGVtZUNvbG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidGhlbWUtY29sb3JcIl0nKTtcbiAgICBpZiAoIW1ldGFUaGVtZUNvbG9yKSB7XG4gICAgICBtZXRhVGhlbWVDb2xvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21ldGEnKTtcbiAgICAgIG1ldGFUaGVtZUNvbG9yLm5hbWUgPSAndGhlbWUtY29sb3InO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChtZXRhVGhlbWVDb2xvcik7XG4gICAgfVxuICAgIG1ldGFUaGVtZUNvbG9yLmNvbnRlbnQgPSBjb2xvcnNbdGhlbWVdIHx8IGNvbG9ycy5saWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCBldmVudCBsaXN0ZW5lcnMgZm9yIHRoZW1lIHNlbGVjdG9yc1xuICAgKi9cbiAgc2V0dXBFdmVudExpc3RlbmVycygpIHtcbiAgICBjb25zdCB0aGVtZUlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJ0aGVtZS1wcmVmZXJlbmNlXCJdJyk7XG5cbiAgICB0aGVtZUlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVGhlbWUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRUaGVtZShzZWxlY3RlZFRoZW1lLCB0cnVlKTtcblxuICAgICAgICBkb2
259N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGhlbWUtb3B0aW9uJykuZm9yRWFjaChvcHQgPT4gb3B0LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJykpO1xuICAgICAgICBlLnRhcmdldC5jbG9zZXN0KCcudGhlbWUtb3B0aW9uJyk/LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBlZmZlY3RpdmUgdGhlbWUgKHJlc29sdmVzICdhdXRvJyB0byBhY3R1YWwgdGhlbWUpXG4gICAqL1xuICBnZXRFZmZlY3RpdmVUaGVtZSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50VGhlbWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIHRoaXMuc3lzdGVtUHJlZmVyc0RhcmsubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRUaGVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29va2llIHZhbHVlXG4gICAqL1xuICBnZXRDb29raWUobmFtZSkge1xuICAgIGNvbnN0IG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefCApJyArIG5hbWUgKyAnPShbXjtdKyknKSk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMl0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjb29raWUgdmFsdWVcbiAgICovXG4gIHNldENvb2tpZShuYW1lLCB2YWx1ZSwgZGF5cywgcGF0aCA9ICcvJykge1xuICAgIGNvbnN0IGV4cGlyZXMgPSBuZXcgRGF0ZSgpO1xuICAgIGV4cGlyZXMuc2V0VGltZShleHBpcmVzLmdldFRpbWUoKSArIGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBkb2N1bWVudC5jb29raWUgPSBgJHtuYW1lfT0ke3ZhbHVlfTtleHBpcmVzPSR7ZXhwaXJlcy50b1VUQ1N0cmluZygpfTtwYXRoPSR7cGF0aH1gO1xuICB9XG59XG5cbi8vIENyZWF0ZSBzaW5nbGV0b24gaW5zdGFuY2VcbmNvbnN0IHRoZW1lTWFuYWdlciA9IG5ldyBUaGVtZU1hbmFnZXIoKTtcblxuLy8gSW5pdGlhbGl6ZSBvbiBET00gcmVhZHlcbmlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHRoZW1lTWFuYWdlci5pbml0KCkpO1xufSBlbHNlIHtcbiAgdGhlbWVNYW5hZ2VyLmluaXQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGhlbWVNYW5hZ2VyO1xuZXhwb3J0IHsgVGhlbWVNYW5hZ2VyLCBWQUxJRF9USEVNRVMsIERFRkFVTFRfVEhFTUUgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/theme/theme-manager.js\n");
260
261/***/ }),
262
263/***/ "./resources/js/utilities/bfcache-reload.js":
264/*!**************************************************!*\
265  !*** ./resources/js/utilities/bfcache-reload.js ***!
266  \**************************************************/
267/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
268
269eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   handlePageShow: () => (/* binding */ handlePageShow),\n/* harmony export */   registerBfcacheReload: () => (/* binding */ registerBfcacheReload)\n/* harmony export */ });\n/**\n * Back-forward cache (bfcache) reload guard.\n *\n * Safari/iOS and Firefox keep a fully-rendered copy of a page in memory and can\n * restore it on back/forward navigation WITHOUT re-requesting it from the server\n * (the \"bfcache\"). Cache-Control: no-store stops disk caching but does not stop\n * bfcache restoration, so a signed-out user could still see a stale, personalized\n * authenticated DOM (dark theme + \"Sign Out\") after a silent sign-out.\n *\n * When a page is restored from the bfcache, `pageshow` fires with\n * event.persisted === true. In that case we force a reload so the page\n * revalidates against the live server session and renders the correct\n * (anonymous) variant.\n */\n\n/**\n * A fresh redirect landing (e.g. a POST /sign-out followed by a 302 to the home page)\n * does NOT set `event.persisted`, so this guard cannot swallow a just-set flash message\n * on that path — investigated and disproved with real engine reproductions (not just\n * spec reading) for #3572: a minimal POST -> 302 -> GET harness run against actual\n * Chromium AND Firefox via Playwright showed `persisted: false` on the landing page in\n * both engines, and the server-rendered flash rendered correctly in both. `persisted`\n * can only be true when the browser reuses an already-alive Document instance from\n * session history — a freshly-redirected navigation always creates a brand-new\n * Document, so there is nothing for it to restore.\n *\n * Handle a pageshow event, reloading the page when it was restored from the\n * back-forward cache.\n *\n * @param {PageTransitionEvent} event - The pageshow event.\n * @returns {void}\n */\nfunction handlePageShow(event) {\n  if (event && event.persisted) {\n    window.location.reload();\n  }\n}\n\n/**\n * Register the bfcache reload handler on the current window.\n *\n * No-op in non-browser contexts (e.g. SSR / unit runners without a window).\n *\n * @returns {void}\n */\nfunction registerBfcacheReload() {\n  if (typeof window === 'undefined') {\n    return;\n  }\n  window.addEventListener('pageshow', handlePageShow);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2JmY2FjaGUtcmVsb2FkLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2JmY2FjaGUtcmVsb2FkLmpzPzNjODMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYWNrLWZvcndhcmQgY2FjaGUgKGJmY2FjaGUpIHJlbG9hZCBndWFyZC5cbiAqXG4gKiBTYWZhcmkvaU9TIGFuZCBGaXJlZm94IGtlZXAgYSBmdWxseS1yZW5kZXJlZCBjb3B5IG9mIGEgcGFnZSBpbiBtZW1vcnkgYW5kIGNhblxuICogcmVzdG9yZSBpdCBvbiBiYWNrL2ZvcndhcmQgbmF2aWdhdGlvbiBXSVRIT1VUIHJlLXJlcXVlc3RpbmcgaXQgZnJvbSB0aGUgc2VydmVyXG4gKiAodGhlIFwiYmZjYWNoZVwiKS4gQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUgc3RvcHMgZGlzayBjYWNoaW5nIGJ1dCBkb2VzIG5vdCBzdG9wXG4gKiBiZmNhY2hlIHJlc3RvcmF0aW9uLCBzbyBhIHNpZ25lZC1vdXQgdXNlciBjb3VsZCBzdGlsbCBzZWUgYSBzdGFsZSwgcGVyc29uYWxpemVkXG4gKiBhdXRoZW50aWNhdGVkIERPTSAoZGFyayB0aGVtZSArIFwiU2lnbiBPdXRcIikgYWZ0ZXIgYSBzaWxlbnQgc2lnbi1vdXQuXG4gKlxuICogV2hlbiBhIHBhZ2UgaXMgcmVzdG9yZWQgZnJvbSB0aGUgYmZjYWNoZSwgYHBhZ2VzaG93YCBmaXJlcyB3aXRoXG4gKiBldmVudC5wZXJzaXN0ZWQgPT09IHRydWUuIEluIHRoYXQgY2FzZSB3ZSBmb3JjZSBhIHJlbG9hZCBzbyB0aGUgcGFnZVxuICogcmV2YWxpZGF0ZXMgYWdhaW5zdCB0aGUgbGl2ZSBzZXJ2ZXIgc2Vzc2lvbiBhbmQgcmVuZGVycyB0aGUgY29ycmVjdFxuICogKGFub255bW91cykgdmFyaWFudC5cbiAqL1xuXG4vKipcbiAqIEEgZnJlc2ggcmVkaXJlY3QgbGFuZGluZyAoZS5nLiBhIFBPU1QgL3NpZ24tb3V0IGZvbGxvd2VkIGJ5IGEgMzAyIHRvIHRoZSBob21lIHBhZ2UpXG4gKiBkb2VzIE5PVCBzZXQgYGV2ZW50LnBlcnNpc3RlZGAsIHNvIHRoaXMgZ3VhcmQgY2Fubm90IHN3YWxsb3cgYSBqdXN0LXNldCBmbGFzaCBtZXNzYWdlXG4gKiBvbiB0aGF0IHBhdGgg4oCUIGludmVzdGlnYXRlZCBhbmQgZGlzcHJvdmVkIHdpdGggcmVhbCBlbmdpbmUgcmVwcm9kdWN0aW9ucyAobm90IGp1c3RcbiAqIHNwZWMgcmVhZGluZykgZm9yICMzNTcyOiBhIG1pbmltYWwgUE9TVCAtPiAzMDIgLT4gR0VUIGhhcm5lc3MgcnVuIGFnYWluc3QgYWN0dWFsXG4gKiBDaHJvbWl1bSBBTkQgRmlyZWZveCB2aWEgUGxheXdyaWdodCBzaG93ZWQgYHBlcnNpc3RlZDogZmFsc2VgIG9uIHRoZSBsYW5kaW5nIHBhZ2UgaW5cbiAqIGJvdGggZW5naW5lcywgYW5kIHR
269oZSBzZXJ2ZXItcmVuZGVyZWQgZmxhc2ggcmVuZGVyZWQgY29ycmVjdGx5IGluIGJvdGguIGBwZXJzaXN0ZWRgXG4gKiBjYW4gb25seSBiZSB0cnVlIHdoZW4gdGhlIGJyb3dzZXIgcmV1c2VzIGFuIGFscmVhZHktYWxpdmUgRG9jdW1lbnQgaW5zdGFuY2UgZnJvbVxuICogc2Vzc2lvbiBoaXN0b3J5IOKAlCBhIGZyZXNobHktcmVkaXJlY3RlZCBuYXZpZ2F0aW9uIGFsd2F5cyBjcmVhdGVzIGEgYnJhbmQtbmV3XG4gKiBEb2N1bWVudCwgc28gdGhlcmUgaXMgbm90aGluZyBmb3IgaXQgdG8gcmVzdG9yZS5cbiAqXG4gKiBIYW5kbGUgYSBwYWdlc2hvdyBldmVudCwgcmVsb2FkaW5nIHRoZSBwYWdlIHdoZW4gaXQgd2FzIHJlc3RvcmVkIGZyb20gdGhlXG4gKiBiYWNrLWZvcndhcmQgY2FjaGUuXG4gKlxuICogQHBhcmFtIHtQYWdlVHJhbnNpdGlvbkV2ZW50fSBldmVudCAtIFRoZSBwYWdlc2hvdyBldmVudC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUGFnZVNob3coZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICYmIGV2ZW50LnBlcnNpc3RlZCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBiZmNhY2hlIHJlbG9hZCBoYW5kbGVyIG9uIHRoZSBjdXJyZW50IHdpbmRvdy5cbiAqXG4gKiBOby1vcCBpbiBub24tYnJvd3NlciBjb250ZXh0cyAoZS5nLiBTU1IgLyB1bml0IHJ1bm5lcnMgd2l0aG91dCBhIHdpbmRvdykuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckJmY2FjaGVSZWxvYWQoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlc2hvdycsIGhhbmRsZVBhZ2VTaG93KTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/utilities/bfcache-reload.js\n");
270
271/***/ }),
272
273/***/ "./resources/js/utilities/challenge-aware-fetch.js":
274/*!*********************************************************!*\
275  !*** ./resources/js/utilities/challenge-aware-fetch.js ***!
276  \*********************************************************/
277/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
278
279eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   assertNotChallenged: () => (/* binding */ assertNotChallenged),\n/* harmony export */   attachReloadButton: () => (/* binding */ attachReloadButton),\n/* harmony export */   buildReloadButton: () => (/* binding */ buildReloadButton),\n/* harmony export */   challengeAwareFetch: () => (/* binding */ challengeAwareFetch),\n/* harmony export */   isChallengeError: () => (/* binding */ isChallengeError),\n/* harmony export */   isChallengeResponse: () => (/* binding */ isChallengeResponse),\n/* harmony export */   isStaleClient: () => (/* binding */ isStaleClient),\n/* harmony export */   notifyChallengeDetected: () => (/* binding */ notifyChallengeDetected),\n/* harmony export */   resetChallengeNoticeFlag: () => (/* binding */ resetChallengeNoticeFlag),\n/* harmony export */   selectChallengeMessage: () => (/* binding */ selectChallengeMessage)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/includes */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/array/from */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../notices/notice */ \"./resources/js/notices/notice.js\");\n\n\n\n\n/**\n * Challenge-aware fetch helpers (#3244, Epic #3240; refined in #3340).\n *\n * When a Cloudflare managed challenge (or a cf_clearance expiry mid-session)\n * intercepts a background same-origin request, the page receives an HTML\n * challenge page where it expected JSON. JS cannot solve the challenge, so the\n * only remedy is a full page reload. These helpers recognize that situation,\n * surface an honest user notice, and reject with a distinctive error so callers\n * can keep their payloads instead of failing silently or showing a generic error.\n *\n * The notice is now CF-aware and honest about unsaved data (#3340):\n *  - a stale-client (deploy/version mismatch) gets an \"updated, reload\" message;\n *  - an edge challenge on a READ gets a \"security check interrupted\" message;\n *  - an edge challenge on a data-MUTATING call names the data that may not have\n *    been saved, and fires on EVERY such failure (a lost save matters each time),\n *    while reads/stale-client keep the once-per-page suppression to avoid spam.\n *\n * Adoption seams:\n *  - FetchHelpers.fetchData (fetch-helpers.js) runs assertNotChallenged() on\n *    every response, covering all JSON AJAX flows that use it. Write call sites\n *    pass {mutating:true, dataLabel:'...'} so the notice can name the data.\n *  - Raw fetch call sites (e.g. the audio player position sync) call\n *    assertNotChallenged(response) directly, or use challengeAwareFetch().\n *\n * Diagnostics opt out of the notice (#4216). AsyncNotice.log() posts the notice's\n * own text to log-frontend-error.php through this same seam, so under an edge\n * challenge that log POST is challenged too and would raise a SECOND notice for\n * the first notice — error reporting amplifying itself. Callers that carry no\n * user intent pass {notify: false}: detection and the thrown\n * ChallengeInterceptedError are unchanged, only the user-facing notice is skipped.\n */\n\n\nvar CHALLENGE_ERROR_NAME = 'ChallengeInterceptedError';\n\n// Window-scoped so the notice shows at most once per page even when several\n// gulp entry bundles (each with its own copy of this module) detect the\n// challenge from concurrent background calls. Mutating challenges intentionally\n// bypass this flag (see notifyChallengeDetected).\nvar NOTICE_SHOWN_FLAG = '__mbChallengeNoticeShown';\nvar RELOAD_BUTTON_CLASS = 'challenge-reload-button';\n\n/**\n * Detect a response produced by an edge challenge rather than the application.\n *\n * Conservative by design: a plain 403 (or any status) with a JSON body is a\n * legitimate application error and must NOT be treated as a challenge.\n *\n * @param {Response} response - Fetch API Response (or compatible object)\n * @param {Object} [options]\n * @param {boolean} [options.expectJson=true] - Caller expected a JSON body\n * @returns {boolean}\n */\nvar isChallengeResponse = function isChallengeResponse(response) {\n  var _response$headers;\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n    _ref$expectJson = _ref.expectJson,\n    expectJson = _ref$expectJson === void 0 ? true : _ref$expectJson;\n  if (!response || typeof ((_response$headers = response.headers) === null || _response$headers === void 0 ? void 0 : _response$headers.get) !== 'function') {\n    return false;\n  }\n\n  // Cloudflare stamps challenge interceptions with this header (e.g. \"challenge\").\n  if (response.headers.get('cf-mitigated')) {\n    return true;\n  }\n  var contentType = (response.headers.get('content-type') || '').toLowerCase();\n  var isHtml = _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_2___default()(contentType).call(contentType, 'text/html');\n\n  // A genuine edge challenge is never a successful 2xx — it is a non-2xx\n  // interstitial (or carries cf-mitigated, handled above). A 200 JSON response\n  // that merely lacks an application/json header must NOT be misread as a\n  // challenge (#3342), so the HTML-where-JSON heuristic only fires on non-2xx.\
279n  var isSuccess = response.status >= 200 && response.status < 300;\n\n  // An HTML body where the caller expected JSON is a challenge/interception page.\n  if (expectJson && isHtml && !isSuccess) {\n    return true;\n  }\n\n  // A 403 carrying an HTML body is a challenge signature even for non-JSON callers.\n  return response.status === 403 && isHtml;\n};\n\n/**\n * True when an error was raised by assertNotChallenged()/challengeAwareFetch().\n *\n * @param {*} error\n * @returns {boolean}\n */\nvar isChallengeError = function isChallengeError(error) {\n  return (error === null || error === void 0 ? void 0 : error.name) === CHALLENGE_ERROR_NAME || (error === null || error === void 0 ? void 0 : error.isChallenge) === true;\n};\n\n/**\n * Detect a stale client: the page booted on one build but the server has since\n * been redeployed (#3315). Every response carries the current server build in\n * the `X-App-Version` header; the page recorded its own boot version in the\n * `window.__APP_VERSION` global. When they differ, the loaded bundles are stale\n * and a reload is the remedy.\n *\n * Null-safe by design: if either side is missing (no header, or the global was\n * not injected) we return false so normal requests never nag the user.\n *\n * @param {Response} response - Fetch API Response (or compatible object)\n * @returns {boolean}\n */\nvar isStaleClient = function isStaleClient(response) {\n  var _response$headers2;\n  if (!response || typeof ((_response$headers2 = response.headers) === null || _response$headers2 === void 0 ? void 0 : _response$headers2.get) !== 'function') {\n    return false;\n  }\n  var bootedVersion = window.__APP_VERSION;\n  if (!bootedVersion) {\n    return false;\n  }\n  var serverVersion = response.headers.get('x-app-version');\n  if (!serverVersion) {\n    return false;\n  }\n  return serverVersion !== bootedVersion;\n};\n\n/**\n * Pure message selector: choose the honest notice text for a given situation.\n *\n * Exported so it can be asserted directly in tests. i18n is read at call time\n * (never at module top level — #2110) with English fallbacks that exactly match\n * the ticket copy.\n *\n * @param {Object} [context]\n * @param {boolean} [context.stale=false] - deploy/version mismatch (reload heals it)\n * @param {boolean} [context.mutating=false] - the blocked call was a data write\n * @param {string} [context.dataLabel] - plain-words name of the data at risk\n * @returns {string}\n */\nvar selectChallengeMessage = function selectChallengeMessage() {\n  var _i18n$challenge_notic4;\n  var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n    _ref2$stale = _ref2.stale,\n    stale = _ref2$stale === void 0 ? false : _ref2$stale,\n    _ref2$mutating = _ref2.mutating,\n    mutating = _ref2$mutating === void 0 ? false : _ref2$mutating,\n    dataLabel = _ref2.dataLabel;\n  var i18n = window.__i18n || {};\n  if (stale) {\n    var _i18n$challenge_notic;\n    return (_i18n$challenge_notic = i18n.challenge_notice_stale_client) !== null && _i18n$challenge_notic !== void 0 ? _i18n$challenge_notic : 'The site was just updated. Reload to get the latest version.';\n  }\n  if (mutating) {\n    var _i18n$challenge_notic2, _i18n$challenge_notic3;\n    var template = (_i18n$challenge_notic2 = i18n.challenge_notice_data_at_risk) !== null && _i18n$challenge_notic2 !== void 0 ? _i18n$challenge_notic2 : 'A security check blocked this action, so your :label may not have been saved. Please reload and try again.';\n    var label = dataLabel ? dataLabel : (_i18n$challenge_notic3 = i18n.challenge_notice_data_generic_label) !== null && _i18n$challenge_notic3 !== void 0 ? _i18n$challenge_notic3 : 'recent change';\n    return template.replace(':label', label);\n  }\n  return (_i18n$challenge_notic4 = i18n.challenge_notice_reload) !== null && _i18n$challenge_notic4 !== void 0 ? _i18n$challenge_notic4 : 'A security check interrupted this request. Please reload the page, then try again.';\n};\n\n/**\n * Build an accessible \"Reload now\" button that reloads the page on click.\n *\n * AsyncNotice has no first-class action support, so we render a minimal button\n * and inject it into the rendered notice. Kept small and dependency-free.\n *\n * @returns {HTMLButtonElement}\n */\nvar buildReloadButton = function buildReloadButton() {\n  var _challenge_notice_rel;\n  var label = (_challenge_notice_rel = (window.__i18n || {}).challenge_notice_reload_button) !== null && _challenge_notice_rel !== void 0 ? _challenge_notice_rel : 'Reload now';\n  var button = document.createElement('button');\n  button.type = 'button';\n  button.className = \"button small \".concat(RELOAD_BUTTON_CLASS);\n  button.textContent = label;\n  button.addEventListener('click', function () {\n    return window.location.reload();\n  });\n  return button;\n};\n\n/**\n * Inject the \"Reload now\" button into the rendered notice, once.\n *\n * Prefers the element the notice just rendered, so the button always lands on\n * the notice this call produced. Without it we fall back to the LAST\n * `#notices-main #notice` on the page rather than the first: if any race ever\n * leaves two containers up, the surviving (front-most) one is the later one, and\n * decorating the first would leave the visible notice without a reload control\n * (#4216).\n *\n * No-op when there is no notice on the DOM (e.g. under test doubles) so the\n * notice flow never depends on the button rendering.\n *\n * @param {HTMLElement} [noticeElement] - the container AsyncNotice just appended\n * @returns {void}\n */\nvar attachReloadButton = function attachReloadButton() {\n  var _noticeElement$queryS;\n  var noticeElement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n  var fromArgument = noticeElement !== null && noticeElement !== void 0 && noticeElement.isConnected ? (_noticeElement$queryS = noticeElement.querySelector('#notice')) !== null && _noticeElement$queryS !== void 0 ? _noticeElement$queryS : noticeElement : null;\n  var noticeEl = fromArgument !== null && fromArgument !== void 0 ? fromArgument : _babel_runtime_corejs3_core_js_stable_array_from__WEBPACK_IMPORTED_MODULE_3___default()(document.querySelectorAll('#notices-main #notice')).pop();\n  if (!noticeEl || noticeEl.querySelector(\".\".concat(RELOAD_BUTTON_CLASS))) {\n    return;\n  }\n  noticeEl.appendChild(buildReloadButton());\n};\n\n/**\n * Show the honest reload notice for the given situation.\n *\n * Firing policy (#3340): a data-mutating challenge fires on EVERY failure — a\n * lost save is important each time. Reads and stale-client mismatches keep the\n * once-per-page suppression to avoid nagging.\n *\n * The notice is a sticky warning so the user must acknowledge it; a reload is\n * the only way to clear the challenge, so a \"Reload now\" button is added.\n *\n * @param {Object} [context]\n * @param {boolean} [context.stale=false]\n * @param {boolean} [context.mutating=false]\n * @param {string} [context.dataLabel]\n * @returns {Promise<void>}\n */\nvar notifyChallengeDetected = /*#__PURE__*/function () {\n  var _ref3 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee() {\n    var _ref4,\n      _ref4$stale,\n      stale,\n      _ref4$mutating,\n      mutating,\n      dataLabel,\n      fireEveryTime,\n      message,\n      notice,\n      _args = arguments;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          _ref4 = _args.length > 0 && _args[0] !== undefined ? _args[0] : {}, _ref4$stale = _ref4.stale, stale = _ref4$stale === void 0 ? false : _ref4$stale, _ref4$mutating = _ref4.mutating, mutating = _ref4$mutating === void 0 ? false : _ref4$mutating, dataLabel = _ref4.dataLabel;\n          fireEveryTime = mutating && !stale;\n          if (fireEveryTime) {\n            _context.next = 6;\n            break;\n          }
279\n          if (!window[NOTICE_SHOWN_FLAG]) {\n            _context.next = 5;\n            break;\n          }\n          return _context.abrupt(\"return\");\n        case 5:\n          window[NOTICE_SHOWN_FLAG] = true;\n        case 6:\n          message = selectChallengeMessage({\n            stale: stale,\n            mutating: mutating,\n            dataLabel: dataLabel\n          });\n          _context.prev = 7;\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_4__.AsyncNotice(message, 'warning', true);\n          _context.next = 11;\n          return notice.create();\n        case 11:\n          attachReloadButton(notice.noticeElement);\n          _context.next = 17;\n          break;\n        case 14:\n          _context.prev = 14;\n          _context.t0 = _context[\"catch\"](7);\n          console.error(message, _context.t0);\n        case 17:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee, null, [[7, 14]]);\n  }));\n  return function notifyChallengeDetected() {\n    return _ref3.apply(this, arguments);\n  };\n}();\n\n/**\n * Throw a distinctive error when the response is an edge challenge; otherwise\n * return the response unchanged so it can slot into existing .then() chains.\n *\n * On detection the reload notice is triggered (fire-and-forget) before throwing,\n * so every adopter gets consistent user messaging for free. Callers may pass\n * {mutating, dataLabel} so the notice can be honest about unsaved data (#3340).\n *\n * @param {Response} response\n * @param {Object} [options]\n * @param {boolean} [options.expectJson=true]\n * @param {boolean} [options.mutating=false] - the request was a data write\n * @param {string} [options.dataLabel] - plain-words name of the data at risk\n * @param {boolean} [options.notify=true] - show the user-facing notice; pass false\n *        for diagnostics-only calls that must not raise a notice of their own (#4216)\n * @returns {Response} the same response, when not challenged\n * @throws {Error} name=ChallengeInterceptedError, isChallenge=true\n */\nvar assertNotChallenged = function assertNotChallenged(response) {\n  var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n    _ref5$expectJson = _ref5.expectJson,\n    expectJson = _ref5$expectJson === void 0 ? true : _ref5$expectJson,\n    _ref5$mutating = _ref5.mutating,\n    mutating = _ref5$mutating === void 0 ? false : _ref5$mutating,\n    dataLabel = _ref5.dataLabel,\n    _ref5$notify = _ref5.notify,\n    notify = _ref5$notify === void 0 ? true : _ref5$notify;\n  // Stale-client handshake (#3315): the request itself succeeded, so surface\n  // the reload notice (fire-and-forget) but return the response so the caller\n  // still gets its payload. Reload heals the mismatch.\n  if (isStaleClient(response) && notify) {\n    notifyChallengeDetected({\n      stale: true\n    })[\"catch\"](function (noticeError) {\n      return console.error(noticeError);\n    });\n  }\n  if (!isChallengeResponse(response, {\n    expectJson: expectJson\n  })) {\n    return response;\n  }\n  if (notify) {\n    notifyChallengeDetected({\n      mutating: mutating,\n      dataLabel: dataLabel\n    })[\"catch\"](function (noticeError) {\n      return console.error(noticeError);\n    });\n  }\n  var error = new Error('Request intercepted by an edge challenge — page reload required');\n  error.name = CHALLENGE_ERROR_NAME;\n  error.isChallenge = true;\n  error.status = response.status;\n  throw error;\n};\n\n/**\n * Drop-in fetch wrapper: resolves with the Response when it is not a\n * challenge, rejects with a ChallengeInterceptedError (and shows the notice)\n * when it is. Callers keep their payloads on rejection.\n *\n * @param {string} url\n * @param {Object} [options] - Fetch API options\n * @param {Object} [challengeOptions]\n * @param {boolean} [challengeOptions.expectJson=true]\n * @param {boolean} [challengeOptions.mutating=false]\n * @param {string} [challengeOptions.dataLabel]\n * @param {boolean} [challengeOptions.notify=true]\n * @returns {Promise<Response>}\n */\nvar challengeAwareFetch = /*#__PURE__*/function () {\n  var _ref6 = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().mark(function _callee2(url) {\n    var options,\n      _ref7,\n      _ref7$expectJson,\n      expectJson,\n      _ref7$mutating,\n      mutating,\n      dataLabel,\n      _ref7$notify,\n      notify,\n      response,\n      _args2 = arguments;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_1___default().wrap(function _callee2$(_context2) {\n      while (1) switch (_context2.prev = _context2.next) {\n        case 0:\n          options = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {};\n          _ref7 = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : {}, _ref7$expectJson = _ref7.expectJson, expectJson = _ref7$expectJson === void 0 ? true : _ref7$expectJson, _ref7$mutating = _ref7.mutating, mutating = _ref7$mutating === void 0 ? false : _ref7$mutating, dataLabel = _ref7.dataLabel, _ref7$notify = _ref7.notify, notify = _ref7$notify === void 0 ? true : _ref7$notify;\n          _context2.next = 4;\n          return fetch(url, options);\n        case 4:\n          response = _context2.sent;\n          return _context2.abrupt(\"return\", assertNotChallenged(response, {\n            expectJson: expectJson,\n            mutating: mutating,\n            dataLabel: dataLabel,\n            notify: notify\n          }));\n        case 6:\n        case \"end\":\n          return _context2.stop();\n      }\n    }, _callee2);\n  }));\n  return function challengeAwareFetch(_x) {\n    return _ref6.apply(this, arguments);\n  };\n}();\n\n/**\n * Test hook: clear the once-per-page notice flag.\n */\nvar resetChallengeNoticeFlag = function resetChallengeNoticeFlag() {\n  delete window[NOTICE_SHOWN_FLAG];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2NoYWxsZW5nZS1hd2FyZS1mZXRjaC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
279BRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBbkJBO0FBQUE7QUFBQTs7QUFxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUhBO0FBQUE7QUFBQTs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL3V0aWxpdGllcy9jaGFsbGVuZ2UtYXdhcmUtZmV0Y2guanM/OTk3MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoYWxsZW5nZS1hd2FyZSBmZXRjaCBoZWxwZXJzICgjMzI0NCwgRXBpYyAjMzI0MDsgcmVmaW5lZCBpbiAjMzM0MCkuXG4gKlxuICogV2hlbiBhIENsb3VkZmxhcmUgbWFuYWdlZCBjaGFsbGVuZ2UgKG9yIGEgY2ZfY2xlYXJhbmNlIGV4cGlyeSBtaWQtc2Vzc2lvbilcbiAqIGludGVyY2VwdHMgYSBiYWNrZ3JvdW5kIHNhbWUtb3JpZ2luIHJlcXVlc3QsIHRoZSBwYWdlIHJlY2VpdmVzIGFuIEhUTUxcbiAqIGNoYWxsZW5nZSBwYWdlIHdoZXJlIGl0IGV4cGVjdGVkIEpTT04uIEpTIGNhbm5vdCBzb2x2ZSB0aGUgY2hhbGxlbmdlLCBzbyB0aGVcbiAqIG9ubHkgcmVtZWR5IGlzIGEgZnVsbCBwYWdlIHJlbG9hZC4gVGhlc2UgaGVscGVycyByZWNvZ25pemUgdGhhdCBzaXR1YXRpb24sXG4gKiBzdXJmYWNlIGFuIGhvbmVzdCB1c2VyIG5vdGljZSwgYW5kIHJlamVjdCB3aXRoIGEgZGlzdGluY3RpdmUgZXJyb3Igc28gY2FsbGVyc1xuICogY2FuIGtlZXAgdGhlaXIgcGF5bG9hZHMgaW5zdGVhZCBvZiBmYWlsaW5nIHNpbGVudGx5IG9yIHNob3dpbmcgYSBnZW5lcmljIGVycm9yLlxuICpcbiAqIFRoZSBub3RpY2UgaXMgbm93IENGLWF3YXJlIGFuZCBob25lc3QgYWJvdXQgdW5zYXZlZCBkYXRhICgjMzM0MCk6XG4gKiAgLSBhIHN0YWxlLWNsaWVudCAoZGVwbG95L3ZlcnNpb24gbWlzbWF0Y2gpIGdldHMgYW4gXCJ1cGRhdGVkLCByZWxvYWRcIiBtZXNzYWdlO1xuICogIC0gYW4gZWRnZSBjaGFsbGVuZ2Ugb24gYSBSRUFEIGdldHMgYSBcInNlY3VyaXR5IGNoZWNrIGludGVycnVwdGVkXCIgbWVzc2FnZTtcbiAqICAtIGFuIGVkZ2UgY2hhbGxlbmdlIG9uIGEgZGF0YS1NVVRBVElORyBjYWxsIG5hbWVzIHRoZSBkYXRhIHRoYXQgbWF5IG5vdCBoYXZlXG4gKiAgICBiZWVuIHNhdmVkLCBhbmQgZmlyZXMgb24gRVZFUlkgc3VjaCBmYWlsdXJlIChhIGxvc3Qgc2F2ZSBtYXR0ZXJzIGVhY2ggdGltZSksXG4gKiAgICB3aGlsZSByZWFkcy9zdGFsZS1jbGllbnQga2VlcCB0aGUgb25jZS1wZXItcGFn
279ZSBzdXBwcmVzc2lvbiB0byBhdm9pZCBzcGFtLlxuICpcbiAqIEFkb3B0aW9uIHNlYW1zOlxuICogIC0gRmV0Y2hIZWxwZXJzLmZldGNoRGF0YSAoZmV0Y2gtaGVscGVycy5qcykgcnVucyBhc3NlcnROb3RDaGFsbGVuZ2VkKCkgb25cbiAqICAgIGV2ZXJ5IHJlc3BvbnNlLCBjb3ZlcmluZyBhbGwgSlNPTiBBSkFYIGZsb3dzIHRoYXQgdXNlIGl0LiBXcml0ZSBjYWxsIHNpdGVzXG4gKiAgICBwYXNzIHttdXRhdGluZzp0cnVlLCBkYXRhTGFiZWw6Jy4uLid9IHNvIHRoZSBub3RpY2UgY2FuIG5hbWUgdGhlIGRhdGEuXG4gKiAgLSBSYXcgZmV0Y2ggY2FsbCBzaXRlcyAoZS5nLiB0aGUgYXVkaW8gcGxheWVyIHBvc2l0aW9uIHN5bmMpIGNhbGxcbiAqICAgIGFzc2VydE5vdENoYWxsZW5nZWQocmVzcG9uc2UpIGRpcmVjdGx5LCBvciB1c2UgY2hhbGxlbmdlQXdhcmVGZXRjaCgpLlxuICpcbiAqIERpYWdub3N0aWNzIG9wdCBvdXQgb2YgdGhlIG5vdGljZSAoIzQyMTYpLiBBc3luY05vdGljZS5sb2coKSBwb3N0cyB0aGUgbm90aWNlJ3NcbiAqIG93biB0ZXh0IHRvIGxvZy1mcm9udGVuZC1lcnJvci5waHAgdGhyb3VnaCB0aGlzIHNhbWUgc2VhbSwgc28gdW5kZXIgYW4gZWRnZVxuICogY2hhbGxlbmdlIHRoYXQgbG9nIFBPU1QgaXMgY2hhbGxlbmdlZCB0b28gYW5kIHdvdWxkIHJhaXNlIGEgU0VDT05EIG5vdGljZSBmb3JcbiAqIHRoZSBmaXJzdCBub3RpY2Ug4oCUIGVycm9yIHJlcG9ydGluZyBhbXBsaWZ5aW5nIGl0c2VsZi4gQ2FsbGVycyB0aGF0IGNhcnJ5IG5vXG4gKiB1c2VyIGludGVudCBwYXNzIHtub3RpZnk6IGZhbHNlfTogZGV0ZWN0aW9uIGFuZCB0aGUgdGhyb3duXG4gKiBDaGFsbGVuZ2VJbnRlcmNlcHRlZEVycm9yIGFyZSB1bmNoYW5nZWQsIG9ubHkgdGhlIHVzZXItZmFjaW5nIG5vdGljZSBpcyBza2lwcGVkLlxuICovXG5cbmltcG9ydCB7QXN5bmNOb3RpY2V9IGZyb20gJy4uL25vdGljZXMvbm90aWNlJztcblxuY29uc3QgQ0hBTExFTkdFX0VSUk9SX05BTUUgPSAnQ2hhbGxlbmdlSW50ZXJjZXB0ZWRFcnJvcic7XG5cbi8vIFdpbmRvdy1zY29wZWQgc28gdGhlIG5vdGljZSBzaG93cyBhdCBtb3N0IG9uY2UgcGVyIHBhZ2UgZXZlbiB3aGVuIHNldmVyYWxcbi8vIGd1bHAgZW50cnkgYnVuZGxlcyAoZWFjaCB3aXRoIGl0cyBvd24gY29weSBvZiB0aGlzIG1vZHVsZSkgZGV0ZWN0IHRoZVxuLy8gY2hhbGxlbmdlIGZyb20gY29uY3VycmVudCBiYWNrZ3JvdW5kIGNhbGxzLiBNdXRhdGluZyBjaGFsbGVuZ2VzIGludGVudGlvbmFsbHlcbi8vIGJ5cGFzcyB0aGlzIGZsYWcgKHNlZSBub3RpZnlDaGFsbGVuZ2VEZXRlY3RlZCkuXG5jb25zdCBOT1RJQ0VfU0hPV05fRkxBRyA9ICdfX21iQ2hhbGxlbmdlTm90aWNlU2hvd24nO1xuXG5jb25zdCBSRUxPQURfQlVUVE9OX0NMQVNTID0gJ2NoYWxsZW5nZS1yZWxvYWQtYnV0dG9uJztcblxuLyoqXG4gKiBEZXRlY3QgYSByZXNwb25zZSBwcm9kdWNlZCBieSBhbiBlZGdlIGNoYWxsZW5nZSByYXRoZXIgdGhhbiB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQ29uc2VydmF0aXZlIGJ5IGRlc2lnbjogYSBwbGFpbiA0MDMgKG9yIGFueSBzdGF0dXMpIHdpdGggYSBKU09OIGJvZHkgaXMgYVxuICogbGVnaXRpbWF0ZSBhcHBsaWNhdGlvbiBlcnJvciBhbmQgbXVzdCBOT1QgYmUgdHJlYXRlZCBhcyBhIGNoYWxsZW5nZS5cbiAqXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNwb25zZSAtIEZldGNoIEFQSSBSZXNwb25zZSAob3IgY29tcGF0aWJsZSBvYmplY3QpXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmV4cGVjdEpzb249dHJ1ZV0gLSBDYWxsZXIgZXhwZWN0ZWQgYSBKU09OIGJvZHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc0NoYWxsZW5nZVJlc3BvbnNlID0gKHJlc3BvbnNlLCB7ZXhwZWN0SnNvbiA9IHRydWV9ID0ge30pID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZS5oZWFkZXJzPy5nZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENsb3VkZmxhcmUgc3RhbXBzIGNoYWxsZW5nZSBpbnRlcmNlcHRpb25zIHdpdGggdGhpcyBoZWFkZXIgKGUuZy4gXCJjaGFsbGVuZ2VcIikuXG4gICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjZi1taXRpZ2F0ZWQnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50VHlwZSA9IChyZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaXNIdG1sID0gY29udGVudFR5cGUuaW5jbHVkZXMoJ3RleHQvaHRtbCcpO1xuXG4gICAgLy8gQSBnZW51aW5lIGVkZ2UgY2hhbGxlbmdlIGlzIG5ldmVyIGEgc3VjY2Vzc2Z1bCAyeHgg4oCUIGl0IGlzIGEgbm9uLTJ4eFxuICAgIC8vIGludGVyc3RpdGlhbCAob3IgY2FycmllcyBjZi1taXRpZ2F0ZWQsIGhhbmRsZWQgYWJvdmUpLiBBIDIwMCBKU09OIHJlc3BvbnNlXG4gICAgLy8gdGhhdCBtZXJlbHkgbGFja3MgYW4gYXBwbGljYXRpb24vanNvbiBoZWFkZXIgbXVzdCBOT1QgYmUgbWlzcmVhZCBhcyBhXG4gICAgLy8gY2hhbGxlbmdlICgjMzM0MiksIHNvIHRoZSBIVE1MLXdoZXJlLUpTT04gaGV1cmlzdGljIG9ubHkgZmlyZXMgb24gbm9uLTJ4eC5cbiAgICBjb25zdCBpc1N1Y2Nlc3MgPSByZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMDtcblxuICAgIC8vIEFuIEhUTUwgYm9keSB3aGVyZSB0aGUgY2FsbGVyIGV4cGVjdGVkIEpTT04gaXMgYSBjaGFsbGVuZ2UvaW50ZXJjZXB0aW9uIHBhZ2UuXG4gICAgaWYgKGV4cGVjdEpzb24gJiYgaXNIdG1sICYmICFpc1N1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQSA0MDMgY2FycnlpbmcgYW4gSFRNTCBib2R5IGlzIGEgY2hhbGxlbmdlIHNpZ25hdHVyZSBldmVuIGZvciBub24tSlNPTiBjYWxsZXJzLlxuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQwMyAmJiBpc0h0bWw7XG59O1xuXG4vKipcbiAqIFRydWUgd2hlbiBhbiBlcnJvciB3YXMgcmFpc2VkIGJ5IGFzc2VydE5vdENoYWxsZW5nZWQoKS9jaGFsbGVuZ2VBd2FyZUZldGNoKCkuXG4gKlxuICogQHBhcmFtIHsqfSBlcnJvclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzQ2hhbGxlbmdlRXJyb3IgPSAoZXJyb3IpID0+XG4gICAgZXJyb3I/Lm5hbWUgPT09IENIQUxMRU5HRV9FUlJPUl9OQU1FIHx8IGVycm9yPy5pc0NoYWxsZW5nZSA9PT0gdHJ1ZTtcblxuLyoqXG4gKiBEZXRlY3QgYSBzdGFsZSBjbGllbnQ6IHRoZSBwYWdlIGJvb3RlZCBvbiBvbmUgYnVpbGQgYnV0IHRoZSBzZXJ2ZXIgaGFzIHNpbmNlXG4gKiBiZWVuIHJlZGVwbG95ZWQgKCMzMzE1KS4gRXZlcnkgcmVzcG9uc2UgY2FycmllcyB0aGUgY3VycmVudCBzZXJ2ZXIgYnVpbGQgaW5cbiAqIHRoZSBgWC1BcHAtVmVyc2lvbmAgaGVhZGVyOyB0aGUgcGFnZSByZWNvcmRlZCBpdHMgb3duIGJvb3QgdmVyc2lvbiBpbiB0aG
279VcbiAqIGB3aW5kb3cuX19BUFBfVkVSU0lPTmAgZ2xvYmFsLiBXaGVuIHRoZXkgZGlmZmVyLCB0aGUgbG9hZGVkIGJ1bmRsZXMgYXJlIHN0YWxlXG4gKiBhbmQgYSByZWxvYWQgaXMgdGhlIHJlbWVkeS5cbiAqXG4gKiBOdWxsLXNhZmUgYnkgZGVzaWduOiBpZiBlaXRoZXIgc2lkZSBpcyBtaXNzaW5nIChubyBoZWFkZXIsIG9yIHRoZSBnbG9iYWwgd2FzXG4gKiBub3QgaW5qZWN0ZWQpIHdlIHJldHVybiBmYWxzZSBzbyBub3JtYWwgcmVxdWVzdHMgbmV2ZXIgbmFnIHRoZSB1c2VyLlxuICpcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc3BvbnNlIC0gRmV0Y2ggQVBJIFJlc3BvbnNlIChvciBjb21wYXRpYmxlIG9iamVjdClcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1N0YWxlQ2xpZW50ID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFyZXNwb25zZSB8fCB0eXBlb2YgcmVzcG9uc2UuaGVhZGVycz8uZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBib290ZWRWZXJzaW9uID0gd2luZG93Ll9fQVBQX1ZFUlNJT047XG4gICAgaWYgKCFib290ZWRWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2ZXJWZXJzaW9uID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtYXBwLXZlcnNpb24nKTtcbiAgICBpZiAoIXNlcnZlclZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXJWZXJzaW9uICE9PSBib290ZWRWZXJzaW9uO1xufTtcblxuLyoqXG4gKiBQdXJlIG1lc3NhZ2Ugc2VsZWN0b3I6IGNob29zZSB0aGUgaG9uZXN0IG5vdGljZSB0ZXh0IGZvciBhIGdpdmVuIHNpdHVhdGlvbi5cbiAqXG4gKiBFeHBvcnRlZCBzbyBpdCBjYW4gYmUgYXNzZXJ0ZWQgZGlyZWN0bHkgaW4gdGVzdHMuIGkxOG4gaXMgcmVhZCBhdCBjYWxsIHRpbWVcbiAqIChuZXZlciBhdCBtb2R1bGUgdG9wIGxldmVsIOKAlCAjMjExMCkgd2l0aCBFbmdsaXNoIGZhbGxiYWNrcyB0aGF0IGV4YWN0bHkgbWF0Y2hcbiAqIHRoZSB0aWNrZXQgY29weS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb250ZXh0LnN0YWxlPWZhbHNlXSAtIGRlcGxveS92ZXJzaW9uIG1pc21hdGNoIChyZWxvYWQgaGVhbHMgaXQpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb250ZXh0Lm11dGF0aW5nPWZhbHNlXSAtIHRoZSBibG9ja2VkIGNhbGwgd2FzIGEgZGF0YSB3cml0ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtjb250ZXh0LmRhdGFMYWJlbF0gLSBwbGFpbi13b3JkcyBuYW1lIG9mIHRoZSBkYXRhIGF0IHJpc2tcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHNlbGVjdENoYWxsZW5nZU1lc3NhZ2UgPSAoe3N0YWxlID0gZmFsc2UsIG11dGF0aW5nID0gZmFsc2UsIGRhdGFMYWJlbH0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IGkxOG4gPSB3aW5kb3cuX19pMThuIHx8IHt9O1xuXG4gICAgaWYgKHN0YWxlKSB7XG4gICAgICAgIHJldHVybiBpMThuLmNoYWxsZW5nZV9ub3RpY2Vfc3RhbGVfY2xpZW50XG4gICAgICAgICAgICA/PyAnVGhlIHNpdGUgd2FzIGp1c3QgdXBkYXRlZC4gUmVsb2FkIHRvIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24uJztcbiAgICB9XG5cbiAgICBpZiAobXV0YXRpbmcpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBpMThuLmNoYWxsZW5nZV9ub3RpY2VfZGF0YV9hdF9yaXNrXG4gICAgICAgICAgICA/PyAnQSBzZWN1cml0eSBjaGVjayBibG9ja2VkIHRoaXMgYWN0aW9uLCBzbyB5b3VyIDpsYWJlbCBtYXkgbm90IGhhdmUgYmVlbiBzYXZlZC4gUGxlYXNlIHJlbG9hZCBhbmQgdHJ5IGFnYWluLic7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gZGF0YUxhYmVsXG4gICAgICAgICAgICA/IGRhdGFMYWJlbFxuICAgICAgICAgICAgOiAoaTE4bi5jaGFsbGVuZ2Vfbm90aWNlX2RhdGFfZ2VuZXJpY19sYWJlbCA/PyAncmVjZW50IGNoYW5nZScpO1xuICAgICAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgnOmxhYmVsJywgbGFiZWwpO1xuICAgIH1cblxuICAgIHJldHVybiBpMThuLmNoYWxsZW5nZV9ub3RpY2VfcmVsb2FkXG4gICAgICAgID8/ICdBIHNlY3VyaXR5IGNoZWNrIGludGVycnVwdGVkIHRoaXMgcmVxdWVzdC4gUGxlYXNlIHJlbG9hZCB0aGUgcGFnZSwgdGhlbiB0cnkgYWdhaW4uJztcbn07XG5cbi8qKlxuICogQnVpbGQgYW4gYWNjZXNzaWJsZSBcIlJlbG9hZCBub3dcIiBidXR0b24gdGhhdCByZWxvYWRzIHRoZSBwYWdlIG9uIGNsaWNrLlxuICpcbiAqIEFzeW5jTm90aWNlIGhhcyBubyBmaXJzdC1jbGFzcyBhY3Rpb24gc3VwcG9ydCwgc28gd2UgcmVuZGVyIGEgbWluaW1hbCBidXR0b25cbiAqIGFuZCBpbmplY3QgaXQgaW50byB0aGUgcmVuZGVyZWQgbm90aWNlLiBLZXB0IHNtYWxsIGFuZCBkZXBlbmRlbmN5LWZyZWUuXG4gKlxuICogQHJldHVybnMge0hUTUxCdXR0b25FbGVtZW50fVxuICovXG5jb25zdCBidWlsZFJlbG9hZEJ1dHRvbiA9ICgpID0+IHtcbiAgICBjb25zdCBsYWJlbCA9ICh3aW5kb3cuX19pMThuIHx8IHt9KS5jaGFsbGVuZ2Vfbm90aWNlX3JlbG9hZF9idXR0b24gPz8gJ1JlbG9hZCBub3cnO1xuXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgYnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICBidXR0b24uY2xhc3NOYW1lID0gYGJ1dHRvbiBzbWFsbCAke1JFTE9BRF9CVVRUT05fQ0xBU1N9YDtcbiAgICBidXR0b24udGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpO1xuXG4gICAgcmV0dXJuIGJ1dHRvbjtcbn07XG5cbi8qKlxuICogSW5qZWN0IHRoZSBcIlJlbG9hZCBub3dcIiBidXR0b24gaW50byB0aGUgcmVuZGVyZWQgbm90aWNlLCBvbmNlLlxuICpcbiAqIFByZWZlcnMgdGhlIGVsZW1lbnQgdGhlIG5vdGljZSBqdXN0IHJlbmRlcmVkLCBzbyB0aGUgYnV0dG9uIGFsd2F5cyBsYW5kcyBvblxuICogdGhlIG5vdGljZSB0aGlzIGNhbGwgcHJvZHVjZWQuIFdpdGhvdXQgaXQgd2UgZmFsbCBiYWNrIHRvIHRoZSB
279MQVNUXG4gKiBgI25vdGljZXMtbWFpbiAjbm90aWNlYCBvbiB0aGUgcGFnZSByYXRoZXIgdGhhbiB0aGUgZmlyc3Q6IGlmIGFueSByYWNlIGV2ZXJcbiAqIGxlYXZlcyB0d28gY29udGFpbmVycyB1cCwgdGhlIHN1cnZpdmluZyAoZnJvbnQtbW9zdCkgb25lIGlzIHRoZSBsYXRlciBvbmUsIGFuZFxuICogZGVjb3JhdGluZyB0aGUgZmlyc3Qgd291bGQgbGVhdmUgdGhlIHZpc2libGUgbm90aWNlIHdpdGhvdXQgYSByZWxvYWQgY29udHJvbFxuICogKCM0MjE2KS5cbiAqXG4gKiBOby1vcCB3aGVuIHRoZXJlIGlzIG5vIG5vdGljZSBvbiB0aGUgRE9NIChlLmcuIHVuZGVyIHRlc3QgZG91Ymxlcykgc28gdGhlXG4gKiBub3RpY2UgZmxvdyBuZXZlciBkZXBlbmRzIG9uIHRoZSBidXR0b24gcmVuZGVyaW5nLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtub3RpY2VFbGVtZW50XSAtIHRoZSBjb250YWluZXIgQXN5bmNOb3RpY2UganVzdCBhcHBlbmRlZFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGF0dGFjaFJlbG9hZEJ1dHRvbiA9IChub3RpY2VFbGVtZW50ID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IGZyb21Bcmd1bWVudCA9IG5vdGljZUVsZW1lbnQ/LmlzQ29ubmVjdGVkXG4gICAgICAgID8gKG5vdGljZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI25vdGljZScpID8/IG5vdGljZUVsZW1lbnQpXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBub3RpY2VFbCA9IGZyb21Bcmd1bWVudFxuICAgICAgICA/PyBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNub3RpY2VzLW1haW4gI25vdGljZScpKS5wb3AoKTtcblxuICAgIGlmICghbm90aWNlRWwgfHwgbm90aWNlRWwucXVlcnlTZWxlY3RvcihgLiR7UkVMT0FEX0JVVFRPTl9DTEFTU31gKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIG5vdGljZUVsLmFwcGVuZENoaWxkKGJ1aWxkUmVsb2FkQnV0dG9uKCkpO1xufTtcblxuLyoqXG4gKiBTaG93IHRoZSBob25lc3QgcmVsb2FkIG5vdGljZSBmb3IgdGhlIGdpdmVuIHNpdHVhdGlvbi5cbiAqXG4gKiBGaXJpbmcgcG9saWN5ICgjMzM0MCk6IGEgZGF0YS1tdXRhdGluZyBjaGFsbGVuZ2UgZmlyZXMgb24gRVZFUlkgZmFpbHVyZSDigJQgYVxuICogbG9zdCBzYXZlIGlzIGltcG9ydGFudCBlYWNoIHRpbWUuIFJlYWRzIGFuZCBzdGFsZS1jbGllbnQgbWlzbWF0Y2hlcyBrZWVwIHRoZVxuICogb25jZS1wZXItcGFn
279ZSBzdXBwcmVzc2lvbiB0byBhdm9pZCBuYWdnaW5nLlxuICpcbiAqIFRoZSBub3RpY2UgaXMgYSBzdGlja3kgd2FybmluZyBzbyB0aGUgdXNlciBtdXN0IGFja25vd2xlZGdlIGl0OyBhIHJlbG9hZCBpc1xuICogdGhlIG9ubHkgd2F5IHRvIGNsZWFyIHRoZSBjaGFsbGVuZ2UsIHNvIGEgXCJSZWxvYWQgbm93XCIgYnV0dG9uIGlzIGFkZGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbnRleHQuc3RhbGU9ZmFsc2VdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb250ZXh0Lm11dGF0aW5nPWZhbHNlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtjb250ZXh0LmRhdGFMYWJlbF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5jb25zdCBub3RpZnlDaGFsbGVuZ2VEZXRlY3RlZCA9IGFzeW5jICh7c3RhbGUgPSBmYWxzZSwgbXV0YXRpbmcgPSBmYWxzZSwgZGF0YUxhYmVsfSA9IHt9KSA9PiB7XG4gICAgY29uc3QgZmlyZUV2ZXJ5VGltZSA9IG11dGF0aW5nICYmICFzdGFsZTtcblxuICAgIGlmICghZmlyZUV2ZXJ5VGltZSkge1xuICAgICAgICBpZiAod2luZG93W05PVElDRV9TSE9XTl9GTEFHXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdpbmRvd1tOT1RJQ0VfU0hPV05fRkxBR10gPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBzZWxlY3RDaGFsbGVuZ2VNZXNzYWdlKHtzdGFsZSwgbXV0YXRpbmcsIGRhdGFMYWJlbH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgbm90aWNlID0gbmV3IEFzeW5jTm90aWNlKG1lc3NhZ2UsICd3YXJuaW5nJywgdHJ1ZSk7XG4gICAgICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoKTtcbiAgICAgICAgYXR0YWNoUmVsb2FkQnV0dG9uKG5vdGljZS5ub3RpY2VFbGVtZW50KTtcbiAgICB9IGNhdGNoIChub3RpY2VFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIG5vdGljZUVycm9yKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIFRocm93IGEgZGlzdGluY3RpdmUgZXJyb3Igd2hlbiB0aGUgcmVzcG9uc2UgaXMgYW4gZWRnZSBjaGFsbGVuZ2U7IG90aGVyd2lzZVxuICogcmV0dXJuIHRoZSByZXNwb25zZSB1bmNoYW5nZWQgc28gaXQgY2FuIHNsb3QgaW50byBleGlzdGluZyAudGhlbigpIGNoYWlucy5cbiAqXG4gKiBPbiBkZXRlY3Rpb24gdGhlIHJlbG9hZCBub3RpY2UgaXMgdHJpZ2dlcmVkIChmaXJlLWFuZC1mb3JnZXQpIGJlZm9yZSB0aHJvd2luZyxcbiAqIHNvIGV2ZXJ5IGFkb3B0ZXIgZ2V0cyBjb25zaXN0ZW50IHVzZXIgbWVzc2FnaW5nIGZvciBmcmVlLiBDYWxsZXJzIG1heSBwYXNzXG4gKiB7bXV0YXRpbmcsIGRhdGFMYWJlbH0gc28gdGhlIG5vdGljZSBjYW4gYmUgaG9uZXN0IGFib3V0IHVuc2F2ZWQgZGF0YSAoIzMzNDApLlxuICpcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc3BvbnNlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmV4cGVjdEpzb249dHJ1ZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubXV0YXRpbmc9ZmFsc2VdIC0gdGhlIHJlcXVlc3Qgd2FzIGEgZGF0YSB3cml0ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRhdGFMYWJlbF0gLSBwbGFpbi13b3JkcyBuYW1lIG9mIHRoZSBkYXRhIGF0IHJpc2tcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubm90aWZ5PXRydWVdIC0gc2hvdyB0aGUgdXNlci1mYWNpbmcgbm90aWNlOyBwYXNzIGZhbHNlXG4gKiAgICAgICAgZm9yIGRpYWdub3N0aWNzLW9ubHkgY2FsbHMgdGhhdCBtdXN0IG5vdCByYWlzZSBhIG5vdGljZSBvZiB0aGVpciBvd24gKCM0MjE2KVxuICogQHJldHVybnMge1Jlc3BvbnNlfSB0aGUgc2FtZSByZXNwb25zZSwgd2hlbiBub3QgY2hhbGxlbmdlZFxuICogQHRocm93cyB7RXJyb3J9IG5hbWU9Q2hhbGxlbmdlSW50ZXJjZXB0ZWRFcnJvciwgaXNDaGFsbGVuZ2U9dHJ1ZVxuICovXG5jb25zdCBhc3NlcnROb3RDaGFsbGVuZ2VkID0gKHJlc3BvbnNlLCB7ZXhwZWN0SnNvbiA9IHRydWUsIG11dGF0aW5nID0gZmFsc2UsIGRhdGFMYWJlbCwgbm90aWZ5ID0gdHJ1ZX0gPSB7fSkgPT4ge1xuICAgIC8vIFN0YWxlLWNsaWVudCBoYW5kc2hha2UgKCMzMzE1KTogdGhlIHJlcXVlc3QgaXRzZWxmIHN1Y2NlZWRlZCwgc28gc3VyZmFjZVxuICAgIC8vIHRoZSByZWxvYWQgbm90aWNlIChmaXJlLWFuZC1mb3JnZXQpIGJ1dCByZXR1cm4gdGhlIHJlc3BvbnNlIHNvIHRoZSBjYWxsZXJcbiAgICAvLyBzdGlsbCBnZXRzIGl0cyBwYXlsb2FkLiBSZWxvYWQgaGVhbHMgdGhlIG1pc21hdGNoLlxuICAgIGlmIChpc1N0YWxlQ2xpZW50KHJlc3BvbnNlKSAmJiBub3RpZnkpIHtcbiAgICAgICAgbm90aWZ5Q2hhbGxlbmdlRGV0ZWN0ZWQoe3N0YWxlOiB0cnVlfSkuY2F0Y2goKG5vdGljZUVycm9yKSA9PiBjb25zb2xlLmVycm9yKG5vdGljZUVycm9yKSk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NoYWxsZW5nZVJlc3BvbnNlKHJlc3BvbnNlLCB7ZXhwZWN0SnNvbn0pKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBpZiAobm90aWZ5KSB7XG4gICAgICAgIG5vdGlmeUNoYWxsZW5nZURldGVjdGVkKHttdXRhdGluZywgZGF0YUxhYmVsfSkuY2F0Y2goKG5vdGljZUVycm9yKSA9PiBjb25zb2xlLmVycm9yKG5vdGljZUVycm9yKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgaW50ZXJjZXB0ZWQgYnkgYW4gZWRnZSBjaGFsbGVuZ2Ug4oCUIHBhZ2UgcmVsb2FkIHJlcXVpcmVkJyk7XG4gICAgZXJyb3IubmFtZSA9IENIQUxMRU5HRV9FUlJPUl9OQU1FO1xuICAgIGVycm9yLmlzQ2hhbGxlbmdlID0gdHJ1ZTtcbiAgICBlcnJvci5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgdGhyb3cgZXJyb3I7XG59O1xuXG4vKipcbiAqIERyb3AtaW4gZmV0Y2ggd3JhcHBlcjogcmVzb2x2ZXMgd2l0aCB0aGUgUmVzcG9uc2Ugd2hlbiBpdCBpcyBub3QgYVxuICogY2hhbGxlbmdlLCByZWplY3RzIHdpdGggYSBDaGFsbGVuZ2VJbnRlcmNlcHRlZEVycm9yIChhbmQgc2hvd3MgdGhlIG5vdGljZSlcbiAqIHdoZW4gaXQgaXMuIENhbGxlcnMga2VlcCB0aGVpciBwYXlsb2FkcyBvbiByZWplY3Rpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEZldGNoIEFQSSBvcHRpb25zXG4gKiBAcGFyYW0ge09
279iamVjdH0gW2NoYWxsZW5nZU9wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFsbGVuZ2VPcHRpb25zLmV4cGVjdEpzb249dHJ1ZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoYWxsZW5nZU9wdGlvbnMubXV0YXRpbmc9ZmFsc2VdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NoYWxsZW5nZU9wdGlvbnMuZGF0YUxhYmVsXVxuICogQHBhcmFtIHtib29sZWFufSBbY2hhbGxlbmdlT3B0aW9ucy5ub3RpZnk9dHJ1ZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlc3BvbnNlPn1cbiAqL1xuY29uc3QgY2hhbGxlbmdlQXdhcmVGZXRjaCA9IGFzeW5jICh1cmwsIG9wdGlvbnMgPSB7fSwge2V4cGVjdEpzb24gPSB0cnVlLCBtdXRhdGluZyA9IGZhbHNlLCBkYXRhTGFiZWwsIG5vdGlmeSA9IHRydWV9ID0ge30pID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGFzc2VydE5vdENoYWxsZW5nZWQocmVzcG9uc2UsIHtleHBlY3RKc29uLCBtdXRhdGluZywgZGF0YUxhYmVsLCBub3RpZnl9KTtcbn07XG5cbi8qKlxuICogVGVzdCBob29rOiBjbGVhciB0aGUgb25jZS1wZXItcGFnZSBub3RpY2UgZmxhZy5cbiAqL1xuY29uc3QgcmVzZXRDaGFsbGVuZ2VOb3RpY2VGbGFnID0gKCkgPT4ge1xuICAgIGRlbGV0ZSB3aW5kb3dbTk9USUNFX1NIT1dOX0ZMQUddO1xufTtcblxuZXhwb3J0IHtcbiAgICBpc0NoYWxsZW5nZVJlc3BvbnNlLFxuICAgIGlzQ2hhbGxlbmdlRXJyb3IsXG4gICAgaXNTdGFsZUNsaWVudCxcbiAgICBzZWxlY3RDaGFsbGVuZ2VNZXNzYWdlLFxuICAgIGJ1aWxkUmVsb2FkQnV0dG9uLFxuICAgIGF0dGFjaFJlbG9hZEJ1dHRvbixcbiAgICBhc3NlcnROb3RDaGFsbGVuZ2VkLFxuICAgIGNoYWxsZW5nZUF3YXJlRmV0Y2gsXG4gICAgbm90aWZ5Q2hhbGxlbmdlRGV0ZWN0ZWQsXG4gICAgcmVzZXRDaGFsbGVuZ2VOb3RpY2VGbGFnLFxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/utilities/challenge-aware-fetch.js\n");
280
281/***/ }),
282
283/***/ "./resources/js/utilities/cookies.js":
284/*!*******************************************!*\
285  !*** ./resources/js/utilities/cookies.js ***!
286  \*******************************************/
287/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
288
289eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   deleteCookie: () => (/* binding */ deleteCookie),\n/* harmony export */   getCookie: () => (/* binding */ getCookie),\n/* harmony export */   setCookie: () => (/* binding */ setCookie)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/trim */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * Sets a cookie. Default DaysToLive to 1 week.\n *\n * @param name\n * @param value\n * @param daysToLive\n * @param path\n */\nfunction setCookie(name, value) {\n  var _context, _context2, _context3;\n  var daysToLive = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 7;\n  var path = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '/';\n  var maxAge = daysToLive;\n  if (typeof daysToLive === 'number') {\n    maxAge = 24 * 60 * 60 * daysToLive;\n  }\n  document.cookie = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_0___default()(_context = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_0___default()(_context2 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_0___default()(_context3 = \"\".concat(name, \"=\")).call(_context3, encodeURIComponent(value), \";max-age=\")).call(_context2, maxAge, \";path=\")).call(_context, path);\n}\n\n/**\n * Get a cookie from cookie list.\n * @param name\n * @returns {string|null}\n */\nfunction getCookie(name) {\n  var cookieArr = document.cookie.split(\";\");\n  for (var i = 0; i < cookieArr.length; i++) {\n    var _context4;\n    var cookiePair = cookieArr[i].split(\"=\");\n    if (name === _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default()(_context4 = cookiePair[0]).call(_context4)) {\n      var _context5;\n      var value = decodeURIComponent(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_1___default()(_context5 = cookiePair[1]).call(_context5));\n      if (value === 'undefined') {\n        return null;\n      }\n      return value;\n    }\n  }\n  return null;\n}\n\n/**\n * Deletes a cookie by setting the expiration date to a date in the past\n *\n * @param name\n * @param path\n */\nfunction deleteCookie(name) {\n  var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"/\";\n  // set a time in the past\n  // let time_in_past =  new Date('2000-01-01');\n\n  // set the max-age of cookie to time in the past. This effectively remove the cookie\n  setCookie(name, false, 0, path);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2Nvb2tpZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9taW5pc3RyeWJvb2tzLy4vcmVzb3VyY2VzL2pzL3V0aWxpdGllcy9jb29raWVzLmpzPzljYjQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZXRzIGEgY29va2llLiBEZWZhdWx0IERheXNUb0xpdmUgdG8gMSB3ZWVrLlxuICpcbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBkYXlzVG9MaXZlXG4gKiBAcGFyYW0gcGF0aFxuICovXG5mdW5jdGlvbiBzZXRDb29raWUobmFtZSwgdmFsdWUsIGRheXNUb0xpdmUgPSA3LCBwYXRoID0gJy8nKSB7XG4gIGxldCBtYXhBZ2UgPSBkYXlzVG9MaXZlO1xuICBpZih0eXBlb2YgZGF5c1RvTGl2ZSA9PT0gJ251bWJlcicpIHtcbiAgICBtYXhBZ2UgPSAoMjQgKiA2MCAqIDYwKSAqIGRheXNUb0xpdmU7XG4gIH1cblxuICBkb2
289N1bWVudC5jb29raWUgPSBgJHtuYW1lfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9O21heC1hZ2U9JHttYXhBZ2V9O3BhdGg9JHtwYXRofWA7XG59XG5cbi8qKlxuICogR2V0IGEgY29va2llIGZyb20gY29va2llIGxpc3QuXG4gKiBAcGFyYW0gbmFtZVxuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICovXG5mdW5jdGlvbiBnZXRDb29raWUobmFtZSkge1xuICBsZXQgY29va2llQXJyID0gZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtcbiAgZm9yKGxldCBpID0gMDsgaSA8IGNvb2tpZUFyci5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjb29raWVQYWlyID0gY29va2llQXJyW2ldLnNwbGl0KFwiPVwiKTtcblxuICAgIGlmKG5hbWUgPT09IGNvb2tpZVBhaXJbMF0udHJpbSgpKSB7XG4gICAgICBsZXQgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoY29va2llUGFpclsxXS50cmltKCkpO1xuXG4gICAgICBpZih2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuXG4vKipcbiAqIERlbGV0ZXMgYSBjb29raWUgYnkgc2V0dGluZyB0aGUgZXhwaXJhdGlvbiBkYXRlIHRvIGEgZGF0ZSBpbiB0aGUgcGFzdFxuICpcbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0gcGF0aFxuICovXG5mdW5jdGlvbiBkZWxldGVDb29raWUobmFtZSwgcGF0aCA9IFwiL1wiKSB7XG4gIC8vIHNldCBhIHRpbWUgaW4gdGhlIHBhc3RcbiAgLy8gbGV0IHRpbWVfaW5fcGFzdCA9ICBuZXcgRGF0ZSgnMjAwMC0wMS0wMScpO1xuXG4gIC8vIHNldCB0aGUgbWF4LWFnZSBvZiBjb29raWUgdG8gdGltZSBpbiB0aGUgcGFzdC4gVGhpcyBlZmZlY3RpdmVseSByZW1vdmUgdGhlIGNvb2tpZVxuICBzZXRDb29raWUobmFtZSwgZmFsc2UsIDAsIHBhdGgpO1xufVxuXG5leHBvcnQgeyBzZXRDb29raWUsIGdldENvb2tpZSwgZGVsZXRlQ29va2llIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/utilities/cookies.js\n");
290
291/***/ }),
292
293/***/ "./resources/js/utilities/debug.js":
294/*!*****************************************!*\
295  !*** ./resources/js/utilities/debug.js ***!
296  \*****************************************/
297/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
298
299eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   createLogger: () => (/* binding */ createLogger),\n/* harmony export */   debugError: () => (/* binding */ debugError),\n/* harmony export */   debugLog: () => (/* binding */ debugLog),\n/* harmony export */   debugWarn: () => (/* binding */ debugWarn),\n/* harmony export */   isDevelopment: () => (/* binding */ isDevelopment)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/includes */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * Debug utility for conditional logging based on environment.\n * Logs are only shown on localhost and dev server, not on staging or production.\n */\n\n/**\n * Check if current environment is development (localhost or dev server).\n * @returns {boolean} True if localhost or dev server, false otherwise\n */\nfunction isDevelopment() {\n  var hostname = window.location.hostname;\n  return hostname === 'localhost' || hostname === '127.0.0.1' || _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_0___default()(hostname).call(hostname, '.local') || _babel_runtime_corejs3_core_js_stable_instance_includes__WEBPACK_IMPORTED_MODULE_0___default()(hostname).call(hostname, 'dev.ministrybooks');\n}\n\n/**\n * Conditional console.log - only logs in development environments.\n * @param {...any} args - Arguments to pass to console.log\n */\nfunction debugLog() {\n  if (isDevelopment()) {\n    var _console;\n    (_console = console).log.apply(_console, arguments);\n  }\n}\n\n/**\n * Conditional console.warn - only logs in development environments.\n * @param {...any} args - Arguments to pass to console.warn\n */\nfunction debugWarn() {\n  if (isDevelopment()) {\n    var _console2;\n    (_console2 = console).warn.apply(_console2, arguments);\n  }\n}\n\n/**\n * Conditional console.error - ALWAYS logs (errors should be visible in all environments).\n * @param {...any} args - Arguments to pass to console.error\n */\nfunction debugError() {\n  var _console3;\n  (_console3 = console).error.apply(_console3, arguments);\n}\n\n/**\n * Create a module-scoped logger. Returns log, warn, and error functions\n * that automatically prefix messages with [module].\n *\n * @param {string} module - Module name (e.g., 'search', 'vfxns', 'reader')\n * @returns {{ log: Function, warn: Function, error: Function }}\n */\nfunction createLogger(module) {\n  var tag = \"[\".concat(module, \"]\");\n  return {\n    log: function log() {\n      var _context;\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      return debugLog.apply(void 0, _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1___default()(_context = [tag]).call(_context, args));\n    },\n    warn: function warn() {\n      var _context2;\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n      return debugWarn.apply(void 0, _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1___default()(_context2 = [tag]).call(_context2, args));\n    },\n    error: function error() {\n      var _context3;\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n      return debugError.apply(void 0, _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_1___default()(_context3 = [tag]).call(_context3, args
299));\n    }\n  };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2RlYnVnLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2RlYnVnLmpzPzY1ZGMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWJ1ZyB1dGlsaXR5IGZvciBjb25kaXRpb25hbCBsb2dnaW5nIGJhc2VkIG9uIGVudmlyb25tZW50LlxuICogTG9ncyBhcmUgb25seSBzaG93biBvbiBsb2NhbGhvc3QgYW5kIGRldiBzZXJ2ZXIsIG5vdCBvbiBzdGFnaW5nIG9yIHByb2R1Y3Rpb24uXG4gKi9cblxuLyoqXG4gKiBDaGVjayBpZiBjdXJyZW50IGVudmlyb25tZW50IGlzIGRldmVsb3BtZW50IChsb2NhbGhvc3Qgb3IgZGV2IHNlcnZlcikuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBsb2NhbGhvc3Qgb3IgZGV2IHNlcnZlciwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RldmVsb3BtZW50KCkge1xuICBjb25zdCBob3N0bmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtcbiAgcmV0dXJuIGhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fFxuICAgICAgICAgaG9zdG5hbWUgPT09ICcxMjcuMC4wLjEnIHx8XG4gICAgICAgICBob3N0bmFtZS5pbmNsdWRlcygnLmxvY2FsJykgfHxcbiAgICAgICAgIGhvc3RuYW1lLmluY2x1ZGVzKCdkZXYubWluaXN0cnlib29rcycpO1xufVxuXG4vKipcbiAqIENvbmRpdGlvbmFsIGNvbnNvbGUubG9nIC0gb25seSBsb2dzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gY29uc29sZS5sb2dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnTG9nKC4uLmFyZ3MpIHtcbiAgaWYgKGlzRGV2ZWxvcG1lbnQoKSkge1xuICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogQ29uZGl0aW9uYWwgY29uc29sZS53YXJuIC0gb25seSBsb2dzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gY29uc29sZS53YXJuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z1dhcm4oLi4uYXJncykge1xuICBpZiAoaXNEZXZlbG9wbWVudCgpKSB7XG4gICAgY29uc29sZS53YXJuKC4uLmFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogQ29uZGl0aW9uYWwgY29uc29sZS5lcnJvciAtIEFMV0FZUyBsb2dzIChlcnJvcnMgc2hvdWxkIGJlIHZpc2libGUgaW4gYWxsIGVudmlyb25tZW50cykuXG4gKiBAcGFyYW0gey4uLmFueX0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIGNvbnNvbGUuZXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnRXJyb3IoLi4uYXJncykge1xuICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG1vZHVsZS1zY29wZWQgbG9nZ2VyLiBSZXR1cm5zIGxvZywgd2FybiwgYW5kIGVycm9yIGZ1bmN0aW9uc1xuICogdGhhdCBhdXRvbWF0aWNhbGx5IHByZWZpeCBtZXNzYWdlcyB3aXRoIFttb2R1bGVdLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGUgLSBNb2R1bGUgbmFtZSAoZS5nLiwgJ3NlYXJjaCcsICd2ZnhucycsICdyZWFkZXInKVxuICogQHJldHVybnMge3sgbG9nOiBGdW5jdGlvbiwgd2FybjogRnVuY3Rpb24sIGVycm9yOiBGdW5jdGlvbiB9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKG1vZHVsZSkge1xuICBjb25zdCB0YWcgPSBgWyR7bW9kdWxlfV1gO1xuICByZXR1cm4ge1xuICAgIGxvZzogICAoLi4uYXJncykgPT4gZGVidWdMb2codGFnLCAuLi5hcmdzKSxcbiAgICB3YXJuOiAgKC4uLmFyZ3MpID0+IGRlYnVnV2Fybih0YWcsIC4uLmFyZ3MpLFxuICAgIGVycm9yOiAoLi4uYXJncykgPT4gZGVidWdFcnJvcih0YWcsIC4uLmFyZ3MpLFxuICB9O1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/utilities/debug.js\n");
300
301/***/ }),
302
303/***/ "./resources/js/utilities/draggable.js":
304/*!*********************************************!*\
305  !*** ./resources/js/utilities/draggable.js ***!
306  \*********************************************/
307/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
308
309eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   makeDraggable: () => (/* binding */ makeDraggable)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_math_hypot__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/math/hypot */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/math/hypot.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_math_hypot__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_math_hypot__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * Small, reusable pointer-based drag utility (#3083).\n *\n * Makes a floating panel draggable by a handle element (typically its header),\n * using Pointer Events (no jQuery). On pointerdown on the handle the panel's\n * current position is captured, but nothing is moved yet. Only once the pointer\n * travels past a small threshold does the panel switch from its centering\n * transform to absolute pixel positioning and begin following the pointer. This\n * means a plain click on the handle never repositions the panel. The panel is\n * clamped so it can never be dragged fully off-screen (the handle always stays\n * reachable).\n *\n * Drags that start on an interactive control (button, link, textarea, input,\n * select, contenteditable) are ignored so the close button and textarea keep\n * working normally.\n */\n\n// Minimum number of pixels of the panel that must remain visible on any edge so\n// the header/handle can always be grabbed again.\nvar MIN_VISIBLE_PX = 48;\n\n// Pointer travel (in px) required before a press is treated as a drag rather\n// than a click. Below this, the panel is left exactly where it was.\nvar DRAG_THRESHOLD_PX = 3;\nvar INTERACTIVE_SELECTOR = 'button, a, textarea, input, select, [contenteditable=\"true\"]';\n\n/**\n * Clamp a value into an inclusive range.\n *\n * @param {number} value\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\nfunction clamp(value, min, max) {\n  return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Make `panelEl` draggable by `handleEl`.\n *\n * @param {HTMLElement} panelEl  The floating panel to move.\n * @param {HTMLElement} handleEl The drag handle (e.g. the editor header).\n * @param {Object} [options]\n * @param {boolean} [options.clampToViewport=true] Keep the panel on-screen.\n * @returns {() => void} A teardown function that removes the listeners.\n */\nfunction makeDraggable(panelEl, handleEl) {\n  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n    _ref$clampToViewport = _ref.clampToViewport,\n    clampToViewport = _ref$clampToViewport === void 0 ? true : _ref$clampToViewport;\n  if (!panelEl || !handleEl) {\n    return function () {};\n  }\n  var dragging = false;\n  var moved = false;\n  var pointerId = null;\n  var startX = 0;\n  var startY = 0;\n  var originLeft = 0;\n  var originTop = 0;\n  var panelWidth = 0;\n  var panelHeight = 0;\n  var clampLeft = function clampLeft(value) {\n    if (!clampToViewport) {\n      return value;\n    }\n    var viewportWidth = window.innerWidth || 0;\n    return clamp(value, MIN_VISIBLE_PX - panelWidth, viewportWidth - MIN_VISIBLE_PX);\n  };\n  var clampTop = function clampTop(value) {\n    if (!clampToViewport) {\n      return value;\n    }\n    var viewportHeight = window.innerHeight || 0;\n    // Never let the top of the panel (where the handle lives) leave the viewport.\n    return clamp(value, 0, viewportHeight - MIN_VISIBLE_PX);\n  };\n  var onPointerDown = function onPointerDown(event) {\n    var _event$pointerId;\n    // Only a primary-button/touch drag, and never from an interactive control.\n    if (event.button !== undefined && event.button !== 0) {\n      return;\n    }\n    var target = event.target;\n    if (target && typeof target.closest === 'function' && target.closest(INTERACTIVE_SELECTOR)) {\n      return;\n    }\n    var rect = panelEl.getBoundingClientRect();\n    panelWidth = rect.width;\n    panelHeight = rect.height;\n    originLeft = rect.left;\n    originTop = rect.top;\n    startX = event.clientX;\n    startY = event.clientY;\n    dragging = true;\n    moved = false;\n    pointerId = (_event$pointerId = event.pointerId) !== null && _event$pointerId !== void 0 ? _event$pointerId : null;\n    if (pointerId !== null && typeof handleEl.setPointerCapture === 'function') {\n      handleEl.setPointerCapture(pointerId);\n    }\n    if (typeof event.preventDefault === 'function') {\n      event.preventDefault();\n    }\n  };\n  var onPointerMove = function onPointerMove(event) {\n    if (!dragging) {\n      return;\n    }\n    var dx = event.clientX - startX;\n    var dy = event.clientY - startY;\n\n    // A press that has not yet travelled past the threshold is still just a\n    // click — leave the panel untouched.\n    if (!moved) {\
309n      if (_babel_runtime_corejs3_core_js_stable_math_hypot__WEBPACK_IMPORTED_MODULE_0___default()(dx, dy) <= DRAG_THRESHOLD_PX) {\n        return;\n      }\n      moved = true;\n      // First real movement: pin the panel to viewport-fixed positioning at the\n      // exact spot it already occupies, then follow the pointer. originLeft/Top\n      // come from getBoundingClientRect() (viewport-relative), matching the\n      // deltas below. Without this, a panel that was positioned absolutely\n      // inside an offset/scrolled container — or still carrying a centering\n      // transform — would leap by that offset on the first move. Re-expressing\n      // the same visual spot as fixed px keeps it put. No-op when already fixed.\n      // Deferring to the first move (not pointerdown) preserves the guarantee\n      // that a plain click never repositions the panel. (#3080)\n      panelEl.style.position = 'fixed';\n      panelEl.style.transform = 'none';\n    }\n    panelEl.style.left = \"\".concat(clampLeft(originLeft + dx), \"px\");\n    panelEl.style.top = \"\".concat(clampTop(originTop + dy), \"px\");\n  };\n  var endDrag = function endDrag() {\n    if (!dragging) {\n      return;\n    }\n    dragging = false;\n    if (pointerId !== null && typeof handleEl.releasePointerCapture === 'function') {\n      try {\n        handleEl.releasePointerCapture(pointerId);\n      } catch (err) {\n        // capture may already be gone — safe to ignore\n      }\n    }\n    pointerId = null;\n  };\n  handleEl.addEventListener('pointerdown', onPointerDown);\n  handleEl.addEventListener('pointermove', onPointerMove);\n  handleEl.addEventListener('pointerup', endDrag);\n  handleEl.addEventListener('pointercancel', endDrag);\n  return function () {\n    handleEl.removeEventListener('pointerdown', onPointerDown);\n    handleEl.removeEventListener('pointermove', onPointerMove);\n    handleEl.removeEventListener('pointerup', endDrag);\n    handleEl.removeEventListener('pointercancel', endDrag);\n  };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2RyYWdnYWJsZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2RyYWdnYWJsZS5qcz83YzU5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU21hbGwsIHJldXNhYmxlIHBvaW50ZXItYmFzZWQgZHJhZyB1dGlsaXR5ICgjMzA4MykuXG4gKlxuICogTWFrZXMgYSBmbG9hdGluZyBwYW5lbCBkcmFnZ2FibGUgYnkgYSBoYW5kbGUgZWxlbWVudCAodHlwaWNhbGx5IGl0cyBoZWFkZXIpLFxuICogdXNpbmcgUG9pbnRlciBFdmVudHMgKG5vIGpRdWVyeSkuIE9uIHBvaW50ZXJkb3duIG9uIHRoZSBoYW5kbGUgdGhlIHBhbmVsJ3NcbiAqIGN1cnJlbnQgcG9zaXRpb24gaXMgY2FwdHVyZWQsIGJ1dCBub3RoaW5nIGlzIG1vdmVkIHlldC4gT25seSBvbmNlIHRoZSBwb2ludGVyXG4gKiB0cmF2ZWxzIHBhc3QgYSBzbWFsbCB0aHJlc2hvbGQgZG9lcyB0aGUgcGFuZWwgc3dpdGNoIGZyb20gaXRzIGNlbnRlcmluZ1xuICogdHJhbnNmb3JtIHRvIGFic29sdXRlIHBpeGVsIHBvc2l0aW9uaW5nIGFuZCBiZWdpbiBmb2xsb3dpbmcgdGhlIHBvaW50ZXIuIFRoaXNcbiAqIG1lYW5zIGEgcGxhaW4gY2xpY2sgb24gdGhlIGhhbmRsZSBuZXZlciByZXBvc2l0aW9ucyB0aGUgcGFuZWwuIFRoZSBwYW5lbCBpc1xuICogY2xhbXBlZCBzbyBpdCBjYW4gbmV2ZXIgYmUgZHJhZ2dlZCBmdWxseSBvZmYtc2NyZWVuICh0aGUgaGFuZGxlIGFsd2F5cyBzdGF5c1xuICog
309cmVhY2hhYmxlKS5cbiAqXG4gKiBEcmFncyB0aGF0IHN0YXJ0IG9uIGFuIGludGVyYWN0aXZlIGNvbnRyb2wgKGJ1dHRvbiwgbGluaywgdGV4dGFyZWEsIGlucHV0LFxuICogc2VsZWN0LCBjb250ZW50ZWRpdGFibGUpIGFyZSBpZ25vcmVkIHNvIHRoZSBjbG9zZSBidXR0b24gYW5kIHRleHRhcmVhIGtlZXBcbiAqIHdvcmtpbmcgbm9ybWFsbHkuXG4gKi9cblxuLy8gTWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIG9mIHRoZSBwYW5lbCB0aGF0IG11c3QgcmVtYWluIHZpc2libGUgb24gYW55IGVkZ2Ugc29cbi8vIHRoZSBoZWFkZXIvaGFuZGxlIGNhbiBhbHdheXMgYmUgZ3JhYmJlZCBhZ2Fpbi5cbmNvbnN0IE1JTl9WSVNJQkxFX1BYID0gNDg7XG5cbi8vIFBvaW50ZXIgdHJhdmVsIChpbiBweCkgcmVxdWlyZWQgYmVmb3JlIGEgcHJlc3MgaXMgdHJlYXRlZCBhcyBhIGRyYWcgcmF0aGVyXG4vLyB0aGFuIGEgY2xpY2suIEJlbG93IHRoaXMsIHRoZSBwYW5lbCBpcyBsZWZ0IGV4YWN0bHkgd2hlcmUgaXQgd2FzLlxuY29uc3QgRFJBR19USFJFU0hPTERfUFggPSAzO1xuXG5jb25zdCBJTlRFUkFDVElWRV9TRUxFQ1RPUiA9ICdidXR0b24sIGEsIHRleHRhcmVhLCBpbnB1dCwgc2VsZWN0LCBbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSc7XG5cbi8qKlxuICogQ2xhbXAgYSB2YWx1ZSBpbnRvIGFuIGluY2x1c2l2ZSByYW5nZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4sIG1heCkge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodmFsdWUsIG1pbiksIG1heCk7XG59XG5cbi8qKlxuICogTWFrZSBgcGFuZWxFbGAgZHJhZ2dhYmxlIGJ5IGBoYW5kbGVFbGAuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFuZWxFbCAgVGhlIGZsb2F0aW5nIHBhbmVsIHRvIG1vdmUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBoYW5kbGVFbCBUaGUgZHJhZyBoYW5kbGUgKGUuZy4gdGhlIGVkaXRvciBoZWFkZXIpLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jbGFtcFRvVmlld3BvcnQ9dHJ1ZV0gS2VlcCB0aGUgcGFuZWwgb24tc2NyZWVuLlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IEEgdGVhcmRvd24gZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBsaXN0ZW5lcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRHJhZ2dhYmxlKHBhbmVsRWwsIGhhbmRsZUVsLCB7IGNsYW1wVG9WaWV3cG9ydCA9IHRydWUgfSA9IHt9KSB7XG4gIGlmICghcGFuZWxFbCB8fCAhaGFuZGxlRWwpIHtcbiAgICByZXR1cm4gKCkgPT4ge307XG4gIH1cblxuICBsZXQgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgbGV0IG1vdmVkID0gZmFsc2U7XG4gIGxldCBwb2ludGVySWQgPSBudWxsO1xuICBsZXQgc3RhcnRYID0gMDtcbiAgbGV0IHN0YXJ0WSA9IDA7XG4gIGxldCBvcmlnaW5MZWZ0ID0gMDtcbiAgbGV0IG9yaWdpblRvcCA9IDA7XG4gIGxldCBwYW5lbFdpZHRoID0gMDtcbiAgbGV0IHBhbmVsSGVpZ2h0ID0gMDtcblxuICBjb25zdCBjbGFtcExlZnQgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoIWNsYW1wVG9WaWV3cG9ydCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGggfHwgMDtcbiAgICByZXR1cm4gY2xhbXAodmFsdWUsIE1JTl9WSVNJQkxFX1BYIC0gcGFuZWxXaWR0aCwgdmlld3BvcnRXaWR0aCAtIE1JTl9WSVNJQkxFX1BYKTtcbiAgfTtcblxuICBjb25zdCBjbGFtcFRvcCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghY2xhbXBUb1ZpZXdwb3J0KSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IHx8IDA7XG4gICAgLy8gTmV2ZXIgbGV0IHRoZSB0b3Agb2YgdGhlIHBhbmVsICh3aGVyZSB0aGUgaGFuZGxlIGxpdmVzKSBsZWF2ZSB0aGUgdmlld3BvcnQuXG4gICAgcmV0dXJuIGNsYW1wKHZhbHVlLCAwLCB2aWV3cG9ydEhlaWdodCAtIE1JTl9WSVNJQkxFX1BYKTtcbiAgfTtcblxuICBjb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgLy8gT25seSBhIHByaW1hcnktYnV0dG9uL3RvdWNoIGRyYWcsIGFuZCBuZXZlciBmcm9tIGFuIGludGVyYWN0aXZlIGNvbnRyb2wuXG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuY2xvc2VzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXJnZXQuY2xvc2VzdChJTlRFUkFDVElWRV9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gcGFuZWxFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBwYW5lbFdpZHRoID0gcmVjdC53aWR0aDtcbiAgICBwYW5lbEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICAgIG9yaWdpbkxlZnQgPSByZWN0LmxlZnQ7XG4gICAgb3JpZ2luVG9wID0gcmVjdC50b3A7XG4gICAgc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICBzdGFydFkgPSBldmVudC5jbGllbnRZO1xuICAgIGRyYWdnaW5nID0gdHJ1ZTtcbiAgICBtb3ZlZCA9IGZhbHNlO1xuICAgIHBvaW50ZXJJZCA9IGV2ZW50LnBvaW50ZXJJZCA/PyBudWxsO1xuXG4gICAgaWYgKHBvaW50ZXJJZCAhPT0gbnVsbCAmJiB0eXBlb2YgaGFuZGxlRWwuc2V0UG9pbnRlckNhcHR1cmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGhhbmRsZUVsLnNldFBvaW50ZXJDYXB0dXJlKHBvaW50ZXJJZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBldmVudC5wcmV2ZW50RGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IChldmVudCkgPT4ge1xuICAgIGlmICghZHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkeCA9IGV2ZW50LmNsaWVudFggLSBzdGFydFg7XG4gICAgY29uc3QgZHkgPSBldmVudC5jbGllbnRZIC0gc3RhcnRZO1xuXG4gICAgLy8gQSBwcmVzcyB0aGF0IGhhcyBub3QgeWV0IHRyYXZlbGxlZCBwYXN0IHRoZSB0aHJlc2hvbGQgaXMgc3RpbGwganVzdCBhXG4gICAgLy8gY2xpY2sg4oCUIGxlYXZlIHRoZSBwYW5lbCB1bnRvdWNoZWQuXG4gICAgaWYgKCFtb3ZlZCkge1xuICAgICAgaWYgKE1hdGguaHlwb3QoZHgsIGR5KSA8PSBEUkFHX1RIUkVTSE9MRF9QWCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBtb3ZlZCA9IHRydWU7XG4gICAgICAvLyBGaXJzdCByZWFsIG1vdmVtZW50OiBwaW4gdGhlIHBhbmVsIHRvIHZpZXdwb3J0LWZpeGVkIHBvc2l0aW9uaW5nIGF0IHR
309oZVxuICAgICAgLy8gZXhhY3Qgc3BvdCBpdCBhbHJlYWR5IG9jY3VwaWVzLCB0aGVuIGZvbGxvdyB0aGUgcG9pbnRlci4gb3JpZ2luTGVmdC9Ub3BcbiAgICAgIC8vIGNvbWUgZnJvbSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSAodmlld3BvcnQtcmVsYXRpdmUpLCBtYXRjaGluZyB0aGVcbiAgICAgIC8vIGRlbHRhcyBiZWxvdy4gV2l0aG91dCB0aGlzLCBhIHBhbmVsIHRoYXQgd2FzIHBvc2l0aW9uZWQgYWJzb2x1dGVseVxuICAgICAgLy8gaW5zaWRlIGFuIG9mZnNldC9zY3JvbGxlZCBjb250YWluZXIg4oCUIG9yIHN0aWxsIGNhcnJ5aW5nIGEgY2VudGVyaW5nXG4gICAgICAvLyB0cmFuc2Zvcm0g4oCUIHdvdWxkIGxlYXAgYnkgdGhhdCBvZmZzZXQgb24gdGhlIGZpcnN0IG1vdmUuIFJlLWV4cHJlc3NpbmdcbiAgICAgIC8vIHRoZSBzYW1lIHZpc3VhbCBzcG90IGFzIGZpeGVkIHB4IGtlZXBzIGl0IHB1dC4gTm8tb3Agd2hlbiBhbHJlYWR5IGZpeGVkLlxuICAgICAgLy8gRGVmZXJyaW5nIHRvIHRoZSBmaXJzdCBtb3ZlIChub3QgcG9pbnRlcmRvd24pIHByZXNlcnZlcyB0aGUgZ3VhcmFudGVlXG4gICAgICAvLyB0aGF0IGEgcGxhaW4gY2xpY2sgbmV2ZXIgcmVwb3NpdGlvbnMgdGhlIHBhbmVsLiAoIzMwODApXG4gICAgICBwYW5lbEVsLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHBhbmVsRWwuc3R5bGUudHJhbnNmb3JtID0gJ25vbmUnO1xuICAgIH1cblxuICAgIHBhbmVsRWwuc3R5bGUubGVmdCA9IGAke2NsYW1wTGVmdChvcmlnaW5MZWZ0ICsgZHgpfXB4YDtcbiAgICBwYW5lbEVsLnN0eWxlLnRvcCA9IGAke2NsYW1wVG9wKG9yaWdpblRvcCArIGR5KX1weGA7XG4gIH07XG5cbiAgY29uc3QgZW5kRHJhZyA9ICgpID0+IHtcbiAgICBpZiAoIWRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWdnaW5nID0gZmFsc2U7XG5cbiAgICBpZiAocG9pbnRlcklkICE9PSBudWxsICYmIHR5cGVvZiBoYW5kbGVFbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZUVsLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShwb2ludGVySWQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIGNhcHR1cmUgbWF5IGFscmVhZHkgYmUgZ29uZSDigJQgc2FmZSB0byBpZ25vcmVcbiAgICAgIH1cbiAgICB9XG4gICAgcG9pbnRlcklkID0gbnVsbDtcbiAgfTtcblxuICBoYW5kbGVFbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIG9uUG9pbnRlckRvd24pO1xuICBoYW5kbGVFbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uUG9pbnRlck1vdmUpO1xuICBoYW5kbGVFbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmREcmFnKTtcbiAgaGFuZGxlRWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZERyYWcpO1xuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgaGFuZGxlRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBvblBvaW50ZXJEb3duKTtcbiAgICBoYW5kbGVFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uUG9pbnRlck1vdmUpO1xuICAgIGhhbmRsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZERyYWcpO1xuICAgIGhhbmRsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmREcmFnKTtcbiAgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/utilities/draggable.js\n");
310
311/***/ }),
312
313/***/ "./resources/js/utilities/general.js":
314/*!*******************************************!*\
315  !*** ./resources/js/utilities/general.js ***!
316  \*******************************************/
317/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
318
319eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   NOISE_WORDS: () => (/* binding */ NOISE_WORDS),\n/* harmony export */   appColors: () => (/* binding */ appColors),\n/* harmony export */   appSettings: () => (/* binding */ appSettings),\n/* harmony export */   asyncSleep: () => (/* binding */ asyncSleep),\n/* harmony export */   capitalize: () => (/* binding */ capitalize),\n/* harmony export */   copyToClipboard: () => (/* binding */ copyToClipboard),\n/* harmony export */   darkenColor: () => (/* binding */ darkenColor),\n/* harmony export */   debounce: () => (/* binding */ debounce),\n/* harmony export */   delay: () => (/* binding */ delay),\n/* harmony export */   filterNoiseWords: () => (/* binding */ filterNoiseWords),\n/* harmony export */   getAnchorContainer: () => (/* binding */ getAnchorContainer),\n/* harmony export */   getAppServerRedirectPreference: () => (/* binding */ getAppServerRedirectPreference),\n/* harmony export */   getCurrentContentId: () => (/* binding */ getCurrentContentId),\n/* harmony export */   getCurrentHtmlContentId: () => (/* binding */ getCurrentHtmlContentId),\n/* harmony export */   getCurrentSectionId: () => (/* binding */ getCurrentSectionId),\n/* harmony export */   getCurrentUserId: () => (/* binding */ getCurrentUserId),\n/* harmony export */   getHighlightSpotlightDuration: () => (/* binding */ getHighlightSpotlightDuration),\n/* harmony export */   getKeyByValue: () => (/* binding */ getKeyByValue),\n/* harmony export */   getUniqueWords: () => (/* binding */ getUniqueWords),\n/* harmony export */   getUserFontSizeFromUserSettings: () => (/* binding */ getUserFontSizeFromUserSettings),\n/* harmony export */   insertOverlayOnElement: () => (/* binding */ insertOverlayOnElement),\n/* harmony export */   isHidden: () => (/* binding */ isHidden),\n/* harmony export */   isInView: () => (/* binding */ isInView),\n/* harmony export */   isIterable: () => (/* binding */ isIterable),\n/* harmony export */   isMobileViewport: () => (/* binding */ isMobileViewport),\n/* harmony export */   isNoiseWord: () => (/* binding */ isNoiseWord),\n/* harmony export */   lightenColor: () => (/* binding */ lightenColor),\n/* harmony export */   objectToRgb: () => (/* binding */ objectToRgb),\n/* harmony export */   pinSpinnerOverElement: () => (/* binding */ pinSpinnerOverElement),\n/* harmony export */   range: () => (/* binding */ range),\n/* harmony export */   removeOverlayOnElement: () => (/* binding */ removeOverlayOnElement),\n/* harmony export */   rgbToHex: () => (/* binding */ rgbToHex),\n/* harmony export */   rgbToObject: () => (/* binding */ rgbToObject),\n/* harmony export */   scrollAndSpotlight: () => (/* binding */ scrollAndSpotlight),\n/* harmony export */   scrollToAnchor: () => (/* binding */ scrollToAnchor),\n/* harmony export */   scrollToDiv: () => (/* binding */ scrollToDiv),\n/* harmony export */   stripPageNumbers: () => (/* binding */ stripPageNumbers),\n/* harmony export */   updateUserPreferenceProperty: () => (/* binding */ updateUserPreferenceProperty),\n/* harmony export */   userPreferences: () => (/* binding */ userPreferences)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/toConsumableArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/createForOfIteratorHelper */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/createForOfIteratorHelper.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/asyncToGenerator */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/regenerator */ \"./node_modules/@babel/runtime-corejs3/regenerator/index.js\");\n/* harmony import */ var _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/trim */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/map */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_fill__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/fill */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/fill.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_fill__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_fill__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/slice */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/set-timeout */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/parse-int */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/parse-float */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/concat */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/find */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/object/keys */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/json/stringify */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/filter */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/instance/index-of */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/set */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/set.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_get_iterator_method__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js/get-iterator-method */ \"./node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_get_iterator_method__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_get_iterator_method__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/promise */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/promise.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var _notices_notice__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../notices/notice */ \"./resources/js/notices/notice.js\");\n/* harmony import */ var _debug__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./debug */ \"./resources/js/utilities/debug.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Utility methods\n */\n\n\n\nvar _createLogger = (0,_debug__WEBPACK_IMPORTED_MODULE_21__.createLogger)('utils'),\n  log = _createLogger.log;\n\n/**\n * Remove the CW page numbers (e.g., \"[23]\" or \"[iv]\" from text being copied to the clipboard.\n * @param text\n * @returns {*}\n */\nfunction stripPageNumbers(text) {\n  if (text) {\n    var _context;\n    // match a pageNumber and the following space\n    var regex = /(\\[[0-9]*[ivxlc]*\\])/ig;\n    var newText = text.replace(regex, '');
319\n\n    // remove extra whitespace if any double-white spaces found\n    return _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4___default()(_context = newText.replace('  ', ' ')).call(_context);\n  }\n  return text;\n}\n\n/**\n * Copy text to clipboard\n * @param textToCopy\n * @returns {Promise<unknown>|Promise<void>}\n */\n// returns a promise\nfunction copyToClipboard(_x) {\n  return _copyToClipboard.apply(this, arguments);\n}\n/**\n * Generate a range of numbers\n * @param start\n * @param end\n * @returns {unknown[]}\n */\nfunction _copyToClipboard() {\n  _copyToClipboard = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().mark(function _callee(textToCopy) {\n    var textArea, notice;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().wrap(function _callee$(_context23) {\n      while (1) switch (_context23.prev = _context23.next) {\n        case 0:\n          if (!(navigator.clipboard && window.isSecureContext)) {\n            _context23.next = 4;\n            break;\n          }\n          return _context23.abrupt(\"return\", navigator.clipboard.writeText(textToCopy));\n        case 4:\n          // text area method\n          textArea = document.createElement(\"textarea\");\n          textArea.value = textToCopy;\n\n          // make the textarea out of viewport\n          textArea.style.position = \"fixed\";\n          textArea.style.left = \"-999999px\";\n          textArea.style.top = \"-999999px\";\n          document.body.appendChild(textArea);\n\n          // focus and select textarea content\n          textArea.focus();\n          textArea.select();\n          textArea.setSelectionRange(0, textArea.textLength);\n          _context23.prev = 13;\n          // copy selected text in textArea\n          document.execCommand('copy');\n          _context23.next = 23;\n          break;\n        case 17:\n          _context23.prev = 17;\n          _context23.t0 = _context23[\"catch\"](13);\n          notice = new _notices_notice__WEBPACK_IMPORTED_MODULE_20__.AsyncNotice('Error copying to clipboard');\n          _context23.next = 22;\n          return notice.create({\n            error: _context23.t0\n          });\n        case 22:\n          notice.remove();\n        case 23:\n          textArea.remove();\n        case 24:\n        case \"end\":\n          return _context23.stop();\n      }\n    }, _callee, null, [[13, 17]]);\n  }));\n  return _copyToClipboard.apply(this, arguments);\n}\nfunction range(start, end) {\n  var _context2, _context3;\n  return _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5___default()(_context2 = _babel_runtime_corejs3_core_js_stable_instance_fill__WEBPACK_IMPORTED_MODULE_6___default()(_context3 = Array(end - start + 1)).call(_context3, 0, 0, end)).call(_context2, function (_, idx) {\n    return start + idx;\n  });\n}\n\n/**\n * Asynchronous sleep method\n * @param milliSeconds time to pass to setTimeout()\n * @param fn if present, callback to run after setTimeout() finishes\n * @param args arguments for the function\n *\n * @returns {Promise<unknown>}\n */\nfunction asyncSleep() {\n  return _asyncSleep.apply(this, arguments);\n}\n/**\n * Capitalize a string\n */\nfunction _asyncSleep() {\n  _asyncSleep = (0,_babel_runtime_corejs3_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(/*#__PURE__*/_babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().mark(function _callee4() {\n    var milliSeconds,\n      fn,\n      args,\n      _args4 = arguments;\n    return _babel_runtime_corejs3_regenerator__WEBPACK_IMPORTED_MODULE_3___default().wrap(function _callee4$(_context27) {\n      while (1) switch (_context27.prev = _context27.next) {\n        case 0:\n          milliSeconds = _args4.length > 0 && _args4[0] !== undefined ? _args4[0] : 0;\n          fn = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : null;\n          args = _args4.length > 2 && _args4[2] !== undefined ? _args4[2] : null;\n          if (!fn) {\n            _context27.next = 6;\n            break;\n          }\n          return _context27.abrupt(\"return\", new (_babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_19___default())(function (fn) {\n            return _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_8___default()(fn, milliSeconds);\n          }));\n        case 6:\n          _context27.next = 8;\n          return function () {\n            return new (_babel_runtime_corejs3_core_js_stable_promise__WEBPACK_IMPORTED_MODULE_19___default())(function (resolve, reject) {\n              _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_8___default()(function () {\n                log(\"wating \".concat(milliSeconds / 1000, \" seconds\"));\n                resolve();\n              }, milliSeconds);\n            });\n          };\n        case 8:\n        case \"end\":\n          return _context27.stop();\n      }\n    }, _callee4);\n  }));\n  return _asyncSleep.apply(this, arguments);\n}\nfunction capitalize(string) {\n  if (typeof string !== 'string') return '';\n  return string.charAt(0).toUpperCase() + _babel_runtime_corejs3_core_js_stable_instance_slice__WEBPACK_IMPORTED_MODULE_7___default()(string).call(string, 1);\n}\n\n/**\n * Capitalize every word in a sentence.\n * @param sentence\n * @returns {string}\n */\nfunction capitalizeWords(sentence) {\n  var _context4;\n  return _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5___default()(_context4 = sentence.split(\" \")).call(_context4, function (word) {\n    return capitalize(word);\n  }).join(\" \");\n}\n\n/**\n * Scroll to page number searched for or reading portion start.\n * This method is meant to be used with the Page Search feature in the reader or\n * with reading portion requests from apps.\n * @param anchorLocation\n */\nfunction scrollToAnchor(
319anchorLocation) {\n  var anchor, span, html;\n  if (anchorLocation === 'start') {\n    anchor = document.querySelector('.start');\n  } else {\n    anchor = document.querySelector(\"[data-page-id='\".concat(anchorLocation, \"'\"));\n    if (anchor.nodeName === 'P') {\n      span = document.createElement('span');\n      html = anchor.innerHTML;\n      span.setAttribute('id', anchor.id);\n      span.dataset.pageId = anchor.id;\n      span.classList.add('pg');\n      span.classList.add('page-anchor');\n      span.innerHTML = html;\n      anchor.innerHTML = '';\n      anchor.appendChild(span);\n\n      // set the anchor to the new span inside the paragraph element\n      anchor = anchor.firstChild;\n    } else {\n      anchor.classList.add('page-anchor');\n    }\n  }\n  if (anchor) {\n    anchor.scrollIntoView({\n      block: \"center\"\n    });\n\n    // remove special styling after some seconds\n    var _appSettings = appSettings(),\n      timeout = _appSettings.PAGE_NUMBER_HIGHLIGHT_DURATION;\n    _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_8___default()(function (anchor) {\n      return function () {\n        anchor.classList.remove('page-anchor');\n      };\n    }(anchor), timeout);\n  }\n}\n\n/**\n * Scroll to a div on the page.\n * @param element\n * @param navHeight\n */\nfunction scrollToDiv(element, navHeight) {\n  if (!element) return;\n  var rect = element.getBoundingClientRect();\n  var scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n  var offsetTop = rect.top + scrollTop;\n  var totalScroll = offsetTop - navHeight;\n  window.scrollTo({\n    top: totalScroll,\n    behavior: 'smooth'\n  });\n}\n\n/**\n * Turn a rgb color into an object.\n *\n * @param rgbColor\n * @returns {*}\n */\nfunction rgbToObject(rgbColor) {\n  var _context5, _context6, _context7, _context8;\n  // check if rgb number separator is comma\n  var rgb = rgbColor.replace(/[rgba()]/g, '');\n  var parts = rgb.split(',');\n\n  // if separator is not a comma\n  parts.length === 1 ? parts = rgb.split(' ') : null;\n  var color = [];\n  color.red = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_9___default()(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4___default()(_context5 = parts[0]).call(_context5));\n  color.green = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_9___default()(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4___default()(_context6 = parts[1]).call(_context6));\n  color.blue = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_9___default()(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4___default()(_context7 = parts[2]).call(_context7));\n  color.alpha = parts.length === 4 ? _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_10___default()(_babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4___default()(_context8 = parts[3]).call(_context8)) : null;\n  return color;\n}\n\n/**\n * turn an object representing a rgb color into a rgb() color.\n *\n * You can select the output rgb() color string separator (a comma, or a space)\n *\n * returns rgb() not rbga()\n *\n * @param colorObject\n * @param separator\n */\nfunction objectToRgb(colorObject) {\n  var _context9, _context10, _context11, _context12, _context13, _context14;\n  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';\n  var c = colorObject;\n  var s = separator === ',' ? separator + ' ' : separator;\n  var red = c.red;\n  var greenClause = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context9 = \"\".concat(s)).call(_context9, c.green);\n  var blueClause = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context10 = \"\".concat(s)).call(_context10, c.blue);\n  var alphaClause = c.alpha ? _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context11 = \"\".concat(s)).call(_context11, c.alph
319a) : null;\n  return _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context12 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context13 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context14 = \"rgb(\".concat(red)).call(_context14, greenClause)).call(_context13, blueClause)).call(_context12, alphaClause, \");\");\n}\n\n/**\n * Turn a rgb (or rgba) color to hex.\n *\n * @param rgb\n * @returns {{hex: string, opacity: string}}\n */\nfunction rgbToHex(rgb) {\n  var _context15;\n  // e.g., rgb(0,128, 255, 0.5) -> 'parts' will be (0,128, 255, 0, 5)\n  var parts = rgb.match(/\\d+/g);\n  var hex = '#' + _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5___default()(parts).call(parts, function (x) {\n    x = _babel_runtime_corejs3_core_js_stable_parse_float__WEBPACK_IMPORTED_MODULE_10___default()(x).toString(16);\n    return x.length === 1 ? \"0\" + x : x;\n  }).join(\"\");\n  var obj = {\n    hex: hex.substring(0, 7),\n    opacity: '1'\n  };\n\n  // handle opacity\n  switch (parts.length) {\n    case 4:\n      obj.opacity = parts[3].toString();\n      break;\n    case 5:\n      obj.opacity = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context15 = \"\".concat(parts[3], \".\")).call(_context15, parts[4]).toString();\n  }\n  return obj;\n}\n// Utility function to darken a color\nfunction darkenColor(color, percentage) {\n  var _context16, _context17, _context18;\n  // Create a temporary element to parse the color\n  var tempDiv = document.createElement('div');\n  tempDiv.style.color = color;\n  document.body.appendChild(tempDiv);\n\n  // Get the computed color in RGB format\n  var computedColor = getComputedStyle(tempDiv).color;\n  document.body.removeChild(tempDiv);\n\n  // Extract RGB values\n  var rgb = _babel_runtime_corejs3_core_js_stable_instance_map__WEBPACK_IMPORTED_MODULE_5___default()(_context16 = computedColor.match(/\\d+/g)).call(_context16, Number); // [R, G, B]\n\n  // Convert RGB to HSL\n  var hsl = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n\n  // Darken the lightness by the given percentage\n  hsl[2] = Math.max(0, hsl[2] - percentage / 100); // Ensure lightness doesn't go below 0\n\n  // Convert HSL back to RGB\n  var darkenedRgb = hslToRgb(hsl[0], hsl[1], hsl[2]);\n\n  // Return the new color in RGB format\n  return _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context17 = _babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context18 = \"rgb(\".concat(darkenedRgb[0], \", \")).call(_context18, darkenedRgb[1], \", \")).call(_context17, darkenedRgb[2], \")\");\n}\n\n/**\n * Lightens a color by calling darkenColor with the percentage value negated.\n *\n * @param color\n * @param percentage\n */\nfunction lightenColor(color, percentage) {\n  return darkenColor(color, -percentage);\n}\n\n// Helper: Convert RGB to HSL\nfunction rgbToHsl(r, g, b) {\n  r /= 255;\n  g /= 255;\n  b /= 255;\n  var max = Math.max(r, g, b);\n  var min = Math.min(r, g, b);\n  var delta = max - min;\n  var h, s, l;\n  l = (max + min) / 2;\n  if (delta === 0) {\n    h = s = 0; // Gray, no saturation\n  } else {\n    s = delta / (1 - Math.abs(2 * l - 1));\n    switch (max) {\n      case r:\n        h = (g - b) / delta % 6;\n        break;\n      case g:\n        h = (b - r) / delta + 2;\n        break;\n      case b:\n        h = (r - g) / delta + 4;\n        break;\n    }\n    h *= 60;\n    if (h < 0) h += 360;\n  }\n  return [h, s, l];\n}\n\n// Helper: Convert HSL to RGB\nfunction hslToRgb(h, s, l) {\n  var c = (1 - Math.abs(2 * l - 1)) * s;\n  var x = c * (1 - Math.abs(h / 60 % 2 - 1));\n  var m = l - c / 2;\n  var r, g, b;\n  if (h >= 0 && h < 60) {\n    r = c;\n    g = x;\n    b = 0;\n  } else if (h >= 60 && h < 120) {\n    r = x;\n    g = c;\n    b = 0;\n  } else if (h >= 120 && h < 180) {\n    r = 0;\n    g = c;\n    b = x;\n  } else if (h >= 180 && h < 240) {\n    r = 0;\n    g = x;\n    b = c;\n  } else if (h >= 240 && h < 300) {\n    r = x;\n    g = 0;\n    b = c;\n  } else {\n    r = c;\n    g = 0;\n    b = x;\n  }\n  return [Math.round((r + m) * 255), Math.round((g + m) * 255), Math.round((b + m) * 255)];\n}\n\n/**\n * Scroll to an element on the page and temporarily add shadow to element.\n *\n * @param element\n * @param spotlight\
319n */\nfunction scrollAndSpotlight(element) {\n  var spotlight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n  // spotlight the annotation\n  if (spotlight) {\n    element.classList.add('target-highlight');\n\n    // remove shadow after delay\n    var duration = _babel_runtime_corejs3_core_js_stable_parse_int__WEBPACK_IMPORTED_MODULE_9___default()(getHighlightSpotlightDuration()) * 1000; // in ms\n    _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_8___default()(function (element) {\n      return function () {\n        element.classList.remove('target-highlight');\n      };\n    }(element), duration);\n  }\n  element.scrollIntoView({\n    behavior: 'smooth',\n    block: 'center'\n  });\n}\n\n/**\n * Programmatically add a CSS style to the page.\n *\n * @param styles\n * @param styleSheetTitle\n * @param index\n */\nfunction addStyle(styles) {\n  var styleSheetTitle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n  var sheets = document.styleSheets;\n  var sheet;\n  if (styleSheetTitle) {\n    // for (let i = 0; i < sheets.length; i++) {\n    var _iterator = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(sheets),\n      _step;\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var thisSheet = _step.value;\n        if (thisSheet.title === styleSheetTitle) {\n          sheet = thisSheet;\n          break;\n        }\n      }\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n  }\n\n  // if not found, use first sheet\n  if (!sheet) {\n    sheet = sheets[0];\n  }\n  sheet.insertRule(styles, index);\n}\n\n/**\n * Check if the given element is hidden in DOM.\n *\n * Uses 'offsetParent': https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.offsetParent\n * @param el\n * @returns {boolean}\n */\nfunction isHidden(el) {\n  return el.offsetParent === null;\n}\n/**\n * Return user preferences array stored in preferences meta tag\n * @returns {*|null}\n */\nfunction userPreferences() {\n  var name = 'user-preferences';\n  if (document.querySelector('meta[name=\"s-user-preferences\"]')) {\n    name = 's-user-preferences';\n  }\n  return fetchDataProperty('preferences', null, name);\n}\n\n/**\n * Fetch font size from User Preferences\n *\n * @returns {null}\n */\nfunction getUserFontSizeFromUserSettings() {\n  var _userPreferences = userPreferences(),\n    _userPreferences$Font = _userPreferences.FontSize,\n    FontSize = _userPreferences$Font === void 0 ? null : _userPreferences$Font;\n  return FontSize;\n}\n\n/**\n * Return array of colors and their values set in the Settings class and fetched from the Colors meta tag\n * @returns {*|null}\n */\nfunction appColors() {\n  return fetchDataProperty('colors', null, 'colors');\n}\n\n/**\n * Returns app settings from the app settings meta tag\n * @returns {*|null}\n */\nfunction appSettings() {\n  return fetchDataProperty('settings', null, 'app-settings');\n}\n\n/**\n * Getter - returns anchor container from app settings.\n *\n * @returns {*}\n */\nfunction getAnchorContainer() {\n  return appSettings().ANCHOR_CONTAINER;\n}\n\n/**\n * Getter - highlight spotlight duration.\n *\n * @returns {*}\n */\nfunction getHighlightSpotlightDuration() {\n  var _appSettings2 = appSettings(),\n    duration = _appSettings2.HIGHLIGHT_SPOTLIGHT_DURATION;\n  return duration;\n}\n\n/**\n * Getter - server to redirect user to when servicing an app request.\n *\n * @returns { string|null }\n */\nfunction getAppServerRedirectPreference() {\n  var _appSettings3 = appSettings(),\n    _appSettings3$ADMIN_A = _appSettings3.ADMIN_APP_SERVER_REDIRECT,\n    server = _appSettings3$ADMIN_A === void 0 ? null : _appSettings3$ADMIN_A;\n  return server;\n}\n\n/**\n * Returns the current content id form the current-info element\n * @returns {*|null}\n */\nfunction getCurrentContentId() {\n  return fetchDataProperty('contentId', 'current-info');\n}\n\n/**\n * Returns the current section id from the current-info element\n * @returns {*|null}\n */\nfunction getCurrentSectionId() {\n  return fetchDataProperty('sectionId', 'current-info');\n}\n\n/**\n * Returns the current HTML content id from the current-info element\n * @returns {*|null}\n */\nfunction getCurrentHtmlContentId() {\n  return fetchDataProperty('htmlContentId', 'current-info');\n}\nfunction getCurrentUserId() {\n  return fetchDataProperty('userId', 'current-info');\n}\n\n/**\n * Helper method: fetch the data specified data property from the given element. If no element given,\n * use the provided meta element name to search for the given meta tag.\n * Return null if no element found.\n * @param propertyName\n * @param elementClass\n * @param metaName\n * @returns {null|*}\n */\nfunction fetchDataProperty(propertyName, elementClass) {\n  var metaName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n  var elem, response;\n  if (elementClass) {\n    var _document, _elem;\n    elem = (_document = document) === null || _document === void 0 ? void 0 : _document.querySelector(\".\".concat(elementClass));\n    response = (_elem = elem) === null || _elem === void 0 ? void 0 : _elem.dataset[propertyName];\n  } else if (metaName) {\n    var _document2, _elem2;\n    elem = (_document2 = document) === null || _document2 === void 0 ? void 0 : _document2.querySelector(\"meta[name='\".concat(metaName, \"']\"));\n    var data = (_elem2 = elem) === null || _elem2 === void 0 ? void 0 : _elem2.dataset[propertyName];\n    response = data ? JSON.parse(data) : {};\n  } else {\n    var _context19;\n    log(_babel_runtime_corejs3_core_js_stable_instance_concat__WEBPACK_IMPORTED_MODULE_11___default()(_context19 = \"no element found with class \".concat(elementClass, \" or meta element with name \")).call(_context19, metaName));\n  }\n\n  // JSON parse the property value\n  if (response) {\n    return response;\n  } else {\n    return null;\n  }\n}\n\n/**\n * Get the key for a value in an object\n * @param object\n * @param value\n * @returns {string}\n */\nfunction getKeyByValue(object, value) {\n  var _context20;\n  var result = _babel_runtime_corejs3_core_js_stable_instance_find__WEBPACK_IMPORTED_MODULE_12___default()(_context20 = _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_13___default()(object)).call(_context20, function (key) {\n    return object[key] === value;\n  });\n  return result === undefined ? null : result;\n}\n\n/**\n * Update a property in the user preferences meta element.\n *\n * @param propertyName\n * @param value\n */\nfunction updateUserPreferenceProperty(propertyName, value) {\n  var elem = document.querySelector(\"meta[name='user-preferences']\");\n  if (elem) {\n    var preferences = JSON.parse(elem.dataset.preferences);
319\n    if (preferences.hasOwnProperty(propertyName)) {\n      preferences[propertyName] = value;\n    }\n    elem.dataset.preferences = _babel_runtime_corejs3_core_js_stable_json_stringify__WEBPACK_IMPORTED_MODULE_14___default()(preferences);\n  } else {\n    log('Could not update the user preference property');\n  }\n}\n\n/**\n * Detect if an element is within the visible viewport.\n * @param el\n * @returns {boolean}\n */\nfunction isInView(el) {\n  if (el) {\n    var box = el.getBoundingClientRect();\n    return box.top < window.innerHeight && box.bottom >= 0;\n  } else {\n    return false;\n  }\n}\nfunction getUniqueWords(text) {\n  var _context21;\n  var unique;\n\n  // replace symbols and punctuation with whitespace\n  unique = text.replace(/[.,?;:!)(\\[\\]]/g, ' ');\n\n  // trim text, reduce multiple adjacent whitespaces to one, then replace with comma\n  unique = _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4___default()(unique).call(unique).replace(/(\\s)+/g, ' ').replace(/\\s/g, ',');\n\n  // filter out duplicates\n  unique = _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_15___default()(_context21 = unique.split(',')).call(_context21, onlyUnique);\n  return unique;\n}\n\n/**\n * Checks if a value is unique in an array based on its index position.\n *\n * @param {*} value - The value to check for uniqueness.\n * @param {number} index - The index of the current value in the array.\n * @param {Array} array - The array to check for uniqueness.\n * @returns {boolean} - True if the value is unique, false otherwise.\n */\nfunction onlyUnique(value, index, array) {\n  return _babel_runtime_corejs3_core_js_stable_instance_index_of__WEBPACK_IMPORTED_MODULE_16___default()(array).call(array, value) === index;\n}\n\n/**\n * Canonical list of SQL Server full-text noise (stop) words.\n * Mirror of MinistryBooks\\Helpers\\NoiseWords::all() in PHP — keep in sync.\n *\n * @type {Set<string>}\n */\nvar NOISE_WORDS = new (_babel_runtime_corejs3_core_js_stable_set__WEBPACK_IMPORTED_MODULE_17___default())(['a', 'about', 'after', 'all', 'also', 'an', 'and', 'another', 'any', 'are', 'as', 'at', 'be', 'because', 'been', 'before', 'being', 'between', 'both', 'but', 'by', 'came', 'can', 'come', 'could', 'did', 'do', 'does', 'each', 'else', 'for', 'from', 'get', 'got', 'had', 'has', 'have', 'he', 'her', 'here', 'him', 'himself', 'his', 'how', 'if', 'in', 'into', 'is', 'it', 'its', 'just', 'like', 'make', 'many', 'me', 'might', 'more', 'most', 'much', 'must', 'my', 'never', 'no', 'now', 'of', 'on', 'only', 'or', 'other', 'our', 'out', 'over', 're', 'said', 'same', 'see', 'should', 'since', 'so', 'some', 'still', 'such', 'take', 'than', 'that', 'the', 'their', 'them', 'then', 'there', 'these', 'they', 'this', 'those', 'through', 'to', 'too', 'under', 'up', 'use', 'very', 'want', 'was', 'way', 'we', 'well', 'were', 'what', 'when', 'where', 'which', 'while', 'who', 'will', 'with', 'would', 'you', 'your']);\n\n/**\n * Determine whether a token is a noise word (case-insensitive) or a lone\n * letter/digit — both are ignored by SQL Server full-text search.\n *\n * @param {string} word\n * @returns {boolean}\n */\nfunction isNoiseWord(word) {\n  var _context22;\n  var trimmed = _babel_runtime_corejs3_core_js_stable_instance_trim__WEBPACK_IMPORTED_MODULE_4___default()(_context22 = String(word)).call(_context22).toLowerCase();\n  if (trimmed === '') {\n    return true;\n  }\n  if (trimmed.length === 1 && /[a-z0-9]/.test(trimmed)) {\n    return true;\n  }\n  return NOISE_WORDS.has(trimmed);\n}\n\n/**\n * Strip noise words and lone letters/digits from a list of tokens.\n *\n * @param {string[]} words\n * @returns {string[]}\n */\nfunction filterNoiseWords(words) {\n  return _babel_runtime_corejs3_core_js_stable_instance_filter__WEBPACK_IMPORTED_MODULE_15___default()(words).call(words, function (word) {\n    return !isNoiseWord(word);\n  });\n}\n\n/**\n * Check if the object is iterable.\n *\n * @param object\n * @returns {boolean}\n */\nfunction isIterable(object) {\n  if (object === null) {\n    return false;\n  }\n  return typeof _babel_runtime_corejs3_core_js_get_iterator_method__WEBPACK_IMPORTED_MODULE_18___default()(object) === 'function';\n}\n\n/**\n * TODO: needs testing! implementation of debounce from: https://youmightnotneed.com/lodash\n * @param func\n * @param delay\n * @param leading\n * @returns {(function(...[*]): void)|*}\n */\nfunction debounce(func, delay) {\n  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n    leading = _ref.leading;\n  var timerId;\n  return function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    if (!timerId && leading) {\n      func.apply(void 0, args);\n    }\n    clearTimeout(timerId);\n    timerId = _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_8___default()(function () {\n      return func.apply(void 0, args);\n    }, delay);\n  };\n}\n\n/**\n * TEST: delay method\n * @param fn\n * @param timer\n * @param args\n */\nfunction delay(fn, timer) {\n  for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n    args[_key2 - 2] = arguments[_key2];\n  }\n  _babel_runtime_corejs3_core_js_stable_set_timeout__WEBPACK_IMPORTED_MODULE_8___default()(function () {\n    return fn.apply(fn, args);\n  }, timer);\n}\n\n/**\n * Add an overlay over an element to effectively disable its controls.\n * The overlay covers the entire element with a semi-transparent background.\n *\n * @param element - The element to overlay\n * @param overlayId - Unique ID for the overlay (used to remove it later)\n * @param showSpinner - Whether to show a centered spinner in the overlay\n */\nfunction insertOverlayOnElement(element, overlayId) {\n  var showSpinner = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n  if (element) {\n    // Ensure element has position for absolute overlay to work\n    var computedStyle = window.getComputedStyle(element);\n    if (computedStyle.position === 'static') {\n      element.style.position = 'relative';\n      element.dataset.overlayAddedPosition = 'true';\n    }
319\n    var overlay = document.createElement('div');\n    overlay.className = 'overlay';\n    overlay.id = overlayId;\n\n    // CSS uses top:0; bottom:0 to auto-size overlay with container\n\n    if (showSpinner) {\n      var spinner = document.createElement('i');\n      spinner.className = 'fa-solid fa-spinner fa-spin';\n      overlay.appendChild(spinner);\n    }\n    element.insertAdjacentElement('afterbegin', overlay);\n  }\n}\n\n/**\n * Remove an overlay from an element.\n *\n * @param overlayId - The ID of the overlay to remove\n */\nfunction removeOverlayOnElement(overlayId) {\n  var overlay = document.querySelector(\"#\".concat(overlayId));\n  if (overlay) {\n    // Clean up the position we added if we added it\n    var parent = overlay.parentElement;\n    if ((parent === null || parent === void 0 ? void 0 : parent.dataset.overlayAddedPosition) === 'true') {\n      parent.style.position = '';\n      delete parent.dataset.overlayAddedPosition;\n    }\n    overlay.remove();\n  }\n}\n\n/**\n * Pin a just-inserted Spinner-class `.loading-on-top` box exactly over a\n * target element (#3595).\n *\n * The Spinner class (resources/js/spinner.js) inserts its box as a DOM\n * *sibling* of the anchor element (insertAdjacentElement), but the box's\n * CSS (`.loading-on-top { position: absolute; right: 0; top: 0; ... }`)\n * positions it relative to the nearest *positioned ancestor* - usually a\n * wrapper div around both a label and the control. If that wrapper is\n * wider than the control itself, the box drifts away from (or extends\n * past) the control it's meant to cover.\n *\n * This measures the target's actual rendered box (relative to the\n * spinner's offsetParent) and sets explicit inline top/left/width/height\n * on the spinner, so it exactly covers the target regardless of how wide\n * the surrounding wrapper is. Opt-in only - does not touch the shared\n * Spinner class or the base `.loading-on-top` rule, so every other\n * consumer (Annotations sort-by, view-style toggle, etc.) is unaffected.\n *\n * @param spinnerDataName - the `name` passed to `new Spinner(name, ...)`\n * @param targetElement - the element the spinner box should exactly cover\n */\nfunction pinSpinnerOverElement(spinnerDataName, targetElement) {\n  var spinner = document.querySelector(\"[data-name=\\\"\".concat(spinnerDataName, \"\\\"]\"));\n  if (!spinner || !targetElement) {\n    return;\n  }\n  var offsetParent = spinner.offsetParent || document.body;\n  var parentRect = offsetParent.getBoundingClientRect();\n  var targetRect = targetElement.getBoundingClientRect();\n  spinner.style.left = \"\".concat(targetRect.left - parentRect.left, \"px\");\n  spinner.style.top = \"\".concat(targetRect.top - parentRect.top, \"px\");\n  spinner.style.right = 'auto';\n  spinner.style.width = \"\".concat(targetRect.width, \"px\");\n  spinner.style.height = \"\".concat(targetRect.height, \"px\");\n}\nfunction isMobileViewport() {\n  return window.matchMedia('(max-width: 639px)').matches;\n}\nfunction isTabletViewport() {\n  return window.matchMedia('(min-width: 640px) and (max-width: 1023px)').matches;\n}\nfunction isDesktopViewport() {\n  return window.matchMedia('(min-width: 1024px)').matches;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2dlbmVyYWwuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQWdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUFBO0FBaENBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQVFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFRQTtBQUFBO0FBbUJBO0FBQ0E7QUFDQTtBQUZBO0FBQUE7QUFuQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0F
319BRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFLQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBTUE7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2dlbmVyYWwuanM/Y2E4ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxpdHkgbWV0aG9kc1xuICovXG5cbmltcG9ydCB7
319IEFzeW5jTm90aWNlIH0gZnJvbSBcIi4uL25vdGljZXMvbm90aWNlXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi9kZWJ1Z1wiO1xuY29uc3QgeyBsb2cgfSA9IGNyZWF0ZUxvZ2dlcigndXRpbHMnKTtcblxuLyoqXG4gKiBSZW1vdmUgdGhlIENXIHBhZ2UgbnVtYmVycyAoZS5nLiwgXCJbMjNdXCIgb3IgXCJbaXZdXCIgZnJvbSB0ZXh0IGJlaW5nIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLlxuICogQHBhcmFtIHRleHRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBzdHJpcFBhZ2VOdW1iZXJzKHRleHQpIHtcbiAgICBpZih0ZXh0KSB7XG4gICAgICAgIC8vIG1hdGNoIGEgcGFnZU51bWJlciBhbmQgdGhlIGZvbGxvd2luZyBzcGFjZVxuICAgICAgICBsZXQgcmVnZXggPSAvKFxcW1swLTldKltpdnhsY10qXFxdKS9pZ1xuXG4gICAgICAgIGxldCBuZXdUZXh0ID0gdGV4dC5yZXBsYWNlKHJlZ2V4LCAnJyk7XG5cbiAgICAgICAgLy8gcmVtb3ZlIGV4dHJhIHdoaXRlc3BhY2UgaWYgYW55IGRvdWJsZS13aGl0ZSBzcGFjZXMgZm91bmRcbiAgICAgICAgcmV0dXJuIG5ld1RleHQucmVwbGFjZSgnICAnLCAnICcpLnRyaW0oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dDtcbn1cblxuLyoqXG4gKiBDb3B5IHRleHQgdG8gY2xpcGJvYXJkXG4gKiBAcGFyYW0gdGV4dFRvQ29weVxuICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj58UHJvbWlzZTx2b2lkPn1cbiAqL1xuLy8gcmV0dXJucyBhIHByb21pc2VcbmFzeW5jIGZ1bmN0aW9uIGNvcHlUb0NsaXBib2FyZCh0ZXh0VG9Db3B5KSB7XG4gICAgLy8gbmF2aWdhdG9yIGNsaXBib2FyZCBhcGkgbmVlZHMgYSBzZWN1cmUgY29udGV4dCAoaHR0cHMpXG4gICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgd2luZG93LmlzU2VjdXJlQ29udGV4dCkge1xuICAgICAgICAvLyBuYXZpZ2F0b3IgY2xpcGJvYXJkIGFwaSBtZXRob2RcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHRUb0NvcHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRleHQgYXJlYSBtZXRob2RcbiAgICAgICAgbGV0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICB0ZXh0QXJlYS52YWx1ZSA9IHRleHRUb0NvcHk7XG5cbiAgICAgICAgLy8gbWFrZSB0aGUgdGV4dGFyZWEgb3V0IG9mIHZpZXdwb3J0XG4gICAgICAgIHRleHRBcmVhLnN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5sZWZ0ID0gXCItOTk5OTk5cHhcIjtcbiAgICAgICAgdGV4dEFyZWEuc3R5bGUudG9wID0gXCItOTk5OTk5cHhcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7XG5cbiAgICAgICAgLy8gZm9jdXMgYW5kIHNlbGVjdCB0ZXh0YXJlYSBjb250ZW50XG4gICAgICAgIHRleHRBcmVhLmZvY3VzKCk7XG4gICAgICAgIHRleHRBcmVhLnNlbGVjdCgpO1xuICAgICAgICB0ZXh0QXJlYS5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0ZXh0QXJlYS50ZXh0TGVuZ3RoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGNvcHkgc2VsZWN0ZWQgdGV4dCBpbiB0ZXh0QXJlYVxuICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vdGljZSA9IG5ldyBBc3luY05vdGljZSgnRXJyb3IgY29weWluZyB0byBjbGlwYm9hcmQnKTtcbiAgICAgICAgICAgIGF3YWl0IG5vdGljZS5jcmVhdGUoe2Vycm9yfSk7XG4gICAgICAgICAgICBub3RpY2UucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dEFyZWEucmVtb3ZlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgcmFuZ2Ugb2YgbnVtYmVyc1xuICogQHBhcmFtIHN0YXJ0XG4gKiBAcGFyYW0gZW5kXG4gKiBAcmV0dXJucyB7dW5rbm93bltdfVxuICovXG5mdW5jdGlvbiByYW5nZShzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIEFycmF5KGVuZCAtIHN0YXJ0ICsgMSkuZmlsbCgwLCAwLCBlbmQpLm1hcCgoXywgaWR4KSA9PiBzdGFydCArIGlkeCk7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzIHNsZWVwIG1ldGhvZFxuICogQHBhcmFtIG1pbGxpU2Vjb25kcyB0aW1lIH
319RvIHBhc3MgdG8gc2V0VGltZW91dCgpXG4gKiBAcGFyYW0gZm4gaWYgcHJlc2VudCwgY2FsbGJhY2sgdG8gcnVuIGFmdGVyIHNldFRpbWVvdXQoKSBmaW5pc2hlc1xuICogQHBhcmFtIGFyZ3MgYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb25cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXN5bmNTbGVlcChtaWxsaVNlY29uZHMgPSAwLCBmbiA9IG51bGwsIGFyZ3MgPSBudWxsKSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZm4gPT4gc2V0VGltZW91dChmbiwgbWlsbGlTZWNvbmRzKSkpO1xuXG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IGF3YWl0IGZuLmFwcGx5KGZuLCAuLi5hcmdzKSwgbWlsbGlTZWNvbmRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxvZyhgd2F0aW5nICR7bWlsbGlTZWNvbmRzIC8gMTAwMH0gc2Vjb25kc2ApO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIG1pbGxpU2Vjb25kcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDYXBpdGFsaXplIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgaWYodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcbiAgICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpO1xufVxuXG4vKipcbiAqIENhcGl0YWxpemUgZXZlcnkgd29yZCBpbiBhIHNlbnRlbmNlLlxuICogQHBhcmFtIHNlbnRlbmNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBjYXBpdGFsaXplV29yZHMoc2VudGVuY2UpIHtcbiAgIHJldHVybiBzZW50ZW5jZVxuICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAubWFwKHdvcmQgPT4gY2FwaXRhbGl6ZSh3b3JkKSlcbiAgICAgICAuam9pbihcIiBcIik7XG59XG5cbi8qKlxuICogU2Nyb2xsIHRvIHBhZ2UgbnVtYmVyIHNlYXJjaGVkIGZvciBvciByZWFkaW5nIHBvcnRpb24gc3RhcnQuXG4gKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGggdGhlIFBhZ2UgU2VhcmNoIGZlYXR1cmUgaW4gdGhlIHJlYWRlciBvclxuICogd2l0aCByZWFkaW5nIHBvcnRpb24gcmVxdWVzdHMgZnJvbSBhcHBzLlxuICogQHBhcmFtIGFuY2hvckxvY2F0aW9uXG4gKi9cbmZ1bmN0aW9uIHNjcm9sbFRvQW5jaG9yKGFuY2hvckxvY2F0aW9uKSB7XG4gICAgbGV0IGFuY2hvciwgc3BhbiwgaHRtbDtcbiAgICBpZihhbmNob3JMb2NhdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICBhbmNob3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3RhcnQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhbmNob3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1wYWdlLWlkPScke2FuY2hvckxvY2F0aW9ufSdgKTtcblxuICAgICAgICBpZihhbmNob3Iubm9kZU5hbWUgPT09ICdQJykge1xuICAgICAgICAgICAgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIGh0bWwgPSBhbmNob3IuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnaWQnLCBhbmNob3IuaWQpO1xuICAgICAgICAgICAgc3Bhbi5kYXRhc2V0LnBhZ2VJZCA9IGFuY2hvci5pZDtcbiAgICAgICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgncGcnKTtcbiAgICAgICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgncGFnZS1hbmNob3InKTtcbiAgICAgICAgICAgIHNwYW4uaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgICAgICAgYW5jaG9yLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgYW5jaG9yLmFwcGVuZENoaWxkKHNwYW4pO1xuXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGFuY2hvciB0byB0aGUgbmV3IHNwYW4gaW5zaWRlIHRoZSBwYXJhZ3JhcGggZWxlbWVudFxuICAgICAgICAgICAgYW5jaG9yID0gYW5jaG9yLmZpcnN0Q2hpbGQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IuY2xhc3NMaXN0LmFkZCgncGFnZS1hbmNob3InKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmKGFuY2hvcikge1xuICAgICAgICBhbmNob3Iuc2Nyb2xsSW50b1ZpZXcoIHtibG9jazogXCJjZW50ZXJcIiB9KTtcblxuICAgICAgICAvLyByZW1vdmUgc3BlY2lhbCBzdHlsaW5nIGFmdGVyIHNvbWUgc2Vjb25kc1xuICAgICAgICBjb25zdCAgeyBQQUdFX05VTUJFUl9ISUdITElHSFRfRFVSQVRJT046IHRpbWVvdXQgIH0gPSBhcHBTZXR0aW5ncygpO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKGFuY2hvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGFuY2hvci5jbGFzc0xpc3QucmVtb3ZlKCdwYWdlLWFuY2hvcicpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfShhbmNob3IpLCB0aW1lb3V0KTtcbiAgICB9XG59XG5cbi8qKlxuICogU2Nyb2xsIHRvIGEgZGl2IG9uIHRoZSBwYWdlLlxuICogQHBhcmFtIGVsZW1lbnRcbiAqIEBwYXJhbSBuYXZIZWlnaHRcbiAqL1xuZnVuY3Rpb24gc2Nyb2xsVG9EaXYoZWxlbWVudCwgbmF2SGVpZ2h0KSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzY3JvbGxUb3AgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICBjb25zdCBvZmZzZXRUb3AgPSByZWN0LnRvcCArIHNjcm9sbFRvcDtcbiAgICBjb25zdCB0b3RhbFNjcm9sbCA9IG9mZnNldFRvcCAtIG5hdkhlaWdodDtcblxuICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgI
319HRvcDogdG90YWxTY3JvbGwsXG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFR1cm4gYSByZ2IgY29sb3IgaW50byBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHJnYkNvbG9yXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gcmdiVG9PYmplY3QocmdiQ29sb3IpIHtcbiAgICAvLyBjaGVjayBpZiByZ2IgbnVtYmVyIHNlcGFyYXRvciBpcyBjb21tYVxuICAgIGxldCByZ2IgPSByZ2JDb2xvci5yZXBsYWNlKC9bcmdiYSgpXS9nLCAnJyk7XG4gICAgbGV0IHBhcnRzID0gcmdiLnNwbGl0KCcsJyk7XG5cbiAgICAvLyBpZiBzZXBhcmF0b3IgaXMgbm90IGEgY29tbWFcbiAgICAocGFydHMubGVuZ3RoID09PSAxKSA/IHBhcnRzID0gcmdiLnNwbGl0KCcgJykgOiBudWxsO1xuXG4gICAgbGV0IGNvbG9yID0gW107XG4gICAgY29sb3IucmVkID0gcGFyc2VJbnQocGFydHNbMF0udHJpbSgpKTtcbiAgICBjb2xvci5ncmVlbiA9IHBhcnNlSW50KHBhcnRzWzFdLnRyaW0oKSk7XG4gICAgY29sb3IuYmx1ZSA9IHBhcnNlSW50KHBhcnRzWzJdLnRyaW0oKSk7XG5cbiAgICBjb2xvci5hbHBoYSA9IHBhcnRzLmxlbmd0aCA9PT0gNCA/IHBhcnNlRmxvYXQocGFydHNbM10udHJpbSgpKSA6IG51bGw7XG5cbiAgICByZXR1cm4gY29sb3I7XG59XG5cbi8qKlxuICogdHVybiBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgcmdiIGNvbG9yIGludG8gYSByZ2IoKSBjb2xvci5cbiAqXG4gKiBZb3UgY2FuIHNlbGVjdCB0aGUgb3V0cHV0IHJnYigpIGNvbG9yIHN0cmluZyBzZXBhcmF0b3IgKGEgY29tbWEsIG9yIGEgc3BhY2UpXG4gKlxuICogcmV0dXJucyByZ2IoKSBub3QgcmJnYSgpXG4gKlxuICogQHBhcmFtIGNvbG9yT2JqZWN0XG4gKiBAcGFyYW0gc2VwYXJhdG9yXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvUmdiKGNvbG9yT2JqZWN0LCBzZXBhcmF0b3I9JywnKSB7XG4gICAgY29uc3QgYyA9IGNvbG9yT2JqZWN0O1xuICAgIGNvbnN0IHMgPSAoc2VwYXJhdG9yID09PSAnLCcpID8gc2VwYXJhdG9yICsgJyAnIDogc2VwYXJhdG9yO1xuXG4gICAgY29uc3QgcmVkID0gYy5yZWQ7XG4gICAgY29uc3QgZ3JlZW5DbGF1c2UgPSBgJHtzfSR7Yy5ncmVlbn1gO1xuICAgIGNvbnN0IGJsdWVDbGF1c2UgPSBgJHtzfSR7Yy5ibHVlfWA7XG4gICAgbGV0IGFscGhhQ2xhdXNlID0gYy5hbHBoYSA/IGAke3N9JHtjLmFscGhhfWAgOiBudWxsO1xuXG4gICAgcmV0dXJuIGByZ2IoJHtyZWR9JHtncmVlbkNsYXVzZX0ke2JsdWVDbGF1c2V9JHthbHBoYUNsYXVzZX0pO2A7XG59XG5cbi8qKlxuICogVHVybiBhIHJnYiAob3IgcmdiYSkgY29sb3IgdG8gaGV4LlxuICpcbiAqIEBwYXJhbSByZ2JcbiAqIEByZXR1cm5zIHt7aGV4OiBzdHJpbmcsIG9wYWNpdHk6IHN0cmluZ319XG4gKi9cbmZ1bmN0aW9uIHJnYlRvSGV4KHJnYikge1xuICAgIC8vIGUuZy4sIHJnYigwLDEyOCwgMjU1LCAwLjUpIC0+ICdwYXJ0cycgd2lsbCBiZSAoMCwxMjgsIDI1NSwgMCwgNSlcbiAgICBsZXQgcGFydHMgPSByZ2IubWF0Y2goL1xcZCsvZyk7XG4gICAgbGV0IGhleCA9ICcjJyArIHBhcnRzLm1hcCgoeCkgPT4ge1xuICAgICAgICB4ID0gcGFyc2VGbG9hdCh4KS50b1N0cmluZygxNik7XG4gICAgICAgIHJldHVybiAoeC5sZW5ndGggPT09IDEpID8gXCIwXCIgKyB4IDogeDtcbiAgICB9KS5qb2luKFwiXCIpO1xuXG4gICAgbGV0IG9iaiA9IHtoZXg6IGhleC5zdWJzdHJpbmcoMCw3KSwgb3BhY2l0eTogJzEnfTtcblxuICAgIC8vIGhhbmRsZSBvcGFjaXR5XG4gICAgc3dpdGNoKHBhcnRzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBvYmoub3BhY2l0eSA9IHBhcnRzWzNdLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgb2JqLm9wYWNpdHkgPSBgJHtwYXJ0c1szXX0uJHtwYXJ0c1s0XX1gLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn1cbi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGFya2VuIGEgY29sb3JcbmZ1bmN0aW9uIGRhcmtlbkNvbG9yKGNvbG9yLCBwZXJjZW50YWdlKSB7XG4gICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGVsZW1lbnQgdG8gcGFyc2UgdGhlIGNvbG9yXG4gICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRlbXBEaXYuc3R5bGUuY29sb3IgPSBjb2xvcjtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBEaXYpO1xuXG4gICAgLy8gR2V0IHRoZSBjb21wdXRlZCBjb2xvciBpbiBSR0IgZm9ybWF0XG4gICAgY29uc3QgY29tcHV0ZWRDb2xvciA9IGdldENvbXB1dGVkU3R5bGUodGVtcERpdikuY29sb3I7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZW1wRGl2KTtcblxuICAgIC8vIEV4dHJhY3QgUkdCIHZhbHVlc1xuICAgIGNvbnN0IHJnYiA9IGNvbXB1dGVkQ29sb3IubWF0Y2goL1xcZCsvZykubWFwKE51bWJlcik7IC8vIFtSLCBHLCBCXVxuXG4gICAgLy8gQ29udmVydCBSR0IgdG8gSFNMXG4gICAgY29uc3QgaHNsID0gcmdiVG9Ic2wocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSk7XG5cbiAgICAvLyBEYXJrZW4gdGhlIGxpZ2h0bmVzcyBieSB0aGUgZ2l2ZW4gcGVyY2VudGFnZVxuICAgIGhzbFsyXSA9IE1hdGgubWF4KDAsIGhzbFsyXSAtIHBlcmNlbnRhZ2UgLyAxMDApOyAvLyBFbnN1cmUgbGlnaHRuZXNzIGRvZXNuJ3QgZ28gYmVsb3cgMFxuXG4gICAgLy8gQ29udmVydCBIU0wgYmFjayB0byBSR0JcbiAgICBjb25zdCBkYXJrZW5lZFJnYiA9IGhzbFRvUmdiKGhzbFswXSwgaHNsWzFdLCBoc2xbMl0pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBuZXcgY29sb3IgaW4gUkdCIGZvcm1hdFxuICAgIHJldHVybiBgcmdiKCR7ZGFya2VuZWRSZ2JbMF19LCAke2RhcmtlbmVkUmdiWzFdfSwgJHtkYXJrZW5lZFJnYlsyXX0pYDtcbn1cblxuLyoqXG4gKiBMaWdodGVucyBhIGNvbG9yIGJ5IGNhbGxpbmcgZGFya2VuQ29sb3Igd2l0aCB0aGUgcGVyY2VudGFnZSB2YWx1ZSBuZWdhdGVkLlxuICpcbiAqIEBwYXJhbSBjb2xvclxuICogQHBhcmFtIHBlcmNlbnRhZ2VcbiAqL1xuZnVuY3Rpb24gbGlnaHRlbkNvbG9yKGNvbG9yLCBwZXJjZW50YWdlKSB7XG4gICAgcmV0dXJuIGRhcmtlbkNvbG9yKGNvbG9yLCAtcGVyY2VudGFnZSk7XG59XG5cbi8vIEhlbHBlcjogQ29udmVydCBSR0IgdG8gSFNMXG5mdW5jdGlvbiByZ2JUb0hzbChyLCBnLCBiKSB7XG4gICAgciAvPSAyNTU7XG4gICAgZyAvPSAyNTU7XG4gICAgYiAvPSAyNTU7XG5cbiAgICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICBjb25zdCBkZWx0YSA9IG1heCAtIG1pbjtcblxuICAgIGxldCBoLCBzLCBsO1xuICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG5cbiAgICBpZiAoZGVsdGEgPT09IDApIHtcbiAgICAgICAgaCA9IHMgPSAwOyAvLyBHcmF5LCBubyBzYXR1cmF0aW9uXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcyA9IGRlbHRhIC8gKDEgLSBNYXRoLmFicygyICogbCAtIDEpKTtcbiAgICAgICAgc3dpdGNoIChtYXgpIHtcbiAgICAgICAgICAgIGNhc2UgcjpcbiAgICAgICAgICAgICAgICBoID0gKChnIC0gYikgLyBkZWx0YSkgJSA2O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBnOlxuICAgICAgICAgICAgICAgIGggPSAoYiAtIHIpIC8gZGVsdGEgKyAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBiOlxuICAgICAgICAgICAgICAgIGggPSAociAtIGcpIC8gZGVsdGEgKyA0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGggKj0gNjA7XG4gICAgICAgIGlmIChoIDwgMCkgaCArPSAzNjA7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoLCBzLCBsXTtcbn1cblxuLy8gSGVscGVyOiBDb252ZXJ0IEhTTCB0byBSR0JcbmZ1bmN0aW9uIGhzbFRvUmdiKGgsIHMsIGwpIHtcbiAgICBjb25zdCBjID0gKDEgLSBNYXRoLmFicygyICogbCAtIDEpKSAqIHM7XG4gICAgY29uc3QgeCA9IGMgKiAoMSAtIE1hdGguYWJzKChoIC8gNjApICUgMiAtIDEpKTtcbiAgICBjb25zdCBtID0gbCAtIGMgLyAyO1xuXG4gICAgbGV0IHIsIGcsIGI7XG4gICAgaWYgKGggPj0gMCAmJiBoIDwgNjApIFtyLCBnLCBiXSA9IFtjLCB4LCAwXTtcbiAgICBlbHNlIGlmIChoID49IDYwICYmIGggPCAxMjApIFtyLCBnLCBiXSA9IFt4LCBjLCAwXTtcbiAgICBlbHNlIGlmIChoID49IDEyMCAmJi
319BoIDwgMTgwKSBbciwgZywgYl0gPSBbMCwgYywgeF07XG4gICAgZWxzZSBpZiAoaCA+PSAxODAgJiYgaCA8IDI0MCkgW3IsIGcsIGJdID0gWzAsIHgsIGNdO1xuICAgIGVsc2UgaWYgKGggPj0gMjQwICYmIGggPCAzMDApIFtyLCBnLCBiXSA9IFt4LCAwLCBjXTtcbiAgICBlbHNlIFtyLCBnLCBiXSA9IFtjLCAwLCB4XTtcblxuICAgIHJldHVybiBbXG4gICAgICAgIE1hdGgucm91bmQoKHIgKyBtKSAqIDI1NSksXG4gICAgICAgIE1hdGgucm91bmQoKGcgKyBtKSAqIDI1NSksXG4gICAgICAgIE1hdGgucm91bmQoKGIgKyBtKSAqIDI1NSksXG4gICAgXTtcbn1cblxuLyoqXG4gKiBTY3JvbGwgdG8gYW4gZWxlbWVudCBvbiB0aGUgcGFnZSBhbmQgdGVtcG9yYXJpbHkgYWRkIHNoYWRvdyB0byBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50XG4gKiBAcGFyYW0gc3BvdGxpZ2h0XG4gKi9cbmZ1bmN0aW9uIHNjcm9sbEFuZFNwb3RsaWdodChlbGVtZW50LCBzcG90bGlnaHQgPSB0cnVlKSB7XG4gICAgLy8gc3BvdGxpZ2h0IHRoZSBhbm5vdGF0aW9uXG4gICAgaWYoc3BvdGxpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGFyZ2V0LWhpZ2hsaWdodCcpO1xuXG4gICAgICAgIC8vIHJlbW92ZSBzaGFkb3cgYWZ0ZXIgZGVsYXlcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBwYXJzZUludChnZXRIaWdobGlnaHRTcG90bGlnaHREdXJhdGlvbigpKSAqIDEwMDA7IC8vIGluIG1zXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndGFyZ2V0LWhpZ2hsaWdodCcpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfShlbGVtZW50KSwgZHVyYXRpb24pO1xuICAgIH1cblxuICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbn1cblxuLyoqXG4gKiBQcm9ncmFtbWF0aWNhbGx5IGFkZCBhIENTUyBzdHlsZSB0byB0aGUgcGFnZS5cbiAqXG4gKiBAcGFyYW0gc3R5bGVzXG4gKiBAcGFyYW0gc3R5bGVTaGVldFRpdGxlXG4gKiBAcGFyYW0gaW5kZXhcbiAqL1xuZnVuY3Rpb24gYWRkU3R5bGUoc3R5bGVzLCBzdHlsZVNoZWV0VGl0bGUgPSBudWxsLCBpbmRleCA9IDApIHtcbiAgICBjb25zdCBzaGVldHMgPSBkb2N1bWVudC5zdHlsZVNoZWV0cztcbiAgICBsZXQgc2hlZXQ7XG5cbiAgICBpZiAoc3R5bGVTaGVldFRpdGxlKSB7XG4gICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgc2hlZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvcihjb25zdCB0aGlzU2hlZXQgb2Ygc2hlZXRzKSB7XG4gICAgICAgICAgICBpZiAodGhpc1NoZWV0LnRpdGxlID09PSBzdHlsZVNoZWV0VGl0bGUpIHtcbiAgICAgICAgICAgICAgIHNoZWV0ID0gdGhpc1NoZWV0O1xuICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiBub3QgZm91bmQsIHVzZSBmaXJzdCBzaGVldFxuICAgIGlmKCFzaGVldCkge1xuICAgICAgICBzaGVldCA9IHNoZWV0c1swXTtcbiAgICB9XG5cbiAgICBzaGVldC5pbnNlcnRSdWxlKHN0eWxlcywgaW5kZXgpO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIGhpZGRlbiBpbiBET00uXG4gKlxuICogVXNlcyAnb2Zmc2V0UGFyZW50JzogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxFbGVtZW50Lm9mZnNldFBhcmVudFxuICogQHBhcmFtIGVsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNIaWRkZW4oZWwpIHtcbiAgICByZXR1cm4gKGVsLm9mZnNldFBhcmVudCA9PT0gbnVsbClcbn1cbi8qKlxuICogUmV0dXJuIHVzZXIgcHJlZmVyZW5jZXMgYXJyYXkgc3RvcmVkIGluIHByZWZlcmVuY2VzIG1ldGEgdGFnXG4gKiBAcmV0dXJucyB7KnxudWxsfVxuICovXG5mdW5jdGlvbiB1c2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgbGV0IG5hbWUgPSAndXNlci1wcmVmZXJlbmNlcyc7XG4gICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwicy11c2VyLXByZWZlcmVuY2VzXCJdJykpIHtcbiAgICAgICBuYW1lID0gJ3MtdXNlci1wcmVmZXJlbmNlcyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZldGNoRGF0YVByb3BlcnR5KCdwcmVmZXJlbmNlcycsIG51bGwsIG5hbWUpO1xufVxuXG4vKipcbiAqIEZldGNoIGZvbnQgc2l6ZSBmcm9tIFVzZXIgUHJlZmVyZW5jZXNcbiAqXG4gKiBAcmV0dXJucyB7bnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0VXNlckZvbnRTaXplRnJvbVVzZXJTZXR0aW5ncygpIHtcbiAgICBjb25zdCB7IEZvbnRTaXplID0gbnVsbCB9ID0gdXNlclByZWZlcmVuY2VzKCk7XG5cbiAgICByZXR1cm4gRm9udFNpemU7XG59XG5cbi8qKlxuICogUmV0dXJuIGFycmF5IG9mIGNvbG9ycyBhbmQgdGhlaXIgdmFsdWVzIHNldCBpbiB0aGUgU2V0dGluZ3MgY2xhc3MgYW5kIGZldGNoZWQgZnJvbSB0aGUgQ29sb3JzIG1ldGEgdGFnXG4gKiBAcmV0dXJucyB7KnxudWxsfVxuICovXG5mdW5jdGlvbiBhcHBDb2xvcnMoKSB7XG4gICAgcmV0dXJuIGZldGNoRGF0YVByb3BlcnR5KCdjb2xvcnMnLCBudWxsLCAnY29sb3JzJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhcHAgc2V0dGluZ3MgZnJvbSB0aGUgYXBwIHNldHRpbmdzIG1ldGEgdGFnXG4gKiBAcmV0dXJucyB7KnxudWxsfVxuICovXG5mdW5jdGlvbiBhcHBTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gZmV0Y2hEYXRhUHJvcGVydHkoJ3NldHRpbmdzJywgbnVsbCwgJ2FwcC1zZXR0aW5ncycpO1xufVxuXG4vKipcbiAqIEdldHRlciAtIHJldHVybnMgYW5jaG9yIGNvbnRhaW5lciBmcm9tIGFwcCBzZXR0aW5ncy5cbiAqXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gZ2V0QW5jaG9yQ29udGFpbmVyKCkge1xuICAgIHJldHVybiBhcHBTZXR0aW5ncygpLkFOQ0hPUl9DT05UQUlORVI7XG59XG5cbi8qKlxuICogR2V0dGVyIC0gaGlnaGxpZ2h0IHNwb3RsaWdodCBkdXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0U3BvdGxpZ2h0RHVyYXRpb24oKSB7XG4gICAgbGV0IHsgSElHSExJR0hUX1NQT1RMSUdIVF9EVVJBVElPTjogZHVyYXRpb24gfSA9IGFwcFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xufVxuXG4vKipcbiAqIEdldHRlciAtIHNlcnZlciB0byByZWRpcmVjdCB1c2VyIHRvIHdoZW4gc2VydmljaW5nIGFuIGFwcCByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm5zIHsgc3RyaW5nfG51bGwgfVxuICovXG5mdW5jdGlvbiBnZXRBcHBTZXJ2ZXJSZWRpcmVjdFByZWZlcmVuY2UoKSB7XG4gICBsZXQgeyBBRE1JTl9BUFBfU0VSVkVSX1JFRElSRUNUOiBzZXJ2ZXIgPSBudWxsIH0gPSBhcHBTZXR0aW5ncygpO1xuXG4gICByZXR1cm4gc2VydmVyO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29udGVudCBpZCBmb3JtIHRoZSBjdXJyZW50LWluZm8gZWxlbWVudFxuICogQHJldHVybnMgeyp8bnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRlbnRJZCgpIHtcbiAgICByZXR1cm4gZmV0Y2hEYXRhUHJvcGVydHkoJ2NvbnRlbn
319RJZCcsICdjdXJyZW50LWluZm8nKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlY3Rpb24gaWQgZnJvbSB0aGUgY3VycmVudC1pbmZvIGVsZW1lbnRcbiAqIEByZXR1cm5zIHsqfG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldEN1cnJlbnRTZWN0aW9uSWQoKSB7XG4gICAgcmV0dXJuIGZldGNoRGF0YVByb3BlcnR5KCdzZWN0aW9uSWQnLCAnY3VycmVudC1pbmZvJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBIVE1MIGNvbnRlbnQgaWQgZnJvbSB0aGUgY3VycmVudC1pbmZvIGVsZW1lbnRcbiAqIEByZXR1cm5zIHsqfG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldEN1cnJlbnRIdG1sQ29udGVudElkKCkge1xuICAgIHJldHVybiBmZXRjaERhdGFQcm9wZXJ0eSgnaHRtbENvbnRlbnRJZCcsICdjdXJyZW50LWluZm8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJJZCgpIHtcbiAgICByZXR1cm4gZmV0Y2hEYXRhUHJvcGVydHkoJ3VzZXJJZCcsICdjdXJyZW50LWluZm8nKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kOiBmZXRjaCB0aGUgZGF0YSBzcGVjaWZpZWQgZGF0YSBwcm9wZXJ0eSBmcm9tIHRoZSBnaXZlbiBlbGVtZW50LiBJZiBubyBlbGVtZW50IGdpdmVuLFxuICogdXNlIHRoZSBwcm92aWRlZCBtZXRhIGVsZW1lbnQgbmFtZSB0byBzZWFyY2ggZm9yIHRoZSBnaXZlbiBtZXRhIHRhZy5cbiAqIFJldHVybiBudWxsIGlmIG5vIGVsZW1lbnQgZm91bmQuXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0gZWxlbWVudENsYXNzXG4gKiBAcGFyYW0gbWV0YU5hbWVcbiAqIEByZXR1cm5zIHtudWxsfCp9XG4gKi9cbmZ1bmN0aW9uIGZldGNoRGF0YVByb3BlcnR5KHByb3BlcnR5TmFtZSwgZWxlbWVudENsYXNzLCBtZXRhTmFtZSA9IG51bGwpIHtcbiAgICBsZXQgZWxlbSwgcmVzcG9uc2U7XG4gICAgaWYgKGVsZW1lbnRDbGFzcykge1xuICAgICAgICBlbGVtID0gZG9jdW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoYC4ke2VsZW1lbnRDbGFzc31gKTtcbiAgICAgICAgcmVzcG9uc2UgPSBlbGVtPy5kYXRhc2V0W3Byb3BlcnR5TmFtZV07XG4gICAgfSBlbHNlIGlmIChtZXRhTmFtZSkge1xuICAgICAgICBlbGVtID0gZG9jdW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbbmFtZT0nJHttZXRhTmFtZX0nXWApO1xuICAgICAgICBsZXQgZGF0YSA9IGVsZW0/LmRhdGFzZXRbcHJvcGVydHlOYW1lXTtcblxuICAgICAgICByZXNwb25zZSA9IGRhdGEgPyBKU09OLnBhcnNlKGRhdGEpIDoge307XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYG5vIGVsZW1lbnQgZm91bmQgd2l0aCBjbGFzcyAke2VsZW1lbnRDbGFzc30gb3IgbWV0YSBlbGVtZW50IHdpdGggbmFtZSAke21ldGFOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIEpTT04gcGFyc2UgdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgaWYocmVzcG9uc2Upe1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBrZXkgZm9yIGEgdmFsdWUgaW4gYW4gb2JqZWN0XG4gKiBAcGFyYW0gb2JqZWN0XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldEtleUJ5VmFsdWUob2JqZWN0LCB2YWx1ZSkge1xuICAgIGxldCByZXN1bHQgPSBPYmplY3Qua2V5cyhvYmplY3QpLmZpbmQoa2V5ID0+IG9iamVjdFtrZXldID09PSB2YWx1ZSk7XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYSBwcm9wZXJ0eSBpbiB0aGUgdXNlciBwcmVmZXJlbmNlcyBtZXRhIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVVzZXJQcmVmZXJlbmNlUHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSkge1xuICAgIGxldCBlbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0ndXNlci1wcmVmZXJlbmNlcyddXCIpO1xuICAgIGlmKGVsZW0pIHtcbiAgICAgICAgbGV0IHByZWZlcmVuY2VzID0gSlNPTi5wYXJzZShlbGVtLmRhdGFzZXQucHJlZmVyZW5jZXMpO1xuICAgICAgICBpZihwcmVmZXJlbmNlcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICBwcmVmZXJlbmNlc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbS5kYXRhc2V0LnByZWZlcmVuY2VzID0gSlNPTi5zdHJpbmdpZnkocHJlZmVyZW5jZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnQ291bGQgbm90IHVwZGF0ZSB0aGUgdXNlciBwcmVmZXJlbmNlIHByb3BlcnR5Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIERldGVjdCBpZiBhbiBlbGVtZW50IGlzIHdpdGhpbiB0aGUgdmlzaWJsZSB2aWV3cG9ydC5cbiAqIEBwYXJhbSBlbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzSW5WaWV3KGVsKSB7XG4gICAgaWYoZWwpIHtcbiAgICAgICAgY29uc3QgYm94ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiBib3gudG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGJveC5ib3R0b20gPj0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRVbmlxdWVXb3Jkcyh0ZXh0KSB7XG4gICAgbGV0IHVuaXF1ZTtcblxuICAgIC8vIHJlcGxhY2Ugc3ltYm9scyBhbmQgcHVuY3R1YXRpb24gd2l0aCB3aGl0ZXNwYWNlXG4gICAgdW5pcXVlID0gdGV4dC5yZXBsYWNlKC9bLiw/OzohKShcXFtcXF1dL2csICcgJyk7XG5cbiAgICAvLyB0cmltIHRleHQsIHJlZHVjZSBtdWx0aXBsZSBhZGphY2VudCB3aGl0ZXNwYWNlcyB0byBvbmUsIHRoZW4gcmVwbGFjZSB3aXRoIGNvbW1hXG4gICAgdW5pcXVlXG4gICAgICA9IHVuaXF1ZVxuICAgICAgLnRyaW0oKVxuICAgICAgLnJlcGxhY2UoLyhcXHMpKy9nLCAnICcpXG4gICAgICAucmVwbGFjZSgvXFxzL2csICcsJyk7XG5cbiAgICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXNcbiAgICB1bmlxdWUgPSB1bmlxdWUuc3BsaXQoJywnKS5maWx0ZXIob25seVVuaXF1ZSk7XG5cbiAgICByZXR1cm4gdW5pcXVlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHVuaXF1ZSBpbiBhbiBhcnJheSBiYXNlZCBvbiBpdHMgaW5kZXggcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjayBmb3IgdW5pcXVlbmVzcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSAtIFRoZSBhcnJheSB0byBjaGVjayBmb3IgdW5pcXVlbmVzcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuaXF1ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBvbmx5VW5pcXVlKHZhbHVlLCBpbmRleCwgYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4O1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBsaXN0IG9mIFNRTCBTZXJ2ZXIgZnVsbC10ZXh0IG5vaXNlIChzdG9wKSB3b3Jkcy5cbiAqIE1pcnJvciBvZiBNaW5pc3RyeUJvb2tzXFxIZWxwZXJzXFxOb2lzZVdvcmRzOjphbGwoKSBpbiBQSFAg4oCUIGtlZXAgaW4gc3luYy5cbiAqXG4gKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gKi9cbmNvbnN0IE5PSVNFX1dPUkRTID0gbmV3IFNldChbXG4gICAgJ2EnLCAnYWJvdXQnLCAnYWZ0ZXInLCAnYWxsJywgJ2Fsc28nLCAnYW4nLCAnYW5kJywgJ2Fub3RoZXInLCAnYW55JywgJ2FyZScsXG4gICAgJ2FzJywgJ2F0JywgJ2JlJywgJ2JlY2F1c2UnLCAnYmVlbicsICdiZWZvcmUnLCAnYmVpbmcnLCAnYmV0d2VlbicsICdib3RoJyxcbiAgICAnYnV0JywgJ2J5JywgJ2NhbWUnLCAnY2FuJywgJ2NvbWUnLCAnY291bGQnLCAnZGlkJywgJ2RvJywgJ2RvZXMnLCAnZWFjaCcsXG4gICAgJ2Vsc2UnLCAnZm9yJywgJ2Zyb20nLCAnZ2V0JywgJ2dvdCcsICdoYWQnLCAnaGFzJywgJ2hhdmUnLCAnaGUnLCAnaGVyJyxcbiAgICAnaGVyZScsICdoaW0nLCAnaGltc2VsZicsICdoaXMnLCAnaG93JywgJ2lmJywgJ2luJywgJ2ludG8nLCAnaXMnLCAnaXQnLFxuICAgICdpdHMnLCAnanVzdCcsICdsaWtlJywgJ21ha2UnLCAnbWFueScsICdtZScsICdtaWdodCcsICdtb3JlJywgJ21vc3QnLCAnbXVjaCcsXG4gICAgJ211c3QnLCAnbXknLCAnbmV2ZXInLCAnbm8nLCAnbm93JywgJ29mJywgJ29uJywgJ29ubHknLCAnb3InLCAnb3RoZXInLCAnb3VyJyxcbiAgICAnb3V0JywgJ292ZXInLCAncmUnLCAnc2FpZCcsICdzYW1lJywgJ3NlZScsICdzaG91bGQnLCAnc2luY2UnLCAnc28nLCAnc29tZScsXG4gICAgJ3N0aWxsJywgJ3N1Y2gnLCAndGFrZScsICd0aGFuJywgJ3RoYXQnLCAndGhlJywgJ3RoZWlyJywgJ3RoZW0nLCAndGhlbicsXG4gICAgJ3RoZXJlJywgJ3RoZXNlJywgJ3RoZXknLCAndGhpcycsICd0aG9zZScsICd0aHJvdWdoJywgJ3RvJywgJ3RvbycsICd1bmRlcicsXG4gICAgJ3VwJywgJ3VzZScsICd2ZXJ5JywgJ3dhbnQnLCAnd2FzJywgJ3dheScsICd3ZScsICd3ZWxsJywgJ3dlcmUnLCAnd2hhdCcsXG4gICAgJ3doZW4nLCAnd2hlcmUnLCAnd2hpY2gnLCAnd2hpbGUnLCAnd2hvJywgJ3dpbGwnLCAnd2l0aCcsICd3b3VsZCcsICd5b3UnLFxuICAgICd5b3VyJyxcbl0pO1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgdG9rZW4gaXMgYSBub2lzZSB3b3JkIChjYXNlLWluc2Vuc2l0aXZlKSBvciBhIGxvbmVcbiAqIGxldHRlci9kaWdpdCDigJQgYm90aCBhcmUgaWdub3JlZCBieSBTUUwgU2VydmVyIGZ1bGwtdGV4dCBzZWFyY2guXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05vaXNlV29yZCh3b3JkKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IFN0cmluZyh3b3JkKS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICh0cmltbWVkID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHJpbW1lZC5sZW5ndGggPT09IDEgJiYgL1thLXowLTldLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgI
319HJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBOT0lTRV9XT1JEUy5oYXModHJpbW1lZCk7XG59XG5cbi8qKlxuICogU3RyaXAgbm9pc2Ugd29yZHMgYW5kIGxvbmUgbGV0dGVycy9kaWdpdHMgZnJvbSBhIGxpc3Qgb2YgdG9rZW5zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IHdvcmRzXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmZ1bmN0aW9uIGZpbHRlck5vaXNlV29yZHMod29yZHMpIHtcbiAgICByZXR1cm4gd29yZHMuZmlsdGVyKCh3b3JkKSA9PiAhaXNOb2lzZVdvcmQod29yZCkpO1xufVxuXG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIG9iamVjdCBpcyBpdGVyYWJsZS5cbiAqXG4gKiBAcGFyYW0gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNJdGVyYWJsZShvYmplY3QpIHtcbiAgaWYob2JqZWN0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHlwZW9mIG9iamVjdFtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFRPRE86IG5lZWRzIHRlc3RpbmchIGltcGxlbWVudGF0aW9uIG9mIGRlYm91bmNlIGZyb206IGh0dHBzOi8veW91bWlnaHRub3RuZWVkLmNvbS9sb2Rhc2hcbiAqIEBwYXJhbSBmdW5jXG4gKiBAcGFyYW0gZGVsYXlcbiAqIEBwYXJhbSBsZWFkaW5nXG4gKiBAcmV0dXJucyB7KGZ1bmN0aW9uKC4uLlsqXSk6IHZvaWQpfCp9XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlIChmdW5jLCBkZWxheSwgeyBsZWFkaW5nIH0gPSB7fSkge1xuICAgIGxldCB0aW1lcklkO1xuXG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmICghdGltZXJJZCAmJiBsZWFkaW5nKSB7XG4gICAgICAgICAgICBmdW5jKC4uLmFyZ3MpXG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpXG5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQoKCkgPT4gZnVuYyguLi5hcmdzKSwgZGVsYXkpXG4gICAgfVxufVxuXG4vKipcbiAqIFRFU1Q6IGRlbGF5IG1ldGhvZFxuICogQHBhcmFtIGZuXG4gKiBAcGFyYW0gdGltZXJcbiAqIEBwYXJhbSBhcmdzXG4gKi9cbmZ1bmN0aW9uIGRlbGF5IChmbiwgdGltZXIsIC4uLmFyZ3MpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IGZuLmFwcGx5KGZuLCBhcmdzKSwgdGltZXIpO1xufVxuXG4vKipcbiAqIEFkZCBhbiBvdmVybGF5IG92ZXIgYW4gZWxlbWVudCB0byBlZmZlY3RpdmVseSBkaXNhYmxlIGl0cyBjb250cm9scy5cbiAqIFRoZSBvdmVybGF5IGNvdmVycyB0aGUgZW50aXJlIGVsZW1lbnQgd2l0aCBhIHNlbWktdHJhbnNwYXJlbnQgYmFja2dyb3VuZC5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIG92ZXJsYXlcbiAqIEBwYXJhbSBvdmVybGF5SWQgLSBVbmlxdWUgSUQgZm9yIHRoZSBvdmVybGF5ICh1c2VkIHRvIHJlbW92ZSBpdCBsYXRlcilcbiAqIEBwYXJhbSBzaG93U3Bpbm5lciAtIFdoZXRoZXIgdG8gc2hvdyBhIGNlbnRlcmVkIHNwaW5uZXIgaW4gdGhlIG92ZXJsYXlcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0T3ZlcmxheU9uRWxlbWVudChlbGVtZW50LCBvdmVybGF5SWQsIHNob3dTcGlubmVyID0gdHJ1ZSkge1xuICAgIGlmKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gRW5zdXJlIGVsZW1lbnQgaGFzIHBvc2l0aW9uIGZvciBhYnNvbHV0ZSBvdmVybGF5IHRvIHdvcmtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgICAgICBpZiAoY29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgICAgZWxlbWVudC5kYXRhc2V0Lm92ZXJsYXlBZGRlZFBvc2l0aW9uID0gJ3RydWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBvdmVybGF5LmNsYXNzTmFtZSA9ICdvdmVybGF5JztcbiAgICAgICAgb3ZlcmxheS5pZCA9IG92ZXJsYXlJZDtcblxuICAgICAgICAvLyBDU1MgdXNlcyB0b3A6MDsgYm90dG9tOjAgdG8gYXV0by1zaXplIG92ZXJsYXkgd2l0aCBjb250YWluZXJcblxuICAgICAgICBpZiAoc2hvd1NwaW5uZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7XG4gICAgICAgICAgICBzcGlubmVyLmNsYXNzTmFtZSA9ICdmYS1zb2xpZCBmYS1zcGlubmVyIGZhLXNwaW4nO1xuICAgICAgICAgICAgb3ZlcmxheS5hcHBlbmRDaGlsZChzcGlubmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmJlZ2luJywgb3ZlcmxheSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBhbiBvdmVybGF5IGZyb20gYW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gb3ZlcmxheUlkIC0gVGhlIElEIG9mIHRoZSBvdmVybGF5IHRvIHJlbW92ZVxuICovXG5mdW5jdGlvbiByZW1vdmVPdmVybGF5T25FbGVtZW50KG92ZXJsYXlJZCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtvdmVybGF5SWR9YCk7XG5cbiAgICBpZiAob3ZlcmxheSkge1xuICAgICAgICAvLyBDbGVhbiB1cCB0aGUgcG9zaXRpb24gd2UgYWRkZWQgaWYgd2UgYWRkZWQgaXRcbiAgICAgICAgY29uc3QgcGFyZW50ID0gb3ZlcmxheS5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAocGFyZW50Py5kYXRhc2V0Lm92ZXJsYXlBZGRlZFBvc2l0aW9uID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgIHBhcmVudC5zdHlsZS5wb3NpdGlvbiA9ICcnO1xuICAgICAgICAgICAgZGVsZXRlIHBhcmVudC5kYXRhc2V0Lm92ZXJsYXlBZGRlZFBvc2l0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgb3ZlcmxheS5yZW1vdmUoKTtcbiAgICB9XG59XG5cbi8qKlxuICogUGluIGEganVzdC1pbnNlcnRlZCBTcGlubmVyLWNsYXNzIGAubG9hZGluZy1vbi10b3BgIGJveCBleGFjdGx5IG92ZXIgYVxuICogdGFyZ2V0IGVsZW1lbnQgKCMzNTk1KS5cbiAqXG4gKiBUaGUgU3Bpbm5lciBjbGFzcyAocmVzb3VyY2VzL2pzL3NwaW5uZXIuanMpIGluc2VydHMgaXRzIGJveCBhcyBhIERPTVxuICogKnNpYmxpbmcqIG9mIHRoZSBhbmNob3IgZWxlbWVudCAoaW5zZXJ0QWRqYWNlbnRFbGVtZW50KSwgYnV0IHRoZSBib3gnc1xuICogQ1NTIChgLmxvYWRpbmctb24tdG9wIHsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogMDsgdG9wOiAwOyAuLi4gfWApXG4gKiBwb3NpdGlvbnMgaXQgcmVsYXRpdmUgdG8gdGhlIG5lYXJlc3QgKnBvc2l0aW9uZWQgYW5jZXN0b3IqIC0gdXN1YWxseSBhXG4gKiB3cmFwcGVyIGRpdiBhcm91bmQgYm90aCBhIGxhYmVsIGFuZCB0aGUgY29udHJvbC4gSWYgdGhhdCB3cmFwcGVyIGlzXG4gKiB3aWRlciB0aGFuIHRoZSBjb250cm9sIGl0c2VsZiwgdGhlIGJveCBkcmlmdHMgYXdheSBmcm9tIChvciBleHRlbmRzXG4gKiBwYXN0KSB0aGUgY29udHJvbCBpdCdzIG1lYW50IHRvIGNvdmVyLlxuICpcbiAqIFRoaXMgbWVhc3VyZXMgdGhlIHRhcmdldCdzIGFjdHVhbCByZW5kZXJlZCBib3ggKHJlbGF0aXZlIHRvIHRoZVxuICogc3Bpbm5lcidzIG9mZnNldFBhcmVudCkgYW5kIHNldHMgZXhwbGljaXQgaW5saW5lIHRvcC9sZWZ0L3dpZHRoL2hlaWdodFxuICogb24gdGhlIHNwaW5uZXIsIHNvIGl0IGV4YWN0bHkgY292ZXJzI
319HRoZSB0YXJnZXQgcmVnYXJkbGVzcyBvZiBob3cgd2lkZVxuICogdGhlIHN1cnJvdW5kaW5nIHdyYXBwZXIgaXMuIE9wdC1pbiBvbmx5IC0gZG9lcyBub3QgdG91Y2ggdGhlIHNoYXJlZFxuICogU3Bpbm5lciBjbGFzcyBvciB0aGUgYmFzZSBgLmxvYWRpbmctb24tdG9wYCBydWxlLCBzbyBldmVyeSBvdGhlclxuICogY29uc3VtZXIgKEFubm90YXRpb25zIHNvcnQtYnksIHZpZXctc3R5bGUgdG9nZ2xlLCBldGMuKSBpcyB1bmFmZmVjdGVkLlxuICpcbiAqIEBwYXJhbSBzcGlubmVyRGF0YU5hbWUgLSB0aGUgYG5hbWVgIHBhc3NlZCB0byBgbmV3IFNwaW5uZXIobmFtZSwgLi4uKWBcbiAqIEBwYXJhbSB0YXJnZXRFbGVtZW50IC0gdGhlIGVsZW1lbnQgdGhlIHNwaW5uZXIgYm94IHNob3VsZCBleGFjdGx5IGNvdmVyXG4gKi9cbmZ1bmN0aW9uIHBpblNwaW5uZXJPdmVyRWxlbWVudChzcGlubmVyRGF0YU5hbWUsIHRhcmdldEVsZW1lbnQpIHtcbiAgICBjb25zdCBzcGlubmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtbmFtZT1cIiR7c3Bpbm5lckRhdGFOYW1lfVwiXWApO1xuXG4gICAgaWYgKCFzcGlubmVyIHx8ICF0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvZmZzZXRQYXJlbnQgPSBzcGlubmVyLm9mZnNldFBhcmVudCB8fCBkb2N1bWVudC5ib2R5O1xuICAgIGNvbnN0IHBhcmVudFJlY3QgPSBvZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRhcmdldEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBzcGlubmVyLnN0eWxlLmxlZnQgPSBgJHt0YXJnZXRSZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnR9cHhgO1xuICAgIHNwaW5uZXIuc3R5bGUudG9wID0gYCR7dGFyZ2V0UmVjdC50b3AgLSBwYXJlbnRSZWN0LnRvcH1weGA7XG4gICAgc3Bpbm5lci5zdHlsZS5yaWdodCA9ICdhdXRvJztcbiAgICBzcGlubmVyLnN0eWxlLndpZHRoID0gYCR7dGFyZ2V0UmVjdC53aWR0aH1weGA7XG4gICAgc3Bpbm5lci5zdHlsZS5oZWlnaHQgPSBgJHt0YXJnZXRSZWN0LmhlaWdodH1weGA7XG59XG5cbmZ1bmN0aW9uIGlzTW9iaWxlVmlld3BvcnQoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA2MzlweCknKS5tYXRjaGVzO1xufVxuXG5mdW5jdGlvbiBpc1RhYmxldFZpZXdwb3J0KCkge1xuICAgIHJldHVybiB3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogNjQwcHgpIGFuZCAobWF4LXdpZHRoOiAxMDIzcHgpJykubWF0Y2hlcztcbn1cblxuZnVuY3Rpb24gaXNEZXNrdG9wVmlld3BvcnQoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcobWluLXdpZHRoOiAxMDI0cHgpJykubWF0Y2hlcztcbn1cblxuZXhwb3J0IHsgZGVib3VuY2UsIGRlbGF5LCByYW5nZSwgY2FwaXRhbGl6ZSwgc2Nyb2xsVG9BbmNob3Isc2Nyb2xsVG9EaXYsIHNjcm9sbEFuZFNwb3RsaWdodCwgYXBwU2V0dGluZ3MsIGFwcENvbG9ycyxcbiAgICAgICAgIHVzZXJQcmVmZXJlbmNlcywgZ2V0Q3VycmVudEh0bWxDb250ZW50SWQsIGdldEN1cnJlbnRDb250ZW50SWQsXG4gICAgICAgICBnZXRDdXJyZW50U2VjdGlvbklkLCBnZXRDdXJyZW50VXNlcklkLCBnZXRLZXlCeVZhbHVlLCBnZXRBbmNob3JDb250YWluZXIsXG4gICAgICAgICBnZXRIaWdobGlnaHRTcG90bGlnaHREdXJhdGlvbiwgZ2V0VW5pcXVlV29yZHMsIGNvcHlUb0NsaXBib2FyZCwgc3RyaXBQYWdlTnVtYmVycyxcbiAgICAgICAgIGFzeW5jU2xlZXAsIGlzSGlkZGVuLCBpc0luVmlldywgaXNJdGVyYWJsZSwgaXNNb2JpbGVWaWV3cG9ydCwgcmdiVG9PYmplY3QsIG9iamVjdFRvUmdiLCByZ2JUb0hleCxcbiAgICAgICAgdXBkYXRlVXNlclByZWZlcmVuY2VQcm9wZXJ0eSwgZ2V0VXNlckZvbnRTaXplRnJvbVVzZXJTZXR0aW5ncyxnZXRBcHBTZXJ2ZXJSZWRpcmVjdFByZWZlcmVuY2UsXG4gICAgICAgIGRhcmtlbkNvbG9yLCBsaWdodGVuQ29sb3IsIGluc2VydE92ZXJsYXlPbkVsZW1lbnQsIHJlbW92ZU92ZXJsYXlPbkVsZW1lbnQsIHBpblNwaW5uZXJPdmVyRWxlbWVudCxcbiAgICAgICAgTk9JU0VfV09SRFMsIGlzTm9pc2VXb3JkLCBmaWx0ZXJOb2lzZVdvcmRzfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/utilities/general.js\n");
320
321/***/ }),
322
323/***/ "./resources/js/utilities/i18n.js":
324/*!****************************************!*\
325  !*** ./resources/js/utilities/i18n.js ***!
326  \****************************************/
327/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
328
329eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   t: () => (/* binding */ t),\n/* harmony export */   translateOrUndefined: () => (/* binding */ translateOrUndefined)\n/* harmony export */ });\n/* harmony import */ var _babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/slicedToArray */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/slicedToArray.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/typeof */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/typeof.js\");\n/* harmony import */ var _babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime-corejs3/helpers/createForOfIteratorHelper */ \"./node_modules/@babel/runtime-corejs3/helpers/esm/createForOfIteratorHelper.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/object/keys */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_entries__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js-stable/object/entries */ \"./node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_stable_object_entries__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_stable_object_entries__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime-corejs3/core-js/instance/replace-all */ \"./node_modules/@babel/runtime-corejs3/core-js/instance/replace-all.js\");\n/* harmony import */ var _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\n/**\n * Client-side i18n utility.\n *\n * Reads translations from window.__i18n (injected by PHP) and resolves\n * dot-notated keys with optional :token replacements.\n *\n * Usage:\n *   import { t } from './utilities/i18n.js';\n *   t('confirm_action');           // \"Are you sure?\"\n *   t('greeting', { ':name': 'John' });\n *\n *   import { translateOrUndefined } from './utilities/i18n.js';\n *   translateOrUndefined('annotations.note_save') ?? 'Save Note';\n */\n\n/**\n * Resolve a dot-notated key against the nested window.__i18n object.\n *\n * Returns `undefined` — never the key — when nothing is there, so callers that\n * supply their own English default with `?? fallback` still get it. `t()` below\n * is the variant that echoes the key back instead; the two must not be\n * interchanged (#4592).\n *\n * @param {string} key - Dot-notated translation key (e.g. 'annotations.note_save')\n * @returns {string|undefined} Translated string, or undefined if not found\n */\nvar translateOrUndefined = function translateOrUndefined(key) {\n  var value = window.__i18n || {};\n  var _iterator = (0,_babel_runtime_corejs3_helpers_createForOfIteratorHelper__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(key.split('.')),\n    _step;\n  try {\n    for (_iterator.s(); !(_step = _iterator.n()).done;) {\n      var segment = _step.value;\n      if (value === null || (0,_babel_runtime_corejs3_helpers_typeof__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(value) !== 'object') {\n        return undefined;\n      }\n      value = value[segment];\n    }\n  } catch (err) {\n    _iterator.e(err);\n  } finally {\n    _iterator.f();\n  }\n  return typeof value === 'string' ? value : undefined;\n};\n\n/**\n * Translate a dot-notated key from the window.__i18n object.\n *\n * @param {string} key - Dot-notated translation key (e.g. 'network_error')\n * @param {Object} [replacements={}] - :token => value replacements\n * @returns {string} Translated string, or the key itself if not found\n */\nvar t = function t(key) {\n  var replacements = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var value = translateOrUndefined(key);\n  return replaceTokens(value === undefined ? key : value, replacements);\n};\n\n/**\n * Replace :token placeholders in a string.\n *\n * @param {string} str - String with :token placeholders\n * @param {Object} replacements - :token => value map\n * @returns {string}\n */\nvar replaceTokens = function replaceTokens(str, replacements) {\n  if (!replacements || _babel_runtime_corejs3_core_js_stable_object_keys__WEBPACK_IMPORTED_MODULE_3___default()(replacements).length === 0) {\n    return str;\n  }\n  var result = str;\n  for (var _i = 0, _Object$entries = _babel_runtime_corejs3_core_js_stable_object_entries__WEBPACK_IMPORTED_MODULE_4___default()(replacements); _i < _Object$entries.length;
329 _i++) {\n    var _Object$entries$_i = (0,_babel_runtime_corejs3_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(_Object$entries[_i], 2),\n      token = _Object$entries$_i[0],\n      value = _Object$entries$_i[1];\n    result = _babel_runtime_corejs3_core_js_instance_replace_all__WEBPACK_IMPORTED_MODULE_5___default()(result).call(result, token, String(value));\n  }\n  return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2kxOG4uanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL21pbmlzdHJ5Ym9va3MvLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL2kxOG4uanM/ZTkyZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENsaWVudC1zaWRlIGkxOG4gdXRpbGl0eS5cbiAqXG4gKiBSZWFkcyB0cmFuc2xhdGlvbnMgZnJvbSB3aW5kb3cuX19pMThuIChpbmplY3RlZCBieSBQSFApIGFuZCByZXNvbHZlc1xuICogZG90LW5vdGF0ZWQga2V5cyB3aXRoIG9wdGlvbmFsIDp0b2tlbiByZXBsYWNlbWVudHMuXG4gKlxuICogVXNhZ2U6XG4gKiAgIGltcG9ydCB7IHQgfSBmcm9tICcuL3V0aWxpdGllcy9pMThuLmpzJztcbiAqICAgdCgnY29uZmlybV9hY3Rpb24nKTsgICAgICAgICAgIC8vIFwiQXJlIHlvdSBzdXJlP1wiXG4gKiAgIHQoJ2dyZWV0aW5nJywgeyAnOm5hbWUnOiAnSm9obicgfSk7XG4gKlxuICogICBpbXBvcnQgeyB0cmFuc2xhdGVPclVuZGVmaW5lZCB9IGZyb20gJy4vdXRpbGl0aWVzL2kxOG4uanMnO1xuICogICB0cmFuc2xhdGVPclVuZGVmaW5lZCgnYW5ub3RhdGlvbnMubm90ZV9zYXZlJykgPz8gJ1NhdmUgTm90ZSc7XG4gKi9cblxuLyoqXG4gKiBSZXNvbHZlIGEgZG90LW5vdGF0ZWQga2V5IGFnYWluc3QgdGhlIG5lc3RlZCB3aW5kb3cuX19pMThuIG9iamVjdC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIOKAlCBuZXZlciB0aGUga2V5IOKAlCB3aGVuIG5vdGhpbmcgaXMgdGhlcmUsIHNvIGNhbGxlcnMgdGhhdFxuICogc3VwcGx5IHRoZWlyIG93biBFbmdsaXNoIGRlZmF1bHQgd2l0aCBgPz8gZmFsbGJhY2tgIHN0aWxsIGdldCBpdC4gYHQoKWAgYmVsb3dcbiAqIGlzIHRoZSB2YXJpYW50IHRoYXQgZWNob2VzIHRoZSBrZXkgYmFjayBpbnN0ZWFkOyB0aGUgdHdvIG11c3Qgbm90IGJlXG4gKiBpbnRlcmNoYW5nZWQgKCM0NTkyKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gRG90LW5vdGF0ZWQgdHJhbnNsYXRpb24ga2V5IChlLmcuICdhbm5vdGF0aW9ucy5ub3RlX3NhdmUnKVxuICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFRyYW5zbGF0ZWQgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gKi9cbmNvbnN0IHRyYW5zbGF0ZU9yVW5kZWZpbmVkID0gKGtleSkgPT4ge1xuICBsZXQgdmFsdWUgPSB3aW5kb3cuX19pMThuIHx8IHt9O1xuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBrZXkuc3BsaXQoJy4nKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YWx1ZSA9IHZhbHVlW3NlZ21lbnRdO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogVHJhbnNsYXRlIGEgZG90LW5vdGF0ZWQga2V5IGZyb20gdGhlIHdpbmRvdy5fX2kxOG4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBEb3Qtbm90YXRlZCB0cmFuc2xhdGlvbiBrZXkgKGUuZy4gJ25ldHdvcmtfZXJyb3InKVxuICogQHBhcmFtIHtPYmplY3R9IFtyZXBsYWNlbWVudHM9e31dIC0gOnRva2VuID0+IHZhbHVlIHJlcGxhY2VtZW50c1xuICogQHJldHVybnMge3N0cmluZ30gVHJhbnNsYXRlZCBzdHJpbmcsIG9yIHRoZSBrZXkgaXRzZWxmIGlmIG5vdCBmb3VuZFxuICovXG5jb25zdCB0ID0gKGtleSwgcmVwbGFjZW1lbnRzID0ge30pID0+IHtcbiAgY29uc3QgdmFsdWUgPSB0cmFuc2xhdGVPclVuZGVmaW5lZChrZXkpO1xuXG4gIHJldHVybiByZXBsYWNlVG9rZW5zKHZhbHVlID09PSB1bmRlZmluZWQgPyBrZXkgOiB2YWx1ZSwgcmVwbGFjZW1lbnRzKTtcbn07XG5cbi8qKlxuICogUmVwbGFjZSA6dG9rZW4gcGxhY2Vob2xkZXJzIGluIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBTdHJpbmcgd2l0aCA6dG9rZW4gcGxhY2Vob2xkZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gcmVwbGFjZW1lbnRzIC0gOnRva2VuID0+IHZhbHVlIG1hcFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcmVwbGFjZVRva2VucyA9IChzdHIsIHJlcGxhY2VtZW50cykgPT4ge1xuICBpZiAoIXJlcGxhY2VtZW50cyB8fCBPYmplY3Qua2V5cyhyZXBsYWNlbWVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICBsZXQgcmVzdWx0ID0gc3RyO1xuICBmb3IgKGNvbnN0IFt0b2tlbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcGxhY2VtZW50cykpIHtcbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbCh0b2tlbiwgU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCB7
329IHQsIHRyYW5zbGF0ZU9yVW5kZWZpbmVkIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/utilities/i18n.js\n");
330
331/***/ }),
332
333/***/ "./resources/js/utilities/sticky-toolbar.js":
334/*!**************************************************!*\
335  !*** ./resources/js/utilities/sticky-toolbar.js ***!
336  \**************************************************/
337/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
338
339eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   STICKY_TOOLBAR_ACTIVE_CLASS: () => (/* binding */ STICKY_TOOLBAR_ACTIVE_CLASS),\n/* harmony export */   createStickyToolbar: () => (/* binding */ createStickyToolbar)\n/* harmony export */ });\n/* harmony import */ var _notices_functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../notices/functions */ \"./resources/js/notices/functions.js\");\n/**\n * Shared sticky-toolbar wiring for batch-edit toolbars — #3566.\n *\n * Annotations and Continue Reading both have a batch-edit toolbar that should\n * pin directly below the sticky main nav ONLY while edit mode is active, so\n * cards/rows scroll underneath while DONE / SELECT ALL / trash / color\n * swatches / VIEW stay in view. Reuses the same nav-height measurement the\n * flash-notice floating treatment already relies on (getNavBottom()) so both\n * treatments track the sticky nav's height identically.\n */\n\n\nvar STICKY_TOOLBAR_ACTIVE_CLASS = 'batch-edit-toolbar-sticky';\n\n/**\n * Create a sticky-toolbar controller bound to a wrapper element lookup.\n *\n * @param {() => HTMLElement|null} getWrapper - returns the sticky wrapper element\n * @returns {{activate: Function, deactivate: Function, measure: Function, isActive: () => boolean}}\n */\nfunction createStickyToolbar(getWrapper) {\n  var active = false;\n\n  /**\n   * Re-measure the sticky nav's bottom edge and write it onto the wrapper as a\n   * CSS custom property so the SCSS `top: var(--nav-bottom, 0)` stays correct\n   * as the nav's height changes (mobile, Foundation stuck/unstuck transitions).\n   */\n  function measure() {\n    var wrapper = getWrapper();\n    if (!wrapper) {\n      return;\n    }\n    wrapper.style.setProperty('--nav-bottom', \"\".concat((0,_notices_functions__WEBPACK_IMPORTED_MODULE_0__.getNavBottom)(), \"px\"));\n  }\n\n  /**\n   * Turn on the sticky treatment: add the active class, measure the offset,\n   * and start tracking resize/scroll so the offset stays correct.\n   */\n  function activate() {\n    var wrapper = getWrapper();\n    if (!wrapper || active) {\n      return;\n    }\n    active = true;\n    wrapper.classList.add(STICKY_TOOLBAR_ACTIVE_CLASS);\n    measure();\n    window.addEventListener('resize', measure);\n    window.addEventListener('scroll', measure, {\n      passive: true\n    });\n  }\n\n  /**\n   * Turn off the sticky treatment: remove the active class and stop\n   * listening, so a resize/scroll after exiting edit mode does no work.\n   */\n  function deactivate() {\n    var _getWrapper;\n    if (!active) {\n      return;\n    }\n    active = false;\n    (_getWrapper = getWrapper()) === null || _getWrapper === void 0 || _getWrapper.classList.remove(STICKY_TOOLBAR_ACTIVE_CLASS);\n    window.removeEventListener('resize', measure);\n    window.removeEventListener('scroll', measure);\n  }\n  return {\n    activate: activate,\n    deactivate: deactivate,\n    measure: measure,\n    isActive: function isActive() {\n      return active;\n    }\n  };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvdXRpbGl0aWVzL3N0aWNreS10b29sYmFyLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWluaXN0cnlib29rcy8uL3Jlc291cmNlcy9qcy91dGlsaXRpZXMvc3RpY2t5LXRvb2xiYXIuanM/NmVjMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCBzdGlja3ktdG9vbGJhciB3aXJpbmcgZm9yIGJhdGNoLWVkaXQgdG9vbGJhcnMg4oCUICMzNTY2LlxuICpcbiAqIEFubm9
3390YXRpb25zIGFuZCBDb250aW51ZSBSZWFkaW5nIGJvdGggaGF2ZSBhIGJhdGNoLWVkaXQgdG9vbGJhciB0aGF0IHNob3VsZFxuICogcGluIGRpcmVjdGx5IGJlbG93IHRoZSBzdGlja3kgbWFpbiBuYXYgT05MWSB3aGlsZSBlZGl0IG1vZGUgaXMgYWN0aXZlLCBzb1xuICogY2FyZHMvcm93cyBzY3JvbGwgdW5kZXJuZWF0aCB3aGlsZSBET05FIC8gU0VMRUNUIEFMTCAvIHRyYXNoIC8gY29sb3JcbiAqIHN3YXRjaGVzIC8gVklFVyBzdGF5IGluIHZpZXcuIFJldXNlcyB0aGUgc2FtZSBuYXYtaGVpZ2h0IG1lYXN1cmVtZW50IHRoZVxuICogZmxhc2gtbm90aWNlIGZsb2F0aW5nIHRyZWF0bWVudCBhbHJlYWR5IHJlbGllcyBvbiAoZ2V0TmF2Qm90dG9tKCkpIHNvIGJvdGhcbiAqIHRyZWF0bWVudHMgdHJhY2sgdGhlIHN0aWNreSBuYXYncyBoZWlnaHQgaWRlbnRpY2FsbHkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TmF2Qm90dG9tIH0gZnJvbSAnLi4vbm90aWNlcy9mdW5jdGlvbnMnO1xuXG5leHBvcnQgY29uc3QgU1RJQ0tZX1RPT0xCQVJfQUNUSVZFX0NMQVNTID0gJ2JhdGNoLWVkaXQtdG9vbGJhci1zdGlja3knO1xuXG4vKipcbiAqIENyZWF0ZSBhIHN0aWNreS10b29sYmFyIGNvbnRyb2xsZXIgYm91bmQgdG8gYSB3cmFwcGVyIGVsZW1lbnQgbG9va3VwLlxuICpcbiAqIEBwYXJhbSB7KCkgPT4gSFRNTEVsZW1lbnR8bnVsbH0gZ2V0V3JhcHBlciAtIHJldHVybnMgdGhlIHN0aWNreSB3cmFwcGVyIGVsZW1lbnRcbiAqIEByZXR1cm5zIHt7YWN0aXZhdGU6IEZ1bmN0aW9uLCBkZWFjdGl2YXRlOiBGdW5jdGlvbiwgbWVhc3VyZTogRnVuY3Rpb24sIGlzQWN0aXZlOiAoKSA9PiBib29sZWFufX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0aWNreVRvb2xiYXIoZ2V0V3JhcHBlcikge1xuICBsZXQgYWN0aXZlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFJlLW1lYXN1cmUgdGhlIHN0aWNreSBuYXYncyBib3R0b20gZWRnZSBhbmQgd3JpdGUgaXQgb250byB0aGUgd3JhcHBlciBhcyBhXG4gICAqIENTUyBjdXN0b20gcHJvcGVydHkgc28gdGhlIFNDU1MgYHRvcDogdmFyKC0tbmF2LWJvdHRvbSwgMClgIHN0YXlzIGNvcnJlY3RcbiAgICogYXMgdGhlIG5hdidzIGhlaWdodCBjaGFuZ2VzIChtb2JpbGUsIEZvdW5kYXRpb24gc3R1Y2svdW5zdHVjayB0cmFuc2l0aW9ucykuXG4gICAqL1xuICBmdW5jdGlvbiBtZWFzdXJlKCkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRXcmFwcGVyKCk7XG4gICAgaWYgKCF3cmFwcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tbmF2LWJvdHRvbScsIGAke2dldE5hdkJvdHRvbSgpfXB4YCk7XG4gIH1cblxuICAvKipcbiAgICogVHVybiBvbiB0aGUgc3RpY2t5IHRyZWF0bWVudDogYWRkIHRoZSBhY3RpdmUgY2xhc3MsIG1lYXN1cmUgdGhlIG9mZnNldCxcbiAgICogYW5kIHN0YXJ0IHRyYWNraW5nIHJlc2l6ZS9zY3JvbGwgc28gdGhlIG9mZnNldCBzdGF5cyBjb3JyZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gYWN0aXZhdGUoKSB7XG4gICAgY29uc3Qgd3JhcHBlciA9IGdldFdyYXBwZXIoKTtcbiAgICBpZiAoIXdyYXBwZXIgfHwgYWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFjdGl2ZSA9IHRydWU7XG4gICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKFNUSUNLWV9UT09MQkFSX0FDVElWRV9DTEFTUyk7XG4gICAgbWVhc3VyZSgpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBtZWFzdXJlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgbWVhc3VyZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gb2ZmIHRoZSBzdGlja3kgdHJlYXRtZW50OiByZW1vdmUgdGhlIGFjdGl2ZSBjbGFzcyBhbmQgc3RvcFxuICAgKiBsaXN0ZW5pbmcsIHNvIGEgcmVzaXplL3Njcm9sbCBhZnRlciBleGl0aW5nIGVkaXQgbW9kZSBkb2VzIG5vIHdvcmsuXG4gICAqL1xuICBmdW5jdGlvbiBkZWFjdGl2YXRlKCkge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIGdldFdyYXBwZXIoKT8uY2xhc3NMaXN0LnJlbW92ZShTVElDS1lfVE9PTEJBUl9BQ1RJVkVfQ0xBU1MpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBtZWFzdXJlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgbWVhc3VyZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjdGl2YXRlLFxuICAgIGRlYWN0aXZhdGUsXG4gICAgbWVhc3VyZSxcbiAgICBpc0FjdGl2ZTogKCkgPT4gYWN0aXZlLFxuICB9O1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/utilities/sticky-toolbar.js\n");
340
341/***/ })
vendor: 7,515 bytes, lines 341-531
341
342
343/******/ 	});
344/************************************************************************/
345/******/ 	// The module cache
346/******/ 	var __webpack_module_cache__ = {};
347/******/ 	
348/******/ 	// The require function
349/******/ 	function __webpack_require__(moduleId) {
350/******/ 		// Check if module is in cache
351/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
352/******/ 		if (cachedModule !== undefined) {
353/******/ 			return cachedModule.exports;
354/******/ 		}
355/******/ 		// Create a new module (and put it into the cache)
356/******/ 		var module = __webpack_module_cache__[moduleId] = {
357/******/ 			id: moduleId,
358/******/ 			loaded: false,
359/******/ 			exports: {}
360/******/ 		};
361/******/ 	
362/******/ 		// Execute the module function
363/******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
364/******/ 	
365/******/ 		// Flag the module as loaded
366/******/ 		module.loaded = true;
367/******/ 	
368/******/ 		// Return the exports of the module
369/******/ 		return module.exports;
370/******/ 	}
371/******/ 	
372/******/ 	// expose the modules object (__webpack_modules__)
373/******/ 	__webpack_require__.m = __webpack_modules__;
374/******/ 	
375/************************************************************************/
376/******/ 	/* webpack/runtime/chunk loaded */
377/******/ 	(() => {
378/******/ 		var deferred = [];
379/******/ 		__webpack_require__.O = (result, chunkIds, fn, priority) => {
380/******/ 			if(chunkIds) {
381/******/ 				priority = priority || 0;
382/******/ 				for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
383/******/ 				deferred[i] = [chunkIds, fn, priority];
384/******/ 				return;
385/******/ 			}
386/******/ 			var notFulfilled = Infinity;
387/******/ 			for (var i = 0; i < deferred.length; i++) {
388/******/ 				var [chunkIds, fn, priority] = deferred[i];
389/******/ 				var fulfilled = true;
390/******/ 				for (var j = 0; j < chunkIds.length; j++) {
391/******/ 					if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
392/******/ 						chunkIds.splice(j--, 1);
393/******/ 					} else {
394/******/ 						fulfilled = false;
395/******/ 						if(priority < notFulfilled) notFulfilled = priority;
396/******/ 					}
397/******/ 				}
398/******/ 				if(fulfilled) {
399/******/ 					deferred.splice(i--, 1)
400/******/ 					var r = fn();
401/******/ 					if (r !== undefined) result = r;
402/******/ 				}
403/******/ 			}
404/******/ 			return result;
405/******/ 		};
406/******/ 	})();
407/******/ 	
408/******/ 	/* webpack/runtime/compat get default export */
409/******/ 	(() => {
410/******/ 		// getDefaultExport function for compatibility with non-harmony modules
411/******/ 		__webpack_require__.n = (module) => {
412/******/ 			var getter = module && module.__esModule ?
413/******/ 				() => (module['default']) :
414/******/ 				() => (module);
415/******/ 			__webpack_require__.d(getter, { a: getter });
416/******/ 			return getter;
417/******/ 		};
418/******/ 	})();
419/******/ 	
420/******/ 	/* webpack/runtime/define property getters */
421/******/ 	(() => {
422/******/ 		// define getter functions for harmony exports
423/******/ 		__webpack_require__.d = (exports, definition) => {
424/******/ 			for(var key in definition) {
425/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
426/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
427/******/ 				}
428/******/ 			}
429/******/ 		};
430/******/ 	})();
431/******/ 	
432/******/ 	/* webpack/runtime/global */
433/******/ 	(() => {
434/******/ 		__webpack_require__.g = (function() {
435/******/ 			if (typeof globalThis === 'object') return globalThis;
436/******/ 			try {
437/******/ 				return this || new Function('return this')();
438/******/ 			} catch (e) {
439/******/ 				if (typeof window === 'object') return window;
440/******/ 			}
441/******/ 		})();
442/******/ 	})();
443/******/ 	
444/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
445/******/ 	(() => {
446/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
447/******/ 	})();
448/******/ 	
449/******/ 	/* webpack/runtime/make namespace object */
450/******/ 	(() => {
451/******/ 		// define __esModule on exports
452/******/ 		__webpack_require__.r = (exports) => {
453/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
454/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
455/******/ 			}
456/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
457/******/ 		};
458/******/ 	})();
459/******/ 	
460/******/ 	/* webpack/runtime/node module decorator */
461/******/ 	(() => {
462/******/ 		__webpack_require__.nmd = (module) => {
463/******/ 			module.paths = [];
464/******/ 			if (!module.children) module.children = [];
465/******/ 			return module;
466/******/ 		};
467/******/ 	})();
468/******/ 	
469/******/ 	/* webpack/runtime/jsonp chunk loading */
470/******/ 	(() => {
471/******/ 		// no baseURI
472/******/ 		
473/******/ 		// object to store loaded and loading chunks
474/******/ 		// undefined = chunk not loaded, null = chunk preloaded/prefetched
475/******/ 		// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
476/******/ 		var installedChunks = {
477/******/ 			"app": 0
478/******/ 		};
479/******/ 		
480/******/ 		// no chunk on demand loading
481/******/ 		
482/******/ 		// no prefetching
483/******/ 		
484/******/ 		// no preloaded
485/******/ 		
486/******/ 		// no HMR
487/******/ 		
488/******/ 		// no HMR manifest
489/******/ 		
490/******/ 		__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);
491/******/ 		
492/******/ 		// install a JSONP callback for chunk loading
493/******/ 		var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
494/******/ 			var [chunkIds, moreModules, runtime] = data;
495/******/ 			// add "moreModules" to the modules object,
496/******/ 			// then flag all "chunkIds" as loaded and fire callback
497/******/ 			var moduleId, chunkId, i = 0;
498/******/ 			if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
499/******/ 				for(moduleId in moreModules) {
500/******/ 					if(__webpack_require__.o(moreModules, moduleId)) {
501/******/ 						__webpack_require__.m[moduleId] = moreModules[moduleId];
502/******/ 					}
503/******/ 				}
504/******/ 				if(runtime) var result = runtime(__webpack_require__);
505/******/ 			}
506/******/ 			if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
507/******/ 			for(;i < chunkIds.length; i++) {
508/******/ 				chunkId = chunkIds[i];
509/******/ 				if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
510/******/ 					installedChunks[chunkId][0]();
511/******/ 				}
512/******/ 				installedChunks[chunkId] = 0;
513/******/ 			}
514/******/ 			return __webpack_require__.O(result);
515/******/ 		}
516/******/ 		
517/******/ 		var chunkLoadingGlobal = self["webpackChunkministrybooks"] = self["webpackChunkministrybooks"] || [];
518/******/ 		chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
519/******/ 		chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
520/******/ 	})();
521/******/ 	
522/************************************************************************/
523/******/ 	
524/******/ 	// startup
525/******/ 	// Load entry module and return exports
526/******/ 	// This entry module depends on other loaded chunks and execution need to be delayed
527/******/ 	var __webpack_exports__ = __webpack_require__.O(undefined, ["vendors"], () => (__webpack_require__("./resources/js/app.js")))
528/******/ 	__webpack_exports__ = __webpack_require__.O(__webpack_exports__);
529/******/ 	
530/******/ })()
531;

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.