{"version":3,"names":["TRANSITION_END","Util","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","_","getTransitionDurationFromElement","transitionDuration","$","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","triggerTransitionEnd","trigger","supportsTransitionEnd","Boolean","isElement","obj","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","call","expectedTypes","value","valueType","toString","match","toLowerCase","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","jQueryDetection","TypeError","version","fn","jquery","emulateTransitionEnd","duration","_this","this","called","one","setTimeout","event","special","bindType","delegateType","handle","target","is","handleObj","handler","apply","arguments","DATA_KEY","JQUERY_NO_CONFLICT","Alert","_element","close","rootElement","_getRootElement","_triggerCloseEvent","isDefaultPrevented","_removeElement","dispose","removeData","parent","closest","CLASS_NAME_ALERT","closeEvent","Event","removeClass","hasClass","_destroyElement","detach","remove","_jQueryInterface","each","$element","data","_handleDismiss","alertInstance","preventDefault","on","Constructor","noConflict","CLASS_NAME_ACTIVE","SELECTOR_DATA_TOGGLE_CARROT","SELECTOR_INPUT","SELECTOR_BUTTON","Button","shouldAvoidTriggerChange","toggle","triggerChangeEvent","addAriaPressed","input","type","checked","classList","contains","activeElement","focus","hasAttribute","setAttribute","toggleClass","avoidTriggerChange","button","initialButton","inputBtn","tagName","window","buttons","slice","querySelectorAll","i","len","length","add","NAME","DIRECTION_NEXT","DIRECTION_PREV","EVENT_SLID","SELECTOR_ACTIVE_ITEM","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","PointerType","TOUCH","PEN","Carousel","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","MSPointerEvent","_addEventListeners","next","_slide","nextWhenVisible","hidden","prev","cycle","clearInterval","_updateInterval","setInterval","visibilityState","bind","to","index","activeIndex","_getItemIndex","direction","off","_handleSwipe","absDeltax","abs","_this2","_keydown","_addTouchEventListeners","_this3","start","originalEvent","pointerType","clientX","touches","end","clearTimeout","e","move","which","indexOf","_getItemByDirection","isNextDirection","isPrevDirection","lastItemIndex","itemIndex","_triggerSlideEvent","relatedTarget","eventDirectionName","targetIndex","fromIndex","slideEvent","from","_setActiveIndicatorElement","indicators","nextIndicator","children","addClass","elementInterval","parseInt","defaultInterval","directionalClassName","orderClassName","_this4","activeElementIndex","nextElement","nextElementIndex","isCycling","slidEvent","action","ride","_dataApiClickHandler","slideIndex","carousels","$carousel","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_COLLAPSED","DIMENSION_WIDTH","SELECTOR_DATA_TOGGLE","Collapse","_isTransitioning","_triggerArray","id","toggleList","elem","filterElement","filter","foundElem","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","not","startEvent","dimension","_getDimension","style","attr","setTransitioning","scrollSize","getBoundingClientRect","triggerArrayLength","isTransitioning","_getTargetFromElement","triggerArray","isOpen","currentTarget","$trigger","selectors","$target","REGEXP_KEYDOWN","ARROW_UP_KEYCODE","CLASS_NAME_DISABLED","CLASS_NAME_MENURIGHT","EVENT_HIDE","EVENT_HIDDEN","EVENT_CLICK_DATA_API","EVENT_KEYDOWN_DATA_API","SELECTOR_MENU","offset","flip","boundary","reference","display","popperConfig","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","disabled","isActive","_clearMenus","usePopper","showEvent","_getParentFromElement","Popper","referenceElement","_getPopperConfig","body","noop","hideEvent","destroy","update","scheduleUpdate","stopPropagation","_extends","constructor","_getPlacement","$parentDropdown","placement","_getOffset","offsets","modifiers","enabled","preventOverflow","boundariesElement","applyStyle","toggles","context","clickEvent","dropdownMenu","_dataApiKeydownHandler","items","item","CLASS_NAME_OPEN","CLASS_NAME_FADE","CLASS_NAME_STATIC","EVENT_SHOW","EVENT_FOCUSIN","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_KEYDOWN_DISMISS","EVENT_MOUSEDOWN_DISMISS","SELECTOR_FIXED_CONTENT","backdrop","Modal","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_scrollbarWidth","_checkScrollbar","_setScrollbar","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","transition","_hideModal","forEach","htmlElement","handleUpdate","_triggerBackdropTransition","hideEventPrevented","isModalOverflowing","scrollHeight","clientHeight","overflowY","modalTransitionDuration","modalBody","Node","ELEMENT_NODE","appendChild","removeAttribute","scrollTop","_enforceFocus","shownEvent","transitionComplete","_this5","has","_this6","_this7","_this8","_resetAdjustments","_resetScrollbar","_removeBackdrop","callback","_this9","animate","createElement","className","appendTo","backdropTransitionDuration","callbackRemove","paddingLeft","paddingRight","rect","round","left","right","innerWidth","_getScrollbarWidth","_this10","fixedContent","stickyContent","actualPadding","calculatedPadding","actualMargin","marginRight","calculatedMargin","padding","elements","SELECTOR_STICKY_CONTENT","margin","scrollDiv","scrollbarWidth","width","clientWidth","removeChild","_this11","uriAttrs","SAFE_URL_PATTERN","DATA_URL_PATTERN","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","createdDocument","DOMParser","parseFromString","whitelistKeys","keys","el","elName","nodeName","attributeList","attributes","whitelistedAttributes","concat","allowedAttributeList","attrName","nodeValue","regExp","attrRegex","allowedAttribute","innerHTML","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","HOVER_STATE_SHOW","HOVER_STATE_OUT","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","template","title","delay","html","container","fallbackPlacement","customClass","sanitize","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","EVENT_KEY","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","dataKey","_getDelegateConfig","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","isWithContent","shadowRoot","isInTheDom","ownerDocument","tipId","setContent","attachment","_getAttachment","addAttachmentClass","_getContainer","complete","_fixTransition","prevHoverState","_cleanTipClass","getTitle","CLASS_PREFIX","setElementContent","content","text","empty","append","behavior","arrow","onCreate","originalPlacement","_handlePopperPlacementChange","onUpdate","find","eventIn","eventOut","_fixTitle","titleType","dataAttributes","dataAttr","key","$tip","tabClass","join","popperData","instance","popper","initConfigAnimation","Popover","_getContent","get","METHOD_POSITION","SELECTOR_NAV_LIST_GROUP","method","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","map","targetSelector","targetBCR","height","top","sort","pageYOffset","max","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","$link","parents","SELECTOR_NAV_LINKS","node","scrollSpys","$spy","SELECTOR_ACTIVE","SELECTOR_ACTIVE_UL","Tab","previous","listElement","itemSelector","makeArray","hiddenEvent","active","_transitionComplete","dropdownChild","dropdownElement","dropdownToggleList","$this","CLASS_NAME_HIDE","CLASS_NAME_SHOWING","autohide","Toast","_clearTimeout","_close"],"sources":["../../js/src/util.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/modal.js","../../js/src/tools/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * Private TransitionEnd Helpers\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj){\nif (obj === null || typeof obj === 'undefined'){\nreturn `${obj}`\n}\n\nreturn{}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent(){\nreturn{\nbindType:TRANSITION_END,\ndelegateType:TRANSITION_END,\nhandle(event){\nif ($(event.target).is(this)){\nreturn event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n}\n\nreturn undefined\n}\n}\n}\n\nfunction transitionEndEmulator(duration){\nlet called = false\n\n$(this).one(Util.TRANSITION_END, () =>{\ncalled = true\n})\n\nsetTimeout(() =>{\nif (!called){\nUtil.triggerTransitionEnd(this)\n}\n}, duration)\n\nreturn this\n}\n\nfunction setTransitionEndSupport(){\n$.fn.emulateTransitionEnd = transitionEndEmulator\n$.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * Public Util API\n */\n\nconst Util ={\nTRANSITION_END:'bsTransitionEnd',\n\ngetUID(prefix){\ndo{\n// eslint-disable-next-line no-bitwise\nprefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n} while (document.getElementById(prefix))\n\nreturn prefix\n},\n\ngetSelectorFromElement(element){\nlet selector = element.getAttribute('data-target')\n\nif (!selector || selector === '#'){\nconst hrefAttr = element.getAttribute('href')\nselector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() :''\n}\n\ntry{\nreturn document.querySelector(selector) ? selector :null\n} catch (_){\nreturn null\n}\n},\n\ngetTransitionDurationFromElement(element){\nif (!element){\nreturn 0\n}\n\n// Get transition-duration of the element\nlet transitionDuration = $(element).css('transition-duration')\nlet transitionDelay = $(element).css('transition-delay')\n\nconst floatTransitionDuration = parseFloat(transitionDuration)\nconst floatTransitionDelay = parseFloat(transitionDelay)\n\n// Return 0 if element or transition duration is not found\nif (!floatTransitionDuration && !floatTransitionDelay){\nreturn 0\n}\n\n// If multiple durations are defined, take the first\ntransitionDuration = transitionDuration.split(',')[0]\ntransitionDelay = transitionDelay.split(',')[0]\n\nreturn (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n},\n\nreflow(element){\nreturn element.offsetHeight\n},\n\ntriggerTransitionEnd(element){\n$(element).trigger(TRANSITION_END)\n},\n\nsupportsTransitionEnd(){\nreturn Boolean(TRANSITION_END)\n},\n\nisElement(obj){\nreturn (obj[0] || obj).nodeType\n},\n\ntypeCheckConfig(componentName, config, configTypes){\nfor (const property in configTypes){\nif (Object.prototype.hasOwnProperty.call(configTypes, property)){\nconst expectedTypes = configTypes[property]\nconst value = config[property]\nconst valueType = value && Util.isElement(value) ?\n'element' :toType(value)\n\nif (!new RegExp(expectedTypes).test(valueType)){\nthrow new Error(\n`${componentName.toUpperCase()}:` +\n`Option \"${property}\" provided type \"${valueType}\" ` +\n`but expected type \"${expectedTypes}\".`)\n}\n}\n}\n},\n\nfindShadowRoot(element){\nif (!document.documentElement.attachShadow){\nreturn null\n}\n\n// Can find the shadow root otherwise it'll return the document\nif (typeof element.getRootNode === 'function'){\nconst root = element.getRootNode()\nreturn root instanceof ShadowRoot ? root :null\n}\n\nif (element instanceof ShadowRoot){\nreturn element\n}\n\n// when we don't find a shadow root\nif (!element.parentNode){\nreturn null\n}\n\nreturn Util.findShadowRoot(element.parentNode)\n},\n\njQueryDetection(){\nif (typeof $ === 'undefined'){\nthrow new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n}\n\nconst version = $.fn.jquery.split(' ')[0].split('.')\nconst minMajor = 1\nconst ltMajor = 2\nconst minMinor = 9\nconst minPatch = 1\nconst maxMajor = 4\n\nif (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor){\nthrow new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n}\n}\n}\n\nUtil.jQueryDetection()\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_ALERT = 'alert'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_DISMISS = '[data-dismiss=\"alert\"]'\n\n/**\n * Class definition\n */\n\nclass Alert{\nconstructor(element){\nthis._element = element\n}\n\n// Getters\nstatic get VERSION(){\nreturn VERSION\n}\n\n// Public\nclose(element){\nlet rootElement = this._element\nif (element){\nrootElement = this._getRootElement(element)\n}\n\nconst customEvent = this._triggerCloseEvent(rootElement)\n\nif (customEvent.isDefaultPrevented()){\nreturn\n}\n\nthis._removeElement(rootElement)\n}\n\ndispose(){\n$.removeData(this._element, DATA_KEY)\nthis._element = null\n}\n\n// Private\n_getRootElement(element){\nconst selector = Util.getSelectorFromElement(element)\nlet parent = false\n\nif (selector){\nparent = document.querySelector(selector)\n}\n\nif (!parent){\nparent = $(element).closest(`.${CLASS_NAME_ALERT}`)[0]\n}\n\nreturn parent\n}\n\n_triggerCloseEvent(element){\nconst closeEvent = $.Event(EVENT_CLOSE)\n\n$(element).trigger(closeEvent)\nreturn closeEvent\n}\n\n_removeElement(element){\n$(element).removeClass(CLASS_NAME_SHOW)\n\nif (!$(element).hasClass(CLASS_NAME_FADE)){\nthis._destroyElement(element)\nreturn\n}\n\nconst transitionDuration = Util.getTransitionDurationFromElement(element)\n\n$(element)\n.one(Util.TRANSITION_END, event => this._destroyElement(element, event))\n.emulateTransitionEnd(transitionDuration)\n}\n\n_destroyElement(element){\n$(element)\n.detach()\n.trigger(EVENT_CLOSED)\n.remove()\n}\n\n// Static\nstatic _jQueryInterface(config){\nreturn this.each(function (){\nconst $element = $(this)\nlet data = $element.data(DATA_KEY)\n\nif (!data){\ndata = new Alert(this)\n$element.data(DATA_KEY, data)\n}\n\nif (config === 'close'){\ndata[config](this)\n}\n})\n}\n\nstatic _handleDismiss(alertInstance){\nreturn function (event){\nif (event){\nevent.preventDefault()\n}\n\nalertInstance.close(this)\n}\n}\n}\n\n/**\n * Data API implementation\n */\n\n$(document).on(\nEVENT_CLICK_DATA_API,\nSELECTOR_DISMISS,\nAlert._handleDismiss(new Alert())\n)\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () =>{\n$.fn[NAME] = JQUERY_NO_CONFLICT\nreturn Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_BUTTON = 'btn'\nconst CLASS_NAME_FOCUS = 'focus'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_FOCUS_BLUR_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY} ` +\n`blur${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^=\"button\"]'\nconst SELECTOR_DATA_TOGGLES = '[data-toggle=\"buttons\"]'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"button\"]'\nconst SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle=\"buttons\"] .btn'\nconst SELECTOR_INPUT = 'input:not([type=\"hidden\"])'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_BUTTON = '.btn'\n\n/**\n * Class definition\n */\n\nclass Button{\nconstructor(element){\nthis._element = element\nthis.shouldAvoidTriggerChange = false\n}\n\n// Getters\nstatic get VERSION(){\nreturn VERSION\n}\n\n// Public\ntoggle(){\nlet triggerChangeEvent = true\nlet addAriaPressed = true\nconst rootElement = $(this._element).closest(SELECTOR_DATA_TOGGLES)[0]\n\nif (rootElement){\nconst input = this._element.querySelector(SELECTOR_INPUT)\n\nif (input){\nif (input.type === 'radio'){\nif (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)){\ntriggerChangeEvent = false\n} else{\nconst activeElement = rootElement.querySelector(SELECTOR_ACTIVE)\n\nif (activeElement){\n$(activeElement).removeClass(CLASS_NAME_ACTIVE)\n}\n}\n}\n\nif (triggerChangeEvent){\n// if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input\nif (input.type === 'checkbox' || input.type === 'radio'){\ninput.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE)\n}\n\nif (!this.shouldAvoidTriggerChange){\n$(input).trigger('change')\n}\n}\n\ninput.focus()\naddAriaPressed = false\n}\n}\n\nif (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))){\nif (addAriaPressed){\nthis._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE))\n}\n\nif (triggerChangeEvent){\n$(this._element).toggleClass(CLASS_NAME_ACTIVE)\n}\n}\n}\n\ndispose(){\n$.removeData(this._element, DATA_KEY)\nthis._element = null\n}\n\n// Static\nstatic _jQueryInterface(config, avoidTriggerChange){\nreturn this.each(function (){\nconst $element = $(this)\nlet data = $element.data(DATA_KEY)\n\nif (!data){\ndata = new Button(this)\n$element.data(DATA_KEY, data)\n}\n\ndata.shouldAvoidTriggerChange = avoidTriggerChange\n\nif (config === 'toggle'){\ndata[config]()\n}\n})\n}\n}\n\n/**\n * Data API implementation\n */\n\n$(document)\n.on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event =>{\nlet button = event.target\nconst initialButton = button\n\nif (!$(button).hasClass(CLASS_NAME_BUTTON)){\nbutton = $(button).closest(SELECTOR_BUTTON)[0]\n}\n\nif (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')){\nevent.preventDefault() // work around Firefox bug #1540995\n} else{\nconst inputBtn = button.querySelector(SELECTOR_INPUT)\n\nif (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))){\nevent.preventDefault() // work around Firefox bug #1540995\nreturn\n}\n\nif (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL'){\nButton._jQueryInterface.call($(button), 'toggle', initialButton.tagName === 'INPUT')\n}\n}\n})\n.on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event =>{\nconst button = $(event.target).closest(SELECTOR_BUTTON)[0]\n$(button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type))\n})\n\n$(window).on(EVENT_LOAD_DATA_API, () =>{\n// ensure correct active class is set to match the controls' actual values/states\n\n// find all checkboxes/readio buttons inside data-toggle groups\nlet buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS))\nfor (let i = 0, len = buttons.length; i < len; i++){\nconst button = buttons[i]\nconst input = button.querySelector(SELECTOR_INPUT)\nif (input.checked || input.hasAttribute('checked')){\nbutton.classList.add(CLASS_NAME_ACTIVE)\n} else{\nbutton.classList.remove(CLASS_NAME_ACTIVE)\n}\n}\n\n// find all button toggles\nbuttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\nfor (let i = 0, len = buttons.length; i < len; i++){\nconst button = buttons[i]\nif (button.getAttribute('aria-pressed') === 'true'){\nbutton.classList.add(CLASS_NAME_ACTIVE)\n} else{\nbutton.classList.remove(CLASS_NAME_ACTIVE)\n}\n}\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () =>{\n$.fn[NAME] = JQUERY_NO_CONFLICT\nreturn Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_RIGHT = 'carousel-item-right'\nconst CLASS_NAME_LEFT = 'carousel-item-left'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst DIRECTION_NEXT = 'next'\nconst DIRECTION_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-ride=\"carousel\"]'\n\nconst Default ={\ninterval:5000,\nkeyboard:true,\nslide:false,\npause:'hover',\nwrap:true,\ntouch:true\n}\n\nconst DefaultType ={\ninterval:'(number|boolean)',\nkeyboard:'boolean',\nslide:'(boolean|string)',\npause:'(string|boolean)',\nwrap:'boolean',\ntouch:'boolean'\n}\n\nconst PointerType ={\nTOUCH:'touch',\nPEN:'pen'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel{\nconstructor(element, config){\nthis._items = null\nthis._interval = null\nthis._activeElement = null\nthis._isPaused = false\nthis._isSliding = false\nthis.touchTimeout = null\nthis.touchStartX = 0\nthis.touchDeltaX = 0\n\nthis._config = this._getConfig(config)\nthis._element = element\nthis._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS)\nthis._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\nthis._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\nthis._addEventListeners()\n}\n\n// Getters\nstatic get VERSION(){\nreturn VERSION\n}\n\nstatic get Default(){\nreturn Default\n}\n\n// Public\nnext(){\nif (!this._isSliding){\nthis._slide(DIRECTION_NEXT)\n}\n}\n\nnextWhenVisible(){\nconst $element = $(this._element)\n// Don't call next when the page isn't visible\n// or the carousel or its parent isn't visible\nif (!document.hidden &&\n($element.is(':visible') && $element.css('visibility') !== 'hidden')){\nthis.next()\n}\n}\n\nprev(){\nif (!this._isSliding){\nthis._slide(DIRECTION_PREV)\n}\n}\n\npause(event){\nif (!event){\nthis._isPaused = true\n}\n\nif (this._element.querySelector(SELECTOR_NEXT_PREV)){\nUtil.triggerTransitionEnd(this._element)\nthis.cycle(true)\n}\n\nclearInterval(this._interval)\nthis._interval = null\n}\n\ncycle(event){\nif (!event){\nthis._isPaused = false\n}\n\nif (this._interval){\nclearInterval(this._interval)\nthis._interval = null\n}\n\nif (this._config.interval && !this._isPaused){\nthis._updateInterval()\n\nthis._interval = setInterval(\n(document.visibilityState ? this.nextWhenVisible :this.next).bind(this),\nthis._config.interval\n)\n}\n}\n\nto(index){\nthis._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)\n\nconst activeIndex = this._getItemIndex(this._activeElement)\n\nif (index > this._items.length - 1 || index < 0){\nreturn\n}\n\nif (this._isSliding){\n$(this._element).one(EVENT_SLID, () => this.to(index))\nreturn\n}\n\nif (activeIndex === index){\nthis.pause()\nthis.cycle()\nreturn\n}\n\nconst direction = index > activeIndex ?\nDIRECTION_NEXT :\nDIRECTION_PREV\n\nthis._slide(direction, this._items[index])\n}\n\ndispose(){\n$(this._element).off(EVENT_KEY)\n$.removeData(this._element, DATA_KEY)\n\nthis._items = null\nthis._config = null\nthis._element = null\nthis._interval = null\nthis._isPaused = null\nthis._isSliding = null\nthis._activeElement = null\nthis._indicatorsElement = null\n}\n\n// Private\n_getConfig(config){\nconfig ={\n...Default,\n...config\n}\nUtil.typeCheckConfig(NAME, config, DefaultType)\nreturn config\n}\n\n_handleSwipe(){\nconst absDeltax = Math.abs(this.touchDeltaX)\n\nif (absDeltax <= SWIPE_THRESHOLD){\nreturn\n}\n\nconst direction = absDeltax / this.touchDeltaX\n\nthis.touchDeltaX = 0\n\n// swipe left\nif (direction > 0){\nthis.prev()\n}\n\n// swipe right\nif (direction < 0){\nthis.next()\n}\n}\n\n_addEventListeners(){\nif (this._config.keyboard){\n$(this._element).on(EVENT_KEYDOWN, event => this._keydown(event))\n}\n\nif (this._config.pause === 'hover'){\n$(this._element)\n.on(EVENT_MOUSEENTER, event => this.pause(event))\n.on(EVENT_MOUSELEAVE, event => this.cycle(event))\n}\n\nif (this._config.touch){\nthis._addTouchEventListeners()\n}\n}\n\n_addTouchEventListeners(){\nif (!this._touchSupported){\nreturn\n}\n\nconst start = event =>{\nif (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]){\nthis.touchStartX = event.originalEvent.clientX\n} else if (!this._pointerEvent){\nthis.touchStartX = event.originalEvent.touches[0].clientX\n}\n}\n\nconst move = event =>{\n// ensure swiping with one touch and not pinching\nthis.touchDeltaX = event.originalEvent.touches && event.originalEvent.touches.length > 1 ?\n0 :\nevent.originalEvent.touches[0].clientX - this.touchStartX\n}\n\nconst end = event =>{\nif (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]){\nthis.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n}\n\nthis._handleSwipe()\nif (this._config.pause === 'hover'){\n// If it's a touch-enabled device, mouseenter/leave are fired as\n// part of the mouse compatibility events on first tap - the carousel\n// would stop cycling until user tapped out of it;\n// here, we listen for touchend, explicitly pause the carousel\n// (as if it's the second time we tap on it, mouseenter compat event\n// is NOT fired) and after a timeout (to allow for mouse compatibility\n// events to fire) we explicitly restart cycling\n\nthis.pause()\nif (this.touchTimeout){\nclearTimeout(this.touchTimeout)\n}\n\nthis.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n}\n}\n\n$(this._element.querySelectorAll(SELECTOR_ITEM_IMG))\n.on(EVENT_DRAG_START, e => e.preventDefault())\n\nif (this._pointerEvent){\n$(this._element).on(EVENT_POINTERDOWN, event => start(event))\n$(this._element).on(EVENT_POINTERUP, event => end(event))\n\nthis._element.classList.add(CLASS_NAME_POINTER_EVENT)\n} else{\n$(this._element).on(EVENT_TOUCHSTART, event => start(event))\n$(this._element).on(EVENT_TOUCHMOVE, event => move(event))\n$(this._element).on(EVENT_TOUCHEND, event => end(event))\n}\n}\n\n_keydown(event){\nif (/input|textarea/i.test(event.target.tagName)){\nreturn\n}\n\nswitch (event.which){\ncase ARROW_LEFT_KEYCODE:\nevent.preventDefault()\nthis.prev()\nbreak\ncase ARROW_RIGHT_KEYCODE:\nevent.preventDefault()\nthis.next()\nbreak\ndefault:\n}\n}\n\n_getItemIndex(element){\nthis._items = element && element.parentNode ?\n[].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) :\n[]\nreturn this._items.indexOf(element)\n}\n\n_getItemByDirection(direction, activeElement){\nconst isNextDirection = direction === DIRECTION_NEXT\nconst isPrevDirection = direction === DIRECTION_PREV\nconst activeIndex = this._getItemIndex(activeElement)\nconst lastItemIndex = this._items.length - 1\nconst isGoingToWrap = isPrevDirection && activeIndex === 0 ||\nisNextDirection && activeIndex === lastItemIndex\n\nif (isGoingToWrap && !this._config.wrap){\nreturn activeElement\n}\n\nconst delta = direction === DIRECTION_PREV ? -1 :1\nconst itemIndex = (activeIndex + delta) % this._items.length\n\nreturn itemIndex === -1 ?\nthis._items[this._items.length - 1] :this._items[itemIndex]\n}\n\n_triggerSlideEvent(relatedTarget, eventDirectionName){\nconst targetIndex = this._getItemIndex(relatedTarget)\nconst fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM))\nconst slideEvent = $.Event(EVENT_SLIDE,{\nrelatedTarget,\ndirection:eventDirectionName,\nfrom:fromIndex,\nto:targetIndex\n})\n\n$(this._element).trigger(slideEvent)\n\nreturn slideEvent\n}\n\n_setActiveIndicatorElement(element){\nif (this._indicatorsElement){\nconst indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE))\n$(indicators).removeClass(CLASS_NAME_ACTIVE)\n\nconst nextIndicator = this._indicatorsElement.children[\nthis._getItemIndex(element)\n]\n\nif (nextIndicator){\n$(nextIndicator).addClass(CLASS_NAME_ACTIVE)\n}\n}\n}\n\n_updateInterval(){\nconst element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM)\n\nif (!element){\nreturn\n}\n\nconst elementInterval = parseInt(element.getAttribute('data-interval'), 10)\n\nif (elementInterval){\nthis._config.defaultInterval = this._config.defaultInterval || this._config.interval\nthis._config.interval = elementInterval\n} else{\nthis._config.interval = this._config.defaultInterval || this._config.interval\n}\n}\n\n_slide(direction, element){\nconst activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)\nconst activeElementIndex = this._getItemIndex(activeElement)\nconst nextElement = element || activeElement &&\nthis._getItemByDirection(direction, activeElement)\nconst nextElementIndex = this._getItemIndex(nextElement)\nconst isCycling = Boolean(this._interval)\n\nlet directionalClassName\nlet orderClassName\nlet eventDirectionName\n\nif (direction === DIRECTION_NEXT){\ndirectionalClassName = CLASS_NAME_LEFT\norderClassName = CLASS_NAME_NEXT\neventDirectionName = DIRECTION_LEFT\n} else{\ndirectionalClassName = CLASS_NAME_RIGHT\norderClassName = CLASS_NAME_PREV\neventDirectionName = DIRECTION_RIGHT\n}\n\nif (nextElement && $(nextElement).hasClass(CLASS_NAME_ACTIVE)){\nthis._isSliding = false\nreturn\n}\n\nconst slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\nif (slideEvent.isDefaultPrevented()){\nreturn\n}\n\nif (!activeElement || !nextElement){\n// Some weirdness is happening, so we bail\nreturn\n}\n\nthis._isSliding = true\n\nif (isCycling){\nthis.pause()\n}\n\nthis._setActiveIndicatorElement(nextElement)\nthis._activeElement = nextElement\n\nconst slidEvent = $.Event(EVENT_SLID,{\nrelatedTarget:nextElement,\ndirection:eventDirectionName,\nfrom:activeElementIndex,\nto:nextElementIndex\n})\n\nif ($(this._element).hasClass(CLASS_NAME_SLIDE)){\n$(nextElement).addClass(orderClassName)\n\nUtil.reflow(nextElement)\n\n$(activeElement).addClass(directionalClassName)\n$(nextElement).addClass(directionalClassName)\n\nconst transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n$(activeElement)\n.one(Util.TRANSITION_END, () =>{\n$(nextElement)\n.removeClass(`${directionalClassName} ${orderClassName}`)\n.addClass(CLASS_NAME_ACTIVE)\n\n$(activeElement).removeClass(`${CLASS_NAME_ACTIVE} ${orderClassName} ${directionalClassName}`)\n\nthis._isSliding = false\n\nsetTimeout(() => $(this._element).trigger(slidEvent), 0)\n})\n.emulateTransitionEnd(transitionDuration)\n} else{\n$(activeElement).removeClass(CLASS_NAME_ACTIVE)\n$(nextElement).addClass(CLASS_NAME_ACTIVE)\n\nthis._isSliding = false\n$(this._element).trigger(slidEvent)\n}\n\nif (isCycling){\nthis.cycle()\n}\n}\n\n// Static\nstatic _jQueryInterface(config){\nreturn this.each(function (){\nlet data = $(this).data(DATA_KEY)\nlet _config ={\n...Default,\n...$(this).data()\n}\n\nif (typeof config === 'object'){\n_config ={\n..._config,\n...config\n}\n}\n\nconst action = typeof config === 'string' ? config :_config.slide\n\nif (!data){\ndata = new Carousel(this, _config)\n$(this).data(DATA_KEY, data)\n}\n\nif (typeof config === 'number'){\ndata.to(config)\n} else if (typeof action === 'string'){\nif (typeof data[action] === 'undefined'){\nthrow new TypeError(`No method named \"${action}\"`)\n}\n\ndata[action]()\n} else if (_config.interval && _config.ride){\ndata.pause()\ndata.cycle()\n}\n})\n}\n\nstatic _dataApiClickHandler(event){\nconst selector = Util.getSelectorFromElement(this)\n\nif (!selector){\nreturn\n}\n\nconst target = $(selector)[0]\n\nif (!target || !$(target).hasClass(CLASS_NAME_CAROUSEL)){\nreturn\n}\n\nconst config ={\n...$(target).data(),\n...$(this).data()\n}\nconst slideIndex = this.getAttribute('data-slide-to')\n\nif (slideIndex){\nconfig.interval = false\n}\n\nCarousel._jQueryInterface.call($(target), config)\n\nif (slideIndex){\n$(target).data(DATA_KEY).to(slideIndex)\n}\n\nevent.preventDefault()\n}\n}\n\n/**\n * Data API implementation\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(EVENT_LOAD_DATA_API, () =>{\nconst carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE))\nfor (let i = 0, len = carousels.length; i < len; i++){\nconst $carousel = $(carousels[i])\nCarousel._jQueryInterface.call($carousel, $carousel.data())\n}\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () =>{\n$.fn[NAME] = JQUERY_NO_CONFLICT\nreturn Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\n\nconst DIMENSION_WIDTH = 'width'\nconst DIMENSION_HEIGHT = 'height'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_ACTIVES = '.show, .collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"collapse\"]'\n\nconst Default ={\ntoggle:true,\nparent:''\n}\n\nconst DefaultType ={\ntoggle:'boolean',\nparent:'(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse{\nconstructor(element, config){\nthis._isTransitioning = false\nthis._element = element\nthis._config = this._getConfig(config)\nthis._triggerArray = [].slice.call(document.querySelectorAll(\n`[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n`[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n))\n\nconst toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\nfor (let i = 0, len = toggleList.length; i < len; i++){\nconst elem = toggleList[i]\nconst selector = Util.getSelectorFromElement(elem)\nconst filterElement = [].slice.call(document.querySelectorAll(selector))\n.filter(foundElem => foundElem === element)\n\nif (selector !== null && filterElement.length > 0){\nthis._selector = selector\nthis._triggerArray.push(elem)\n}\n}\n\nthis._parent = this._config.parent ? this._getParent() :null\n\nif (!this._config.parent){\nthis._addAriaAndCollapsedClass(this._element, this._triggerArray)\n}\n\nif (this._config.toggle){\nthis.toggle()\n}\n}\n\n// Getters\nstatic get VERSION(){\nreturn VERSION\n}\n\nstatic get Default(){\nreturn Default\n}\n\n// Public\ntoggle(){\nif ($(this._element).hasClass(CLASS_NAME_SHOW)){\nthis.hide()\n} else{\nthis.show()\n}\n}\n\nshow(){\nif (this._isTransitioning ||\n$(this._element).hasClass(CLASS_NAME_SHOW)){\nreturn\n}\n\nlet actives\nlet activesData\n\nif (this._parent){\nactives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES))\n.filter(elem =>{\nif (typeof this._config.parent === 'string'){\nreturn elem.getAttribute('data-parent') === this._config.parent\n}\n\nreturn elem.classList.contains(CLASS_NAME_COLLAPSE)\n})\n\nif (actives.length === 0){\nactives = null\n}\n}\n\nif (actives){\nactivesData = $(actives).not(this._selector).data(DATA_KEY)\nif (activesData && activesData._isTransitioning){\nreturn\n}\n}\n\nconst startEvent = $.Event(EVENT_SHOW)\n$(this._element).trigger(startEvent)\nif (startEvent.isDefaultPrevented()){\nreturn\n}\n\nif (actives){\nCollapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\nif (!activesData){\n$(actives).data(DATA_KEY, null)\n}\n}\n\nconst dimension = this._getDimension()\n\n$(this._element)\n.removeClass(CLASS_NAME_COLLAPSE)\n.addClass(CLASS_NAME_COLLAPSING)\n\nthis._element.style[dimension] = 0\n\nif (this._triggerArray.length){\n$(this._triggerArray)\n.removeClass(CLASS_NAME_COLLAPSED)\n.attr('aria-expanded', true)\n}\n\nthis.setTransitioning(true)\n\nconst complete = () =>{\n$(this._element)\n.removeClass(CLASS_NAME_COLLAPSING)\n.addClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)\n\nthis._element.style[dimension] = ''\n\nthis.setTransitioning(false)\n\n$(this._element).trigger(EVENT_SHOWN)\n}\n\nconst capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\nconst scrollSize = `scroll${capitalizedDimension}`\nconst transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n$(this._element)\n.one(Util.TRANSITION_END, complete)\n.emulateTransitionEnd(transitionDuration)\n\nthis._element.style[dimension] = `${this._element[scrollSize]}px`\n}\n\nhide(){\nif (this._isTransitioning ||\n!$(this._element).hasClass(CLASS_NAME_SHOW)){\nreturn\n}\n\nconst startEvent = $.Event(EVENT_HIDE)\n$(this._element).trigger(startEvent)\nif (startEvent.isDefaultPrevented()){\nreturn\n}\n\nconst dimension = this._getDimension()\n\nthis._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\nUtil.reflow(this._element)\n\n$(this._element)\n.addClass(CLASS_NAME_COLLAPSING)\n.removeClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)\n\nconst triggerArrayLength = this._triggerArray.length\nif (triggerArrayLength > 0){\nfor (let i = 0; i < triggerArrayLength; i++){\nconst trigger = this._triggerArray[i]\nconst selector = Util.getSelectorFromElement(trigger)\n\nif (selector !== null){\nconst $elem = $([].slice.call(document.querySelectorAll(selector)))\nif (!$elem.hasClass(CLASS_NAME_SHOW)){\n$(trigger).addClass(CLASS_NAME_COLLAPSED)\n.attr('aria-expanded', false)\n}\n}\n}\n}\n\nthis.setTransitioning(true)\n\nconst complete = () =>{\nthis.setTransitioning(false)\n$(this._element)\n.removeClass(CLASS_NAME_COLLAPSING)\n.addClass(CLASS_NAME_COLLAPSE)\n.trigger(EVENT_HIDDEN)\n}\n\nthis._element.style[dimension] = ''\nconst transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n$(this._element)\n.one(Util.TRANSITION_END, complete)\n.emulateTransitionEnd(transitionDuration)\n}\n\nsetTransitioning(isTransitioning){\nthis._isTransitioning = isTransitioning\n}\n\ndispose(){\n$.removeData(this._element, DATA_KEY)\n\nthis._config = null\nthis._parent = null\nthis._element = null\nthis._triggerArray = null\nthis._isTransitioning = null\n}\n\n// Private\n_getConfig(config){\nconfig ={\n...Default,\n...config\n}\nconfig.toggle = Boolean(config.toggle) // Coerce string values\nUtil.typeCheckConfig(NAME, config, DefaultType)\nreturn config\n}\n\n_getDimension(){\nconst hasWidth = $(this._element).hasClass(DIMENSION_WIDTH)\nreturn hasWidth ? DIMENSION_WIDTH :DIMENSION_HEIGHT\n}\n\n_getParent(){\nlet parent\n\nif (Util.isElement(this._config.parent)){\nparent = this._config.parent\n\n// It's a jQuery object\nif (typeof this._config.parent.jquery !== 'undefined'){\nparent = this._config.parent[0]\n}\n} else{\nparent = document.querySelector(this._config.parent)\n}\n\nconst selector = `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\nconst children = [].slice.call(parent.querySelectorAll(selector))\n\n$(children).each((i, element) =>{\nthis._addAriaAndCollapsedClass(\nCollapse._getTargetFromElement(element),\n[element]\n)\n})\n\nreturn parent\n}\n\n_addAriaAndCollapsedClass(element, triggerArray){\nconst isOpen = $(element).hasClass(CLASS_NAME_SHOW)\n\nif (triggerArray.length){\n$(triggerArray)\n.toggleClass(CLASS_NAME_COLLAPSED, !isOpen)\n.attr('aria-expanded', isOpen)\n}\n}\n\n// Static\nstatic _getTargetFromElement(element){\nconst selector = Util.getSelectorFromElement(element)\nreturn selector ? document.querySelector(selector) :null\n}\n\nstatic _jQueryInterface(config){\nreturn this.each(function (){\nconst $element = $(this)\nlet data = $element.data(DATA_KEY)\nconst _config ={\n...Default,\n...$element.data(),\n...(typeof config === 'object' && config ? config :{})\n}\n\nif (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)){\n_config.toggle = false\n}\n\nif (!data){\ndata = new Collapse(this, _config)\n$element.data(DATA_KEY, data)\n}\n\nif (typeof config === 'string'){\nif (typeof data[config] === 'undefined'){\nthrow new TypeError(`No method named \"${config}\"`)\n}\n\ndata[config]()\n}\n})\n}\n}\n\n/**\n * Data API implementation\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event){\n// preventDefault only for elements (which change the URL) not inside the collapsible element\nif (event.currentTarget.tagName === 'A'){\nevent.preventDefault()\n}\n\nconst $trigger = $(this)\nconst selector = Util.getSelectorFromElement(this)\nconst selectors = [].slice.call(document.querySelectorAll(selector))\n\n$(selectors).each(function (){\nconst $target = $(this)\nconst data = $target.data(DATA_KEY)\nconst config = data ? 'toggle' :$trigger.data()\nCollapse._jQueryInterface.call($target, config)\n})\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () =>{\n$.fn[NAME] = JQUERY_NO_CONFLICT\nreturn Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst CLASS_NAME_DISABLED = 'disabled'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPRIGHT = 'dropright'\nconst CLASS_NAME_DROPLEFT = 'dropleft'\nconst CLASS_NAME_MENURIGHT = 'dropdown-menu-right'\nconst CLASS_NAME_POSITION_STATIC = 'position-static'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"dropdown\"]'\nconst SELECTOR_FORM_CHILD = '.dropdown form'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = 'top-start'\nconst PLACEMENT_TOPEND = 'top-end'\nconst PLACEMENT_BOTTOM = 'bottom-start'\nconst PLACEMENT_BOTTOMEND = 'bottom-end'\nconst PLACEMENT_RIGHT = 'right-start'\nconst PLACEMENT_LEFT = 'left-start'\n\nconst Default ={\noffset:0,\nflip:true,\nboundary:'scrollParent',\nreference:'toggle',\ndisplay:'dynamic',\npopperConfig:null\n}\n\nconst DefaultType ={\noffset:'(number|string|function)',\nflip:'boolean',\nboundary:'(string|element)',\nreference:'(string|element)',\ndisplay:'string',\npopperConfig:'(null|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown{\nconstructor(element, config){\nthis._element = element\nthis._popper = null\nthis._config = this._getConfig(config)\nthis._menu = this._getMenuElement()\nthis._inNavbar = this._detectNavbar()\n\nthis._addEventListeners()\n}\n\n// Getters\nstatic get VERSION(){\nreturn VERSION\n}\n\nstatic get Default(){\nreturn Default\n}\n\nstatic get DefaultType(){\nreturn DefaultType\n}\n\n// Public\ntoggle(){\nif (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED)){\nreturn\n}\n\nconst isActive = $(this._menu).hasClass(CLASS_NAME_SHOW)\n\nDropdown._clearMenus()\n\nif (isActive){\nreturn\n}\n\nthis.show(true)\n}\n\nshow(usePopper = false){\nif (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || $(this._menu).hasClass(CLASS_NAME_SHOW)){\nreturn\n}\n\nconst relatedTarget ={\nrelatedTarget:this._element\n}\nconst showEvent = $.Event(EVENT_SHOW, relatedTarget)\nconst parent = Dropdown._getParentFromElement(this._element)\n\n$(parent).trigger(showEvent)\n\nif (showEvent.isDefaultPrevented()){\nreturn\n}\n\n// Totally disable Popper for Dropdowns in Navbar\nif (!this._inNavbar && usePopper){\n// Check for Popper dependency\nif (typeof Popper === 'undefined'){\nthrow new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n}\n\nlet referenceElement = this._element\n\nif (this._config.reference === 'parent'){\nreferenceElement = parent\n} else if (Util.isElement(this._config.reference)){\nreferenceElement = this._config.reference\n\n// Check if it's jQuery element\nif (typeof this._config.reference.jquery !== 'undefined'){\nreferenceElement = this._config.reference[0]\n}\n}\n\n// If boundary is not `scrollParent`, then set position to `static`\n// to allow the menu to \"escape\" the scroll parent's boundaries\n// https://github.com/twbs/bootstrap/issues/24251\nif (this._config.boundary !== 'scrollParent'){\n$(parent).addClass(CLASS_NAME_POSITION_STATIC)\n}\n\nthis._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n}\n\n// If this is a touch-enabled device we add extra\n// empty mouseover listeners to the body's immediate children;\n// only needed because of broken event delegation on iOS\n// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\nif ('ontouchstart' in document.documentElement &&\n$(parent).closest(SELECTOR_NAVBAR_NAV).length === 0){\n$(document.body).children().on('mouseover', null, $.noop)\n}\n\nthis._element.focus()\nthis._element.setAttribute('aria-expanded', true)\n\n$(this._menu).toggleClass(CLASS_NAME_SHOW)\n$(parent)\n.toggleClass(CLASS_NAME_SHOW)\n.trigger($.Event(EVENT_SHOWN, relatedTarget))\n}\n\nhide(){\nif (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || !$(this._menu).hasClass(CLASS_NAME_SHOW)){\nreturn\n}\n\nconst relatedTarget ={\nrelatedTarget:this._element\n}\nconst hideEvent = $.Event(EVENT_HIDE, relatedTarget)\nconst parent = Dropdown._getParentFromElement(this._element)\n\n$(parent).trigger(hideEvent)\n\nif (hideEvent.isDefaultPrevented()){\nreturn\n}\n\nif (this._popper){\nthis._popper.destroy()\n}\n\n$(this._menu).toggleClass(CLASS_NAME_SHOW)\n$(parent)\n.toggleClass(CLASS_NAME_SHOW)\n.trigger($.Event(EVENT_HIDDEN, relatedTarget))\n}\n\ndispose(){\n$.removeData(this._element, DATA_KEY)\n$(this._element).off(EVENT_KEY)\nthis._element = null\nthis._menu = null\nif (this._popper !== null){\nthis._popper.destroy()\nthis._popper = null\n}\n}\n\nupdate(){\nthis._inNavbar = this._detectNavbar()\nif (this._popper !== null){\nthis._popper.scheduleUpdate()\n}\n}\n\n// Private\n_addEventListeners(){\n$(this._element).on(EVENT_CLICK, event =>{\nevent.preventDefault()\nevent.stopPropagation()\nthis.toggle()\n})\n}\n\n_getConfig(config){\nconfig ={\n...this.constructor.Default,\n...$(this._element).data(),\n...config\n}\n\nUtil.typeCheckConfig(\nNAME,\nconfig,\nthis.constructor.DefaultType\n)\n\nreturn config\n}\n\n_getMenuElement(){\nif (!this._menu){\nconst parent = Dropdown._getParentFromElement(this._element)\n\nif (parent){\nthis._menu = parent.querySelector(SELECTOR_MENU)\n}\n}\n\nreturn this._menu\n}\n\n_getPlacement(){\nconst $parentDropdown = $(this._element.parentNode)\nlet placement = PLACEMENT_BOTTOM\n\n// Handle dropup\nif ($parentDropdown.hasClass(CLASS_NAME_DROPUP)){\nplacement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT) ?\nPLACEMENT_TOPEND :\nPLACEMENT_TOP\n} else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)){\nplacement = PLACEMENT_RIGHT\n} else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)){\nplacement = PLACEMENT_LEFT\n} else if ($(this._menu).hasClass(CLASS_NAME_MENURIGHT)){\nplacement = PLACEMENT_BOTTOMEND\n}\n\nreturn placement\n}\n\n_detectNavbar(){\nreturn $(this._element).closest('.navbar').length > 0\n}\n\n_getOffset(){\nconst offset ={}\n\nif (typeof this._config.offset === 'function'){\noffset.fn = data =>{\ndata.offsets ={\n...data.offsets,\n...this._config.offset(data.offsets, this._element)\n}\n\nreturn data\n}\n} else{\noffset.offset = this._config.offset\n}\n\nreturn offset\n}\n\n_getPopperConfig(){\nconst popperConfig ={\nplacement:this._getPlacement(),\nmodifiers:{\noffset:this._getOffset(),\nflip:{\nenabled:this._config.flip\n},\npreventOverflow:{\nboundariesElement:this._config.boundary\n}\n}\n}\n\n// Disable Popper if we have a static display\nif (this._config.display === 'static'){\npopperConfig.modifiers.applyStyle ={\nenabled:false\n}\n}\n\nreturn{\n...popperConfig,\n...this._config.popperConfig\n}\n}\n\n// Static\nstatic _jQueryInterface(config){\nreturn this.each(function (){\nlet data = $(this).data(DATA_KEY)\nconst _config = typeof config === 'object' ? config :null\n\nif (!data){\ndata = new Dropdown(this, _config)\n$(this).data(DATA_KEY, data)\n}\n\nif (typeof config === 'string'){\nif (typeof data[config] === 'undefined'){\nthrow new TypeError(`No method named \"${config}\"`)\n}\n\ndata[config]()\n}\n})\n}\n\nstatic _clearMenus(event){\nif (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\nevent.type === 'keyup' && event.which !== TAB_KEYCODE)){\nreturn\n}\n\nconst toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n\nfor (let i = 0, len = toggles.length; i < len; i++){\nconst parent = Dropdown._getParentFromElement(toggles[i])\nconst context = $(toggles[i]).data(DATA_KEY)\nconst relatedTarget ={\nrelatedTarget:toggles[i]\n}\n\nif (event && event.type === 'click'){\nrelatedTarget.clickEvent = event\n}\n\nif (!context){\ncontinue\n}\n\nconst dropdownMenu = context._menu\nif (!$(parent).hasClass(CLASS_NAME_SHOW)){\ncontinue\n}\n\nif (event && (event.type === 'click' &&\n/input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n$.contains(parent, event.target)){\ncontinue\n}\n\nconst hideEvent = $.Event(EVENT_HIDE, relatedTarget)\n$(parent).trigger(hideEvent)\nif (hideEvent.isDefaultPrevented()){\ncontinue\n}\n\n// If this is a touch-enabled device we remove the extra\n// empty mouseover listeners we added for iOS support\nif ('ontouchstart' in document.documentElement){\n$(document.body).children().off('mouseover', null, $.noop)\n}\n\ntoggles[i].setAttribute('aria-expanded', 'false')\n\nif (context._popper){\ncontext._popper.destroy()\n}\n\n$(dropdownMenu).removeClass(CLASS_NAME_SHOW)\n$(parent)\n.removeClass(CLASS_NAME_SHOW)\n.trigger($.Event(EVENT_HIDDEN, relatedTarget))\n}\n}\n\nstatic _getParentFromElement(element){\nlet parent\nconst selector = Util.getSelectorFromElement(element)\n\nif (selector){\nparent = document.querySelector(selector)\n}\n\nreturn parent || element.parentNode\n}\n\n// eslint-disable-next-line complexity\nstatic _dataApiKeydownHandler(event){\n// If not input/textarea:\n//- And not a key in REGEXP_KEYDOWN => not a dropdown command\n// If input/textarea:\n//- If space key => not a dropdown command\n//- If key is other than escape\n//- If key is not up or down => not a dropdown command\n//- If trigger inside the menu => not a dropdown command\nif (/input|textarea/i.test(event.target.tagName) ?\nevent.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n(event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n$(event.target).closest(SELECTOR_MENU).length) :!REGEXP_KEYDOWN.test(event.which)){\nreturn\n}\n\nif (this.disabled || $(this).hasClass(CLASS_NAME_DISABLED)){\nreturn\n}\n\nconst parent = Dropdown._getParentFromElement(this)\nconst isActive = $(parent).hasClass(CLASS_NAME_SHOW)\n\nif (!isActive && event.which === ESCAPE_KEYCODE){\nreturn\n}\n\nevent.preventDefault()\nevent.stopPropagation()\n\nif (!isActive || (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)){\nif (event.which === ESCAPE_KEYCODE){\n$(parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus')\n}\n\n$(this).trigger('click')\nreturn\n}\n\nconst items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS))\n.filter(item => $(item).is(':visible'))\n\nif (items.length === 0){\nreturn\n}\n\nlet index = items.indexOf(event.target)\n\nif (event.which === ARROW_UP_KEYCODE && index > 0){ // Up\nindex--\n}\n\nif (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1){ // Down\nindex++\n}\n\nif (index < 0){\nindex = 0\n}\n\nitems[index].focus()\n}\n}\n\n/**\n * Data API implementation\n */\n\n$(document)\n.on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n.on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler)\n.on(`${EVENT_CLICK_DATA_API} ${EVENT_KEYUP_DATA_API}`, Dropdown._clearMenus)\n.on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event){\nevent.preventDefault()\nevent.stopPropagation()\nDropdown._jQueryInterface.call($(this), 'toggle')\n})\n.on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, e =>{\ne.stopPropagation()\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () =>{\n$.fn[NAME] = JQUERY_NO_CONFLICT\nreturn Dropdown._jQueryInterface\n}\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'\nconst CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'\nconst CLASS_NAME_BACKDROP = 'modal-backdrop'\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"modal\"]'\nconst SELECTOR_DATA_DISMISS = '[data-dismiss=\"modal\"]'\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\nconst Default ={\nbackdrop:true,\nkeyboard:true,\nfocus:true,\nshow:true\n}\n\nconst DefaultType ={\nbackdrop:'(boolean|string)',\nkeyboard:'boolean',\nfocus:'boolean',\nshow:'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal{\nconstructor(element, config){\nthis._config = this._getConfig(config)\nthis._element = element\nthis._dialog = element.querySelector(SELECTOR_DIALOG)\nthis._backdrop = null\nthis._isShown = false\nthis._isBodyOverflowing = false\nthis._ignoreBackdropClick = false\nthis._isTransitioning = false\nthis._scrollbarWidth = 0\n}\n\n// Getters\nstatic get VERSION(){\nreturn VERSION\n}\n\nstatic get Default(){\nreturn Default\n}\n\n// Public\ntoggle(relatedTarget){\nreturn this._isShown ? this.hide() :this.show(relatedTarget)\n}\n\nshow(relatedTarget){\nif (this._isShown || this._isTransitioning){\nreturn\n}\n\nconst showEvent = $.Event(EVENT_SHOW,{\nrelatedTarget\n})\n\n$(this._element).trigger(showEvent)\n\nif (showEvent.isDefaultPrevented()){\nreturn\n}\n\nthis._isShown = true\n\nif ($(this._element).hasClass(CLASS_NAME_FADE)){\nthis._isTransitioning = true\n}\n\nthis._checkScrollbar()\nthis._setScrollbar()\n\nthis._adjustDialog()\n\nthis._setEscapeEvent()\nthis._setResizeEvent()\n\n$(this._element).on(\nEVENT_CLICK_DISMISS,\nSELECTOR_DATA_DISMISS,\nevent => this.hide(event)\n)\n\n$(this._dialog).on(EVENT_MOUSEDOWN_DISMISS, () =>{\n$(this._element).one(EVENT_MOUSEUP_DISMISS, event =>{\nif ($(event.target).is(this._element)){\nthis._ignoreBackdropClick = true\n}\n})\n})\n\nthis._showBackdrop(() => this._showElement(relatedTarget))\n}\n\nhide(event){\nif (event){\nevent.preventDefault()\n}\n\nif (!this._isShown || this._isTransitioning){\nreturn\n}\n\nconst hideEvent = $.Event(EVENT_HIDE)\n\n$(this._element).trigger(hideEvent)\n\nif (!this._isShown || hideEvent.isDefaultPrevented()){\nreturn\n}\n\nthis._isShown = false\nconst transition = $(this._element).hasClass(CLASS_NAME_FADE)\n\nif (transition){\nthis._isTransitioning = true\n}\n\nthis._setEscapeEvent()\nthis._setResizeEvent()\n\n$(document).off(EVENT_FOCUSIN)\n\n$(this._element).removeClass(CLASS_NAME_SHOW)\n\n$(this._element).off(EVENT_CLICK_DISMISS)\n$(this._dialog).off(EVENT_MOUSEDOWN_DISMISS)\n\nif (transition){\nconst transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n$(this._element)\n.one(Util.TRANSITION_END, event => this._hideModal(event))\n.emulateTransitionEnd(transitionDuration)\n} else{\nthis._hideModal()\n}\n}\n\ndispose(){\n[window, this._element, this._dialog]\n.forEach(htmlElement => $(htmlElement).off(EVENT_KEY))\n\n/**\n * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `EVENT_CLICK_DATA_API` event that should remain\n */\n$(document).off(EVENT_FOCUSIN)\n\n$.removeData(this._element, DATA_KEY)\n\nthis._config = null\nthis._element = null\nthis._dialog = null\nthis._backdrop = null\nthis._isShown = null\nthis._isBodyOverflowing = null\nthis._ignoreBackdropClick = null\nthis._isTransitioning = null\nthis._scrollbarWidth = null\n}\n\nhandleUpdate(){\nthis._adjustDialog()\n}\n\n// Private\n_getConfig(config){\nconfig ={\n...Default,\n...config\n}\nUtil.typeCheckConfig(NAME, config, DefaultType)\nreturn config\n}\n\n_triggerBackdropTransition(){\nconst hideEventPrevented = $.Event(EVENT_HIDE_PREVENTED)\n\n$(this._element).trigger(hideEventPrevented)\nif (hideEventPrevented.isDefaultPrevented()){\nreturn\n}\n\nconst isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n\nif (!isModalOverflowing){\nthis._element.style.overflowY = 'hidden'\n}\n\nthis._element.classList.add(CLASS_NAME_STATIC)\n\nconst modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n$(this._element).off(Util.TRANSITION_END)\n\n$(this._element).one(Util.TRANSITION_END, () =>{\nthis._element.classList.remove(CLASS_NAME_STATIC)\nif (!isModalOverflowing){\n$(this._element).one(Util.TRANSITION_END, () =>{\nthis._element.style.overflowY = ''\n})\n.emulateTransitionEnd(this._element, modalTransitionDuration)\n}\n})\n.emulateTransitionEnd(modalTransitionDuration)\nthis._element.focus()\n}\n\n_showElement(relatedTarget){\nconst transition = $(this._element).hasClass(CLASS_NAME_FADE)\nconst modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) :null\n\nif (!this._element.parentNode ||\nthis._element.parentNode.nodeType !== Node.ELEMENT_NODE){\n// Don't move modal's DOM position\ndocument.body.appendChild(this._element)\n}\n\nthis._element.style.display = 'block'\nthis._element.removeAttribute('aria-hidden')\nthis._element.setAttribute('aria-modal', true)\nthis._element.setAttribute('role', 'dialog')\n\nif ($(this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody){\nmodalBody.scrollTop = 0\n} else{\nthis._element.scrollTop = 0\n}\n\nif (transition){\nUtil.reflow(this._element)\n}\n\n$(this._element).addClass(CLASS_NAME_SHOW)\n\nif (this._config.focus){\nthis._enforceFocus()\n}\n\nconst shownEvent = $.Event(EVENT_SHOWN,{\nrelatedTarget\n})\n\nconst transitionComplete = () =>{\nif (this._config.focus){\nthis._element.focus()\n}\n\nthis._isTransitioning = false\n$(this._element).trigger(shownEvent)\n}\n\nif (transition){\nconst transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n$(this._dialog)\n.one(Util.TRANSITION_END, transitionComplete)\n.emulateTransitionEnd(transitionDuration)\n} else{\ntransitionComplete()\n}\n}\n\n_enforceFocus(){\n$(document)\n.off(EVENT_FOCUSIN) // Guard against infinite focus loop\n.on(EVENT_FOCUSIN, event =>{\nif (document !== event.target &&\nthis._element !== event.target &&\n$(this._element).has(event.target).length === 0){\nthis._element.focus()\n}\n})\n}\n\n_setEscapeEvent(){\nif (this._isShown){\n$(this._element).on(EVENT_KEYDOWN_DISMISS, event =>{\nif (this._config.keyboard && event.which === ESCAPE_KEYCODE){\nevent.preventDefault()\nthis.hide()\n} else if (!this._config.keyboard && event.which === ESCAPE_KEYCODE){\nthis._triggerBackdropTransition()\n}\n})\n} else if (!this._isShown){\n$(this._element).off(EVENT_KEYDOWN_DISMISS)\n}\n}\n\n_setResizeEvent(){\nif (this._isShown){\n$(window).on(EVENT_RESIZE, event => this.handleUpdate(event))\n} else{\n$(window).off(EVENT_RESIZE)\n}\n}\n\n_hideModal(){\nthis._element.style.display = 'none'\nthis._element.setAttribute('aria-hidden', true)\nthis._element.removeAttribute('aria-modal')\nthis._element.removeAttribute('role')\nthis._isTransitioning = false\nthis._showBackdrop(() =>{\n$(document.body).removeClass(CLASS_NAME_OPEN)\nthis._resetAdjustments()\nthis._resetScrollbar()\n$(this._element).trigger(EVENT_HIDDEN)\n})\n}\n\n_removeBackdrop(){\nif (this._backdrop){\n$(this._backdrop).remove()\nthis._backdrop = null\n}\n}\n\n_showBackdrop(callback){\nconst animate = $(this._element).hasClass(CLASS_NAME_FADE) ?\nCLASS_NAME_FADE :''\n\nif (this._isShown && this._config.backdrop){\nthis._backdrop = document.createElement('div')\nthis._backdrop.className = CLASS_NAME_BACKDROP\n\nif (animate){\nthis._backdrop.classList.add(animate)\n}\n\n$(this._backdrop).appendTo(document.body)\n\n$(this._element).on(EVENT_CLICK_DISMISS, event =>{\nif (this._ignoreBackdropClick){\nthis._ignoreBackdropClick = false\nreturn\n}\n\nif (event.target !== event.currentTarget){\nreturn\n}\n\nif (this._config.backdrop === 'static'){\nthis._triggerBackdropTransition()\n} else{\nthis.hide()\n}\n})\n\nif (animate){\nUtil.reflow(this._backdrop)\n}\n\n$(this._backdrop).addClass(CLASS_NAME_SHOW)\n\nif (!callback){\nreturn\n}\n\nif (!animate){\ncallback()\nreturn\n}\n\nconst backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n$(this._backdrop)\n.one(Util.TRANSITION_END, callback)\n.emulateTransitionEnd(backdropTransitionDuration)\n} else if (!this._isShown && this._backdrop){\n$(this._backdrop).removeClass(CLASS_NAME_SHOW)\n\nconst callbackRemove = () =>{\nthis._removeBackdrop()\nif (callback){\ncallback()\n}\n}\n\nif ($(this._element).hasClass(CLASS_NAME_FADE)){\nconst backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n$(this._backdrop)\n.one(Util.TRANSITION_END, callbackRemove)\n.emulateTransitionEnd(backdropTransitionDuration)\n} else{\ncallbackRemove()\n}\n} else if (callback){\ncallback()\n}\n}\n\n// ----------------------------------------------------------------------\n// the following methods are used to handle overflowing modals\n// todo (fat):these should probably be refactored out of modal.js\n// ----------------------------------------------------------------------\n\n_adjustDialog(){\nconst isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n\nif (!this._isBodyOverflowing && isModalOverflowing){\nthis._element.style.paddingLeft = `${this._scrollbarWidth}px`\n}\n\nif (this._isBodyOverflowing && !isModalOverflowing){\nthis._element.style.paddingRight = `${this._scrollbarWidth}px`\n}\n}\n\n_resetAdjustments(){\nthis._element.style.paddingLeft = ''\nthis._element.style.paddingRight = ''\n}\n\n_checkScrollbar(){\nconst rect = document.body.getBoundingClientRect()\nthis._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth\nthis._scrollbarWidth = this._getScrollbarWidth()\n}\n\n_setScrollbar(){\nif (this._isBodyOverflowing){\n// Note:DOMNode.style.paddingRight returns the actual value or '' if not set\n// while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\nconst fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))\nconst stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT))\n\n// Adjust fixed content padding\n$(fixedContent).each((index, element) =>{\nconst actualPadding = element.style.paddingRight\nconst calculatedPadding = $(element).css('padding-right')\n$(element)\n.data('padding-right', actualPadding)\n.css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n})\n\n// Adjust sticky content margin\n$(stickyContent).each((index, element) =>{\nconst actualMargin = element.style.marginRight\nconst calculatedMargin = $(element).css('margin-right')\n$(element)\n.data('margin-right', actualMargin)\n.css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\n})\n\n// Adjust body padding\nconst actualPadding = document.body.style.paddingRight\nconst calculatedPadding = $(document.body).css('padding-right')\n$(document.body)\n.data('padding-right', actualPadding)\n.css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n}\n\n$(document.body).addClass(CLASS_NAME_OPEN)\n}\n\n_resetScrollbar(){\n// Restore fixed content padding\nconst fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))\n$(fixedContent).each((index, element) =>{\nconst padding = $(element).data('padding-right')\n$(element).removeData('padding-right')\nelement.style.paddingRight = padding ? padding :''\n})\n\n// Restore sticky content\nconst elements = [].slice.call(document.querySelectorAll(`${SELECTOR_STICKY_CONTENT}`))\n$(elements).each((index, element) =>{\nconst margin = $(element).data('margin-right')\nif (typeof margin !== 'undefined'){\n$(element).css('margin-right', margin).removeData('margin-right')\n}\n})\n\n// Restore body padding\nconst padding = $(document.body).data('padding-right')\n$(document.body).removeData('padding-right')\ndocument.body.style.paddingRight = padding ? padding :''\n}\n\n_getScrollbarWidth(){ // thx d.walsh\nconst scrollDiv = document.createElement('div')\nscrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER\ndocument.body.appendChild(scrollDiv)\nconst scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\ndocument.body.removeChild(scrollDiv)\nreturn scrollbarWidth\n}\n\n// Static\nstatic _jQueryInterface(config, relatedTarget){\nreturn this.each(function (){\nlet data = $(this).data(DATA_KEY)\nconst _config ={\n...Default,\n...$(this).data(),\n...(typeof config === 'object' && config ? config :{})\n}\n\nif (!data){\ndata = new Modal(this, _config)\n$(this).data(DATA_KEY, data)\n}\n\nif (typeof config === 'string'){\nif (typeof data[config] === 'undefined'){\nthrow new TypeError(`No method named \"${config}\"`)\n}\n\ndata[config](relatedTarget)\n} else if (_config.show){\ndata.show(relatedTarget)\n}\n})\n}\n}\n\n/**\n * Data API implementation\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event){\nlet target\nconst selector = Util.getSelectorFromElement(this)\n\nif (selector){\ntarget = document.querySelector(selector)\n}\n\nconst config = $(target).data(DATA_KEY) ?\n'toggle' :{\n...$(target).data(),\n...$(this).data()\n}\n\nif (this.tagName === 'A' || this.tagName === 'AREA'){\nevent.preventDefault()\n}\n\nconst $target = $(target).one(EVENT_SHOW, showEvent =>{\nif (showEvent.isDefaultPrevented()){\n// Only register focus restorer if modal will actually get shown\nreturn\n}\n\n$target.one(EVENT_HIDDEN, () =>{\nif ($(this).is(':visible')){\nthis.focus()\n}\n})\n})\n\nModal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () =>{\n$.fn[NAME] = JQUERY_NO_CONFLICT\nreturn Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n'background',\n'cite',\n'href',\n'itemtype',\n'longdesc',\n'poster',\n'src',\n'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist ={\n// Global attributes allowed on any supplied element below.\n'*':['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\na:['target', 'href', 'title', 'rel'],\narea:[],\nb:[],\nbr:[],\ncol:[],\ncode:[],\ndiv:[],\nem:[],\nhr:[],\nh1:[],\nh2:[],\nh3:[],\nh4:[],\nh5:[],\nh6:[],\ni:[],\nimg:['src', 'srcset', 'alt', 'title', 'width', 'height'],\nli:[],\nol:[],\np:[],\npre:[],\ns:[],\nsmall:[],\nspan:[],\nsub:[],\nsup:[],\nstrong:[],\nu:[],\nul:[]\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList){\nconst attrName = attr.nodeName.toLowerCase()\n\nif (allowedAttributeList.indexOf(attrName) !== -1){\nif (uriAttrs.indexOf(attrName) !== -1){\nreturn Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue))\n}\n\nreturn true\n}\n\nconst regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)\n\n// Check if a regular expression validates the attribute.\nfor (let i = 0, len = regExp.length; i < len; i++){\nif (regExp[i].test(attrName)){\nreturn true\n}\n}\n\nreturn false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn){\nif (unsafeHtml.length === 0){\nreturn unsafeHtml\n}\n\nif (sanitizeFn && typeof sanitizeFn === 'function'){\nreturn sanitizeFn(unsafeHtml)\n}\n\nconst domParser = new window.DOMParser()\nconst createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\nconst whitelistKeys = Object.keys(whiteList)\nconst elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\nfor (let i = 0, len = elements.length; i < len; i++){\nconst el = elements[i]\nconst elName = el.nodeName.toLowerCase()\n\nif (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1){\nel.parentNode.removeChild(el)\n\ncontinue\n}\n\nconst attributeList = [].slice.call(el.attributes)\n// eslint-disable-next-line unicorn/prefer-spread\nconst whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\nattributeList.forEach(attr =>{\nif (!allowedAttribute(attr, whitelistedAttributes)){\nel.removeAttribute(attr.nodeName)\n}\n})\n}\n\nreturn createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport{ DefaultWhitelist, sanitizeHtml } from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_ARROW = '.arrow'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst AttachmentMap ={\nAUTO:'auto',\nTOP:'top',\nRIGHT:'right',\nBOTTOM:'bottom',\nLEFT:'left'\n}\n\nconst Default ={\nanimation:true,\ntemplate:'
' +\n'
' +\n'
',\ntrigger:'hover focus',\ntitle:'',\ndelay:0,\nhtml:false,\nselector:false,\nplacement:'top',\noffset:0,\ncontainer:false,\nfallbackPlacement:'flip',\nboundary:'scrollParent',\ncustomClass:'',\nsanitize:true,\nsanitizeFn:null,\nwhiteList:DefaultWhitelist,\npopperConfig:null\n}\n\nconst DefaultType ={\nanimation:'boolean',\ntemplate:'string',\ntitle:'(string|element|function)',\ntrigger:'string',\ndelay:'(number|object)',\nhtml:'boolean',\nselector:'(string|boolean)',\nplacement:'(string|function)',\noffset:'(number|string|function)',\ncontainer:'(string|element|boolean)',\nfallbackPlacement:'(string|array)',\nboundary:'(string|element)',\ncustomClass:'(string|function)',\nsanitize:'boolean',\nsanitizeFn:'(null|function)',\nwhiteList:'object',\npopperConfig:'(null|object)'\n}\n\nconst Event ={\nHIDE:`hide${EVENT_KEY}`,\nHIDDEN:`hidden${EVENT_KEY}`,\nSHOW:`show${EVENT_KEY}`,\nSHOWN:`shown${EVENT_KEY}`,\nINSERTED:`inserted${EVENT_KEY}`,\nCLICK:`click${EVENT_KEY}`,\nFOCUSIN:`focusin${EVENT_KEY}`,\nFOCUSOUT:`focusout${EVENT_KEY}`,\nMOUSEENTER:`mouseenter${EVENT_KEY}`,\nMOUSELEAVE:`mouseleave${EVENT_KEY}`\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip{\nconstructor(element, config){\nif (typeof Popper === 'undefined'){\nthrow new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n}\n\n// Private\nthis._isEnabled = true\nthis._timeout = 0\nthis._hoverState = ''\nthis._activeTrigger ={}\nthis._popper = null\n\n// Protected\nthis.element = element\nthis.config = this._getConfig(config)\nthis.tip = null\n\nthis._setListeners()\n}\n\n// Getters\nstatic get VERSION(){\nreturn VERSION\n}\n\nstatic get Default(){\nreturn Default\n}\n\nstatic get NAME(){\nreturn NAME\n}\n\nstatic get DATA_KEY(){\nreturn DATA_KEY\n}\n\nstatic get Event(){\nreturn Event\n}\n\nstatic get EVENT_KEY(){\nreturn EVENT_KEY\n}\n\nstatic get DefaultType(){\nreturn DefaultType\n}\n\n// Public\nenable(){\nthis._isEnabled = true\n}\n\ndisable(){\nthis._isEnabled = false\n}\n\ntoggleEnabled(){\nthis._isEnabled = !this._isEnabled\n}\n\ntoggle(event){\nif (!this._isEnabled){\nreturn\n}\n\nif (event){\nconst dataKey = this.constructor.DATA_KEY\nlet context = $(event.currentTarget).data(dataKey)\n\nif (!context){\ncontext = new this.constructor(\nevent.currentTarget,\nthis._getDelegateConfig()\n)\n$(event.currentTarget).data(dataKey, context)\n}\n\ncontext._activeTrigger.click = !context._activeTrigger.click\n\nif (context._isWithActiveTrigger()){\ncontext._enter(null, context)\n} else{\ncontext._leave(null, context)\n}\n} else{\nif ($(this.getTipElement()).hasClass(CLASS_NAME_SHOW)){\nthis._leave(null, this)\nreturn\n}\n\nthis._enter(null, this)\n}\n}\n\ndispose(){\nclearTimeout(this._timeout)\n\n$.removeData(this.element, this.constructor.DATA_KEY)\n\n$(this.element).off(this.constructor.EVENT_KEY)\n$(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler)\n\nif (this.tip){\n$(this.tip).remove()\n}\n\nthis._isEnabled = null\nthis._timeout = null\nthis._hoverState = null\nthis._activeTrigger = null\nif (this._popper){\nthis._popper.destroy()\n}\n\nthis._popper = null\nthis.element = null\nthis.config = null\nthis.tip = null\n}\n\nshow(){\nif ($(this.element).css('display') === 'none'){\nthrow new Error('Please use show on visible elements')\n}\n\nconst showEvent = $.Event(this.constructor.Event.SHOW)\nif (this.isWithContent() && this._isEnabled){\n$(this.element).trigger(showEvent)\n\nconst shadowRoot = Util.findShadowRoot(this.element)\nconst isInTheDom = $.contains(\nshadowRoot !== null ? shadowRoot :this.element.ownerDocument.documentElement,\nthis.element\n)\n\nif (showEvent.isDefaultPrevented() || !isInTheDom){\nreturn\n}\n\nconst tip = this.getTipElement()\nconst tipId = Util.getUID(this.constructor.NAME)\n\ntip.setAttribute('id', tipId)\nthis.element.setAttribute('aria-describedby', tipId)\n\nthis.setContent()\n\nif (this.config.animation){\n$(tip).addClass(CLASS_NAME_FADE)\n}\n\nconst placement = typeof this.config.placement === 'function' ?\nthis.config.placement.call(this, tip, this.element) :\nthis.config.placement\n\nconst attachment = this._getAttachment(placement)\nthis.addAttachmentClass(attachment)\n\nconst container = this._getContainer()\n$(tip).data(this.constructor.DATA_KEY, this)\n\nif (!$.contains(this.element.ownerDocument.documentElement, this.tip)){\n$(tip).appendTo(container)\n}\n\n$(this.element).trigger(this.constructor.Event.INSERTED)\n\nthis._popper = new Popper(this.element, tip, this._getPopperConfig(attachment))\n\n$(tip).addClass(CLASS_NAME_SHOW)\n$(tip).addClass(this.config.customClass)\n\n// If this is a touch-enabled device we add extra\n// empty mouseover listeners to the body's immediate children;\n// only needed because of broken event delegation on iOS\n// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\nif ('ontouchstart' in document.documentElement){\n$(document.body).children().on('mouseover', null, $.noop)\n}\n\nconst complete = () =>{\nif (this.config.animation){\nthis._fixTransition()\n}\n\nconst prevHoverState = this._hoverState\nthis._hoverState = null\n\n$(this.element).trigger(this.constructor.Event.SHOWN)\n\nif (prevHoverState === HOVER_STATE_OUT){\nthis._leave(null, this)\n}\n}\n\nif ($(this.tip).hasClass(CLASS_NAME_FADE)){\nconst transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n$(this.tip)\n.one(Util.TRANSITION_END, complete)\n.emulateTransitionEnd(transitionDuration)\n} else{\ncomplete()\n}\n}\n}\n\nhide(callback){\nconst tip = this.getTipElement()\nconst hideEvent = $.Event(this.constructor.Event.HIDE)\nconst complete = () =>{\nif (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode){\ntip.parentNode.removeChild(tip)\n}\n\nthis._cleanTipClass()\nthis.element.removeAttribute('aria-describedby')\n$(this.element).trigger(this.constructor.Event.HIDDEN)\nif (this._popper !== null){\nthis._popper.destroy()\n}\n\nif (callback){\ncallback()\n}\n}\n\n$(this.element).trigger(hideEvent)\n\nif (hideEvent.isDefaultPrevented()){\nreturn\n}\n\n$(tip).removeClass(CLASS_NAME_SHOW)\n\n// If this is a touch-enabled device we remove the extra\n// empty mouseover listeners we added for iOS support\nif ('ontouchstart' in document.documentElement){\n$(document.body).children().off('mouseover', null, $.noop)\n}\n\nthis._activeTrigger[TRIGGER_CLICK] = false\nthis._activeTrigger[TRIGGER_FOCUS] = false\nthis._activeTrigger[TRIGGER_HOVER] = false\n\nif ($(this.tip).hasClass(CLASS_NAME_FADE)){\nconst transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n$(tip)\n.one(Util.TRANSITION_END, complete)\n.emulateTransitionEnd(transitionDuration)\n} else{\ncomplete()\n}\n\nthis._hoverState = ''\n}\n\nupdate(){\nif (this._popper !== null){\nthis._popper.scheduleUpdate()\n}\n}\n\n// Protected\nisWithContent(){\nreturn Boolean(this.getTitle())\n}\n\naddAttachmentClass(attachment){\n$(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n}\n\ngetTipElement(){\nthis.tip = this.tip || $(this.config.template)[0]\nreturn this.tip\n}\n\nsetContent(){\nconst tip = this.getTipElement()\nthis.setElementContent($(tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle())\n$(tip).removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)\n}\n\nsetElementContent($element, content){\nif (typeof content === 'object' && (content.nodeType || content.jquery)){\n// Content is a DOM node or a jQuery\nif (this.config.html){\nif (!$(content).parent().is($element)){\n$element.empty().append(content)\n}\n} else{\n$element.text($(content).text())\n}\n\nreturn\n}\n\nif (this.config.html){\nif (this.config.sanitize){\ncontent = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n}\n\n$element.html(content)\n} else{\n$element.text(content)\n}\n}\n\ngetTitle(){\nlet title = this.element.getAttribute('data-original-title')\n\nif (!title){\ntitle = typeof this.config.title === 'function' ?\nthis.config.title.call(this.element) :\nthis.config.title\n}\n\nreturn title\n}\n\n// Private\n_getPopperConfig(attachment){\nconst defaultBsConfig ={\nplacement:attachment,\nmodifiers:{\noffset:this._getOffset(),\nflip:{\nbehavior:this.config.fallbackPlacement\n},\narrow:{\nelement:SELECTOR_ARROW\n},\npreventOverflow:{\nboundariesElement:this.config.boundary\n}\n},\nonCreate:data =>{\nif (data.originalPlacement !== data.placement){\nthis._handlePopperPlacementChange(data)\n}\n},\nonUpdate:data => this._handlePopperPlacementChange(data)\n}\n\nreturn{\n...defaultBsConfig,\n...this.config.popperConfig\n}\n}\n\n_getOffset(){\nconst offset ={}\n\nif (typeof this.config.offset === 'function'){\noffset.fn = data =>{\ndata.offsets ={\n...data.offsets,\n...this.config.offset(data.offsets, this.element)\n}\n\nreturn data\n}\n} else{\noffset.offset = this.config.offset\n}\n\nreturn offset\n}\n\n_getContainer(){\nif (this.config.container === false){\nreturn document.body\n}\n\nif (Util.isElement(this.config.container)){\nreturn $(this.config.container)\n}\n\nreturn $(document).find(this.config.container)\n}\n\n_getAttachment(placement){\nreturn AttachmentMap[placement.toUpperCase()]\n}\n\n_setListeners(){\nconst triggers = this.config.trigger.split(' ')\n\ntriggers.forEach(trigger =>{\nif (trigger === 'click'){\n$(this.element).on(\nthis.constructor.Event.CLICK,\nthis.config.selector,\nevent => this.toggle(event)\n)\n} else if (trigger !== TRIGGER_MANUAL){\nconst eventIn = trigger === TRIGGER_HOVER ?\nthis.constructor.Event.MOUSEENTER :\nthis.constructor.Event.FOCUSIN\nconst eventOut = trigger === TRIGGER_HOVER ?\nthis.constructor.Event.MOUSELEAVE :\nthis.constructor.Event.FOCUSOUT\n\n$(this.element)\n.on(eventIn, this.config.selector, event => this._enter(event))\n.on(eventOut, this.config.selector, event => this._leave(event))\n}\n})\n\nthis._hideModalHandler = () =>{\nif (this.element){\nthis.hide()\n}\n}\n\n$(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler)\n\nif (this.config.selector){\nthis.config ={\n...this.config,\ntrigger:'manual',\nselector:''\n}\n} else{\nthis._fixTitle()\n}\n}\n\n_fixTitle(){\nconst titleType = typeof this.element.getAttribute('data-original-title')\n\nif (this.element.getAttribute('title') || titleType !== 'string'){\nthis.element.setAttribute(\n'data-original-title',\nthis.element.getAttribute('title') || ''\n)\n\nthis.element.setAttribute('title', '')\n}\n}\n\n_enter(event, context){\nconst dataKey = this.constructor.DATA_KEY\ncontext = context || $(event.currentTarget).data(dataKey)\n\nif (!context){\ncontext = new this.constructor(\nevent.currentTarget,\nthis._getDelegateConfig()\n)\n$(event.currentTarget).data(dataKey, context)\n}\n\nif (event){\ncontext._activeTrigger[\nevent.type === 'focusin' ? TRIGGER_FOCUS :TRIGGER_HOVER\n] = true\n}\n\nif ($(context.getTipElement()).hasClass(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW){\ncontext._hoverState = HOVER_STATE_SHOW\nreturn\n}\n\nclearTimeout(context._timeout)\n\ncontext._hoverState = HOVER_STATE_SHOW\n\nif (!context.config.delay || !context.config.delay.show){\ncontext.show()\nreturn\n}\n\ncontext._timeout = setTimeout(() =>{\nif (context._hoverState === HOVER_STATE_SHOW){\ncontext.show()\n}\n}, context.config.delay.show)\n}\n\n_leave(event, context){\nconst dataKey = this.constructor.DATA_KEY\ncontext = context || $(event.currentTarget).data(dataKey)\n\nif (!context){\ncontext = new this.constructor(\nevent.currentTarget,\nthis._getDelegateConfig()\n)\n$(event.currentTarget).data(dataKey, context)\n}\n\nif (event){\ncontext._activeTrigger[\nevent.type === 'focusout' ? TRIGGER_FOCUS :TRIGGER_HOVER\n] = false\n}\n\nif (context._isWithActiveTrigger()){\nreturn\n}\n\nclearTimeout(context._timeout)\n\ncontext._hoverState = HOVER_STATE_OUT\n\nif (!context.config.delay || !context.config.delay.hide){\ncontext.hide()\nreturn\n}\n\ncontext._timeout = setTimeout(() =>{\nif (context._hoverState === HOVER_STATE_OUT){\ncontext.hide()\n}\n}, context.config.delay.hide)\n}\n\n_isWithActiveTrigger(){\nfor (const trigger in this._activeTrigger){\nif (this._activeTrigger[trigger]){\nreturn true\n}\n}\n\nreturn false\n}\n\n_getConfig(config){\nconst dataAttributes = $(this.element).data()\n\nObject.keys(dataAttributes)\n.forEach(dataAttr =>{\nif (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1){\ndelete dataAttributes[dataAttr]\n}\n})\n\nconfig ={\n...this.constructor.Default,\n...dataAttributes,\n...(typeof config === 'object' && config ? config :{})\n}\n\nif (typeof config.delay === 'number'){\nconfig.delay ={\nshow:config.delay,\nhide:config.delay\n}\n}\n\nif (typeof config.title === 'number'){\nconfig.title = config.title.toString()\n}\n\nif (typeof config.content === 'number'){\nconfig.content = config.content.toString()\n}\n\nUtil.typeCheckConfig(\nNAME,\nconfig,\nthis.constructor.DefaultType\n)\n\nif (config.sanitize){\nconfig.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n}\n\nreturn config\n}\n\n_getDelegateConfig(){\nconst config ={}\n\nif (this.config){\nfor (const key in this.config){\nif (this.constructor.Default[key] !== this.config[key]){\nconfig[key] = this.config[key]\n}\n}\n}\n\nreturn config\n}\n\n_cleanTipClass(){\nconst $tip = $(this.getTipElement())\nconst tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\nif (tabClass !== null && tabClass.length){\n$tip.removeClass(tabClass.join(''))\n}\n}\n\n_handlePopperPlacementChange(popperData){\nthis.tip = popperData.instance.popper\nthis._cleanTipClass()\nthis.addAttachmentClass(this._getAttachment(popperData.placement))\n}\n\n_fixTransition(){\nconst tip = this.getTipElement()\nconst initConfigAnimation = this.config.animation\n\nif (tip.getAttribute('x-placement') !== null){\nreturn\n}\n\n$(tip).removeClass(CLASS_NAME_FADE)\nthis.config.animation = false\nthis.hide()\nthis.show()\nthis.config.animation = initConfigAnimation\n}\n\n// Static\nstatic _jQueryInterface(config){\nreturn this.each(function (){\nconst $element = $(this)\nlet data = $element.data(DATA_KEY)\nconst _config = typeof config === 'object' && config\n\nif (!data && /dispose|hide/.test(config)){\nreturn\n}\n\nif (!data){\ndata = new Tooltip(this, _config)\n$element.data(DATA_KEY, data)\n}\n\nif (typeof config === 'string'){\nif (typeof data[config] === 'undefined'){\nthrow new TypeError(`No method named \"${config}\"`)\n}\n\ndata[config]()\n}\n})\n}\n}\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () =>{\n$.fn[NAME] = JQUERY_NO_CONFLICT\nreturn Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default ={\n...Tooltip.Default,\nplacement:'right',\ntrigger:'click',\ncontent:'',\ntemplate:'
' +\n'
' +\n'

' +\n'
'\n}\n\nconst DefaultType ={\n...Tooltip.DefaultType,\ncontent:'(string|element|function)'\n}\n\nconst Event ={\nHIDE:`hide${EVENT_KEY}`,\nHIDDEN:`hidden${EVENT_KEY}`,\nSHOW:`show${EVENT_KEY}`,\nSHOWN:`shown${EVENT_KEY}`,\nINSERTED:`inserted${EVENT_KEY}`,\nCLICK:`click${EVENT_KEY}`,\nFOCUSIN:`focusin${EVENT_KEY}`,\nFOCUSOUT:`focusout${EVENT_KEY}`,\nMOUSEENTER:`mouseenter${EVENT_KEY}`,\nMOUSELEAVE:`mouseleave${EVENT_KEY}`\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip{\n// Getters\nstatic get VERSION(){\nreturn VERSION\n}\n\nstatic get Default(){\nreturn Default\n}\n\nstatic get NAME(){\nreturn NAME\n}\n\nstatic get DATA_KEY(){\nreturn DATA_KEY\n}\n\nstatic get Event(){\nreturn Event\n}\n\nstatic get EVENT_KEY(){\nreturn EVENT_KEY\n}\n\nstatic get DefaultType(){\nreturn DefaultType\n}\n\n// Overrides\nisWithContent(){\nreturn this.getTitle() || this._getContent()\n}\n\naddAttachmentClass(attachment){\n$(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n}\n\ngetTipElement(){\nthis.tip = this.tip || $(this.config.template)[0]\nreturn this.tip\n}\n\nsetContent(){\nconst $tip = $(this.getTipElement())\n\n// We use append for html objects to maintain js events\nthis.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle())\nlet content = this._getContent()\nif (typeof content === 'function'){\ncontent = content.call(this.element)\n}\n\nthis.setElementContent($tip.find(SELECTOR_CONTENT), content)\n\n$tip.removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)\n}\n\n// Private\n_getContent(){\nreturn this.element.getAttribute('data-content') ||\nthis.config.content\n}\n\n_cleanTipClass(){\nconst $tip = $(this.getTipElement())\nconst tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\nif (tabClass !== null && tabClass.length > 0){\n$tip.removeClass(tabClass.join(''))\n}\n}\n\n// Static\nstatic _jQueryInterface(config){\nreturn this.each(function (){\nlet data = $(this).data(DATA_KEY)\nconst _config = typeof config === 'object' ? config :null\n\nif (!data && /dispose|hide/.test(config)){\nreturn\n}\n\nif (!data){\ndata = new Popover(this, _config)\n$(this).data(DATA_KEY, data)\n}\n\nif (typeof config === 'string'){\nif (typeof data[config] === 'undefined'){\nthrow new TypeError(`No method named \"${config}\"`)\n}\n\ndata[config]()\n}\n})\n}\n}\n\n/**\n * jQuery\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () =>{\n$.fn[NAME] = JQUERY_NO_CONFLICT\nreturn Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.6.2):scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.6.2'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\nconst SELECTOR_DATA_SPY = '[data-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default ={\noffset:10,\nmethod:'auto',\ntarget:''\n}\n\nconst DefaultType ={\noffset:'number',\nmethod:'string',\ntarget:'(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy{\nconstructor(element, config){\nthis._element = element\nthis._scrollElement = element.tagName === 'BODY' ? window :element\nthis._config = this._getConfig(config)\nthis._selector = `${this._config.target} ${SELECTOR_NAV_LINKS},` +\n`${this._config.target} ${SELECTOR_LIST_ITEMS},` +\n`${this._config.target} ${SELECTOR_DROPDOWN_ITEMS}`\nthis._offsets = []\nthis._targets = []\nthis._activeTarget = null\nthis._scrollHeight = 0\n\n$(this._scrollElement).on(EVENT_SCROLL, event => this._process(event))\n\nthis.refresh()\nthis._process()\n}\n\n// Getters\nstatic get VERSION(){\nreturn VERSION\n}\n\nstatic get Default(){\nreturn Default\n}\n\n// Public\nrefresh(){\nconst autoMethod = this._scrollElement === this._scrollElement.window ?\nMETHOD_OFFSET :METHOD_POSITION\n\nconst offsetMethod = this._config.method === 'auto' ?\nautoMethod :this._config.method\n\nconst offsetBase = offsetMethod === METHOD_POSITION ?\nthis._getScrollTop() :0\n\nthis._offsets = []\nthis._targets = []\n\nthis._scrollHeight = this._getScrollHeight()\n\nconst targets = [].slice.call(document.querySelectorAll(this._selector))\n\ntargets\n.map(element =>{\nlet target\nconst targetSelector = Util.getSelectorFromElement(element)\n\nif (targetSelector){\ntarget = document.querySelector(targetSelector)\n}\n\nif (target){\nconst targetBCR = target.getBoundingClientRect()\nif (targetBCR.width || targetBCR.height){\n// TODO (fat):remove sketch reliance on jQuery position/offset\nreturn [\n$(target)[offsetMethod]().top + offsetBase,\ntargetSelector\n]\n}\n}\n\nreturn null\n})\n.filter(Boolean)\n.sort((a, b) => a[0] - b[0])\n.forEach(item =>{\nthis._offsets.push(item[0])\nthis._targets.push(item[1])\n})\n}\n\ndispose(){\n$.removeData(this._element, DATA_KEY)\n$(this._scrollElement).off(EVENT_KEY)\n\nthis._element = null\nthis._scrollElement = null\nthis._config = null\nthis._selector = null\nthis._offsets = null\nthis._targets = null\nthis._activeTarget = null\nthis._scrollHeight = null\n}\n\n// Private\n_getConfig(config){\nconfig ={\n...Default,\n...(typeof config === 'object' && config ? config :{})\n}\n\nif (typeof config.target !== 'string' && Util.isElement(config.target)){\nlet id = $(config.target).attr('id')\nif (!id){\nid = Util.getUID(NAME)\n$(config.target).attr('id', id)\n}\n\nconfig.target = `#${id}`\n}\n\nUtil.typeCheckConfig(NAME, config, DefaultType)\n\nreturn config\n}\n\n_getScrollTop(){\nreturn this._scrollElement === window ?\nthis._scrollElement.pageYOffset :this._scrollElement.scrollTop\n}\n\n_getScrollHeight(){\nreturn this._scrollElement.scrollHeight || Math.max(\ndocument.body.scrollHeight,\ndocument.documentElement.scrollHeight\n)\n}\n\n_getOffsetHeight(){\nreturn this._scrollElement === window ?\nwindow.innerHeight :this._scrollElement.getBoundingClientRect().height\n}\n\n_process(){\nconst scrollTop = this._getScrollTop() + this._config.offset\nconst scrollHeight = this._getScrollHeight()\nconst maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\nif (this._scrollHeight !== scrollHeight){\nthis.refresh()\n}\n\nif (scrollTop >= maxScroll){\nconst target = this._targets[this._targets.length - 1]\n\nif (this._activeTarget !== target){\nthis._activate(target)\n}\n\nreturn\n}\n\nif (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0){\nthis._activeTarget = null\nthis._clear()\nreturn\n}\n\nfor (let i = this._offsets.length; i--;){\nconst isActiveTarget = this._activeTarget !== this._targets[i] &&\nscrollTop >= this._offsets[i] &&\n(typeof this._offsets[i + 1] === 'undefined' ||\nscrollTop < this._offsets[i + 1])\n\nif (isActiveTarget){\nthis._activate(this._targets[i])\n}\n}\n}\n\n_activate(target){\nthis._activeTarget = target\n\nthis._clear()\n\nconst queries = this._selector\n.split(',')\n.map(selector => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\nconst $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\nif ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)){\n$link.closest(SELECTOR_DROPDOWN)\n.find(SELECTOR_DROPDOWN_TOGGLE)\n.addClass(CLASS_NAME_ACTIVE)\n$link.addClass(CLASS_NAME_ACTIVE)\n} else{\n// Set triggered link as active\n$link.addClass(CLASS_NAME_ACTIVE)\n// Set triggered links parents as active\n// With both