{"version":3,"file":"../bootstrap.bundle.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","bootstrap","Popper","this","_interopNamespaceDefault","e","n","Object","create","Symbol","toStringTag","value","k","d","getOwnPropertyDescriptor","defineProperty","get","enumerable","default","freeze","Popper__namespace","elementMap","Map","Data","set","element","key","instance","has","instanceMap","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","_unused","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","map","sel","join","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_KEY$b","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE$5","Button","toggle","button","EVENT_KEY$9","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","Default$c","endCallback","leftCallback","rightCallback","DefaultType$c","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","EVENT_KEY$8","DATA_API_KEY$5","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN$1","EVENT_MOUSEENTER$1","EVENT_MOUSELEAVE$1","EVENT_DRAG_START","EVENT_LOAD_DATA_API$3","EVENT_CLICK_DATA_API$5","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE$2","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","Default$b","interval","keyboard","pause","ride","touch","wrap","DefaultType$b","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_KEY$7","EVENT_SHOW$6","EVENT_SHOWN$6","EVENT_HIDE$6","EVENT_HIDDEN$6","EVENT_CLICK_DATA_API$4","CLASS_NAME_SHOW$7","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","SELECTOR_DATA_TOGGLE$4","Default$a","parent","DefaultType$a","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","getBoundingClientRect","selected","triggerArray","isOpen","NAME$a","EVENT_KEY$6","DATA_API_KEY$3","ARROW_UP_KEY$1","ARROW_DOWN_KEY$1","EVENT_HIDE$5","EVENT_HIDDEN$5","EVENT_SHOW$5","EVENT_SHOWN$5","EVENT_CLICK_DATA_API$3","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","CLASS_NAME_SHOW$6","SELECTOR_DATA_TOGGLE$3","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","Default$9","autoClose","boundary","display","offset","popperConfig","reference","DefaultType$9","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","destroy","update","referenceElement","_getPopperConfig","createPopper","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","placement","modifiers","options","enabled","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","NAME$9","CLASS_NAME_SHOW$5","EVENT_MOUSEDOWN","Default$8","className","clickCallback","rootElement","DefaultType$8","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_KEY$5","EVENT_FOCUSIN$2","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","Default$7","autofocus","trapElement","DefaultType$7","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","elements","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","clientWidth","innerWidth","width","_disableOverFlow","_setElementAttributes","calculatedValue","reset","_resetElementAttributes","isOverflowing","_saveInitialAttribute","overflow","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","EVENT_KEY$4","EVENT_HIDE$4","EVENT_HIDE_PREVENTED$1","EVENT_HIDDEN$4","EVENT_SHOW$4","EVENT_SHOWN$4","EVENT_RESIZE$1","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS$1","EVENT_CLICK_DATA_API$2","CLASS_NAME_OPEN","CLASS_NAME_SHOW$4","CLASS_NAME_STATIC","Default$6","DefaultType$6","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","scrollTop","modalBody","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","scrollHeight","clientHeight","initialOverflowY","overflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","EVENT_KEY$3","DATA_API_KEY$1","EVENT_LOAD_DATA_API$2","CLASS_NAME_SHOW$3","CLASS_NAME_SHOWING$1","CLASS_NAME_HIDING","OPEN_SELECTOR","EVENT_SHOW$3","EVENT_SHOWN$3","EVENT_HIDE$3","EVENT_HIDE_PREVENTED","EVENT_HIDDEN$3","EVENT_RESIZE","EVENT_CLICK_DATA_API$1","EVENT_KEYDOWN_DISMISS","Default$5","scroll","DefaultType$5","Offcanvas","blur","position","DefaultAllowlist","a","area","b","br","col","code","dd","div","dl","dt","em","hr","h1","h2","h3","h4","h5","h6","i","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","attribute","allowedAttributeList","attributeName","nodeName","nodeValue","attributeRegex","some","regex","Default$4","allowList","content","extraClass","html","sanitize","sanitizeFn","template","DefaultType$4","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE$2","CLASS_NAME_SHOW$2","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","Default$3","animation","container","customClass","delay","fallbackPlacements","title","DefaultType$3","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","ownerDocument","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","phase","state","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","Default$2","DefaultType$2","Popover","_getContent","EVENT_KEY$2","EVENT_ACTIVATE","EVENT_CLICK","EVENT_LOAD_DATA_API$1","CLASS_NAME_ACTIVE$1","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","Default$1","rootMargin","smoothScroll","threshold","DefaultType$1","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","hash","height","offsetTop","scrollTo","top","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","item","activeNodes","node","spy","EVENT_KEY$1","EVENT_HIDE$1","EVENT_HIDDEN$1","EVENT_SHOW$1","EVENT_SHOWN$1","EVENT_CLICK_DATA_API","EVENT_KEYDOWN","EVENT_LOAD_DATA_API","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","ARROW_UP_KEY","ARROW_DOWN_KEY","HOME_KEY","END_KEY","CLASS_NAME_ACTIVE","CLASS_NAME_FADE$1","CLASS_NAME_SHOW$1","SELECTOR_DROPDOWN_TOGGLE","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_DATA_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSIN","EVENT_FOCUSOUT","EVENT_HIDE","EVENT_HIDDEN","EVENT_SHOW","EVENT_SHOWN","CLASS_NAME_HIDE","CLASS_NAME_SHOW","CLASS_NAME_SHOWING","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["bootstrap.bundle.js"],"sourcesContent":["/*!\r\n * Bootstrap v5.3.3 (https://getbootstrap.com/)\r\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n */\r\n(function (global, factory) {\r\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) :\r\n typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) :\r\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper));\r\n})(this, (function (Popper) {\r\n 'use strict';\r\n\r\n function _interopNamespaceDefault(e) {\r\n const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });\r\n if (e) {\r\n for (const k in e) {\r\n if (k !== 'default') {\r\n const d = Object.getOwnPropertyDescriptor(e, k);\r\n Object.defineProperty(n, k, d.get ? d : {\r\n enumerable: true,\r\n get: () => e[k]\r\n });\r\n }\r\n }\r\n }\r\n n.default = e;\r\n return Object.freeze(n);\r\n }\r\n\r\n const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap dom/data.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const elementMap = new Map();\r\n const Data = {\r\n set(element, key, instance) {\r\n if (!elementMap.has(element)) {\r\n elementMap.set(element, new Map());\r\n }\r\n const instanceMap = elementMap.get(element);\r\n\r\n // make it clear we only want one instance per element\r\n // can be removed later when multiple key/instances are fine to be used\r\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\r\n // eslint-disable-next-line no-console\r\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\r\n return;\r\n }\r\n instanceMap.set(key, instance);\r\n },\r\n get(element, key) {\r\n if (elementMap.has(element)) {\r\n return elementMap.get(element).get(key) || null;\r\n }\r\n return null;\r\n },\r\n remove(element, key) {\r\n if (!elementMap.has(element)) {\r\n return;\r\n }\r\n const instanceMap = elementMap.get(element);\r\n instanceMap.delete(key);\r\n\r\n // free up element references if there are no instances left for an element\r\n if (instanceMap.size === 0) {\r\n elementMap.delete(element);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/index.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n const MAX_UID = 1000000;\r\n const MILLISECONDS_MULTIPLIER = 1000;\r\n const TRANSITION_END = 'transitionend';\r\n\r\n /**\r\n * Properly escape IDs selectors to handle weird IDs\r\n * @param {string} selector\r\n * @returns {string}\r\n */\r\n const parseSelector = selector => {\r\n if (selector && window.CSS && window.CSS.escape) {\r\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\r\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\r\n }\r\n return selector;\r\n };\r\n\r\n // Shout-out Angus Croll (https://goo.gl/pxwQGp)\r\n const toType = object => {\r\n if (object === null || object === undefined) {\r\n return `${object}`;\r\n }\r\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\r\n };\r\n\r\n /**\r\n * Public Util API\r\n */\r\n\r\n const getUID = prefix => {\r\n do {\r\n prefix += Math.floor(Math.random() * MAX_UID);\r\n } while (document.getElementById(prefix));\r\n return prefix;\r\n };\r\n const getTransitionDurationFromElement = element => {\r\n if (!element) {\r\n return 0;\r\n }\r\n\r\n // Get transition-duration of the element\r\n let {\r\n transitionDuration,\r\n transitionDelay\r\n } = window.getComputedStyle(element);\r\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\r\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\r\n\r\n // Return 0 if element or transition duration is not found\r\n if (!floatTransitionDuration && !floatTransitionDelay) {\r\n return 0;\r\n }\r\n\r\n // If multiple durations are defined, take the first\r\n transitionDuration = transitionDuration.split(',')[0];\r\n transitionDelay = transitionDelay.split(',')[0];\r\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\r\n };\r\n const triggerTransitionEnd = element => {\r\n element.dispatchEvent(new Event(TRANSITION_END));\r\n };\r\n const isElement = object => {\r\n if (!object || typeof object !== 'object') {\r\n return false;\r\n }\r\n if (typeof object.jquery !== 'undefined') {\r\n object = object[0];\r\n }\r\n return typeof object.nodeType !== 'undefined';\r\n };\r\n const getElement = object => {\r\n // it's a jQuery object or a node element\r\n if (isElement(object)) {\r\n return object.jquery ? object[0] : object;\r\n }\r\n if (typeof object === 'string' && object.length > 0) {\r\n return document.querySelector(parseSelector(object));\r\n }\r\n return null;\r\n };\r\n const isVisible = element => {\r\n if (!isElement(element) || element.getClientRects().length === 0) {\r\n return false;\r\n }\r\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\r\n // Handle `details` element as its content may falsie appear visible when it is closed\r\n const closedDetails = element.closest('details:not([open])');\r\n if (!closedDetails) {\r\n return elementIsVisible;\r\n }\r\n if (closedDetails !== element) {\r\n const summary = element.closest('summary');\r\n if (summary && summary.parentNode !== closedDetails) {\r\n return false;\r\n }\r\n if (summary === null) {\r\n return false;\r\n }\r\n }\r\n return elementIsVisible;\r\n };\r\n const isDisabled = element => {\r\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\r\n return true;\r\n }\r\n if (element.classList.contains('disabled')) {\r\n return true;\r\n }\r\n if (typeof element.disabled !== 'undefined') {\r\n return element.disabled;\r\n }\r\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\r\n };\r\n const findShadowRoot = element => {\r\n if (!document.documentElement.attachShadow) {\r\n return null;\r\n }\r\n\r\n // Can find the shadow root otherwise it'll return the document\r\n if (typeof element.getRootNode === 'function') {\r\n const root = element.getRootNode();\r\n return root instanceof ShadowRoot ? root : null;\r\n }\r\n if (element instanceof ShadowRoot) {\r\n return element;\r\n }\r\n\r\n // when we don't find a shadow root\r\n if (!element.parentNode) {\r\n return null;\r\n }\r\n return findShadowRoot(element.parentNode);\r\n };\r\n const noop = () => { };\r\n\r\n /**\r\n * Trick to restart an element's animation\r\n *\r\n * @param {HTMLElement} element\r\n * @return void\r\n *\r\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\r\n */\r\n const reflow = element => {\r\n element.offsetHeight; // eslint-disable-line no-unused-expressions\r\n };\r\n const getjQuery = () => {\r\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\r\n return window.jQuery;\r\n }\r\n return null;\r\n };\r\n const DOMContentLoadedCallbacks = [];\r\n const onDOMContentLoaded = callback => {\r\n if (document.readyState === 'loading') {\r\n // add listener on the first call when the document is in loading state\r\n if (!DOMContentLoadedCallbacks.length) {\r\n document.addEventListener('DOMContentLoaded', () => {\r\n for (const callback of DOMContentLoadedCallbacks) {\r\n callback();\r\n }\r\n });\r\n }\r\n DOMContentLoadedCallbacks.push(callback);\r\n } else {\r\n callback();\r\n }\r\n };\r\n const isRTL = () => document.documentElement.dir === 'rtl';\r\n const defineJQueryPlugin = plugin => {\r\n onDOMContentLoaded(() => {\r\n const $ = getjQuery();\r\n /* istanbul ignore if */\r\n if ($) {\r\n const name = plugin.NAME;\r\n const JQUERY_NO_CONFLICT = $.fn[name];\r\n $.fn[name] = plugin.jQueryInterface;\r\n $.fn[name].Constructor = plugin;\r\n $.fn[name].noConflict = () => {\r\n $.fn[name] = JQUERY_NO_CONFLICT;\r\n return plugin.jQueryInterface;\r\n };\r\n }\r\n });\r\n };\r\n const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\r\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\r\n };\r\n const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\r\n if (!waitForTransition) {\r\n execute(callback);\r\n return;\r\n }\r\n const durationPadding = 5;\r\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\r\n let called = false;\r\n const handler = ({\r\n target\r\n }) => {\r\n if (target !== transitionElement) {\r\n return;\r\n }\r\n called = true;\r\n transitionElement.removeEventListener(TRANSITION_END, handler);\r\n execute(callback);\r\n };\r\n transitionElement.addEventListener(TRANSITION_END, handler);\r\n setTimeout(() => {\r\n if (!called) {\r\n triggerTransitionEnd(transitionElement);\r\n }\r\n }, emulatedDuration);\r\n };\r\n\r\n /**\r\n * Return the previous/next element of a list.\r\n *\r\n * @param {array} list The list of elements\r\n * @param activeElement The active element\r\n * @param shouldGetNext Choose to get next or previous element\r\n * @param isCycleAllowed\r\n * @return {Element|elem} The proper element\r\n */\r\n const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\r\n const listLength = list.length;\r\n let index = list.indexOf(activeElement);\r\n\r\n // if the element does not exist in the list return an element\r\n // depending on the direction and if cycle is allowed\r\n if (index === -1) {\r\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\r\n }\r\n index += shouldGetNext ? 1 : -1;\r\n if (isCycleAllowed) {\r\n index = (index + listLength) % listLength;\r\n }\r\n return list[Math.max(0, Math.min(index, listLength - 1))];\r\n };\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap dom/event-handler.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\r\n const stripNameRegex = /\\..*/;\r\n const stripUidRegex = /::\\d+$/;\r\n const eventRegistry = {}; // Events storage\r\n let uidEvent = 1;\r\n const customEvents = {\r\n mouseenter: 'mouseover',\r\n mouseleave: 'mouseout'\r\n };\r\n const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\r\n\r\n /**\r\n * Private methods\r\n */\r\n\r\n function makeEventUid(element, uid) {\r\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\r\n }\r\n function getElementEvents(element) {\r\n const uid = makeEventUid(element);\r\n element.uidEvent = uid;\r\n eventRegistry[uid] = eventRegistry[uid] || {};\r\n return eventRegistry[uid];\r\n }\r\n function bootstrapHandler(element, fn) {\r\n return function handler(event) {\r\n hydrateObj(event, {\r\n delegateTarget: element\r\n });\r\n if (handler.oneOff) {\r\n EventHandler.off(element, event.type, fn);\r\n }\r\n return fn.apply(element, [event]);\r\n };\r\n }\r\n function bootstrapDelegationHandler(element, selector, fn) {\r\n return function handler(event) {\r\n const domElements = element.querySelectorAll(selector);\r\n for (let {\r\n target\r\n } = event; target && target !== this; target = target.parentNode) {\r\n for (const domElement of domElements) {\r\n if (domElement !== target) {\r\n continue;\r\n }\r\n hydrateObj(event, {\r\n delegateTarget: target\r\n });\r\n if (handler.oneOff) {\r\n EventHandler.off(element, event.type, selector, fn);\r\n }\r\n return fn.apply(target, [event]);\r\n }\r\n }\r\n };\r\n }\r\n function findHandler(events, callable, delegationSelector = null) {\r\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\r\n }\r\n function normalizeParameters(originalTypeEvent, handler, delegationFunction) {\r\n const isDelegated = typeof handler === 'string';\r\n // TODO: tooltip passes `false` instead of selector, so we need to check\r\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\r\n let typeEvent = getTypeEvent(originalTypeEvent);\r\n if (!nativeEvents.has(typeEvent)) {\r\n typeEvent = originalTypeEvent;\r\n }\r\n return [isDelegated, callable, typeEvent];\r\n }\r\n function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\r\n if (typeof originalTypeEvent !== 'string' || !element) {\r\n return;\r\n }\r\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\r\n\r\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\r\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\r\n if (originalTypeEvent in customEvents) {\r\n const wrapFunction = fn => {\r\n return function (event) {\r\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\r\n return fn.call(this, event);\r\n }\r\n };\r\n };\r\n callable = wrapFunction(callable);\r\n }\r\n const events = getElementEvents(element);\r\n const handlers = events[typeEvent] || (events[typeEvent] = {});\r\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\r\n if (previousFunction) {\r\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\r\n return;\r\n }\r\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\r\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\r\n fn.delegationSelector = isDelegated ? handler : null;\r\n fn.callable = callable;\r\n fn.oneOff = oneOff;\r\n fn.uidEvent = uid;\r\n handlers[uid] = fn;\r\n element.addEventListener(typeEvent, fn, isDelegated);\r\n }\r\n function removeHandler(element, events, typeEvent, handler, delegationSelector) {\r\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\r\n if (!fn) {\r\n return;\r\n }\r\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\r\n delete events[typeEvent][fn.uidEvent];\r\n }\r\n function removeNamespacedHandlers(element, events, typeEvent, namespace) {\r\n const storeElementEvent = events[typeEvent] || {};\r\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\r\n if (handlerKey.includes(namespace)) {\r\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\r\n }\r\n }\r\n }\r\n function getTypeEvent(event) {\r\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\r\n event = event.replace(stripNameRegex, '');\r\n return customEvents[event] || event;\r\n }\r\n const EventHandler = {\r\n on(element, event, handler, delegationFunction) {\r\n addHandler(element, event, handler, delegationFunction, false);\r\n },\r\n one(element, event, handler, delegationFunction) {\r\n addHandler(element, event, handler, delegationFunction, true);\r\n },\r\n off(element, originalTypeEvent, handler, delegationFunction) {\r\n if (typeof originalTypeEvent !== 'string' || !element) {\r\n return;\r\n }\r\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\r\n const inNamespace = typeEvent !== originalTypeEvent;\r\n const events = getElementEvents(element);\r\n const storeElementEvent = events[typeEvent] || {};\r\n const isNamespace = originalTypeEvent.startsWith('.');\r\n if (typeof callable !== 'undefined') {\r\n // Simplest case: handler is passed, remove that listener ONLY.\r\n if (!Object.keys(storeElementEvent).length) {\r\n return;\r\n }\r\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\r\n return;\r\n }\r\n if (isNamespace) {\r\n for (const elementEvent of Object.keys(events)) {\r\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\r\n }\r\n }\r\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\r\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\r\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\r\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\r\n }\r\n }\r\n },\r\n trigger(element, event, args) {\r\n if (typeof event !== 'string' || !element) {\r\n return null;\r\n }\r\n const $ = getjQuery();\r\n const typeEvent = getTypeEvent(event);\r\n const inNamespace = event !== typeEvent;\r\n let jQueryEvent = null;\r\n let bubbles = true;\r\n let nativeDispatch = true;\r\n let defaultPrevented = false;\r\n if (inNamespace && $) {\r\n jQueryEvent = $.Event(event, args);\r\n $(element).trigger(jQueryEvent);\r\n bubbles = !jQueryEvent.isPropagationStopped();\r\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\r\n defaultPrevented = jQueryEvent.isDefaultPrevented();\r\n }\r\n const evt = hydrateObj(new Event(event, {\r\n bubbles,\r\n cancelable: true\r\n }), args);\r\n if (defaultPrevented) {\r\n evt.preventDefault();\r\n }\r\n if (nativeDispatch) {\r\n element.dispatchEvent(evt);\r\n }\r\n if (evt.defaultPrevented && jQueryEvent) {\r\n jQueryEvent.preventDefault();\r\n }\r\n return evt;\r\n }\r\n };\r\n function hydrateObj(obj, meta = {}) {\r\n for (const [key, value] of Object.entries(meta)) {\r\n try {\r\n obj[key] = value;\r\n } catch (_unused) {\r\n Object.defineProperty(obj, key, {\r\n configurable: true,\r\n get() {\r\n return value;\r\n }\r\n });\r\n }\r\n }\r\n return obj;\r\n }\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap dom/manipulator.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n function normalizeData(value) {\r\n if (value === 'true') {\r\n return true;\r\n }\r\n if (value === 'false') {\r\n return false;\r\n }\r\n if (value === Number(value).toString()) {\r\n return Number(value);\r\n }\r\n if (value === '' || value === 'null') {\r\n return null;\r\n }\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n try {\r\n return JSON.parse(decodeURIComponent(value));\r\n } catch (_unused) {\r\n return value;\r\n }\r\n }\r\n function normalizeDataKey(key) {\r\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\r\n }\r\n const Manipulator = {\r\n setDataAttribute(element, key, value) {\r\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\r\n },\r\n removeDataAttribute(element, key) {\r\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\r\n },\r\n getDataAttributes(element) {\r\n if (!element) {\r\n return {};\r\n }\r\n const attributes = {};\r\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\r\n for (const key of bsKeys) {\r\n let pureKey = key.replace(/^bs/, '');\r\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\r\n attributes[pureKey] = normalizeData(element.dataset[key]);\r\n }\r\n return attributes;\r\n },\r\n getDataAttribute(element, key) {\r\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\r\n }\r\n };\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/config.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Config {\r\n // Getters\r\n static get Default() {\r\n return {};\r\n }\r\n static get DefaultType() {\r\n return {};\r\n }\r\n static get NAME() {\r\n throw new Error('You have to implement the static method \"NAME\", for each component!');\r\n }\r\n _getConfig(config) {\r\n config = this._mergeConfigObj(config);\r\n config = this._configAfterMerge(config);\r\n this._typeCheckConfig(config);\r\n return config;\r\n }\r\n _configAfterMerge(config) {\r\n return config;\r\n }\r\n _mergeConfigObj(config, element) {\r\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\r\n\r\n return {\r\n ...this.constructor.Default,\r\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\r\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\r\n ...(typeof config === 'object' ? config : {})\r\n };\r\n }\r\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\r\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\r\n const value = config[property];\r\n const valueType = isElement(value) ? 'element' : toType(value);\r\n if (!new RegExp(expectedTypes).test(valueType)) {\r\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap base-component.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const VERSION = '5.3.3';\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class BaseComponent extends Config {\r\n constructor(element, config) {\r\n super();\r\n element = getElement(element);\r\n if (!element) {\r\n return;\r\n }\r\n this._element = element;\r\n this._config = this._getConfig(config);\r\n Data.set(this._element, this.constructor.DATA_KEY, this);\r\n }\r\n\r\n // Public\r\n dispose() {\r\n Data.remove(this._element, this.constructor.DATA_KEY);\r\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\r\n for (const propertyName of Object.getOwnPropertyNames(this)) {\r\n this[propertyName] = null;\r\n }\r\n }\r\n _queueCallback(callback, element, isAnimated = true) {\r\n executeAfterTransition(callback, element, isAnimated);\r\n }\r\n _getConfig(config) {\r\n config = this._mergeConfigObj(config, this._element);\r\n config = this._configAfterMerge(config);\r\n this._typeCheckConfig(config);\r\n return config;\r\n }\r\n\r\n // Static\r\n static getInstance(element) {\r\n return Data.get(getElement(element), this.DATA_KEY);\r\n }\r\n static getOrCreateInstance(element, config = {}) {\r\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\r\n }\r\n static get VERSION() {\r\n return VERSION;\r\n }\r\n static get DATA_KEY() {\r\n return `bs.${this.NAME}`;\r\n }\r\n static get EVENT_KEY() {\r\n return `.${this.DATA_KEY}`;\r\n }\r\n static eventName(name) {\r\n return `${name}${this.EVENT_KEY}`;\r\n }\r\n }\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap dom/selector-engine.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n const getSelector = element => {\r\n let selector = element.getAttribute('data-bs-target');\r\n if (!selector || selector === '#') {\r\n let hrefAttribute = element.getAttribute('href');\r\n\r\n // The only valid content that could double as a selector are IDs or classes,\r\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\r\n // `document.querySelector` will rightfully complain it is invalid.\r\n // See https://github.com/twbs/bootstrap/issues/32273\r\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\r\n return null;\r\n }\r\n\r\n // Just in case some CMS puts out a full URL with the anchor appended\r\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\r\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\r\n }\r\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\r\n }\r\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\r\n };\r\n const SelectorEngine = {\r\n find(selector, element = document.documentElement) {\r\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\r\n },\r\n findOne(selector, element = document.documentElement) {\r\n return Element.prototype.querySelector.call(element, selector);\r\n },\r\n children(element, selector) {\r\n return [].concat(...element.children).filter(child => child.matches(selector));\r\n },\r\n parents(element, selector) {\r\n const parents = [];\r\n let ancestor = element.parentNode.closest(selector);\r\n while (ancestor) {\r\n parents.push(ancestor);\r\n ancestor = ancestor.parentNode.closest(selector);\r\n }\r\n return parents;\r\n },\r\n prev(element, selector) {\r\n let previous = element.previousElementSibling;\r\n while (previous) {\r\n if (previous.matches(selector)) {\r\n return [previous];\r\n }\r\n previous = previous.previousElementSibling;\r\n }\r\n return [];\r\n },\r\n // TODO: this is now unused; remove later along with prev()\r\n next(element, selector) {\r\n let next = element.nextElementSibling;\r\n while (next) {\r\n if (next.matches(selector)) {\r\n return [next];\r\n }\r\n next = next.nextElementSibling;\r\n }\r\n return [];\r\n },\r\n focusableChildren(element) {\r\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\r\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\r\n },\r\n getSelectorFromElement(element) {\r\n const selector = getSelector(element);\r\n if (selector) {\r\n return SelectorEngine.findOne(selector) ? selector : null;\r\n }\r\n return null;\r\n },\r\n getElementFromSelector(element) {\r\n const selector = getSelector(element);\r\n return selector ? SelectorEngine.findOne(selector) : null;\r\n },\r\n getMultipleElementsFromSelector(element) {\r\n const selector = getSelector(element);\r\n return selector ? SelectorEngine.find(selector) : [];\r\n }\r\n };\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/component-functions.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n const enableDismissTrigger = (component, method = 'hide') => {\r\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\r\n const name = component.NAME;\r\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\r\n if (['A', 'AREA'].includes(this.tagName)) {\r\n event.preventDefault();\r\n }\r\n if (isDisabled(this)) {\r\n return;\r\n }\r\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\r\n const instance = component.getOrCreateInstance(target);\r\n\r\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\r\n instance[method]();\r\n });\r\n };\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap alert.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$f = 'alert';\r\n const DATA_KEY$a = 'bs.alert';\r\n const EVENT_KEY$b = `.${DATA_KEY$a}`;\r\n const EVENT_CLOSE = `close${EVENT_KEY$b}`;\r\n const EVENT_CLOSED = `closed${EVENT_KEY$b}`;\r\n const CLASS_NAME_FADE$5 = 'fade';\r\n const CLASS_NAME_SHOW$8 = 'show';\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Alert extends BaseComponent {\r\n // Getters\r\n static get NAME() {\r\n return NAME$f;\r\n }\r\n\r\n // Public\r\n close() {\r\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\r\n if (closeEvent.defaultPrevented) {\r\n return;\r\n }\r\n this._element.classList.remove(CLASS_NAME_SHOW$8);\r\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\r\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\r\n }\r\n\r\n // Private\r\n _destroyElement() {\r\n this._element.remove();\r\n EventHandler.trigger(this._element, EVENT_CLOSED);\r\n this.dispose();\r\n }\r\n\r\n // Static\r\n static jQueryInterface(config) {\r\n return this.each(function () {\r\n const data = Alert.getOrCreateInstance(this);\r\n if (typeof config !== 'string') {\r\n return;\r\n }\r\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\r\n throw new TypeError(`No method named \"${config}\"`);\r\n }\r\n data[config](this);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Data API implementation\r\n */\r\n\r\n enableDismissTrigger(Alert, 'close');\r\n\r\n /**\r\n * jQuery\r\n */\r\n\r\n defineJQueryPlugin(Alert);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap button.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$e = 'button';\r\n const DATA_KEY$9 = 'bs.button';\r\n const EVENT_KEY$a = `.${DATA_KEY$9}`;\r\n const DATA_API_KEY$6 = '.data-api';\r\n const CLASS_NAME_ACTIVE$3 = 'active';\r\n const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\r\n const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Button extends BaseComponent {\r\n // Getters\r\n static get NAME() {\r\n return NAME$e;\r\n }\r\n\r\n // Public\r\n toggle() {\r\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\r\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\r\n }\r\n\r\n // Static\r\n static jQueryInterface(config) {\r\n return this.each(function () {\r\n const data = Button.getOrCreateInstance(this);\r\n if (config === 'toggle') {\r\n data[config]();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Data API implementation\r\n */\r\n\r\n EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\r\n event.preventDefault();\r\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\r\n const data = Button.getOrCreateInstance(button);\r\n data.toggle();\r\n });\r\n\r\n /**\r\n * jQuery\r\n */\r\n\r\n defineJQueryPlugin(Button);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/swipe.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$d = 'swipe';\r\n const EVENT_KEY$9 = '.bs.swipe';\r\n const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\r\n const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\r\n const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\r\n const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\r\n const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\r\n const POINTER_TYPE_TOUCH = 'touch';\r\n const POINTER_TYPE_PEN = 'pen';\r\n const CLASS_NAME_POINTER_EVENT = 'pointer-event';\r\n const SWIPE_THRESHOLD = 40;\r\n const Default$c = {\r\n endCallback: null,\r\n leftCallback: null,\r\n rightCallback: null\r\n };\r\n const DefaultType$c = {\r\n endCallback: '(function|null)',\r\n leftCallback: '(function|null)',\r\n rightCallback: '(function|null)'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Swipe extends Config {\r\n constructor(element, config) {\r\n super();\r\n this._element = element;\r\n if (!element || !Swipe.isSupported()) {\r\n return;\r\n }\r\n this._config = this._getConfig(config);\r\n this._deltaX = 0;\r\n this._supportPointerEvents = Boolean(window.PointerEvent);\r\n this._initEvents();\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$c;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$c;\r\n }\r\n static get NAME() {\r\n return NAME$d;\r\n }\r\n\r\n // Public\r\n dispose() {\r\n EventHandler.off(this._element, EVENT_KEY$9);\r\n }\r\n\r\n // Private\r\n _start(event) {\r\n if (!this._supportPointerEvents) {\r\n this._deltaX = event.touches[0].clientX;\r\n return;\r\n }\r\n if (this._eventIsPointerPenTouch(event)) {\r\n this._deltaX = event.clientX;\r\n }\r\n }\r\n _end(event) {\r\n if (this._eventIsPointerPenTouch(event)) {\r\n this._deltaX = event.clientX - this._deltaX;\r\n }\r\n this._handleSwipe();\r\n execute(this._config.endCallback);\r\n }\r\n _move(event) {\r\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\r\n }\r\n _handleSwipe() {\r\n const absDeltaX = Math.abs(this._deltaX);\r\n if (absDeltaX <= SWIPE_THRESHOLD) {\r\n return;\r\n }\r\n const direction = absDeltaX / this._deltaX;\r\n this._deltaX = 0;\r\n if (!direction) {\r\n return;\r\n }\r\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\r\n }\r\n _initEvents() {\r\n if (this._supportPointerEvents) {\r\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\r\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\r\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\r\n } else {\r\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\r\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\r\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\r\n }\r\n }\r\n _eventIsPointerPenTouch(event) {\r\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\r\n }\r\n\r\n // Static\r\n static isSupported() {\r\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\r\n }\r\n }\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap carousel.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$c = 'carousel';\r\n const DATA_KEY$8 = 'bs.carousel';\r\n const EVENT_KEY$8 = `.${DATA_KEY$8}`;\r\n const DATA_API_KEY$5 = '.data-api';\r\n const ARROW_LEFT_KEY$1 = 'ArrowLeft';\r\n const ARROW_RIGHT_KEY$1 = 'ArrowRight';\r\n const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\r\n\r\n const ORDER_NEXT = 'next';\r\n const ORDER_PREV = 'prev';\r\n const DIRECTION_LEFT = 'left';\r\n const DIRECTION_RIGHT = 'right';\r\n const EVENT_SLIDE = `slide${EVENT_KEY$8}`;\r\n const EVENT_SLID = `slid${EVENT_KEY$8}`;\r\n const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\r\n const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\r\n const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\r\n const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\r\n const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\r\n const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\r\n const CLASS_NAME_CAROUSEL = 'carousel';\r\n const CLASS_NAME_ACTIVE$2 = 'active';\r\n const CLASS_NAME_SLIDE = 'slide';\r\n const CLASS_NAME_END = 'carousel-item-end';\r\n const CLASS_NAME_START = 'carousel-item-start';\r\n const CLASS_NAME_NEXT = 'carousel-item-next';\r\n const CLASS_NAME_PREV = 'carousel-item-prev';\r\n const SELECTOR_ACTIVE = '.active';\r\n const SELECTOR_ITEM = '.carousel-item';\r\n const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\r\n const SELECTOR_ITEM_IMG = '.carousel-item img';\r\n const SELECTOR_INDICATORS = '.carousel-indicators';\r\n const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\r\n const SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\r\n const KEY_TO_DIRECTION = {\r\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\r\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\r\n };\r\n const Default$b = {\r\n interval: 5000,\r\n keyboard: true,\r\n pause: 'hover',\r\n ride: false,\r\n touch: true,\r\n wrap: true\r\n };\r\n const DefaultType$b = {\r\n interval: '(number|boolean)',\r\n // TODO:v6 remove boolean support\r\n keyboard: 'boolean',\r\n pause: '(string|boolean)',\r\n ride: '(boolean|string)',\r\n touch: 'boolean',\r\n wrap: 'boolean'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Carousel extends BaseComponent {\r\n constructor(element, config) {\r\n super(element, config);\r\n this._interval = null;\r\n this._activeElement = null;\r\n this._isSliding = false;\r\n this.touchTimeout = null;\r\n this._swipeHelper = null;\r\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\r\n this._addEventListeners();\r\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\r\n this.cycle();\r\n }\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$b;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$b;\r\n }\r\n static get NAME() {\r\n return NAME$c;\r\n }\r\n\r\n // Public\r\n next() {\r\n this._slide(ORDER_NEXT);\r\n }\r\n nextWhenVisible() {\r\n // FIXME TODO use `document.visibilityState`\r\n // Don't call next when the page isn't visible\r\n // or the carousel or its parent isn't visible\r\n if (!document.hidden && isVisible(this._element)) {\r\n this.next();\r\n }\r\n }\r\n prev() {\r\n this._slide(ORDER_PREV);\r\n }\r\n pause() {\r\n if (this._isSliding) {\r\n triggerTransitionEnd(this._element);\r\n }\r\n this._clearInterval();\r\n }\r\n cycle() {\r\n this._clearInterval();\r\n this._updateInterval();\r\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\r\n }\r\n _maybeEnableCycle() {\r\n if (!this._config.ride) {\r\n return;\r\n }\r\n if (this._isSliding) {\r\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\r\n return;\r\n }\r\n this.cycle();\r\n }\r\n to(index) {\r\n const items = this._getItems();\r\n if (index > items.length - 1 || index < 0) {\r\n return;\r\n }\r\n if (this._isSliding) {\r\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\r\n return;\r\n }\r\n const activeIndex = this._getItemIndex(this._getActive());\r\n if (activeIndex === index) {\r\n return;\r\n }\r\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\r\n this._slide(order, items[index]);\r\n }\r\n dispose() {\r\n if (this._swipeHelper) {\r\n this._swipeHelper.dispose();\r\n }\r\n super.dispose();\r\n }\r\n\r\n // Private\r\n _configAfterMerge(config) {\r\n config.defaultInterval = config.interval;\r\n return config;\r\n }\r\n _addEventListeners() {\r\n if (this._config.keyboard) {\r\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\r\n }\r\n if (this._config.pause === 'hover') {\r\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\r\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\r\n }\r\n if (this._config.touch && Swipe.isSupported()) {\r\n this._addTouchEventListeners();\r\n }\r\n }\r\n _addTouchEventListeners() {\r\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\r\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\r\n }\r\n const endCallBack = () => {\r\n if (this._config.pause !== 'hover') {\r\n return;\r\n }\r\n\r\n // If it's a touch-enabled device, mouseenter/leave are fired as\r\n // part of the mouse compatibility events on first tap - the carousel\r\n // would stop cycling until user tapped out of it;\r\n // here, we listen for touchend, explicitly pause the carousel\r\n // (as if it's the second time we tap on it, mouseenter compat event\r\n // is NOT fired) and after a timeout (to allow for mouse compatibility\r\n // events to fire) we explicitly restart cycling\r\n\r\n this.pause();\r\n if (this.touchTimeout) {\r\n clearTimeout(this.touchTimeout);\r\n }\r\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\r\n };\r\n const swipeConfig = {\r\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\r\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\r\n endCallback: endCallBack\r\n };\r\n this._swipeHelper = new Swipe(this._element, swipeConfig);\r\n }\r\n _keydown(event) {\r\n if (/input|textarea/i.test(event.target.tagName)) {\r\n return;\r\n }\r\n const direction = KEY_TO_DIRECTION[event.key];\r\n if (direction) {\r\n event.preventDefault();\r\n this._slide(this._directionToOrder(direction));\r\n }\r\n }\r\n _getItemIndex(element) {\r\n return this._getItems().indexOf(element);\r\n }\r\n _setActiveIndicatorElement(index) {\r\n if (!this._indicatorsElement) {\r\n return;\r\n }\r\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\r\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\r\n activeIndicator.removeAttribute('aria-current');\r\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\r\n if (newActiveIndicator) {\r\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\r\n newActiveIndicator.setAttribute('aria-current', 'true');\r\n }\r\n }\r\n _updateInterval() {\r\n const element = this._activeElement || this._getActive();\r\n if (!element) {\r\n return;\r\n }\r\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\r\n this._config.interval = elementInterval || this._config.defaultInterval;\r\n }\r\n _slide(order, element = null) {\r\n if (this._isSliding) {\r\n return;\r\n }\r\n const activeElement = this._getActive();\r\n const isNext = order === ORDER_NEXT;\r\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\r\n if (nextElement === activeElement) {\r\n return;\r\n }\r\n const nextElementIndex = this._getItemIndex(nextElement);\r\n const triggerEvent = eventName => {\r\n return EventHandler.trigger(this._element, eventName, {\r\n relatedTarget: nextElement,\r\n direction: this._orderToDirection(order),\r\n from: this._getItemIndex(activeElement),\r\n to: nextElementIndex\r\n });\r\n };\r\n const slideEvent = triggerEvent(EVENT_SLIDE);\r\n if (slideEvent.defaultPrevented) {\r\n return;\r\n }\r\n if (!activeElement || !nextElement) {\r\n // Some weirdness is happening, so we bail\r\n // TODO: change tests that use empty divs to avoid this check\r\n return;\r\n }\r\n const isCycling = Boolean(this._interval);\r\n this.pause();\r\n this._isSliding = true;\r\n this._setActiveIndicatorElement(nextElementIndex);\r\n this._activeElement = nextElement;\r\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\r\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\r\n nextElement.classList.add(orderClassName);\r\n reflow(nextElement);\r\n activeElement.classList.add(directionalClassName);\r\n nextElement.classList.add(directionalClassName);\r\n const completeCallBack = () => {\r\n nextElement.classList.remove(directionalClassName, orderClassName);\r\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\r\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\r\n this._isSliding = false;\r\n triggerEvent(EVENT_SLID);\r\n };\r\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\r\n if (isCycling) {\r\n this.cycle();\r\n }\r\n }\r\n _isAnimated() {\r\n return this._element.classList.contains(CLASS_NAME_SLIDE);\r\n }\r\n _getActive() {\r\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\r\n }\r\n _getItems() {\r\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\r\n }\r\n _clearInterval() {\r\n if (this._interval) {\r\n clearInterval(this._interval);\r\n this._interval = null;\r\n }\r\n }\r\n _directionToOrder(direction) {\r\n if (isRTL()) {\r\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\r\n }\r\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\r\n }\r\n _orderToDirection(order) {\r\n if (isRTL()) {\r\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\r\n }\r\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\r\n }\r\n\r\n // Static\r\n static jQueryInterface(config) {\r\n return this.each(function () {\r\n const data = Carousel.getOrCreateInstance(this, config);\r\n if (typeof config === 'number') {\r\n data.to(config);\r\n return;\r\n }\r\n if (typeof config === 'string') {\r\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\r\n throw new TypeError(`No method named \"${config}\"`);\r\n }\r\n data[config]();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Data API implementation\r\n */\r\n\r\n EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\r\n const target = SelectorEngine.getElementFromSelector(this);\r\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\r\n return;\r\n }\r\n event.preventDefault();\r\n const carousel = Carousel.getOrCreateInstance(target);\r\n const slideIndex = this.getAttribute('data-bs-slide-to');\r\n if (slideIndex) {\r\n carousel.to(slideIndex);\r\n carousel._maybeEnableCycle();\r\n return;\r\n }\r\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\r\n carousel.next();\r\n carousel._maybeEnableCycle();\r\n return;\r\n }\r\n carousel.prev();\r\n carousel._maybeEnableCycle();\r\n });\r\n EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\r\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\r\n for (const carousel of carousels) {\r\n Carousel.getOrCreateInstance(carousel);\r\n }\r\n });\r\n\r\n /**\r\n * jQuery\r\n */\r\n\r\n defineJQueryPlugin(Carousel);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap collapse.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$b = 'collapse';\r\n const DATA_KEY$7 = 'bs.collapse';\r\n const EVENT_KEY$7 = `.${DATA_KEY$7}`;\r\n const DATA_API_KEY$4 = '.data-api';\r\n const EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\r\n const EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\r\n const EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\r\n const EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\r\n const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\r\n const CLASS_NAME_SHOW$7 = 'show';\r\n const CLASS_NAME_COLLAPSE = 'collapse';\r\n const CLASS_NAME_COLLAPSING = 'collapsing';\r\n const CLASS_NAME_COLLAPSED = 'collapsed';\r\n const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\r\n const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\r\n const WIDTH = 'width';\r\n const HEIGHT = 'height';\r\n const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\r\n const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\r\n const Default$a = {\r\n parent: null,\r\n toggle: true\r\n };\r\n const DefaultType$a = {\r\n parent: '(null|element)',\r\n toggle: 'boolean'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Collapse extends BaseComponent {\r\n constructor(element, config) {\r\n super(element, config);\r\n this._isTransitioning = false;\r\n this._triggerArray = [];\r\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\r\n for (const elem of toggleList) {\r\n const selector = SelectorEngine.getSelectorFromElement(elem);\r\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\r\n if (selector !== null && filterElement.length) {\r\n this._triggerArray.push(elem);\r\n }\r\n }\r\n this._initializeChildren();\r\n if (!this._config.parent) {\r\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\r\n }\r\n if (this._config.toggle) {\r\n this.toggle();\r\n }\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$a;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$a;\r\n }\r\n static get NAME() {\r\n return NAME$b;\r\n }\r\n\r\n // Public\r\n toggle() {\r\n if (this._isShown()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n show() {\r\n if (this._isTransitioning || this._isShown()) {\r\n return;\r\n }\r\n let activeChildren = [];\r\n\r\n // find active children\r\n if (this._config.parent) {\r\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\r\n toggle: false\r\n }));\r\n }\r\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\r\n return;\r\n }\r\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\r\n if (startEvent.defaultPrevented) {\r\n return;\r\n }\r\n for (const activeInstance of activeChildren) {\r\n activeInstance.hide();\r\n }\r\n const dimension = this._getDimension();\r\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\r\n this._element.classList.add(CLASS_NAME_COLLAPSING);\r\n this._element.style[dimension] = 0;\r\n this._addAriaAndCollapsedClass(this._triggerArray, true);\r\n this._isTransitioning = true;\r\n const complete = () => {\r\n this._isTransitioning = false;\r\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\r\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\r\n this._element.style[dimension] = '';\r\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\r\n };\r\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\r\n const scrollSize = `scroll${capitalizedDimension}`;\r\n this._queueCallback(complete, this._element, true);\r\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\r\n }\r\n hide() {\r\n if (this._isTransitioning || !this._isShown()) {\r\n return;\r\n }\r\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\r\n if (startEvent.defaultPrevented) {\r\n return;\r\n }\r\n const dimension = this._getDimension();\r\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\r\n reflow(this._element);\r\n this._element.classList.add(CLASS_NAME_COLLAPSING);\r\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\r\n for (const trigger of this._triggerArray) {\r\n const element = SelectorEngine.getElementFromSelector(trigger);\r\n if (element && !this._isShown(element)) {\r\n this._addAriaAndCollapsedClass([trigger], false);\r\n }\r\n }\r\n this._isTransitioning = true;\r\n const complete = () => {\r\n this._isTransitioning = false;\r\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\r\n this._element.classList.add(CLASS_NAME_COLLAPSE);\r\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\r\n };\r\n this._element.style[dimension] = '';\r\n this._queueCallback(complete, this._element, true);\r\n }\r\n _isShown(element = this._element) {\r\n return element.classList.contains(CLASS_NAME_SHOW$7);\r\n }\r\n\r\n // Private\r\n _configAfterMerge(config) {\r\n config.toggle = Boolean(config.toggle); // Coerce string values\r\n config.parent = getElement(config.parent);\r\n return config;\r\n }\r\n _getDimension() {\r\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\r\n }\r\n _initializeChildren() {\r\n if (!this._config.parent) {\r\n return;\r\n }\r\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\r\n for (const element of children) {\r\n const selected = SelectorEngine.getElementFromSelector(element);\r\n if (selected) {\r\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\r\n }\r\n }\r\n }\r\n _getFirstLevelChildren(selector) {\r\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\r\n // remove children if greater depth\r\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\r\n }\r\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\r\n if (!triggerArray.length) {\r\n return;\r\n }\r\n for (const element of triggerArray) {\r\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\r\n element.setAttribute('aria-expanded', isOpen);\r\n }\r\n }\r\n\r\n // Static\r\n static jQueryInterface(config) {\r\n const _config = {};\r\n if (typeof config === 'string' && /show|hide/.test(config)) {\r\n _config.toggle = false;\r\n }\r\n return this.each(function () {\r\n const data = Collapse.getOrCreateInstance(this, _config);\r\n if (typeof config === 'string') {\r\n if (typeof data[config] === 'undefined') {\r\n throw new TypeError(`No method named \"${config}\"`);\r\n }\r\n data[config]();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Data API implementation\r\n */\r\n\r\n EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\r\n // preventDefault only for elements (which change the URL) not inside the collapsible element\r\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\r\n event.preventDefault();\r\n }\r\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\r\n Collapse.getOrCreateInstance(element, {\r\n toggle: false\r\n }).toggle();\r\n }\r\n });\r\n\r\n /**\r\n * jQuery\r\n */\r\n\r\n defineJQueryPlugin(Collapse);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap dropdown.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$a = 'dropdown';\r\n const DATA_KEY$6 = 'bs.dropdown';\r\n const EVENT_KEY$6 = `.${DATA_KEY$6}`;\r\n const DATA_API_KEY$3 = '.data-api';\r\n const ESCAPE_KEY$2 = 'Escape';\r\n const TAB_KEY$1 = 'Tab';\r\n const ARROW_UP_KEY$1 = 'ArrowUp';\r\n const ARROW_DOWN_KEY$1 = 'ArrowDown';\r\n const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\r\n\r\n const EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\r\n const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\r\n const EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\r\n const EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\r\n const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\r\n const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\r\n const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\r\n const CLASS_NAME_SHOW$6 = 'show';\r\n const CLASS_NAME_DROPUP = 'dropup';\r\n const CLASS_NAME_DROPEND = 'dropend';\r\n const CLASS_NAME_DROPSTART = 'dropstart';\r\n const CLASS_NAME_DROPUP_CENTER = 'dropup-center';\r\n const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\r\n const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\r\n const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\r\n const SELECTOR_MENU = '.dropdown-menu';\r\n const SELECTOR_NAVBAR = '.navbar';\r\n const SELECTOR_NAVBAR_NAV = '.navbar-nav';\r\n const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\r\n const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\r\n const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\r\n const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\r\n const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\r\n const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\r\n const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\r\n const PLACEMENT_TOPCENTER = 'top';\r\n const PLACEMENT_BOTTOMCENTER = 'bottom';\r\n const Default$9 = {\r\n autoClose: true,\r\n boundary: 'clippingParents',\r\n display: 'dynamic',\r\n offset: [0, 2],\r\n popperConfig: null,\r\n reference: 'toggle'\r\n };\r\n const DefaultType$9 = {\r\n autoClose: '(boolean|string)',\r\n boundary: '(string|element)',\r\n display: 'string',\r\n offset: '(array|string|function)',\r\n popperConfig: '(null|object|function)',\r\n reference: '(string|element|object)'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Dropdown extends BaseComponent {\r\n constructor(element, config) {\r\n super(element, config);\r\n this._popper = null;\r\n this._parent = this._element.parentNode; // dropdown wrapper\r\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\r\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\r\n this._inNavbar = this._detectNavbar();\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$9;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$9;\r\n }\r\n static get NAME() {\r\n return NAME$a;\r\n }\r\n\r\n // Public\r\n toggle() {\r\n return this._isShown() ? this.hide() : this.show();\r\n }\r\n show() {\r\n if (isDisabled(this._element) || this._isShown()) {\r\n return;\r\n }\r\n const relatedTarget = {\r\n relatedTarget: this._element\r\n };\r\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\r\n if (showEvent.defaultPrevented) {\r\n return;\r\n }\r\n this._createPopper();\r\n\r\n // If this is a touch-enabled device we add extra\r\n // empty mouseover listeners to the body's immediate children;\r\n // only needed because of broken event delegation on iOS\r\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\r\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\r\n for (const element of [].concat(...document.body.children)) {\r\n EventHandler.on(element, 'mouseover', noop);\r\n }\r\n }\r\n this._element.focus();\r\n this._element.setAttribute('aria-expanded', true);\r\n this._menu.classList.add(CLASS_NAME_SHOW$6);\r\n this._element.classList.add(CLASS_NAME_SHOW$6);\r\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\r\n }\r\n hide() {\r\n if (isDisabled(this._element) || !this._isShown()) {\r\n return;\r\n }\r\n const relatedTarget = {\r\n relatedTarget: this._element\r\n };\r\n this._completeHide(relatedTarget);\r\n }\r\n dispose() {\r\n if (this._popper) {\r\n this._popper.destroy();\r\n }\r\n super.dispose();\r\n }\r\n update() {\r\n this._inNavbar = this._detectNavbar();\r\n if (this._popper) {\r\n this._popper.update();\r\n }\r\n }\r\n\r\n // Private\r\n _completeHide(relatedTarget) {\r\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\r\n if (hideEvent.defaultPrevented) {\r\n return;\r\n }\r\n\r\n // If this is a touch-enabled device we remove the extra\r\n // empty mouseover listeners we added for iOS support\r\n if ('ontouchstart' in document.documentElement) {\r\n for (const element of [].concat(...document.body.children)) {\r\n EventHandler.off(element, 'mouseover', noop);\r\n }\r\n }\r\n if (this._popper) {\r\n this._popper.destroy();\r\n }\r\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\r\n this._element.classList.remove(CLASS_NAME_SHOW$6);\r\n this._element.setAttribute('aria-expanded', 'false');\r\n Manipulator.removeDataAttribute(this._menu, 'popper');\r\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\r\n }\r\n _getConfig(config) {\r\n config = super._getConfig(config);\r\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\r\n // Popper virtual elements require a getBoundingClientRect method\r\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\r\n }\r\n return config;\r\n }\r\n _createPopper() {\r\n if (typeof Popper__namespace === 'undefined') {\r\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\r\n }\r\n let referenceElement = this._element;\r\n if (this._config.reference === 'parent') {\r\n referenceElement = this._parent;\r\n } else if (isElement(this._config.reference)) {\r\n referenceElement = getElement(this._config.reference);\r\n } else if (typeof this._config.reference === 'object') {\r\n referenceElement = this._config.reference;\r\n }\r\n const popperConfig = this._getPopperConfig();\r\n this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);\r\n }\r\n _isShown() {\r\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\r\n }\r\n _getPlacement() {\r\n const parentDropdown = this._parent;\r\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\r\n return PLACEMENT_RIGHT;\r\n }\r\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\r\n return PLACEMENT_LEFT;\r\n }\r\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\r\n return PLACEMENT_TOPCENTER;\r\n }\r\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\r\n return PLACEMENT_BOTTOMCENTER;\r\n }\r\n\r\n // We need to trim the value because custom properties can also include spaces\r\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\r\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\r\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\r\n }\r\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\r\n }\r\n _detectNavbar() {\r\n return this._element.closest(SELECTOR_NAVBAR) !== null;\r\n }\r\n _getOffset() {\r\n const {\r\n offset\r\n } = this._config;\r\n if (typeof offset === 'string') {\r\n return offset.split(',').map(value => Number.parseInt(value, 10));\r\n }\r\n if (typeof offset === 'function') {\r\n return popperData => offset(popperData, this._element);\r\n }\r\n return offset;\r\n }\r\n _getPopperConfig() {\r\n const defaultBsPopperConfig = {\r\n placement: this._getPlacement(),\r\n modifiers: [{\r\n name: 'preventOverflow',\r\n options: {\r\n boundary: this._config.boundary\r\n }\r\n }, {\r\n name: 'offset',\r\n options: {\r\n offset: this._getOffset()\r\n }\r\n }]\r\n };\r\n\r\n // Disable Popper if we have a static display or Dropdown is in Navbar\r\n if (this._inNavbar || this._config.display === 'static') {\r\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\r\n defaultBsPopperConfig.modifiers = [{\r\n name: 'applyStyles',\r\n enabled: false\r\n }];\r\n }\r\n return {\r\n ...defaultBsPopperConfig,\r\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\r\n };\r\n }\r\n _selectMenuItem({\r\n key,\r\n target\r\n }) {\r\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\r\n if (!items.length) {\r\n return;\r\n }\r\n\r\n // if target isn't included in items (e.g. when expanding the dropdown)\r\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\r\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\r\n }\r\n\r\n // Static\r\n static jQueryInterface(config) {\r\n return this.each(function () {\r\n const data = Dropdown.getOrCreateInstance(this, config);\r\n if (typeof config !== 'string') {\r\n return;\r\n }\r\n if (typeof data[config] === 'undefined') {\r\n throw new TypeError(`No method named \"${config}\"`);\r\n }\r\n data[config]();\r\n });\r\n }\r\n static clearMenus(event) {\r\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\r\n return;\r\n }\r\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\r\n for (const toggle of openToggles) {\r\n const context = Dropdown.getInstance(toggle);\r\n if (!context || context._config.autoClose === false) {\r\n continue;\r\n }\r\n const composedPath = event.composedPath();\r\n const isMenuTarget = composedPath.includes(context._menu);\r\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\r\n continue;\r\n }\r\n\r\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\r\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\r\n continue;\r\n }\r\n const relatedTarget = {\r\n relatedTarget: context._element\r\n };\r\n if (event.type === 'click') {\r\n relatedTarget.clickEvent = event;\r\n }\r\n context._completeHide(relatedTarget);\r\n }\r\n }\r\n static dataApiKeydownHandler(event) {\r\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\r\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\r\n\r\n const isInput = /input|textarea/i.test(event.target.tagName);\r\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\r\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\r\n if (!isUpOrDownEvent && !isEscapeEvent) {\r\n return;\r\n }\r\n if (isInput && !isEscapeEvent) {\r\n return;\r\n }\r\n event.preventDefault();\r\n\r\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\r\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\r\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\r\n if (isUpOrDownEvent) {\r\n event.stopPropagation();\r\n instance.show();\r\n instance._selectMenuItem(event);\r\n return;\r\n }\r\n if (instance._isShown()) {\r\n // else is escape and we check if it is shown\r\n event.stopPropagation();\r\n instance.hide();\r\n getToggleButton.focus();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Data API implementation\r\n */\r\n\r\n EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\r\n EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\r\n EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\r\n EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\r\n EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\r\n event.preventDefault();\r\n Dropdown.getOrCreateInstance(this).toggle();\r\n });\r\n\r\n /**\r\n * jQuery\r\n */\r\n\r\n defineJQueryPlugin(Dropdown);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/backdrop.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$9 = 'backdrop';\r\n const CLASS_NAME_FADE$4 = 'fade';\r\n const CLASS_NAME_SHOW$5 = 'show';\r\n const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\r\n const Default$8 = {\r\n className: 'modal-backdrop',\r\n clickCallback: null,\r\n isAnimated: false,\r\n isVisible: true,\r\n // if false, we use the backdrop helper without adding any element to the dom\r\n rootElement: 'body' // give the choice to place backdrop under different elements\r\n };\r\n const DefaultType$8 = {\r\n className: 'string',\r\n clickCallback: '(function|null)',\r\n isAnimated: 'boolean',\r\n isVisible: 'boolean',\r\n rootElement: '(element|string)'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Backdrop extends Config {\r\n constructor(config) {\r\n super();\r\n this._config = this._getConfig(config);\r\n this._isAppended = false;\r\n this._element = null;\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$8;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$8;\r\n }\r\n static get NAME() {\r\n return NAME$9;\r\n }\r\n\r\n // Public\r\n show(callback) {\r\n if (!this._config.isVisible) {\r\n execute(callback);\r\n return;\r\n }\r\n this._append();\r\n const element = this._getElement();\r\n if (this._config.isAnimated) {\r\n reflow(element);\r\n }\r\n element.classList.add(CLASS_NAME_SHOW$5);\r\n this._emulateAnimation(() => {\r\n execute(callback);\r\n });\r\n }\r\n hide(callback) {\r\n if (!this._config.isVisible) {\r\n execute(callback);\r\n return;\r\n }\r\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\r\n this._emulateAnimation(() => {\r\n this.dispose();\r\n execute(callback);\r\n });\r\n }\r\n dispose() {\r\n if (!this._isAppended) {\r\n return;\r\n }\r\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\r\n this._element.remove();\r\n this._isAppended = false;\r\n }\r\n\r\n // Private\r\n _getElement() {\r\n if (!this._element) {\r\n const backdrop = document.createElement('div');\r\n backdrop.className = this._config.className;\r\n if (this._config.isAnimated) {\r\n backdrop.classList.add(CLASS_NAME_FADE$4);\r\n }\r\n this._element = backdrop;\r\n }\r\n return this._element;\r\n }\r\n _configAfterMerge(config) {\r\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\r\n config.rootElement = getElement(config.rootElement);\r\n return config;\r\n }\r\n _append() {\r\n if (this._isAppended) {\r\n return;\r\n }\r\n const element = this._getElement();\r\n this._config.rootElement.append(element);\r\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\r\n execute(this._config.clickCallback);\r\n });\r\n this._isAppended = true;\r\n }\r\n _emulateAnimation(callback) {\r\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\r\n }\r\n }\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/focustrap.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$8 = 'focustrap';\r\n const DATA_KEY$5 = 'bs.focustrap';\r\n const EVENT_KEY$5 = `.${DATA_KEY$5}`;\r\n const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\r\n const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\r\n const TAB_KEY = 'Tab';\r\n const TAB_NAV_FORWARD = 'forward';\r\n const TAB_NAV_BACKWARD = 'backward';\r\n const Default$7 = {\r\n autofocus: true,\r\n trapElement: null // The element to trap focus inside of\r\n };\r\n const DefaultType$7 = {\r\n autofocus: 'boolean',\r\n trapElement: 'element'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class FocusTrap extends Config {\r\n constructor(config) {\r\n super();\r\n this._config = this._getConfig(config);\r\n this._isActive = false;\r\n this._lastTabNavDirection = null;\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$7;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$7;\r\n }\r\n static get NAME() {\r\n return NAME$8;\r\n }\r\n\r\n // Public\r\n activate() {\r\n if (this._isActive) {\r\n return;\r\n }\r\n if (this._config.autofocus) {\r\n this._config.trapElement.focus();\r\n }\r\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\r\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\r\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\r\n this._isActive = true;\r\n }\r\n deactivate() {\r\n if (!this._isActive) {\r\n return;\r\n }\r\n this._isActive = false;\r\n EventHandler.off(document, EVENT_KEY$5);\r\n }\r\n\r\n // Private\r\n _handleFocusin(event) {\r\n const {\r\n trapElement\r\n } = this._config;\r\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\r\n return;\r\n }\r\n const elements = SelectorEngine.focusableChildren(trapElement);\r\n if (elements.length === 0) {\r\n trapElement.focus();\r\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\r\n elements[elements.length - 1].focus();\r\n } else {\r\n elements[0].focus();\r\n }\r\n }\r\n _handleKeydown(event) {\r\n if (event.key !== TAB_KEY) {\r\n return;\r\n }\r\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\r\n }\r\n }\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/scrollBar.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\r\n const SELECTOR_STICKY_CONTENT = '.sticky-top';\r\n const PROPERTY_PADDING = 'padding-right';\r\n const PROPERTY_MARGIN = 'margin-right';\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class ScrollBarHelper {\r\n constructor() {\r\n this._element = document.body;\r\n }\r\n\r\n // Public\r\n getWidth() {\r\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\r\n const documentWidth = document.documentElement.clientWidth;\r\n return Math.abs(window.innerWidth - documentWidth);\r\n }\r\n hide() {\r\n const width = this.getWidth();\r\n this._disableOverFlow();\r\n // give padding to element to balance the hidden scrollbar width\r\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\r\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\r\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\r\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\r\n }\r\n reset() {\r\n this._resetElementAttributes(this._element, 'overflow');\r\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\r\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\r\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\r\n }\r\n isOverflowing() {\r\n return this.getWidth() > 0;\r\n }\r\n\r\n // Private\r\n _disableOverFlow() {\r\n this._saveInitialAttribute(this._element, 'overflow');\r\n this._element.style.overflow = 'hidden';\r\n }\r\n _setElementAttributes(selector, styleProperty, callback) {\r\n const scrollbarWidth = this.getWidth();\r\n const manipulationCallBack = element => {\r\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\r\n return;\r\n }\r\n this._saveInitialAttribute(element, styleProperty);\r\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\r\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\r\n };\r\n this._applyManipulationCallback(selector, manipulationCallBack);\r\n }\r\n _saveInitialAttribute(element, styleProperty) {\r\n const actualValue = element.style.getPropertyValue(styleProperty);\r\n if (actualValue) {\r\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\r\n }\r\n }\r\n _resetElementAttributes(selector, styleProperty) {\r\n const manipulationCallBack = element => {\r\n const value = Manipulator.getDataAttribute(element, styleProperty);\r\n // We only want to remove the property if the value is `null`; the value can also be zero\r\n if (value === null) {\r\n element.style.removeProperty(styleProperty);\r\n return;\r\n }\r\n Manipulator.removeDataAttribute(element, styleProperty);\r\n element.style.setProperty(styleProperty, value);\r\n };\r\n this._applyManipulationCallback(selector, manipulationCallBack);\r\n }\r\n _applyManipulationCallback(selector, callBack) {\r\n if (isElement(selector)) {\r\n callBack(selector);\r\n return;\r\n }\r\n for (const sel of SelectorEngine.find(selector, this._element)) {\r\n callBack(sel);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap modal.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$7 = 'modal';\r\n const DATA_KEY$4 = 'bs.modal';\r\n const EVENT_KEY$4 = `.${DATA_KEY$4}`;\r\n const DATA_API_KEY$2 = '.data-api';\r\n const ESCAPE_KEY$1 = 'Escape';\r\n const EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\r\n const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\r\n const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\r\n const EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\r\n const EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\r\n const EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\r\n const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\r\n const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\r\n const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\r\n const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\r\n const CLASS_NAME_OPEN = 'modal-open';\r\n const CLASS_NAME_FADE$3 = 'fade';\r\n const CLASS_NAME_SHOW$4 = 'show';\r\n const CLASS_NAME_STATIC = 'modal-static';\r\n const OPEN_SELECTOR$1 = '.modal.show';\r\n const SELECTOR_DIALOG = '.modal-dialog';\r\n const SELECTOR_MODAL_BODY = '.modal-body';\r\n const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\r\n const Default$6 = {\r\n backdrop: true,\r\n focus: true,\r\n keyboard: true\r\n };\r\n const DefaultType$6 = {\r\n backdrop: '(boolean|string)',\r\n focus: 'boolean',\r\n keyboard: 'boolean'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Modal extends BaseComponent {\r\n constructor(element, config) {\r\n super(element, config);\r\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\r\n this._backdrop = this._initializeBackDrop();\r\n this._focustrap = this._initializeFocusTrap();\r\n this._isShown = false;\r\n this._isTransitioning = false;\r\n this._scrollBar = new ScrollBarHelper();\r\n this._addEventListeners();\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$6;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$6;\r\n }\r\n static get NAME() {\r\n return NAME$7;\r\n }\r\n\r\n // Public\r\n toggle(relatedTarget) {\r\n return this._isShown ? this.hide() : this.show(relatedTarget);\r\n }\r\n show(relatedTarget) {\r\n if (this._isShown || this._isTransitioning) {\r\n return;\r\n }\r\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\r\n relatedTarget\r\n });\r\n if (showEvent.defaultPrevented) {\r\n return;\r\n }\r\n this._isShown = true;\r\n this._isTransitioning = true;\r\n this._scrollBar.hide();\r\n document.body.classList.add(CLASS_NAME_OPEN);\r\n this._adjustDialog();\r\n this._backdrop.show(() => this._showElement(relatedTarget));\r\n }\r\n hide() {\r\n if (!this._isShown || this._isTransitioning) {\r\n return;\r\n }\r\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\r\n if (hideEvent.defaultPrevented) {\r\n return;\r\n }\r\n this._isShown = false;\r\n this._isTransitioning = true;\r\n this._focustrap.deactivate();\r\n this._element.classList.remove(CLASS_NAME_SHOW$4);\r\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\r\n }\r\n dispose() {\r\n EventHandler.off(window, EVENT_KEY$4);\r\n EventHandler.off(this._dialog, EVENT_KEY$4);\r\n this._backdrop.dispose();\r\n this._focustrap.deactivate();\r\n super.dispose();\r\n }\r\n handleUpdate() {\r\n this._adjustDialog();\r\n }\r\n\r\n // Private\r\n _initializeBackDrop() {\r\n return new Backdrop({\r\n isVisible: Boolean(this._config.backdrop),\r\n // 'static' option will be translated to true, and booleans will keep their value,\r\n isAnimated: this._isAnimated()\r\n });\r\n }\r\n _initializeFocusTrap() {\r\n return new FocusTrap({\r\n trapElement: this._element\r\n });\r\n }\r\n _showElement(relatedTarget) {\r\n // try to append dynamic modal\r\n if (!document.body.contains(this._element)) {\r\n document.body.append(this._element);\r\n }\r\n this._element.style.display = 'block';\r\n this._element.removeAttribute('aria-hidden');\r\n this._element.setAttribute('aria-modal', true);\r\n this._element.setAttribute('role', 'dialog');\r\n this._element.scrollTop = 0;\r\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\r\n if (modalBody) {\r\n modalBody.scrollTop = 0;\r\n }\r\n reflow(this._element);\r\n this._element.classList.add(CLASS_NAME_SHOW$4);\r\n const transitionComplete = () => {\r\n if (this._config.focus) {\r\n this._focustrap.activate();\r\n }\r\n this._isTransitioning = false;\r\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\r\n relatedTarget\r\n });\r\n };\r\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\r\n }\r\n _addEventListeners() {\r\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\r\n if (event.key !== ESCAPE_KEY$1) {\r\n return;\r\n }\r\n if (this._config.keyboard) {\r\n this.hide();\r\n return;\r\n }\r\n this._triggerBackdropTransition();\r\n });\r\n EventHandler.on(window, EVENT_RESIZE$1, () => {\r\n if (this._isShown && !this._isTransitioning) {\r\n this._adjustDialog();\r\n }\r\n });\r\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\r\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\r\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\r\n if (this._element !== event.target || this._element !== event2.target) {\r\n return;\r\n }\r\n if (this._config.backdrop === 'static') {\r\n this._triggerBackdropTransition();\r\n return;\r\n }\r\n if (this._config.backdrop) {\r\n this.hide();\r\n }\r\n });\r\n });\r\n }\r\n _hideModal() {\r\n this._element.style.display = 'none';\r\n this._element.setAttribute('aria-hidden', true);\r\n this._element.removeAttribute('aria-modal');\r\n this._element.removeAttribute('role');\r\n this._isTransitioning = false;\r\n this._backdrop.hide(() => {\r\n document.body.classList.remove(CLASS_NAME_OPEN);\r\n this._resetAdjustments();\r\n this._scrollBar.reset();\r\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\r\n });\r\n }\r\n _isAnimated() {\r\n return this._element.classList.contains(CLASS_NAME_FADE$3);\r\n }\r\n _triggerBackdropTransition() {\r\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\r\n if (hideEvent.defaultPrevented) {\r\n return;\r\n }\r\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\r\n const initialOverflowY = this._element.style.overflowY;\r\n // return if the following background transition hasn't yet completed\r\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\r\n return;\r\n }\r\n if (!isModalOverflowing) {\r\n this._element.style.overflowY = 'hidden';\r\n }\r\n this._element.classList.add(CLASS_NAME_STATIC);\r\n this._queueCallback(() => {\r\n this._element.classList.remove(CLASS_NAME_STATIC);\r\n this._queueCallback(() => {\r\n this._element.style.overflowY = initialOverflowY;\r\n }, this._dialog);\r\n }, this._dialog);\r\n this._element.focus();\r\n }\r\n\r\n /**\r\n * The following methods are used to handle overflowing modals\r\n */\r\n\r\n _adjustDialog() {\r\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\r\n const scrollbarWidth = this._scrollBar.getWidth();\r\n const isBodyOverflowing = scrollbarWidth > 0;\r\n if (isBodyOverflowing && !isModalOverflowing) {\r\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\r\n this._element.style[property] = `${scrollbarWidth}px`;\r\n }\r\n if (!isBodyOverflowing && isModalOverflowing) {\r\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\r\n this._element.style[property] = `${scrollbarWidth}px`;\r\n }\r\n }\r\n _resetAdjustments() {\r\n this._element.style.paddingLeft = '';\r\n this._element.style.paddingRight = '';\r\n }\r\n\r\n // Static\r\n static jQueryInterface(config, relatedTarget) {\r\n return this.each(function () {\r\n const data = Modal.getOrCreateInstance(this, config);\r\n if (typeof config !== 'string') {\r\n return;\r\n }\r\n if (typeof data[config] === 'undefined') {\r\n throw new TypeError(`No method named \"${config}\"`);\r\n }\r\n data[config](relatedTarget);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Data API implementation\r\n */\r\n\r\n EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\r\n const target = SelectorEngine.getElementFromSelector(this);\r\n if (['A', 'AREA'].includes(this.tagName)) {\r\n event.preventDefault();\r\n }\r\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\r\n if (showEvent.defaultPrevented) {\r\n // only register focus restorer if modal will actually get shown\r\n return;\r\n }\r\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\r\n if (isVisible(this)) {\r\n this.focus();\r\n }\r\n });\r\n });\r\n\r\n // avoid conflict when clicking modal toggler while another one is open\r\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\r\n if (alreadyOpen) {\r\n Modal.getInstance(alreadyOpen).hide();\r\n }\r\n const data = Modal.getOrCreateInstance(target);\r\n data.toggle(this);\r\n });\r\n enableDismissTrigger(Modal);\r\n\r\n /**\r\n * jQuery\r\n */\r\n\r\n defineJQueryPlugin(Modal);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap offcanvas.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$6 = 'offcanvas';\r\n const DATA_KEY$3 = 'bs.offcanvas';\r\n const EVENT_KEY$3 = `.${DATA_KEY$3}`;\r\n const DATA_API_KEY$1 = '.data-api';\r\n const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\r\n const ESCAPE_KEY = 'Escape';\r\n const CLASS_NAME_SHOW$3 = 'show';\r\n const CLASS_NAME_SHOWING$1 = 'showing';\r\n const CLASS_NAME_HIDING = 'hiding';\r\n const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\r\n const OPEN_SELECTOR = '.offcanvas.show';\r\n const EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\r\n const EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\r\n const EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\r\n const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\r\n const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\r\n const EVENT_RESIZE = `resize${EVENT_KEY$3}`;\r\n const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\r\n const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\r\n const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\r\n const Default$5 = {\r\n backdrop: true,\r\n keyboard: true,\r\n scroll: false\r\n };\r\n const DefaultType$5 = {\r\n backdrop: '(boolean|string)',\r\n keyboard: 'boolean',\r\n scroll: 'boolean'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Offcanvas extends BaseComponent {\r\n constructor(element, config) {\r\n super(element, config);\r\n this._isShown = false;\r\n this._backdrop = this._initializeBackDrop();\r\n this._focustrap = this._initializeFocusTrap();\r\n this._addEventListeners();\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$5;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$5;\r\n }\r\n static get NAME() {\r\n return NAME$6;\r\n }\r\n\r\n // Public\r\n toggle(relatedTarget) {\r\n return this._isShown ? this.hide() : this.show(relatedTarget);\r\n }\r\n show(relatedTarget) {\r\n if (this._isShown) {\r\n return;\r\n }\r\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\r\n relatedTarget\r\n });\r\n if (showEvent.defaultPrevented) {\r\n return;\r\n }\r\n this._isShown = true;\r\n this._backdrop.show();\r\n if (!this._config.scroll) {\r\n new ScrollBarHelper().hide();\r\n }\r\n this._element.setAttribute('aria-modal', true);\r\n this._element.setAttribute('role', 'dialog');\r\n this._element.classList.add(CLASS_NAME_SHOWING$1);\r\n const completeCallBack = () => {\r\n if (!this._config.scroll || this._config.backdrop) {\r\n this._focustrap.activate();\r\n }\r\n this._element.classList.add(CLASS_NAME_SHOW$3);\r\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\r\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\r\n relatedTarget\r\n });\r\n };\r\n this._queueCallback(completeCallBack, this._element, true);\r\n }\r\n hide() {\r\n if (!this._isShown) {\r\n return;\r\n }\r\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\r\n if (hideEvent.defaultPrevented) {\r\n return;\r\n }\r\n this._focustrap.deactivate();\r\n this._element.blur();\r\n this._isShown = false;\r\n this._element.classList.add(CLASS_NAME_HIDING);\r\n this._backdrop.hide();\r\n const completeCallback = () => {\r\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\r\n this._element.removeAttribute('aria-modal');\r\n this._element.removeAttribute('role');\r\n if (!this._config.scroll) {\r\n new ScrollBarHelper().reset();\r\n }\r\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\r\n };\r\n this._queueCallback(completeCallback, this._element, true);\r\n }\r\n dispose() {\r\n this._backdrop.dispose();\r\n this._focustrap.deactivate();\r\n super.dispose();\r\n }\r\n\r\n // Private\r\n _initializeBackDrop() {\r\n const clickCallback = () => {\r\n if (this._config.backdrop === 'static') {\r\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\r\n return;\r\n }\r\n this.hide();\r\n };\r\n\r\n // 'static' option will be translated to true, and booleans will keep their value\r\n const isVisible = Boolean(this._config.backdrop);\r\n return new Backdrop({\r\n className: CLASS_NAME_BACKDROP,\r\n isVisible,\r\n isAnimated: true,\r\n rootElement: this._element.parentNode,\r\n clickCallback: isVisible ? clickCallback : null\r\n });\r\n }\r\n _initializeFocusTrap() {\r\n return new FocusTrap({\r\n trapElement: this._element\r\n });\r\n }\r\n _addEventListeners() {\r\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\r\n if (event.key !== ESCAPE_KEY) {\r\n return;\r\n }\r\n if (this._config.keyboard) {\r\n this.hide();\r\n return;\r\n }\r\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\r\n });\r\n }\r\n\r\n // Static\r\n static jQueryInterface(config) {\r\n return this.each(function () {\r\n const data = Offcanvas.getOrCreateInstance(this, config);\r\n if (typeof config !== 'string') {\r\n return;\r\n }\r\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\r\n throw new TypeError(`No method named \"${config}\"`);\r\n }\r\n data[config](this);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Data API implementation\r\n */\r\n\r\n EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\r\n const target = SelectorEngine.getElementFromSelector(this);\r\n if (['A', 'AREA'].includes(this.tagName)) {\r\n event.preventDefault();\r\n }\r\n if (isDisabled(this)) {\r\n return;\r\n }\r\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\r\n // focus on trigger when it is closed\r\n if (isVisible(this)) {\r\n this.focus();\r\n }\r\n });\r\n\r\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\r\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\r\n if (alreadyOpen && alreadyOpen !== target) {\r\n Offcanvas.getInstance(alreadyOpen).hide();\r\n }\r\n const data = Offcanvas.getOrCreateInstance(target);\r\n data.toggle(this);\r\n });\r\n EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\r\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\r\n Offcanvas.getOrCreateInstance(selector).show();\r\n }\r\n });\r\n EventHandler.on(window, EVENT_RESIZE, () => {\r\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\r\n if (getComputedStyle(element).position !== 'fixed') {\r\n Offcanvas.getOrCreateInstance(element).hide();\r\n }\r\n }\r\n });\r\n enableDismissTrigger(Offcanvas);\r\n\r\n /**\r\n * jQuery\r\n */\r\n\r\n defineJQueryPlugin(Offcanvas);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/sanitizer.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n // js-docs-start allow-list\r\n const ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\r\n const DefaultAllowlist = {\r\n // Global attributes allowed on any supplied element below.\r\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\r\n a: ['target', 'href', 'title', 'rel'],\r\n area: [],\r\n b: [],\r\n br: [],\r\n col: [],\r\n code: [],\r\n dd: [],\r\n div: [],\r\n dl: [],\r\n dt: [],\r\n em: [],\r\n hr: [],\r\n h1: [],\r\n h2: [],\r\n h3: [],\r\n h4: [],\r\n h5: [],\r\n h6: [],\r\n i: [],\r\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\r\n li: [],\r\n ol: [],\r\n p: [],\r\n pre: [],\r\n s: [],\r\n small: [],\r\n span: [],\r\n sub: [],\r\n sup: [],\r\n strong: [],\r\n u: [],\r\n ul: []\r\n };\r\n // js-docs-end allow-list\r\n\r\n const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\r\n\r\n /**\r\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\r\n * contexts.\r\n *\r\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\r\n */\r\n // eslint-disable-next-line unicorn/better-regex\r\n const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\r\n const allowedAttribute = (attribute, allowedAttributeList) => {\r\n const attributeName = attribute.nodeName.toLowerCase();\r\n if (allowedAttributeList.includes(attributeName)) {\r\n if (uriAttributes.has(attributeName)) {\r\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\r\n }\r\n return true;\r\n }\r\n\r\n // Check if a regular expression validates the attribute.\r\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\r\n };\r\n function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\r\n if (!unsafeHtml.length) {\r\n return unsafeHtml;\r\n }\r\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\r\n return sanitizeFunction(unsafeHtml);\r\n }\r\n const domParser = new window.DOMParser();\r\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\r\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\r\n for (const element of elements) {\r\n const elementName = element.nodeName.toLowerCase();\r\n if (!Object.keys(allowList).includes(elementName)) {\r\n element.remove();\r\n continue;\r\n }\r\n const attributeList = [].concat(...element.attributes);\r\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\r\n for (const attribute of attributeList) {\r\n if (!allowedAttribute(attribute, allowedAttributes)) {\r\n element.removeAttribute(attribute.nodeName);\r\n }\r\n }\r\n }\r\n return createdDocument.body.innerHTML;\r\n }\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/template-factory.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$5 = 'TemplateFactory';\r\n const Default$4 = {\r\n allowList: DefaultAllowlist,\r\n content: {},\r\n // { selector : text , selector2 : text2 , }\r\n extraClass: '',\r\n html: false,\r\n sanitize: true,\r\n sanitizeFn: null,\r\n template: '
'\r\n };\r\n const DefaultType$4 = {\r\n allowList: 'object',\r\n content: 'object',\r\n extraClass: '(string|function)',\r\n html: 'boolean',\r\n sanitize: 'boolean',\r\n sanitizeFn: '(null|function)',\r\n template: 'string'\r\n };\r\n const DefaultContentType = {\r\n entry: '(string|element|function|null)',\r\n selector: '(string|element)'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class TemplateFactory extends Config {\r\n constructor(config) {\r\n super();\r\n this._config = this._getConfig(config);\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$4;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$4;\r\n }\r\n static get NAME() {\r\n return NAME$5;\r\n }\r\n\r\n // Public\r\n getContent() {\r\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\r\n }\r\n hasContent() {\r\n return this.getContent().length > 0;\r\n }\r\n changeContent(content) {\r\n this._checkContent(content);\r\n this._config.content = {\r\n ...this._config.content,\r\n ...content\r\n };\r\n return this;\r\n }\r\n toHtml() {\r\n const templateWrapper = document.createElement('div');\r\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\r\n for (const [selector, text] of Object.entries(this._config.content)) {\r\n this._setContent(templateWrapper, text, selector);\r\n }\r\n const template = templateWrapper.children[0];\r\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\r\n if (extraClass) {\r\n template.classList.add(...extraClass.split(' '));\r\n }\r\n return template;\r\n }\r\n\r\n // Private\r\n _typeCheckConfig(config) {\r\n super._typeCheckConfig(config);\r\n this._checkContent(config.content);\r\n }\r\n _checkContent(arg) {\r\n for (const [selector, content] of Object.entries(arg)) {\r\n super._typeCheckConfig({\r\n selector,\r\n entry: content\r\n }, DefaultContentType);\r\n }\r\n }\r\n _setContent(template, content, selector) {\r\n const templateElement = SelectorEngine.findOne(selector, template);\r\n if (!templateElement) {\r\n return;\r\n }\r\n content = this._resolvePossibleFunction(content);\r\n if (!content) {\r\n templateElement.remove();\r\n return;\r\n }\r\n if (isElement(content)) {\r\n this._putElementInTemplate(getElement(content), templateElement);\r\n return;\r\n }\r\n if (this._config.html) {\r\n templateElement.innerHTML = this._maybeSanitize(content);\r\n return;\r\n }\r\n templateElement.textContent = content;\r\n }\r\n _maybeSanitize(arg) {\r\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\r\n }\r\n _resolvePossibleFunction(arg) {\r\n return execute(arg, [this]);\r\n }\r\n _putElementInTemplate(element, templateElement) {\r\n if (this._config.html) {\r\n templateElement.innerHTML = '';\r\n templateElement.append(element);\r\n return;\r\n }\r\n templateElement.textContent = element.textContent;\r\n }\r\n }\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap tooltip.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$4 = 'tooltip';\r\n const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\r\n const CLASS_NAME_FADE$2 = 'fade';\r\n const CLASS_NAME_MODAL = 'modal';\r\n const CLASS_NAME_SHOW$2 = 'show';\r\n const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\r\n const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\r\n const EVENT_MODAL_HIDE = 'hide.bs.modal';\r\n const TRIGGER_HOVER = 'hover';\r\n const TRIGGER_FOCUS = 'focus';\r\n const TRIGGER_CLICK = 'click';\r\n const TRIGGER_MANUAL = 'manual';\r\n const EVENT_HIDE$2 = 'hide';\r\n const EVENT_HIDDEN$2 = 'hidden';\r\n const EVENT_SHOW$2 = 'show';\r\n const EVENT_SHOWN$2 = 'shown';\r\n const EVENT_INSERTED = 'inserted';\r\n const EVENT_CLICK$1 = 'click';\r\n const EVENT_FOCUSIN$1 = 'focusin';\r\n const EVENT_FOCUSOUT$1 = 'focusout';\r\n const EVENT_MOUSEENTER = 'mouseenter';\r\n const EVENT_MOUSELEAVE = 'mouseleave';\r\n const AttachmentMap = {\r\n AUTO: 'auto',\r\n TOP: 'top',\r\n RIGHT: isRTL() ? 'left' : 'right',\r\n BOTTOM: 'bottom',\r\n LEFT: isRTL() ? 'right' : 'left'\r\n };\r\n const Default$3 = {\r\n allowList: DefaultAllowlist,\r\n animation: true,\r\n boundary: 'clippingParents',\r\n container: false,\r\n customClass: '',\r\n delay: 0,\r\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\r\n html: false,\r\n offset: [0, 6],\r\n placement: 'top',\r\n popperConfig: null,\r\n sanitize: true,\r\n sanitizeFn: null,\r\n selector: false,\r\n template: '
' + '
' + '
' + '
',\r\n title: '',\r\n trigger: 'hover focus'\r\n };\r\n const DefaultType$3 = {\r\n allowList: 'object',\r\n animation: 'boolean',\r\n boundary: '(string|element)',\r\n container: '(string|element|boolean)',\r\n customClass: '(string|function)',\r\n delay: '(number|object)',\r\n fallbackPlacements: 'array',\r\n html: 'boolean',\r\n offset: '(array|string|function)',\r\n placement: '(string|function)',\r\n popperConfig: '(null|object|function)',\r\n sanitize: 'boolean',\r\n sanitizeFn: '(null|function)',\r\n selector: '(string|boolean)',\r\n template: 'string',\r\n title: '(string|element|function)',\r\n trigger: 'string'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Tooltip extends BaseComponent {\r\n constructor(element, config) {\r\n if (typeof Popper__namespace === 'undefined') {\r\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\r\n }\r\n super(element, config);\r\n\r\n // Private\r\n this._isEnabled = true;\r\n this._timeout = 0;\r\n this._isHovered = null;\r\n this._activeTrigger = {};\r\n this._popper = null;\r\n this._templateFactory = null;\r\n this._newContent = null;\r\n\r\n // Protected\r\n this.tip = null;\r\n this._setListeners();\r\n if (!this._config.selector) {\r\n this._fixTitle();\r\n }\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$3;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$3;\r\n }\r\n static get NAME() {\r\n return NAME$4;\r\n }\r\n\r\n // Public\r\n enable() {\r\n this._isEnabled = true;\r\n }\r\n disable() {\r\n this._isEnabled = false;\r\n }\r\n toggleEnabled() {\r\n this._isEnabled = !this._isEnabled;\r\n }\r\n toggle() {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n this._activeTrigger.click = !this._activeTrigger.click;\r\n if (this._isShown()) {\r\n this._leave();\r\n return;\r\n }\r\n this._enter();\r\n }\r\n dispose() {\r\n clearTimeout(this._timeout);\r\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\r\n if (this._element.getAttribute('data-bs-original-title')) {\r\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\r\n }\r\n this._disposePopper();\r\n super.dispose();\r\n }\r\n show() {\r\n if (this._element.style.display === 'none') {\r\n throw new Error('Please use show on visible elements');\r\n }\r\n if (!(this._isWithContent() && this._isEnabled)) {\r\n return;\r\n }\r\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\r\n const shadowRoot = findShadowRoot(this._element);\r\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\r\n if (showEvent.defaultPrevented || !isInTheDom) {\r\n return;\r\n }\r\n\r\n // TODO: v6 remove this or make it optional\r\n this._disposePopper();\r\n const tip = this._getTipElement();\r\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\r\n const {\r\n container\r\n } = this._config;\r\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\r\n container.append(tip);\r\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\r\n }\r\n this._popper = this._createPopper(tip);\r\n tip.classList.add(CLASS_NAME_SHOW$2);\r\n\r\n // If this is a touch-enabled device we add extra\r\n // empty mouseover listeners to the body's immediate children;\r\n // only needed because of broken event delegation on iOS\r\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\r\n if ('ontouchstart' in document.documentElement) {\r\n for (const element of [].concat(...document.body.children)) {\r\n EventHandler.on(element, 'mouseover', noop);\r\n }\r\n }\r\n const complete = () => {\r\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\r\n if (this._isHovered === false) {\r\n this._leave();\r\n }\r\n this._isHovered = false;\r\n };\r\n this._queueCallback(complete, this.tip, this._isAnimated());\r\n }\r\n hide() {\r\n if (!this._isShown()) {\r\n return;\r\n }\r\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\r\n if (hideEvent.defaultPrevented) {\r\n return;\r\n }\r\n const tip = this._getTipElement();\r\n tip.classList.remove(CLASS_NAME_SHOW$2);\r\n\r\n // If this is a touch-enabled device we remove the extra\r\n // empty mouseover listeners we added for iOS support\r\n if ('ontouchstart' in document.documentElement) {\r\n for (const element of [].concat(...document.body.children)) {\r\n EventHandler.off(element, 'mouseover', noop);\r\n }\r\n }\r\n this._activeTrigger[TRIGGER_CLICK] = false;\r\n this._activeTrigger[TRIGGER_FOCUS] = false;\r\n this._activeTrigger[TRIGGER_HOVER] = false;\r\n this._isHovered = null; // it is a trick to support manual triggering\r\n\r\n const complete = () => {\r\n if (this._isWithActiveTrigger()) {\r\n return;\r\n }\r\n if (!this._isHovered) {\r\n this._disposePopper();\r\n }\r\n this._element.removeAttribute('aria-describedby');\r\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\r\n };\r\n this._queueCallback(complete, this.tip, this._isAnimated());\r\n }\r\n update() {\r\n if (this._popper) {\r\n this._popper.update();\r\n }\r\n }\r\n\r\n // Protected\r\n _isWithContent() {\r\n return Boolean(this._getTitle());\r\n }\r\n _getTipElement() {\r\n if (!this.tip) {\r\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\r\n }\r\n return this.tip;\r\n }\r\n _createTipElement(content) {\r\n const tip = this._getTemplateFactory(content).toHtml();\r\n\r\n // TODO: remove this check in v6\r\n if (!tip) {\r\n return null;\r\n }\r\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\r\n // TODO: v6 the following can be achieved with CSS only\r\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\r\n const tipId = getUID(this.constructor.NAME).toString();\r\n tip.setAttribute('id', tipId);\r\n if (this._isAnimated()) {\r\n tip.classList.add(CLASS_NAME_FADE$2);\r\n }\r\n return tip;\r\n }\r\n setContent(content) {\r\n this._newContent = content;\r\n if (this._isShown()) {\r\n this._disposePopper();\r\n this.show();\r\n }\r\n }\r\n _getTemplateFactory(content) {\r\n if (this._templateFactory) {\r\n this._templateFactory.changeContent(content);\r\n } else {\r\n this._templateFactory = new TemplateFactory({\r\n ...this._config,\r\n // the `content` var has to be after `this._config`\r\n // to override config.content in case of popover\r\n content,\r\n extraClass: this._resolvePossibleFunction(this._config.customClass)\r\n });\r\n }\r\n return this._templateFactory;\r\n }\r\n _getContentForTemplate() {\r\n return {\r\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\r\n };\r\n }\r\n _getTitle() {\r\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\r\n }\r\n\r\n // Private\r\n _initializeOnDelegatedTarget(event) {\r\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\r\n }\r\n _isAnimated() {\r\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\r\n }\r\n _isShown() {\r\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\r\n }\r\n _createPopper(tip) {\r\n const placement = execute(this._config.placement, [this, tip, this._element]);\r\n const attachment = AttachmentMap[placement.toUpperCase()];\r\n return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));\r\n }\r\n _getOffset() {\r\n const {\r\n offset\r\n } = this._config;\r\n if (typeof offset === 'string') {\r\n return offset.split(',').map(value => Number.parseInt(value, 10));\r\n }\r\n if (typeof offset === 'function') {\r\n return popperData => offset(popperData, this._element);\r\n }\r\n return offset;\r\n }\r\n _resolvePossibleFunction(arg) {\r\n return execute(arg, [this._element]);\r\n }\r\n _getPopperConfig(attachment) {\r\n const defaultBsPopperConfig = {\r\n placement: attachment,\r\n modifiers: [{\r\n name: 'flip',\r\n options: {\r\n fallbackPlacements: this._config.fallbackPlacements\r\n }\r\n }, {\r\n name: 'offset',\r\n options: {\r\n offset: this._getOffset()\r\n }\r\n }, {\r\n name: 'preventOverflow',\r\n options: {\r\n boundary: this._config.boundary\r\n }\r\n }, {\r\n name: 'arrow',\r\n options: {\r\n element: `.${this.constructor.NAME}-arrow`\r\n }\r\n }, {\r\n name: 'preSetPlacement',\r\n enabled: true,\r\n phase: 'beforeMain',\r\n fn: data => {\r\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\r\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\r\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\r\n }\r\n }]\r\n };\r\n return {\r\n ...defaultBsPopperConfig,\r\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\r\n };\r\n }\r\n _setListeners() {\r\n const triggers = this._config.trigger.split(' ');\r\n for (const trigger of triggers) {\r\n if (trigger === 'click') {\r\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\r\n const context = this._initializeOnDelegatedTarget(event);\r\n context.toggle();\r\n });\r\n } else if (trigger !== TRIGGER_MANUAL) {\r\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\r\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\r\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\r\n const context = this._initializeOnDelegatedTarget(event);\r\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\r\n context._enter();\r\n });\r\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\r\n const context = this._initializeOnDelegatedTarget(event);\r\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\r\n context._leave();\r\n });\r\n }\r\n }\r\n this._hideModalHandler = () => {\r\n if (this._element) {\r\n this.hide();\r\n }\r\n };\r\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\r\n }\r\n _fixTitle() {\r\n const title = this._element.getAttribute('title');\r\n if (!title) {\r\n return;\r\n }\r\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\r\n this._element.setAttribute('aria-label', title);\r\n }\r\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\r\n this._element.removeAttribute('title');\r\n }\r\n _enter() {\r\n if (this._isShown() || this._isHovered) {\r\n this._isHovered = true;\r\n return;\r\n }\r\n this._isHovered = true;\r\n this._setTimeout(() => {\r\n if (this._isHovered) {\r\n this.show();\r\n }\r\n }, this._config.delay.show);\r\n }\r\n _leave() {\r\n if (this._isWithActiveTrigger()) {\r\n return;\r\n }\r\n this._isHovered = false;\r\n this._setTimeout(() => {\r\n if (!this._isHovered) {\r\n this.hide();\r\n }\r\n }, this._config.delay.hide);\r\n }\r\n _setTimeout(handler, timeout) {\r\n clearTimeout(this._timeout);\r\n this._timeout = setTimeout(handler, timeout);\r\n }\r\n _isWithActiveTrigger() {\r\n return Object.values(this._activeTrigger).includes(true);\r\n }\r\n _getConfig(config) {\r\n const dataAttributes = Manipulator.getDataAttributes(this._element);\r\n for (const dataAttribute of Object.keys(dataAttributes)) {\r\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\r\n delete dataAttributes[dataAttribute];\r\n }\r\n }\r\n config = {\r\n ...dataAttributes,\r\n ...(typeof config === 'object' && config ? config : {})\r\n };\r\n config = this._mergeConfigObj(config);\r\n config = this._configAfterMerge(config);\r\n this._typeCheckConfig(config);\r\n return config;\r\n }\r\n _configAfterMerge(config) {\r\n config.container = config.container === false ? document.body : getElement(config.container);\r\n if (typeof config.delay === 'number') {\r\n config.delay = {\r\n show: config.delay,\r\n hide: config.delay\r\n };\r\n }\r\n if (typeof config.title === 'number') {\r\n config.title = config.title.toString();\r\n }\r\n if (typeof config.content === 'number') {\r\n config.content = config.content.toString();\r\n }\r\n return config;\r\n }\r\n _getDelegateConfig() {\r\n const config = {};\r\n for (const [key, value] of Object.entries(this._config)) {\r\n if (this.constructor.Default[key] !== value) {\r\n config[key] = value;\r\n }\r\n }\r\n config.selector = false;\r\n config.trigger = 'manual';\r\n\r\n // In the future can be replaced with:\r\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\r\n // `Object.fromEntries(keysWithDifferentValues)`\r\n return config;\r\n }\r\n _disposePopper() {\r\n if (this._popper) {\r\n this._popper.destroy();\r\n this._popper = null;\r\n }\r\n if (this.tip) {\r\n this.tip.remove();\r\n this.tip = null;\r\n }\r\n }\r\n\r\n // Static\r\n static jQueryInterface(config) {\r\n return this.each(function () {\r\n const data = Tooltip.getOrCreateInstance(this, config);\r\n if (typeof config !== 'string') {\r\n return;\r\n }\r\n if (typeof data[config] === 'undefined') {\r\n throw new TypeError(`No method named \"${config}\"`);\r\n }\r\n data[config]();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * jQuery\r\n */\r\n\r\n defineJQueryPlugin(Tooltip);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap popover.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$3 = 'popover';\r\n const SELECTOR_TITLE = '.popover-header';\r\n const SELECTOR_CONTENT = '.popover-body';\r\n const Default$2 = {\r\n ...Tooltip.Default,\r\n content: '',\r\n offset: [0, 8],\r\n placement: 'right',\r\n template: '
' + '
' + '

' + '
' + '
',\r\n trigger: 'click'\r\n };\r\n const DefaultType$2 = {\r\n ...Tooltip.DefaultType,\r\n content: '(null|string|element|function)'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class Popover extends Tooltip {\r\n // Getters\r\n static get Default() {\r\n return Default$2;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$2;\r\n }\r\n static get NAME() {\r\n return NAME$3;\r\n }\r\n\r\n // Overrides\r\n _isWithContent() {\r\n return this._getTitle() || this._getContent();\r\n }\r\n\r\n // Private\r\n _getContentForTemplate() {\r\n return {\r\n [SELECTOR_TITLE]: this._getTitle(),\r\n [SELECTOR_CONTENT]: this._getContent()\r\n };\r\n }\r\n _getContent() {\r\n return this._resolvePossibleFunction(this._config.content);\r\n }\r\n\r\n // Static\r\n static jQueryInterface(config) {\r\n return this.each(function () {\r\n const data = Popover.getOrCreateInstance(this, config);\r\n if (typeof config !== 'string') {\r\n return;\r\n }\r\n if (typeof data[config] === 'undefined') {\r\n throw new TypeError(`No method named \"${config}\"`);\r\n }\r\n data[config]();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * jQuery\r\n */\r\n\r\n defineJQueryPlugin(Popover);\r\n\r\n /**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap scrollspy.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n */\r\n\r\n\r\n /**\r\n * Constants\r\n */\r\n\r\n const NAME$2 = 'scrollspy';\r\n const DATA_KEY$2 = 'bs.scrollspy';\r\n const EVENT_KEY$2 = `.${DATA_KEY$2}`;\r\n const DATA_API_KEY = '.data-api';\r\n const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\r\n const EVENT_CLICK = `click${EVENT_KEY$2}`;\r\n const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\r\n const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\r\n const CLASS_NAME_ACTIVE$1 = 'active';\r\n const SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\r\n const SELECTOR_TARGET_LINKS = '[href]';\r\n const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\r\n const SELECTOR_NAV_LINKS = '.nav-link';\r\n const SELECTOR_NAV_ITEMS = '.nav-item';\r\n const SELECTOR_LIST_ITEMS = '.list-group-item';\r\n const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\r\n const SELECTOR_DROPDOWN = '.dropdown';\r\n const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\r\n const Default$1 = {\r\n offset: null,\r\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\r\n rootMargin: '0px 0px -25%',\r\n smoothScroll: false,\r\n target: null,\r\n threshold: [0.1, 0.5, 1]\r\n };\r\n const DefaultType$1 = {\r\n offset: '(number|null)',\r\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\r\n rootMargin: 'string',\r\n smoothScroll: 'boolean',\r\n target: 'element',\r\n threshold: 'array'\r\n };\r\n\r\n /**\r\n * Class definition\r\n */\r\n\r\n class ScrollSpy extends BaseComponent {\r\n constructor(element, config) {\r\n super(element, config);\r\n\r\n // this._element is the observablesContainer and config.target the menu links wrapper\r\n this._targetLinks = new Map();\r\n this._observableSections = new Map();\r\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\r\n this._activeTarget = null;\r\n this._observer = null;\r\n this._previousScrollData = {\r\n visibleEntryTop: 0,\r\n parentScrollTop: 0\r\n };\r\n this.refresh(); // initialize\r\n }\r\n\r\n // Getters\r\n static get Default() {\r\n return Default$1;\r\n }\r\n static get DefaultType() {\r\n return DefaultType$1;\r\n }\r\n static get NAME() {\r\n return NAME$2;\r\n }\r\n\r\n // Public\r\n refresh() {\r\n this._initializeTargetsAndObservables();\r\n this._maybeEnableSmoothScroll();\r\n if (this._observer) {\r\n this._observer.disconnect();\r\n } else {\r\n this._observer = this._getNewObserver();\r\n }\r\n for (const section of this._observableSections.values()) {\r\n this._observer.observe(section);\r\n }\r\n }\r\n dispose() {\r\n this._observer.disconnect();\r\n super.dispose();\r\n }\r\n\r\n // Private\r\n _configAfterMerge(config) {\r\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\r\n config.target = getElement(config.target) || document.body;\r\n\r\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\r\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\r\n if (typeof config.threshold === 'string') {\r\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\r\n }\r\n return config;\r\n }\r\n _maybeEnableSmoothScroll() {\r\n if (!this._config.smoothScroll) {\r\n return;\r\n }\r\n\r\n // unregister any previous listeners\r\n EventHandler.off(this._config.target, EVENT_CLICK);\r\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\r\n const observableSection = this._observableSections.get(event.target.hash);\r\n if (observableSection) {\r\n event.preventDefault();\r\n const root = this._rootElement || window;\r\n const height = observableSection.offsetTop - this._element.offsetTop;\r\n if (root.scrollTo) {\r\n root.scrollTo({\r\n top: height,\r\n behavior: 'smooth'\r\n });\r\n return;\r\n }\r\n\r\n // Chrome 60 doesn't support `scrollTo`\r\n root.scrollTop = height;\r\n }\r\n });\r\n }\r\n _getNewObserver() {\r\n const options = {\r\n root: this._rootElement,\r\n threshold: this._config.threshold,\r\n rootMargin: this._config.rootMargin\r\n };\r\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\r\n }\r\n\r\n // The logic of selection\r\n _observerCallback(entries) {\r\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\r\n const activate = entry => {\r\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\r\n this._process(targetElement(entry));\r\n };\r\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\r\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\r\n this._previousScrollData.parentScrollTop = parentScrollTop;\r\n for (const entry of entries) {\r\n if (!entry.isIntersecting) {\r\n this._activeTarget = null;\r\n this._clearActiveClass(targetElement(entry));\r\n continue;\r\n }\r\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\r\n // if we are scrolling down, pick the bigger offsetTop\r\n if (userScrollsDown && entryIsLowerThanPrevious) {\r\n activate(entry);\r\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\r\n if (!parentScrollTop) {\r\n return;\r\n }\r\n continue;\r\n }\r\n\r\n // if we are scrolling up, pick the smallest offsetTop\r\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\r\n activate(entry);\r\n }\r\n }\r\n }\r\n _initializeTargetsAndObservables() {\r\n this._targetLinks = new Map();\r\n this._observableSections = new Map();\r\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\r\n for (const anchor of targetLinks) {\r\n // ensure that the anchor has an id and is not disabled\r\n if (!anchor.hash || isDisabled(anchor)) {\r\n continue;\r\n }\r\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\r\n\r\n // ensure that the observableSection exists & is visible\r\n if (isVisible(observableSection)) {\r\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\r\n this._observableSections.set(anchor.hash, observableSection);\r\n }\r\n }\r\n }\r\n _process(target) {\r\n if (this._activeTarget === target) {\r\n return;\r\n }\r\n this._clearActiveClass(this._config.target);\r\n this._activeTarget = target;\r\n target.classList.add(CLASS_NAME_ACTIVE$1);\r\n this._activateParents(target);\r\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\r\n relatedTarget: target\r\n });\r\n }\r\n _activateParents(target) {\r\n // Activate dropdown parents\r\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\r\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\r\n return;\r\n }\r\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\r\n // Set triggered links parents as active\r\n // With both