{
  "version": 3,
  "sources": ["../shared/components/autofocus.js", "../shared/components/content_loading.js", "../shared/components/data_confirm.js", "../shared/components/file_input.js", "../shared/components/input_type_number.js", "../../../../../shared/node_modules/lazysizes/lazysizes.js", "../../../../../shared/node_modules/lazysizes/plugins/parent-fit/ls.parent-fit.js", "../frontend/components/events_page.js", "../frontend/components/filterable_list.js", "../../../../../shared/src/js/util/util.js", "../../../../../shared/src/js/util/dom-events.js", "../../../../../shared/src/js/util/viewport-size.js", "../../../../../shared/src/js/slide/pan-bounds.js", "../../../../../shared/src/js/slide/zoom-level.js", "../../../../../shared/src/js/slide/slide.js", "../../../../../shared/src/js/gestures/drag-handler.js", "../../../../../shared/src/js/gestures/zoom-handler.js", "../../../../../shared/src/js/gestures/tap-handler.js", "../../../../../shared/src/js/gestures/gestures.js", "../../../../../shared/src/js/main-scroll.js", "../../../../../shared/src/js/keyboard.js", "../../../../../shared/src/js/util/css-animation.js", "../../../../../shared/src/js/util/spring-easer.js", "../../../../../shared/src/js/util/spring-animation.js", "../../../../../shared/src/js/util/animations.js", "../../../../../shared/src/js/scroll-wheel.js", "../../../../../shared/src/js/ui/ui-element.js", "../../../../../shared/src/js/ui/button-arrow.js", "../../../../../shared/src/js/ui/button-close.js", "../../../../../shared/src/js/ui/button-zoom.js", "../../../../../shared/src/js/ui/loading-indicator.js", "../../../../../shared/src/js/ui/counter-indicator.js", "../../../../../shared/src/js/ui/ui.js", "../../../../../shared/src/js/slide/get-thumb-bounds.js", "../../../../../shared/src/js/core/eventable.js", "../../../../../shared/src/js/slide/placeholder.js", "../../../../../shared/src/js/slide/content.js", "../../../../../shared/src/js/core/base.js", "../../../../../shared/src/js/opener.js", "../../../../../shared/src/js/slide/loader.js", "../../../../../shared/src/js/photoswipe.js", "../frontend/components/lightbox_image.js", "../frontend/components/search_form.js", "../frontend/components/track_page_view.js", "../../../../../shared/node_modules/unpoly/unpoly.js", "../shared/util/environment.js", "../shared/config/unpoly.js", "../shared/config/unpoly_follow_all.js", "../frontend/config/unpoly.js", "import-glob:./shared/components/**/*.js", "../shared/util/application.js", "../shared/util/timeout.js", "../shared/components/flash_message.js", "../shared/components/lazysizes.js", "import-glob:./frontend/components/**/*.js", "../../../../../shared/src/js/util/util.js", "../../../../../shared/src/js/core/eventable.js", "../../../../../shared/src/js/slide/placeholder.js", "../../../../../shared/src/js/slide/content.js", "../../../../../shared/src/js/core/base.js", "../../../../../shared/src/js/util/viewport-size.js", "../../../../../shared/src/js/slide/zoom-level.js", "../../../../../shared/src/js/slide/loader.js", "../../../../../shared/src/js/lightbox/lightbox.js", "../frontend/components/lightbox_gallery.js"],
  "sourcesContent": ["up.compiler('[autofocus]', (element) => {\n  // This compiler will not try to autofocus a field itself (browser handles [autofocus] itself),\n  // but for autofocused input fields, it places the caret at the end of the line.\n\n  if (element.matches('input')) {\n    const length = element.value.length\n\n    try {\n      element.setSelectionRange(length, length)\n    } catch (error) {\n      // setSelectionRange is defined but unsupported for some input types (e.g. email), throwing an error.\n    }\n  }\n})\n", "up.compiler('body', (element) => {\n\n  function setLoading(isLoading) {\n    element.classList.toggle('content-loading', isLoading)\n  }\n\n  return [\n    up.on('up:request:late', () => { setLoading(true) }),\n    up.on('up:request:recover', () => { setLoading(false) }),\n  ]\n\n})\n", "up.compiler('[data-confirm]', (element) => {\n\n  function onClick(event) {\n    const message = element.getAttribute('data-confirm')\n    if (!confirm(message)) up.event.halt(event)\n  }\n\n  element.addEventListener('click', onClick)\n\n})\n", "up.compiler('[file-input]', (element) => {\n\n  const input = element.querySelector('input[type=\"file\"]')\n  const filename = element.querySelector('[file-input--filename]')\n\n  const previewImage = element.querySelector('img[file-input--preview]')\n\n  function onDragOver(event) {\n    event.preventDefault()\n  }\n\n  function onDrop(event) {\n    event.preventDefault()\n    input.files = event.dataTransfer.files\n    onFilePicked()\n  }\n\n  function onFilePicked() {\n    updateFilename()\n    updatePreview()\n  }\n\n  function updateFilename() {\n    const filenames = Array.from(input.files).map(file => file.name)\n    filename.innerText = filenames.join(', ')\n  }\n\n  function updatePreview() {\n    if (!previewImage) return\n\n    if (input.files.length === 1) {\n      const file = input.files[0]\n\n      readImageAsDataURL(file).then((dataURL) => {\n        previewImage.src = dataURL\n      })\n    } else {\n      previewImage.src = '//:0'\n    }\n  }\n\n  function readImageAsDataURL(file) {\n    return new Promise((resolve, reject) => {\n      const reader = new FileReader()\n      reader.addEventListener('load', () => {\n        resolve(reader.result)\n      })\n      reader.readAsDataURL(file)\n    })\n  }\n\n  input.addEventListener('change', onFilePicked)\n  element.addEventListener('drop', onDrop)\n  element.addEventListener('dragover', onDragOver)\n  element.classList.add('drop-area')\n\n})\n", "up.compiler('input[type=\"number\"]', (element) => {\n\n  // Number inputs allow incrementing/decrementing with arrow keys, and support exponential notation\n  // (in some browsers even regular letters). We want neither.\n  element.addEventListener('keydown', (event) => {\n    const key = event.key\n    if (key === 'ArrowUp' || key === 'ArrowDown' || (key.length === 1 && !event.ctrlKey && !event.altKey && !key.match(/[0-9\\-+,.]/))) {\n      event.preventDefault()\n    }\n  })\n\n  // Some browser (at least Firefox) will increment/decrement a number when using the mouse's scroll wheel\n  // above a focused number input. Since this can lead to users changing values by accident, we want to avoid that.\n  element.addEventListener('wheel', (event) => {\n    if (element.matches(':focus')) {\n      event.preventDefault()\n    }\n  })\n\n})\n", "(function(window, factory) {\n\tvar lazySizes = factory(window, window.document, Date);\n\twindow.lazySizes = lazySizes;\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t}\n}(typeof window != 'undefined' ?\n      window : {}, \n/**\n * import(\"./types/global\")\n * @typedef { import(\"./types/lazysizes-config\").LazySizesConfigPartial } LazySizesConfigPartial\n */\nfunction l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost\n\t'use strict';\n\t/*jshint eqnull:true */\n\n\tvar lazysizes,\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tlazySizesCfg;\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tfastLoadedClass: 'ls-is-cached',\n\t\t\tiframeLoadMode: 0,\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 0,\n\t\t\tthrottleDelay: 125,\n\t\t};\n\n\t\tlazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesCfg)){\n\t\t\t\tlazySizesCfg[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\t})();\n\n\tif (!document || !document.getElementsByClassName) {\n\t\treturn {\n\t\t\tinit: function () {},\n\t\t\t/**\n\t\t\t * @type { LazySizesConfigPartial }\n\t\t\t */\n\t\t\tcfg: lazySizesCfg,\n\t\t\t/**\n\t\t\t * @type { true }\n\t\t\t */\n\t\t\tnoSupport: true,\n\t\t};\n\t}\n\n\tvar docElem = document.documentElement;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\t/**\n\t * Update to bind to window because 'this' becomes null during SSR\n\t * builds.\n\t */\n\tvar addEventListener = window[_addEventListener].bind(window);\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\t/**\n\t * @param ele {Element}\n\t * @param cls {string}\n\t */\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\t/**\n\t * @param elem { Element }\n\t * @param name { string }\n\t * @param detail { any }\n\t * @param noBubbles { boolean }\n\t * @param noCancelable { boolean }\n\t * @returns { CustomEvent }\n\t */\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('Event');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initEvent(name, !noBubbles, !noCancelable);\n\n\t\tevent.detail = detail;\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){\n\t\t\tif(full && full.src && !el[_getAttribute]('srcset')){\n\t\t\t\tel.setAttribute('srcset', full.src);\n\t\t\t}\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\t/**\n\t *\n\t * @param elem { Element }\n\t * @param parent { Element }\n\t * @param [width] {number}\n\t * @returns {number}\n\t */\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth =  parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = lazySizesCfg.throttleDelay;\n\t\tvar rICTimeout = lazySizesCfg.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && rICTimeout > 49 ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesCfg.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesCfg.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning =  true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || delay < 9){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isVisible = function (elem) {\n\t\t\tif (isBodyHidden == null) {\n\t\t\t\tisBodyHidden = getCSS(document.body, 'visibility') == 'hidden';\n\t\t\t}\n\n\t\t\treturn isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden');\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = isVisible(elem);\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal,\n\t\t\t\tbeforeExpandVal, defaultExpand, preloadExpand, hFac;\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!defaultExpand) {\n\t\t\t\t\t\tdefaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ?\n\t\t\t\t\t\t\tdocElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 :\n\t\t\t\t\t\t\tlazySizesCfg.expand;\n\n\t\t\t\t\t\tlazysizes._defEx = defaultExpand;\n\n\t\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesCfg.expFactor;\n\t\t\t\t\t\thFac = lazySizesCfg.hFac;\n\t\t\t\t\t\tisBodyHidden = null;\n\n\t\t\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\t\t\tlowRuns = 0;\n\t\t\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesCfg.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\tvar elem = e.target;\n\n\t\t\tif (elem._lazyCache) {\n\t\t\t\tdelete elem._lazyCache;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPreloading(e);\n\t\t\taddClass(elem, lazySizesCfg.loadedClass);\n\t\t\tremoveClass(elem, lazySizesCfg.loadingClass);\n\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(elem, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\tvar loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode;\n\n\t\t\t// loadMode can be also a string!\n\t\t\tif (loadMode == 0) {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} else if (loadMode == 1) {\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesCfg.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesCfg.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\taddClass(elem, lazySizesCfg.loadingClass);\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesCfg.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\t// Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015)\n\t\t\t\tvar isLoaded = elem.complete && elem.naturalWidth > 1;\n\n\t\t\t\tif( !firesLoad || isLoaded){\n\t\t\t\t\tif (isLoaded) {\n\t\t\t\t\t\taddClass(elem, lazySizesCfg.fastLoadedClass);\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t\telem._lazyCache = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tif ('_lazyCache' in elem) {\n\t\t\t\t\t\t\tdelete elem._lazyCache;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 9);\n\t\t\t\t}\n\t\t\t\tif (elem.loading == 'lazy') {\n\t\t\t\t\tisLoading--;\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\t/**\n\t\t *\n\t\t * @param elem { Element }\n\t\t */\n\t\tvar unveilElement = function (elem){\n\t\t\tif (elem._lazyRace) {return;}\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar afterScroll = debounce(function(){\n\t\t\tlazySizesCfg.loadMode = 3;\n\t\t\tthrottledCheckElements();\n\t\t});\n\n\t\tvar altLoadmodeScrollListner = function(){\n\t\t\tif(lazySizesCfg.loadMode == 3){\n\t\t\t\tlazySizesCfg.loadMode = 2;\n\t\t\t}\n\t\t\tafterScroll();\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesCfg.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', altLoadmodeScrollListner, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass);\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('pageshow', function (e) {\n\t\t\t\t\tif (e.persisted) {\n\t\t\t\t\t\tvar loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass);\n\n\t\t\t\t\t\tif (loadingElements.length && loadingElements.forEach) {\n\t\t\t\t\t\t\trequestAnimationFrame(function () {\n\t\t\t\t\t\t\t\tloadingElements.forEach( function (img) {\n\t\t\t\t\t\t\t\t\tif (img.complete) {\n\t\t\t\t\t\t\t\t\t\tunveilElement(img);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement,\n\t\t\t_aLSL: altLoadmodeScrollListner,\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\t/**\n\t\t *\n\t\t * @param elem {Element}\n\t\t * @param dataAttr\n\t\t * @param [width] { number }\n\t\t */\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i && document.getElementsByClassName){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tsetTimeout(function(){\n\t\tif(lazySizesCfg.init){\n\t\t\tinit();\n\t\t}\n\t});\n\n\tlazysizes = {\n\t\t/**\n\t\t * @type { LazySizesConfigPartial }\n\t\t */\n\t\tcfg: lazySizesCfg,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n));\n", "(function(window, factory) {\n\tif(!window) {return;}\n\tvar globalInstall = function(){\n\t\tfactory(window.lazySizes);\n\t\twindow.removeEventListener('lazyunveilread', globalInstall, true);\n\t};\n\n\tfactory = factory.bind(null, window, window.document);\n\n\tif(typeof module == 'object' && module.exports){\n\t\tfactory(require('lazysizes'));\n\t} else if (typeof define == 'function' && define.amd) {\n\t\tdefine(['lazysizes'], factory);\n\t} else if(window.lazySizes) {\n\t\tglobalInstall();\n\t} else {\n\t\twindow.addEventListener('lazyunveilread', globalInstall, true);\n\t}\n}(typeof window != 'undefined' ?\n\twindow : 0, function(window, document, lazySizes) {\n\t'use strict';\n\n\tif(!window.addEventListener){return;}\n\n\tvar regDescriptors = /\\s+(\\d+)(w|h)\\s+(\\d+)(w|h)/;\n\tvar regCssFit = /parent-fit[\"']*\\s*:\\s*[\"']*(contain|cover|width)/;\n\tvar regCssObject = /parent-container[\"']*\\s*:\\s*[\"']*(.+?)(?=(\\s|$|,|'|\"|;))/;\n\tvar regPicture = /^picture$/i;\n\tvar cfg = lazySizes.cfg;\n\n\tvar getCSS = function (elem){\n\t\treturn (getComputedStyle(elem, null) || {});\n\t};\n\n\tvar parentFit = {\n\n\t\tgetParent: function(element, parentSel){\n\t\t\tvar parent = element;\n\t\t\tvar parentNode = element.parentNode;\n\n\t\t\tif((!parentSel || parentSel == 'prev') && parentNode && regPicture.test(parentNode.nodeName || '')){\n\t\t\t\tparentNode = parentNode.parentNode;\n\t\t\t}\n\n\t\t\tif(parentSel != 'self'){\n\t\t\t\tif(parentSel == 'prev'){\n\t\t\t\t\tparent = element.previousElementSibling;\n\t\t\t\t} else if(parentSel && (parentNode.closest || window.jQuery)){\n\t\t\t\t\tparent = (parentNode.closest ?\n\t\t\t\t\t\t\tparentNode.closest(parentSel) :\n\t\t\t\t\t\t\tjQuery(parentNode).closest(parentSel)[0]) ||\n\t\t\t\t\t\tparentNode\n\t\t\t\t\t;\n\t\t\t\t} else {\n\t\t\t\t\tparent = parentNode;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn parent;\n\t\t},\n\n\t\tgetFit: function(element){\n\t\t\tvar tmpMatch, parentObj;\n\t\t\tvar css = getCSS(element);\n\t\t\tvar content = css.content || css.fontFamily;\n\t\t\tvar obj = {\n\t\t\t\tfit: element._lazysizesParentFit || element.getAttribute('data-parent-fit')\n\t\t\t};\n\n\t\t\tif(!obj.fit && content && (tmpMatch = content.match(regCssFit))){\n\t\t\t\tobj.fit = tmpMatch[1];\n\t\t\t}\n\n\t\t\tif(obj.fit){\n\t\t\t\tparentObj = element._lazysizesParentContainer || element.getAttribute('data-parent-container');\n\n\t\t\t\tif(!parentObj && content && (tmpMatch = content.match(regCssObject))){\n\t\t\t\t\tparentObj = tmpMatch[1];\n\t\t\t\t}\n\n\t\t\t\tobj.parent = parentFit.getParent(element, parentObj);\n\n\n\t\t\t} else {\n\t\t\t\tobj.fit = css.objectFit;\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t},\n\n\t\tgetImageRatio: function(element){\n\t\t\tvar i, srcset, media, ratio, match, width, height;\n\t\t\tvar parent = element.parentNode;\n\t\t\tvar elements = parent && regPicture.test(parent.nodeName || '') ?\n\t\t\t\t\tparent.querySelectorAll('source, img') :\n\t\t\t\t\t[element]\n\t\t\t\t;\n\n\t\t\tfor(i = 0; i < elements.length; i++){\n\t\t\t\telement = elements[i];\n\t\t\t\tsrcset = element.getAttribute(cfg.srcsetAttr) || element.getAttribute('srcset') || element.getAttribute('data-pfsrcset') || element.getAttribute('data-risrcset') || '';\n\t\t\t\tmedia = element._lsMedia || element.getAttribute('media');\n\t\t\t\tmedia = cfg.customMedia[element.getAttribute('data-media') || media] || media;\n\n\t\t\t\tif(srcset && (!media || (window.matchMedia && matchMedia(media) || {}).matches )){\n\t\t\t\t\tratio = parseFloat(element.getAttribute('data-aspectratio'));\n\n\t\t\t\t\tif (!ratio) {\n\t\t\t\t\t\tmatch = srcset.match(regDescriptors);\n\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tif(match[2] == 'w'){\n\t\t\t\t\t\t\t\twidth = match[1];\n\t\t\t\t\t\t\t\theight = match[3];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twidth = match[3];\n\t\t\t\t\t\t\t\theight = match[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twidth = element.getAttribute('width');\n\t\t\t\t\t\t\theight = element.getAttribute('height');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tratio = width / height;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ratio;\n\t\t},\n\n\t\tcalculateSize: function(element, width){\n\t\t\tvar displayRatio, height, imageRatio, retWidth;\n\t\t\tvar fitObj = this.getFit(element);\n\t\t\tvar fit = fitObj.fit;\n\t\t\tvar fitElem = fitObj.parent;\n\n\t\t\tif(fit != 'width' && ((fit != 'contain' && fit != 'cover') || !(imageRatio = this.getImageRatio(element)))){\n\t\t\t\treturn width;\n\t\t\t}\n\n\t\t\tif(fitElem){\n\t\t\t\twidth = fitElem.clientWidth;\n\t\t\t} else {\n\t\t\t\tfitElem = element;\n\t\t\t}\n\n\t\t\tretWidth = width;\n\n\t\t\tif(fit == 'width'){\n\t\t\t\tretWidth = width;\n\t\t\t} else {\n\t\t\t\theight = fitElem.clientHeight;\n\n\t\t\t\tif((displayRatio =  width / height) && ((fit == 'cover' && displayRatio < imageRatio) || (fit == 'contain' && displayRatio > imageRatio))){\n\t\t\t\t\tretWidth = width * (imageRatio / displayRatio);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn retWidth;\n\t\t}\n\t};\n\n\tlazySizes.parentFit = parentFit;\n\n\tdocument.addEventListener('lazybeforesizes', function(e){\n\t\tif(e.defaultPrevented || e.detail.instance != lazySizes){return;}\n\n\t\tvar element = e.target;\n\t\te.detail.width = parentFit.calculateSize(element, e.detail.width);\n\t});\n}));\n", "up.compiler('[events-page]', (element) => {\n\n  function getPastEventsContainer() {\n    return element.querySelector('[events-page--past-events]')\n  }\n\n  function isChecked() {\n    return getPastEventsContainer().querySelector('input[type=\"checkbox\"]').checked\n  }\n\n  let lastChecked = isChecked()\n\n  up.on(element, 'up:fragment:inserted', (_event) => {\n    const nowChecked = isChecked()\n\n    if (!lastChecked && nowChecked) {\n      up.reveal(getPastEventsContainer(), {\n        revealTop: true,\n        revealSnap: 0,\n        revealPadding: 95,\n      })\n    }\n\n    lastChecked = nowChecked\n  })\n\n})\n", "up.compiler('.filterable-list', (element) => {\n\n  const filters = element.querySelector('.filterable-list--filters')\n\n  element.addEventListener('up:fragment:inserted', function(event) {\n    const updatedByFilters = filters.contains(event.origin) // don't scroll when list was updated by \"load more\" button\n    const userScrolledDown = element.offsetTop < window.scrollY // only scroll when user scrolled past the top of the list\n\n    if (updatedByFilters && userScrolledDown) {\n      up.reveal(element, {\n        revealTop: true,\n        revealSnap: 0,\n        revealPadding: 95,\n      })\n    }\n  })\n\n})\n", "/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/** @typedef {undefined | null | false | '' | 0} Falsy */\r\n/** @typedef {keyof HTMLElementTagNameMap} HTMLElementTagName */\r\n\r\n/**\r\n * @template {HTMLElementTagName | Falsy} [T=\"div\"]\r\n * @template {Node | undefined} [NodeToAppendElementTo=undefined]\r\n * @param {string=} className\r\n * @param {T=} [tagName]\r\n * @param {NodeToAppendElementTo=} appendToEl\r\n * @returns {T extends HTMLElementTagName ? HTMLElementTagNameMap[T] : HTMLElementTagNameMap['div']}\r\n */\r\nexport function createElement(className, tagName, appendToEl) {\r\n  const el = document.createElement(tagName || 'div');\r\n  if (className) {\r\n    el.className = className;\r\n  }\r\n  if (appendToEl) {\r\n    appendToEl.appendChild(el);\r\n  }\r\n  // @ts-expect-error\r\n  return el;\r\n}\r\n\r\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function equalizePoints(p1, p2) {\r\n  p1.x = p2.x;\r\n  p1.y = p2.y;\r\n  if (p2.id !== undefined) {\r\n    p1.id = p2.id;\r\n  }\r\n  return p1;\r\n}\r\n\r\n/**\r\n * @param {Point} p\r\n */\r\nexport function roundPoint(p) {\r\n  p.x = Math.round(p.x);\r\n  p.y = Math.round(p.y);\r\n}\r\n\r\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function getDistanceBetween(p1, p2) {\r\n  const x = Math.abs(p1.x - p2.x);\r\n  const y = Math.abs(p1.y - p2.y);\r\n  return Math.sqrt((x * x) + (y * y));\r\n}\r\n\r\n/**\r\n * Whether X and Y positions of points are qual\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function pointsEqual(p1, p2) {\r\n  return p1.x === p2.x && p1.y === p2.y;\r\n}\r\n\r\n/**\r\n * The float result between the min and max values.\r\n *\r\n * @param {number} val\r\n * @param {number} min\r\n * @param {number} max\r\n */\r\nexport function clamp(val, min, max) {\r\n  return Math.min(Math.max(val, min), max);\r\n}\r\n\r\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nexport function toTransformString(x, y, scale) {\r\n  let propValue = 'translate3d('\r\n    + x + 'px,' + (y || 0) + 'px'\r\n    + ',0)';\r\n\r\n  if (scale !== undefined) {\r\n    propValue += ' scale3d('\r\n      + scale + ',' + scale\r\n      + ',1)';\r\n  }\r\n\r\n  return propValue;\r\n}\r\n\r\n/**\r\n * Apply transform:translate(x, y) scale(scale) to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nexport function setTransform(el, x, y, scale) {\r\n  el.style.transform = toTransformString(x, y, scale);\r\n}\r\n\r\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/**\r\n * Apply CSS transition to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string=} prop CSS property to animate\r\n * @param {number=} duration in ms\r\n * @param {string=} ease CSS easing function\r\n */\r\nexport function setTransitionStyle(el, prop, duration, ease) {\r\n  // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\r\n  // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\r\n  // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\r\n  el.style.transition = prop\r\n    ? (prop + ' ' + duration + 'ms ' + (ease || defaultCSSEasing))\r\n    : 'none';\r\n}\r\n\r\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\r\nexport function setWidthHeight(el, w, h) {\r\n  el.style.width = (typeof w === 'number') ? (w + 'px') : w;\r\n  el.style.height = (typeof h === 'number') ? (h + 'px') : h;\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nexport function removeTransitionStyle(el) {\r\n  setTransitionStyle(el);\r\n}\r\n\r\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise<HTMLImageElement | void>}\r\n */\r\nexport function decodeImage(img) {\r\n  if ('decode' in img) {\r\n    return img.decode();\r\n  }\r\n\r\n  if (img.complete) {\r\n    return Promise.resolve(img);\r\n  }\r\n\r\n  return new Promise((resolve, reject) => {\r\n    img.onload = () => resolve(img);\r\n    img.onerror = reject;\r\n  });\r\n}\r\n\r\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\r\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\r\nexport const LOAD_STATE = {\r\n  IDLE: 'idle',\r\n  LOADING: 'loading',\r\n  LOADED: 'loaded',\r\n  ERROR: 'error',\r\n};\r\n\r\n\r\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n */\r\nexport function specialKeyUsed(e) {\r\n  if (e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) {\r\n    return true;\r\n  }\r\n}\r\n\r\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {HTMLElement | NodeListOf<HTMLElement> | string} option\r\n * @param {string=} legacySelector\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\r\nexport function getElementsFromOption(option, legacySelector, parent = document) {\r\n  /** @type {HTMLElement[]} */\r\n  let elements = [];\r\n\r\n  if (option instanceof Element) {\r\n    elements = [option];\r\n  } else if (option instanceof NodeList || Array.isArray(option)) {\r\n    elements = Array.from(option);\r\n  } else {\r\n    const selector = typeof option === 'string' ? option : legacySelector;\r\n    if (selector) {\r\n      elements = Array.from(parent.querySelectorAll(selector));\r\n    }\r\n  }\r\n\r\n  return elements;\r\n}\r\n\r\n/**\r\n * Check if variable is PhotoSwipe class\r\n *\r\n * @param {any} fn\r\n */\r\nexport function isPswpClass(fn) {\r\n  return typeof fn === 'function'\r\n    && fn.prototype\r\n    && fn.prototype.goTo;\r\n}\r\n", "// Detect passive event listener support\r\nlet supportsPassive = false;\r\n/* eslint-disable */\r\ntry {\r\n  window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\r\n    get: () => {\r\n      supportsPassive = true;\r\n    }\r\n  }));\r\n} catch (e) {}\r\n/* eslint-enable */\r\n\r\n\r\n/**\r\n * @typedef {Object} PoolItem\r\n * @prop {HTMLElement | Window | Document} target\r\n * @prop {string} type\r\n * @prop {(e: any) => void} listener\r\n * @prop {boolean} passive\r\n */\r\n\r\nclass DOMEvents {\r\n  constructor() {\r\n    /**\r\n     * @type {PoolItem[]}\r\n     * @private\r\n     */\r\n    this._pool = [];\r\n  }\r\n\r\n  /**\r\n   * Adds event listeners\r\n   *\r\n   * @param {HTMLElement | Window | Document} target\r\n   * @param {string} type Can be multiple, separated by space.\r\n   * @param {(e: any) => void} listener\r\n   * @param {boolean=} passive\r\n   */\r\n  add(target, type, listener, passive) {\r\n    this._toggleListener(target, type, listener, passive);\r\n  }\r\n\r\n  /**\r\n   * Removes event listeners\r\n   *\r\n   * @param {HTMLElement | Window | Document} target\r\n   * @param {string} type\r\n   * @param {(e: any) => void} listener\r\n   * @param {boolean=} passive\r\n   */\r\n  remove(target, type, listener, passive) {\r\n    this._toggleListener(target, type, listener, passive, true);\r\n  }\r\n\r\n  /**\r\n   * Removes all bound events\r\n   */\r\n  removeAll() {\r\n    this._pool.forEach((poolItem) => {\r\n      this._toggleListener(\r\n        poolItem.target,\r\n        poolItem.type,\r\n        poolItem.listener,\r\n        poolItem.passive,\r\n        true,\r\n        true\r\n      );\r\n    });\r\n    this._pool = [];\r\n  }\r\n\r\n  /**\r\n   * Adds or removes event\r\n   *\r\n   * @param {HTMLElement | Window | Document} target\r\n   * @param {string} type\r\n   * @param {(e: any) => void} listener\r\n   * @param {boolean} passive\r\n   * @param {boolean=} unbind Whether the event should be added or removed\r\n   * @param {boolean=} skipPool Whether events pool should be skipped\r\n   */\r\n  _toggleListener(target, type, listener, passive, unbind, skipPool) {\r\n    if (!target) {\r\n      return;\r\n    }\r\n\r\n    const methodName = unbind ? 'removeEventListener' : 'addEventListener';\r\n    const types = type.split(' ');\r\n    types.forEach((eType) => {\r\n      if (eType) {\r\n        // Events pool is used to easily unbind all events when PhotoSwipe is closed,\r\n        // so developer doesn't need to do this manually\r\n        if (!skipPool) {\r\n          if (unbind) {\r\n            // Remove from the events pool\r\n            this._pool = this._pool.filter((poolItem) => {\r\n              return poolItem.type !== eType\r\n                || poolItem.listener !== listener\r\n                || poolItem.target !== target;\r\n            });\r\n          } else {\r\n            // Add to the events pool\r\n            this._pool.push({\r\n              target,\r\n              type: eType,\r\n              listener,\r\n              passive\r\n            });\r\n          }\r\n        }\r\n\r\n\r\n        // most PhotoSwipe events call preventDefault,\r\n        // and we do not need browser to scroll the page\r\n        const eventOptions = supportsPassive ? { passive: (passive || false) } : false;\r\n\r\n        target[methodName](\r\n          eType,\r\n          listener,\r\n          eventOptions\r\n        );\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nexport default DOMEvents;\r\n", "/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipe} pswp\r\n */\r\nexport function getViewportSize(options, pswp) {\r\n  if (options.getViewportSizeFn) {\r\n    const newViewportSize = options.getViewportSizeFn(options, pswp);\r\n    if (newViewportSize) {\r\n      return newViewportSize;\r\n    }\r\n  }\r\n\r\n  return {\r\n    x: document.documentElement.clientWidth,\r\n\r\n    // TODO: height on mobile is very incosistent due to toolbar\r\n    // find a way to improve this\r\n    //\r\n    // document.documentElement.clientHeight - doesn't seem to work well\r\n    y: window.innerHeight\r\n  };\r\n}\r\n\r\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n *  top: 0,\r\n *  bottom: 0,\r\n *  left: 0,\r\n *  right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n *  return {\r\n *    top: 0,\r\n *    bottom: 0,\r\n *    left: 0,\r\n *    right: 0\r\n *  };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {{ x?: number; y?: number }} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\r\nexport function parsePaddingOption(prop, options, viewportSize, itemData, index) {\r\n  /** @type {number} */\r\n  let paddingValue;\r\n\r\n  if (options.paddingFn) {\r\n    paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\r\n  } else if (options.padding) {\r\n    paddingValue = options.padding[prop];\r\n  } else {\r\n    const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1);\r\n    // @ts-expect-error\r\n    if (options[legacyPropName]) {\r\n      // @ts-expect-error\r\n      paddingValue = options[legacyPropName];\r\n    }\r\n  }\r\n\r\n  return paddingValue || 0;\r\n}\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {{ x?: number; y?: number }} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n */\r\nexport function getPanAreaSize(options, viewportSize, itemData, index) {\r\n  return {\r\n    x: viewportSize.x\r\n      - parsePaddingOption('left', options, viewportSize, itemData, index)\r\n      - parsePaddingOption('right', options, viewportSize, itemData, index),\r\n    y: viewportSize.y\r\n      - parsePaddingOption('top', options, viewportSize, itemData, index)\r\n      - parsePaddingOption('bottom', options, viewportSize, itemData, index)\r\n  };\r\n}\r\n", "import {\r\n  clamp\r\n} from '../util/util.js';\r\nimport { parsePaddingOption } from '../util/viewport-size.js';\r\n\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n/** @typedef {'x' | 'y'} Axis */\r\n\r\n/**\r\n * Calculates minimum, maximum and initial (center) bounds of a slide\r\n */\r\nclass PanBounds {\r\n  /**\r\n   * @param {Slide} slide\r\n   */\r\n  constructor(slide) {\r\n    this.slide = slide;\r\n\r\n    this.currZoomLevel = 1;\r\n\r\n    /** @type {Point} */\r\n    this.center = {};\r\n    /** @type {Point} */\r\n    this.max = {};\r\n    /** @type {Point} */\r\n    this.min = {};\r\n\r\n    this.reset();\r\n  }\r\n\r\n  /**\r\n   * _getItemBounds\r\n   *\r\n   * @param {number} currZoomLevel\r\n   */\r\n  update(currZoomLevel) {\r\n    this.currZoomLevel = currZoomLevel;\r\n\r\n    if (!this.slide.width) {\r\n      this.reset();\r\n    } else {\r\n      this._updateAxis('x');\r\n      this._updateAxis('y');\r\n      this.slide.pswp.dispatch('calcBounds', { slide: this.slide });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * _calculateItemBoundsForAxis\r\n   *\r\n   * @param {Axis} axis\r\n   */\r\n  _updateAxis(axis) {\r\n    const { pswp } = this.slide;\r\n    const elSize = this.slide[axis === 'x' ? 'width' : 'height'] * this.currZoomLevel;\r\n    const paddingProp = axis === 'x' ? 'left' : 'top';\r\n    const padding = parsePaddingOption(\r\n      paddingProp,\r\n      pswp.options,\r\n      pswp.viewportSize,\r\n      this.slide.data,\r\n      this.slide.index\r\n    );\r\n\r\n    const panAreaSize = this.slide.panAreaSize[axis];\r\n\r\n    // Default position of element.\r\n    // By defaul it is center of viewport:\r\n    this.center[axis] = Math.round((panAreaSize - elSize) / 2) + padding;\r\n\r\n    // maximum pan position\r\n    this.max[axis] = (elSize > panAreaSize)\r\n      ? Math.round(panAreaSize - elSize) + padding\r\n      : this.center[axis];\r\n\r\n    // minimum pan position\r\n    this.min[axis] = (elSize > panAreaSize)\r\n      ? padding\r\n      : this.center[axis];\r\n  }\r\n\r\n  // _getZeroBounds\r\n  reset() {\r\n    this.center.x = 0;\r\n    this.center.y = 0;\r\n    this.max.x = 0;\r\n    this.max.y = 0;\r\n    this.min.x = 0;\r\n    this.min.y = 0;\r\n  }\r\n\r\n  /**\r\n   * Correct pan position if it's beyond the bounds\r\n   *\r\n   * @param {Axis} axis x or y\r\n   * @param {number} panOffset\r\n   */\r\n  correctPan(axis, panOffset) { // checkPanBounds\r\n    return clamp(panOffset, this.max[axis], this.min[axis]);\r\n  }\r\n}\r\n\r\nexport default PanBounds;\r\n", "const MAX_IMAGE_WIDTH = 4000;\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\r\n\r\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\r\nclass ZoomLevel {\r\n  /**\r\n   * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n   * @param {SlideData} itemData Slide data\r\n   * @param {number} index Slide index\r\n   * @param {PhotoSwipe=} pswp PhotoSwipe instance, can be undefined if not initialized yet\r\n   */\r\n  constructor(options, itemData, index, pswp) {\r\n    this.pswp = pswp;\r\n    this.options = options;\r\n    this.itemData = itemData;\r\n    this.index = index;\r\n  }\r\n\r\n  /**\r\n   * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n   *\r\n   * It should be called when either image or viewport size changes.\r\n   *\r\n   * @param {number} maxWidth\r\n   * @param {number} maxHeight\r\n   * @param {{ x?: number; y?: number }} panAreaSize\r\n   */\r\n  update(maxWidth, maxHeight, panAreaSize) {\r\n    this.elementSize = {\r\n      x: maxWidth,\r\n      y: maxHeight\r\n    };\r\n\r\n    this.panAreaSize = panAreaSize;\r\n\r\n    const hRatio = this.panAreaSize.x / this.elementSize.x;\r\n    const vRatio = this.panAreaSize.y / this.elementSize.y;\r\n\r\n    this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\r\n    this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio);\r\n\r\n    // zoom.vFill defines zoom level of the image\r\n    // when it has 100% of viewport vertical space (height)\r\n    this.vFill = Math.min(1, vRatio);\r\n\r\n    this.initial = this._getInitial();\r\n    this.secondary = this._getSecondary();\r\n    this.max = Math.max(\r\n      this.initial,\r\n      this.secondary,\r\n      this._getMax()\r\n    );\r\n\r\n    this.min = Math.min(\r\n      this.fit,\r\n      this.initial,\r\n      this.secondary\r\n    );\r\n\r\n    if (this.pswp) {\r\n      this.pswp.dispatch('zoomLevelsUpdate', { zoomLevels: this, slideData: this.itemData });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Parses user-defined zoom option.\r\n   *\r\n   * @private\r\n   * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n   */\r\n  _parseZoomLevelOption(optionPrefix) {\r\n    // eslint-disable-next-line max-len\r\n    const optionName = /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */ (optionPrefix + 'ZoomLevel');\r\n    const optionValue = this.options[optionName];\r\n\r\n    if (!optionValue) {\r\n      return;\r\n    }\r\n\r\n    if (typeof optionValue === 'function') {\r\n      return optionValue(this);\r\n    }\r\n\r\n    if (optionValue === 'fill') {\r\n      return this.fill;\r\n    }\r\n\r\n    if (optionValue === 'fit') {\r\n      return this.fit;\r\n    }\r\n\r\n    return Number(optionValue);\r\n  }\r\n\r\n  /**\r\n   * Get zoom level to which image will be zoomed after double-tap gesture,\r\n   * or when user clicks on zoom icon,\r\n   * or mouse-click on image itself.\r\n   * If you return 1 image will be zoomed to its original size.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\r\n  _getSecondary() {\r\n    let currZoomLevel = this._parseZoomLevelOption('secondary');\r\n\r\n    if (currZoomLevel) {\r\n      return currZoomLevel;\r\n    }\r\n\r\n    // 3x of \"fit\" state, but not larger than original\r\n    currZoomLevel = Math.min(1, this.fit * 3);\r\n\r\n    if (currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\r\n      currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\r\n    }\r\n\r\n    return currZoomLevel;\r\n  }\r\n\r\n  /**\r\n   * Get initial image zoom level.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\r\n  _getInitial() {\r\n    return this._parseZoomLevelOption('initial') || this.fit;\r\n  }\r\n\r\n  /**\r\n   * Maximum zoom level when user zooms\r\n   * via zoom/pinch gesture,\r\n   * via cmd/ctrl-wheel or via trackpad.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\r\n  _getMax() {\r\n    const currZoomLevel = this._parseZoomLevelOption('max');\r\n\r\n    if (currZoomLevel) {\r\n      return currZoomLevel;\r\n    }\r\n\r\n    // max zoom level is x4 from \"fit state\",\r\n    // used for zoom gesture and ctrl/trackpad zoom\r\n    return Math.max(1, this.fit * 4);\r\n  }\r\n}\r\n\r\nexport default ZoomLevel;\r\n", "/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/**\r\n * @typedef {_SlideData & Record<string, any>} SlideData\r\n * @typedef {Object} _SlideData\r\n * @prop {HTMLElement=} element thumbnail element\r\n * @prop {string=} src image URL\r\n * @prop {string=} srcset image srcset\r\n * @prop {number=} w image width (deprecated)\r\n * @prop {number=} h image height (deprecated)\r\n * @prop {number=} width image width\r\n * @prop {number=} height image height\r\n * @prop {string=} msrc placeholder image URL that's displayed before large image is loaded\r\n * @prop {string=} alt image alt text\r\n * @prop {boolean=} thumbCropped whether thumbnail is cropped client-side or not\r\n * @prop {string=} html html content of a slide\r\n * @prop {'image' | 'html' | string} [type] slide type\r\n */\r\n\r\nimport {\r\n  createElement,\r\n  setTransform,\r\n  equalizePoints,\r\n  roundPoint,\r\n  toTransformString,\r\n  clamp,\r\n} from '../util/util.js';\r\n\r\nimport PanBounds from './pan-bounds.js';\r\nimport ZoomLevel from './zoom-level.js';\r\nimport { getPanAreaSize } from '../util/viewport-size.js';\r\n\r\n/**\r\n * Renders and allows to control a single slide\r\n */\r\nclass Slide {\r\n  /**\r\n   * @param {SlideData} data\r\n   * @param {number} index\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(data, index, pswp) {\r\n    this.data = data;\r\n    this.index = index;\r\n    this.pswp = pswp;\r\n    this.isActive = (index === pswp.currIndex);\r\n    this.currentResolution = 0;\r\n    /** @type {Point} */\r\n    this.panAreaSize = {};\r\n\r\n    this.isFirstSlide = (this.isActive && !pswp.opener.isOpen);\r\n\r\n    this.zoomLevels = new ZoomLevel(pswp.options, data, index, pswp);\r\n\r\n    this.pswp.dispatch('gettingData', {\r\n      slide: this,\r\n      data: this.data,\r\n      index\r\n    });\r\n\r\n    this.pan = {\r\n      x: 0,\r\n      y: 0\r\n    };\r\n\r\n    this.content = this.pswp.contentLoader.getContentBySlide(this);\r\n    this.container = createElement('pswp__zoom-wrap');\r\n\r\n    this.currZoomLevel = 1;\r\n    /** @type {number} */\r\n    this.width = this.content.width;\r\n    /** @type {number} */\r\n    this.height = this.content.height;\r\n\r\n    this.bounds = new PanBounds(this);\r\n\r\n    this.prevDisplayedWidth = -1;\r\n    this.prevDisplayedHeight = -1;\r\n\r\n    this.pswp.dispatch('slideInit', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * If this slide is active/current/visible\r\n   *\r\n   * @param {boolean} isActive\r\n   */\r\n  setIsActive(isActive) {\r\n    if (isActive && !this.isActive) {\r\n      // slide just became active\r\n      this.activate();\r\n    } else if (!isActive && this.isActive) {\r\n      // slide just became non-active\r\n      this.deactivate();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Appends slide content to DOM\r\n   *\r\n   * @param {HTMLElement} holderElement\r\n   */\r\n  append(holderElement) {\r\n    this.holderElement = holderElement;\r\n\r\n    // Slide appended to DOM\r\n    if (!this.data) {\r\n      this.holderElement.innerHTML = '';\r\n      return;\r\n    }\r\n\r\n    this.calculateSize();\r\n\r\n    this.container.style.transformOrigin = '0 0';\r\n\r\n    this.load();\r\n    this.appendHeavy();\r\n    this.updateContentSize();\r\n\r\n    this.holderElement.innerHTML = '';\r\n    this.holderElement.appendChild(this.container);\r\n\r\n    this.zoomAndPanToInitial();\r\n\r\n    this.pswp.dispatch('firstZoomPan', { slide: this });\r\n\r\n    this.applyCurrentZoomPan();\r\n\r\n    this.pswp.dispatch('afterSetContent', { slide: this });\r\n\r\n    if (this.isActive) {\r\n      this.activate();\r\n    }\r\n  }\r\n\r\n  load() {\r\n    this.content.load();\r\n    this.pswp.dispatch('slideLoad', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * Append \"heavy\" DOM elements\r\n   *\r\n   * This may depend on a type of slide,\r\n   * but generally these are large images.\r\n   */\r\n  appendHeavy() {\r\n    const { pswp } = this;\r\n    const appendHeavyNearby = true; // todo\r\n\r\n    // Avoid appending heavy elements during animations\r\n    if (this.heavyAppended\r\n        || !pswp.opener.isOpen\r\n        || pswp.mainScroll.isShifted()\r\n        || (!this.isActive && !appendHeavyNearby)) {\r\n      return;\r\n    }\r\n\r\n    if (this.pswp.dispatch('appendHeavy', { slide: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    this.heavyAppended = true;\r\n\r\n    this.content.append();\r\n\r\n    this.pswp.dispatch('appendHeavyContent', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * Triggered when this slide is active (selected).\r\n   *\r\n   * If it's part of opening/closing transition -\r\n   * activate() will trigger after the transition is ended.\r\n   */\r\n  activate() {\r\n    this.isActive = true;\r\n    this.appendHeavy();\r\n    this.content.activate();\r\n    this.pswp.dispatch('slideActivate', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * Triggered when this slide becomes inactive.\r\n   *\r\n   * Slide can become inactive only after it was active.\r\n   */\r\n  deactivate() {\r\n    this.isActive = false;\r\n    this.content.deactivate();\r\n\r\n    // reset zoom level\r\n    this.currentResolution = 0;\r\n    this.zoomAndPanToInitial();\r\n    this.applyCurrentZoomPan();\r\n    this.updateContentSize();\r\n\r\n    this.pswp.dispatch('slideDeactivate', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * The slide should destroy itself, it will never be used again.\r\n   * (unbind all events and destroy internal components)\r\n   */\r\n  destroy() {\r\n    this.content.hasSlide = false;\r\n    this.content.remove();\r\n    this.pswp.dispatch('slideDestroy', { slide: this });\r\n  }\r\n\r\n  resize() {\r\n    if (this.currZoomLevel === this.zoomLevels.initial || !this.isActive) {\r\n      // Keep initial zoom level if it was before the resize,\r\n      // as well as when this slide is not active\r\n\r\n      // Reset position and scale to original state\r\n      this.calculateSize();\r\n      this.currentResolution = 0;\r\n      this.zoomAndPanToInitial();\r\n      this.applyCurrentZoomPan();\r\n      this.updateContentSize();\r\n    } else {\r\n      // readjust pan position if it's beyond the bounds\r\n      this.calculateSize();\r\n      this.bounds.update(this.currZoomLevel);\r\n      this.panTo(this.pan.x, this.pan.y);\r\n    }\r\n  }\r\n\r\n\r\n  /**\r\n   * Apply size to current slide content,\r\n   * based on the current resolution and scale.\r\n   *\r\n   * @param {boolean=} force if size should be updated even if dimensions weren't changed\r\n   */\r\n  updateContentSize(force) {\r\n    // Use initial zoom level\r\n    // if resolution is not defined (user didn't zoom yet)\r\n    const scaleMultiplier = this.currentResolution || this.zoomLevels.initial;\r\n\r\n    if (!scaleMultiplier) {\r\n      return;\r\n    }\r\n\r\n    const width = Math.round(this.width * scaleMultiplier) || this.pswp.viewportSize.x;\r\n    const height = Math.round(this.height * scaleMultiplier) || this.pswp.viewportSize.y;\r\n\r\n    if (!this.sizeChanged(width, height) && !force) {\r\n      return;\r\n    }\r\n    this.content.setDisplayedSize(width, height);\r\n  }\r\n\r\n  /**\r\n   * @param {number} width\r\n   * @param {number} height\r\n   */\r\n  sizeChanged(width, height) {\r\n    if (width !== this.prevDisplayedWidth\r\n        || height !== this.prevDisplayedHeight) {\r\n      this.prevDisplayedWidth = width;\r\n      this.prevDisplayedHeight = height;\r\n      return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  getPlaceholderElement() {\r\n    if (this.content.placeholder) {\r\n      return this.content.placeholder.element;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Zoom current slide image to...\r\n   *\r\n   * @param {number} destZoomLevel Destination zoom level.\r\n   * @param {{ x?: number; y?: number }} centerPoint\r\n   * Transform origin center point, or false if viewport center should be used.\r\n   * @param {number | false} [transitionDuration] Transition duration, may be set to 0.\r\n   * @param {boolean=} ignoreBounds Minimum and maximum zoom levels will be ignored.\r\n   * @return {boolean=} Returns true if animated.\r\n   */\r\n  zoomTo(destZoomLevel, centerPoint, transitionDuration, ignoreBounds) {\r\n    const { pswp } = this;\r\n    if (!this.isZoomable()\r\n        || pswp.mainScroll.isShifted()) {\r\n      return;\r\n    }\r\n\r\n    pswp.dispatch('beforeZoomTo', {\r\n      destZoomLevel, centerPoint, transitionDuration\r\n    });\r\n\r\n    // stop all pan and zoom transitions\r\n    pswp.animations.stopAllPan();\r\n\r\n    // if (!centerPoint) {\r\n    //   centerPoint = pswp.getViewportCenterPoint();\r\n    // }\r\n\r\n    const prevZoomLevel = this.currZoomLevel;\r\n\r\n    if (!ignoreBounds) {\r\n      destZoomLevel = clamp(destZoomLevel, this.zoomLevels.min, this.zoomLevels.max);\r\n    }\r\n\r\n    // if (transitionDuration === undefined) {\r\n    //   transitionDuration = this.pswp.options.zoomAnimationDuration;\r\n    // }\r\n\r\n    this.setZoomLevel(destZoomLevel);\r\n    this.pan.x = this.calculateZoomToPanOffset('x', centerPoint, prevZoomLevel);\r\n    this.pan.y = this.calculateZoomToPanOffset('y', centerPoint, prevZoomLevel);\r\n    roundPoint(this.pan);\r\n\r\n    const finishTransition = () => {\r\n      this._setResolution(destZoomLevel);\r\n      this.applyCurrentZoomPan();\r\n    };\r\n\r\n    if (!transitionDuration) {\r\n      finishTransition();\r\n    } else {\r\n      pswp.animations.startTransition({\r\n        isPan: true,\r\n        name: 'zoomTo',\r\n        target: this.container,\r\n        transform: this.getCurrentTransform(),\r\n        onComplete: finishTransition,\r\n        duration: transitionDuration,\r\n        easing: pswp.options.easing\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {{ x?: number, y?: number }} [centerPoint]\r\n   */\r\n  toggleZoom(centerPoint) {\r\n    this.zoomTo(\r\n      this.currZoomLevel === this.zoomLevels.initial\r\n        ? this.zoomLevels.secondary : this.zoomLevels.initial,\r\n      centerPoint,\r\n      this.pswp.options.zoomAnimationDuration\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Updates zoom level property and recalculates new pan bounds,\r\n   * unlike zoomTo it does not apply transform (use applyCurrentZoomPan)\r\n   *\r\n   * @param {number} currZoomLevel\r\n   */\r\n  setZoomLevel(currZoomLevel) {\r\n    this.currZoomLevel = currZoomLevel;\r\n    this.bounds.update(this.currZoomLevel);\r\n  }\r\n\r\n  /**\r\n   * Get pan position after zoom at a given `point`.\r\n   *\r\n   * Always call setZoomLevel(newZoomLevel) beforehand to recalculate\r\n   * pan bounds according to the new zoom level.\r\n   *\r\n   * @param {'x' | 'y'} axis\r\n   * @param {{ x?: number; y?: number }} [point]\r\n   * point based on which zoom is performed, usually refers to the current mouse position,\r\n   * if false - viewport center will be used.\r\n   * @param {number=} prevZoomLevel Zoom level before new zoom was applied.\r\n   */\r\n  calculateZoomToPanOffset(axis, point, prevZoomLevel) {\r\n    const totalPanDistance = this.bounds.max[axis] - this.bounds.min[axis];\r\n    if (totalPanDistance === 0) {\r\n      return this.bounds.center[axis];\r\n    }\r\n\r\n    if (!point) {\r\n      point = this.pswp.getViewportCenterPoint();\r\n    }\r\n\r\n    const zoomFactor = this.currZoomLevel / prevZoomLevel;\r\n    return this.bounds.correctPan(\r\n      axis,\r\n      (this.pan[axis] - point[axis]) * zoomFactor + point[axis]\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Apply pan and keep it within bounds.\r\n   *\r\n   * @param {number} panX\r\n   * @param {number} panY\r\n   */\r\n  panTo(panX, panY) {\r\n    this.pan.x = this.bounds.correctPan('x', panX);\r\n    this.pan.y = this.bounds.correctPan('y', panY);\r\n    this.applyCurrentZoomPan();\r\n  }\r\n\r\n  /**\r\n   * If the slide in the current state can be panned by the user\r\n   */\r\n  isPannable() {\r\n    return this.width && (this.currZoomLevel > this.zoomLevels.fit);\r\n  }\r\n\r\n  /**\r\n   * If the slide can be zoomed\r\n   */\r\n  isZoomable() {\r\n    return this.width && this.content.isZoomable();\r\n  }\r\n\r\n  /**\r\n   * Apply transform and scale based on\r\n   * the current pan position (this.pan) and zoom level (this.currZoomLevel)\r\n   */\r\n  applyCurrentZoomPan() {\r\n    this._applyZoomTransform(this.pan.x, this.pan.y, this.currZoomLevel);\r\n    if (this === this.pswp.currSlide) {\r\n      this.pswp.dispatch('zoomPanUpdate', { slide: this });\r\n    }\r\n  }\r\n\r\n  zoomAndPanToInitial() {\r\n    this.currZoomLevel = this.zoomLevels.initial;\r\n\r\n    // pan according to the zoom level\r\n    this.bounds.update(this.currZoomLevel);\r\n    equalizePoints(this.pan, this.bounds.center);\r\n    this.pswp.dispatch('initialZoomPan', { slide: this });\r\n  }\r\n\r\n  /**\r\n   * Set translate and scale based on current resolution\r\n   *\r\n   * @param {number} x\r\n   * @param {number} y\r\n   * @param {number} zoom\r\n   */\r\n  _applyZoomTransform(x, y, zoom) {\r\n    zoom /= this.currentResolution || this.zoomLevels.initial;\r\n    setTransform(this.container, x, y, zoom);\r\n  }\r\n\r\n  calculateSize() {\r\n    const { pswp } = this;\r\n\r\n    equalizePoints(\r\n      this.panAreaSize,\r\n      getPanAreaSize(pswp.options, pswp.viewportSize, this.data, this.index)\r\n    );\r\n\r\n    this.zoomLevels.update(this.width, this.height, this.panAreaSize);\r\n\r\n    pswp.dispatch('calcSlideSize', {\r\n      slide: this\r\n    });\r\n  }\r\n\r\n  getCurrentTransform() {\r\n    const scale = this.currZoomLevel / (this.currentResolution || this.zoomLevels.initial);\r\n    return toTransformString(this.pan.x, this.pan.y, scale);\r\n  }\r\n\r\n  /**\r\n   * Set resolution and re-render the image.\r\n   *\r\n   * For example, if the real image size is 2000x1500,\r\n   * and resolution is 0.5 - it will be rendered as 1000x750.\r\n   *\r\n   * Image with zoom level 2 and resolution 0.5 is\r\n   * the same as image with zoom level 1 and resolution 1.\r\n   *\r\n   * Used to optimize animations and make\r\n   * sure that browser renders image in highest quality.\r\n   * Also used by responsive images to load the correct one.\r\n   *\r\n   * @param {number} newResolution\r\n   */\r\n  _setResolution(newResolution) {\r\n    if (newResolution === this.currentResolution) {\r\n      return;\r\n    }\r\n\r\n    this.currentResolution = newResolution;\r\n    this.updateContentSize();\r\n\r\n    this.pswp.dispatch('resolutionChanged');\r\n  }\r\n}\r\n\r\nexport default Slide;\r\n", "import {\r\n  equalizePoints, roundPoint, clamp\r\n} from '../util/util.js';\r\n\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\nconst PAN_END_FRICTION = 0.35;\r\nconst VERTICAL_DRAG_FRICTION = 0.6;\r\n\r\n// 1 corresponds to the third of viewport height\r\nconst MIN_RATIO_TO_CLOSE = 0.4;\r\n\r\n// Minimum speed required to navigate\r\n// to next or previous slide\r\nconst MIN_NEXT_SLIDE_SPEED = 0.5;\r\n\r\n/**\r\n * @param {number} initialVelocity\r\n * @param {number} decelerationRate\r\n */\r\nfunction project(initialVelocity, decelerationRate) {\r\n  return initialVelocity * decelerationRate / (1 - decelerationRate);\r\n}\r\n\r\n/**\r\n * Handles single pointer dragging\r\n */\r\nclass DragHandler {\r\n  /**\r\n   * @param {Gestures} gestures\r\n   */\r\n  constructor(gestures) {\r\n    this.gestures = gestures;\r\n    this.pswp = gestures.pswp;\r\n    /** @type {Point} */\r\n    this.startPan = {};\r\n  }\r\n\r\n  start() {\r\n    equalizePoints(this.startPan, this.pswp.currSlide.pan);\r\n    this.pswp.animations.stopAll();\r\n  }\r\n\r\n  change() {\r\n    const { p1, prevP1, dragAxis, pswp } = this.gestures;\r\n    const { currSlide } = pswp;\r\n\r\n    if (dragAxis === 'y'\r\n        && pswp.options.closeOnVerticalDrag\r\n        && currSlide.currZoomLevel <= currSlide.zoomLevels.fit\r\n        && !this.gestures.isMultitouch) {\r\n      // Handle vertical drag to close\r\n      const panY = currSlide.pan.y + (p1.y - prevP1.y);\r\n      if (!pswp.dispatch('verticalDrag', { panY }).defaultPrevented) {\r\n        this._setPanWithFriction('y', panY, VERTICAL_DRAG_FRICTION);\r\n        const bgOpacity = 1 - Math.abs(this._getVerticalDragRatio(currSlide.pan.y));\r\n        pswp.applyBgOpacity(bgOpacity);\r\n        currSlide.applyCurrentZoomPan();\r\n      }\r\n    } else {\r\n      const mainScrollChanged = this._panOrMoveMainScroll('x');\r\n      if (!mainScrollChanged) {\r\n        this._panOrMoveMainScroll('y');\r\n\r\n        roundPoint(currSlide.pan);\r\n        currSlide.applyCurrentZoomPan();\r\n      }\r\n    }\r\n  }\r\n\r\n  end() {\r\n    const { pswp, velocity } = this.gestures;\r\n    const { mainScroll } = pswp;\r\n    let indexDiff = 0;\r\n\r\n    pswp.animations.stopAll();\r\n\r\n    // Handle main scroll if it's shifted\r\n    if (mainScroll.isShifted()) {\r\n      // Position of the main scroll relative to the viewport\r\n      const mainScrollShiftDiff = mainScroll.x - mainScroll.getCurrSlideX();\r\n\r\n      // Ratio between 0 and 1:\r\n      // 0 - slide is not visible at all,\r\n      // 0.5 - half of the slide is vicible\r\n      // 1 - slide is fully visible\r\n      const currentSlideVisibilityRatio = (mainScrollShiftDiff / pswp.viewportSize.x);\r\n\r\n      // Go next slide.\r\n      //\r\n      // - if velocity and its direction is matched\r\n      //   and we see at least tiny part of the next slide\r\n      //\r\n      // - or if we see less than 50% of the current slide\r\n      //   and velocity is close to 0\r\n      //\r\n      if ((velocity.x < -MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio < 0)\r\n          || (velocity.x < 0.1 && currentSlideVisibilityRatio < -0.5)) {\r\n        // Go to next slide\r\n        indexDiff = 1;\r\n        velocity.x = Math.min(velocity.x, 0);\r\n      } else if ((velocity.x > MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio > 0)\r\n          || (velocity.x > -0.1 && currentSlideVisibilityRatio > 0.5)) {\r\n        // Go to prev slide\r\n        indexDiff = -1;\r\n        velocity.x = Math.max(velocity.x, 0);\r\n      }\r\n\r\n      mainScroll.moveIndexBy(indexDiff, true, velocity.x);\r\n    }\r\n\r\n    // Restore zoom level\r\n    if (pswp.currSlide.currZoomLevel > pswp.currSlide.zoomLevels.max\r\n        || this.gestures.isMultitouch) {\r\n      this.gestures.zoomLevels.correctZoomPan(true);\r\n    } else {\r\n      // we run two animations instead of one,\r\n      // as each axis has own pan boundaries and thus different spring function\r\n      // (correctZoomPan does not have this functionality,\r\n      //  it animates all properties with single timing function)\r\n      this._finishPanGestureForAxis('x');\r\n      this._finishPanGestureForAxis('y');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   */\r\n  _finishPanGestureForAxis(axis) {\r\n    const { pswp } = this;\r\n    const { currSlide } = pswp;\r\n    const { velocity } = this.gestures;\r\n    const { pan, bounds } = currSlide;\r\n    const panPos = pan[axis];\r\n    const restoreBgOpacity = (pswp.bgOpacity < 1 && axis === 'y');\r\n\r\n    // 0.995 means - scroll view loses 0.5% of its velocity per millisecond\r\n    // Inceasing this number will reduce travel distance\r\n    const decelerationRate = 0.995; // 0.99\r\n\r\n    // Pan position if there is no bounds\r\n    const projectedPosition = panPos + project(velocity[axis], decelerationRate);\r\n\r\n    if (restoreBgOpacity) {\r\n      const vDragRatio = this._getVerticalDragRatio(panPos);\r\n      const projectedVDragRatio = this._getVerticalDragRatio(projectedPosition);\r\n\r\n      // If we are above and moving upwards,\r\n      // or if we are below and moving downwards\r\n      if ((vDragRatio < 0 && projectedVDragRatio < -MIN_RATIO_TO_CLOSE)\r\n          || (vDragRatio > 0 && projectedVDragRatio > MIN_RATIO_TO_CLOSE)) {\r\n        pswp.close();\r\n        return;\r\n      }\r\n    }\r\n\r\n    // Pan position with corrected bounds\r\n    const correctedPanPosition = bounds.correctPan(axis, projectedPosition);\r\n\r\n    // Exit if pan position should not be changed\r\n    // or if speed it too low\r\n    if (panPos === correctedPanPosition) {\r\n      return;\r\n    }\r\n\r\n    // Overshoot if the final position is out of pan bounds\r\n    const dampingRatio = (correctedPanPosition === projectedPosition) ? 1 : 0.82;\r\n\r\n    const initialBgOpacity = pswp.bgOpacity;\r\n    const totalPanDist = correctedPanPosition - panPos;\r\n\r\n    pswp.animations.startSpring({\r\n      name: 'panGesture' + axis,\r\n      isPan: true,\r\n      start: panPos,\r\n      end: correctedPanPosition,\r\n      velocity: velocity[axis],\r\n      dampingRatio,\r\n      onUpdate: (pos) => {\r\n        // Animate opacity of background relative to Y pan position of an image\r\n        if (restoreBgOpacity && pswp.bgOpacity < 1) {\r\n          // 0 - start of animation, 1 - end of animation\r\n          const animationProgressRatio = 1 - (correctedPanPosition - pos) / totalPanDist;\r\n\r\n          // We clamp opacity to keep it between 0 and 1.\r\n          // As progress ratio can be larger than 1 due to overshoot,\r\n          // and we do not want to bounce opacity.\r\n          pswp.applyBgOpacity(clamp(\r\n            initialBgOpacity + (1 - initialBgOpacity) * animationProgressRatio,\r\n            0,\r\n            1\r\n          ));\r\n        }\r\n\r\n        pan[axis] = Math.floor(pos);\r\n        currSlide.applyCurrentZoomPan();\r\n      },\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Update position of the main scroll,\r\n   * or/and update pan position of the current slide.\r\n   *\r\n   * Should return true if it changes (or can change) main scroll.\r\n   *\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   */\r\n  _panOrMoveMainScroll(axis) {\r\n    const { p1, pswp, dragAxis, prevP1, isMultitouch } = this.gestures;\r\n    const { currSlide, mainScroll } = pswp;\r\n    const delta = (p1[axis] - prevP1[axis]);\r\n    const newMainScrollX = mainScroll.x + delta;\r\n\r\n    if (!delta) {\r\n      return;\r\n    }\r\n\r\n    // Always move main scroll if image can not be panned\r\n    if (axis === 'x' && !currSlide.isPannable() && !isMultitouch) {\r\n      mainScroll.moveTo(newMainScrollX, true);\r\n      return true; // changed main scroll\r\n    }\r\n\r\n    const { bounds } = currSlide;\r\n    const newPan = currSlide.pan[axis] + delta;\r\n\r\n    if (pswp.options.allowPanToNext\r\n        && dragAxis === 'x'\r\n        && axis === 'x'\r\n        && !isMultitouch) {\r\n      const currSlideMainScrollX = mainScroll.getCurrSlideX();\r\n\r\n      // Position of the main scroll relative to the viewport\r\n      const mainScrollShiftDiff = mainScroll.x - currSlideMainScrollX;\r\n\r\n      const isLeftToRight = delta > 0;\r\n      const isRightToLeft = !isLeftToRight;\r\n\r\n      if (newPan > bounds.min[axis] && isLeftToRight) {\r\n        // Panning from left to right, beyond the left edge\r\n\r\n        // Wether the image was at minimum pan position (or less)\r\n        // when this drag gesture started.\r\n        // Minimum pan position refers to the left edge of the image.\r\n        const wasAtMinPanPosition = (bounds.min[axis] <= this.startPan[axis]);\r\n\r\n        if (wasAtMinPanPosition) {\r\n          mainScroll.moveTo(newMainScrollX, true);\r\n          return true;\r\n        } else {\r\n          this._setPanWithFriction(axis, newPan);\r\n          //currSlide.pan[axis] = newPan;\r\n        }\r\n      } else if (newPan < bounds.max[axis] && isRightToLeft) {\r\n        // Paning from right to left, beyond the right edge\r\n\r\n        // Maximum pan position refers to the right edge of the image.\r\n        const wasAtMaxPanPosition = (this.startPan[axis] <= bounds.max[axis]);\r\n\r\n        if (wasAtMaxPanPosition) {\r\n          mainScroll.moveTo(newMainScrollX, true);\r\n          return true;\r\n        } else {\r\n          this._setPanWithFriction(axis, newPan);\r\n          //currSlide.pan[axis] = newPan;\r\n        }\r\n      } else {\r\n        // If main scroll is shifted\r\n        if (mainScrollShiftDiff !== 0) {\r\n          // If main scroll is shifted right\r\n          if (mainScrollShiftDiff > 0 /*&& isRightToLeft*/) {\r\n            mainScroll.moveTo(Math.max(newMainScrollX, currSlideMainScrollX), true);\r\n            return true;\r\n          } else if (mainScrollShiftDiff < 0 /*&& isLeftToRight*/) {\r\n            // Main scroll is shifted left (Position is less than 0 comparing to the viewport 0)\r\n            mainScroll.moveTo(Math.min(newMainScrollX, currSlideMainScrollX), true);\r\n            return true;\r\n          }\r\n        } else {\r\n          // We are within pan bounds, so just pan\r\n          this._setPanWithFriction(axis, newPan);\r\n        }\r\n      }\r\n    } else {\r\n      if (axis === 'y') {\r\n        // Do not pan vertically if main scroll is shifted o\r\n        if (!mainScroll.isShifted() && bounds.min.y !== bounds.max.y) {\r\n          this._setPanWithFriction(axis, newPan);\r\n        }\r\n      } else {\r\n        this._setPanWithFriction(axis, newPan);\r\n      }\r\n    }\r\n  }\r\n  //\r\n  // If we move above - the ratio is negative\r\n  // If we move below the ratio is positive\r\n\r\n  /**\r\n   * Relation between pan Y position and third of viewport height.\r\n   *\r\n   * When we are at initial position (center bounds) - the ratio is 0,\r\n   * if position is shifted upwards - the ratio is negative,\r\n   * if position is shifted downwards - the ratio is positive.\r\n   *\r\n   * @private\r\n   * @param {number} panY The current pan Y position.\r\n   */\r\n  _getVerticalDragRatio(panY) {\r\n    return (panY - this.pswp.currSlide.bounds.center.y)\r\n            / (this.pswp.viewportSize.y / 3);\r\n  }\r\n\r\n  /**\r\n   * Set pan position of the current slide.\r\n   * Apply friction if the position is beyond the pan bounds,\r\n   * or if custom friction is defined.\r\n   *\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   * @param {number} potentialPan\r\n   * @param {number=} customFriction (0.1 - 1)\r\n   */\r\n  _setPanWithFriction(axis, potentialPan, customFriction) {\r\n    const { pan, bounds } = this.pswp.currSlide;\r\n    const correctedPan = bounds.correctPan(axis, potentialPan);\r\n    // If we are out of pan bounds\r\n    if (correctedPan !== potentialPan || customFriction) {\r\n      const delta = Math.round(potentialPan - pan[axis]);\r\n      pan[axis] += delta * (customFriction || PAN_END_FRICTION);\r\n    } else {\r\n      pan[axis] = potentialPan;\r\n    }\r\n  }\r\n}\r\n\r\nexport default DragHandler;\r\n", "import {\r\n  equalizePoints, getDistanceBetween, clamp, pointsEqual\r\n} from '../util/util.js';\r\n\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\nconst UPPER_ZOOM_FRICTION = 0.05;\r\nconst LOWER_ZOOM_FRICTION = 0.15;\r\n\r\n\r\n/**\r\n * Get center point between two points\r\n *\r\n * @param {Point} p\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nfunction getZoomPointsCenter(p, p1, p2) {\r\n  p.x = (p1.x + p2.x) / 2;\r\n  p.y = (p1.y + p2.y) / 2;\r\n  return p;\r\n}\r\n\r\nclass ZoomHandler {\r\n  /**\r\n   * @param {Gestures} gestures\r\n   */\r\n  constructor(gestures) {\r\n    this.gestures = gestures;\r\n    this.pswp = this.gestures.pswp;\r\n    /** @type {Point} */\r\n    this._startPan = {};\r\n\r\n    /** @type {Point} */\r\n    this._startZoomPoint = {};\r\n    /** @type {Point} */\r\n    this._zoomPoint = {};\r\n  }\r\n\r\n  start() {\r\n    this._startZoomLevel = this.pswp.currSlide.currZoomLevel;\r\n    equalizePoints(this._startPan, this.pswp.currSlide.pan);\r\n    this.pswp.animations.stopAllPan();\r\n    this._wasOverFitZoomLevel = false;\r\n  }\r\n\r\n  change() {\r\n    const { p1, startP1, p2, startP2, pswp } = this.gestures;\r\n    const { currSlide } = pswp;\r\n    const minZoomLevel = currSlide.zoomLevels.min;\r\n    const maxZoomLevel = currSlide.zoomLevels.max;\r\n\r\n    if (!currSlide.isZoomable() || pswp.mainScroll.isShifted()) {\r\n      return;\r\n    }\r\n\r\n    getZoomPointsCenter(this._startZoomPoint, startP1, startP2);\r\n    getZoomPointsCenter(this._zoomPoint, p1, p2);\r\n\r\n    let currZoomLevel = (1 / getDistanceBetween(startP1, startP2))\r\n                      * getDistanceBetween(p1, p2)\r\n                      * this._startZoomLevel;\r\n\r\n    // slightly over the zoom.fit\r\n    if (currZoomLevel > currSlide.zoomLevels.initial + (currSlide.zoomLevels.initial / 15)) {\r\n      this._wasOverFitZoomLevel = true;\r\n    }\r\n\r\n    if (currZoomLevel < minZoomLevel) {\r\n      if (pswp.options.pinchToClose\r\n          && !this._wasOverFitZoomLevel\r\n          && this._startZoomLevel <= currSlide.zoomLevels.initial) {\r\n        // fade out background if zooming out\r\n        const bgOpacity = 1 - ((minZoomLevel - currZoomLevel) / (minZoomLevel / 1.2));\r\n        if (!pswp.dispatch('pinchClose', { bgOpacity }).defaultPrevented) {\r\n          pswp.applyBgOpacity(bgOpacity);\r\n        }\r\n      } else {\r\n        // Apply the friction if zoom level is below the min\r\n        currZoomLevel = minZoomLevel - (minZoomLevel - currZoomLevel) * LOWER_ZOOM_FRICTION;\r\n      }\r\n    } else if (currZoomLevel > maxZoomLevel) {\r\n      // Apply the friction if zoom level is above the max\r\n      currZoomLevel = maxZoomLevel + (currZoomLevel - maxZoomLevel) * UPPER_ZOOM_FRICTION;\r\n    }\r\n\r\n    currSlide.pan.x = this._calculatePanForZoomLevel('x', currZoomLevel);\r\n    currSlide.pan.y = this._calculatePanForZoomLevel('y', currZoomLevel);\r\n\r\n    currSlide.setZoomLevel(currZoomLevel);\r\n    currSlide.applyCurrentZoomPan();\r\n  }\r\n\r\n  end() {\r\n    const { pswp } = this;\r\n    const { currSlide } = pswp;\r\n    if (currSlide.currZoomLevel < currSlide.zoomLevels.initial\r\n        && !this._wasOverFitZoomLevel\r\n        && pswp.options.pinchToClose) {\r\n      pswp.close();\r\n    } else {\r\n      this.correctZoomPan();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   * @param {number} currZoomLevel\r\n   */\r\n  _calculatePanForZoomLevel(axis, currZoomLevel) {\r\n    const zoomFactor = currZoomLevel / this._startZoomLevel;\r\n    return this._zoomPoint[axis]\r\n            - ((this._startZoomPoint[axis] - this._startPan[axis]) * zoomFactor);\r\n  }\r\n\r\n  /**\r\n   * Correct currZoomLevel and pan if they are\r\n   * beyond minimum or maximum values.\r\n   * With animation.\r\n   *\r\n   * @param {boolean=} ignoreGesture\r\n   * Wether gesture coordinates should be ignored when calculating destination pan position.\r\n   */\r\n  correctZoomPan(ignoreGesture) {\r\n    const { pswp } = this;\r\n    const { currSlide } = pswp;\r\n\r\n    if (!currSlide.isZoomable()) {\r\n      return;\r\n    }\r\n\r\n    if (this._zoomPoint.x === undefined) {\r\n      ignoreGesture = true;\r\n    }\r\n\r\n    const prevZoomLevel = currSlide.currZoomLevel;\r\n\r\n    /** @type {number} */\r\n    let destinationZoomLevel;\r\n    let currZoomLevelNeedsChange = true;\r\n\r\n    if (prevZoomLevel < currSlide.zoomLevels.initial) {\r\n      destinationZoomLevel = currSlide.zoomLevels.initial;\r\n      // zoom to min\r\n    } else if (prevZoomLevel > currSlide.zoomLevels.max) {\r\n      destinationZoomLevel = currSlide.zoomLevels.max;\r\n      // zoom to max\r\n    } else {\r\n      currZoomLevelNeedsChange = false;\r\n      destinationZoomLevel = prevZoomLevel;\r\n    }\r\n\r\n    const initialBgOpacity = pswp.bgOpacity;\r\n    const restoreBgOpacity = pswp.bgOpacity < 1;\r\n\r\n    const initialPan = equalizePoints({}, currSlide.pan);\r\n    let destinationPan = equalizePoints({}, initialPan);\r\n\r\n    if (ignoreGesture) {\r\n      this._zoomPoint.x = 0;\r\n      this._zoomPoint.y = 0;\r\n      this._startZoomPoint.x = 0;\r\n      this._startZoomPoint.y = 0;\r\n      this._startZoomLevel = prevZoomLevel;\r\n      equalizePoints(this._startPan, initialPan);\r\n    }\r\n\r\n    if (currZoomLevelNeedsChange) {\r\n      destinationPan = {\r\n        x: this._calculatePanForZoomLevel('x', destinationZoomLevel),\r\n        y: this._calculatePanForZoomLevel('y', destinationZoomLevel)\r\n      };\r\n    }\r\n\r\n    // set zoom level, so pan bounds are updated according to it\r\n    currSlide.setZoomLevel(destinationZoomLevel);\r\n\r\n    destinationPan = {\r\n      x: currSlide.bounds.correctPan('x', destinationPan.x),\r\n      y: currSlide.bounds.correctPan('y', destinationPan.y)\r\n    };\r\n\r\n    // return zoom level and its bounds to initial\r\n    currSlide.setZoomLevel(prevZoomLevel);\r\n\r\n    let panNeedsChange = true;\r\n    if (pointsEqual(destinationPan, initialPan)) {\r\n      panNeedsChange = false;\r\n    }\r\n\r\n    if (!panNeedsChange && !currZoomLevelNeedsChange && !restoreBgOpacity) {\r\n      // update resolution after gesture\r\n      currSlide._setResolution(destinationZoomLevel);\r\n      currSlide.applyCurrentZoomPan();\r\n\r\n      // nothing to animate\r\n      return;\r\n    }\r\n\r\n    pswp.animations.stopAllPan();\r\n\r\n    pswp.animations.startSpring({\r\n      isPan: true,\r\n      start: 0,\r\n      end: 1000,\r\n      velocity: 0,\r\n      dampingRatio: 1,\r\n      naturalFrequency: 40,\r\n      onUpdate: (now) => {\r\n        now /= 1000; // 0 - start, 1 - end\r\n\r\n        if (panNeedsChange || currZoomLevelNeedsChange) {\r\n          if (panNeedsChange) {\r\n            currSlide.pan.x = initialPan.x + (destinationPan.x - initialPan.x) * now;\r\n            currSlide.pan.y = initialPan.y + (destinationPan.y - initialPan.y) * now;\r\n          }\r\n\r\n          if (currZoomLevelNeedsChange) {\r\n            const newZoomLevel = prevZoomLevel\r\n                        + (destinationZoomLevel - prevZoomLevel) * now;\r\n            currSlide.setZoomLevel(newZoomLevel);\r\n          }\r\n\r\n          currSlide.applyCurrentZoomPan();\r\n        }\r\n\r\n        // Restore background opacity\r\n        if (restoreBgOpacity && pswp.bgOpacity < 1) {\r\n          // We clamp opacity to keep it between 0 and 1.\r\n          // As progress ratio can be larger than 1 due to overshoot,\r\n          // and we do not want to bounce opacity.\r\n          pswp.applyBgOpacity(clamp(\r\n            initialBgOpacity + (1 - initialBgOpacity) * now, 0, 1\r\n          ));\r\n        }\r\n      },\r\n      onComplete: () => {\r\n        // update resolution after transition ends\r\n        currSlide._setResolution(destinationZoomLevel);\r\n        currSlide.applyCurrentZoomPan();\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nexport default ZoomHandler;\r\n", "/**\r\n * @template T\r\n * @template P\r\n * @typedef {import('../types.js').AddPostfix<T, P>} AddPostfix<T, P>\r\n */\r\n\r\n/** @typedef {import('./gestures.js').default} Gestures */\r\n\r\n/** @typedef {'imageClick' | 'bgClick' | 'tap' | 'doubleTap'} Actions */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * Whether the tap was performed on the main slide\r\n * (rather than controls or caption).\r\n *\r\n * @param {PointerEvent} event\r\n */\r\nfunction didTapOnMainContent(event) {\r\n  return !!(/** @type {HTMLElement} */ (event.target).closest('.pswp__container'));\r\n}\r\n\r\n/**\r\n * Tap, double-tap handler.\r\n */\r\nclass TapHandler {\r\n  /**\r\n   * @param {Gestures} gestures\r\n   */\r\n  constructor(gestures) {\r\n    this.gestures = gestures;\r\n  }\r\n\r\n  /**\r\n   * @param {Point} point\r\n   * @param {PointerEvent} originalEvent\r\n   */\r\n  click(point, originalEvent) {\r\n    const targetClassList = /** @type {HTMLElement} */ (originalEvent.target).classList;\r\n    const isImageClick = targetClassList.contains('pswp__img');\r\n    const isBackgroundClick = targetClassList.contains('pswp__item')\r\n                              || targetClassList.contains('pswp__zoom-wrap');\r\n\r\n    if (isImageClick) {\r\n      this._doClickOrTapAction('imageClick', point, originalEvent);\r\n    } else if (isBackgroundClick) {\r\n      this._doClickOrTapAction('bgClick', point, originalEvent);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Point} point\r\n   * @param {PointerEvent} originalEvent\r\n   */\r\n  tap(point, originalEvent) {\r\n    if (didTapOnMainContent(originalEvent)) {\r\n      this._doClickOrTapAction('tap', point, originalEvent);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Point} point\r\n   * @param {PointerEvent} originalEvent\r\n   */\r\n  doubleTap(point, originalEvent) {\r\n    if (didTapOnMainContent(originalEvent)) {\r\n      this._doClickOrTapAction('doubleTap', point, originalEvent);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Actions} actionName\r\n   * @param {Point} point\r\n   * @param {PointerEvent} originalEvent\r\n   */\r\n  _doClickOrTapAction(actionName, point, originalEvent) {\r\n    const { pswp } = this.gestures;\r\n    const { currSlide } = pswp;\r\n    const actionFullName = /** @type {AddPostfix<Actions, 'Action'>} */ (actionName + 'Action');\r\n    const optionValue = pswp.options[actionFullName];\r\n\r\n    if (pswp.dispatch(actionFullName, { point, originalEvent }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (typeof optionValue === 'function') {\r\n      optionValue.call(pswp, point, originalEvent);\r\n      return;\r\n    }\r\n\r\n    switch (optionValue) {\r\n      case 'close':\r\n      case 'next':\r\n        pswp[optionValue]();\r\n        break;\r\n      case 'zoom':\r\n        currSlide.toggleZoom(point);\r\n        break;\r\n      case 'zoom-or-close':\r\n        // by default click zooms current image,\r\n        // if it can not be zoomed - gallery will be closed\r\n        if (currSlide.isZoomable()\r\n            && currSlide.zoomLevels.secondary !== currSlide.zoomLevels.initial) {\r\n          currSlide.toggleZoom(point);\r\n        } else if (pswp.options.clickToCloseNonZoomable) {\r\n          pswp.close();\r\n        }\r\n        break;\r\n      case 'toggle-controls':\r\n        this.gestures.pswp.element.classList.toggle('pswp--ui-visible');\r\n        // if (_controlsVisible) {\r\n        //   _ui.hideControls();\r\n        // } else {\r\n        //   _ui.showControls();\r\n        // }\r\n        break;\r\n    }\r\n  }\r\n}\r\n\r\nexport default TapHandler;\r\n", "import {\r\n  equalizePoints, pointsEqual, getDistanceBetween\r\n} from '../util/util.js';\r\n\r\nimport DragHandler from './drag-handler.js';\r\nimport ZoomHandler from './zoom-handler.js';\r\nimport TapHandler from './tap-handler.js';\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n// How far should user should drag\r\n// until we can determine that the gesture is swipe and its direction\r\nconst AXIS_SWIPE_HYSTERISIS = 10;\r\n//const PAN_END_FRICTION = 0.35;\r\n\r\nconst DOUBLE_TAP_DELAY = 300; // ms\r\nconst MIN_TAP_DISTANCE = 25; // px\r\n\r\n/**\r\n * Gestures class bind touch, pointer or mouse events\r\n * and emits drag to drag-handler and zoom events zoom-handler.\r\n *\r\n * Drag and zoom events are emited in requestAnimationFrame,\r\n * and only when one of pointers was actually changed.\r\n */\r\nclass Gestures {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n\r\n    /** @type {'x' | 'y'} */\r\n    this.dragAxis = undefined;\r\n\r\n    // point objects are defined once and reused\r\n    // PhotoSwipe keeps track only of two pointers, others are ignored\r\n    /** @type {Point} */\r\n    this.p1 = {}; // the first pressed pointer\r\n    /** @type {Point} */\r\n    this.p2 = {}; // the second pressed pointer\r\n    /** @type {Point} */\r\n    this.prevP1 = {};\r\n    /** @type {Point} */\r\n    this.prevP2 = {};\r\n    /** @type {Point} */\r\n    this.startP1 = {};\r\n    /** @type {Point} */\r\n    this.startP2 = {};\r\n    /** @type {Point} */\r\n    this.velocity = {};\r\n\r\n    /** @type {Point} */\r\n    this._lastStartP1 = {};\r\n    /** @type {Point} */\r\n    this._intervalP1 = {};\r\n    this._numActivePoints = 0;\r\n    /** @type {Point[]} */\r\n    this._ongoingPointers = [];\r\n\r\n    this._touchEventEnabled = 'ontouchstart' in window;\r\n    this._pointerEventEnabled = !!(window.PointerEvent);\r\n    this.supportsTouch = this._touchEventEnabled\r\n                          || (this._pointerEventEnabled && navigator.maxTouchPoints > 1);\r\n\r\n    if (!this.supportsTouch) {\r\n      // disable pan to next slide for non-touch devices\r\n      pswp.options.allowPanToNext = false;\r\n    }\r\n\r\n    this.drag = new DragHandler(this);\r\n    this.zoomLevels = new ZoomHandler(this);\r\n    this.tapHandler = new TapHandler(this);\r\n\r\n    pswp.on('bindEvents', () => {\r\n      pswp.events.add(pswp.scrollWrap, 'click', e => this._onClick(e));\r\n\r\n      if (this._pointerEventEnabled) {\r\n        this._bindEvents('pointer', 'down', 'up', 'cancel');\r\n      } else if (this._touchEventEnabled) {\r\n        this._bindEvents('touch', 'start', 'end', 'cancel');\r\n\r\n        // In previous versions we also bound mouse event here,\r\n        // in case device supports both touch and mouse events,\r\n        // but newer versions of browsers now support PointerEvent.\r\n\r\n        // on iOS10 if you bind touchmove/end after touchstart,\r\n        // and you don't preventDefault touchstart (which PhotoSwipe does),\r\n        // preventDefault will have no effect on touchmove and touchend.\r\n        // Unless you bind it previously.\r\n        pswp.scrollWrap.ontouchmove = () => {}; // eslint-disable-line\r\n        pswp.scrollWrap.ontouchend = () => {}; // eslint-disable-line\r\n      } else {\r\n        this._bindEvents('mouse', 'down', 'up');\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   *\r\n   * @param {'mouse' | 'touch' | 'pointer'} pref\r\n   * @param {'down' | 'start'} down\r\n   * @param {'up' | 'end'} up\r\n   * @param {'cancel'} [cancel]\r\n   */\r\n  _bindEvents(pref, down, up, cancel) {\r\n    const { pswp } = this;\r\n    const { events } = pswp;\r\n\r\n    const cancelEvent = cancel ? pref + cancel : '';\r\n\r\n    events.add(pswp.scrollWrap, pref + down, this.onPointerDown.bind(this));\r\n    events.add(window, pref + 'move', this.onPointerMove.bind(this));\r\n    events.add(window, pref + up, this.onPointerUp.bind(this));\r\n    if (cancelEvent) {\r\n      events.add(pswp.scrollWrap, cancelEvent, this.onPointerUp.bind(this));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {PointerEvent} e\r\n   */\r\n  onPointerDown(e) {\r\n    // We do not call preventDefault for touch events\r\n    // to allow browser to show native dialog on longpress\r\n    // (the one that allows to save image or open it in new tab).\r\n    //\r\n    // Desktop Safari allows to drag images when preventDefault isn't called on mousedown,\r\n    // even though preventDefault IS called on mousemove. That's why we preventDefault mousedown.\r\n    let isMousePointer;\r\n    if (e.type === 'mousedown' || e.pointerType === 'mouse') {\r\n      isMousePointer = true;\r\n    }\r\n\r\n    // Allow dragging only via left mouse button.\r\n    // http://www.quirksmode.org/js/events_properties.html\r\n    // https://developer.mozilla.org/en-US/docs/Web/API/event.button\r\n    if (isMousePointer && e.button > 0) {\r\n      return;\r\n    }\r\n\r\n    const { pswp } = this;\r\n\r\n    // if PhotoSwipe is opening or closing\r\n    if (!pswp.opener.isOpen) {\r\n      e.preventDefault();\r\n      return;\r\n    }\r\n\r\n    if (pswp.dispatch('pointerDown', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (isMousePointer) {\r\n      pswp.mouseDetected();\r\n\r\n      // preventDefault mouse event to prevent\r\n      // browser image drag feature\r\n      this._preventPointerEventBehaviour(e);\r\n    }\r\n\r\n    pswp.animations.stopAll();\r\n\r\n    this._updatePoints(e, 'down');\r\n\r\n    this.pointerDown = true;\r\n\r\n    if (this._numActivePoints === 1) {\r\n      this.dragAxis = null;\r\n      // we need to store initial point to determine the main axis,\r\n      // drag is activated only after the axis is determined\r\n      equalizePoints(this.startP1, this.p1);\r\n    }\r\n\r\n    if (this._numActivePoints > 1) {\r\n      // Tap or double tap should not trigger if more than one pointer\r\n      this._clearTapTimer();\r\n      this.isMultitouch = true;\r\n    } else {\r\n      this.isMultitouch = false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {PointerEvent} e\r\n   */\r\n  onPointerMove(e) {\r\n    e.preventDefault(); // always preventDefault move event\r\n\r\n    if (!this._numActivePoints) {\r\n      return;\r\n    }\r\n\r\n    this._updatePoints(e, 'move');\r\n\r\n    if (this.pswp.dispatch('pointerMove', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this._numActivePoints === 1 && !this.isDragging) {\r\n      if (!this.dragAxis) {\r\n        this._calculateDragDirection();\r\n      }\r\n\r\n      // Drag axis was detected, emit drag.start\r\n      if (this.dragAxis && !this.isDragging) {\r\n        if (this.isZooming) {\r\n          this.isZooming = false;\r\n          this.zoomLevels.end();\r\n        }\r\n\r\n        this.isDragging = true;\r\n        this._clearTapTimer(); // Tap can not trigger after drag\r\n\r\n        // Adjust starting point\r\n        this._updateStartPoints();\r\n        this._intervalTime = Date.now();\r\n        //this._startTime = this._intervalTime;\r\n        this._velocityCalculated = false;\r\n        equalizePoints(this._intervalP1, this.p1);\r\n        this.velocity.x = 0;\r\n        this.velocity.y = 0;\r\n        this.drag.start();\r\n\r\n        this._rafStopLoop();\r\n        this._rafRenderLoop();\r\n      }\r\n    } else if (this._numActivePoints > 1 && !this.isZooming) {\r\n      this._finishDrag();\r\n\r\n      this.isZooming = true;\r\n\r\n      // Adjust starting points\r\n      this._updateStartPoints();\r\n\r\n      this.zoomLevels.start();\r\n\r\n      this._rafStopLoop();\r\n      this._rafRenderLoop();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _finishDrag() {\r\n    if (this.isDragging) {\r\n      this.isDragging = false;\r\n\r\n      // Try to calculate velocity,\r\n      // if it wasn't calculated yet in drag.change\r\n      if (!this._velocityCalculated) {\r\n        this._updateVelocity(true);\r\n      }\r\n\r\n      this.drag.end();\r\n      this.dragAxis = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {PointerEvent} e\r\n   */\r\n  onPointerUp(e) {\r\n    if (!this._numActivePoints) {\r\n      return;\r\n    }\r\n\r\n    this._updatePoints(e, 'up');\r\n\r\n    if (this.pswp.dispatch('pointerUp', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this._numActivePoints === 0) {\r\n      this.pointerDown = false;\r\n      this._rafStopLoop();\r\n\r\n      if (this.isDragging) {\r\n        this._finishDrag();\r\n      } else if (!this.isZooming && !this.isMultitouch) {\r\n        //this.zoomLevels.correctZoomPan();\r\n        this._finishTap(e);\r\n      }\r\n    }\r\n\r\n    if (this._numActivePoints < 2 && this.isZooming) {\r\n      this.isZooming = false;\r\n      this.zoomLevels.end();\r\n\r\n      if (this._numActivePoints === 1) {\r\n        // Since we have 1 point left, we need to reinitiate drag\r\n        this.dragAxis = null;\r\n        this._updateStartPoints();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _rafRenderLoop() {\r\n    if (this.isDragging || this.isZooming) {\r\n      this._updateVelocity();\r\n\r\n      if (this.isDragging) {\r\n        // make sure that pointer moved since the last update\r\n        if (!pointsEqual(this.p1, this.prevP1)) {\r\n          this.drag.change();\r\n        }\r\n      } else /* if (this.isZooming) */ {\r\n        if (!pointsEqual(this.p1, this.prevP1)\r\n            || !pointsEqual(this.p2, this.prevP2)) {\r\n          this.zoomLevels.change();\r\n        }\r\n      }\r\n\r\n      this._updatePrevPoints();\r\n      this.raf = requestAnimationFrame(this._rafRenderLoop.bind(this));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update velocity at 50ms interval\r\n   *\r\n   * @param {boolean=} force\r\n   */\r\n  _updateVelocity(force) {\r\n    const time = Date.now();\r\n    const duration = time - this._intervalTime;\r\n\r\n    if (duration < 50 && !force) {\r\n      return;\r\n    }\r\n\r\n\r\n    this.velocity.x = this._getVelocity('x', duration);\r\n    this.velocity.y = this._getVelocity('y', duration);\r\n\r\n    this._intervalTime = time;\r\n    equalizePoints(this._intervalP1, this.p1);\r\n    this._velocityCalculated = true;\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {PointerEvent} e\r\n   */\r\n  _finishTap(e) {\r\n    const { mainScroll } = this.pswp;\r\n\r\n    // Do not trigger tap events if main scroll is shifted\r\n    if (mainScroll.isShifted()) {\r\n      // restore main scroll position\r\n      // (usually happens if stopped in the middle of animation)\r\n      mainScroll.moveIndexBy(0, true);\r\n      return;\r\n    }\r\n\r\n    // Do not trigger tap for touchcancel or pointercancel\r\n    if (e.type.indexOf('cancel') > 0) {\r\n      return;\r\n    }\r\n\r\n    // Trigger click instead of tap for mouse events\r\n    if (e.type === 'mouseup' || e.pointerType === 'mouse') {\r\n      this.tapHandler.click(this.startP1, e);\r\n      return;\r\n    }\r\n\r\n    // Disable delay if there is no doubleTapAction\r\n    const tapDelay = this.pswp.options.doubleTapAction ? DOUBLE_TAP_DELAY : 0;\r\n\r\n    // If tapTimer is defined - we tapped recently,\r\n    // check if the current tap is close to the previous one,\r\n    // if yes - trigger double tap\r\n    if (this._tapTimer) {\r\n      this._clearTapTimer();\r\n      // Check if two taps were more or less on the same place\r\n      if (getDistanceBetween(this._lastStartP1, this.startP1) < MIN_TAP_DISTANCE) {\r\n        this.tapHandler.doubleTap(this.startP1, e);\r\n      }\r\n    } else {\r\n      equalizePoints(this._lastStartP1, this.startP1);\r\n      this._tapTimer = setTimeout(() => {\r\n        this.tapHandler.tap(this.startP1, e);\r\n        this._clearTapTimer();\r\n      }, tapDelay);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _clearTapTimer() {\r\n    if (this._tapTimer) {\r\n      clearTimeout(this._tapTimer);\r\n      this._tapTimer = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get velocity for axis\r\n   *\r\n   * @private\r\n   * @param {'x' | 'y'} axis\r\n   * @param {number} duration\r\n   */\r\n  _getVelocity(axis, duration) {\r\n    // displacement is like distance, but can be negative.\r\n    const displacement = this.p1[axis] - this._intervalP1[axis];\r\n\r\n    if (Math.abs(displacement) > 1 && duration > 5) {\r\n      return displacement / duration;\r\n    }\r\n\r\n    return 0;\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _rafStopLoop() {\r\n    if (this.raf) {\r\n      cancelAnimationFrame(this.raf);\r\n      this.raf = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {PointerEvent} e\r\n   */\r\n  _preventPointerEventBehaviour(e) {\r\n    // TODO find a way to disable e.preventDefault on some elements\r\n    //      via event or some class or something\r\n    e.preventDefault();\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Parses and normalizes points from the touch, mouse or pointer event.\r\n   * Updates p1 and p2.\r\n   *\r\n   * @private\r\n   * @param {PointerEvent | TouchEvent} e\r\n   * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\r\n   */\r\n  _updatePoints(e, pointerType) {\r\n    if (this._pointerEventEnabled) {\r\n      const pointerEvent = /** @type {PointerEvent} */ (e);\r\n      // Try to find the current pointer in ongoing pointers by its ID\r\n      const pointerIndex = this._ongoingPointers.findIndex((ongoingPoiner) => {\r\n        return ongoingPoiner.id === pointerEvent.pointerId;\r\n      });\r\n\r\n      if (pointerType === 'up' && pointerIndex > -1) {\r\n        // release the pointer - remove it from ongoing\r\n        this._ongoingPointers.splice(pointerIndex, 1);\r\n      } else if (pointerType === 'down' && pointerIndex === -1) {\r\n        // add new pointer\r\n        this._ongoingPointers.push(this._convertEventPosToPoint(pointerEvent, {}));\r\n      } else if (pointerIndex > -1) {\r\n        // update existing pointer\r\n        this._convertEventPosToPoint(pointerEvent, this._ongoingPointers[pointerIndex]);\r\n      }\r\n\r\n      this._numActivePoints = this._ongoingPointers.length;\r\n\r\n      // update points that PhotoSwipe uses\r\n      // to calculate position and scale\r\n      if (this._numActivePoints > 0) {\r\n        equalizePoints(this.p1, this._ongoingPointers[0]);\r\n      }\r\n\r\n      if (this._numActivePoints > 1) {\r\n        equalizePoints(this.p2, this._ongoingPointers[1]);\r\n      }\r\n    } else {\r\n      const touchEvent = /** @type {TouchEvent} */ (e);\r\n\r\n      this._numActivePoints = 0;\r\n      if (touchEvent.type.indexOf('touch') > -1) {\r\n        // Touch Event\r\n        // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\r\n        if (touchEvent.touches && touchEvent.touches.length > 0) {\r\n          this._convertEventPosToPoint(touchEvent.touches[0], this.p1);\r\n          this._numActivePoints++;\r\n          if (touchEvent.touches.length > 1) {\r\n            this._convertEventPosToPoint(touchEvent.touches[1], this.p2);\r\n            this._numActivePoints++;\r\n          }\r\n        }\r\n      } else {\r\n        // Mouse Event\r\n        this._convertEventPosToPoint(/** @type {PointerEvent} */ (e), this.p1);\r\n        if (pointerType === 'up') {\r\n          // clear all points on mouseup\r\n          this._numActivePoints = 0;\r\n        } else {\r\n          this._numActivePoints++;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // update points that were used during previous rAF tick\r\n  _updatePrevPoints() {\r\n    equalizePoints(this.prevP1, this.p1);\r\n    equalizePoints(this.prevP2, this.p2);\r\n  }\r\n\r\n  // update points at the start of gesture\r\n  _updateStartPoints() {\r\n    equalizePoints(this.startP1, this.p1);\r\n    equalizePoints(this.startP2, this.p2);\r\n    this._updatePrevPoints();\r\n  }\r\n\r\n  _calculateDragDirection() {\r\n    if (this.pswp.mainScroll.isShifted()) {\r\n      // if main scroll position is shifted \u2013 direction is always horizontal\r\n      this.dragAxis = 'x';\r\n    } else {\r\n      // calculate delta of the last touchmove tick\r\n      const diff = Math.abs(this.p1.x - this.startP1.x) - Math.abs(this.p1.y - this.startP1.y);\r\n\r\n      if (diff !== 0) {\r\n        // check if pointer was shifted horizontally or vertically\r\n        const axisToCheck = diff > 0 ? 'x' : 'y';\r\n\r\n        if (Math.abs(this.p1[axisToCheck] - this.startP1[axisToCheck]) >= AXIS_SWIPE_HYSTERISIS) {\r\n          this.dragAxis = axisToCheck;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Converts touch, pointer or mouse event\r\n   * to PhotoSwipe point.\r\n   *\r\n   * @private\r\n   * @param {Touch | PointerEvent} e\r\n   * @param {Point} p\r\n   */\r\n  _convertEventPosToPoint(e, p) {\r\n    p.x = e.pageX - this.pswp.offset.x;\r\n    p.y = e.pageY - this.pswp.offset.y;\r\n\r\n    if ('pointerId' in e) {\r\n      p.id = e.pointerId;\r\n    } else if (e.identifier !== undefined) {\r\n      p.id = e.identifier;\r\n    }\r\n\r\n    return p;\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {PointerEvent} e\r\n   */\r\n  _onClick(e) {\r\n    // Do not allow click event to pass through after drag\r\n    if (this.pswp.mainScroll.isShifted()) {\r\n      e.preventDefault();\r\n      e.stopPropagation();\r\n    }\r\n  }\r\n}\r\n\r\nexport default Gestures;\r\n", "import {\r\n  setTransform,\r\n  createElement,\r\n} from './util/util.js';\r\n\r\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./slide/slide.js').default} Slide */\r\n\r\n/** @typedef {{ el: HTMLDivElement; slide?: Slide }} ItemHolder */\r\n\r\nconst MAIN_SCROLL_END_FRICTION = 0.35;\r\n\r\n\r\n// const MIN_SWIPE_TRANSITION_DURATION = 250;\r\n// const MAX_SWIPE_TRABSITION_DURATION = 500;\r\n// const DEFAULT_SWIPE_TRANSITION_DURATION = 333;\r\n\r\n/**\r\n * Handles movement of the main scrolling container\r\n * (for example, it repositions when user swipes left or right).\r\n *\r\n * Also stores its state.\r\n */\r\nclass MainScroll {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n    this.x = 0;\r\n\r\n    /** @type {number} */\r\n    this.slideWidth = undefined;\r\n\r\n    /** @type {ItemHolder[]} */\r\n    this.itemHolders = undefined;\r\n\r\n    this.resetPosition();\r\n  }\r\n\r\n  /**\r\n   * Position the scroller and slide containers\r\n   * according to viewport size.\r\n   *\r\n   * @param {boolean=} resizeSlides Whether slides content should resized\r\n   */\r\n  resize(resizeSlides) {\r\n    const { pswp } = this;\r\n    const newSlideWidth = Math.round(\r\n      pswp.viewportSize.x + pswp.viewportSize.x * pswp.options.spacing\r\n    );\r\n    // Mobile browsers might trigger a resize event during a gesture.\r\n    // (due to toolbar appearing or hiding).\r\n    // Avoid re-adjusting main scroll position if width wasn't changed\r\n    const slideWidthChanged = (newSlideWidth !== this.slideWidth);\r\n\r\n    if (slideWidthChanged) {\r\n      this.slideWidth = newSlideWidth;\r\n      this.moveTo(this.getCurrSlideX());\r\n    }\r\n\r\n    this.itemHolders.forEach((itemHolder, index) => {\r\n      if (slideWidthChanged) {\r\n        setTransform(itemHolder.el, (index + this._containerShiftIndex)\r\n                                    * this.slideWidth);\r\n      }\r\n\r\n      if (resizeSlides && itemHolder.slide) {\r\n        itemHolder.slide.resize();\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Reset X position of the main scroller to zero\r\n   */\r\n  resetPosition() {\r\n    // Position on the main scroller (offset)\r\n    // it is independent from slide index\r\n    this._currPositionIndex = 0;\r\n    this._prevPositionIndex = 0;\r\n\r\n    // This will force recalculation of size on next resize()\r\n    this.slideWidth = 0;\r\n\r\n    // _containerShiftIndex*viewportSize will give you amount of transform of the current slide\r\n    this._containerShiftIndex = -1;\r\n  }\r\n\r\n  /**\r\n   * Create and append array of three items\r\n   * that hold data about slides in DOM\r\n   */\r\n  appendHolders() {\r\n    this.itemHolders = [];\r\n\r\n    // append our three slide holders -\r\n    // previous, current, and next\r\n    for (let i = 0; i < 3; i++) {\r\n      const el = createElement('pswp__item', false, this.pswp.container);\r\n\r\n      // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\r\n      el.style.display = (i === 1) ? 'block' : 'none';\r\n\r\n      this.itemHolders.push({\r\n        el,\r\n        //index: -1\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Whether the main scroll can be horizontally swiped to the next or previous slide.\r\n   */\r\n  canBeSwiped() {\r\n    return this.pswp.getNumItems() > 1;\r\n  }\r\n\r\n  /**\r\n   * Move main scroll by X amount of slides.\r\n   * For example:\r\n   *   `-1` will move to the previous slide,\r\n   *    `0` will reset the scroll position of the current slide,\r\n   *    `3` will move three slides forward\r\n   *\r\n   * If loop option is enabled - index will be automatically looped too,\r\n   * (for example `-1` will move to the last slide of the gallery).\r\n   *\r\n   * @param {number} diff\r\n   * @param {boolean=} animate\r\n   * @param {number=} velocityX\r\n   * @returns {boolean} whether index was changed or not\r\n   */\r\n  moveIndexBy(diff, animate, velocityX) {\r\n    const { pswp } = this;\r\n    let newIndex = pswp.potentialIndex + diff;\r\n    const numSlides = pswp.getNumItems();\r\n\r\n    if (pswp.canLoop()) {\r\n      newIndex = pswp.getLoopedIndex(newIndex);\r\n      const distance = (diff + numSlides) % numSlides;\r\n      if (distance <= numSlides / 2) {\r\n        // go forward\r\n        diff = distance;\r\n      } else {\r\n        // go backwards\r\n        diff = distance - numSlides;\r\n      }\r\n    } else {\r\n      if (newIndex < 0) {\r\n        newIndex = 0;\r\n      } else if (newIndex >= numSlides) {\r\n        newIndex = numSlides - 1;\r\n      }\r\n      diff = newIndex - pswp.potentialIndex;\r\n    }\r\n\r\n    pswp.potentialIndex = newIndex;\r\n    this._currPositionIndex -= diff;\r\n\r\n    pswp.animations.stopMainScroll();\r\n\r\n    const destinationX = this.getCurrSlideX();\r\n    if (!animate) {\r\n      this.moveTo(destinationX);\r\n      this.updateCurrItem();\r\n    } else {\r\n      pswp.animations.startSpring({\r\n        isMainScroll: true,\r\n        start: this.x,\r\n        end: destinationX,\r\n        velocity: velocityX || 0,\r\n        naturalFrequency: 30,\r\n        dampingRatio: 1, //0.7,\r\n        onUpdate: (x) => {\r\n          this.moveTo(x);\r\n        },\r\n        onComplete: () => {\r\n          this.updateCurrItem();\r\n          pswp.appendHeavy();\r\n        }\r\n      });\r\n\r\n      let currDiff = pswp.potentialIndex - pswp.currIndex;\r\n      if (pswp.canLoop()) {\r\n        const currDistance = (currDiff + numSlides) % numSlides;\r\n        if (currDistance <= numSlides / 2) {\r\n          // go forward\r\n          currDiff = currDistance;\r\n        } else {\r\n          // go backwards\r\n          currDiff = currDistance - numSlides;\r\n        }\r\n      }\r\n\r\n      // Force-append new slides during transition\r\n      // if difference between slides is more than 1\r\n      if (Math.abs(currDiff) > 1) {\r\n        this.updateCurrItem();\r\n      }\r\n    }\r\n\r\n    if (diff) {\r\n      return true;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * X position of the main scroll for the current slide\r\n   * (ignores position during dragging)\r\n   */\r\n  getCurrSlideX() {\r\n    return this.slideWidth * this._currPositionIndex;\r\n  }\r\n\r\n  /**\r\n   * Whether scroll position is shifted.\r\n   * For example, it will return true if the scroll is being dragged or animated.\r\n   */\r\n  isShifted() {\r\n    return this.x !== this.getCurrSlideX();\r\n  }\r\n\r\n  /**\r\n   * Update slides X positions and set their content\r\n   */\r\n  updateCurrItem() {\r\n    const { pswp } = this;\r\n    const positionDifference = this._prevPositionIndex - this._currPositionIndex;\r\n\r\n    if (!positionDifference) {\r\n      return;\r\n    }\r\n\r\n    this._prevPositionIndex = this._currPositionIndex;\r\n\r\n    pswp.currIndex = pswp.potentialIndex;\r\n\r\n    let diffAbs = Math.abs(positionDifference);\r\n    let tempHolder;\r\n\r\n    if (diffAbs >= 3) {\r\n      this._containerShiftIndex += positionDifference + (positionDifference > 0 ? -3 : 3);\r\n      diffAbs = 3;\r\n    }\r\n\r\n    for (let i = 0; i < diffAbs; i++) {\r\n      if (positionDifference > 0) {\r\n        tempHolder = this.itemHolders.shift();\r\n        this.itemHolders[2] = tempHolder; // move first to last\r\n\r\n        this._containerShiftIndex++;\r\n\r\n        setTransform(tempHolder.el, (this._containerShiftIndex + 2) * this.slideWidth);\r\n\r\n        pswp.setContent(tempHolder, (pswp.currIndex - diffAbs) + i + 2);\r\n      } else {\r\n        tempHolder = this.itemHolders.pop();\r\n        this.itemHolders.unshift(tempHolder); // move last to first\r\n\r\n        this._containerShiftIndex--;\r\n\r\n        setTransform(tempHolder.el, this._containerShiftIndex * this.slideWidth);\r\n\r\n        pswp.setContent(tempHolder, (pswp.currIndex + diffAbs) - i - 2);\r\n      }\r\n    }\r\n\r\n    // Reset transfrom every 50ish navigations in one direction.\r\n    //\r\n    // Otherwise transform will keep growing indefinitely,\r\n    // which might cause issues as browsers have a maximum transform limit.\r\n    // I wasn't able to reach it, but just to be safe.\r\n    // This should not cause noticable lag.\r\n    if (Math.abs(this._containerShiftIndex) > 50 && !this.isShifted()) {\r\n      this.resetPosition();\r\n      this.resize();\r\n    }\r\n\r\n    // Pan transition might be running (and consntantly updating pan position)\r\n    pswp.animations.stopAllPan();\r\n\r\n    this.itemHolders.forEach((itemHolder, i) => {\r\n      if (itemHolder.slide) {\r\n        // Slide in the 2nd holder is always active\r\n        itemHolder.slide.setIsActive(i === 1);\r\n      }\r\n    });\r\n\r\n    pswp.currSlide = this.itemHolders[1].slide;\r\n    pswp.contentLoader.updateLazy(positionDifference);\r\n\r\n    pswp.currSlide.applyCurrentZoomPan();\r\n    pswp.dispatch('change');\r\n  }\r\n\r\n  /**\r\n   * Move the X position of the main scroll container\r\n   *\r\n   * @param {number} x\r\n   * @param {boolean=} dragging\r\n   */\r\n  moveTo(x, dragging) {\r\n    /** @type {number} */\r\n    let newSlideIndexOffset;\r\n    /** @type {number} */\r\n    let delta;\r\n\r\n    if (!this.pswp.canLoop() && dragging) {\r\n      // Apply friction\r\n      newSlideIndexOffset = ((this.slideWidth * this._currPositionIndex) - x) / this.slideWidth;\r\n      newSlideIndexOffset += this.pswp.currIndex;\r\n      delta = Math.round(x - this.x);\r\n\r\n      if ((newSlideIndexOffset < 0 && delta > 0)\r\n          || (newSlideIndexOffset >= this.pswp.getNumItems() - 1 && delta < 0)) {\r\n        x = this.x + (delta * MAIN_SCROLL_END_FRICTION);\r\n      }\r\n    }\r\n\r\n    this.x = x;\r\n    setTransform(this.pswp.container, x);\r\n\r\n    this.pswp.dispatch('moveMainScroll', { x, dragging });\r\n  }\r\n}\r\n\r\nexport default MainScroll;\r\n", "import { specialKeyUsed } from './util/util.js';\r\n\r\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Methods<T>} Methods<T>\r\n */\r\n\r\n/**\r\n * - Manages keyboard shortcuts.\r\n * - Heps trap focus within photoswipe.\r\n */\r\nclass Keyboard {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n\r\n    pswp.on('bindEvents', () => {\r\n      // Dialog was likely opened by keyboard if initial point is not defined\r\n      if (!pswp.options.initialPointerPos) {\r\n        // focus causes layout,\r\n        // which causes lag during the animation,\r\n        // that's why we delay it until the opener transition ends\r\n        this._focusRoot();\r\n      }\r\n\r\n      pswp.events.add(document, 'focusin', this._onFocusIn.bind(this));\r\n      pswp.events.add(document, 'keydown', this._onKeyDown.bind(this));\r\n    });\r\n\r\n    const lastActiveElement = /** @type {HTMLElement} */ (document.activeElement);\r\n    pswp.on('destroy', () => {\r\n      if (pswp.options.returnFocus\r\n          && lastActiveElement\r\n          && this._wasFocused) {\r\n        lastActiveElement.focus();\r\n      }\r\n    });\r\n  }\r\n\r\n  _focusRoot() {\r\n    if (!this._wasFocused) {\r\n      this.pswp.element.focus();\r\n      this._wasFocused = true;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {KeyboardEvent} e\r\n   */\r\n  _onKeyDown(e) {\r\n    const { pswp } = this;\r\n\r\n    if (pswp.dispatch('keydown', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (specialKeyUsed(e)) {\r\n      // don't do anything if special key pressed\r\n      // to prevent from overriding default browser actions\r\n      // for example, in Chrome on Mac cmd+arrow-left returns to previous page\r\n      return;\r\n    }\r\n\r\n    /** @type {Methods<PhotoSwipe>} */\r\n    let keydownAction;\r\n    /** @type {'x' | 'y'} */\r\n    let axis;\r\n    let isForward;\r\n\r\n    switch (e.keyCode) {\r\n      case 27: // esc\r\n        if (pswp.options.escKey) {\r\n          keydownAction = 'close';\r\n        }\r\n        break;\r\n      case 90: // z key\r\n        keydownAction = 'toggleZoom';\r\n        break;\r\n      case 37: // left\r\n        axis = 'x';\r\n        break;\r\n      case 38: // top\r\n        axis = 'y';\r\n        break;\r\n      case 39: // right\r\n        axis = 'x';\r\n        isForward = true;\r\n        break;\r\n      case 40: // bottom\r\n        isForward = true;\r\n        axis = 'y';\r\n        break;\r\n      case 9: // tab\r\n        this._focusRoot();\r\n        break;\r\n      default:\r\n    }\r\n\r\n    // if left/right/top/bottom key\r\n    if (axis) {\r\n      // prevent page scroll\r\n      e.preventDefault();\r\n\r\n      const { currSlide } = pswp;\r\n\r\n      if (pswp.options.arrowKeys\r\n          && axis === 'x'\r\n          && pswp.getNumItems() > 1) {\r\n        keydownAction = isForward ? 'next' : 'prev';\r\n      } else if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.fit) {\r\n        // up/down arrow keys pan the image vertically\r\n        // left/right arrow keys pan horizontally.\r\n        // Unless there is only one image,\r\n        // or arrowKeys option is disabled\r\n        currSlide.pan[axis] += isForward ? -80 : 80;\r\n        currSlide.panTo(currSlide.pan.x, currSlide.pan.y);\r\n      }\r\n    }\r\n\r\n    if (keydownAction) {\r\n      e.preventDefault();\r\n      pswp[keydownAction]();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Trap focus inside photoswipe\r\n   *\r\n   * @param {FocusEvent} e\r\n   */\r\n  _onFocusIn(e) {\r\n    const { template } = this.pswp;\r\n    if (document !== e.target\r\n        && template !== e.target\r\n        && !template.contains(/** @type {Node} */ (e.target))) {\r\n      // focus root element\r\n      template.focus();\r\n    }\r\n  }\r\n}\r\n\r\nexport default Keyboard;\r\n", "import { setTransitionStyle, removeTransitionStyle } from './util.js';\r\n\r\nconst DEFAULT_EASING = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/** @typedef {import('./animations.js').AnimationProps} AnimationProps */\r\n\r\n/**\r\n * Runs CSS transition.\r\n */\r\nclass CSSAnimation {\r\n  /**\r\n   * onComplete can be unpredictable, be careful about current state\r\n   *\r\n   * @param {AnimationProps} props\r\n   */\r\n  constructor(props) {\r\n    this.props = props;\r\n    const {\r\n      target,\r\n      onComplete,\r\n      transform,\r\n      onFinish\r\n      // opacity\r\n    } = props;\r\n\r\n    let {\r\n      duration,\r\n      easing,\r\n    } = props;\r\n\r\n    /** @type {() => void} */\r\n    this.onFinish = onFinish;\r\n\r\n    // support only transform and opacity\r\n    const prop = transform ? 'transform' : 'opacity';\r\n    const propValue = props[prop];\r\n\r\n    /** @private */\r\n    this._target = target;\r\n    /** @private */\r\n    this._onComplete = onComplete;\r\n\r\n    duration = duration || 333;\r\n    easing = easing || DEFAULT_EASING;\r\n\r\n    /** @private */\r\n    this._onTransitionEnd = this._onTransitionEnd.bind(this);\r\n\r\n    // Using timeout hack to make sure that animation\r\n    // starts even if the animated property was changed recently,\r\n    // otherwise transitionend might not fire or transiton won't start.\r\n    // https://drafts.csswg.org/css-transitions/#starting\r\n    //\r\n    // \u00AF\\_(\u30C4)_/\u00AF\r\n    /** @private */\r\n    this._firstFrameTimeout = setTimeout(() => {\r\n      setTransitionStyle(target, prop, duration, easing);\r\n      this._firstFrameTimeout = setTimeout(() => {\r\n        target.addEventListener('transitionend', this._onTransitionEnd, false);\r\n        target.addEventListener('transitioncancel', this._onTransitionEnd, false);\r\n        target.style[prop] = propValue;\r\n      }, 30); // Do not reduce this number\r\n    }, 0);\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {TransitionEvent} e\r\n   */\r\n  _onTransitionEnd(e) {\r\n    if (e.target === this._target) {\r\n      this._finalizeAnimation();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   */\r\n  _finalizeAnimation() {\r\n    if (!this._finished) {\r\n      this._finished = true;\r\n      this.onFinish();\r\n      if (this._onComplete) {\r\n        this._onComplete();\r\n      }\r\n    }\r\n  }\r\n\r\n  // Destroy is called automatically onFinish\r\n  destroy() {\r\n    if (this._firstFrameTimeout) {\r\n      clearTimeout(this._firstFrameTimeout);\r\n    }\r\n    removeTransitionStyle(this._target);\r\n    this._target.removeEventListener('transitionend', this._onTransitionEnd, false);\r\n    this._target.removeEventListener('transitioncancel', this._onTransitionEnd, false);\r\n    if (!this._finished) {\r\n      this._finalizeAnimation();\r\n    }\r\n  }\r\n}\r\n\r\nexport default CSSAnimation;\r\n", "const DEFAULT_NATURAL_FREQUENCY = 12;\r\nconst DEFAULT_DAMPING_RATIO = 0.75;\r\n\r\n/**\r\n * Spring easing helper\r\n */\r\nclass SpringEaser {\r\n  /**\r\n   * @param {number} initialVelocity Initial velocity, px per ms.\r\n   *\r\n   * @param {number} dampingRatio\r\n   * Determines how bouncy animation will be.\r\n   * From 0 to 1, 0 - always overshoot, 1 - do not overshoot.\r\n   * \"overshoot\" refers to part of animation that\r\n   * goes beyond the final value.\r\n   *\r\n   * @param {number} naturalFrequency\r\n   * Determines how fast animation will slow down.\r\n   * The higher value - the stiffer the transition will be,\r\n   * and the faster it will slow down.\r\n   * Recommended value from 10 to 50\r\n   */\r\n  constructor(initialVelocity, dampingRatio, naturalFrequency) {\r\n    this.velocity = initialVelocity * 1000; // convert to \"pixels per second\"\r\n\r\n    // https://en.wikipedia.org/wiki/Damping_ratio\r\n    this._dampingRatio = dampingRatio || DEFAULT_DAMPING_RATIO;\r\n\r\n    // https://en.wikipedia.org/wiki/Natural_frequency\r\n    this._naturalFrequency = naturalFrequency || DEFAULT_NATURAL_FREQUENCY;\r\n\r\n    if (this._dampingRatio < 1) {\r\n      this._dampedFrequency = this._naturalFrequency\r\n                         * Math.sqrt(1 - this._dampingRatio * this._dampingRatio);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {number} deltaPosition Difference between current and end position of the animation\r\n   * @param {number} deltaTime Frame duration in milliseconds\r\n   *\r\n   * @returns {number} Displacement, relative to the end position.\r\n   */\r\n  easeFrame(deltaPosition, deltaTime) {\r\n    // Inspired by Apple Webkit and Android spring function implementation\r\n    // https://en.wikipedia.org/wiki/Oscillation\r\n    // https://en.wikipedia.org/wiki/Damping_ratio\r\n    // we ignore mass (assume that it's 1kg)\r\n\r\n    let displacement = 0;\r\n    let coeff;\r\n\r\n    deltaTime /= 1000;\r\n\r\n    const naturalDumpingPow = Math.E ** (-this._dampingRatio * this._naturalFrequency * deltaTime);\r\n\r\n    if (this._dampingRatio === 1) {\r\n      coeff = this.velocity + this._naturalFrequency * deltaPosition;\r\n\r\n      displacement = (deltaPosition + coeff * deltaTime) * naturalDumpingPow;\r\n\r\n      this.velocity = displacement\r\n                        * (-this._naturalFrequency) + coeff\r\n                        * naturalDumpingPow;\r\n    } else if (this._dampingRatio < 1) {\r\n      coeff = (1 / this._dampedFrequency)\r\n                * (this._dampingRatio * this._naturalFrequency * deltaPosition + this.velocity);\r\n\r\n      const dumpedFCos = Math.cos(this._dampedFrequency * deltaTime);\r\n      const dumpedFSin = Math.sin(this._dampedFrequency * deltaTime);\r\n\r\n      displacement = naturalDumpingPow\r\n                       * (deltaPosition * dumpedFCos + coeff * dumpedFSin);\r\n\r\n      this.velocity = displacement\r\n                        * (-this._naturalFrequency)\r\n                        * this._dampingRatio\r\n                        + naturalDumpingPow\r\n                        * (-this._dampedFrequency * deltaPosition * dumpedFSin\r\n                        + this._dampedFrequency * coeff * dumpedFCos);\r\n    }\r\n\r\n    // Overdamped (>1) damping ratio is not supported\r\n\r\n    return displacement;\r\n  }\r\n}\r\n\r\nexport default SpringEaser;\r\n", "import SpringEaser from './spring-easer.js';\r\n\r\n/** @typedef {import('./animations.js').AnimationProps} AnimationProps */\r\n\r\nclass SpringAnimation {\r\n  /**\r\n   * @param {AnimationProps} props\r\n   */\r\n  constructor(props) {\r\n    this.props = props;\r\n\r\n    const {\r\n      start,\r\n      end,\r\n      velocity,\r\n      onUpdate,\r\n      onComplete,\r\n      onFinish,\r\n      dampingRatio,\r\n      naturalFrequency\r\n    } = props;\r\n\r\n    /** @type {() => void} */\r\n    this.onFinish = onFinish;\r\n\r\n    const easer = new SpringEaser(velocity, dampingRatio, naturalFrequency);\r\n    let prevTime = Date.now();\r\n    let deltaPosition = start - end;\r\n\r\n    const animationLoop = () => {\r\n      if (this._raf) {\r\n        deltaPosition = easer.easeFrame(deltaPosition, Date.now() - prevTime);\r\n\r\n        // Stop the animation if velocity is low and position is close to end\r\n        if (Math.abs(deltaPosition) < 1 && Math.abs(easer.velocity) < 50) {\r\n          // Finalize the animation\r\n          onUpdate(end);\r\n          if (onComplete) {\r\n            onComplete();\r\n          }\r\n          this.onFinish();\r\n        } else {\r\n          prevTime = Date.now();\r\n          onUpdate(deltaPosition + end);\r\n          this._raf = requestAnimationFrame(animationLoop);\r\n        }\r\n      }\r\n    };\r\n\r\n    this._raf = requestAnimationFrame(animationLoop);\r\n  }\r\n\r\n  // Destroy is called automatically onFinish\r\n  destroy() {\r\n    if (this._raf >= 0) {\r\n      cancelAnimationFrame(this._raf);\r\n    }\r\n    this._raf = null;\r\n  }\r\n}\r\n\r\nexport default SpringAnimation;\r\n", "import CSSAnimation from './css-animation.js';\r\nimport SpringAnimation from './spring-animation.js';\r\n\r\n/** @typedef {SpringAnimation | CSSAnimation} Animation */\r\n\r\n/**\r\n * @typedef {Object} AnimationProps\r\n *\r\n * @prop {HTMLElement=} target\r\n *\r\n * @prop {string=} name\r\n *\r\n * @prop {number=} start\r\n * @prop {number=} end\r\n * @prop {number=} duration\r\n * @prop {number=} velocity\r\n * @prop {number=} dampingRatio\r\n * @prop {number=} naturalFrequency\r\n *\r\n * @prop {(end: number) => void} [onUpdate]\r\n * @prop {() => void} [onComplete]\r\n * @prop {() => void} [onFinish]\r\n *\r\n * @prop {string=} transform\r\n * @prop {string=} opacity\r\n * @prop {string=} easing\r\n *\r\n * @prop {boolean=} isPan\r\n * @prop {boolean=} isMainScroll\r\n */\r\n\r\n/**\r\n * Manages animations\r\n */\r\nclass Animations {\r\n  constructor() {\r\n    /** @type {Animation[]} */\r\n    this.activeAnimations = [];\r\n  }\r\n\r\n  /**\r\n   * @param {AnimationProps} props\r\n   */\r\n  startSpring(props) {\r\n    this._start(props, true);\r\n  }\r\n\r\n  /**\r\n   * @param {AnimationProps} props\r\n   */\r\n  startTransition(props) {\r\n    this._start(props);\r\n  }\r\n\r\n  /**\r\n   * @param {AnimationProps} props\r\n   * @param {boolean=} isSpring\r\n   */\r\n  _start(props, isSpring) {\r\n    /** @type {Animation} */\r\n    let animation;\r\n    if (isSpring) {\r\n      animation = new SpringAnimation(props);\r\n    } else {\r\n      animation = new CSSAnimation(props);\r\n    }\r\n\r\n    this.activeAnimations.push(animation);\r\n    animation.onFinish = () => this.stop(animation);\r\n\r\n    return animation;\r\n  }\r\n\r\n  /**\r\n   * @param {Animation} animation\r\n   */\r\n  stop(animation) {\r\n    animation.destroy();\r\n    const index = this.activeAnimations.indexOf(animation);\r\n    if (index > -1) {\r\n      this.activeAnimations.splice(index, 1);\r\n    }\r\n  }\r\n\r\n  stopAll() { // _stopAllAnimations\r\n    this.activeAnimations.forEach((animation) => {\r\n      animation.destroy();\r\n    });\r\n    this.activeAnimations = [];\r\n  }\r\n\r\n  /**\r\n   * Stop all pan or zoom transitions\r\n   */\r\n  stopAllPan() {\r\n    this.activeAnimations = this.activeAnimations.filter((animation) => {\r\n      if (animation.props.isPan) {\r\n        animation.destroy();\r\n        return false;\r\n      }\r\n\r\n      return true;\r\n    });\r\n  }\r\n\r\n  stopMainScroll() {\r\n    this.activeAnimations = this.activeAnimations.filter((animation) => {\r\n      if (animation.props.isMainScroll) {\r\n        animation.destroy();\r\n        return false;\r\n      }\r\n\r\n      return true;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Returns true if main scroll transition is running\r\n   */\r\n  // isMainScrollRunning() {\r\n  //   return this.activeAnimations.some((animation) => {\r\n  //     return animation.props.isMainScroll;\r\n  //   });\r\n  // }\r\n\r\n  /**\r\n   * Returns true if any pan or zoom transition is running\r\n   */\r\n  isPanRunning() {\r\n    return this.activeAnimations.some((animation) => {\r\n      return animation.props.isPan;\r\n    });\r\n  }\r\n}\r\n\r\nexport default Animations;\r\n", "/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * Handles scroll wheel.\r\n * Can pan and zoom current slide image.\r\n */\r\nclass ScrollWheel {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n    pswp.events.add(pswp.element, 'wheel', this._onWheel.bind(this));\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {WheelEvent} e\r\n   */\r\n  _onWheel(e) {\r\n    e.preventDefault();\r\n    const { currSlide } = this.pswp;\r\n    let { deltaX, deltaY } = e;\r\n\r\n    if (!currSlide) {\r\n      return;\r\n    }\r\n\r\n    if (this.pswp.dispatch('wheel', { originalEvent: e }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (e.ctrlKey || this.pswp.options.wheelToZoom) {\r\n      // zoom\r\n      if (currSlide.isZoomable()) {\r\n        let zoomFactor = -deltaY;\r\n        if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {\r\n          zoomFactor *= 0.05;\r\n        } else {\r\n          zoomFactor *= e.deltaMode ? 1 : 0.002;\r\n        }\r\n        zoomFactor = 2 ** zoomFactor;\r\n\r\n        const destZoomLevel = currSlide.currZoomLevel * zoomFactor;\r\n        currSlide.zoomTo(destZoomLevel, {\r\n          x: e.clientX,\r\n          y: e.clientY\r\n        });\r\n      }\r\n    } else {\r\n      // pan\r\n      if (currSlide.isPannable()) {\r\n        if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {\r\n          // 18 - average line height\r\n          deltaX *= 18;\r\n          deltaY *= 18;\r\n        }\r\n\r\n        currSlide.panTo(\r\n          currSlide.pan.x - deltaX,\r\n          currSlide.pan.y - deltaY\r\n        );\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nexport default ScrollWheel;\r\n", "import { createElement } from '../util/util.js';\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Methods<T>} Methods<T>\r\n */\r\n\r\n/**\r\n * @typedef {Object} UIElementMarkupProps\r\n * @prop {boolean=} isCustomSVG\r\n * @prop {string} inner\r\n * @prop {string=} outlineID\r\n * @prop {number | string} [size]\r\n */\r\n\r\n/**\r\n * @typedef {Object} UIElementData\r\n * @prop {DefaultUIElements | string} [name]\r\n * @prop {string=} className\r\n * @prop {UIElementMarkup=} html\r\n * @prop {boolean=} isButton\r\n * @prop {keyof HTMLElementTagNameMap} [tagName]\r\n * @prop {string=} title\r\n * @prop {string=} ariaLabel\r\n * @prop {(element: HTMLElement, pswp: PhotoSwipe) => void} [onInit]\r\n * @prop {Methods<PhotoSwipe> | ((e: MouseEvent, element: HTMLElement, pswp: PhotoSwipe) => void)} [onClick]\r\n * @prop {'bar' | 'wrapper' | 'root'} [appendTo]\r\n * @prop {number=} order\r\n */\r\n\r\n/** @typedef {'arrowPrev' | 'arrowNext' | 'close' | 'zoom' | 'counter'} DefaultUIElements */\r\n\r\n/** @typedef {string | UIElementMarkupProps} UIElementMarkup */\r\n\r\n/**\r\n * @param {UIElementMarkup} [htmlData]\r\n */\r\nfunction addElementHTML(htmlData) {\r\n  if (typeof htmlData === 'string') {\r\n    // Allow developers to provide full svg,\r\n    // For example:\r\n    // <svg viewBox=\"0 0 32 32\" width=\"32\" height=\"32\" aria-hidden=\"true\" class=\"pswp__icn\">\r\n    //   <path d=\"...\" />\r\n    //   <circle ... />\r\n    // </svg>\r\n    // Can also be any HTML string.\r\n    return htmlData;\r\n  }\r\n\r\n  if (!htmlData || !htmlData.isCustomSVG) {\r\n    return '';\r\n  }\r\n\r\n  const svgData = htmlData;\r\n  let out = '<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">';\r\n  // replace all %d with size\r\n  out = out.split('%d').join(/** @type {string} */ (svgData.size || 32));\r\n\r\n  // Icons may contain outline/shadow,\r\n  // to make it we \"clone\" base icon shape and add border to it.\r\n  // Icon itself and border are styled via CSS.\r\n  //\r\n  // Property shadowID defines ID of element that should be cloned.\r\n  if (svgData.outlineID) {\r\n    out += '<use class=\"pswp__icn-shadow\" xlink:href=\"#' + svgData.outlineID + '\"/>';\r\n  }\r\n\r\n  out += svgData.inner;\r\n\r\n  out += '</svg>';\r\n\r\n  return out;\r\n}\r\n\r\nclass UIElement {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   * @param {UIElementData} data\r\n   */\r\n  constructor(pswp, data) {\r\n    const name = data.name || data.className;\r\n    let elementHTML = data.html;\r\n\r\n    // @ts-expect-error lookup only by `data.name` maybe?\r\n    if (pswp.options[name] === false) {\r\n      // exit if element is disabled from options\r\n      return;\r\n    }\r\n\r\n    // Allow to override SVG icons from options\r\n    // @ts-expect-error lookup only by `data.name` maybe?\r\n    if (typeof pswp.options[name + 'SVG'] === 'string') {\r\n      // arrowPrevSVG\r\n      // arrowNextSVG\r\n      // closeSVG\r\n      // zoomSVG\r\n      // @ts-expect-error lookup only by `data.name` maybe?\r\n      elementHTML = pswp.options[name + 'SVG'];\r\n    }\r\n\r\n    pswp.dispatch('uiElementCreate', { data });\r\n\r\n    let className = '';\r\n    if (data.isButton) {\r\n      className += 'pswp__button ';\r\n      className += (data.className || `pswp__button--${data.name}`);\r\n    } else {\r\n      className += (data.className || `pswp__${data.name}`);\r\n    }\r\n\r\n    /** @type {HTMLElement} */\r\n    let element;\r\n    let tagName = data.isButton ? (data.tagName || 'button') : (data.tagName || 'div');\r\n    tagName = /** @type {keyof HTMLElementTagNameMap} */ (tagName.toLowerCase());\r\n    element = createElement(className, tagName);\r\n\r\n    if (data.isButton) {\r\n      // create button element\r\n      element = createElement(className, tagName);\r\n      if (tagName === 'button') {\r\n        /** @type {HTMLButtonElement} */ (element).type = 'button';\r\n      }\r\n\r\n      let { title } = data;\r\n      const { ariaLabel } = data;\r\n\r\n      // @ts-expect-error lookup only by `data.name` maybe?\r\n      if (typeof pswp.options[name + 'Title'] === 'string') {\r\n        // @ts-expect-error lookup only by `data.name` maybe?\r\n        title = pswp.options[name + 'Title'];\r\n      }\r\n\r\n      if (title) {\r\n        element.title = title;\r\n      }\r\n\r\n      if (ariaLabel || title) {\r\n        /** @type {HTMLElement} */ (element).setAttribute('aria-label', ariaLabel || title);\r\n      }\r\n    }\r\n\r\n    element.innerHTML = addElementHTML(elementHTML);\r\n\r\n    if (data.onInit) {\r\n      data.onInit(element, pswp);\r\n    }\r\n\r\n    if (data.onClick) {\r\n      element.onclick = (e) => {\r\n        if (typeof data.onClick === 'string') {\r\n          pswp[data.onClick]();\r\n        } else {\r\n          data.onClick(e, element, pswp);\r\n        }\r\n      };\r\n    }\r\n\r\n    // Top bar is default position\r\n    const appendTo = data.appendTo || 'bar';\r\n    let container;\r\n    if (appendTo === 'bar') {\r\n      if (!pswp.topBar) {\r\n        pswp.topBar = createElement('pswp__top-bar pswp__hide-on-close', 'div', pswp.scrollWrap);\r\n      }\r\n      container = pswp.topBar;\r\n    } else {\r\n      // element outside of top bar gets a secondary class\r\n      // that makes element fade out on close\r\n      element.classList.add('pswp__hide-on-close');\r\n\r\n      if (appendTo === 'wrapper') {\r\n        container = pswp.scrollWrap;\r\n      } else {\r\n        // root element\r\n        container = pswp.element;\r\n      }\r\n    }\r\n\r\n    container.appendChild(pswp.applyFilters('uiElement', element, data));\r\n  }\r\n}\r\n\r\nexport default UIElement;\r\n", "/*\r\n  Backward and forward arrow buttons\r\n */\r\n\r\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/**\r\n *\r\n * @param {HTMLElement} element\r\n * @param {PhotoSwipe} pswp\r\n * @param {boolean=} isNextButton\r\n */\r\nfunction initArrowButton(element, pswp, isNextButton) {\r\n  element.classList.add('pswp__button--arrow');\r\n  pswp.on('change', () => {\r\n    if (!pswp.options.loop) {\r\n      if (isNextButton) {\r\n        /** @type {HTMLButtonElement} */\r\n        (element).disabled = !(pswp.currIndex < pswp.getNumItems() - 1);\r\n      } else {\r\n        /** @type {HTMLButtonElement} */\r\n        (element).disabled = !(pswp.currIndex > 0);\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n/** @type {UIElementData} */\r\nexport const arrowPrev = {\r\n  name: 'arrowPrev',\r\n  className: 'pswp__button--arrow--prev',\r\n  title: 'Previous',\r\n  order: 10,\r\n  isButton: true,\r\n  appendTo: 'wrapper',\r\n  html: {\r\n    isCustomSVG: true,\r\n    size: 60,\r\n    inner: '<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',\r\n    outlineID: 'pswp__icn-arrow'\r\n  },\r\n  onClick: 'prev',\r\n  onInit: initArrowButton\r\n};\r\n\r\n/** @type {UIElementData} */\r\nexport const arrowNext = {\r\n  name: 'arrowNext',\r\n  className: 'pswp__button--arrow--next',\r\n  title: 'Next',\r\n  order: 11,\r\n  isButton: true,\r\n  appendTo: 'wrapper',\r\n  html: {\r\n    isCustomSVG: true,\r\n    size: 60,\r\n    inner: '<use xlink:href=\"#pswp__icn-arrow\"/>',\r\n    outlineID: 'pswp__icn-arrow'\r\n  },\r\n  onClick: 'next',\r\n  onInit: (el, pswp) => {\r\n    initArrowButton(el, pswp, true);\r\n  }\r\n};\r\n", "/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst closeButton = {\r\n  name: 'close',\r\n  title: 'Close',\r\n  order: 20,\r\n  isButton: true,\r\n  html: {\r\n    isCustomSVG: true,\r\n    inner: '<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',\r\n    outlineID: 'pswp__icn-close'\r\n  },\r\n  onClick: 'close'\r\n};\r\n\r\nexport default closeButton;\r\n", "/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nconst zoomButton = {\r\n  name: 'zoom',\r\n  title: 'Zoom',\r\n  order: 10,\r\n  isButton: true,\r\n  html: {\r\n    isCustomSVG: true,\r\n    // eslint-disable-next-line max-len\r\n    inner: '<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/>'\r\n          + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/>'\r\n          + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',\r\n    outlineID: 'pswp__icn-zoom'\r\n  },\r\n  onClick: 'toggleZoom'\r\n};\r\n\r\nexport default zoomButton;\r\n", "/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nexport const loadingIndicator = {\r\n  name: 'preloader',\r\n  appendTo: 'bar',\r\n  order: 7,\r\n  html: {\r\n    isCustomSVG: true,\r\n    // eslint-disable-next-line max-len\r\n    inner: '<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',\r\n    outlineID: 'pswp__icn-loading'\r\n  },\r\n  onInit: (indicatorElement, pswp) => {\r\n    /** @type {boolean} */\r\n    let isVisible;\r\n    /** @type {NodeJS.Timeout} */\r\n    let delayTimeout;\r\n\r\n    /**\r\n     * @param {string} className\r\n     * @param {boolean} add\r\n     */\r\n    const toggleIndicatorClass = (className, add) => {\r\n      indicatorElement.classList[add ? 'add' : 'remove']('pswp__preloader--' + className);\r\n    };\r\n\r\n    /**\r\n     * @param {boolean} visible\r\n     */\r\n    const setIndicatorVisibility = (visible) => {\r\n      if (isVisible !== visible) {\r\n        isVisible = visible;\r\n        toggleIndicatorClass('active', visible);\r\n      }\r\n    };\r\n\r\n    const updatePreloaderVisibility = () => {\r\n      if (!pswp.currSlide.content.isLoading()) {\r\n        setIndicatorVisibility(false);\r\n        if (delayTimeout) {\r\n          clearTimeout(delayTimeout);\r\n          delayTimeout = null;\r\n        }\r\n        return;\r\n      }\r\n\r\n      if (!delayTimeout) {\r\n        // display loading indicator with delay\r\n        delayTimeout = setTimeout(() => {\r\n          setIndicatorVisibility(pswp.currSlide.content.isLoading());\r\n          delayTimeout = null;\r\n        }, pswp.options.preloaderDelay);\r\n      }\r\n    };\r\n\r\n    pswp.on('change', updatePreloaderVisibility);\r\n\r\n    pswp.on('loadComplete', (e) => {\r\n      if (pswp.currSlide === e.slide) {\r\n        updatePreloaderVisibility();\r\n      }\r\n    });\r\n\r\n    // expose the method\r\n    pswp.ui.updatePreloaderVisibility = updatePreloaderVisibility;\r\n  }\r\n};\r\n", "/** @type {import('./ui-element.js').UIElementData} UIElementData */\r\nexport const counterIndicator = {\r\n  name: 'counter',\r\n  order: 5,\r\n  onInit: (counterElement, pswp) => {\r\n    pswp.on('change', () => {\r\n      counterElement.innerText = (pswp.currIndex + 1)\r\n                                  + pswp.options.indexIndicatorSep\r\n                                  + pswp.getNumItems();\r\n    });\r\n  }\r\n};\r\n", "import UIElement from './ui-element.js';\r\nimport { arrowPrev, arrowNext } from './button-arrow.js';\r\nimport closeButton from './button-close.js';\r\nimport zoomButton from './button-zoom.js';\r\nimport { loadingIndicator } from './loading-indicator.js';\r\nimport { counterIndicator } from './counter-indicator.js';\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\r\n\r\n/**\r\n * Set special class on element when image is zoomed.\r\n *\r\n * By default it is used to adjust\r\n * zoom icon and zoom cursor via CSS.\r\n *\r\n * @param {HTMLElement} el\r\n * @param {boolean} isZoomedIn\r\n */\r\nfunction setZoomedIn(el, isZoomedIn) {\r\n  el.classList[isZoomedIn ? 'add' : 'remove']('pswp--zoomed-in');\r\n}\r\n\r\nclass UI {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n\r\n    /** @type {() => void} */\r\n    this.updatePreloaderVisibility = undefined;\r\n\r\n    /** @type {number} */\r\n    this._lastUpdatedZoomLevel = undefined;\r\n  }\r\n\r\n  init() {\r\n    const { pswp } = this;\r\n    this.isRegistered = false;\r\n    /** @type {UIElementData[]} */\r\n    this.uiElementsData = [\r\n      closeButton,\r\n      arrowPrev,\r\n      arrowNext,\r\n      zoomButton,\r\n      loadingIndicator,\r\n      counterIndicator\r\n    ];\r\n\r\n    pswp.dispatch('uiRegister');\r\n\r\n    // sort by order\r\n    this.uiElementsData.sort((a, b) => {\r\n      // default order is 0\r\n      return (a.order || 0) - (b.order || 0);\r\n    });\r\n\r\n    /** @type {(UIElement | UIElementData)[]} */\r\n    this.items = [];\r\n\r\n    this.isRegistered = true;\r\n    this.uiElementsData.forEach((uiElementData) => {\r\n      this.registerElement(uiElementData);\r\n    });\r\n\r\n    pswp.on('change', () => {\r\n      pswp.element.classList[pswp.getNumItems() === 1 ? 'add' : 'remove']('pswp--one-slide');\r\n    });\r\n\r\n    pswp.on('zoomPanUpdate', () => this._onZoomPanUpdate());\r\n  }\r\n\r\n  /**\r\n   * @param {UIElementData} elementData\r\n   */\r\n  registerElement(elementData) {\r\n    if (this.isRegistered) {\r\n      this.items.push(\r\n        new UIElement(this.pswp, elementData)\r\n      );\r\n    } else {\r\n      this.uiElementsData.push(elementData);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Fired each time zoom or pan position is changed.\r\n   * Update classes that control visibility of zoom button and cursor icon.\r\n   */\r\n  _onZoomPanUpdate() {\r\n    const { template, currSlide, options } = this.pswp;\r\n    let { currZoomLevel } = currSlide;\r\n\r\n    if (this.pswp.opener.isClosing) {\r\n      return;\r\n    }\r\n\r\n    // if not open yet - check against initial zoom level\r\n    if (!this.pswp.opener.isOpen) {\r\n      currZoomLevel = currSlide.zoomLevels.initial;\r\n    }\r\n\r\n    if (currZoomLevel === this._lastUpdatedZoomLevel) {\r\n      return;\r\n    }\r\n    this._lastUpdatedZoomLevel = currZoomLevel;\r\n\r\n    const currZoomLevelDiff = currSlide.zoomLevels.initial - currSlide.zoomLevels.secondary;\r\n\r\n    // Initial and secondary zoom levels are almost equal\r\n    if (Math.abs(currZoomLevelDiff) < 0.01 || !currSlide.isZoomable()) {\r\n      // disable zoom\r\n      setZoomedIn(template, false);\r\n      template.classList.remove('pswp--zoom-allowed');\r\n      return;\r\n    }\r\n\r\n    template.classList.add('pswp--zoom-allowed');\r\n    const secondaryIsHigher = (currZoomLevelDiff < 0);\r\n\r\n    if (currZoomLevel === currSlide.zoomLevels.secondary) {\r\n      setZoomedIn(template, secondaryIsHigher);\r\n    } else if (currZoomLevel > currSlide.zoomLevels.secondary) {\r\n      setZoomedIn(template, true);\r\n    } else {\r\n      //  if (currZoomLevel < currSlide.zoomLevels.secondary)\r\n      setZoomedIn(template, false);\r\n    }\r\n\r\n    if (options.imageClickAction === 'zoom'\r\n        || options.imageClickAction === 'zoom-or-close') {\r\n      template.classList.add('pswp--click-to-zoom');\r\n    }\r\n  }\r\n}\r\n\r\nexport default UI;\r\n", "/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n\r\n/** @typedef {{ x: number; y: number; w: number; innerRect?: { w: number; h: number; x: number; y: number } }} Bounds */\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nfunction getBoundsByElement(el) {\r\n  const thumbAreaRect = el.getBoundingClientRect();\r\n  return {\r\n    x: thumbAreaRect.left,\r\n    y: thumbAreaRect.top,\r\n    w: thumbAreaRect.width\r\n  };\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n * @param {number} imageWidth\r\n * @param {number} imageHeight\r\n */\r\nfunction getCroppedBoundsByElement(el, imageWidth, imageHeight) {\r\n  const thumbAreaRect = el.getBoundingClientRect();\r\n\r\n  // fill image into the area\r\n  // (do they same as object-fit:cover does to retrieve coordinates)\r\n  const hRatio = thumbAreaRect.width / imageWidth;\r\n  const vRatio = thumbAreaRect.height / imageHeight;\r\n  const fillZoomLevel = hRatio > vRatio ? hRatio : vRatio;\r\n\r\n  const offsetX = (thumbAreaRect.width - imageWidth * fillZoomLevel) / 2;\r\n  const offsetY = (thumbAreaRect.height - imageHeight * fillZoomLevel) / 2;\r\n\r\n  /**\r\n   * Coordinates of the image,\r\n   * as if it was not cropped,\r\n   * height is calculated automatically\r\n   *\r\n   * @type {Bounds}\r\n   */\r\n  const bounds = {\r\n    x: thumbAreaRect.left + offsetX,\r\n    y: thumbAreaRect.top + offsetY,\r\n    w: imageWidth * fillZoomLevel\r\n  };\r\n\r\n  // Coordinates of inner crop area\r\n  // relative to the image\r\n  bounds.innerRect = {\r\n    w: thumbAreaRect.width,\r\n    h: thumbAreaRect.height,\r\n    x: offsetX,\r\n    y: offsetY\r\n  };\r\n\r\n  return bounds;\r\n}\r\n\r\n/**\r\n * Get dimensions of thumbnail image\r\n * (click on which opens photoswipe or closes photoswipe to)\r\n *\r\n * @param {number} index\r\n * @param {SlideData} itemData\r\n * @param {PhotoSwipe} instance PhotoSwipe instance\r\n * @returns {Bounds | undefined}\r\n */\r\nexport function getThumbBounds(index, itemData, instance) {\r\n  // legacy event, before filters were introduced\r\n  const event = instance.dispatch('thumbBounds', {\r\n    index,\r\n    itemData,\r\n    instance\r\n  });\r\n  // @ts-expect-error\r\n  if (event.thumbBounds) {\r\n    // @ts-expect-error\r\n    return event.thumbBounds;\r\n  }\r\n\r\n  const { element } = itemData;\r\n  let thumbBounds;\r\n  /** @type {HTMLElement} */\r\n  let thumbnail;\r\n\r\n  if (element && instance.options.thumbSelector !== false) {\r\n    const thumbSelector = instance.options.thumbSelector || 'img';\r\n    thumbnail = element.matches(thumbSelector)\r\n      ? element : element.querySelector(thumbSelector);\r\n  }\r\n\r\n  thumbnail = instance.applyFilters('thumbEl', thumbnail, itemData, index);\r\n\r\n  if (thumbnail) {\r\n    if (!itemData.thumbCropped) {\r\n      thumbBounds = getBoundsByElement(thumbnail);\r\n    } else {\r\n      thumbBounds = getCroppedBoundsByElement(\r\n        thumbnail,\r\n        itemData.width || itemData.w,\r\n        itemData.height || itemData.h\r\n      );\r\n    }\r\n  }\r\n\r\n  return instance.applyFilters('thumbBounds', thumbBounds, itemData, index);\r\n}\r\n", "/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../slide/content.js').default} ContentDefault */\r\n/** @typedef {import('../slide/slide.js').default} Slide */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\r\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\r\n\r\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record<string, any>} Content\r\n */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point, transitionDuration: number | false }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thubmnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thubmnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter<T>\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback<T>\r\n */\r\n\r\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\r\nclass PhotoSwipeEvent {\r\n  /**\r\n   * @param {T} type\r\n   * @param {PhotoSwipeEventsMap[T]} [details]\r\n   */\r\n  constructor(type, details) {\r\n    this.type = type;\r\n    if (details) {\r\n      Object.assign(this, details);\r\n    }\r\n  }\r\n\r\n  preventDefault() {\r\n    this.defaultPrevented = true;\r\n  }\r\n}\r\n\r\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\r\nclass Eventable {\r\n  constructor() {\r\n    /**\r\n     * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\r\n     */\r\n    this._listeners = {};\r\n\r\n    /**\r\n     * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\r\n     */\r\n    this._filters = {};\r\n\r\n    /** @type {PhotoSwipe=} */\r\n    this.pswp = undefined;\r\n\r\n    /** @type {PhotoSwipeOptions} */\r\n    this.options = undefined;\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeFiltersMap[T]} fn\r\n   * @param {number} priority\r\n   */\r\n  addFilter(name, fn, priority = 100) {\r\n    if (!this._filters[name]) {\r\n      this._filters[name] = [];\r\n    }\r\n\r\n    this._filters[name].push({ fn, priority });\r\n    this._filters[name].sort((f1, f2) => f1.priority - f2.priority);\r\n\r\n    if (this.pswp) {\r\n      this.pswp.addFilter(name, fn, priority);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeFiltersMap[T]} fn\r\n   */\r\n  removeFilter(name, fn) {\r\n    if (this._filters[name]) {\r\n      // @ts-expect-error\r\n      this._filters[name] = this._filters[name].filter(filter => (filter.fn !== fn));\r\n    }\r\n\r\n    if (this.pswp) {\r\n      this.pswp.removeFilter(name, fn);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\r\n   * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\r\n   */\r\n  applyFilters(name, ...args) {\r\n    if (this._filters[name]) {\r\n      this._filters[name].forEach((filter) => {\r\n        // @ts-expect-error\r\n        args[0] = filter.fn.apply(this, args);\r\n      });\r\n    }\r\n    return args[0];\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {EventCallback<T>} fn\r\n   */\r\n  on(name, fn) {\r\n    if (!this._listeners[name]) {\r\n      this._listeners[name] = [];\r\n    }\r\n    this._listeners[name].push(fn);\r\n\r\n    // When binding events to lightbox,\r\n    // also bind events to PhotoSwipe Core,\r\n    // if it's open.\r\n    if (this.pswp) {\r\n      this.pswp.on(name, fn);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {EventCallback<T>} fn\r\n   */\r\n  off(name, fn) {\r\n    if (this._listeners[name]) {\r\n      // @ts-expect-error\r\n      this._listeners[name] = this._listeners[name].filter(listener => (fn !== listener));\r\n    }\r\n\r\n    if (this.pswp) {\r\n      this.pswp.off(name, fn);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeEventsMap[T]} [details]\r\n   * @returns {AugmentedEvent<T>}\r\n   */\r\n  dispatch(name, details) {\r\n    if (this.pswp) {\r\n      return this.pswp.dispatch(name, details);\r\n    }\r\n\r\n    const event = /** @type {AugmentedEvent<T>} */ (new PhotoSwipeEvent(name, details));\r\n\r\n    if (!this._listeners) {\r\n      return event;\r\n    }\r\n\r\n    if (this._listeners[name]) {\r\n      this._listeners[name].forEach((listener) => {\r\n        listener.call(this, event);\r\n      });\r\n    }\r\n\r\n    return event;\r\n  }\r\n}\r\n\r\nexport default Eventable;\r\n", "import { createElement, setWidthHeight, toTransformString } from '../util/util.js';\r\n\r\nclass Placeholder {\r\n  /**\r\n   * @param {string | false} imageSrc\r\n   * @param {HTMLElement} container\r\n   */\r\n  constructor(imageSrc, container) {\r\n    // Create placeholder\r\n    // (stretched thumbnail or simple div behind the main image)\r\n    this.element = createElement(\r\n      'pswp__img pswp__img--placeholder',\r\n      imageSrc ? 'img' : '',\r\n      container\r\n    );\r\n\r\n    if (imageSrc) {\r\n      /** @type {HTMLImageElement} */\r\n      (this.element).decoding = 'async';\r\n      /** @type {HTMLImageElement} */\r\n      (this.element).alt = '';\r\n      /** @type {HTMLImageElement} */\r\n      (this.element).src = imageSrc;\r\n      this.element.setAttribute('role', 'presentation');\r\n    }\r\n\r\n    this.element.setAttribute('aria-hiden', 'true');\r\n  }\r\n\r\n  /**\r\n   * @param {number} width\r\n   * @param {number} height\r\n   */\r\n  setDisplayedSize(width, height) {\r\n    if (!this.element) {\r\n      return;\r\n    }\r\n\r\n    if (this.element.tagName === 'IMG') {\r\n      // Use transform scale() to modify img placeholder size\r\n      // (instead of changing width/height directly).\r\n      // This helps with performance, specifically in iOS15 Safari.\r\n      setWidthHeight(this.element, 250, 'auto');\r\n      this.element.style.transformOrigin = '0 0';\r\n      this.element.style.transform = toTransformString(0, 0, width / 250);\r\n    } else {\r\n      setWidthHeight(this.element, width, height);\r\n    }\r\n  }\r\n\r\n  destroy() {\r\n    if (this.element.parentNode) {\r\n      this.element.remove();\r\n    }\r\n    this.element = null;\r\n  }\r\n}\r\n\r\nexport default Placeholder;\r\n", "import { createElement, LOAD_STATE, setWidthHeight } from '../util/util.js';\r\nimport Placeholder from './placeholder.js';\r\n\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../util/util.js').LoadState} LoadState */\r\n\r\nclass Content {\r\n  /**\r\n   * @param {SlideData} itemData Slide data\r\n   * @param {PhotoSwipe} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n   * @param {number} index\r\n   */\r\n  constructor(itemData, instance, index) {\r\n    this.instance = instance;\r\n    this.data = itemData;\r\n    this.index = index;\r\n\r\n    /** @type {HTMLImageElement | HTMLDivElement} */\r\n    this.element = undefined;\r\n\r\n    this.width = Number(this.data.w) || Number(this.data.width) || 0;\r\n    this.height = Number(this.data.h) || Number(this.data.height) || 0;\r\n\r\n    this.isAttached = false;\r\n    this.hasSlide = false;\r\n    /** @type {LoadState} */\r\n    this.state = LOAD_STATE.IDLE;\r\n\r\n    if (this.data.type) {\r\n      this.type = this.data.type;\r\n    } else if (this.data.src) {\r\n      this.type = 'image';\r\n    } else {\r\n      this.type = 'html';\r\n    }\r\n\r\n    this.instance.dispatch('contentInit', { content: this });\r\n  }\r\n\r\n  removePlaceholder() {\r\n    if (this.placeholder && !this.keepPlaceholder()) {\r\n      // With delay, as image might be loaded, but not rendered\r\n      setTimeout(() => {\r\n        if (this.placeholder) {\r\n          this.placeholder.destroy();\r\n          this.placeholder = null;\r\n        }\r\n      }, 500);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Preload content\r\n   *\r\n   * @param {boolean=} isLazy\r\n   * @param {boolean=} reload\r\n   */\r\n  load(isLazy, reload) {\r\n    if (!this.placeholder && this.slide && this.usePlaceholder()) {\r\n      // use   -based placeholder only for the first slide,\r\n      // as rendering (even small stretched thumbnail) is an expensive operation\r\n      const placeholderSrc = this.instance.applyFilters(\r\n        'placeholderSrc',\r\n        (this.data.msrc && this.slide.isFirstSlide) ? this.data.msrc : false,\r\n        this\r\n      );\r\n      this.placeholder = new Placeholder(\r\n        placeholderSrc,\r\n        this.slide.container\r\n      );\r\n    }\r\n\r\n    if (this.element && !reload) {\r\n      return;\r\n    }\r\n\r\n    if (this.instance.dispatch('contentLoad', { content: this, isLazy }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.isImageContent()) {\r\n      this.loadImage(isLazy);\r\n    } else {\r\n      this.element = createElement('pswp__content');\r\n      this.element.innerHTML = this.data.html || '';\r\n    }\r\n\r\n    if (reload && this.slide) {\r\n      this.slide.updateContentSize(true);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Preload image\r\n   *\r\n   * @param {boolean} isLazy\r\n   */\r\n  loadImage(isLazy) {\r\n    const imageElement = createElement('pswp__img', 'img');\r\n    this.element = imageElement;\r\n\r\n    if (this.instance.dispatch('contentLoadImage', { content: this, isLazy }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.data.srcset) {\r\n      imageElement.srcset = this.data.srcset;\r\n    }\r\n\r\n    imageElement.src = this.data.src;\r\n\r\n    imageElement.alt = this.data.alt || '';\r\n\r\n    this.state = LOAD_STATE.LOADING;\r\n\r\n    if (imageElement.complete) {\r\n      this.onLoaded();\r\n    } else {\r\n      imageElement.onload = () => {\r\n        this.onLoaded();\r\n      };\r\n\r\n      imageElement.onerror = () => {\r\n        this.onError();\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Assign slide to content\r\n   *\r\n   * @param {Slide} slide\r\n   */\r\n  setSlide(slide) {\r\n    this.slide = slide;\r\n    this.hasSlide = true;\r\n    this.instance = slide.pswp;\r\n\r\n    // todo: do we need to unset slide?\r\n  }\r\n\r\n  /**\r\n   * Content load success handler\r\n   */\r\n  onLoaded() {\r\n    this.state = LOAD_STATE.LOADED;\r\n\r\n    if (this.slide) {\r\n      this.instance.dispatch('loadComplete', { slide: this.slide, content: this });\r\n\r\n      // if content is reloaded\r\n      if (this.slide.isActive\r\n          && this.slide.heavyAppended\r\n          && !this.element.parentNode) {\r\n        this.slide.container.innerHTML = '';\r\n        this.append();\r\n        this.slide.updateContentSize(true);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Content load error handler\r\n   */\r\n  onError() {\r\n    this.state = LOAD_STATE.ERROR;\r\n\r\n    if (this.slide) {\r\n      this.displayError();\r\n      this.instance.dispatch('loadComplete', { slide: this.slide, isError: true, content: this });\r\n      this.instance.dispatch('loadError', { slide: this.slide, content: this });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @returns {Boolean} If the content is currently loading\r\n   */\r\n  isLoading() {\r\n    return this.instance.applyFilters(\r\n      'isContentLoading',\r\n      this.state === LOAD_STATE.LOADING,\r\n      this\r\n    );\r\n  }\r\n\r\n  isError() {\r\n    return this.state === LOAD_STATE.ERROR;\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If the content is image\r\n   */\r\n  isImageContent() {\r\n    return this.type === 'image';\r\n  }\r\n\r\n  /**\r\n   * Update content size\r\n   *\r\n   * @param {Number} width\r\n   * @param {Number} height\r\n   */\r\n  setDisplayedSize(width, height) {\r\n    if (!this.element) {\r\n      return;\r\n    }\r\n\r\n    if (this.placeholder) {\r\n      this.placeholder.setDisplayedSize(width, height);\r\n    }\r\n\r\n    // eslint-disable-next-line max-len\r\n    if (this.instance.dispatch('contentResize', { content: this, width, height }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    setWidthHeight(this.element, width, height);\r\n\r\n    if (this.isImageContent() && !this.isError()) {\r\n      const image = /** @type HTMLImageElement */ (this.element);\r\n\r\n      // Handle srcset sizes attribute.\r\n      //\r\n      // Never lower quality, if it was increased previously.\r\n      // Chrome does this automatically, Firefox and Safari do not,\r\n      // so we store largest used size in dataset.\r\n      if (image.srcset\r\n          // eslint-disable-next-line max-len\r\n          && (!image.dataset.largestUsedSize || width > parseInt(image.dataset.largestUsedSize, 10))) {\r\n        image.sizes = width + 'px';\r\n        image.dataset.largestUsedSize = String(width);\r\n      }\r\n\r\n      if (this.slide) {\r\n        // eslint-disable-next-line max-len\r\n        this.instance.dispatch('imageSizeChange', { slide: this.slide, width, height, content: this });\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If the content can be zoomed\r\n   */\r\n  isZoomable() {\r\n    return this.instance.applyFilters(\r\n      'isContentZoomable',\r\n      this.isImageContent() && (this.state !== LOAD_STATE.ERROR),\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n   */\r\n  usePlaceholder() {\r\n    return this.instance.applyFilters(\r\n      'useContentPlaceholder',\r\n      this.isImageContent(),\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Preload content with lazy-loading param\r\n   */\r\n  lazyLoad() {\r\n    if (this.instance.dispatch('contentLazyLoad', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    this.load(true);\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If placeholder should be kept after content is loaded\r\n   */\r\n  keepPlaceholder() {\r\n    return this.instance.applyFilters(\r\n      'isKeepingPlaceholder',\r\n      this.isLoading(),\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Destroy the content\r\n   */\r\n  destroy() {\r\n    this.hasSlide = false;\r\n    this.slide = null;\r\n\r\n    if (this.instance.dispatch('contentDestroy', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    this.remove();\r\n\r\n    if (this.isImageContent() && this.element) {\r\n      this.element.onload = null;\r\n      this.element.onerror = null;\r\n      this.element = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Display error message\r\n   */\r\n  displayError() {\r\n    if (this.slide) {\r\n      /** @type {HTMLElement} */\r\n      let errorMsgEl = createElement('pswp__error-msg');\r\n      errorMsgEl.innerText = this.instance.options.errorMsg;\r\n      errorMsgEl = this.instance.applyFilters(\r\n        'contentErrorElement',\r\n        errorMsgEl,\r\n        this\r\n      );\r\n      this.element = createElement('pswp__content pswp__error-msg-container');\r\n      this.element.appendChild(errorMsgEl);\r\n      this.slide.container.innerHTML = '';\r\n      this.slide.container.appendChild(this.element);\r\n      this.slide.updateContentSize(true);\r\n      this.removePlaceholder();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Append the content\r\n   */\r\n  append() {\r\n    this.isAttached = true;\r\n\r\n    if (this.state === LOAD_STATE.ERROR) {\r\n      this.displayError();\r\n      return;\r\n    }\r\n\r\n    if (this.instance.dispatch('contentAppend', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.isImageContent()) {\r\n      // Use decode() on nearby slides\r\n      //\r\n      // Nearby slide images are in DOM and not hidden via display:none.\r\n      // However, they are placed offscreen (to the left and right side).\r\n      //\r\n      // Some browsers do not composite the image until it's actually visible,\r\n      // using decode() helps.\r\n      //\r\n      // You might ask \"why dont you just decode() and then append all images\",\r\n      // that's because I want to show image before it's fully loaded,\r\n      // as browser can render parts of image while it is loading.\r\n      if (this.slide\r\n          && !this.slide.isActive\r\n          && ('decode' in this.element)) {\r\n        this.isDecoding = true;\r\n        // Make sure that we start decoding on the next frame\r\n        requestAnimationFrame(() => {\r\n          // element might change\r\n          if (this.element && this.element.tagName === 'IMG') {\r\n            /** @type {HTMLImageElement} */\r\n            (this.element).decode().then(() => {\r\n              this.isDecoding = false;\r\n              requestAnimationFrame(() => {\r\n                this.appendImage();\r\n              });\r\n            }).catch(() => {\r\n              this.isDecoding = false;\r\n            });\r\n          }\r\n        });\r\n      } else {\r\n        if (this.placeholder\r\n          // eslint-disable-next-line max-len\r\n          && (this.state === LOAD_STATE.LOADED || /** @type {LoadState} */ (this.state) === LOAD_STATE.ERROR)\r\n        ) {\r\n          this.removePlaceholder();\r\n        }\r\n        this.appendImage();\r\n      }\r\n    } else if (this.element && !this.element.parentNode) {\r\n      this.slide.container.appendChild(this.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Activate the slide,\r\n   * active slide is generally the current one,\r\n   * meaning the user can see it.\r\n   */\r\n  activate() {\r\n    if (this.instance.dispatch('contentActivate', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.slide) {\r\n      if (this.isImageContent() && this.isDecoding) {\r\n        // add image to slide when it becomes active,\r\n        // even if it's not finished decoding\r\n        this.appendImage();\r\n      } else if (this.isError()) {\r\n        this.load(false, true); // try to reload\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Deactivate the content\r\n   */\r\n  deactivate() {\r\n    this.instance.dispatch('contentDeactivate', { content: this });\r\n  }\r\n\r\n\r\n  /**\r\n   * Remove the content from DOM\r\n   */\r\n  remove() {\r\n    this.isAttached = false;\r\n\r\n    if (this.instance.dispatch('contentRemove', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.element && this.element.parentNode) {\r\n      this.element.remove();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Append the image content to slide container\r\n   */\r\n  appendImage() {\r\n    if (!this.isAttached) {\r\n      return;\r\n    }\r\n\r\n    if (this.instance.dispatch('contentAppendImage', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    // ensure that element exists and is not already appended\r\n    if (this.slide && this.element && !this.element.parentNode) {\r\n      this.slide.container.appendChild(this.element);\r\n\r\n      if (this.placeholder\r\n        && (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR)) {\r\n        this.removePlaceholder();\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nexport default Content;\r\n", "import Eventable from './eventable.js';\r\nimport {\r\n  getElementsFromOption\r\n} from '../util/util.js';\r\nimport Content from '../slide/content.js';\r\n\r\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\r\n/** @typedef {import(\"../photoswipe.js\").PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\r\n\r\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\r\nclass PhotoSwipeBase extends Eventable {\r\n  /**\r\n   * Get total number of slides\r\n   *\r\n   * @returns {number}\r\n   */\r\n  getNumItems() {\r\n    let numItems;\r\n    const { dataSource } = this.options;\r\n    if (!dataSource) {\r\n      numItems = 0;\r\n    } else if ('length' in dataSource) {\r\n      // may be an array or just object with length property\r\n      numItems = dataSource.length;\r\n    } else if ('gallery' in dataSource) {\r\n      // query DOM elements\r\n      if (!dataSource.items) {\r\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n      }\r\n\r\n      if (dataSource.items) {\r\n        numItems = dataSource.items.length;\r\n      }\r\n    }\r\n\r\n    // legacy event, before filters were introduced\r\n    const event = this.dispatch('numItems', {\r\n      dataSource,\r\n      numItems\r\n    });\r\n    return this.applyFilters('numItems', event.numItems, dataSource);\r\n  }\r\n\r\n  /**\r\n   * @param {SlideData} slideData\r\n   * @param {number} index\r\n   */\r\n  createContentFromData(slideData, index) {\r\n    // @ts-expect-error\r\n    return new Content(slideData, this, index);\r\n  }\r\n\r\n  /**\r\n   * Get item data by index.\r\n   *\r\n   * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n   * For example, it may contain properties like\r\n   * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n   *\r\n   * @param {number} index\r\n   */\r\n  getItemData(index) {\r\n    const { dataSource } = this.options;\r\n    let dataSourceItem;\r\n    if (Array.isArray(dataSource)) {\r\n      // Datasource is an array of elements\r\n      dataSourceItem = dataSource[index];\r\n    } else if (dataSource && dataSource.gallery) {\r\n      // dataSource has gallery property,\r\n      // thus it was created by Lightbox, based on\r\n      // gallery and children options\r\n\r\n      // query DOM elements\r\n      if (!dataSource.items) {\r\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n      }\r\n\r\n      dataSourceItem = dataSource.items[index];\r\n    }\r\n\r\n    let itemData = dataSourceItem;\r\n\r\n    if (itemData instanceof Element) {\r\n      itemData = this._domElementToItemData(itemData);\r\n    }\r\n\r\n    // Dispatching the itemData event,\r\n    // it's a legacy verion before filters were introduced\r\n    const event = this.dispatch('itemData', {\r\n      itemData: itemData || {},\r\n      index\r\n    });\r\n\r\n    return this.applyFilters('itemData', event.itemData, index);\r\n  }\r\n\r\n  /**\r\n   * Get array of gallery DOM elements,\r\n   * based on childSelector and gallery element.\r\n   *\r\n   * @param {HTMLElement} galleryElement\r\n   */\r\n  _getGalleryDOMElements(galleryElement) {\r\n    if (this.options.children || this.options.childSelector) {\r\n      return getElementsFromOption(\r\n        this.options.children,\r\n        this.options.childSelector,\r\n        galleryElement\r\n      ) || [];\r\n    }\r\n\r\n    return [galleryElement];\r\n  }\r\n\r\n  /**\r\n   * Converts DOM element to item data object.\r\n   *\r\n   * @param {HTMLElement} element DOM element\r\n   */\r\n  // eslint-disable-next-line class-methods-use-this\r\n  _domElementToItemData(element) {\r\n    /** @type {SlideData} */\r\n    const itemData = {\r\n      element\r\n    };\r\n\r\n    // eslint-disable-next-line max-len\r\n    const linkEl = /** @type {HTMLAnchorElement} */ (element.tagName === 'A' ? element : element.querySelector('a'));\r\n\r\n    if (linkEl) {\r\n      // src comes from data-pswp-src attribute,\r\n      // if it's empty link href is used\r\n      itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\r\n\r\n      if (linkEl.dataset.pswpSrcset) {\r\n        itemData.srcset = linkEl.dataset.pswpSrcset;\r\n      }\r\n\r\n      itemData.width = parseInt(linkEl.dataset.pswpWidth, 10);\r\n      itemData.height = parseInt(linkEl.dataset.pswpHeight, 10);\r\n\r\n      // support legacy w & h properties\r\n      itemData.w = itemData.width;\r\n      itemData.h = itemData.height;\r\n\r\n      if (linkEl.dataset.pswpType) {\r\n        itemData.type = linkEl.dataset.pswpType;\r\n      }\r\n\r\n      const thumbnailEl = element.querySelector('img');\r\n\r\n      if (thumbnailEl) {\r\n        // msrc is URL to placeholder image that's displayed before large image is loaded\r\n        // by default it's displayed only for the first slide\r\n        itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\r\n        itemData.alt = thumbnailEl.getAttribute('alt');\r\n      }\r\n\r\n      if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\r\n        itemData.thumbCropped = true;\r\n      }\r\n    }\r\n\r\n    return this.applyFilters('domItemData', itemData, element, linkEl);\r\n  }\r\n}\r\n\r\nexport default PhotoSwipeBase;\r\n", "import {\r\n  setTransform,\r\n  equalizePoints,\r\n  decodeImage,\r\n  toTransformString\r\n} from './util/util.js';\r\n\r\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('./slide/get-thumb-bounds.js').Bounds} Bounds */\r\n/** @typedef {import('./util/animations.js').AnimationProps} AnimationProps */\r\n\r\n// some browsers do not paint\r\n// elements which opacity is set to 0,\r\n// since we need to pre-render elements for the animation -\r\n// we set it to the minimum amount\r\nconst MIN_OPACITY = 0.003;\r\n\r\n/**\r\n * Manages opening and closing transitions of the PhotoSwipe.\r\n *\r\n * It can perform zoom, fade or no transition.\r\n */\r\nclass Opener {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n    this.isClosed = true;\r\n    this._prepareOpen = this._prepareOpen.bind(this);\r\n\r\n    /** @type {false | Bounds} */\r\n    this._thumbBounds = undefined;\r\n\r\n    // Override initial zoom and pan position\r\n    pswp.on('firstZoomPan', this._prepareOpen);\r\n  }\r\n\r\n  open() {\r\n    this._prepareOpen();\r\n    this._start();\r\n  }\r\n\r\n  close() {\r\n    if (this.isClosed || this.isClosing || this.isOpening) {\r\n      // if we close during opening animation\r\n      // for now do nothing,\r\n      // browsers aren't good at changing the direction of the CSS transition\r\n      return false;\r\n    }\r\n\r\n    const slide = this.pswp.currSlide;\r\n\r\n    this.isOpen = false;\r\n    this.isOpening = false;\r\n    this.isClosing = true;\r\n    this._duration = this.pswp.options.hideAnimationDuration;\r\n\r\n    if (slide && slide.currZoomLevel * slide.width >= this.pswp.options.maxWidthToAnimate) {\r\n      this._duration = 0;\r\n    }\r\n\r\n    this._applyStartProps();\r\n    setTimeout(() => {\r\n      this._start();\r\n    }, this._croppedZoom ? 30 : 0);\r\n\r\n    return true;\r\n  }\r\n\r\n  _prepareOpen() {\r\n    this.pswp.off('firstZoomPan', this._prepareOpen);\r\n    if (!this.isOpening) {\r\n      const slide = this.pswp.currSlide;\r\n      this.isOpening = true;\r\n      this.isClosing = false;\r\n      this._duration = this.pswp.options.showAnimationDuration;\r\n      if (slide && slide.zoomLevels.initial * slide.width >= this.pswp.options.maxWidthToAnimate) {\r\n        this._duration = 0;\r\n      }\r\n      this._applyStartProps();\r\n    }\r\n  }\r\n\r\n  _applyStartProps() {\r\n    const { pswp } = this;\r\n    const slide = this.pswp.currSlide;\r\n    const { options } = pswp;\r\n\r\n    if (options.showHideAnimationType === 'fade') {\r\n      options.showHideOpacity = true;\r\n      this._thumbBounds = false;\r\n    } else if (options.showHideAnimationType === 'none') {\r\n      options.showHideOpacity = false;\r\n      this._duration = 0;\r\n      this._thumbBounds = false;\r\n    } else if (this.isOpening && pswp._initialThumbBounds) {\r\n      // Use initial bounds if defined\r\n      this._thumbBounds = pswp._initialThumbBounds;\r\n    } else {\r\n      this._thumbBounds = this.pswp.getThumbBounds();\r\n    }\r\n\r\n    this._placeholder = slide.getPlaceholderElement();\r\n\r\n    pswp.animations.stopAll();\r\n\r\n    // Discard animations when duration is less than 50ms\r\n    this._useAnimation = (this._duration > 50);\r\n    this._animateZoom = Boolean(this._thumbBounds)\r\n                        && (slide.content && slide.content.usePlaceholder())\r\n                        && (!this.isClosing || !pswp.mainScroll.isShifted());\r\n    if (!this._animateZoom) {\r\n      this._animateRootOpacity = true;\r\n\r\n      if (this.isOpening) {\r\n        slide.zoomAndPanToInitial();\r\n        slide.applyCurrentZoomPan();\r\n      }\r\n    } else {\r\n      this._animateRootOpacity = options.showHideOpacity;\r\n    }\r\n    this._animateBgOpacity = !this._animateRootOpacity && this.pswp.options.bgOpacity > MIN_OPACITY;\r\n    this._opacityElement = this._animateRootOpacity ? pswp.element : pswp.bg;\r\n\r\n    if (!this._useAnimation) {\r\n      this._duration = 0;\r\n      this._animateZoom = false;\r\n      this._animateBgOpacity = false;\r\n      this._animateRootOpacity = true;\r\n      if (this.isOpening) {\r\n        pswp.element.style.opacity = String(MIN_OPACITY);\r\n        pswp.applyBgOpacity(1);\r\n      }\r\n      return;\r\n    }\r\n\r\n    if (this._animateZoom && this._thumbBounds && this._thumbBounds.innerRect) {\r\n      // Properties are used when animation from cropped thumbnail\r\n      this._croppedZoom = true;\r\n      this._cropContainer1 = this.pswp.container;\r\n      this._cropContainer2 = this.pswp.currSlide.holderElement;\r\n\r\n      pswp.container.style.overflow = 'hidden';\r\n      pswp.container.style.width = pswp.viewportSize.x + 'px';\r\n    } else {\r\n      this._croppedZoom = false;\r\n    }\r\n\r\n    if (this.isOpening) {\r\n      // Apply styles before opening transition\r\n      if (this._animateRootOpacity) {\r\n        pswp.element.style.opacity = String(MIN_OPACITY);\r\n        pswp.applyBgOpacity(1);\r\n      } else {\r\n        if (this._animateBgOpacity) {\r\n          pswp.bg.style.opacity = String(MIN_OPACITY);\r\n        }\r\n        pswp.element.style.opacity = '1';\r\n      }\r\n\r\n      if (this._animateZoom) {\r\n        this._setClosedStateZoomPan();\r\n        if (this._placeholder) {\r\n          // tell browser that we plan to animate the placeholder\r\n          this._placeholder.style.willChange = 'transform';\r\n\r\n          // hide placeholder to allow hiding of\r\n          // elements that overlap it (such as icons over the thumbnail)\r\n          this._placeholder.style.opacity = String(MIN_OPACITY);\r\n        }\r\n      }\r\n    } else if (this.isClosing) {\r\n      // hide nearby slides to make sure that\r\n      // they are not painted during the transition\r\n      pswp.mainScroll.itemHolders[0].el.style.display = 'none';\r\n      pswp.mainScroll.itemHolders[2].el.style.display = 'none';\r\n\r\n      if (this._croppedZoom) {\r\n        if (pswp.mainScroll.x !== 0) {\r\n          // shift the main scroller to zero position\r\n          pswp.mainScroll.resetPosition();\r\n          pswp.mainScroll.resize();\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  _start() {\r\n    if (this.isOpening\r\n        && this._useAnimation\r\n        && this._placeholder\r\n        && this._placeholder.tagName === 'IMG') {\r\n      // To ensure smooth animation\r\n      // we wait till the current slide image placeholder is decoded,\r\n      // but no longer than 250ms,\r\n      // and no shorter than 50ms\r\n      // (just using requestanimationframe is not enough in Firefox,\r\n      // for some reason)\r\n      new Promise((resolve) => {\r\n        let decoded = false;\r\n        let isDelaying = true;\r\n        decodeImage(/** @type {HTMLImageElement} */ (this._placeholder)).finally(() => {\r\n          decoded = true;\r\n          if (!isDelaying) {\r\n            resolve();\r\n          }\r\n        });\r\n        setTimeout(() => {\r\n          isDelaying = false;\r\n          if (decoded) {\r\n            resolve();\r\n          }\r\n        }, 50);\r\n        setTimeout(resolve, 250);\r\n      }).finally(() => this._initiate());\r\n    } else {\r\n      this._initiate();\r\n    }\r\n  }\r\n\r\n  _initiate() {\r\n    this.pswp.element.style.setProperty('--pswp-transition-duration', this._duration + 'ms');\r\n\r\n    this.pswp.dispatch(\r\n      this.isOpening ? 'openingAnimationStart' : 'closingAnimationStart'\r\n    );\r\n\r\n    // legacy event\r\n    this.pswp.dispatch(\r\n      /** @type {'initialZoomIn' | 'initialZoomOut'} */\r\n      ('initialZoom' + (this.isOpening ? 'In' : 'Out'))\r\n    );\r\n\r\n    this.pswp.element.classList[this.isOpening ? 'add' : 'remove']('pswp--ui-visible');\r\n\r\n    if (this.isOpening) {\r\n      if (this._placeholder) {\r\n        // unhide the placeholder\r\n        this._placeholder.style.opacity = '1';\r\n      }\r\n      this._animateToOpenState();\r\n    } else if (this.isClosing) {\r\n      this._animateToClosedState();\r\n    }\r\n\r\n    if (!this._useAnimation) {\r\n      this._onAnimationComplete();\r\n    }\r\n  }\r\n\r\n  _onAnimationComplete() {\r\n    const { pswp } = this;\r\n    this.isOpen = this.isOpening;\r\n    this.isClosed = this.isClosing;\r\n    this.isOpening = false;\r\n    this.isClosing = false;\r\n\r\n    pswp.dispatch(\r\n      this.isOpen ? 'openingAnimationEnd' : 'closingAnimationEnd'\r\n    );\r\n\r\n    // legacy event\r\n    pswp.dispatch(\r\n      /** @type {'initialZoomInEnd' | 'initialZoomOutEnd'} */\r\n      ('initialZoom' + (this.isOpen ? 'InEnd' : 'OutEnd'))\r\n    );\r\n\r\n    if (this.isClosed) {\r\n      pswp.destroy();\r\n    } else if (this.isOpen) {\r\n      if (this._animateZoom) {\r\n        pswp.container.style.overflow = 'visible';\r\n        pswp.container.style.width = '100%';\r\n      }\r\n      pswp.currSlide.applyCurrentZoomPan();\r\n    }\r\n  }\r\n\r\n  _animateToOpenState() {\r\n    const { pswp } = this;\r\n    if (this._animateZoom) {\r\n      if (this._croppedZoom) {\r\n        this._animateTo(this._cropContainer1, 'transform', 'translate3d(0,0,0)');\r\n        this._animateTo(this._cropContainer2, 'transform', 'none');\r\n      }\r\n\r\n      pswp.currSlide.zoomAndPanToInitial();\r\n      this._animateTo(\r\n        pswp.currSlide.container,\r\n        'transform',\r\n        pswp.currSlide.getCurrentTransform()\r\n      );\r\n    }\r\n\r\n    if (this._animateBgOpacity) {\r\n      this._animateTo(pswp.bg, 'opacity', String(pswp.options.bgOpacity));\r\n    }\r\n\r\n    if (this._animateRootOpacity) {\r\n      this._animateTo(pswp.element, 'opacity', '1');\r\n    }\r\n  }\r\n\r\n  _animateToClosedState() {\r\n    const { pswp } = this;\r\n\r\n    if (this._animateZoom) {\r\n      this._setClosedStateZoomPan(true);\r\n    }\r\n\r\n    if (this._animateBgOpacity\r\n        && pswp.bgOpacity > 0.01) { // do not animate opacity if it's already at 0\r\n      this._animateTo(pswp.bg, 'opacity', '0');\r\n    }\r\n\r\n    if (this._animateRootOpacity) {\r\n      this._animateTo(pswp.element, 'opacity', '0');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {boolean=} animate\r\n   */\r\n  _setClosedStateZoomPan(animate) {\r\n    if (!this._thumbBounds) return;\r\n\r\n    const { pswp } = this;\r\n    const { innerRect } = this._thumbBounds;\r\n    const { currSlide, viewportSize } = pswp;\r\n\r\n    if (this._croppedZoom) {\r\n      const containerOnePanX = -viewportSize.x + (this._thumbBounds.x - innerRect.x) + innerRect.w;\r\n      const containerOnePanY = -viewportSize.y + (this._thumbBounds.y - innerRect.y) + innerRect.h;\r\n      const containerTwoPanX = viewportSize.x - innerRect.w;\r\n      const containerTwoPanY = viewportSize.y - innerRect.h;\r\n\r\n\r\n      if (animate) {\r\n        this._animateTo(\r\n          this._cropContainer1,\r\n          'transform',\r\n          toTransformString(containerOnePanX, containerOnePanY)\r\n        );\r\n\r\n        this._animateTo(\r\n          this._cropContainer2,\r\n          'transform',\r\n          toTransformString(containerTwoPanX, containerTwoPanY)\r\n        );\r\n      } else {\r\n        setTransform(this._cropContainer1, containerOnePanX, containerOnePanY);\r\n        setTransform(this._cropContainer2, containerTwoPanX, containerTwoPanY);\r\n      }\r\n    }\r\n\r\n    equalizePoints(currSlide.pan, innerRect || this._thumbBounds);\r\n    currSlide.currZoomLevel = this._thumbBounds.w / currSlide.width;\r\n\r\n    if (animate) {\r\n      this._animateTo(currSlide.container, 'transform', currSlide.getCurrentTransform());\r\n    } else {\r\n      currSlide.applyCurrentZoomPan();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {HTMLElement} target\r\n   * @param {'transform' | 'opacity'} prop\r\n   * @param {string} propValue\r\n   */\r\n  _animateTo(target, prop, propValue) {\r\n    if (!this._duration) {\r\n      target.style[prop] = propValue;\r\n      return;\r\n    }\r\n\r\n    const { animations } = this.pswp;\r\n    /** @type {AnimationProps} */\r\n    const animProps = {\r\n      duration: this._duration,\r\n      easing: this.pswp.options.easing,\r\n      onComplete: () => {\r\n        if (!animations.activeAnimations.length) {\r\n          this._onAnimationComplete();\r\n        }\r\n      },\r\n      target,\r\n    };\r\n    animProps[prop] = propValue;\r\n    animations.startTransition(animProps);\r\n  }\r\n}\r\n\r\nexport default Opener;\r\n", "import { getViewportSize, getPanAreaSize } from '../util/viewport-size.js';\r\nimport ZoomLevel from './zoom-level.js';\r\n\r\n/** @typedef {import('./content.js').default} Content */\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n\r\nconst MIN_SLIDES_TO_CACHE = 5;\r\n\r\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox\r\n * @param {number} index\r\n * @returns Image that is being decoded or false.\r\n */\r\nexport function lazyLoadData(itemData, instance, index) {\r\n  // src/slide/content/content.js\r\n  const content = instance.createContentFromData(itemData, index);\r\n\r\n  if (!content || !content.lazyLoad) {\r\n    return;\r\n  }\r\n\r\n  const { options } = instance;\r\n\r\n  // We need to know dimensions of the image to preload it,\r\n  // as it might use srcset and we need to define sizes\r\n  // @ts-expect-error should provide pswp instance?\r\n  const viewportSize = instance.viewportSize || getViewportSize(options, instance);\r\n  const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\r\n\r\n  const zoomLevel = new ZoomLevel(options, itemData, -1);\r\n  zoomLevel.update(content.width, content.height, panAreaSize);\r\n\r\n  content.lazyLoad();\r\n  content.setDisplayedSize(\r\n    Math.ceil(content.width * zoomLevel.initial),\r\n    Math.ceil(content.height * zoomLevel.initial)\r\n  );\r\n\r\n  return content;\r\n}\r\n\r\n\r\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n */\r\nexport function lazyLoadSlide(index, instance) {\r\n  const itemData = instance.getItemData(index);\r\n\r\n  if (instance.dispatch('lazyLoadSlide', { index, itemData }).defaultPrevented) {\r\n    return;\r\n  }\r\n\r\n  return lazyLoadData(itemData, instance, index);\r\n}\r\n\r\n\r\nclass ContentLoader {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n    // Total amount of cached images\r\n    this.limit = Math.max(\r\n      pswp.options.preload[0] + pswp.options.preload[1] + 1,\r\n      MIN_SLIDES_TO_CACHE\r\n    );\r\n    /** @type {Content[]} */\r\n    this._cachedItems = [];\r\n  }\r\n\r\n  /**\r\n   * Lazy load nearby slides based on `preload` option.\r\n   *\r\n   * @param {number=} diff Difference between slide indexes that was changed recently, or 0.\r\n   */\r\n  updateLazy(diff) {\r\n    const { pswp } = this;\r\n\r\n    if (pswp.dispatch('lazyLoad').defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    const { preload } = pswp.options;\r\n    const isForward = diff === undefined ? true : (diff >= 0);\r\n    let i;\r\n\r\n    // preload[1] - num items to preload in forward direction\r\n    for (i = 0; i <= preload[1]; i++) {\r\n      this.loadSlideByIndex(pswp.currIndex + (isForward ? i : (-i)));\r\n    }\r\n\r\n    // preload[0] - num items to preload in backward direction\r\n    for (i = 1; i <= preload[0]; i++) {\r\n      this.loadSlideByIndex(pswp.currIndex + (isForward ? (-i) : i));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {number} index\r\n   */\r\n  loadSlideByIndex(index) {\r\n    index = this.pswp.getLoopedIndex(index);\r\n    // try to get cached content\r\n    let content = this.getContentByIndex(index);\r\n    if (!content) {\r\n      // no cached content, so try to load from scratch:\r\n      content = lazyLoadSlide(index, this.pswp);\r\n      // if content can be loaded, add it to cache:\r\n      if (content) {\r\n        this.addToCache(content);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Slide} slide\r\n   */\r\n  getContentBySlide(slide) {\r\n    let content = this.getContentByIndex(slide.index);\r\n    if (!content) {\r\n      // create content if not found in cache\r\n      content = this.pswp.createContentFromData(slide.data, slide.index);\r\n      if (content) {\r\n        this.addToCache(content);\r\n      }\r\n    }\r\n\r\n    if (content) {\r\n      // assign slide to content\r\n      content.setSlide(slide);\r\n    }\r\n    return content;\r\n  }\r\n\r\n  /**\r\n   * @param {Content} content\r\n   */\r\n  addToCache(content) {\r\n    // move to the end of array\r\n    this.removeByIndex(content.index);\r\n    this._cachedItems.push(content);\r\n\r\n    if (this._cachedItems.length > this.limit) {\r\n      // Destroy the first content that's not attached\r\n      const indexToRemove = this._cachedItems.findIndex((item) => {\r\n        return !item.isAttached && !item.hasSlide;\r\n      });\r\n      if (indexToRemove !== -1) {\r\n        const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\r\n        removedItem.destroy();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes an image from cache, does not destroy() it, just removes.\r\n   *\r\n   * @param {number} index\r\n   */\r\n  removeByIndex(index) {\r\n    const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\r\n    if (indexToRemove !== -1) {\r\n      this._cachedItems.splice(indexToRemove, 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {number} index\r\n   */\r\n  getContentByIndex(index) {\r\n    return this._cachedItems.find(content => content.index === index);\r\n  }\r\n\r\n  destroy() {\r\n    this._cachedItems.forEach(content => content.destroy());\r\n    this._cachedItems = null;\r\n  }\r\n}\r\n\r\nexport default ContentLoader;\r\n", "import {\r\n  createElement,\r\n  equalizePoints,\r\n  pointsEqual,\r\n  clamp,\r\n} from './util/util.js';\r\n\r\nimport DOMEvents from './util/dom-events.js';\r\nimport Slide from './slide/slide.js';\r\nimport Gestures from './gestures/gestures.js';\r\nimport MainScroll from './main-scroll.js';\r\n\r\nimport Keyboard from './keyboard.js';\r\nimport Animations from './util/animations.js';\r\nimport ScrollWheel from './scroll-wheel.js';\r\nimport UI from './ui/ui.js';\r\nimport { getViewportSize } from './util/viewport-size.js';\r\nimport { getThumbBounds } from './slide/get-thumb-bounds.js';\r\nimport PhotoSwipeBase from './core/base.js';\r\nimport Opener from './opener.js';\r\nimport ContentLoader from './slide/loader.js';\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('./types.js').Type<T>} Type<T>\r\n */\r\n\r\n/** @typedef {import('./slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('./slide/zoom-level.js').ZoomLevelOption} ZoomLevelOption */\r\n/** @typedef {import('./ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('./main-scroll.js').ItemHolder} ItemHolder */\r\n/** @typedef {import('./core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\r\n/** @typedef {import('./core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\r\n/**\r\n * @template T\r\n * @typedef {import('./core/eventable.js').EventCallback<T>} EventCallback<T>\r\n */\r\n/**\r\n * @template T\r\n * @typedef {import('./core/eventable.js').AugmentedEvent<T>} AugmentedEvent<T>\r\n */\r\n\r\n/** @typedef {{ x?: number; y?: number; id?: string | number }} Point */\r\n/** @typedef {{ x?: number; y?: number }} Size */\r\n/** @typedef {{ top: number; bottom: number; left: number; right: number }} Padding */\r\n/** @typedef {SlideData[]} DataSourceArray */\r\n/** @typedef {{ gallery: HTMLElement; items?: HTMLElement[] }} DataSourceObject */\r\n/** @typedef {DataSourceArray | DataSourceObject} DataSource */\r\n/** @typedef {(point: Point, originalEvent: PointerEvent) => void} ActionFn */\r\n/** @typedef {'close' | 'next' | 'zoom' | 'zoom-or-close' | 'toggle-controls'} ActionType */\r\n/** @typedef {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} PhotoSwipeModule */\r\n/** @typedef {PhotoSwipeModule | Promise<PhotoSwipeModule> | (() => Promise<PhotoSwipeModule>)} PhotoSwipeModuleOption */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeOptions https://photoswipe.com/options/\r\n *\r\n * @prop {DataSource=} dataSource\r\n * Pass an array of any items via dataSource option. Its length will determine amount of slides\r\n * (which may be modified further from numItems event).\r\n *\r\n * Each item should contain data that you need to generate slide\r\n * (for image slide it would be src (image URL), width (image width), height, srcset, alt).\r\n *\r\n * If these properties are not present in your initial array, you may \"pre-parse\" each item from itemData filter.\r\n *\r\n * @prop {number=} bgOpacity\r\n * Background backdrop opacity, always define it via this option and not via CSS rgba color.\r\n *\r\n * @prop {number=} spacing\r\n * Spacing between slides. Defined as ratio relative to the viewport width (0.1 = 10% of viewport).\r\n *\r\n * @prop {boolean=} allowPanToNext\r\n * Allow swipe navigation to the next slide when the current slide is zoomed. Does not apply to mouse events.\r\n *\r\n * @prop {boolean=} loop\r\n * If set to true you'll be able to swipe from the last to the first image.\r\n * Option is always false when there are less than 3 slides.\r\n *\r\n * @prop {boolean=} wheelToZoom\r\n * By default PhotoSwipe zooms image with ctrl-wheel, if you enable this option - image will zoom just via wheel.\r\n *\r\n * @prop {boolean=} pinchToClose\r\n * Pinch touch gesture to close the gallery.\r\n *\r\n * @prop {boolean=} closeOnVerticalDrag\r\n * Vertical drag gesture to close the PhotoSwipe.\r\n *\r\n * @prop {Padding=} padding\r\n * Slide area padding (in pixels).\r\n *\r\n * @prop {(viewportSize: Size, itemData: SlideData, index: number) => Padding} [paddingFn]\r\n * The option is checked frequently, so make sure it's performant. Overrides padding option if defined. For example:\r\n *\r\n * @prop {number | false} [hideAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} [showAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {number | false} [zoomAnimationDuration]\r\n * Transition duration in milliseconds, can be 0.\r\n *\r\n * @prop {string=} easing\r\n * String, 'cubic-bezier(.4,0,.22,1)'. CSS easing function for open/close/zoom transitions.\r\n *\r\n * @prop {boolean=} escKey\r\n * Esc key to close.\r\n *\r\n * @prop {boolean=} arrowKeys\r\n * Left/right arrow keys for navigation.\r\n *\r\n * @prop {boolean=} returnFocus\r\n * Restore focus the last active element after PhotoSwipe is closed.\r\n *\r\n * @prop {boolean=} clickToCloseNonZoomable\r\n * If image is not zoomable (for example, smaller than viewport) it can be closed by clicking on it.\r\n *\r\n * @prop {ActionType | ActionFn | false} [imageClickAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [bgClickAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [tapAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {ActionType | ActionFn | false} [doubleTapAction]\r\n * Refer to click and tap actions page.\r\n *\r\n * @prop {number=} preloaderDelay\r\n * Delay before the loading indicator will be displayed,\r\n * if image is loaded during it - the indicator will not be displayed at all. Can be zero.\r\n *\r\n * @prop {string=} indexIndicatorSep\r\n * Used for slide count indicator (\"1 of 10 \").\r\n *\r\n * @prop {(options: PhotoSwipeOptions, pswp: PhotoSwipe) => { x: number; y: number }} [getViewportSizeFn]\r\n * A function that should return slide viewport width and height, in format {x: 100, y: 100}.\r\n *\r\n * @prop {string=} errorMsg\r\n * Message to display when the image wasn't able to load. If you need to display HTML - use contentErrorElement filter.\r\n *\r\n * @prop {[number, number]=} preload\r\n * Lazy loading of nearby slides based on direction of movement. Should be an array with two integers,\r\n * first one - number of items to preload before the current image, second one - after the current image.\r\n * Two nearby images are always loaded.\r\n *\r\n * @prop {string=} mainClass\r\n * Class that will be added to the root element of PhotoSwipe, may contain multiple separated by space.\r\n * Example on Styling page.\r\n *\r\n * @prop {HTMLElement=} appendToEl\r\n * Element to which PhotoSwipe dialog will be appended when it opens.\r\n *\r\n * @prop {number=} maxWidthToAnimate\r\n * Maximum width of image to animate, if initial rendered image width\r\n * is larger than this value - the opening/closing transition will be automatically disabled.\r\n *\r\n * @prop {string=} closeTitle\r\n * Translating\r\n *\r\n * @prop {string=} zoomTitle\r\n * Translating\r\n *\r\n * @prop {string=} arrowPrevTitle\r\n * Translating\r\n *\r\n * @prop {string=} arrowNextTitle\r\n * Translating\r\n *\r\n * @prop {'zoom' | 'fade' | 'none'} [showHideAnimationType]\r\n * To adjust opening or closing transition type use lightbox option `showHideAnimationType` (`String`).\r\n * It supports three values - `zoom` (default), `fade` (default if there is no thumbnail) and `none`.\r\n *\r\n * Animations are automatically disabled if user `(prefers-reduced-motion: reduce)`.\r\n *\r\n * @prop {number=} index\r\n * Defines start slide index.\r\n *\r\n * @prop {(e: MouseEvent) => number} [getClickedIndexFn]\r\n *\r\n * @prop {boolean=} arrowPrev\r\n * @prop {boolean=} arrowNext\r\n * @prop {boolean=} zoom\r\n * @prop {boolean=} close\r\n * @prop {boolean=} counter\r\n *\r\n * @prop {string=} arrowPrevSVG\r\n * @prop {string=} arrowNextSVG\r\n * @prop {string=} zoomSVG\r\n * @prop {string=} closeSVG\r\n * @prop {string=} counterSVG\r\n *\r\n * @prop {string=} arrowPrevTitle\r\n * @prop {string=} arrowNextTitle\r\n * @prop {string=} zoomTitle\r\n * @prop {string=} closeTitle\r\n * @prop {string=} counterTitle\r\n *\r\n * @prop {ZoomLevelOption=} initialZoomLevel\r\n * @prop {ZoomLevelOption=} secondaryZoomLevel\r\n * @prop {ZoomLevelOption=} maxZoomLevel\r\n *\r\n * @prop {boolean=} mouseMovePan\r\n * @prop {Point | null} [initialPointerPos]\r\n * @prop {boolean=} showHideOpacity\r\n *\r\n * @prop {PhotoSwipeModuleOption} [pswpModule]\r\n * @prop {() => Promise<any>} [openPromise]\r\n * @prop {boolean=} preloadFirstSlide\r\n * @prop {string=} gallery\r\n * @prop {string=} gallerySelector\r\n * @prop {string=} children\r\n * @prop {string=} childSelector\r\n * @prop {string | false} [thumbSelector]\r\n */\r\n\r\n/** @type {PhotoSwipeOptions} */\r\nconst defaultOptions = {\r\n  allowPanToNext: true,\r\n  spacing: 0.1,\r\n  loop: true,\r\n  pinchToClose: true,\r\n  closeOnVerticalDrag: true,\r\n  hideAnimationDuration: 333,\r\n  showAnimationDuration: 333,\r\n  zoomAnimationDuration: 333,\r\n  escKey: true,\r\n  arrowKeys: true,\r\n  returnFocus: true,\r\n  maxWidthToAnimate: 4000,\r\n  clickToCloseNonZoomable: true,\r\n  imageClickAction: 'zoom-or-close',\r\n  bgClickAction: 'close',\r\n  tapAction: 'toggle-controls',\r\n  doubleTapAction: 'zoom',\r\n  indexIndicatorSep: ' / ',\r\n  preloaderDelay: 2000,\r\n  bgOpacity: 0.8,\r\n\r\n  index: 0,\r\n  errorMsg: 'The image cannot be loaded',\r\n  preload: [1, 2],\r\n  easing: 'cubic-bezier(.4,0,.22,1)'\r\n};\r\n\r\n/**\r\n * PhotoSwipe Core\r\n */\r\nclass PhotoSwipe extends PhotoSwipeBase {\r\n  /**\r\n   * @param {PhotoSwipeOptions} options\r\n   */\r\n  constructor(options) {\r\n    super();\r\n\r\n    this._prepareOptions(options);\r\n\r\n    /**\r\n     * offset of viewport relative to document\r\n     *\r\n     * @type {{ x?: number; y?: number }}\r\n     */\r\n    this.offset = {};\r\n\r\n    /**\r\n     * @type {{ x?: number; y?: number }}\r\n     * @private\r\n     */\r\n    this._prevViewportSize = {};\r\n\r\n    /**\r\n     * Size of scrollable PhotoSwipe viewport\r\n     *\r\n     * @type {{ x?: number; y?: number }}\r\n     */\r\n    this.viewportSize = {};\r\n\r\n    /**\r\n     * background (backdrop) opacity\r\n     *\r\n     * @type {number}\r\n     */\r\n    this.bgOpacity = 1;\r\n\r\n    /** @type {HTMLDivElement} */\r\n    this.topBar = undefined;\r\n\r\n    this.events = new DOMEvents();\r\n\r\n    /** @type {Animations} */\r\n    this.animations = new Animations();\r\n\r\n    this.mainScroll = new MainScroll(this);\r\n    this.gestures = new Gestures(this);\r\n    this.opener = new Opener(this);\r\n    this.keyboard = new Keyboard(this);\r\n    this.contentLoader = new ContentLoader(this);\r\n  }\r\n\r\n  init() {\r\n    if (this.isOpen || this.isDestroying) {\r\n      return;\r\n    }\r\n\r\n    this.isOpen = true;\r\n    this.dispatch('init'); // legacy\r\n    this.dispatch('beforeOpen');\r\n\r\n    this._createMainStructure();\r\n\r\n    // add classes to the root element of PhotoSwipe\r\n    let rootClasses = 'pswp--open';\r\n    if (this.gestures.supportsTouch) {\r\n      rootClasses += ' pswp--touch';\r\n    }\r\n    if (this.options.mainClass) {\r\n      rootClasses += ' ' + this.options.mainClass;\r\n    }\r\n    this.element.className += ' ' + rootClasses;\r\n\r\n    this.currIndex = this.options.index || 0;\r\n    this.potentialIndex = this.currIndex;\r\n    this.dispatch('firstUpdate'); // starting index can be modified here\r\n\r\n    // initialize scroll wheel handler to block the scroll\r\n    this.scrollWheel = new ScrollWheel(this);\r\n\r\n    // sanitize index\r\n    if (Number.isNaN(this.currIndex)\r\n        || this.currIndex < 0\r\n        || this.currIndex >= this.getNumItems()) {\r\n      this.currIndex = 0;\r\n    }\r\n\r\n    if (!this.gestures.supportsTouch) {\r\n      // enable mouse features if no touch support detected\r\n      this.mouseDetected();\r\n    }\r\n\r\n    // causes forced synchronous layout\r\n    this.updateSize();\r\n\r\n    this.offset.y = window.pageYOffset;\r\n\r\n    this._initialItemData = this.getItemData(this.currIndex);\r\n    this.dispatch('gettingData', {\r\n      index: this.currIndex,\r\n      data: this._initialItemData,\r\n      slide: undefined\r\n    });\r\n\r\n    // *Layout* - calculate size and position of elements here\r\n    this._initialThumbBounds = this.getThumbBounds();\r\n    this.dispatch('initialLayout');\r\n\r\n    this.on('openingAnimationEnd', () => {\r\n      // Add content to the previous and next slide\r\n      this.setContent(this.mainScroll.itemHolders[0], this.currIndex - 1);\r\n      this.setContent(this.mainScroll.itemHolders[2], this.currIndex + 1);\r\n\r\n      this.mainScroll.itemHolders[0].el.style.display = 'block';\r\n      this.mainScroll.itemHolders[2].el.style.display = 'block';\r\n\r\n      this.appendHeavy();\r\n\r\n      this.contentLoader.updateLazy();\r\n\r\n      this.events.add(window, 'resize', this._handlePageResize.bind(this));\r\n      this.events.add(window, 'scroll', this._updatePageScrollOffset.bind(this));\r\n      this.dispatch('bindEvents');\r\n    });\r\n\r\n    // set content for center slide (first time)\r\n    this.setContent(this.mainScroll.itemHolders[1], this.currIndex);\r\n    this.dispatch('change');\r\n\r\n    this.opener.open();\r\n\r\n    this.dispatch('afterInit');\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Get looped slide index\r\n   * (for example, -1 will return the last slide)\r\n   *\r\n   * @param {number} index\r\n   */\r\n  getLoopedIndex(index) {\r\n    const numSlides = this.getNumItems();\r\n\r\n    if (this.options.loop) {\r\n      if (index > numSlides - 1) {\r\n        index -= numSlides;\r\n      }\r\n\r\n      if (index < 0) {\r\n        index += numSlides;\r\n      }\r\n    }\r\n\r\n    index = clamp(index, 0, numSlides - 1);\r\n\r\n    return index;\r\n  }\r\n\r\n  appendHeavy() {\r\n    this.mainScroll.itemHolders.forEach((itemHolder) => {\r\n      if (itemHolder.slide) {\r\n        itemHolder.slide.appendHeavy();\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Change the slide\r\n   * @param {number} index New index\r\n   */\r\n  goTo(index) {\r\n    this.mainScroll.moveIndexBy(\r\n      this.getLoopedIndex(index) - this.potentialIndex\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Go to the next slide.\r\n   */\r\n  next() {\r\n    this.goTo(this.potentialIndex + 1);\r\n  }\r\n\r\n  /**\r\n   * Go to the previous slide.\r\n   */\r\n  prev() {\r\n    this.goTo(this.potentialIndex - 1);\r\n  }\r\n\r\n  /**\r\n   * @see slide/slide.js zoomTo\r\n   *\r\n   * @param {Parameters<Slide['zoomTo']>} args\r\n   */\r\n  zoomTo(...args) {\r\n    this.currSlide.zoomTo(...args);\r\n  }\r\n\r\n  /**\r\n   * @see slide/slide.js toggleZoom\r\n   */\r\n  toggleZoom() {\r\n    this.currSlide.toggleZoom();\r\n  }\r\n\r\n  /**\r\n   * Close the gallery.\r\n   * After closing transition ends - destroy it\r\n   */\r\n  close() {\r\n    if (!this.opener.isOpen || this.isDestroying) {\r\n      return;\r\n    }\r\n\r\n    this.isDestroying = true;\r\n\r\n    this.dispatch('close');\r\n\r\n    this.events.removeAll();\r\n    this.opener.close();\r\n  }\r\n\r\n  /**\r\n   * Destroys the gallery:\r\n   * - instantly closes the gallery\r\n   * - unbinds events,\r\n   * - cleans intervals and timeouts\r\n   * - removes elements from DOM\r\n   */\r\n  destroy() {\r\n    if (!this.isDestroying) {\r\n      this.options.showHideAnimationType = 'none';\r\n      this.close();\r\n      return;\r\n    }\r\n\r\n    this.dispatch('destroy');\r\n\r\n    this.listeners = null;\r\n\r\n    this.scrollWrap.ontouchmove = null;\r\n    this.scrollWrap.ontouchend = null;\r\n\r\n    this.element.remove();\r\n\r\n    this.mainScroll.itemHolders.forEach((itemHolder) => {\r\n      if (itemHolder.slide) {\r\n        itemHolder.slide.destroy();\r\n      }\r\n    });\r\n\r\n    this.contentLoader.destroy();\r\n    this.events.removeAll();\r\n  }\r\n\r\n  /**\r\n   * Refresh/reload content of a slide by its index\r\n   *\r\n   * @param {number} slideIndex\r\n   */\r\n  refreshSlideContent(slideIndex) {\r\n    this.contentLoader.removeByIndex(slideIndex);\r\n    this.mainScroll.itemHolders.forEach((itemHolder, i) => {\r\n      let potentialHolderIndex = this.currSlide.index - 1 + i;\r\n      if (this.canLoop()) {\r\n        potentialHolderIndex = this.getLoopedIndex(potentialHolderIndex);\r\n      }\r\n      if (potentialHolderIndex === slideIndex) {\r\n        // set the new slide content\r\n        this.setContent(itemHolder, slideIndex, true);\r\n\r\n        // activate the new slide if it's current\r\n        if (i === 1) {\r\n          /** @type {Slide} */\r\n          this.currSlide = itemHolder.slide;\r\n          itemHolder.slide.setIsActive(true);\r\n        }\r\n      }\r\n    });\r\n\r\n    this.dispatch('change');\r\n  }\r\n\r\n\r\n  /**\r\n   * Set slide content\r\n   *\r\n   * @param {ItemHolder} holder mainScroll.itemHolders array item\r\n   * @param {number} index Slide index\r\n   * @param {boolean=} force If content should be set even if index wasn't changed\r\n   */\r\n  setContent(holder, index, force) {\r\n    if (this.canLoop()) {\r\n      index = this.getLoopedIndex(index);\r\n    }\r\n\r\n    if (holder.slide) {\r\n      if (holder.slide.index === index && !force) {\r\n        // exit if holder already contains this slide\r\n        // this could be common when just three slides are used\r\n        return;\r\n      }\r\n\r\n      // destroy previous slide\r\n      holder.slide.destroy();\r\n      holder.slide = null;\r\n    }\r\n\r\n    // exit if no loop and index is out of bounds\r\n    if (!this.canLoop() && (index < 0 || index >= this.getNumItems())) {\r\n      return;\r\n    }\r\n\r\n    const itemData = this.getItemData(index);\r\n    holder.slide = new Slide(itemData, index, this);\r\n\r\n    // set current slide\r\n    if (index === this.currIndex) {\r\n      this.currSlide = holder.slide;\r\n    }\r\n\r\n    holder.slide.append(holder.el);\r\n  }\r\n\r\n  getViewportCenterPoint() {\r\n    return {\r\n      x: this.viewportSize.x / 2,\r\n      y: this.viewportSize.y / 2\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Update size of all elements.\r\n   * Executed on init and on page resize.\r\n   *\r\n   * @param {boolean=} force Update size even if size of viewport was not changed.\r\n   */\r\n  updateSize(force) {\r\n    // let item;\r\n    // let itemIndex;\r\n\r\n    if (this.isDestroying) {\r\n      // exit if PhotoSwipe is closed or closing\r\n      // (to avoid errors, as resize event might be delayed)\r\n      return;\r\n    }\r\n\r\n    //const newWidth = this.scrollWrap.clientWidth;\r\n    //const newHeight = this.scrollWrap.clientHeight;\r\n\r\n    const newViewportSize = getViewportSize(this.options, this);\r\n\r\n    if (!force && pointsEqual(newViewportSize, this._prevViewportSize)) {\r\n      // Exit if dimensions were not changed\r\n      return;\r\n    }\r\n\r\n    //this._prevViewportSize.x = newWidth;\r\n    //this._prevViewportSize.y = newHeight;\r\n    equalizePoints(this._prevViewportSize, newViewportSize);\r\n\r\n    this.dispatch('beforeResize');\r\n\r\n    equalizePoints(this.viewportSize, this._prevViewportSize);\r\n\r\n    this._updatePageScrollOffset();\r\n\r\n    this.dispatch('viewportSize');\r\n\r\n    // Resize slides only after opener animation is finished\r\n    // and don't re-calculate size on inital size update\r\n    this.mainScroll.resize(this.opener.isOpen);\r\n\r\n    if (!this.hasMouse && window.matchMedia('(any-hover: hover)').matches) {\r\n      this.mouseDetected();\r\n    }\r\n\r\n    this.dispatch('resize');\r\n  }\r\n\r\n  /**\r\n   * @param {number} opacity\r\n   */\r\n  applyBgOpacity(opacity) {\r\n    this.bgOpacity = Math.max(opacity, 0);\r\n    this.bg.style.opacity = String(this.bgOpacity * this.options.bgOpacity);\r\n  }\r\n\r\n  /**\r\n   * Whether mouse is detected\r\n   */\r\n  mouseDetected() {\r\n    if (!this.hasMouse) {\r\n      this.hasMouse = true;\r\n      this.element.classList.add('pswp--has_mouse');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Page resize event handler\r\n   *\r\n   * @private\r\n   */\r\n  _handlePageResize() {\r\n    this.updateSize();\r\n\r\n    // In iOS webview, if element size depends on document size,\r\n    // it'll be measured incorrectly in resize event\r\n    //\r\n    // https://bugs.webkit.org/show_bug.cgi?id=170595\r\n    // https://hackernoon.com/onresize-event-broken-in-mobile-safari-d8469027bf4d\r\n    if (/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) {\r\n      setTimeout(() => {\r\n        this.updateSize();\r\n      }, 500);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Page scroll offset is used\r\n   * to get correct coordinates\r\n   * relative to PhotoSwipe viewport.\r\n   *\r\n   * @private\r\n   */\r\n  _updatePageScrollOffset() {\r\n    this.setScrollOffset(0, window.pageYOffset);\r\n  }\r\n\r\n  /**\r\n   * @param {number} x\r\n   * @param {number} y\r\n   */\r\n  setScrollOffset(x, y) {\r\n    this.offset.x = x;\r\n    this.offset.y = y;\r\n    this.dispatch('updateScrollOffset');\r\n  }\r\n\r\n  /**\r\n   * Create main HTML structure of PhotoSwipe,\r\n   * and add it to DOM\r\n   *\r\n   * @private\r\n   */\r\n  _createMainStructure() {\r\n    // root DOM element of PhotoSwipe (.pswp)\r\n    this.element = createElement('pswp');\r\n    this.element.setAttribute('tabindex', '-1');\r\n    this.element.setAttribute('role', 'dialog');\r\n\r\n    // template is legacy prop\r\n    this.template = this.element;\r\n\r\n    // Background is added as a separate element,\r\n    // as animating opacity is faster than animating rgba()\r\n    this.bg = createElement('pswp__bg', false, this.element);\r\n    this.scrollWrap = createElement('pswp__scroll-wrap', false, this.element);\r\n    this.container = createElement('pswp__container', false, this.scrollWrap);\r\n\r\n    this.mainScroll.appendHolders();\r\n\r\n    this.ui = new UI(this);\r\n    this.ui.init();\r\n\r\n    // append to DOM\r\n    (this.options.appendToEl || document.body).appendChild(this.element);\r\n  }\r\n\r\n\r\n  /**\r\n   * Get position and dimensions of small thumbnail\r\n   *   {x:,y:,w:}\r\n   *\r\n   * Height is optional (calculated based on the large image)\r\n   */\r\n  getThumbBounds() {\r\n    return getThumbBounds(\r\n      this.currIndex,\r\n      this.currSlide ? this.currSlide.data : this._initialItemData,\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * If the PhotoSwipe can have continious loop\r\n   * @returns Boolean\r\n   */\r\n  canLoop() {\r\n    return (this.options.loop && this.getNumItems() > 2);\r\n  }\r\n\r\n  /**\r\n   * @param {PhotoSwipeOptions} options\r\n   * @private\r\n   */\r\n  _prepareOptions(options) {\r\n    if (window.matchMedia('(prefers-reduced-motion), (update: slow)').matches) {\r\n      options.showHideAnimationType = 'none';\r\n      options.zoomAnimationDuration = 0;\r\n    }\r\n\r\n    /** @type {PhotoSwipeOptions}*/\r\n    this.options = {\r\n      ...defaultOptions,\r\n      ...options\r\n    };\r\n  }\r\n}\r\n\r\nexport default PhotoSwipe;\r\n", "// Only prepares data on the element for use by a surrounding [lightbox-gallery]\nup.compiler('[lightbox-image]', { priority: 1 }, (element, { width, height, thumbUrl, copyrightText, descriptionText, titleText }) => {\n\n  element.getItemData = () => {\n    const { src, currentSrc } = element\n    const thumbUrl = (currentSrc.indexOf('data:image/svg+xml') === 0) ? src : currentSrc\n\n    return {\n      element,\n      copyrightText,\n      descriptionText,\n      titleText,\n      w: width,\n      h: height,\n      src,\n      msrc: thumbUrl, // shown while when lightbox was just opened, before loading higher-resolution file from srcset\n      srcset: element.getAttribute('data-srcset'),\n    }\n  }\n\n})\n", "up.compiler('[search-form]', (element) => {\n\n  function onSubmit(event) {\n    // query element at runtime because [search-form] is placed in the global layout\n    // and the query field itself might have been replaced, e.g. through [up-hungry]\n    const queryField = element.querySelector('[name*=\"query\"]')\n\n    if (queryField.value === '') {\n      queryField.focus()\n      up.event.halt(event)\n    }\n  }\n\n  element.addEventListener('submit', onSubmit)\n\n})\n", "up.compiler('[track-page-view]', () => {\n  const url = location.href\n  const safeUrl = url.replace(/(\\w+?_token)=\\w+/, '$1=_HIDDEN_')\n\n  window._paq.push(['setCustomUrl', safeUrl])\n  window._paq.push(['trackPageView'])\n})\n", "/******/ (() => { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ([\n/* 0 */,\n/* 1 */\n/***/ (() => {\n\nwindow.up = {\n    version: '2.7.2'\n};\n\n\n/***/ }),\n/* 2 */\n/***/ (() => {\n\nup.mockable = function (originalFn) {\n    let spy;\n    const mockableFn = function () {\n        return (spy || originalFn).apply(null, arguments);\n    };\n    mockableFn.mock = () => spy = jasmine.createSpy('mockable', originalFn);\n    document.addEventListener('up:framework:reset', () => spy = null);\n    return mockableFn;\n};\n\n\n/***/ }),\n/* 3 */\n/***/ (() => {\n\nup.util = (function () {\n    function noop() {\n    }\n    function asyncNoop() {\n        return Promise.resolve();\n    }\n    function memoize(func) {\n        let cachedValue, cached;\n        return function (...args) {\n            if (cached) {\n                return cachedValue;\n            }\n            else {\n                cached = true;\n                return cachedValue = func.apply(this, args);\n            }\n        };\n    }\n    function isStandardPort(protocol, port) {\n        port = port.toString();\n        return (((port === \"\") || (port === \"80\")) && (protocol === 'http:')) || ((port === \"443\") && (protocol === 'https:'));\n    }\n    const NORMALIZE_URL_DEFAULTS = {\n        host: 'cross-domain',\n    };\n    function normalizeURL(urlOrAnchor, options) {\n        options = newOptions(options, NORMALIZE_URL_DEFAULTS);\n        const parts = parseURL(urlOrAnchor);\n        let normalized = '';\n        if (options.host === 'cross-domain') {\n            options.host = isCrossOrigin(parts);\n        }\n        if (options.host) {\n            normalized += parts.protocol + \"//\" + parts.hostname;\n            if (!isStandardPort(parts.protocol, parts.port)) {\n                normalized += `:${parts.port}`;\n            }\n        }\n        let { pathname } = parts;\n        if (options.trailingSlash === false && pathname !== '/') {\n            pathname = pathname.replace(/\\/$/, '');\n        }\n        normalized += pathname;\n        if (options.search !== false) {\n            normalized += parts.search;\n        }\n        if (options.hash !== false) {\n            normalized += parts.hash;\n        }\n        return normalized;\n    }\n    function matchURLs(leftURL, rightURL) {\n        return normalizeURL(leftURL) === normalizeURL(rightURL);\n    }\n    const APP_PROTOCOL = location.protocol;\n    const APP_HOSTNAME = location.hostname;\n    function isCrossOrigin(urlOrAnchor) {\n        if (isString(urlOrAnchor) && (urlOrAnchor.indexOf('//') === -1)) {\n            return false;\n        }\n        const parts = parseURL(urlOrAnchor);\n        return (APP_HOSTNAME !== parts.hostname) || (APP_PROTOCOL !== parts.protocol);\n    }\n    function parseURL(urlOrLink) {\n        let link;\n        if (isJQuery(urlOrLink)) {\n            link = up.element.get(urlOrLink);\n        }\n        else if (urlOrLink.pathname) {\n            link = urlOrLink;\n        }\n        else {\n            link = document.createElement('a');\n            link.href = urlOrLink;\n        }\n        if (!link.hostname) {\n            link.href = link.href;\n        }\n        if (link.pathname[0] !== '/') {\n            link = pick(link, ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash']);\n            link.pathname = '/' + link.pathname;\n        }\n        return link;\n    }\n    function normalizeMethod(method) {\n        return method ? method.toUpperCase() : 'GET';\n    }\n    function methodAllowsPayload(method) {\n        return (method !== 'GET') && (method !== 'HEAD');\n    }\n    function assignPolyfill(target, ...sources) {\n        for (let source of sources) {\n            for (let key in source) {\n                target[key] = source[key];\n            }\n        }\n        return target;\n    }\n    const assign = Object.assign || assignPolyfill;\n    function valuesPolyfill(object) {\n        return Object.keys(object).map((key) => object[key]);\n    }\n    const objectValues = Object.values || valuesPolyfill;\n    function iteratee(block) {\n        if (isString(block)) {\n            return item => item[block];\n        }\n        else {\n            return block;\n        }\n    }\n    function map(array, block) {\n        if (array.length === 0) {\n            return [];\n        }\n        block = iteratee(block);\n        let mapped = [];\n        for (let i = 0; i < array.length; i++) {\n            let element = array[i];\n            mapped.push(block(element, i));\n        }\n        return mapped;\n    }\n    function mapObject(array, pairer) {\n        const merger = function (object, pair) {\n            object[pair[0]] = pair[1];\n            return object;\n        };\n        return map(array, pairer).reduce(merger, {});\n    }\n    function each(array, block) {\n        for (let i = 0; i < array.length; i++) {\n            block(array[i], i);\n        }\n    }\n    function eachIterator(iterator, callback) {\n        let entry;\n        while ((entry = iterator.next()) && !entry.done) {\n            callback(entry.value);\n        }\n    }\n    function isNull(object) {\n        return object === null;\n    }\n    function isUndefined(object) {\n        return object === undefined;\n    }\n    const isDefined = negate(isUndefined);\n    function isMissing(object) {\n        return isUndefined(object) || isNull(object);\n    }\n    const isGiven = negate(isMissing);\n    function isBlank(value) {\n        if (isMissing(value)) {\n            return true;\n        }\n        if (isObject(value) && value[isBlank.key]) {\n            return value[isBlank.key]();\n        }\n        if (isString(value) || isList(value)) {\n            return value.length === 0;\n        }\n        if (isOptions(value)) {\n            return Object.keys(value).length === 0;\n        }\n        return false;\n    }\n    isBlank.key = 'up.util.isBlank';\n    function presence(value, tester = isPresent) {\n        if (tester(value)) {\n            return value;\n        }\n    }\n    const isPresent = negate(isBlank);\n    function isFunction(object) {\n        return typeof (object) === 'function';\n    }\n    function isString(object) {\n        return (typeof (object) === 'string') || object instanceof String;\n    }\n    function isBoolean(object) {\n        return (typeof (object) === 'boolean') || object instanceof Boolean;\n    }\n    function isNumber(object) {\n        return (typeof (object) === 'number') || object instanceof Number;\n    }\n    function isOptions(object) {\n        return (typeof (object) === 'object') && !isNull(object) && (isUndefined(object.constructor) || (object.constructor === Object));\n    }\n    function isObject(object) {\n        const typeOfResult = typeof (object);\n        return ((typeOfResult === 'object') && !isNull(object)) || (typeOfResult === 'function');\n    }\n    function isElement(object) {\n        return object instanceof Element;\n    }\n    function isRegExp(object) {\n        return object instanceof RegExp;\n    }\n    function isJQuery(object) {\n        return up.browser.canJQuery() && object instanceof jQuery;\n    }\n    function isElementish(object) {\n        return !!(object && (object.addEventListener || object[0]?.addEventListener));\n    }\n    function isPromise(object) {\n        return isObject(object) && isFunction(object.then);\n    }\n    const { isArray } = Array;\n    function isFormData(object) {\n        return object instanceof FormData;\n    }\n    function toArray(value) {\n        return isArray(value) ? value : copyArrayLike(value);\n    }\n    function isList(value) {\n        return isArray(value) ||\n            isNodeList(value) ||\n            isArguments(value) ||\n            isJQuery(value) ||\n            isHTMLCollection(value);\n    }\n    function isNodeList(value) {\n        return value instanceof NodeList;\n    }\n    function isHTMLCollection(value) {\n        return value instanceof HTMLCollection;\n    }\n    function isArguments(value) {\n        return Object.prototype.toString.call(value) === '[object Arguments]';\n    }\n    function nullToUndefined(value) {\n        if (!isNull(value)) {\n            return value;\n        }\n    }\n    function wrapList(value) {\n        if (isList(value)) {\n            return value;\n        }\n        else if (isMissing(value)) {\n            return [];\n        }\n        else {\n            return [value];\n        }\n    }\n    function copy(value) {\n        if (isObject(value) && value[copy.key]) {\n            value = value[copy.key]();\n        }\n        else if (isList(value)) {\n            value = copyArrayLike(value);\n        }\n        else if (isOptions(value)) {\n            value = assign({}, value);\n        }\n        return value;\n    }\n    function copyArrayLike(arrayLike) {\n        return Array.prototype.slice.call(arrayLike);\n    }\n    copy.key = 'up.util.copy';\n    Date.prototype[copy.key] = function () { return new Date(+this); };\n    function merge(...sources) {\n        return assign({}, ...sources);\n    }\n    function mergeDefined(...sources) {\n        const result = {};\n        for (let source of sources) {\n            if (source) {\n                for (let key in source) {\n                    const value = source[key];\n                    if (isDefined(value)) {\n                        result[key] = value;\n                    }\n                }\n            }\n        }\n        return result;\n    }\n    function newOptions(object, defaults) {\n        if (defaults) {\n            return merge(defaults, object);\n        }\n        else if (object) {\n            return copy(object);\n        }\n        else {\n            return {};\n        }\n    }\n    function parseArgIntoOptions(args, argKey) {\n        let options = extractOptions(args);\n        if (isDefined(args[0])) {\n            options = copy(options);\n            options[argKey] = args[0];\n        }\n        return options;\n    }\n    function findInList(list, tester) {\n        tester = iteratee(tester);\n        let match;\n        for (let element of list) {\n            if (tester(element)) {\n                match = element;\n                break;\n            }\n        }\n        return match;\n    }\n    function some(list, tester) {\n        return !!findResult(list, tester);\n    }\n    function findResult(array, tester) {\n        tester = iteratee(tester);\n        for (let i = 0; i < array.length; i++) {\n            const result = tester(array[i], i);\n            if (result) {\n                return result;\n            }\n        }\n    }\n    function every(list, tester) {\n        tester = iteratee(tester);\n        let match = true;\n        for (let i = 0; i < list.length; i++) {\n            if (!tester(list[i], i)) {\n                match = false;\n                break;\n            }\n        }\n        return match;\n    }\n    function compact(array) {\n        return filterList(array, isGiven);\n    }\n    function compactObject(object) {\n        return pickBy(object, isGiven);\n    }\n    function uniq(array) {\n        if (array.length < 2) {\n            return array;\n        }\n        return setToArray(arrayToSet(array));\n    }\n    function uniqBy(array, mapper) {\n        if (array.length < 2) {\n            return array;\n        }\n        mapper = iteratee(mapper);\n        const seenElements = new Set();\n        return filterList(array, function (elem, index) {\n            const mapped = mapper(elem, index);\n            if (seenElements.has(mapped)) {\n                return false;\n            }\n            else {\n                seenElements.add(mapped);\n                return true;\n            }\n        });\n    }\n    function setToArray(set) {\n        const array = [];\n        set.forEach(elem => array.push(elem));\n        return array;\n    }\n    function arrayToSet(array) {\n        const set = new Set();\n        array.forEach(elem => set.add(elem));\n        return set;\n    }\n    function filterList(list, tester) {\n        tester = iteratee(tester);\n        const matches = [];\n        each(list, function (element, index) {\n            if (tester(element, index)) {\n                return matches.push(element);\n            }\n        });\n        return matches;\n    }\n    function reject(list, tester) {\n        tester = negate(iteratee(tester));\n        return filterList(list, tester);\n    }\n    function intersect(array1, array2) {\n        return filterList(array1, element => contains(array2, element));\n    }\n    function scheduleTimer(millis, callback) {\n        return setTimeout(callback, millis);\n    }\n    function queueTask(task) {\n        return setTimeout(task);\n    }\n    function queueMicrotask(task) {\n        return Promise.resolve().then(task);\n    }\n    function abortableMicrotask(task) {\n        let aborted = false;\n        queueMicrotask(function () { if (!aborted) {\n            return task();\n        } });\n        return () => aborted = true;\n    }\n    function last(array) {\n        return array[array.length - 1];\n    }\n    function contains(value, subValue) {\n        return value.indexOf(subValue) >= 0;\n    }\n    function objectContains(object, subObject) {\n        const reducedValue = pick(object, Object.keys(subObject));\n        return isEqual(subObject, reducedValue);\n    }\n    function pick(object, keys) {\n        const filtered = {};\n        for (let key of keys) {\n            if (key in object) {\n                filtered[key] = object[key];\n            }\n        }\n        return filtered;\n    }\n    function pickBy(object, tester) {\n        tester = iteratee(tester);\n        const filtered = {};\n        for (let key in object) {\n            const value = object[key];\n            if (tester(value, key, object)) {\n                filtered[key] = object[key];\n            }\n        }\n        return filtered;\n    }\n    function omit(object, keys) {\n        return pickBy(object, (_value, key) => !contains(keys, key));\n    }\n    function unresolvablePromise() {\n        return new Promise(noop);\n    }\n    function remove(array, element) {\n        const index = array.indexOf(element);\n        if (index >= 0) {\n            array.splice(index, 1);\n            return element;\n        }\n    }\n    function evalOption(value, ...args) {\n        return isFunction(value) ? value(...args) : value;\n    }\n    const ESCAPE_HTML_ENTITY_MAP = {\n        \"&\": \"&amp;\",\n        \"<\": \"&lt;\",\n        \">\": \"&gt;\",\n        '\"': '&quot;',\n        \"'\": '&#x27;'\n    };\n    function escapeHTML(string) {\n        return string.replace(/[&<>\"']/g, char => ESCAPE_HTML_ENTITY_MAP[char]);\n    }\n    function escapeRegExp(string) {\n        return string.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n    function pluckKey(object, key) {\n        const value = object[key];\n        delete object[key];\n        return value;\n    }\n    function renameKey(object, oldKey, newKey) {\n        return object[newKey] = pluckKey(object, oldKey);\n    }\n    function extractLastArg(args, tester) {\n        if (tester(last(args))) {\n            return args.pop();\n        }\n    }\n    function extractCallback(args) {\n        return extractLastArg(args, isFunction);\n    }\n    function extractOptions(args) {\n        return extractLastArg(args, isOptions) || {};\n    }\n    function identity(arg) {\n        return arg;\n    }\n    function sequence(functions) {\n        if (functions.length === 1) {\n            return functions[0];\n        }\n        return () => map(functions, fn => fn());\n    }\n    function flatten(array) {\n        const flattened = [];\n        for (let object of array) {\n            if (isList(object)) {\n                flattened.push(...object);\n            }\n            else {\n                flattened.push(object);\n            }\n        }\n        return flattened;\n    }\n    function flatMap(array, block) {\n        return flatten(map(array, block));\n    }\n    function isTruthy(object) {\n        return !!object;\n    }\n    function always(promise, callback) {\n        return promise.then(callback, callback);\n    }\n    function muteRejection(promise) {\n        return promise?.catch(noop);\n    }\n    function newDeferred() {\n        let resolveFn;\n        let rejectFn;\n        const nativePromise = new Promise(function (givenResolve, givenReject) {\n            resolveFn = givenResolve;\n            rejectFn = givenReject;\n        });\n        nativePromise.resolve = resolveFn;\n        nativePromise.reject = rejectFn;\n        nativePromise.promise = () => nativePromise;\n        return nativePromise;\n    }\n    function asyncify(block) {\n        try {\n            return Promise.resolve(block());\n        }\n        catch (error) {\n            return Promise.reject(error);\n        }\n    }\n    function isBasicObjectProperty(k) {\n        return Object.prototype.hasOwnProperty(k);\n    }\n    function isEqual(a, b) {\n        if (a?.valueOf) {\n            a = a.valueOf();\n        }\n        if (b?.valueOf) {\n            b = b.valueOf();\n        }\n        if (typeof (a) !== typeof (b)) {\n            return false;\n        }\n        else if (isList(a) && isList(b)) {\n            return isEqualList(a, b);\n        }\n        else if (isObject(a) && a[isEqual.key]) {\n            return a[isEqual.key](b);\n        }\n        else if (isOptions(a) && isOptions(b)) {\n            const aKeys = Object.keys(a);\n            const bKeys = Object.keys(b);\n            if (isEqualList(aKeys, bKeys)) {\n                return every(aKeys, aKey => isEqual(a[aKey], b[aKey]));\n            }\n            else {\n                return false;\n            }\n        }\n        else {\n            return a === b;\n        }\n    }\n    isEqual.key = 'up.util.isEqual';\n    function isEqualList(a, b) {\n        return (a.length === b.length) && every(a, (elem, index) => isEqual(elem, b[index]));\n    }\n    function splitValues(value, separator = ' ') {\n        if (isString(value)) {\n            value = value.split(separator);\n            value = map(value, v => v.trim());\n            value = filterList(value, isPresent);\n            return value;\n        }\n        else {\n            return wrapList(value);\n        }\n    }\n    function endsWith(string, search) {\n        return string.substring(string.length - search.length) === search;\n    }\n    function simpleEase(x) {\n        return x < 0.5 ? 2 * x * x : (x * (4 - (x * 2))) - 1;\n    }\n    function wrapValue(constructor, ...args) {\n        return (args[0] instanceof constructor) ? args[0] : new constructor(...args);\n    }\n    let nextUid = 0;\n    function uid() {\n        return nextUid++;\n    }\n    function reverse(list) {\n        return copy(list).reverse();\n    }\n    function renameKeys(object, renameKeyFn) {\n        const renamed = {};\n        for (let key in object) {\n            renamed[renameKeyFn(key)] = object[key];\n        }\n        return renamed;\n    }\n    function camelToKebabCase(str) {\n        return str.replace(/[A-Z]/g, char => '-' + char.toLowerCase());\n    }\n    function prefixCamelCase(str, prefix) {\n        return prefix + upperCaseFirst(str);\n    }\n    function unprefixCamelCase(str, prefix) {\n        const pattern = new RegExp('^' + prefix + '(.+)$');\n        let match = str.match(pattern);\n        if (match) {\n            return lowerCaseFirst(match[1]);\n        }\n    }\n    function lowerCaseFirst(str) {\n        return str[0].toLowerCase() + str.slice(1);\n    }\n    function upperCaseFirst(str) {\n        return str[0].toUpperCase() + str.slice(1);\n    }\n    function defineGetter(object, prop, get) {\n        Object.defineProperty(object, prop, { get });\n    }\n    function defineDelegates(object, props, targetProvider) {\n        wrapList(props).forEach(function (prop) {\n            Object.defineProperty(object, prop, {\n                get() {\n                    const target = targetProvider.call(this);\n                    let value = target[prop];\n                    if (isFunction(value)) {\n                        value = value.bind(target);\n                    }\n                    return value;\n                },\n                set(newValue) {\n                    const target = targetProvider.call(this);\n                    target[prop] = newValue;\n                }\n            });\n        });\n    }\n    function stringifyArg(arg) {\n        let string;\n        const maxLength = 200;\n        let closer = '';\n        if (isString(arg)) {\n            string = arg.replace(/[\\n\\r\\t ]+/g, ' ');\n            string = string.replace(/^[\\n\\r\\t ]+/, '');\n            string = string.replace(/[\\n\\r\\t ]$/, '');\n        }\n        else if (isUndefined(arg)) {\n            string = 'undefined';\n        }\n        else if (isNumber(arg) || isFunction(arg)) {\n            string = arg.toString();\n        }\n        else if (isArray(arg)) {\n            string = `[${map(arg, stringifyArg).join(', ')}]`;\n            closer = ']';\n        }\n        else if (isJQuery(arg)) {\n            string = `$(${map(arg, stringifyArg).join(', ')})`;\n            closer = ')';\n        }\n        else if (isElement(arg)) {\n            string = `<${arg.tagName.toLowerCase()}`;\n            for (let attr of ['id', 'name', 'class']) {\n                let value = arg.getAttribute(attr);\n                if (value) {\n                    string += ` ${attr}=\"${value}\"`;\n                }\n            }\n            string += \">\";\n            closer = '>';\n        }\n        else if (isRegExp(arg)) {\n            string = arg.toString();\n        }\n        else {\n            try {\n                string = JSON.stringify(arg);\n            }\n            catch (error) {\n                if (error.name === 'TypeError') {\n                    string = '(circular structure)';\n                }\n                else {\n                    throw error;\n                }\n            }\n        }\n        if (string.length > maxLength) {\n            string = `${string.substr(0, maxLength)} \u2026`;\n            string += closer;\n        }\n        return string;\n    }\n    const SPRINTF_PLACEHOLDERS = /%[oOdisf]/g;\n    function secondsSinceEpoch() {\n        return Math.floor(Date.now() * 0.001);\n    }\n    function sprintf(message, ...args) {\n        return sprintfWithFormattedArgs(identity, message, ...args);\n    }\n    function sprintfWithFormattedArgs(formatter, message, ...args) {\n        if (!message) {\n            return '';\n        }\n        let i = 0;\n        return message.replace(SPRINTF_PLACEHOLDERS, function () {\n            let arg = args[i];\n            arg = formatter(stringifyArg(arg));\n            i += 1;\n            return arg;\n        });\n    }\n    function allSettled(promises) {\n        return Promise.all(map(promises, muteRejection));\n    }\n    function negate(fn) {\n        return function (...args) {\n            return !fn(...args);\n        };\n    }\n    return {\n        parseURL,\n        normalizeURL,\n        matchURLs,\n        normalizeMethod,\n        methodAllowsPayload,\n        assign,\n        assignPolyfill,\n        copy,\n        copyArrayLike,\n        merge,\n        mergeDefined,\n        options: newOptions,\n        parseArgIntoOptions,\n        each,\n        eachIterator,\n        map,\n        flatMap,\n        mapObject,\n        findResult,\n        some,\n        every,\n        find: findInList,\n        filter: filterList,\n        reject,\n        intersect,\n        compact,\n        compactObject,\n        uniq,\n        uniqBy,\n        last,\n        isNull,\n        isDefined,\n        isUndefined,\n        isGiven,\n        isMissing,\n        isPresent,\n        isBlank,\n        presence,\n        isObject,\n        isFunction,\n        isString,\n        isBoolean,\n        isNumber,\n        isElement,\n        isJQuery,\n        isElementish,\n        isPromise,\n        isOptions,\n        isArray,\n        isFormData,\n        isNodeList,\n        isArguments,\n        isList,\n        isRegExp,\n        timer: scheduleTimer,\n        contains,\n        objectContains,\n        toArray,\n        pick,\n        pickBy,\n        omit,\n        unresolvablePromise,\n        remove,\n        memoize,\n        pluckKey,\n        renameKey,\n        extractOptions,\n        extractCallback,\n        noop,\n        asyncNoop,\n        identity,\n        escapeHTML,\n        escapeRegExp,\n        sequence,\n        evalOption,\n        flatten,\n        isTruthy,\n        newDeferred,\n        always,\n        muteRejection,\n        asyncify,\n        isBasicObjectProperty,\n        isCrossOrigin,\n        task: queueTask,\n        microtask: queueMicrotask,\n        abortableMicrotask,\n        isEqual,\n        splitValues,\n        endsWith,\n        wrapList,\n        wrapValue,\n        simpleEase,\n        values: objectValues,\n        arrayToSet,\n        setToArray,\n        uid,\n        upperCaseFirst,\n        lowerCaseFirst,\n        getter: defineGetter,\n        delegate: defineDelegates,\n        reverse,\n        prefixCamelCase,\n        unprefixCamelCase,\n        camelToKebabCase,\n        nullToUndefined,\n        sprintf,\n        sprintfWithFormattedArgs,\n        renameKeys,\n        timestamp: secondsSinceEpoch,\n        allSettled,\n        negate,\n    };\n})();\n\n\n/***/ }),\n/* 4 */\n/***/ (() => {\n\nup.error = (function () {\n    const u = up.util;\n    function build(message, props = {}) {\n        if (u.isArray(message)) {\n            message = u.sprintf(...message);\n        }\n        const error = new Error(message);\n        u.assign(error, props);\n        return error;\n    }\n    function errorInterface(name, init = build) {\n        const fn = function (...args) {\n            const error = init(...args);\n            error.name = name;\n            return error;\n        };\n        fn.is = error => error.name === name;\n        fn.async = (...args) => Promise.reject(fn(...args));\n        return fn;\n    }\n    const failed = errorInterface('up.Failed');\n    const aborted = errorInterface('AbortError', (message) => {\n        return build(message || 'Aborted');\n    });\n    const notImplemented = errorInterface('up.NotImplemented');\n    const notApplicable = errorInterface('up.NotApplicable', (change, reason) => {\n        return build(`Cannot apply change: ${change} (${reason})`);\n    });\n    const invalidSelector = errorInterface('up.InvalidSelector', (selector) => {\n        return build(`Cannot parse selector: ${selector}`);\n    });\n    function emitGlobal(error) {\n        const { message } = error;\n        up.emit(window, 'error', { message, error, log: false });\n    }\n    function fail(...args) {\n        throw up.error.failed(args);\n    }\n    return {\n        fail,\n        failed,\n        aborted,\n        invalidSelector,\n        notApplicable,\n        notImplemented,\n        emitGlobal\n    };\n})();\nup.fail = up.error.fail;\n\n\n/***/ }),\n/* 5 */\n/***/ (() => {\n\nup.migrate = { config: {} };\n\n\n/***/ }),\n/* 6 */\n/***/ (() => {\n\nup.browser = (function () {\n    const u = up.util;\n    function submitForm(form) {\n        form.submit();\n    }\n    function isIE11() {\n        return 'ActiveXObject' in window;\n    }\n    function isEdge18() {\n        return u.contains(navigator.userAgent, ' Edge/');\n    }\n    function canPushState() {\n        return history.pushState && up.protocol.initialRequestMethod() === 'GET';\n    }\n    function canPromise() {\n        return !!window.Promise;\n    }\n    const canFormatLog = u.negate(isIE11);\n    const canPassiveEventListener = u.negate(isIE11);\n    function canJQuery() {\n        return !!window.jQuery;\n    }\n    const canEval = u.memoize(function () {\n        try {\n            return new Function('return true')();\n        }\n        catch {\n            return false;\n        }\n    });\n    function popCookie(name) {\n        let value = document.cookie.match(new RegExp(name + \"=(\\\\w+)\"))?.[1];\n        if (value) {\n            document.cookie = name + '=;Max-Age=0;Path=/';\n            return value;\n        }\n    }\n    const getJQuery = function () {\n        if (!canJQuery()) {\n            up.fail('jQuery must be published as window.jQuery');\n        }\n        return jQuery;\n    };\n    function assertConfirmed(options) {\n        const confirmed = !options.confirm || window.confirm(options.confirm);\n        if (!confirmed) {\n            throw up.error.aborted('User canceled action');\n        }\n        return true;\n    }\n    return {\n        submitForm,\n        canPushState,\n        canFormatLog,\n        canPassiveEventListener,\n        canJQuery,\n        canPromise,\n        canEval,\n        assertConfirmed,\n        popCookie,\n        get jQuery() { return getJQuery(); },\n        isIE11,\n        isEdge18,\n    };\n})();\n\n\n/***/ }),\n/* 7 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(8);\nup.element = (function () {\n    const u = up.util;\n    const MATCH_FN_NAME = up.browser.isIE11() ? 'msMatchesSelector' : 'matches';\n    function first(...args) {\n        const selector = args.pop();\n        const root = args[0] || document;\n        return root.querySelector(selector);\n    }\n    function all(...args) {\n        const selector = args.pop();\n        const root = args[0] || document;\n        return root.querySelectorAll(selector);\n    }\n    function subtree(root, selector) {\n        const results = [];\n        if (matches(root, selector)) {\n            results.push(root);\n        }\n        results.push(...all(root, selector));\n        return results;\n    }\n    function isInSubtree(root, selectorOrElement) {\n        const element = getOne(selectorOrElement);\n        return root.contains(element);\n    }\n    function closest(element, selector) {\n        if (element.closest) {\n            return element.closest(selector);\n        }\n        else if (matches(element, selector)) {\n            return element;\n        }\n        else {\n            return ancestor(element, selector);\n        }\n    }\n    function matches(element, selector) {\n        return element[MATCH_FN_NAME]?.(selector);\n    }\n    function ancestor(element, selector) {\n        let parentElement = element.parentElement;\n        if (parentElement) {\n            if (matches(parentElement, selector)) {\n                return parentElement;\n            }\n            else {\n                return ancestor(parentElement, selector);\n            }\n        }\n    }\n    function around(element, selector) {\n        return getList(closest(element, selector), subtree(element, selector));\n    }\n    function getOne(...args) {\n        const value = args.pop();\n        if (u.isElement(value)) {\n            return value;\n        }\n        else if (u.isString(value)) {\n            return first(...args, value);\n        }\n        else if (u.isList(value)) {\n            if (value.length > 1) {\n                up.fail('up.element.get(): Cannot cast multiple elements (%o) to a single element', value);\n            }\n            return value[0];\n        }\n        else {\n            return value;\n        }\n    }\n    function getList(...args) {\n        return u.flatMap(args, valueToList);\n    }\n    function valueToList(value) {\n        if (u.isString(value)) {\n            return all(value);\n        }\n        else {\n            return u.wrapList(value);\n        }\n    }\n    function remove(element) {\n        let parent = element.parentNode;\n        if (parent) {\n            parent.removeChild(element);\n        }\n    }\n    function hide(element) {\n        element.setAttribute('hidden', '');\n    }\n    function show(element) {\n        element.removeAttribute('hidden');\n        if (element.style.display === 'none') {\n            element.style.display = '';\n        }\n    }\n    function toggle(element, newVisible) {\n        if (newVisible == null) {\n            newVisible = !isVisible(element);\n        }\n        (newVisible ? show : hide)(element);\n    }\n    function toggleClass(element, klass, newPresent) {\n        const list = element.classList;\n        if (newPresent == null) {\n            newPresent = !list.contains(klass);\n        }\n        if (newPresent) {\n            return list.add(klass);\n        }\n        else {\n            return list.remove(klass);\n        }\n    }\n    function toggleAttr(element, attr, value, newPresent) {\n        if (newPresent == null) {\n            newPresent = !element.hasAttribute(attr);\n        }\n        if (newPresent) {\n            return element.setAttribute(attr, value);\n        }\n        else {\n            return element.removeAttribute(attr);\n        }\n    }\n    function setAttrs(element, attrs) {\n        for (let key in attrs) {\n            const value = attrs[key];\n            if (u.isGiven(value)) {\n                element.setAttribute(key, value);\n            }\n            else {\n                element.removeAttribute(key);\n            }\n        }\n    }\n    function setTemporaryAttrs(element, attrs) {\n        const oldAttrs = {};\n        for (let key of Object.keys(attrs)) {\n            oldAttrs[key] = element.getAttribute(key);\n        }\n        setAttrs(element, attrs);\n        return () => setAttrs(element, oldAttrs);\n    }\n    function metaContent(name) {\n        const selector = \"meta\" + attributeSelector('name', name);\n        return first(selector)?.getAttribute('content');\n    }\n    function insertBefore(existingElement, newElement) {\n        existingElement.insertAdjacentElement('beforebegin', newElement);\n    }\n    function replace(oldElement, newElement) {\n        oldElement.parentElement.replaceChild(newElement, oldElement);\n    }\n    function createFromSelector(selector, attrs) {\n        const attrValues = [];\n        const selectorWithoutAttrValues = selector.replace(/\\[([\\w-]+)(?:[~|^$*]?=([\"'])?([^\\2\\]]*?)\\2)?\\]/g, function (_match, attrName, _quote, attrValue) {\n            attrValues.push(attrValue || '');\n            return `[${attrName}]`;\n        });\n        const depths = selectorWithoutAttrValues.split(/[ >]+/);\n        let rootElement;\n        let depthElement;\n        let previousElement;\n        for (let depthSelector of depths) {\n            let tagName;\n            depthSelector = depthSelector.replace(/^[\\w-]+/, function (match) {\n                tagName = match;\n                return '';\n            });\n            depthElement = document.createElement(tagName || 'div');\n            if (!rootElement) {\n                rootElement = depthElement;\n            }\n            depthSelector = depthSelector.replace(/#([\\w-]+)/, function (_match, id) {\n                depthElement.id = id;\n                return '';\n            });\n            depthSelector = depthSelector.replace(/\\.([\\w-]+)/g, function (_match, className) {\n                depthElement.classList.add(className);\n                return '';\n            });\n            if (attrValues.length) {\n                depthSelector = depthSelector.replace(/\\[([\\w-]+)\\]/g, function (_match, attrName) {\n                    depthElement.setAttribute(attrName, attrValues.shift());\n                    return '';\n                });\n            }\n            if (depthSelector !== '') {\n                throw up.error.invalidSelector(selector);\n            }\n            previousElement?.appendChild(depthElement);\n            previousElement = depthElement;\n        }\n        if (attrs) {\n            let value;\n            if (value = u.pluckKey(attrs, 'class')) {\n                for (let klass of u.wrapList(value)) {\n                    rootElement.classList.add(klass);\n                }\n            }\n            if (value = u.pluckKey(attrs, 'style')) {\n                setInlineStyle(rootElement, value);\n            }\n            if (value = u.pluckKey(attrs, 'text')) {\n                rootElement.textContent = value;\n            }\n            if (value = u.pluckKey(attrs, 'content')) {\n                rootElement.innerHTML = value;\n            }\n            setAttrs(rootElement, attrs);\n        }\n        return rootElement;\n    }\n    function affix(parent, ...args) {\n        let position, selector;\n        const attributes = u.extractOptions(args);\n        if (args.length === 2) {\n            [position, selector] = args;\n        }\n        else {\n            position = 'beforeend';\n            selector = args[0];\n        }\n        const element = createFromSelector(selector, attributes);\n        parent.insertAdjacentElement(position, element);\n        return element;\n    }\n    function toSelector(...args) {\n        return up.fragment.toTarget(...args);\n    }\n    const SINGLETON_TAG_NAMES = ['HTML', 'BODY', 'HEAD', 'TITLE'];\n    const SINGLETON_PATTERN = new RegExp('\\\\b(' + SINGLETON_TAG_NAMES.join('|') + ')\\\\b', 'i');\n    const isSingleton = up.mockable(element => matches(element, SINGLETON_TAG_NAMES.join(',')));\n    function isSingletonSelector(selector) {\n        return SINGLETON_PATTERN.test(selector);\n    }\n    function elementTagName(element) {\n        return element.tagName.toLowerCase();\n    }\n    function attributeSelector(attribute, value) {\n        value = value.replace(/\"/g, '\\\\\"');\n        return `[${attribute}=\"${value}\"]`;\n    }\n    function trueAttributeSelector(attribute) {\n        return `[${attribute}]:not([${attribute}=false])`;\n    }\n    function idSelector(id) {\n        if (id.match(/^[a-z0-9\\-_]+$/i)) {\n            return `#${id}`;\n        }\n        else {\n            return attributeSelector('id', id);\n        }\n    }\n    function classSelector(klass) {\n        klass = klass.replace(/:/g, '\\\\:');\n        return `.${klass}`;\n    }\n    function createDocumentFromHTML(html) {\n        return new DOMParser().parseFromString(html, 'text/html');\n    }\n    function createFromHTML(html) {\n        const range = document.createRange();\n        range.setStart(document.body, 0);\n        const fragment = range.createContextualFragment(html.trim());\n        let elements = fragment.childNodes;\n        if (elements.length !== 1) {\n            throw new Error('HTML must have a single root element');\n        }\n        return elements[0];\n    }\n    function getRoot() {\n        return document.documentElement;\n    }\n    function paint(element) {\n        element.offsetHeight;\n    }\n    function concludeCSSTransition(element) {\n        const undo = setTemporaryStyle(element, { transition: 'none' });\n        paint(element);\n        return undo;\n    }\n    function hasCSSTransition(elementOrStyleHash) {\n        let styleHash;\n        if (u.isOptions(elementOrStyleHash)) {\n            styleHash = elementOrStyleHash;\n        }\n        else {\n            styleHash = computedStyle(elementOrStyleHash);\n        }\n        const prop = styleHash.transitionProperty;\n        const duration = styleHash.transitionDuration;\n        const noTransition = ((prop === 'none') || ((prop === 'all') && (duration === 0)));\n        return !noTransition;\n    }\n    function fixedToAbsolute(element) {\n        const elementRectAsFixed = element.getBoundingClientRect();\n        element.style.position = 'absolute';\n        const offsetParentRect = element.offsetParent.getBoundingClientRect();\n        setInlineStyle(element, {\n            left: elementRectAsFixed.left - computedStyleNumber(element, 'margin-left') - offsetParentRect.left,\n            top: elementRectAsFixed.top - computedStyleNumber(element, 'margin-top') - offsetParentRect.top,\n            right: '',\n            bottom: ''\n        });\n    }\n    function setMissingAttrs(element, attrs) {\n        for (let key in attrs) {\n            setMissingAttr(element, key, attrs[key]);\n        }\n    }\n    function setMissingAttr(element, key, value) {\n        if (u.isMissing(element.getAttribute(key))) {\n            element.setAttribute(key, value);\n        }\n    }\n    function unwrap(wrapper) {\n        const parent = wrapper.parentNode;\n        const wrappedNodes = u.toArray(wrapper.childNodes);\n        u.each(wrappedNodes, wrappedNode => parent.insertBefore(wrappedNode, wrapper));\n        parent.removeChild(wrapper);\n    }\n    function wrapChildren(element, wrapperSelector = 'up-wrapper') {\n        let childNode;\n        const wrapper = createFromSelector(wrapperSelector);\n        while ((childNode = element.firstChild)) {\n            wrapper.appendChild(childNode);\n        }\n        element.appendChild(wrapper);\n        return wrapper;\n    }\n    function stringAttr(element, attribute) {\n        return u.nullToUndefined(element.getAttribute(attribute));\n    }\n    function booleanAttr(element, attribute, pass) {\n        const value = stringAttr(element, attribute);\n        switch (value) {\n            case 'false': {\n                return false;\n            }\n            case 'true':\n            case '':\n            case attribute: {\n                return true;\n            }\n            default: {\n                if (pass) {\n                    return value;\n                }\n            }\n        }\n    }\n    function booleanOrStringAttr(element, attribute) {\n        return booleanAttr(element, attribute, true);\n    }\n    function numberAttr(element, attribute) {\n        let value = element.getAttribute(attribute);\n        if (value) {\n            value = value.replace(/_/g, '');\n            if (value.match(/^[\\d.]+$/)) {\n                return parseFloat(value);\n            }\n        }\n    }\n    function jsonAttr(element, attribute) {\n        let json = element.getAttribute?.(attribute)?.trim();\n        if (json) {\n            return JSON.parse(json);\n        }\n    }\n    function callbackAttr(link, attr, exposedKeys = []) {\n        let code = link.getAttribute(attr);\n        if (code) {\n            const callback = up.NonceableCallback.fromString(code).toFunction('event', ...exposedKeys);\n            return function (event) {\n                const exposedValues = u.values(u.pick(event, exposedKeys));\n                return callback.call(link, event, ...exposedValues);\n            };\n        }\n    }\n    function closestAttr(element, attr) {\n        return closest(element, '[' + attr + ']')?.getAttribute(attr);\n    }\n    function setTemporaryStyle(element, newStyles) {\n        const oldStyles = inlineStyle(element, Object.keys(newStyles));\n        setInlineStyle(element, newStyles);\n        return () => setInlineStyle(element, oldStyles);\n    }\n    function computedStyle(element, props) {\n        const style = window.getComputedStyle(element);\n        return extractFromStyleObject(style, props);\n    }\n    function computedStyleNumber(element, prop) {\n        const rawValue = computedStyle(element, prop);\n        if (u.isGiven(rawValue)) {\n            return parseFloat(rawValue);\n        }\n    }\n    function inlineStyle(element, props) {\n        const { style } = element;\n        return extractFromStyleObject(style, props);\n    }\n    function extractFromStyleObject(style, keyOrKeys) {\n        if (u.isString(keyOrKeys)) {\n            return style[keyOrKeys];\n        }\n        else {\n            return u.pick(style, keyOrKeys);\n        }\n    }\n    function setInlineStyle(element, props) {\n        if (u.isString(props)) {\n            element.setAttribute('style', props);\n        }\n        else {\n            const { style } = element;\n            for (let key in props) {\n                let value = props[key];\n                value = normalizeStyleValueForWrite(key, value);\n                style[key] = value;\n            }\n        }\n    }\n    function normalizeStyleValueForWrite(key, value) {\n        if (u.isMissing(value)) {\n            value = '';\n        }\n        else if (CSS_LENGTH_PROPS.has(key.toLowerCase().replace(/-/, ''))) {\n            value = cssLength(value);\n        }\n        return value;\n    }\n    const CSS_LENGTH_PROPS = u.arrayToSet([\n        'top', 'right', 'bottom', 'left',\n        'padding', 'paddingtop', 'paddingright', 'paddingbottom', 'paddingleft',\n        'margin', 'margintop', 'marginright', 'marginbottom', 'marginleft',\n        'borderwidth', 'bordertopwidth', 'borderrightwidth', 'borderbottomwidth', 'borderleftwidth',\n        'width', 'height',\n        'maxwidth', 'maxheight',\n        'minwidth', 'minheight',\n    ]);\n    function cssLength(obj) {\n        if (u.isNumber(obj) || (u.isString(obj) && /^\\d+$/.test(obj))) {\n            return obj.toString() + \"px\";\n        }\n        else {\n            return obj;\n        }\n    }\n    function isVisible(element) {\n        return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n    }\n    function upAttrs(element) {\n        const upAttributePattern = /^up-/;\n        const attrs = {};\n        for (let attribute of element.attributes) {\n            const { name } = attribute;\n            if (name.match(upAttributePattern)) {\n                attrs[name] = attribute.value;\n            }\n        }\n        return attrs;\n    }\n    function isDetached(element) {\n        return (element !== document) && !getRoot().contains(element);\n    }\n    return {\n        all,\n        subtree,\n        isInSubtree,\n        closest,\n        closestAttr,\n        matches,\n        ancestor,\n        around,\n        get: getOne,\n        list: getList,\n        remove,\n        toggle,\n        toggleClass,\n        hide,\n        show,\n        metaContent,\n        replace,\n        insertBefore,\n        createFromSelector,\n        setAttrs,\n        setTemporaryAttrs,\n        affix,\n        toSelector,\n        idSelector,\n        classSelector,\n        isSingleton,\n        isSingletonSelector,\n        attributeSelector,\n        trueAttributeSelector,\n        tagName: elementTagName,\n        createDocumentFromHTML,\n        createFromHTML,\n        get root() { return getRoot(); },\n        paint,\n        concludeCSSTransition,\n        hasCSSTransition,\n        fixedToAbsolute,\n        setMissingAttrs,\n        setMissingAttr,\n        unwrap,\n        wrapChildren,\n        attr: stringAttr,\n        booleanAttr,\n        numberAttr,\n        jsonAttr,\n        callbackAttr,\n        booleanOrStringAttr,\n        setTemporaryStyle,\n        style: computedStyle,\n        styleNumber: computedStyleNumber,\n        inlineStyle,\n        setStyle: setInlineStyle,\n        isVisible,\n        upAttrs,\n        toggleAttr,\n        isDetached\n    };\n})();\n\n\n/***/ }),\n/* 8 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 9 */\n/***/ (() => {\n\nconst u = up.util;\nup.Record = class Record {\n    keys() {\n        throw 'Return an array of keys';\n    }\n    defaults(_options) {\n        return {};\n    }\n    constructor(options) {\n        u.assign(this, this.defaults(options), this.attributes(options));\n    }\n    attributes(source = this) {\n        return u.pick(source, this.keys());\n    }\n    [u.copy.key]() {\n        return this.variant();\n    }\n    variant(changes = {}) {\n        return new this.constructor(u.merge(this.attributes(), changes));\n    }\n    [u.isEqual.key](other) {\n        return (this.constructor === other.constructor) && u.isEqual(this.attributes(), other.attributes());\n    }\n};\n\n\n/***/ }),\n/* 10 */\n/***/ (() => {\n\nconst u = up.util;\nup.Config = class Config {\n    constructor(blueprintFn = (() => ({}))) {\n        this.blueprintFn = blueprintFn;\n        this.reset();\n    }\n    reset() {\n        u.assign(this, this.blueprintFn());\n    }\n};\n\n\n/***/ }),\n/* 11 */\n/***/ (() => {\n\nconst u = up.util;\nup.Cache = class Cache {\n    constructor(config = {}) {\n        this.config = config;\n        this.store = this.config.store || new up.store.Memory();\n    }\n    size() {\n        return this.store.size();\n    }\n    maxSize() {\n        return u.evalOption(this.config.size);\n    }\n    expiryMillis() {\n        return u.evalOption(this.config.expiry);\n    }\n    normalizeStoreKey(key) {\n        if (this.config.key) {\n            return this.config.key(key);\n        }\n        else {\n            return key.toString();\n        }\n    }\n    isEnabled() {\n        return (this.maxSize() !== 0) && (this.expiryMillis() !== 0);\n    }\n    clear() {\n        this.store.clear();\n    }\n    keys() {\n        return this.store.keys();\n    }\n    each(fn) {\n        u.each(this.keys(), key => {\n            const entry = this.store.get(key);\n            fn(key, entry.value, entry.timestamp);\n        });\n    }\n    makeRoomForAnotherEntry() {\n        if (this.hasRoomForAnotherEntry()) {\n            return;\n        }\n        let oldestKey;\n        let oldestTimestamp;\n        this.each(function (key, request, timestamp) {\n            if (!oldestTimestamp || (oldestTimestamp > timestamp)) {\n                oldestKey = key;\n                oldestTimestamp = timestamp;\n            }\n        });\n        if (oldestKey) {\n            this.store.remove(oldestKey);\n        }\n    }\n    hasRoomForAnotherEntry() {\n        const maxSize = this.maxSize();\n        return !maxSize || (this.size() < maxSize);\n    }\n    alias(oldKey, newKey) {\n        const value = this.get(oldKey, { silent: true });\n        if (u.isDefined(value)) {\n            this.set(newKey, value);\n        }\n    }\n    timestamp() {\n        return (new Date()).valueOf();\n    }\n    set(key, value) {\n        if (this.isEnabled()) {\n            this.makeRoomForAnotherEntry();\n            const storeKey = this.normalizeStoreKey(key);\n            const entry = {\n                timestamp: this.timestamp(),\n                value\n            };\n            this.store.set(storeKey, entry);\n        }\n    }\n    remove(key) {\n        const storeKey = this.normalizeStoreKey(key);\n        this.store.remove(storeKey);\n    }\n    isFresh(entry) {\n        const millis = this.expiryMillis();\n        if (millis) {\n            const timeSinceTouch = this.timestamp() - entry.timestamp;\n            return timeSinceTouch < millis;\n        }\n        else {\n            return true;\n        }\n    }\n    get(key) {\n        const storeKey = this.normalizeStoreKey(key);\n        let entry = this.store.get(storeKey);\n        if (entry) {\n            if (this.isFresh(entry)) {\n                return entry.value;\n            }\n            else {\n                this.remove(key);\n            }\n        }\n    }\n};\n\n\n/***/ }),\n/* 12 */\n/***/ (() => {\n\nup.Rect = class Rect extends up.Record {\n    keys() {\n        return [\n            'left',\n            'top',\n            'width',\n            'height'\n        ];\n    }\n    get bottom() {\n        return this.top + this.height;\n    }\n    get right() {\n        return this.left + this.width;\n    }\n    static fromElement(element) {\n        return new (this)(element.getBoundingClientRect());\n    }\n};\n\n\n/***/ }),\n/* 13 */\n/***/ (() => {\n\nconst e = up.element;\nup.BodyShifter = class BodyShifter {\n    constructor() {\n        this.unshiftFns = [];\n        this.reset();\n    }\n    reset() {\n        this.unshiftNow();\n        this.shiftCount = 0;\n    }\n    shift() {\n        this.shiftCount++;\n        if (this.shiftCount > 1) {\n            return;\n        }\n        const scrollbarTookSpace = up.viewport.rootHasReducedWidthFromScrollbar();\n        const overflowElement = up.viewport.rootOverflowElement();\n        this.changeStyle(overflowElement, { overflowY: 'hidden' });\n        if (!scrollbarTookSpace) {\n            return;\n        }\n        const { body } = document;\n        const scrollbarWidth = up.viewport.scrollbarWidth();\n        const bodyRightPadding = e.styleNumber(body, 'paddingRight');\n        const bodyRightShift = scrollbarWidth + bodyRightPadding;\n        this.changeStyle(body, { paddingRight: bodyRightShift });\n        for (let anchor of up.viewport.anchoredRight()) {\n            const elementRight = e.styleNumber(anchor, 'right');\n            const elementRightShift = scrollbarWidth + elementRight;\n            this.changeStyle(anchor, { right: elementRightShift });\n        }\n    }\n    changeStyle(element, styles) {\n        this.unshiftFns.push(e.setTemporaryStyle(element, styles));\n    }\n    unshift() {\n        this.shiftCount--;\n        if (this.shiftCount == 0) {\n            this.unshiftNow();\n        }\n    }\n    unshiftNow() {\n        let unshiftFn;\n        while (unshiftFn = this.unshiftFns.pop()) {\n            unshiftFn();\n        }\n    }\n};\n\n\n/***/ }),\n/* 14 */\n/***/ (() => {\n\nconst u = up.util;\nup.Change = class Change {\n    constructor(options) {\n        this.options = options;\n    }\n    notApplicable(reason) {\n        return up.error.notApplicable(this, reason);\n    }\n    execute() {\n        throw up.error.notImplemented();\n    }\n    onFinished() {\n        return this.options.onFinished?.();\n    }\n    improveHistoryValue(existingValue, newValue) {\n        if ((existingValue === false) || u.isString(existingValue)) {\n            return existingValue;\n        }\n        else {\n            return newValue;\n        }\n    }\n};\n\n\n/***/ }),\n/* 15 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.Change.Addition = class Addition extends up.Change {\n    constructor(options) {\n        super(options);\n        this.responseDoc = options.responseDoc;\n        this.acceptLayer = options.acceptLayer;\n        this.dismissLayer = options.dismissLayer;\n        this.eventPlans = options.eventPlans || [];\n    }\n    handleLayerChangeRequests() {\n        if (this.layer.isOverlay()) {\n            this.tryAcceptLayerFromServer();\n            this.abortWhenLayerClosed();\n            this.layer.tryAcceptForLocation();\n            this.abortWhenLayerClosed();\n            this.tryDismissLayerFromServer();\n            this.abortWhenLayerClosed();\n            this.layer.tryDismissForLocation();\n            this.abortWhenLayerClosed();\n        }\n        this.layer.asCurrent(() => {\n            for (let eventPlan of this.eventPlans) {\n                up.emit(eventPlan);\n                this.abortWhenLayerClosed();\n            }\n        });\n    }\n    tryAcceptLayerFromServer() {\n        if (u.isDefined(this.acceptLayer) && this.layer.isOverlay()) {\n            this.layer.accept(this.acceptLayer);\n        }\n    }\n    tryDismissLayerFromServer() {\n        if (u.isDefined(this.dismissLayer) && this.layer.isOverlay()) {\n            this.layer.dismiss(this.dismissLayer);\n        }\n    }\n    abortWhenLayerClosed() {\n        if (this.layer.isClosed()) {\n            throw up.error.aborted('Layer was closed');\n        }\n    }\n    setSource({ oldElement, newElement, source }) {\n        if (source === 'keep') {\n            source = (oldElement && up.fragment.source(oldElement));\n        }\n        if (source) {\n            e.setMissingAttr(newElement, 'up-source', u.normalizeURL(source, { hash: false }));\n        }\n    }\n};\n\n\n/***/ }),\n/* 16 */\n/***/ (() => {\n\nup.Change.Removal = class Removal extends up.Change {\n};\n\n\n/***/ }),\n/* 17 */\n/***/ (() => {\n\nconst e = up.element;\nup.Change.DestroyFragment = class DestroyFragment extends up.Change.Removal {\n    constructor(options) {\n        super(options);\n        this.layer = up.layer.get(options) || up.layer.current;\n        this.element = this.options.element;\n        this.animation = this.options.animation;\n        this.log = this.options.log;\n    }\n    async execute() {\n        this.parent = this.element.parentNode;\n        up.fragment.markAsDestroying(this.element);\n        if (up.motion.willAnimate(this.element, this.animation, this.options)) {\n            this.emitDestroyed();\n            await this.animate();\n            this.wipe();\n            this.onFinished();\n        }\n        else {\n            this.wipe();\n            this.emitDestroyed();\n            this.onFinished();\n        }\n    }\n    animate() {\n        return up.motion.animate(this.element, this.animation, this.options);\n    }\n    wipe() {\n        this.layer.asCurrent(() => {\n            up.syntax.clean(this.element, { layer: this.layer });\n            if (up.browser.canJQuery()) {\n                jQuery(this.element).remove();\n            }\n            else {\n                e.remove(this.element);\n            }\n        });\n    }\n    emitDestroyed() {\n        up.fragment.emitDestroyed(this.element, { parent: this.parent, log: this.log });\n    }\n};\n\n\n/***/ }),\n/* 18 */\n/***/ (() => {\n\nup.Change.OpenLayer = class OpenLayer extends up.Change.Addition {\n    constructor(options) {\n        super(options);\n        this.target = options.target;\n        this.origin = options.origin;\n        this.baseLayer = options.baseLayer;\n    }\n    preflightProps() {\n        return {\n            layer: this.baseLayer,\n            mode: this.options.mode,\n            context: this.buildLayer().context,\n            target: this.target\n        };\n    }\n    bestPreflightSelector() {\n        return this.target;\n    }\n    execute(responseDoc, onApplicable) {\n        if (this.target === ':none') {\n            this.content = document.createElement('up-none');\n        }\n        else {\n            this.content = responseDoc.select(this.target);\n        }\n        if (!this.content || this.baseLayer.isClosed()) {\n            throw this.notApplicable();\n        }\n        onApplicable();\n        up.puts('up.render()', `Opening element \"${this.target}\" in new overlay`);\n        this.options.title = this.improveHistoryValue(this.options.title, responseDoc.getTitle());\n        if (this.emitOpenEvent().defaultPrevented) {\n            throw up.error.aborted('Open event was prevented');\n        }\n        this.baseLayer.peel();\n        this.layer = this.buildLayer();\n        up.layer.stack.push(this.layer);\n        this.layer.createElements(this.content);\n        this.layer.setupHandlers();\n        this.handleHistory();\n        this.setSource({ newElement: this.content, source: this.options.source });\n        responseDoc.finalizeElement(this.content);\n        up.hello(this.layer.element, { layer: this.layer, origin: this.origin });\n        this.handleLayerChangeRequests();\n        this.handleScroll();\n        this.layer.startOpenAnimation().then(() => {\n            if (this.layer.isOpen()) {\n                this.handleFocus();\n            }\n            this.onFinished();\n        });\n        this.layer.opening = false;\n        this.emitOpenedEvent();\n        this.abortWhenLayerClosed();\n        return new up.RenderResult({\n            layer: this.layer,\n            fragments: [this.content]\n        });\n    }\n    buildLayer() {\n        const buildOptions = { ...this.options, opening: true };\n        const beforeNew = optionsWithLayerDefaults => {\n            return this.options = up.RenderOptions.finalize(optionsWithLayerDefaults);\n        };\n        return up.layer.build(buildOptions, beforeNew);\n    }\n    handleHistory() {\n        if (this.layer.history === 'auto') {\n            this.layer.history = up.fragment.hasAutoHistory(this.content);\n        }\n        this.layer.parent.saveHistory();\n        this.layer.updateHistory(this.options);\n    }\n    handleFocus() {\n        this.baseLayer.overlayFocus?.moveToBack();\n        this.layer.overlayFocus.moveToFront();\n        const fragmentFocus = new up.FragmentFocus({\n            fragment: this.content,\n            layer: this.layer,\n            autoMeans: ['autofocus', 'layer']\n        });\n        fragmentFocus.process(this.options.focus);\n    }\n    handleScroll() {\n        const scrollingOptions = {\n            ...this.options,\n            fragment: this.content,\n            layer: this.layer,\n            autoMeans: ['hash', 'layer']\n        };\n        const scrolling = new up.FragmentScrolling(scrollingOptions);\n        scrolling.process(this.options.scroll);\n    }\n    emitOpenEvent() {\n        return up.emit('up:layer:open', {\n            origin: this.origin,\n            baseLayer: this.baseLayer,\n            layerOptions: this.options,\n            log: \"Opening new overlay\"\n        });\n    }\n    emitOpenedEvent() {\n        return this.layer.emit('up:layer:opened', {\n            origin: this.origin,\n            callback: this.layer.callback('onOpened'),\n            log: `Opened new ${this.layer}`\n        });\n    }\n};\n\n\n/***/ }),\n/* 19 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.Change.UpdateLayer = class UpdateLayer extends up.Change.Addition {\n    constructor(options) {\n        options = up.RenderOptions.finalize(options);\n        super(options);\n        this.layer = options.layer;\n        this.target = options.target;\n        this.placement = options.placement;\n        this.context = options.context;\n        this.parseSteps();\n    }\n    preflightProps() {\n        this.matchPreflight();\n        return {\n            layer: this.layer,\n            mode: this.layer.mode,\n            context: u.merge(this.layer.context, this.context),\n            target: this.bestPreflightSelector(),\n        };\n    }\n    bestPreflightSelector() {\n        this.matchPreflight();\n        return u.map(this.steps, 'selector').join(', ') || ':none';\n    }\n    execute(responseDoc, onApplicable) {\n        this.responseDoc = responseDoc;\n        this.matchPostflight();\n        onApplicable();\n        up.puts('up.render()', `Updating \"${this.bestPreflightSelector()}\" in ${this.layer}`);\n        this.options.title = this.improveHistoryValue(this.options.title, this.responseDoc.getTitle());\n        this.setScrollAndFocusOptions();\n        if (this.options.saveScroll) {\n            up.viewport.saveScroll({ layer: this.layer });\n        }\n        if (this.options.peel) {\n            this.layer.peel();\n        }\n        u.assign(this.layer.context, this.context);\n        if (this.options.history === 'auto') {\n            this.options.history = this.hasAutoHistory();\n        }\n        if (this.options.history) {\n            this.layer.updateHistory(this.options);\n        }\n        this.handleLayerChangeRequests();\n        const swapPromises = this.steps.map(step => this.executeStep(step));\n        Promise.all(swapPromises).then(() => {\n            this.abortWhenLayerClosed();\n            return this.onFinished();\n        });\n        return new up.RenderResult({\n            layer: this.layer,\n            fragments: u.map(this.steps, 'newElement')\n        });\n    }\n    async executeStep(step) {\n        this.setSource(step);\n        switch (step.placement) {\n            case 'swap': {\n                let keepPlan = this.findKeepPlan(step);\n                if (keepPlan) {\n                    up.fragment.emitKept(keepPlan);\n                    this.handleFocus(step.oldElement, step);\n                    await this.handleScroll(step.oldElement, step);\n                }\n                else {\n                    this.transferKeepableElements(step);\n                    const parent = step.oldElement.parentNode;\n                    const morphOptions = {\n                        ...step,\n                        beforeStart() {\n                            up.fragment.markAsDestroying(step.oldElement);\n                        },\n                        afterInsert: () => {\n                            this.responseDoc.finalizeElement(step.newElement);\n                            step.keepPlans.forEach(this.reviveKeepable);\n                            up.hello(step.newElement, step);\n                        },\n                        beforeDetach: () => {\n                            up.syntax.clean(step.oldElement, { layer: this.layer });\n                        },\n                        afterDetach() {\n                            e.remove(step.oldElement);\n                            up.fragment.emitDestroyed(step.oldElement, { parent, log: false });\n                        },\n                        scrollNew: () => {\n                            this.handleFocus(step.newElement, step);\n                            return this.handleScroll(step.newElement, step);\n                        }\n                    };\n                    await up.morph(step.oldElement, step.newElement, step.transition, morphOptions);\n                }\n                break;\n            }\n            case 'content': {\n                let oldWrapper = e.wrapChildren(step.oldElement);\n                let newWrapper = e.wrapChildren(step.newElement);\n                let wrapperStep = {\n                    ...step,\n                    placement: 'swap',\n                    oldElement: oldWrapper,\n                    newElement: newWrapper,\n                    focus: false\n                };\n                await this.executeStep(wrapperStep);\n                e.unwrap(newWrapper);\n                await this.handleFocus(step.oldElement, step);\n                break;\n            }\n            case 'before':\n            case 'after': {\n                let wrapper = e.wrapChildren(step.newElement);\n                let position = step.placement === 'before' ? 'afterbegin' : 'beforeend';\n                step.oldElement.insertAdjacentElement(position, wrapper);\n                this.responseDoc.finalizeElement(wrapper);\n                up.hello(wrapper, step);\n                this.handleFocus(wrapper, step);\n                await this.handleScroll(wrapper, step);\n                await up.animate(wrapper, step.transition, step);\n                await e.unwrap(wrapper);\n                break;\n            }\n            default: {\n                up.fail('Unknown placement: %o', step.placement);\n            }\n        }\n    }\n    findKeepPlan(options) {\n        if (!options.keep) {\n            return;\n        }\n        const { oldElement, newElement } = options;\n        let partnerSelector = e.booleanOrStringAttr(oldElement, 'up-keep');\n        if (partnerSelector) {\n            if (partnerSelector === true) {\n                partnerSelector = '&';\n            }\n            const lookupOpts = { layer: this.layer, origin: oldElement };\n            let partner;\n            if (options.descendantsOnly) {\n                partner = up.fragment.get(newElement, partnerSelector, lookupOpts);\n            }\n            else {\n                partner = up.fragment.subtree(newElement, partnerSelector, lookupOpts)[0];\n            }\n            if (partner && e.matches(partner, '[up-keep]')) {\n                const plan = {\n                    oldElement,\n                    newElement: partner,\n                    newData: up.syntax.data(partner)\n                };\n                if (!up.fragment.emitKeep(plan).defaultPrevented) {\n                    return plan;\n                }\n            }\n        }\n    }\n    transferKeepableElements(step) {\n        const keepPlans = [];\n        if (step.keep) {\n            for (let keepable of step.oldElement.querySelectorAll('[up-keep]')) {\n                let keepPlan = this.findKeepPlan({ ...step, oldElement: keepable, descendantsOnly: true });\n                if (keepPlan) {\n                    this.hibernateKeepable(keepPlan);\n                    const keepableClone = keepable.cloneNode(true);\n                    e.replace(keepable, keepableClone);\n                    e.replace(keepPlan.newElement, keepable);\n                    keepPlans.push(keepPlan);\n                }\n            }\n        }\n        step.keepPlans = keepPlans;\n    }\n    parseSteps() {\n        this.steps = [];\n        for (let simpleTarget of u.splitValues(this.target, ',')) {\n            if (simpleTarget !== ':none') {\n                const expressionParts = simpleTarget.match(/^(.+?)(?::(before|after))?$/);\n                if (!expressionParts) {\n                    throw up.error.invalidSelector(simpleTarget);\n                }\n                const step = {\n                    ...this.options,\n                    selector: expressionParts[1],\n                    placement: expressionParts[2] || this.placement || 'swap'\n                };\n                this.steps.push(step);\n            }\n        }\n    }\n    hibernateKeepable(keepPlan) {\n        let viewports = up.viewport.subtree(keepPlan.oldElement);\n        keepPlan.revivers = viewports.map(function (viewport) {\n            let { scrollTop, scrollLeft } = viewport;\n            return () => u.assign(viewport, { scrollTop, scrollLeft });\n        });\n    }\n    reviveKeepable(keepPlan) {\n        for (let reviver of keepPlan.revivers) {\n            reviver();\n        }\n    }\n    matchPreflight() {\n        if (this.matchedPreflight) {\n            return;\n        }\n        for (let step of this.steps) {\n            const finder = new up.FragmentFinder(step);\n            step.oldElement || (step.oldElement = finder.find());\n            if (!step.oldElement) {\n                throw this.notApplicable(`Could not find element \"${this.target}\" in current page`);\n            }\n        }\n        this.resolveOldNesting();\n        this.matchedPreflight = true;\n    }\n    matchPostflight() {\n        if (this.matchedPostflight) {\n            return;\n        }\n        this.matchPreflight();\n        for (let step of this.steps) {\n            let newElement = this.responseDoc.select(step.selector);\n            if (newElement) {\n                step.newElement = newElement;\n            }\n            else {\n                throw this.notApplicable(`Could not find element \"${this.target}\" in server response`);\n            }\n        }\n        if (this.options.hungry) {\n            this.addHungrySteps();\n        }\n        this.resolveOldNesting();\n        this.matchedPostflight = true;\n    }\n    addHungrySteps() {\n        const hungries = up.fragment.all(up.radio.hungrySelector(), this.options);\n        for (let oldElement of hungries) {\n            const selector = up.fragment.toTarget(oldElement);\n            const newElement = this.responseDoc.select(selector);\n            if (newElement) {\n                const transition = e.booleanOrStringAttr(oldElement, 'transition');\n                const step = { selector, oldElement, newElement, transition, placement: 'swap' };\n                this.steps.push(step);\n            }\n        }\n    }\n    containedByRivalStep(steps, candidateStep) {\n        return u.some(steps, function (rivalStep) {\n            return (rivalStep !== candidateStep) &&\n                ((rivalStep.placement === 'swap') || (rivalStep.placement === 'content')) &&\n                rivalStep.oldElement.contains(candidateStep.oldElement);\n        });\n    }\n    resolveOldNesting() {\n        let compressed = u.uniqBy(this.steps, 'oldElement');\n        compressed = u.reject(compressed, step => this.containedByRivalStep(compressed, step));\n        this.steps = compressed;\n    }\n    setScrollAndFocusOptions() {\n        this.steps.forEach((step, i) => {\n            if (i > 0) {\n                step.scroll = false;\n                step.focus = false;\n            }\n            if ((step.placement === 'swap') || (step.placement === 'content')) {\n                step.scrollBehavior = 'auto';\n                this.focusCapsule || (this.focusCapsule = up.FocusCapsule.preserveWithin(step.oldElement));\n            }\n        });\n    }\n    handleFocus(fragment, step) {\n        const fragmentFocus = new up.FragmentFocus({\n            ...step,\n            fragment,\n            layer: this.layer,\n            focusCapsule: this.focusCapsule,\n            autoMeans: up.fragment.config.autoFocus,\n        });\n        return fragmentFocus.process(step.focus);\n    }\n    handleScroll(fragment, step) {\n        const scrolling = new up.FragmentScrolling({\n            ...step,\n            fragment,\n            layer: this.layer,\n            autoMeans: up.fragment.config.autoScroll\n        });\n        return scrolling.process(step.scroll);\n    }\n    hasAutoHistory() {\n        const oldFragments = u.map(this.steps, 'oldElement');\n        return u.some(oldFragments, oldFragment => up.fragment.hasAutoHistory(oldFragment));\n    }\n};\n\n\n/***/ }),\n/* 20 */\n/***/ (() => {\n\nconst u = up.util;\nup.Change.CloseLayer = class CloseLayer extends up.Change.Removal {\n    constructor(options) {\n        super(options);\n        this.verb = options.verb;\n        this.layer = up.layer.get(options);\n        this.origin = options.origin;\n        this.value = options.value;\n        this.preventable = options.preventable ?? true;\n    }\n    execute() {\n        if (!this.layer.isOpen()) {\n            return Promise.resolve();\n        }\n        up.browser.assertConfirmed(this.options);\n        up.network.abort(request => request.layer === this.layer);\n        if (this.emitCloseEvent().defaultPrevented && this.preventable) {\n            throw up.error.aborted('Close event was prevented');\n        }\n        const { parent } = this.layer;\n        this.layer.peel();\n        this.layer.stack.remove(this.layer);\n        parent.restoreHistory();\n        this.handleFocus(parent);\n        this.layer.teardownHandlers();\n        this.layer.destroyElements(this.options);\n        this.emitClosedEvent(parent);\n    }\n    emitCloseEvent() {\n        let event = this.layer.emit(this.buildEvent(`up:layer:${this.verb}`), {\n            callback: this.layer.callback(`on${u.upperCaseFirst(this.verb)}`),\n            log: [`Will ${this.verb} ${this.layer} with value %o`, this.value]\n        });\n        this.value = event.value;\n        return event;\n    }\n    emitClosedEvent(formerParent) {\n        const verbPast = `${this.verb}ed`;\n        const verbPastUpperCaseFirst = u.upperCaseFirst(verbPast);\n        return this.layer.emit(this.buildEvent(`up:layer:${verbPast}`), {\n            baseLayer: formerParent,\n            callback: this.layer.callback(`on${verbPastUpperCaseFirst}`),\n            ensureBubbles: true,\n            log: [`${verbPastUpperCaseFirst} ${this.layer} with value %o`, this.value]\n        });\n    }\n    buildEvent(name) {\n        return up.event.build(name, {\n            layer: this.layer,\n            value: this.value,\n            origin: this.origin\n        });\n    }\n    handleFocus(formerParent) {\n        this.layer.overlayFocus.teardown();\n        formerParent.overlayFocus?.moveToFront();\n        let newFocusElement = this.layer.origin || formerParent.element;\n        newFocusElement.focus({ preventScroll: true });\n    }\n};\n\n\n/***/ }),\n/* 21 */\n/***/ (() => {\n\nconst u = up.util;\nup.Change.FromContent = class FromContent extends up.Change {\n    constructor(options) {\n        super(options);\n        this.layers = u.filter(up.layer.getAll(this.options), this.isRenderableLayer);\n        this.origin = this.options.origin;\n        this.preview = this.options.preview;\n        this.mode = this.options.mode;\n        if (this.origin) {\n            this.originLayer = up.layer.get(this.origin);\n        }\n    }\n    isRenderableLayer(layer) {\n        return (layer === 'new') || layer.isOpen();\n    }\n    getPlans() {\n        if (!this.plans) {\n            this.plans = [];\n            if (this.options.fragment) {\n                this.options.target = this.getResponseDoc().rootSelector();\n            }\n            this.expandIntoPlans(this.layers, this.options.target);\n            this.expandIntoPlans(this.layers, this.options.fallback);\n        }\n        return this.plans;\n    }\n    expandIntoPlans(layers, targets) {\n        for (let layer of layers) {\n            for (let target of this.expandTargets(targets, layer)) {\n                const props = { ...this.options, target, layer, placement: this.defaultPlacement() };\n                const change = layer === 'new' ? new up.Change.OpenLayer(props) : new up.Change.UpdateLayer(props);\n                this.plans.push(change);\n            }\n        }\n    }\n    expandTargets(targets, layer) {\n        return up.fragment.expandTargets(targets, { layer, mode: this.mode, origin: this.origin });\n    }\n    execute() {\n        if (this.options.preload) {\n            return Promise.resolve();\n        }\n        return this.seekPlan(this.executePlan.bind(this)) || this.postflightTargetNotApplicable();\n    }\n    executePlan(matchedPlan) {\n        return matchedPlan.execute(this.getResponseDoc(), this.onPlanApplicable.bind(this, matchedPlan));\n    }\n    onPlanApplicable(plan) {\n        let primaryPlan = this.getPlans()[0];\n        if (plan !== primaryPlan) {\n            up.puts('up.render()', 'Could not match primary target (%s). Updating a fallback target (%s).', primaryPlan.target, plan.target);\n        }\n    }\n    getResponseDoc() {\n        if (!this.preview && !this.responseDoc) {\n            const docOptions = u.pick(this.options, ['target', 'content', 'fragment', 'document', 'html', 'cspNonces']);\n            up.migrate.handleResponseDocOptions?.(docOptions);\n            if (this.defaultPlacement() === 'content') {\n                docOptions.target = this.firstExpandedTarget(docOptions.target);\n            }\n            this.responseDoc = new up.ResponseDoc(docOptions);\n        }\n        return this.responseDoc;\n    }\n    defaultPlacement() {\n        if (!this.options.document && !this.options.fragment) {\n            return 'content';\n        }\n    }\n    firstExpandedTarget(target) {\n        return this.expandTargets(target || ':main', this.layers[0])[0];\n    }\n    preflightProps(opts = {}) {\n        const getPlanProps = plan => plan.preflightProps();\n        return this.seekPlan(getPlanProps) || opts.optional || this.preflightTargetNotApplicable();\n    }\n    preflightTargetNotApplicable() {\n        this.targetNotApplicable('Could not find target in current page');\n    }\n    postflightTargetNotApplicable() {\n        this.targetNotApplicable('Could not find common target in current page and response');\n    }\n    targetNotApplicable(reason) {\n        if (this.getPlans().length) {\n            const planTargets = u.uniq(u.map(this.getPlans(), 'target'));\n            const humanizedLayerOption = up.layer.optionToString(this.options.layer);\n            up.fail(reason + \" (tried selectors %o in %s)\", planTargets, humanizedLayerOption);\n        }\n        else if (this.layers.length) {\n            up.fail('No target selector given');\n        }\n        else {\n            up.fail('Layer %o does not exist', this.options.layer);\n        }\n    }\n    seekPlan(fn) {\n        for (let plan of this.getPlans()) {\n            try {\n                return fn(plan);\n            }\n            catch (error) {\n                if (!up.error.notApplicable.is(error)) {\n                    throw error;\n                }\n            }\n        }\n    }\n};\n\n\n/***/ }),\n/* 22 */\n/***/ (() => {\n\nconst u = up.util;\nup.Change.FromURL = class FromURL extends up.Change {\n    constructor(options) {\n        super(options);\n        this.options.layer = up.layer.getAll(this.options);\n        this.options.normalizeLayerOptions = false;\n        this.successOptions = this.options;\n        this.failOptions = up.RenderOptions.deriveFailOptions(this.successOptions);\n    }\n    execute() {\n        let newPageReason = this.newPageReason();\n        if (newPageReason) {\n            up.puts('up.render()', newPageReason);\n            up.network.loadPage(this.options);\n            return u.unresolvablePromise();\n        }\n        const promise = this.makeRequest();\n        if (this.options.preload) {\n            return promise;\n        }\n        return u.always(promise, responseOrError => this.onRequestSettled(responseOrError));\n    }\n    newPageReason() {\n        if (u.isCrossOrigin(this.options.url)) {\n            return 'Loading cross-origin content in new page';\n        }\n        if (!up.browser.canPushState()) {\n            return 'Loading content in new page to restore history support';\n        }\n    }\n    makeRequest() {\n        const successAttrs = this.preflightPropsForRenderOptions(this.successOptions);\n        const failAttrs = this.preflightPropsForRenderOptions(this.failOptions, { optional: true });\n        const requestAttrs = u.merge(this.successOptions, successAttrs, u.renameKeys(failAttrs, up.fragment.failKey));\n        this.request = up.request(requestAttrs);\n        return this.request;\n    }\n    preflightPropsForRenderOptions(renderOptions, requestAttributesOptions) {\n        const preview = new up.Change.FromContent({ ...renderOptions, preview: true });\n        return preview.preflightProps(requestAttributesOptions);\n    }\n    onRequestSettled(response) {\n        this.response = response;\n        if (!(response instanceof up.Response)) {\n            throw response;\n        }\n        else if (this.isSuccessfulResponse()) {\n            return this.updateContentFromResponse(['Loaded fragment from successful response to %s', this.request.description], this.successOptions);\n        }\n        else {\n            const log = ['Loaded fragment from failed response to %s (HTTP %d)', this.request.description, this.response.status];\n            throw this.updateContentFromResponse(log, this.failOptions);\n        }\n    }\n    isSuccessfulResponse() {\n        return (this.successOptions.fail === false) || this.response.ok;\n    }\n    updateContentFromResponse(log, renderOptions) {\n        this.request.assertEmitted('up:fragment:loaded', {\n            callback: this.options.onLoaded,\n            response: this.response,\n            log,\n            renderOptions,\n        });\n        this.augmentOptionsFromResponse(renderOptions);\n        return new up.Change.FromContent(renderOptions).execute();\n    }\n    augmentOptionsFromResponse(renderOptions) {\n        const responseURL = this.response.url;\n        let serverLocation = responseURL;\n        let hash = this.request.hash;\n        if (hash) {\n            renderOptions.hash = hash;\n            serverLocation += hash;\n        }\n        const isReloadable = (this.response.method === 'GET');\n        if (isReloadable) {\n            renderOptions.source = this.improveHistoryValue(renderOptions.source, responseURL);\n        }\n        else {\n            renderOptions.source = this.improveHistoryValue(renderOptions.source, 'keep');\n            renderOptions.history = !!renderOptions.location;\n        }\n        renderOptions.location = this.improveHistoryValue(renderOptions.location, serverLocation);\n        renderOptions.title = this.improveHistoryValue(renderOptions.title, this.response.title);\n        renderOptions.eventPlans = this.response.eventPlans;\n        let serverTarget = this.response.target;\n        if (serverTarget) {\n            renderOptions.target = serverTarget;\n        }\n        renderOptions.document = this.response.text;\n        renderOptions.acceptLayer = this.response.acceptLayer;\n        renderOptions.dismissLayer = this.response.dismissLayer;\n        if (!renderOptions.document && (u.isDefined(renderOptions.acceptLayer) || u.isDefined(renderOptions.dismissLayer))) {\n            renderOptions.target = ':none';\n        }\n        renderOptions.context = u.merge(renderOptions.context, this.response.context);\n        renderOptions.cspNonces = this.response.cspNonces;\n    }\n};\n\n\n/***/ }),\n/* 23 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.CompilerPass = class CompilerPass {\n    constructor(root, compilers, options = {}) {\n        this.root = root;\n        this.compilers = compilers;\n        this.skipSubtrees = options.skip;\n        if (!this.skipSubtrees.length || !this.root.querySelector('[up-keep]')) {\n            this.skipSubtrees = undefined;\n        }\n        this.layer = options.layer || up.layer.get(this.root) || up.layer.current;\n        this.errors = [];\n    }\n    run() {\n        up.puts('up.hello()', \"Compiling fragment %o\", this.root);\n        this.layer.asCurrent(() => {\n            for (let compiler of this.compilers) {\n                this.runCompiler(compiler);\n            }\n        });\n        if (this.errors.length) {\n            throw up.error.failed('Errors while compiling', { errors: this.errors });\n        }\n    }\n    runCompiler(compiler) {\n        const matches = this.select(compiler.selector);\n        if (!matches.length) {\n            return;\n        }\n        if (!compiler.isDefault) {\n            up.puts('up.hello()', 'Compiling \"%s\" on %d element(s)', compiler.selector, matches.length);\n        }\n        if (compiler.batch) {\n            this.compileBatch(compiler, matches);\n        }\n        else {\n            for (let match of matches) {\n                this.compileOneElement(compiler, match);\n            }\n        }\n        return up.migrate.postCompile?.(matches, compiler);\n    }\n    compileOneElement(compiler, element) {\n        const elementArg = compiler.jQuery ? up.browser.jQuery(element) : element;\n        const compileArgs = [elementArg];\n        if (compiler.length !== 1) {\n            const data = up.syntax.data(element);\n            compileArgs.push(data);\n        }\n        const result = this.applyCompilerFunction(compiler, element, compileArgs);\n        let destructorOrDestructors = this.destructorPresence(result);\n        if (destructorOrDestructors) {\n            up.destructor(element, destructorOrDestructors);\n        }\n    }\n    compileBatch(compiler, elements) {\n        const elementsArgs = compiler.jQuery ? up.browser.jQuery(elements) : elements;\n        const compileArgs = [elementsArgs];\n        if (compiler.length !== 1) {\n            const dataList = u.map(elements, up.syntax.data);\n            compileArgs.push(dataList);\n        }\n        const result = this.applyCompilerFunction(compiler, elements, compileArgs);\n        if (this.destructorPresence(result)) {\n            up.fail('Compilers with { batch: true } cannot return destructors');\n        }\n    }\n    applyCompilerFunction(compiler, elementOrElements, compileArgs) {\n        try {\n            return compiler.apply(elementOrElements, compileArgs);\n        }\n        catch (error) {\n            this.errors.push(error);\n            up.log.error('up.hello()', 'While compiling %o: %o', elementOrElements, error);\n            up.error.emitGlobal(error);\n        }\n    }\n    destructorPresence(result) {\n        if (u.isFunction(result) || (u.isArray(result) && (u.every(result, u.isFunction)))) {\n            return result;\n        }\n    }\n    select(selector) {\n        let matches = e.subtree(this.root, u.evalOption(selector));\n        if (this.skipSubtrees) {\n            matches = u.reject(matches, (match) => this.isInSkippedSubtree(match));\n        }\n        return matches;\n    }\n    isInSkippedSubtree(element) {\n        let parent;\n        if (u.contains(this.skipSubtrees, element)) {\n            return true;\n        }\n        else if ((parent = element.parentElement)) {\n            return this.isInSkippedSubtree(parent);\n        }\n        else {\n            return false;\n        }\n    }\n};\n\n\n/***/ }),\n/* 24 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.CSSTransition = class CSSTransition {\n    constructor(element, lastFrameKebab, options) {\n        this.element = element;\n        this.lastFrameKebab = lastFrameKebab;\n        this.lastFrameKeysKebab = Object.keys(this.lastFrameKebab);\n        if (u.some(this.lastFrameKeysKebab, key => key.match(/A-Z/))) {\n            up.fail('Animation keys must be kebab-case');\n        }\n        this.finishEvent = options.finishEvent;\n        this.duration = options.duration;\n        this.easing = options.easing;\n        this.finished = false;\n    }\n    start() {\n        if (this.lastFrameKeysKebab.length === 0) {\n            this.finished = true;\n            return Promise.resolve();\n        }\n        this.deferred = u.newDeferred();\n        this.pauseOldTransition();\n        this.startTime = new Date();\n        this.startFallbackTimer();\n        this.listenToFinishEvent();\n        this.listenToTransitionEnd();\n        this.startMotion();\n        return this.deferred.promise();\n    }\n    listenToFinishEvent() {\n        if (this.finishEvent) {\n            this.stopListenToFinishEvent = up.on(this.element, this.finishEvent, this.onFinishEvent.bind(this));\n        }\n    }\n    onFinishEvent(event) {\n        event.stopPropagation();\n        this.finish();\n    }\n    startFallbackTimer() {\n        const timingTolerance = 100;\n        this.fallbackTimer = u.timer((this.duration + timingTolerance), () => {\n            this.finish();\n        });\n    }\n    stopFallbackTimer() {\n        clearTimeout(this.fallbackTimer);\n    }\n    listenToTransitionEnd() {\n        this.stopListenToTransitionEnd = up.on(this.element, 'transitionend', this.onTransitionEnd.bind(this));\n    }\n    onTransitionEnd(event) {\n        if (event.target !== this.element) {\n            return;\n        }\n        const elapsed = new Date() - this.startTime;\n        if (elapsed <= (0.25 * this.duration)) {\n            return;\n        }\n        const completedPropertyKebab = event.propertyName;\n        if (!u.contains(this.lastFrameKeysKebab, completedPropertyKebab)) {\n            return;\n        }\n        this.finish();\n    }\n    finish() {\n        if (this.finished) {\n            return;\n        }\n        this.finished = true;\n        this.stopFallbackTimer();\n        this.stopListenToFinishEvent?.();\n        this.stopListenToTransitionEnd?.();\n        e.concludeCSSTransition(this.element);\n        this.resumeOldTransition();\n        this.deferred.resolve();\n    }\n    pauseOldTransition() {\n        const oldTransition = e.style(this.element, [\n            'transitionProperty',\n            'transitionDuration',\n            'transitionDelay',\n            'transitionTimingFunction'\n        ]);\n        if (e.hasCSSTransition(oldTransition)) {\n            if (oldTransition.transitionProperty !== 'all') {\n                const oldTransitionProperties = oldTransition.transitionProperty.split(/\\s*,\\s*/);\n                const oldTransitionFrameKebab = e.style(this.element, oldTransitionProperties);\n                this.setOldTransitionTargetFrame = e.setTemporaryStyle(this.element, oldTransitionFrameKebab);\n            }\n            this.setOldTransition = e.concludeCSSTransition(this.element);\n        }\n    }\n    resumeOldTransition() {\n        this.setOldTransitionTargetFrame?.();\n        this.setOldTransition?.();\n    }\n    startMotion() {\n        e.setStyle(this.element, {\n            transitionProperty: Object.keys(this.lastFrameKebab).join(', '),\n            transitionDuration: `${this.duration}ms`,\n            transitionTimingFunction: this.easing\n        });\n        e.setStyle(this.element, this.lastFrameKebab);\n    }\n};\n\n\n/***/ }),\n/* 25 */\n/***/ (() => {\n\nconst u = up.util;\nup.DestructorPass = class DestructorPass {\n    constructor(fragment, options) {\n        this.fragment = fragment;\n        this.options = options;\n        this.errors = [];\n    }\n    run() {\n        for (let cleanable of this.selectCleanables()) {\n            let destructors = u.pluckKey(cleanable, 'upDestructors');\n            if (destructors) {\n                for (let destructor of destructors) {\n                    this.applyDestructorFunction(destructor, cleanable);\n                }\n            }\n            cleanable.classList.remove('up-can-clean');\n        }\n        if (this.errors.length) {\n            throw up.error.failed('Errors while destroying', { errors: this.errors });\n        }\n    }\n    selectCleanables() {\n        const selectOptions = { ...this.options, destroying: true };\n        return up.fragment.subtree(this.fragment, '.up-can-clean', selectOptions);\n    }\n    applyDestructorFunction(destructor, element) {\n        try {\n            destructor();\n        }\n        catch (error) {\n            this.errors.push(error);\n            up.log.error('up.destroy()', 'While destroying %o: %o', element, error);\n            up.error.emitGlobal(error);\n        }\n    }\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.EventEmitter = class EventEmitter extends up.Record {\n    keys() {\n        return [\n            'target',\n            'event',\n            'baseLayer',\n            'callback',\n            'log',\n            'ensureBubbles'\n        ];\n    }\n    emit() {\n        this.logEmission();\n        if (this.baseLayer) {\n            this.baseLayer.asCurrent(() => this.dispatchEvent());\n        }\n        else {\n            this.dispatchEvent();\n        }\n        return this.event;\n    }\n    dispatchEvent() {\n        this.target.dispatchEvent(this.event);\n        if (this.ensureBubbles && e.isDetached(this.target)) {\n            document.dispatchEvent(this.event);\n        }\n        this.callback?.(this.event);\n    }\n    assertEmitted() {\n        const event = this.emit();\n        if (event.defaultPrevented) {\n            throw up.error.aborted(`Event ${event.type} was prevented`);\n        }\n    }\n    logEmission() {\n        if (!up.log.isEnabled()) {\n            return;\n        }\n        let message = this.log;\n        let messageArgs;\n        if (u.isArray(message)) {\n            [message, ...messageArgs] = message;\n        }\n        else {\n            messageArgs = [];\n        }\n        const { type } = this.event;\n        if (u.isString(message)) {\n            up.puts(type, message, ...messageArgs);\n        }\n        else if (message !== false) {\n            up.puts(type, `Event ${type}`);\n        }\n    }\n    static fromEmitArgs(args, defaults = {}) {\n        let options = u.extractOptions(args);\n        options = u.merge(defaults, options);\n        if (u.isElementish(args[0])) {\n            options.target = e.get(args.shift());\n        }\n        else if (args[0] instanceof up.Layer) {\n            options.layer = args.shift();\n        }\n        let layer;\n        if (options.layer) {\n            layer = up.layer.get(options.layer);\n            if (options.target == null) {\n                options.target = layer.element;\n            }\n            if (options.baseLayer == null) {\n                options.baseLayer = layer;\n            }\n        }\n        if (options.baseLayer) {\n            options.baseLayer = up.layer.get(options.baseLayer);\n        }\n        if (u.isString(options.target)) {\n            options.target = up.fragment.get(options.target, { layer: options.layer });\n        }\n        else if (!options.target) {\n            options.target = document;\n        }\n        if (args[0]?.preventDefault) {\n            options.event = args[0];\n            if (options.log == null) {\n                options.log = args[0].log;\n            }\n        }\n        else if (u.isString(args[0])) {\n            options.event = up.event.build(args[0], options);\n        }\n        else {\n            options.event = up.event.build(options);\n        }\n        return new (this)(options);\n    }\n};\n\n\n/***/ }),\n/* 27 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.EventListener = class EventListener extends up.Record {\n    keys() {\n        return [\n            'element',\n            'eventType',\n            'selector',\n            'callback',\n            'jQuery',\n            'guard',\n            'baseLayer',\n            'passive',\n            'once',\n            'beforeBoot',\n        ];\n    }\n    constructor(attributes) {\n        super(attributes);\n        this.key = this.constructor.buildKey(attributes);\n        this.isDefault = up.framework.evaling;\n        this.beforeBoot ?? (this.beforeBoot = this.eventType.indexOf('up:framework:') === 0);\n        this.nativeCallback = this.nativeCallback.bind(this);\n    }\n    bind() {\n        var _a;\n        const map = ((_a = this.element).upEventListeners || (_a.upEventListeners = {}));\n        if (map[this.key]) {\n            up.fail('up.on(): The %o callback %o cannot be registered more than once', this.eventType, this.callback);\n        }\n        map[this.key] = this;\n        this.element.addEventListener(...this.addListenerArgs());\n    }\n    addListenerArgs() {\n        const args = [this.eventType, this.nativeCallback];\n        if (this.passive && up.browser.canPassiveEventListener()) {\n            args.push({ passive: true });\n        }\n        return args;\n    }\n    unbind() {\n        let map = this.element.upEventListeners;\n        if (map) {\n            delete map[this.key];\n        }\n        this.element.removeEventListener(...this.addListenerArgs());\n    }\n    nativeCallback(event) {\n        if (up.framework.beforeBoot && !this.beforeBoot) {\n            return;\n        }\n        if (this.once) {\n            this.unbind();\n        }\n        let element = event.target;\n        if (this.selector) {\n            element = e.closest(element, u.evalOption(this.selector));\n        }\n        if (this.guard && !this.guard(event)) {\n            return;\n        }\n        if (element) {\n            const elementArg = this.jQuery ? up.browser.jQuery(element) : element;\n            const args = [event, elementArg];\n            const expectedArgCount = this.callback.length;\n            if (expectedArgCount !== 1 && expectedArgCount !== 2) {\n                const data = up.syntax.data(element);\n                args.push(data);\n            }\n            const applyCallback = this.callback.bind(element, ...args);\n            if (this.baseLayer) {\n                this.baseLayer.asCurrent(applyCallback);\n            }\n            else {\n                applyCallback();\n            }\n        }\n    }\n    static fromElement(attributes) {\n        let map = attributes.element.upEventListeners;\n        if (map) {\n            const key = this.buildKey(attributes);\n            return map[key];\n        }\n    }\n    static buildKey(attributes) {\n        var _a;\n        (_a = attributes.callback).upUid || (_a.upUid = u.uid());\n        return [\n            attributes.eventType,\n            attributes.selector,\n            attributes.callback.upUid\n        ].join('|');\n    }\n    static allNonDefault(element) {\n        let map = element.upEventListeners;\n        if (map) {\n            const listeners = u.values(map);\n            return u.reject(listeners, 'isDefault');\n        }\n        else {\n            return [];\n        }\n    }\n};\n\n\n/***/ }),\n/* 28 */\n/***/ (() => {\n\nconst u = up.util;\nup.EventListenerGroup = class EventListenerGroup extends up.Record {\n    keys() {\n        return [\n            'elements',\n            'eventTypes',\n            'selector',\n            'callback',\n            'jQuery',\n            'guard',\n            'baseLayer',\n            'passive',\n            'once',\n            'beforeBoot',\n        ];\n    }\n    bind() {\n        const unbindFns = [];\n        this.eachListenerAttributes(function (attrs) {\n            const listener = new up.EventListener(attrs);\n            listener.bind();\n            return unbindFns.push(listener.unbind.bind(listener));\n        });\n        return u.sequence(unbindFns);\n    }\n    eachListenerAttributes(fn) {\n        for (let element of this.elements) {\n            for (let eventType of this.eventTypes) {\n                fn(this.listenerAttributes(element, eventType));\n            }\n        }\n    }\n    listenerAttributes(element, eventType) {\n        return { ...this.attributes(), element, eventType };\n    }\n    unbind() {\n        this.eachListenerAttributes(function (attrs) {\n            let listener = up.EventListener.fromElement(attrs);\n            if (listener) {\n                listener.unbind();\n            }\n        });\n    }\n    static fromBindArgs(args, defaults) {\n        args = u.copy(args);\n        const callback = args.pop();\n        let elements;\n        if (args[0].addEventListener) {\n            elements = [args.shift()];\n        }\n        else if (u.isJQuery(args[0]) || (u.isList(args[0]) && args[0][0].addEventListener)) {\n            elements = args.shift();\n        }\n        else {\n            elements = [document];\n        }\n        let eventTypes = u.splitValues(args.shift());\n        let fixTypes = up.migrate.fixEventTypes;\n        if (fixTypes) {\n            eventTypes = fixTypes(eventTypes);\n        }\n        const options = u.extractOptions(args);\n        const selector = args[0];\n        const attributes = { elements, eventTypes, selector, callback, ...options, ...defaults };\n        return new (this)(attributes);\n    }\n};\n\n\n/***/ }),\n/* 29 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.FieldObserver = class FieldObserver {\n    constructor(fieldOrFields, options, callback) {\n        this.scheduleValues = this.scheduleValues.bind(this);\n        this.isNewValues = this.isNewValues.bind(this);\n        this.callback = callback;\n        this.fields = e.list(fieldOrFields);\n        this.delay = options.delay;\n        this.batch = options.batch;\n    }\n    start() {\n        this.scheduledValues = null;\n        this.processedValues = this.readFieldValues();\n        this.currentTimer = undefined;\n        this.callbackRunning = false;\n        this.unbind = up.on(this.fields, 'input change', () => this.check());\n    }\n    stop() {\n        this.unbind();\n        this.cancelTimer();\n    }\n    cancelTimer() {\n        clearTimeout(this.currentTimer);\n        this.currentTimer = undefined;\n    }\n    scheduleTimer() {\n        this.cancelTimer();\n        this.currentTimer = u.timer(this.delay, () => {\n            this.currentTimer = undefined;\n            this.requestCallback();\n        });\n    }\n    scheduleValues(values) {\n        this.scheduledValues = values;\n        this.scheduleTimer();\n    }\n    isNewValues(values) {\n        return !u.isEqual(values, this.processedValues) && !u.isEqual(this.scheduledValues, values);\n    }\n    async requestCallback() {\n        if ((this.scheduledValues !== null) && !this.currentTimer && !this.callbackRunning) {\n            const diff = this.changedValues(this.processedValues, this.scheduledValues);\n            this.processedValues = this.scheduledValues;\n            this.scheduledValues = null;\n            this.callbackRunning = true;\n            const callbackReturnValues = [];\n            if (this.batch) {\n                callbackReturnValues.push(this.callback(diff));\n            }\n            else {\n                for (let name in diff) {\n                    const value = diff[name];\n                    callbackReturnValues.push(this.callback(value, name));\n                }\n            }\n            await u.allSettled(callbackReturnValues);\n            this.callbackRunning = false;\n            this.requestCallback();\n        }\n    }\n    changedValues(previous, next) {\n        const changes = {};\n        let keys = Object.keys(previous);\n        keys = keys.concat(Object.keys(next));\n        keys = u.uniq(keys);\n        for (let key of keys) {\n            const previousValue = previous[key];\n            const nextValue = next[key];\n            if (!u.isEqual(previousValue, nextValue)) {\n                changes[key] = nextValue;\n            }\n        }\n        return changes;\n    }\n    readFieldValues() {\n        return up.Params.fromFields(this.fields).toObject();\n    }\n    check() {\n        const values = this.readFieldValues();\n        if (this.isNewValues(values)) {\n            this.scheduleValues(values);\n        }\n    }\n};\n\n\n/***/ }),\n/* 30 */\n/***/ (() => {\n\nconst e = up.element;\nconst PRESERVE_KEYS = ['selectionStart', 'selectionEnd', 'scrollLeft', 'scrollTop'];\nfunction transferProps(from, to) {\n    for (let key of PRESERVE_KEYS) {\n        try {\n            to[key] = from[key];\n        }\n        catch (error) {\n        }\n    }\n}\nfunction focusedElementWithin(scopeElement) {\n    const focusedElement = document.activeElement;\n    if (e.isInSubtree(scopeElement, focusedElement)) {\n        return focusedElement;\n    }\n}\nup.FocusCapsule = class FocusCapsule extends up.Record {\n    keys() {\n        return ['selector', 'oldElement'].concat(PRESERVE_KEYS);\n    }\n    restore(scope, options) {\n        if (!this.wasLost()) {\n            return;\n        }\n        let rediscoveredElement = e.get(scope, this.selector);\n        if (rediscoveredElement) {\n            transferProps(this, rediscoveredElement);\n            up.focus(rediscoveredElement, options);\n            return true;\n        }\n    }\n    static preserveWithin(oldElement) {\n        let focusedElement = focusedElementWithin(oldElement);\n        if (focusedElement) {\n            const plan = { oldElement, selector: up.fragment.toTarget(focusedElement) };\n            transferProps(focusedElement, plan);\n            return new (this)(plan);\n        }\n    }\n    wasLost() {\n        return !focusedElementWithin(this.oldElement);\n    }\n};\n\n\n/***/ }),\n/* 31 */\n/***/ (() => {\n\nconst u = up.util;\nup.FragmentProcessor = class FragmentProcessor extends up.Record {\n    keys() {\n        return [\n            'fragment',\n            'autoMeans',\n            'origin',\n            'layer'\n        ];\n    }\n    process(opt) {\n        return this.tryProcess(opt);\n    }\n    tryProcess(opt) {\n        if (u.isArray(opt)) {\n            return u.find(opt, opt => this.tryProcess(opt));\n        }\n        if (u.isFunction(opt)) {\n            return this.tryProcess(opt(this.fragment, this.attributes()));\n        }\n        if (u.isElement(opt)) {\n            return this.processElement();\n        }\n        if (u.isString(opt)) {\n            if (opt === 'auto') {\n                return this.tryProcess(this.autoMeans);\n            }\n            let match = opt.match(/^(.+?)-if-(.+?)$/);\n            if (match) {\n                return this.resolveCondition(match[2]) && this.process(match[1]);\n            }\n        }\n        return this.processPrimitive(opt);\n    }\n    resolveCondition(condition) {\n        if (condition === 'main') {\n            return up.fragment.contains(this.fragment, ':main');\n        }\n    }\n    findSelector(selector) {\n        const lookupOpts = { layer: this.layer, origin: this.origin };\n        let match = up.fragment.get(this.fragment, selector, lookupOpts) || up.fragment.get(selector, lookupOpts);\n        if (match) {\n            return match;\n        }\n        else {\n            up.warn('up.render()', 'Could not find an element matching \"%s\"', selector);\n        }\n    }\n};\n\n\n/***/ }),\n/* 32 */\n/***/ (() => {\n\nconst DESCENDANT_SELECTOR = /^([^ >+(]+) (.+)$/;\nup.FragmentFinder = class FragmentFinder {\n    constructor(options) {\n        this.options = options;\n        this.origin = this.options.origin;\n        this.selector = this.options.selector;\n        this.layer = this.options.layer;\n    }\n    find() {\n        return this.findAroundOrigin() || this.findInLayer();\n    }\n    findAroundOrigin() {\n        if (this.origin && up.fragment.config.matchAroundOrigin && !up.element.isDetached(this.origin)) {\n            return this.findClosest() || this.findInVicinity();\n        }\n    }\n    findClosest() {\n        return up.fragment.closest(this.origin, this.selector, this.options);\n    }\n    findInVicinity() {\n        let parts = this.selector.match(DESCENDANT_SELECTOR);\n        if (parts) {\n            let parent = up.fragment.closest(this.origin, parts[1], this.options);\n            if (parent) {\n                return up.fragment.getDumb(parent, parts[2]);\n            }\n        }\n    }\n    findInLayer() {\n        return up.fragment.getDumb(this.selector, this.options);\n    }\n};\n\n\n/***/ }),\n/* 33 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nconst PREVENT_SCROLL_OPTIONS = { preventScroll: true };\nup.FragmentFocus = class FragmentFocus extends up.FragmentProcessor {\n    keys() {\n        return super.keys().concat([\n            'hash',\n            'focusCapsule'\n        ]);\n    }\n    processPrimitive(opt) {\n        switch (opt) {\n            case 'keep':\n                return this.restoreFocus();\n            case 'target':\n            case true:\n                return this.focusElement(this.fragment);\n            case 'layer':\n                return this.focusElement(this.layer.getFocusElement());\n            case 'main':\n                return this.focusSelector(':main');\n            case 'hash':\n                return this.focusHash();\n            case 'autofocus':\n                return this.autofocus();\n            default:\n                if (u.isString(opt)) {\n                    return this.focusSelector(opt);\n                }\n        }\n    }\n    processElement(element) {\n        return this.focusElement(element);\n    }\n    resolveCondition(condition) {\n        if (condition === 'lost') {\n            return this.wasFocusLost();\n        }\n        else {\n            return super.resolveCondition(condition);\n        }\n    }\n    focusSelector(selector) {\n        let match = this.findSelector(selector);\n        if (match) {\n            return this.focusElement(match);\n        }\n    }\n    restoreFocus() {\n        return this.focusCapsule?.restore(this.fragment, PREVENT_SCROLL_OPTIONS);\n    }\n    autofocus() {\n        let autofocusElement = e.subtree(this.fragment, '[autofocus]')[0];\n        if (autofocusElement) {\n            up.focus(autofocusElement, PREVENT_SCROLL_OPTIONS);\n            return true;\n        }\n    }\n    focusElement(element) {\n        up.viewport.makeFocusable(element);\n        up.focus(element, PREVENT_SCROLL_OPTIONS);\n        return true;\n    }\n    focusHash() {\n        let hashTarget = up.viewport.firstHashTarget(this.hash, { layer: this.layer });\n        if (hashTarget) {\n            return this.focusElement(hashTarget);\n        }\n    }\n    wasFocusLost() {\n        return this.focusCapsule?.wasLost();\n    }\n};\n\n\n/***/ }),\n/* 34 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.FragmentPolling = class FragmentPolling {\n    constructor(fragment) {\n        this.options = {};\n        this.state = 'initialized';\n        this.setFragment(fragment);\n    }\n    static forFragment(fragment) {\n        return fragment.upPolling || (fragment.upPolling = new this(fragment));\n    }\n    onPollAttributeObserved() {\n        this.start();\n    }\n    onFragmentDestroyed() {\n        this.stop();\n    }\n    start() {\n        if (this.state !== 'started') {\n            this.state = 'started';\n            this.scheduleReload();\n        }\n    }\n    stop() {\n        if (this.state === 'started') {\n            clearTimeout(this.reloadTimer);\n            this.state = 'stopped';\n        }\n    }\n    forceStart(options) {\n        u.assign(this.options, options);\n        this.forceStarted = true;\n        this.start();\n    }\n    forceStop() {\n        this.stop();\n        this.forceStarted = false;\n    }\n    scheduleReload(delay = this.getInterval()) {\n        this.reloadTimer = setTimeout(() => this.reload(), delay);\n    }\n    reload() {\n        if (this.state !== 'started') {\n            return;\n        }\n        if (up.radio.shouldPoll(this.fragment)) {\n            let reloadOptions = {\n                url: this.options.url,\n                guardEvent: up.event.build('up:fragment:poll', { log: 'Polling fragment' })\n            };\n            u.always(up.reload(this.fragment, reloadOptions), (result) => this.onReloaded(result));\n        }\n        else {\n            up.puts('[up-poll]', 'Polling is disabled');\n            let reconsiderDisabledDelay = Math.min(10 * 1000, this.getInterval());\n            this.scheduleReload(reconsiderDisabledDelay);\n        }\n    }\n    onReloaded(result) {\n        let newFragment = result?.fragments?.[0];\n        if (newFragment) {\n            this.onFragmentSwapped(newFragment);\n        }\n        else {\n            this.scheduleReload();\n        }\n    }\n    onFragmentSwapped(newFragment) {\n        newFragment.upPolling = this;\n        delete this.fragment.upPolling;\n        this.setFragment(newFragment);\n        if (this.state === 'stopped' && this.forceStarted) {\n            this.start();\n        }\n    }\n    setFragment(newFragment) {\n        this.fragment = newFragment;\n        up.destructor(newFragment, () => this.onFragmentDestroyed());\n    }\n    getInterval() {\n        return this.options.interval ?? e.numberAttr(this.fragment, 'up-interval') ?? up.radio.config.pollInterval;\n    }\n};\n\n\n/***/ }),\n/* 35 */\n/***/ (() => {\n\nconst u = up.util;\nup.FragmentScrolling = class FragmentScrolling extends up.FragmentProcessor {\n    keys() {\n        return super.keys().concat([\n            'hash',\n            'mode',\n            'revealTop',\n            'revealMax',\n            'revealSnap',\n            'scrollBehavior',\n            'scrollSpeed'\n        ]);\n    }\n    constructor(options) {\n        up.migrate.handleScrollOptions?.(options);\n        super(options);\n    }\n    process(opt) {\n        return super.process(opt) || Promise.resolve();\n    }\n    processPrimitive(opt) {\n        switch (opt) {\n            case 'reset':\n                return this.reset();\n            case 'layer':\n                return this.revealLayer();\n            case 'main':\n                return this.revealSelector(':main');\n            case 'restore':\n                return this.restore();\n            case 'hash':\n                return this.hash && up.viewport.revealHash(this.hash, this.attributes());\n            case 'target':\n            case 'reveal':\n            case true:\n                return this.revealElement(this.fragment);\n            default:\n                if (u.isString(opt)) {\n                    return this.revealSelector(opt);\n                }\n        }\n    }\n    processElement(element) {\n        return this.revealElement(element);\n    }\n    revealElement(element) {\n        return up.reveal(element, this.attributes());\n    }\n    revealSelector(selector) {\n        let match = this.findSelector(selector);\n        if (match) {\n            return this.revealElement(match);\n        }\n    }\n    revealLayer() {\n        return this.revealElement(this.layer.getBoxElement());\n    }\n    reset() {\n        return up.viewport.resetScroll({ ...this.attributes(), around: this.fragment });\n    }\n    restore() {\n        return up.viewport.restoreScroll({ ...this.attributes(), around: this.fragment });\n    }\n};\n\n\n/***/ }),\n/* 36 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.HTMLWrapper = class HTMLWrapper {\n    constructor(tagName) {\n        this.tagName = tagName;\n        const openTag = `<${this.tagName}[^>]*>`;\n        const closeTag = `</${this.tagName}>`;\n        const innerHTML = \"(.|\\\\s)*?\";\n        this.pattern = new RegExp(openTag + innerHTML + closeTag, 'ig');\n        this.attrName = `up-wrapped-${this.tagName}`;\n    }\n    strip(html) {\n        return html.replace(this.pattern, '');\n    }\n    wrap(html) {\n        return html.replace(this.pattern, this.wrapMatch.bind(this));\n    }\n    wrapMatch(match) {\n        this.didWrap = true;\n        return '<meta name=\"' + this.attrName + '\" value=\"' + u.escapeHTML(match) + '\">';\n    }\n    unwrap(element) {\n        if (!this.didWrap) {\n            return;\n        }\n        for (let wrappedChild of element.querySelectorAll(`meta[name='${this.attrName}']`)) {\n            const originalHTML = wrappedChild.getAttribute('value');\n            const restoredElement = e.createFromHTML(originalHTML);\n            e.replace(wrappedChild, restoredElement);\n        }\n    }\n};\n\n\n/***/ }),\n/* 37 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.Layer = class Layer extends up.Record {\n    keys() {\n        return [\n            'element',\n            'stack',\n            'history',\n            'mode',\n            'context',\n            'lastScrollTops'\n        ];\n    }\n    defaults() {\n        return {\n            context: {},\n            lastScrollTops: new up.Cache({ size: 30, key: up.history.normalizeURL })\n        };\n    }\n    constructor(options = {}) {\n        super(options);\n        if (!this.mode) {\n            throw \"missing { mode } option\";\n        }\n    }\n    setupHandlers() {\n        up.link.convertClicks(this);\n    }\n    teardownHandlers() { }\n    mainTargets() {\n        return up.layer.mainTargets(this.mode);\n    }\n    sync() {\n    }\n    accept() {\n        throw up.error.notImplemented();\n    }\n    dismiss() {\n        throw up.error.notImplemented();\n    }\n    peel(options) {\n        this.stack.peel(this, options);\n    }\n    evalOption(option) {\n        return u.evalOption(option, this);\n    }\n    isCurrent() {\n        return this.stack.isCurrent(this);\n    }\n    isFront() {\n        return this.stack.isFront(this);\n    }\n    isRoot() {\n        return this.stack.isRoot(this);\n    }\n    isOverlay() {\n        return this.stack.isOverlay(this);\n    }\n    isOpen() {\n        return this.stack.isOpen(this);\n    }\n    isClosed() {\n        return this.stack.isClosed(this);\n    }\n    get parent() {\n        return this.stack.parentOf(this);\n    }\n    get child() {\n        return this.stack.childOf(this);\n    }\n    get ancestors() {\n        return this.stack.ancestorsOf(this);\n    }\n    get descendants() {\n        return this.stack.descendantsOf(this);\n    }\n    get index() {\n        return this.stack.indexOf(this);\n    }\n    getContentElement() {\n        return this.contentElement || this.element;\n    }\n    getBoxElement() {\n        return this.boxElement || this.element;\n    }\n    getFocusElement() {\n        return this.getBoxElement();\n    }\n    getFirstSwappableElement() {\n        throw up.error.notImplemented();\n    }\n    contains(element) {\n        return e.closest(element, up.layer.anySelector()) === this.element;\n    }\n    on(...args) {\n        return this.buildEventListenerGroup(args).bind();\n    }\n    off(...args) {\n        return this.buildEventListenerGroup(args).unbind();\n    }\n    buildEventListenerGroup(args) {\n        return up.EventListenerGroup.fromBindArgs(args, {\n            guard: (event) => this.containsEventTarget(event),\n            elements: [this.element],\n            baseLayer: this\n        });\n    }\n    containsEventTarget(event) {\n        return this.contains(event.target);\n    }\n    wasHitByMouseEvent(event) {\n        const hittableElement = document.elementFromPoint(event.clientX, event.clientY);\n        return !hittableElement || this.contains(hittableElement);\n    }\n    buildEventEmitter(args) {\n        return up.EventEmitter.fromEmitArgs(args, { layer: this });\n    }\n    emit(...args) {\n        return this.buildEventEmitter(args).emit();\n    }\n    isDetached() {\n        return e.isDetached(this.element);\n    }\n    saveHistory() {\n        if (this.isHistoryVisible()) {\n            this.savedTitle = document.title;\n            this.savedLocation = up.history.location;\n        }\n    }\n    restoreHistory() {\n        if (!this.showsLiveHistory()) {\n            return;\n        }\n        if (this.savedLocation) {\n            up.history.push(this.savedLocation);\n        }\n        if (this.savedTitle) {\n            document.title = this.savedTitle;\n        }\n    }\n    asCurrent(fn) {\n        return this.stack.asCurrent(this, fn);\n    }\n    updateHistory(options) {\n        if (u.isString(options.location)) {\n            this.location = options.location;\n        }\n        if (u.isString(options.title)) {\n            this.title = options.title;\n        }\n    }\n    isHistoryVisible() {\n        return this.history && (this.isRoot() || this.parent.isHistoryVisible());\n    }\n    showsLiveHistory() {\n        return this.isHistoryVisible() && this.isFront() && (up.history.config.enabled || this.isRoot());\n    }\n    get title() {\n        if (this.showsLiveHistory()) {\n            return document.title;\n        }\n        else {\n            return this.savedTitle;\n        }\n    }\n    set title(title) {\n        this.savedTitle = title;\n        if (this.showsLiveHistory()) {\n            document.title = title;\n        }\n    }\n    get location() {\n        if (this.showsLiveHistory()) {\n            return up.history.location;\n        }\n        else {\n            return this.savedLocation;\n        }\n    }\n    set location(location) {\n        const previousLocation = this.location;\n        location = up.history.normalizeURL(location);\n        if (previousLocation !== location) {\n            this.savedLocation = location;\n            this.emit('up:layer:location:changed', { location, log: false });\n            if (this.showsLiveHistory()) {\n                up.history.push(location);\n            }\n        }\n    }\n    selector(part) {\n        return this.constructor.selector(part);\n    }\n    static selector(_part) {\n        throw up.error.notImplemented();\n    }\n    toString() {\n        throw up.error.notImplemented();\n    }\n    affix(...args) {\n        return e.affix(this.getFirstSwappableElement(), ...args);\n    }\n    [u.isEqual.key](other) {\n        return (this.constructor === other.constructor) && (this.element === other.element);\n    }\n};\n\n\n/***/ }),\n/* 38 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.Layer.Overlay = class Overlay extends up.Layer {\n    keys() {\n        return super.keys().concat([\n            'position',\n            'align',\n            'size',\n            'origin',\n            'class',\n            'backdrop',\n            'openAnimation',\n            'closeAnimation',\n            'openDuration',\n            'closeDuration',\n            'openEasing',\n            'closeEasing',\n            'backdropOpenAnimation',\n            'backdropCloseAnimation',\n            'dismissable',\n            'dismissLabel',\n            'dismissAriaLabel',\n            'onOpened',\n            'onAccept',\n            'onAccepted',\n            'onDismiss',\n            'onDismissed',\n            'acceptEvent',\n            'dismissEvent',\n            'acceptLocation',\n            'dismissLocation',\n            'opening'\n        ]);\n    }\n    constructor(options) {\n        super(options);\n        if (this.dismissable === true) {\n            this.dismissable = ['button', 'key', 'outside'];\n        }\n        else if (this.dismissable === false) {\n            this.dismissable = [];\n        }\n        else {\n            this.dismissable = u.splitValues(this.dismissable);\n        }\n        if (this.acceptLocation) {\n            this.acceptLocation = new up.URLPattern(this.acceptLocation);\n        }\n        if (this.dismissLocation) {\n            this.dismissLocation = new up.URLPattern(this.dismissLocation);\n        }\n    }\n    callback(name) {\n        let fn = this[name];\n        if (fn) {\n            return fn.bind(this);\n        }\n    }\n    createElement(parentElement) {\n        this.nesting || (this.nesting = this.suggestVisualNesting());\n        const elementAttrs = u.compactObject(u.pick(this, ['align', 'position', 'size', 'class', 'nesting']));\n        this.element = this.affixPart(parentElement, null, elementAttrs);\n    }\n    createBackdropElement(parentElement) {\n        this.backdropElement = this.affixPart(parentElement, 'backdrop');\n    }\n    createViewportElement(parentElement) {\n        this.viewportElement = this.affixPart(parentElement, 'viewport', { 'up-viewport': '' });\n    }\n    createBoxElement(parentElement) {\n        this.boxElement = this.affixPart(parentElement, 'box');\n    }\n    createContentElement(parentElement, content) {\n        this.contentElement = this.affixPart(parentElement, 'content');\n        this.contentElement.appendChild(content);\n    }\n    createDismissElement(parentElement) {\n        this.dismissElement = this.affixPart(parentElement, 'dismiss', {\n            'up-dismiss': '\":button\"',\n            'aria-label': this.dismissAriaLabel\n        });\n        return e.affix(this.dismissElement, 'span[aria-hidden=\"true\"]', { text: this.dismissLabel });\n    }\n    affixPart(parentElement, part, options = {}) {\n        return e.affix(parentElement, this.selector(part), options);\n    }\n    static selector(part) {\n        return u.compact(['up', this.mode, part]).join('-');\n    }\n    suggestVisualNesting() {\n        const { parent } = this;\n        if (this.mode === parent.mode) {\n            return 1 + parent.suggestVisualNesting();\n        }\n        else {\n            return 0;\n        }\n    }\n    setupHandlers() {\n        super.setupHandlers();\n        this.overlayFocus = new up.OverlayFocus(this);\n        if (this.supportsDismissMethod('button')) {\n            this.createDismissElement(this.getBoxElement());\n        }\n        if (this.supportsDismissMethod('outside')) {\n            if (this.viewportElement) {\n                up.on(this.viewportElement, 'up:click', event => {\n                    if (event.target === this.viewportElement) {\n                        this.onOutsideClicked(event, true);\n                    }\n                });\n            }\n            else {\n                this.unbindParentClicked = this.parent.on('up:click', (event, element) => {\n                    const originClicked = this.origin && this.origin.contains(element);\n                    this.onOutsideClicked(event, originClicked);\n                });\n            }\n        }\n        if (this.supportsDismissMethod('key')) {\n            this.unbindEscapePressed = up.event.onEscape(event => this.onEscapePressed(event));\n        }\n        this.registerClickCloser('up-accept', (value, closeOptions) => {\n            this.accept(value, closeOptions);\n        });\n        this.registerClickCloser('up-dismiss', (value, closeOptions) => {\n            this.dismiss(value, closeOptions);\n        });\n        up.migrate.registerLayerCloser?.(this);\n        this.registerEventCloser(this.acceptEvent, this.accept);\n        this.registerEventCloser(this.dismissEvent, this.dismiss);\n    }\n    onOutsideClicked(event, halt) {\n        if (halt) {\n            up.event.halt(event);\n        }\n        this.dismiss(':outside', { origin: event.target });\n    }\n    onEscapePressed(event) {\n        if (this.isFront()) {\n            let field = up.form.focusedField();\n            if (field) {\n                field.blur();\n            }\n            else if (this.supportsDismissMethod('key')) {\n                up.event.halt(event);\n                this.dismiss(':key');\n            }\n        }\n    }\n    registerClickCloser(attribute, closeFn) {\n        let selector = `[${attribute}]`;\n        this.on('up:click', selector, function (event) {\n            up.event.halt(event);\n            const origin = e.closest(event.target, selector);\n            const value = e.jsonAttr(origin, attribute);\n            const closeOptions = { origin };\n            const parser = new up.OptionsParser(closeOptions, origin);\n            parser.booleanOrString('animation');\n            parser.string('easing');\n            parser.number('duration');\n            parser.string('confirm');\n            closeFn(value, closeOptions);\n        });\n    }\n    registerEventCloser(eventTypes, closeFn) {\n        if (!eventTypes) {\n            return;\n        }\n        return this.on(eventTypes, event => {\n            event.preventDefault();\n            closeFn.call(this, event);\n        });\n    }\n    tryAcceptForLocation() {\n        this.tryCloseForLocation(this.acceptLocation, this.accept);\n    }\n    tryDismissForLocation() {\n        this.tryCloseForLocation(this.dismissLocation, this.dismiss);\n    }\n    tryCloseForLocation(urlPattern, closeFn) {\n        let location, resolution;\n        if (urlPattern && (location = this.location) && (resolution = urlPattern.recognize(location))) {\n            const closeValue = { ...resolution, location };\n            closeFn.call(this, closeValue);\n        }\n    }\n    teardownHandlers() {\n        super.teardownHandlers();\n        this.unbindParentClicked?.();\n        this.unbindEscapePressed?.();\n        this.overlayFocus.teardown();\n    }\n    destroyElements(options) {\n        const animation = () => {\n            return this.startCloseAnimation(options);\n        };\n        const onFinished = () => {\n            this.onElementsRemoved();\n            options.onFinished?.();\n        };\n        const destroyOptions = { ...options, animation, onFinished, log: false };\n        up.destroy(this.element, destroyOptions);\n    }\n    onElementsRemoved() { }\n    startAnimation(options = {}) {\n        const boxDone = up.animate(this.getBoxElement(), options.boxAnimation, options);\n        let backdropDone;\n        if (this.backdrop && !up.motion.isNone(options.boxAnimation)) {\n            backdropDone = up.animate(this.backdropElement, options.backdropAnimation, options);\n        }\n        return Promise.all([boxDone, backdropDone]);\n    }\n    startOpenAnimation(options = {}) {\n        return this.startAnimation({\n            boxAnimation: options.animation ?? this.evalOption(this.openAnimation),\n            backdropAnimation: 'fade-in',\n            easing: options.easing || this.openEasing,\n            duration: options.duration || this.openDuration\n        }).then(() => {\n            return this.wasEverVisible = true;\n        });\n    }\n    startCloseAnimation(options = {}) {\n        const boxAnimation = this.wasEverVisible && (options.animation ?? this.evalOption(this.closeAnimation));\n        return this.startAnimation({\n            boxAnimation,\n            backdropAnimation: 'fade-out',\n            easing: options.easing || this.closeEasing,\n            duration: options.duration || this.closeDuration\n        });\n    }\n    accept(value = null, options = {}) {\n        return this.executeCloseChange('accept', value, options);\n    }\n    dismiss(value = null, options = {}) {\n        return this.executeCloseChange('dismiss', value, options);\n    }\n    supportsDismissMethod(method) {\n        return u.contains(this.dismissable, method);\n    }\n    executeCloseChange(verb, value, options) {\n        options = { ...options, verb, value, layer: this };\n        return new up.Change.CloseLayer(options).execute();\n    }\n    getFirstSwappableElement() {\n        return this.getContentElement().children[0];\n    }\n    toString() {\n        return `${this.mode} overlay`;\n    }\n};\n\n\n/***/ }),\n/* 39 */\n/***/ (() => {\n\nup.Layer.OverlayWithTether = class OverlayWithTether extends up.Layer.Overlay {\n    createElements(content) {\n        if (!this.origin) {\n            up.fail('Missing { origin } option');\n        }\n        this.tether = new up.Tether({\n            anchor: this.origin,\n            align: this.align,\n            position: this.position\n        });\n        this.createElement(this.tether.parent);\n        this.createContentElement(this.element, content);\n        this.tether.start(this.element);\n    }\n    onElementsRemoved() {\n        this.tether.stop();\n    }\n    sync() {\n        if (this.isOpen()) {\n            if (this.isDetached() || this.tether.isDetached()) {\n                this.dismiss(':detached', {\n                    animation: false,\n                    preventable: false\n                });\n            }\n            else {\n                this.tether.sync();\n            }\n        }\n    }\n};\n\n\n/***/ }),\n/* 40 */\n/***/ (() => {\n\nvar _a;\nup.Layer.OverlayWithViewport = (_a = class OverlayWithViewport extends up.Layer.Overlay {\n        static getParentElement() {\n            return document.body;\n        }\n        createElements(content) {\n            this.shiftBody();\n            this.createElement(this.constructor.getParentElement());\n            if (this.backdrop) {\n                this.createBackdropElement(this.element);\n            }\n            this.createViewportElement(this.element);\n            this.createBoxElement(this.viewportElement);\n            this.createContentElement(this.boxElement, content);\n        }\n        onElementsRemoved() {\n            this.unshiftBody();\n        }\n        shiftBody() {\n            this.constructor.bodyShifter.shift();\n        }\n        unshiftBody() {\n            this.constructor.bodyShifter.unshift();\n        }\n        sync() {\n            if (this.isDetached() && this.isOpen()) {\n                this.constructor.getParentElement().appendChild(this.element);\n            }\n        }\n    },\n    _a.bodyShifter = new up.BodyShifter(),\n    _a);\n\n\n/***/ }),\n/* 41 */\n/***/ (() => {\n\nvar _a;\nconst u = up.util;\nconst e = up.element;\nup.Layer.Root = (_a = class Root extends up.Layer {\n        constructor(options) {\n            super(options);\n            this.setupHandlers();\n        }\n        get element() {\n            return e.root;\n        }\n        getFirstSwappableElement() {\n            return document.body;\n        }\n        static selector() {\n            return 'html';\n        }\n        setupHandlers() {\n            if (!this.element.upHandlersApplied) {\n                this.element.upHandlersApplied = true;\n                super.setupHandlers();\n            }\n        }\n        sync() {\n            this.setupHandlers();\n        }\n        accept() {\n            this.cannotCloseRoot();\n        }\n        dismiss() {\n            this.cannotCloseRoot();\n        }\n        cannotCloseRoot() {\n            throw up.error.failed('Cannot close the root layer');\n        }\n        reset() {\n            u.assign(this, this.defaults());\n        }\n        toString() {\n            return \"root layer\";\n        }\n    },\n    _a.mode = 'root',\n    _a);\n\n\n/***/ }),\n/* 42 */\n/***/ (() => {\n\nvar _a;\nup.Layer.Modal = (_a = class Modal extends up.Layer.OverlayWithViewport {\n    },\n    _a.mode = 'modal',\n    _a);\n\n\n/***/ }),\n/* 43 */\n/***/ (() => {\n\nvar _a;\nup.Layer.Popup = (_a = class Popup extends up.Layer.OverlayWithTether {\n    },\n    _a.mode = 'popup',\n    _a);\n\n\n/***/ }),\n/* 44 */\n/***/ (() => {\n\nvar _a;\nup.Layer.Drawer = (_a = class Drawer extends up.Layer.OverlayWithViewport {\n    },\n    _a.mode = 'drawer',\n    _a);\n\n\n/***/ }),\n/* 45 */\n/***/ (() => {\n\nvar _a;\nup.Layer.Cover = (_a = class Cover extends up.Layer.OverlayWithViewport {\n    },\n    _a.mode = 'cover',\n    _a);\n\n\n/***/ }),\n/* 46 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.LayerLookup = class LayerLookup {\n    constructor(stack, ...args) {\n        this.stack = stack;\n        const options = u.parseArgIntoOptions(args, 'layer');\n        if (options.normalizeLayerOptions !== false) {\n            up.layer.normalizeOptions(options);\n        }\n        this.values = u.splitValues(options.layer);\n        this.origin = options.origin;\n        this.baseLayer = options.baseLayer || this.originLayer() || this.stack.current;\n        if (u.isString(this.baseLayer)) {\n            const recursiveOptions = { ...options, baseLayer: this.stack.current, normalizeLayerOptions: false };\n            this.baseLayer = new this.constructor(this.stack, this.baseLayer, recursiveOptions).first();\n        }\n    }\n    originLayer() {\n        if (this.origin) {\n            return this.forElement(this.origin);\n        }\n    }\n    first() {\n        return this.all()[0];\n    }\n    all() {\n        let results = u.flatMap(this.values, value => this.resolveValue(value));\n        results = u.compact(results);\n        results = u.uniq(results);\n        return results;\n    }\n    forElement(element) {\n        element = e.get(element);\n        return u.find(this.stack.reversed(), layer => layer.contains(element));\n    }\n    forIndex(value) {\n        return this.stack[value];\n    }\n    resolveValue(value) {\n        if (value instanceof up.Layer) {\n            return value;\n        }\n        if (u.isNumber(value)) {\n            return this.forIndex(value);\n        }\n        if (/^\\d+$/.test(value)) {\n            return this.forIndex(Number(value));\n        }\n        if (u.isElementish(value)) {\n            return this.forElement(value);\n        }\n        switch (value) {\n            case 'any':\n                return [this.baseLayer, ...this.stack.reversed()];\n            case 'current':\n                return this.baseLayer;\n            case 'closest':\n                return this.stack.selfAndAncestorsOf(this.baseLayer);\n            case 'parent':\n                return this.baseLayer.parent;\n            case 'ancestor':\n            case 'ancestors':\n                return this.baseLayer.ancestors;\n            case 'child':\n                return this.baseLayer.child;\n            case 'descendant':\n            case 'descendants':\n                return this.baseLayer.descendants;\n            case 'new':\n                return 'new';\n            case 'root':\n                return this.stack.root;\n            case 'overlay':\n            case 'overlays':\n                return u.reverse(this.stack.overlays);\n            case 'front':\n                return this.stack.front;\n            case 'origin':\n                return this.originLayer();\n            default:\n                return up.fail(\"Unknown { layer } option: %o\", value);\n        }\n    }\n};\n\n\n/***/ }),\n/* 47 */\n/***/ (() => {\n\nconst u = up.util;\nup.LayerStack = class LayerStack extends Array {\n    constructor() {\n        super();\n        Object.setPrototypeOf(this, up.LayerStack.prototype);\n        this.currentOverrides = [];\n        this.push(this.buildRoot());\n    }\n    buildRoot() {\n        return up.layer.build({ mode: 'root', stack: this });\n    }\n    remove(layer) {\n        u.remove(this, layer);\n    }\n    peel(layer, options) {\n        const descendants = u.reverse(layer.descendants);\n        const dismissOptions = { ...options, preventable: false };\n        for (let descendant of descendants) {\n            descendant.dismiss(':peel', dismissOptions);\n        }\n    }\n    reset() {\n        this.peel(this.root, { animation: false });\n        this.currentOverrides = [];\n        this.root.reset();\n    }\n    isOpen(layer) {\n        return layer.index >= 0;\n    }\n    isClosed(layer) {\n        return !this.isOpen(layer);\n    }\n    parentOf(layer) {\n        return this[layer.index - 1];\n    }\n    childOf(layer) {\n        return this[layer.index + 1];\n    }\n    ancestorsOf(layer) {\n        return u.reverse(this.slice(0, layer.index));\n    }\n    selfAndAncestorsOf(layer) {\n        return [layer, ...layer.ancestors];\n    }\n    descendantsOf(layer) {\n        return this.slice(layer.index + 1);\n    }\n    isRoot(layer) {\n        return this[0] === layer;\n    }\n    isOverlay(layer) {\n        return !this.isRoot(layer);\n    }\n    isCurrent(layer) {\n        return this.current === layer;\n    }\n    isFront(layer) {\n        return this.front === layer;\n    }\n    get(...args) {\n        return this.getAll(...args)[0];\n    }\n    getAll(...args) {\n        return new up.LayerLookup(this, ...args).all();\n    }\n    sync() {\n        for (let layer of this) {\n            layer.sync();\n        }\n    }\n    asCurrent(layer, fn) {\n        try {\n            this.currentOverrides.push(layer);\n            return fn();\n        }\n        finally {\n            this.currentOverrides.pop();\n        }\n    }\n    reversed() {\n        return u.reverse(this);\n    }\n    dismissOverlays(value = null, options = {}) {\n        options.dismissable = false;\n        for (let overlay of u.reverse(this.overlays)) {\n            overlay.dismiss(value, options);\n        }\n    }\n    [u.copy.key]() {\n        return u.copyArrayLike(this);\n    }\n    get count() {\n        return this.length;\n    }\n    get root() {\n        return this[0];\n    }\n    get overlays() {\n        return this.root.descendants;\n    }\n    get current() {\n        return u.last(this.currentOverrides) || this.front;\n    }\n    get front() {\n        return u.last(this);\n    }\n};\n\n\n/***/ }),\n/* 48 */\n/***/ (() => {\n\nup.LinkFeedbackURLs = class LinkFeedbackURLs {\n    constructor(link) {\n        const normalize = up.feedback.normalizeURL;\n        this.isSafe = up.link.isSafe(link);\n        if (this.isSafe) {\n            const href = link.getAttribute('href');\n            if (href && (href !== '#')) {\n                this.href = normalize(href);\n            }\n            const upHREF = link.getAttribute('up-href');\n            if (upHREF) {\n                this.upHREF = normalize(upHREF);\n            }\n            const alias = link.getAttribute('up-alias');\n            if (alias) {\n                this.aliasPattern = new up.URLPattern(alias, normalize);\n            }\n        }\n    }\n    isCurrent(normalizedLocation) {\n        return this.isSafe && !!((this.href && (this.href === normalizedLocation)) ||\n            (this.upHREF && (this.upHREF === normalizedLocation)) ||\n            (this.aliasPattern && this.aliasPattern.test(normalizedLocation, false)));\n    }\n};\n\n\n/***/ }),\n/* 49 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.LinkPreloader = class LinkPreloader {\n    constructor() {\n        this.considerPreload = this.considerPreload.bind(this);\n    }\n    observeLink(link) {\n        if (up.link.isSafe(link)) {\n            this.on(link, 'mouseenter', event => this.considerPreload(event, true));\n            this.on(link, 'mousedown touchstart', event => this.considerPreload(event));\n            this.on(link, 'mouseleave', event => this.stopPreload(event));\n        }\n    }\n    on(link, eventTypes, callback) {\n        up.on(link, eventTypes, { passive: true }, callback);\n    }\n    considerPreload(event, applyDelay) {\n        const link = event.target;\n        if (link !== this.currentLink) {\n            this.reset();\n            this.currentLink = link;\n            if (up.link.shouldFollowEvent(event, link)) {\n                if (applyDelay) {\n                    this.preloadAfterDelay(link);\n                }\n                else {\n                    this.preloadNow(link);\n                }\n            }\n        }\n    }\n    stopPreload(event) {\n        if (event.target === this.currentLink) {\n            return this.reset();\n        }\n    }\n    reset() {\n        if (!this.currentLink) {\n            return;\n        }\n        clearTimeout(this.timer);\n        if (this.currentRequest?.preload) {\n            this.currentRequest.abort();\n        }\n        this.currentLink = undefined;\n        this.currentRequest = undefined;\n    }\n    preloadAfterDelay(link) {\n        const delay = e.numberAttr(link, 'up-delay') ?? up.link.config.preloadDelay;\n        this.timer = u.timer(delay, () => this.preloadNow(link));\n    }\n    preloadNow(link) {\n        if (e.isDetached(link)) {\n            this.reset();\n            return;\n        }\n        const onQueued = request => { return this.currentRequest = request; };\n        up.log.muteUncriticalRejection(up.link.preload(link, { onQueued }));\n        this.queued = true;\n    }\n};\n\n\n/***/ }),\n/* 50 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.MotionController = class MotionController {\n    constructor(name) {\n        this.activeClass = `up-${name}`;\n        this.dataKey = `up-${name}-finished`;\n        this.selector = `.${this.activeClass}`;\n        this.finishEvent = `up:${name}:finish`;\n        this.finishCount = 0;\n        this.clusterCount = 0;\n    }\n    async startFunction(cluster, startMotion, memory = {}) {\n        cluster = e.list(cluster);\n        const mutedAnimator = () => up.log.muteUncriticalRejection(startMotion());\n        memory.trackMotion = memory.trackMotion ?? up.motion.isEnabled();\n        if (memory.trackMotion === false) {\n            await u.microtask(mutedAnimator);\n        }\n        else {\n            memory.trackMotion = false;\n            await this.finish(cluster);\n            let promise = this.whileForwardingFinishEvent(cluster, mutedAnimator);\n            this.markCluster(cluster, promise);\n            promise = promise.then(() => this.unmarkCluster(cluster));\n            return await promise;\n        }\n    }\n    startMotion(cluster, motion, memory = {}) {\n        const start = () => motion.start();\n        const finish = () => motion.finish();\n        const unbindFinish = up.on(cluster, this.finishEvent, finish);\n        let promise = this.startFunction(cluster, start, memory);\n        promise = promise.then(unbindFinish);\n        return promise;\n    }\n    finish(elements) {\n        this.finishCount++;\n        if ((this.clusterCount === 0) || !up.motion.isEnabled()) {\n            return Promise.resolve();\n        }\n        elements = this.expandFinishRequest(elements);\n        const allFinished = u.map(elements, this.finishOneElement.bind(this));\n        return Promise.all(allFinished);\n    }\n    expandFinishRequest(elements) {\n        if (elements) {\n            return u.flatMap(elements, el => e.list(e.closest(el, this.selector), e.all(el, this.selector)));\n        }\n        else {\n            return e.all(this.selector);\n        }\n    }\n    isActive(element) {\n        return element.classList.contains(this.activeClass);\n    }\n    finishOneElement(element) {\n        this.emitFinishEvent(element);\n        return this.whenElementFinished(element);\n    }\n    emitFinishEvent(element, eventAttrs = {}) {\n        eventAttrs = { target: element, log: false, ...eventAttrs };\n        return up.emit(this.finishEvent, eventAttrs);\n    }\n    whenElementFinished(element) {\n        return element[this.dataKey] || Promise.resolve();\n    }\n    markCluster(cluster, promise) {\n        this.clusterCount++;\n        for (let element of cluster) {\n            element.classList.add(this.activeClass);\n            element[this.dataKey] = promise;\n        }\n    }\n    unmarkCluster(cluster) {\n        this.clusterCount--;\n        for (let element of cluster) {\n            element.classList.remove(this.activeClass);\n            delete element[this.dataKey];\n        }\n    }\n    whileForwardingFinishEvent(cluster, fn) {\n        if (cluster.length < 2) {\n            return fn();\n        }\n        const doForward = (event) => {\n            if (!event.forwarded) {\n                for (let element of cluster) {\n                    if (element !== event.target && this.isActive(element)) {\n                        this.emitFinishEvent(element, { forwarded: true });\n                    }\n                }\n            }\n        };\n        const unbindFinish = up.on(cluster, this.finishEvent, doForward);\n        return fn().then(unbindFinish);\n    }\n    async reset() {\n        await this.finish();\n        this.finishCount = 0;\n        this.clusterCount = 0;\n    }\n};\n\n\n/***/ }),\n/* 51 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.NonceableCallback = class NonceableCallback {\n    constructor(script, nonce) {\n        this.script = script;\n        this.nonce = nonce;\n    }\n    static fromString(string) {\n        let match = string.match(/^(nonce-([^\\s]+)\\s)?(.*)$/);\n        return new this(match[3], match[2]);\n    }\n    toFunction(...argNames) {\n        if (up.browser.canEval()) {\n            return new Function(...argNames, this.script);\n        }\n        else if (this.nonce) {\n            let callbackThis = this;\n            return function (...args) {\n                return callbackThis.runAsNoncedFunction(this, argNames, args);\n            };\n        }\n        else {\n            return this.cannotRun.bind(this);\n        }\n    }\n    toString() {\n        return `nonce-${this.nonce} ${this.script}`;\n    }\n    cannotRun() {\n        throw new Error(`Your Content Security Policy disallows inline JavaScript (${this.script}). See https://unpoly.com/csp for solutions.`);\n    }\n    runAsNoncedFunction(thisArg, argNames, args) {\n        let wrappedScript = `\n      try {\n        up.noncedEval.value = (function(${argNames.join(',')}) {\n          ${this.script}\n        }).apply(up.noncedEval.thisArg, up.noncedEval.args)\n      } catch (error) {\n        up.noncedEval.error = error\n      }\n    `;\n        let script;\n        try {\n            up.noncedEval = { args, thisArg: thisArg };\n            script = up.element.affix(document.body, 'script', { nonce: this.nonce, text: wrappedScript });\n            if (up.noncedEval.error) {\n                throw up.noncedEval.error;\n            }\n            else {\n                return up.noncedEval.value;\n            }\n        }\n        finally {\n            up.noncedEval = undefined;\n            if (script) {\n                up.element.remove(script);\n            }\n        }\n    }\n    allowedBy(allowedNonces) {\n        return this.nonce && u.contains(allowedNonces, this.nonce);\n    }\n    static adoptNonces(element, allowedNonces) {\n        if (!allowedNonces?.length) {\n            return;\n        }\n        const getPageNonce = u.memoize(up.protocol.cspNonce);\n        u.each(up.protocol.config.nonceableAttributes, (attribute) => {\n            let matches = e.subtree(element, `[${attribute}^=\"nonce-\"]`);\n            u.each(matches, (match) => {\n                let attributeValue = match.getAttribute(attribute);\n                let callback = this.fromString(attributeValue);\n                let warn = (message, ...args) => up.log.warn('up.render()', `Cannot use callback [${attribute}=\"${attributeValue}\"]: ${message}`, ...args);\n                if (!callback.allowedBy(allowedNonces)) {\n                    return warn(\"Callback's CSP nonce (%o) does not match response header (%o)\", callback.nonce, allowedNonces);\n                }\n                let pageNonce = getPageNonce();\n                if (!pageNonce) {\n                    return warn(\"Current page's CSP nonce is unknown\");\n                }\n                callback.nonce = pageNonce;\n                match.setAttribute(attribute, callback.toString());\n            });\n        });\n    }\n};\n\n\n/***/ }),\n/* 52 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.OptionsParser = class OptionsParser {\n    constructor(options, element, parserOptions) {\n        this.options = options;\n        this.element = element;\n        this.fail = parserOptions?.fail;\n    }\n    string(key, keyOptions) {\n        this.parse(e.attr, key, keyOptions);\n    }\n    boolean(key, keyOptions) {\n        this.parse(e.booleanAttr, key, keyOptions);\n    }\n    number(key, keyOptions) {\n        this.parse(e.numberAttr, key, keyOptions);\n    }\n    booleanOrString(key, keyOptions) {\n        this.parse(e.booleanOrStringAttr, key, keyOptions);\n    }\n    json(key, keyOptions) {\n        this.parse(e.jsonAttr, key, keyOptions);\n    }\n    parse(attrValueFn, key, keyOptions = {}) {\n        const attrNames = u.wrapList(keyOptions.attr ?? this.attrNameForKey(key));\n        let value = this.options[key];\n        if (this.element) {\n            for (let attrName of attrNames) {\n                value ?? (value = attrValueFn(this.element, attrName));\n            }\n        }\n        value ?? (value = keyOptions.default);\n        let normalizeFn = keyOptions.normalize;\n        if (normalizeFn) {\n            value = normalizeFn(value);\n        }\n        if (u.isDefined(value)) {\n            this.options[key] = value;\n        }\n        let failKey;\n        if ((keyOptions.fail || this.fail) && (failKey = up.fragment.failKey(key))) {\n            const failAttrNames = u.compact(u.map(attrNames, this.deriveFailAttrName));\n            const failKeyOptions = {\n                ...keyOptions,\n                attr: failAttrNames,\n                fail: false\n            };\n            this.parse(attrValueFn, failKey, failKeyOptions);\n        }\n    }\n    deriveFailAttrName(attr) {\n        if (attr.indexOf('up-') === 0) {\n            return `up-fail-${attr.slice(3)}`;\n        }\n    }\n    attrNameForKey(option) {\n        return `up-${u.camelToKebabCase(option)}`;\n    }\n};\n\n\n/***/ }),\n/* 53 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.OverlayFocus = class OverlayFocus {\n    constructor(layer) {\n        this.layer = layer;\n        this.focusElement = this.layer.getFocusElement();\n    }\n    moveToFront() {\n        if (this.enabled) {\n            return;\n        }\n        this.enabled = true;\n        this.untrapFocus = up.on('focusin', event => this.onFocus(event));\n        this.unsetAttrs = e.setTemporaryAttrs(this.focusElement, {\n            'tabindex': '0',\n            'role': 'dialog',\n            'aria-modal': 'true'\n        });\n        this.focusTrapBefore = e.affix(this.focusElement, 'beforebegin', 'up-focus-trap[tabindex=0]');\n        this.focusTrapAfter = e.affix(this.focusElement, 'afterend', 'up-focus-trap[tabindex=0]');\n    }\n    moveToBack() {\n        this.teardown();\n    }\n    teardown() {\n        if (!this.enabled) {\n            return;\n        }\n        this.enabled = false;\n        this.untrapFocus();\n        this.unsetAttrs();\n        e.remove(this.focusTrapBefore);\n        e.remove(this.focusTrapAfter);\n    }\n    onFocus(event) {\n        const { target } = event;\n        if (this.processingFocusEvent) {\n            return;\n        }\n        this.processingFocusEvent = true;\n        if (target === this.focusTrapBefore) {\n            this.focusEnd();\n        }\n        else if ((target === this.focusTrapAfter) || !this.layer.contains(target)) {\n            this.focusStart();\n        }\n        this.processingFocusEvent = false;\n    }\n    focusStart(focusOptions) {\n        up.focus(this.focusElement, focusOptions);\n    }\n    focusEnd() {\n        this.focusLastDescendant(this.layer.getBoxElement()) || this.focusStart();\n    }\n    focusLastDescendant(element) {\n        for (let child of u.reverse(element.children)) {\n            if (up.viewport.tryFocus(child) || this.focusLastDescendant(child)) {\n                return true;\n            }\n        }\n    }\n};\n\n\n/***/ }),\n/* 54 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.Params = class Params {\n    constructor(raw) {\n        this.clear();\n        this.addAll(raw);\n    }\n    clear() {\n        this.entries = [];\n    }\n    [u.copy.key]() {\n        return new up.Params(this);\n    }\n    toObject() {\n        const obj = {};\n        for (let entry of this.entries) {\n            const { name, value } = entry;\n            if (!u.isBasicObjectProperty(name)) {\n                if (this.isArrayKey(name)) {\n                    obj[name] || (obj[name] = []);\n                    obj[name].push(value);\n                }\n                else {\n                    obj[name] = value;\n                }\n            }\n        }\n        return obj;\n    }\n    toArray() {\n        return this.entries;\n    }\n    toFormData() {\n        const formData = new FormData();\n        for (let entry of this.entries) {\n            formData.append(entry.name, entry.value);\n        }\n        if (!formData.entries) {\n            formData.originalArray = this.entries;\n        }\n        return formData;\n    }\n    toQuery() {\n        let parts = u.map(this.entries, this.arrayEntryToQuery.bind(this));\n        parts = u.compact(parts);\n        return parts.join('&');\n    }\n    arrayEntryToQuery(entry) {\n        const { value } = entry;\n        if (this.isBinaryValue(value)) {\n            return;\n        }\n        let query = encodeURIComponent(entry.name);\n        if (u.isGiven(value)) {\n            query += \"=\";\n            query += encodeURIComponent(value);\n        }\n        return query;\n    }\n    isBinaryValue(value) {\n        return value instanceof Blob;\n    }\n    hasBinaryValues() {\n        const values = u.map(this.entries, 'value');\n        return u.some(values, this.isBinaryValue);\n    }\n    toURL(base) {\n        let parts = [base, this.toQuery()];\n        parts = u.filter(parts, u.isPresent);\n        const separator = u.contains(base, '?') ? '&' : '?';\n        return parts.join(separator);\n    }\n    add(name, value) {\n        this.entries.push({ name, value });\n    }\n    addAll(raw) {\n        if (u.isMissing(raw)) {\n        }\n        else if (raw instanceof this.constructor) {\n            this.entries.push(...raw.entries);\n        }\n        else if (u.isArray(raw)) {\n            this.entries.push(...raw);\n        }\n        else if (u.isString(raw)) {\n            this.addAllFromQuery(raw);\n        }\n        else if (u.isFormData(raw)) {\n            this.addAllFromFormData(raw);\n        }\n        else if (u.isObject(raw)) {\n            this.addAllFromObject(raw);\n        }\n        else {\n            up.fail(\"Unsupport params type: %o\", raw);\n        }\n    }\n    addAllFromObject(object) {\n        for (let key in object) {\n            const value = object[key];\n            const valueElements = u.isArray(value) ? value : [value];\n            for (let valueElement of valueElements) {\n                this.add(key, valueElement);\n            }\n        }\n    }\n    addAllFromQuery(query) {\n        for (let part of query.split('&')) {\n            if (part) {\n                let [name, value] = part.split('=');\n                name = decodeURIComponent(name);\n                if (u.isGiven(value)) {\n                    value = decodeURIComponent(value);\n                }\n                else {\n                    value = null;\n                }\n                this.add(name, value);\n            }\n        }\n    }\n    addAllFromFormData(formData) {\n        u.eachIterator(formData.entries(), value => {\n            this.add(...value);\n        });\n    }\n    set(name, value) {\n        this.delete(name);\n        this.add(name, value);\n    }\n    delete(name) {\n        this.entries = u.reject(this.entries, this.matchEntryFn(name));\n    }\n    matchEntryFn(name) {\n        return entry => entry.name === name;\n    }\n    get(name) {\n        if (this.isArrayKey(name)) {\n            return this.getAll(name);\n        }\n        else {\n            return this.getFirst(name);\n        }\n    }\n    getFirst(name) {\n        const entry = u.find(this.entries, this.matchEntryFn(name));\n        return entry?.value;\n    }\n    getAll(name) {\n        if (this.isArrayKey(name)) {\n            return this.getAll(name);\n        }\n        else {\n            const entries = u.map(this.entries, this.matchEntryFn(name));\n            return u.map(entries, 'value');\n        }\n    }\n    isArrayKey(key) {\n        return u.endsWith(key, '[]');\n    }\n    [u.isBlank.key]() {\n        return this.entries.length === 0;\n    }\n    static fromForm(form) {\n        form = up.fragment.get(form);\n        return this.fromFields(up.form.fields(form));\n    }\n    static fromFields(fields) {\n        const params = new (this)();\n        for (let field of u.wrapList(fields)) {\n            params.addField(field);\n        }\n        return params;\n    }\n    addField(field) {\n        field = e.get(field);\n        let name = field.name;\n        if (name && !field.disabled) {\n            const { tagName } = field;\n            const { type } = field;\n            if (tagName === 'SELECT') {\n                for (let option of field.querySelectorAll('option')) {\n                    if (option.selected) {\n                        this.add(name, option.value);\n                    }\n                }\n            }\n            else if ((type === 'checkbox') || (type === 'radio')) {\n                if (field.checked) {\n                    this.add(name, field.value);\n                }\n            }\n            else if (type === 'file') {\n                for (let file of field.files) {\n                    this.add(name, file);\n                }\n            }\n            else {\n                return this.add(name, field.value);\n            }\n        }\n    }\n    [u.isEqual.key](other) {\n        return (this.constructor === other.constructor) && u.isEqual(this.entries, other.entries);\n    }\n    static fromURL(url) {\n        const params = new (this)();\n        const urlParts = u.parseURL(url);\n        let query = urlParts.search;\n        if (query) {\n            query = query.replace(/^\\?/, '');\n            params.addAll(query);\n        }\n        return params;\n    }\n    static stripURL(url) {\n        return u.normalizeURL(url, { search: false });\n    }\n};\n\n\n/***/ }),\n/* 55 */\n/***/ (() => {\n\nconst e = up.element;\nconst TRANSITION_DELAY = 300;\nup.ProgressBar = class ProgressBar {\n    constructor() {\n        this.step = 0;\n        this.element = e.affix(document.body, 'up-progress-bar');\n        this.element.style.transition = `width ${TRANSITION_DELAY}ms ease-out`;\n        this.moveTo(0);\n        up.element.paint(this.element);\n        this.width = 31;\n        this.nextStep();\n    }\n    nextStep() {\n        let diff;\n        if (this.width < 80) {\n            if (Math.random() < 0.15) {\n                diff = 7 + (5 * Math.random());\n            }\n            else {\n                diff = 1.5 + (0.5 * Math.random());\n            }\n        }\n        else {\n            diff = 0.13 * (100 - this.width) * Math.random();\n        }\n        this.moveTo(this.width + diff);\n        this.step++;\n        const nextStepDelay = TRANSITION_DELAY + (this.step * 40);\n        this.timeout = setTimeout(this.nextStep.bind(this), nextStepDelay);\n    }\n    moveTo(width) {\n        this.width = width;\n        this.element.style.width = `${width}vw`;\n    }\n    destroy() {\n        clearTimeout(this.timeout);\n        e.remove(this.element);\n    }\n    conclude() {\n        clearTimeout(this.timeout);\n        this.moveTo(100);\n        setTimeout(this.destroy.bind(this), TRANSITION_DELAY);\n    }\n};\n\n\n/***/ }),\n/* 56 */\n/***/ (() => {\n\nconst u = up.util;\nup.RenderOptions = (function () {\n    const GLOBAL_DEFAULTS = {\n        hungry: true,\n        keep: true,\n        source: true,\n        saveScroll: true,\n        fail: 'auto'\n    };\n    const PRELOAD_OVERRIDES = {\n        solo: false,\n        confirm: false,\n        feedback: false\n    };\n    const PREFLIGHT_KEYS = [\n        'url',\n        'method',\n        'origin',\n        'headers',\n        'params',\n        'cache',\n        'clearCache',\n        'fallback',\n        'solo',\n        'confirm',\n        'feedback',\n        'origin',\n        'baseLayer',\n        'fail',\n    ];\n    const SHARED_KEYS = PREFLIGHT_KEYS.concat([\n        'keep',\n        'hungry',\n        'history',\n        'source',\n        'saveScroll',\n        'navigate'\n    ]);\n    const CONTENT_KEYS = [\n        'url',\n        'content',\n        'fragment',\n        'document'\n    ];\n    const LATE_KEYS = [\n        'history',\n        'focus',\n        'scroll'\n    ];\n    function navigateDefaults(options) {\n        if (options.navigate) {\n            return up.fragment.config.navigateOptions;\n        }\n    }\n    function preloadOverrides(options) {\n        if (options.preload) {\n            return PRELOAD_OVERRIDES;\n        }\n    }\n    function preprocess(options) {\n        up.migrate.preprocessRenderOptions?.(options);\n        const defaults = u.merge(GLOBAL_DEFAULTS, navigateDefaults(options));\n        return u.merge(u.omit(defaults, LATE_KEYS), { defaults }, options, preloadOverrides(options));\n    }\n    function finalize(preprocessedOptions, lateDefaults) {\n        return u.merge(preprocessedOptions.defaults, lateDefaults, preprocessedOptions);\n    }\n    function assertContentGiven(options) {\n        if (!u.some(CONTENT_KEYS, contentKey => u.isGiven(options[contentKey]))) {\n            if (options.defaultToEmptyContent) {\n                options.content = '';\n            }\n            else {\n                up.fail('up.render() needs either { ' + CONTENT_KEYS.join(', ') + ' } option');\n            }\n        }\n    }\n    function failOverrides(options) {\n        const overrides = {};\n        for (let key in options) {\n            const value = options[key];\n            let unprefixed = up.fragment.successKey(key);\n            if (unprefixed) {\n                overrides[unprefixed] = value;\n            }\n        }\n        return overrides;\n    }\n    function deriveFailOptions(preprocessedOptions) {\n        return u.merge(preprocessedOptions.defaults, u.pick(preprocessedOptions, SHARED_KEYS), failOverrides(preprocessedOptions));\n    }\n    return {\n        preprocess,\n        finalize,\n        assertContentGiven,\n        deriveFailOptions,\n    };\n})();\n\n\n/***/ }),\n/* 57 */\n/***/ (() => {\n\nup.RenderResult = class RenderResult extends up.Record {\n    keys() {\n        return [\n            'fragments',\n            'layer',\n        ];\n    }\n};\n\n\n/***/ }),\n/* 58 */\n/***/ (() => {\n\nconst u = up.util;\nup.Request = class Request extends up.Record {\n    keys() {\n        return [\n            'method',\n            'url',\n            'hash',\n            'params',\n            'target',\n            'failTarget',\n            'headers',\n            'timeout',\n            'preload',\n            'cache',\n            'clearCache',\n            'layer',\n            'mode',\n            'context',\n            'failLayer',\n            'failMode',\n            'failContext',\n            'origin',\n            'solo',\n            'queueTime',\n            'wrapMethod',\n            'contentType',\n            'payload',\n            'onQueued'\n        ];\n    }\n    constructor(options) {\n        super(options);\n        this.params = new up.Params(this.params);\n        this.headers || (this.headers = {});\n        if (this.preload) {\n            this.cache = true;\n        }\n        if (this.wrapMethod == null) {\n            this.wrapMethod = up.network.config.wrapMethod;\n        }\n        this.normalizeForCaching();\n        if (!options.basic) {\n            const layerLookupOptions = { origin: this.origin };\n            this.layer = up.layer.get(this.layer, layerLookupOptions);\n            this.failLayer = up.layer.get(this.failLayer || this.layer, layerLookupOptions);\n            this.context || (this.context = this.layer.context || {});\n            this.failContext || (this.failContext = this.failLayer.context || {});\n            this.mode || (this.mode = this.layer.mode);\n            this.failMode || (this.failMode = this.failLayer.mode);\n            this.deferred = u.newDeferred();\n            this.state = 'new';\n        }\n    }\n    get xhr() {\n        return this._xhr ?? (this._xhr = new XMLHttpRequest());\n    }\n    followState(sourceRequest) {\n        u.delegate(this, ['deferred', 'state', 'preload'], () => sourceRequest);\n    }\n    normalizeForCaching() {\n        this.method = u.normalizeMethod(this.method);\n        this.extractHashFromURL();\n        this.transferParamsToURL();\n        this.url = u.normalizeURL(this.url);\n    }\n    evictExpensiveAttrs() {\n        u.task(() => {\n            this.layer = undefined;\n            this.failLayer = undefined;\n            return this.origin = undefined;\n        });\n    }\n    extractHashFromURL() {\n        let match = this.url?.match(/^([^#]*)(#.+)$/);\n        if (match) {\n            this.url = match[1];\n            return this.hash = match[2];\n        }\n    }\n    transferParamsToURL() {\n        if (!this.url || this.allowsPayload() || u.isBlank(this.params)) {\n            return;\n        }\n        this.url = this.params.toURL(this.url);\n        this.params.clear();\n    }\n    isSafe() {\n        return up.network.isSafeMethod(this.method);\n    }\n    allowsPayload() {\n        return u.methodAllowsPayload(this.method);\n    }\n    will302RedirectWithGET() {\n        return this.isSafe() || (this.method === 'POST');\n    }\n    willCache() {\n        if (this.cache === 'auto') {\n            return up.network.config.autoCache(this);\n        }\n        else {\n            return this.cache;\n        }\n    }\n    runQueuedCallbacks() {\n        u.always(this, () => this.evictExpensiveAttrs());\n        this.onQueued?.(this);\n    }\n    load() {\n        if (this.state !== 'new') {\n            return;\n        }\n        this.state = 'loading';\n        new up.Request.XHRRenderer(this).buildAndSend({\n            onload: () => this.onXHRLoad(),\n            onerror: () => this.onXHRError(),\n            ontimeout: () => this.onXHRTimeout(),\n            onabort: () => this.onXHRAbort()\n        });\n    }\n    loadPage() {\n        up.network.abort();\n        new up.Request.FormRenderer(this).buildAndSubmit();\n    }\n    onXHRLoad() {\n        const response = this.extractResponseFromXHR();\n        const log = ['Server responded HTTP %d to %s %s (%d characters)', response.status, this.method, this.url, response.text.length];\n        this.emit('up:request:loaded', { request: response.request, response, log });\n        this.respondWith(response);\n    }\n    onXHRError() {\n        const log = 'Fatal error during request';\n        this.deferred.reject(up.error.failed(log));\n        this.emit('up:request:fatal', { log });\n    }\n    onXHRTimeout() {\n        this.setAbortedState('Requested timed out');\n    }\n    onXHRAbort() {\n        this.setAbortedState();\n    }\n    abort() {\n        if (this.setAbortedState() && this._xhr) {\n            this._xhr.abort();\n        }\n    }\n    setAbortedState(reason = [\"Request to %s %s was aborted\", this.method, this.url]) {\n        if ((this.state !== 'new') && (this.state !== 'loading')) {\n            return;\n        }\n        this.state = 'aborted';\n        this.emit('up:request:aborted', { log: reason });\n        this.deferred.reject(up.error.aborted(reason));\n        return true;\n    }\n    respondWith(response) {\n        if (this.state !== 'loading') {\n            return;\n        }\n        this.state = 'loaded';\n        if (response.ok) {\n            return this.deferred.resolve(response);\n        }\n        else {\n            return this.deferred.reject(response);\n        }\n    }\n    csrfHeader() {\n        return up.protocol.csrfHeader();\n    }\n    csrfParam() {\n        return up.protocol.csrfParam();\n    }\n    csrfToken() {\n        if (!this.isSafe() && !this.isCrossOrigin()) {\n            return up.protocol.csrfToken();\n        }\n    }\n    isCrossOrigin() {\n        return u.isCrossOrigin(this.url);\n    }\n    extractResponseFromXHR() {\n        const responseAttrs = {\n            method: this.method,\n            url: this.url,\n            request: this,\n            xhr: this.xhr,\n            text: this.xhr.responseText,\n            status: this.xhr.status,\n            title: up.protocol.titleFromXHR(this.xhr),\n            target: up.protocol.targetFromXHR(this.xhr),\n            acceptLayer: up.protocol.acceptLayerFromXHR(this.xhr),\n            dismissLayer: up.protocol.dismissLayerFromXHR(this.xhr),\n            eventPlans: up.protocol.eventPlansFromXHR(this.xhr),\n            context: up.protocol.contextFromXHR(this.xhr),\n            clearCache: up.protocol.clearCacheFromXHR(this.xhr)\n        };\n        let methodFromResponse = up.protocol.methodFromXHR(this.xhr);\n        let urlFromResponse = up.protocol.locationFromXHR(this.xhr);\n        if (urlFromResponse) {\n            if (!methodFromResponse && !u.matchURLs(responseAttrs.url, urlFromResponse)) {\n                methodFromResponse = 'GET';\n            }\n            responseAttrs.url = urlFromResponse;\n        }\n        if (methodFromResponse) {\n            responseAttrs.method = methodFromResponse;\n        }\n        return new up.Response(responseAttrs);\n    }\n    cacheKey() {\n        return JSON.stringify([\n            this.method,\n            this.url,\n            this.params.toQuery(),\n            this.metaProps()\n        ]);\n    }\n    metaProps() {\n        const props = {};\n        for (let key of u.evalOption(up.network.config.requestMetaKeys, this)) {\n            const value = this[key];\n            if (u.isGiven(value)) {\n                props[key] = value;\n            }\n        }\n        return props;\n    }\n    buildEventEmitter(args) {\n        return up.EventEmitter.fromEmitArgs(args, {\n            layer: this.layer,\n            request: this,\n            origin: this.origin\n        });\n    }\n    emit(...args) {\n        return this.buildEventEmitter(args).emit();\n    }\n    assertEmitted(...args) {\n        this.buildEventEmitter(args).assertEmitted();\n    }\n    get description() {\n        return this.method + ' ' + this.url;\n    }\n};\nu.delegate(up.Request.prototype, ['then', 'catch', 'finally'], function () { return this.deferred; });\nup.Request.tester = function (condition) {\n    if (u.isFunction(condition)) {\n        return condition;\n    }\n    else if (condition instanceof this) {\n        return (request) => condition === request;\n    }\n    else if (u.isString(condition)) {\n        let pattern = new up.URLPattern(condition);\n        return (request) => pattern.test(request.url);\n    }\n    else {\n        return (_request) => condition;\n    }\n};\n\n\n/***/ }),\n/* 59 */\n/***/ (() => {\n\nlet u = up.util;\nup.Request.Cache = class Cache extends up.Cache {\n    maxSize() {\n        return up.network.config.cacheSize;\n    }\n    expiryMillis() {\n        return up.network.config.cacheExpiry;\n    }\n    normalizeStoreKey(request) {\n        return u.wrapValue(up.Request, request).cacheKey();\n    }\n    clear(condition = true) {\n        let tester = up.Request.tester(condition);\n        this.each((key, request) => {\n            if (tester(request)) {\n                this.store.remove(key);\n            }\n        });\n    }\n};\n\n\n/***/ }),\n/* 60 */\n/***/ (() => {\n\nconst u = up.util;\nup.Request.Queue = class Queue {\n    constructor(options = {}) {\n        this.concurrency = options.concurrency ?? (() => up.network.config.concurrency);\n        this.badResponseTime = options.badResponseTime ?? (() => up.network.config.badResponseTime);\n        this.reset();\n    }\n    reset() {\n        this.queuedRequests = [];\n        this.currentRequests = [];\n        clearTimeout(this.checkSlowTimout);\n        this.emittedSlow = false;\n    }\n    get allRequests() {\n        return this.currentRequests.concat(this.queuedRequests);\n    }\n    asap(request) {\n        request.runQueuedCallbacks();\n        u.always(request, responseOrError => this.onRequestSettled(request, responseOrError));\n        request.queueTime = new Date();\n        this.setSlowTimer();\n        if (this.hasConcurrencyLeft()) {\n            this.sendRequestNow(request);\n        }\n        else {\n            this.queueRequest(request);\n        }\n    }\n    promoteToForeground(request) {\n        if (request.preload) {\n            request.preload = false;\n            return this.setSlowTimer();\n        }\n    }\n    setSlowTimer() {\n        const badResponseTime = u.evalOption(this.badResponseTime);\n        this.checkSlowTimout = u.timer(badResponseTime, () => this.checkSlow());\n    }\n    hasConcurrencyLeft() {\n        const maxConcurrency = u.evalOption(this.concurrency);\n        return (maxConcurrency === -1) || (this.currentRequests.length < maxConcurrency);\n    }\n    isBusy() {\n        return this.currentRequests.length > 0;\n    }\n    queueRequest(request) {\n        this.queuedRequests.push(request);\n    }\n    pluckNextRequest() {\n        let request = u.find(this.queuedRequests, request => !request.preload);\n        request || (request = this.queuedRequests[0]);\n        return u.remove(this.queuedRequests, request);\n    }\n    sendRequestNow(request) {\n        if (request.emit('up:request:load', { log: ['Loading %s %s', request.method, request.url] }).defaultPrevented) {\n            request.abort('Prevented by event listener');\n        }\n        else {\n            request.normalizeForCaching();\n            this.currentRequests.push(request);\n            request.load();\n        }\n    }\n    onRequestSettled(request, responseOrError) {\n        u.remove(this.currentRequests, request);\n        if ((responseOrError instanceof up.Response) && responseOrError.ok) {\n            up.network.registerAliasForRedirect(request, responseOrError);\n        }\n        this.checkSlow();\n        u.microtask(() => this.poke());\n    }\n    poke() {\n        let request;\n        if (this.hasConcurrencyLeft() && (request = this.pluckNextRequest())) {\n            return this.sendRequestNow(request);\n        }\n    }\n    abort(conditions = true) {\n        let tester = up.Request.tester(conditions);\n        for (let list of [this.currentRequests, this.queuedRequests]) {\n            const abortableRequests = u.filter(list, tester);\n            abortableRequests.forEach(function (abortableRequest) {\n                abortableRequest.abort();\n                u.remove(list, abortableRequest);\n            });\n        }\n    }\n    abortExcept(excusedRequest, additionalConditions = true) {\n        const excusedCacheKey = excusedRequest.cacheKey();\n        this.abort(queuedRequest => (queuedRequest.cacheKey() !== excusedCacheKey) && u.evalOption(additionalConditions, queuedRequest));\n    }\n    checkSlow() {\n        const currentSlow = this.isSlow();\n        if (this.emittedSlow !== currentSlow) {\n            this.emittedSlow = currentSlow;\n            if (currentSlow) {\n                up.emit('up:request:late', { log: 'Server is slow to respond' });\n            }\n            else {\n                up.emit('up:request:recover', { log: 'Slow requests were loaded' });\n            }\n        }\n    }\n    isSlow() {\n        const now = new Date();\n        const delay = u.evalOption(this.badResponseTime);\n        const allForegroundRequests = u.reject(this.allRequests, 'preload');\n        const timerTolerance = 1;\n        return u.some(allForegroundRequests, request => (now - request.queueTime) >= (delay - timerTolerance));\n    }\n};\n\n\n/***/ }),\n/* 61 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nconst HTML_FORM_METHODS = ['GET', 'POST'];\nup.Request.FormRenderer = class FormRenderer {\n    constructor(request) {\n        this.request = request;\n    }\n    buildAndSubmit() {\n        this.params = u.copy(this.request.params);\n        let action = this.request.url;\n        let { method } = this.request;\n        const paramsFromQuery = up.Params.fromURL(action);\n        this.params.addAll(paramsFromQuery);\n        action = up.Params.stripURL(action);\n        if (!u.contains(HTML_FORM_METHODS, method)) {\n            method = up.protocol.wrapMethod(method, this.params);\n        }\n        this.form = e.affix(document.body, 'form.up-request-loader', { method, action });\n        let contentType = this.request.contentType;\n        if (contentType) {\n            this.form.setAttribute('enctype', contentType);\n        }\n        let csrfParam, csrfToken;\n        if ((csrfParam = this.request.csrfParam()) && (csrfToken = this.request.csrfToken())) {\n            this.params.add(csrfParam, csrfToken);\n        }\n        u.each(this.params.toArray(), this.addField.bind(this));\n        up.browser.submitForm(this.form);\n    }\n    addField(attrs) {\n        e.affix(this.form, 'input[type=hidden]', attrs);\n    }\n};\n\n\n/***/ }),\n/* 62 */\n/***/ (() => {\n\nconst CONTENT_TYPE_URL_ENCODED = 'application/x-www-form-urlencoded';\nconst CONTENT_TYPE_FORM_DATA = 'multipart/form-data';\nconst u = up.util;\nup.Request.XHRRenderer = class XHRRenderer {\n    constructor(request) {\n        this.request = request;\n    }\n    buildAndSend(handlers) {\n        const xhr = this.request.xhr;\n        this.params = u.copy(this.request.params);\n        if (this.request.timeout) {\n            xhr.timeout = this.request.timeout;\n        }\n        xhr.open(this.getMethod(), this.request.url);\n        const metaProps = this.request.metaProps();\n        for (let key in metaProps) {\n            this.addHeader(xhr, up.protocol.headerize(key), metaProps[key]);\n        }\n        for (let header in this.request.headers) {\n            this.addHeader(xhr, header, this.request.headers[header]);\n        }\n        let csrfHeader, csrfToken;\n        if ((csrfHeader = this.request.csrfHeader()) && (csrfToken = this.request.csrfToken())) {\n            this.addHeader(xhr, csrfHeader, csrfToken);\n        }\n        this.addHeader(xhr, up.protocol.headerize('version'), up.version);\n        let contentType = this.getContentType();\n        if (contentType) {\n            this.addHeader(xhr, 'Content-Type', contentType);\n        }\n        u.assign(xhr, handlers);\n        xhr.send(this.getPayload());\n    }\n    getMethod() {\n        if (!this.method) {\n            this.method = this.request.method;\n            if (this.request.wrapMethod && !this.request.will302RedirectWithGET()) {\n                this.method = up.protocol.wrapMethod(this.method, this.params);\n            }\n        }\n        return this.method;\n    }\n    getContentType() {\n        this.finalizePayload();\n        return this.contentType;\n    }\n    getPayload() {\n        this.finalizePayload();\n        return this.payload;\n    }\n    addHeader(xhr, header, value) {\n        if (u.isOptions(value) || u.isArray(value)) {\n            value = JSON.stringify(value);\n        }\n        xhr.setRequestHeader(header, value);\n    }\n    finalizePayload() {\n        if (this.payloadFinalized) {\n            return;\n        }\n        this.payloadFinalized = true;\n        this.payload = this.request.payload;\n        this.contentType = this.request.contentType;\n        if (!this.payload && this.request.allowsPayload()) {\n            if (!this.contentType) {\n                this.contentType = this.params.hasBinaryValues() ? CONTENT_TYPE_FORM_DATA : CONTENT_TYPE_URL_ENCODED;\n            }\n            if (this.contentType === CONTENT_TYPE_FORM_DATA) {\n                this.contentType = null;\n                this.payload = this.params.toFormData();\n            }\n            else {\n                this.payload = this.params.toQuery().replace(/%20/g, '+');\n            }\n        }\n    }\n};\n\n\n/***/ }),\n/* 63 */\n/***/ (() => {\n\nup.Response = class Response extends up.Record {\n    keys() {\n        return [\n            'method',\n            'url',\n            'text',\n            'status',\n            'request',\n            'xhr',\n            'target',\n            'title',\n            'acceptLayer',\n            'dismissLayer',\n            'eventPlans',\n            'context',\n            'clearCache',\n            'headers'\n        ];\n    }\n    defaults() {\n        return { headers: {} };\n    }\n    get ok() {\n        return this.status && ((this.status >= 200) && (this.status <= 299));\n    }\n    getHeader(name) {\n        return this.headers[name] || this.xhr?.getResponseHeader(name);\n    }\n    get contentType() {\n        return this.getHeader('Content-Type');\n    }\n    get cspNonces() {\n        return up.protocol.cspNoncesFromHeader(this.getHeader('Content-Security-Policy'));\n    }\n    get json() {\n        return this.parsedJSON || (this.parsedJSON = JSON.parse(this.text));\n    }\n};\n\n\n/***/ }),\n/* 64 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.ResponseDoc = class ResponseDoc {\n    constructor(options) {\n        this.noscriptWrapper = new up.HTMLWrapper('noscript');\n        this.scriptWrapper = new up.HTMLWrapper('script');\n        this.root =\n            this.parseDocument(options) ||\n                this.parseFragment(options) ||\n                this.parseContent(options);\n        this.cspNonces = options.cspNonces;\n    }\n    parseDocument(options) {\n        return this.parse(options.document, e.createDocumentFromHTML);\n    }\n    parseContent(options) {\n        let content = options.content || '';\n        const target = options.target || up.fail(\"must pass a { target } when passing { content }\");\n        const matchingElement = e.createFromSelector(target);\n        if (u.isString(content)) {\n            content = this.wrapHTML(content);\n            matchingElement.innerHTML = content;\n        }\n        else {\n            matchingElement.appendChild(content);\n        }\n        return matchingElement;\n    }\n    parseFragment(options) {\n        return this.parse(options.fragment);\n    }\n    parse(value, parseFn = e.createFromHTML) {\n        if (u.isString(value)) {\n            value = this.wrapHTML(value);\n            value = parseFn(value);\n        }\n        return value;\n    }\n    rootSelector() {\n        return up.fragment.toTarget(this.root);\n    }\n    wrapHTML(html) {\n        html = this.noscriptWrapper.wrap(html);\n        if (up.fragment.config.runScripts) {\n            html = this.scriptWrapper.wrap(html);\n        }\n        else {\n            html = this.scriptWrapper.strip(html);\n        }\n        return html;\n    }\n    getTitle() {\n        if (!this.titleParsed) {\n            this.title = this.root.querySelector(\"head title\")?.textContent;\n            this.titleParsed = true;\n        }\n        return this.title;\n    }\n    select(selector) {\n        return up.fragment.subtree(this.root, selector, { layer: 'any' })[0];\n    }\n    finalizeElement(element) {\n        this.noscriptWrapper.unwrap(element);\n        up.NonceableCallback.adoptNonces(element, this.cspNonces);\n        this.scriptWrapper.unwrap(element);\n    }\n};\n\n\n/***/ }),\n/* 65 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.RevealMotion = class RevealMotion {\n    constructor(element, options = {}) {\n        this.element = element;\n        this.options = options;\n        const viewportConfig = up.viewport.config;\n        this.viewport = e.get(this.options.viewport) || up.viewport.get(this.element);\n        this.obstructionsLayer = up.layer.get(this.viewport);\n        this.snap = this.options.snap ?? this.options.revealSnap ?? viewportConfig.revealSnap;\n        this.padding = this.options.padding ?? this.options.revealPadding ?? viewportConfig.revealPadding;\n        this.top = this.options.top ?? this.options.revealTop ?? viewportConfig.revealTop;\n        this.max = this.options.max ?? this.options.revealMax ?? viewportConfig.revealMax;\n        this.topObstructions = viewportConfig.fixedTop;\n        this.bottomObstructions = viewportConfig.fixedBottom;\n    }\n    start() {\n        const viewportRect = this.getViewportRect(this.viewport);\n        const elementRect = up.Rect.fromElement(this.element);\n        if (this.max) {\n            const maxPixels = u.evalOption(this.max, this.element);\n            elementRect.height = Math.min(elementRect.height, maxPixels);\n        }\n        this.addPadding(elementRect);\n        this.substractObstructions(viewportRect);\n        if (viewportRect.height < 0) {\n            return up.error.failed.async('Viewport has no visible area');\n        }\n        const originalScrollTop = this.viewport.scrollTop;\n        let newScrollTop = originalScrollTop;\n        if (this.top || (elementRect.height > viewportRect.height)) {\n            const diff = elementRect.top - viewportRect.top;\n            newScrollTop += diff;\n        }\n        else if (elementRect.top < viewportRect.top) {\n            newScrollTop -= (viewportRect.top - elementRect.top);\n        }\n        else if (elementRect.bottom > viewportRect.bottom) {\n            newScrollTop += (elementRect.bottom - viewportRect.bottom);\n        }\n        else {\n        }\n        if (u.isNumber(this.snap) && (newScrollTop < this.snap) && (elementRect.top < (0.5 * viewportRect.height))) {\n            newScrollTop = 0;\n        }\n        if (newScrollTop !== originalScrollTop) {\n            return this.scrollTo(newScrollTop);\n        }\n        else {\n            return Promise.resolve();\n        }\n    }\n    scrollTo(newScrollTop) {\n        this.scrollMotion = new up.ScrollMotion(this.viewport, newScrollTop, this.options);\n        return this.scrollMotion.start();\n    }\n    getViewportRect() {\n        if (up.viewport.isRoot(this.viewport)) {\n            return new up.Rect({\n                left: 0,\n                top: 0,\n                width: up.viewport.rootWidth(),\n                height: up.viewport.rootHeight()\n            });\n        }\n        else {\n            return up.Rect.fromElement(this.viewport);\n        }\n    }\n    addPadding(elementRect) {\n        elementRect.top -= this.padding;\n        elementRect.height += 2 * this.padding;\n    }\n    selectObstructions(selectors) {\n        let elements = up.fragment.all(selectors.join(','), { layer: this.obstructionsLayer });\n        return u.filter(elements, e.isVisible);\n    }\n    substractObstructions(viewportRect) {\n        for (let obstruction of this.selectObstructions(this.topObstructions)) {\n            let obstructionRect = up.Rect.fromElement(obstruction);\n            let diff = obstructionRect.bottom - viewportRect.top;\n            if (diff > 0) {\n                viewportRect.top += diff;\n                viewportRect.height -= diff;\n            }\n        }\n        for (let obstruction of this.selectObstructions(this.bottomObstructions)) {\n            let obstructionRect = up.Rect.fromElement(obstruction);\n            let diff = viewportRect.bottom - obstructionRect.top;\n            if (diff > 0) {\n                viewportRect.height -= diff;\n            }\n        }\n    }\n    finish() {\n        this.scrollMotion?.finish();\n    }\n};\n\n\n/***/ }),\n/* 66 */\n/***/ (() => {\n\nconst u = up.util;\nconst SPEED_CALIBRATION = 0.065;\nup.ScrollMotion = class ScrollMotion {\n    constructor(scrollable, targetTop, options = {}) {\n        this.scrollable = scrollable;\n        this.targetTop = targetTop;\n        this.behavior = options.behavior ?? options.scrollBehavior ?? 'auto';\n        this.speed = (options.speed ?? options.scrollSpeed ?? up.viewport.config.scrollSpeed) * SPEED_CALIBRATION;\n    }\n    start() {\n        return new Promise((resolve, reject) => {\n            this.resolve = resolve;\n            this.reject = reject;\n            if ((this.behavior === 'smooth') && up.motion.isEnabled()) {\n                this.startAnimation();\n            }\n            else {\n                this.finish();\n            }\n        });\n    }\n    startAnimation() {\n        this.startTime = Date.now();\n        this.startTop = this.scrollable.scrollTop;\n        this.topDiff = this.targetTop - this.startTop;\n        this.duration = Math.sqrt(Math.abs(this.topDiff)) / this.speed;\n        requestAnimationFrame(() => this.animationFrame());\n    }\n    animationFrame() {\n        if (this.settled) {\n            return;\n        }\n        const currentTime = Date.now();\n        const timeElapsed = currentTime - this.startTime;\n        const timeFraction = Math.min(timeElapsed / this.duration, 1);\n        this.frameTop = this.startTop + (u.simpleEase(timeFraction) * this.topDiff);\n        if (Math.abs(this.targetTop - this.frameTop) < 0.3) {\n            this.finish();\n        }\n        else {\n            this.scrollable.scrollTop = this.frameTop;\n            requestAnimationFrame(() => this.animationFrame());\n        }\n    }\n    abort(reason) {\n        this.settled = true;\n        this.reject(up.error.aborted(reason));\n    }\n    finish() {\n        this.settled = true;\n        this.scrollable.scrollTop = this.targetTop;\n        this.resolve();\n    }\n};\n\n\n/***/ }),\n/* 67 */\n/***/ (() => {\n\nconst e = up.element;\nconst u = up.util;\nup.Selector = class Selector {\n    constructor(selectors, filters = []) {\n        this.selectors = selectors;\n        this.filters = filters;\n        this.unionSelector = this.selectors.join(',') || 'match-none';\n    }\n    matches(element) {\n        return e.matches(element, this.unionSelector) && this.passesFilter(element);\n    }\n    closest(element) {\n        let parentElement;\n        if (this.matches(element)) {\n            return element;\n        }\n        else if (parentElement = element.parentElement) {\n            return this.closest(parentElement);\n        }\n    }\n    passesFilter(element) {\n        return u.every(this.filters, filter => filter(element));\n    }\n    descendants(root) {\n        const results = u.flatMap(this.selectors, selector => e.all(root, selector));\n        return u.filter(results, element => this.passesFilter(element));\n    }\n    subtree(root) {\n        const results = [];\n        if (this.matches(root)) {\n            results.push(root);\n        }\n        results.push(...this.descendants(root));\n        return results;\n    }\n};\n\n\n/***/ }),\n/* 68 */\n/***/ (() => {\n\nconst u = up.util;\nup.store || (up.store = {});\nup.store.Memory = class Memory {\n    constructor() {\n        this.data = {};\n    }\n    clear() {\n        this.data = {};\n    }\n    get(key) {\n        return this.data[key];\n    }\n    set(key, value) {\n        this.data[key] = value;\n    }\n    remove(key) {\n        delete this.data[key];\n    }\n    keys() {\n        return Object.keys(this.data);\n    }\n    size() {\n        return this.keys().length;\n    }\n    values() {\n        return u.values(this.data);\n    }\n};\n\n\n/***/ }),\n/* 69 */\n/***/ (() => {\n\nup.store.Session = class Session extends up.store.Memory {\n    constructor(rootKey) {\n        super();\n        this.rootKey = rootKey;\n        this.loadFromSessionStorage();\n    }\n    clear() {\n        super.clear();\n        this.saveToSessionStorage();\n    }\n    set(key, value) {\n        super.set(key, value);\n        this.saveToSessionStorage();\n    }\n    remove(key) {\n        super.remove(key);\n        this.saveToSessionStorage();\n    }\n    loadFromSessionStorage() {\n        try {\n            let raw = sessionStorage?.getItem(this.rootKey);\n            if (raw) {\n                this.data = JSON.parse(raw);\n            }\n        }\n        catch (error) {\n        }\n    }\n    saveToSessionStorage() {\n        const json = JSON.stringify(this.data);\n        try {\n            return sessionStorage?.setItem(this.rootKey, json);\n        }\n        catch (error) {\n        }\n    }\n};\n\n\n/***/ }),\n/* 70 */\n/***/ (() => {\n\nconst u = up.util;\nconst e = up.element;\nup.Tether = class Tether {\n    constructor(options) {\n        up.migrate.handleTetherOptions?.(options);\n        this.anchor = options.anchor;\n        this.align = options.align;\n        this.position = options.position;\n        this.alignAxis = (this.position === 'top') || (this.position === 'bottom') ? 'horizontal' : 'vertical';\n        this.viewport = up.viewport.get(this.anchor);\n        this.parent = this.viewport === e.root ? document.body : this.viewport;\n        this.syncOnScroll = !this.viewport.contains(this.anchor.offsetParent);\n    }\n    start(element) {\n        this.element = element;\n        this.element.style.position = 'absolute';\n        this.setOffset(0, 0);\n        this.sync();\n        this.changeEventSubscription('on');\n    }\n    stop() {\n        this.changeEventSubscription('off');\n    }\n    changeEventSubscription(fn) {\n        let doScheduleSync = this.scheduleSync.bind(this);\n        up[fn](window, 'resize', doScheduleSync);\n        if (this.syncOnScroll) {\n            up[fn](this.viewport, 'scroll', doScheduleSync);\n        }\n    }\n    scheduleSync() {\n        clearTimeout(this.syncTimer);\n        return this.syncTimer = u.task(this.sync.bind(this));\n    }\n    isDetached() {\n        return e.isDetached(this.parent) || e.isDetached(this.anchor);\n    }\n    sync() {\n        const elementBox = this.element.getBoundingClientRect();\n        const elementMargin = {\n            top: e.styleNumber(this.element, 'marginTop'),\n            right: e.styleNumber(this.element, 'marginRight'),\n            bottom: e.styleNumber(this.element, 'marginBottom'),\n            left: e.styleNumber(this.element, 'marginLeft')\n        };\n        const anchorBox = this.anchor.getBoundingClientRect();\n        let left;\n        let top;\n        switch (this.alignAxis) {\n            case 'horizontal': {\n                switch (this.position) {\n                    case 'top':\n                        top = anchorBox.top - elementMargin.bottom - elementBox.height;\n                        break;\n                    case 'bottom':\n                        top = anchorBox.top + anchorBox.height + elementMargin.top;\n                        break;\n                }\n                switch (this.align) {\n                    case 'left':\n                        left = anchorBox.left + elementMargin.left;\n                        break;\n                    case 'center':\n                        left = anchorBox.left + (0.5 * (anchorBox.width - elementBox.width));\n                        break;\n                    case 'right':\n                        left = (anchorBox.left + anchorBox.width) - elementBox.width - elementMargin.right;\n                        break;\n                }\n                break;\n            }\n            case 'vertical': {\n                switch (this.align) {\n                    case 'top':\n                        top = anchorBox.top + elementMargin.top;\n                        break;\n                    case 'center':\n                        top = anchorBox.top + (0.5 * (anchorBox.height - elementBox.height));\n                        break;\n                    case 'bottom':\n                        top = (anchorBox.top + anchorBox.height) - elementBox.height - elementMargin.bottom;\n                        break;\n                }\n                switch (this.position) {\n                    case 'left':\n                        left = anchorBox.left - elementMargin.right - elementBox.width;\n                        break;\n                    case 'right':\n                        left = anchorBox.left + anchorBox.width + elementMargin.left;\n                        break;\n                }\n                break;\n            }\n        }\n        if (u.isDefined(left) || u.isDefined(top)) {\n            this.moveTo(left, top);\n        }\n        else {\n            up.fail('Invalid tether constraints: %o', this.describeConstraints());\n        }\n    }\n    describeConstraints() {\n        return { position: this.position, align: this.align };\n    }\n    moveTo(targetLeft, targetTop) {\n        const elementBox = this.element.getBoundingClientRect();\n        this.setOffset((targetLeft - elementBox.left) + this.offsetLeft, (targetTop - elementBox.top) + this.offsetTop);\n    }\n    setOffset(left, top) {\n        this.offsetLeft = left;\n        this.offsetTop = top;\n        e.setStyle(this.element, { left, top });\n    }\n};\n\n\n/***/ }),\n/* 71 */\n/***/ (() => {\n\nconst u = up.util;\nup.URLPattern = class URLPattern {\n    constructor(fullPattern, normalizeURL = u.normalizeURL) {\n        this.normalizeURL = normalizeURL;\n        this.groups = [];\n        const positiveList = [];\n        const negativeList = [];\n        for (let pattern of u.splitValues(fullPattern)) {\n            if (pattern[0] === '-') {\n                negativeList.push(pattern.substring(1));\n            }\n            else {\n                positiveList.push(pattern);\n            }\n        }\n        this.positiveRegexp = this.buildRegexp(positiveList, true);\n        this.negativeRegexp = this.buildRegexp(negativeList, false);\n    }\n    buildRegexp(list, capture) {\n        if (!list.length) {\n            return;\n        }\n        list = list.map((url) => {\n            if (url[0] === '*') {\n                url = '/' + url;\n            }\n            url = this.normalizeURL(url);\n            url = u.escapeRegExp(url);\n            return url;\n        });\n        let reCode = list.join('|');\n        reCode = reCode.replace(/\\\\\\*/g, '.*?');\n        reCode = reCode.replace(/(:|\\\\\\$)([a-z][\\w-]*)/ig, (match, type, name) => {\n            if (type === '\\\\$') {\n                if (capture) {\n                    this.groups.push({ name, cast: Number });\n                }\n                return '(\\\\d+)';\n            }\n            else {\n                if (capture) {\n                    this.groups.push({ name, cast: String });\n                }\n                return '([^/?#]+)';\n            }\n        });\n        return new RegExp('^(?:' + reCode + ')$');\n    }\n    test(url, doNormalize = true) {\n        if (doNormalize) {\n            url = this.normalizeURL(url);\n        }\n        return this.positiveRegexp.test(url) && !this.isExcluded(url);\n    }\n    recognize(url, doNormalize = true) {\n        if (doNormalize) {\n            url = this.normalizeURL(url);\n        }\n        let match = this.positiveRegexp.exec(url);\n        if (match && !this.isExcluded(url)) {\n            const resolution = {};\n            this.groups.forEach((group, groupIndex) => {\n                let value = match[groupIndex + 1];\n                if (value) {\n                    return resolution[group.name] = group.cast(value);\n                }\n            });\n            return resolution;\n        }\n    }\n    isExcluded(url) {\n        return this.negativeRegexp?.test(url);\n    }\n};\n\n\n/***/ }),\n/* 72 */\n/***/ (() => {\n\nup.framework = (function () {\n    let readyState = 'evaling';\n    function emitReset() {\n        up.emit('up:framework:reset', { log: false });\n    }\n    function boot() {\n        if (readyState !== 'configuring') {\n            console.error('Unpoly has already booted');\n            return;\n        }\n        let supportIssue = up.framework.supportIssue();\n        if (!supportIssue) {\n            readyState = 'booting';\n            up.emit('up:framework:boot', { log: false });\n            readyState = 'booted';\n        }\n        else {\n            console.error(\"Unpoly cannot boot: %s\", supportIssue);\n        }\n    }\n    function mustBootManually() {\n        let unpolyScript = document.currentScript;\n        if (unpolyScript?.async) {\n            return true;\n        }\n        if (unpolyScript?.getAttribute('up-boot') === 'manual') {\n            return true;\n        }\n        if (document.readyState === 'complete') {\n            return true;\n        }\n    }\n    function onEvaled() {\n        up.emit('up:framework:evaled', { log: false });\n        if (mustBootManually()) {\n            console.debug('Call up.boot() after you have configured Unpoly');\n        }\n        else {\n            document.addEventListener('DOMContentLoaded', boot);\n        }\n        readyState = 'configuring';\n    }\n    function startExtension() {\n        if (readyState !== 'configuring') {\n            throw new Error('Unpoly extensions must be loaded before booting');\n        }\n        readyState = 'evaling';\n    }\n    function stopExtension() {\n        readyState = 'configuring';\n    }\n    function isSupported() {\n        return !supportIssue();\n    }\n    function supportIssue() {\n        if (!up.browser.canPromise()) {\n            return \"Browser doesn't support promises\";\n        }\n        if (document.compatMode === 'BackCompat') {\n            return 'Browser is in quirks mode (missing DOCTYPE?)';\n        }\n        if (up.browser.isEdge18()) {\n            return 'Edge 18 or lower is unsupported';\n        }\n    }\n    return {\n        onEvaled,\n        boot,\n        startExtension,\n        stopExtension,\n        reset: emitReset,\n        get evaling() { return readyState === 'evaling'; },\n        get booted() { return readyState === 'booted'; },\n        get beforeBoot() { return readyState !== 'booting' && readyState !== 'booted'; },\n        isSupported,\n        supportIssue,\n    };\n})();\nup.boot = up.framework.boot;\n\n\n/***/ }),\n/* 73 */\n/***/ (() => {\n\nup.event = (function () {\n    const u = up.util;\n    const e = up.element;\n    function reset() {\n        for (let globalElement of [window, document, e.root, document.body]) {\n            for (let listener of up.EventListener.allNonDefault(globalElement)) {\n                listener.unbind();\n            }\n        }\n    }\n    function on(...args) {\n        return buildListenerGroup(args).bind();\n    }\n    function $on(...args) {\n        return buildListenerGroup(args, { jQuery: true }).bind();\n    }\n    function off(...args) {\n        return buildListenerGroup(args).unbind();\n    }\n    function buildListenerGroup(args, options) {\n        return up.EventListenerGroup.fromBindArgs(args, options);\n    }\n    function buildEmitter(args) {\n        return up.EventEmitter.fromEmitArgs(args);\n    }\n    function emit(...args) {\n        return buildEmitter(args).emit();\n    }\n    function build(...args) {\n        const props = u.extractOptions(args);\n        const type = args[0] || props.type || up.fail('Expected event type to be passed as string argument or { type } property');\n        const event = document.createEvent('Event');\n        event.initEvent(type, true, true);\n        u.assign(event, u.omit(props, ['type', 'target']));\n        if (up.browser.isIE11()) {\n            const originalPreventDefault = event.preventDefault;\n            event.preventDefault = function () {\n                originalPreventDefault.call(event);\n                return u.getter(event, 'defaultPrevented', () => true);\n            };\n        }\n        return event;\n    }\n    function assertEmitted(...args) {\n        return buildEmitter(args).assertEmitted();\n    }\n    function onEscape(listener) {\n        return on('keydown', function (event) {\n            if (wasEscapePressed(event)) {\n                return listener(event);\n            }\n        });\n    }\n    function wasEscapePressed(event) {\n        const { key } = event;\n        return (key === 'Escape') || (key === 'Esc');\n    }\n    function halt(event) {\n        event.stopImmediatePropagation();\n        event.preventDefault();\n    }\n    const keyModifiers = ['metaKey', 'shiftKey', 'ctrlKey', 'altKey'];\n    function isUnmodified(event) {\n        return (u.isUndefined(event.button) || (event.button === 0)) &&\n            !u.some(keyModifiers, modifier => event[modifier]);\n    }\n    function fork(originalEvent, newType, copyKeys = []) {\n        const newEvent = up.event.build(newType, u.pick(originalEvent, copyKeys));\n        newEvent.originalEvent = originalEvent;\n        ['stopPropagation', 'stopImmediatePropagation', 'preventDefault'].forEach(function (key) {\n            const originalMethod = newEvent[key];\n            return newEvent[key] = function () {\n                originalEvent[key]();\n                return originalMethod.call(newEvent);\n            };\n        });\n        if (originalEvent.defaultPrevented) {\n            newEvent.preventDefault();\n        }\n        return newEvent;\n    }\n    function executeEmitAttr(event, element) {\n        if (!isUnmodified(event)) {\n            return;\n        }\n        const eventType = e.attr(element, 'up-emit');\n        const eventProps = e.jsonAttr(element, 'up-emit-props');\n        const forkedEvent = fork(event, eventType);\n        u.assign(forkedEvent, eventProps);\n        up.emit(element, forkedEvent);\n    }\n    on('up:click', 'a[up-emit]', executeEmitAttr);\n    on('up:framework:reset', reset);\n    return {\n        on,\n        $on,\n        off,\n        build,\n        emit,\n        assertEmitted,\n        onEscape,\n        halt,\n        isUnmodified,\n        fork,\n        keyModifiers\n    };\n})();\nup.on = up.event.on;\nup.$on = up.event.$on;\nup.off = up.event.off;\nup.$off = up.event.off;\nup.emit = up.event.emit;\n\n\n/***/ }),\n/* 74 */\n/***/ (() => {\n\nup.protocol = (function () {\n    const u = up.util;\n    const e = up.element;\n    const headerize = function (camel) {\n        const header = camel.replace(/(^.|[A-Z])/g, char => '-' + char.toUpperCase());\n        return 'X-Up' + header;\n    };\n    const extractHeader = function (xhr, shortHeader, parseFn = u.identity) {\n        let value = xhr.getResponseHeader(headerize(shortHeader));\n        if (value) {\n            return parseFn(value);\n        }\n    };\n    function parseClearCacheValue(value) {\n        switch (value) {\n            case 'true':\n                return true;\n            case 'false':\n                return false;\n            default:\n                return value;\n        }\n    }\n    function clearCacheFromXHR(xhr) {\n        return extractHeader(xhr, 'clearCache', parseClearCacheValue);\n    }\n    function contextFromXHR(xhr) {\n        return extractHeader(xhr, 'context', JSON.parse);\n    }\n    function methodFromXHR(xhr) {\n        return extractHeader(xhr, 'method', u.normalizeMethod);\n    }\n    function eventPlansFromXHR(xhr) {\n        return extractHeader(xhr, 'events', JSON.parse);\n    }\n    function acceptLayerFromXHR(xhr) {\n        return extractHeader(xhr, 'acceptLayer', JSON.parse);\n    }\n    function dismissLayerFromXHR(xhr) {\n        return extractHeader(xhr, 'dismissLayer', JSON.parse);\n    }\n    const initialRequestMethod = u.memoize(function () {\n        return u.normalizeMethod(up.browser.popCookie('_up_method'));\n    });\n    function locationFromXHR(xhr) {\n        return extractHeader(xhr, 'location') || xhr.responseURL;\n    }\n    function titleFromXHR(xhr) {\n        return extractHeader(xhr, 'title');\n    }\n    function targetFromXHR(xhr) {\n        return extractHeader(xhr, 'target');\n    }\n    const config = new up.Config(() => ({\n        methodParam: '_method',\n        csrfParam() { return e.metaContent('csrf-param'); },\n        csrfToken() { return e.metaContent('csrf-token'); },\n        cspNonce() { return e.metaContent('csp-nonce'); },\n        csrfHeader: 'X-CSRF-Token',\n        nonceableAttributes: ['up-observe', 'up-on-accepted', 'up-on-dismissed', 'up-on-loaded', 'up-on-finished', 'up-observe'],\n    }));\n    function csrfHeader() {\n        return u.evalOption(config.csrfHeader);\n    }\n    function csrfParam() {\n        return u.evalOption(config.csrfParam);\n    }\n    function csrfToken() {\n        return u.evalOption(config.csrfToken);\n    }\n    function cspNonce() {\n        return u.evalOption(config.cspNonce);\n    }\n    function cspNoncesFromHeader(cspHeader) {\n        let nonces = [];\n        if (cspHeader) {\n            let parts = cspHeader.split(/\\s*;\\s*/);\n            for (let part of parts) {\n                if (part.indexOf('script-src') === 0) {\n                    let noncePattern = /'nonce-([^']+)'/g;\n                    let match;\n                    while (match = noncePattern.exec(part)) {\n                        nonces.push(match[1]);\n                    }\n                }\n            }\n        }\n        return nonces;\n    }\n    function wrapMethod(method, params) {\n        params.add(config.methodParam, method);\n        return 'POST';\n    }\n    function reset() {\n        config.reset();\n    }\n    up.on('up:framework:reset', reset);\n    return {\n        config,\n        reset,\n        locationFromXHR,\n        titleFromXHR,\n        targetFromXHR,\n        methodFromXHR,\n        acceptLayerFromXHR,\n        contextFromXHR,\n        dismissLayerFromXHR,\n        eventPlansFromXHR,\n        clearCacheFromXHR,\n        csrfHeader,\n        csrfParam,\n        csrfToken,\n        cspNonce,\n        initialRequestMethod,\n        headerize,\n        wrapMethod,\n        cspNoncesFromHeader,\n    };\n})();\n\n\n/***/ }),\n/* 75 */\n/***/ (() => {\n\nup.log = (function () {\n    const sessionStore = new up.store.Session('up.log');\n    const config = new up.Config(() => ({\n        enabled: sessionStore.get('enabled'),\n        banner: true,\n        format: up.browser.canFormatLog()\n    }));\n    function reset() {\n        config.reset();\n    }\n    function printToStandard(...args) {\n        if (config.enabled) {\n            printToStream('log', ...args);\n        }\n    }\n    const printToWarn = (...args) => printToStream('warn', ...args);\n    const printToError = (...args) => printToStream('error', ...args);\n    function printToStream(stream, trace, message, ...args) {\n        if (message) {\n            if (config.format) {\n                args.unshift('');\n                args.unshift('color: #666666; padding: 1px 3px; border: 1px solid #bbbbbb; border-radius: 2px; font-size: 90%; display: inline-block');\n                message = `%c${trace}%c ${message}`;\n            }\n            else {\n                message = `[${trace}] ${message}`;\n            }\n            console[stream](message, ...args);\n        }\n    }\n    function printBanner() {\n        if (!config.banner) {\n            return;\n        }\n        const logo = \" __ _____  ___  ___  / /_ __\\n\" +\n            `/ // / _ \\\\/ _ \\\\/ _ \\\\/ / // /  ${up.version}\\n` +\n            \"\\\\___/_//_/ .__/\\\\___/_/\\\\_. / \\n\" +\n            \"        / /            / /\\n\\n\";\n        let text = \"\";\n        if (!up.migrate.loaded) {\n            text += \"Load unpoly-migrate.js to enable deprecated APIs.\\n\\n\";\n        }\n        if (config.enabled) {\n            text += \"Call `up.log.disable()` to disable logging for this session.\";\n        }\n        else {\n            text += \"Call `up.log.enable()` to enable logging for this session.\";\n        }\n        const color = 'color: #777777';\n        if (config.format) {\n            console.log('%c' + logo + '%c' + text, 'font-family: monospace;' + color, color);\n        }\n        else {\n            console.log(logo + text);\n        }\n    }\n    up.on('up:framework:boot', printBanner);\n    up.on('up:framework:reset', reset);\n    function setEnabled(value) {\n        sessionStore.set('enabled', value);\n        config.enabled = value;\n    }\n    function enable() {\n        setEnabled(true);\n    }\n    function disable() {\n        setEnabled(false);\n    }\n    function muteUncriticalRejection(promise) {\n        return promise.catch(function (error) {\n            if ((typeof error !== 'object') || ((error.name !== 'AbortError') && !(error instanceof up.RenderResult) && !(error instanceof up.Response))) {\n                throw error;\n            }\n        });\n    }\n    return {\n        puts: printToStandard,\n        error: printToError,\n        warn: printToWarn,\n        config,\n        enable,\n        disable,\n        muteUncriticalRejection,\n        isEnabled() { return config.enabled; },\n    };\n})();\nup.puts = up.log.puts;\nup.warn = up.log.warn;\n\n\n/***/ }),\n/* 76 */\n/***/ (() => {\n\nup.syntax = (function () {\n    const u = up.util;\n    const e = up.element;\n    const SYSTEM_MACRO_PRIORITIES = {\n        '[up-back]': -100,\n        '[up-content]': -200,\n        '[up-drawer]': -200,\n        '[up-modal]': -200,\n        '[up-cover]': -200,\n        '[up-popup]': -200,\n        '[up-tooltip]': -200,\n        '[up-dash]': -200,\n        '[up-expand]': -300,\n        '[data-method]': -400,\n        '[data-confirm]': -400,\n    };\n    let compilers = [];\n    let macros = [];\n    function registerCompiler(...args) {\n        const compiler = buildCompiler(args);\n        return insertCompiler(compilers, compiler);\n    }\n    function registerJQueryCompiler(...args) {\n        const compiler = registerCompiler(...args);\n        compiler.jQuery = true;\n    }\n    function registerMacro(...args) {\n        const macro = buildCompiler(args);\n        if (up.framework.evaling) {\n            macro.priority = detectSystemMacroPriority(macro.selector) ||\n                up.fail('Unregistered priority for system macro %o', macro.selector);\n        }\n        return insertCompiler(macros, macro);\n    }\n    function registerJQueryMacro(...args) {\n        const macro = registerMacro(...args);\n        macro.jQuery = true;\n        return macro;\n    }\n    function detectSystemMacroPriority(macroSelector) {\n        macroSelector = u.evalOption(macroSelector);\n        for (let substr in SYSTEM_MACRO_PRIORITIES) {\n            const priority = SYSTEM_MACRO_PRIORITIES[substr];\n            if (macroSelector.indexOf(substr) >= 0) {\n                return priority;\n            }\n        }\n    }\n    const parseCompilerArgs = function (args) {\n        const selector = args.shift();\n        const callback = args.pop();\n        const options = u.extractOptions(args);\n        return [selector, options, callback];\n    };\n    function buildCompiler(args) {\n        let [selector, options, callback] = parseCompilerArgs(args);\n        options = u.options(options, {\n            selector,\n            isDefault: up.framework.evaling,\n            priority: 0,\n            batch: false,\n            jQuery: false\n        });\n        return u.assign(callback, options);\n    }\n    function insertCompiler(queue, newCompiler) {\n        if (up.framework.booted) {\n            up.puts('up.compiler()', 'Compiler %s was registered after booting Unpoly. Compiler will run for future fragments.', newCompiler.selector);\n        }\n        let existingCompiler;\n        let index = 0;\n        while ((existingCompiler = queue[index]) && (existingCompiler.priority >= newCompiler.priority)) {\n            index += 1;\n        }\n        queue.splice(index, 0, newCompiler);\n        return newCompiler;\n    }\n    function compile(fragment, options) {\n        const orderedCompilers = macros.concat(compilers);\n        const pass = new up.CompilerPass(fragment, orderedCompilers, options);\n        pass.run();\n    }\n    function registerDestructor(element, destructor) {\n        let destructors = element.upDestructors;\n        if (!destructors) {\n            destructors = [];\n            element.upDestructors = destructors;\n            element.classList.add('up-can-clean');\n        }\n        if (u.isArray(destructor)) {\n            destructors.push(...destructor);\n        }\n        else {\n            destructors.push(destructor);\n        }\n    }\n    function clean(fragment, options = {}) {\n        new up.DestructorPass(fragment, options).run();\n    }\n    function readData(element) {\n        element = up.fragment.get(element);\n        return e.jsonAttr(element, 'up-data') || {};\n    }\n    function reset() {\n        compilers = u.filter(compilers, 'isDefault');\n        macros = u.filter(macros, 'isDefault');\n    }\n    up.on('up:framework:reset', reset);\n    return {\n        compiler: registerCompiler,\n        macro: registerMacro,\n        $compiler: registerJQueryCompiler,\n        $macro: registerJQueryMacro,\n        destructor: registerDestructor,\n        compile,\n        clean,\n        data: readData\n    };\n})();\nup.compiler = up.syntax.compiler;\nup.$compiler = up.syntax.$compiler;\nup.destructor = up.syntax.destructor;\nup.macro = up.syntax.macro;\nup.$macro = up.syntax.$macro;\nup.data = up.syntax.data;\n\n\n/***/ }),\n/* 77 */\n/***/ (() => {\n\nup.history = (function () {\n    const u = up.util;\n    const e = up.element;\n    const config = new up.Config(() => ({\n        enabled: true,\n        restoreTargets: ['body']\n    }));\n    let previousLocation;\n    let nextPreviousLocation;\n    function reset() {\n        config.reset();\n        previousLocation = undefined;\n        nextPreviousLocation = undefined;\n        trackCurrentLocation();\n    }\n    const DEFAULT_NORMALIZE_OPTIONS = { hash: true };\n    function normalizeURL(url, options) {\n        options = u.merge(DEFAULT_NORMALIZE_OPTIONS, options);\n        return u.normalizeURL(url, options);\n    }\n    function currentLocation(normalizeOptions) {\n        return normalizeURL(location.href, normalizeOptions);\n    }\n    function trackCurrentLocation() {\n        const url = currentLocation();\n        if (nextPreviousLocation !== url) {\n            previousLocation = nextPreviousLocation;\n            nextPreviousLocation = url;\n        }\n    }\n    trackCurrentLocation();\n    const ADDITIONAL_NORMALIZE_OPTIONS_FOR_COMPARISON = { trailingSlash: false };\n    function isLocation(url, options) {\n        options = u.merge(ADDITIONAL_NORMALIZE_OPTIONS_FOR_COMPARISON, options);\n        return normalizeURL(url, options) === currentLocation(options);\n    }\n    function replace(url, options = {}) {\n        url = normalizeURL(url);\n        if (manipulate('replaceState', url) && (options.event !== false)) {\n            emit('up:location:changed', { url, reason: 'replace', log: `Replaced state for ${url}` });\n        }\n    }\n    function push(url) {\n        url = normalizeURL(url);\n        if (!isLocation(url) && manipulate('pushState', url)) {\n            up.emit('up:location:changed', { url, reason: 'push', log: `Advanced to location ${url}` });\n        }\n    }\n    function manipulate(method, url) {\n        if (config.enabled) {\n            const state = buildState();\n            window.history[method](state, '', url);\n            trackCurrentLocation();\n            return true;\n        }\n    }\n    function buildState() {\n        return { up: {} };\n    }\n    async function restoreStateOnPop(state) {\n        if (state?.up) {\n            let url = currentLocation();\n            await up.render({\n                url,\n                history: true,\n                location: url,\n                peel: true,\n                layer: 'root',\n                target: config.restoreTargets,\n                cache: true,\n                scroll: 'restore',\n                saveScroll: false\n            });\n            url = currentLocation();\n            emit('up:location:changed', { url, reason: 'pop', log: `Restored location ${url}` });\n        }\n        else {\n            up.puts('pop', 'Ignoring a state not pushed by Unpoly (%o)', state);\n        }\n    }\n    function onPop(event) {\n        trackCurrentLocation();\n        up.viewport.saveScroll({ location: previousLocation });\n        const { state } = event;\n        restoreStateOnPop(state);\n    }\n    function emit(...args) {\n        const historyLayer = u.find(up.layer.stack.reversed(), 'history');\n        return historyLayer.emit(...args);\n    }\n    function register() {\n        window.addEventListener('popstate', onPop);\n        if (up.protocol.initialRequestMethod() === 'GET') {\n            replace(currentLocation(), { event: false });\n        }\n    }\n    up.on('up:framework:boot', function () {\n        if ('jasmine' in window) {\n            register();\n        }\n        else {\n            setTimeout(register, 100);\n        }\n    });\n    up.macro('a[up-back], [up-href][up-back]', function (link) {\n        if (previousLocation) {\n            e.setMissingAttrs(link, {\n                'up-href': previousLocation,\n                'up-scroll': 'restore'\n            });\n            link.removeAttribute('up-back');\n            up.link.makeFollowable(link);\n        }\n    });\n    up.on('up:framework:reset', reset);\n    return {\n        config,\n        push,\n        replace,\n        get location() { return currentLocation(); },\n        get previousLocation() { return previousLocation; },\n        normalizeURL,\n        isLocation\n    };\n})();\n\n\n/***/ }),\n/* 78 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(79);\nconst u = up.util;\nconst e = up.element;\nup.fragment = (function () {\n    const config = new up.Config(() => ({\n        badTargetClasses: [/^up-/],\n        navigateOptions: {\n            solo: true,\n            feedback: true,\n            cache: 'auto',\n            fallback: true,\n            focus: 'auto',\n            scroll: 'auto',\n            history: 'auto',\n            peel: true\n        },\n        matchAroundOrigin: true,\n        runScripts: false,\n        autoHistoryTargets: [':main'],\n        autoFocus: ['hash', 'autofocus', 'main-if-main', 'target-if-lost'],\n        autoScroll: ['hash', 'layer-if-main']\n    }));\n    u.delegate(config, 'mainTargets', () => up.layer.config.any);\n    function reset() {\n        config.reset();\n    }\n    function sourceOf(element, options = {}) {\n        element = getSmart(element, options);\n        return e.closestAttr(element, 'up-source');\n    }\n    function timeOf(element) {\n        return e.closestAttr(element, 'up-time') || '0';\n    }\n    const render = up.mockable((...args) => {\n        return u.asyncify(function () {\n            let options = parseTargetAndOptions(args);\n            options = up.RenderOptions.preprocess(options);\n            up.browser.assertConfirmed(options);\n            let guardEvent = u.pluckKey(options, 'guardEvent');\n            if (guardEvent) {\n                guardEvent.renderOptions = options;\n                up.event.assertEmitted(guardEvent, { target: options.origin });\n            }\n            up.RenderOptions.assertContentGiven(options);\n            return (options.url ? renderRemoteContent : renderLocalContent)(options);\n        });\n    });\n    function renderRemoteContent(options) {\n        let execute = () => new up.Change.FromURL(options).execute();\n        return up.feedback.aroundForOptions(options, execute);\n    }\n    function renderLocalContent(options) {\n        up.network.mimicLocalRequest(options);\n        return new up.Change.FromContent(options).execute();\n    }\n    const navigate = up.mockable((...args) => {\n        const options = parseTargetAndOptions(args);\n        return render({ ...options, navigate: true });\n    });\n    function hello(element, options = {}) {\n        element = getSmart(element);\n        const keepPlans = options.keepPlans || [];\n        const skip = keepPlans.map(function (plan) {\n            emitFragmentKept(plan);\n            return plan.oldElement;\n        });\n        up.syntax.compile(element, { skip, layer: options.layer });\n        emitFragmentInserted(element, options);\n        return element;\n    }\n    function emitFragmentInserted(element, options) {\n        return up.emit(element, 'up:fragment:inserted', {\n            log: ['Inserted fragment %o', element],\n            origin: options.origin\n        });\n    }\n    function emitFragmentKeep(keepPlan) {\n        const log = ['Keeping fragment %o', keepPlan.oldElement];\n        const callback = e.callbackAttr(keepPlan.oldElement, 'up-on-keep', ['newFragment', 'newData']);\n        return emitFromKeepPlan(keepPlan, 'up:fragment:keep', { log, callback });\n    }\n    function emitFragmentKept(keepPlan) {\n        const log = ['Kept fragment %o', keepPlan.oldElement];\n        return emitFromKeepPlan(keepPlan, 'up:fragment:kept', { log });\n    }\n    function emitFromKeepPlan(keepPlan, eventType, emitDetails) {\n        const keepable = keepPlan.oldElement;\n        const event = up.event.build(eventType, {\n            newFragment: keepPlan.newElement,\n            newData: keepPlan.newData\n        });\n        return up.emit(keepable, event, emitDetails);\n    }\n    function emitFragmentDestroyed(fragment, options) {\n        const log = options.log ?? ['Destroyed fragment %o', fragment];\n        const parent = options.parent || document;\n        return up.emit(parent, 'up:fragment:destroyed', { fragment, parent, log });\n    }\n    function isDestroying(element) {\n        return !!e.closest(element, '.up-destroying');\n    }\n    const isNotDestroying = u.negate(isDestroying);\n    function getSmart(...args) {\n        const options = u.extractOptions(args);\n        const selector = args.pop();\n        const root = args[0];\n        if (u.isElementish(selector)) {\n            return e.get(selector);\n        }\n        if (root) {\n            return getDumb(root, selector, options);\n        }\n        return new up.FragmentFinder({\n            selector,\n            origin: options.origin,\n            layer: options.layer\n        }).find();\n    }\n    function getDumb(...args) {\n        return getAll(...args)[0];\n    }\n    const CSS_HAS_SUFFIX_PATTERN = /:has\\(([^)]+)\\)$/;\n    function getAll(...args) {\n        const options = u.extractOptions(args);\n        let selector = args.pop();\n        const root = args[0];\n        selector = parseSelector(selector, root, options);\n        return selector.descendants(root || document);\n    }\n    function getSubtree(element, selector, options = {}) {\n        selector = parseSelector(selector, element, options);\n        return selector.subtree(element);\n    }\n    function contains(element, selector) {\n        return getSubtree(element, selector).length > 0;\n    }\n    function closest(element, selector, options) {\n        element = e.get(element);\n        selector = parseSelector(selector, element, options);\n        return selector.closest(element);\n    }\n    function destroy(...args) {\n        const options = parseTargetAndOptions(args);\n        if (options.element = getSmart(options.target, options)) {\n            new up.Change.DestroyFragment(options).execute();\n        }\n        return up.migrate.formerlyAsync?.('up.destroy()');\n    }\n    function parseTargetAndOptions(args) {\n        const options = u.parseArgIntoOptions(args, 'target');\n        if (u.isElement(options.target)) {\n            options.origin || (options.origin = options.target);\n        }\n        return options;\n    }\n    function markFragmentAsDestroying(element) {\n        element.classList.add('up-destroying');\n        element.setAttribute('aria-hidden', 'true');\n    }\n    function reload(...args) {\n        const options = parseTargetAndOptions(args);\n        options.target || (options.target = ':main');\n        const element = getSmart(options.target, options);\n        options.url || (options.url = sourceOf(element));\n        options.headers || (options.headers = {});\n        options.headers[up.protocol.headerize('reloadFromTime')] = timeOf(element);\n        return render(options);\n    }\n    function visit(url, options) {\n        return navigate({ ...options, url });\n    }\n    function successKey(key) {\n        return u.unprefixCamelCase(key, 'fail');\n    }\n    function failKey(key) {\n        if (!key.match(/^fail[A-Z]/)) {\n            return u.prefixCamelCase(key, 'fail');\n        }\n    }\n    function toTarget(element) {\n        if (u.isString(element)) {\n            return element;\n        }\n        element = e.get(element);\n        let value;\n        if (e.isSingleton(element)) {\n            return e.tagName(element);\n        }\n        else if (value = element.getAttribute(\"up-id\")) {\n            return e.attributeSelector('up-id', value);\n        }\n        else if (value = element.getAttribute(\"id\")) {\n            return e.idSelector(value);\n        }\n        else if (value = element.getAttribute(\"name\")) {\n            return e.tagName(element) + e.attributeSelector('name', value);\n        }\n        else if (value = u.presence(u.filter(element.classList, isGoodClassForTarget))) {\n            let selector = '';\n            for (let goodClass of value) {\n                selector += e.classSelector(goodClass);\n            }\n            return selector;\n        }\n        else {\n            return e.tagName(element);\n        }\n    }\n    function isGoodClassForTarget(klass) {\n        function matchesPattern(pattern) {\n            if (u.isRegExp(pattern)) {\n                return pattern.test(klass);\n            }\n            else {\n                return pattern === klass;\n            }\n        }\n        return !u.some(config.badTargetClasses, matchesPattern);\n    }\n    function resolveOriginReference(target, options = {}) {\n        const { origin } = options;\n        return target.replace(/&|:origin\\b/, function (match) {\n            if (origin) {\n                return toTarget(origin);\n            }\n            else {\n                up.fail('Missing { origin } element to resolve \"%s\" reference (found in %s)', match, target);\n            }\n        });\n    }\n    function expandTargets(targets, options = {}) {\n        const { layer } = options;\n        if (layer !== 'new' && !(layer instanceof up.Layer)) {\n            up.fail('Must pass an up.Layer as { layer } option, but got %o', layer);\n        }\n        targets = u.copy(u.wrapList(targets));\n        const expanded = [];\n        while (targets.length) {\n            const target = targets.shift();\n            if (target === ':main' || target === true) {\n                const mode = layer === 'new' ? options.mode : layer.mode;\n                targets.unshift(...up.layer.mainTargets(mode));\n            }\n            else if (target === ':layer') {\n                if (layer !== 'new' && !layer.opening) {\n                    targets.unshift(layer.getFirstSwappableElement());\n                }\n            }\n            else if (u.isElementish(target)) {\n                expanded.push(toTarget(target));\n            }\n            else if (u.isString(target)) {\n                expanded.push(resolveOriginReference(target, options));\n            }\n            else {\n            }\n        }\n        return u.uniq(expanded);\n    }\n    function parseSelector(selector, element, options = {}) {\n        const filters = [];\n        if (!options.destroying) {\n            filters.push(isNotDestroying);\n        }\n        options.layer || (options.layer = element);\n        const layers = up.layer.getAll(options);\n        if (options.layer !== 'any' && !(element && e.isDetached(element))) {\n            filters.push(match => u.some(layers, layer => layer.contains(match)));\n        }\n        let expandedTargets = up.fragment.expandTargets(selector, { ...options, layer: layers[0] });\n        expandedTargets = expandedTargets.map(function (target) {\n            target = target.replace(CSS_HAS_SUFFIX_PATTERN, function (match, descendantSelector) {\n                filters.push(element => element.querySelector(descendantSelector));\n                return '';\n            });\n            return target || '*';\n        });\n        return new up.Selector(expandedTargets, filters);\n    }\n    function hasAutoHistory(fragment) {\n        if (contains(fragment, config.autoHistoryTargets)) {\n            return true;\n        }\n        else {\n            up.puts('up.render()', \"Will not auto-update history because fragment doesn't contain a selector from up.fragment.config.autoHistoryTargets\");\n            return false;\n        }\n    }\n    function matches(element, selector, options = {}) {\n        element = e.get(element);\n        selector = parseSelector(selector, element, options);\n        return selector.matches(element);\n    }\n    up.on('up:framework:boot', function () {\n        const { body } = document;\n        body.setAttribute('up-source', u.normalizeURL(location.href, { hash: false }));\n        hello(body);\n        if (!up.browser.canPushState()) {\n            return up.warn('Cannot push history changes. Next fragment update will load in a new page.');\n        }\n    });\n    up.on('up:framework:reset', reset);\n    return {\n        config,\n        reload,\n        destroy,\n        render,\n        navigate,\n        get: getSmart,\n        getDumb,\n        all: getAll,\n        subtree: getSubtree,\n        contains,\n        closest,\n        source: sourceOf,\n        hello,\n        visit,\n        markAsDestroying: markFragmentAsDestroying,\n        emitInserted: emitFragmentInserted,\n        emitDestroyed: emitFragmentDestroyed,\n        emitKeep: emitFragmentKeep,\n        emitKept: emitFragmentKept,\n        successKey,\n        failKey,\n        expandTargets,\n        toTarget,\n        matches,\n        hasAutoHistory\n    };\n})();\nup.reload = up.fragment.reload;\nup.destroy = up.fragment.destroy;\nup.render = up.fragment.render;\nup.navigate = up.fragment.navigate;\nup.hello = up.fragment.hello;\nup.visit = up.fragment.visit;\nu.delegate(up, 'context', () => up.layer.current);\n\n\n/***/ }),\n/* 79 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 80 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(81);\nup.viewport = (function () {\n    const u = up.util;\n    const e = up.element;\n    const f = up.fragment;\n    const config = new up.Config(() => ({\n        viewportSelectors: ['[up-viewport]', '[up-fixed]'],\n        fixedTop: ['[up-fixed~=top]'],\n        fixedBottom: ['[up-fixed~=bottom]'],\n        anchoredRight: ['[up-anchored~=right]', '[up-fixed~=top]', '[up-fixed~=bottom]', '[up-fixed~=right]'],\n        revealSnap: 200,\n        revealPadding: 0,\n        revealTop: false,\n        revealMax() { return 0.5 * window.innerHeight; },\n        scrollSpeed: 1\n    }));\n    const scrollingController = new up.MotionController('scrolling');\n    function reset() {\n        config.reset();\n        scrollingController.reset();\n    }\n    function scroll(viewport, scrollTop, options = {}) {\n        viewport = f.get(viewport, options);\n        const motion = new up.ScrollMotion(viewport, scrollTop, options);\n        scrollingController.startMotion(viewport, motion, options);\n    }\n    function anchoredRight() {\n        const selector = config.anchoredRight.join(',');\n        return f.all(selector, { layer: 'root' });\n    }\n    function reveal(element, options) {\n        options = u.options(options);\n        element = f.get(element, options);\n        if (!(options.layer = up.layer.get(element))) {\n            return up.error.failed.async('Cannot reveal a detached element');\n        }\n        if (options.peel) {\n            options.layer.peel();\n        }\n        const motion = new up.RevealMotion(element, options);\n        return scrollingController.startMotion(element, motion, options);\n    }\n    function doFocus(element, options = {}) {\n        if (up.browser.isIE11()) {\n            const viewport = closest(element);\n            const oldScrollTop = viewport.scrollTop;\n            element.focus();\n            viewport.scrollTop = oldScrollTop;\n        }\n        else {\n            element.focus({ preventScroll: true });\n        }\n        if (!options.preventScroll) {\n            return reveal(element);\n        }\n    }\n    function tryFocus(element, options) {\n        doFocus(element, options);\n        return element === document.activeElement;\n    }\n    function isNativelyFocusable(element) {\n        return e.matches(element, 'a[href], button, textarea, input, select');\n    }\n    function makeFocusable(element) {\n        if (!element.hasAttribute('tabindex') && !isNativelyFocusable(element)) {\n            element.setAttribute('tabindex', '-1');\n            element.classList.add('up-focusable-content');\n        }\n    }\n    function revealHash(hash = location.hash, options) {\n        let match = firstHashTarget(hash, options);\n        if (match) {\n            return up.reveal(match, { top: true });\n        }\n    }\n    function allSelector() {\n        return [rootSelector(), ...config.viewportSelectors].join(',');\n    }\n    function closest(target, options = {}) {\n        const element = f.get(target, options);\n        return e.closest(element, allSelector());\n    }\n    function getSubtree(element, options = {}) {\n        element = f.get(element, options);\n        return e.subtree(element, allSelector());\n    }\n    function getAround(element, options = {}) {\n        element = f.get(element, options);\n        return e.around(element, allSelector());\n    }\n    function getAll(options = {}) {\n        return f.all(allSelector(), options);\n    }\n    function rootSelector() {\n        let element;\n        if ((element = document.scrollingElement)) {\n            return element.tagName;\n        }\n        else {\n            return 'html';\n        }\n    }\n    function getRoot() {\n        return document.querySelector(rootSelector());\n    }\n    function rootWidth() {\n        return e.root.clientWidth;\n    }\n    function rootHeight() {\n        return e.root.clientHeight;\n    }\n    function isRoot(element) {\n        return e.matches(element, rootSelector());\n    }\n    function rootHasReducedWidthFromScrollbar() {\n        return window.innerWidth > document.documentElement.offsetWidth;\n    }\n    function rootOverflowElement() {\n        const { body } = document;\n        const html = document.documentElement;\n        const element = u.find([html, body], wasChosenAsOverflowingElement);\n        return element || getRoot();\n    }\n    function wasChosenAsOverflowingElement(element) {\n        const overflowY = e.style(element, 'overflow-y');\n        return overflowY === 'auto' || overflowY === 'scroll';\n    }\n    const scrollbarWidth = u.memoize(function () {\n        const outerStyle = {\n            position: 'absolute',\n            top: '0',\n            left: '0',\n            width: '100px',\n            height: '100px',\n            overflowY: 'scroll'\n        };\n        const outer = up.element.affix(document.body, '[up-viewport]', { style: outerStyle });\n        const width = outer.offsetWidth - outer.clientWidth;\n        up.element.remove(outer);\n        return width;\n    });\n    function scrollTopKey(viewport) {\n        return up.fragment.toTarget(viewport);\n    }\n    function fixedElements(root = document) {\n        const queryParts = ['[up-fixed]'].concat(config.fixedTop).concat(config.fixedBottom);\n        return root.querySelectorAll(queryParts.join(','));\n    }\n    function saveScroll(...args) {\n        const [viewports, options] = parseOptions(args);\n        const url = options.location || options.layer.location;\n        if (url) {\n            const tops = options.tops ?? getScrollTops(viewports);\n            options.layer.lastScrollTops.set(url, tops);\n        }\n    }\n    function getScrollTops(viewports) {\n        return u.mapObject(viewports, viewport => [scrollTopKey(viewport), viewport.scrollTop]);\n    }\n    function restoreScroll(...args) {\n        const [viewports, options] = parseOptions(args);\n        const url = options.layer.location;\n        const scrollTopsForURL = options.layer.lastScrollTops.get(url) || {};\n        up.puts('up.viewport.restoreScroll()', 'Restoring scroll positions for URL %s to %o', url, scrollTopsForURL);\n        return setScrollTops(viewports, scrollTopsForURL);\n    }\n    function parseOptions(args) {\n        const options = u.copy(u.extractOptions(args));\n        options.layer = up.layer.get(options);\n        let viewports;\n        if (args[0]) {\n            viewports = [closest(args[0], options)];\n        }\n        else if (options.around) {\n            viewports = getAround(options.around, options);\n        }\n        else {\n            viewports = getAll(options);\n        }\n        return [viewports, options];\n    }\n    function resetScroll(...args) {\n        const [viewports, _options] = parseOptions(args);\n        return setScrollTops(viewports, {});\n    }\n    function setScrollTops(viewports, tops) {\n        const allScrollPromises = u.map(viewports, function (viewport) {\n            const key = scrollTopKey(viewport);\n            const scrollTop = tops[key] || 0;\n            return scroll(viewport, scrollTop, { duration: 0 });\n        });\n        return Promise.all(allScrollPromises);\n    }\n    function absolutize(element, options = {}) {\n        const viewport = closest(element);\n        const viewportRect = viewport.getBoundingClientRect();\n        const originalRect = element.getBoundingClientRect();\n        const boundsRect = new up.Rect({\n            left: originalRect.left - viewportRect.left,\n            top: originalRect.top - viewportRect.top,\n            width: originalRect.width,\n            height: originalRect.height\n        });\n        options.afterMeasure?.();\n        e.setStyle(element, {\n            position: element.style.position === 'static' ? 'static' : 'relative',\n            top: 'auto',\n            right: 'auto',\n            bottom: 'auto',\n            left: 'auto',\n            width: '100%',\n            height: '100%'\n        });\n        const bounds = e.createFromSelector('up-bounds');\n        e.insertBefore(element, bounds);\n        bounds.appendChild(element);\n        const moveBounds = function (diffX, diffY) {\n            boundsRect.left += diffX;\n            boundsRect.top += diffY;\n            return e.setStyle(bounds, boundsRect);\n        };\n        moveBounds(0, 0);\n        const newElementRect = element.getBoundingClientRect();\n        moveBounds(originalRect.left - newElementRect.left, originalRect.top - newElementRect.top);\n        u.each(fixedElements(element), e.fixedToAbsolute);\n        return {\n            bounds,\n            moveBounds\n        };\n    }\n    function firstHashTarget(hash, options = {}) {\n        if (hash = pureHash(hash)) {\n            const selector = [\n                e.attributeSelector('id', hash),\n                'a' + e.attributeSelector('name', hash)\n            ].join(',');\n            return f.get(selector, options);\n        }\n    }\n    function pureHash(value) {\n        return value?.replace(/^#/, '');\n    }\n    let userScrolled = false;\n    up.on('scroll', { once: true, beforeBoot: true }, () => userScrolled = true);\n    up.on('up:framework:boot', function () {\n        u.task(function () {\n            if (!userScrolled) {\n                return revealHash();\n            }\n        });\n    });\n    up.on(window, 'hashchange', () => revealHash());\n    up.on('up:framework:reset', reset);\n    return {\n        reveal,\n        revealHash,\n        firstHashTarget,\n        scroll,\n        config,\n        get: closest,\n        subtree: getSubtree,\n        around: getAround,\n        all: getAll,\n        rootSelector,\n        get root() { return getRoot(); },\n        rootWidth,\n        rootHeight,\n        rootHasReducedWidthFromScrollbar,\n        rootOverflowElement,\n        isRoot,\n        scrollbarWidth,\n        saveScroll,\n        restoreScroll,\n        resetScroll,\n        anchoredRight,\n        absolutize,\n        focus: doFocus,\n        tryFocus,\n        makeFocusable,\n    };\n})();\nup.focus = up.viewport.focus;\nup.scroll = up.viewport.scroll;\nup.reveal = up.viewport.reveal;\n\n\n/***/ }),\n/* 81 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 82 */\n/***/ (() => {\n\nup.motion = (function () {\n    const u = up.util;\n    const e = up.element;\n    let namedAnimations = {};\n    let namedTransitions = {};\n    const motionController = new up.MotionController('motion');\n    const config = new up.Config(() => ({\n        duration: 175,\n        easing: 'ease',\n        enabled: !matchMedia('(prefers-reduced-motion: reduce)').matches\n    }));\n    function pickDefault(registry) {\n        return u.pickBy(registry, value => value.isDefault);\n    }\n    function reset() {\n        motionController.reset();\n        namedAnimations = pickDefault(namedAnimations);\n        namedTransitions = pickDefault(namedTransitions);\n        config.reset();\n    }\n    function isEnabled() {\n        return config.enabled;\n    }\n    function animate(element, animation, options) {\n        element = up.fragment.get(element);\n        options = u.options(options);\n        const animationFn = findAnimationFn(animation);\n        const willRun = willAnimate(element, animation, options);\n        if (willRun) {\n            const runNow = () => animationFn(element, options);\n            return motionController.startFunction(element, runNow, options);\n        }\n        else {\n            return skipAnimate(element, animation);\n        }\n    }\n    function willAnimate(element, animationOrTransition, options) {\n        applyConfig(options);\n        return isEnabled() && !isNone(animationOrTransition) && (options.duration > 0) && !e.isSingleton(element);\n    }\n    function skipAnimate(element, animation) {\n        if (u.isOptions(animation)) {\n            e.setStyle(element, animation);\n        }\n        return Promise.resolve();\n    }\n    function animateNow(element, lastFrame, options) {\n        options = { ...options, finishEvent: motionController.finishEvent };\n        const cssTransition = new up.CSSTransition(element, lastFrame, options);\n        return cssTransition.start();\n    }\n    function applyConfig(options) {\n        options.easing || (options.easing = config.easing);\n        options.duration || (options.duration = config.duration);\n    }\n    function findNamedAnimation(name) {\n        return namedAnimations[name] || up.fail(\"Unknown animation %o\", name);\n    }\n    function finish(element) {\n        return motionController.finish(element);\n    }\n    function morph(oldElement, newElement, transitionObject, options) {\n        options = u.options(options);\n        applyConfig(options);\n        oldElement = up.fragment.get(oldElement);\n        newElement = up.fragment.get(newElement);\n        const transitionFn = findTransitionFn(transitionObject);\n        const willMorph = willAnimate(oldElement, transitionFn, options);\n        const beforeStart = u.pluckKey(options, 'beforeStart') || u.noop;\n        const afterInsert = u.pluckKey(options, 'afterInsert') || u.noop;\n        const beforeDetach = u.pluckKey(options, 'beforeDetach') || u.noop;\n        const afterDetach = u.pluckKey(options, 'afterDetach') || u.noop;\n        const scrollNew = u.pluckKey(options, 'scrollNew') || u.asyncNoop;\n        beforeStart();\n        if (willMorph) {\n            if (motionController.isActive(oldElement) && (options.trackMotion === false)) {\n                return transitionFn(oldElement, newElement, options);\n            }\n            up.puts('up.morph()', 'Morphing %o to %o with transition %O', oldElement, newElement, transitionObject);\n            const viewport = up.viewport.get(oldElement);\n            const scrollTopBeforeReveal = viewport.scrollTop;\n            const oldRemote = up.viewport.absolutize(oldElement, {\n                afterMeasure() {\n                    e.insertBefore(oldElement, newElement);\n                    afterInsert();\n                }\n            });\n            const trackable = async function () {\n                await scrollNew();\n                const scrollTopAfterReveal = viewport.scrollTop;\n                oldRemote.moveBounds(0, scrollTopAfterReveal - scrollTopBeforeReveal);\n                await transitionFn(oldElement, newElement, options);\n                beforeDetach();\n                e.remove(oldRemote.bounds);\n                afterDetach();\n            };\n            return motionController.startFunction([oldElement, newElement], trackable, options);\n        }\n        else {\n            beforeDetach();\n            swapElementsDirectly(oldElement, newElement);\n            afterInsert();\n            afterDetach();\n            return scrollNew();\n        }\n    }\n    function findTransitionFn(object) {\n        if (isNone(object)) {\n            return undefined;\n        }\n        else if (u.isFunction(object)) {\n            return object;\n        }\n        else if (u.isArray(object)) {\n            return composeTransitionFn(...object);\n        }\n        else if (u.isString(object)) {\n            let namedTransition;\n            if (object.indexOf('/') >= 0) {\n                return composeTransitionFn(...object.split('/'));\n            }\n            else if (namedTransition = namedTransitions[object]) {\n                return findTransitionFn(namedTransition);\n            }\n        }\n        else {\n            return up.fail(\"Unknown transition %o\", object);\n        }\n    }\n    function composeTransitionFn(oldAnimation, newAnimation) {\n        if (!isNone(oldAnimation) && !isNone(newAnimation)) {\n            const oldAnimationFn = findAnimationFn(oldAnimation) || u.asyncNoop;\n            const newAnimationFn = findAnimationFn(newAnimation) || u.asyncNoop;\n            return (oldElement, newElement, options) => Promise.all([\n                oldAnimationFn(oldElement, options),\n                newAnimationFn(newElement, options)\n            ]);\n        }\n    }\n    function findAnimationFn(object) {\n        if (isNone(object)) {\n            return undefined;\n        }\n        else if (u.isFunction(object)) {\n            return object;\n        }\n        else if (u.isString(object)) {\n            return findNamedAnimation(object);\n        }\n        else if (u.isOptions(object)) {\n            return (element, options) => animateNow(element, object, options);\n        }\n        else {\n            return up.fail('Unknown animation %o', object);\n        }\n    }\n    const swapElementsDirectly = up.mockable(function (oldElement, newElement) {\n        e.replace(oldElement, newElement);\n    });\n    function registerTransition(name, transition) {\n        const fn = findTransitionFn(transition);\n        fn.isDefault = up.framework.evaling;\n        namedTransitions[name] = fn;\n    }\n    function registerAnimation(name, animation) {\n        const fn = findAnimationFn(animation);\n        fn.isDefault = up.framework.evaling;\n        namedAnimations[name] = fn;\n    }\n    up.on('up:framework:boot', function () {\n        if (!isEnabled()) {\n            up.puts('up.motion', 'Animations are disabled');\n        }\n    });\n    function isNone(animationOrTransition) {\n        return !animationOrTransition || animationOrTransition === 'none';\n    }\n    function registerOpacityAnimation(name, from, to) {\n        registerAnimation(name, function (element, options) {\n            element.style.opacity = 0;\n            e.setStyle(element, { opacity: from });\n            return animateNow(element, { opacity: to }, options);\n        });\n    }\n    registerOpacityAnimation('fade-in', 0, 1);\n    registerOpacityAnimation('fade-out', 1, 0);\n    function translateCSS(dx, dy) {\n        return { transform: `translate(${dx}px, ${dy}px)` };\n    }\n    function untranslatedBox(element) {\n        e.setStyle(element, translateCSS(0, 0));\n        return element.getBoundingClientRect();\n    }\n    function registerMoveAnimations(direction, boxToTransform) {\n        const animationToName = `move-to-${direction}`;\n        const animationFromName = `move-from-${direction}`;\n        registerAnimation(animationToName, function (element, options) {\n            const box = untranslatedBox(element);\n            const transform = boxToTransform(box);\n            return animateNow(element, transform, options);\n        });\n        registerAnimation(animationFromName, function (element, options) {\n            const box = untranslatedBox(element);\n            const transform = boxToTransform(box);\n            e.setStyle(element, transform);\n            return animateNow(element, translateCSS(0, 0), options);\n        });\n    }\n    registerMoveAnimations('top', function (box) {\n        const travelDistance = box.top + box.height;\n        return translateCSS(0, -travelDistance);\n    });\n    registerMoveAnimations('bottom', function (box) {\n        const travelDistance = up.viewport.rootHeight() - box.top;\n        return translateCSS(0, travelDistance);\n    });\n    registerMoveAnimations('left', function (box) {\n        const travelDistance = box.left + box.width;\n        return translateCSS(-travelDistance, 0);\n    });\n    registerMoveAnimations('right', function (box) {\n        const travelDistance = up.viewport.rootWidth() - box.left;\n        return translateCSS(travelDistance, 0);\n    });\n    registerTransition('cross-fade', ['fade-out', 'fade-in']);\n    registerTransition('move-left', ['move-to-left', 'move-from-right']);\n    registerTransition('move-right', ['move-to-right', 'move-from-left']);\n    registerTransition('move-up', ['move-to-top', 'move-from-bottom']);\n    registerTransition('move-down', ['move-to-bottom', 'move-from-top']);\n    up.on('up:framework:reset', reset);\n    return {\n        morph,\n        animate,\n        finish,\n        finishCount() { return motionController.finishCount; },\n        transition: registerTransition,\n        animation: registerAnimation,\n        config,\n        isEnabled,\n        isNone,\n        willAnimate,\n        swapElementsDirectly\n    };\n})();\nup.transition = up.motion.transition;\nup.animation = up.motion.animation;\nup.morph = up.motion.morph;\nup.animate = up.motion.animate;\n\n\n/***/ }),\n/* 83 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(84);\nconst u = up.util;\nup.network = (function () {\n    const config = new up.Config(() => ({\n        concurrency: 4,\n        wrapMethod: true,\n        cacheSize: 70,\n        cacheExpiry: 1000 * 60 * 5,\n        badDownlink: 0.6,\n        badRTT: 750,\n        badResponseTime: 400,\n        autoCache(request) { return request.isSafe(); },\n        clearCache(request, _response) { return !request.isSafe(); },\n        requestMetaKeys: ['target', 'failTarget', 'mode', 'failMode', 'context', 'failContext'],\n        progressBar: true\n    }));\n    const queue = new up.Request.Queue();\n    const cache = new up.Request.Cache();\n    let progressBar = null;\n    function reset() {\n        abortRequests();\n        queue.reset();\n        config.reset();\n        cache.clear();\n        progressBar?.destroy();\n        progressBar = null;\n    }\n    function makeRequest(...args) {\n        const request = new up.Request(parseRequestOptions(args));\n        useCachedRequest(request) || queueRequest(request);\n        handleSolo(request);\n        return request;\n    }\n    function mimicLocalRequest(options) {\n        handleSolo(options);\n        let clearCache = options.clearCache;\n        if (clearCache) {\n            cache.clear(clearCache);\n        }\n    }\n    function handleSolo(requestOrOptions) {\n        let solo = requestOrOptions.solo;\n        if (solo && isBusy()) {\n            up.puts('up.request()', 'Change with { solo } option will abort other requests');\n            if (requestOrOptions instanceof up.Request) {\n                queue.abortExcept(requestOrOptions, solo);\n            }\n            else {\n                abortRequests(solo);\n            }\n        }\n    }\n    function parseRequestOptions(args) {\n        const options = u.extractOptions(args);\n        if (!options.url) {\n            options.url = args[0];\n        }\n        up.migrate.handleRequestOptions?.(options);\n        return options;\n    }\n    function useCachedRequest(request) {\n        let cachedRequest;\n        if (request.willCache() && (cachedRequest = cache.get(request))) {\n            up.puts('up.request()', 'Re-using previous request to %s %s', request.method, request.url);\n            if (!request.preload) {\n                queue.promoteToForeground(cachedRequest);\n            }\n            request.followState(cachedRequest);\n            return true;\n        }\n    }\n    function queueRequest(request) {\n        if (request.preload && !request.isSafe()) {\n            up.fail('Will not preload request to %s', request.description);\n        }\n        handleCaching(request);\n        queue.asap(request);\n        return true;\n    }\n    function handleCaching(request) {\n        if (request.willCache()) {\n            cache.set(request, request);\n        }\n        return u.always(request, function (response) {\n            let clearCache = response.clearCache ?? request.clearCache ?? config.clearCache(request, response);\n            if (clearCache) {\n                cache.clear(clearCache);\n            }\n            if (request.willCache() || cache.get(request)) {\n                cache.set(request, request);\n            }\n            if (!response.ok) {\n                cache.remove(request);\n            }\n        });\n    }\n    function isBusy() {\n        return queue.isBusy();\n    }\n    const isIdle = u.negate(isBusy);\n    function loadPage(requestsAttrs) {\n        new up.Request(requestsAttrs).loadPage();\n    }\n    function shouldReduceRequests() {\n        let netInfo = navigator.connection;\n        if (netInfo) {\n            return netInfo.saveData ||\n                (netInfo.rtt && (netInfo.rtt > config.badRTT)) ||\n                (netInfo.downlink && (netInfo.downlink < config.badDownlink));\n        }\n    }\n    function abortRequests(...args) {\n        queue.abort(...args);\n    }\n    function registerAliasForRedirect(request, response) {\n        if (request.cache && response.url && request.url !== response.url) {\n            const newRequest = request.variant({\n                method: response.method,\n                url: response.url\n            });\n            cache.alias(request, newRequest);\n        }\n    }\n    function isSafeMethod(method) {\n        return u.contains(['GET', 'OPTIONS', 'HEAD'], u.normalizeMethod(method));\n    }\n    function onLate() {\n        if (u.evalOption(config.progressBar)) {\n            progressBar = new up.ProgressBar();\n        }\n    }\n    function onRecover() {\n        progressBar?.conclude();\n    }\n    up.on('up:request:late', onLate);\n    up.on('up:request:recover', onRecover);\n    up.on('up:framework:reset', reset);\n    return {\n        request: makeRequest,\n        cache,\n        isIdle,\n        isBusy,\n        isSafeMethod,\n        config,\n        abort: abortRequests,\n        registerAliasForRedirect,\n        queue,\n        shouldReduceRequests,\n        mimicLocalRequest,\n        loadPage,\n    };\n})();\nup.request = up.network.request;\nup.cache = up.network.cache;\n\n\n/***/ }),\n/* 84 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 85 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(86);\nconst u = up.util;\nconst e = up.element;\nup.layer = (function () {\n    const LAYER_CLASSES = [\n        up.Layer.Root,\n        up.Layer.Modal,\n        up.Layer.Popup,\n        up.Layer.Drawer,\n        up.Layer.Cover\n    ];\n    const config = new up.Config(function () {\n        const newConfig = {\n            mode: 'modal',\n            any: {\n                mainTargets: [\n                    \"[up-main='']\",\n                    'main',\n                    ':layer'\n                ]\n            },\n            root: {\n                mainTargets: ['[up-main~=root]'],\n                history: true\n            },\n            overlay: {\n                mainTargets: ['[up-main~=overlay]'],\n                openAnimation: 'fade-in',\n                closeAnimation: 'fade-out',\n                dismissLabel: '\u00D7',\n                dismissAriaLabel: 'Dismiss dialog',\n                dismissable: true,\n                history: 'auto'\n            },\n            cover: {\n                mainTargets: ['[up-main~=cover]']\n            },\n            drawer: {\n                mainTargets: ['[up-main~=drawer]'],\n                backdrop: true,\n                position: 'left',\n                size: 'medium',\n                openAnimation(layer) {\n                    switch (layer.position) {\n                        case 'left': return 'move-from-left';\n                        case 'right': return 'move-from-right';\n                    }\n                },\n                closeAnimation(layer) {\n                    switch (layer.position) {\n                        case 'left': return 'move-to-left';\n                        case 'right': return 'move-to-right';\n                    }\n                }\n            },\n            modal: {\n                mainTargets: ['[up-main~=modal]'],\n                backdrop: true,\n                size: 'medium'\n            },\n            popup: {\n                mainTargets: ['[up-main~=popup]'],\n                position: 'bottom',\n                size: 'medium',\n                align: 'left',\n                dismissable: 'outside key'\n            }\n        };\n        for (let Class of LAYER_CLASSES) {\n            newConfig[Class.mode].Class = Class;\n        }\n        return newConfig;\n    });\n    let stack = null;\n    let handlers = [];\n    function mainTargets(mode) {\n        return u.flatMap(modeConfigs(mode), 'mainTargets');\n    }\n    function modeConfigs(mode) {\n        if (mode === 'root') {\n            return [config.root, config.any];\n        }\n        else {\n            return [config[mode], config.overlay, config.any];\n        }\n    }\n    function normalizeOptions(options) {\n        up.migrate.handleLayerOptions?.(options);\n        if (u.isGiven(options.layer)) {\n            let match = String(options.layer).match(/^(new|shatter|swap)( (\\w+))?/);\n            if (match) {\n                options.layer = 'new';\n                const openMethod = match[1];\n                const shorthandMode = match[3];\n                options.mode || (options.mode = shorthandMode || config.mode);\n                if (openMethod === 'swap') {\n                    if (up.layer.isOverlay()) {\n                        options.baseLayer = 'parent';\n                    }\n                }\n                else if (openMethod === 'shatter') {\n                    options.baseLayer = 'root';\n                }\n            }\n        }\n        else {\n            if (options.mode) {\n                options.layer = 'new';\n            }\n            else if (u.isElementish(options.target)) {\n                options.layer = stack.get(options.target, { normalizeLayerOptions: false });\n            }\n            else if (options.origin) {\n                options.layer = 'origin';\n            }\n            else {\n                options.layer = 'current';\n            }\n        }\n        if (!options.context) {\n            options.context = {};\n        }\n        options.baseLayer = stack.get('current', { ...options, normalizeLayerOptions: false });\n    }\n    function build(options, beforeNew) {\n        const { mode } = options;\n        const { Class } = config[mode];\n        const configs = u.reverse(modeConfigs(mode));\n        let handleDeprecatedConfig = up.migrate.handleLayerConfig;\n        if (handleDeprecatedConfig) {\n            configs.forEach(handleDeprecatedConfig);\n        }\n        options.openAnimation ?? (options.openAnimation = u.pluckKey(options, 'animation'));\n        options = u.mergeDefined(...configs, { mode, stack }, options);\n        if (beforeNew) {\n            options = beforeNew(options);\n        }\n        return new Class(options);\n    }\n    function openCallbackAttr(link, attr) {\n        return e.callbackAttr(link, attr, ['layer']);\n    }\n    function closeCallbackAttr(link, attr) {\n        return e.callbackAttr(link, attr, ['layer', 'value']);\n    }\n    function reset() {\n        config.reset();\n        stack.reset();\n        handlers = u.filter(handlers, 'isDefault');\n    }\n    async function open(options) {\n        options = u.options(options, {\n            layer: 'new',\n            defaultToEmptyContent: true,\n            navigate: true\n        });\n        let result = await up.render(options);\n        return result.layer;\n    }\n    function ask(options) {\n        return new Promise(function (resolve, reject) {\n            options = {\n                ...options,\n                onAccepted: (event) => resolve(event.value),\n                onDismissed: (event) => reject(event.value)\n            };\n            open(options);\n        });\n    }\n    function anySelector() {\n        return u.map(LAYER_CLASSES, Class => Class.selector()).join(',');\n    }\n    function optionToString(option) {\n        if (u.isString(option)) {\n            return `layer \"${option}\"`;\n        }\n        else {\n            return option.toString();\n        }\n    }\n    up.on('up:fragment:destroyed', function () {\n        stack.sync();\n    });\n    up.on('up:framework:evaled', function () {\n        stack = new up.LayerStack();\n    });\n    up.on('up:framework:reset', reset);\n    const api = {\n        config,\n        mainTargets,\n        open,\n        build,\n        ask,\n        normalizeOptions,\n        openCallbackAttr,\n        closeCallbackAttr,\n        anySelector,\n        optionToString,\n        get stack() { return stack; }\n    };\n    u.delegate(api, [\n        'get',\n        'getAll',\n        'root',\n        'overlays',\n        'current',\n        'front',\n        'sync',\n        'count',\n        'dismissOverlays'\n    ], () => stack);\n    u.delegate(api, [\n        'accept',\n        'dismiss',\n        'isRoot',\n        'isOverlay',\n        'isFront',\n        'on',\n        'off',\n        'emit',\n        'parent',\n        'history',\n        'location',\n        'mode',\n        'context',\n        'element',\n        'contains',\n        'size',\n        'affix'\n    ], () => stack.current);\n    return api;\n})();\n\n\n/***/ }),\n/* 86 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 87 */\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n__webpack_require__(88);\nup.link = (function () {\n    const u = up.util;\n    const e = up.element;\n    const linkPreloader = new up.LinkPreloader();\n    let lastMousedownTarget = null;\n    const LINKS_WITH_LOCAL_HTML = ['a[up-content]', 'a[up-fragment]', 'a[up-document]'];\n    const LINKS_WITH_REMOTE_HTML = ['a[href]', '[up-href]'];\n    const ATTRIBUTES_SUGGESTING_FOLLOW = ['[up-follow]', '[up-target]', '[up-layer]', '[up-transition]', '[up-preload]', '[up-instant]'];\n    function combineFollowableSelectors(elementSelectors, attributeSelectors) {\n        return u.flatMap(elementSelectors, elementSelector => attributeSelectors.map(attributeSelector => elementSelector + attributeSelector));\n    }\n    const config = new up.Config(() => ({\n        followSelectors: combineFollowableSelectors(LINKS_WITH_REMOTE_HTML, ATTRIBUTES_SUGGESTING_FOLLOW).concat(LINKS_WITH_LOCAL_HTML),\n        noFollowSelectors: ['[up-follow=false]', 'a[download]', 'a[target]', 'a[href^=\"#\"]:not([up-content]):not([up-fragment]):not([up-document])', 'a[href^=\"javascript:\"]'],\n        instantSelectors: ['[up-instant]'],\n        noInstantSelectors: ['[up-instant=false]', '[onclick]'],\n        preloadSelectors: combineFollowableSelectors(LINKS_WITH_REMOTE_HTML, ['[up-preload]']),\n        noPreloadSelectors: ['[up-preload=false]'],\n        clickableSelectors: LINKS_WITH_LOCAL_HTML.concat(['[up-emit]', '[up-accept]', '[up-dismiss]', '[up-clickable]']),\n        preloadDelay: 90,\n        preloadEnabled: 'auto'\n    }));\n    function fullFollowSelector() {\n        return config.followSelectors.join(',');\n    }\n    function fullPreloadSelector() {\n        return config.preloadSelectors.join(',');\n    }\n    function fullInstantSelector() {\n        return config.instantSelectors.join(',');\n    }\n    function fullClickableSelector() {\n        return config.clickableSelectors.join(',');\n    }\n    function isFollowDisabled(link) {\n        return e.matches(link, config.noFollowSelectors.join(',')) || u.isCrossOrigin(link);\n    }\n    function isPreloadDisabled(link) {\n        return !up.browser.canPushState() ||\n            e.matches(link, config.noPreloadSelectors.join(',')) ||\n            isFollowDisabled(link) ||\n            !willCache(link);\n    }\n    function willCache(link) {\n        const options = parseRequestOptions(link);\n        if (options.url) {\n            if (options.cache == null) {\n                options.cache = 'auto';\n            }\n            options.basic = true;\n            const request = new up.Request(options);\n            return request.willCache();\n        }\n    }\n    function isInstantDisabled(link) {\n        return e.matches(link, config.noInstantSelectors.join(',')) || isFollowDisabled(link);\n    }\n    function reset() {\n        lastMousedownTarget = null;\n        config.reset();\n        linkPreloader.reset();\n    }\n    const follow = up.mockable(function (link, options) {\n        return up.render(followOptions(link, options));\n    });\n    function parseRequestOptions(link, options) {\n        options = u.options(options);\n        const parser = new up.OptionsParser(options, link);\n        options.url = followURL(link, options);\n        options.method = followMethod(link, options);\n        parser.json('headers');\n        parser.json('params');\n        parser.booleanOrString('cache');\n        parser.booleanOrString('clearCache');\n        parser.booleanOrString('solo');\n        parser.string('contentType', { attr: ['enctype', 'up-content-type'] });\n        return options;\n    }\n    function followOptions(link, options) {\n        link = up.fragment.get(link);\n        options = parseRequestOptions(link, options);\n        const parser = new up.OptionsParser(options, link, { fail: true });\n        parser.boolean('feedback');\n        parser.boolean('fail');\n        if (parser.options.origin == null) {\n            parser.options.origin = link;\n        }\n        parser.boolean('navigate', { default: true });\n        parser.string('confirm');\n        parser.string('target');\n        parser.booleanOrString('fallback');\n        parser.parse(((link, attrName) => e.callbackAttr(link, attrName, ['request', 'response', 'renderOptions'])), 'onLoaded');\n        parser.string('content');\n        parser.string('fragment');\n        parser.string('document');\n        parser.boolean('peel');\n        parser.string('layer');\n        parser.string('baseLayer');\n        parser.json('context');\n        parser.string('mode');\n        parser.string('align');\n        parser.string('position');\n        parser.string('class');\n        parser.string('size');\n        parser.booleanOrString('dismissable');\n        parser.parse(up.layer.openCallbackAttr, 'onOpened');\n        parser.parse(up.layer.closeCallbackAttr, 'onAccepted');\n        parser.parse(up.layer.closeCallbackAttr, 'onDismissed');\n        parser.string('acceptEvent');\n        parser.string('dismissEvent');\n        parser.string('acceptLocation');\n        parser.string('dismissLocation');\n        parser.booleanOrString('history');\n        parser.booleanOrString('focus');\n        parser.boolean('saveScroll');\n        parser.booleanOrString('scroll');\n        parser.boolean('revealTop');\n        parser.number('revealMax');\n        parser.number('revealPadding');\n        parser.number('revealSnap');\n        parser.string('scrollBehavior');\n        parser.booleanOrString('history');\n        parser.booleanOrString('location');\n        parser.booleanOrString('title');\n        parser.booleanOrString('animation');\n        parser.booleanOrString('transition');\n        parser.string('easing');\n        parser.number('duration');\n        up.migrate.parseFollowOptions?.(parser);\n        if (!options.guardEvent) {\n            options.guardEvent = up.event.build('up:link:follow', { log: 'Following link' });\n        }\n        return options;\n    }\n    function preload(link, options) {\n        link = up.fragment.get(link);\n        if (!shouldPreload()) {\n            return up.error.failed.async('Link preloading is disabled');\n        }\n        const guardEvent = up.event.build('up:link:preload', { log: ['Preloading link %o', link] });\n        return follow(link, { ...options, guardEvent, preload: true });\n    }\n    function shouldPreload() {\n        const setting = config.preloadEnabled;\n        if (setting === 'auto') {\n            return !up.network.shouldReduceRequests();\n        }\n        return setting;\n    }\n    function followMethod(link, options = {}) {\n        return u.normalizeMethod(options.method || link.getAttribute('up-method') || link.getAttribute('data-method'));\n    }\n    function followURL(link, options = {}) {\n        const url = options.url || link.getAttribute('up-href') || link.getAttribute('href');\n        if (url !== '#') {\n            return url;\n        }\n    }\n    function isFollowable(link) {\n        link = up.fragment.get(link);\n        return e.matches(link, fullFollowSelector()) && !isFollowDisabled(link);\n    }\n    function makeFollowable(link) {\n        if (!isFollowable(link)) {\n            link.setAttribute('up-follow', '');\n        }\n    }\n    function makeClickable(link) {\n        if (e.matches(link, 'a[href], button')) {\n            return;\n        }\n        e.setMissingAttrs(link, {\n            tabindex: '0',\n            role: 'link',\n            'up-clickable': ''\n        });\n        link.addEventListener('keydown', function (event) {\n            if ((event.key === 'Enter') || (event.key === 'Space')) {\n                return forkEventAsUpClick(event);\n            }\n        });\n    }\n    up.macro(fullClickableSelector, makeClickable);\n    function shouldFollowEvent(event, link) {\n        if (event.defaultPrevented || isFollowDisabled(link)) {\n            return false;\n        }\n        const betterTargetSelector = `a, [up-href], ${up.form.fieldSelector()}`;\n        const betterTarget = e.closest(event.target, betterTargetSelector);\n        return !betterTarget || (betterTarget === link);\n    }\n    function isInstant(linkOrDescendant) {\n        const element = e.closest(linkOrDescendant, fullInstantSelector());\n        return element && !isInstantDisabled(element);\n    }\n    function convertClicks(layer) {\n        layer.on('click', function (event, element) {\n            if (!up.event.isUnmodified(event)) {\n                return;\n            }\n            if (isInstant(element) && lastMousedownTarget) {\n                up.event.halt(event);\n            }\n            else if (layer.wasHitByMouseEvent(event) && !didUserDragAway(event)) {\n                forkEventAsUpClick(event);\n            }\n            return lastMousedownTarget = null;\n        });\n        layer.on('mousedown', function (event, element) {\n            if (!up.event.isUnmodified(event)) {\n                return;\n            }\n            lastMousedownTarget = event.target;\n            if (isInstant(element)) {\n                forkEventAsUpClick(event);\n            }\n        });\n    }\n    function didUserDragAway(clickEvent) {\n        return lastMousedownTarget && (lastMousedownTarget !== clickEvent.target);\n    }\n    function forkEventAsUpClick(originalEvent) {\n        let forwardedProps = ['clientX', 'clientY', 'button', ...up.event.keyModifiers];\n        const newEvent = up.event.fork(originalEvent, 'up:click', forwardedProps);\n        up.emit(originalEvent.target, newEvent, { log: false });\n    }\n    function isSafe(link) {\n        const method = followMethod(link);\n        return up.network.isSafeMethod(method);\n    }\n    up.on('up:click', fullFollowSelector, function (event, link) {\n        if (shouldFollowEvent(event, link)) {\n            up.event.halt(event);\n            up.log.muteUncriticalRejection(follow(link));\n        }\n    });\n    up.macro('[up-expand]', function (area) {\n        const selector = area.getAttribute('up-expand') || 'a, [up-href]';\n        let childLink = e.get(area, selector);\n        if (childLink) {\n            const areaAttrs = e.upAttrs(childLink);\n            if (!areaAttrs['up-href']) {\n                areaAttrs['up-href'] = childLink.getAttribute('href');\n            }\n            e.setMissingAttrs(area, areaAttrs);\n            makeFollowable(area);\n        }\n    });\n    up.compiler(fullPreloadSelector, function (link) {\n        if (!isPreloadDisabled(link)) {\n            linkPreloader.observeLink(link);\n        }\n    });\n    up.on('up:framework:reset', reset);\n    return {\n        follow,\n        followOptions,\n        preload,\n        makeFollowable,\n        makeClickable,\n        isSafe,\n        isFollowable,\n        shouldFollowEvent,\n        followMethod,\n        convertClicks,\n        config,\n        combineFollowableSelectors\n    };\n})();\nup.follow = up.link.follow;\n\n\n/***/ }),\n/* 88 */\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n/***/ }),\n/* 89 */\n/***/ (() => {\n\nup.form = (function () {\n    const u = up.util;\n    const e = up.element;\n    const ATTRIBUTES_SUGGESTING_SUBMIT = ['[up-submit]', '[up-target]', '[up-layer]', '[up-transition]'];\n    const config = new up.Config(() => ({\n        validateTargets: ['[up-fieldset]:has(:origin)', 'fieldset:has(:origin)', 'label:has(:origin)', 'form:has(:origin)'],\n        fieldSelectors: ['select', 'input:not([type=submit]):not([type=image])', 'button[type]:not([type=submit])', 'textarea'],\n        submitSelectors: up.link.combineFollowableSelectors(['form'], ATTRIBUTES_SUGGESTING_SUBMIT),\n        noSubmitSelectors: ['[up-submit=false]', '[target]'],\n        submitButtonSelectors: ['input[type=submit]', 'input[type=image]', 'button[type=submit]', 'button:not([type])'],\n        observeDelay: 0\n    }));\n    let abortScheduledValidate;\n    function fullSubmitSelector() {\n        return config.submitSelectors.join(',');\n    }\n    function reset() {\n        config.reset();\n    }\n    function fieldSelector(suffix = '') {\n        return config.fieldSelectors.map(field => field + suffix).join(',');\n    }\n    function findFields(root) {\n        root = e.get(root);\n        let fields = e.subtree(root, fieldSelector());\n        if (e.matches(root, 'form[id]')) {\n            const outsideFieldSelector = fieldSelector(e.attributeSelector('form', root.getAttribute('id')));\n            const outsideFields = e.all(outsideFieldSelector);\n            fields.push(...outsideFields);\n            fields = u.uniq(fields);\n        }\n        return fields;\n    }\n    function submittingButton(form) {\n        const selector = submitButtonSelector();\n        const focusedElement = document.activeElement;\n        if (focusedElement && e.matches(focusedElement, selector) && form.contains(focusedElement)) {\n            return focusedElement;\n        }\n        else {\n            return e.get(form, selector);\n        }\n    }\n    function submitButtonSelector() {\n        return config.submitButtonSelectors.join(',');\n    }\n    const submit = up.mockable((form, options) => {\n        return up.render(submitOptions(form, options));\n    });\n    function submitOptions(form, options) {\n        form = getForm(form);\n        options = parseBasicOptions(form, options);\n        let parser = new up.OptionsParser(options, form);\n        parser.string('failTarget', { default: up.fragment.toTarget(form) });\n        options.guardEvent || (options.guardEvent = up.event.build('up:form:submit', {\n            submitButton: options.submitButton,\n            params: options.params,\n            log: 'Submitting form'\n        }));\n        u.assign(options, up.link.followOptions(form, options));\n        return options;\n    }\n    function parseBasicOptions(form, options) {\n        options = u.options(options);\n        form = getForm(form);\n        const parser = new up.OptionsParser(options, form);\n        const params = up.Params.fromForm(form);\n        options.submitButton || (options.submitButton = submittingButton(form));\n        if (options.submitButton) {\n            params.addField(options.submitButton);\n            options.method || (options.method = options.submitButton.getAttribute('formmethod'));\n            options.url || (options.url = options.submitButton.getAttribute('formaction'));\n        }\n        params.addAll(options.params);\n        options.params = params;\n        parser.string('url', { attr: 'action', default: up.fragment.source(form) });\n        parser.string('method', {\n            attr: ['up-method', 'data-method', 'method'],\n            default: 'GET',\n            normalize: u.normalizeMethod\n        });\n        if (options.method === 'GET') {\n            options.url = up.Params.stripURL(options.url);\n        }\n        return options;\n    }\n    up.on('up:click', submitButtonSelector, function (event, button) {\n        const form = getForm(button);\n        if (form && isSubmittable(form)) {\n            button.focus();\n        }\n    });\n    function observe(elements, ...args) {\n        elements = e.list(elements);\n        const fields = u.flatMap(elements, findFields);\n        const unnamedFields = u.reject(fields, 'name');\n        if (unnamedFields.length) {\n            up.warn('up.observe()', 'Will not observe fields without a [name]: %o', unnamedFields);\n        }\n        const callback = u.extractCallback(args) || observeCallbackFromElement(elements[0]) || up.fail('up.observe: No change callback given');\n        const options = u.extractOptions(args);\n        options.delay = options.delay ?? e.numberAttr(elements[0], 'up-delay') ?? config.observeDelay;\n        const observer = new up.FieldObserver(fields, options, callback);\n        observer.start();\n        return () => observer.stop();\n    }\n    function observeCallbackFromElement(element) {\n        let rawCallback = element.getAttribute('up-observe');\n        if (rawCallback) {\n            return up.NonceableCallback.fromString(rawCallback).toFunction('value', 'name');\n        }\n    }\n    function autosubmit(target, options) {\n        return observe(target, options, () => submit(target));\n    }\n    function findValidateTarget(element, options) {\n        let givenTarget;\n        const container = getContainer(element);\n        if (u.isElementish(options.target)) {\n            return up.fragment.toTarget(options.target);\n        }\n        else if (givenTarget = options.target || element.getAttribute('up-validate') || container.getAttribute('up-validate')) {\n            return givenTarget;\n        }\n        else if (e.matches(element, 'form')) {\n            return up.fragment.toTarget(element);\n        }\n        else {\n            return findValidateTargetFromConfig(element, options) || up.fail('Could not find validation target for %o (tried defaults %o)', element, config.validateTargets);\n        }\n    }\n    function findValidateTargetFromConfig(element, options) {\n        const layer = up.layer.get(element);\n        return u.findResult(config.validateTargets, function (defaultTarget) {\n            if (up.fragment.get(defaultTarget, { ...options, layer })) {\n                return defaultTarget;\n            }\n        });\n    }\n    function validate(field, options) {\n        field = up.fragment.get(field);\n        options = parseBasicOptions(field, options);\n        options.origin = field;\n        options.target = findValidateTarget(field, options);\n        options.focus = 'keep';\n        options.fail = false;\n        options.headers || (options.headers = {});\n        options.headers[up.protocol.headerize('validate')] = field.getAttribute('name') || ':unknown';\n        options.guardEvent = up.event.build('up:form:validate', { field, log: 'Validating form' });\n        return up.render(options);\n    }\n    function switcherValues(field) {\n        let value;\n        let meta;\n        if (e.matches(field, 'input[type=checkbox]')) {\n            if (field.checked) {\n                value = field.value;\n                meta = ':checked';\n            }\n            else {\n                meta = ':unchecked';\n            }\n        }\n        else if (e.matches(field, 'input[type=radio]')) {\n            const form = getContainer(field);\n            const groupName = field.getAttribute('name');\n            const checkedButton = form.querySelector(`input[type=radio]${e.attributeSelector('name', groupName)}:checked`);\n            if (checkedButton) {\n                meta = ':checked';\n                value = checkedButton.value;\n            }\n            else {\n                meta = ':unchecked';\n            }\n        }\n        else {\n            value = field.value;\n        }\n        const values = [];\n        if (u.isPresent(value)) {\n            values.push(value);\n            values.push(':present');\n        }\n        else {\n            values.push(':blank');\n        }\n        if (u.isPresent(meta)) {\n            values.push(meta);\n        }\n        return values;\n    }\n    function switchTargets(switcher, options = {}) {\n        const targetSelector = options.target || options.target || switcher.getAttribute('up-switch');\n        const form = getContainer(switcher);\n        targetSelector || up.fail(\"No switch target given for %o\", switcher);\n        const fieldValues = switcherValues(switcher);\n        for (let target of e.all(form, targetSelector)) {\n            switchTarget(target, fieldValues);\n        }\n    }\n    const switchTarget = up.mockable(function (target, fieldValues) {\n        let show;\n        fieldValues || (fieldValues = switcherValues(findSwitcherForTarget(target)));\n        let hideValues = target.getAttribute('up-hide-for');\n        if (hideValues) {\n            hideValues = u.splitValues(hideValues);\n            show = u.intersect(fieldValues, hideValues).length === 0;\n        }\n        else {\n            let showValues = target.getAttribute('up-show-for');\n            showValues = showValues ? u.splitValues(showValues) : [':present', ':checked'];\n            show = u.intersect(fieldValues, showValues).length > 0;\n        }\n        e.toggle(target, show);\n        target.classList.add('up-switched');\n    });\n    function findSwitcherForTarget(target) {\n        const form = getContainer(target);\n        const switchers = e.all(form, '[up-switch]');\n        const switcher = u.find(switchers, function (switcher) {\n            const targetSelector = switcher.getAttribute('up-switch');\n            return e.matches(target, targetSelector);\n        });\n        return switcher || up.fail('Could not find [up-switch] field for %o', target);\n    }\n    function getForm(elementOrTarget, fallbackSelector) {\n        const element = up.fragment.get(elementOrTarget);\n        return element.form || e.closest(element, 'form') || (fallbackSelector && e.closest(element, fallbackSelector));\n    }\n    function getContainer(element) {\n        return getForm(element, up.layer.anySelector());\n    }\n    function isField(element) {\n        return e.matches(element, fieldSelector());\n    }\n    function focusedField() {\n        return u.presence(document.activeElement, isField);\n    }\n    function isSubmittable(form) {\n        form = up.fragment.get(form);\n        return e.matches(form, fullSubmitSelector()) && !isSubmitDisabled(form);\n    }\n    function isSubmitDisabled(form) {\n        return e.matches(form, config.noSubmitSelectors.join(','));\n    }\n    up.on('submit', fullSubmitSelector, function (event, form) {\n        if (event.defaultPrevented || isSubmitDisabled(form)) {\n            return;\n        }\n        abortScheduledValidate?.();\n        up.event.halt(event);\n        up.log.muteUncriticalRejection(submit(form));\n    });\n    up.on('change', '[up-validate]', function (event) {\n        const field = findFields(event.target)[0];\n        abortScheduledValidate = u.abortableMicrotask(() => {\n            return up.log.muteUncriticalRejection(validate(field));\n        });\n    });\n    up.compiler('[up-switch]', (switcher) => {\n        switchTargets(switcher);\n    });\n    up.on('change', '[up-switch]', (_event, switcher) => {\n        switchTargets(switcher);\n    });\n    up.compiler('[up-show-for]:not(.up-switched), [up-hide-for]:not(.up-switched)', (element) => {\n        switchTarget(element);\n    });\n    up.compiler('[up-observe]', (formOrField) => observe(formOrField));\n    up.compiler('[up-autosubmit]', (formOrField) => autosubmit(formOrField));\n    up.on('up:framework:reset', reset);\n    return {\n        config,\n        submit,\n        submitOptions,\n        isSubmittable,\n        observe,\n        validate,\n        autosubmit,\n        fieldSelector,\n        fields: findFields,\n        focusedField,\n        switchTarget\n    };\n})();\nup.submit = up.form.submit;\nup.observe = up.form.observe;\nup.autosubmit = up.form.autosubmit;\nup.validate = up.form.validate;\n\n\n/***/ }),\n/* 90 */\n/***/ (() => {\n\nup.feedback = (function () {\n    const u = up.util;\n    const e = up.element;\n    const config = new up.Config(() => ({\n        currentClasses: ['up-current'],\n        navSelectors: ['[up-nav]', 'nav'],\n    }));\n    function reset() {\n        config.reset();\n        up.layer.root.feedbackLocation = null;\n    }\n    const CLASS_ACTIVE = 'up-active';\n    const SELECTOR_LINK = 'a, [up-href]';\n    function navSelector() {\n        return config.navSelectors.join(',');\n    }\n    function normalizeURL(url) {\n        if (url) {\n            return u.normalizeURL(url, { trailingSlash: false, hash: false });\n        }\n    }\n    function linkURLs(link) {\n        return link.upFeedbackURLs || (link.upFeedbackURLs = new up.LinkFeedbackURLs(link));\n    }\n    function updateFragment(fragment) {\n        const layerOption = { layer: up.layer.get(fragment) };\n        if (up.fragment.closest(fragment, navSelector(), layerOption)) {\n            const links = up.fragment.subtree(fragment, SELECTOR_LINK, layerOption);\n            updateLinks(links, layerOption);\n        }\n        else {\n            updateLinksWithinNavs(fragment, layerOption);\n        }\n    }\n    function updateLinksWithinNavs(fragment, options) {\n        const navs = up.fragment.subtree(fragment, navSelector(), options);\n        const links = u.flatMap(navs, nav => e.subtree(nav, SELECTOR_LINK));\n        updateLinks(links, options);\n    }\n    function getNormalizedLayerLocation(layer) {\n        return layer.feedbackLocation || normalizeURL(layer.location);\n    }\n    function updateLinks(links, options = {}) {\n        if (!links.length) {\n            return;\n        }\n        const layer = options.layer || up.layer.get(links[0]);\n        let layerLocation = getNormalizedLayerLocation(layer);\n        if (layerLocation) {\n            for (let link of links) {\n                const isCurrent = linkURLs(link).isCurrent(layerLocation);\n                for (let currentClass of config.currentClasses) {\n                    e.toggleClass(link, currentClass, isCurrent);\n                }\n                e.toggleAttr(link, 'aria-current', 'page', isCurrent);\n            }\n        }\n    }\n    function findActivatableArea(element) {\n        return e.ancestor(element, SELECTOR_LINK) || element;\n    }\n    function start(element) {\n        findActivatableArea(element).classList.add(CLASS_ACTIVE);\n    }\n    function stop(element) {\n        findActivatableArea(element).classList.remove(CLASS_ACTIVE);\n    }\n    function around(element, fn) {\n        start(element);\n        const result = fn();\n        u.always(result, () => stop(element));\n        return result;\n    }\n    function aroundForOptions(options, fn) {\n        let element;\n        let feedbackOpt = options.feedback;\n        if (feedbackOpt) {\n            if (u.isBoolean(feedbackOpt)) {\n                element = options.origin;\n            }\n            else {\n                element = feedbackOpt;\n            }\n        }\n        if (element) {\n            element = up.fragment.get(element);\n            return around(element, fn);\n        }\n        else {\n            return fn();\n        }\n    }\n    function updateLayerIfLocationChanged(layer) {\n        const processedLocation = layer.feedbackLocation;\n        const layerLocation = getNormalizedLayerLocation(layer.location);\n        if (!processedLocation || (processedLocation !== layerLocation)) {\n            layer.feedbackLocation = layerLocation;\n            updateLinksWithinNavs(layer.element, { layer });\n        }\n    }\n    function onBrowserLocationChanged() {\n        const frontLayer = up.layer.front;\n        if (frontLayer.showsLiveHistory()) {\n            updateLayerIfLocationChanged(frontLayer);\n        }\n    }\n    up.on('up:location:changed', (_event) => {\n        onBrowserLocationChanged();\n    });\n    up.on('up:fragment:inserted', (_event, newFragment) => {\n        updateFragment(newFragment);\n    });\n    up.on('up:layer:location:changed', (event) => {\n        updateLayerIfLocationChanged(event.layer);\n    });\n    up.on('up:framework:reset', reset);\n    return {\n        config,\n        start,\n        stop,\n        around,\n        aroundForOptions,\n        normalizeURL,\n    };\n})();\n\n\n/***/ }),\n/* 91 */\n/***/ (() => {\n\nup.radio = (function () {\n    const u = up.util;\n    const config = new up.Config(() => ({\n        hungrySelectors: ['[up-hungry]'],\n        pollInterval: 30000,\n        pollEnabled: 'auto'\n    }));\n    function reset() {\n        config.reset();\n    }\n    function hungrySelector() {\n        return config.hungrySelectors.join(',');\n    }\n    function startPolling(fragment, options = {}) {\n        up.FragmentPolling.forFragment(fragment).forceStart(options);\n    }\n    function stopPolling(element) {\n        up.FragmentPolling.forFragment(element).forceStop();\n    }\n    function shouldPoll(fragment) {\n        const setting = u.evalOption(config.pollEnabled, fragment);\n        if (setting === 'auto') {\n            return !document.hidden && !up.network.shouldReduceRequests() && up.layer.get(fragment)?.isFront?.();\n        }\n        return setting;\n    }\n    up.compiler('[up-poll]', (fragment) => {\n        up.FragmentPolling.forFragment(fragment).onPollAttributeObserved();\n    });\n    up.on('up:framework:reset', reset);\n    return {\n        config,\n        hungrySelector,\n        startPolling,\n        stopPolling,\n        shouldPoll,\n    };\n})();\n\n\n/***/ }),\n/* 92 */\n/***/ (() => {\n\nup.rails = (function () {\n    const u = up.util;\n    const e = up.element;\n    function isRails() {\n        return window._rails_loaded ||\n            window.Rails ||\n            window.jQuery?.rails;\n    }\n    return u.each(['method', 'confirm'], function (feature) {\n        const dataAttribute = `data-${feature}`;\n        const upAttribute = `up-${feature}`;\n        up.macro(`a[${dataAttribute}]`, function (link) {\n            if (isRails() && up.link.isFollowable(link)) {\n                e.setMissingAttr(link, upAttribute, link.getAttribute(dataAttribute));\n                return link.removeAttribute(dataAttribute);\n            }\n        });\n    });\n})();\n\n\n/***/ })\n/******/ \t]);\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n(() => {\n__webpack_require__(1);\n__webpack_require__(2);\n__webpack_require__(3);\n__webpack_require__(4);\n__webpack_require__(5);\n__webpack_require__(6);\n__webpack_require__(7);\n__webpack_require__(9);\n__webpack_require__(10);\n__webpack_require__(11);\n__webpack_require__(12);\n__webpack_require__(13);\n__webpack_require__(14);\n__webpack_require__(15);\n__webpack_require__(16);\n__webpack_require__(17);\n__webpack_require__(18);\n__webpack_require__(19);\n__webpack_require__(20);\n__webpack_require__(21);\n__webpack_require__(22);\n__webpack_require__(23);\n__webpack_require__(24);\n__webpack_require__(25);\n__webpack_require__(26);\n__webpack_require__(27);\n__webpack_require__(28);\n__webpack_require__(29);\n__webpack_require__(30);\n__webpack_require__(31);\n__webpack_require__(32);\n__webpack_require__(33);\n__webpack_require__(34);\n__webpack_require__(35);\n__webpack_require__(36);\n__webpack_require__(37);\n__webpack_require__(38);\n__webpack_require__(39);\n__webpack_require__(40);\n__webpack_require__(41);\n__webpack_require__(42);\n__webpack_require__(43);\n__webpack_require__(44);\n__webpack_require__(45);\n__webpack_require__(46);\n__webpack_require__(47);\n__webpack_require__(48);\n__webpack_require__(49);\n__webpack_require__(50);\n__webpack_require__(51);\n__webpack_require__(52);\n__webpack_require__(53);\n__webpack_require__(54);\n__webpack_require__(55);\n__webpack_require__(56);\n__webpack_require__(57);\n__webpack_require__(58);\n__webpack_require__(59);\n__webpack_require__(60);\n__webpack_require__(61);\n__webpack_require__(62);\n__webpack_require__(63);\n__webpack_require__(64);\n__webpack_require__(65);\n__webpack_require__(66);\n__webpack_require__(67);\n__webpack_require__(68);\n__webpack_require__(69);\n__webpack_require__(70);\n__webpack_require__(71);\n__webpack_require__(72);\n__webpack_require__(73);\n__webpack_require__(74);\n__webpack_require__(75);\n__webpack_require__(76);\n__webpack_require__(77);\n__webpack_require__(78);\n__webpack_require__(80);\n__webpack_require__(82);\n__webpack_require__(83);\n__webpack_require__(85);\n__webpack_require__(87);\n__webpack_require__(89);\n__webpack_require__(90);\n__webpack_require__(91);\n__webpack_require__(92);\nup.framework.onEvaled();\n\n})();\n\n/******/ })()\n;", "export default new class Environment {\n\n  toString() {\n    return document.body.getAttribute('data-environment')\n  }\n\n  get isTest() {\n    return this.toString() === 'test'\n  }\n\n  get isDevelopment() {\n    return this.toString() === 'development'\n  }\n\n}()\n", "import environment from '../util/environment'\n\nup.layer.config.modal.dismissable = ['key', 'button']\n\n// Some articles link to files which need to be handled without Unpoly. Note that this can not be `[href^=\"/system/\"]` because link hrefs are sometimes \"../../../system/...\" or similar.\nup.link.config.noFollowSelectors.push('[href*=\"/system/\"]')\n\nup.feedback.config.currentClasses.push('active')\n\nup.form.config.submitSelectors.push('form')\n\nup.motion.config.enabled = !environment.isTest\n\nup.radio.config.hungrySelectors.push(\n  'meta[name=\"csrf-token\"]',\n  'meta[name=\"csrf-param\"]',\n  'head meta[name=\"description\"]',\n  'head meta[name=\"robots\"]',\n  'head meta[name=\"googlebot\"]',\n  'head meta[name=\"bingbot\"]',\n  'head meta[property=\"og:locale\"]',\n  'head meta[property=\"og:type\"]',\n  'head meta[property=\"og:title\"]',\n  'head meta[property=\"og:description\"]',\n  'head meta[property=\"og:url\"]',\n  'head meta[property=\"og:image\"]',\n  'head meta[property=\"og:site_name\"]',\n  'head meta[property=\"article:modified_time\"]',\n)\n", "up.link.config.followSelectors.push('a[href]')\nup.link.config.instantSelectors.push('a[href]')\nup.link.config.noInstantSelectors.push('.btn:not(.btn-link)')\n", "import '../../shared/config/unpoly.js'\nimport '../../shared/config/unpoly_follow_all.js'\nimport '../../shared/config/unpoly.sass'\n\nup.link.config.preloadSelectors.push('a[href]')\nup.feedback.config.navSelectors = up.feedback.config.navSelectors.filter(selector => selector !== 'nav')\n", "\n        import * as module0 from './shared/components/autofocus.js';import * as module1 from './shared/components/content_loading.js';import * as module2 from './shared/components/data_confirm.js';import * as module3 from './shared/components/file_input.js';import * as module4 from './shared/components/flash_message.js';import * as module5 from './shared/components/input_type_number.js';import * as module6 from './shared/components/lazysizes.js'\n\n        const modules = [module0,module1,module2,module3,module4,module5,module6];\n\n        export default modules;\n        export const filenames = ['./shared/components/autofocus.js','./shared/components/content_loading.js','./shared/components/data_confirm.js','./shared/components/file_input.js','./shared/components/flash_message.js','./shared/components/input_type_number.js','./shared/components/lazysizes.js']\n      ", "class Application {\n\n  constructor() {\n    this.configurations = {}\n  }\n\n  configure(configKey, data) {\n    const config = new Configuration(data)\n    this.configurations[configKey] = config\n    return config\n  }\n\n  getConfiguration(configKey) {\n    return this.configurations[configKey]\n  }\n\n}\n\nclass Configuration {\n\n  constructor(data) {\n    for (const [key, value] of Object.entries(data)) {\n      Object.defineProperty(this, key, {\n        get: () => value,\n        configurable: true, // to allow Jasmine's spyOnProperty\n      })\n    }\n  }\n\n}\n\nexport default new Application()\n", "export default class Timeout {\n  constructor(callback, microseconds = 0) {\n    this.callback = callback\n    this.timerId = null\n    this.startedAt = null\n    this.initialMicroseconds = microseconds\n    this.microsecondsLeft = microseconds\n    this.paused = false\n    this.resume()\n  }\n\n  get percent() {\n    const percent = Math.round(100 * this.elapsed / this.initialMicroseconds)\n    return Math.max(0, Math.min(100, percent))\n  }\n\n  get percentRemaining() {\n    return 100 - this.percent\n  }\n\n  get elapsed() {\n    return this.initialMicroseconds - this.remaining\n  }\n\n  get remaining() {\n    return Math.max(0, this.microsecondsLeft - this._getMicrosecondsSinceLastStarted())\n  }\n\n  pause() {\n    this.clear()\n    this.microsecondsLeft -= this._getMicrosecondsSinceLastStarted()\n    this.paused = true\n  }\n\n  resume() {\n    this.clear()\n    this.startedAt = new Date()\n    this.timerId = window.setTimeout(this.callback, this.microsecondsLeft)\n    this.paused = false\n  }\n\n  clear() {\n    window.clearTimeout(this.timerId)\n  }\n\n  _getMicrosecondsSinceLastStarted() {\n    return this.paused ? 0 : new Date() - this.startedAt\n  }\n}\n", "import application from '../util/application'\nimport environment from '../util/environment'\nimport Timeout from '../util/timeout'\n\nconst config = application.configure('[flash-message]', {\n  timeoutDelay: 5000,\n  updateFrequency: 100,\n})\n\nup.compiler('[flash-message]', (element) => {\n  const indicator = element.querySelector('[flash-message--timer-indicator]')\n  const closeButton = element.querySelector('[flash-message--close]')\n\n  function updateIndicator() {\n    const percent = removeTimer ? removeTimer.percent : 0\n\n    if (!environment.isTest) {\n      up.element.setStyle(indicator, {\n        transition: `width ${config.updateFrequency}ms linear`,\n        width: `${percent}%`,\n      })\n    }\n  }\n\n  function removeAutomatically() {\n    if (environment.isTest) {\n      // We don't want to remove flashes automatically in feature tests because\n      // - tests might not see flashes if they are slow,\n      // - it could cause flickering behavior if flashes cover elements only sometimes.\n    } else {\n      updateIndicator()\n      remove()\n    }\n  }\n\n  function remove() {\n    window.clearInterval(updateIndicatorInterval)\n    removeTimer.clear()\n    up.animate(element, 'move-to-top').then(() => { element.remove() })\n  }\n\n  const removeTimer = new Timeout(removeAutomatically, config.timeoutDelay)\n  const updateIndicatorInterval = window.setInterval(updateIndicator, config.updateFrequency)\n\n  updateIndicator()\n  element.addEventListener('mouseenter', () => { removeTimer.pause() })\n  element.addEventListener('mouseleave', () => { removeTimer.resume() })\n  closeButton.addEventListener('click', remove)\n\n  return remove\n})\n", "import 'lazysizes'\nimport 'lazysizes/plugins/parent-fit/ls.parent-fit'\n\nfunction revealSource(target) {\n  const imageUrl = target.getAttribute('lazy-src')\n\n  if (imageUrl) {\n    target.src = imageUrl\n    target.classList.add('lazyloaded')\n  }\n}\n\nfunction revealBackground(target) {\n  const backgroundImageUrl = target.getAttribute('lazy-bg')\n  if (backgroundImageUrl) {\n    target.style.backgroundImage = `url(\"${backgroundImageUrl}\")`\n    target.classList.add('lazy-bg-loaded')\n  }\n}\n\ndocument.addEventListener('lazybeforeunveil', (event) => {\n  const target = event.target\n  revealSource(target)\n  revealBackground(target)\n})\n", "\n        import * as module0 from './frontend/components/events_page.js';import * as module1 from './frontend/components/filterable_list.js';import * as module2 from './frontend/components/lightbox_gallery.js';import * as module3 from './frontend/components/lightbox_image.js';import * as module4 from './frontend/components/search_form.js';import * as module5 from './frontend/components/track_page_view.js'\n\n        const modules = [module0,module1,module2,module3,module4,module5];\n\n        export default modules;\n        export const filenames = ['./frontend/components/events_page.js','./frontend/components/filterable_list.js','./frontend/components/lightbox_gallery.js','./frontend/components/lightbox_image.js','./frontend/components/search_form.js','./frontend/components/track_page_view.js']\n      ", "/** @typedef {import('../photoswipe.js').Point} Point */\r\n\r\n/** @typedef {undefined | null | false | '' | 0} Falsy */\r\n/** @typedef {keyof HTMLElementTagNameMap} HTMLElementTagName */\r\n\r\n/**\r\n * @template {HTMLElementTagName | Falsy} [T=\"div\"]\r\n * @template {Node | undefined} [NodeToAppendElementTo=undefined]\r\n * @param {string=} className\r\n * @param {T=} [tagName]\r\n * @param {NodeToAppendElementTo=} appendToEl\r\n * @returns {T extends HTMLElementTagName ? HTMLElementTagNameMap[T] : HTMLElementTagNameMap['div']}\r\n */\r\nexport function createElement(className, tagName, appendToEl) {\r\n  const el = document.createElement(tagName || 'div');\r\n  if (className) {\r\n    el.className = className;\r\n  }\r\n  if (appendToEl) {\r\n    appendToEl.appendChild(el);\r\n  }\r\n  // @ts-expect-error\r\n  return el;\r\n}\r\n\r\n/**\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function equalizePoints(p1, p2) {\r\n  p1.x = p2.x;\r\n  p1.y = p2.y;\r\n  if (p2.id !== undefined) {\r\n    p1.id = p2.id;\r\n  }\r\n  return p1;\r\n}\r\n\r\n/**\r\n * @param {Point} p\r\n */\r\nexport function roundPoint(p) {\r\n  p.x = Math.round(p.x);\r\n  p.y = Math.round(p.y);\r\n}\r\n\r\n/**\r\n * Returns distance between two points.\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function getDistanceBetween(p1, p2) {\r\n  const x = Math.abs(p1.x - p2.x);\r\n  const y = Math.abs(p1.y - p2.y);\r\n  return Math.sqrt((x * x) + (y * y));\r\n}\r\n\r\n/**\r\n * Whether X and Y positions of points are qual\r\n *\r\n * @param {Point} p1\r\n * @param {Point} p2\r\n */\r\nexport function pointsEqual(p1, p2) {\r\n  return p1.x === p2.x && p1.y === p2.y;\r\n}\r\n\r\n/**\r\n * The float result between the min and max values.\r\n *\r\n * @param {number} val\r\n * @param {number} min\r\n * @param {number} max\r\n */\r\nexport function clamp(val, min, max) {\r\n  return Math.min(Math.max(val, min), max);\r\n}\r\n\r\n/**\r\n * Get transform string\r\n *\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nexport function toTransformString(x, y, scale) {\r\n  let propValue = 'translate3d('\r\n    + x + 'px,' + (y || 0) + 'px'\r\n    + ',0)';\r\n\r\n  if (scale !== undefined) {\r\n    propValue += ' scale3d('\r\n      + scale + ',' + scale\r\n      + ',1)';\r\n  }\r\n\r\n  return propValue;\r\n}\r\n\r\n/**\r\n * Apply transform:translate(x, y) scale(scale) to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {number} x\r\n * @param {number=} y\r\n * @param {number=} scale\r\n */\r\nexport function setTransform(el, x, y, scale) {\r\n  el.style.transform = toTransformString(x, y, scale);\r\n}\r\n\r\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\r\n\r\n/**\r\n * Apply CSS transition to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string=} prop CSS property to animate\r\n * @param {number=} duration in ms\r\n * @param {string=} ease CSS easing function\r\n */\r\nexport function setTransitionStyle(el, prop, duration, ease) {\r\n  // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\r\n  // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\r\n  // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\r\n  el.style.transition = prop\r\n    ? (prop + ' ' + duration + 'ms ' + (ease || defaultCSSEasing))\r\n    : 'none';\r\n}\r\n\r\n/**\r\n * Apply width and height CSS properties to element\r\n *\r\n * @param {HTMLElement} el\r\n * @param {string | number} w\r\n * @param {string | number} h\r\n */\r\nexport function setWidthHeight(el, w, h) {\r\n  el.style.width = (typeof w === 'number') ? (w + 'px') : w;\r\n  el.style.height = (typeof h === 'number') ? (h + 'px') : h;\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} el\r\n */\r\nexport function removeTransitionStyle(el) {\r\n  setTransitionStyle(el);\r\n}\r\n\r\n/**\r\n * @param {HTMLImageElement} img\r\n * @returns {Promise<HTMLImageElement | void>}\r\n */\r\nexport function decodeImage(img) {\r\n  if ('decode' in img) {\r\n    return img.decode();\r\n  }\r\n\r\n  if (img.complete) {\r\n    return Promise.resolve(img);\r\n  }\r\n\r\n  return new Promise((resolve, reject) => {\r\n    img.onload = () => resolve(img);\r\n    img.onerror = reject;\r\n  });\r\n}\r\n\r\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\r\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\r\nexport const LOAD_STATE = {\r\n  IDLE: 'idle',\r\n  LOADING: 'loading',\r\n  LOADED: 'loaded',\r\n  ERROR: 'error',\r\n};\r\n\r\n\r\n/**\r\n * Check if click or keydown event was dispatched\r\n * with a special key or via mouse wheel.\r\n *\r\n * @param {MouseEvent | KeyboardEvent} e\r\n */\r\nexport function specialKeyUsed(e) {\r\n  if (e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) {\r\n    return true;\r\n  }\r\n}\r\n\r\n/**\r\n * Parse `gallery` or `children` options.\r\n *\r\n * @param {HTMLElement | NodeListOf<HTMLElement> | string} option\r\n * @param {string=} legacySelector\r\n * @param {HTMLElement | Document} [parent]\r\n * @returns HTMLElement[]\r\n */\r\nexport function getElementsFromOption(option, legacySelector, parent = document) {\r\n  /** @type {HTMLElement[]} */\r\n  let elements = [];\r\n\r\n  if (option instanceof Element) {\r\n    elements = [option];\r\n  } else if (option instanceof NodeList || Array.isArray(option)) {\r\n    elements = Array.from(option);\r\n  } else {\r\n    const selector = typeof option === 'string' ? option : legacySelector;\r\n    if (selector) {\r\n      elements = Array.from(parent.querySelectorAll(selector));\r\n    }\r\n  }\r\n\r\n  return elements;\r\n}\r\n\r\n/**\r\n * Check if variable is PhotoSwipe class\r\n *\r\n * @param {any} fn\r\n */\r\nexport function isPswpClass(fn) {\r\n  return typeof fn === 'function'\r\n    && fn.prototype\r\n    && fn.prototype.goTo;\r\n}\r\n", "/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\r\n/** @typedef {import('../slide/content.js').default} ContentDefault */\r\n/** @typedef {import('../slide/slide.js').default} Slide */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\r\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\r\n\r\n/**\r\n * Allow adding an arbitrary props to the Content\r\n * https://photoswipe.com/custom-content/#using-webp-image-format\r\n * @typedef {ContentDefault & Record<string, any>} Content\r\n */\r\n/** @typedef {{ x?: number; y?: number }} Point */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\r\n *\r\n *\r\n * https://photoswipe.com/adding-ui-elements/\r\n *\r\n * @prop {undefined} uiRegister\r\n * @prop {{ data: UIElementData }} uiElementCreate\r\n *\r\n *\r\n * https://photoswipe.com/events/#initialization-events\r\n *\r\n * @prop {undefined} beforeOpen\r\n * @prop {undefined} firstUpdate\r\n * @prop {undefined} initialLayout\r\n * @prop {undefined} change\r\n * @prop {undefined} afterInit\r\n * @prop {undefined} bindEvents\r\n *\r\n *\r\n * https://photoswipe.com/events/#opening-or-closing-transition-events\r\n *\r\n * @prop {undefined} openingAnimationStart\r\n * @prop {undefined} openingAnimationEnd\r\n * @prop {undefined} closingAnimationStart\r\n * @prop {undefined} closingAnimationEnd\r\n *\r\n *\r\n * https://photoswipe.com/events/#closing-events\r\n *\r\n * @prop {undefined} close\r\n * @prop {undefined} destroy\r\n *\r\n *\r\n * https://photoswipe.com/events/#pointer-and-gesture-events\r\n *\r\n * @prop {{ originalEvent: PointerEvent }} pointerDown\r\n * @prop {{ originalEvent: PointerEvent }} pointerMove\r\n * @prop {{ originalEvent: PointerEvent }} pointerUp\r\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\r\n * @prop {{ panY: number }} verticalDrag can be default prevented\r\n *\r\n *\r\n * https://photoswipe.com/events/#slide-content-events\r\n *\r\n * @prop {{ content: Content }} contentInit\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\r\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\r\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\r\n * @prop {{ content: Content; slide: Slide }} loadError\r\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\r\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\r\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\r\n * @prop {{ content: Content }} contentAppend can be default prevented\r\n * @prop {{ content: Content }} contentActivate can be default prevented\r\n * @prop {{ content: Content }} contentDeactivate can be default prevented\r\n * @prop {{ content: Content }} contentRemove can be default prevented\r\n * @prop {{ content: Content }} contentDestroy can be default prevented\r\n *\r\n *\r\n * undocumented\r\n *\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\r\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\r\n *\r\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\r\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\r\n * @prop {{ slide: Slide }} firstZoomPan\r\n * @prop {{ slide: Slide, data: SlideData, index: number }} gettingData\r\n * @prop {undefined} beforeResize\r\n * @prop {undefined} resize\r\n * @prop {undefined} viewportSize\r\n * @prop {undefined} updateScrollOffset\r\n * @prop {{ slide: Slide }} slideInit\r\n * @prop {{ slide: Slide }} afterSetContent\r\n * @prop {{ slide: Slide }} slideLoad\r\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\r\n * @prop {{ slide: Slide }} appendHeavyContent\r\n * @prop {{ slide: Slide }} slideActivate\r\n * @prop {{ slide: Slide }} slideDeactivate\r\n * @prop {{ slide: Slide }} slideDestroy\r\n * @prop {{ destZoomLevel: number, centerPoint: Point, transitionDuration: number | false }} beforeZoomTo\r\n * @prop {{ slide: Slide }} zoomPanUpdate\r\n * @prop {{ slide: Slide }} initialZoomPan\r\n * @prop {{ slide: Slide }} calcSlideSize\r\n * @prop {undefined} resolutionChanged\r\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\r\n * @prop {{ content: Content }} contentAppendImage can be default prevented\r\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\r\n * @prop {undefined} lazyLoad\r\n * @prop {{ slide: Slide }} calcBounds\r\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\r\n *\r\n *\r\n * legacy\r\n *\r\n * @prop {undefined} init\r\n * @prop {undefined} initialZoomIn\r\n * @prop {undefined} initialZoomOut\r\n * @prop {undefined} initialZoomInEnd\r\n * @prop {undefined} initialZoomOutEnd\r\n * @prop {{ dataSource: DataSource, numItems: number }} numItems\r\n * @prop {{ itemData: SlideData; index: number }} itemData\r\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\r\n */\r\n\r\n/**\r\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\r\n *\r\n * @prop {(numItems: number, dataSource: DataSource) => number} numItems\r\n * Modify the total amount of slides. Example on Data sources page.\r\n * https://photoswipe.com/filters/#numitems\r\n *\r\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\r\n * Modify slide item data. Example on Data sources page.\r\n * https://photoswipe.com/filters/#itemdata\r\n *\r\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\r\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\r\n * https://photoswipe.com/filters/#domitemdata\r\n *\r\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\r\n * Modify clicked gallery item index.\r\n * https://photoswipe.com/filters/#clickedindex\r\n *\r\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\r\n * Modify placeholder image source.\r\n * https://photoswipe.com/filters/#placeholdersrc\r\n *\r\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\r\n * Modify if the content is currently loading.\r\n * https://photoswipe.com/filters/#iscontentloading\r\n *\r\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\r\n * Modify if the content can be zoomed.\r\n * https://photoswipe.com/filters/#iscontentzoomable\r\n *\r\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\r\n * Modify if the placeholder should be used for the content.\r\n * https://photoswipe.com/filters/#usecontentplaceholder\r\n *\r\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\r\n * Modify if the placeholder should be kept after the content is loaded.\r\n * https://photoswipe.com/filters/#iskeepingplaceholder\r\n *\r\n *\r\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\r\n * Modify an element when the content has error state (for example, if image cannot be loaded).\r\n * https://photoswipe.com/filters/#contenterrorelement\r\n *\r\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\r\n * Modify a UI element that's being created.\r\n * https://photoswipe.com/filters/#uielement\r\n *\r\n * @prop {(thumbnail: HTMLElement, itemData: SlideData, index: number) => HTMLElement} thumbEl\r\n * Modify the thubmnail element from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbel\r\n *\r\n * @prop {(thumbBounds: Bounds, itemData: SlideData, index: number) => Bounds} thumbBounds\r\n * Modify the thubmnail bounds from which opening zoom animation starts or ends.\r\n * https://photoswipe.com/filters/#thumbbounds\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeFiltersMap} T\r\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter<T>\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\r\n */\r\n\r\n/**\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback<T>\r\n */\r\n\r\n/**\r\n * Base PhotoSwipe event object\r\n *\r\n * @template {keyof PhotoSwipeEventsMap} T\r\n */\r\nclass PhotoSwipeEvent {\r\n  /**\r\n   * @param {T} type\r\n   * @param {PhotoSwipeEventsMap[T]} [details]\r\n   */\r\n  constructor(type, details) {\r\n    this.type = type;\r\n    if (details) {\r\n      Object.assign(this, details);\r\n    }\r\n  }\r\n\r\n  preventDefault() {\r\n    this.defaultPrevented = true;\r\n  }\r\n}\r\n\r\n/**\r\n * PhotoSwipe base class that can listen and dispatch for events.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\r\n */\r\nclass Eventable {\r\n  constructor() {\r\n    /**\r\n     * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\r\n     */\r\n    this._listeners = {};\r\n\r\n    /**\r\n     * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\r\n     */\r\n    this._filters = {};\r\n\r\n    /** @type {PhotoSwipe=} */\r\n    this.pswp = undefined;\r\n\r\n    /** @type {PhotoSwipeOptions} */\r\n    this.options = undefined;\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeFiltersMap[T]} fn\r\n   * @param {number} priority\r\n   */\r\n  addFilter(name, fn, priority = 100) {\r\n    if (!this._filters[name]) {\r\n      this._filters[name] = [];\r\n    }\r\n\r\n    this._filters[name].push({ fn, priority });\r\n    this._filters[name].sort((f1, f2) => f1.priority - f2.priority);\r\n\r\n    if (this.pswp) {\r\n      this.pswp.addFilter(name, fn, priority);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeFiltersMap[T]} fn\r\n   */\r\n  removeFilter(name, fn) {\r\n    if (this._filters[name]) {\r\n      // @ts-expect-error\r\n      this._filters[name] = this._filters[name].filter(filter => (filter.fn !== fn));\r\n    }\r\n\r\n    if (this.pswp) {\r\n      this.pswp.removeFilter(name, fn);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeFiltersMap} T\r\n   * @param {T} name\r\n   * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\r\n   * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\r\n   */\r\n  applyFilters(name, ...args) {\r\n    if (this._filters[name]) {\r\n      this._filters[name].forEach((filter) => {\r\n        // @ts-expect-error\r\n        args[0] = filter.fn.apply(this, args);\r\n      });\r\n    }\r\n    return args[0];\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {EventCallback<T>} fn\r\n   */\r\n  on(name, fn) {\r\n    if (!this._listeners[name]) {\r\n      this._listeners[name] = [];\r\n    }\r\n    this._listeners[name].push(fn);\r\n\r\n    // When binding events to lightbox,\r\n    // also bind events to PhotoSwipe Core,\r\n    // if it's open.\r\n    if (this.pswp) {\r\n      this.pswp.on(name, fn);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {EventCallback<T>} fn\r\n   */\r\n  off(name, fn) {\r\n    if (this._listeners[name]) {\r\n      // @ts-expect-error\r\n      this._listeners[name] = this._listeners[name].filter(listener => (fn !== listener));\r\n    }\r\n\r\n    if (this.pswp) {\r\n      this.pswp.off(name, fn);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @template {keyof PhotoSwipeEventsMap} T\r\n   * @param {T} name\r\n   * @param {PhotoSwipeEventsMap[T]} [details]\r\n   * @returns {AugmentedEvent<T>}\r\n   */\r\n  dispatch(name, details) {\r\n    if (this.pswp) {\r\n      return this.pswp.dispatch(name, details);\r\n    }\r\n\r\n    const event = /** @type {AugmentedEvent<T>} */ (new PhotoSwipeEvent(name, details));\r\n\r\n    if (!this._listeners) {\r\n      return event;\r\n    }\r\n\r\n    if (this._listeners[name]) {\r\n      this._listeners[name].forEach((listener) => {\r\n        listener.call(this, event);\r\n      });\r\n    }\r\n\r\n    return event;\r\n  }\r\n}\r\n\r\nexport default Eventable;\r\n", "import { createElement, setWidthHeight, toTransformString } from '../util/util.js';\r\n\r\nclass Placeholder {\r\n  /**\r\n   * @param {string | false} imageSrc\r\n   * @param {HTMLElement} container\r\n   */\r\n  constructor(imageSrc, container) {\r\n    // Create placeholder\r\n    // (stretched thumbnail or simple div behind the main image)\r\n    this.element = createElement(\r\n      'pswp__img pswp__img--placeholder',\r\n      imageSrc ? 'img' : '',\r\n      container\r\n    );\r\n\r\n    if (imageSrc) {\r\n      /** @type {HTMLImageElement} */\r\n      (this.element).decoding = 'async';\r\n      /** @type {HTMLImageElement} */\r\n      (this.element).alt = '';\r\n      /** @type {HTMLImageElement} */\r\n      (this.element).src = imageSrc;\r\n      this.element.setAttribute('role', 'presentation');\r\n    }\r\n\r\n    this.element.setAttribute('aria-hiden', 'true');\r\n  }\r\n\r\n  /**\r\n   * @param {number} width\r\n   * @param {number} height\r\n   */\r\n  setDisplayedSize(width, height) {\r\n    if (!this.element) {\r\n      return;\r\n    }\r\n\r\n    if (this.element.tagName === 'IMG') {\r\n      // Use transform scale() to modify img placeholder size\r\n      // (instead of changing width/height directly).\r\n      // This helps with performance, specifically in iOS15 Safari.\r\n      setWidthHeight(this.element, 250, 'auto');\r\n      this.element.style.transformOrigin = '0 0';\r\n      this.element.style.transform = toTransformString(0, 0, width / 250);\r\n    } else {\r\n      setWidthHeight(this.element, width, height);\r\n    }\r\n  }\r\n\r\n  destroy() {\r\n    if (this.element.parentNode) {\r\n      this.element.remove();\r\n    }\r\n    this.element = null;\r\n  }\r\n}\r\n\r\nexport default Placeholder;\r\n", "import { createElement, LOAD_STATE, setWidthHeight } from '../util/util.js';\r\nimport Placeholder from './placeholder.js';\r\n\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../util/util.js').LoadState} LoadState */\r\n\r\nclass Content {\r\n  /**\r\n   * @param {SlideData} itemData Slide data\r\n   * @param {PhotoSwipe} instance PhotoSwipe or PhotoSwipeLightbox instance\r\n   * @param {number} index\r\n   */\r\n  constructor(itemData, instance, index) {\r\n    this.instance = instance;\r\n    this.data = itemData;\r\n    this.index = index;\r\n\r\n    /** @type {HTMLImageElement | HTMLDivElement} */\r\n    this.element = undefined;\r\n\r\n    this.width = Number(this.data.w) || Number(this.data.width) || 0;\r\n    this.height = Number(this.data.h) || Number(this.data.height) || 0;\r\n\r\n    this.isAttached = false;\r\n    this.hasSlide = false;\r\n    /** @type {LoadState} */\r\n    this.state = LOAD_STATE.IDLE;\r\n\r\n    if (this.data.type) {\r\n      this.type = this.data.type;\r\n    } else if (this.data.src) {\r\n      this.type = 'image';\r\n    } else {\r\n      this.type = 'html';\r\n    }\r\n\r\n    this.instance.dispatch('contentInit', { content: this });\r\n  }\r\n\r\n  removePlaceholder() {\r\n    if (this.placeholder && !this.keepPlaceholder()) {\r\n      // With delay, as image might be loaded, but not rendered\r\n      setTimeout(() => {\r\n        if (this.placeholder) {\r\n          this.placeholder.destroy();\r\n          this.placeholder = null;\r\n        }\r\n      }, 500);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Preload content\r\n   *\r\n   * @param {boolean=} isLazy\r\n   * @param {boolean=} reload\r\n   */\r\n  load(isLazy, reload) {\r\n    if (!this.placeholder && this.slide && this.usePlaceholder()) {\r\n      // use   -based placeholder only for the first slide,\r\n      // as rendering (even small stretched thumbnail) is an expensive operation\r\n      const placeholderSrc = this.instance.applyFilters(\r\n        'placeholderSrc',\r\n        (this.data.msrc && this.slide.isFirstSlide) ? this.data.msrc : false,\r\n        this\r\n      );\r\n      this.placeholder = new Placeholder(\r\n        placeholderSrc,\r\n        this.slide.container\r\n      );\r\n    }\r\n\r\n    if (this.element && !reload) {\r\n      return;\r\n    }\r\n\r\n    if (this.instance.dispatch('contentLoad', { content: this, isLazy }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.isImageContent()) {\r\n      this.loadImage(isLazy);\r\n    } else {\r\n      this.element = createElement('pswp__content');\r\n      this.element.innerHTML = this.data.html || '';\r\n    }\r\n\r\n    if (reload && this.slide) {\r\n      this.slide.updateContentSize(true);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Preload image\r\n   *\r\n   * @param {boolean} isLazy\r\n   */\r\n  loadImage(isLazy) {\r\n    const imageElement = createElement('pswp__img', 'img');\r\n    this.element = imageElement;\r\n\r\n    if (this.instance.dispatch('contentLoadImage', { content: this, isLazy }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.data.srcset) {\r\n      imageElement.srcset = this.data.srcset;\r\n    }\r\n\r\n    imageElement.src = this.data.src;\r\n\r\n    imageElement.alt = this.data.alt || '';\r\n\r\n    this.state = LOAD_STATE.LOADING;\r\n\r\n    if (imageElement.complete) {\r\n      this.onLoaded();\r\n    } else {\r\n      imageElement.onload = () => {\r\n        this.onLoaded();\r\n      };\r\n\r\n      imageElement.onerror = () => {\r\n        this.onError();\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Assign slide to content\r\n   *\r\n   * @param {Slide} slide\r\n   */\r\n  setSlide(slide) {\r\n    this.slide = slide;\r\n    this.hasSlide = true;\r\n    this.instance = slide.pswp;\r\n\r\n    // todo: do we need to unset slide?\r\n  }\r\n\r\n  /**\r\n   * Content load success handler\r\n   */\r\n  onLoaded() {\r\n    this.state = LOAD_STATE.LOADED;\r\n\r\n    if (this.slide) {\r\n      this.instance.dispatch('loadComplete', { slide: this.slide, content: this });\r\n\r\n      // if content is reloaded\r\n      if (this.slide.isActive\r\n          && this.slide.heavyAppended\r\n          && !this.element.parentNode) {\r\n        this.slide.container.innerHTML = '';\r\n        this.append();\r\n        this.slide.updateContentSize(true);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Content load error handler\r\n   */\r\n  onError() {\r\n    this.state = LOAD_STATE.ERROR;\r\n\r\n    if (this.slide) {\r\n      this.displayError();\r\n      this.instance.dispatch('loadComplete', { slide: this.slide, isError: true, content: this });\r\n      this.instance.dispatch('loadError', { slide: this.slide, content: this });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @returns {Boolean} If the content is currently loading\r\n   */\r\n  isLoading() {\r\n    return this.instance.applyFilters(\r\n      'isContentLoading',\r\n      this.state === LOAD_STATE.LOADING,\r\n      this\r\n    );\r\n  }\r\n\r\n  isError() {\r\n    return this.state === LOAD_STATE.ERROR;\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If the content is image\r\n   */\r\n  isImageContent() {\r\n    return this.type === 'image';\r\n  }\r\n\r\n  /**\r\n   * Update content size\r\n   *\r\n   * @param {Number} width\r\n   * @param {Number} height\r\n   */\r\n  setDisplayedSize(width, height) {\r\n    if (!this.element) {\r\n      return;\r\n    }\r\n\r\n    if (this.placeholder) {\r\n      this.placeholder.setDisplayedSize(width, height);\r\n    }\r\n\r\n    // eslint-disable-next-line max-len\r\n    if (this.instance.dispatch('contentResize', { content: this, width, height }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    setWidthHeight(this.element, width, height);\r\n\r\n    if (this.isImageContent() && !this.isError()) {\r\n      const image = /** @type HTMLImageElement */ (this.element);\r\n\r\n      // Handle srcset sizes attribute.\r\n      //\r\n      // Never lower quality, if it was increased previously.\r\n      // Chrome does this automatically, Firefox and Safari do not,\r\n      // so we store largest used size in dataset.\r\n      if (image.srcset\r\n          // eslint-disable-next-line max-len\r\n          && (!image.dataset.largestUsedSize || width > parseInt(image.dataset.largestUsedSize, 10))) {\r\n        image.sizes = width + 'px';\r\n        image.dataset.largestUsedSize = String(width);\r\n      }\r\n\r\n      if (this.slide) {\r\n        // eslint-disable-next-line max-len\r\n        this.instance.dispatch('imageSizeChange', { slide: this.slide, width, height, content: this });\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If the content can be zoomed\r\n   */\r\n  isZoomable() {\r\n    return this.instance.applyFilters(\r\n      'isContentZoomable',\r\n      this.isImageContent() && (this.state !== LOAD_STATE.ERROR),\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If content should use a placeholder (from msrc by default)\r\n   */\r\n  usePlaceholder() {\r\n    return this.instance.applyFilters(\r\n      'useContentPlaceholder',\r\n      this.isImageContent(),\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Preload content with lazy-loading param\r\n   */\r\n  lazyLoad() {\r\n    if (this.instance.dispatch('contentLazyLoad', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    this.load(true);\r\n  }\r\n\r\n  /**\r\n   * @returns {boolean} If placeholder should be kept after content is loaded\r\n   */\r\n  keepPlaceholder() {\r\n    return this.instance.applyFilters(\r\n      'isKeepingPlaceholder',\r\n      this.isLoading(),\r\n      this\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Destroy the content\r\n   */\r\n  destroy() {\r\n    this.hasSlide = false;\r\n    this.slide = null;\r\n\r\n    if (this.instance.dispatch('contentDestroy', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    this.remove();\r\n\r\n    if (this.isImageContent() && this.element) {\r\n      this.element.onload = null;\r\n      this.element.onerror = null;\r\n      this.element = null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Display error message\r\n   */\r\n  displayError() {\r\n    if (this.slide) {\r\n      /** @type {HTMLElement} */\r\n      let errorMsgEl = createElement('pswp__error-msg');\r\n      errorMsgEl.innerText = this.instance.options.errorMsg;\r\n      errorMsgEl = this.instance.applyFilters(\r\n        'contentErrorElement',\r\n        errorMsgEl,\r\n        this\r\n      );\r\n      this.element = createElement('pswp__content pswp__error-msg-container');\r\n      this.element.appendChild(errorMsgEl);\r\n      this.slide.container.innerHTML = '';\r\n      this.slide.container.appendChild(this.element);\r\n      this.slide.updateContentSize(true);\r\n      this.removePlaceholder();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Append the content\r\n   */\r\n  append() {\r\n    this.isAttached = true;\r\n\r\n    if (this.state === LOAD_STATE.ERROR) {\r\n      this.displayError();\r\n      return;\r\n    }\r\n\r\n    if (this.instance.dispatch('contentAppend', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.isImageContent()) {\r\n      // Use decode() on nearby slides\r\n      //\r\n      // Nearby slide images are in DOM and not hidden via display:none.\r\n      // However, they are placed offscreen (to the left and right side).\r\n      //\r\n      // Some browsers do not composite the image until it's actually visible,\r\n      // using decode() helps.\r\n      //\r\n      // You might ask \"why dont you just decode() and then append all images\",\r\n      // that's because I want to show image before it's fully loaded,\r\n      // as browser can render parts of image while it is loading.\r\n      if (this.slide\r\n          && !this.slide.isActive\r\n          && ('decode' in this.element)) {\r\n        this.isDecoding = true;\r\n        // Make sure that we start decoding on the next frame\r\n        requestAnimationFrame(() => {\r\n          // element might change\r\n          if (this.element && this.element.tagName === 'IMG') {\r\n            /** @type {HTMLImageElement} */\r\n            (this.element).decode().then(() => {\r\n              this.isDecoding = false;\r\n              requestAnimationFrame(() => {\r\n                this.appendImage();\r\n              });\r\n            }).catch(() => {\r\n              this.isDecoding = false;\r\n            });\r\n          }\r\n        });\r\n      } else {\r\n        if (this.placeholder\r\n          // eslint-disable-next-line max-len\r\n          && (this.state === LOAD_STATE.LOADED || /** @type {LoadState} */ (this.state) === LOAD_STATE.ERROR)\r\n        ) {\r\n          this.removePlaceholder();\r\n        }\r\n        this.appendImage();\r\n      }\r\n    } else if (this.element && !this.element.parentNode) {\r\n      this.slide.container.appendChild(this.element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Activate the slide,\r\n   * active slide is generally the current one,\r\n   * meaning the user can see it.\r\n   */\r\n  activate() {\r\n    if (this.instance.dispatch('contentActivate', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.slide) {\r\n      if (this.isImageContent() && this.isDecoding) {\r\n        // add image to slide when it becomes active,\r\n        // even if it's not finished decoding\r\n        this.appendImage();\r\n      } else if (this.isError()) {\r\n        this.load(false, true); // try to reload\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Deactivate the content\r\n   */\r\n  deactivate() {\r\n    this.instance.dispatch('contentDeactivate', { content: this });\r\n  }\r\n\r\n\r\n  /**\r\n   * Remove the content from DOM\r\n   */\r\n  remove() {\r\n    this.isAttached = false;\r\n\r\n    if (this.instance.dispatch('contentRemove', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    if (this.element && this.element.parentNode) {\r\n      this.element.remove();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Append the image content to slide container\r\n   */\r\n  appendImage() {\r\n    if (!this.isAttached) {\r\n      return;\r\n    }\r\n\r\n    if (this.instance.dispatch('contentAppendImage', { content: this }).defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    // ensure that element exists and is not already appended\r\n    if (this.slide && this.element && !this.element.parentNode) {\r\n      this.slide.container.appendChild(this.element);\r\n\r\n      if (this.placeholder\r\n        && (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR)) {\r\n        this.removePlaceholder();\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nexport default Content;\r\n", "import Eventable from './eventable.js';\r\nimport {\r\n  getElementsFromOption\r\n} from '../util/util.js';\r\nimport Content from '../slide/content.js';\r\n\r\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\r\n/** @typedef {import(\"../photoswipe.js\").PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\r\n\r\n/**\r\n * PhotoSwipe base class that can retrieve data about every slide.\r\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\r\n */\r\nclass PhotoSwipeBase extends Eventable {\r\n  /**\r\n   * Get total number of slides\r\n   *\r\n   * @returns {number}\r\n   */\r\n  getNumItems() {\r\n    let numItems;\r\n    const { dataSource } = this.options;\r\n    if (!dataSource) {\r\n      numItems = 0;\r\n    } else if ('length' in dataSource) {\r\n      // may be an array or just object with length property\r\n      numItems = dataSource.length;\r\n    } else if ('gallery' in dataSource) {\r\n      // query DOM elements\r\n      if (!dataSource.items) {\r\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n      }\r\n\r\n      if (dataSource.items) {\r\n        numItems = dataSource.items.length;\r\n      }\r\n    }\r\n\r\n    // legacy event, before filters were introduced\r\n    const event = this.dispatch('numItems', {\r\n      dataSource,\r\n      numItems\r\n    });\r\n    return this.applyFilters('numItems', event.numItems, dataSource);\r\n  }\r\n\r\n  /**\r\n   * @param {SlideData} slideData\r\n   * @param {number} index\r\n   */\r\n  createContentFromData(slideData, index) {\r\n    // @ts-expect-error\r\n    return new Content(slideData, this, index);\r\n  }\r\n\r\n  /**\r\n   * Get item data by index.\r\n   *\r\n   * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\r\n   * For example, it may contain properties like\r\n   * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\r\n   *\r\n   * @param {number} index\r\n   */\r\n  getItemData(index) {\r\n    const { dataSource } = this.options;\r\n    let dataSourceItem;\r\n    if (Array.isArray(dataSource)) {\r\n      // Datasource is an array of elements\r\n      dataSourceItem = dataSource[index];\r\n    } else if (dataSource && dataSource.gallery) {\r\n      // dataSource has gallery property,\r\n      // thus it was created by Lightbox, based on\r\n      // gallery and children options\r\n\r\n      // query DOM elements\r\n      if (!dataSource.items) {\r\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\r\n      }\r\n\r\n      dataSourceItem = dataSource.items[index];\r\n    }\r\n\r\n    let itemData = dataSourceItem;\r\n\r\n    if (itemData instanceof Element) {\r\n      itemData = this._domElementToItemData(itemData);\r\n    }\r\n\r\n    // Dispatching the itemData event,\r\n    // it's a legacy verion before filters were introduced\r\n    const event = this.dispatch('itemData', {\r\n      itemData: itemData || {},\r\n      index\r\n    });\r\n\r\n    return this.applyFilters('itemData', event.itemData, index);\r\n  }\r\n\r\n  /**\r\n   * Get array of gallery DOM elements,\r\n   * based on childSelector and gallery element.\r\n   *\r\n   * @param {HTMLElement} galleryElement\r\n   */\r\n  _getGalleryDOMElements(galleryElement) {\r\n    if (this.options.children || this.options.childSelector) {\r\n      return getElementsFromOption(\r\n        this.options.children,\r\n        this.options.childSelector,\r\n        galleryElement\r\n      ) || [];\r\n    }\r\n\r\n    return [galleryElement];\r\n  }\r\n\r\n  /**\r\n   * Converts DOM element to item data object.\r\n   *\r\n   * @param {HTMLElement} element DOM element\r\n   */\r\n  // eslint-disable-next-line class-methods-use-this\r\n  _domElementToItemData(element) {\r\n    /** @type {SlideData} */\r\n    const itemData = {\r\n      element\r\n    };\r\n\r\n    // eslint-disable-next-line max-len\r\n    const linkEl = /** @type {HTMLAnchorElement} */ (element.tagName === 'A' ? element : element.querySelector('a'));\r\n\r\n    if (linkEl) {\r\n      // src comes from data-pswp-src attribute,\r\n      // if it's empty link href is used\r\n      itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\r\n\r\n      if (linkEl.dataset.pswpSrcset) {\r\n        itemData.srcset = linkEl.dataset.pswpSrcset;\r\n      }\r\n\r\n      itemData.width = parseInt(linkEl.dataset.pswpWidth, 10);\r\n      itemData.height = parseInt(linkEl.dataset.pswpHeight, 10);\r\n\r\n      // support legacy w & h properties\r\n      itemData.w = itemData.width;\r\n      itemData.h = itemData.height;\r\n\r\n      if (linkEl.dataset.pswpType) {\r\n        itemData.type = linkEl.dataset.pswpType;\r\n      }\r\n\r\n      const thumbnailEl = element.querySelector('img');\r\n\r\n      if (thumbnailEl) {\r\n        // msrc is URL to placeholder image that's displayed before large image is loaded\r\n        // by default it's displayed only for the first slide\r\n        itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\r\n        itemData.alt = thumbnailEl.getAttribute('alt');\r\n      }\r\n\r\n      if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\r\n        itemData.thumbCropped = true;\r\n      }\r\n    }\r\n\r\n    return this.applyFilters('domItemData', itemData, element, linkEl);\r\n  }\r\n}\r\n\r\nexport default PhotoSwipeBase;\r\n", "/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {PhotoSwipe} pswp\r\n */\r\nexport function getViewportSize(options, pswp) {\r\n  if (options.getViewportSizeFn) {\r\n    const newViewportSize = options.getViewportSizeFn(options, pswp);\r\n    if (newViewportSize) {\r\n      return newViewportSize;\r\n    }\r\n  }\r\n\r\n  return {\r\n    x: document.documentElement.clientWidth,\r\n\r\n    // TODO: height on mobile is very incosistent due to toolbar\r\n    // find a way to improve this\r\n    //\r\n    // document.documentElement.clientHeight - doesn't seem to work well\r\n    y: window.innerHeight\r\n  };\r\n}\r\n\r\n/**\r\n * Parses padding option.\r\n * Supported formats:\r\n *\r\n * // Object\r\n * padding: {\r\n *  top: 0,\r\n *  bottom: 0,\r\n *  left: 0,\r\n *  right: 0\r\n * }\r\n *\r\n * // A function that returns the object\r\n * paddingFn: (viewportSize, itemData, index) => {\r\n *  return {\r\n *    top: 0,\r\n *    bottom: 0,\r\n *    left: 0,\r\n *    right: 0\r\n *  };\r\n * }\r\n *\r\n * // Legacy variant\r\n * paddingLeft: 0,\r\n * paddingRight: 0,\r\n * paddingTop: 0,\r\n * paddingBottom: 0,\r\n *\r\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\r\n * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n * @param {{ x?: number; y?: number }} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {number} index Slide index\r\n * @returns {number}\r\n */\r\nexport function parsePaddingOption(prop, options, viewportSize, itemData, index) {\r\n  /** @type {number} */\r\n  let paddingValue;\r\n\r\n  if (options.paddingFn) {\r\n    paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\r\n  } else if (options.padding) {\r\n    paddingValue = options.padding[prop];\r\n  } else {\r\n    const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1);\r\n    // @ts-expect-error\r\n    if (options[legacyPropName]) {\r\n      // @ts-expect-error\r\n      paddingValue = options[legacyPropName];\r\n    }\r\n  }\r\n\r\n  return paddingValue || 0;\r\n}\r\n\r\n/**\r\n * @param {PhotoSwipeOptions} options\r\n * @param {{ x?: number; y?: number }} viewportSize\r\n * @param {SlideData} itemData\r\n * @param {number} index\r\n */\r\nexport function getPanAreaSize(options, viewportSize, itemData, index) {\r\n  return {\r\n    x: viewportSize.x\r\n      - parsePaddingOption('left', options, viewportSize, itemData, index)\r\n      - parsePaddingOption('right', options, viewportSize, itemData, index),\r\n    y: viewportSize.y\r\n      - parsePaddingOption('top', options, viewportSize, itemData, index)\r\n      - parsePaddingOption('bottom', options, viewportSize, itemData, index)\r\n  };\r\n}\r\n", "const MAX_IMAGE_WIDTH = 4000;\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\r\n\r\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\r\n\r\n/**\r\n * Calculates zoom levels for specific slide.\r\n * Depends on viewport size and image size.\r\n */\r\nclass ZoomLevel {\r\n  /**\r\n   * @param {PhotoSwipeOptions} options PhotoSwipe options\r\n   * @param {SlideData} itemData Slide data\r\n   * @param {number} index Slide index\r\n   * @param {PhotoSwipe=} pswp PhotoSwipe instance, can be undefined if not initialized yet\r\n   */\r\n  constructor(options, itemData, index, pswp) {\r\n    this.pswp = pswp;\r\n    this.options = options;\r\n    this.itemData = itemData;\r\n    this.index = index;\r\n  }\r\n\r\n  /**\r\n   * Calculate initial, secondary and maximum zoom level for the specified slide.\r\n   *\r\n   * It should be called when either image or viewport size changes.\r\n   *\r\n   * @param {number} maxWidth\r\n   * @param {number} maxHeight\r\n   * @param {{ x?: number; y?: number }} panAreaSize\r\n   */\r\n  update(maxWidth, maxHeight, panAreaSize) {\r\n    this.elementSize = {\r\n      x: maxWidth,\r\n      y: maxHeight\r\n    };\r\n\r\n    this.panAreaSize = panAreaSize;\r\n\r\n    const hRatio = this.panAreaSize.x / this.elementSize.x;\r\n    const vRatio = this.panAreaSize.y / this.elementSize.y;\r\n\r\n    this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\r\n    this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio);\r\n\r\n    // zoom.vFill defines zoom level of the image\r\n    // when it has 100% of viewport vertical space (height)\r\n    this.vFill = Math.min(1, vRatio);\r\n\r\n    this.initial = this._getInitial();\r\n    this.secondary = this._getSecondary();\r\n    this.max = Math.max(\r\n      this.initial,\r\n      this.secondary,\r\n      this._getMax()\r\n    );\r\n\r\n    this.min = Math.min(\r\n      this.fit,\r\n      this.initial,\r\n      this.secondary\r\n    );\r\n\r\n    if (this.pswp) {\r\n      this.pswp.dispatch('zoomLevelsUpdate', { zoomLevels: this, slideData: this.itemData });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Parses user-defined zoom option.\r\n   *\r\n   * @private\r\n   * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\r\n   */\r\n  _parseZoomLevelOption(optionPrefix) {\r\n    // eslint-disable-next-line max-len\r\n    const optionName = /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */ (optionPrefix + 'ZoomLevel');\r\n    const optionValue = this.options[optionName];\r\n\r\n    if (!optionValue) {\r\n      return;\r\n    }\r\n\r\n    if (typeof optionValue === 'function') {\r\n      return optionValue(this);\r\n    }\r\n\r\n    if (optionValue === 'fill') {\r\n      return this.fill;\r\n    }\r\n\r\n    if (optionValue === 'fit') {\r\n      return this.fit;\r\n    }\r\n\r\n    return Number(optionValue);\r\n  }\r\n\r\n  /**\r\n   * Get zoom level to which image will be zoomed after double-tap gesture,\r\n   * or when user clicks on zoom icon,\r\n   * or mouse-click on image itself.\r\n   * If you return 1 image will be zoomed to its original size.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\r\n  _getSecondary() {\r\n    let currZoomLevel = this._parseZoomLevelOption('secondary');\r\n\r\n    if (currZoomLevel) {\r\n      return currZoomLevel;\r\n    }\r\n\r\n    // 3x of \"fit\" state, but not larger than original\r\n    currZoomLevel = Math.min(1, this.fit * 3);\r\n\r\n    if (currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\r\n      currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\r\n    }\r\n\r\n    return currZoomLevel;\r\n  }\r\n\r\n  /**\r\n   * Get initial image zoom level.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\r\n  _getInitial() {\r\n    return this._parseZoomLevelOption('initial') || this.fit;\r\n  }\r\n\r\n  /**\r\n   * Maximum zoom level when user zooms\r\n   * via zoom/pinch gesture,\r\n   * via cmd/ctrl-wheel or via trackpad.\r\n   *\r\n   * @private\r\n   * @return {number}\r\n   */\r\n  _getMax() {\r\n    const currZoomLevel = this._parseZoomLevelOption('max');\r\n\r\n    if (currZoomLevel) {\r\n      return currZoomLevel;\r\n    }\r\n\r\n    // max zoom level is x4 from \"fit state\",\r\n    // used for zoom gesture and ctrl/trackpad zoom\r\n    return Math.max(1, this.fit * 4);\r\n  }\r\n}\r\n\r\nexport default ZoomLevel;\r\n", "import { getViewportSize, getPanAreaSize } from '../util/viewport-size.js';\r\nimport ZoomLevel from './zoom-level.js';\r\n\r\n/** @typedef {import('./content.js').default} Content */\r\n/** @typedef {import('./slide.js').default} Slide */\r\n/** @typedef {import('./slide.js').SlideData} SlideData */\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\r\n\r\nconst MIN_SLIDES_TO_CACHE = 5;\r\n\r\n/**\r\n * Lazy-load an image\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * @param {SlideData} itemData Data about the slide\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox\r\n * @param {number} index\r\n * @returns Image that is being decoded or false.\r\n */\r\nexport function lazyLoadData(itemData, instance, index) {\r\n  // src/slide/content/content.js\r\n  const content = instance.createContentFromData(itemData, index);\r\n\r\n  if (!content || !content.lazyLoad) {\r\n    return;\r\n  }\r\n\r\n  const { options } = instance;\r\n\r\n  // We need to know dimensions of the image to preload it,\r\n  // as it might use srcset and we need to define sizes\r\n  // @ts-expect-error should provide pswp instance?\r\n  const viewportSize = instance.viewportSize || getViewportSize(options, instance);\r\n  const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\r\n\r\n  const zoomLevel = new ZoomLevel(options, itemData, -1);\r\n  zoomLevel.update(content.width, content.height, panAreaSize);\r\n\r\n  content.lazyLoad();\r\n  content.setDisplayedSize(\r\n    Math.ceil(content.width * zoomLevel.initial),\r\n    Math.ceil(content.height * zoomLevel.initial)\r\n  );\r\n\r\n  return content;\r\n}\r\n\r\n\r\n/**\r\n * Lazy-loads specific slide.\r\n * This function is used both by Lightbox and PhotoSwipe core,\r\n * thus it can be called before dialog is opened.\r\n *\r\n * By default it loads image based on viewport size and initial zoom level.\r\n *\r\n * @param {number} index Slide index\r\n * @param {PhotoSwipe | PhotoSwipeLightbox} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\r\n */\r\nexport function lazyLoadSlide(index, instance) {\r\n  const itemData = instance.getItemData(index);\r\n\r\n  if (instance.dispatch('lazyLoadSlide', { index, itemData }).defaultPrevented) {\r\n    return;\r\n  }\r\n\r\n  return lazyLoadData(itemData, instance, index);\r\n}\r\n\r\n\r\nclass ContentLoader {\r\n  /**\r\n   * @param {PhotoSwipe} pswp\r\n   */\r\n  constructor(pswp) {\r\n    this.pswp = pswp;\r\n    // Total amount of cached images\r\n    this.limit = Math.max(\r\n      pswp.options.preload[0] + pswp.options.preload[1] + 1,\r\n      MIN_SLIDES_TO_CACHE\r\n    );\r\n    /** @type {Content[]} */\r\n    this._cachedItems = [];\r\n  }\r\n\r\n  /**\r\n   * Lazy load nearby slides based on `preload` option.\r\n   *\r\n   * @param {number=} diff Difference between slide indexes that was changed recently, or 0.\r\n   */\r\n  updateLazy(diff) {\r\n    const { pswp } = this;\r\n\r\n    if (pswp.dispatch('lazyLoad').defaultPrevented) {\r\n      return;\r\n    }\r\n\r\n    const { preload } = pswp.options;\r\n    const isForward = diff === undefined ? true : (diff >= 0);\r\n    let i;\r\n\r\n    // preload[1] - num items to preload in forward direction\r\n    for (i = 0; i <= preload[1]; i++) {\r\n      this.loadSlideByIndex(pswp.currIndex + (isForward ? i : (-i)));\r\n    }\r\n\r\n    // preload[0] - num items to preload in backward direction\r\n    for (i = 1; i <= preload[0]; i++) {\r\n      this.loadSlideByIndex(pswp.currIndex + (isForward ? (-i) : i));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {number} index\r\n   */\r\n  loadSlideByIndex(index) {\r\n    index = this.pswp.getLoopedIndex(index);\r\n    // try to get cached content\r\n    let content = this.getContentByIndex(index);\r\n    if (!content) {\r\n      // no cached content, so try to load from scratch:\r\n      content = lazyLoadSlide(index, this.pswp);\r\n      // if content can be loaded, add it to cache:\r\n      if (content) {\r\n        this.addToCache(content);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {Slide} slide\r\n   */\r\n  getContentBySlide(slide) {\r\n    let content = this.getContentByIndex(slide.index);\r\n    if (!content) {\r\n      // create content if not found in cache\r\n      content = this.pswp.createContentFromData(slide.data, slide.index);\r\n      if (content) {\r\n        this.addToCache(content);\r\n      }\r\n    }\r\n\r\n    if (content) {\r\n      // assign slide to content\r\n      content.setSlide(slide);\r\n    }\r\n    return content;\r\n  }\r\n\r\n  /**\r\n   * @param {Content} content\r\n   */\r\n  addToCache(content) {\r\n    // move to the end of array\r\n    this.removeByIndex(content.index);\r\n    this._cachedItems.push(content);\r\n\r\n    if (this._cachedItems.length > this.limit) {\r\n      // Destroy the first content that's not attached\r\n      const indexToRemove = this._cachedItems.findIndex((item) => {\r\n        return !item.isAttached && !item.hasSlide;\r\n      });\r\n      if (indexToRemove !== -1) {\r\n        const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\r\n        removedItem.destroy();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Removes an image from cache, does not destroy() it, just removes.\r\n   *\r\n   * @param {number} index\r\n   */\r\n  removeByIndex(index) {\r\n    const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\r\n    if (indexToRemove !== -1) {\r\n      this._cachedItems.splice(indexToRemove, 1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @param {number} index\r\n   */\r\n  getContentByIndex(index) {\r\n    return this._cachedItems.find(content => content.index === index);\r\n  }\r\n\r\n  destroy() {\r\n    this._cachedItems.forEach(content => content.destroy());\r\n    this._cachedItems = null;\r\n  }\r\n}\r\n\r\nexport default ContentLoader;\r\n", "import {\r\n  specialKeyUsed,\r\n  getElementsFromOption,\r\n  isPswpClass\r\n} from '../util/util.js';\r\n\r\nimport PhotoSwipeBase from '../core/base.js';\r\nimport { lazyLoadSlide } from '../slide/loader.js';\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('../types.js').Type<T>} Type<T>\r\n */\r\n\r\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\r\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\r\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\r\n/** @typedef {import('../slide/content.js').default} Content */\r\n/** @typedef {import('../core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\r\n/** @typedef {import('../core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\r\n\r\n/**\r\n * @template T\r\n * @typedef {import('../core/eventable.js').EventCallback<T>} EventCallback<T>\r\n */\r\n\r\n/**\r\n * PhotoSwipe Lightbox\r\n *\r\n * - If user has unsupported browser it falls back to default browser action (just opens URL)\r\n * - Binds click event to links that should open PhotoSwipe\r\n * - parses DOM strcture for PhotoSwipe (retrieves large image URLs and sizes)\r\n * - Initializes PhotoSwipe\r\n *\r\n *\r\n * Loader options use the same object as PhotoSwipe, and supports such options:\r\n *\r\n * gallery - Element | Element[] | NodeList | string selector for the gallery element\r\n * children - Element | Element[] | NodeList | string selector for the gallery children\r\n *\r\n */\r\nclass PhotoSwipeLightbox extends PhotoSwipeBase {\r\n  /**\r\n   * @param {PhotoSwipeOptions} options\r\n   */\r\n  constructor(options) {\r\n    super();\r\n    /** @type {PhotoSwipeOptions} */\r\n    this.options = options || {};\r\n    this._uid = 0;\r\n  }\r\n\r\n  /**\r\n   * Initialize lightbox, should be called only once.\r\n   * It's not included in the main constructor, so you may bind events before it.\r\n   */\r\n  init() {\r\n    this.onThumbnailsClick = this.onThumbnailsClick.bind(this);\r\n\r\n    // Bind click events to each gallery\r\n    getElementsFromOption(this.options.gallery, this.options.gallerySelector)\r\n      .forEach((galleryElement) => {\r\n        galleryElement.addEventListener('click', this.onThumbnailsClick, false);\r\n      });\r\n  }\r\n\r\n  /**\r\n   * @param {MouseEvent} e\r\n   */\r\n  onThumbnailsClick(e) {\r\n    // Exit and allow default browser action if:\r\n    if (specialKeyUsed(e) // ... if clicked with a special key (ctrl/cmd...)\r\n        || window.pswp // ... if PhotoSwipe is already open\r\n        || window.navigator.onLine === false) { // ... if offline\r\n      return;\r\n    }\r\n\r\n    // If both clientX and clientY are 0 or not defined,\r\n    // the event is likely triggered by keyboard,\r\n    // so we do not pass the initialPoint\r\n    //\r\n    // Note that some screen readers emulate the mouse position,\r\n    // so it's not ideal way to detect them.\r\n    //\r\n    let initialPoint = { x: e.clientX, y: e.clientY };\r\n\r\n    if (!initialPoint.x && !initialPoint.y) {\r\n      initialPoint = null;\r\n    }\r\n\r\n    let clickedIndex = this.getClickedIndex(e);\r\n    clickedIndex = this.applyFilters('clickedIndex', clickedIndex, e, this);\r\n    const dataSource = {\r\n      gallery: /** @type {HTMLElement} */ (e.currentTarget)\r\n    };\r\n\r\n    if (clickedIndex >= 0) {\r\n      e.preventDefault();\r\n      this.loadAndOpen(clickedIndex, dataSource, initialPoint);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get index of gallery item that was clicked.\r\n   *\r\n   * @param {MouseEvent} e click event\r\n   */\r\n  getClickedIndex(e) {\r\n    // legacy option\r\n    if (this.options.getClickedIndexFn) {\r\n      return this.options.getClickedIndexFn.call(this, e);\r\n    }\r\n\r\n    const clickedTarget = /** @type {HTMLElement} */ (e.target);\r\n    const childElements = getElementsFromOption(\r\n      this.options.children,\r\n      this.options.childSelector,\r\n      /** @type {HTMLElement} */ (e.currentTarget)\r\n    );\r\n    const clickedChildIndex = childElements.findIndex(\r\n      child => child === clickedTarget || child.contains(clickedTarget)\r\n    );\r\n\r\n    if (clickedChildIndex !== -1) {\r\n      return clickedChildIndex;\r\n    } else if (this.options.children || this.options.childSelector) {\r\n      // click wasn't on a child element\r\n      return -1;\r\n    }\r\n\r\n    // There is only one item (which is the gallery)\r\n    return 0;\r\n  }\r\n\r\n  /**\r\n   * Load and open PhotoSwipe\r\n   *\r\n   * @param {number} index\r\n   * @param {DataSource=} dataSource\r\n   * @param {{ x?: number; y?: number }} [initialPoint]\r\n   */\r\n  loadAndOpen(index, dataSource, initialPoint) {\r\n    // Check if the gallery is already open\r\n    if (window.pswp) {\r\n      return false;\r\n    }\r\n\r\n    // set initial index\r\n    this.options.index = index;\r\n\r\n    // define options for PhotoSwipe constructor\r\n    this.options.initialPointerPos = initialPoint;\r\n\r\n    this.shouldOpen = true;\r\n    this.preload(index, dataSource);\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Load the main module and the slide content by index\r\n   *\r\n   * @param {number} index\r\n   * @param {DataSource=} dataSource\r\n   */\r\n  preload(index, dataSource) {\r\n    const { options } = this;\r\n\r\n    if (dataSource) {\r\n      options.dataSource = dataSource;\r\n    }\r\n\r\n    // Add the main module\r\n    /** @type {Promise<Type<PhotoSwipe>>[]} */\r\n    const promiseArray = [];\r\n\r\n    const pswpModuleType = typeof options.pswpModule;\r\n    if (isPswpClass(options.pswpModule)) {\r\n      promiseArray.push(Promise.resolve(/** @type {Type<PhotoSwipe>} */ (options.pswpModule)));\r\n    } else if (pswpModuleType === 'string') {\r\n      throw new Error('pswpModule as string is no longer supported');\r\n    } else if (pswpModuleType === 'function') {\r\n      promiseArray.push(/** @type {() => Promise<Type<PhotoSwipe>>} */ (options.pswpModule)());\r\n    } else {\r\n      throw new Error('pswpModule is not valid');\r\n    }\r\n\r\n    // Add custom-defined promise, if any\r\n    if (typeof options.openPromise === 'function') {\r\n      // allow developers to perform some task before opening\r\n      promiseArray.push(options.openPromise());\r\n    }\r\n\r\n    if (options.preloadFirstSlide !== false && index >= 0) {\r\n      this._preloadedContent = lazyLoadSlide(index, this);\r\n    }\r\n\r\n    // Wait till all promises resolve and open PhotoSwipe\r\n    const uid = ++this._uid;\r\n    Promise.all(promiseArray).then((iterableModules) => {\r\n      if (this.shouldOpen) {\r\n        const mainModule = iterableModules[0];\r\n        this._openPhotoswipe(mainModule, uid);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * @param {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} module\r\n   * @param {number} uid\r\n   */\r\n  _openPhotoswipe(module, uid) {\r\n    // Cancel opening if UID doesn't match the current one\r\n    // (if user clicked on another gallery item before current was loaded).\r\n    //\r\n    // Or if shouldOpen flag is set to false\r\n    // (developer may modify it via public API)\r\n    if (uid !== this._uid && this.shouldOpen) {\r\n      return;\r\n    }\r\n\r\n    this.shouldOpen = false;\r\n\r\n    // PhotoSwipe is already open\r\n    if (window.pswp) {\r\n      return;\r\n    }\r\n\r\n    /**\r\n     * Pass data to PhotoSwipe and open init\r\n     *\r\n     * @type {PhotoSwipe}\r\n     */\r\n    const pswp = typeof module === 'object'\r\n        ? new module.default(this.options) // eslint-disable-line\r\n        : new module(this.options); // eslint-disable-line\r\n\r\n    this.pswp = pswp;\r\n    window.pswp = pswp;\r\n\r\n    // map listeners from Lightbox to PhotoSwipe Core\r\n    /** @type {(keyof PhotoSwipeEventsMap)[]} */\r\n    (Object.keys(this._listeners)).forEach((name) => {\r\n      this._listeners[name].forEach((fn) => {\r\n        pswp.on(name, /** @type {EventCallback<typeof name>} */(fn));\r\n      });\r\n    });\r\n\r\n    // same with filters\r\n    /** @type {(keyof PhotoSwipeFiltersMap)[]} */\r\n    (Object.keys(this._filters)).forEach((name) => {\r\n      this._filters[name].forEach((filter) => {\r\n        pswp.addFilter(name, filter.fn, filter.priority);\r\n      });\r\n    });\r\n\r\n    if (this._preloadedContent) {\r\n      pswp.contentLoader.addToCache(this._preloadedContent);\r\n      this._preloadedContent = null;\r\n    }\r\n\r\n    pswp.on('destroy', () => {\r\n      // clean up public variables\r\n      this.pswp = null;\r\n      window.pswp = null;\r\n    });\r\n\r\n    pswp.init();\r\n  }\r\n\r\n  /**\r\n   * Unbinds all events, closes PhotoSwipe if it's open.\r\n   */\r\n  destroy() {\r\n    if (this.pswp) {\r\n      this.pswp.destroy();\r\n    }\r\n\r\n    this.shouldOpen = false;\r\n    this._listeners = null;\r\n\r\n    getElementsFromOption(this.options.gallery, this.options.gallerySelector)\r\n      .forEach((galleryElement) => {\r\n        galleryElement.removeEventListener('click', this.onThumbnailsClick, false);\r\n      });\r\n  }\r\n}\r\n\r\nexport default PhotoSwipeLightbox;\r\n", "import PhotoSwipeLightbox from 'photoswipe/lightbox'\nimport 'photoswipe/photoswipe.css'\n\nup.compiler('[lightbox-gallery]', async (element) => {\n\n  const lightbox = new PhotoSwipeLightbox({\n    gallery: element,\n    children: '[lightbox-image]',\n    showHideAnimationType: 'zoom',\n    pswpModule: (await import('photoswipe')).default,\n  })\n\n  lightbox.on('itemData', (event) => {\n    const lightboxImage = event.itemData.element\n    event.itemData = lightboxImage.getItemData()\n  })\n\n  // Support captions: https://photoswipe.com/caption/\n  lightbox.on('uiRegister', () => {\n    lightbox.pswp.ui.registerElement({\n      name: 'custom-caption',\n      order: 9,\n      isButton: false,\n      appendTo: 'root',\n      html: '',\n      onInit: (captionElement, _pswp) => {\n        lightbox.pswp.on('change', () => {\n          const { copyrightText, descriptionText, titleText } = lightbox.pswp.currSlide.data\n\n          captionElement.innerHTML = ''\n\n          if (titleText) up.element.affix(captionElement, 'h5.m-0', { text: titleText })\n          if (descriptionText) up.element.affix(captionElement, 'div', { text: descriptionText })\n          if (copyrightText) up.element.affix(captionElement, '.small.text-muted', { text: `Copyright information: ${copyrightText}` })\n        })\n      },\n    })\n  })\n\n  lightbox.init()\n\n})\n"],
  "mappings": "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B,MAAO,CAAC,EAAG,GAAG,CAAI,CACtB,CACJ,CACA,MAAO,CACH,WACA,eACA,YACA,kBACA,sBACA,SACA,iBACA,QACA,iBACA,SACA,gBACA,QAAS,GACT,uBACA,OACA,eACA,MACA,WACA,YACA,cACA,QACA,SACA,KAAM,GACN,OAAQ,GACR,UACA,aACA,WACA,iBACA,QACA,SACA,QACA,SACA,aACA,cACA,UACA,YACA,YACA,WACA,WACA,WACA,aACA,WACA,YACA,WACA,YACA,WACA,eACA,aACA,YACA,WACA,aACA,aACA,eACA,SACA,WACA,MAAO,EACP,YACA,kBACA,UACA,QACA,UACA,QACA,uBACA,UACA,UACA,YACA,aACA,kBACA,mBACA,OACA,YACA,YACA,cACA,gBACA,YACA,cACA,WACA,YACA,eACA,UACA,iBACA,YACA,yBACA,gBACA,KAAM,EACN,UAAW,EACX,qBACA,WACA,eACA,YACA,YACA,aACA,cACA,OAAQ,GACR,cACA,cACA,OACA,kBACA,kBACA,OAAQ,GACR,SAAU,GACV,WACA,mBACA,qBACA,oBACA,mBACA,WACA,4BACA,cACA,UAAW,GACX,cACA,SACJ,CACJ,EAAG,CAGG,EAEC,IAAM,CAEb,GAAG,MAAS,UAAY,CACpB,GAAM,GAAI,GAAG,KACb,WAAe,EAAS,EAAQ,CAAC,EAAG,CAChC,AAAI,EAAE,QAAQ,CAAO,GACjB,GAAU,EAAE,QAAQ,GAAG,CAAO,GAElC,GAAM,GAAQ,GAAI,OAAM,CAAO,EAC/B,SAAE,OAAO,EAAO,CAAK,EACd,CACX,CACA,WAAwB,EAAM,EAAO,EAAO,CACxC,GAAM,GAAK,YAAa,EAAM,CAC1B,GAAM,GAAQ,EAAK,GAAG,CAAI,EAC1B,SAAM,KAAO,EACN,CACX,EACA,SAAG,GAAK,GAAS,EAAM,OAAS,EAChC,EAAG,MAAQ,IAAI,IAAS,QAAQ,OAAO,EAAG,GAAG,CAAI,CAAC,EAC3C,CACX,CACA,GAAM,GAAS,EAAe,WAAW,EACnC,EAAU,EAAe,aAAc,AAAC,GACnC,EAAM,GAAW,SAAS,CACpC,EACK,EAAiB,EAAe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",
  "names": []
}
