{"version":3,"sources":["eh.Formula.ts","eh.pc.Accordion.ts","eh.pc.AnchorNavigation.ts","eh.pc.BreadcrumbController.ts","eh.pc.CompactTeaserController.ts","eh.pc.Filter.controller.ts","eh.pc.FilterControls.ts","eh.pc.FilterDrawer.ts","eh.pc.FilterFlyout.ts","eh.pc.FilterLayout.ts","eh.pc.FilterRequest.ts","eh.pc.FilterSelection.ts","eh.pc.Footnotes.ts","eh.pc.Gallery.ts","eh.pc.LoadMoreController.ts","eh.pc.ProcessMapController.ts","eh.pc.ProductTeaserLinkTab.ts","eh.pc.QuickLinksController.ts","page-composing.ts","eh.pc.SpdSearch.controller.ts","eh.SearchController.ts"],"names":["eh","temml","window","EhFormula","init","$base","$","each","_index","element","formula","this","attr","html","renderToString","displayMode","replaceWith","err","console","error","EhAccordionController","selfOrFind","concat","SHOW_MORE_CLASSNAME","index","prototype","registerControls","_this","_a","buttonMore","forEach","x","addEventListener","onButtonMoreClicked","_b","buttonLess","onButtonLessClicked","showMoreWrapper","ResizeObserver","el","classList","contains","CLOSED_CLASSNAME","scrollHeight","clientHeight","add","_c","remove","observe","checkAutoFit","hasAttribute","AUTO_FIT_ATTR","requestAnimationFrame","contentEl","Array","from","children","find","c","FITS_CLASSNAME","SHOW_MORE_BUTTON_CLASSNAME","SHOW_LESS_BUTTON_CLASSNAME","SHOW_MORE_MARGIN_ORIGIN_CLASSNAME","SHOW_MORE_MARGIN_TARGET_CLASSNAME","SHOW_MORE_GROUP_CLASSNAME","SHOW_MORE_WRAPPER_CLASSNAME","base","e","preventDefault","vm","showMore","showLess","currentTarget","querySelectorAll","filter","closest","showMoreMarginOrigin","querySelector","showMoreMarginTarget","showMoreGroup","_d","parentElement","_e","_f","EhAccordionViewModel","size","sm","HIDE_CLASSNAME","showMoreElement","getBoundingClientRect","style","minWidth","width","maxWidth","offset","dataset","animate","scrollTop","top","EhAnchorNavigationController","ANCHOR_NAV_CLASSNAME","filterAnchorItemsExist","navigation","navItems","ANCHOR_NAV_NAVIGATION_ITEM_CLASSNAME","ni","hf","startsWith","length","NavigationController","uiStateSupport","registerUIStateListener","onMainNavChanged","previousBtn","onPreviousClicked","nextBtn","onNextClicked","navigationItems","item","onItemClicked","tableOfContent","onTableOfContentClicked","root","onClickRoot","ANCHOR_NAV_NAVIGATION_CLASSNAME","ANCHOR_NAV_PREVIOUS_BTN_CLASSNAME","ANCHOR_NAV_NEXT_BTN_CLASSNAME","TABLE_OF_CONTENT_CLASSNAME","ANCHOR_NAV_ACTIVE_LABEL_CLASSNAME","document","scrollingElement","setCurrentItem","previous","next","tableOfContentClicked","target","HTMLElement","selfOrClosest","closeTableOfContent","last","current","tableOfContentElements","anchorActiveLabel","EhAnchorNavigationViewModel","isDisabled","_g","_h","Header","body","_currentItem","getItemByIdx","link","targetIndex","Math","max","idx","previousItem","min","_scrollerItems","nextItem","triggerJumpToAnchor","ACTIVE_CLASSNAME","blur","isTab","getItemByEl","innerText","trim","updateLocation","alignItemToViewport","animateToAnchor","invalidateControls","onPageScrollChange","targetKey","anchorNavigation","ANCHOR_NAV_TAB","navigationHeight","scroller","invalidateItems","getAttribute","history","replaceState","state","location","pathname","search","MIN_AMOUNT_SCROLL_ITEMS","Breakpoints","getInstance","registerChangeListener","onBreakpointChange","ScrollPage","debounce","invalidate","initialSelection","onNavigationScrollChange","passive","scrollerPos","clippingLeft","clippingRight","leftOffset","rightOffset","scrollLeft","offsetLeft","clientWidth","targetScrollPosLeft","TRANSITION_DURATION","TRANSITION_EASING_LINEAR","scrollingOffset","innerHeight","diffScroll","thresholdBegin","scrollTo","height","TRANSITION_EASING_SWING","si","Error","getItemByOffset","scrollOffset","i","thresholdEnd","isMobile","OPENED_CLASSNAME","DISABLED_CLASSNAME","items","previousButton","nextButton","scrollerItem","scrollPos","getScrollPosition","_old","_current","value","getElementById","replace","topPos","offsetTopToBody","push","hideClass","scrollWidth","scrollerDelta","setTimeout","BreadcrumbController","BREADCRUMB_WRAPPER","sublistOpen","onClickOpenSublist","BREADCRUMB_SUBLIST_OPEN_WRAPPER","BREADCRUMB_SUBLIST_WRAPPER","BREADCRUMB_LAST_ITEM","stopPropagation","toggleSublist","isOpen","closeSublist","sublist","breadcrumbLast","BreadcrumbViewModel","HIDDEN_CLASSNAME","TOOLTIP_CLASSNAME","wrapper","firstChild","firstElementChild","offsetWidth","EhCompactTeaserController","COMPACT_TEASSER_WRAPPER_CLASSNAME","setEqualHeights","COMPACT_TEASER_CLASSNAME","COMPACT_TEASER_CELL_CLASSNAME","elements","EhCompactTeaserViewModel","registerResizeListener","maxHeight","offsetHeight","EhFilterController","ehInit","isSnippetRequest","BLOCK_CLASSNAME","Object","defineProperty","form","controls","hiddenInputs","term","requestUpdate","addSpinner","request","send","rewire","menu","FILTER_SELECTION_CLASSNAME","resultsMenu","FILTER_RESULTS_MENU_CLASSNAME","menuGroup","FILTER_SELECTION_GROUP_CLASSNAME","flyout","EhFilterFlyout","layout","EhFilterLayout","drawer","EhFilterDrawer","selection","EhFilterSelection","sort","EhFilterSort","NO_CLICK_FOCUS_CLASSNAME","elem","preventFocus","log","FILTER_WRAPPER","FILTER_WRAPPER_BLOCK","FILTER_WRAPPER_CLASSNAME","FILTER_CLASSNAME","FILTER_CATEGORY_ITEM_CLASSNAME","FILTER_MENU_FILTER_WRAPPER_CLASSNAME","FILTER_SELECTION_LIST_CLASSNAME","FILTER_SELECTION_LIST_SEL_ALL_CLASSNAME","FILTER_SELECTION_LIST_SEL_NONE_CLASSNAME","FILTER_SELECTION_LIST_LOADING_CLASSNAME","FILTER_CONTROL_CLONE","FILTER_IGNORE_CHANGE_CLASSNAME","FILTER_FILTERS_OPEN_CLASSNAME","FILTER_FILTERS_CLOSE_CLASSNAME","FILTER_DRAWER_MENU_OPEN_CLASSNAME","FILTER_MENU_OPENED_CLASSNAME","FILTER_MENU_HEADLINE_CLASSNAME","FILTER_MENU_ACTIONS_CLASSNAME","FILTER_SELECTED_CLASSNAME","FILTERS_SELECTED_WRAPPER_CLASSNAME","FILTERS_SELECTED_ITEM_CLASSNAME","FILTERS_SELECTED_SHOW_MORE_CLASSNAME","FILTERS_SELECTED_SHOW_MORE_LABEL_CLASSNAME","FILTERS_SELECTED_CLEAR_BTN_CLASSNAME","FILTER_REMOVE_SINGLE_CLASSNAME","FORM_RESET_TRIGGER_CLASSNAME","FILTER_TEXT_CLASSNAME","FILTER_TEXT_CLEAR_CLASSNAME","FILTER_HIDDEN_CHANGE_CLASSNAME","ICON_CLASSNAME","SPINNER_CLASSNAMES","REMOVE_CLASSNAMES","ARROW_DOWN_CLASSNAME","ARROW_UP_CLASSNAME","FLEX_WRAP_CLASSNAME","SHADOW_CLASSNAME","OPEN_CLASSNAME","LOADING_CLASSNAME","SORT_MENU_CLASSNAME","page","onPageClick","clickRoot","onWindowResized","onResizeDebounced","onWindowScroll","onScrollDebounced","reset","recalculate","EhFilterRequest","EhFilterControls","textInput","hiddenChangeInputs","onKeyUp","onTrackActivate","onTermReset","hasHiddenValue","input","onHiddenChange","ctx","Event","trackSubtype","TRACK_SUBTYPE_ATTR","trackTerm","subtype","MIN_TERM_LENGTH","searchEventSent","Tracking","injectTrackingEvent","event_subtype","trackSearchTermView","KEYUP_DELAY","keyupTimeout","undefined","clearTimeout","span","onMenuClick","onMenuMouseDown","ENTRY_CLASSNAME","entry","radio","checked","onSortChange","MENU_CLASSNAME","WRAPPER_CLASSNAME","DROPDOWN_SELECTOR","matches","activeElement","btn","onOpenClick","onCloseClick","SUBMIT_CLASSNAME","onMenuGroupScroll","category","open","setScrollEnabled","NO_SCROLL_CLASSNAME","close","updateScrollShadows","childHeight","scrollable","atBottom","toggleShadow","className","on","toggle","updateScrollShadowsDebounced","filters","wiredFilters","has","onFilterClick","cover","onLoadingClick","showFilter","wasActive","setArrow","list","keepInViewport","left","rect","innerWidth","VIEWPORT_MARGIN","collapseGroups","up","icon","WeakSet","recalculateFilterGroupWrapper","recalculateActiveFilters","menuButton","available","ROW_RESERVE","seen","map","order","parseInt","getComputedStyle","a","b","sum","activeFilters","showMoreLabel","clearAll","hidden","filtersSelected","removeEventListener","onActiveFiltersScroll","activeFilter","onShowMoreClick","textContent","formElement","optionLists","markLoading","snippetUrl","data","collectData","trackingChangeType","cs","Snippet","preAjax","ajax","method","done","d","EhFilterResponse","apply","setLoading","removeClass","addClass","LOADING_LIST_CLASSNAME","pill","FormData","key","toString","_i","cb","name","val","$target","CHANGE_TYPE_SEARCH","is","prop","newDom","DOMParser","parseFromString","replaceMap","buildReplaceMap","syncActiveFilterCount","pushHistoryUrl","syncLoadMore","scrolled","swapFragments","reloadAccordions","restoreScroll","swapResultCards","reloadLoadMore","openFilters","openClones","openPills","AccordionCtrl","ACCORDION_CATEGORY_SELECTOR","filterProperty","cloneName","AJAX_REPLACE_CLASSNAME","replaceId","group","indexOf","reopenPill","count","ACTIVE_FILTERS_CLASSNAME","newUrl","url","pushState","source","EhLoadMoreController","LOAD_MORE_CLASSNAME","nextPage","nextPageHistory","resultCount","used","replacement","event","isConnected","cloneNode","preserveOpenFilterWrapper","jQuery","EventIdPostReplace","replacedTarget","removedTarget","trigger","s","oldFragment","openWrapper","freshOpenWrapper","refreshOpenFilterWrapper","oldWrapper","newWrapper","oldFilter","newFilter","disabled","innerHTML","oldContent","newContent","ACCORDION_SELECTOR","dispatchEvent","RELOAD_EVENT","section","RESULTS_SECTION_CLASSNAME","RESULT_CARD_CLASSNAME","NO_RESULT_CARD_CLASSNAME","parent","cardClass","appendChild","ev","rehighlightResults","rows","SearchInlineController","GROUP_OF_SEARCH_CLASSNAME","SearchInlineViewModel","searchAndHighlight","searchTerm","inputs","onCloneChange","onOptionChange","onSelectAll","onSelectNone","removeButtons","onRemoveFilter","onResetForm","setGroupChecked","button","showSpinner","$button","origId","$original","paramName","paramValue","ehFilterResetHandled","Footnotes","instances","enotes","updateForm","FOOTNOTES_WRAPPER_CLASSNAME","container","FOOTNOTE_INSTANCE_CLASSNAME","note","insertNote","noteLink","FOOTNOTE_INSTANCE_LINK_CLASSNAME","nextKey","text","onClickScrollTo","nx","id","LinkTarget","Overlay","registerLinks","instanceId","FOOTNOTES_CONTAINER_CLASSNAME","FOOTNOTE_INSTANCE_CONTENT_CLASSNAME","headerHeight","linkTarget","t","offsetTop","scrollToAnimated","headerChanged","metrics","visibleHeaderHeight","visibleDisplaceElemHeight","HEADER_EVENTS","DOM_MUTATION","EhGalleryController","GALLERY_CLASSNAME","lightbox","navigationMoreItems","onItemMoreClicked","navigationVideoItem","onItemVideoClicked","pictureWrapper","onTouchStart","onTouchEnd","GALLERY_LIGHTBOX_CLASSNAME","GALLERY_PICTURE_WRAPPER_CLASSNAME","GALLERY_NAVIGATION_CLASSNAME","GALLERY_NAVIGATION_ITEM_CLASSNAME","GALLERY_NAVIGATION_ITEM_VIDEOS_CLASSNAME","GALLERY_NAVIGATION_ITEM_MORE_CLASSNAME","GALLERY_PREVIOUS_BTN_CLASSNAME","GALLERY_NEXT_BTN_CLASSNAME","GALLERY_PCITURE_ITEM_CLASSNAME","GALLERY_PCITURE_TEXT_ITEM_CLASSNAME","touchstartX","touchendX","touchOffsetThreshold","changedTouches","screenX","abs","showInLightbox","navigationVideoIdxItem","setCurrentItemLightbox","navigationLightbox","_j","_k","EhGalleryViewModel","currentItem","lightboxLink","isDisplayableInMain","mainLink","isVideo","restoreMainItem","syncMain","notifyLayerState","lightboxTarget","lightboxTargetText","stopVideo","_mainItem","targetText","_l","_m","_o","_q","_p","findIndex","_r","_s","_t","_u","_v","scrollerLightbox","_w","ready","pageLoaded","OVERLAY_EVENTS","EVENT_NODE_CLASS","LAYER_STATE_EVENT","LAYER_STATE_OPENED","LAYER_STATE_CLOSED","scrollIntoView","behavior","block","inline","getMainLinkByIdx","gallery","isVertical","isInRange","video","videoLightbox","some","closeBtn","refresh","productCards","PRODUCT_CARD_CLASSNAME","totalResults","Number","reload","resetPage","showProducts","LOAD_MORE_SECTION_CLASSNAME","LOAD_MORE_BUTTON_CLASSNAME","PROGRESS_BAR_CLASSNAME","PROGRESS_LINE_CLASSNAME","VIEWED_PRODUCTS_CLASSNAME","loadMore","that","viewedProducts","progressBar","progressLine","loadMoreSection","bind","EhLoadMoreViewModel","Breakpoint","currentThreshold","BREAKPOINT_X_LARGE","BREAKPOINT_LARGE","BREAKPOINT_MEDIUM","BREAKPOINT_SMALL","BREAKPOINT_X_SMALL","threshold","currentPage","pushHistoryPage","template","params","URLHelper","buildQueryParamMap","getQueryString","pageParam","hasOwnProperty","lastIndexOf","buildUrl","buildQueryString","loadMoreElement","moreCardsNeeded","pageSize","pagingExceeded","doShowProducts","shownElements","hideOnFirstPage","product","textMore","setAttribute","textCompleted","amount","change","loadAmounts","updatePageSize","newSize","rv","EhProcessMapController","bindLinks","PROCESS_MAP_WRAPPER_CLASSNAME","registerWrapper","PROCESS_MAP_SVG_CLASSNAME","onLinkClick","run","containers","display","vms","String","EhProcessMapViewModel","onBreadcrumbClick","view","readState","maps","viewFromHash","restore","rootView","__assign","pm","currentState","runWrapper","runLength","URL_HASH_PREFIX","currentView","mapIdFromHash","hash","slice","MAP_ID_PREFIX","reconstructView","vmIndexOf","isArray","BREADCRUMB_CLASSNAME","BREADCRUMB_ITEM_CLASSNAME","BREADCRUMB_SEP_CLASSNAME","BREADCRUMB_ITEM_LAST_CLASSNAME","keepScrollY","href","navigate","steps","trailLength","scrollY","go","navigateUp","onPopState","keep_1","scrollX","observer","MutationObserver","childList","subtree","findMap","trail","__spreadArray","rootId","targetId","show","parent_1","unshift","changed","showMap","renderBreadcrumb","svgEl","hasClass","handleOnsiteNavigation","VPAGE_EVENTS","DRAWER_OPENED","seps","nav","removeAttribute","getLabel","EhProductTeaserLinkTabController","FLEX_CLASSNAME","QuickLinksController","MODULE_WRAPPER","onScrollChange","onResizeChange","QUICKLINKS_WRAPPER_CLASSNAME","TABLE_OF_CONTENT_ELEM","scrollChange","resizeChange","quickLinksWrapper","QuickLinksViewModel","quickLinksGridCellParent","quickLinks","quickLinksGridCell","GRID_CELL_CLASSNAME","quickLinksLinks","QUICK_LINKS_LINKS_CLASSNAME","ANCHOR_NAVIGATION_CLASSNAME","quickLinkInitialTop","wrapperHeight","parentStyle","thresholdEndTableOfContent","thresholdQuickLinks","endOfContent","scrollingAmount","AVOID_STICKY_CLASSNAME","moduleHeight","module","QUICK_LINKS_STICKY_CLASSNAME","parseFloat","paddingLeft","paddingRight","paddingTop","paddingBottom","minHeight","opacity","anchorOffset","tocRect","quickLinksRect","bottom","EhSpdSearchController","onFocus","onInput","onKeyDown","onReset","submit","onSubmit","clearHistory","onClearHistory","dropdown","onDropdownClick","onDropdownHover","onDropdownLeave","combo","onFocusOut","onDocumentClick","itemOf","ITEM_CLASSNAME","ITEM_TEMPLATE_CLASSNAME","MODULE_CLASSNAME","COMBO_CLASSNAME","INPUT_CLASSNAME","RESET_CLASSNAME","DROPDOWN_CLASSNAME","PANEL_CLASSNAME","CLEAR_HISTORY_CLASSNAME","DEBOUNCE_MS","ENDPOINT","setError","debounceId","EhSpdSearchViewModel","MIN_QUERY_LENGTH","clearInput","selectItem","activate","resetActive","boundary","relatedTarget","moveActive","selectActive","query","submitted","trimmed","openPanel","token","queryToken","history_1","readHistory","renderItems","response","sent","mode","hit","code","addEntry","trackHit","follow","first","leading","match","panels","panel","setActive","hasError","HAS_ERROR_CLASSNAME","isLoading","IS_LOADING_CLASSNAME","focus","visibleItems","activeIndex","keyboardSubtype","click","node","readItem","rootCode","locale","documentElement","lang","DeviceProfile","lookupProduct","assign","event_id","event_linkname","event_product_id","event_order_code","event_product_name","productName","historyKeyOf","stored","writeHistory","HISTORY_MAX","fetchProvider","success","split","toLowerCase","panelName","ITEMS_CLASSNAME","itemTemplate","createItem","COUNT_CLASSNAME","image","ITEM_IMAGE_CLASSNAME","ITEM_LEADING_CLASSNAME","ITEM_MATCH_CLASSNAME","tailing","ITEM_TAILING_CLASSNAME","setItemPart","ITEM_ROOT_CODE_CLASSNAME","ITEM_SERIAL_CLASSNAME","serial","ITEM_ORDER_CODE_CLASSNAME","part","before","after","strong","createElement","createTextNode","active","p","itemsOf","ITEM_TITLE_CLASSNAME","raw","localStorage","getItem","HISTORY_KEY","parsed","JSON","parse","setItem","stringify","__awaiter","URLSearchParams","q","set","fetch","encodeURIComponent","headers","Accept","ok","status","json","SearchController","isSnippet","SEARCH_CONTAINER_CLASSNAME","checkInitialState","triggerSearch","tagName","onSelect","type","onClear","clear","selectAll","selectAllElement","criteria","isSelect","isRadio","isCheckbox","minLength","SEARCH_ACTIVE_CLASSNAME","highlight","CONTENT_CLASSNAME","NO_RESULTS_CLASSNAME","SEARCH_RESET_CLASSNAME","SEARCH_CLEAR_CLASSNAME","SEARCH_COUNT_CLASSNAME","SEARCH_SELECT_ALL_CLASSNAME","SEARCH_PILL_ACTIVE_TEMPLATE_CLASSNAME","SEARCH_ACTIVE_PILLS_CLASSNAME","resetSearch","clearSearch","content","groupOfSearchElement","noResults","pillActiveTemplate","activePills","EhSearchViewModel","resetElement","searchId","inputElement","clearHighlights","clearActivePills","HIDDEN_CLASS","countResults","hasVisibleGroups","matchesAll","criteria_1","criterion","highlightText","criteria_2","addActivePills","HIGHLIGHT_CLASS","parentNode","replaceChild","normalize","SEARCH_PILL_ACTIVE_CLASSNAME","textElement","labels","prepend","visibleCount","nodeType","Node","TEXT_NODE","nodeValue","escapedSearchTerm","escapeRegExp","regex","RegExp","test","fragment","createDocumentFragment","lastIndex","exec","ELEMENT_NODE","searchTag","includes","childNodes","child","string","DISABLED_CLASS","selAll","$root","$event","originalEvent","oEvent","Composing"],"mappings":"CAAA,SAAUA,GAER,IAAMC,EAAeC,OAAeD,MACpCE,GAESA,EAAAC,KAAP,SAAYC,GACVC,EAAE,qBAAsBD,GAAOE,KAAK,SAAUC,EAAQC,GACpD,IAAMC,EAAUJ,EAAEK,MAAMC,KAAK,gBAC7B,GAAIF,EACF,IACE,IAAMG,EAAOZ,EAAMa,eAAeJ,EAAS,CAAEK,aAAa,IAC1DT,EAAEG,GAASO,YAAYH,GACvB,MAAOI,GACPC,QAAQC,MAAM,iBAAkBF,OAK1Cd,GAfA,SAAAA,KAAaH,EAAAG,UAASA,EAHxB,CAAUH,GAAAA,IAAE,ICAZ,SAAUA,GAKR,IAAAoB,GAeSA,EAAAhB,KAAP,SAAYC,GACVA,EAAMgB,WAAW,IAAAC,OAAIF,EAAsBG,sBAAuBhB,KAAK,SAACiB,EAAef,GACrF,IAAIW,EAAsBX,MA+CtBW,EAAAK,UAAArB,KAAR,WACEO,KAAKe,oBAGCN,EAAAK,UAAAC,iBAAR,WAAA,I,EAAAC,EAAAhB,KACiB,QAAfiB,EAAAjB,KAAKkB,kBAAU,IAAAD,GAAAA,EAAEE,QAAQ,SAAAC,GACvBA,EAAEC,iBAAiB,QAASL,EAAKM,uBAEpB,QAAfC,EAAAvB,KAAKwB,kBAAU,IAAAD,GAAAA,EAAEJ,QAAQ,SAAAC,GACvBA,EAAEC,iBAAiB,QAASL,EAAKS,uBAE/BzB,KAAK0B,iBACU,IAAIC,eAAe,W,QACvB,QAAPV,EAAAD,EAAKY,UAAE,IAAAX,GAAAA,EAAEY,UAAUC,SAASrB,EAAsBsB,oBAClCf,EAAKU,gBAAiBM,aAAehB,EAAKU,gBAAiBO,aAEpE,QAAPV,EAAAP,EAAKY,UAAE,IAAAL,GAAAA,EAAEM,UAAUK,IAAI,2BAEhB,QAAPC,EAAAnB,EAAKY,UAAE,IAAAO,GAAAA,EAAEN,UAAUO,OAAO,8BAIvBC,QAAQrC,KAAK0B,iBAExB1B,KAAKsC,gBAGC7B,EAAAK,UAAAwB,aAAR,WAAA,I,EAAAtB,EAAAhB,KACc,QAAPiB,EAAAjB,KAAK4B,UAAE,IAAAX,GAAAA,EAAEsB,aAAa9B,EAAsB+B,gBAC5CxC,KAAK4B,GAAGC,UAAUC,SAASrB,EAAsBsB,mBAEtDU,sBAAsB,WACpB,IACMC,GADD1B,EAAKY,KACJc,EAAYC,MAAMC,KAAK5B,EAAKY,GAAGiB,UAAUC,KAAK,SAAAC,GAClD,OAACA,EAAElB,UAAUC,SAAS,gCAEPY,EAAUV,cAAgBU,EAAUT,cACnDjB,EAAKY,GAAGC,UAAUK,IAAIzB,EAAsBuC,mBApGpCvC,EAAAG,oBAA8B,iBAE9BH,EAAAwC,2BAAqC,yBACrCxC,EAAAyC,2BAAqC,yBACrCzC,EAAA0C,kCAA4C,gCAC5C1C,EAAA2C,kCAA4C,gCAE5C3C,EAAA4C,0BAAoC,wBACpC5C,EAAA6C,4BAAsC,0BACtC7C,EAAAsB,iBAA2B,yBAC3BtB,EAAAuC,eAAyB,uBACzBvC,EAAA+B,cAAwB,gBAuGxC/B,GApFE,SAAAA,EACmB8C,GADnB,I,EAAAvC,EAAAhB,KACmBA,KAAAuD,KAAAA,EA0EXvD,KAAAsB,oBAAsB,SAACkC,GAC7BA,EAAEC,iBACFzC,EAAK0C,GAAGC,YAGF3D,KAAAyB,oBAAsB,SAAC+B,GAC7BA,EAAEC,iBACFzC,EAAK0C,GAAGE,SAASJ,EAAEK,gBA/EnB7D,KAAK4B,GAAK5B,KAAKuD,KACXvD,KAAK4B,KACP5B,KAAKkB,WAAayB,MAAMC,KACtB5C,KAAK4B,GAAGkC,iBAAiB,IAAAnD,OAAIF,EAAsBwC,8BACnDc,OAAO,SAAA3C,GAAK,OAAAA,EAAE4C,QAAQ,IAAArD,OAAIF,EAAsBG,wBAA2BI,EAAKY,KAClF5B,KAAKwB,WAAamB,MAAMC,KACtB5C,KAAK4B,GAAGkC,iBAAiB,IAAAnD,OAAIF,EAAsByC,8BACnDa,OAAO,SAAA3C,GAAK,OAAAA,EAAE4C,QAAQ,IAAArD,OAAIF,EAAsBG,wBAA2BI,EAAKY,MAEpF5B,KAAKiE,qBAA8B,QAAPhD,EAAAjB,KAAK4B,UAAE,IAAAX,OAAA,EAAAA,EAAEiD,cAAc,IAAAvD,OAAIF,EAAsB0C,oCAC7EnD,KAAKmE,qBAA8B,QAAP5C,EAAAvB,KAAK4B,UAAE,IAAAL,OAAA,EAAAA,EAAE2C,cAAc,IAAAvD,OAAIF,EAAsB2C,oCAC7EpD,KAAKoE,cAAsC,QAAtBC,EAAO,QAAPlC,EAAAnC,KAAK4B,UAAE,IAAAO,OAAA,EAAAA,EAAEmC,qBAAa,IAAAD,GAAAA,EAAExC,UAAUC,SAAS,GAAAnB,OAAGF,EAAsB4C,4BAAsC,QAAPkB,EAAAvE,KAAK4B,UAAE,IAAA2C,OAAA,EAAAA,EAAED,cAAgB,KACjJtE,KAAK0B,gBAAyB,QAAP8C,EAAAxE,KAAK4B,UAAE,IAAA4C,OAAA,EAAAA,EAAEN,cAAc,IAAAvD,OAAIF,EAAsB6C,8BACnEtD,KAAKkB,YAAelB,KAAKwB,YAAexB,KAAK4B,KAKlD5B,KAAK0D,GAAK,IAAIe,EACZzE,KAAK4B,GACL5B,KAAKkB,WACLlB,KAAKwB,WACLxB,KAAKiE,qBACLjE,KAAKmE,qBACLnE,KAAKoE,eAGPpE,KAAKP,QA7DIJ,EAAAoB,sBAAqBA,EAsHlC,IAAAgE,GAeUA,EAAA3D,UAAArB,KAAR,aAGOgF,EAAA3D,UAAA6C,SAAP,W,IAoBUe,EAnBJ1E,KAAKoE,eACPpE,KAAKoE,cAAcN,iBAAiB,IAAAnD,OAAIF,EAAsBG,sBAAuBO,QAAQ,SAAAwD,G,MAC3FA,EAAG9C,UAAUK,IAAIzB,EAAsBsB,kBACoC,QAA3Ed,EAAA0D,EAAGb,iBAAiB,IAAAnD,OAAIF,EAAsBwC,oCAA6B,IAAAhC,GAAAA,EAAEE,QAAQ,SAAAC,GACnFA,EAAES,UAAUO,OAAOqC,EAAqBG,kBAEiC,QAA3ErD,EAAAoD,EAAGb,iBAAiB,IAAAnD,OAAIF,EAAsByC,oCAA6B,IAAA3B,GAAAA,EAAEJ,QAAQ,SAAAC,GACnFA,EAAES,UAAUK,IAAIuC,EAAqBG,oBAI3C5E,KAAK6E,gBAAgBhD,UAAUO,OAAO3B,EAAsBsB,kBAC7C,QAAfd,EAAAjB,KAAKkB,kBAAU,IAAAD,GAAAA,EAAEE,QAAQ,SAAAC,GACvBA,EAAES,UAAUK,IAAIuC,EAAqBG,kBAExB,QAAfrD,EAAAvB,KAAKwB,kBAAU,IAAAD,GAAAA,EAAEJ,QAAQ,SAAAC,GACvBA,EAAES,UAAUO,OAAOqC,EAAqBG,kBAEtC5E,KAAKiE,sBAAwBjE,KAAKmE,uBAC9BO,EAAO1E,KAAKiE,qBAAqBa,wBACvC9E,KAAKmE,qBAAqBY,MAAMC,SAAW,GAAArE,OAAG+D,EAAKO,MAAK,MACxDjF,KAAKmE,qBAAqBY,MAAMG,SAAW,GAAAvE,OAAG+D,EAAKO,MAAK,MACxDjF,KAAKmE,qBAAqBY,MAAME,MAAQ,GAAAtE,OAAG+D,EAAKO,MAAK,QAIlDR,EAAA3D,UAAA8C,SAAP,SAAgB9D,G,IAINqF,EAHRnF,KAAK6E,gBAAgBhD,UAAUK,IAAIzB,EAAsBsB,kBACR,SAA/BjC,EAAQsF,QAAiB,UAEnCD,EAASxF,EAAEK,KAAK6E,iBAAiBM,WAEnCxF,EAAE,cAAc0F,QAAQ,CACpBC,UAAWH,EAAOI,IAAM,KACzB,KAIM,QAAftE,EAAAjB,KAAKkB,kBAAU,IAAAD,GAAAA,EAAEE,QAAQ,SAAAC,GACvBA,EAAES,UAAUO,OAAOqC,EAAqBG,kBAE3B,QAAfrD,EAAAvB,KAAKwB,kBAAU,IAAAD,GAAAA,EAAEJ,QAAQ,SAAAC,GACvBA,EAAES,UAAUK,IAAIuC,EAAqBG,mBA3D1BH,EAAAG,eAAyB,cA+D1CH,GA7DE,SAAAA,EACUI,EACA3D,EACAM,EACAyC,EACAE,EACAC,GALApE,KAAA6E,gBAAAA,EACA7E,KAAAkB,WAAAA,EACAlB,KAAAwB,WAAAA,EACAxB,KAAAiE,qBAAAA,EACAjE,KAAAmE,qBAAAA,EACAnE,KAAAoE,cAAAA,EAERpE,KAAKP,QAvIX,CAAUJ,GAAAA,IAAE,ICAZ,SAAUA,GAKR,IAAAmG,GAEOA,EAAA/F,KAAP,SAAYC,GACRC,EAAE,IAAAgB,OAAK6E,EAA6BC,sBAAyB/F,GAAOE,KAAK,SAACiB,EAAOf,GAC/E,IAAI0F,EAA6B1F,MAKhC0F,EAAAE,uBAAP,SAA8BC,GAC5B,IAAIC,EAAWD,MAAAA,OAAU,EAAVA,EAAY7B,iBAAiB,IAAAnD,OAAI6E,EAA6BK,uCAC7E,GAAGD,EASD,OARAA,EAASzE,QAAS,SAAA2E,GAChB,IAAIC,EAAKpG,EAAEmG,GAAI7F,KAAK,QACjB8F,GAAMA,EAAGC,WAAW,OACL,GAAbD,EAAGE,QAA+B,GAAhBtG,EAAEoG,GAAIE,QACzBtG,EAAEmG,GAAI1D,YAILuD,MAAAA,OAAU,EAAVA,EAAY7B,iBAAiB,IAAAnD,OAAI6E,EAA6BK,wCAqE/DL,EAAA1E,UAAArB,KAAR,WACEO,KAAKe,mBACL1B,EAAA6G,qBAAqBC,eAAeC,wBAAwBpG,KAAKqG,mBAG3Db,EAAA1E,UAAAC,iBAAR,WAAA,I,EAAAC,EAAAhB,KACkB,QAAhBiB,EAAAjB,KAAKsG,mBAAW,IAAArF,GAAAA,EAAEI,iBAAiB,QAASrB,KAAKuG,mBACrC,QAAZhF,EAAAvB,KAAKwG,eAAO,IAAAjF,GAAAA,EAAEF,iBAAiB,QAASrB,KAAKyG,eACzB,QAApBtE,EAAAnC,KAAK0G,uBAAe,IAAAvE,GAAAA,EAAEhB,QAAQ,SAACwF,GAC7BA,EAAKtF,iBAAiB,QAASL,EAAK4F,iBAEnB,QAAnBvC,EAAArE,KAAK6G,sBAAc,IAAAxC,GAAAA,EAAEhD,iBAAiB,QAASrB,KAAK8G,yBACpD9G,KAAK+G,KAAK1F,iBAAiB,QAASrB,KAAKgH,cA7E/BxB,EAAAC,qBAA+B,yBAC/BD,EAAAyB,gCAA0C,qCAC1CzB,EAAAK,qCAA+C,cAE/CL,EAAA0B,kCAA4C,mCAC5C1B,EAAA2B,8BAAwC,mCAExC3B,EAAA4B,2BAAqC,wBACrC5B,EAAA6B,kCAA4C,uCAgH1D7B,GAhGE,SAAAA,EACmBjC,GADnB,IAAAvC,EAAAhB,KACmBA,KAAAuD,KAAAA,EAHXvD,KAAA+G,KAAoBO,SAASC,iBA0D7BvH,KAAA4G,cAAgB,SAACpD,GACvBA,EAAEC,iBACFzC,EAAK0C,GAAG8D,eAAehE,EAAEK,gBAGnB7D,KAAAuG,kBAAoB,SAAC/C,GAC3BA,EAAEC,iBACFzC,EAAK0C,GAAG+D,YAGFzH,KAAAyG,cAAgB,SAACjD,GACrBA,EAAEC,iBACFzC,EAAK0C,GAAGgE,QAGJ1H,KAAA8G,wBAA0B,SAACtD,GACjCA,EAAEC,iBACFzC,EAAK0C,GAAGiE,yBAGF3H,KAAAgH,YAAc,SAACxD,G,MAClBA,EAAEoE,kBAAkBC,aAC0F,GAA5GlI,EAAE6D,EAAEoE,QAAuBE,cAAc,IAAAnH,OAAI6E,EAA6BC,uBAAwBQ,QAC5F,QAAPhF,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAE8G,uBAKP/H,KAAAqG,iBAA4E,SAAC2B,EAAsBC,KAjFzGjI,KAAK4B,GAAK5B,KAAKuD,KACfvD,KAAK2F,WAAoB,QAAP1E,EAAAjB,KAAK4B,UAAE,IAAAX,OAAA,EAAAA,EAAEiD,cAAc,IAAAvD,OAAI6E,EAA6ByB,kCAC1EjH,KAAK0G,gBAAkBlB,EAA6BE,uBAAuB1F,KAAK2F,YAChF3F,KAAKsG,YAAqB,QAAP/E,EAAAvB,KAAK4B,UAAE,IAAAL,OAAA,EAAAA,EAAE2C,cAAc,IAAAvD,OAAI6E,EAA6B0B,oCAC3ElH,KAAKwG,QAAiB,QAAPrE,EAAAnC,KAAK4B,UAAE,IAAAO,OAAA,EAAAA,EAAE+B,cAAc,IAAAvD,OAAI6E,EAA6B2B,gCAEvEnH,KAAK6G,eAAwB,QAAPxC,EAAArE,KAAK4B,UAAE,IAAAyC,OAAA,EAAAA,EAAEH,cAAc,IAAAvD,OAAI6E,EAA6B4B,6BAC9EpH,KAAKkI,uBAA4C,QAAnB3D,EAAAvE,KAAK6G,sBAAc,IAAAtC,OAAA,EAAAA,EAAEL,cAAc,IAAAvD,OAAI6E,EAA6ByB,kCAClGjH,KAAKmI,kBAA2B,QAAP3D,EAAAxE,KAAK4B,UAAE,IAAA4C,OAAA,EAAAA,EAAEN,cAAc,IAAAvD,OAAI6E,EAA6B6B,oCAE5ErH,KAAK2F,aAKV3F,KAAK0D,GAAK,IAAI0E,EACZpI,KAAK4B,GACL5B,KAAK2F,WACL3F,KAAK0G,gBACL1G,KAAKsG,YACLtG,KAAKwG,QACLxG,KAAK6G,eACL7G,KAAKkI,uBACLlI,KAAKmI,mBAGFnI,KAAK0D,GAAG2E,YAMJ,QAAPC,EAAAtI,KAAK4B,UAAE,IAAA0G,GAAAA,EAAEzG,UAAUK,IAAI,gBAChB,QAAPqG,EAAAvI,KAAK4B,UAAE,IAAA2G,GAAAA,EAAE1G,UAAUO,OAAO,4BAC1B/C,EAAGmJ,OAAO/I,KAAKE,EAAE2H,SAASmB,QAP1BzI,KAAKP,QA9EEJ,EAAAmG,6BAA4BA,EA0JzC,IAAA4C,GAiCSA,EAAAtH,UAAA2G,SAAP,WACI,IAAKzH,KAAK0I,aACN,OAAO1I,KAAKwH,eAAexH,KAAK2I,aAAa,GAAGC,MAEpD,IAAMC,EAAsBC,KAAKC,IAAI,EAAG/I,KAAK0I,aAAaM,IAAM,GAC1DC,EAA8BjJ,KAAK2I,aAAaE,GACtD7I,KAAKwH,eAAeyB,EAAaL,OAG9BR,EAAAtH,UAAA4G,KAAP,WACI,IAAK1H,KAAK0I,aACN,OAAO1I,KAAKwH,eAAexH,KAAK2I,aAAa,GAAGC,MAEpD,IAAMC,EAAsBC,KAAKI,IAAIlJ,KAAKmJ,eAAelD,OAAS,EAAGjG,KAAK0I,aAAaM,IAAM,GACvFI,EAA0BpJ,KAAK2I,aAAaE,GAClD7I,KAAKwH,eAAe4B,EAASR,OAG1BR,EAAAtH,UAAA0G,eAAP,SAAsBb,EAA+B0C,G,aAAA,IAAAA,IAAAA,GAAA,GAC7CrJ,KAAK0I,eACP1I,KAAK0I,aAAaE,KAAK/G,UAAUO,OAAOgG,EAA4BkB,kBACpEtJ,KAAK0I,aAAaE,KAAKW,OACnBvJ,KAAKwJ,OACPxJ,KAAK0I,aAAad,OAAO/F,UAAUO,OAAOgG,EAA4BkB,mBAG5EtJ,KAAK0I,aAAe1I,KAAKyJ,YAAY9C,GACpB,QAAjB1F,EAAAjB,KAAK0I,oBAAY,IAAAzH,GAAAA,EAAE2H,KAAK/G,UAAUK,IAAIkG,EAA4BkB,kBAC9DtJ,KAAKwJ,OACU,QAAjBjI,EAAAvB,KAAK0I,oBAAY,IAAAnH,GAAAA,EAAEqG,OAAO/F,UAAUK,IAAIkG,EAA4BkB,kBAElEtJ,KAAKmI,oBACPnI,KAAKmI,kBAAkBuB,WAA6B,QAAjBvH,EAAAnC,KAAK0I,oBAAY,IAAAvG,OAAA,EAAAA,EAAEyG,KAAKc,UAAUC,SAAU3J,KAAKmI,kBAAkB/C,QAAe,OAAK,IAE5HpF,KAAK4J,iBACL5J,KAAK6J,oBAAoB7J,KAAK0I,cAC1BW,IAAwBrJ,KAAKwJ,OAC7BxJ,KAAK8J,gBAAgB9J,KAAK0I,cAE9B1I,KAAK+J,sBACA/J,KAAK0I,cAAgB/B,GACtB3G,KAAKgK,sBAIH5B,EAAAtH,UAAA8I,eAAR,W,IAMUK,EALRjK,KAAKwJ,OAA6B,QAArBvI,EAAAjB,KAAKkK,wBAAgB,IAAAjJ,OAAA,EAAAA,EAAEY,UAAUC,SAASsG,EAA4B+B,mBAAmB,EACtGnK,KAAKoK,iBAAmBpK,KAAKqK,SAASpI,aACtCjC,KAAKsK,kBAEFtK,KAAK0I,eACAuB,EAAYjK,KAAK0I,aAAaE,KAAK2B,aAAa,SAAW,GACjEC,QAAQC,aAAaD,QAAQE,MAAO,GAAInL,OAAOoL,SAASC,SAAWrL,OAAOoL,SAASE,OAASZ,KAIxF7B,EAAAtH,UAAArB,KAAR,WAKI,GAJAO,KAAKwJ,OAA6B,QAArBvI,EAAAjB,KAAKkK,wBAAgB,IAAAjJ,OAAA,EAAAA,EAAEY,UAAUC,SAASsG,EAA4B+B,mBAAmB,EACtGnK,KAAKoK,iBAAmBpK,KAAKqK,SAASpI,aACtCjC,KAAKsK,kBAEDtK,KAAKmJ,eAAelD,OAASmC,EAA4B0C,wBAI3D,OAHA9K,KAAKqI,YAAa,EAClBrI,KAAKqK,SAASxI,UAAUK,IAAIkG,EAA4BxD,qBACxD5E,KAAKmJ,eAAiB,IAGnBnJ,KAAKwJ,QACRnK,EAAG0L,YAAYC,cAAcC,uBAAuBjL,KAAKkL,oBACzD7L,EAAG8L,WAAWF,uBAAuB5L,EAAG+L,SAASpL,KAAKgK,mBAAoB,MAE5EzK,OAAO8B,iBAAiB,SAAUhC,EAAG+L,SAASpL,KAAKqL,WAAY,KAC/D,IAAMC,EAAoD,QAAb/J,EAAAvB,KAAKqK,gBAAQ,IAAA9I,OAAA,EAAAA,EAAE2C,cAAc,IAAAvD,OAAIyH,EAA4BkB,mBACtGgC,GACAtL,KAAKwH,eAAe8D,GAExBtL,KAAK+J,qBACL/J,KAAKqK,SAAShJ,iBAAiB,SAAUhC,EAAG+L,SAASpL,KAAKuL,yBAA0B,IAAK,CAACC,SAAS,KA6B/FpD,EAAAtH,UAAA+I,oBAAR,SAA4BlD,GACxB,IAMM8E,EACFC,EACAC,EARChF,IAGCiF,EAAgC,EAAXjF,EAAKqC,IAAUhJ,KAAKoK,iBAAmB,EAC5DyB,EAAsBlF,EAAKqC,IAAMhJ,KAAKmJ,eAAelD,OAAQ,EAAIjG,KAAKoK,iBAAmB,EAEzFqB,EAAsBzL,KAAKqK,SAASyB,WACtCJ,EAAuB/E,EAAKiC,KAAKmD,WAAaH,EAAaH,EAC3DE,EAAwBhF,EAAKiC,KAAKmD,WAAapF,EAAKiC,KAAKoD,YAAchM,KAAKqK,SAAS2B,YAAcH,EAAcJ,EAEjHC,EAAe,IACf1L,KAAKiM,oBAAsBR,EAAc3C,KAAKI,IAAI,EAAGwC,IAErC,EAAhBC,IACA3L,KAAKiM,oBAAsBR,EAAc3C,KAAKC,IAAI,EAAG4C,IAGrD3L,KAAKqK,SAASyB,aAAe9L,KAAKiM,qBAClCtM,EAAEK,KAAKqK,UAAUhF,QAAQ,CACrByG,WAAY9L,KAAKiM,qBAErB7D,EAA4B8D,oBAC5B9D,EAA4B+D,4BAK5B/D,EAAAtH,UAAAgJ,gBAAR,SAAwBnD,G,IACd/E,EAAqB0F,SAASC,iBAC9B6E,EAAuC,IAArB7M,OAAO8M,YACzBC,GAA2B,QAAbrL,EAAAW,MAAAA,OAAE,EAAFA,EAAI0D,iBAAS,IAAArE,EAAAA,EAAE,IAA0B,QAApBM,EAAAoF,MAAAA,OAAI,EAAJA,EAAM4F,sBAAc,IAAAhL,EAAAA,EAAE,GAC3DiL,EAA+B,QAApBrK,EAAAwE,MAAAA,OAAI,EAAJA,EAAM4F,sBAAc,IAAApK,EAAAA,EAAE,EACpBiK,EAAbE,IACAE,GAA0C,QAA9BnI,EAAA1E,EAAE,oBAAoB8M,gBAAQ,IAAApI,EAAAA,EAAE,GAE3CzC,GAGLjC,EAAEiC,GAAIyD,QAAQ,CACVC,UAAWkH,GAEfpE,EAA4B8D,oBAC5B9D,EAA4BsE,0BAGxBtE,EAAAtH,UAAA2I,YAAR,SAAoB7H,GAChB,OAAO5B,KAAKmJ,eAAerG,KAAK,SAAA6J,GAAM,OAAAA,EAAG/D,OAAShH,KAG9CwG,EAAAtH,UAAA6H,aAAR,SAAqBK,GACjB,GAAIA,EAAM,GAAKA,EAAMhJ,KAAKmJ,eAAelD,OAAQ,EAAG,CAClD,GAAgC,EAA7BjG,KAAKmJ,eAAelD,OACrB,OAAOjG,KAAKmJ,eAAe,GAE7B,MAAM,IAAIyD,MAAM,gDAElB,OAAO5M,KAAKmJ,eAAeH,IAGvBZ,EAAAtH,UAAA+L,gBAAR,SAAwB1H,G,IAChB2H,EAA6C,QAA9B7L,EAAAtB,EAAE,oBAAoB8M,gBAAQ,IAAAxL,EAAAA,EAAE,EAE/C0F,EAAO3G,KAAKmJ,eAAepF,OAAO,SAAAgJ,GACpC,OAAOA,EAAER,eAAiBO,GAAgB3H,GACnC4H,EAAEC,aAAe7H,IAG5B,OAAOwB,EAAKA,EAAKV,OAAS,IA0DrBmC,EAAAtH,UAAA6G,sBAAP,W,MACM3H,KAAK6G,gBAAkBxH,EAAG0L,YAAYC,cAAciC,WAClDjN,KAAK6G,eAAehF,UAAUC,SAASsG,EAA4B8E,mBACrElN,KAAK6G,eAAehF,UAAUO,OAAOgG,EAA4B8E,kBACtC,QAA3BjM,EAAAjB,KAAKkI,8BAAsB,IAAAjH,GAAAA,EAAEY,UAAUK,IAAIkG,EAA4BxD,kBAEvE5E,KAAK6G,eAAehF,UAAUK,IAAIkG,EAA4B8E,kBACnC,QAA3B3L,EAAAvB,KAAKkI,8BAAsB,IAAA3G,GAAAA,EAAEM,UAAUO,OAAOgG,EAA4BxD,mBAKzEwD,EAAAtH,UAAAiH,oBAAP,W,MACM/H,KAAK6G,iBACP7G,KAAK6G,eAAehF,UAAUO,OAAOgG,EAA4B8E,kBACtC,QAA3BjM,EAAAjB,KAAKkI,8BAAsB,IAAAjH,GAAAA,EAAEY,UAAUK,IAAIkG,EAA4BxD,kBArR5DwD,EAAA+B,eAAyB,8BACzB/B,EAAA8E,iBAA2B,YAC3B9E,EAAAkB,iBAA2B,YAC3BlB,EAAA+E,mBAA6B,cAC7B/E,EAAAxD,eAAyB,cACzBwD,EAAA+D,yBAAmC,SACnC/D,EAAAsE,wBAAkC,QAClCtE,EAAA8D,oBAA8B,IAC9B9D,EAAA0C,wBAAkC,EAgRnD1C,GAzQE,SAAAA,EACY8B,EACAG,EACA+C,EACAC,EACAC,EACAzG,EACAqB,EACAC,GARZ,IAAAnH,EAAAhB,KACYA,KAAAkK,iBAAAA,EACAlK,KAAAqK,SAAAA,EACArK,KAAAoN,MAAAA,EACApN,KAAAqN,eAAAA,EACArN,KAAAsN,WAAAA,EACAtN,KAAA6G,eAAAA,EACA7G,KAAAkI,uBAAAA,EACAlI,KAAAmI,kBAAAA,EAzBLnI,KAAAqI,YAAsB,EAYrBrI,KAAAmJ,eAAkC,GAClCnJ,KAAAiM,oBAA8B,EAC9BjM,KAAAoK,iBAA2B,EAC3BpK,KAAAwJ,OAAQ,EA0GRxJ,KAAAuL,yBAA2B,WAC/BvK,EAAKiL,oBAAsBjL,EAAKqJ,SAASyB,WACzC9K,EAAK+I,sBAGD/J,KAAAgK,mBAAqB,WACzB,IAEQuD,EAFJvM,EAAKwI,QACDgE,EAAoBnO,EAAG8L,WAAWsC,oBAClCF,EAA0CvM,EAAK6L,gBAAgBW,GACrExM,EAAKwG,eAAe+F,MAAAA,OAAY,EAAZA,EAAc3E,MAAM,KAItC5I,KAAAkL,mBAA4E,SAACwC,EAAyBC,GAC1G3M,EAAKgJ,sBA0EDhK,KAAAqL,WAAa,WACjBrK,EAAK+I,qBACL/I,EAAKsJ,mBAGDtK,KAAAsK,gBAAkB,W,MACtBtJ,EAAKmI,eAAiB,GACtB,IAAIH,EAAc,EACR,QAAV/H,EAAAD,EAAKoM,aAAK,IAAAnM,GAAAA,EAAEE,QAAQ,SAACyM,GACjB,IAAM3D,EAA2B2D,EAAMrD,aAAa,SAAW,GACzD3C,EAA6BN,SAASuG,eAAe5D,EAAU6D,QAAQ,IAAK,KAC5EzF,EAAsBuF,EAAM/L,UAAUC,SAASsG,EAA4B+E,oBAC5EvF,GACHgG,EAAM/L,UAAUK,IAAIkG,EAA4BxD,gBAE7CgD,IAAUS,IAGT0F,EAAiB1O,EAAG2O,gBAAgBpG,GAAU5G,EAAKoJ,iBAAmB,EAC5EpJ,EAAKmI,eAAe8E,KAAK,CACrBjF,IAAKA,IACLJ,KAAMgF,EACNhG,OAAQA,EACR2E,eAAgBwB,EAChBf,aAAce,EAASnG,EAAO9C,wBAAwB2H,aAK1DzM,KAAA+J,mBAAqB,W,QACrBmE,EAAoB9F,EAA4BxD,eAGtD,GAAI5D,EAAKqJ,SAAS8D,cAAgBnN,EAAKqJ,SAAS2B,YAG5C,OAFmB,QAAnB/K,EAAAD,EAAKqM,sBAAc,IAAApM,GAAAA,EAAEY,UAAUK,IAAIgM,QACpB,QAAf3M,EAAAP,EAAKsM,kBAAU,IAAA/L,GAAAA,EAAEM,UAAUK,IAAIgM,IAKJ,EAA3BlN,EAAKiL,oBACc,QAAnB9J,EAAAnB,EAAKqM,sBAAc,IAAAlL,GAAAA,EAAEN,UAAUO,OAAO8L,GAEnB,QAAnB7J,EAAArD,EAAKqM,sBAAc,IAAAhJ,GAAAA,EAAExC,UAAUK,IAAIgM,GAIvC,IAAME,EAAwBpN,EAAKqJ,SAAS8D,YAAcnN,EAAKqJ,SAAS2B,YAAc,EAClFhL,EAAKiL,oBAAsBmC,EACZ,QAAf7J,EAAAvD,EAAKsM,kBAAU,IAAA/I,GAAAA,EAAE1C,UAAUO,OAAO8L,GAEnB,QAAf1J,EAAAxD,EAAKsM,kBAAU,IAAA9I,GAAAA,EAAE3C,UAAUK,IAAIgM,IAzOjCG,WAAW,WACTrN,EAAKvB,QACJ,MA7LX,CAAUJ,GAAAA,IAAE,ICAZ,SAAUA,GAER,IAAAiP,GAMSA,EAAA7O,KAAP,SAAYC,GACVC,EAAE,IAAAgB,OAAI2N,EAAqBC,oBAAsB7O,GAAOE,KAAK,SAACiB,EAAOf,GACnE,IAAIwO,EAAqBxO,MA2BrBwO,EAAAxN,UAAArB,KAAR,WACEO,KAAKe,oBAGCuN,EAAAxN,UAAAC,iBAAR,W,MACEf,KAAK+G,KAAK1F,iBAAiB,QAASrB,KAAKgH,aACzB,QAAhB/F,EAAAjB,KAAKwO,mBAAW,IAAAvN,GAAAA,EAAEI,iBAAiB,QAASrB,KAAKyO,qBAxCrCH,EAAAC,mBAA6B,kBAC7BD,EAAAI,gCAA0C,gCAC1CJ,EAAAK,2BAAqC,2BACrCL,EAAAM,qBAA+B,gCAmD/CN,GApCE,SAAAA,EAA6B1M,GAA7B,IAAAZ,EAAAhB,KAA6BA,KAAA4B,GAAAA,EAHrB5B,KAAA0D,GAA6C,KAC7C1D,KAAA+G,KAAoBO,SAASC,iBA2B7BvH,KAAAyO,mBAAqB,SAACjL,GAC5BA,EAAEC,iBACFD,EAAEqL,kBACK,QAAP5N,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAE6N,iBAGH9O,KAAAgH,YAAc,SAACxD,G,QACX,QAAPvC,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAE8N,UACH,QAAPxN,EAAAP,EAAK0C,UAAE,IAAAnC,GAAAA,EAAEyN,gBAhCXhP,KAAKiP,QAAiB,QAAPhO,EAAAjB,KAAK4B,UAAE,IAAAX,OAAA,EAAAA,EAAEiD,cAAc,IAAAvD,OAAI2N,EAAqBK,6BAC/D3O,KAAKwO,YAAqB,QAAPjN,EAAAvB,KAAK4B,UAAE,IAAAL,OAAA,EAAAA,EAAE2C,cAAc,IAAAvD,OAAI2N,EAAqBI,kCACnE1O,KAAKkP,eAAwB,QAAP/M,EAAAnC,KAAK4B,UAAE,IAAAO,OAAA,EAAAA,EAAE+B,cAAc,IAAAvD,OAAI2N,EAAqBM,wBAEjE5O,KAAKiP,SAAYjP,KAAKkP,kBAG3BlP,KAAK0D,GAAK,IAAIyL,EACZnP,KAAK4B,GACL5B,KAAKiP,QACLjP,KAAKkP,gBAEPlP,KAAKP,QAhCIJ,EAAAiP,qBAAoBA,EAyDjC,IAAAa,GAYUA,EAAArO,UAAArB,KAAR,WACEJ,EAAG0L,YAAYC,cAAcC,uBAAuBjL,KAAKkL,qBAGpDiE,EAAArO,UAAAiO,OAAP,W,MACE,QAAoB,QAAZ9N,EAAAjB,KAAKiP,eAAO,IAAAhO,GAAAA,EAAEY,UAAUC,SAASqN,EAAoBC,oBAGxDD,EAAArO,UAAAgO,cAAP,WACM9O,KAAKiP,UACHjP,KAAKiP,QAAQpN,UAAUC,SAASqN,EAAoBC,kBACtDpP,KAAKiP,QAAQpN,UAAUO,OAAO+M,EAAoBC,kBAElDpP,KAAKiP,QAAQpN,UAAUK,IAAIiN,EAAoBC,oBAK9CD,EAAArO,UAAAkO,aAAP,W,MACc,QAAZ/N,EAAAjB,KAAKiP,eAAO,IAAAhO,GAAAA,EAAEY,UAAUK,IAAIiN,EAAoBC,mBA9BnCD,EAAAC,iBAA2B,eAC3BD,EAAAE,kBAA4B,eAiD7CF,GA/CE,SAAAA,EACUG,EACAL,EACAC,QAAA,IAAAA,IAAAA,EAAA,MAHV,IAAAlO,EAAAhB,KACUA,KAAAsP,QAAAA,EACAtP,KAAAiP,QAAAA,EACAjP,KAAAkP,eAAAA,EA2BFlP,KAAAkL,mBAA4E,SAACwC,EAAyBC,GAC5G,IACQ4B,GADJvO,EAAKkO,iBACDK,EAAavO,EAAKkO,eAAeM,qBAEjCD,EAAWE,YAAcF,EAAWpB,YAClCoB,IAAeA,EAAW1N,UAAUC,SAASqN,EAAoBE,oBACnEE,EAAW1N,UAAUK,IAAIiN,EAAoBE,mBAG3CE,GAAcA,EAAW1N,UAAUC,SAASqN,EAAoBE,oBAClEE,EAAW1N,UAAUO,OAAO+M,EAAoBE,qBAnCxDrP,KAAKP,QApEX,CAAUJ,GAAAA,IAAE,ICAZ,SAAUA,GAIN,IAAAqQ,GAEWA,EAAAjQ,KAAP,SAAYC,GACRA,EAAMgB,WAAW,IAAAC,OAAI+O,EAA0BC,oCAAqC/P,KAAK,SAACiB,EAAef,GACvG,IAAI4P,EAA0B5P,MAsB5B4P,EAAA5O,UAAArB,KAAR,WACIO,KAAK0D,GAAGkM,mBAnBEF,EAAAC,kCAA4C,+BAC5CD,EAAAG,yBAAmC,sBACnCH,EAAAI,8BAAwC,mCAoB1DJ,GAbI,SAAAA,EACqBnM,GAAAvD,KAAAuD,KAAAA,EAEjBvD,KAAK+P,SAAoB,QAAT9O,EAAAjB,KAAKuD,YAAI,IAAAtC,OAAA,EAAAA,EAAE6C,iBAAiB,IAAAnD,OAAI+O,EAA0BI,gCAC1E9P,KAAK0D,GAAK,IAAIsM,EAAyBhQ,KAAK+P,UAE5C/P,KAAKP,OAvBAJ,EAAAqQ,0BAAyBA,EAiCtC,IAAAM,GAUYA,EAAAlP,UAAArB,KAAR,WACIJ,EAAG0L,YAAYC,cAAciF,uBAAuBjQ,KAAK4P,kBAGtDI,EAAAlP,UAAA8O,gBAAP,W,MACQM,EAAY,EACH,QAAbjP,EAAAjB,KAAK+P,gBAAQ,IAAA9O,GAAAA,EAAEE,QAAQ,SAAAS,GAChBA,EAAGuO,aAAeD,IACjBA,EAAYtO,EAAGuO,gBAGV,QAAb5O,EAAAvB,KAAK+P,gBAAQ,IAAAxO,GAAAA,EAAEJ,QAAQ,SAAAS,GACnBA,EAAGmD,MAAM0H,OAAS,GAAA9L,OAAGuP,EAAS,SApBvBF,EAAApL,eAAyB,cAwB5CoL,GAtBI,SAAAA,EAAoBD,GAAA/P,KAAA+P,SAAAA,EAEhB/P,KAAKP,QA3CjB,CAAUJ,GAAAA,IAAE,ICAZ,SAAUA,GAmCR,IAAA+Q,GAISA,EAAAC,OAAP,SAAc3Q,EAA4B4Q,GACxC3Q,EAAE,IAAAgB,OAAIyP,EAAmBG,iBAAmB7Q,GAAOE,KAAK,SAACC,EAAgBC,GACvE,IAAIsQ,EAAmBtQ,MAmG3B0Q,OAAAC,eAAWL,EAAAtP,UAAA,UAAO,C,IAAlB,WACE,OAAOd,KAAK4B,I,gCAId4O,OAAAC,eAAWL,EAAAtP,UAAA,cAAW,C,IAAtB,WACE,OAAOd,KAAK0Q,M,gCAIdF,OAAAC,eAAWL,EAAAtP,UAAA,eAAY,C,IAAvB,W,MACE,OAAoB,QAAbG,EAAAjB,KAAK2Q,gBAAQ,IAAA1P,OAAA,EAAAA,EAAE2P,c,gCAIxBJ,OAAAC,eAAWL,EAAAtP,UAAA,aAAU,C,IAArB,W,MACE,OAA0B,QAAnBS,EAAa,QAAbN,EAAAjB,KAAK2Q,gBAAQ,IAAA1P,OAAA,EAAAA,EAAE4P,YAAI,IAAAtP,EAAAA,EAAI,I,gCAIzB6O,EAAAtP,UAAAgQ,cAAP,SAAqBtN,EAAYuN,GAC/B/Q,KAAKgR,QAAQC,KAAKzN,EADauN,OAAA,IAAAA,GAAA,EACVA,IAQhBX,EAAAtP,UAAAoQ,OAAP,WACE,IAAMC,EAAOnR,KAAK4B,GAAGsC,cAA2B,IAAAvD,OAAIyP,EAAmBgB,6BACjEC,EAAcrR,KAAK4B,GAAGsC,cAA2B,IAAAvD,OAAIyP,EAAmBkB,gCACxEC,EAAYJ,MAAAA,OAAI,EAAJA,EAAMjN,cAA2B,IAAAvD,OAAIyP,EAAmBoB,mCAC1E,OAAKL,GAASE,GAAgBE,GAI9BvR,KAAKyR,OAAS,IAAIpS,EAAAqS,eAAe1R,KAAK4B,GAAI2P,GAC1CvR,KAAK2R,OAAS,IAAItS,EAAAuS,eAAe5R,KAAK4B,GAAIyP,GAC1CrR,KAAK6R,OAAS,IAAIxS,EAAAyS,eAAe9R,KAAK4B,GAAIuP,EAAMI,EAAWvR,KAAKyR,QAChEzR,KAAK+R,UAAY,IAAI1S,EAAA2S,kBAAkBhS,KAAMA,KAAK4B,GAAI5B,KAAKyR,QAC3DzR,KAAKiS,KAAO,IAAI5S,EAAA6S,aAAalS,KAAMA,KAAK4B,IACxC5B,KAAK4B,GAAGkC,iBAAiB,IAAAnD,OAAIyP,EAAmB+B,2BAC7ChR,QAAQ,SAAAiR,GAAQ,OAAAA,EAAK/Q,iBAAiB,YAAa+O,EAAmBiC,iBAClE,IAVL9R,QAAQ+R,IAAI,gDAAiD,CAAC1Q,GAAI5B,KAAK4B,GAAIuP,KAAMA,EAAME,YAAaA,EAAaE,UAAWA,KACrH,IA1IGnB,EAAAG,gBAA0B,oBAS1BH,EAAAmC,eAAyB,sBACzBnC,EAAAoC,qBAA+B,oBAC/BpC,EAAAkB,8BAAwC,kCAGxClB,EAAAqC,yBAAmC,sBACnCrC,EAAAsC,iBAA2B,sBAC3BtC,EAAAuC,+BAAyC,mCACzCvC,EAAAwC,qCAA+C,oCAG/CxC,EAAAyC,gCAA0C,sCAC1CzC,EAAA0C,wCAAkD,8CAClD1C,EAAA2C,yCAAmD,+CACnD3C,EAAA4C,wCAAkD,8CAClD5C,EAAA6C,qBAA+B,iBAC/B7C,EAAA8C,+BAAyC,mCAGzC9C,EAAAgB,2BAAqC,iCACrChB,EAAAoB,iCAA2C,kCAC3CpB,EAAA+C,8BAAwC,yBACxC/C,EAAAgD,+BAAyC,0BACzChD,EAAAiD,kCAA4C,yBAC5CjD,EAAAkD,6BAAuC,wCACvClD,EAAAmD,+BAAyC,qCACzCnD,EAAAoD,8BAAwC,qCAGxCpD,EAAAqD,0BAAoC,sCACpCrD,EAAAsD,mCAA6C,8CAC7CtD,EAAAuD,gCAA0C,2CAC1CvD,EAAAwD,qCAA+C,gDAC/CxD,EAAAyD,2CAAqD,WACrDzD,EAAA0D,qCAA+C,gDAC/C1D,EAAA2D,+BAAyC,oCACzC3D,EAAA4D,6BAAuC,uCAGvC5D,EAAA6D,sBAAgC,4BAChC7D,EAAA8D,4BAAsC,kCACtC9D,EAAA+D,+BAAyC,6BAGzC/D,EAAAgE,eAAyB,YACzBhE,EAAAiE,mBAA6B,sCAC7BjE,EAAAkE,kBAA4B,mBAC5BlE,EAAAmE,qBAA+B,uBAC/BnE,EAAAoE,mBAA6B,qBAC7BpE,EAAAhB,iBAA2B,cAC3BgB,EAAAqE,oBAA8B,iBAC9BrE,EAAAsE,iBAA2B,aAC3BtE,EAAA9G,iBAA2B,YAC3B8G,EAAAuE,eAAyB,UACzBvE,EAAAwE,kBAA4B,aAG3BxE,EAAA+B,yBAAmC,sBAEnC/B,EAAAyE,oBAA8B,iBAsF9BzE,EAAAiC,aAAe,SAAC7O,GAC7BA,EAAEC,kBAmCN2M,GA1GE,SAAAA,EAAY7M,GAAZ,IAAAvC,EAAAhB,KAZiBA,KAAA8U,KAAoBxN,SAASC,iBAGtCvH,KAAA2Q,SAAoC,KAGpC3Q,KAAAyR,OAAgC,KAChCzR,KAAA2R,OAAgC,KAChC3R,KAAA6R,OAAgC,KAChC7R,KAAA+R,UAAsC,KACtC/R,KAAAiS,KAA4B,KA6E5BjS,KAAA+U,YAAc,SAACvR,G,MACfoE,EAASpE,EAAEoE,OACjB,GAAmF,EAA/EjI,EAAEiI,GAAQE,cAAc,IAAAnH,OAAIyP,EAAmByE,sBAAuB5O,OAGxE,OAFAzC,EAAEC,sBACFD,EAAEqL,kBAIwE,IAAxElP,EAAEiI,GAAQ5D,QAAQ,IAAArD,OAAIyP,EAAmBsC,mBAAoBzM,QACpD,QAAXhF,EAAAD,EAAKyQ,cAAM,IAAAxQ,GAAAA,EAAE+T,UAAUpN,IAInB5H,KAAAiV,gBAAkB,WACxBjU,EAAKkU,qBAGClV,KAAAmV,eAAiB,WACvBnU,EAAKoU,qBAKUpV,KAAAkV,kBAAoB7V,EAAG+L,SAAS,W,MACpC,QAAXnK,EAAAD,EAAKyQ,cAAM,IAAAxQ,GAAAA,EAAEoU,QACF,QAAX9T,EAAAP,EAAK2Q,cAAM,IAAApQ,GAAAA,EAAE+T,eACZ,KAEctV,KAAAoV,kBAAoB/V,EAAG+L,SAAS,W,MACpC,QAAXnK,EAAAD,EAAK2Q,cAAM,IAAA1Q,GAAAA,EAAEqU,eACZ,IAxGDtV,KAAK4B,GAAK2B,EACVvD,KAAK0Q,KAAO1Q,KAAK4B,GAAGsC,cAAc,QAClClE,KAAKgR,QAAU,IAAI3R,EAAAkW,gBAAgBvV,MAC9BA,KAAKkR,WAIVlR,KAAK2Q,SAAW,IAAItR,EAAAmW,iBAAiBxV,KAAMA,KAAK4B,IAChD5B,KAAK8U,KAAKzT,iBAAiB,QAASrB,KAAK+U,aACzCxV,OAAO8B,iBAAiB,SAAUrB,KAAKiV,iBACvC1V,OAAO8B,iBAAiB,SAAUrB,KAAKmV,iBAjG9B9V,EAAA+Q,mBAAkBA,EAnCjC,CAAU/Q,GAAAA,IAAE,ICAZ,SAAUA,GAeR,IAAAmW,GAiCEhF,OAAAC,eAAW+E,EAAA1U,UAAA,OAAI,C,IAAf,W,MACE,OAA4B,QAArBS,EAAc,QAAdN,EAAAjB,KAAKyV,iBAAS,IAAAxU,OAAA,EAAAA,EAAE2M,aAAK,IAAArM,EAAAA,EAAI,I,gCAIlCiP,OAAAC,eAAW+E,EAAA1U,UAAA,eAAY,C,IAAvB,WACE,OAAOd,KAAK0V,oB,gCAGNF,EAAA1U,UAAAC,iBAAR,WAAA,I,EAAAC,EAAAhB,KACMA,KAAKyV,YACPzV,KAAKyV,UAAUpU,iBAAiB,QAASrB,KAAK2V,SAC9C3V,KAAKyV,UAAUpU,iBAAiB,UAAWrB,KAAK4V,iBAC6B,QAA7E3U,EAAAjB,KAAK+G,KAAK7C,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmB8D,qCAA8B,IAAAjT,GAAAA,EACzEI,iBAAiB,QAASrB,KAAK6V,cAErC,IAAIC,GAAiB,EACrB9V,KAAK0V,mBAAmBvU,QAAQ,SAAA4U,GAC9BA,EAAM1U,iBAAiB,SAAUL,EAAKgV,gBACtCF,EAAiBA,KAAoBC,EAAMnI,QAIzCkI,GACF9V,KAAKiW,IAAInF,cAAc,IAAIoF,MAAM,WAAsB,IA4BnDV,EAAA1U,UAAAqV,aAAR,W,MACE,OAAoE,QAA7DlV,EAAAjB,KAAK+G,KAAK/C,QAAQ,IAAArD,OAAI6U,EAAiBY,mBAAkB,aAAI,IAAAnV,OAAA,EAAAA,EAChEsJ,aAAaiL,EAAiBY,sBAAuB,MAkBnDZ,EAAA1U,UAAAuV,UAAR,SAAkBzU,EAA6BiP,GAC7C,IAIMyF,EAJqB,IAAvBzF,EAAKlH,OAAO1D,SAIVqQ,EAAUtW,KAAKmW,kBACJvU,GAAMiP,EAAKlH,OAAO1D,OAASuP,EAAiBe,kBAGxDvW,KAAKwW,kBACRxW,KAAKwW,iBAAkB,EACvBnX,EAAGoX,SAASC,oBAAoB,CAACC,cAAiBL,GAAU3W,EAAEiC,GAAK,WAGrEvC,EAAGoX,SAASG,oBAAoB/F,IAZ9B7Q,KAAKwW,iBAAkB,GAxGHhB,EAAAe,gBAAkB,EAElBf,EAAAqB,YAAc,IAKdrB,EAAAY,mBAAqB,2BAwH/CZ,GA3GE,SAAAA,EACmBS,EACAlP,GAFnB,IAAA/F,EAAAhB,KACmBA,KAAAiW,IAAAA,EACAjW,KAAA+G,KAAAA,EARX/G,KAAAwW,iBAA2B,EAI3BxW,KAAA8W,kBAAmCC,EAwCnC/W,KAAAgW,eAAiB,SAACxS,GACxBxC,EAAKiV,IAAInF,cAActN,GAAc,IAI/BxD,KAAA2V,QAAU,SAACnS,G,MACbxC,EAAK8V,cACPE,aAAahW,EAAK8V,cAEpB,IAMMlV,EANAgM,EAA6C,QAArC3M,EAACuC,EAAEoE,cAAkC,IAAA3G,OAAA,EAAAA,EAAE2M,WACvCmJ,IAAVnJ,IAAmC,KAAVA,GAAgBA,EAAM3H,QAAUuP,EAAiBe,mBAKxE3U,EAAK4B,EAAEoE,OACb5G,EAAK8V,aAAevX,OAAO8O,WAAW,WACpCrN,EAAKiV,IAAInF,cAActN,GACvBxC,EAAKqV,UAAUzU,EAAIgM,GACnB5M,EAAK8V,kBAAeC,GACnBvB,EAAiBqB,eAUd7W,KAAA4V,gBAAkB,SAACpS,GACzB,IAAM8S,EAAUtV,EAAKmV,eACjBG,GAAW9S,EAAEK,eACfxE,EAAGoX,SAASC,oBAAoB,CAACC,cAAiBL,GAAU3W,EAAE6D,EAAEK,eAA+B,iBA4B3F7D,KAAA6V,YAAc,SAACrS,G,MACrBA,EAAEC,iBACFzC,EAAKwV,iBAAkB,EACE,QAArBjV,EAAc,QAAdN,EAAAD,EAAKyU,iBAAS,IAAAxU,OAAA,EAAAA,EAAE2M,aAAK,IAAArM,GAAAA,EAAE0E,SACzBjF,EAAKyU,UAAU7H,MAAQ,GACvB5M,EAAKiV,IAAInF,cAActN,KApGzBxD,KAAKyV,UAAYzV,KAAK+G,KAAK7C,cAAgC,IAAAvD,OAAItB,EAAA+Q,mBAAmB6D,sBAAqB,WACvGjU,KAAK0V,mBAAqB1V,KAAK+G,KAAKjD,iBAAmC,SAAAnD,OAAStB,EAAA+Q,mBAAmB+D,iCACnGnU,KAAKe,mBA7BI1B,EAAAmW,iBAAgBA,EAiKnBtD,EAAApR,UAAAC,iBAAR,SAAyBuO,GAAzB,I,EAAAtO,EAAAhB,KACW,QAATiB,EAAAjB,KAAKmR,YAAI,IAAAlQ,GAAAA,EAAE6C,iBAAiB,QAAQ3C,QAAQ,SAAA8V,GAAQ,OAAAA,EAAK5V,iBAAiB,QAAS6Q,EAAagF,eACvF,QAAT3V,EAAAvB,KAAKmR,YAAI,IAAA5P,GAAAA,EAAEF,iBAAiB,QAAS6Q,EAAagF,aACzC,QAAT/U,EAAAnC,KAAKmR,YAAI,IAAAhP,GAAAA,EAAEd,iBAAiB,YAAarB,KAAKmX,iBAC9C7H,MAAAA,GAAAA,EAASxL,iBAA8B,IAAAnD,OAAIuR,EAAakF,kBAAmBjW,QAAQ,SAAAkW,GAC3EC,EAAQD,EAAMnT,cAAgC,qBAGhDoT,IAAUA,EAAMC,SAClBD,EAAMjW,iBAAiB,SAAUL,EAAKwW,iBAxBpBtF,EAAAuF,gBADAvF,EAAAwF,kBAAoB,8BAC8B,QAClDxF,EAAAkF,gBAAkBlF,EAAawF,kBAAoB,SACnDxF,EAAAyF,kBAAoB,iBAgC7BzF,EAAAgF,YAAc,SAAC1T,GAC6D,EAArF7D,EAAE6D,EAAEoE,QAAuBE,cAAc,IAAAnH,OAAIuR,EAAauF,iBAAkBxR,SAC9EzC,EAAEC,iBACFD,EAAEqL,oBAxCRqD,EAuDAA,EA9CE,SAAAA,EACmB+D,EACjBlP,GAFF,IAAA/F,EAAAhB,KACmBA,KAAAiW,IAAAA,EAsBXjW,KAAAwX,aAAe,SAAChU,GACtBxC,EAAKiV,IAAInF,cAActN,IAgBjBxD,KAAAmX,gBAAkB,SAAC3T,G,MAC6B,QAAlDjC,EAAS,QAATN,EAAAD,EAAKmQ,YAAI,IAAAlQ,OAAA,EAAAA,EAAE+C,QAAQkO,EAAayF,0BAAkB,IAAApW,GAAAA,EAAEqW,QAAQ,mBAC9DpU,EAAEC,iBACqC,QAAvCtB,EAACmF,SAASuQ,qBAA6B,IAAA1V,GAAAA,EAAEoH,SAvCrC+F,EAAUvI,EAAK7C,cAA2B,IAAAvD,OAAIuR,EAAawF,oBACjE1X,KAAKmR,KAA6E,QAAtElQ,EAAAqO,MAAAA,OAAO,EAAPA,EAASpL,cAA2B,IAAAvD,OAAIuR,EAAauF,wBAAiB,IAAAxW,EAAAA,EAAI,KACtFjB,KAAKe,iBAAiBuO,GAfbjQ,EAAA6S,aAAYA,EA9J3B,CAAU7S,GAAAA,IAAE,ICAZ,SAAUA,GAiBR,IAAAyS,GAgBUA,EAAAhR,UAAAC,iBAAR,WAAA,IAAAC,EAAAhB,KACEA,KAAK+G,KAAKjD,iBAA8B,IAAAnD,OAAItB,EAAA+Q,mBAAmB+C,gCAAiChS,QAAQ,SAAA2W,GAEjGA,EAAIjW,UAAUC,SAASzC,EAAA+Q,mBAAmBiD,oCAC7CyE,EAAIzW,iBAAiB,QAASL,EAAK+W,eAGvC/X,KAAK+G,KAAKjD,iBAA8B,IAAAnD,OAAItB,EAAA+Q,mBAAmBgD,iCAC5DjS,QAAQ,SAAA2W,GAAO,OAAAA,EAAIzW,iBAAiB,QAASL,EAAKgX,gBACrDhY,KAAK+G,KAAKjD,iBAA8B,IAAAnD,OAAImR,EAAemG,mBACxD9W,QAAQ,SAAA2W,GAAO,OAAAA,EAAIzW,iBAAiB,QAASL,EAAKgX,gBAErDhY,KAAKuR,UAAUlQ,iBAAiB,SAAUrB,KAAKkY,mBAC/ClY,KAAKuR,UAAUzN,iBAAiB,IAAAnD,OAAItB,EAAA+Q,mBAAmBuC,iCACpDxR,QAAQ,SAAAgX,GAAY,OAAAA,EAAS9W,iBAAiB,QAASL,EAAKkX,sBAiB1DpG,EAAAhR,UAAAsX,KAAP,WAEEpY,KAAKyR,OAAO4D,QACZrV,KAAK+G,KAAKlF,UAAUK,IAAI7C,EAAA+Q,mBAAmBkD,8BAC3CjU,EAAG8L,WAAWkN,kBAAiB,EAAOvG,EAAewG,sBAGhDxG,EAAAhR,UAAAyX,MAAP,WACEvY,KAAK+G,KAAKlF,UAAUO,OAAO/C,EAAA+Q,mBAAmBkD,8BAC9CjU,EAAG8L,WAAWkN,kBAAiB,EAAMvG,EAAewG,qBACpDtY,KAAKyR,OAAO4D,SAaNvD,EAAAhR,UAAA0X,oBAAR,WAEE,IADA,IAAIC,EAAc,EACT1L,EAAI,EAAGA,EAAI/M,KAAKuR,UAAU1O,SAASoD,OAAQ8G,IAClD0L,GAAezY,KAAKuR,UAAU1O,SAASkK,GAAG9K,aAE5C,IAAMyW,EAAaD,EAAczY,KAAKuR,UAAUtP,aAC1C0W,EAAW3Y,KAAKuR,UAAUjM,UAAYtF,KAAKuR,UAAUtP,cAAgBjC,KAAKuR,UAAUvP,aAC1FhC,KAAK4Y,aAAavZ,EAAA+Q,mBAAmBoD,8BAA+BkF,IAAeC,GACnF3Y,KAAK4Y,aAAavZ,EAAA+Q,mBAAmBmD,+BAAgCmF,GAAyC,EAA3B1Y,KAAKuR,UAAUjM,YAG5FwM,EAAAhR,UAAA8X,aAAR,SAAqBC,EAAmBC,GACE,QAAxC7X,EAAAjB,KAAKmR,KAAKjN,cAAc,IAAAvD,OAAIkY,WAAY,IAAA5X,GAAAA,EAAEY,UAAUkX,OAAO1Z,EAAA+Q,mBAAmBsE,iBAAkBoE,IA/E1EhH,EAAAmG,iBAAmB,yBAEnBnG,EAAAwG,oBAAsB,eA+EhDxG,GA7EE,SAAAA,EACmB/K,EACAoK,EACAI,EACAE,GAJnB,IAAAzQ,EAAAhB,KACmBA,KAAA+G,KAAAA,EACA/G,KAAAmR,KAAAA,EACAnR,KAAAuR,UAAAA,EACAvR,KAAAyR,OAAAA,EAsBXzR,KAAA+X,YAAc,SAACvU,GACrBA,EAAEC,iBACFD,EAAEqL,kBACDrL,EAAEK,cAA8B0F,OACjCvI,EAAKoX,QAGCpY,KAAAgY,aAAe,SAACxU,GACtBA,EAAEC,iBACFD,EAAEqL,kBACDrL,EAAEK,cAA8B0F,OACjCvI,EAAKuX,SAgBCvY,KAAAkY,kBAAoB,WAC1BlX,EAAKgY,gCAGUhZ,KAAAgZ,6BAA+B3Z,EAAG+L,SAAS,WAAM,OAAApK,EAAKwX,uBAAuB,IAnD5FxY,KAAKe,mBAbI1B,EAAAyS,eAAcA,EAjB7B,CAAUzS,GAAAA,IAAE,ICAZ,SAAUA,GAqBR,IAAAqS,GAiBUA,EAAA5Q,UAAAC,iBAAR,WAAA,IAAAC,EAAAhB,KACEA,KAAKiZ,QAAQ9X,QAAQ,SAAA4C,GACf2N,EAAewH,aAAaC,IAAIpV,KAGpC2N,EAAewH,aAAahX,IAAI6B,GAChCA,EAAO1C,iBAAiB,QAASL,EAAKoY,kBAGxCpZ,KAAK+G,KAAKjD,iBAAiB,IAAAnD,OAAItB,EAAA+Q,mBAAmB4C,0CAC/C7R,QAAQ,SAAAkY,GAAS,OAAAA,EAAMhY,iBAAiB,QAASqQ,EAAe4H,mBAe9D5H,EAAA5Q,UAAAyY,WAAP,SAAkBxV,G,IAIVyV,EAHDzV,IAGCyV,EAAYzV,EAAOlC,UAAUC,SAASzC,EAAA+Q,mBAAmB9G,kBAC/DtJ,KAAKqV,QACDmE,IAGJzV,EAAOlC,UAAUK,IAAI7C,EAAA+Q,mBAAmB9G,kBACxCtJ,KAAKyZ,SAAS1V,GAAQ,IAChB2V,EAAwE,QAAjEzY,EAAA8C,EAAOC,QAAQ,IAAArD,OAAItB,EAAA+Q,mBAAmBqC,kCAA2B,IAAAxR,OAAA,EAAAA,EAC1EiD,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmByC,qCAEpD6G,EAAK7X,UAAUO,OAAO/C,EAAA+Q,mBAAmBhB,kBACzCpP,KAAK2Z,eAAeD,OAShBhI,EAAA5Q,UAAA6Y,eAAR,SAAuBD,GACrBA,EAAK3U,MAAM6U,KAAO,QAClB,IAAMC,EAAOH,EAAK5U,wBACd+U,EAAKD,KAAOC,EAAK5U,MAAQ1F,OAAOua,aAClCJ,EAAK3U,MAAM6U,KAAO,GAAAjZ,OAAGpB,OAAOua,WAAaD,EAAKD,KAAOC,EAAK5U,MAAQyM,EAAeqI,gBAAe,QAK7FrI,EAAA5Q,UAAAuU,MAAP,WAAA,IAAArU,EAAAhB,KACEA,KAAKiZ,QAAQ9X,QAAQ,SAAA4C,GACnBA,EAAOlC,UAAUO,OAAO/C,EAAA+Q,mBAAmB9G,kBAC3CtI,EAAKyY,SAAS1V,GAAQ,GAEqD,QAD3ExC,EAAiE,QAAjEN,EAAA8C,EAAOC,QAAQ,IAAArD,OAAItB,EAAA+Q,mBAAmBqC,kCAA2B,IAAAxR,OAAA,EAAAA,EAC7DiD,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmByC,yCAAkC,IAAAtR,GAAAA,EACvEM,UAAUK,IAAI7C,EAAA+Q,mBAAmBhB,oBAEvCpP,KAAKga,kBAIAtI,EAAA5Q,UAAAkZ,eAAP,WACEha,KAAKuR,UAAUzN,iBAAiB,IAAAnD,OAAItB,EAAA+Q,mBAAmBwC,uCACpDzR,QAAQ,SAAA4C,GAAU,OAAAA,EAAOlC,UAAUO,OAAO/C,EAAA+Q,mBAAmBuE,mBAQ1DjD,EAAA5Q,UAAA2Y,SAAR,SAAiB1V,EAAqBkW,GAC9BC,EAAOnW,EAAOG,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmBgE,iBACpD8F,IAAQA,EAAKlW,QAAQ,IAAArD,OAAItB,EAAA+Q,mBAAmBwE,sBAGjDsF,EAAKrY,UAAUO,OAAO6X,EAAK5a,EAAA+Q,mBAAmBmE,qBAAuBlV,EAAA+Q,mBAAmBoE,oBACxF0F,EAAKrY,UAAUK,IAAI+X,EAAK5a,EAAA+Q,mBAAmBoE,mBAAqBnV,EAAA+Q,mBAAmBmE,wBAI9E7C,EAAA5Q,UAAAkU,UAAP,SAAiB5C,GACVA,MAAAA,GAAAA,EAAMpO,QAAQ,IAAArD,OAAItB,EAAA+Q,mBAAmBqC,4BACxCzS,KAAKqV,SA1Ge3D,EAAAqI,gBAAkB,GAElBrI,EAAAwH,aAAe,IAAIiB,QA8B5BzI,EAAA4H,eAAiB,SAAC9V,GAC/BA,EAAEC,iBACFD,EAAEqL,kBACDrL,EAAEK,cAA8B0F,QA0ErCmI,GAvGE,SAAAA,EACmB3K,EACAwK,GAFnB,IAAAvQ,EAAAhB,KACmBA,KAAA+G,KAAAA,EACA/G,KAAAuR,UAAAA,EAmBXvR,KAAAoZ,cAAgB,SAAC5V,GACvBA,EAAEC,iBACFzC,EAAKuY,WAAW/V,EAAEK,gBAnBlB7D,KAAKiZ,QAAUjZ,KAAK+G,KAAKjD,iBAA8B,IAAAnD,OAAItB,EAAA+Q,mBAAmBsC,mBAC9E1S,KAAKe,mBAdI1B,EAAAqS,eAAcA,EArB7B,CAAUrS,GAAAA,IAAE,ICAZ,SAAUA,GAsBR,IAAAuS,GAYSA,EAAA9Q,UAAAwU,YAAP,WACEtV,KAAKoa,gCACLpa,KAAKqa,4BAICzI,EAAA9Q,UAAAsZ,8BAAR,WACE,IAAMnB,EAAUtW,MAAMC,KACpB5C,KAAKqR,YAAYvN,iBAA8B,IAAAnD,OAAItB,EAAA+Q,mBAAmBwC,wCAElE0H,EAAata,KAAKqR,YAAYnN,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmB+C,gCAChFoH,EAAYva,KAAKqR,YAAYrF,cAAesO,MAAAA,OAAU,EAAVA,EAAYtO,cAAe,GAAK4F,EAAe4I,YAEjGvB,EAAQ9X,QAAQ,SAAA4C,GAAU,OAAAA,EAAOlC,UAAUO,OAAO/C,EAAA+Q,mBAAmBhB,oBAKrE,IAAMqL,EAAOxB,EACVyB,IAAI,SAAA3W,GAAU,MAAA,CAAGA,OAAMA,EAAE4W,MAAOC,SAASrb,OAAOsb,iBAAiB9W,GAAQ4W,MAAO,KAAO,KACvF1I,KAAK,SAAC6I,EAAGC,GAAM,OAAAD,EAAEH,MAAQI,EAAEJ,QAC1BK,EAAM,EACVP,EAAKtZ,QAAQ,SAACF,G,IAAE8C,EAAM9C,EAAA8C,OACdgL,EAAoH,OAA3GhL,EAAOG,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmBsC,iBAAgB,KAAA/R,OAAItB,EAAA+Q,mBAAmB9G,mBAClG0R,GAAOjX,EAAOiI,YACHuO,GAAPS,IAAqBjM,GACvBhL,EAAOlC,UAAUK,IAAI7C,EAAA+Q,mBAAmBhB,qBAStCwC,EAAA9Q,UAAAuZ,yBAAR,WACE,IAIMY,EAKA3L,EACA3L,EACAuX,EACAC,EAUAZ,EACFS,EACAI,EAxBEC,EAAkBrb,KAAK+G,KAAK7C,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmBqD,4BAC/E4H,KAGCJ,EAAgBI,EAAgBvX,iBAA8B,IAAAnD,OAAItB,EAAA+Q,mBAAmBuD,mCACxE1N,QAIbqJ,EAAU+L,EAAgBnX,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmBsD,qCAE5EwH,EAAgBvX,OADhBA,EAAW0X,EAAgBnX,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmBwD,6CACrD,EAARjQ,EAAUO,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmByD,6CAC5EsH,EAAWE,EAAgBnX,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmB0D,uCAEnFuH,EAAgBxZ,UAAUO,OAAO/C,EAAA+Q,mBAAmBhB,kBACpDE,MAAAA,GAAAA,EAASzN,UAAUO,OAAO/C,EAAA+Q,mBAAmBqE,qBAI7CnF,MAAAA,GAAAA,EAASgM,oBAAoB,SAAUtb,KAAKub,uBAC5CjM,MAAAA,GAAAA,EAASjO,iBAAiB,SAAUrB,KAAKub,uBAEnChB,EAAYc,EAAgBrP,cAAemP,MAAAA,OAAQ,EAARA,EAAUnP,cAAe,GAAK4F,EAAe4I,YAE1FY,EADAJ,EAAM,EAEVC,EAAc9Z,QAAQ,SAAAqa,GACpBA,EAAa3Z,UAAUO,OAAO/C,EAAA+Q,mBAAmBhB,kBACjD4L,GAAOQ,EAAaxP,YACTuO,GAAPS,IACFQ,EAAa3Z,UAAUK,IAAI7C,EAAA+Q,mBAAmBhB,kBAC9CgM,OAIS,EAATA,GACFzX,MAAAA,GAAAA,EAAU9B,UAAUO,OAAO/C,EAAA+Q,mBAAmBhB,kBAC9CzL,MAAAA,GAAAA,EAAU2X,oBAAoB,QAAStb,KAAKyb,iBAC5C9X,MAAAA,GAAAA,EAAUtC,iBAAiB,QAASrB,KAAKyb,iBACrCP,IACFA,EAAcQ,YAAc,IAAA/a,OAAIya,KAGlCzX,MAAAA,GAAAA,EAAU9B,UAAUK,IAAI7C,EAAA+Q,mBAAmBhB,mBApC3CiM,EAAgBxZ,UAAUK,IAAI7C,EAAA+Q,mBAAmBhB,oBAnD7BwC,EAAA4I,YAAc,IAiHxC5I,GA/GE,SAAAA,EACmB7K,EACAsK,GAFnB,IAAArQ,EAAAhB,KACmBA,KAAA+G,KAAAA,EACA/G,KAAAqR,YAAAA,EAuFXrR,KAAAub,sBAAwB,W,IACxBjM,EAC8D,QADpDrO,EAAAD,EAAK+F,KAClB7C,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmBqD,mCAA4B,IAAAxS,OAAA,EAAAA,EAChEiD,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmBsD,qCACzC1S,EAAKqQ,YAAYxP,UAAUkX,OAAO1Z,EAAA+Q,mBAAmBsE,iBAA+C,IAA5BpF,MAAAA,OAAO,EAAPA,EAASxD,aAAc,KAIzF9L,KAAAyb,gBAAkB,SAACjY,GACzBA,EAAEC,iBACFD,EAAEqL,kBACF,IAAMwM,EAAkBra,EAAK+F,KAAK7C,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmBqD,4BAC/E4H,IAGuF,QAA5Fpa,EAAAoa,EAAgBnX,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmBwD,8CAAuC,IAAA3S,GAAAA,EACxFY,UAAUK,IAAI7C,EAAA+Q,mBAAmBhB,kBACqD,QAA1F7N,EAAA8Z,EAAgBnX,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmBsD,4CAAqC,IAAAnS,GAAAA,EACtFM,UAAUK,IAAI7C,EAAA+Q,mBAAmBqE,qBACrC4G,EAAgBvX,iBAAiB,IAAAnD,OAAItB,EAAA+Q,mBAAmBuD,kCACrDxS,QAAQ,SAAAqa,GAAgB,OAAAA,EAAa3Z,UAAUO,OAAO/C,EAAA+Q,mBAAmBhB,sBAzG5E7P,OAAOkD,sBAAsB,WAAM,OAAAzB,EAAKsU,gBAT/BjW,EAAAuS,eAAcA,EAtB7B,CAAUvS,GAAAA,IAAE,ICAZ,SAAUA,GAmBR,IAAAkW,GAeSA,EAAAzU,UAAAmQ,KAAP,SAAYzN,EAAYuN,GAAxB,IAAA/P,EAAAhB,UAAwB,IAAA+Q,IAAAA,GAAA,GACtBvN,EAAEC,iBACF,IAAMiN,EAAO1Q,KAAKiW,IAAI0F,YAChBC,EAAc5b,KAAK6b,YAAYrY,EAAGuN,GACnCL,GAASA,EAAKtL,QAAQ0W,aAGrBlU,EAASpE,EAAEoE,OACXmU,EAAO/b,KAAKgc,YAAYtL,GAE9B/Q,EAAE+Q,GAAMqL,KAAK,uBAAwBxG,EAAgB0G,mBAAmBrU,IACxEsU,GAAGC,QAAQC,QAAQzc,EAAE+Q,EAAKpM,eAA+BsD,GACzDjI,EAAE+Q,GAAMqL,KAAK,+BAA2BhF,GACxCpX,EAAE+Q,GAAMqL,KAAK,8BAA8B,GAE3Cpc,EAAE0c,KAAK3L,EAAKtL,QAAQ0W,WAAY,CAACQ,OAAQ,OAAQP,KAAMA,IAAOQ,KAAK,SAACC,GAClE,IAAIC,EAAiBzb,EAAKiV,KAAKyG,MAAMF,GAIrCjH,EAAgBoH,WAAWf,OASvBrG,EAAAzU,UAAA+a,YAAR,SAAoBrY,EAAYuN,GAC1BA,IACFpR,EAAE6D,EAAEK,eACDG,QAAQ,IAAArD,OAAItB,EAAA+Q,mBAAmBuC,iCAC/B7P,KAAK,gBACL8Z,YAAYvd,EAAA+Q,mBAAmBoE,oBAC/BqI,SAASxd,EAAA+Q,mBAAmBiE,oBAC/B1U,EAAE6D,EAAEK,eACDG,QAAQ,IAAArD,OAAItB,EAAA+Q,mBAAmByC,kCAC/BgK,SAAStH,EAAgBuH,yBAExBlB,EAAc5b,KAAKiW,IAAInW,QAAQgE,iBAA8B,IAAAnD,OAAItB,EAAA+Q,mBAAmByC,kCAC1F0C,EAAgBoH,WAAWf,GACrBmB,EAAmG,QAA5Fxb,EAAgC,QAAhCN,EAACuC,EAAEK,qBAA6B,IAAA5C,OAAA,EAAAA,EAAE+C,QAAQ,IAAArD,OAAItB,EAAA+Q,mBAAmBqC,kCAA2B,IAAAlR,OAAA,EAAAA,EAAE2C,cAAc,cAEzH,OADA6Y,MAAAA,GAAAA,EAAMlb,UAAUK,IAAI7C,EAAA+Q,mBAAmBwE,mBAChCgH,GAGMrG,EAAAoH,WAAf,SAA0Bf,GACxBA,MAAAA,GAAAA,EAAaza,QAAQ,SAAAuY,GAAQ,OAAAA,EAAK7X,UAAUK,IAAIqT,EAAgBuH,2BAQ1DvH,EAAAzU,UAAAkb,YAAR,SAAoBtL,G,IACZqL,EAAgC,GAetC,OAdA,IAAIiB,SAAStM,GAAMvP,QAAQ,SAACyM,EAAOqP,GACjClB,EAAKkB,GAAOrP,EAAMsP,aAEpBvd,EAAE+Q,GAAM5N,KAAK,6BAA6BlD,KAAK,SAACud,EAAIC,GAClD,IAAMC,EAAO1d,EAAEyd,GAAInd,KAAK,QACpBod,IACFtB,EAAKsB,GAAQ1d,EAAEyd,GAAIE,SAGF,QAArBrc,EAAAjB,KAAKiW,IAAIrF,oBAAY,IAAA3P,GAAAA,EAAEE,QAAQ,SAAA4U,GACzBA,EAAMsH,MAAQtH,EAAMnI,QACtBmO,EAAKhG,EAAMsH,MAAQtH,EAAMnI,SAGtBmO,GAcMxG,EAAA0G,mBAAf,SAAkCrU,GAC1B2V,EAAU5d,EAAEiI,GAClB,OAAI2V,EAAQzV,cAAc,IAAAnH,OAAItB,EAAA+Q,mBAAmB6D,wBAAyBhO,OACjEsP,EAAgBiI,mBAErBD,EAAQzV,cAAc,yBAAyB7B,OAC1C,iBAELsX,EAAQE,GAAG,2BAA6BF,EAAQG,KAAK,WAChD,kBAELH,EAAQzV,cAAc,yBAAyB7B,OAC1C,gBAEF,gBAhHesP,EAAAuH,uBAAyB,UAgG1BvH,EAAAiI,mBAAqB,SAkB9CjI,GAhHE,SAAAA,EAA6BU,GAAAjW,KAAAiW,IAAAA,EALlB5W,EAAAkW,gBAAeA,EAgI5B,IAAAkH,GAWSA,EAAA3b,UAAA4b,MAAP,SAAaxc,GACX,IAAMyd,GAAS,IAAIC,WAAYC,gBAAgB3d,EAAM,aAC/C4d,EAAa9d,KAAK+d,gBAAgBJ,GACxC3d,KAAKge,sBAAsBL,GAC3B3d,KAAKie,eAAeN,GACpB3d,KAAKke,aAAaP,GACZQ,EAAWne,KAAKoe,cAAcN,GAEpC9d,KAAKiW,IAAI/E,SACTlR,KAAKqe,mBACL5B,EAAiB6B,cAAcH,GAC/Bne,KAAKue,gBAAgBZ,GACrB3d,KAAKwe,kBAOC/B,EAAA3b,UAAAid,gBAAR,SAAwBJ,GAAxB,IAAA3c,EAAAhB,KACQ8d,EAA2C,GAC3CW,EAAwB,GACxBC,EAAuB,GACvBC,EAAsB,GAkC5B,OAhCA3e,KAAKiW,IAAInW,QAAQgE,iBAAiB,GAAAnD,OAAGtB,EAAAuf,cAAcC,8BAA+B1d,QAAQ,SAACqC,GACrFA,EAAE4B,QAAQ0Z,gBAAkBtb,EAAE3B,UAAUC,SAASzC,EAAA+Q,mBAAmBuE,iBACtE8J,EAAYxQ,KAAKzK,EAAE4B,QAAQ0Z,gBAEzBtb,EAAE4B,QAAQ2Z,WAAavb,EAAE3B,UAAUC,SAASzC,EAAA+Q,mBAAmBuE,iBACjE+J,EAAWzQ,KAAKzK,EAAE4B,QAAQ2Z,aAG9B/e,KAAKiW,IAAInW,QAAQgE,iBAAiB,IAAAnD,OAAItB,EAAA+Q,mBAAmBsC,iBAAgB,KAAA/R,OAAItB,EAAA+Q,mBAAmB9G,mBAAoBnI,QAAQ,SAACqC,GACvHA,EAAE4B,QAAQ0Z,gBACZH,EAAU1Q,KAAKzK,EAAE4B,QAAQ0Z,kBAI7BnB,EAAO7Z,iBAAiB,IAAAnD,OAAI8b,EAAiBuC,yBAA0B7d,QAAQ,SAACqC,GACzEA,EAAE4B,QAAQ6Z,aAGfnB,EAAWta,EAAE4B,QAAQ6Z,WAAazb,GAChCM,iBAAiB,GAAAnD,OAAGtB,EAAAuf,cAAcC,8BAA+B1d,QAAQ,SAAC+d,IACzDA,EAAM9Z,QAAQ0Z,gBAAuE,GAArDL,EAAYU,QAAQD,EAAM9Z,QAAQ0Z,iBAC7EI,EAAM9Z,QAAQ2Z,WAA4D,GAA/CL,EAAWS,QAAQD,EAAM9Z,QAAQ2Z,aAEhEG,EAAMrd,UAAUK,IAAI7C,EAAA+Q,mBAAmBuE,kBAG3CnR,EAAEM,iBAAiB,IAAAnD,OAAItB,EAAA+Q,mBAAmBsC,mBAAoBvR,QAAQ,SAAC4b,GACjEA,EAAK3X,QAAQ0Z,gBAAoE,GAAlDH,EAAUQ,QAAQpC,EAAK3X,QAAQ0Z,iBAChE9d,EAAKoe,WAAWrC,QAIfe,GAIDrB,EAAA3b,UAAAse,WAAR,SAAmBrC,GACjBA,EAAKlb,UAAUK,IAAI7C,EAAA+Q,mBAAmB9G,kBACtC,IAAM4Q,EAAO6C,EAAK7Y,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmBgE,iBACvD8F,MAAAA,GAAAA,EAAMrY,UAAUO,OAAO/C,EAAA+Q,mBAAmBmE,sBAC1C2F,MAAAA,GAAAA,EAAMrY,UAAUK,IAAI7C,EAAA+Q,mBAAmBoE,oBAEoC,QAD3EjT,EAA+D,QAA/DN,EAAA8b,EAAK/Y,QAAQ,IAAArD,OAAItB,EAAA+Q,mBAAmBqC,kCAA2B,IAAAxR,OAAA,EAAAA,EAC3DiD,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmByC,yCAAkC,IAAAtR,GAAAA,EACvEM,UAAUO,OAAO/C,EAAA+Q,mBAAmBhB,mBAIlCqN,EAAA3b,UAAAkd,sBAAR,SAA8BL,G,IACtB0B,EAA0F,QAAlFpe,EAAA0c,EAAOzZ,cAA2B,IAAAvD,OAAI8b,EAAiB6C,kCAA2B,IAAAre,OAAA,EAAAA,EAAEmE,QAAQ6V,cACpGrT,EAAS5H,KAAKiW,IAAInW,QAAQoE,cAA2B,IAAAvD,OAAI8b,EAAiB6C,2BAC5ED,GAASzX,IACXA,EAAOxC,QAAQ6V,cAAgBoE,IAK3B5C,EAAA3b,UAAAmd,eAAR,SAAuBN,GACfrO,EAAUqO,EAAOzZ,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmBmC,kBACpEoL,EAAOzZ,cAA2B,IAAAvD,OAAItB,EAAA+Q,mBAAmBoC,uBACxD+M,EAASjQ,MAAAA,OAAO,EAAPA,EAASlK,QAAQoa,IAC5BD,GACF/U,QAAQiV,UAAU,GAAI,GAAIF,IAKtB9C,EAAA3b,UAAAod,aAAR,SAAqBP,GACnB,IAAM+B,EAAS/B,EAAOzZ,cAA2B,IAAAvD,OAAItB,EAAAsgB,qBAAqBC,sBACpEhY,EAAS5H,KAAKiW,IAAInW,QAAQoE,cAA2B,IAAAvD,OAAItB,EAAAsgB,qBAAqBC,sBAChFF,GAAU9X,IACZA,EAAOxC,QAAQ0P,KAAO4K,EAAOta,QAAQ0P,KACrClN,EAAOxC,QAAQya,SAAWH,EAAOta,QAAQya,SACzCjY,EAAOxC,QAAQ0a,gBAAkBJ,EAAOta,QAAQ0a,gBAChDlY,EAAOxC,QAAQ2a,YAAcL,EAAOta,QAAQ2a,cAIxCtD,EAAA3b,UAAAsd,cAAR,SAAsBN,GAAtB,IAAA9c,EAAAhB,KACQggB,EAAsB,GACtB7B,EAA6C,GA4BnD,OA3BAne,KAAKiW,IAAInW,QAAQgE,iBAAiB,IAAAnD,OAAI8b,EAAiBuC,yBAA0B7d,QAAQ,SAACqC,GACxF,IAGIyc,EAkBEC,GArBD1c,EAAE2c,cAGHF,EAAczc,EAAE4B,QAAQ6Z,UAAYnB,EAAWta,EAAE4B,QAAQ6Z,gBAAalI,KAKzC,GAA7BiJ,EAAKb,QAAQc,GACfA,EAAcA,EAAYG,WAAU,GAEpCJ,EAAK/R,KAAKgS,GAGZjf,EAAKqf,0BAA0B7c,EAAGyc,GAC5B3a,EAAY9B,EAAE8B,UACpB3F,EAAE6D,GAAGnD,YAAY4f,GACD,EAAZ3a,IACF6Y,EAASlQ,KAAK,CAACrM,GAAIqe,EAAa1a,IAAKD,IACrC2a,EAAY3a,UAAYA,IAEpB4a,EAAQI,OAAOpK,MAAMgG,GAAGC,QAAQoE,qBAChCC,eAAiB7gB,EAAEsgB,GACzBC,EAAMO,cAAgB9gB,EAAE6D,GACxB7D,EAAE,SAAS+gB,QAAQR,MAEd/B,GAGM1B,EAAA6B,cAAf,SAA6BH,GAC3BA,EAAShd,QAAQ,SAAAwf,GAAK,OAAAA,EAAE/e,GAAG0D,UAAYqb,EAAEpb,OAInCkX,EAAA3b,UAAAuf,0BAAR,SAAkCO,EAA0BX,GACpB,iBAAlCW,EAAYxb,QAAQ6Z,WAAkE,oBAAlC2B,EAAYxb,QAAQ6Z,YAMvE4B,OAHCA,EAAcD,EAAY1c,cAC9B,IAAAvD,OAAItB,EAAA+Q,mBAAmBwC,qCAAoC,UAAAjS,OAAStB,EAAA+Q,mBAAmBsC,iBAAgB,KAAA/R,OAAItB,EAAA+Q,mBAAmB9G,iBAAgB,SAE3IuX,EAAazb,QAAQ0Z,iBAGpBgC,EAAmBb,EAAY/b,cACnC,IAAAvD,OAAItB,EAAA+Q,mBAAmBwC,qCAAoC,2BAAAjS,OAA0BkgB,EAAYzb,QAAQ0Z,eAAc,UAKzH9e,KAAK+gB,yBAAyBF,EAAaC,GAC3CA,EAAiBzgB,YAAYwgB,MAIvBpE,EAAA3b,UAAAigB,yBAAR,SAAiCC,EAAyBC,G,IAQhD/G,EAPFgH,EAAYF,EAAW9c,cAAiC,IAAAvD,OAAItB,EAAA+Q,mBAAmBsC,mBAC/EyO,EAAYF,EAAW/c,cAAiC,IAAAvD,OAAItB,EAAA+Q,mBAAmBsC,mBACjFwO,GAAaC,IACfD,EAAUrI,UAAYsI,EAAUtI,UAChCqI,EAAUrf,UAAUK,IAAI7C,EAAA+Q,mBAAmB9G,kBAC3C4X,EAAUE,SAAWD,EAAUC,SAC/BF,EAAUG,UAAYF,EAAUE,UAEhCnH,OADMA,EAAOgH,EAAUhd,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmBgE,mBAC5D8F,EAAMrY,UAAUO,OAAO/C,EAAA+Q,mBAAmBmE,sBAC1C2F,MAAAA,GAAAA,EAAMrY,UAAUK,IAAI7C,EAAA+Q,mBAAmBoE,qBAGyC,QAAlFvT,EAAA+f,EAAW9c,cAAc,IAAAvD,OAAItB,EAAA+Q,mBAAmByC,yCAAkC,IAAA5R,GAAAA,EAAEY,UAAUO,OAAO,WAC/Fkf,EAAaN,EAAW9c,cAAc,uBACtCqd,EAAaN,EAAW/c,cAAc,uBACxCod,GAAcC,IAChBD,EAAWD,UAAYE,EAAWF,YAI9B5E,EAAA3b,UAAAud,iBAAR,WACEre,KAAKiW,IAAInW,QAAQgE,iBAAiB,GAAAnD,OAAGtB,EAAGuf,cAAc4C,qBAAsBrgB,QAAQ,SAAAqC,GAClFA,EAAEie,cAAc,IAAIvL,MAAM7W,EAAAuf,cAAc8C,kBASpCjF,EAAA3b,UAAAyd,gBAAR,SAAwBZ,GACtB,IAAMgE,EAAU,IAAAhhB,OAAI8b,EAAiBmF,2BACrC5hB,KAAKiW,IAAInW,QAAQgE,iBAAiB,GAAAnD,OAAGghB,EAAO,MAAAhhB,OAAK8b,EAAiBoF,wBAAyB1gB,QAAQ,SAACqC,GAAmB,OAAAA,EAAEpB,WACzHpC,KAAKiW,IAAInW,QAAQgE,iBAAiB,GAAAnD,OAAGghB,EAAO,MAAAhhB,OAAK8b,EAAiBqF,2BAA4B3gB,QAAQ,SAACqC,GAAmB,OAAAA,EAAEpB,WAC5H,IAAM2f,EAAS/hB,KAAKiW,IAAInW,QAAQoE,cAAcyd,GACzCI,IAGL,CAACtF,EAAiBoF,sBAAuBpF,EAAiBqF,0BAA0B3gB,QAAQ,SAAA6gB,GAC1FrE,EAAO7Z,iBAAiB,GAAAnD,OAAGghB,EAAO,MAAAhhB,OAAKqhB,IAAa7gB,QAAQ,SAACqC,GAC3Due,EAAOE,YAAYze,GACnB,IAAM0e,EAAK5B,OAAOpK,MAAMgG,GAAGC,QAAQoE,oBACnC2B,EAAG1B,eAAiB7gB,EAAE6D,GACtB7D,EAAE,SAAS+gB,QAAQwB,OAGvBliB,KAAKmiB,uBASC1F,EAAA3b,UAAAqhB,mBAAR,WACE,IAOMtR,EAPAuR,EAAOpiB,KAAKiW,IAAInW,QAAQgE,iBAC5B,IAAAnD,OAAI8b,EAAiBmF,0BAAyB,MAAAjhB,OAAKtB,EAAAgjB,uBAAuBC,4BAEvEF,IAGL/iB,EAAAkjB,sBAAsBC,mBAAmBJ,GAAM,EAAO,OAChDvR,EAAO7Q,KAAKiW,IAAIwM,YACbxc,QACP5G,EAAAkjB,sBAAsBC,mBAAmBJ,GAAM,EAAOvR,KAIlD4L,EAAA3b,UAAA0d,eAAR,WACExe,KAAKiW,IAAInW,QAAQgE,iBAAiB,IAAAnD,OAAItB,EAAAsgB,qBAAqBC,sBAAuBze,QAAQ,SAAAqC,GACxFA,EAAEie,cAAc,IAAIvL,MAAM7W,EAAAsgB,qBAAqB+B,kBAnP3BjF,EAAAuC,uBAAyB,kCACzBvC,EAAA6C,yBAA2B,sBAC3B7C,EAAAmF,0BAA4B,qCAC5BnF,EAAAoF,sBAAwB,mBACxBpF,EAAAqF,yBAA2B,sBAkPrDrF,GAhPE,SAAAA,EAA6BxG,GAAAjW,KAAAiW,IAAAA,EARlB5W,EAAAod,iBAAgBA,EAnJ/B,CAAUpd,GAAAA,IAAE,ICAZ,SAAUA,GAqBR,IAAA2S,GAgBUA,EAAAlR,UAAAC,iBAAR,SAAyB2Y,GAAzB,IAAA1Y,EAAAhB,KACEA,KAAK0iB,OAAOvhB,QAAQ,SAAA4U,GACdA,EAAMlU,UAAUC,SAASzC,EAAA+Q,mBAAmB6C,sBAC9C8C,EAAM1U,iBAAiB,SAAUL,EAAK2hB,eAC5B5M,EAAMlU,UAAUC,SAASzC,EAAA+Q,mBAAmB8C,iCACtD6C,EAAM1U,iBAAiB,SAAUL,EAAK4hB,kBAG1C5iB,KAAK+G,KAAKjD,iBAA8B,GAAAnD,OAAG+Y,EAAI,MAAA/Y,OAAKtB,EAAA+Q,mBAAmB0C,0CACpE3R,QAAQ,SAAA2W,GAAO,OAAAA,EAAIzW,iBAAiB,QAASL,EAAK6hB,eACrD7iB,KAAK+G,KAAKjD,iBAA8B,GAAAnD,OAAG+Y,EAAI,MAAA/Y,OAAKtB,EAAA+Q,mBAAmB2C,2CACpE5R,QAAQ,SAAA2W,GAAO,OAAAA,EAAIzW,iBAAiB,QAASL,EAAK8hB,gBACrD9iB,KAAK+iB,cAAc5hB,QAAQ,SAAA2W,GAAO,OAAAA,EAAIzW,iBAAiB,QAASL,EAAKgiB,kBACrEhjB,KAAK+G,KAAKjD,iBAA8B,IAAAnD,OAAItB,EAAA+Q,mBAAmB4D,+BAC5D7S,QAAQ,SAAA2W,GAAO,OAAAA,EAAIzW,iBAAiB,QAASL,EAAKiiB,gBA4C/CjR,EAAAlR,UAAAoiB,gBAAR,SAAwBC,EAAqB5L,G,IACvCvP,EAAgC,KACoC,QAAxE/G,EAAAkiB,EAAOnf,QAAQ,IAAArD,OAAItB,EAAA+Q,mBAAmByC,yCAAkC,IAAA5R,GAAAA,EACpE6C,iBAAiB,SAClB3C,QAAQ,SAAA4U,GAIHA,EAAMqL,UAGNrL,EAAMwB,UAAYA,IACpBxB,EAAMwB,QAAUA,EAChBvP,EAAO+N,KAGZ/N,MAAAA,GAAAA,EAAkCyZ,cAAc,IAAIvL,MAAM,YA6C9ClE,EAAAoR,YAAf,SAA2BC,GACzBA,EAAQvgB,KAAK,gBACV8Z,YAAYvd,EAAA+Q,mBAAmBkE,mBAC/BuI,SAASxd,EAAA+Q,mBAAmBiE,qBAEnCrC,GAvIE,SAAAA,EACmBiE,EACAlP,EACA0K,GAHnB,IAAAzQ,EAAAhB,KACmBA,KAAAiW,IAAAA,EACAjW,KAAA+G,KAAAA,EACA/G,KAAAyR,OAAAA,EAyBXzR,KAAA4iB,eAAiB,SAACpf,GACxBxC,EAAKiV,IAAInF,cAActN,IAOjBxD,KAAA2iB,cAAgB,SAACnf,GACvB,IAAM8f,EAAS3jB,EAAE6D,EAAEK,eAA8BkY,KAAK,WAAa,IAC9DuH,IAGCC,EAAY5jB,EAAE,SAASmD,KAAK,SAAWwgB,IAC9Brd,SAGgB,UAA3Bsd,EAAUtjB,KAAK,QAEjBsjB,EAAU7F,KAAK,WAAW,GAE1B6F,EAAU7F,KAAK,WAAY6F,EAAU7F,KAAK,YAE5C1c,EAAKiV,IAAInF,cAActN,KAGjBxD,KAAA6iB,YAAc,SAACrf,GACrBA,EAAEC,iBACFzC,EAAKkiB,gBAAgB1f,EAAEK,eAA8B,IAG/C7D,KAAA8iB,aAAe,SAACtf,GACtBA,EAAEC,iBACFzC,EAAKkiB,gBAAgB1f,EAAEK,eAA8B,IA+B/C7D,KAAAgjB,eAAiB,SAACxf,GACxB,IAAM2f,EAAS3f,EAAEK,cACjBL,EAAEC,iBACFD,EAAEqL,kBACFsU,EAAO5Z,OACPyI,EAAkBoR,YAAYzjB,EAAEwjB,IAChC,IAAMK,EAAYL,EAAO/d,QAAQoe,UAC3BC,EAAaN,EAAO/d,QAAQqe,WAC7BD,GAAcC,GAGnBziB,EAAK+F,KAAKjD,iBAAiB,SAAS3C,QAAQ,SAAC4U,GACvCA,EAAM3Q,QAAQoe,YAAcA,GAAazN,EAAMnI,QAAU6V,IAC3D1N,EAAMwB,SAAU,EAChBxB,EAAM0L,cAAc,IAAIvL,MAAM,eAU5BlW,KAAAijB,YAAc,SAACzf,GACrB,IAAM0c,EAAQ1c,EACV0c,EAAMwD,uBAGVxD,EAAMwD,sBAAuB,EAC7B1iB,EAAKyQ,OAAO4D,QACZrU,EAAK+F,KAAKjD,iBAAmC,IAAAnD,OAAItB,EAAA+Q,mBAAmByC,gCAA+B,WAChG1R,QAAQ,SAAA4U,GAAS,OAAAA,EAAMwB,SAAU,IACpCvW,EAAK+F,KAAKjD,iBAA8B,IAAAnD,OAAItB,EAAA+Q,mBAAmB2D,iCAC5D5S,QAAQ,SAAA2W,GAAO,OAAA9F,EAAkBoR,YAAYzjB,EAAEmY,MAClD9W,EAAKiV,IAAInF,cAActN,GAAc,KA1H/BkW,EAAO,IAAA/Y,OAAItB,EAAA+Q,mBAAmByC,iCACpC7S,KAAK0iB,OAAS1iB,KAAK+G,KAAKjD,iBAAmC,GAAAnD,OAAG+Y,EAAI,WAClE1Z,KAAK+iB,cAAgB/iB,KAAK+G,KAAKjD,iBAA8B,IAAAnD,OAAItB,EAAA+Q,mBAAmB2D,iCACpF/T,KAAKe,iBAAiB2Y,GAbbra,EAAA2S,kBAAiBA,EArBhC,CAAU3S,GAAAA,IAAE,ICAZ,SAAUA,GAEN,IAAAskB,GAEWA,EAAAtT,OAAP,SAAc3Q,EAA4B4Q,GAA1C,IAAAtP,EAAAhB,KACMsQ,EAKAtQ,KAAK4jB,UAAUziB,QAAQ,SAAA0iB,GACrBA,EAAOC,WAAWpkB,KALpBC,EAAE,IAAAgB,OAAKgjB,EAAUI,6BAAgCrkB,GAAOE,KAAK,SAACiB,EAAcf,GACxEkB,EAAK4iB,UAAU3V,KAAK,IAAI0V,EAAU7jB,EAAS6jB,EAAUC,UAAU3d,YAiCjE0d,EAAA7iB,UAAAgjB,WAAR,SAAmB1R,GAAnB,IAAApR,EAAAhB,KACKA,KAAKgkB,YACN5R,EAAKtP,KAAK,IAAAnC,OAAIgjB,EAAUM,8BAA+BrkB,KAAK,SAACiB,EAAcqjB,GACzEljB,EAAKmjB,WAAWxkB,EAAEukB,MAEjBlkB,KAAKa,OAASb,KAAKuD,KAAK1B,UAAUC,SAAS,gBAC5C9B,KAAKuD,KAAK1B,UAAUO,OAAO,iBAMzBuhB,EAAA7iB,UAAAqjB,WAAR,SAAmBD,G,IACbE,EAAWF,EAAKphB,KAAK,IAAAnC,OAAIgjB,EAAUU,iCAAgC,WACpED,EAASne,SACJgX,EAAcjd,KAAKskB,UACzBF,EAASnkB,KAAK,OAAQ,IAAIgd,GAAKsH,KAAKvkB,KAAKa,OACzCujB,EAAS,GAAG/iB,iBAAiB,QAASrB,KAAKwkB,kBACvCC,EAAKnE,OAAO,OAAQ,CACtBoE,GAAIzH,KAEH/c,KAAKkkB,EAASrI,KAAK,gBACtB1c,EAAGslB,WAAWllB,KAAKglB,GACnBplB,EAAGulB,QAAQC,cAAcJ,GACX,QAAdxjB,EAAAjB,KAAKgkB,iBAAS,IAAA/iB,GAAAA,EAAEghB,YAAYwC,EAAG,MAI3Bd,EAAA7iB,UAAAwjB,QAAR,WACE,OAA2B,EAAlBtkB,KAAK8kB,WAAiB,GAAG9kB,KAAK8kB,WAAY,IAAI,eAAe9kB,KAAKa,OAlEtE8iB,EAAAC,UAA0B,GAcnBD,EAAAI,4BAAsC,2BAEtCJ,EAAAoB,8BAAwC,6BAExCpB,EAAAM,4BAAsC,kBACtCN,EAAAU,iCAA2C,uBAC3CV,EAAAqB,oCAA8C,0BAgEhErB,GAxDI,SAAAA,EACqBpgB,EACAuhB,GAFrB,IAAA9jB,EAAAhB,KACqBA,KAAAuD,KAAAA,EACAvD,KAAA8kB,WAAAA,EAPb9kB,KAAAa,MAAgB,EAChBb,KAAAilB,aAAuB,EA6CvBjlB,KAAAwkB,gBAAkB,SAAChhB,G,IAEnB0hB,EADUvlB,EAAE6D,EAAEK,eACO5D,KAAK,QAC5BilB,GAAcA,EAAWlf,WAAW,OAClCmf,GAAkB,QAAdlkB,EAAAD,EAAKgjB,iBAAS,IAAA/iB,OAAA,EAAAA,EAAEmkB,YAAa,EACrC5hB,EAAEC,iBACFpE,EAAG8L,WAAWka,iBAAiBF,KAK3BnlB,KAAAslB,cAA6E,SAAC9hB,EAA0B+hB,GAC9GvkB,EAAKikB,aAAeM,EAAQC,oBAAsBD,EAAQE,2BAA6BzkB,EAAKikB,cAjD1FjlB,KAAKgkB,UAAYhkB,KAAKuD,KAAKW,cAAc,IAAAvD,OAAIgjB,EAAUoB,gCACvD/kB,KAAK8jB,WAAWnkB,EAAE2H,SAASmB,OAC3B9I,EAAE,SAASmZ,GAAGzZ,EAAAqmB,cAAcC,aAAc3lB,KAAKslB,eAnC1CjmB,EAAAskB,UAASA,EAF1B,CAAUtkB,GAAAA,IAAE,ICAZ,SAAUA,GAIV,IAAAumB,GAkBWA,EAAAvV,OAAP,SAAc3Q,GACVC,EAAE,IAAAgB,OAAIilB,EAAoBC,mBAAqBnmB,GAAOE,KAAK,SAACiB,EAAef,GACvE,IAAI8lB,EAAoB9lB,MA6DxB8lB,EAAA9kB,UAAArB,KAAR,WACIO,KAAKe,oBAGD6kB,EAAA9kB,UAAAC,iBAAR,WAAA,I,EAAAC,EAAAhB,KACkB,QAAhBiB,EAAAjB,KAAKsG,mBAAW,IAAArF,GAAAA,EAAEE,QAAQ,SAACwF,GACzBA,EAAKtF,iBAAiB,QAASL,EAAKuF,qBAG1B,QAAZhF,EAAAvB,KAAKwG,eAAO,IAAAjF,GAAAA,EAAEJ,QAAQ,SAACwF,GACrBA,EAAKtF,iBAAiB,QAASL,EAAKyF,iBAGlB,QAApBtE,EAAAnC,KAAK0G,uBAAe,IAAAvE,GAAAA,EAAEhB,QAAQ,SAACwF,G,MAO7BA,EAAKtF,iBAAiB,QAASL,EAAK4F,oBACKmQ,KAA9B,QAAP9V,EAAAD,EAAKY,UAAE,IAAAX,OAAA,EAAAA,EAAEmE,QAAsB,eAAiC,QAAb7D,EAAAP,EAAK8kB,gBAAQ,IAAAvkB,GAAAA,EAAEO,SAAS6E,IAC7EA,EAAKtF,iBAAiB,aAAcL,EAAK4F,iBAGrB,QAAxBvC,EAAArE,KAAK+lB,2BAAmB,IAAA1hB,GAAAA,EAAElD,QAAQ,SAACwF,GACjCA,EAAKtF,iBAAiB,QAASL,EAAKglB,qBAGlChmB,KAAKimB,qBACPjmB,KAAKimB,oBAAoB5kB,iBAAiB,QAASrB,KAAKkmB,oBAIvC,QAAnB3hB,EAAAvE,KAAKmmB,sBAAc,IAAA5hB,GAAAA,EAAElD,iBAAiB,aAAcrB,KAAKomB,cACtC,QAAnB5hB,EAAAxE,KAAKmmB,sBAAc,IAAA3hB,GAAAA,EAAEnD,iBAAiB,WAAYrB,KAAKqmB,aAlH3CT,EAAAC,kBAA4B,eAC5BD,EAAAU,2BAAqC,uBACrCV,EAAAW,kCAA4C,iCAC5CX,EAAAY,6BAAuC,2BACvCZ,EAAAa,kCAA4C,0BAC5Cb,EAAAc,yCAAmD,kCAGnDd,EAAAe,uCAAiD,gCAEjDf,EAAAgB,+BAAyC,yBACzChB,EAAAiB,2BAAqC,yBAErCjB,EAAAkB,+BAAyC,wBACzClB,EAAAmB,oCAA8C,6BAiJhEnB,GAtHI,SAAAA,EACqBriB,GADrB,IAAAvC,EAAAhB,KACqBA,KAAAuD,KAAAA,EANbvD,KAAAgnB,YAAsB,EACtBhnB,KAAAinB,UAAoB,EACpBjnB,KAAAknB,qBAA+B,GA+E/BlnB,KAAAomB,aAAe,SAAC5iB,GACtBxC,EAAKgmB,YAAcxjB,EAAE2jB,eAAe,GAAGC,SAGjCpnB,KAAAqmB,WAAa,SAAC7iB,GACpBxC,EAAKimB,UAAYzjB,EAAE2jB,eAAe,GAAGC,QACjCte,KAAKue,IAAIrmB,EAAKimB,UAAYjmB,EAAKgmB,aAAehmB,EAAKkmB,uBAC/ClmB,EAAKimB,UAAYjmB,EAAKgmB,YACtBhmB,EAAK0C,GAAGgE,OACD1G,EAAKimB,UAAYjmB,EAAKgmB,aAC7BhmB,EAAK0C,GAAG+D,aAKVzH,KAAA4G,cAAgB,SAACpD,GACrBA,EAAEC,iBACFzC,EAAK0C,GAAG8D,eAAehE,EAAEK,gBAErB7D,KAAAgmB,kBAAoB,SAACxiB,GAEnBwF,EAA2BxF,EAAEK,cAA8BuB,QAAa,IAC9EpE,EAAK0C,GAAG4jB,eAAete,EAAM4R,SAAS5R,EAAK,IAAM,IAE7ChJ,KAAAkmB,mBAAqB,SAAC1iB,GAC1BA,EAAEC,iBAEEzC,EAAKumB,wBACLvmB,EAAK0C,GAAG8jB,uBAAuBxmB,EAAKumB,yBAGpCvnB,KAAAuG,kBAAoB,SAAC/C,GACzBA,EAAEC,kBACO,OAAR6D,eAAQ,IAARA,cAAQ,EAARA,SAAUuQ,eAA8BtO,OACzCvI,EAAK0C,GAAG+D,YAGJzH,KAAAyG,cAAgB,SAACjD,GACrBA,EAAEC,kBACO,OAAR6D,eAAQ,IAARA,cAAQ,EAARA,SAAUuQ,eAA8BtO,OACzCvI,EAAK0C,GAAGgE,QAhHR1H,KAAK4B,GAAK5B,KAAKuD,KACfvD,KAAK8lB,SAAkB,QAAP7kB,EAAAjB,KAAK4B,UAAE,IAAAX,OAAA,EAAAA,EAAEiD,cAAc,IAAAvD,OAAIilB,EAAoBU,6BAC/DtmB,KAAKmmB,eAAwB,QAAP5kB,EAAAvB,KAAK4B,UAAE,IAAAL,OAAA,EAAAA,EAAE2C,cAAc,IAAAvD,OAAIilB,EAAoBW,oCACrEvmB,KAAK2F,WAAoB,QAAPxD,EAAAnC,KAAK4B,UAAE,IAAAO,OAAA,EAAAA,EAAE+B,cAAc,IAAAvD,OAAIilB,EAAoBY,+BACjExmB,KAAKynB,mBAAkC,QAAbpjB,EAAArE,KAAK8lB,gBAAQ,IAAAzhB,OAAA,EAAAA,EAAEH,cAAc,IAAAvD,OAAIilB,EAAoBY,+BAE/ExmB,KAAK0G,gBAAyB,QAAPnC,EAAAvE,KAAK4B,UAAE,IAAA2C,OAAA,EAAAA,EAAET,iBAAiB,IAAAnD,OAAIilB,EAAoBa,oCACzEzmB,KAAK+lB,oBAA6B,QAAPvhB,EAAAxE,KAAK4B,UAAE,IAAA4C,OAAA,EAAAA,EAAEV,iBAAiB,IAAAnD,OAAIilB,EAAoBe,yCAC7E3mB,KAAKimB,oBAA6B,QAAP3d,EAAAtI,KAAK4B,UAAE,IAAA0G,OAAA,EAAAA,EAAEpE,cAAc,IAAAvD,OAAIilB,EAAoBc,2CAC1E1mB,KAAKunB,uBAAgC,QAAPhf,EAAAvI,KAAK4B,UAAE,IAAA2G,OAAA,EAAAA,EAAErE,cAAc,0BAAAvD,OAA0BilB,EAAoBkB,+BAA8B,gCAEjI9mB,KAAKsG,YAAqB,QAAPohB,EAAA1nB,KAAK4B,UAAE,IAAA8lB,OAAA,EAAAA,EAAE5jB,iBAAiB,IAAAnD,OAAIilB,EAAoBgB,iCACrE5mB,KAAKwG,QAAiB,QAAPmhB,EAAA3nB,KAAK4B,UAAE,IAAA+lB,OAAA,EAAAA,EAAE7jB,iBAAiB,IAAAnD,OAAIilB,EAAoBiB,6BAE5D7mB,KAAK2F,YAAe3F,KAAK4B,KAK9B5B,KAAK0D,GAAK,IAAIkkB,EACV5nB,KAAK4B,GACL5B,KAAK8lB,SACL9lB,KAAK2F,WACL3F,KAAKynB,mBACLznB,KAAK0G,gBACL1G,KAAKsG,YACLtG,KAAKwG,SAGJxG,KAAK0D,GAAG2E,YACTrI,KAAKP,QA7EJJ,EAAAumB,oBAAmBA,EAqLhC,IAAAgC,GAmCWA,EAAA9mB,UAAA2G,SAAP,WACI,IAAKzH,KAAK0I,aACN,OAAO1I,KAAKwH,eAAexH,KAAK2I,aAAa,GAAGC,MAEpD,IAAMC,EAAsBC,KAAKC,IAAI,EAAG/I,KAAK0I,aAAaM,IAAM,GAC1DC,EAA8BjJ,KAAK2I,aAAaE,GACtD7I,KAAKwH,eAAeyB,EAAaL,OAG9Bgf,EAAA9mB,UAAA4G,KAAP,WACI,IAAK1H,KAAK0I,aACN,OAAO1I,KAAKwH,eAAexH,KAAK2I,aAAa,GAAGC,MAEpD,IAAMC,EAAsBC,KAAKI,IAAIlJ,KAAKmJ,eAAelD,OAAS,EAAGjG,KAAK0I,aAAaM,IAAM,GACvFI,EAA0BpJ,KAAK2I,aAAaE,GAClD7I,KAAKwH,eAAe4B,EAASR,OAE1Bgf,EAAA9mB,UAAA0mB,uBAAP,SAA8B7gB,GACtBkhB,EAAc7nB,KAAK2I,aAAahC,MAAAA,GAAAA,EAAMvB,QAAa,IAAIwV,SAASjU,MAAAA,OAAI,EAAJA,EAAMvB,QAAa,KAAK,GAC9FpF,KAAKwH,eAAeqgB,EAAYjf,OAG3Bgf,EAAA9mB,UAAAwmB,eAAP,SAAsBte,G,MACdrC,EAAkC3G,KAAKmJ,eAAerG,KAAK,SAAA6J,GAAM,OAAAA,EAAG3D,MAAQA,IAC7ErC,GAGL3G,KAAKwH,eAAgC,QAAjBvG,EAAA0F,EAAKmhB,oBAAY,IAAA7mB,EAAAA,EAAI0F,EAAKiC,MAAM,GAAM,IAMpDgf,EAAA9mB,UAAAinB,oBAAR,SAA4BphB,GAC1B,QAASA,KAAUA,EAAKqhB,WAAarhB,EAAKshB,SAGrCL,EAAA9mB,UAAAonB,gBAAP,WAAA,I,EAAAlnB,EAAAhB,KACQ2G,EAAkC3G,KAAK+nB,oBAAoB/nB,KAAK0I,cAClE1I,KAAK0I,aACL1I,KAAKmJ,eAAerG,KAAK,SAAA6J,GAAM,OAAA3L,EAAK+mB,oBAAoBpb,KACvDhG,GAGL3G,KAAKwH,eAA4B,QAAbvG,EAAA0F,EAAKqhB,gBAAQ,IAAA/mB,EAAAA,EAAI0F,EAAKiC,OAGrCgf,EAAA9mB,UAAA0G,eAAP,SAAsBb,EAA+B0C,EAAqC8e,G,eAArC,IAAA9e,IAAAA,GAAA,QAAqC,IAAA8e,IAAAA,GAAA,GAEtF,IAmCItnB,EAnCEuI,EAAsCpJ,KAAKyJ,YAAY9C,GACxDyC,IAIDpJ,KAAK0I,eACP1I,KAAKooB,kBAAiB,GACU,QAAhCnnB,EAAAjB,KAAK0I,aAAa2f,sBAAc,IAAApnB,GAAAA,EAAEY,UAAUK,IAAI0lB,EAAmBhjB,gBAC/B,QAApCrD,EAAAvB,KAAK0I,aAAa4f,0BAAkB,IAAA/mB,GAAAA,EAAEM,UAAUK,IAAI0lB,EAAmBhjB,gBACzC,QAA9BzC,EAAAnC,KAAK0I,aAAaof,oBAAY,IAAA3lB,GAAAA,EAAEN,UAAUO,OAAOwlB,EAAmBte,kBACtC,QAA9BjF,EAAArE,KAAK0I,aAAaof,oBAAY,IAAAzjB,GAAAA,EAAEkF,OAChCvJ,KAAKuoB,aAEHJ,GAAYnoB,KAAKwoB,YACnBxoB,KAAKwoB,UAAU5gB,OAAO/F,UAAUK,IAAI0lB,EAAmBhjB,gBAC9B,QAAzBL,EAAAvE,KAAKwoB,UAAUC,kBAAU,IAAAlkB,GAAAA,EAAE1C,UAAUK,IAAI0lB,EAAmBhjB,gBAC5D5E,KAAKwoB,UAAU5f,KAAK/G,UAAUO,OAAOwlB,EAAmBte,kBACxDtJ,KAAKwoB,UAAU5f,KAAKW,QAEtBvJ,KAAK0I,aAAeU,EAEW,QAA/Bd,EAAiB,QAAjB9D,EAAAxE,KAAK0I,oBAAY,IAAAlE,OAAA,EAAAA,EAAEsjB,oBAAY,IAAAxf,GAAAA,EAAEzG,UAAUK,IAAI0lB,EAAmBte,kBACjC,QAAjCoe,EAAiB,QAAjBnf,EAAAvI,KAAK0I,oBAAY,IAAAH,OAAA,EAAAA,EAAE8f,sBAAc,IAAAX,GAAAA,EAAE7lB,UAAUO,OAAOwlB,EAAmBhjB,gBAClC,QAArC8jB,EAAiB,QAAjBf,EAAA3nB,KAAK0I,oBAAY,IAAAif,OAAA,EAAAA,EAAEW,0BAAkB,IAAAI,GAAAA,EAAE7mB,UAAUO,OAAOwlB,EAAmBhjB,gBAEvEujB,IACe,QAAjBQ,EAAA3oB,KAAK0I,oBAAY,IAAAigB,GAAAA,EAAE/f,KAAK/G,UAAUK,IAAI0lB,EAAmBte,kBACxC,QAAjBsf,EAAA5oB,KAAK0I,oBAAY,IAAAkgB,GAAAA,EAAEhhB,OAAO/F,UAAUO,OAAOwlB,EAAmBhjB,gBACjC,QAA7BikB,EAAiB,QAAjBC,EAAA9oB,KAAK0I,oBAAY,IAAAogB,OAAA,EAAAA,EAAEL,kBAAU,IAAAI,GAAAA,EAAEhnB,UAAUO,OAAOwlB,EAAmBhjB,gBACnE5E,KAAKwoB,UAAYxoB,KAAK0I,cAErB1I,KAAK0I,aAKM,KADV7H,EAAQb,KAAKmJ,eAAe4f,UAAU,SAAApc,GAAM,OAAAA,EAAG/D,OAASjC,GAAQgG,EAAGmb,eAAiBnhB,KAEnE,QAAnBqiB,EAAAhpB,KAAKqN,sBAAc,IAAA2b,GAAAA,EAAE7nB,QAAQ,SAAAwF,GACzBA,EAAK9E,UAAUK,IAAI0lB,EAAmBza,sBAGvB,QAAnB8b,EAAAjpB,KAAKqN,sBAAc,IAAA4b,GAAAA,EAAE9nB,QAAQ,SAAAwF,GACzBA,EAAK9E,UAAUO,OAAOwlB,EAAmBza,sBAI3CtM,IAAUb,KAAKmJ,eAAelD,OAAS,EACxB,QAAfijB,EAAAlpB,KAAKsN,kBAAU,IAAA4b,GAAAA,EAAE/nB,QAAQ,SAAAwF,GACrBA,EAAK9E,UAAUK,IAAI0lB,EAAmBza,sBAG3B,QAAfgc,EAAAnpB,KAAKsN,kBAAU,IAAA6b,GAAAA,EAAEhoB,QAAQ,SAAAwF,GACrBA,EAAK9E,UAAUO,OAAOwlB,EAAmBza,sBAIjDnN,KAAK6J,oBAAqC,QAAjBuf,EAAAppB,KAAK0I,oBAAY,IAAA0gB,OAAA,EAAAA,EAAEtB,aAAc9nB,KAAKqpB,kBAC/DrpB,KAAK6J,oBAAqC,QAAjByf,EAAAtpB,KAAK0I,oBAAY,IAAA4gB,OAAA,EAAAA,EAAE1gB,KAAM5I,KAAKqK,YAGnDud,EAAA9mB,UAAArB,KAAR,WAAA,IAAAuB,EAAAhB,KAEI,GADAA,KAAKsK,kBACDtK,KAAKmJ,eAAelD,OAAS2hB,EAAmB9c,wBAIhD,OAHA9K,KAAKqI,YAAa,EAClBrI,KAAKqK,SAASxI,UAAUK,IAAI0lB,EAAmBhjB,qBAC/C5E,KAAKmJ,eAAiB,IAG1BkF,WAAW,WACPrN,EAAK+I,mBAAmB/I,EAAKqJ,WAC9B,GAEHrK,KAAKwH,eAAexH,KAAK2I,aAAa,GAAGC,MACzCvJ,EAAG0L,YAAYC,cAAcC,uBAAuBjL,KAAKkL,oBACrDlL,KAAK8lB,UACP,IAAInkB,eAAe,W,MACE,QAAbV,EAAAD,EAAK8kB,gBAAQ,IAAA7kB,GAAAA,EAAE+K,aAAehL,EAAKqoB,kBACnCroB,EAAK6I,oBAAqC,QAAjBtI,EAAAP,EAAK0H,oBAAY,IAAAnH,OAAA,EAAAA,EAAEumB,aAAc9mB,EAAKqoB,kBAC/DroB,EAAK+I,mBAAmB/I,EAAKqoB,kBAC7BroB,EAAK+I,mBAAmB/I,EAAKqJ,WAE/BrJ,EAAKknB,oBAER7lB,QAAQrC,KAAK8lB,UAIpBnmB,EAAE2H,UAAUiiB,MAAM,WACdvoB,EAAKwoB,YAAa,KAKhB5B,EAAA9mB,UAAAsnB,iBAAR,SAAyBrZ,G,QAEH,QAAjB9N,EAAAjB,KAAK0I,oBAAY,IAAAzH,GAAAA,EAAEonB,gBACpB1oB,EAAmB,QAAjB4B,EAAAvB,KAAK0I,oBAAY,IAAAnH,OAAA,EAAAA,EAAE8mB,gBAAgB3nB,WAAW,IAAAC,OAAItB,EAAAoqB,eAAeC,mBAAoBhJ,QAAQrhB,EAAAoqB,eAAeE,kBAAmB,CAC/Hjf,MAASqE,EAAQ1P,EAAAoqB,eAAeG,mBAAqBvqB,EAAAoqB,eAAeI,qBAGpD,QAAjB1nB,EAAAnC,KAAK0I,oBAAY,IAAAvG,GAAAA,EAAEyF,QACpBjI,EAAmB,QAAjB0E,EAAArE,KAAK0I,oBAAY,IAAArE,OAAA,EAAAA,EAAEuD,QAAQlH,WAAW,IAAAC,OAAItB,EAAAoqB,eAAeC,mBAAoBhJ,QAAQrhB,EAAAoqB,eAAeE,kBAAmB,CACvHjf,MAASqE,EAAQ1P,EAAAoqB,eAAeG,mBAAqBvqB,EAAAoqB,eAAeI,sBASlEjC,EAAA9mB,UAAA+I,oBAAR,SAA4BuI,EAAsC/H,GAC3D+H,GAAS/H,GAAqC,IAAzBA,EAAS2B,aAM/BhM,KAAKwpB,YACLpX,EAAK0X,eAAe,CAACC,SAAU,SAAUC,MAAO,UAAWC,OAAQ,YAMjErC,EAAA9mB,UAAAopB,iBAAR,SAAyBlhB,GAIvB,OAA8F,QAAvF/H,EAHsB0B,MAAMC,KACjC5C,KAAKmqB,QAAQrmB,iBAA8B,IAAAnD,OAAIilB,EAAoBa,kCAAiC,eAAA9lB,OAAcqI,EAAG,QAE1GlG,KAAK,SAAA8F,GAAQ,OAACA,EAAK5E,QAAQ,IAAArD,OAAIilB,EAAoBU,sCAA8B,IAAArlB,EAAAA,EAAI,MAG5F2mB,EAAA9mB,UAAA2I,YAAR,SAAoB7H,G,MAOlB,OAA+E,QAAxEX,EAAAjB,KAAKmJ,eAAerG,KAAK,SAAA6J,GAAM,OAAAA,EAAG/D,OAAShH,GAAM+K,EAAGmb,eAAiBlmB,WAAG,IAAAX,EAAAA,EACxEjB,KAAKmJ,eAAerG,KAAK,SAAA6J,GAAM,OAAM,MAAN/K,GAAc+K,EAAG3D,QAAqC,QAA3B/H,EAAAW,EAAG2I,aAAa,mBAAW,IAAAtJ,EAAAA,EAAI,UAG1F2mB,EAAA9mB,UAAA6H,aAAR,SAAqBK,GACnB,IAAMnI,EAAQb,KAAKmJ,eAAe4f,UAAU,SAAApc,GAAM,OAAAA,EAAG3D,MAAQA,IAC7D,GAAInI,EAAQ,GAAKA,EAAQb,KAAKmJ,eAAelD,OAAQ,EACnD,MAAM,IAAI2G,MAAM,gDAElB,OAAO5M,KAAKmJ,eAAetI,IAyCtB+mB,EAAA9mB,UAAAynB,UAAP,aA7QeX,EAAAte,iBAA2B,YAC3Bse,EAAAza,mBAA6B,cAC7Bya,EAAAhjB,eAAyB,cACzBgjB,EAAAzb,yBAAmC,SACnCyb,EAAA1b,oBAA8B,IAC9B0b,EAAA9c,wBAAkC,EAoTnD8c,GAtSE,SAAAA,EACYuC,EACArE,EACAzb,EACAgf,EACAjc,EACAC,EACAC,GAPZ,IAAAtM,EAAAhB,KACYA,KAAAmqB,QAAAA,EACAnqB,KAAA8lB,SAAAA,EACA9lB,KAAAqK,SAAAA,EACArK,KAAAqpB,iBAAAA,EACArpB,KAAAoN,MAAAA,EACApN,KAAAqN,eAAAA,EACArN,KAAAsN,WAAAA,EA5BLtN,KAAAqI,YAAsB,EAYrBrI,KAAAmJ,eAAkC,GAGlCnJ,KAAAoqB,YAAa,EAGbpqB,KAAAwpB,YAAa,EA2KbxpB,KAAAkL,mBAAkF,SAACwC,EAA4BC,GACnH3M,EAAKopB,YAAczc,EAAS0c,UAAU,MA2ClCrqB,KAAAsK,gBAAkB,W,MACxBtJ,EAAKmI,eAAiB,GACZ,QAAVlI,EAAAD,EAAKoM,aAAK,IAAAnM,GAAAA,EAAEE,QAAQ,SAACyM,G,IAIXhG,EACA6gB,EAEAX,EACAO,EACAC,EAEAgC,EACAC,EAEAliB,EAbF4B,EAA2B2D,EAAMrD,aAAa,aAAe,GAC9DvJ,EAAKmI,eAAeqhB,KAAK,SAAAppB,GAAK,OAAAA,EAAE4H,OAASiB,MAEtCrC,EAA6B5G,EAAKmpB,QAAQjmB,cAAc,IAAAvD,OAAIilB,EAAoBkB,+BAA8B,eAAAnmB,OAAcsJ,EAAS,OACrIwe,EAAiCznB,EAAKmpB,QAAQjmB,cAAc,IAAAvD,OAAIilB,EAAoBmB,oCAAmC,eAAApmB,OAAcsJ,EAAS,OAE9I6d,EAA4D,QAAb7mB,EAAAD,EAAK8kB,gBAAQ,IAAA7kB,OAAA,EAAAA,EAAEiD,cAAc,IAAAvD,OAAIilB,EAAoBa,kCAAiC,eAAA9lB,OAAcsJ,EAAS,OAC5Joe,EAA8D,QAAb9mB,EAAAP,EAAK8kB,gBAAQ,IAAAvkB,OAAA,EAAAA,EAAE2C,cAAc,IAAAvD,OAAIilB,EAAoBkB,+BAA8B,eAAAnmB,OAAcsJ,EAAS,OAC3Jqe,EAAkE,QAAbnmB,EAAAnB,EAAK8kB,gBAAQ,IAAA3jB,OAAA,EAAAA,EAAE+B,cAAc,IAAAvD,OAAIilB,EAAoBmB,oCAAmC,eAAApmB,OAAcsJ,EAAS,OAEpKqgB,EAAwC1iB,MAAAA,OAAM,EAANA,EAAQ1D,cAAc,cAC9DqmB,EAAgDlC,MAAAA,OAAc,EAAdA,EAAgBnkB,cAAc,cAE9EmE,EAAsBuF,EAAM/L,UAAUC,SAAS8lB,EAAmBza,oBACnEvF,IAAUS,GAGfrH,EAAKmI,eAAe8E,KAAK,CACrBjF,KAAMiB,EACNrB,KAAMgF,EACNhG,OAAQA,EACR6gB,WAAYA,MAAAA,EAAAA,OAAY1R,EAExB+Q,aAAcA,EACdO,eAAgBA,EAChBC,mBAAoBA,EACpBgC,MAAOA,EACPC,cAAeA,EACfvC,SAAUhnB,EAAKkpB,iBAAiBjgB,GAChCge,UAAWqC,KAAWC,QAiBzBvqB,KAAA+J,mBAAqB,SAACM,G,MACrB6D,EAAoB0Z,EAAmBhjB,eACxC5D,EAAKypB,WACNzpB,EAAKypB,SAAmB,OAARnjB,eAAQ,IAARA,cAAQ,EAARA,SAAUpD,cAAc,kDAC3B,QAAbjD,EAAAD,EAAKypB,gBAAQ,IAAAxpB,GAAAA,EAAEI,iBAAiB,QAAS,WAAM,OAAAL,EAAKunB,eAGrC,QAAnBhnB,EAAAP,EAAKqM,sBAAc,IAAA9L,GAAAA,EAAEJ,QAAQ,SAAAwF,GAC3BA,EAAK9E,UAAUK,IAAIgM,KAEN,QAAf/L,EAAAnB,EAAKsM,kBAAU,IAAAnL,GAAAA,EAAEhB,QAAQ,SAAAwF,GACvBA,EAAK9E,UAAUK,IAAIgM,KAEjBlN,EAAKopB,YACkB,EAArB/f,EAAS/E,WAAiB+E,EAASpI,aAAeoI,EAAS/E,UAAY+E,EAASrI,gBAC/D,QAAnBqC,EAAArD,EAAKqM,sBAAc,IAAAhJ,GAAAA,EAAElD,QAAQ,SAAAwF,GAC3BA,EAAK9E,UAAUO,OAAO8L,KAET,QAAf3J,EAAAvD,EAAKsM,kBAAU,IAAA/I,GAAAA,EAAEpD,QAAQ,SAAAwF,GACvBA,EAAK9E,UAAUO,OAAO8L,OAIA,EAAtB7D,EAASyB,YAAkBzB,EAAS2B,YAAc3B,EAASyB,WAAazB,EAAS8D,eAChE,QAAnB3J,EAAAxD,EAAKqM,sBAAc,IAAA7I,GAAAA,EAAErD,QAAQ,SAAAwF,GAC3BA,EAAK9E,UAAUO,OAAO8L,KAET,QAAf5F,EAAAtH,EAAKsM,kBAAU,IAAAhF,GAAAA,EAAEnH,QAAQ,SAAAwF,GACvBA,EAAK9E,UAAUO,OAAO8L,OAxR1BlO,KAAKP,QAzNb,CAAUJ,GAAAA,IAAE,ICAZ,SAAUA,GAKR,IAAAsgB,GAoBWA,EAAAlgB,KAAP,SAAYC,GACVC,EAAE,IAAAgB,OAAIgf,EAAqBC,qBAAuBlgB,GAAOE,KAAK,SAACiB,EAAef,GAC5E,IAAI6f,EAAqB7f,MA2DrB6f,EAAA7e,UAAA4pB,QAAR,W,UACI1qB,KAAK2qB,aAAsB,QAAP1pB,EAAAjB,KAAK4B,UAAE,IAAAX,OAAA,EAAAA,EAAE6C,iBAAiB,IAAAnD,OAAIgf,EAAqBiL,yBACvE5qB,KAAK6qB,cAAuB,QAAPtpB,EAAAvB,KAAK4B,UAAE,IAAAL,GAAAA,EAAE6D,QAAQ2a,YAAe+K,OAAOlQ,SAAgB,QAAPzY,EAAAnC,KAAK4B,UAAE,IAAAO,OAAA,EAAAA,EAAEiD,QAAQ2a,aAAiC,QAAjB1b,EAAArE,KAAK2qB,oBAAY,IAAAtmB,OAAA,EAAAA,EAAE4B,UAA4B,QAAjB1B,EAAAvE,KAAK2qB,oBAAY,IAAApmB,OAAA,EAAAA,EAAE0B,SAAU,EACjKjG,KAAK6f,SAAkB,QAAPrb,EAAAxE,KAAK4B,UAAE,IAAA4C,OAAA,EAAAA,EAAEY,QAAQya,SACjC7f,KAAK8f,gBAAyB,QAAPxX,EAAAtI,KAAK4B,UAAE,IAAA0G,OAAA,EAAAA,EAAElD,QAAQ0a,iBAGpCH,EAAA7e,UAAAiqB,OAAR,W,MACI/qB,KAAK0qB,UACE,QAAPzpB,EAAAjB,KAAK0D,UAAE,IAAAzC,GAAAA,EAAE+pB,YACF,QAAPzpB,EAAAvB,KAAK0D,UAAE,IAAAnC,GAAAA,EAAE0pB,gBAGLtL,EAAA7e,UAAArB,KAAR,WACIO,KAAKe,oBAGD4e,EAAA7e,UAAAC,iBAAR,W,MACmB,QAAfE,EAAAjB,KAAKkB,kBAAU,IAAAD,GAAAA,EAAEI,iBAAiB,QAASrB,KAAKsB,sBAjGtCqe,EAAA+B,aAAuB,8BAEvB/B,EAAAC,oBAA8B,iBAE9BD,EAAAuL,4BAAsC,0BAEtCvL,EAAAwL,2BAAqC,yBAErCxL,EAAAiL,uBAAiC,mBAEjCjL,EAAAyL,uBAAiC,oBAEjCzL,EAAA0L,wBAAkC,qBAElC1L,EAAA2L,0BAAoC,uBAEpC3L,EAAA5d,iBAA2B,yBAwF7C4d,GApEI,SAAAA,EACqBpc,GADrB,I,IAAAvC,EAAAhB,KACqBA,KAAAuD,KAAAA,EANbvD,KAAA6qB,aAAe,EAqEf7qB,KAAAsB,oBAAsB,SAACkC,GAC3BA,EAAEC,iBACFzC,EAAK0C,GAAG6nB,YA9DRvrB,KAAK4B,GAAK5B,KAAKuD,KACf,IAAMioB,EAAOxrB,KAYb,GAXAA,KAAKkB,WAAoB,QAAPD,EAAAjB,KAAK4B,UAAE,IAAAX,OAAA,EAAAA,EAAEiD,cAAc,IAAAvD,OAAIgf,EAAqBwL,6BAClEnrB,KAAK2qB,aAAsB,QAAPppB,EAAAvB,KAAK4B,UAAE,IAAAL,OAAA,EAAAA,EAAEuC,iBAAiB,IAAAnD,OAAIgf,EAAqBiL,yBACvE5qB,KAAK6qB,cAAuB,QAAP1oB,EAAAnC,KAAK4B,UAAE,IAAAO,GAAAA,EAAEiD,QAAQ2a,YAAe+K,OAAOlQ,SAAgB,QAAPvW,EAAArE,KAAK4B,UAAE,IAAAyC,OAAA,EAAAA,EAAEe,QAAQ2a,aAAiC,QAAjBxb,EAAAvE,KAAK2qB,oBAAY,IAAApmB,OAAA,EAAAA,EAAE0B,UAA4B,QAAjBzB,EAAAxE,KAAK2qB,oBAAY,IAAAnmB,OAAA,EAAAA,EAAEyB,SAAU,EACjKjG,KAAK6f,SAAkB,QAAPvX,EAAAtI,KAAK4B,UAAE,IAAA0G,OAAA,EAAAA,EAAElD,QAAQya,SACjC7f,KAAK8f,gBAAyB,QAAPvX,EAAAvI,KAAK4B,UAAE,IAAA2G,OAAA,EAAAA,EAAEnD,QAAQ0a,gBACxC9f,KAAKyrB,eAAwB,QAAP/D,EAAA1nB,KAAK4B,UAAE,IAAA8lB,OAAA,EAAAA,EAAExjB,cAAc,IAAAvD,OAAIgf,EAAqB2L,4BACtEtrB,KAAK0rB,YAAqB,QAAP/D,EAAA3nB,KAAK4B,UAAE,IAAA+lB,OAAA,EAAAA,EAAEzjB,cAAc,IAAAvD,OAAIgf,EAAqByL,yBACnEprB,KAAK2rB,aAA+B,QAAhBjD,EAAA1oB,KAAK0rB,mBAAW,IAAAhD,OAAA,EAAAA,EAAExkB,cAAc,IAAAvD,OAAIgf,EAAqB0L,0BAC7ErrB,KAAK4rB,gBAAyB,QAAPjD,EAAA3oB,KAAK4B,UAAE,IAAA+mB,OAAA,EAAAA,EAAEzkB,cAAc,IAAAvD,OAAIgf,EAAqBuL,gCAGlElrB,KAAKkB,YAAelB,KAAK4B,IAAO5B,KAAK2qB,cAAiB3qB,KAAKyrB,gBAAmBzrB,KAAK2rB,cACpF,MAAM,IAAI/e,MAAM,4BAEpB5M,KAAKsB,oBAAoBuqB,KAAK7rB,MAC9BA,KAAK+qB,OAAOc,KAAK7rB,MAEjBA,KAAK0D,GAAK,IAAIooB,EACV9rB,KAAK4B,GACL5B,KAAKkB,WACL,WAAM,OAAAF,EAAK2pB,cACX,WAAM,OAAA3pB,EAAK6pB,cACX7qB,KAAKyrB,eACLzrB,KAAK2rB,aACL3rB,KAAK4rB,gBACL,WAAM,OAAA5qB,EAAK6e,UACX,WAAM,OAAA7e,EAAK8e,iBACX,WAAM,OAAA9e,EAAK0pB,YAEf1qB,KAAKP,OACE,QAAPmpB,EAAA5oB,KAAK4B,UAAE,IAAAgnB,GAAAA,EAAEvnB,iBAAiBse,EAAqB+B,aAAc,SAACle,GAE1DgoB,EAAKT,WA5EJ1rB,EAAAsgB,qBAAoBA,EA6GjC,IAAAmM,GAuCYA,EAAAhrB,UAAArB,KAAR,WASIO,KAAKkL,mBAAmB,KAAM,IAAI7L,EAAA0sB,WAAW,UAAWD,EAAoBE,qBAC5E3sB,EAAG0L,YAAYC,cAAcC,uBAAuBjL,KAAKkL,qBAI9C4gB,EAAAE,iBAAf,W,MACU/mB,EAAgB1F,OAAOua,WAC7B,OAMuC,QANhC7Y,EAAA,CACL6qB,EAAoBG,mBACpBH,EAAoBI,iBACpBJ,EAAoBK,kBACpBL,EAAoBM,iBACpBN,EAAoBO,oBACpBvpB,KAAK,SAAAwpB,GAAa,OAASA,GAATrnB,WAAmB,IAAAhE,EAAAA,EAAI6qB,EAAoBO,oBAG5DP,EAAAhrB,UAAAkqB,UAAP,WACIhrB,KAAKusB,YAAc,GAmEhBT,EAAAhrB,UAAAyqB,SAAP,WACIvrB,KAAKusB,cACLvsB,KAAKwsB,kBACLxsB,KAAKirB,gBAYDa,EAAAhrB,UAAA0rB,gBAAR,WACI,IAAMC,EAAWzsB,KAAK8f,kBACtB,GAAK2M,EAAL,CAGA,IAEWxP,EAFLyP,EAASrtB,EAAGstB,UAAUC,mBAAmBvtB,EAAGstB,UAAUE,eAAeJ,IACvEK,EAAY,GAChB,IAAW7P,KAAOyP,GACVA,EAAOK,eAAe9P,IAAiB,MAARA,GAAeA,EAAI+P,YAAY,QAAU/P,EAAIhX,OAAS,IACrF6mB,EAAY7P,GAGf6P,IAGLJ,EAAOI,GAAa,GAAK9sB,KAAKusB,YAC9B/hB,QAAQiV,UAAU,GAAI,GAAIpgB,EAAGstB,UAAUM,SAASR,EAAUptB,EAAGstB,UAAUO,iBAAiBR,QAGrFZ,EAAAhrB,UAAAmqB,aAAP,WAAA,IAAAjqB,EAAAhB,KACIA,KAAKmtB,gBAAgBtrB,UAAUO,OAAOud,EAAqB5d,kBAC3D/B,KAAKkB,WAAWqI,OAChB,IAGUiW,EAHJ4N,IAA6C,QAAnBnsB,EAAAjB,KAAK2qB,sBAAc,IAAA1pB,OAAA,EAAAA,EAAEgF,SAAU,GAAK6C,KAAKI,IAAIlJ,KAAKusB,YAAcvsB,KAAKqtB,SAAUrtB,KAAK6qB,gBAC9GyC,EAAkBttB,KAAKusB,YAAcvsB,KAAKqtB,SAAYrtB,KAAK6qB,eAAiB7qB,KAAKqtB,SAClFD,IAAoBE,IACf9N,EAAMxf,KAAK6f,aAEb7f,KAAKkB,WAAWW,UAAUK,IAAI,WAC9BvC,EAAE0c,KAAKmD,EAAK,CAAClD,OAAQ,SAASC,KAAK,SAACC,G,IAC1BmB,GAAS,IAAIC,WAAYC,gBAAgBrB,EAAG,aAC5CmE,EAAwBhD,EAAOzZ,cAAc,IAAAvD,OAAIgf,EAAqBC,sBACxEe,IACA3f,EAAKmsB,gBAAgB/nB,QAAQ0P,KAAO6L,EAAEvb,QAAQ0P,KAC9C9T,EAAKmsB,gBAAgB/nB,QAAQya,SAAWc,EAAEvb,QAAQya,SAClD7e,EAAKmsB,gBAAgB/nB,QAAQ0a,gBAAkBa,EAAEvb,QAAQ0a,gBACzD9e,EAAKmsB,gBAAgB/nB,QAAQ2a,YAAcY,EAAEvb,QAAQ2a,aAEzD,IAAIgC,EAA0B,KACX,QAAnB9gB,EAAAD,EAAK2pB,sBAAc,IAAA1pB,GAAAA,EAAEE,QAAQ,SAACqC,GAE1B,QADAue,EAASve,EAAEc,iBAMXyd,GACApE,EAAO7Z,iBAAiB,IAAAnD,OAAIgf,EAAqBC,oBAAmB,MAAAjf,OAAKgf,EAAqBiL,yBAA0BzpB,QAAQ,SAACqC,GAC7Hue,MAAAA,GAAAA,EAAQE,YAAYze,GACpB,IAAM0e,EAAU,IAAIhM,MAAMgG,GAAGC,QAAQoE,oBACrC2B,EAAG1B,eAAiBhd,EACW,QAA/BvC,EAAAqG,SAASpD,cAAc,gBAAQ,IAAAjD,GAAAA,EAAEwgB,cAAcS,KAGvDlhB,EAAK0pB,UACL1pB,EAAKusB,iBACLvsB,EAAKE,WAAWW,UAAUO,OAAO,cAOzCpC,KAAKutB,kBAILzB,EAAAhrB,UAAAysB,eAAR,WAAA,I,IAAAvsB,EAAAhB,KACQa,EAAQ,EACR2sB,EAAgB,EACdC,EAAyBztB,KAAK6qB,gBAAkB7qB,KAAKqtB,UAAiC,IAArBrtB,KAAKusB,YACvEvsB,KAAK2qB,cACNpqB,QAAQ+R,IAAI,SAAUtS,MAEP,QAAnBiB,EAAAjB,KAAK2qB,sBAAc,IAAA1pB,GAAAA,EAAEE,QAAQ,SAAAusB,GACrB7sB,EAAQG,EAAKurB,YAAcvrB,EAAKqsB,UAChCG,IACAE,EAAQ7rB,UAAUO,OAAO0pB,EAAoBlnB,iBAE7C8oB,EAAQ7rB,UAAUK,IAAI4pB,EAAoBlnB,gBAE9C/D,MAGJb,KAAKyrB,eAAe/hB,UAAY1J,KAAK2tB,SAAS7f,QAAQ,oBAAqB,GAAG0f,GAAe1f,QAAQ,sBAAuB,GAAG9N,KAAK6qB,gBACpI7qB,KAAK2rB,aAAaiC,aAAa,MAAuB,IAAhBJ,EAAsB1kB,KAAKC,IAAI/I,KAAK6qB,eAAgB,IAAI3N,YAC1FsQ,GAAiBxtB,KAAK6qB,gBACtB7qB,KAAKkB,WAAWW,UAAUK,IAAI4pB,EAAoBlnB,gBAClD5E,KAAKyrB,eAAe/hB,UAAY1J,KAAK6tB,cAAc/f,QAAQ,sBAAuB,GAAG9N,KAAK6qB,iBAE1F7qB,KAAKkB,WAAWW,UAAUO,OAAO0pB,EAAoBlnB,gBAGrD5E,KAAK4rB,kBACP6B,EAAsC,QAApBlsB,EAAAvB,KAAK4rB,uBAAe,IAAArqB,GAAAA,EAAEM,UAAUK,IAAI4pB,EAAoBlnB,gBAAsC,QAApBzC,EAAAnC,KAAK4rB,uBAAe,IAAAzpB,GAAAA,EAAEN,UAAUO,OAAO0pB,EAAoBlnB,kBA9O9IknB,EAAAlnB,eAAyB,cAC1BknB,EAAAG,mBAA6B,KAC7BH,EAAAI,iBAA2B,KAC3BJ,EAAAK,kBAA4B,IAC5BL,EAAAM,iBAA2B,IAC3BN,EAAAO,mBAA6B,IA4O/CP,GApOI,SAAAA,EACqBqB,EACAjsB,EACAypB,EACAE,EACAY,EACAE,EACAC,EACA/L,EACAC,EACA4K,GAVrB,IAAA1pB,EAAAhB,KACqBA,KAAAmtB,gBAAAA,EACAntB,KAAAkB,WAAAA,EACAlB,KAAA2qB,aAAAA,EACA3qB,KAAA6qB,aAAAA,EACA7qB,KAAAyrB,eAAAA,EACAzrB,KAAA2rB,aAAAA,EACA3rB,KAAA4rB,gBAAAA,EACA5rB,KAAA6f,SAAAA,EACA7f,KAAA8f,gBAAAA,EACA9f,KAAA0qB,QAAAA,EAhBb1qB,KAAAqtB,SAAW,EACXrtB,KAAAusB,YAAsB,EACtBvsB,KAAA2tB,SAAkBhuB,EAAEK,KAAKkB,YAAY6a,KAAK,kBAAoB,2DAC9D/b,KAAA6tB,cAAuBluB,EAAEK,KAAKkB,YAAY6a,KAAK,sBAAwB,iEAwDvE/b,KAAAkL,mBAA4E,SAACwC,EAAyBC,GAC1G,IACImgB,EADAC,GAAkB,EAEtB,OAAQpgB,EAAS2e,WACb,KAAKR,EAAoBG,mBACvB6B,EAAS,EACN9sB,EAAKgtB,aAAyC,EAA1BhtB,EAAKgtB,YAAY/nB,SACtC6nB,EAASlT,SAAS5Z,EAAKgtB,YAAY,KAErCD,EAAS/sB,EAAKitB,eAAeH,GAC7B,MAEF,KAAKhC,EAAoBI,iBACvB4B,EAAS,EACN9sB,EAAKgtB,aAAyC,EAA1BhtB,EAAKgtB,YAAY/nB,SACtC6nB,EAASlT,SAAS5Z,EAAKgtB,YAAY,KAErCD,EAAS/sB,EAAKitB,eAAeH,GAC3B,MAEJ,KAAKhC,EAAoBK,kBACvB2B,EAAS,EACN9sB,EAAKgtB,aAAyC,EAA1BhtB,EAAKgtB,YAAY/nB,SACtC6nB,EAASlT,SAAS5Z,EAAKgtB,YAAY,KAErCD,EAAS/sB,EAAKitB,eAAeH,GAC7B,MAEF,KAAKhC,EAAoBM,iBACvB0B,EAAS,EACN9sB,EAAKgtB,aAAyC,EAA1BhtB,EAAKgtB,YAAY/nB,SACtC6nB,EAASlT,SAAS5Z,EAAKgtB,YAAY,KAErCD,EAAS/sB,EAAKitB,eAAeH,GAC7B,MAEF,KAAKhC,EAAoBO,mBACvByB,EAAS,EACN9sB,EAAKgtB,aAAyC,EAA1BhtB,EAAKgtB,YAAY/nB,SACtC6nB,EAASlT,SAAS5Z,EAAKgtB,YAAY,KAErCD,EAAS/sB,EAAKitB,eAAeH,GAC7B,MAEF,QACEA,EAAS,EACN9sB,EAAKgtB,aAAyC,EAA1BhtB,EAAKgtB,YAAY/nB,SACtC6nB,EAASlT,SAAS5Z,EAAKgtB,YAAY,KAErCD,EAAS/sB,EAAKitB,eAAeH,GAI/BC,GACA/sB,EAAKiqB,gBAIJjrB,KAAAiuB,eAA8C,SAACC,GACnD,IAAMC,EAAKntB,EAAKqsB,WAAWa,EAE3B,OADAltB,EAAKqsB,SAAWa,EACTC,GAtGRnuB,KAAKusB,YAAcY,EAAgB/nB,QAAQ0P,KAAOgW,OAAOlQ,SAASuS,EAAgB/nB,QAAQ0P,MAAQ9U,KAAKusB,aAAevsB,KAAKusB,YAC3HvsB,KAAKirB,aAAaY,KAAK7rB,MACvBA,KAAKutB,eAAe1B,KAAK7rB,MACzBA,KAAKurB,SAASM,KAAK7rB,MACnBA,KAAKkL,mBAAmB2gB,KAAK7rB,MAC1BL,EAAEwtB,GAAiBpR,KAAK,iBACzB/b,KAAKguB,YAAcruB,EAAEK,KAAKmtB,iBAAiBpR,KAAK,gBAElD/b,KAAKP,QArJf,CAAUJ,GAAAA,IAAE,I,6dCAZ,SAAUA,GAwBN,IAAA+uB,GAiBWA,EAAA3uB,KAAP,SAAYC,GACR,IAAI0uB,EAAuB1uB,EAAM,KAgB7B0uB,EAAAttB,UAAAutB,UAAR,WAAA,IAAArtB,EAAAhB,KACIA,KAAKuD,KAAMO,iBACP,IAAAnD,OAAIytB,EAAuBE,8BAA6B,4BAC1DntB,QAAQ,SAAAmO,GAAW,OAAAtO,EAAKutB,gBAAgBjf,KAE1CtP,KAAKuD,KAAMO,iBACP,IAAAnD,OAAIytB,EAAuBI,0BAAyB,4BACtDrtB,QAAQ,SAAAyH,GACNA,EAAKxD,QAAiB,QAAI,IAC1BwD,EAAKvH,iBAAiB,QAASL,EAAKytB,gBAIpCL,EAAAttB,UAAAytB,gBAAR,SAAwBjf,G,IAiBdof,EAhBAC,EAAarf,EAAQxL,iBAA8B,IAAAnD,OAAIytB,EAAuBI,4BAC9EznB,EAAOpE,MAAMC,KAAK+rB,GAAY7rB,KAAK,SAAAC,GAAK,OAACA,EAAElB,UAAUC,SAAS,gBAAsC,SAApBiB,EAAEgC,MAAM6pB,UACzF7nB,MAAAA,GAAAA,EAAM2d,KAEL7jB,EAAQb,KAAK6uB,IAAI5oB,OACvBqJ,EAAQlK,QAAmB,UAAI0pB,OAAOjuB,GAChC6C,EAAK,IAAIqrB,EAAsBzf,EAASvI,EAAK2d,GAAI1kB,KAAKgvB,kBAAkBnuB,IAC9Eb,KAAK6uB,IAAI5gB,KAAKvK,GAKRurB,EAAyB,QAAlBhuB,EAAAyJ,OADPA,EAAQ0jB,EAAuBc,kBACnB,EAALxkB,EAAOykB,KAAKtuB,UAAM,IAAAI,EAAAA,EAAIjB,KAAKovB,aAAa1rB,GACrDA,EAAG2rB,QAAQJ,GAAQvrB,EAAG5B,SAASmtB,EAAKrnB,QAAUqnB,EAAOvrB,EAAG4rB,YAGlDZ,EAAgB,QAAVntB,EAAAmJ,MAAAA,OAAK,EAALA,EAAOgkB,WAAG,IAAAntB,EAAAA,EAAI,CAAE+N,QAASzO,EAAOoF,OAAQ,GACpDuE,QAAQC,aAAY8kB,SAAAA,SAAA,GAAM/kB,QAAQE,OAAK,CAAE8kB,GAAIxvB,KAAKyvB,aAAaf,EAAIpf,QAASof,EAAIzoB,UAAW,MAuEvFmoB,EAAAttB,UAAA2e,UAAR,SAAkBiQ,EAAoBC,GAClCnlB,QAAQiV,UAAS8P,SAAAA,SAAA,GACR/kB,QAAQE,OAAK,CAAE8kB,GAAIxvB,KAAKyvB,aAAaC,EAAYC,KACtD,GACAvB,EAAuBwB,gBAAkB5vB,KAAK6uB,IAAIa,GAAYG,cAAcjoB,SAI5EwmB,EAAAttB,UAAA2uB,aAAR,SAAqBC,EAAoBC,GACrC,MAAO,CACHR,KAAMnvB,KAAK6uB,IAAInU,IAAI,SAAAhX,GAAM,OAAAA,EAAGmsB,gBAC5BnB,IAAK,CAAEpf,QAASogB,EAAYzpB,OAAQ0pB,KAK9BvB,EAAA0B,cAAd,SAA4BC,GAClBrL,EAAKqL,EAAK/pB,WAAWooB,EAAuBwB,iBAC5CG,EAAKC,MAAM5B,EAAuBwB,gBAAgB3pB,QAClD8pB,EAAKC,MAAM,GACjB,OAAOtL,EAAG1e,WAAWooB,EAAuB6B,eAAiBvL,EAAK,MAG9D0J,EAAAttB,UAAAsuB,aAAR,SAAqB1rB,GACjB,IAAMkE,EAASwmB,EAAuB0B,cAAcvwB,OAAOoL,SAASolB,MACpE,OAAOnoB,GAAUlE,EAAG5B,SAAS8F,GAAUlE,EAAGwsB,gBAAgBtoB,GAAU,MAGhEwmB,EAAAttB,UAAAqvB,UAAR,SAAkBvuB,GACR0N,EAAU1N,EAAGoC,QAAqB,IAAArD,OAAIytB,EAAuBE,gCACnE,OAAOhf,MAAAA,GAAAA,EAASlK,QAAmB,UAAI0lB,OAAOxb,EAAQlK,QAAmB,YAAM,GAGpEgpB,EAAAc,UAAf,W,IACUM,EAAkB,QAAbvuB,EAAAuJ,QAAQE,aAAK,IAAAzJ,OAAA,EAAAA,EAAEuuB,GAC1B,OAAOA,GAAM7sB,MAAMytB,QAAQZ,EAAGL,OAASK,EAAGd,IAAMc,EAAK,MAzK3CpB,EAAAI,0BAA4B,6BAC5BJ,EAAAE,8BAAgC,qCAChCF,EAAAiC,qBAAuB,oCACvBjC,EAAAkC,0BAA4B,yCAC5BlC,EAAAmC,yBAA2B,wCAC3BnC,EAAAoC,+BAAiC,+CAEvBpC,EAAA6B,cAAgB,OAChB7B,EAAAwB,gBAAkB,OAmK9CxB,GAxJI,SAAAA,EACqB7qB,GADrB,IAAAvC,EAAAhB,KAII,GAHiBA,KAAAuD,KAAAA,EAVJvD,KAAA6uB,IAA+B,GAGxC7uB,KAAAywB,YAA6B,KAqD7BzwB,KAAAyuB,YAAc,SAACjrB,G,IAKb3C,EAJA+H,EAAOpF,EAAEK,cACT6sB,EAAO9nB,EAAK2B,aAAa,QAC1BmmB,MAAAA,GAAAA,EAAM1qB,WAAW,OAEhBnF,EAAQG,EAAKmvB,UAAUvnB,GAExBlF,OADCA,EAAK1C,EAAK6tB,IAAIhuB,KACf6C,EAAI5B,SAAS4uB,EAAKV,MAAM,MAG7BxsB,EAAEC,iBACFC,EAAGitB,SAASD,EAAKV,MAAM,IACjBtB,EAAwC,QAAlCztB,EAAAmtB,EAAuBc,mBAAW,IAAAjuB,OAAA,EAAAA,EAAEytB,IAChD1tB,EAAKye,UAAU5e,GAAO6tB,MAAAA,OAAG,EAAHA,EAAKpf,WAAYzO,EAAQ6tB,EAAIzoB,OAAS,EAAI,MAG5DjG,KAAAgvB,kBAAoB,SAACnuB,GAAkB,OAAA,SAACgI,G,IACtCnF,EAAK1C,EAAK6tB,IAAIhuB,GACd+vB,EAAQltB,EAAGmtB,cAAgBhoB,EAC3B6lB,EAAwC,QAAlCztB,EAAAmtB,EAAuBc,mBAAW,IAAAjuB,OAAA,EAAAA,EAAEytB,KAE5CA,MAAAA,OAAG,EAAHA,EAAKpf,WAAYzO,GAAS+vB,GAASlC,EAAIzoB,QAIvCjF,EAAKyvB,YAAclxB,OAAOuxB,QAC1BtmB,QAAQumB,IAAIH,KAGZltB,EAAGstB,WAAWnoB,GACd7H,EAAKye,UAAU5e,EAAO,MAItBb,KAAAixB,WAAa,WACjB,IAAMvmB,EAAQ0jB,EAAuBc,YACrCluB,EAAK6tB,IAAI1tB,QAAQ,SAACuC,EAAI7C,GAClB,IAMUouB,EANNvkB,GACMukB,EAAOvkB,EAAMykB,KAAKtuB,GACxB6C,EAAG2rB,QAAQJ,GAAQvrB,EAAG5B,SAASmtB,EAAKrnB,QAAUqnB,EAAOvrB,EAAG4rB,cAIlDL,EAAOjuB,EAAKouB,aAAa1rB,KACrBA,EAAG2rB,QAAQJ,KAI7B,IAMUiC,EANJT,EAAczvB,EAAKyvB,YACL,OAAhBA,IACAzvB,EAAKyvB,YAAc,KAIbS,EAAO,WACT3xB,OAAO+b,oBAAoB,aAAc4V,GACzC3xB,OAAOiN,SAASjN,OAAO4xB,QAASV,IAEpClxB,OAAO8B,iBAAiB,aAAc6vB,GACtCzuB,sBAAsByuB,MAtGrBlxB,KAAKuD,KACN,MAAM,IAAIqJ,MAAM,4BAGpB5M,KAAKoxB,SAAW,IAAIC,iBAAiB,WAAM,OAAArwB,EAAKqtB,cAChDruB,KAAKoxB,SAAS/uB,QAAQrC,KAAKuD,KAAM,CAAE+tB,WAAW,EAAMC,SAAS,IAC7DhyB,OAAO8B,iBAAiB,WAAYrB,KAAKixB,YA/BpC5xB,EAAA+uB,uBAAsBA,EA+KnC,IAAAW,GAmBWA,EAAAjuB,UAAAgB,SAAP,SAAgB4iB,GACZ,QAAS1kB,KAAKwxB,QAAQ9M,IAGnBqK,EAAAjuB,UAAA+uB,YAAP,WACI,MAAO,CAAEjoB,OAAQ5H,KAAKiI,QAASwpB,MAAKC,cAAA,GAAM1xB,KAAKwK,SAAO,KAGnDukB,EAAAjuB,UAAAwuB,SAAP,WACI,MAAO,CAAE1nB,OAAQ5H,KAAK2xB,OAAQF,MAAO,KAGlC1C,EAAAjuB,UAAA+vB,YAAP,WACI,OAAO7wB,KAAKwK,QAAQvE,QAGjB8oB,EAAAjuB,UAAA6vB,SAAP,SAAgBiB,GACZ5xB,KAAKwK,QAAQyD,KAAKjO,KAAKiI,SACvBjI,KAAK6xB,KAAKD,IAGP7C,EAAAjuB,UAAAkwB,WAAP,SAAkBnoB,GACd,IAAM+oB,EAAW5xB,KAAKwK,QAAQ3B,GAC9B7I,KAAKwK,QAAUxK,KAAKwK,QAAQwlB,MAAM,EAAGnnB,GACrC7I,KAAK6xB,KAAKD,IAGP7C,EAAAjuB,UAAAuuB,QAAP,SAAeJ,GAAf,IAAAjuB,EAAAhB,KACIA,KAAKwK,QAAUykB,EAAKwC,MAAM1tB,OAAO,SAAA2gB,GAAM,OAAA1jB,EAAKc,SAAS4iB,KACrD1kB,KAAK6xB,KAAK5C,EAAKrnB,SAIZmnB,EAAAjuB,UAAAovB,gBAAP,SAAuB0B,GAGnB,IAFA,IAAMH,EAAkB,GACpB/M,EAAKkN,EACFlN,IAAO1kB,KAAK2xB,QAAUF,EAAMxrB,OAASjG,KAAKmvB,OAAOlpB,QAAQ,CAC5D,IAAM2C,EAAO5I,KAAKsP,QAAQpL,cACtB,IAAAvD,OAAIytB,EAAuBI,0BAAyB,cAAA7tB,OAAa+jB,EAAE,OAEjEoN,EAASlpB,MAAAA,OAAI,EAAJA,EAAM5E,QAAqB,IAAArD,OAAIytB,EAAuBI,4BACrE,GAAKsD,MAAAA,IAAAA,EAAQpN,GAAI,MACjBA,EAAKoN,EAAOpN,GACZ+M,EAAMM,QAAQrN,GAElB,MAAO,CAAE9c,OAAQgqB,EAAUH,MAAKA,IAG5B1C,EAAAjuB,UAAA+wB,KAAR,SAAaD,GACT,IAEMI,EAFApqB,EAAS5H,KAAKwxB,QAAQI,GACvBhqB,IACCoqB,EAAUJ,IAAa5xB,KAAKiI,QAClCjI,KAAKiI,QAAU2pB,EACf5xB,KAAKiyB,QAAQrqB,EAAQoqB,GACrBhyB,KAAKkyB,qBAGDnD,EAAAjuB,UAAAquB,KAAR,WACI,OAAOxsB,MAAMC,KAAK5C,KAAKsP,QAAQxL,iBAA8B,IAAAnD,OAAIytB,EAAuBI,8BAGpFO,EAAAjuB,UAAA0wB,QAAR,SAAgB9M,GACZ,OAAO1kB,KAAKmvB,OAAOrsB,KAAK,SAAAC,GAAK,OAAAA,EAAE2hB,KAAOA,KAGlCqK,EAAAjuB,UAAAmxB,QAAR,SAAgBrqB,EAAqBoqB,GACjChyB,KAAKmvB,OAAOhuB,QAAQ,SAAA4B,GAAOA,EAAEgC,MAAM6pB,QAAU,SAC7ChnB,EAAO7C,MAAM6pB,QAAU,QAClBhnB,EAAO6H,YACZ,IAAM0iB,EAAQvqB,EAAO1D,cAA6B,OAC9CiuB,IACAA,EAAMptB,MAAME,MAAQ,OACpBktB,EAAMptB,MAAM0H,OAAS,QAEzBlN,OAAOkiB,cAAc,IAAIvL,MAAM,WAE/B,IAAMqH,EAAU5d,EAAEiI,GAEdoqB,GAAWzU,EAAQ6U,SAAS,yCAC5B7yB,OAAO8O,WAAW,W,MACdhP,EAAGoX,SAAS4b,uBAA8C,QAAvBpxB,EAAA2G,EAAOxC,QAAe,aAAC,IAAAnE,EAAAA,EAAE,GAAI,IAChEtB,EAAE,SAAS+gB,QAAQrhB,EAAGizB,aAAaC,cAAehV,MAKtDwR,EAAAjuB,UAAAoxB,iBAAR,WAAA,IAIU9kB,EACAolB,EALVxxB,EAAAhB,KACUyyB,EAAMzyB,KAAKsP,QAAQpL,cAA2B,IAAAvD,OAAIytB,EAAuBiC,wBAC1EoC,GAAOzyB,KAAKmvB,OAAOlpB,OAAS,IAE3BmH,EAAQqlB,EAAI3uB,iBAA8B,IAAAnD,OAAIytB,EAAuBkC,4BACrEkC,EAAOC,EAAI3uB,iBAA8B,IAAAnD,OAAIytB,EAAuBmC,2BAE1EnjB,EAAMjM,QAAQ,SAAA4L,GAAOA,EAAElL,UAAUK,IAAI,eAAgB6K,EAAElL,UAAUO,OAAOgsB,EAAuBoC,gCAAiCzjB,EAAE2lB,gBAAgB,oBAClJF,EAAKrxB,QAAQ,SAAAwf,GAAK,OAAAA,EAAE9e,UAAUK,IAAI,iBAElCuwB,EAAI1tB,MAAM6pB,QAAU,OAEpB5uB,KAAKwK,QAAQrJ,QAAQ,SAACujB,EAAI3X,G,IAChBpG,EAAOyG,EAAML,GACdpG,IACLA,EAAK9E,UAAUO,OAAO,eACtBuE,EAAKvB,QAAkB,SAAIsf,EAC3B/d,EAAK+U,YAAc1a,EAAK2xB,SAASjO,GAC1B,QAAPzjB,EAAAuxB,EAAKzlB,UAAE,IAAA9L,GAAAA,EAAEY,UAAUO,OAAO,mBAGxBylB,EAAcza,EAAMpN,KAAKwK,QAAQvE,WAEnC4hB,EAAYhmB,UAAUO,OAAO,eAC7BylB,EAAYhmB,UAAUK,IAAIksB,EAAuBoC,gCACjD3I,EAAYnM,YAAc1b,KAAK2yB,SAAS3yB,KAAKiI,YAI7C8mB,EAAAjuB,UAAA6xB,SAAR,SAAiBjO,G,MACb,OAAyC,QAAlCnjB,EAAgB,QAAhBN,EAAAjB,KAAKwxB,QAAQ9M,UAAG,IAAAzjB,OAAA,EAAAA,EAAEmE,QAAe,aAAC,IAAA7D,EAAAA,EAAImjB,GAErDqK,GApII,SAAAA,EACqBzf,EACAqiB,EACjB3C,GAHJ,IAAAhuB,EAAAhB,KACqBA,KAAAsP,QAAAA,EACAtP,KAAA2xB,OAAAA,EALb3xB,KAAAwK,QAAoB,GAQxBxK,KAAKiI,QAAU0pB,EACyD,QAAxE1wB,EAAAqO,EAAQpL,cAAc,IAAAvD,OAAIytB,EAAuBiC,8BAAuB,IAAApvB,GAAAA,EAClEI,iBAAiB,QAAS,SAACmC,G,IACnBmD,EAAQnD,EAAEoE,OAAuB5D,QAAqB,oBACtD6E,EAAclC,EAAO3F,EAAKwJ,QAAQ2U,QAAgC,QAAxBle,EAAA0F,EAAKvB,QAAkB,gBAAC,IAAAnE,EAAAA,EAAI,KAAO,GAC9D,IAAjB4H,GAAoBmmB,EAAkBnmB,MAtN9D,CAAUxJ,GAAAA,IAAE,ICAZ,SAAUA,GAKR,IAAAuzB,GAgBWA,EAAAnzB,KAAP,SAAYC,GACVC,EAAE,IAAAgB,OAAIiyB,EAAiCntB,sBAAwB/F,GAAOE,KAAK,SAACiB,EAAef,GACzF,IAAI8yB,EAAiC9yB,MA6BjC8yB,EAAA9xB,UAAArB,KAAR,WACIO,KAAKe,oBAGD6xB,EAAA9xB,UAAAC,iBAAR,WAAA,I,EAAAC,EAAAhB,KACoB,QAAhBiB,EAAAjB,KAAKsG,mBAAW,IAAArF,GAAAA,EAAEI,iBAAiB,QAASrB,KAAKuG,mBACrC,QAAZhF,EAAAvB,KAAKwG,eAAO,IAAAjF,GAAAA,EAAEF,iBAAiB,QAASrB,KAAKyG,eACzB,QAApBtE,EAAAnC,KAAK0G,uBAAe,IAAAvE,GAAAA,EAAEhB,QAAQ,SAACwF,GAC3BA,EAAKtF,iBAAiB,QAASL,EAAK4F,kBArD9BgsB,EAAAntB,qBAA+B,0BAC/BmtB,EAAA3rB,gCAA0C,sCAC1C2rB,EAAA/sB,qCAA+C,cAE/C+sB,EAAA1rB,kCAA4C,oCAC5C0rB,EAAAzrB,8BAAwC,oCAmE1DyrB,GApDI,SAAAA,EACqBhxB,GADrB,IAAAZ,EAAAhB,KAQI,GAPiBA,KAAA4B,GAAAA,EAoCb5B,KAAA4G,cAAgB,SAACpD,GACrBA,EAAEC,iBACFzC,EAAK0C,GAAG8D,eAAehE,EAAEK,gBAGrB7D,KAAAuG,kBAAoB,SAAC/C,GACzBA,EAAEC,iBACFzC,EAAK0C,GAAG+D,YAGJzH,KAAAyG,cAAgB,SAACjD,GACrBA,EAAEC,iBACFzC,EAAK0C,GAAGgE,QA9CR1H,KAAK2F,WAAoB,QAAP1E,EAAAjB,KAAK4B,UAAE,IAAAX,OAAA,EAAAA,EAAEiD,cAAc,IAAAvD,OAAIiyB,EAAiC3rB,kCAC9EjH,KAAK0G,gBAAiC,QAAfnF,EAAAvB,KAAK2F,kBAAU,IAAApE,OAAA,EAAAA,EAAEuC,iBAAiB,IAAAnD,OAAIiyB,EAAiC/sB,uCAC9F7F,KAAKsG,YAAqB,QAAPnE,EAAAnC,KAAK4B,UAAE,IAAAO,OAAA,EAAAA,EAAE+B,cAAc,IAAAvD,OAAIiyB,EAAiC1rB,oCAC/ElH,KAAKwG,QAAiB,QAAPnC,EAAArE,KAAK4B,UAAE,IAAAyC,OAAA,EAAAA,EAAEH,cAAc,IAAAvD,OAAIiyB,EAAiCzrB,iCAEtEnH,KAAK2F,WACN,MAAM,IAAIiH,MAAM,4BAGpB5M,KAAK0D,GAAK,IAAI0E,EACVpI,KAAK2F,WACL3F,KAAK0G,gBACL1G,KAAKsG,YACLtG,KAAKwG,SAGJxG,KAAK0D,GAAG2E,YACTrI,KAAKP,OA1CJJ,EAAAuzB,iCAAgCA,EAoF7C,IAAAxqB,GA+BWA,EAAAtH,UAAA2G,SAAP,WACI,IAAKzH,KAAK0I,aACN,OAAO1I,KAAKwH,eAAexH,KAAK2I,aAAa,GAAGC,MAEpD,IAAMC,EAAsBC,KAAKC,IAAI,EAAG/I,KAAK0I,aAAaM,IAAM,GAC1DC,EAA8BjJ,KAAK2I,aAAaE,GACtD7I,KAAKwH,eAAeyB,EAAaL,OAI9BR,EAAAtH,UAAA4G,KAAP,WACI,IAAK1H,KAAK0I,aACN,OAAO1I,KAAKwH,eAAexH,KAAK2I,aAAa,GAAGC,MAEpD,IAAMC,EAAsBC,KAAKI,IAAIlJ,KAAKmJ,eAAelD,OAAS,EAAGjG,KAAK0I,aAAaM,IAAM,GACvFI,EAA0BpJ,KAAK2I,aAAaE,GAClD7I,KAAKwH,eAAe4B,EAASR,OAI1BR,EAAAtH,UAAA0G,eAAP,SAAsBb,EAA+B0C,QAAA,IAAAA,IAAAA,GAAA,GAE7CrJ,KAAK0I,eACL1I,KAAK0I,aAAaE,KAAK/G,UAAUO,OAAOgG,EAA4BkB,kBACnD,QAAjBrI,EAAAjB,KAAK0I,oBAAY,IAAAzH,GAAAA,EAAE2G,OAAO/F,UAAUO,OAAOgG,EAA4BkB,kBACvEtJ,KAAK0I,aAAaE,KAAKW,QAG3BvJ,KAAK0I,aAAe1I,KAAKyJ,YAAY9C,GACpB,QAAjBpF,EAAAvB,KAAK0I,oBAAY,IAAAnH,GAAAA,EAAEqH,KAAK/G,UAAUK,IAAIkG,EAA4BkB,kBACjD,QAAjBnH,EAAAnC,KAAK0I,oBAAY,IAAAvG,GAAAA,EAAEyF,OAAO/F,UAAUK,IAAIkG,EAA4BkB,kBACpEtJ,KAAK6J,oBAAoB7J,KAAK0I,eAG1BN,EAAAtH,UAAArB,KAAR,WAKI,GAJAO,KAAKoK,iBAAmBpK,KAAKqK,SAASpI,aACtCjC,KAAKsK,kBACLtK,KAAKwH,eAAexH,KAAK2I,aAAa,GAAGC,MAErC5I,KAAKmJ,eAAelD,OAASmC,EAA4B0C,wBAIzD,OAHA9K,KAAKqI,YAAa,OAElBrI,KAAKmJ,eAAiB,IAI1B5J,OAAO8B,iBAAiB,SAAUhC,EAAG+L,SAASpL,KAAKqL,WAAY,KAC/D,IAAMC,EAAoD,QAAbrK,EAAAjB,KAAKqK,gBAAQ,IAAApJ,OAAA,EAAAA,EAAEiD,cAAc,IAAAvD,OAAIyH,EAA4BkB,mBACtGgC,GACAtL,KAAKwH,eAAe8D,GAExBtL,KAAK+J,qBACL/J,KAAKqK,SAAShJ,iBAAiB,SAAUhC,EAAG+L,SAASpL,KAAKuL,yBAA0B,IAAK,CAACC,SAAS,KAQ/FpD,EAAAtH,UAAA+I,oBAAR,SAA4BlD,GACxB,IAMM8E,EACFC,EACAC,EARChF,IAGCiF,EAAgC,EAAXjF,EAAKqC,IAAUhJ,KAAKoK,iBAAmB,EAC5DyB,EAAsBlF,EAAKqC,IAAMhJ,KAAKmJ,eAAelD,OAAQ,EAAIjG,KAAKoK,iBAAmB,EAEzFqB,EAAsBzL,KAAKqK,SAASyB,WACtCJ,EAAuB/E,EAAKiC,KAAKmD,WAAaH,EAAaH,EAC3DE,EAAwBhF,EAAKiC,KAAKmD,WAAapF,EAAKiC,KAAKoD,YAAchM,KAAKqK,SAAS2B,YAAcH,EAAcJ,EAEjHC,EAAe,IACf1L,KAAKiM,oBAAsBR,EAAc3C,KAAKI,IAAI,EAAGwC,IAErC,EAAhBC,IACA3L,KAAKiM,oBAAsBR,EAAc3C,KAAKC,IAAI,EAAG4C,IAGrD3L,KAAKqK,SAASyB,aAAe9L,KAAKiM,qBAClCtM,EAAEK,KAAKqK,UAAUhF,QAAQ,CACrByG,WAAY9L,KAAKiM,qBAErB7D,EAA4B8D,oBAC5B9D,EAA4B+D,4BAK5B/D,EAAAtH,UAAAgJ,gBAAR,SAAwBnD,GACpB,IAAM/E,EAAqB0F,SAASC,iBAC/B3F,GAGLjC,EAAEiC,GAAIyD,QAAQ,CACVC,UAAWqB,MAAAA,OAAI,EAAJA,EAAM4F,gBAErBnE,EAA4B8D,oBAC5B9D,EAA4BsE,0BAGxBtE,EAAAtH,UAAA2I,YAAR,SAAoB7H,GAChB,OAAO5B,KAAKmJ,eAAerG,KAAK,SAAA6J,GAAM,OAAAA,EAAG/D,OAAShH,KAG9CwG,EAAAtH,UAAA6H,aAAR,SAAqBK,GACjB,GAAIA,EAAM,GAAKA,EAAMhJ,KAAKmJ,eAAelD,OAAQ,EAC7C,MAAM,IAAI2G,MAAM,gDAEpB,OAAO5M,KAAKmJ,eAAeH,IAGvBZ,EAAAtH,UAAA+L,gBAAR,SAAwB1H,GACpB,OAAOnF,KAAKmJ,eAAerG,KAAK,SAAAiK,GAC5B,OAAOA,EAAER,gBAAkBpH,GAClB4H,EAAEC,aAAe7H,KA7InBiD,EAAAkB,iBAA2B,YAC3BlB,EAAA+E,mBAA6B,cAC7B/E,EAAAxD,eAAyB,cACzBwD,EAAAyqB,eAAyB,YACzBzqB,EAAA+D,yBAAmC,SACnC/D,EAAAsE,wBAAkC,QAClCtE,EAAA8D,oBAA8B,IAC9B9D,EAAA0C,wBAAkC,EA+LnD1C,GAzLE,SAAAA,EACYiC,EACA+C,EACAC,EACAC,GAJZ,IAAAtM,EAAAhB,KACYA,KAAAqK,SAAAA,EACArK,KAAAoN,MAAAA,EACApN,KAAAqN,eAAAA,EACArN,KAAAsN,WAAAA,EAnBLtN,KAAAqI,YAAsB,EAWrBrI,KAAAmJ,eAAkC,GAClCnJ,KAAAiM,oBAA8B,EAC9BjM,KAAAoK,iBAA2B,EAuE3BpK,KAAAuL,yBAA2B,WAC/BvK,EAAKiL,oBAAsBjL,EAAKqJ,SAASyB,WACzC9K,EAAK+I,sBA6DD/J,KAAAqL,WAAa,WACjBrK,EAAK+I,qBACL/I,EAAKsJ,mBAGDtK,KAAAsK,gBAAkB,W,MACtBtJ,EAAKmI,eAAiB,GACtB,IAAIH,EAAc,EACR,QAAV/H,EAAAD,EAAKoM,aAAK,IAAAnM,GAAAA,EAAEE,QAAQ,SAACyM,GACjB,IAAM3D,EAA2B2D,EAAMrD,aAAa,SAAW,GACzD3C,EAA6BN,SAASuG,eAAe5D,EAAU6D,QAAQ,QAAS,KAChFzF,EAAsBuF,EAAM/L,UAAUC,SAASsG,EAA4B+E,oBAC5EvF,IAAUS,IAGT0F,EAAiB1O,EAAG2O,gBAAgBpG,GAAU5G,EAAKoJ,iBACzDpJ,EAAKmI,eAAe8E,KAAK,CACrBjF,IAAKA,IACLJ,KAAMgF,EACNhG,OAAQA,EACR2E,eAAgBwB,EAChBf,aAAce,EAASnG,EAAO9C,wBAAwB2H,aAK1DzM,KAAA+J,mBAAqB,W,QACnBmE,EAAoB9F,EAA4BxD,eAGtD,GAAI5D,EAAKqJ,SAAS8D,cAAgBnN,EAAKqJ,SAAS2B,YAG5C,OAFmB,QAAnB/K,EAAAD,EAAKqM,sBAAc,IAAApM,GAAAA,EAAEY,UAAUK,IAAIgM,QACpB,QAAf3M,EAAAP,EAAKsM,kBAAU,IAAA/L,GAAAA,EAAEM,UAAUK,IAAIgM,IAKJ,EAA3BlN,EAAKiL,oBACc,QAAnB9J,EAAAnB,EAAKqM,sBAAc,IAAAlL,GAAAA,EAAEN,UAAUO,OAAO8L,GAEnB,QAAnB7J,EAAArD,EAAKqM,sBAAc,IAAAhJ,GAAAA,EAAExC,UAAUK,IAAIgM,GAIvC,IAAME,EAAwBpN,EAAKqJ,SAAS8D,YAAcnN,EAAKqJ,SAAS2B,YAAc,EAClFhL,EAAKiL,oBAAsBmC,EACZ,QAAf7J,EAAAvD,EAAKsM,kBAAU,IAAA/I,GAAAA,EAAE1C,UAAUO,OAAO8L,GAEnB,QAAf1J,EAAAxD,EAAKsM,kBAAU,IAAA9I,GAAAA,EAAE3C,UAAUK,IAAIgM,IA7KrClO,KAAKP,QAjHb,CAAUJ,GAAAA,IAAE,ICAZ,SAAUA,GAER,IAAAyzB,GAOWA,EAAArzB,KAAP,SAAYC,GACVC,EAAE,IAAAgB,OAAImyB,EAAqBC,gBAAkBrzB,GAAOE,KAAK,SAACiB,EAAef,GACvE,IAAIgzB,EAAqBhzB,MAkBrBgzB,EAAAhyB,UAAArB,KAAR,WACIO,KAAKe,oBAGD+xB,EAAAhyB,UAAAC,iBAAR,WAAA,IAAAC,EAAAhB,KAEEsH,SAASjG,iBAAiB,SAAUrB,KAAKgzB,eAAgB,CACvDxnB,SAAS,IAEXnM,EAAG0L,YAAYC,cAAcC,uBAAuB,WAClDoD,WAAW,WACTrN,EAAKgyB,kBACJ,OAGLzzB,OAAO8B,iBAAiB,SAAUrB,KAAKizB,eAAgB,CACrDznB,SAAS,IAEXnM,EAAG0L,YAAYC,cAAcC,uBAAuB,WAClDoD,WAAW,WACTrN,EAAKiyB,kBACJ,QA/COH,EAAAC,eAAyB,mBAEzBD,EAAAI,6BAAuC,kCAEvCJ,EAAAK,sBAAgC,wBAuDlDL,GAzCI,SAAAA,EAA6BlxB,GAA7B,IAAAZ,EAAAhB,KAA6BA,KAAA4B,GAAAA,EAFrB5B,KAAA0D,GAA6C,KAmC7C1D,KAAAgzB,eAA6B,W,MAC5B,QAAP/xB,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAEmyB,gBAGHpzB,KAAAizB,eAA6B,W,MAC5B,QAAPhyB,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAEoyB,gBApCTrzB,KAAKszB,kBAAoBtzB,KAAK4B,GAAGsC,cAAc,IAAAvD,OAAImyB,EAAqBI,+BACxElzB,KAAK6G,eAAiB7G,KAAK4B,GAAGsC,cAAc,IAAAvD,OAAImyB,EAAqBK,wBACrEnzB,KAAK0D,GAAK,IAAI6vB,EAAoBvzB,KAAK4B,GAAI5B,KAAKszB,kBAAmBtzB,KAAK6G,gBACxE7G,KAAKP,OAxBEJ,EAAAyzB,qBAAoBA,EA+DjC,IAAAS,GA2BYA,EAAAzyB,UAAArB,KAAR,W,IASU+zB,EARJxzB,KAAKyzB,aACPzzB,KAAK0zB,mBAAqB1zB,KAAKyzB,WAAWzvB,QAAQ,IAAArD,OAAI4yB,EAAoBI,sBAC1E3zB,KAAK4zB,gBAAkB5zB,KAAKyzB,WAAWzvB,QAAQ,IAAArD,OAAI4yB,EAAoBM,+BAErE7zB,KAAK6G,iBACP7G,KAAKkK,iBAAmBlK,KAAK6G,eAAe7C,QAAQ,IAAArD,OAAI4yB,EAAoBO,+BAE1E9zB,KAAKyzB,aACDD,EAA2E,QAAvBvyB,EAAAjB,KAAK0zB,0BAAkB,IAAAzyB,OAAA,EAAAA,EAAEqD,cAC/EtE,KAAK0zB,qBACP1zB,KAAK+zB,qBAAuB/zB,KAAK6G,eAAkB7G,KAAK6G,eAAesJ,aAAenQ,KAAKmF,OAAU,KAAMquB,MAAAA,OAAwB,EAAxBA,EAA0BpO,YAAa,GAAKplB,KAAK0zB,mBAAmBtO,UAC/KplB,KAAKyzB,WAAW1uB,MAAMQ,IAAM,GAAA5E,OAAGX,KAAK+zB,oBAAmB,SAMtDR,EAAAzyB,UAAAsyB,aAAP,W,IAKYY,EAWMC,EA0BNC,EACAC,EAeEC,EACAC,EA1DPh1B,EAAG0L,YAAYC,cAAciC,SA4E5BjN,KAAK6G,gBACH7G,KAAKkK,mBACPlK,KAAKkK,iBAAiBrI,UAAUO,OAAOmxB,EAAoBe,wBAC3Dt0B,KAAKkK,iBAAiBnF,MAAME,MAAQ,GACpCjF,KAAKkK,iBAAiBnF,MAAM0H,OAAS,KA/EnC8nB,EAAev0B,KAAKw0B,OAAOrkB,cAC1BnQ,KAAK6G,gBAAkB7G,KAAKyzB,YAE3BO,EAAgBh0B,KAAKyzB,WAAWtjB,aAIhB,GAFhBkkB,EAAkBr0B,KAAK+G,KAAKzB,UAAYtF,KAAKw0B,OAAOpP,YAGpDiP,EAAkBL,EAAgBO,GAEpCv0B,KAAKyzB,WAAW1uB,MAAMQ,IAAM,MACxBvF,KAAK4zB,kBACP5zB,KAAK4zB,gBAAgB/xB,UAAUK,IAAIqxB,EAAoBkB,8BAEjDR,EAAc10B,OAAOsb,iBAAiB7a,KAAK4zB,gBAAgBtvB,eAEjEtE,KAAK4zB,gBAAgB7uB,MAAME,MAAQ,GAAAtE,SAAsC,QAAlCM,EAAAjB,KAAK4zB,gBAAgBtvB,qBAAa,IAAArD,OAAA,EAAAA,EAAE+K,cAAe,GAAK0oB,WAAWT,EAAYU,aAAeD,WAAWT,EAAYW,cAAa,MACzK50B,KAAK4zB,gBAAgB7uB,MAAM0H,OAAS,GAAA9L,SAAsC,QAAlCY,EAAAvB,KAAK4zB,gBAAgBtvB,qBAAa,IAAA/C,OAAA,EAAAA,EAAEyK,cAAe,GAAK0oB,WAAWT,EAAYY,YAAcH,WAAWT,EAAYa,eAAc,SAY9K90B,KAAKyzB,WAAW1uB,MAAMQ,IAAM,GAAA5E,OAAGX,KAAK+zB,oBAAmB,MACnD/zB,KAAK4zB,kBACP5zB,KAAK4zB,gBAAgB/xB,UAAUO,OAAOmxB,EAAoBkB,8BAC1Dz0B,KAAK4zB,gBAAgB7uB,MAAME,MAAQ,OACnCjF,KAAK4zB,gBAAgB7uB,MAAM0H,OAAS,SAGpCzM,KAAKw0B,SACPx0B,KAAKw0B,OAAOzvB,MAAMgwB,UAAY,GAAAp0B,OAAGX,KAAKyzB,WAAWtjB,aAAY,QAEtDnQ,KAAK6G,iBACRqtB,EAA6Bl0B,KAAK6G,eAAe/B,wBAAwBS,IAAMvF,KAAK6G,eAAesJ,aACnGgkB,IAAuC,QAAfhyB,EAAAnC,KAAKyzB,kBAAU,IAAAtxB,OAAA,EAAAA,EAAE2C,wBAAwBS,MAAO,KAAqB,QAAflB,EAAArE,KAAKyzB,kBAAU,IAAApvB,OAAA,EAAAA,EAAE8L,eAAgB,MAA6C,QAApC3L,EAAqB,QAArBD,EAAAvE,KAAKkK,wBAAgB,IAAA3F,OAAA,EAAAA,EAAED,qBAAa,IAAAE,OAAA,EAAAA,EAAEM,wBAAwBS,MAAO,GAAK,IAEpM2uB,GAA8B,GAAKl0B,KAAKyzB,WAC1CzzB,KAAK6G,eAAe9B,MAAMiwB,QAAU,IACL,EAAtBb,IACTn0B,KAAK6G,eAAe9B,MAAMiwB,QAAU,IACpCh1B,KAAK6G,eAAe9B,MAAMQ,IAAM,OAO9B4uB,GAAuB,GACzBn0B,KAAK6G,eAAe9B,MAAMiwB,QAAU,IAC9BZ,EAAeG,EAAev0B,KAAKw0B,OAAOpP,WAC1CiP,EAAkBvrB,KAAKC,IAAI/I,KAAK+G,KAAKzB,UAAYtF,KAAKi1B,aAAej1B,KAAK6G,eAAesJ,aAAc,IAEvFikB,EAChBp0B,KAAKkK,mBACLlK,KAAKkK,iBAAiBrI,UAAUK,IAAIqxB,EAAoBe,wBACxDt0B,KAAKkK,iBAAiBnF,MAAME,MAAQ,GAAAtE,OAAGX,KAAKkK,iBAAiB5F,cAAe0H,YAAc0oB,WAAW7Z,iBAAiB7a,KAAKkK,iBAAiB5F,eAAgBqwB,aAAeD,WAAW7Z,iBAAiB7a,KAAKkK,iBAAiB5F,eAAgBswB,cAAa,OAGvO,QAArBtsB,EAAAtI,KAAKkK,wBAAgB,IAAA5B,GAAAA,EAAEzG,UAAUO,OAAOmxB,EAAoBe,yBAG5Dt0B,KAAKkK,kBACPlK,KAAKkK,iBAAiBrI,UAAUO,OAAOmxB,EAAoBe,2BAqB9Df,EAAAzyB,UAAAuyB,aAAP,W,IAGY6B,EACAC,EAHL91B,EAAG0L,YAAYC,cAAciC,UAC5BjN,KAAK6G,gBAAkB7G,KAAKyzB,aACxByB,EAAUl1B,KAAK6G,eAAe/B,wBAC9BqwB,EAAgC,QAAfl0B,EAAAjB,KAAKyzB,kBAAU,IAAAxyB,OAAA,EAAAA,EAAE6D,wBAExBowB,EAAQ3vB,IAAM4vB,EAAeC,QAAUF,EAAQE,OAASD,EAAe5vB,KAGrFvF,KAAK6G,eAAe9B,MAAMiwB,QAAU,IACpCz0B,QAAQ+R,IAAI,aAEZtS,KAAK6G,eAAe9B,MAAMiwB,QAAU,IAEpCh1B,KAAKozB,kBArJEG,EAAAI,oBAA8B,kBAC9BJ,EAAAO,4BAAsC,yBACtCP,EAAAe,uBAAiC,eACjCf,EAAAkB,6BAAuC,0BACvClB,EAAAM,4BAAsC,0BAsJzDN,GAzII,SAAAA,EACUiB,EACAf,EACA5sB,GAHV,IAAA7F,EAAAhB,KACUA,KAAAw0B,OAAAA,EACAx0B,KAAAyzB,WAAAA,EACAzzB,KAAA6G,eAAAA,EAdF7G,KAAA+G,KAAoBO,SAASC,iBAM7BvH,KAAAmF,OAAiB,GACjBnF,KAAAi1B,aAAuB,GAEvBj1B,KAAA+zB,oBAAsB,EAM1B1lB,WAAW,WACPrN,EAAKvB,QACF,KA1FjB,CAAUJ,GAAAA,IAAE,I,ICmBFA,G,qnDCnBV,SAAUA,GAsBN,IAAAg2B,GA8BWA,EAAA51B,KAAP,SAAYC,GACR,IAAI21B,EAAsB31B,EAAM,KAwB5B21B,EAAAv0B,UAAArB,KAAR,WACIO,KAAKe,oBAGDs0B,EAAAv0B,UAAAC,iBAAR,W,MAEc,QAAVE,EAAAjB,KAAK+V,aAAK,IAAA9U,GAAAA,EAAEI,iBAAiB,QAASrB,KAAKs1B,SACjC,QAAV/zB,EAAAvB,KAAK+V,aAAK,IAAAxU,GAAAA,EAAEF,iBAAiB,QAASrB,KAAKu1B,SACjC,QAAVpzB,EAAAnC,KAAK+V,aAAK,IAAA5T,GAAAA,EAAEd,iBAAiB,UAAWrB,KAAKw1B,WAEnC,QAAVnxB,EAAArE,KAAKqV,aAAK,IAAAhR,GAAAA,EAAEhD,iBAAiB,QAASrB,KAAKy1B,SAChC,QAAXlxB,EAAAvE,KAAK01B,cAAM,IAAAnxB,GAAAA,EAAElD,iBAAiB,QAASrB,KAAK21B,UAC3B,QAAjBnxB,EAAAxE,KAAK41B,oBAAY,IAAApxB,GAAAA,EAAEnD,iBAAiB,QAASrB,KAAK61B,gBAErC,QAAbvtB,EAAAtI,KAAK81B,gBAAQ,IAAAxtB,GAAAA,EAAEjH,iBAAiB,QAASrB,KAAK+1B,iBACjC,QAAbxtB,EAAAvI,KAAK81B,gBAAQ,IAAAvtB,GAAAA,EAAElH,iBAAiB,YAAarB,KAAKg2B,iBACrC,QAAbtO,EAAA1nB,KAAK81B,gBAAQ,IAAApO,GAAAA,EAAErmB,iBAAiB,aAAcrB,KAAKi2B,iBACzC,QAAVtO,EAAA3nB,KAAKk2B,aAAK,IAAAvO,GAAAA,EAAEtmB,iBAAiB,WAAYrB,KAAKm2B,YAE9C7uB,SAASjG,iBAAiB,QAASrB,KAAKo2B,iBAAiB,IAuDrDf,EAAAv0B,UAAAu1B,OAAR,SAAenW,GACLvZ,EAAoC,QAA7B1F,EAACif,EAAMtY,cAAsB,IAAA3G,OAAA,EAAAA,EAAE+C,QAAQ,IAAArD,OAAI00B,EAAsBiB,iBAE9E,OAAO3vB,IAASA,EAAK3C,QAAQ,IAAArD,OAAI00B,EAAsBkB,0BAA6B5vB,EAAO,MA2CvF0uB,EAAAv0B,UAAA8M,MAAR,W,MACI,OAAwB,QAAjBrM,EAAU,QAAVN,EAAAjB,KAAK+V,aAAK,IAAA9U,OAAA,EAAAA,EAAE2M,aAAK,IAAArM,EAAAA,EAAI,IA9KlB8zB,EAAAmB,iBAA2B,kBAC3BnB,EAAAoB,gBAA0B,yBAC1BpB,EAAAqB,gBAA0B,yBAC1BrB,EAAAsB,gBAA0B,yBAC1BtB,EAAApd,iBAA2B,0BAE3Bod,EAAAuB,mBAA6B,uBAC7BvB,EAAAwB,gBAA0B,8BAC1BxB,EAAAiB,eAAyB,6BACzBjB,EAAAkB,wBAAkC,sCAClClB,EAAAyB,wBAAkC,sCAElCzB,EAAA0B,YAAsB,IAEtB1B,EAAA2B,SAAmB,gBAkKrC3B,GAhJI,SAAAA,EAA6B9xB,GAA7B,I,EAAAvC,EAAAhB,KAA6BA,KAAAuD,KAAAA,EANrBvD,KAAA0D,GAA8C,KAiD9C1D,KAAAs1B,QAAU,W,MACP,QAAPr0B,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAE4J,OAAO7J,EAAK4M,UAGjB5N,KAAAu1B,QAAU,W,MACP,QAAPt0B,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAEg2B,UAAS,GAElB13B,OAAOyX,aAAahW,EAAKk2B,YACzBl2B,EAAKk2B,WAAa33B,OAAO8O,WAAW,W,MAC1BwC,EAAO7P,EAAK4M,QAAQjE,OACnB,QAAP1I,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAE4J,OAAO7J,EAAK4M,SACjBiD,EAAK5K,QAAUkxB,EAAqBC,kBACpC/3B,EAAGoX,SAASG,oBAAoB/F,IAErCwkB,EAAsB0B,cAGrB/2B,KAAA21B,SAAW,W,MACfp2B,OAAOyX,aAAahW,EAAKk2B,YAClB,QAAPj2B,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAE4J,OAAO7J,EAAK4M,SAAS,IAG1B5N,KAAAy1B,QAAU,W,MACP,QAAPx0B,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAEo2B,aACF,QAAP91B,EAAAP,EAAK0C,UAAE,IAAAnC,GAAAA,EAAEsJ,OAAO,KAGZ7K,KAAA61B,eAAiB,SAAC3V,GACtBA,EAAMzc,iBACC,QAAPxC,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAE20B,gBAGL51B,KAAA+1B,gBAAkB,SAAC7V,G,MACjBvZ,EAAO3F,EAAKq1B,OAAOnW,GAErBvZ,GACO,QAAP1F,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAEq2B,WAAW3wB,EAAMuZ,IAI1BlgB,KAAAg2B,gBAAkB,SAAC9V,G,MACjBvZ,EAAO3F,EAAKq1B,OAAOnW,GAErBvZ,GACO,QAAP1F,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAEs2B,SAAS5wB,IAIlB3G,KAAAi2B,gBAAkB,W,MACf,QAAPh1B,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAEu2B,eASLx3B,KAAAo2B,gBAAkB,SAAClW,G,IACjBuX,EAAqB,QAAVx2B,EAAAD,EAAKk1B,aAAK,IAAAj1B,EAAAA,EAAID,EAAKY,GAE/B61B,MAAAA,GAAAA,EAAU31B,SAASoe,EAAMtY,SACnB,QAAPrG,EAAAP,EAAK0C,UAAE,IAAAnC,GAAAA,EAAEgX,SAITvY,KAAAm2B,WAAa,SAACjW,G,IACZxY,EAAOwY,EAAMwX,eAEfhwB,GAAmB,QAAVzG,EAAAD,EAAKk1B,aAAK,IAAAj1B,GAAAA,EAAEa,SAAS4F,IACvB,QAAPnG,EAAAP,EAAK0C,UAAE,IAAAnC,GAAAA,EAAEgX,SAITvY,KAAAw1B,UAAY,SAACtV,G,QAEjB,OAAQA,EAAMjD,KACV,IAAK,YACDiD,EAAMzc,iBACC,QAAPxC,EAAAD,EAAK0C,UAAE,IAAAzC,GAAAA,EAAE02B,WAAW,GACpB,MACJ,IAAK,UACDzX,EAAMzc,iBACC,QAAPlC,EAAAP,EAAK0C,UAAE,IAAAnC,GAAAA,EAAEo2B,YAAY,GACrB,MACJ,IAAK,QACU,QAAPx1B,EAAAnB,EAAK0C,UAAE,IAAAvB,GAAAA,EAAEy1B,eACT1X,EAAMzc,iBAENzC,EAAK20B,WAET,MACJ,IAAK,SACM,QAAPtxB,EAAArD,EAAK0C,UAAE,IAAAW,GAAAA,EAAEkU,UAtIjBvY,KAAK4B,GAAc,QAATX,EAAAjB,KAAKuD,YAAI,IAAAtC,GAAAA,EAAEY,UAAUC,SAASuzB,EAAsBoB,iBACxDz2B,KAAKuD,KACI,QAAThC,EAAAvB,KAAKuD,YAAI,IAAAhC,OAAA,EAAAA,EAAE2C,cAAc,IAAAvD,OAAI00B,EAAsBoB,kBAEzDz2B,KAAKk2B,MAAQl2B,KAAK4B,GAClB5B,KAAK+V,MAAe,QAAP5T,EAAAnC,KAAK4B,UAAE,IAAAO,OAAA,EAAAA,EAAE+B,cAAc,IAAAvD,OAAI00B,EAAsBqB,kBAC9D12B,KAAKqV,MAAe,QAAPhR,EAAArE,KAAK4B,UAAE,IAAAyC,OAAA,EAAAA,EAAEH,cAAc,IAAAvD,OAAI00B,EAAsBsB,kBAC9D32B,KAAK01B,OAAgB,QAAPnxB,EAAAvE,KAAK4B,UAAE,IAAA2C,OAAA,EAAAA,EAAEL,cAAc,IAAAvD,OAAI00B,EAAsBpd,mBAC/DjY,KAAK81B,SAAkB,QAAPtxB,EAAAxE,KAAK4B,UAAE,IAAA4C,OAAA,EAAAA,EAAEN,cAAc,IAAAvD,OAAI00B,EAAsBuB,qBACjE52B,KAAK41B,aAAsB,QAAPttB,EAAAtI,KAAK4B,UAAE,IAAA0G,OAAA,EAAAA,EAAEpE,cAAc,IAAAvD,OAAI00B,EAAsByB,0BAEhE92B,KAAK4B,IAAO5B,KAAK+V,OAAU/V,KAAK81B,WAIrC91B,KAAK0D,GAAK,IAAIyzB,EAAqBn3B,KAAK4B,GAAI5B,KAAK+V,MAAO/V,KAAK81B,UAC7D91B,KAAKP,QApDAJ,EAAAg2B,sBAAqBA,EAsLlC,I,EAAA8B,GAsCiBA,EAAAr2B,UAAA+J,OAAb,SAAoBgtB,EAAeC,G,kBAAA,IAAAA,IAAAA,GAAA,G,iHAM/B,OAJMC,EAAUF,EAAMluB,OAEtB3J,KAAK2c,YAAW,GAEXob,EAAQ9xB,QAQT8xB,EAAQ9xB,OAASkxB,EAAqBC,kBACtCp3B,KAAKg4B,UAAU,QACf,CAAA,KAGEC,IAAUj4B,KAAKk4B,WAErBl4B,KAAK2c,YAAW,GAEC,CAAA,EAAM3c,KAAK63B,MAAME,EAASD,MAhBjCK,EAAUn4B,KAAKo4B,cAErBp4B,KAAKq4B,YAAY,UAAWF,GAC5Bn4B,KAAKg4B,UAAUG,EAAQlyB,OAAS,UAAY,SAC5C,CAAA,I,OAcJ,OAFMqyB,EAAW/zB,EAAAg0B,OAEbN,IAAUj4B,KAAKk4B,YACf,CAAA,IAGJl4B,KAAK2c,YAAW,IAEVvP,EAAsB,QAAd7L,EAAA+2B,EAASlrB,aAAK,IAAA7L,EAAAA,EAAI,IAErB0E,OAMP6xB,GAA+B,SAAlBQ,EAASE,MAAmBprB,EAAM,GAAGsjB,MAC5C+H,EAAGlJ,SAAAA,SAAA,GAAQniB,EAAM,IAAE,CAAEsrB,KAAMX,IAEjC/3B,KAAK24B,SAASF,GACdz4B,KAAK44B,SAASH,EAAK,mBACnB,CAAA,EAAMz4B,KAAK64B,OAAOJ,KALlB,CAAA,EAAA,IALAz4B,KAAKuY,QACLvY,KAAKi3B,SAASa,GACd,CAAA,K,OASA,OADAvzB,EAAAg0B,OACA,CAAA,G,cAGAT,IACMgB,EAAQ1rB,EAAM,GACpBpN,KAAK44B,SAAQrJ,SAAAA,SAAA,GAAMuJ,GAAK,CAAEzb,KAAM,GAAA1c,OAAgB,QAAbwB,EAAA22B,EAAMC,eAAO,IAAA52B,EAAAA,EAAI,IAAExB,OAAc,QAAX0D,EAAAy0B,EAAME,aAAK,IAAA30B,EAAAA,EAAI,IAAE1D,OAAGm4B,EAAMzb,QAAU,oBAGjGrd,KAAKq4B,YAAY,UAAWjrB,EAAO2qB,GACnC/3B,KAAKg4B,UAAU,W,UAGZb,EAAAr2B,UAAAk3B,UAAP,SAAiB3a,GAEbrd,KAAKi5B,SAAS93B,QAAQ,SAAA+3B,GAClBA,EAAMr3B,UAAUkX,OAAOoe,EAAqB/nB,iBAAkB8pB,EAAM9zB,QAAe,QAAMiY,KAG7Frd,KAAK81B,SAASj0B,UAAUO,OAAO+0B,EAAqB/nB,kBACpDpP,KAAK+V,MAAM6X,aAAa,gBAAiB,QAEzC5tB,KAAKm5B,UAAmB,YAAT9b,EAAqB,GAAK,IAGtC8Z,EAAAr2B,UAAAyX,MAAP,WACIvY,KAAK2c,YAAW,GAChB3c,KAAKm5B,WAAW,GAChBn5B,KAAK81B,SAASj0B,UAAUK,IAAIi1B,EAAqB/nB,kBACjDpP,KAAK+V,MAAM6X,aAAa,gBAAiB,UAGtCuJ,EAAAr2B,UAAAm2B,SAAP,SAAgBmC,GACZp5B,KAAK4B,GAAGC,UAAUkX,OAAOoe,EAAqBkC,oBAAqBD,IAGhEjC,EAAAr2B,UAAA6b,WAAP,SAAkB2c,GACdt5B,KAAK4B,GAAGC,UAAUkX,OAAOoe,EAAqBoC,qBAAsBD,IAGjEnC,EAAAr2B,UAAAu2B,WAAP,WACIr3B,KAAK+V,MAAMnI,MAAQ,GACnB5N,KAAK+V,MAAMyjB,QACXx5B,KAAKi3B,UAAS,IAGXE,EAAAr2B,UAAA62B,WAAP,SAAkBxyB,GAEd,IAAMiI,EAAQpN,KAAKy5B,eAEdrsB,EAAMnH,SAIPjG,KAAK05B,YAAc,EACnB15B,KAAKm5B,UAAmB,EAATh0B,EAAa,EAAIiI,EAAMnH,OAAS,GAInDjG,KAAKm5B,UAAUrwB,KAAKI,IAAIJ,KAAKC,IAAI/I,KAAK05B,YAAcv0B,EAAQ,GAAIiI,EAAMnH,OAAS,MAG5EkxB,EAAAr2B,UAAA02B,YAAP,WACIx3B,KAAKm5B,WAAW,IAGbhC,EAAAr2B,UAAAy2B,SAAP,SAAgB5wB,GAEN9F,EAAQb,KAAKy5B,eAAeta,QAAQxY,GAE7B,GAAT9F,GACAb,KAAKm5B,UAAUt4B,IAIhBs2B,EAAAr2B,UAAA82B,aAAP,WACI,IAAMjxB,EAAO3G,KAAKy5B,eAAez5B,KAAK05B,aAEtC,QAAK/yB,IAIL3G,KAAK25B,gBAAuC,IAArB35B,KAAK05B,YAAoB,kBAAoB,iBACpE/yB,EAAKizB,UACL55B,KAAK25B,qBAAkB5iB,KAIpBogB,EAAAr2B,UAAAw2B,WAAP,SAAkBuC,EAAmB3Z,G,IAE3BvZ,EAAO3G,KAAK85B,SAASD,GAE3B75B,KAAK24B,SAAShyB,GACd3G,KAAK44B,SAASjyB,EAA0B,QAApBpF,EAAAvB,KAAK25B,uBAAe,IAAAp4B,EAAAA,EAAI,kBAExCoF,EAAK+pB,MAAQ/pB,EAAK+xB,OAClBxY,EAAMzc,iBACDzD,KAAK64B,OAAOlyB,KAIXwwB,EAAAr2B,UAAA+3B,OAAd,SAAqBlyB,G,uHAEbA,EAAKozB,UAAYpzB,EAAK+xB,MAChBsB,EAAS1yB,SAAS2yB,gBAAgBC,MAAQ,KAEhDl6B,KAAK2c,YAAW,GAEhB,CAAA,EAAMtd,EAAA86B,cAAcC,cAAcJ,EAAQrzB,EAAKozB,SAAUpzB,EAAK+xB,KAAM/xB,EAAKozB,YALzE,CAAA,EAAA,G,OAKAx4B,EAAAg3B,O,wBAGJh5B,OAAOoL,SAAS0vB,OAAO1zB,EAAK+pB,M,UAGxByG,EAAAr2B,UAAA83B,SAAR,SAAiBH,EAAsBniB,GACnCjX,EAAGoX,SAASC,oBAAoB,CAC5B4jB,SAAU,KACV3jB,cAAeL,EACfikB,eAAgB9B,EAAIpb,KACpBmd,iBAAkB/B,EAAIsB,SACtBU,iBAAkBhC,EAAIC,KACtBgC,mBAAoBjC,EAAIkC,aACzBh7B,EAAEK,KAAK4B,IAAK,WAGZu1B,EAAAr2B,UAAA63B,SAAP,SAAgBthB,GAAhB,IAAArW,EAAAhB,KAEUid,EAAMjd,KAAK46B,aAAavjB,GACxB7M,EAAUxK,KAAKo4B,cAAcr0B,OAAO,SAAA82B,GAAU,OAAA75B,EAAK45B,aAAaC,KAAY5d,IAElFzS,EAAQunB,QAAQ1a,GAChBrX,KAAK86B,aAAatwB,EAAQwlB,MAAM,EAAGmH,EAAqB4D,eAGrD5D,EAAAr2B,UAAA80B,aAAP,WACI51B,KAAK86B,aAAa,IAClB96B,KAAKg4B,UAAU,UAGLb,EAAAr2B,UAAA+2B,MAAd,SAAoBA,EAAeC,G,0GAGpB,O,sBAAA,CAAA,EAAMX,EAAqB6D,cAAcnD,EAAOC,I,OAAvD,MAAA,CAAA,EAAO31B,EAAAo2B,Q,OAEP,O,SAAA,CAAA,EAAO,CAAE0C,SAAS,EAAOzC,KAAM,OAAQprB,MAAO,K,uBAuBvC+pB,EAAA+D,MAAf,SAAqB3W,EAAcsT,GAE/B,IAAMh3B,EAAQg3B,EAAQtT,EAAK4W,cAAchc,QAAQ0Y,EAAMsD,gBAAkB,EAEzE,OAAe,IAAXt6B,EACO,CAAC0jB,EAAM,GAAI,IAGf,CAACA,EAAKyL,MAAM,EAAGnvB,GAAQ0jB,EAAKyL,MAAMnvB,EAAOA,EAAQg3B,EAAM5xB,QAASse,EAAKyL,MAAMnvB,EAAQg3B,EAAM5xB,UAG5FkxB,EAAAr2B,UAAAu3B,YAAR,SAAoB+C,EAA6BhuB,EAA0ByqB,GAA3E,IAAA72B,EAAAhB,UAA2E,IAAA63B,IAAAA,EAAA,IAEvE,IAAMqB,EAAQl5B,KAAKk5B,MAAMkC,GACnB1hB,EAAOwf,MAAAA,OAAK,EAALA,EAAOh1B,cAAc,IAAAvD,OAAIw2B,EAAqBkE,kBAEtD3hB,GAAS1Z,KAAKs7B,eAInB5hB,EAAK2H,UAAY,GACjBjU,EAAMjM,QAAQ,SAAAwF,GAAQ,OAAA+S,EAAKuI,YAAYjhB,EAAKu6B,WAAW50B,EAAMkxB,OAEvDxY,EAAQ6Z,MAAAA,OAAK,EAALA,EAAOh1B,cAAc,IAAAvD,OAAIw2B,EAAqBqE,qBAGxDnc,EAAM3D,YAAcoT,OAAO1hB,EAAMnH,WAIjCkxB,EAAAr2B,UAAAy6B,WAAR,SAAmB50B,EAAuBkxB,QAAA,IAAAA,IAAAA,EAAA,IAEtC,IAAMgC,EAAwB,QAAjBt4B,EAAAvB,KAAKs7B,oBAAY,IAAA/5B,OAAA,EAAAA,EAAE6e,WAAU,GAE1CyZ,EAAKh4B,UAAUO,OAAO+0B,EAAqB7tB,kBAC3CuwB,EAAKjM,aAAa,OAAiB,QAATzrB,EAAAwE,EAAK+pB,YAAI,IAAAvuB,EAAAA,EAAI,MAEvC,IAAMs5B,EAAQ5B,EAAK31B,cAAc,IAAAvD,OAAIw2B,EAAqBuE,uBAEtDD,GAAS90B,EAAK80B,OACdA,EAAM7N,aAAa,MAAOjnB,EAAK80B,OAG7B1C,EAAUc,EAAK31B,cAAc,IAAAvD,OAAIw2B,EAAqBwE,yBAExD5C,IACAA,EAAQrd,YAA0B,QAAZrX,EAAAsC,EAAKoyB,eAAO,IAAA10B,EAAAA,EAAI,IAG1C,IAAM20B,EAAQa,EAAK31B,cAAc,IAAAvD,OAAIw2B,EAAqByE,uBAEtD5C,IACAA,EAAMtd,YAAwB,QAAVnX,EAAAoC,EAAKqyB,aAAK,IAAAz0B,EAAAA,EAAI,IAGtC,IAAMs3B,EAAUhC,EAAK31B,cAAc,IAAAvD,OAAIw2B,EAAqB2E,yBAkB5D,OAhBID,IACAA,EAAQngB,YAAc/U,EAAK0W,MAG3B1W,EAAK+xB,OACLmB,EAAKz0B,QAAiB,QAAIuB,EAAK+xB,MAG/B/xB,EAAKg0B,cACLd,EAAKz0B,QAAwB,eAAIuB,EAAKg0B,aAG1C36B,KAAK+7B,YAAYlC,EAAM1C,EAAqB6E,yBAA0Br1B,EAAKozB,SAAUlC,GACrF73B,KAAK+7B,YAAYlC,EAAM1C,EAAqB8E,sBAAuBt1B,EAAKu1B,QACxEl8B,KAAK+7B,YAAYlC,EAAM1C,EAAqBgF,0BAA2Bx1B,EAAKu1B,YAASnlB,EAAYpQ,EAAK+xB,MAE/FmB,GAGH1C,EAAAr2B,UAAAi7B,YAAR,SAAoBlC,EAAmBhhB,EAAmBjL,EAA2BiqB,G,IAE3EuE,EAAOvC,EAAK31B,cAAc,IAAAvD,OAAIkY,IAE/BujB,IAIAxuB,GAKC2W,EAAiC,QAA1BhjB,EAAA66B,EAAKl4B,cAAc,eAAO,IAAA3C,EAAAA,EAAI66B,EACpCC,GAADl6B,EAAyB01B,EAAQV,EAAqB+D,MAAMttB,EAAOiqB,GAAS,CAACjqB,EAAO,GAAI,KAAjF,GAAEorB,EAAK72B,EAAA,GAAEm6B,EAAKn6B,EAAA,GAE3BoiB,EAAK7I,YAAc2gB,EAEdrD,KAICuD,EAASj1B,SAASk1B,cAAc,WAE/B3jB,UAAY,GAAAlY,OAAGw2B,EAAqByE,qBAAoB,8DAC/DW,EAAO7gB,YAAcsd,EAErBzU,EAAKtC,YAAYsa,GACjBhY,EAAKtC,YAAY3a,SAASm1B,eAAeH,MAnBrCF,EAAKh6B,WAsBL+0B,EAAAr2B,UAAAq4B,UAAR,SAAkBt4B,GAEd,IAAMuM,EAAQpN,KAAKy5B,eAInB,GAFArsB,EAAMjM,QAAQ,SAAAwF,GAAQ,OAAAA,EAAK9E,UAAUO,OAAO+0B,EAAqB7tB,qBAE5D8D,EAAMnH,QAAUpF,EAAQ,EAGzB,OAFAb,KAAK05B,aAAe,OACpB15B,KAAK+V,MAAM2c,gBAAgB,yBAI/B1yB,KAAK05B,YAAc5wB,KAAKI,IAAIrI,EAAOuM,EAAMnH,OAAS,GAE5Cy2B,EAAStvB,EAAMpN,KAAK05B,aAE1BgD,EAAO76B,UAAUK,IAAIi1B,EAAqB7tB,kBAC1CozB,EAAO5S,eAAe,CAAEE,MAAO,aAG3BmN,EAAAr2B,UAAAm4B,OAAR,WACI,OAAOt2B,MAAMC,KAAK5C,KAAK81B,SAAShyB,iBAAiB,IAAAnD,OAAI00B,EAAsBwB,oBAGvEM,EAAAr2B,UAAAo4B,MAAR,SAAc7b,GACV,OAAOrd,KAAKi5B,SAASn2B,KAAK,SAAAo2B,GAAS,OAAAA,EAAM9zB,QAAe,QAAMiY,KAG1D8Z,EAAAr2B,UAAA24B,aAAR,WAEI,IAAMP,EAAQl5B,KAAKi5B,SAASn2B,KAAK,SAAA65B,GAAK,OAACA,EAAE96B,UAAUC,SAASq1B,EAAqB/nB,oBAEjF,OAAOpP,KAAK48B,QAAQ1D,IAGhB/B,EAAAr2B,UAAA87B,QAAR,SAAgB71B,GAIZ,OAFcpE,MAAMC,KAAuE,QAAlErB,EAAAwF,MAAAA,OAAI,EAAJA,EAAMjD,iBAAiB,IAAAnD,OAAI00B,EAAsBiB,wBAAiB,IAAA/0B,EAAAA,EAAI,IAElFwC,OAAO,SAAA4C,GAAQ,OAACA,EAAK3C,QAAQ,IAAArD,OAAI00B,EAAsBkB,6BAGhEY,EAAAr2B,UAAAg5B,SAAR,SAAiBnzB,GAEA,SAAP4d,EAAQ1L,GAA8B,OAAiD,QAAhD1W,EAAmC,QAAnCZ,EAAAoF,EAAKzC,cAAc,IAAAvD,OAAIkY,WAAY,IAAAtX,OAAA,EAAAA,EAAEma,mBAAW,IAAAvZ,EAAAA,EAAI,IAAIwH,O,MAErG,MAAO,CACH8xB,MAA+F,QAAxFt5B,EAAmE,QAAnEZ,EAAAoF,EAAKzC,cAAc,IAAAvD,OAAIw2B,EAAqBuE,8BAAuB,IAAAn6B,OAAA,EAAAA,EAAEgJ,aAAa,cAAM,IAAApI,EAAAA,OAAI4U,EACnGiiB,MAAO,GACP3b,KAAMkH,EAAK4S,EAAqB0F,sBAChC9C,SAAUxV,EAAK4S,EAAqB6E,gCAA6BjlB,EACjEmlB,OAAQ3X,EAAK4S,EAAqB8E,6BAA0BllB,EAC5D2Z,KAA+B,QAAzBrsB,EAAAsC,EAAK4D,aAAa,eAAO,IAAAlG,EAAAA,OAAI0S,EACnC2hB,KAAM/xB,EAAKvB,QAAiB,cAAK2R,EACjC4jB,YAAah0B,EAAKvB,QAAwB,qBAAK2R,IAI/CogB,EAAAr2B,UAAA85B,aAAR,SAAqBj0B,GACjB,MAAO,GAAAhG,OAAGgG,EAAKozB,UAAYpzB,EAAK0W,KAAI,KAAA1c,OAAIgG,EAAKu1B,QAAUv1B,EAAK+xB,MAAQ,KAGhEvB,EAAAr2B,UAAAs3B,YAAR,WAEI,IACI,IAAM0E,EAAMv9B,OAAOw9B,aAAaC,QAAQ7F,EAAqB8F,aACvDC,EAASJ,EAAMK,KAAKC,MAAMN,GAAO,GAEvC,OAAOn6B,MAAMytB,QAAQ8M,GAAUA,EAAS,GAC1C,MAAA37B,GACE,MAAO,KAIP41B,EAAAr2B,UAAAg6B,aAAR,SAAqB1tB,GAEjB,IACI7N,OAAOw9B,aAAaM,QAAQlG,EAAqB8F,YAAaE,KAAKG,UAAUlwB,IAC/E,MAAA7L,O,KAhbQ83B,oBAA8B,6BAC9BlC,EAAAoC,qBAA+B,8BAC/BpC,EAAA/nB,iBAA2B,cAC3B+nB,EAAA7tB,iBAA2B,YAE3B6tB,EAAAkE,gBAA0B,8BAC1BlE,EAAAuE,qBAA+B,mCAC/BvE,EAAA0F,qBAA+B,mCAC/B1F,EAAAwE,uBAAiC,qCACjCxE,EAAAyE,qBAA+B,mCAC/BzE,EAAA2E,uBAAiC,qCACjC3E,EAAA6E,yBAAmC,uCACnC7E,EAAA8E,sBAAgC,oCAChC9E,EAAAgF,0BAAoC,wCACpChF,EAAAqE,gBAA0B,8BAE1BrE,EAAAC,iBAA2B,EAC3BD,EAAA8F,YAAsB,wBACtB9F,EAAA4D,YAAsB,EAkNrB5D,EAAA6D,cAAqC,SAAOnD,EAAOC,GAAS,OAAAyF,UAAAt8B,OAAA,OAAA,EAAA,W,gEAStD,OAPX+4B,EAAS1yB,SAAS2yB,gBAAgBC,MAAQ,KAC1CxN,EAAS,IAAI8Q,gBAAgB,CAAEC,EAAG5F,IAEpCC,GACApL,EAAOgR,IAAI,SAAU,KAGR,CAAA,EAAMC,MAAM,GAAAh9B,OAAG00B,EAAsB2B,SAAQ,KAAAr2B,OAAIi9B,mBAAmB5D,GAAO,KAAAr5B,OAAI+rB,GAC5F,CAAEmR,QAAS,CAAEC,OAAU,uB,OAE3B,KAHMxF,EAAW/2B,EAAAg3B,QAGHwF,GACV,MAAM,IAAInxB,MAAM,sBAAAjM,OAAsB23B,EAAS0F,SAG5C,MAAA,CAAA,EAAM1F,EAAS2F,Q,OAAtB,MAAA,CAAA,EAAO18B,EAAAg3B,cA8LfpB,GAxZI,SAAAA,EACYv1B,EACAmU,EACA+f,GAFA91B,KAAA4B,GAAAA,EACA5B,KAAA+V,MAAAA,EACA/V,KAAA81B,SAAAA,EAPJ91B,KAAA05B,aAAuB,EACvB15B,KAAAk4B,WAAqB,EAQnBzL,EAAWzsB,KAAK81B,SAAS5xB,cAAc,IAAAvD,OAAI00B,EAAsBkB,0BAEvEv2B,KAAKs7B,aAAe7O,MAAAA,OAAQ,EAARA,EAAUvoB,cAAc,IAAAvD,OAAI00B,EAAsBiB,kBA/OlF,CAAUj3B,GAAAA,IAAE,ICAZ,SAAUA,GAEN,IAAA6+B,GAgBWA,EAAAz+B,KAAP,SAAYC,EAA4By+B,GACX72B,SAASxD,iBAAiB,IAAAnD,OAAIu9B,EAAiBE,6BACvDj9B,QAAQ,SAAA6iB,GACrB,IAAIka,EAAiBla,MA2CrBka,EAAAp9B,UAAArB,KAAR,WACIO,KAAKe,mBACLf,KAAKq+B,qBAGDH,EAAAp9B,UAAAu9B,kBAAR,WACIr+B,KAAKs+B,iBAGDJ,EAAAp9B,UAAAC,iBAAR,WAAA,I,EAAAC,EAAAhB,KACe,QAAXiB,EAAAjB,KAAK0iB,cAAM,IAAAzhB,GAAAA,EAAEE,QAAQ,SAAA4U,GACK,WAAlBA,EAAMwoB,QACW,oBAAN5+B,EACPA,EAAEoW,GAAO+C,GAAG,yCAA0C,SAACtV,GACnDxC,EAAKw9B,SAASh7B,KAGlBuS,EAAM1U,iBAAiB,SAAUL,EAAKw9B,UAEjB,UAAlBzoB,EAAMwoB,SAA4D,UAApCxoB,EAA2B0oB,MAEvC,UAAlB1oB,EAAMwoB,SAA4D,aAApCxoB,EAA2B0oB,KADhE1oB,EAAM1U,iBAAiB,SAAUL,EAAKw9B,WAItCzoB,EAAM1U,iBAAiB,QAASL,EAAKu0B,SACrCxf,EAAM1U,iBAAiB,UAAWL,EAAKw0B,YAE3Czf,EAAM1U,iBAAiB,OAAQL,EAAK09B,WAG9B,QAAVn9B,EAAAvB,KAAKqV,aAAK,IAAA9T,GAAAA,EAAEF,iBAAiB,QAASrB,KAAKy1B,SACjC,QAAVtzB,EAAAnC,KAAK2+B,aAAK,IAAAx8B,GAAAA,EAAEd,iBAAiB,QAASrB,KAAK0+B,SAC7B,QAAdr6B,EAAArE,KAAK4+B,iBAAS,IAAAv6B,GAAAA,EAAElD,QAAQ,SAAA09B,GACpBA,EAAiBx9B,iBAAiB,QAASL,EAAK6hB,gBAkChDqb,EAAAp9B,UAAAw9B,cAAR,WAAA,I,EAAAt9B,EAAAhB,KACU8+B,EAAmD,GAE9C,QAAX79B,EAAAjB,KAAK0iB,cAAM,IAAAzhB,GAAAA,EAAEE,QAAQ,SAAA4U,G,IACXjW,EAAUiW,EACVnI,EAAQ9N,EAAQ8N,MAChBmxB,EAA+B,WAApBj/B,EAAQy+B,QACnBS,EAA8B,UAApBl/B,EAAQy+B,SAA8D,UAAtCz+B,EAA6B2+B,KACvEQ,EAAiC,UAApBn/B,EAAQy+B,SAA8D,aAAtCz+B,EAA6B2+B,KAC1ES,EAAYH,EAAW,EAAI,IAE7BnxB,GAASA,EAAMjE,OAAO1D,QAAUi5B,IACvBF,IAAwBl/B,EAA6ByX,SACrD0nB,IAA8Bn/B,EAA6ByX,QAS3D,QAAThW,EAAAP,EAAKuC,YAAI,IAAAhC,GAAAA,EAAEM,UAAUO,OAAO87B,EAAiBiB,0BAP7CL,EAAS7wB,KAAK,CACV4C,KAAMjD,EACNwxB,WAAYL,IAAaC,IAAYC,IAGhC,QAATh+B,EAAAD,EAAKuC,YAAI,IAAAtC,GAAAA,EAAEY,UAAUK,IAAIg8B,EAAiBiB,4BAKlDn/B,KAAK0D,GAAG8e,mBAAmBsc,IAxJjBZ,EAAAxH,gBAAkB,qBAClBwH,EAAAmB,kBAAoB,uBACpBnB,EAAA5b,0BAA4B,+BAC5B4b,EAAAoB,qBAAuB,0BACvBpB,EAAAiB,wBAA0B,sBAC1BjB,EAAAqB,uBAAyB,qBACzBrB,EAAAsB,uBAAyB,qBACzBtB,EAAAuB,uBAAyB,qBACzBvB,EAAAwB,4BAA8B,0BAC9BxB,EAAAE,2BAA6B,cAE7BF,EAAAyB,sCAAwC,oCACxCzB,EAAA0B,8BAAgC,4BA8IlD1B,GAxHI,SAAAA,EACqB36B,GADrB,IAAAvC,EAAAhB,KAGI,GAFiBA,KAAAuD,KAAAA,EA8DbvD,KAAAu1B,QAAU,SAAC/xB,GACfnE,EAAG+L,SAAS,WACRpK,EAAKs9B,iBACN,IAFHj/B,IAKIW,KAAAw1B,UAAY,SAAChyB,GACH,UAAVA,EAAEyZ,KACFzZ,EAAEC,kBAIFzD,KAAAw+B,SAAW,SAACh7B,GAChBxC,EAAKs9B,iBAGDt+B,KAAAy1B,QAAU,SAACjyB,GACfxC,EAAK0C,GAAGm8B,YAAYr8B,EAAEK,gBAGlB7D,KAAA0+B,QAAU,SAACl7B,GACfxC,EAAK0C,GAAGo8B,cACR9+B,EAAKs9B,iBAGDt+B,KAAA6iB,YAAc,SAACrf,GACnBxC,EAAK0C,GAAGk7B,UAAUp7B,EAAEoE,QACpB5G,EAAKs9B,kBAvFAt+B,KAAKuD,KACN,MAAM,IAAIqJ,MAAM,4BAGpB5M,KAAK0iB,OAAS1iB,KAAKuD,KAAKO,iBAAiB,IAAAnD,OAAIu9B,EAAiBxH,kBAC9D12B,KAAK+/B,QAAU//B,KAAKuD,KAAKO,iBAAiB,IAAAnD,OAAIu9B,EAAiBmB,oBAC/Dr/B,KAAKggC,qBAAuBhgC,KAAKuD,KAAKO,iBAAiB,IAAAnD,OAAIu9B,EAAiB5b,4BAC5EtiB,KAAKigC,UAAYjgC,KAAKuD,KAAKW,cAAc,IAAAvD,OAAIu9B,EAAiBoB,uBAC9Dt/B,KAAKqV,MAAQrV,KAAKuD,KAAKW,cAAc,IAAAvD,OAAIu9B,EAAiBqB,yBAC1Dv/B,KAAK2+B,MAAQ3+B,KAAKuD,KAAKW,cAAc,IAAAvD,OAAIu9B,EAAiBsB,yBAC1Dx/B,KAAKqf,MAAQrf,KAAKuD,KAAKW,cAAc,IAAAvD,OAAIu9B,EAAiBuB,yBAC1Dz/B,KAAKkgC,mBAAqBlgC,KAAKuD,KAAKW,cAAc,IAAAvD,OAAIu9B,EAAiByB,wCACvE3/B,KAAKmgC,YAAcngC,KAAKuD,KAAKW,cAAc,IAAAvD,OAAIu9B,EAAiB0B,gCAChE5/B,KAAK4+B,UAAY5+B,KAAKuD,KAAKO,iBAAiB,IAAAnD,OAAIu9B,EAAiBwB,8BAE5D1/B,KAAK+/B,SAAY//B,KAAKggC,uBAA2BhgC,KAAK0iB,QAAiC,IAAvB1iB,KAAK0iB,OAAOzc,QAAkBjG,KAAK4+B,WAAc5+B,KAAK2+B,SAI3H3+B,KAAK0D,GAAK,IAAI08B,EAAkBpgC,KAAKuD,KAAMvD,KAAK+/B,QAAS//B,KAAKggC,qBAAsBhgC,KAAKigC,UAAWjgC,KAAKqf,MAAOrf,KAAK0iB,OAAQ1iB,KAAKkgC,mBAAoBlgC,KAAKmgC,YAAangC,KAAKqV,MAAOrV,KAAK4+B,WACzL5+B,KAAKP,QA3DAJ,EAAA6+B,iBAAgBA,EA8J7B,IAAAkC,GAqBWA,EAAAt/B,UAAA++B,YAAP,SAAmBQ,G,IAETC,EAAWD,EAAaj7B,QAAkB,SAC3Ck7B,GAAatgC,KAAKuD,QAIjBg9B,EAAwB,QAATt/B,EAAAjB,KAAKuD,YAAI,IAAAtC,OAAA,EAAAA,EAAEiD,cAAc,IAAAvD,OAAI2/B,OAE9CC,EAAa3yB,MAAQ,GACrB2yB,EAAa9e,cAAc,IAAIvL,MAAM,aAItCkqB,EAAAt/B,UAAAg/B,YAAP,W,MAEe,QAAX7+B,EAAAjB,KAAK0iB,cAAM,IAAAzhB,GAAAA,EAAEE,QAAQ,SAAC4U,GACI,UAAlBA,EAAMwoB,SAA4D,aAApCxoB,EAA2B0oB,OACxD1oB,EAA2BwB,SAAU,MAK3C6oB,EAAAt/B,UAAA89B,UAAP,SAAiBC,G,MACF,QAAX59B,EAAAjB,KAAK0iB,cAAM,IAAAzhB,GAAAA,EAAEE,QAAQ,SAAC4U,GACI,UAAlBA,EAAMwoB,SAA4D,aAApCxoB,EAA2B0oB,OACxD1oB,EAA2BwB,SAAU,MAK3C6oB,EAAAt/B,UAAA0hB,mBAAP,SAA0Bsc,GAA1B,IAAA99B,EAAAhB,KAKI,GAHAA,KAAKwgC,kBACLxgC,KAAKygC,mBAEAzgC,KAAKggC,qBAAV,CAIA,GAAwB,IAApBlB,EAAS74B,OAOT,OANAjG,KAAKggC,qBAAqB7+B,QAAQ,SAAArB,GAAW,OAAAA,EAAQ+B,UAAUO,OAAOg+B,EAAkBM,gBACpF1gC,KAAKigC,WACLjgC,KAAKigC,UAAUp+B,UAAUK,IAAIk+B,EAAkBM,mBAGnD1gC,KAAK2gC,eAIT,IAAIC,GAAmB,EAGvB5gC,KAAKggC,qBAAqB7+B,QAAQ,SAAA+d,GAI9B,IAHA,IAAI2hB,GAAa,EAGO1jB,EAAA,EAAA2jB,EAAAhC,EAAA3hB,EAAA2jB,EAAA76B,OAAAkX,IAAU,CAA7B,IAAM4jB,EAASD,EAAA3jB,GAEhB,GAAc,IADAnc,EAAKggC,cAAc9hB,EAAO6hB,EAAUlwB,MAAM,GACvC,CACbgwB,GAAa,EACb,OAIR,GAAIA,EAAY,CACZ3hB,EAAMrd,UAAUO,OAAOg+B,EAAkBM,cACzCE,GAAmB,EAEnB,IAAwB,IAAA3/B,EAAA,EAAAggC,EAAAnC,EAAA79B,EAAAggC,EAAAh7B,OAAAhF,KAAb8/B,EAASE,EAAAhgC,IACFm+B,WACVp+B,EAAKggC,cAAc9hB,EAAO6hB,EAAUlwB,MAAM,QAIlDqO,EAAMrd,UAAUK,IAAIk+B,EAAkBM,gBAI1C1gC,KAAKigC,YACDW,EACA5gC,KAAKigC,UAAUp+B,UAAUK,IAAIk+B,EAAkBM,cAE/C1gC,KAAKigC,UAAUp+B,UAAUO,OAAOg+B,EAAkBM,eAI1D1gC,KAAKkhC,iBACLlhC,KAAK2gC,iBAIFP,EAAAt/B,UAAA0/B,gBAAP,WACSxgC,KAAKgkB,WAEVhkB,KAAKgkB,UAAU7iB,QAAQ,SAAA6iB,GACAA,EAAUlgB,iBAAiB,IAAAnD,OAAIy/B,EAAkBe,kBACzDhgC,QAAQ,SAAA8V,GACf,IAAM8K,EAAS9K,EAAKmqB,WAChBrf,IACAA,EAAOsf,aAAa/5B,SAASm1B,eAAexlB,EAAKyE,aAAe,IAAKzE,GACrE8K,EAAOuf,kBAMflB,EAAAt/B,UAAAogC,eAAR,WAAA,I,EAAAlgC,EAAAhB,KACSA,KAAKgkB,WAAchkB,KAAKmgC,aAAgBngC,KAAKkgC,qBAEvC,QAAXj/B,EAAAjB,KAAK0iB,cAAM,IAAAzhB,GAAAA,EAAEE,QAAQ,SAAA4U,G,MACXjW,EAAUiW,EACVkpB,EAAiC,UAApBn/B,EAAQy+B,SAA8D,aAAtCz+B,EAA6B2+B,KAE5E3+B,EAAQ8N,OAAuC,EAA9B9N,EAAQ8N,MAAMjE,OAAO1D,UAAgBg5B,GAA8Bn/B,EAA6ByX,YAC3GwF,EAA8B,QAAvB9b,EAAAD,EAAKk/B,0BAAkB,IAAAj/B,OAAA,EAAAA,EAAEmf,WAAU,IAC3Cve,UAAUO,OAAOg+B,EAAkBM,aAAcxC,EAAiByB,uCACvE5iB,EAAKlb,UAAUK,IAAIk+B,EAAkBmB,+BAC/BC,EAAczkB,EAAK7Y,cAAc,gBAEnCs9B,EAAY9lB,aAAiC,QAAnBvZ,EAAc,QAAdZ,EAAAzB,EAAQ2hC,cAAM,IAAAlgC,OAAA,EAAAA,EAAG,UAAE,IAAAY,OAAA,EAAAA,EAAEuZ,cAAe5b,EAAQ8N,OAE1D,QAAhBvJ,EAAArD,EAAKm/B,mBAAW,IAAA97B,GAAAA,EAAEq9B,QAAQ3kB,GAE1BA,EAAK1b,iBAAiB,QAAS,WAC1BvB,EAA6ByX,SAAU,EACxCzX,EAAQ2hB,cAAc,IAAIvL,MAAM,gBAKJ,GAApB,QAAhB3U,EAAAvB,KAAKmgC,mBAAW,IAAA5+B,OAAA,EAAAA,EAAEsB,SAASoD,QAC3BjG,KAAKmgC,YAAYt+B,UAAUO,OAAOg+B,EAAkBM,cAEpD1gC,KAAKmgC,YAAYt+B,UAAUK,IAAIk+B,EAAkBM,cAGrDnhC,OAAOkiB,cAAc,IAAIvL,MAAM,aAG3BkqB,EAAAt/B,UAAA2/B,iBAAR,WACSzgC,KAAKgkB,WAAchkB,KAAKmgC,cAE7BngC,KAAKmgC,YAAYr8B,iBAAiB,IAAAnD,OAAIy/B,EAAkBmB,+BAAgCpgC,QAAQ,SAAA4b,GAC5FA,EAAK3a,WAGTpC,KAAKmgC,YAAYt+B,UAAUK,IAAIk+B,EAAkBM,gBAI7CN,EAAAt/B,UAAA6/B,aAAR,WACI,IACUgB,EADN3hC,KAAKqf,QACCsiB,EAAeh/B,MAAMC,KAAK5C,KAAKggC,sBAAwB,IAAIj8B,OAAO,SAAAmb,GAAS,OAACA,EAAMrd,UAAUC,SAASs+B,EAAkBM,gBAAez6B,OAC5IjG,KAAKqf,MAAM3D,YAAcimB,EAAazkB,aAItCkjB,EAAAt/B,UAAAkgC,cAAR,SAAsBnH,EAAYpX,EAAoB2c,GAAtD,IAAAp+B,EAAAhB,UAAsD,IAAAo/B,IAAAA,GAAA,GAClD,IAAI/f,EAAQ,EACZ,GAAIwa,EAAK+H,WAAaC,KAAKC,UAAW,CAClC,IAAMvd,EAAOsV,EAAKkI,WAAa,GAEzBC,EAAoBhiC,KAAKiiC,aAAaxf,GACtCyf,EAAQ,IAAIC,OAAO,IAAAxhC,OAAIqhC,EAAiB,KAAK,MAEnD,GAAIE,EAAME,KAAK7d,GACX,GAAK6a,EAKE,CACH,IAEIpG,EAFEqJ,EAAW/6B,SAASg7B,yBACtBC,EAAY,EAKhB,IAFAL,EAAMK,UAAY,EAEoB,QAA9BvJ,EAAQkJ,EAAMM,KAAKje,KAAiB,CACxClF,IAEA,IAAMgd,EAAS9X,EAAKyL,MAAMuS,EAAWvJ,EAAMn4B,OACvB,EAAhBw7B,EAAOp2B,QACPo8B,EAASpgB,YAAY3a,SAASm1B,eAAeJ,IAI3CplB,EAAO3P,SAASk1B,cAAc,QACpCvlB,EAAK4B,UAAYunB,EAAkBe,gBACnClqB,EAAKyE,YAAcsd,EAAM,GACzBqJ,EAASpgB,YAAYhL,GAErBsrB,EAAYL,EAAMK,UAItB,IAAMjG,EAAQ/X,EAAKyL,MAAMuS,GACN,EAAfjG,EAAMr2B,QACNo8B,EAASpgB,YAAY3a,SAASm1B,eAAeH,IAGlC,QAAfr7B,EAAA44B,EAAKuH,kBAAU,IAAAngC,GAAAA,EAAEogC,aAAagB,EAAUxI,OAnC5B,CACZ,IAAMjiB,EAAU2M,EAAKyU,MAAMkJ,GACvBtqB,IACAyH,EAAQzH,EAAQ3R,cAmCrB4zB,EAAK+H,WAAaC,KAAKY,gBAGxBC,GAFA5iC,EAAU+5B,GAEUtvB,aAAa,qBACtBm4B,EAAUvH,cAAcwH,SAASlgB,EAAW0Y,gBACzD9b,IAIoB,WAApBvf,EAAQy+B,SACY,UAApBz+B,EAAQy+B,SACPz+B,EAAQ+B,UAAUC,SAASs+B,EAAkBe,kBAE9Cx+B,MAAMC,KAAK9C,EAAQ8iC,YAAYzhC,QAAQ,SAAA0hC,GACnCxjB,GAASre,EAAKggC,cAAc6B,EAAOpgB,EAAY2c,MAI3D,OAAO/f,GAGH+gB,EAAAt/B,UAAAmhC,aAAR,SAAqBa,GACjB,OAAOA,EAAOh1B,QAAQ,sBAAuB,SAtPnCsyB,EAAAe,gBAAkB,0BAClBf,EAAAM,aAAe,eACfN,EAAA2C,eAAiB,cACjB3C,EAAAmB,6BAA+B,2BAqPjDnB,GAnPI,SAAAA,EACY78B,EACAygB,EACAgc,EACAC,EACA5gB,EACAqD,EACAwd,EACAC,EACAxB,EACAqE,GATAhjC,KAAAuD,KAAAA,EACAvD,KAAAgkB,UAAAA,EACAhkB,KAAAggC,qBAAAA,EACAhgC,KAAAigC,UAAAA,EACAjgC,KAAAqf,MAAAA,EACArf,KAAA0iB,OAAAA,EACA1iB,KAAAkgC,mBAAAA,EACAlgC,KAAAmgC,YAAAA,EACAngC,KAAA2+B,MAAAA,EACA3+B,KAAAgjC,OAAAA,GAjLpB,CAAU3jC,GAAAA,IAAE,IFAZM,EAAE,WAEA,IAAMsjC,EAAQtjC,EAAE,SAChBsjC,EAAMnqB,GAAGoD,GAAGC,QAAQoE,mBAAoB,SAAC2iB,GACvC,IAAIt7B,EAASs7B,EAAO1iB,eACf5Y,IAAUs7B,EAAOC,eAEhBC,OADEA,EAAUF,EAAOC,gBACnBC,EAAQ5iB,iBACV5Y,EAASw7B,EAAO5iB,gBAGhB5Y,GACFvI,GAAGgkC,UAAU5jC,KAAKE,EAAEiI,IAAS,KAGjCvI,GAAGgkC,UAAU5jC,KAAKwjC,KAIpB,SAAU5jC,GAER,IAAAgkC,GAESA,EAAA5jC,KAAP,SAAYC,EAA4B4Q,QAAA,IAAAA,IAAAA,GAAA,GACtCjR,EAAGmG,6BAA6B/F,KAAKC,GACrCL,EAAGqQ,0BAA0BjQ,KAAKC,GAClCL,EAAGumB,oBAAoBvV,OAAO3Q,GAC9BL,EAAGoB,sBAAsBhB,KAAKC,GAC9BL,EAAGuzB,iCAAiCnzB,KAAKC,GACzCL,EAAGsgB,qBAAqBlgB,KAAKC,GAC7BL,EAAG+Q,mBAAmBC,OAAO3Q,EAAO4Q,GACpCjR,EAAGskB,UAAUtT,OAAO3Q,EAAO4Q,GAC3BjR,EAAG+uB,uBAAuB3uB,KAAKC,GAC/BL,EAAGG,UAAUC,KAAKC,GAClBL,EAAG6+B,iBAAiBz+B,KAAKC,EAAO4Q,GAChCjR,EAAGg2B,sBAAsB51B,KAAKC,IAElC2jC,GAhBA,SAAAA,KAAahkC,EAAAgkC,UAASA,EAFxB,CAAUhkC,GAAAA,IAAE","file":"../bottom_page_composing.js","sourcesContent":["namespace eh {\n\n  const temml: any =  (window as any).temml;\n  export class EhFormula {\n\n    static init($base: JQuery<HTMLElement>): void {\n      $('data[data-formula]', $base).each(function (_index, element) {\n        const formula = $(this).attr('data-formula');\n        if (formula) {\n          try {\n            const html = temml.renderToString(formula, { displayMode: false });\n            $(element).replaceWith(html);\n          } catch (err) {\n            console.error('Temml failure:', err);\n          }\n        }\n      });\n    }\n  }\n\n}","namespace eh {\n  /**\n   * Controller to manage show more/less in accordion. \n   * `EHShowMoreController`\n   */\n  export class EhAccordionController {\n    public static SHOW_MORE_CLASSNAME: string = 'ehel-show-more';\n\n    public static SHOW_MORE_BUTTON_CLASSNAME: string = 'ehel-show-more--button';\n    public static SHOW_LESS_BUTTON_CLASSNAME: string = 'ehel-show-less--button';\n    public static SHOW_MORE_MARGIN_ORIGIN_CLASSNAME: string = 'ehel-show-more--margin-origin';\n    public static SHOW_MORE_MARGIN_TARGET_CLASSNAME: string = 'ehel-show-more--margin-target';\n\n    public static SHOW_MORE_GROUP_CLASSNAME: string = 'ehel-show-more--group';\n    public static SHOW_MORE_WRAPPER_CLASSNAME: string = 'ehel-show-more--wrapper';\n    public static CLOSED_CLASSNAME: string = 'ehel-show-more--closed';\n    public static FITS_CLASSNAME: string = 'ehel-show-more--fits';\n    public static AUTO_FIT_ATTR: string = 'data-auto-fit';\n\n\n    static init($base: JQuery<HTMLElement>): void {\n      $base.selfOrFind(`.${EhAccordionController.SHOW_MORE_CLASSNAME}`).each((index: number, element: HTMLElement) => {\n        new EhAccordionController(element);\n      });\n    }\n\n    private el: HTMLElement | null | undefined;\n    private buttonMore: HTMLElement[] | undefined | null;\n    private buttonLess: HTMLElement[] | undefined | null;\n    private showMoreMarginOrigin: HTMLElement | undefined | null;\n    private showMoreMarginTarget: HTMLElement | undefined | null;\n    private showMoreGroup: HTMLElement | null | undefined;\n    private showMoreWrapper: HTMLElement | null | undefined;\n\n    private vm: EhAccordionViewModel;\n\n    constructor(\n      private readonly base: HTMLElement | null,\n    ) {\n      this.el = this.base;\n      if (this.el) {\n        this.buttonMore = Array.from(\n          this.el.querySelectorAll(`.${EhAccordionController.SHOW_MORE_BUTTON_CLASSNAME}`)\n        ).filter(x => x.closest(`.${EhAccordionController.SHOW_MORE_CLASSNAME}`) === this.el) as HTMLElement[];\n        this.buttonLess = Array.from(\n          this.el.querySelectorAll(`.${EhAccordionController.SHOW_LESS_BUTTON_CLASSNAME}`)\n        ).filter(x => x.closest(`.${EhAccordionController.SHOW_MORE_CLASSNAME}`) === this.el) as HTMLElement[];\n      }\n      this.showMoreMarginOrigin = this.el?.querySelector(`.${EhAccordionController.SHOW_MORE_MARGIN_ORIGIN_CLASSNAME}`);\n      this.showMoreMarginTarget = this.el?.querySelector(`.${EhAccordionController.SHOW_MORE_MARGIN_TARGET_CLASSNAME}`);\n      this.showMoreGroup = this.el?.parentElement?.classList.contains(`${EhAccordionController.SHOW_MORE_GROUP_CLASSNAME}`) ? this.el?.parentElement : null;  \n      this.showMoreWrapper = this.el?.querySelector(`.${EhAccordionController.SHOW_MORE_WRAPPER_CLASSNAME}`);\n      if (!this.buttonMore || !this.buttonLess || !this.el) {\n        //throw new Error(`Missing required element`);\n        return;\n      }\n\n      this.vm = new EhAccordionViewModel(\n        this.el,\n        this.buttonMore,\n        this.buttonLess,\n        this.showMoreMarginOrigin,\n        this.showMoreMarginTarget,\n        this.showMoreGroup\n      );\n\n      this.init();\n    }\n\n    private init(): void {\n      this.registerControls();\n    }\n\n    private registerControls(): void {\n      this.buttonMore?.forEach(x => {\n        x.addEventListener('click', this.onButtonMoreClicked);\n      });\n      this.buttonLess?.forEach(x => {\n        x.addEventListener('click', this.onButtonLessClicked);\n      });\n      if (this.showMoreWrapper) {\n        const observer = new ResizeObserver(() => {\n          if (this.el?.classList.contains(EhAccordionController.CLOSED_CLASSNAME)) {\n            const isClamped = this.showMoreWrapper!.scrollHeight > this.showMoreWrapper!.clientHeight;\n            if (isClamped) {\n              this.el?.classList.add('ehel-show-more--clamped');\n            } else {\n              this.el?.classList.remove('ehel-show-more--clamped');\n            }\n          }\n        });\n        observer.observe(this.showMoreWrapper);\n      }\n      this.checkAutoFit();\n    }\n\n    private checkAutoFit(): void {\n      if (!this.el?.hasAttribute(EhAccordionController.AUTO_FIT_ATTR)) return;\n      if (!this.el.classList.contains(EhAccordionController.CLOSED_CLASSNAME)) return;\n\n      requestAnimationFrame(() => {\n        if (!this.el) return;\n        const contentEl = Array.from(this.el.children).find(c =>\n          !c.classList.contains('ehel-show-more--controls')\n        ) as HTMLElement;\n        if (contentEl && contentEl.scrollHeight <= contentEl.clientHeight) {\n          this.el.classList.add(EhAccordionController.FITS_CLASSNAME);\n        }\n      });\n    }\n\n    private onButtonMoreClicked = (e: MouseEvent | TouchEvent): void => {\n      e.preventDefault();\n      this.vm.showMore();\n    }\n\n    private onButtonLessClicked = (e: MouseEvent | TouchEvent): void => {\n      e.preventDefault();\n      this.vm.showLess(e.currentTarget as HTMLElement);\n    }\n  }\n\n\n  class EhAccordionViewModel {\n\n    private static HIDE_CLASSNAME: string = 'ehtw-hidden';\n\n    constructor(\n      private showMoreElement: HTMLElement,\n      private buttonMore: HTMLElement[],\n      private buttonLess: HTMLElement[],\n      private showMoreMarginOrigin?: HTMLElement | null,\n      private showMoreMarginTarget?: HTMLElement | null,\n      private showMoreGroup?: HTMLElement | null ,\n    ) {\n      this.init();\n    }\n\n    private init(): void {\n    }\n\n    public showMore() {\n      if (this.showMoreGroup) {\n        this.showMoreGroup.querySelectorAll(`.${EhAccordionController.SHOW_MORE_CLASSNAME}`).forEach(sm => {\n          sm.classList.add(EhAccordionController.CLOSED_CLASSNAME);\n          sm.querySelectorAll(`.${EhAccordionController.SHOW_MORE_BUTTON_CLASSNAME}`)?.forEach(x => {\n            x.classList.remove(EhAccordionViewModel.HIDE_CLASSNAME);\n          });\n          sm.querySelectorAll(`.${EhAccordionController.SHOW_LESS_BUTTON_CLASSNAME}`)?.forEach(x => {\n            x.classList.add(EhAccordionViewModel.HIDE_CLASSNAME);\n          });\n        });\n      }\n      this.showMoreElement.classList.remove(EhAccordionController.CLOSED_CLASSNAME);\n      this.buttonMore?.forEach(x => {\n        x.classList.add(EhAccordionViewModel.HIDE_CLASSNAME);\n      });\n      this.buttonLess?.forEach(x => {\n        x.classList.remove(EhAccordionViewModel.HIDE_CLASSNAME);\n      });\n      if (this.showMoreMarginOrigin && this.showMoreMarginTarget) {\n        const size = this.showMoreMarginOrigin.getBoundingClientRect();\n        this.showMoreMarginTarget.style.minWidth = `${size.width}px`;\n        this.showMoreMarginTarget.style.maxWidth = `${size.width}px`;\n        this.showMoreMarginTarget.style.width = `${size.width}px`;\n      }\n    }\n\n    public showLess(element: HTMLElement) {\n      this.showMoreElement.classList.add(EhAccordionController.CLOSED_CLASSNAME);\n      const scrollTop = element.dataset['goToTop'] === 'true';\n      if (scrollTop) {\n        const offset = $(this.showMoreElement).offset();\n        if (offset) {\n            $('html, body').animate({\n                scrollTop: offset.top - 120\n            }, 300);\n        }\n      }\n\n      this.buttonMore?.forEach(x => {\n        x.classList.remove(EhAccordionViewModel.HIDE_CLASSNAME);\n      });\n      this.buttonLess?.forEach(x => {\n        x.classList.add(EhAccordionViewModel.HIDE_CLASSNAME);\n      });\n    }\n\n  }\n\n}","namespace eh {\n    \n  /**\n   * Controller to manage anchor-navigation behaviour (part of pc_modules). \n  */\n  export class EhAnchorNavigationController {\n       \n  static init($base: JQuery<HTMLElement>): void {\n      $(`.${ EhAnchorNavigationController.ANCHOR_NAV_CLASSNAME }`, $base).each((index, element) => {\n        new EhAnchorNavigationController(element);\n      });    \n  }\n\n  // check #anchor target is available or remove\n  static filterAnchorItemsExist(navigation: HTMLElement | null | undefined):NodeListOf<HTMLElement> | undefined {\n    let navItems = navigation?.querySelectorAll(`.${EhAnchorNavigationController.ANCHOR_NAV_NAVIGATION_ITEM_CLASSNAME}`);\n    if(navItems) {\n      navItems.forEach( ni => {\n        let hf = $(ni).attr('href');\n        if(hf && hf.startsWith('#')) {\n          if(hf.length == 1 || $(hf).length == 0) {\n            $(ni).remove();\n          }\n        }\n      });\n      return navigation?.querySelectorAll(`.${EhAnchorNavigationController.ANCHOR_NAV_NAVIGATION_ITEM_CLASSNAME}`);\n    }\n    return undefined;\n  }\n  public static ANCHOR_NAV_CLASSNAME: string = 'ehel-anchor-navigation';\n  public static ANCHOR_NAV_NAVIGATION_CLASSNAME: string = 'ehel-anchor-navigation--navigation';\n  public static ANCHOR_NAV_NAVIGATION_ITEM_CLASSNAME: string = 'ehel-button';\n\n  public static ANCHOR_NAV_PREVIOUS_BTN_CLASSNAME: string = 'ehel-anchor-navigation--prev-btn';\n  public static ANCHOR_NAV_NEXT_BTN_CLASSNAME: string = 'ehel-anchor-navigation--next-btn';\n\n  public static TABLE_OF_CONTENT_CLASSNAME: string = 'ehel-table-of-content';\n  public static ANCHOR_NAV_ACTIVE_LABEL_CLASSNAME: string = 'ehel-anchor-navigation--active-label';\n\n    private el: HTMLElement | null | undefined;\n    private navigation: HTMLElement | null | undefined;\n    private navigationItems: NodeListOf<HTMLElement> | undefined;\n\n    private tableOfContent: HTMLElement | null | undefined;\n    private tableOfContentElements: HTMLElement | null | undefined;\n    private anchorActiveLabel: HTMLElement | null | undefined;\n\n    private previousBtn: HTMLElement | null | undefined;\n    private nextBtn: HTMLElement | null | undefined;\n    private vm: EhAnchorNavigationViewModel;\n\n    private root: HTMLElement = document.scrollingElement as HTMLElement;\n\n    constructor(\n      private readonly base: HTMLElement | null,\n    ) {\n      this.el = this.base;//?.querySelector(`.${EhAnchorNavigationController.ANCHOR_NAV_CLASSNAME}`);\n      this.navigation = this.el?.querySelector(`.${EhAnchorNavigationController.ANCHOR_NAV_NAVIGATION_CLASSNAME}`);\n      this.navigationItems = EhAnchorNavigationController.filterAnchorItemsExist(this.navigation);\n      this.previousBtn = this.el?.querySelector(`.${EhAnchorNavigationController.ANCHOR_NAV_PREVIOUS_BTN_CLASSNAME}`);\n      this.nextBtn = this.el?.querySelector(`.${EhAnchorNavigationController.ANCHOR_NAV_NEXT_BTN_CLASSNAME}`);\n      \n      this.tableOfContent = this.el?.querySelector(`.${EhAnchorNavigationController.TABLE_OF_CONTENT_CLASSNAME}`);\n      this.tableOfContentElements = this.tableOfContent?.querySelector(`.${EhAnchorNavigationController.ANCHOR_NAV_NAVIGATION_CLASSNAME}`);\n      this.anchorActiveLabel = this.el?.querySelector(`.${EhAnchorNavigationController.ANCHOR_NAV_ACTIVE_LABEL_CLASSNAME}`);\n\n      if (!this.navigation) {\n        //throw new Error(`Missing required element`);\n        return;\n      }\n\n      this.vm = new EhAnchorNavigationViewModel(\n        this.el,\n        this.navigation, \n        this.navigationItems,\n        this.previousBtn,\n        this.nextBtn,\n        this.tableOfContent,\n        this.tableOfContentElements,\n        this.anchorActiveLabel\n      );\n      \n      if (!this.vm.isDisabled) {\n        this.init();\n      } else {\n        // ugly workaround to dispose sticky header behaviour. \n        // better would be to attach displacing elements only on demand via event.\n        // the feature is allready in use by product-tabs with the classname `eh-tabs--products-sticky`.\n        this.el?.classList.add('!ehtw-hidden');\n        this.el?.classList.remove('eh-tabs--products-sticky');\n        eh.Header.init($(document.body));\n      }\n    }\n\n    private init(): void {\n      this.registerControls();\n      NavigationController.uiStateSupport.registerUIStateListener(this.onMainNavChanged);\n    }\n\n    private registerControls(): void {\n      this.previousBtn?.addEventListener('click', this.onPreviousClicked);\n      this.nextBtn?.addEventListener('click', this.onNextClicked);\n      this.navigationItems?.forEach((item: HTMLElement): void => {\n        item.addEventListener('click', this.onItemClicked);\n      });\n      this.tableOfContent?.addEventListener('click', this.onTableOfContentClicked);\n      this.root.addEventListener('click', this.onClickRoot);\n    }\n\n    private onItemClicked = (e: MouseEvent | TouchEvent): void => {\n      e.preventDefault();\n      this.vm.setCurrentItem(e.currentTarget as HTMLElement);\n    }\n\n    private onPreviousClicked = (e: MouseEvent | TouchEvent): void => {\n      e.preventDefault();\n      this.vm.previous();\n    }\n\n    private onNextClicked = (e: MouseEvent | TouchEvent): void => {\n        e.preventDefault();\n        this.vm.next();\n    }\n\n    private onTableOfContentClicked = (e: MouseEvent | TouchEvent): void => {\n      e.preventDefault();\n      this.vm.tableOfContentClicked();\n    }\n\n    private onClickRoot = (e: MouseEvent | TouchEvent): void => {\n      if(e.target instanceof HTMLElement) {\n        if($(e.target as HTMLElement).selfOrClosest(`.${EhAnchorNavigationController.ANCHOR_NAV_CLASSNAME}`).length == 0) {\n          this.vm?.closeTableOfContent();\n        }\n      }\n    }\n\n    private onMainNavChanged: (last: UIStateChanged, current: UIStateChanged) => void = (last: UIStateChanged, current: UIStateChanged): void => {\n      // if(eh.Breakpoints.getInstance().isMobile) {\n      //   return;\n      // }\n      // // console.log('search rec:', current.state);\n      // if(current.state == UIStateValue.OPENED) {\n      //   document.body.classList.add('eh-header-main-nav-opened');// disable anchor-nav\n      // } \n      // if(current.state == UIStateValue.CLOSED) {\n      //   document.body.classList.remove('eh-header-main-nav-opened');// disable anchor-nav\n      // } \n    }\n  }\n\n  interface IScrollerItem {\n    idx: number;\n    link: HTMLElement;\n    target: HTMLElement;\n    thresholdBegin: number;\n    thresholdEnd: number;\n  }\n\n  class EhAnchorNavigationViewModel {\n    public isDisabled: boolean = false;\n\n    private static ANCHOR_NAV_TAB: string = 'ehel-anchor-navigation--tab';\n    private static OPENED_CLASSNAME: string = 'is-opened';\n    private static ACTIVE_CLASSNAME: string = 'is-active';\n    private static DISABLED_CLASSNAME: string = 'is-disabled';\n    private static HIDE_CLASSNAME: string = 'ehtw-hidden';\n    private static TRANSITION_EASING_LINEAR: string = 'linear';\n    private static TRANSITION_EASING_SWING: string = 'swing';\n    private static TRANSITION_DURATION: number = 400;\n    private static MIN_AMOUNT_SCROLL_ITEMS: number = 2;\n    private _currentItem: IScrollerItem | undefined;\n    private _scrollerItems: IScrollerItem[] = [];\n    private targetScrollPosLeft: number = 0;\n    private navigationHeight: number = 0;\n    private isTab = false;\n\n    constructor(\n        private anchorNavigation: HTMLElement | null,\n        private scroller: HTMLElement,\n        private items: NodeListOf<HTMLElement> | undefined,\n        private previousButton: HTMLElement | null | undefined,\n        private nextButton: HTMLElement | null | undefined,\n        private tableOfContent: HTMLElement | null | undefined,\n        private tableOfContentElements: HTMLElement | null | undefined,\n        private anchorActiveLabel: HTMLElement | null | undefined,\n    ) {\n        setTimeout(() => {\n          this.init();\n        }, 2000);\n    }\n\n    public previous(): void {\n        if (!this._currentItem) {\n            return this.setCurrentItem(this.getItemByIdx(0).link);\n        }\n        const targetIndex: number = Math.max(0, this._currentItem.idx - 1)\n        const previousItem: IScrollerItem = this.getItemByIdx(targetIndex);\n        this.setCurrentItem(previousItem.link);\n    }\n    \n    public next(): void {\n        if (!this._currentItem) {\n            return this.setCurrentItem(this.getItemByIdx(0).link);\n        }\n        const targetIndex: number = Math.min(this._scrollerItems.length - 1, this._currentItem.idx + 1);\n        const nextItem: IScrollerItem = this.getItemByIdx(targetIndex);\n        this.setCurrentItem(nextItem.link);\n    }\n\n    public setCurrentItem(item: HTMLElement | undefined, triggerJumpToAnchor: boolean = true): void {\n        if (this._currentItem) {\n          this._currentItem.link.classList.remove(EhAnchorNavigationViewModel.ACTIVE_CLASSNAME);\n          this._currentItem.link.blur();\n          if (this.isTab) {\n            this._currentItem.target.classList.remove(EhAnchorNavigationViewModel.ACTIVE_CLASSNAME);\n          }\n      }\n      this._currentItem = this.getItemByEl(item);\n      this._currentItem?.link.classList.add(EhAnchorNavigationViewModel.ACTIVE_CLASSNAME);\n      if (this.isTab) {\n        this._currentItem?.target.classList.add(EhAnchorNavigationViewModel.ACTIVE_CLASSNAME);\n      }\n      if (this.anchorActiveLabel) {\n        this.anchorActiveLabel.innerText = this._currentItem?.link.innerText.trim() || this.anchorActiveLabel.dataset['label'] || '';\n      }\n      this.updateLocation();\n      this.alignItemToViewport(this._currentItem);\n      if (triggerJumpToAnchor && !this.isTab) {\n          this.animateToAnchor(this._currentItem);\n      }\n      this.invalidateControls();\n      if (!this._currentItem && item) {\n          this.onPageScrollChange();\n      }\n    }\n\n    private updateLocation() {\n      this.isTab = this.anchorNavigation?.classList.contains(EhAnchorNavigationViewModel.ANCHOR_NAV_TAB) || false;\n      this.navigationHeight = this.scroller.clientHeight;\n      this.invalidateItems();\n    \n      if(this._currentItem) {\n        const targetKey = this._currentItem.link.getAttribute('href') || '';\n        history.replaceState(history.state, '', window.location.pathname + window.location.search + targetKey);\n      }\n    }\n\n    private init(): void {\n        this.isTab = this.anchorNavigation?.classList.contains(EhAnchorNavigationViewModel.ANCHOR_NAV_TAB) || false;\n        this.navigationHeight = this.scroller.clientHeight;\n        this.invalidateItems();\n        \n        if (this._scrollerItems.length < EhAnchorNavigationViewModel.MIN_AMOUNT_SCROLL_ITEMS) {\n          this.isDisabled = true;\n          this.scroller.classList.add(EhAnchorNavigationViewModel.HIDE_CLASSNAME);\n          this._scrollerItems = [];\n          return;\n        }\n        if (!this.isTab) {\n          eh.Breakpoints.getInstance().registerChangeListener(this.onBreakpointChange);\n          eh.ScrollPage.registerChangeListener(eh.debounce(this.onPageScrollChange, 40));\n        }\n        window.addEventListener('resize', eh.debounce(this.invalidate, 40));\n        const initialSelection: HTMLElement | null = this.scroller?.querySelector(`.${EhAnchorNavigationViewModel.ACTIVE_CLASSNAME}`) as HTMLElement;\n        if (initialSelection) {\n            this.setCurrentItem(initialSelection);\n        }\n        this.invalidateControls();\n        this.scroller.addEventListener('scroll', eh.debounce(this.onNavigationScrollChange, 40), {passive: true});\n\n        // // fixes invalide thresholdBegin values by resizings after images loaded; eg pc_gallery\n        // Promise.all(\n        //     Array.from(document.images).filter(img => !img.complete).map(img => new Promise(resolve => { \n        //         img.onload = img.onerror = resolve; \n        //     }))).then(() => {\n        //         this.invalidateItems();\n        //     }\n        // );\n    }\n\n    private onNavigationScrollChange = (): void => {\n        this.targetScrollPosLeft = this.scroller.scrollLeft;\n        this.invalidateControls();\n    };\n\n    private onPageScrollChange = (): void => {\n        if(!this.isTab) {\n          const scrollPos: number = eh.ScrollPage.getScrollPosition();\n          const scrollerItem: IScrollerItem | undefined = this.getItemByOffset(scrollPos);\n          this.setCurrentItem(scrollerItem?.link, false);\n        }\n    };\n\n    private onBreakpointChange: (old: Breakpoint | null, current: Breakpoint) => void = (_old: Breakpoint | null, _current: Breakpoint): void => {\n        this.onPageScrollChange();\n    };\n\n    private alignItemToViewport(item: IScrollerItem | undefined): void {\n        if (!item) {\n            return;\n        }\n        const leftOffset: number = item.idx > 0 ? this.navigationHeight : 0;\n        const rightOffset: number = item.idx < this._scrollerItems.length -1 ? this.navigationHeight : 0;\n        \n        const scrollerPos: number = this.scroller.scrollLeft;\n        let clippingLeft: number = item.link.offsetLeft - leftOffset - scrollerPos;\n        let clippingRight: number = item.link.offsetLeft + item.link.clientWidth - this.scroller.clientWidth + rightOffset - scrollerPos;\n\n        if (clippingLeft < 0) {\n            this.targetScrollPosLeft = scrollerPos + Math.min(0, clippingLeft);\n        }\n        if (clippingRight > 0) {\n            this.targetScrollPosLeft = scrollerPos + Math.max(0, clippingRight);\n        }\n\n        if (this.scroller.scrollLeft !== this.targetScrollPosLeft) {\n            $(this.scroller).animate({\n                scrollLeft: this.targetScrollPosLeft\n            },\n            EhAnchorNavigationViewModel.TRANSITION_DURATION,\n            EhAnchorNavigationViewModel.TRANSITION_EASING_LINEAR);\n        }\n\n    }\n\n    private animateToAnchor(item: IScrollerItem | undefined): void {\n        const el: Element | null = document.scrollingElement;\n        const scrollingOffset = window.innerHeight * 0.18;\n        const diffScroll = (el?.scrollTop??0) - (item?.thresholdBegin??0);\n        let scrollTo = item?.thresholdBegin??0;\n        if (diffScroll > scrollingOffset) {\n            scrollTo -= $('.ehel-navigation').height()??0;\n        }\n        if (!el ) {\n            return;\n        }\n        $(el).animate({\n            scrollTop: scrollTo\n        },\n        EhAnchorNavigationViewModel.TRANSITION_DURATION,\n        EhAnchorNavigationViewModel.TRANSITION_EASING_SWING);\n    }\n\n    private getItemByEl(el: HTMLElement | undefined): IScrollerItem | undefined {\n        return this._scrollerItems.find(si => si.link === el);\n    }\n\n    private getItemByIdx(idx: number): IScrollerItem {\n        if (idx < 0 || idx > this._scrollerItems.length -1) {\n          if(this._scrollerItems.length > 0) {\n            return this._scrollerItems[0];\n          }\n          throw new Error(`Out of bounds. Failed to invalidate controls`);\n        }\n        return this._scrollerItems[idx];\n    }\n\n    private getItemByOffset(offset: number): IScrollerItem | undefined {\n      const scrollOffset = $('.ehel-navigation').height()??0;\n\n      const item = this._scrollerItems.filter(i => {\n          return i.thresholdBegin - scrollOffset <= offset \n              && i.thresholdEnd > offset;\n      });\n\n      return item[item.length - 1];\n    }\n\n    private invalidate = (): void => {\n        this.invalidateControls();\n        this.invalidateItems();\n    }\n\n    private invalidateItems = (): void => {\n        this._scrollerItems = [];\n        let idx: number = 0;\n        this.items?.forEach((value: HTMLElement): void => {\n            const targetKey: string | null = value.getAttribute('href') || '';\n            const target: HTMLElement | null = document.getElementById(targetKey.replace('#', ''));\n            const isDisabled: boolean = value.classList.contains(EhAnchorNavigationViewModel.DISABLED_CLASSNAME);\n            if (!target) {\n              value.classList.add(EhAnchorNavigationViewModel.HIDE_CLASSNAME);\n            }\n            if (!target || isDisabled) {\n                return;\n            }\n            const topPos: number = eh.offsetTopToBody(target) - this.navigationHeight + 3;\n            this._scrollerItems.push({\n                idx: idx++,\n                link: value,\n                target: target,\n                thresholdBegin: topPos,\n                thresholdEnd: topPos + target.getBoundingClientRect().height,\n            });\n        });\n    }\n\n    private invalidateControls = (): void => {\n      const hideClass: string = EhAnchorNavigationViewModel.HIDE_CLASSNAME;\n\n      // no active overflow\n      if (this.scroller.scrollWidth === this.scroller.clientWidth) {\n          this.previousButton?.classList.add(hideClass);\n          this.nextButton?.classList.add(hideClass);\n          return;\n      }\n      \n      // handle previous button ctrl\n      if (this.targetScrollPosLeft > 0) {\n          this.previousButton?.classList.remove(hideClass);\n      } else {\n          this.previousButton?.classList.add(hideClass);\n      }\n      \n      // handle next button ctrl\n      const scrollerDelta: number = this.scroller.scrollWidth - this.scroller.clientWidth - 1;\n      if (this.targetScrollPosLeft < scrollerDelta) {\n          this.nextButton?.classList.remove(hideClass);\n      } else {\n          this.nextButton?.classList.add(hideClass);\n      }\n    }\n\n    public tableOfContentClicked(): void {\n      if (this.tableOfContent && eh.Breakpoints.getInstance().isMobile) {\n        if (this.tableOfContent.classList.contains(EhAnchorNavigationViewModel.OPENED_CLASSNAME)) {\n          this.tableOfContent.classList.remove(EhAnchorNavigationViewModel.OPENED_CLASSNAME);\n          this.tableOfContentElements?.classList.add(EhAnchorNavigationViewModel.HIDE_CLASSNAME);\n        } else {\n          this.tableOfContent.classList.add(EhAnchorNavigationViewModel.OPENED_CLASSNAME);\n          this.tableOfContentElements?.classList.remove(EhAnchorNavigationViewModel.HIDE_CLASSNAME);\n        }\n      }\n    }\n\n    public closeTableOfContent() { \n      if (this.tableOfContent) {\n        this.tableOfContent.classList.remove(EhAnchorNavigationViewModel.OPENED_CLASSNAME);\n        this.tableOfContentElements?.classList.add(EhAnchorNavigationViewModel.HIDE_CLASSNAME);\n      }\n    }\n  }\n}","namespace eh {\n\n  export class BreadcrumbController {\n    public static BREADCRUMB_WRAPPER: string = 'ehel-breadcrumb';\n    public static BREADCRUMB_SUBLIST_OPEN_WRAPPER: string = 'ehel-breadcrumb--sublist-open';\n    public static BREADCRUMB_SUBLIST_WRAPPER: string = 'ehel-breadcrumb--sublist';\n    public static BREADCRUMB_LAST_ITEM: string = 'ehel-breadcrumb--segment-last';\n\n    static init($base: JQuery<HTMLElement>): void {\n      $(`.${BreadcrumbController.BREADCRUMB_WRAPPER}`, $base).each((index, element) => {\n        new BreadcrumbController(element);\n      });\n    }\n\n    private sublist: HTMLElement | null | undefined;\n    private sublistOpen: HTMLElement | null | undefined;\n    private breadcrumbLast: HTMLElement | null | undefined;\n\n    private vm: BreadcrumbViewModel | null | undefined = null;\n    private root: HTMLElement = document.scrollingElement as HTMLElement;\n\n    constructor(private readonly el: HTMLElement) {\n      this.sublist = this.el?.querySelector(`.${BreadcrumbController.BREADCRUMB_SUBLIST_WRAPPER}`) as HTMLElement;\n      this.sublistOpen = this.el?.querySelector(`.${BreadcrumbController.BREADCRUMB_SUBLIST_OPEN_WRAPPER}`) as HTMLElement;\n      this.breadcrumbLast = this.el?.querySelector(`.${BreadcrumbController.BREADCRUMB_LAST_ITEM}`) as HTMLElement;\n\n      if (!this.sublist && !this.breadcrumbLast) {\n        return;\n      }\n      this.vm = new BreadcrumbViewModel(\n        this.el,\n        this.sublist,\n        this.breadcrumbLast\n      );\n      this.init();\n    }\n\n    private init(): void {\n      this.registerControls();\n    }\n\n    private registerControls(): void {\n      this.root.addEventListener('click', this.onClickRoot);\n      this.sublistOpen?.addEventListener('click', this.onClickOpenSublist);\n    }\n\n    private onClickOpenSublist = (e: UIEvent): void => {\n      e.preventDefault();\n      e.stopPropagation();\n      this.vm?.toggleSublist();\n    }\n\n    private onClickRoot = (e: UIEvent): void => {\n      if(this.vm?.isOpen()) {\n        this.vm?.closeSublist();\n      }\n    }\n  }\n\n  class BreadcrumbViewModel {\n    private static HIDDEN_CLASSNAME: string = '!ehtw-hidden';\n    private static TOOLTIP_CLASSNAME: string = 'ehel-tooltip';\n\n    constructor(\n      private wrapper: HTMLElement,\n      private sublist: HTMLElement | null,\n      private breadcrumbLast: HTMLElement | null = null\n    ) {\n      this.init();\n    }\n\n    private init(): void {\n      eh.Breakpoints.getInstance().registerChangeListener(this.onBreakpointChange); \n    }\n  \n    public isOpen():boolean {\n      return !this.sublist?.classList.contains(BreadcrumbViewModel.HIDDEN_CLASSNAME);\n    }\n\n    public toggleSublist() {\n      if (this.sublist) {\n        if (this.sublist.classList.contains(BreadcrumbViewModel.HIDDEN_CLASSNAME)) {\n          this.sublist.classList.remove(BreadcrumbViewModel.HIDDEN_CLASSNAME);\n        } else {\n          this.sublist.classList.add(BreadcrumbViewModel.HIDDEN_CLASSNAME);\n        }\n      }\n    }\n\n    public closeSublist() {\n      this.sublist?.classList.add(BreadcrumbViewModel.HIDDEN_CLASSNAME);\n    }\n\n    private onBreakpointChange: (old: Breakpoint | null, current: Breakpoint) => void = (_old: Breakpoint | null, _current: Breakpoint): void => {\n      if (this.breadcrumbLast) {\n        const firstChild = this.breadcrumbLast.firstElementChild as HTMLElement;\n        if (firstChild) {\n          if (firstChild.offsetWidth < firstChild.scrollWidth) {\n            if (firstChild && !firstChild.classList.contains(BreadcrumbViewModel.TOOLTIP_CLASSNAME)) {\n              firstChild.classList.add(BreadcrumbViewModel.TOOLTIP_CLASSNAME);\n            }\n          } else {\n            if (firstChild && firstChild.classList.contains(BreadcrumbViewModel.TOOLTIP_CLASSNAME)) {\n              firstChild.classList.remove(BreadcrumbViewModel.TOOLTIP_CLASSNAME);\n            }\n          }\n        }\n      }\n    };\n  \n  }\n}","namespace eh {\n    /**\n     * Controller to manage comopact-teaser behaviour. \n     */\n    export class EhCompactTeaserController {\n\n        static init($base: JQuery<HTMLElement>): void {\n            $base.selfOrFind(`.${EhCompactTeaserController.COMPACT_TEASSER_WRAPPER_CLASSNAME}`).each((index: number, element: HTMLElement) => {\n              new EhCompactTeaserController(element);\n            });\n          }\n        \n        public static COMPACT_TEASSER_WRAPPER_CLASSNAME: string = 'ehel-compact-teaser--wrapper';\n        public static COMPACT_TEASER_CLASSNAME: string = 'ehel-compact-teaser';\n        public static COMPACT_TEASER_CELL_CLASSNAME: string = 'ehel-compact-teaser--teaser-cell';\n\n        private el: HTMLElement | null | undefined;\n        private elements: NodeListOf<HTMLElement> | undefined;\n\n        private vm: EhCompactTeaserViewModel;\n\n        constructor(\n            private readonly base: HTMLElement | undefined | null,\n        ) {\n            this.elements = this.base?.querySelectorAll(`.${EhCompactTeaserController.COMPACT_TEASER_CELL_CLASSNAME}`);\n            this.vm = new EhCompactTeaserViewModel(this.elements);\n            \n            this.init();\n        }\n\n        private init(): void {\n            this.vm.setEqualHeights();\n        }\n\n    }\n\n\n    class EhCompactTeaserViewModel {\n\n        private static HIDE_CLASSNAME: string = 'ehtw-hidden';\n\n        constructor(private elements: NodeListOf<HTMLElement> | undefined,\n        ) {\n            this.init();\n        }\n\n\n        private init(): void {\n            eh.Breakpoints.getInstance().registerResizeListener(this.setEqualHeights);\n        }\n    \n        public setEqualHeights() {\n            let maxHeight = 0;\n            this.elements?.forEach(el => {\n                if(el.offsetHeight > maxHeight)\n                    maxHeight = el.offsetHeight;\n                });\n        \n            this.elements?.forEach(el => {\n                el.style.height = `${maxHeight}px`;\n            });\n        }\n            \n    }\n}","namespace eh {\n\n  /**\n   * A server-side filter block (`.ehts-filter-block`) — the finder / product-filter\n   * UI in which every interaction round-trips to the server.\n   *\n   * This class is the orchestrator only: it finds the DOM, owns the parts, and\n   * routes the few page-level events. All behaviour lives in focused parts, mirroring\n   * how the client-side (local) search is already split up:\n   *\n   *   local search (client-side)          | server-side search (this block)\n   *   ------------------------------------|-------------------------------------\n   *   SearchInlineController + ViewModel  | EhFilterRequest + EhFilterResponse\n   *   FlyoutController                    | EhFilterFlyout\n   *   FiltersLocalController              | EhFilterLayout\n   *   (part of SearchInlineController)    | EhFilterSelection\n   *   -                                   | EhFilterDrawer, EhFilterControls,\n   *                                       | EhFilterSort\n   *\n   * The decisive difference between the two flavours: the local search only\n   * hides/reveals and highlights rows that are already in the DOM, while here every\n   * change POSTs the filter form to its cs-snippet URL and the server answers with\n   * re-rendered fragments that replace the live ones.\n   *\n   * That is also why this class distinguishes two wiring lifetimes:\n   *   - once (constructor): things outside the replaced fragments — the free-text\n   *     term and hidden inputs (EhFilterControls), the page-level outside click and\n   *     the window listeners.\n   *   - rewire(): everything inside the replaced fragments. Called again after every\n   *     response, which is why the element-holding parts are re-created there.\n   *\n   * This class stays the single catalogue of the block's hook classes. The parts read\n   * them from here inside method bodies only, so the bundle order of the split files\n   * does not matter.\n   */\n  export class EhFilterController {\n\n    public static BLOCK_CLASSNAME: string = 'ehts-filter-block';\n\n    static ehInit($base: JQuery<HTMLElement>, isSnippetRequest: boolean): void {\n      $(`.${EhFilterController.BLOCK_CLASSNAME}`, $base).each((_index: number, element: HTMLElement) => {\n        new EhFilterController(element);\n      });\n    }\n\n    // ---------------------------------------------------------------- block ----\n    public static FILTER_WRAPPER: string = 'ehel-product-finder';\n    public static FILTER_WRAPPER_BLOCK: string = 'ehel-filter-block';\n    public static FILTER_RESULTS_MENU_CLASSNAME: string = 'ehts-filter-block--results-menu'; // wrapper of the filter pills\n\n    // --------------------------------------------------------------- filter ----\n    public static FILTER_WRAPPER_CLASSNAME: string = 'ehel-filter-wrapper'; // wrapper of one filter (pill + flyout)\n    public static FILTER_CLASSNAME: string = 'ehel-filter--filter'; // the pill opening the option list\n    public static FILTER_CATEGORY_ITEM_CLASSNAME: string = 'eh-accordion-ctrl--category-item';\n    public static FILTER_MENU_FILTER_WRAPPER_CLASSNAME: string = 'ehts-filter-block--filter-wrapper';\n\n    // -------------------------------------------------------------- options ----\n    public static FILTER_SELECTION_LIST_CLASSNAME: string = 'ehel-filter--filters-selection-list'; // option list\n    public static FILTER_SELECTION_LIST_SEL_ALL_CLASSNAME: string = 'ehel-filter--filters-selection-list-sel-all';\n    public static FILTER_SELECTION_LIST_SEL_NONE_CLASSNAME: string = 'ehel-filter--filters-selection-list-sel-none';\n    public static FILTER_SELECTION_LIST_LOADING_CLASSNAME: string = 'ehel-filter--filters-selection-list-loading'; // request cover\n    public static FILTER_CONTROL_CLONE: string = 'ehts-cbx-clone'; // drawer copies of the desktop options\n    public static FILTER_IGNORE_CHANGE_CLASSNAME: string = 'ehts-filter-block--ignore-change'; // input that must not trigger a request\n\n    // --------------------------------------------------------------- drawer ----\n    public static FILTER_SELECTION_CLASSNAME: string = 'ehel-filter--filters-selection'; // the drawer itself\n    public static FILTER_SELECTION_GROUP_CLASSNAME: string = 'ehts-filter-block--filter-group'; // its scrollable group list\n    public static FILTER_FILTERS_OPEN_CLASSNAME: string = 'ehel-filter--menu-open';\n    public static FILTER_FILTERS_CLOSE_CLASSNAME: string = 'ehel-filter--menu-close';\n    public static FILTER_DRAWER_MENU_OPEN_CLASSNAME: string = 'ehel-drawer--menu-open'; // handled by DrawerController\n    public static FILTER_MENU_OPENED_CLASSNAME: string = 'ehel-filter--filters-selection-opened';\n    public static FILTER_MENU_HEADLINE_CLASSNAME: string = 'ehts-filter-block--filter-headline';\n    public static FILTER_MENU_ACTIONS_CLASSNAME: string = 'ehts-filter-block--filters-actions';\n\n    // ------------------------------------------------- active filter pills ----\n    public static FILTER_SELECTED_CLASSNAME: string = 'ehts-filter-block--filters-selected';\n    public static FILTERS_SELECTED_WRAPPER_CLASSNAME: string = 'ehts-filter-block--filters-selected-wrapper';\n    public static FILTERS_SELECTED_ITEM_CLASSNAME: string = 'ehts-filter-block--filters-selected-item';\n    public static FILTERS_SELECTED_SHOW_MORE_CLASSNAME: string = 'ehts-filter-block--filters-selected-show-more';\n    public static FILTERS_SELECTED_SHOW_MORE_LABEL_CLASSNAME: string = 'eh-label';\n    public static FILTERS_SELECTED_CLEAR_BTN_CLASSNAME: string = 'ehts-filter-block--filters-selected-clear-btn'; // measured only\n    public static FILTER_REMOVE_SINGLE_CLASSNAME: string = 'ehel-filter-filters-remove-single'; // the X on one pill\n    public static FORM_RESET_TRIGGER_CLASSNAME: string = 'ehts-filter-block-trigger-form-reset'; // \"clear all\"\n\n    // ------------------------------------------------------- text / hidden ----\n    public static FILTER_TEXT_CLASSNAME: string = 'ehts-filter--filters-text';\n    public static FILTER_TEXT_CLEAR_CLASSNAME: string = 'ehts-filter--filters-text-clear';\n    public static FILTER_HIDDEN_CHANGE_CLASSNAME: string = 'ehts-filter--hidden-change';\n\n    // ------------------------------------------------------ icons / states ----\n    public static ICON_CLASSNAME: string = 'ehel-icon';\n    public static SPINNER_CLASSNAMES: string = 'icon-ehel-spinner ehtw-animate-spin';\n    public static REMOVE_CLASSNAMES: string = 'icon-ehel-cancel';\n    public static ARROW_DOWN_CLASSNAME: string = 'icon-ehel-arrow-down';\n    public static ARROW_UP_CLASSNAME: string = 'icon-ehel-arrow-up';\n    public static HIDDEN_CLASSNAME: string = 'ehtw-hidden';\n    public static FLEX_WRAP_CLASSNAME: string = 'ehtw-flex-wrap';\n    public static SHADOW_CLASSNAME: string = 'has-shadow';\n    public static ACTIVE_CLASSNAME: string = 'is-active';\n    public static OPEN_CLASSNAME: string = 'is-open';\n    public static LOADING_CLASSNAME: string = 'is-loading';\n\n    // elements that must not take focus when clicked\n    private static NO_CLICK_FOCUS_CLASSNAME: string = 'ehts-no-click-focus';\n    // the site-search sort menu, whose clicks must never reach this block\n    private static SORT_MENU_CLASSNAME: string = 'ehts-sort-menu';\n\n    private readonly el: HTMLElement;\n    private readonly form: HTMLFormElement | null;\n    private readonly page: HTMLElement = document.scrollingElement as HTMLElement;\n\n    private readonly request: EhFilterRequest;\n    private controls: EhFilterControls | null = null;\n\n    // parts holding element references — re-created by rewire() after each response\n    private flyout: EhFilterFlyout | null = null;\n    private layout: EhFilterLayout | null = null;\n    private drawer: EhFilterDrawer | null = null;\n    private selection: EhFilterSelection | null = null;\n    private sort: EhFilterSort | null = null;\n\n    constructor(base: HTMLElement) {\n      this.el = base;\n      this.form = this.el.querySelector('form');\n      this.request = new EhFilterRequest(this);\n      if (!this.rewire()) {\n        return;\n      }\n      // wired once: these live outside the fragments the server replaces\n      this.controls = new EhFilterControls(this, this.el);\n      this.page.addEventListener('click', this.onPageClick);\n      window.addEventListener('resize', this.onWindowResized);\n      window.addEventListener('scroll', this.onWindowScroll);\n    }\n\n    // ------------------------------------------------------------------------\n    // what the parts need from the block\n    // ------------------------------------------------------------------------\n\n    /** The filter block's root element. */\n    public get element(): HTMLElement {\n      return this.el;\n    }\n\n    /** The filter form; carries `data-snippet-url`. */\n    public get formElement(): HTMLFormElement | null {\n      return this.form;\n    }\n\n    /** Hidden inputs whose value has to travel with every request. */\n    public get hiddenInputs(): NodeListOf<HTMLInputElement> | undefined {\n      return this.controls?.hiddenInputs;\n    }\n\n    /** The current free-text term, used to re-highlight replaced result rows. */\n    public get searchTerm(): string {\n      return this.controls?.term ?? '';\n    }\n\n    /** Run a server-side update: serialize the form, POST it, patch the response in. */\n    public requestUpdate(e: UIEvent, addSpinner: boolean = true): void {\n      this.request.send(e, addSpinner);\n    }\n\n    /**\n     * (Re-)discover the DOM and (re-)create every part that holds element\n     * references. Called from the constructor and again by EhFilterResponse after\n     * each response, because the replaced fragments contain fresh elements.\n     */\n    public rewire(): boolean {\n      const menu = this.el.querySelector<HTMLElement>(`.${EhFilterController.FILTER_SELECTION_CLASSNAME}`);\n      const resultsMenu = this.el.querySelector<HTMLElement>(`.${EhFilterController.FILTER_RESULTS_MENU_CLASSNAME}`);\n      const menuGroup = menu?.querySelector<HTMLElement>(`.${EhFilterController.FILTER_SELECTION_GROUP_CLASSNAME}`);\n      if (!menu || !resultsMenu || !menuGroup) {\n        console.log('EhFilterController: Missing required elements', {el: this.el, menu: menu, resultsMenu: resultsMenu, menuGroup: menuGroup});\n        return false;\n      }\n      this.flyout = new EhFilterFlyout(this.el, menuGroup);\n      this.layout = new EhFilterLayout(this.el, resultsMenu);\n      this.drawer = new EhFilterDrawer(this.el, menu, menuGroup, this.flyout);\n      this.selection = new EhFilterSelection(this, this.el, this.flyout);\n      this.sort = new EhFilterSort(this, this.el);\n      this.el.querySelectorAll(`.${EhFilterController.NO_CLICK_FOCUS_CLASSNAME}`)\n        .forEach(elem => elem.addEventListener('mousedown', EhFilterController.preventFocus));\n      return true;\n    }\n\n    // ------------------------------------------------------------------------\n    // page level events\n    // ------------------------------------------------------------------------\n\n    private static preventFocus = (e: Event): void => {\n      e.preventDefault();\n    }\n\n    /** A click anywhere on the page closes the open flyout — unless it was in one. */\n    private onPageClick = (e: MouseEvent | TouchEvent): void => {\n      const target = e.target as HTMLElement;\n      if ($(target).selfOrClosest(`.${EhFilterController.SORT_MENU_CLASSNAME}`).length > 0) {\n        e.preventDefault();\n        e.stopPropagation();\n        return;\n      }\n      // a click on a pill is that pill's own business (it toggles itself)\n      if ($(target).closest(`.${EhFilterController.FILTER_CLASSNAME}`).length === 0) {\n        this.flyout?.clickRoot(target);\n      }\n    }\n\n    private onWindowResized = (): void => {\n      this.onResizeDebounced();\n    }\n\n    private onWindowScroll = (): void => {\n      this.onScrollDebounced();\n    }\n\n    // One stable debounced callback each, so repeated events really do collapse\n    // (the original created a new debounce wrapper per event, which never did).\n    private readonly onResizeDebounced = eh.debounce((): void => {\n      this.flyout?.reset();\n      this.layout?.recalculate();\n    }, 100);\n\n    private readonly onScrollDebounced = eh.debounce((): void => {\n      this.layout?.recalculate();\n    }, 10);\n  }\n}\n","namespace eh {\n\n  /**\n   * The controls of a server-side filter block that trigger a request without\n   * being filter options: the free-text term and the hidden state inputs.\n   *\n   * These live outside the fragments the server replaces, so unlike the option\n   * inputs they are wired exactly once (see EhFilterController.rewire()).\n   *\n   * Unlike the local search, the term is not applied in the browser: it goes into\n   * the request and the server returns the matching page. The typed term is only\n   * re-used client-side to re-highlight the incoming rows (EhFilterResponse).\n   *\n   * Split out of EhFilterController (eh.pc.Filter.controller.ts).\n   */\n  export class EhFilterControls {\n\n    // a term is searched once it is empty again (reset) or at least this long\n    private static readonly MIN_TERM_LENGTH = 2;\n    // debounce between the last keystroke and the request\n    private static readonly KEYUP_DELAY = 200;\n    // Opt-in: only a filter block carrying this attribute reports its term field to\n    // the tracking, with the attribute value as event_subtype. Deliberately NOT\n    // named data-cs-tracking-subtype -- that one would be inherited by every click\n    // inside the block.\n    private static readonly TRACK_SUBTYPE_ATTR = 'data-trck-search-subtype';\n    /*\n     * The search click event marks the start of a typing session, not every keystroke.\n     * Without this latch every letter produced another identical event next to the page\n     * view -- QA package 2, rows 23 and 158. Reset once the field is empty again, so a\n     * fresh term counts as a new session.\n     */\n    private searchEventSent: boolean = false;\n\n    private readonly textInput: HTMLInputElement | null;\n    private readonly hiddenChangeInputs: NodeListOf<HTMLInputElement>;\n    private keyupTimeout: number | undefined = undefined;\n\n    constructor(\n      private readonly ctx: EhFilterController,\n      private readonly root: HTMLElement\n    ) {\n      this.textInput = this.root.querySelector<HTMLInputElement>(`.${EhFilterController.FILTER_TEXT_CLASSNAME} input`);\n      this.hiddenChangeInputs = this.root.querySelectorAll<HTMLInputElement>(`input.${EhFilterController.FILTER_HIDDEN_CHANGE_CLASSNAME}`);\n      this.registerControls();\n    }\n\n    /** The current term; used to re-highlight replaced result rows. */\n    public get term(): string {\n      return this.textInput?.value ?? '';\n    }\n\n    /** Hidden inputs whose value has to travel with every request. */\n    public get hiddenInputs(): NodeListOf<HTMLInputElement> {\n      return this.hiddenChangeInputs;\n    }\n\n    private registerControls(): void {\n      if (this.textInput) {\n        this.textInput.addEventListener('keyup', this.onKeyUp);\n        this.textInput.addEventListener('focusin', this.onTrackActivate);\n        this.root.querySelector(`.${EhFilterController.FILTER_TEXT_CLEAR_CLASSNAME}`)\n          ?.addEventListener('click', this.onTermReset);\n      }\n      let hasHiddenValue = false;\n      this.hiddenChangeInputs.forEach(input => {\n        input.addEventListener('change', this.onHiddenChange);\n        hasHiddenValue = hasHiddenValue || !!input.value;\n      });\n      // a hidden input that already carries a value on load is a pre-set filter the\n      // server has to be told about right away\n      if (hasHiddenValue) {\n        this.ctx.requestUpdate(new Event('change') as UIEvent, false);\n      }\n    }\n\n    private onHiddenChange = (e: Event): void => {\n      this.ctx.requestUpdate(e as UIEvent, false);\n    }\n\n    /** Search after a short pause — either the term is long enough, or cleared. */\n    private onKeyUp = (e: KeyboardEvent): void => {\n      if (this.keyupTimeout) {\n        clearTimeout(this.keyupTimeout);\n      }\n      const value = (e.target as HTMLInputElement | null)?.value;\n      if (value === undefined || !(value === '' || value.length >= EhFilterControls.MIN_TERM_LENGTH)) {\n        return;\n      }\n      // capture now: the debounced callback runs later, by which time the event\n      // target may already be detached\n      const el = e.target as HTMLInputElement;\n      this.keyupTimeout = window.setTimeout(() => {\n        this.ctx.requestUpdate(e as unknown as UIEvent);\n        this.trackTerm(el, value);\n        this.keyupTimeout = undefined;\n      }, EhFilterControls.KEYUP_DELAY);\n    }\n\n    /** The event_subtype this block reports its search with, or null if it opted out. */\n    private trackSubtype(): string | null {\n      return this.root.closest(`[${EhFilterControls.TRACK_SUBTYPE_ATTR}]`)\n        ?.getAttribute(EhFilterControls.TRACK_SUBTYPE_ATTR) || null;\n    }\n\n    /** Clicking into the search bar is reported as a content link. */\n    private onTrackActivate = (e: Event): void => {\n      const subtype = this.trackSubtype();\n      if (subtype && e.currentTarget) {\n        eh.Tracking.injectTrackingEvent({'event_subtype': subtype}, $(e.currentTarget as HTMLElement), 'content_link');\n      }\n    }\n\n    /**\n     * The first keystroke of a session fires the search event; every debounced\n     * keystroke fires a virtual page view carrying the term as search_term_keyword.\n     * The \"search\" segment is appended to the deepest existing site_hN, so once the\n     * surrounding drawer has registered itself as onsite navigation the page name\n     * reads ...product-downloads.downloads.search.\n     */\n    private trackTerm(el: HTMLInputElement | null, term: string): void {\n      if (term.trim().length === 0) {\n        this.searchEventSent = false;\n        return;\n      }\n      const subtype = this.trackSubtype();\n      if (!subtype || !el || term.trim().length < EhFilterControls.MIN_TERM_LENGTH) {\n        return;\n      }\n      if (!this.searchEventSent) {\n        this.searchEventSent = true;\n        eh.Tracking.injectTrackingEvent({'event_subtype': subtype}, $(el), 'search');\n      }\n\n      eh.Tracking.trackSearchTermView(term);\n    }\n\n    private onTermReset = (e: Event): void => {\n      e.preventDefault();\n      this.searchEventSent = false;\n      if (this.textInput?.value?.length) {\n        this.textInput.value = '';\n        this.ctx.requestUpdate(e as UIEvent);\n      }\n    }\n  }\n\n  /**\n   * The sort dropdown of a server-side filter block.\n   *\n   * Sorting is a server concern, so picking an entry just fires a request; the only\n   * client-side work is keeping the native dropdown from fighting the CSS\n   * `:focus-within` mechanism it is opened with.\n   *\n   * Lives inside a replaced fragment, so it is re-created on every rewire.\n   *\n   * Split out of EhFilterController (eh.pc.Filter.controller.ts).\n   */\n  export class EhFilterSort {\n\n    private static readonly WRAPPER_CLASSNAME = 'ehts-filter-block--sorting';\n    private static readonly MENU_CLASSNAME = EhFilterSort.WRAPPER_CLASSNAME + '-menu';\n    private static readonly ENTRY_CLASSNAME = EhFilterSort.WRAPPER_CLASSNAME + '-entry';\n    private static readonly DROPDOWN_SELECTOR = '.ehel-dropdown';\n\n    private readonly menu: HTMLElement | null;\n\n    constructor(\n      private readonly ctx: EhFilterController,\n      root: HTMLElement\n    ) {\n      const wrapper = root.querySelector<HTMLElement>(`.${EhFilterSort.WRAPPER_CLASSNAME}`);\n      this.menu = wrapper?.querySelector<HTMLElement>(`.${EhFilterSort.MENU_CLASSNAME}`) ?? null;\n      this.registerControls(wrapper);\n    }\n\n    private registerControls(wrapper: HTMLElement | null): void {\n      this.menu?.querySelectorAll('span').forEach(span => span.addEventListener('click', EhFilterSort.onMenuClick));\n      this.menu?.addEventListener('click', EhFilterSort.onMenuClick);\n      this.menu?.addEventListener('mousedown', this.onMenuMouseDown);\n      wrapper?.querySelectorAll<HTMLElement>(`.${EhFilterSort.ENTRY_CLASSNAME}`).forEach(entry => {\n        const radio = entry.querySelector<HTMLInputElement>('input[type=radio]');\n        // the entry that is the current sort order would only re-request the same\n        // result, so it stays unwired\n        if (radio && !radio.checked) {\n          radio.addEventListener('change', this.onSortChange);\n        }\n      });\n    }\n\n    private onSortChange = (e: Event): void => {\n      this.ctx.requestUpdate(e as UIEvent);\n    }\n\n    /** Clicks inside the open menu must not bubble out and close it again. */\n    private static onMenuClick = (e: MouseEvent | TouchEvent): void => {\n      if ($(e.target as HTMLElement).selfOrClosest(`.${EhFilterSort.MENU_CLASSNAME}`).length > 0) {\n        e.preventDefault();\n        e.stopPropagation();\n      }\n    }\n\n    /**\n     * The dropdown opens via `:focus-within`; a second mousedown on the trigger has\n     * to blur it instead of re-focusing, otherwise it can never be closed by\n     * clicking the trigger again.\n     */\n    private onMenuMouseDown = (e: MouseEvent): void => {\n      if (this.menu?.closest(EhFilterSort.DROPDOWN_SELECTOR)?.matches(':focus-within')) {\n        e.preventDefault();\n        (document.activeElement as HTMLElement)?.blur();\n      }\n    }\n  }\n}\n","namespace eh {\n\n  /**\n   * The filter drawer of a server-side filter block — the full-height \"Filters\"\n   * panel opened from the filter bar (mobile, and the desktop \"Filters\" button).\n   *\n   * Owns opening / closing including the page scroll lock, and the two scroll\n   * shadows that indicate the group list can be scrolled further (on the drawer's\n   * headline and on its action footer).\n   *\n   * Note this is not the generic DrawerController: the drawer of a filter block is\n   * driven by the filter bar's own pills, and opening it has to close any open\n   * flyout — hence the EhFilterFlyout reference. Buttons that carry the generic\n   * `ehel-drawer--menu-open` class are left to DrawerController on purpose.\n   *\n   * Split out of EhFilterController / EhFilterViewModel (eh.pc.Filter.controller.ts).\n   */\n  export class EhFilterDrawer {\n\n    // submit button in the drawer footer (\"Show n results\") — closes the drawer\n    private static readonly SUBMIT_CLASSNAME = 'ehts-filter-menu-close';\n    // page-scroll lock marker, shared with eh.ScrollPage\n    private static readonly NO_SCROLL_CLASSNAME = 'eh-no-scroll';\n\n    constructor(\n      private readonly root: HTMLElement,\n      private readonly menu: HTMLElement,\n      private readonly menuGroup: HTMLElement,\n      private readonly flyout: EhFilterFlyout\n    ) {\n      this.registerControls();\n    }\n\n    private registerControls(): void {\n      this.root.querySelectorAll<HTMLElement>(`.${EhFilterController.FILTER_FILTERS_OPEN_CLASSNAME}`).forEach(btn => {\n        // generic drawer buttons are handled by DrawerController\n        if (!btn.classList.contains(EhFilterController.FILTER_DRAWER_MENU_OPEN_CLASSNAME)) {\n          btn.addEventListener('click', this.onOpenClick);\n        }\n      });\n      this.root.querySelectorAll<HTMLElement>(`.${EhFilterController.FILTER_FILTERS_CLOSE_CLASSNAME}`)\n        .forEach(btn => btn.addEventListener('click', this.onCloseClick));\n      this.root.querySelectorAll<HTMLElement>(`.${EhFilterDrawer.SUBMIT_CLASSNAME}`)\n        .forEach(btn => btn.addEventListener('click', this.onCloseClick));\n\n      this.menuGroup.addEventListener('scroll', this.onMenuGroupScroll);\n      this.menuGroup.querySelectorAll(`.${EhFilterController.FILTER_CATEGORY_ITEM_CLASSNAME}`)\n        .forEach(category => category.addEventListener('click', this.onMenuGroupScroll));\n    }\n\n    private onOpenClick = (e: UIEvent): void => {\n      e.preventDefault();\n      e.stopPropagation();\n      (e.currentTarget as HTMLElement).blur();\n      this.open();\n    }\n\n    private onCloseClick = (e: UIEvent): void => {\n      e.preventDefault();\n      e.stopPropagation();\n      (e.currentTarget as HTMLElement).blur();\n      this.close();\n    }\n\n    public open(): void {\n      // closes open flyouts and collapses the drawer's groups\n      this.flyout.reset();\n      this.root.classList.add(EhFilterController.FILTER_MENU_OPENED_CLASSNAME);\n      eh.ScrollPage.setScrollEnabled(false, EhFilterDrawer.NO_SCROLL_CLASSNAME);\n    }\n\n    public close(): void {\n      this.root.classList.remove(EhFilterController.FILTER_MENU_OPENED_CLASSNAME);\n      eh.ScrollPage.setScrollEnabled(true, EhFilterDrawer.NO_SCROLL_CLASSNAME);\n      this.flyout.reset();\n    }\n\n    private onMenuGroupScroll = (): void => {\n      this.updateScrollShadowsDebounced();\n    }\n\n    private readonly updateScrollShadowsDebounced = eh.debounce(() => this.updateScrollShadows(), 20);\n\n    /**\n     * Shadow on the headline once the list is scrolled down, shadow on the action\n     * footer as long as there is more to scroll. Both off when everything fits.\n     */\n    private updateScrollShadows(): void {\n      let childHeight = 0;\n      for (let i = 0; i < this.menuGroup.children.length; i++) {\n        childHeight += this.menuGroup.children[i].clientHeight;\n      }\n      const scrollable = childHeight > this.menuGroup.clientHeight;\n      const atBottom = this.menuGroup.scrollTop + this.menuGroup.clientHeight >= this.menuGroup.scrollHeight;\n      this.toggleShadow(EhFilterController.FILTER_MENU_ACTIONS_CLASSNAME, scrollable && !atBottom);\n      this.toggleShadow(EhFilterController.FILTER_MENU_HEADLINE_CLASSNAME, scrollable && this.menuGroup.scrollTop > 0);\n    }\n\n    private toggleShadow(className: string, on: boolean): void {\n      this.menu.querySelector(`.${className}`)?.classList.toggle(EhFilterController.SHADOW_CLASSNAME, on);\n    }\n  }\n}\n","namespace eh {\n\n  /**\n   * The pill flyouts of a server-side filter block: clicking a filter pill in the\n   * bar opens its option list below.\n   *\n   * This is the server-side counterpart of FlyoutController\n   * (eh.Flyout.controller.ts), reduced to what the server flow actually needs —\n   * only the panel's visual state:\n   *   - which pill is active, and its arrow icon direction\n   *   - showing / hiding the option list, nudged back into the viewport when it\n   *     would overflow on the right\n   *   - closing again on an outside click\n   *\n   * Selecting an option is deliberately NOT here: unlike the local search, a\n   * selection round-trips to the server and is owned by EhFilterSelection /\n   * EhFilterRequest. \"Select all\" / \"Reset\" per group likewise live in\n   * EhFilterSelection, because both have to trigger a request.\n   *\n   * Split out of EhFilterViewModel (eh.pc.Filter.controller.ts).\n   */\n  export class EhFilterFlyout {\n\n    // px kept free between the flyout's right edge and the viewport edge\n    private static readonly VIEWPORT_MARGIN = 16;\n\n    private static readonly wiredFilters = new WeakSet<HTMLElement>();\n\n    private readonly filters: NodeListOf<HTMLElement>;\n\n    constructor(\n      private readonly root: HTMLElement,\n      private readonly menuGroup: HTMLElement\n    ) {\n      this.filters = this.root.querySelectorAll<HTMLElement>(`.${EhFilterController.FILTER_CLASSNAME}`);\n      this.registerControls();\n    }\n\n    private registerControls(): void {\n      this.filters.forEach(filter => {\n        if (EhFilterFlyout.wiredFilters.has(filter)) {\n          return;\n        }\n        EhFilterFlyout.wiredFilters.add(filter);\n        filter.addEventListener('click', this.onFilterClick);\n      });\n      // the cover shown while a request runs must swallow clicks on the options\n      this.root.querySelectorAll(`.${EhFilterController.FILTER_SELECTION_LIST_LOADING_CLASSNAME}`)\n        .forEach(cover => cover.addEventListener('click', EhFilterFlyout.onLoadingClick));\n    }\n\n    private onFilterClick = (e: UIEvent): void => {\n      e.preventDefault();\n      this.showFilter(e.currentTarget as HTMLElement);\n    }\n\n    private static onLoadingClick = (e: Event): void => {\n      e.preventDefault();\n      e.stopPropagation();\n      (e.currentTarget as HTMLElement).blur();\n    }\n\n    /** Toggle the clicked pill's flyout; any other open one closes. */\n    public showFilter(filter: HTMLElement | null): void {\n      if (!filter) {\n        return;\n      }\n      const wasActive = filter.classList.contains(EhFilterController.ACTIVE_CLASSNAME);\n      this.reset();\n      if (wasActive) {\n        return;\n      }\n      filter.classList.add(EhFilterController.ACTIVE_CLASSNAME);\n      this.setArrow(filter, true);\n      const list = filter.closest(`.${EhFilterController.FILTER_WRAPPER_CLASSNAME}`)\n        ?.querySelector<HTMLElement>(`.${EhFilterController.FILTER_SELECTION_LIST_CLASSNAME}`);\n      if (list) {\n        list.classList.remove(EhFilterController.HIDDEN_CLASSNAME);\n        this.keepInViewport(list);\n      }\n    }\n\n    /**\n     * Pull the flyout left when it would stick out on the right (SPD downloads\n     * feedback). `left: unset` first so the measurement is not skewed by a value\n     * from a previous open.\n     */\n    private keepInViewport(list: HTMLElement): void {\n      list.style.left = 'unset';\n      const rect = list.getBoundingClientRect();\n      if (rect.left + rect.width > window.innerWidth) {\n        list.style.left = `${window.innerWidth - rect.left - rect.width - EhFilterFlyout.VIEWPORT_MARGIN}px`;\n      }\n    }\n\n    /** Close every flyout and collapse the drawer's filter groups. */\n    public reset(): void {\n      this.filters.forEach(filter => {\n        filter.classList.remove(EhFilterController.ACTIVE_CLASSNAME);\n        this.setArrow(filter, false);\n        filter.closest(`.${EhFilterController.FILTER_WRAPPER_CLASSNAME}`)\n          ?.querySelector(`.${EhFilterController.FILTER_SELECTION_LIST_CLASSNAME}`)\n          ?.classList.add(EhFilterController.HIDDEN_CLASSNAME);\n      });\n      this.collapseGroups();\n    }\n\n    /** Collapse the filter groups inside the drawer's scroll area. */\n    public collapseGroups(): void {\n      this.menuGroup.querySelectorAll(`.${EhFilterController.FILTER_MENU_FILTER_WRAPPER_CLASSNAME}`)\n        .forEach(filter => filter.classList.remove(EhFilterController.OPEN_CLASSNAME));\n    }\n\n    /**\n     * Point the pill's arrow up (open) or down (closed). Skipped while the pill is\n     * loading, because then the icon is showing a spinner that must not be\n     * overwritten.\n     */\n    private setArrow(filter: HTMLElement, up: boolean): void {\n      const icon = filter.querySelector(`.${EhFilterController.ICON_CLASSNAME}`);\n      if (!icon || icon.closest(`.${EhFilterController.LOADING_CLASSNAME}`)) {\n        return;\n      }\n      icon.classList.remove(up ? EhFilterController.ARROW_DOWN_CLASSNAME : EhFilterController.ARROW_UP_CLASSNAME);\n      icon.classList.add(up ? EhFilterController.ARROW_UP_CLASSNAME : EhFilterController.ARROW_DOWN_CLASSNAME);\n    }\n\n    /** Close all flyouts when a click landed outside any filter wrapper. */\n    public clickRoot(elem: HTMLElement | null): void {\n      if (!elem?.closest(`.${EhFilterController.FILTER_WRAPPER_CLASSNAME}`)) {\n        this.reset();\n      }\n    }\n  }\n}\n","namespace eh {\n\n  /**\n   * Pure layout/visibility maths of a server-side filter block — no AJAX, no\n   * open/close, no selection:\n   *   - reveal the filter pills that fit into the bar and hide the overflow\n   *   - the active-filter pill row: show/hide it, collapse the overflow into a\n   *     \"+N\" show-more pill, and put a shadow on the bar while it is scrolled\n   *\n   * Direct counterpart of FiltersLocalController (eh.FiltersLocal.controller.ts),\n   * which does the same for the local (client-side) spare-parts search. The two\n   * differ only in their hook classes — `ehts-filter-block--*` here vs\n   * `ehts-filters-local--*` there — because the server block's markup is shared\n   * with the finder skins.\n   *\n   * Recalculated on window resize/scroll (driven by EhFilterController) and once\n   * on creation, in the animation frame that follows: widths are not measurable\n   * before layout has run, and the clamp has to land before the browser paints the\n   * freshly swapped-in filter row, otherwise every pill shows unclamped for a frame.\n   *\n   * Split out of EhFilterViewModel (eh.pc.Filter.controller.ts).\n   */\n  export class EhFilterLayout {\n\n    // reserved space (px) at the end of a row for the menu / clear-all button\n    private static readonly ROW_RESERVE = 100;\n\n    constructor(\n      private readonly root: HTMLElement,\n      private readonly resultsMenu: HTMLElement\n    ) {\n      window.requestAnimationFrame(() => this.recalculate());\n    }\n\n    public recalculate(): void {\n      this.recalculateFilterGroupWrapper();\n      this.recalculateActiveFilters();\n    }\n\n    /** Reveal each filter pill that still fits into the bar, hide the rest. */\n    private recalculateFilterGroupWrapper(): void {\n      const filters = Array.from(\n        this.resultsMenu.querySelectorAll<HTMLElement>(`.${EhFilterController.FILTER_MENU_FILTER_WRAPPER_CLASSNAME}`)\n      );\n      const menuButton = this.resultsMenu.querySelector<HTMLElement>(`.${EhFilterController.FILTER_FILTERS_OPEN_CLASSNAME}`);\n      const available = this.resultsMenu.clientWidth - (menuButton?.clientWidth || 0) - EhFilterLayout.ROW_RESERVE;\n      // unhide everything before measuring: a hidden pill reports clientWidth 0\n      filters.forEach(filter => filter.classList.remove(EhFilterController.HIDDEN_CLASSNAME));\n      // Drop the overflow in the order the user sees, not in DOM order. A pill can be\n      // pulled to the front with CSS `order` (a preset declaring position=\"first\"), and\n      // going by the DOM would then hide exactly the pill shown first. Array.sort is\n      // stable, so with no explicit order anywhere this keeps the DOM sequence.\n      const seen = filters\n        .map(filter => ({ filter, order: parseInt(window.getComputedStyle(filter).order, 10) || 0 }))\n        .sort((a, b) => a.order - b.order);\n      let sum = 0;\n      seen.forEach(({ filter }) => {\n        const isOpen = filter.querySelector(`.${EhFilterController.FILTER_CLASSNAME}.${EhFilterController.ACTIVE_CLASSNAME}`) !== null;\n        sum += filter.clientWidth;\n        if (sum >= available && !isOpen) {\n          filter.classList.add(EhFilterController.HIDDEN_CLASSNAME);\n        }\n      });\n    }\n\n    /**\n     * Show/hide the active-filter pill row and collapse its overflow into a \"+N\"\n     * show-more pill.\n     */\n    private recalculateActiveFilters(): void {\n      const filtersSelected = this.root.querySelector<HTMLElement>(`.${EhFilterController.FILTER_SELECTED_CLASSNAME}`);\n      if (!filtersSelected) {\n        return;\n      }\n      const activeFilters = filtersSelected.querySelectorAll<HTMLElement>(`.${EhFilterController.FILTERS_SELECTED_ITEM_CLASSNAME}`);\n      if (!activeFilters.length) {\n        filtersSelected.classList.add(EhFilterController.HIDDEN_CLASSNAME);\n        return;\n      }\n      const wrapper = filtersSelected.querySelector<HTMLElement>(`.${EhFilterController.FILTERS_SELECTED_WRAPPER_CLASSNAME}`);\n      const showMore = filtersSelected.querySelector<HTMLElement>(`.${EhFilterController.FILTERS_SELECTED_SHOW_MORE_CLASSNAME}`);\n      const showMoreLabel = showMore?.querySelector<HTMLElement>(`.${EhFilterController.FILTERS_SELECTED_SHOW_MORE_LABEL_CLASSNAME}`);\n      const clearAll = filtersSelected.querySelector<HTMLElement>(`.${EhFilterController.FILTERS_SELECTED_CLEAR_BTN_CLASSNAME}`);\n\n      filtersSelected.classList.remove(EhFilterController.HIDDEN_CLASSNAME);\n      wrapper?.classList.remove(EhFilterController.FLEX_WRAP_CLASSNAME);\n      // stable handler reference so the listener is really replaced and not stacked\n      // up on every recalculation (the original passed a fresh debounce wrapper to\n      // removeEventListener, which could never match)\n      wrapper?.removeEventListener('scroll', this.onActiveFiltersScroll);\n      wrapper?.addEventListener('scroll', this.onActiveFiltersScroll);\n\n      const available = filtersSelected.clientWidth - (clearAll?.clientWidth || 0) - EhFilterLayout.ROW_RESERVE;\n      let sum = 0;\n      let hidden = 0;\n      activeFilters.forEach(activeFilter => {\n        activeFilter.classList.remove(EhFilterController.HIDDEN_CLASSNAME);\n        sum += activeFilter.clientWidth;\n        if (sum >= available) {\n          activeFilter.classList.add(EhFilterController.HIDDEN_CLASSNAME);\n          hidden++;\n        }\n      });\n\n      if (hidden > 0) {\n        showMore?.classList.remove(EhFilterController.HIDDEN_CLASSNAME);\n        showMore?.removeEventListener('click', this.onShowMoreClick);\n        showMore?.addEventListener('click', this.onShowMoreClick);\n        if (showMoreLabel) {\n          showMoreLabel.textContent = `+${hidden}`;\n        }\n      } else {\n        showMore?.classList.add(EhFilterController.HIDDEN_CLASSNAME);\n      }\n    }\n\n    private onActiveFiltersScroll = (): void => {\n      const wrapper = this.root\n        .querySelector(`.${EhFilterController.FILTER_SELECTED_CLASSNAME}`)\n        ?.querySelector(`.${EhFilterController.FILTERS_SELECTED_WRAPPER_CLASSNAME}`);\n      this.resultsMenu.classList.toggle(EhFilterController.SHADOW_CLASSNAME, (wrapper?.scrollLeft || 0) > 0);\n    }\n\n    /** \"+N\" clicked: drop the clamp and wrap the row so every pill is visible. */\n    private onShowMoreClick = (e: Event): void => {\n      e.preventDefault();\n      e.stopPropagation();\n      const filtersSelected = this.root.querySelector<HTMLElement>(`.${EhFilterController.FILTER_SELECTED_CLASSNAME}`);\n      if (!filtersSelected) {\n        return;\n      }\n      filtersSelected.querySelector(`.${EhFilterController.FILTERS_SELECTED_SHOW_MORE_CLASSNAME}`)\n        ?.classList.add(EhFilterController.HIDDEN_CLASSNAME);\n      filtersSelected.querySelector(`.${EhFilterController.FILTERS_SELECTED_WRAPPER_CLASSNAME}`)\n        ?.classList.add(EhFilterController.FLEX_WRAP_CLASSNAME);\n      filtersSelected.querySelectorAll(`.${EhFilterController.FILTERS_SELECTED_ITEM_CLASSNAME}`)\n        .forEach(activeFilter => activeFilter.classList.remove(EhFilterController.HIDDEN_CLASSNAME));\n    }\n  }\n}\n","namespace eh {\n\n  /**\n   * Server-side half of a filter block — the counterpart to the *local* search in\n   * eh.SearchInline.controller.ts.\n   *\n   * This is the decisive difference between the two search flavours:\n   *  - local search  : the result rows are already in the DOM; searching only\n   *                    hides/reveals and highlights them (SearchInlineViewModel).\n   *  - server search : every change POSTs the filter form to its cs-snippet URL;\n   *                    the server re-renders the fragments and we patch them into\n   *                    the live page. Nothing can be filtered client-side because\n   *                    the page only ever holds the current result page.\n   *\n   * Split out of EhFilterController, where request and response patching used to\n   * live in one ~185-line onChange method:\n   *  - EhFilterRequest  -> collect form state, mark loading, fire the POST\n   *  - EhFilterResponse -> patch the returned document into the live DOM\n   */\n  export class EhFilterRequest {\n\n    // cover class the skins show over an option list while a request is running\n    private static readonly LOADING_LIST_CLASSNAME = 'loading';\n\n    constructor(private readonly ctx: EhFilterController) {\n    }\n\n    /**\n     * Serialize the filter form and POST it to the snippet URL.\n     *\n     * `addSpinner` swaps the group's arrow icon for a spinner — it is off for\n     * changes the user did not trigger on an option directly (hidden inputs, a\n     * form reset), which is why the flag exists at all.\n     */\n    public send(e: UIEvent, addSpinner: boolean = true): void {\n      e.preventDefault();\n      const form = this.ctx.formElement;\n      const optionLists = this.markLoading(e, addSpinner);\n      if (!form || !form.dataset.snippetUrl) {\n        return;\n      }\n      const target = e.target as HTMLElement;\n      const data = this.collectData(form);\n\n      $(form).data('csTrackingAjaxChange', EhFilterRequest.trackingChangeType(target));\n      cs.Snippet.preAjax($(form.parentElement as HTMLElement), target);\n      $(form).data('csTrackingAjaxActivator', undefined);\n      $(form).data('csTrackingIsSnippetRequest', true);\n\n      $.ajax(form.dataset.snippetUrl, {method: 'POST', data: data}).done((d: string) => {\n        new EhFilterResponse(this.ctx).apply(d);\n        // Re-assert the loading cover, as before. These are the option lists from\n        // *before* the request, which the response has since replaced, so this only\n        // ever touches detached nodes — kept for behavioural equivalence.\n        EhFilterRequest.setLoading(optionLists);\n      });\n    }\n\n    /**\n     * Show the loading state: a spinner instead of the group's arrow, the \"loading\"\n     * cover over every option list and a loading pill.\n     * Returns the option lists so the caller can re-assert the state afterwards.\n     */\n    private markLoading(e: UIEvent, addSpinner: boolean): NodeListOf<HTMLElement> | undefined {\n      if (addSpinner) {\n        $(e.currentTarget as HTMLInputElement)\n          .closest(`.${EhFilterController.FILTER_CATEGORY_ITEM_CLASSNAME}`)\n          .find('span.eh-icon')\n          .removeClass(EhFilterController.ARROW_UP_CLASSNAME)\n          .addClass(EhFilterController.SPINNER_CLASSNAMES);\n        $(e.currentTarget as HTMLInputElement)\n          .closest(`.${EhFilterController.FILTER_SELECTION_LIST_CLASSNAME}`)\n          .addClass(EhFilterRequest.LOADING_LIST_CLASSNAME);\n      }\n      const optionLists = this.ctx.element.querySelectorAll<HTMLElement>(`.${EhFilterController.FILTER_SELECTION_LIST_CLASSNAME}`);\n      EhFilterRequest.setLoading(optionLists);\n      const pill = (e.currentTarget as HTMLElement)?.closest(`.${EhFilterController.FILTER_WRAPPER_CLASSNAME}`)?.querySelector('.ehel-pill');\n      pill?.classList.add(EhFilterController.LOADING_CLASSNAME);\n      return optionLists;\n    }\n\n    private static setLoading(optionLists: NodeListOf<HTMLElement> | undefined): void {\n      optionLists?.forEach(list => list.classList.add(EhFilterRequest.LOADING_LIST_CLASSNAME));\n    }\n\n    /**\n     * The request payload: the whole form plus two things FormData does not give\n     * us reliably here — the checked radios and the hidden inputs that carry state\n     * without taking part in the form submit.\n     */\n    private collectData(form: HTMLFormElement): {[key: string]: string} {\n      const data: {[key: string]: string} = {};\n      new FormData(form).forEach((value, key) => {\n        data[key] = value.toString();\n      });\n      $(form).find('input[type=radio]:checked').each((_i, cb) => {\n        const name = $(cb).attr('name');\n        if (name) {\n          data[name] = $(cb).val() as string;\n        }\n      });\n      this.ctx.hiddenInputs?.forEach(input => {\n        if (input.name && input.value) {\n          data[input.name] = input.value;\n        }\n      });\n      return data;\n    }\n\n    /**\n     * Which kind of change to report to the tracking layer.\n     *\n     * CHANGE_TYPE_SEARCH is not a filter change and is deliberately not reported as one:\n     * typing runs a request per keystroke, and every one of them used to fall through to\n     * 'filter_reset', which Tracking.trackFilterSubmit turns into two \"filter\" events. The\n     * search reports itself in EhFilterControls.trackTerm - the first keystroke as a search\n     * event, every later one as a virtual page view carrying the term.\n     */\n    public static readonly CHANGE_TYPE_SEARCH = 'search';\n\n    private static trackingChangeType(target: HTMLElement): string {\n      const $target = $(target);\n      if ($target.selfOrClosest(`.${EhFilterController.FILTER_TEXT_CLASSNAME}`).length) {\n        return EhFilterRequest.CHANGE_TYPE_SEARCH;\n      }\n      if ($target.selfOrClosest('.marker-sorting-click').length) {\n        return 'filter_sorting';\n      }\n      if ($target.is(\"input[type='checkbox']\") && $target.prop('checked')) {\n        return 'filter_selected';\n      }\n      if ($target.selfOrClosest('.marker-filters-clear').length) {\n        return 'filters_clear';\n      }\n      return 'filter_reset';\n    }\n  }\n\n  /**\n   * Applies a filter-block response to the live DOM.\n   *\n   * The server returns a whole re-rendered block; we only keep the parts marked\n   * `.ehts-filter-block--ajax-replace` (matched up by `data-replace-id`) plus the\n   * result cards. Everything the user had open (accordion groups, clone groups,\n   * flyout pills) is transient client state the server does not know about, so it\n   * is read off the current DOM first and re-applied to the incoming fragments.\n   */\n  export class EhFilterResponse {\n\n    private static readonly AJAX_REPLACE_CLASSNAME = 'ehts-filter-block--ajax-replace';\n    private static readonly ACTIVE_FILTERS_CLASSNAME = 'ehts-active-filters';\n    private static readonly RESULTS_SECTION_CLASSNAME = 'ehts-filter-block--section-results';\n    private static readonly RESULT_CARD_CLASSNAME = 'ehts-result-card';\n    private static readonly NO_RESULT_CARD_CLASSNAME = 'ehts-no-result-card';\n\n    constructor(private readonly ctx: EhFilterController) {\n    }\n\n    public apply(html: string): void {\n      const newDom = new DOMParser().parseFromString(html, 'text/html');\n      const replaceMap = this.buildReplaceMap(newDom);\n      this.syncActiveFilterCount(newDom);\n      this.pushHistoryUrl(newDom);\n      this.syncLoadMore(newDom);\n      const scrolled = this.swapFragments(replaceMap);\n      // the replaced fragments carry fresh elements -> bind them again\n      this.ctx.rewire();\n      this.reloadAccordions();\n      EhFilterResponse.restoreScroll(scrolled);\n      this.swapResultCards(newDom);\n      this.reloadLoadMore();\n    }\n\n    /**\n     * Index the incoming fragments by `data-replace-id` and carry the user's open\n     * state over to them.\n     */\n    private buildReplaceMap(newDom: Document): {[key: string]: HTMLElement} {\n      const replaceMap: {[key: string]: HTMLElement} = {};\n      const openFilters: string[] = [];\n      const openClones: string[] = [];\n      const openPills: string[] = [];\n\n      this.ctx.element.querySelectorAll(`${AccordionCtrl.ACCORDION_CATEGORY_SELECTOR}`).forEach((e: HTMLElement) => {\n        if (e.dataset.filterProperty && e.classList.contains(EhFilterController.OPEN_CLASSNAME)) {\n          openFilters.push(e.dataset.filterProperty);\n        }\n        if (e.dataset.cloneName && e.classList.contains(EhFilterController.OPEN_CLASSNAME)) {\n          openClones.push(e.dataset.cloneName);\n        }\n      });\n      this.ctx.element.querySelectorAll(`.${EhFilterController.FILTER_CLASSNAME}.${EhFilterController.ACTIVE_CLASSNAME}`).forEach((e: HTMLElement) => {\n        if (e.dataset.filterProperty) {\n          openPills.push(e.dataset.filterProperty);\n        }\n      });\n\n      newDom.querySelectorAll(`.${EhFilterResponse.AJAX_REPLACE_CLASSNAME}`).forEach((e: HTMLElement) => {\n        if (!e.dataset.replaceId) {\n          return;\n        }\n        replaceMap[e.dataset.replaceId] = e;\n        e.querySelectorAll(`${AccordionCtrl.ACCORDION_CATEGORY_SELECTOR}`).forEach((group: HTMLElement) => {\n          const wasOpen = (group.dataset.filterProperty && openFilters.indexOf(group.dataset.filterProperty) >= 0)\n            || (group.dataset.cloneName && openClones.indexOf(group.dataset.cloneName) >= 0);\n          if (wasOpen) {\n            group.classList.add(EhFilterController.OPEN_CLASSNAME);\n          }\n        });\n        e.querySelectorAll(`.${EhFilterController.FILTER_CLASSNAME}`).forEach((pill: HTMLElement) => {\n          if (pill.dataset.filterProperty && openPills.indexOf(pill.dataset.filterProperty) >= 0) {\n            this.reopenPill(pill);\n          }\n        });\n      });\n      return replaceMap;\n    }\n\n    /** Restore a pill's open look: active state, arrow up, option list revealed. */\n    private reopenPill(pill: HTMLElement): void {\n      pill.classList.add(EhFilterController.ACTIVE_CLASSNAME);\n      const icon = pill.querySelector(`.${EhFilterController.ICON_CLASSNAME}`);\n      icon?.classList.remove(EhFilterController.ARROW_DOWN_CLASSNAME);\n      icon?.classList.add(EhFilterController.ARROW_UP_CLASSNAME);\n      pill.closest(`.${EhFilterController.FILTER_WRAPPER_CLASSNAME}`)\n        ?.querySelector(`.${EhFilterController.FILTER_SELECTION_LIST_CLASSNAME}`)\n        ?.classList.remove(EhFilterController.HIDDEN_CLASSNAME);\n    }\n\n    /** Carry over the active-filter count that drives the \"Filters (n)\" badge. */\n    private syncActiveFilterCount(newDom: Document): void {\n      const count = newDom.querySelector<HTMLElement>(`.${EhFilterResponse.ACTIVE_FILTERS_CLASSNAME}`)?.dataset.activeFilters;\n      const target = this.ctx.element.querySelector<HTMLElement>(`.${EhFilterResponse.ACTIVE_FILTERS_CLASSNAME}`);\n      if (count && target) {\n        target.dataset.activeFilters = count;\n      }\n    }\n\n    /** Reflect the new filter state in the address bar. */\n    private pushHistoryUrl(newDom: Document): void {\n      const wrapper = newDom.querySelector<HTMLElement>(`.${EhFilterController.FILTER_WRAPPER}`)\n        || newDom.querySelector<HTMLElement>(`.${EhFilterController.FILTER_WRAPPER_BLOCK}`);\n      const newUrl = wrapper?.dataset.url;\n      if (newUrl) {\n        history.pushState({}, '', newUrl);\n      }\n    }\n\n    /** Hand the new paging state to the load-more controller (see its data-*). */\n    private syncLoadMore(newDom: Document): void {\n      const source = newDom.querySelector<HTMLElement>(`.${EhLoadMoreController.LOAD_MORE_CLASSNAME}`);\n      const target = this.ctx.element.querySelector<HTMLElement>(`.${EhLoadMoreController.LOAD_MORE_CLASSNAME}`);\n      if (source && target) {\n        target.dataset.page = source.dataset.page;\n        target.dataset.nextPage = source.dataset.nextPage;\n        target.dataset.nextPageHistory = source.dataset.nextPageHistory;\n        target.dataset.resultCount = source.dataset.resultCount;\n      }\n    }\n\n    private swapFragments(replaceMap: {[key: string]: HTMLElement}): {el: HTMLElement, top: number}[] {\n      const used: HTMLElement[] = [];\n      const scrolled: {el: HTMLElement, top: number}[] = [];\n      this.ctx.element.querySelectorAll(`.${EhFilterResponse.AJAX_REPLACE_CLASSNAME}`).forEach((e: HTMLElement) => {\n        if (!e.isConnected) {\n          return;\n        }\n        let replacement = e.dataset.replaceId ? replaceMap[e.dataset.replaceId] : undefined;\n        if (!replacement) {\n          return;\n        }\n\n        if (used.indexOf(replacement) >= 0) {\n          replacement = replacement.cloneNode(true) as HTMLElement;\n        } else {\n          used.push(replacement);\n        }\n        \n        this.preserveOpenFilterWrapper(e, replacement);\n        const scrollTop = e.scrollTop;\n        $(e).replaceWith(replacement);\n        if (scrollTop > 0) {\n          scrolled.push({el: replacement, top: scrollTop});\n          replacement.scrollTop = scrollTop;\n        }\n        const event = jQuery.Event(cs.Snippet.EventIdPostReplace) as cs.SnippetEventPostReplace;\n        event.replacedTarget = $(replacement);\n        event.removedTarget = $(e);\n        $(':root').trigger(event);\n      });\n      return scrolled;\n    }\n\n    private static restoreScroll(scrolled: {el: HTMLElement, top: number}[]): void {\n      scrolled.forEach(s => s.el.scrollTop = s.top);\n    }\n\n    // Keeps mobile ehel-menu from being destroyed/recreated for flickering prevention\n    private preserveOpenFilterWrapper(oldFragment: HTMLElement, replacement: HTMLElement): void {\n      if (oldFragment.dataset.replaceId !== 'aggregations' && oldFragment.dataset.replaceId !== 'aggregations-cp') {\n        return;\n      }\n      const openWrapper = oldFragment.querySelector<HTMLElement>(\n        `.${EhFilterController.FILTER_MENU_FILTER_WRAPPER_CLASSNAME}:has(.${EhFilterController.FILTER_CLASSNAME}.${EhFilterController.ACTIVE_CLASSNAME})`\n      );\n      if (!openWrapper?.dataset.filterProperty) {\n        return;\n      }\n      const freshOpenWrapper = replacement.querySelector<HTMLElement>(\n        `.${EhFilterController.FILTER_MENU_FILTER_WRAPPER_CLASSNAME}[data-filter-property=\"${openWrapper.dataset.filterProperty}\"]`\n      );\n      if (!freshOpenWrapper) {\n        return;\n      }\n      this.refreshOpenFilterWrapper(openWrapper, freshOpenWrapper);\n      freshOpenWrapper.replaceWith(openWrapper); // keep the live (patched) node in the replacement subtree\n    }\n\n    // Swaps ehel-menu--content's innerHTML\n    private refreshOpenFilterWrapper(oldWrapper: HTMLElement, newWrapper: HTMLElement): void {\n      const oldFilter = oldWrapper.querySelector<HTMLButtonElement>(`.${EhFilterController.FILTER_CLASSNAME}`);\n      const newFilter = newWrapper.querySelector<HTMLButtonElement>(`.${EhFilterController.FILTER_CLASSNAME}`);\n      if (oldFilter && newFilter) {\n        oldFilter.className = newFilter.className;\n        oldFilter.classList.add(EhFilterController.ACTIVE_CLASSNAME); // still open\n        oldFilter.disabled = newFilter.disabled;\n        oldFilter.innerHTML = newFilter.innerHTML;\n        const icon = oldFilter.querySelector(`.${EhFilterController.ICON_CLASSNAME}`);\n        icon?.classList.remove(EhFilterController.ARROW_DOWN_CLASSNAME);\n        icon?.classList.add(EhFilterController.ARROW_UP_CLASSNAME);\n      }\n\n      oldWrapper.querySelector(`.${EhFilterController.FILTER_SELECTION_LIST_CLASSNAME}`)?.classList.remove('loading');\n      const oldContent = oldWrapper.querySelector('.ehel-menu--content');\n      const newContent = newWrapper.querySelector('.ehel-menu--content');\n      if (oldContent && newContent) {\n        oldContent.innerHTML = newContent.innerHTML;\n      }\n    }\n\n    private reloadAccordions(): void {\n      this.ctx.element.querySelectorAll(`${eh.AccordionCtrl.ACCORDION_SELECTOR}`).forEach(e => {\n        e.dispatchEvent(new Event(AccordionCtrl.RELOAD_EVENT));\n      });\n    }\n\n    /**\n     * Result cards are not part of the ajax-replace fragments: the old ones are\n     * dropped and the incoming ones appended, each announced via the snippet\n     * post-replace event so their own controllers initialise.\n     */\n    private swapResultCards(newDom: Document): void {\n      const section = `.${EhFilterResponse.RESULTS_SECTION_CLASSNAME}`;\n      this.ctx.element.querySelectorAll(`${section} .${EhFilterResponse.RESULT_CARD_CLASSNAME}`).forEach((e: HTMLElement) => e.remove());\n      this.ctx.element.querySelectorAll(`${section} .${EhFilterResponse.NO_RESULT_CARD_CLASSNAME}`).forEach((e: HTMLElement) => e.remove());\n      const parent = this.ctx.element.querySelector(section);\n      if (!parent) {\n        return;\n      }\n      [EhFilterResponse.RESULT_CARD_CLASSNAME, EhFilterResponse.NO_RESULT_CARD_CLASSNAME].forEach(cardClass => {\n        newDom.querySelectorAll(`${section} .${cardClass}`).forEach((e: HTMLElement) => {\n          parent.appendChild(e);\n          const ev = jQuery.Event(cs.Snippet.EventIdPostReplace) as cs.SnippetEventPostReplace;\n          ev.replacedTarget = $(e);\n          $(':root').trigger(ev);\n        });\n      });\n      this.rehighlightResults();\n    }\n\n    /**\n     * The freshly appended rows carry the SearchInline hook class (they are\n     * rendered by pc-module-render-products), so the *local* highlighter is reused\n     * to re-apply the current server-side term to them — the one place where the\n     * two search flavours meet.\n     */\n    private rehighlightResults(): void {\n      const rows = this.ctx.element.querySelectorAll<HTMLElement>(\n        `.${EhFilterResponse.RESULTS_SECTION_CLASSNAME} .${SearchInlineController.GROUP_OF_SEARCH_CLASSNAME}`\n      );\n      if (!rows) {\n        return;\n      }\n      SearchInlineViewModel.searchAndHighlight(rows, false, null);\n      const term = this.ctx.searchTerm;\n      if (term.length) {\n        SearchInlineViewModel.searchAndHighlight(rows, false, term);\n      }\n    }\n\n    private reloadLoadMore(): void {\n      this.ctx.element.querySelectorAll(`.${EhLoadMoreController.LOAD_MORE_CLASSNAME}`).forEach(e => {\n        e.dispatchEvent(new Event(EhLoadMoreController.RELOAD_EVENT));\n      });\n    }\n  }\n}\n","namespace eh {\n\n  /**\n   * Everything that changes *what* is selected in a server-side filter block, and\n   * therefore triggers a request: the option inputs themselves, the per-group\n   * \"select all\" / \"select none\" buttons, removing a single active-filter pill, and\n   * the \"clear all\" form reset.\n   *\n   * The local search has no equivalent of this class — there, (de)selecting an\n   * option is handled inside SearchInlineController because it only re-filters the\n   * DOM. Here every one of these actions ends in EhFilterRequest.\n   *\n   * One speciality is the *clone* inputs (`ehts-cbx-clone`): the mobile drawer\n   * renders its own copies of the desktop options, deliberately without a `name`\n   * so they never reach the request payload. They mirror their original via\n   * `data-orig-id` — and the mirror has to distinguish radios (set) from\n   * checkboxes (toggle), otherwise single-select groups like the release-date\n   * presets break.\n   *\n   * Split out of EhFilterController (eh.pc.Filter.controller.ts).\n   */\n  export class EhFilterSelection {\n\n    private readonly inputs: NodeListOf<HTMLInputElement>;\n    private readonly removeButtons: NodeListOf<HTMLElement>;\n\n    constructor(\n      private readonly ctx: EhFilterController,\n      private readonly root: HTMLElement,\n      private readonly flyout: EhFilterFlyout\n    ) {\n      const list = `.${EhFilterController.FILTER_SELECTION_LIST_CLASSNAME}`;\n      this.inputs = this.root.querySelectorAll<HTMLInputElement>(`${list} input`);\n      this.removeButtons = this.root.querySelectorAll<HTMLElement>(`.${EhFilterController.FILTER_REMOVE_SINGLE_CLASSNAME}`);\n      this.registerControls(list);\n    }\n\n    private registerControls(list: string): void {\n      this.inputs.forEach(input => {\n        if (input.classList.contains(EhFilterController.FILTER_CONTROL_CLONE)) {\n          input.addEventListener('change', this.onCloneChange);\n        } else if (!input.classList.contains(EhFilterController.FILTER_IGNORE_CHANGE_CLASSNAME)) {\n          input.addEventListener('change', this.onOptionChange);\n        }\n      });\n      this.root.querySelectorAll<HTMLElement>(`${list} .${EhFilterController.FILTER_SELECTION_LIST_SEL_ALL_CLASSNAME}`)\n        .forEach(btn => btn.addEventListener('click', this.onSelectAll));\n      this.root.querySelectorAll<HTMLElement>(`${list} .${EhFilterController.FILTER_SELECTION_LIST_SEL_NONE_CLASSNAME}`)\n        .forEach(btn => btn.addEventListener('click', this.onSelectNone));\n      this.removeButtons.forEach(btn => btn.addEventListener('click', this.onRemoveFilter));\n      this.root.querySelectorAll<HTMLElement>(`.${EhFilterController.FORM_RESET_TRIGGER_CLASSNAME}`)\n        .forEach(btn => btn.addEventListener('click', this.onResetForm));\n    }\n\n    private onOptionChange = (e: Event): void => {\n      this.ctx.requestUpdate(e as UIEvent);\n    }\n\n    /**\n     * A drawer clone was toggled: mirror it onto its original (which is the input\n     * that actually travels with the request) and then update.\n     */\n    private onCloneChange = (e: Event): void => {\n      const origId = $(e.currentTarget as HTMLElement).data('origId') || '';\n      if (!origId) {\n        return;\n      }\n      const $original = $(':root').find('input#' + origId);\n      if (!$original.length) {\n        return;\n      }\n      if ($original.attr('type') === 'radio') {\n        // radios: setting checked lets the browser uncheck the group siblings\n        $original.prop('checked', true);\n      } else {\n        $original.prop('checked', !$original.prop('checked'));\n      }\n      this.ctx.requestUpdate(e as UIEvent);\n    }\n\n    private onSelectAll = (e: Event): void => {\n      e.preventDefault();\n      this.setGroupChecked(e.currentTarget as HTMLElement, true);\n    }\n\n    private onSelectNone = (e: Event): void => {\n      e.preventDefault();\n      this.setGroupChecked(e.currentTarget as HTMLElement, false);\n    }\n\n    /**\n     * (Un)check every option of the button's group. Only the last actually changed\n     * input fires a `change`, so the group produces a single request instead of one\n     * per option.\n     */\n    private setGroupChecked(button: HTMLElement, checked: boolean): void {\n      let last: HTMLInputElement | null = null;\n      button.closest(`.${EhFilterController.FILTER_SELECTION_LIST_CLASSNAME}`)\n        ?.querySelectorAll('input')\n        .forEach(input => {\n          // COM-4170: options the current selection rules out are listed but disabled. A disabled\n          // box is not submitted, so ticking it here would only paint a checkmark the request\n          // never carries.\n          if (input.disabled) {\n            return;\n          }\n          if (input.checked !== checked) {\n            input.checked = checked;\n            last = input;\n          }\n        });\n      (last as HTMLInputElement | null)?.dispatchEvent(new Event('change'));\n    }\n\n    /**\n     * The X on an active-filter pill: show a spinner in its place, then uncheck\n     * every input matching that param/value — the `change` triggers the update.\n     */\n    private onRemoveFilter = (e: Event): void => {\n      const button = e.currentTarget as HTMLElement;\n      e.preventDefault();\n      e.stopPropagation();\n      button.blur();\n      EhFilterSelection.showSpinner($(button));\n      const paramName = button.dataset.paramName;\n      const paramValue = button.dataset.paramValue;\n      if (!paramName || !paramValue) {\n        return;\n      }\n      this.root.querySelectorAll('input').forEach((input: HTMLInputElement) => {\n        if (input.dataset.paramName === paramName && input.value === paramValue) {\n          input.checked = false;\n          input.dispatchEvent(new Event('change'));\n        }\n      });\n    }\n\n    /**\n     * \"Clear all\": close the flyouts, drop every selection and update once. No\n     * spinner on the group icons (nothing was clicked there), but every active-pill\n     * X turns into a spinner.\n     */\n    private onResetForm = (e: Event): void => {\n      const event = e as Event & {ehFilterResetHandled?: boolean};\n      if (event.ehFilterResetHandled) {\n        return;\n      }\n      event.ehFilterResetHandled = true;\n      this.flyout.reset();\n      this.root.querySelectorAll<HTMLInputElement>(`.${EhFilterController.FILTER_SELECTION_LIST_CLASSNAME} input`)\n        .forEach(input => input.checked = false);\n      this.root.querySelectorAll<HTMLElement>(`.${EhFilterController.FILTER_REMOVE_SINGLE_CLASSNAME}`)\n        .forEach(btn => EhFilterSelection.showSpinner($(btn)));\n      this.ctx.requestUpdate(e as UIEvent, false);\n    }\n\n    private static showSpinner($button: JQuery<HTMLElement>): void {\n      $button.find('span.eh-icon')\n        .removeClass(EhFilterController.REMOVE_CLASSNAMES)\n        .addClass(EhFilterController.SPINNER_CLASSNAMES);\n    }\n  }\n}\n","namespace eh {\n    /** End-/Footnote : collect endnotes on page and and insert into container */\n    export class Footnotes {\n        static instances :Footnotes[]  = [] \n        static ehInit($base: JQuery<HTMLElement>, isSnippetRequest: boolean): void {\n          if(!isSnippetRequest) {\n              $(`.${ Footnotes.FOOTNOTES_WRAPPER_CLASSNAME }`, $base).each((index:number, element:HTMLElement) => {\n                  this.instances.push(new Footnotes(element, Footnotes.instances.length));\n              });    \n            } else {\n              this.instances.forEach(enotes => {\n                enotes.updateForm($base);\n              });\n            }\n        }\n\n        /* module bound */\n        public static FOOTNOTES_WRAPPER_CLASSNAME: string = 'marker-footnotes-wrapper';\n        /* parent of collected endnotes */\n        public static FOOTNOTES_CONTAINER_CLASSNAME: string = 'marker-footnotes-container';\n        /* parent of endnote instance  */\n        public static FOOTNOTE_INSTANCE_CLASSNAME: string = 'marker-footnote';\n        public static FOOTNOTE_INSTANCE_LINK_CLASSNAME: string = 'marker-footnote-link';\n        public static FOOTNOTE_INSTANCE_CONTENT_CLASSNAME: string = 'marker-footnote-content';\n\n        private container: HTMLElement | null | undefined;\n        private index: number = 0;\n        private headerHeight: number = 0;\n\n        private vm: Footnotes;\n\n        constructor(\n            private readonly base: HTMLElement,\n            private readonly instanceId: number\n        ) {\n            this.container = this.base.querySelector(`.${Footnotes.FOOTNOTES_CONTAINER_CLASSNAME}`) as HTMLElement;\n            this.updateForm($(document.body));\n            $(':root').on(HEADER_EVENTS.DOM_MUTATION, this.headerChanged);\n        }\n\n        private updateForm(elem: JQuery<HTMLElement>):void {\n          if(this.container) {\n            elem.find(`.${Footnotes.FOOTNOTE_INSTANCE_CLASSNAME}`).each((index:number, note:HTMLElement) => {\n              this.insertNote($(note));\n            });\n            if(this.index && this.base.classList.contains('ehtw-hidden')) {\n              this.base.classList.remove('ehtw-hidden');\n            }\n          }\n        }\n\n\n        private insertNote(note: JQuery<HTMLElement>):void {\n          let noteLink = note.find(`.${Footnotes.FOOTNOTE_INSTANCE_LINK_CLASSNAME}:first`);\n          if(noteLink.length) {\n            const key: String = this.nextKey();\n            noteLink.attr('href', '#'+key).text(this.index);\n            noteLink[0].addEventListener('click', this.onClickScrollTo);\n            let nx = jQuery('<li>', {\n              id: key\n            });\n            nx.html(noteLink.data('noteContent'));\n            eh.LinkTarget.init(nx);\n            eh.Overlay.registerLinks(nx);\n            this.container?.appendChild(nx[0]);\n          }\n        }\n\n        private nextKey():String {\n          return ((this.instanceId > 0)?(''+this.instanceId):'')+\"footnote_\"+(++this.index);\n        }\n\n        private onClickScrollTo = (e: UIEvent): void => {\n          const $target = $(e.currentTarget as HTMLElement);\n          const linkTarget = $target.attr('href');\n          if (linkTarget && linkTarget.startsWith('#')) {\n            let t = this.container?.offsetTop || 0;\n            e.preventDefault();\n            eh.ScrollPage.scrollToAnimated(t);\n          }\n\n        }\n\n        private headerChanged: (e: JQuery.TriggeredEvent, metrics: IHeaderMetrics) => void = (e: JQuery.TriggeredEvent, metrics: IHeaderMetrics): void => {\n          this.headerHeight = metrics.visibleHeaderHeight + metrics.visibleDisplaceElemHeight || this.headerHeight;\n        }\n\n    }\n}","namespace eh {\n/**\n * Controller to manage anchor-navigation behaviour. \n */\nexport class EhGalleryController {\n\n    public static GALLERY_CLASSNAME: string = 'ehel-gallery';\n    public static GALLERY_LIGHTBOX_CLASSNAME: string = 'ehel-gallery-lighbox';\n    public static GALLERY_PICTURE_WRAPPER_CLASSNAME: string = 'ehel-gallery--picture--wrapper';\n    public static GALLERY_NAVIGATION_CLASSNAME: string = 'ehel-gallery--navigation';\n    public static GALLERY_NAVIGATION_ITEM_CLASSNAME: string = 'ehel-gallery--indicator';\n    public static GALLERY_NAVIGATION_ITEM_VIDEOS_CLASSNAME: string = 'ehel-gallery--indicator--videos';\n    // COM-4097: the \"+X\" overflow thumbnails. They are not gallery indicators -- clicking one\n    // opens the lightbox at its index instead of switching the central image first.\n    public static GALLERY_NAVIGATION_ITEM_MORE_CLASSNAME: string = 'ehel-gallery--indicator--more';\n\n    public static GALLERY_PREVIOUS_BTN_CLASSNAME: string = 'ehel-gallery--prev-btn';\n    public static GALLERY_NEXT_BTN_CLASSNAME: string = 'ehel-gallery--next-btn';\n\n    public static GALLERY_PCITURE_ITEM_CLASSNAME: string = 'ehel-gallery--picture';\n    public static GALLERY_PCITURE_TEXT_ITEM_CLASSNAME: string = 'ehel-gallery--picture-text';\n\n    static ehInit($base: JQuery<HTMLElement>): void {\n        $(`.${EhGalleryController.GALLERY_CLASSNAME}`, $base).each((index: number, element: HTMLElement) => {\n            new EhGalleryController(element);\n        });\n    }\n\n    private el: HTMLElement | null | undefined;\n    private lightbox: HTMLElement | null | undefined;\n    private pictureWrapper: HTMLElement | null | undefined;\n    private navigation: HTMLElement | null | undefined;\n    private navigationLightbox: HTMLElement | null | undefined;\n    private navigationItems: NodeListOf<HTMLElement> | undefined;\n    private navigationMoreItems: NodeListOf<HTMLElement> | undefined;\n    private navigationVideoItem: HTMLElement | null | undefined;\n    private navigationVideoIdxItem: HTMLElement | null | undefined;\n\n    private previousBtn: NodeListOf<HTMLElement> | undefined;\n    private nextBtn: NodeListOf<HTMLElement> | undefined;\n    private vm: EhGalleryViewModel;\n\n    private touchstartX: number = 0;\n    private touchendX: number = 0;\n    private touchOffsetThreshold: number = 50;\n\n\n    constructor(\n        private readonly base: HTMLElement | null,\n    ) {\n\n        this.el = this.base;//?.querySelector(`.${EhGalleryController.GALLERY_CLASSNAME}`);\n        this.lightbox = this.el?.querySelector(`.${EhGalleryController.GALLERY_LIGHTBOX_CLASSNAME}`);\n        this.pictureWrapper = this.el?.querySelector(`.${EhGalleryController.GALLERY_PICTURE_WRAPPER_CLASSNAME}`);\n        this.navigation = this.el?.querySelector(`.${EhGalleryController.GALLERY_NAVIGATION_CLASSNAME}`);\n        this.navigationLightbox = this.lightbox?.querySelector(`.${EhGalleryController.GALLERY_NAVIGATION_CLASSNAME}`);\n\n        this.navigationItems = this.el?.querySelectorAll(`.${EhGalleryController.GALLERY_NAVIGATION_ITEM_CLASSNAME}`);\n        this.navigationMoreItems = this.el?.querySelectorAll(`.${EhGalleryController.GALLERY_NAVIGATION_ITEM_MORE_CLASSNAME}`);\n        this.navigationVideoItem = this.el?.querySelector(`.${EhGalleryController.GALLERY_NAVIGATION_ITEM_VIDEOS_CLASSNAME}`);\n        this.navigationVideoIdxItem = this.el?.querySelector(`.ehel-gallery-lighbox .${EhGalleryController.GALLERY_PCITURE_ITEM_CLASSNAME}:has(.ehel-lightbox--video)`);\n\n        this.previousBtn = this.el?.querySelectorAll(`.${EhGalleryController.GALLERY_PREVIOUS_BTN_CLASSNAME}`);\n        this.nextBtn = this.el?.querySelectorAll(`.${EhGalleryController.GALLERY_NEXT_BTN_CLASSNAME}`);\n      \n        if (!this.navigation || !this.el) {\n            //throw new Error(`Missing required element`);\n            return;\n        }\n\n        this.vm = new EhGalleryViewModel(\n            this.el,\n            this.lightbox,\n            this.navigation, \n            this.navigationLightbox,\n            this.navigationItems,\n            this.previousBtn,\n            this.nextBtn,\n        );\n        \n        if (!this.vm.isDisabled) {\n            this.init();\n        }\n    }\n\n    private init(): void {\n        this.registerControls();\n    }\n\n    private registerControls(): void {\n      this.previousBtn?.forEach((item: HTMLElement): void => {\n        item.addEventListener('click', this.onPreviousClicked);\n      });\n\n      this.nextBtn?.forEach((item: HTMLElement): void => {\n        item.addEventListener('click', this.onNextClicked);\n      });\n\n      this.navigationItems?.forEach((item: HTMLElement): void => {\n        // Click always switches the central image (onItemClicked preventDefault()s the\n        // thumbnail's lightbox href), which preserves the mobile/tap behaviour. With\n        // data-gallery-hover set, the desktop additionally switches on hover; touch\n        // devices have no real hover, so this stays effectively desktop-only.\n        // COM-3983: inside the lightbox the thumbnails switch on click only -- there the\n        // enlarged image is the content itself, so hovering past the strip must not change it.\n        item.addEventListener('click', this.onItemClicked);\n        if (this.el?.dataset['galleryHover'] !== undefined && !this.lightbox?.contains(item)) {\n          item.addEventListener('mouseenter', this.onItemClicked);\n        }\n      });\n      this.navigationMoreItems?.forEach((item: HTMLElement): void => {\n        item.addEventListener('click', this.onItemMoreClicked);\n      });\n\n      if (this.navigationVideoItem) {\n        this.navigationVideoItem.addEventListener('click', this.onItemVideoClicked);\n      }\n      // Swipe belongs on the picture area, not on the whole lightbox: dragging across\n      // the surrounding chrome (nav, indicators) must not switch the image.\n      this.pictureWrapper?.addEventListener('touchstart', this.onTouchStart);\n      this.pictureWrapper?.addEventListener('touchend', this.onTouchEnd);\n    }\n\n    private onTouchStart = (e: TouchEvent): void => {\n      this.touchstartX = e.changedTouches[0].screenX;\n    }\n\n    private onTouchEnd = (e: TouchEvent): void => {\n      this.touchendX = e.changedTouches[0].screenX;\n      if (Math.abs(this.touchendX - this.touchstartX) > this.touchOffsetThreshold) {\n          if (this.touchendX < this.touchstartX) {\n              this.vm.next();\n          } else if (this.touchendX > this.touchstartX) {\n              this.vm.previous();\n          }\n      }\n    }\n\n    private onItemClicked = (e: MouseEvent | TouchEvent): void => {\n        e.preventDefault();\n        this.vm.setCurrentItem(e.currentTarget as HTMLElement);\n    }\n    private onItemMoreClicked = (e: MouseEvent | TouchEvent): void => {\n        // No preventDefault here: the href opens the lightbox, we only preselect the picture.\n        const idx: string | undefined = (e.currentTarget as HTMLElement).dataset['idx'];\n        this.vm.showInLightbox(idx ? parseInt(idx, 10) : 0);\n    }\n    private onItemVideoClicked = (e: MouseEvent | TouchEvent): void => {\n        e.preventDefault();\n\n        if (this.navigationVideoIdxItem) {\n            this.vm.setCurrentItemLightbox(this.navigationVideoIdxItem);\n        }\n    }\n    private onPreviousClicked = (e: MouseEvent | TouchEvent): void => {\n        e.preventDefault();\n        (document?.activeElement as HTMLElement).blur();\n        this.vm.previous();\n    }\n\n    private onNextClicked = (e: MouseEvent | TouchEvent): void => {\n        e.preventDefault();\n        (document?.activeElement as HTMLElement).blur();\n        this.vm.next();\n    }\n}\n\ninterface IScrollerItem {\n  idx: number;\n  link: HTMLElement;\n  target: HTMLElement;\n  targetText?: HTMLElement;\n  lightboxLink?: HTMLElement | null;\n  lightboxTarget?: HTMLElement | null;\n  lightboxTargetText?: HTMLElement | null;\n\n  video?: HTMLElement | null;\n  videoLightbox?: HTMLElement | null;\n\n  // COM-4110: thumbnail of the main gallery. Missing when the media only exists in the\n  // lightbox, which is why the main gallery cannot always follow the lightbox selection.\n  mainLink?: HTMLElement | null;\n  isVideo?: boolean;\n}\n\nclass EhGalleryViewModel {\n\n    public isDisabled: boolean = false;\n\n    private static ACTIVE_CLASSNAME: string = 'is-active';\n    private static DISABLED_CLASSNAME: string = 'is-disabled';\n    private static HIDE_CLASSNAME: string = 'ehtw-hidden';\n    private static TRANSITION_EASING_LINEAR: string = 'linear';\n    private static TRANSITION_DURATION: number = 400;\n    private static MIN_AMOUNT_SCROLL_ITEMS: number = 1;\n    private _currentItem: IScrollerItem | undefined;\n    // COM-4097: what the main gallery shows. Can differ from _currentItem while the lightbox\n    // is browsed from a \"+X\" thumbnail without dragging the main gallery along.\n    private _mainItem: IScrollerItem | undefined;\n    private _scrollerItems: IScrollerItem[] = [];\n    \n    private closeBtn!: HTMLElement | null;\n    private isVertical = true;\n    /* Start - 5.15.1 - Redesign PID - Package 1 - COM-3988 */\n    // Guard so the initial item selection during init() does not scroll the page.\n    private pageLoaded = false;\n    /* End - 5.15.1 - Redesign PID - Package 1 - COM-3988 */\n\n    constructor(\n        private gallery: HTMLElement,\n        private lightbox: HTMLElement | null | undefined,\n        private scroller: HTMLElement,\n        private scrollerLightbox: HTMLElement | null | undefined,\n        private items: NodeListOf<HTMLElement> | undefined,\n        private previousButton: NodeListOf<HTMLElement> | undefined,\n        private nextButton: NodeListOf<HTMLElement> | undefined,\n    ) {\n        this.init();\n    }\n\n    public previous(): void {\n        if (!this._currentItem) {\n            return this.setCurrentItem(this.getItemByIdx(0).link);\n        }\n        const targetIndex: number = Math.max(0, this._currentItem.idx - 1)\n        const previousItem: IScrollerItem = this.getItemByIdx(targetIndex);\n        this.setCurrentItem(previousItem.link);\n    }\n    \n    public next(): void {\n        if (!this._currentItem) {\n            return this.setCurrentItem(this.getItemByIdx(0).link);\n        }\n        const targetIndex: number = Math.min(this._scrollerItems.length - 1, this._currentItem.idx + 1);\n        const nextItem: IScrollerItem = this.getItemByIdx(targetIndex);\n        this.setCurrentItem(nextItem.link);\n    }\n    public setCurrentItemLightbox(item: HTMLElement | undefined): void {\n      const currentItem = this.getItemByIdx(item?.dataset['idx'] ? parseInt(item?.dataset['idx']) : 0);\n      this.setCurrentItem(currentItem.link);\n    }\n\n    public showInLightbox(idx: number): void {\n      const item: IScrollerItem | undefined = this._scrollerItems.find(si => si.idx === idx);\n      if (!item) {\n        return;\n      }\n      this.setCurrentItem(item.lightboxLink ?? item.link, true, false);\n    }\n\n    // COM-4110: the media shown in the lightbox wins, so changing it there also changes the\n    // gallery. Videos and media without a thumbnail have no counterpart in the main gallery and\n    // fall back to the first picture instead of the item that was active before opening it.\n    private isDisplayableInMain(item: IScrollerItem | undefined): boolean {\n      return !!item && !!item.mainLink && !item.isVideo;\n    }\n\n    public restoreMainItem(): void {\n      const item: IScrollerItem | undefined = this.isDisplayableInMain(this._currentItem)\n        ? this._currentItem\n        : this._scrollerItems.find(si => this.isDisplayableInMain(si));\n      if (!item) {\n        return;\n      }\n      this.setCurrentItem(item.mainLink ?? item.link);\n    }\n\n    public setCurrentItem(item: HTMLElement | undefined, triggerJumpToAnchor: boolean = true, syncMain: boolean = true): void {\n        // COM-4110: an unknown element would blank out both the gallery and the lightbox\n        const nextItem: IScrollerItem | undefined = this.getItemByEl(item);\n        if (!nextItem) {\n          return;\n        }\n\n        if (this._currentItem) {\n          this.notifyLayerState(false);\n          this._currentItem.lightboxTarget?.classList.add(EhGalleryViewModel.HIDE_CLASSNAME);\n          this._currentItem.lightboxTargetText?.classList.add(EhGalleryViewModel.HIDE_CLASSNAME);\n          this._currentItem.lightboxLink?.classList.remove(EhGalleryViewModel.ACTIVE_CLASSNAME);\n          this._currentItem.lightboxLink?.blur();\n          this.stopVideo();\n        }\n        if (syncMain && this._mainItem) {\n          this._mainItem.target.classList.add(EhGalleryViewModel.HIDE_CLASSNAME);\n          this._mainItem.targetText?.classList.add(EhGalleryViewModel.HIDE_CLASSNAME);\n          this._mainItem.link.classList.remove(EhGalleryViewModel.ACTIVE_CLASSNAME);\n          this._mainItem.link.blur();\n        }\n        this._currentItem = nextItem;\n\n        this._currentItem?.lightboxLink?.classList.add(EhGalleryViewModel.ACTIVE_CLASSNAME);\n        this._currentItem?.lightboxTarget?.classList.remove(EhGalleryViewModel.HIDE_CLASSNAME);\n        this._currentItem?.lightboxTargetText?.classList.remove(EhGalleryViewModel.HIDE_CLASSNAME);\n\n        if (syncMain) {\n          this._currentItem?.link.classList.add(EhGalleryViewModel.ACTIVE_CLASSNAME);\n          this._currentItem?.target.classList.remove(EhGalleryViewModel.HIDE_CLASSNAME);\n          this._currentItem?.targetText?.classList.remove(EhGalleryViewModel.HIDE_CLASSNAME);\n          this._mainItem = this._currentItem;\n        }\n        if(this._currentItem) {\n          //this.notifyLayerState(true);\n        }\n\n        let index = this._scrollerItems.findIndex(si => si.link === item || si.lightboxLink === item);\n        if (index === 0) {\n          this.previousButton?.forEach(item => {\n              item.classList.add(EhGalleryViewModel.DISABLED_CLASSNAME);\n          });\n        } else {\n          this.previousButton?.forEach(item => {\n              item.classList.remove(EhGalleryViewModel.DISABLED_CLASSNAME);\n          });\n        }\n\n        if (index === this._scrollerItems.length - 1) {\n            this.nextButton?.forEach(item => {\n                item.classList.add(EhGalleryViewModel.DISABLED_CLASSNAME);\n            });\n        } else {\n            this.nextButton?.forEach(item => {\n                item.classList.remove(EhGalleryViewModel.DISABLED_CLASSNAME);\n            });\n        }\n        //  this.invalidateControls();\n        this.alignItemToViewport(this._currentItem?.lightboxLink, this.scrollerLightbox);\n        this.alignItemToViewport(this._currentItem?.link, this.scroller);\n    }\n\n    private init(): void {\n        this.invalidateItems();\n        if (this._scrollerItems.length < EhGalleryViewModel.MIN_AMOUNT_SCROLL_ITEMS) {\n            this.isDisabled = true;\n            this.scroller.classList.add(EhGalleryViewModel.HIDE_CLASSNAME);\n            this._scrollerItems = [];\n            return;\n        }\n        setTimeout(() => {\n            this.invalidateControls(this.scroller);\n        }, 0);\n\n        this.setCurrentItem(this.getItemByIdx(0).link);\n        eh.Breakpoints.getInstance().registerChangeListener(this.onBreakpointChange);\n        if (this.lightbox) {\n          new ResizeObserver(() => {\n              if (this.lightbox?.clientWidth && this.scrollerLightbox) {\n                  this.alignItemToViewport(this._currentItem?.lightboxLink, this.scrollerLightbox);\n                  this.invalidateControls(this.scrollerLightbox as HTMLElement);\n                  this.invalidateControls(this.scroller);\n              } else {\n                this.restoreMainItem();\n              }\n          }).observe(this.lightbox);\n      }\n\n      /* Start - 5.15.1 - Redesign PID - Package 1 - COM-3988 */\n      $(document).ready(() => {\n          this.pageLoaded = true;\n      });\n      /* End - 5.15.1 - Redesign PID - Package 1 - COM-3988 */\n    }\n\n    private notifyLayerState(isOpen:boolean) {\n      // inform video play/pause\n      if(this._currentItem?.lightboxTarget) {\n        $(this._currentItem?.lightboxTarget).selfOrFind(`.${OVERLAY_EVENTS.EVENT_NODE_CLASS}`).trigger(OVERLAY_EVENTS.LAYER_STATE_EVENT, {\n          'state': isOpen? OVERLAY_EVENTS.LAYER_STATE_OPENED : OVERLAY_EVENTS.LAYER_STATE_CLOSED\n        });\n      }\n      if(this._currentItem?.target) {\n        $(this._currentItem?.target).selfOrFind(`.${OVERLAY_EVENTS.EVENT_NODE_CLASS}`).trigger(OVERLAY_EVENTS.LAYER_STATE_EVENT, {\n          'state': isOpen? OVERLAY_EVENTS.LAYER_STATE_OPENED : OVERLAY_EVENTS.LAYER_STATE_CLOSED\n        });\n      }\n    }\n\n    private onBreakpointChange: (old: eh.Breakpoint | null, current: eh.Breakpoint) => void = (_old: eh.Breakpoint | null, _current: eh.Breakpoint): void => {\n        this.isVertical = !_current.isInRange(768);\n    };\n\n    private alignItemToViewport(elem: HTMLElement | null | undefined, scroller: HTMLElement | null | undefined): void {\n      if (!elem || !scroller || scroller.clientWidth === 0) {\n          return;\n      }\n\n      /* Start - 5.15.1 - Redesign PID - Package 1 - COM-3988 */\n      // Keep the active thumbnail centered within the (mobile: horizontal) indicator strip.\n      if (this.pageLoaded) {\n          elem.scrollIntoView({behavior: 'smooth', block: 'nearest', inline: 'center'});\n      }\n      /* End - 5.15.1 - Redesign PID - Package 1 - COM-3988 */\n    }\n\n    // COM-4110: the link of the main gallery for an index -- the one that is NOT inside the lightbox\n    private getMainLinkByIdx(idx: string): HTMLElement | null {\n      const links: HTMLElement[] = Array.from(\n        this.gallery.querySelectorAll<HTMLElement>(`.${EhGalleryController.GALLERY_NAVIGATION_ITEM_CLASSNAME}[data-idx='${idx}']`)\n      );\n      return links.find(link => !link.closest(`.${EhGalleryController.GALLERY_LIGHTBOX_CLASSNAME}`)) ?? null;\n    }\n\n    private getItemByEl(el: HTMLElement | undefined): IScrollerItem | undefined {\n      // Direct link match first. A responsive layout can render several thumbnails\n      // for the SAME image (e.g. a normal thumbnail plus a narrow-viewport overflow\n      // thumbnail sharing the same data-idx); invalidateItems() only registers the\n      // first per data-idx, so the extra thumbnails have no scroller item of their\n      // own. Fall back to matching by data-idx so hovering/clicking them still sets\n      // (not just clears) the central image instead of returning undefined.\n      return this._scrollerItems.find(si => si.link === el || si.lightboxLink === el)\n          ?? this._scrollerItems.find(si => el != null && si.idx === +(el.getAttribute('data-idx') ?? 'NaN'));\n    }\n\n    private getItemByIdx(idx: number): IScrollerItem {\n      const index = this._scrollerItems.findIndex(si => si.idx === idx);\n      if (index < 0 || index > this._scrollerItems.length -1) {\n        throw new Error(`Out of bounds. Failed to invalidate controls`);\n      }\n      return this._scrollerItems[index];\n    }\n\n    private invalidateItems = (): void => {\n      this._scrollerItems = [];\n      this.items?.forEach((value: HTMLElement): void => {\n        const targetKey: string | null = value.getAttribute('data-idx') || '';\n        if (!this._scrollerItems.some(x => x.idx === +targetKey)) {\n              \n          const target: HTMLElement | null = this.gallery.querySelector(`.${EhGalleryController.GALLERY_PCITURE_ITEM_CLASSNAME}[data-idx='${targetKey}']`);\n          const targetText: HTMLElement | null = this.gallery.querySelector(`.${EhGalleryController.GALLERY_PCITURE_TEXT_ITEM_CLASSNAME}[data-idx='${targetKey}']`);\n          \n          const lightboxLink: HTMLElement | null | undefined = this.lightbox?.querySelector(`.${EhGalleryController.GALLERY_NAVIGATION_ITEM_CLASSNAME}[data-idx='${targetKey}']`);\n          const lightboxTarget: HTMLElement | null | undefined = this.lightbox?.querySelector(`.${EhGalleryController.GALLERY_PCITURE_ITEM_CLASSNAME}[data-idx='${targetKey}']`);\n          const lightboxTargetText: HTMLElement | null | undefined = this.lightbox?.querySelector(`.${EhGalleryController.GALLERY_PCITURE_TEXT_ITEM_CLASSNAME}[data-idx='${targetKey}']`);\n\n          const video: HTMLElement | null | undefined = target?.querySelector('.eh-player');\n          const videoLightbox: HTMLElement | null | undefined = lightboxTarget?.querySelector('.eh-player');\n\n          const isDisabled: boolean = value.classList.contains(EhGalleryViewModel.DISABLED_CLASSNAME);\n          if (!target || isDisabled) {\n              return;\n          }\n          this._scrollerItems.push({\n              idx: +targetKey,\n              link: value,\n              target: target,\n              targetText: targetText??undefined,\n\n              lightboxLink: lightboxLink,\n              lightboxTarget: lightboxTarget,\n              lightboxTargetText: lightboxTargetText,\n              video: video,\n              videoLightbox: videoLightbox,\n              mainLink: this.getMainLinkByIdx(targetKey),\n              isVideo: !!video || !!videoLightbox\n          });\n        }\n      });\n    }\n\n    public stopVideo() {\n    // if (flowplayer ) {\n    //     if (this._currentItem?.video) {\n    //         flowplayer(this._currentItem.video).stop();\n    //     }\n    //     if (this._currentItem?.videoLightbox) {\n    //         flowplayer(this._currentItem.videoLightbox).stop();\n    //     }\n    // }\n    }\n\n    public invalidateControls = (scroller: HTMLElement): void => {\n      const hideClass: string = EhGalleryViewModel.HIDE_CLASSNAME;\n      if (!this.closeBtn) {\n          this.closeBtn = document?.querySelector('.eh-marker-overlay-lightbox .eh-overlay--close');\n          this.closeBtn?.addEventListener('click', () => this.stopVideo());\n      }\n\n      this.previousButton?.forEach(item => {\n        item.classList.add(hideClass);\n      });\n      this.nextButton?.forEach(item => {\n        item.classList.add(hideClass);\n      });\n      if (this.isVertical) {\n        if (scroller.scrollTop > 0 || scroller.clientHeight + scroller.scrollTop < scroller.scrollHeight) {\n          this.previousButton?.forEach(item => {\n            item.classList.remove(hideClass);\n          });\n          this.nextButton?.forEach(item => {\n            item.classList.remove(hideClass);\n          });\n        }\n      } else {\n        if (scroller.scrollLeft > 0 || scroller.clientWidth + scroller.scrollLeft < scroller.scrollWidth) {\n          this.previousButton?.forEach(item => {\n            item.classList.remove(hideClass);\n          });\n          this.nextButton?.forEach(item => {\n            item.classList.remove(hideClass);\n          });\n        }\n      }\n    }\n  }\n}\n","namespace eh {\n\n  /**\n   * Controller to manage load more button behaviour (product teaser floating). \n   */\n  export class EhLoadMoreController {\n\n      public static RELOAD_EVENT: string = 'EhLoadMoreController:reload';\n\n      public static LOAD_MORE_CLASSNAME: string = 'ehel-load-more';\n\n      public static LOAD_MORE_SECTION_CLASSNAME: string = 'ehel-load-more--section';\n\n      public static LOAD_MORE_BUTTON_CLASSNAME: string = 'ehel-load-more--button';\n\n      public static PRODUCT_CARD_CLASSNAME: string = 'ehts-result-card';\n\n      public static PROGRESS_BAR_CLASSNAME: string = 'ehel-progress-bar';\n\n      public static PROGRESS_LINE_CLASSNAME: string = 'ehel-progress-line';\n\n      public static VIEWED_PRODUCTS_CLASSNAME: string = 'ehel-viewed-products'\n\n      public static CLOSED_CLASSNAME: string = 'ehel-load-more--closed';\n      \n      static init($base: JQuery<HTMLElement>): void {\n        $(`.${EhLoadMoreController.LOAD_MORE_CLASSNAME}`, $base).each((index: number, element: HTMLElement) => {\n          new EhLoadMoreController(element);\n        });\n      }\n\n      private el: HTMLElement | null | undefined;\n      private buttonMore: HTMLElement | null | undefined;\n      private productCards: NodeListOf<HTMLElement> | null | undefined;\n      private progressBar: HTMLElement | null | undefined;\n      private progressLine: HTMLElement | null | undefined;\n      private viewedProducts: HTMLElement | null | undefined;\n      private vm: EhLoadMoreViewModel;\n      private totalResults = 1;\n      private nextPage:string|undefined;\n      private nextPageHistory:string|undefined;\n      private loadMoreSection: HTMLElement | null | undefined;\n\n      constructor(\n          private readonly base: HTMLElement | null,\n      ) {\n\n          this.el = this.base;\n          const that = this;\n          this.buttonMore = this.el?.querySelector(`.${EhLoadMoreController.LOAD_MORE_BUTTON_CLASSNAME}`);\n          this.productCards = this.el?.querySelectorAll(`.${EhLoadMoreController.PRODUCT_CARD_CLASSNAME}`);\n          this.totalResults = (this.el?.dataset.resultCount ? (Number.parseInt(this.el?.dataset.resultCount)) : this.productCards?.length) || this.productCards?.length || 0;\n          this.nextPage = this.el?.dataset.nextPage;\n          this.nextPageHistory = this.el?.dataset.nextPageHistory;\n          this.viewedProducts = this.el?.querySelector(`.${EhLoadMoreController.VIEWED_PRODUCTS_CLASSNAME}`);\n          this.progressBar = this.el?.querySelector(`.${EhLoadMoreController.PROGRESS_BAR_CLASSNAME}`);\n          this.progressLine = this.progressBar?.querySelector(`.${EhLoadMoreController.PROGRESS_LINE_CLASSNAME}`);\n          this.loadMoreSection = this.el?.querySelector(`.${EhLoadMoreController.LOAD_MORE_SECTION_CLASSNAME}`);\n          \n\n          if (!this.buttonMore || !this.el || !this.productCards || !this.viewedProducts || !this.progressLine ) {\n              throw new Error(`Missing required element`);\n          }\n          this.onButtonMoreClicked.bind(this);\n          this.reload.bind(this);\n\n          this.vm = new EhLoadMoreViewModel(\n              this.el,\n              this.buttonMore,\n              () => this.productCards,\n              () => this.totalResults,\n              this.viewedProducts,\n              this.progressLine,\n              this.loadMoreSection,\n              () => this.nextPage,\n              () => this.nextPageHistory,\n              () => this.refresh()\n          );\n          this.init();\n          this.el?.addEventListener(EhLoadMoreController.RELOAD_EVENT, (e) => {\n              //console.log(\"event: \",e );\n              that.reload();\n          })\n\n      }\n\n      private refresh(): void{\n          this.productCards = this.el?.querySelectorAll(`.${EhLoadMoreController.PRODUCT_CARD_CLASSNAME}`);\n          this.totalResults = (this.el?.dataset.resultCount ? (Number.parseInt(this.el?.dataset.resultCount)) : this.productCards?.length) || this.productCards?.length || 0;\n          this.nextPage = this.el?.dataset.nextPage;\n          this.nextPageHistory = this.el?.dataset.nextPageHistory;\n      }\n\n      private reload(): void {\n          this.refresh();\n          this.vm?.resetPage();\n          this.vm?.showProducts();\n      }\n\n      private init(): void {\n          this.registerControls();\n      }\n\n      private registerControls(): void {\n          this.buttonMore?.addEventListener('click', this.onButtonMoreClicked);\n      }\n\n      private onButtonMoreClicked = (e: MouseEvent | TouchEvent): void => {\n          e.preventDefault();\n          this.vm.loadMore();\n      }\n  }\n\n\n  class EhLoadMoreViewModel {\n\n      private static HIDE_CLASSNAME: string = 'ehtw-hidden';\n      public static BREAKPOINT_X_LARGE: number = 1440;\n      public static BREAKPOINT_LARGE: number = 1025;\n      public static BREAKPOINT_MEDIUM: number = 769;\n      public static BREAKPOINT_SMALL: number = 481;\n      public static BREAKPOINT_X_SMALL: number = 350;\n\n      private pageSize = 0;\n      private currentPage: number = 1;\n      private textMore:string = $(this.buttonMore).data('labelMoreText') || \"You viewed {{numberShown}} of {{numberOverall}} products\";\n      private textCompleted:string = $(this.buttonMore).data('labelCompleteText') || \"You viewed all {{numberOverall}} of {{numberOverall}} products\";\n      private loadAmounts: string[];\n\n      constructor(\n          private readonly loadMoreElement: HTMLElement,\n          private readonly buttonMore: HTMLElement,\n          private readonly productCards: () => NodeListOf<HTMLElement> | null |undefined,\n          private readonly totalResults: () => number,\n          private readonly viewedProducts: HTMLElement,\n          private readonly progressLine: HTMLElement,\n          private readonly loadMoreSection: HTMLElement| null | undefined,\n          private readonly nextPage: () => string|undefined,\n          private readonly nextPageHistory: () => string|undefined,\n          private readonly refresh: () => void\n      ) {\n          this.currentPage = loadMoreElement.dataset.page ? Number.parseInt(loadMoreElement.dataset.page) : this.currentPage || this.currentPage;\n          this.showProducts.bind(this);\n          this.doShowProducts.bind(this);\n          this.loadMore.bind(this);\n          this.onBreakpointChange.bind(this);\n          if($(loadMoreElement).data('loadNumbers')) {\n            this.loadAmounts = $(this.loadMoreElement).data('loadNumbers');\n          }\n          this.init();\n      }\n\n\n      private init(): void {\n          // Derive the first page size from the viewport directly instead of waiting for the\n          // breakpoint listener: Breakpoints defers everything into a requestAnimationFrame,\n          // which never runs while the document has no frame (background tab, session restore,\n          // prerender). Without that first size pageSize stays 0, showProducts() is never\n          // called at all and every card the server delivered stays visible with an empty\n          // counter label. Feeding the current threshold through the regular listener keeps the\n          // amount mapping (incl. data-load-numbers) in one place; once Breakpoints does report\n          // the same breakpoint, updatePageSize() sees no change and nothing runs twice.\n          this.onBreakpointChange(null, new Breakpoint('initial', EhLoadMoreViewModel.currentThreshold()));\n          eh.Breakpoints.getInstance().registerChangeListener(this.onBreakpointChange);\n      }\n\n      /** Largest breakpoint threshold at or below the current viewport width. */\n      private static currentThreshold(): number {\n          const width: number = window.innerWidth;\n          return [\n            EhLoadMoreViewModel.BREAKPOINT_X_LARGE,\n            EhLoadMoreViewModel.BREAKPOINT_LARGE,\n            EhLoadMoreViewModel.BREAKPOINT_MEDIUM,\n            EhLoadMoreViewModel.BREAKPOINT_SMALL,\n            EhLoadMoreViewModel.BREAKPOINT_X_SMALL\n          ].find(threshold => width >= threshold) ?? EhLoadMoreViewModel.BREAKPOINT_X_SMALL;\n      }\n\n      public resetPage(): void {\n          this.currentPage = 1;\n      }\n\n      private onBreakpointChange: (old: Breakpoint | null, current: Breakpoint) => void = (_old: Breakpoint | null, _current: Breakpoint): void => {\n          let change: boolean = false;\n          let amount: number; \n          switch (_current.threshold) {\n              case EhLoadMoreViewModel.BREAKPOINT_X_LARGE: {\n                amount = 8;\n                if(this.loadAmounts && this.loadAmounts.length > 0) {\n                  amount = parseInt(this.loadAmounts[0]);\n                }\n                change = this.updatePageSize(amount);\n                break;\n              }\n              case EhLoadMoreViewModel.BREAKPOINT_LARGE: {\n                amount = 6;\n                if(this.loadAmounts && this.loadAmounts.length > 1) {\n                  amount = parseInt(this.loadAmounts[1]);\n                }\n                change = this.updatePageSize(amount);\n                  break;\n              }\n              case EhLoadMoreViewModel.BREAKPOINT_MEDIUM: {\n                amount = 8;\n                if(this.loadAmounts && this.loadAmounts.length > 2) {\n                  amount = parseInt(this.loadAmounts[2]);\n                }\n                change = this.updatePageSize(amount);\n                break;\n              }\n              case EhLoadMoreViewModel.BREAKPOINT_SMALL: {\n                amount = 4;\n                if(this.loadAmounts && this.loadAmounts.length > 3) {\n                  amount = parseInt(this.loadAmounts[3]);\n                }\n                change = this.updatePageSize(amount);\n                break;\n              }\n              case EhLoadMoreViewModel.BREAKPOINT_X_SMALL: {\n                amount = 4;\n                if(this.loadAmounts && this.loadAmounts.length > 4) {\n                  amount = parseInt(this.loadAmounts[4]);\n                }\n                change = this.updatePageSize(amount);\n                break;\n              }\n              default: {\n                amount = 4;\n                if(this.loadAmounts && this.loadAmounts.length > 5) {\n                  amount = parseInt(this.loadAmounts[5]);\n                }\n                change = this.updatePageSize(amount);\n                break;\n              }\n          }\n          if (change) {\n              this.showProducts();\n          }\n      };\n\n       private updatePageSize:(newSize: number) => boolean = (newSize) => {\n           const rv = this.pageSize!==newSize;\n           this.pageSize = newSize;\n           return rv;\n       }\n  \n      public loadMore() {\n          this.currentPage++;\n          this.pushHistoryPage();\n          this.showProducts();\n      }\n\n      /**\n       * Reflect the page the user is on in the URL on every click — not only when the\n       * click happens to trigger an ajax request. Clicks served from the already loaded\n       * (hidden) cards left the address bar behind before.\n       *\n       * The paging parameters are component-scoped (`filter.p`, `filter.fb`, …), so the\n       * server-rendered next-page-history URL is used as the template and only its page\n       * number is replaced by the current one.\n       */\n      private pushHistoryPage(): void {\n          const template = this.nextPageHistory();\n          if (!template) {\n              return;\n          }\n          const params = eh.URLHelper.buildQueryParamMap(eh.URLHelper.getQueryString(template));\n          let pageParam = '';\n          for (const key in params) {\n              if (params.hasOwnProperty(key) && (key === 'p' || key.lastIndexOf('.p') === key.length - 2)) {\n                  pageParam = key;\n              }\n          }\n          if (!pageParam) {\n              return;\n          }\n          params[pageParam] = '' + this.currentPage;\n          history.pushState({}, '', eh.URLHelper.buildUrl(template, eh.URLHelper.buildQueryString(params)));\n      }\n\n      public showProducts() {\n          this.loadMoreElement.classList.remove(EhLoadMoreController.CLOSED_CLASSNAME);\n          this.buttonMore.blur();\n          const moreCardsNeeded:boolean= (this.productCards()?.length || 0) < Math.min(this.currentPage * this.pageSize, this.totalResults());\n          const pagingExceeded = (this.currentPage * this.pageSize) - this.totalResults() > this.pageSize;\n          if ( moreCardsNeeded && !pagingExceeded) {\n              const url = this.nextPage();\n              if (url) {\n                  this.buttonMore.classList.add(\"loading\");\n                  $.ajax(url, {method: \"POST\"}).done((d: string) => {\n                      const newDom = new DOMParser().parseFromString(d, \"text/html\");\n                      const s: HTMLElement | null = newDom.querySelector(`.${EhLoadMoreController.LOAD_MORE_CLASSNAME}`);\n                      if (s) {\n                          this.loadMoreElement.dataset.page = s.dataset.page\n                          this.loadMoreElement.dataset.nextPage = s.dataset.nextPage\n                          this.loadMoreElement.dataset.nextPageHistory = s.dataset.nextPageHistory\n                          this.loadMoreElement.dataset.resultCount = s.dataset.resultCount\n                      }\n                      let parent:HTMLElement|null = null;\n                      this.productCards()?.forEach((e) => {\n                          parent = e.parentElement;\n                          if (parent) {\n                              return false;\n                          }\n                          return true;\n                      });\n                      if (parent) {\n                          newDom.querySelectorAll(`.${EhLoadMoreController.LOAD_MORE_CLASSNAME} .${EhLoadMoreController.PRODUCT_CARD_CLASSNAME}`).forEach((e: HTMLElement) => {\n                              parent?.appendChild(e);\n                              const ev: any = new Event(cs.Snippet.EventIdPostReplace);\n                              ev.replacedTarget = e;\n                              document.querySelector(':root')?.dispatchEvent(ev);\n                          });\n                      }\n                      this.refresh();\n                      this.doShowProducts();\n                      this.buttonMore.classList.remove(\"loading\");\n\n                  });\n              } else {\n                this.doShowProducts();\n              }\n          } else {\n              this.doShowProducts();\n          }\n      }\n\n      private doShowProducts() {\n          let index = 0;\n          let shownElements = 0;\n          const hideOnFirstPage:boolean= this.totalResults() <= this.pageSize && this.currentPage === 1;\n          if (!this.productCards) {\n              console.log(\"this: \", this);\n          }\n          this.productCards()?.forEach(product => {\n              if (index < this.currentPage * this.pageSize) {\n                  shownElements++;\n                  product.classList.remove(EhLoadMoreViewModel.HIDE_CLASSNAME);\n              } else {\n                  product.classList.add(EhLoadMoreViewModel.HIDE_CLASSNAME);\n              }\n              index++;\n          });\n\n          this.viewedProducts.innerText = this.textMore.replace(/{{numberShown}}/gi, \"\"+shownElements).replace(/{{numberOverall}}/gi, \"\"+this.totalResults());\n          this.progressLine.setAttribute('x2', (shownElements * 100 / Math.max(this.totalResults(), 1)).toString());\n          if (shownElements >= this.totalResults()) {\n              this.buttonMore.classList.add(EhLoadMoreViewModel.HIDE_CLASSNAME);\n              this.viewedProducts.innerText = this.textCompleted.replace(/{{numberOverall}}/gi, \"\"+this.totalResults());\n          } else {\n              this.buttonMore.classList.remove(EhLoadMoreViewModel.HIDE_CLASSNAME);\n          }\n\n          if (this.loadMoreSection) {\n            hideOnFirstPage ? this.loadMoreSection?.classList.add(EhLoadMoreViewModel.HIDE_CLASSNAME) : this.loadMoreSection?.classList.remove(EhLoadMoreViewModel.HIDE_CLASSNAME);\n          }\n      }\n  }\n}","namespace eh {\n\n    /** What one process-map wrapper shows: the visible map and the breadcrumb trail leading to it. */\n    interface IProcessMapView {\n        target: string;\n        trail: string[];\n    }\n\n    /**\n     * Process-map part of `history.state` (key `pm`). `maps` holds the view of every wrapper on\n     * the page, indexed by DOM order. `run` counts the consecutive hotspot pushes of one wrapper\n     * ending in this entry -- only within such a run can the breadcrumb go back via history.go().\n     */\n    interface IProcessMapState {\n        maps: (IProcessMapView | null)[];\n        run: { wrapper: number, length: number };\n    }\n\n    /**\n     * Switches between the TGP maps of a process overview without leaving the page. Every map is\n     * rendered server-side; switching only shows one and hides the others of the same wrapper.\n     * Each switch is a history entry (pushState, which -- unlike following the '#svg-<id>' link\n     * natively -- does not scroll), and the view is restored on Back/Forward and on page load.\n     */\n    export class EhProcessMapController {\n\n        public static PROCESS_MAP_SVG_CLASSNAME = 'ehel-process-overview--svg';\n        public static PROCESS_MAP_WRAPPER_CLASSNAME = 'ehel-process-overview--svg-wrapper';\n        public static BREADCRUMB_CLASSNAME = 'ehel-process-overview--breadcrumb';\n        public static BREADCRUMB_ITEM_CLASSNAME = 'ehel-process-overview--breadcrumb-item';\n        public static BREADCRUMB_SEP_CLASSNAME = 'ehel-process-overview--breadcrumb-sep';\n        public static BREADCRUMB_ITEM_LAST_CLASSNAME = 'ehel-process-overview--breadcrumb-item--last';\n\n        private static readonly MAP_ID_PREFIX = 'svg-';\n        private static readonly URL_HASH_PREFIX = '#pm-';\n\n        private readonly vms: EhProcessMapViewModel[] = [];\n        private observer: MutationObserver;\n        /** Scroll position to hold across a breadcrumb's history.go(); null for Back/Forward. */\n        private keepScrollY: number | null = null;\n\n        static init($base: JQuery<HTMLElement>): void {\n            new EhProcessMapController($base[0]);\n        }\n\n        constructor(\n            private readonly base: HTMLElement | null,\n        ) {\n\n            if (!this.base) {\n                throw new Error(`Missing required element`);\n            }\n\n            this.observer = new MutationObserver(() => this.bindLinks());\n            this.observer.observe(this.base, { childList: true, subtree: true });\n            window.addEventListener('popstate', this.onPopState);\n        }\n\n        private bindLinks(): void {\n            this.base!.querySelectorAll<HTMLElement>(\n                `.${EhProcessMapController.PROCESS_MAP_WRAPPER_CLASSNAME}:not([data-pm-wrapper])`\n            ).forEach(wrapper => this.registerWrapper(wrapper));\n\n            this.base!.querySelectorAll<HTMLAnchorElement>(\n                `.${EhProcessMapController.PROCESS_MAP_SVG_CLASSNAME} a:not([data-pm-bound])`\n            ).forEach(link => {\n                link.dataset['pmBound'] = '1';\n                link.addEventListener('click', this.onLinkClick);\n            });\n        }\n\n        private registerWrapper(wrapper: HTMLElement): void {\n            const containers = wrapper.querySelectorAll<HTMLElement>(`.${EhProcessMapController.PROCESS_MAP_SVG_CLASSNAME}`);\n            const root = Array.from(containers).find(c => !c.classList.contains('ehtw-hidden') && c.style.display !== 'none');\n            if (!root?.id) return;\n\n            const index = this.vms.length;\n            wrapper.dataset['pmWrapper'] = String(index);\n            const vm = new EhProcessMapViewModel(wrapper, root.id, this.onBreadcrumbClick(index));\n            this.vms.push(vm);\n\n            // A reload or a Back navigation not served from the bfcache starts from the root\n            // maps; bring back the view this history entry was showing.\n            const state = EhProcessMapController.readState();\n            const view = state?.maps[index] ?? this.viewFromHash(vm);\n            vm.restore(view && vm.contains(view.target) ? view : vm.rootView());\n\n            // Record the view in the entry, so that Back to the page-load entry restores it too.\n            const run = state?.run ?? { wrapper: index, length: 0 };\n            history.replaceState({ ...history.state, pm: this.currentState(run.wrapper, run.length) }, '');\n        }\n\n        private onLinkClick = (e: Event): void => {\n            const link = e.currentTarget as HTMLAnchorElement;\n            const href = link.getAttribute('href');\n            if (!href?.startsWith('#')) return;\n\n            const index = this.vmIndexOf(link);\n            const vm = this.vms[index];\n            if (!vm?.contains(href.slice(1))) return;\n\n            // Following the fragment link natively would scroll the map to the top of the viewport.\n            e.preventDefault();\n            vm.navigate(href.slice(1));\n            const run = EhProcessMapController.readState()?.run;\n            this.pushState(index, run?.wrapper === index ? run.length + 1 : 1);\n        }\n\n        private onBreadcrumbClick = (index: number) => (targetIndex: number): void => {\n            const vm = this.vms[index];\n            const steps = vm.trailLength() - targetIndex;\n            const run = EhProcessMapController.readState()?.run;\n\n            if (run?.wrapper === index && steps <= run.length) {\n                // Each hotspot push of this run added one breadcrumb level, so going back that many\n                // entries lands exactly on the clicked level; onPopState renders it. The breadcrumb\n                // is a click on the page, so keep the scroll position the traversal would restore.\n                this.keepScrollY = window.scrollY;\n                history.go(-steps);\n            } else {\n                // History no longer mirrors the trail (foreign entries in between, reload, deep link).\n                vm.navigateUp(targetIndex);\n                this.pushState(index, 0);\n            }\n        }\n\n        private onPopState = (): void => {\n            const state = EhProcessMapController.readState();\n            this.vms.forEach((vm, index) => {\n                if (state) {\n                    const view = state.maps[index];\n                    vm.restore(view && vm.contains(view.target) ? view : vm.rootView());\n                } else {\n                    // An entry written by another component without our state: only a hash\n                    // pointing into this wrapper says what to show, otherwise leave it as it is.\n                    const view = this.viewFromHash(vm);\n                    if (view) vm.restore(view);\n                }\n            });\n\n            const keepScrollY = this.keepScrollY;\n            if (keepScrollY !== null) {\n                this.keepScrollY = null;\n                // The browser restores the entry's scroll position after popstate, before the\n                // hashchange of the same traversal; undo it there, so no frame shows the jump.\n                // Every breadcrumb level has its own hash; the frame callback is the fallback.\n                const keep = (): void => {\n                    window.removeEventListener('hashchange', keep);\n                    window.scrollTo(window.scrollX, keepScrollY);\n                };\n                window.addEventListener('hashchange', keep);\n                requestAnimationFrame(keep);\n            }\n        }\n\n        /**\n         * Pushes the current views. The URL names the map as '#pm-<id>' rather than the\n         * hotspot's '#svg-<id>': a fragment matching an element id makes the browser scroll to\n         * that element on Back/Forward instead of restoring the position the entry was left at.\n         */\n        private pushState(runWrapper: number, runLength: number): void {\n            history.pushState(\n                { ...history.state, pm: this.currentState(runWrapper, runLength) },\n                '',\n                EhProcessMapController.URL_HASH_PREFIX + this.vms[runWrapper].currentView().target,\n            );\n        }\n\n        private currentState(runWrapper: number, runLength: number): IProcessMapState {\n            return {\n                maps: this.vms.map(vm => vm.currentView()),\n                run: { wrapper: runWrapper, length: runLength },\n            };\n        }\n\n        /** The map id a URL hash names: '#pm-svg-<id>' as pushed, or a plain '#svg-<id>' link. */\n        public static mapIdFromHash(hash: string): string | null {\n            const id = hash.startsWith(EhProcessMapController.URL_HASH_PREFIX)\n                ? hash.slice(EhProcessMapController.URL_HASH_PREFIX.length)\n                : hash.slice(1);\n            return id.startsWith(EhProcessMapController.MAP_ID_PREFIX) ? id : null;\n        }\n\n        private viewFromHash(vm: EhProcessMapViewModel): IProcessMapView | null {\n            const target = EhProcessMapController.mapIdFromHash(window.location.hash);\n            return target && vm.contains(target) ? vm.reconstructView(target) : null;\n        }\n\n        private vmIndexOf(el: HTMLElement): number {\n            const wrapper = el.closest<HTMLElement>(`.${EhProcessMapController.PROCESS_MAP_WRAPPER_CLASSNAME}`);\n            return wrapper?.dataset['pmWrapper'] ? Number(wrapper.dataset['pmWrapper']) : -1;\n        }\n\n        private static readState(): IProcessMapState | null {\n            const pm = history.state?.pm as IProcessMapState | undefined;\n            return pm && Array.isArray(pm.maps) && pm.run ? pm : null;\n        }\n    }\n\n    class EhProcessMapViewModel {\n\n        private history: string[] = [];\n        private current: string;\n\n        constructor(\n            private readonly wrapper: HTMLElement,\n            private readonly rootId: string,\n            onBreadcrumbClick: (targetIndex: number) => void,\n        ) {\n            this.current = rootId;\n            wrapper.querySelector(`.${EhProcessMapController.BREADCRUMB_CLASSNAME}`)\n                ?.addEventListener('click', (e) => {\n                    const item = (e.target as HTMLElement).closest<HTMLElement>('[data-pm-target]');\n                    const targetIndex = item ? this.history.indexOf(item.dataset['pmTarget'] ?? '') : -1;\n                    if (targetIndex !== -1) onBreadcrumbClick(targetIndex);\n                });\n        }\n\n        public contains(id: string): boolean {\n            return !!this.findMap(id);\n        }\n\n        public currentView(): IProcessMapView {\n            return { target: this.current, trail: [...this.history] };\n        }\n\n        public rootView(): IProcessMapView {\n            return { target: this.rootId, trail: [] };\n        }\n\n        public trailLength(): number {\n            return this.history.length;\n        }\n\n        public navigate(targetId: string): void {\n            this.history.push(this.current);\n            this.show(targetId);\n        }\n\n        public navigateUp(targetIndex: number): void {\n            const targetId = this.history[targetIndex];\n            this.history = this.history.slice(0, targetIndex);\n            this.show(targetId);\n        }\n\n        public restore(view: IProcessMapView): void {\n            this.history = view.trail.filter(id => this.contains(id));\n            this.show(view.target);\n        }\n\n        /** The breadcrumb for a map reached without history: walk the hotspot links back to the root. */\n        public reconstructView(targetId: string): IProcessMapView {\n            const trail: string[] = [];\n            let id = targetId;\n            while (id !== this.rootId && trail.length < this.maps().length) {\n                const link = this.wrapper.querySelector<HTMLElement>(\n                    `.${EhProcessMapController.PROCESS_MAP_SVG_CLASSNAME} a[href=\"#${id}\"]`\n                );\n                const parent = link?.closest<HTMLElement>(`.${EhProcessMapController.PROCESS_MAP_SVG_CLASSNAME}`);\n                if (!parent?.id) break;\n                id = parent.id;\n                trail.unshift(id);\n            }\n            return { target: targetId, trail };\n        }\n\n        private show(targetId: string): void {\n            const target = this.findMap(targetId);\n            if (!target) return;\n            const changed = targetId !== this.current;\n            this.current = targetId;\n            this.showMap(target, changed);\n            this.renderBreadcrumb();\n        }\n\n        private maps(): HTMLElement[] {\n            return Array.from(this.wrapper.querySelectorAll<HTMLElement>(`.${EhProcessMapController.PROCESS_MAP_SVG_CLASSNAME}`));\n        }\n\n        private findMap(id: string): HTMLElement | undefined {\n            return this.maps().find(c => c.id === id);\n        }\n\n        private showMap(target: HTMLElement, changed: boolean): void {\n            this.maps().forEach(c => { c.style.display = 'none'; });\n            target.style.display = 'block';\n            void target.offsetWidth;\n            const svgEl = target.querySelector<SVGSVGElement>('svg');\n            if (svgEl) {\n                svgEl.style.width = '100%';\n                svgEl.style.height = 'auto';\n            }\n            window.dispatchEvent(new Event('resize'));\n\n            const $target = $(target);\n\n            if (changed && $target.hasClass('marker-cs-tracking-onsite-navigation')) {\n                window.setTimeout(function() {\n                    eh.Tracking.handleOnsiteNavigation(target.dataset['label']??'', []);\n                    $(':root').trigger(eh.VPAGE_EVENTS.DRAWER_OPENED, $target);\n                });\n            }\n        }\n\n        private renderBreadcrumb(): void {\n            const nav = this.wrapper.querySelector<HTMLElement>(`.${EhProcessMapController.BREADCRUMB_CLASSNAME}`);\n            if (!nav || this.maps().length < 2) return;\n\n            const items = nav.querySelectorAll<HTMLElement>(`.${EhProcessMapController.BREADCRUMB_ITEM_CLASSNAME}`);\n            const seps = nav.querySelectorAll<HTMLElement>(`.${EhProcessMapController.BREADCRUMB_SEP_CLASSNAME}`);\n\n            items.forEach(i => { i.classList.add('ehtw-hidden'); i.classList.remove(EhProcessMapController.BREADCRUMB_ITEM_LAST_CLASSNAME); i.removeAttribute('data-pm-target'); });\n            seps.forEach(s => s.classList.add('ehtw-hidden'));\n\n            nav.style.display = 'flex';\n\n            this.history.forEach((id, i) => {\n                const item = items[i];\n                if (!item) return;\n                item.classList.remove('ehtw-hidden');\n                item.dataset['pmTarget'] = id;\n                item.textContent = this.getLabel(id);\n                seps[i]?.classList.remove('ehtw-hidden');\n            });\n\n            const currentItem = items[this.history.length];\n            if (currentItem) {\n                currentItem.classList.remove('ehtw-hidden');\n                currentItem.classList.add(EhProcessMapController.BREADCRUMB_ITEM_LAST_CLASSNAME);\n                currentItem.textContent = this.getLabel(this.current);\n            }\n        }\n\n        private getLabel(id: string): string {\n            return this.findMap(id)?.dataset['label'] ?? id;\n        }\n    }\n}\n","namespace eh {\n\n  /**\n   * Controller to manage anchor-navigation behaviour. \n   */\n  export class EhProductTeaserLinkTabController {\n\n      public static ANCHOR_NAV_CLASSNAME: string = 'ehel-product-navigation';\n      public static ANCHOR_NAV_NAVIGATION_CLASSNAME: string = 'ehel-product-navigation--navigation';\n      public static ANCHOR_NAV_NAVIGATION_ITEM_CLASSNAME: string = 'ehel-button';\n\n      public static ANCHOR_NAV_PREVIOUS_BTN_CLASSNAME: string = 'ehel-product-navigation--prev-btn';\n      public static ANCHOR_NAV_NEXT_BTN_CLASSNAME: string = 'ehel-product-navigation--next-btn';\n\n      private navigation: HTMLElement | null | undefined;\n      private navigationItems: NodeListOf<HTMLElement> | undefined;\n\n      private previousBtn: HTMLElement | null | undefined;\n      private nextBtn: HTMLElement | null | undefined;\n      private vm: EhAnchorNavigationViewModel;\n\n      static init($base: JQuery<HTMLElement>): void {\n        $(`.${EhProductTeaserLinkTabController.ANCHOR_NAV_CLASSNAME}`, $base).each((index: number, element: HTMLElement) => {\n          new EhProductTeaserLinkTabController(element);\n        });\n      }\n\n      constructor(\n          private readonly el: HTMLElement | null,\n      ) {\n          this.navigation = this.el?.querySelector(`.${EhProductTeaserLinkTabController.ANCHOR_NAV_NAVIGATION_CLASSNAME}`);\n          this.navigationItems = this.navigation?.querySelectorAll(`.${EhProductTeaserLinkTabController.ANCHOR_NAV_NAVIGATION_ITEM_CLASSNAME}`);\n          this.previousBtn = this.el?.querySelector(`.${EhProductTeaserLinkTabController.ANCHOR_NAV_PREVIOUS_BTN_CLASSNAME}`);\n          this.nextBtn = this.el?.querySelector(`.${EhProductTeaserLinkTabController.ANCHOR_NAV_NEXT_BTN_CLASSNAME}`);\n          \n          if (!this.navigation) {\n              throw new Error(`Missing required element`);\n          }\n\n          this.vm = new EhAnchorNavigationViewModel(\n              this.navigation, \n              this.navigationItems,\n              this.previousBtn,\n              this.nextBtn\n          );\n          \n          if (!this.vm.isDisabled) {\n              this.init();\n          }\n          \n      }\n\n      private init(): void {\n          this.registerControls();\n      }\n\n      private registerControls(): void {\n          this.previousBtn?.addEventListener('click', this.onPreviousClicked);\n          this.nextBtn?.addEventListener('click', this.onNextClicked);\n          this.navigationItems?.forEach((item: HTMLElement): void => {\n              item.addEventListener('click', this.onItemClicked);\n          });\n      }\n\n      private onItemClicked = (e: MouseEvent | TouchEvent): void => {\n          e.preventDefault();\n          this.vm.setCurrentItem(e.currentTarget as HTMLElement);\n      }\n\n      private onPreviousClicked = (e: MouseEvent | TouchEvent): void => {\n          e.preventDefault();\n          this.vm.previous();\n      }\n\n      private onNextClicked = (e: MouseEvent | TouchEvent): void => {\n          e.preventDefault();\n          this.vm.next();\n      }\n\n  }\n\n  interface IScrollerItem {\n      idx: number;\n      link: HTMLElement;\n      target: HTMLElement;\n      thresholdBegin: number;\n      thresholdEnd: number;\n  }\n\n  class EhAnchorNavigationViewModel {\n\n      public isDisabled: boolean = false;\n\n      private static ACTIVE_CLASSNAME: string = 'is-active';\n      private static DISABLED_CLASSNAME: string = 'is-disabled';\n      private static HIDE_CLASSNAME: string = 'ehtw-hidden';\n      private static FLEX_CLASSNAME: string = 'ehtw-flex';\n      private static TRANSITION_EASING_LINEAR: string = 'linear';\n      private static TRANSITION_EASING_SWING: string = 'swing';\n      private static TRANSITION_DURATION: number = 400;\n      private static MIN_AMOUNT_SCROLL_ITEMS: number = 2;\n      private _currentItem: IScrollerItem | undefined;\n      private _scrollerItems: IScrollerItem[] = [];\n      private targetScrollPosLeft: number = 0;\n      private navigationHeight: number = 0;\n\n      constructor(\n          private scroller: HTMLElement,\n          private items: NodeListOf<HTMLElement> | undefined,\n          private previousButton: HTMLElement | null | undefined,\n          private nextButton: HTMLElement | null | undefined,\n      ) {\n\n        this.init();\n          // setTimeout(() => {\n          //     this.init();\n          // }, 2000);\n          \n      }\n\n      public previous(): void {\n          if (!this._currentItem) {\n              return this.setCurrentItem(this.getItemByIdx(0).link);\n          }\n          const targetIndex: number = Math.max(0, this._currentItem.idx - 1)\n          const previousItem: IScrollerItem = this.getItemByIdx(targetIndex);\n          this.setCurrentItem(previousItem.link);\n          //$(':root').trigger(TAB_EVENTS.TAB_CHANGE, item);\n        }\n      \n      public next(): void {\n          if (!this._currentItem) {\n              return this.setCurrentItem(this.getItemByIdx(0).link);\n          }\n          const targetIndex: number = Math.min(this._scrollerItems.length - 1, this._currentItem.idx + 1);\n          const nextItem: IScrollerItem = this.getItemByIdx(targetIndex);\n          this.setCurrentItem(nextItem.link);\n          //$(':root').trigger(TAB_EVENTS.TAB_CHANGE, item);\n      }\n\n      public setCurrentItem(item: HTMLElement | undefined, triggerJumpToAnchor: boolean = true): void {\n\n          if (this._currentItem) {\n              this._currentItem.link.classList.remove(EhAnchorNavigationViewModel.ACTIVE_CLASSNAME);\n              this._currentItem?.target.classList.remove(EhAnchorNavigationViewModel.ACTIVE_CLASSNAME);\n              this._currentItem.link.blur();\n          }\n\n          this._currentItem = this.getItemByEl(item);\n          this._currentItem?.link.classList.add(EhAnchorNavigationViewModel.ACTIVE_CLASSNAME);\n          this._currentItem?.target.classList.add(EhAnchorNavigationViewModel.ACTIVE_CLASSNAME);\n          this.alignItemToViewport(this._currentItem);\n      }\n\n      private init(): void {\n          this.navigationHeight = this.scroller.clientHeight;\n          this.invalidateItems();\n          this.setCurrentItem(this.getItemByIdx(0).link);\n          \n          if (this._scrollerItems.length < EhAnchorNavigationViewModel.MIN_AMOUNT_SCROLL_ITEMS) {\n              this.isDisabled = true;\n              // this.scroller.classList.add(EhAnchorNavigationViewModel.HIDE_CLASSNAME);\n              this._scrollerItems = [];\n              return;\n          }\n\n          window.addEventListener('resize', eh.debounce(this.invalidate, 40));\n          const initialSelection: HTMLElement | null = this.scroller?.querySelector(`.${EhAnchorNavigationViewModel.ACTIVE_CLASSNAME}`) as HTMLElement;\n          if (initialSelection) {\n              this.setCurrentItem(initialSelection);\n          }\n          this.invalidateControls();\n          this.scroller.addEventListener('scroll', eh.debounce(this.onNavigationScrollChange, 40), {passive: true});\n      }\n\n      private onNavigationScrollChange = (): void => {\n          this.targetScrollPosLeft = this.scroller.scrollLeft;\n          this.invalidateControls();\n      };\n\n      private alignItemToViewport(item: IScrollerItem | undefined): void {\n          if (!item) {\n              return;\n          }\n          const leftOffset: number = item.idx > 0 ? this.navigationHeight : 0;\n          const rightOffset: number = item.idx < this._scrollerItems.length -1 ? this.navigationHeight : 0;\n          \n          const scrollerPos: number = this.scroller.scrollLeft;\n          let clippingLeft: number = item.link.offsetLeft - leftOffset - scrollerPos;\n          let clippingRight: number = item.link.offsetLeft + item.link.clientWidth - this.scroller.clientWidth + rightOffset - scrollerPos;\n\n          if (clippingLeft < 0) {\n              this.targetScrollPosLeft = scrollerPos + Math.min(0, clippingLeft);\n          }\n          if (clippingRight > 0) {\n              this.targetScrollPosLeft = scrollerPos + Math.max(0, clippingRight);\n          }\n\n          if (this.scroller.scrollLeft !== this.targetScrollPosLeft) {\n              $(this.scroller).animate({\n                  scrollLeft: this.targetScrollPosLeft\n              },\n              EhAnchorNavigationViewModel.TRANSITION_DURATION,\n              EhAnchorNavigationViewModel.TRANSITION_EASING_LINEAR);\n          }\n\n      }\n\n      private animateToAnchor(item: IScrollerItem | undefined): void {\n          const el: Element | null = document.scrollingElement;\n          if (!el ) {\n              return;\n          }\n          $(el).animate({\n              scrollTop: item?.thresholdBegin\n          },\n          EhAnchorNavigationViewModel.TRANSITION_DURATION,\n          EhAnchorNavigationViewModel.TRANSITION_EASING_SWING);\n      }\n\n      private getItemByEl(el: HTMLElement | undefined): IScrollerItem | undefined {\n          return this._scrollerItems.find(si => si.link === el);\n      }\n\n      private getItemByIdx(idx: number): IScrollerItem {\n          if (idx < 0 || idx > this._scrollerItems.length -1) {\n              throw new Error(`Out of bounds. Failed to invalidate controls`);\n          }\n          return this._scrollerItems[idx];\n      }\n\n      private getItemByOffset(offset: number): IScrollerItem | undefined {\n          return this._scrollerItems.find(i => {\n              return i.thresholdBegin <= offset \n                    && i.thresholdEnd > offset;\n          });\n      }\n\n      private invalidate = (): void => {\n          this.invalidateControls();\n          this.invalidateItems();\n      }\n\n      private invalidateItems = (): void => {\n          this._scrollerItems = [];\n          let idx: number = 0;\n          this.items?.forEach((value: HTMLElement): void => {\n              const targetKey: string | null = value.getAttribute('href') || '';\n              const target: HTMLElement | null = document.getElementById(targetKey.replace(/[#!]/g, ''));\n              const isDisabled: boolean = value.classList.contains(EhAnchorNavigationViewModel.DISABLED_CLASSNAME);\n              if (!target || isDisabled) {\n                  return;\n              }\n              const topPos: number = eh.offsetTopToBody(target) - this.navigationHeight;\n              this._scrollerItems.push({\n                  idx: idx++,\n                  link: value,\n                  target: target,\n                  thresholdBegin: topPos,\n                  thresholdEnd: topPos + target.getBoundingClientRect().height,\n              });\n          });\n      }\n\n      private invalidateControls = (): void => {\n          const hideClass: string = EhAnchorNavigationViewModel.HIDE_CLASSNAME;\n\n          // no active overflow\n          if (this.scroller.scrollWidth === this.scroller.clientWidth) {\n              this.previousButton?.classList.add(hideClass);\n              this.nextButton?.classList.add(hideClass);\n              return;\n          }\n          \n          // handle previous button ctrl\n          if (this.targetScrollPosLeft > 0) {\n              this.previousButton?.classList.remove(hideClass);\n          } else {\n              this.previousButton?.classList.add(hideClass);\n          }\n          \n          // handle next button ctrl\n          const scrollerDelta: number = this.scroller.scrollWidth - this.scroller.clientWidth - 1;\n          if (this.targetScrollPosLeft < scrollerDelta) {\n              this.nextButton?.classList.remove(hideClass);\n          } else {\n              this.nextButton?.classList.add(hideClass);\n          }\n\n      }\n\n    }\n}","namespace eh {\n\n  export class QuickLinksController  {\n      public static MODULE_WRAPPER: string = 'ehel-quick-links';\n      /* Quicklinks */\n      public static QUICKLINKS_WRAPPER_CLASSNAME: string = 'ehel-quick-links--links-wrapper';\n      /* Table of content */\n      public static TABLE_OF_CONTENT_ELEM: string = 'ehel-table-of-content';\n\n      static init($base: JQuery<HTMLElement>): void {\n        $(`.${QuickLinksController.MODULE_WRAPPER}`, $base).each((index: number, element: HTMLElement) => {\n          new QuickLinksController(element);\n        });\n      }\n\n      private quickLinksWrapper: HTMLElement | null | undefined;\n\n      private tableOfContent: HTMLElement | null | undefined;\n\n      private vm: QuickLinksViewModel | null | undefined = null;\n\n      constructor(private readonly el: HTMLElement) {\n\n        this.quickLinksWrapper = this.el.querySelector(`.${QuickLinksController.QUICKLINKS_WRAPPER_CLASSNAME}`) as HTMLElement;\n        this.tableOfContent = this.el.querySelector(`.${QuickLinksController.TABLE_OF_CONTENT_ELEM}`) as HTMLElement;\n        this.vm = new QuickLinksViewModel(this.el, this.quickLinksWrapper, this.tableOfContent);\n        this.init();\n      }\n\n      private init(): void {\n          this.registerControls();\n      }\n\n      private registerControls(): void {\n\n        document.addEventListener('scroll', this.onScrollChange, {\n          passive: true,\n        });\n        eh.Breakpoints.getInstance().registerChangeListener(() => {\n          setTimeout(() => {\n            this.onScrollChange();\n          }, 100);\n        });\n\n        window.addEventListener('resize', this.onResizeChange, {\n          passive: true,\n        });\n        eh.Breakpoints.getInstance().registerChangeListener(() => {\n          setTimeout(() => {\n            this.onResizeChange();\n          }, 100);\n        });\n      }\n\n      private onScrollChange: () => void = (): void => {\n        this.vm?.scrollChange();\n      };\n\n      private onResizeChange: () => void = (): void => {\n        this.vm?.resizeChange();\n      };\n\n  }\n\n\n  class QuickLinksViewModel {\n\n      private static GRID_CELL_CLASSNAME: string = 'ehel-grid--cell';\n      private static ANCHOR_NAVIGATION_CLASSNAME: string = 'ehel-anchor-navigation';\n      private static AVOID_STICKY_CLASSNAME: string = 'avoid-sticky';\n      private static QUICK_LINKS_STICKY_CLASSNAME: string = 'ehel-quick-links-sticky';\n      private static QUICK_LINKS_LINKS_CLASSNAME: string = 'ehel-quick-links--links';\n\n      private root: HTMLElement = document.scrollingElement as HTMLElement;\n\n      private quickLinksGridCell!: HTMLElement | null;\n      private anchorNavigation!: HTMLElement | null;\n      private quickLinksLinks!: HTMLElement | null;\n\n      private offset: number = 60;\n      private anchorOffset: number = 64;\n\n      private quickLinkInitialTop = 0;\n\n      constructor(\n        private module: HTMLElement,\n        private quickLinks: HTMLElement | null | undefined,\n        private tableOfContent: HTMLElement | null | undefined) {\n          setTimeout(() => {\n              this.init();\n              }, 20);\n      }\n      private init(): void {\n        if (this.quickLinks) {\n          this.quickLinksGridCell = this.quickLinks.closest(`.${QuickLinksViewModel.GRID_CELL_CLASSNAME}`);\n          this.quickLinksLinks = this.quickLinks.closest(`.${QuickLinksViewModel.QUICK_LINKS_LINKS_CLASSNAME}`);\n        }\n        if (this.tableOfContent) {\n          this.anchorNavigation = this.tableOfContent.closest(`.${QuickLinksViewModel.ANCHOR_NAVIGATION_CLASSNAME}`);\n        }\n        if (this.quickLinks) {\n          const quickLinksGridCellParent: HTMLElement | undefined = this.quickLinksGridCell?.parentElement as HTMLElement;\n          if (this.quickLinksGridCell) {\n            this.quickLinkInitialTop = (this.tableOfContent ? (this.tableOfContent.offsetHeight + this.offset) : 0) + (quickLinksGridCellParent?.offsetTop || 0) - this.quickLinksGridCell.offsetTop;\n            this.quickLinks.style.top = `${this.quickLinkInitialTop}px`;\n          }\n        }\n\n      }\n\n      public scrollChange() {\n        if (!eh.Breakpoints.getInstance().isMobile) {\n          const moduleHeight = this.module.offsetHeight;\n            if (!this.tableOfContent && this.quickLinks) {\n\n            const wrapperHeight = this.quickLinks.offsetHeight;\n\n            const scrollingAmount = this.root.scrollTop - this.module.offsetTop;\n\n            if (scrollingAmount > 0) {\n              if (scrollingAmount + wrapperHeight < moduleHeight) {\n                // this.quickLinks.style.top = `${scrollingAmount + this.quickLinkInitialTop}px`;\n                this.quickLinks.style.top = '0px';\n                if (this.quickLinksLinks) {\n                  this.quickLinksLinks.classList.add(QuickLinksViewModel.QUICK_LINKS_STICKY_CLASSNAME);\n\n                  const parentStyle = window.getComputedStyle(this.quickLinksLinks.parentElement as HTMLElement);\n\n                  this.quickLinksLinks.style.width = `${(this.quickLinksLinks.parentElement?.clientWidth || 0) - parseFloat(parentStyle.paddingLeft) - parseFloat(parentStyle.paddingRight)}px`;\n                  this.quickLinksLinks.style.height = `${(this.quickLinksLinks.parentElement?.clientWidth || 0) - parseFloat(parentStyle.paddingTop) - parseFloat(parentStyle.paddingBottom)}px`;\n                }\n\n              } else {\n                this.quickLinks.style.top = `${this.quickLinkInitialTop}px`;\n                if (this.quickLinksLinks) {\n                  this.quickLinksLinks.classList.remove(QuickLinksViewModel.QUICK_LINKS_STICKY_CLASSNAME);\n                  this.quickLinksLinks.style.width = 'auto';\n                  this.quickLinksLinks.style.height = 'auto';\n                }\n              }\n            } else {\n              this.quickLinks.style.top = `${this.quickLinkInitialTop}px`;\n              if (this.quickLinksLinks) {\n                this.quickLinksLinks.classList.remove(QuickLinksViewModel.QUICK_LINKS_STICKY_CLASSNAME);\n                this.quickLinksLinks.style.width = 'auto';\n                this.quickLinksLinks.style.height = 'auto';\n              }\n            }\n            if (this.module) {\n              this.module.style.minHeight = `${this.quickLinks.offsetHeight}px`;\n            }\n          } else if (this.tableOfContent) {\n            const thresholdEndTableOfContent = this.tableOfContent.getBoundingClientRect().top + this.tableOfContent.offsetHeight;\n            const thresholdQuickLinks = ((this.quickLinks?.getBoundingClientRect().top || 0) + (this.quickLinks?.offsetHeight || 0)) || ((this.anchorNavigation?.parentElement?.getBoundingClientRect().top || 0) - 104) ;\n\n            if (thresholdEndTableOfContent <= 0 && this.quickLinks) {\n              this.tableOfContent.style.opacity = '0';\n            } else if (thresholdQuickLinks > 0) {\n              this.tableOfContent.style.opacity = '1';\n              this.tableOfContent.style.top = `0px`;\n            }\n            /*if (this.anchorNavigation) {\n              this.anchorNavigation.style.width = '';\n              this.anchorNavigation.style.height = '';\n            }*/\n\n            if (thresholdQuickLinks <= 0) {\n              this.tableOfContent.style.opacity = '1';\n              const endOfContent = moduleHeight + this.module.offsetTop\n              const scrollingAmount = Math.max(this.root.scrollTop + this.anchorOffset + this.tableOfContent.offsetHeight, 0);\n\n              if (scrollingAmount < endOfContent) {\n                if (this.anchorNavigation) {\n                    this.anchorNavigation.classList.add(QuickLinksViewModel.AVOID_STICKY_CLASSNAME);\n                    this.anchorNavigation.style.width = `${this.anchorNavigation.parentElement!.clientWidth - parseFloat(getComputedStyle(this.anchorNavigation.parentElement!).paddingLeft) - parseFloat(getComputedStyle(this.anchorNavigation.parentElement!).paddingRight)}px`;\n                }\n              } else {\n                  this.anchorNavigation?.classList.remove(QuickLinksViewModel.AVOID_STICKY_CLASSNAME);\n              }\n            } else {\n              if (this.anchorNavigation) {\n                this.anchorNavigation.classList.remove(QuickLinksViewModel.AVOID_STICKY_CLASSNAME);\n              }\n            }\n          }\n        } else {\n\n          if (this.tableOfContent) {\n            if (this.anchorNavigation) {\n              this.anchorNavigation.classList.remove(QuickLinksViewModel.AVOID_STICKY_CLASSNAME);\n              this.anchorNavigation.style.width = '';\n              this.anchorNavigation.style.height = '';\n            }\n          }\n          // else if (this.quickLinks) {\n          //   if (this.quickLinksGridCell) {\n          //     this.quickLinksGridCell.style.height = '';\n          //   }\n          // }\n        }\n      }\n\n      public resizeChange() {\n        if (!eh.Breakpoints.getInstance().isMobile) {\n          if (this.tableOfContent && this.quickLinks) {\n            const tocRect = this.tableOfContent.getBoundingClientRect();\n            const quickLinksRect = this.quickLinks?.getBoundingClientRect();\n\n            const overlap = tocRect.top < quickLinksRect.bottom && tocRect.bottom > quickLinksRect.top;\n\n            if (overlap) {\n              this.tableOfContent.style.opacity = '0';\n              console.log(\"overlap\");\n            } else {\n              this.tableOfContent.style.opacity = '1';\n\n              this.scrollChange();\n            }\n          }\n        }\n      }\n  }\n}\n","$(() => {\n  \n  const $root = $(':root');\n  $root.on(cs.Snippet.EventIdPostReplace, ($event: cs.SnippetEventPostReplace) => {\n    let target = $event.replacedTarget\n    if (!target && $event.originalEvent) {\n      const oEvent = ($event.originalEvent as any as cs.SnippetEventPostReplace | null)\n      if (oEvent?.replacedTarget) {\n        target = oEvent.replacedTarget;\n      }\n    }\n    if (target){\n      eh.Composing.init($(target), true);\n    }\n  });\n  eh.Composing.init($root);\n  \n});\n\nnamespace eh {\n  \n  export class Composing {\n    \n    static init($base: JQuery<HTMLElement>, isSnippetRequest = false): void {\n      eh.EhAnchorNavigationController.init($base);\n      eh.EhCompactTeaserController.init($base);\n      eh.EhGalleryController.ehInit($base);\n      eh.EhAccordionController.init($base);\n      eh.EhProductTeaserLinkTabController.init($base);\n      eh.EhLoadMoreController.init($base);\n      eh.EhFilterController.ehInit($base, isSnippetRequest);\n      eh.Footnotes.ehInit($base, isSnippetRequest);\n      eh.EhProcessMapController.init($base);\n      eh.EhFormula.init($base);\n      eh.SearchController.init($base, isSnippetRequest);\n      eh.EhSpdSearchController.init($base);\n    }\n  }\n}\n","namespace eh {\n\n    export interface EhSpdSearchItem {\n        image?: string;\n        leading?: string;\n        match?: string;\n        name: string;\n        rootCode?: string;\n        serial?: string;\n        href?: string;\n        code?: string;\n        productName?: string;\n    }\n\n    export interface EhSpdSearchResponse {\n        success: boolean;\n        mode: 'name' | 'code';\n        items: EhSpdSearchItem[];\n    }\n\n    export type EhSpdSearchProvider = (query: string, submitted: boolean) => Promise<EhSpdSearchResponse>;\n\n    export class EhSpdSearchController {\n\n        public static MODULE_CLASSNAME: string = 'ehel-spd-search';\n        public static COMBO_CLASSNAME: string = 'ehel-spd-search--combo';\n        public static INPUT_CLASSNAME: string = 'ehel-spd-search--input';\n        public static RESET_CLASSNAME: string = 'ehel-spd-search--reset';\n        public static SUBMIT_CLASSNAME: string = 'ehel-spd-search--submit';\n\n        public static DROPDOWN_CLASSNAME: string = 'ehel-search-dropdown';\n        public static PANEL_CLASSNAME: string = 'ehel-search-dropdown--panel';\n        public static ITEM_CLASSNAME: string = 'ehel-search-dropdown--item';\n        public static ITEM_TEMPLATE_CLASSNAME: string = 'ehel-search-dropdown--item-template';\n        public static CLEAR_HISTORY_CLASSNAME: string = 'ehel-search-dropdown--clear-history';\n\n        public static DEBOUNCE_MS: number = 300;\n\n        public static ENDPOINT: string = '/__spd_search';\n\n        private el: HTMLElement | null | undefined;\n        private combo: HTMLElement | null | undefined;\n        private input: HTMLInputElement | null | undefined;\n        private reset: HTMLElement | null | undefined;\n        private submit: HTMLElement | null | undefined;\n        private dropdown: HTMLElement | null | undefined;\n        private clearHistory: HTMLElement | null | undefined;\n\n        private debounceId: number | undefined;\n\n        private vm: EhSpdSearchViewModel | null | undefined = null;\n\n        static init($base: JQuery<HTMLElement>): void {\n            new EhSpdSearchController($base[0]);\n        }\n\n        constructor(private readonly base: HTMLElement | null) {\n\n            this.el = this.base?.classList.contains(EhSpdSearchController.COMBO_CLASSNAME)\n                ? this.base\n                : this.base?.querySelector(`.${EhSpdSearchController.COMBO_CLASSNAME}`);\n\n            this.combo = this.el;\n            this.input = this.el?.querySelector(`.${EhSpdSearchController.INPUT_CLASSNAME}`) as HTMLInputElement;\n            this.reset = this.el?.querySelector(`.${EhSpdSearchController.RESET_CLASSNAME}`);\n            this.submit = this.el?.querySelector(`.${EhSpdSearchController.SUBMIT_CLASSNAME}`);\n            this.dropdown = this.el?.querySelector(`.${EhSpdSearchController.DROPDOWN_CLASSNAME}`);\n            this.clearHistory = this.el?.querySelector(`.${EhSpdSearchController.CLEAR_HISTORY_CLASSNAME}`);\n\n            if (!this.el || !this.input || !this.dropdown) {\n                return;\n            }\n\n            this.vm = new EhSpdSearchViewModel(this.el, this.input, this.dropdown);\n            this.init();\n        }\n\n        private init(): void {\n            this.registerControls();\n        }\n\n        private registerControls(): void {\n\n            this.input?.addEventListener('focus', this.onFocus);\n            this.input?.addEventListener('input', this.onInput);\n            this.input?.addEventListener('keydown', this.onKeyDown);\n\n            this.reset?.addEventListener('click', this.onReset);\n            this.submit?.addEventListener('click', this.onSubmit);\n            this.clearHistory?.addEventListener('click', this.onClearHistory);\n\n            this.dropdown?.addEventListener('click', this.onDropdownClick);\n            this.dropdown?.addEventListener('mouseover', this.onDropdownHover);\n            this.dropdown?.addEventListener('mouseleave', this.onDropdownLeave);\n            this.combo?.addEventListener('focusout', this.onFocusOut);\n\n            document.addEventListener('click', this.onDocumentClick, true);\n        }\n\n        private onFocus = (): void => {\n            this.vm?.search(this.value());\n        }\n\n        private onInput = (): void => {\n            this.vm?.setError(false);\n\n            window.clearTimeout(this.debounceId);\n            this.debounceId = window.setTimeout(() => {\n                const term = this.value().trim();\n                this.vm?.search(this.value());\n                if (term.length >= EhSpdSearchViewModel.MIN_QUERY_LENGTH) {\n                    eh.Tracking.trackSearchTermView(term);\n                }\n            }, EhSpdSearchController.DEBOUNCE_MS);\n        }\n\n        private onSubmit = (): void => {\n            window.clearTimeout(this.debounceId);\n            this.vm?.search(this.value(), true);\n        }\n\n        private onReset = (): void => {\n            this.vm?.clearInput();\n            this.vm?.search('');\n        }\n\n        private onClearHistory = (event: Event): void => {\n            event.preventDefault();\n            this.vm?.clearHistory();\n        }\n\n        private onDropdownClick = (event: Event): void => {\n            const item = this.itemOf(event);\n\n            if (item) {\n                this.vm?.selectItem(item, event);\n            }\n        }\n\n        private onDropdownHover = (event: Event): void => {\n            const item = this.itemOf(event);\n\n            if (item) {\n                this.vm?.activate(item);\n            }\n        }\n        \n        private onDropdownLeave = (): void => {\n            this.vm?.resetActive();\n        }\n\n        private itemOf(event: Event): HTMLElement | null {\n            const item = (event.target as HTMLElement)?.closest(`.${EhSpdSearchController.ITEM_CLASSNAME}`) as HTMLElement;\n\n            return item && !item.closest(`.${EhSpdSearchController.ITEM_TEMPLATE_CLASSNAME}`) ? item : null;\n        }\n\n        private onDocumentClick = (event: Event): void => {\n            const boundary = this.combo ?? this.el;\n\n            if (!boundary?.contains(event.target as Node)) {\n                this.vm?.close();\n            }\n        }\n\n        private onFocusOut = (event: FocusEvent): void => {\n            const next = event.relatedTarget as Node | null;\n\n            if (next && !this.combo?.contains(next)) {\n                this.vm?.close();\n            }\n        }\n\n        private onKeyDown = (event: KeyboardEvent): void => {\n\n            switch (event.key) {\n                case 'ArrowDown':\n                    event.preventDefault();\n                    this.vm?.moveActive(1);\n                    break;\n                case 'ArrowUp':\n                    event.preventDefault();\n                    this.vm?.moveActive(-1);\n                    break;\n                case 'Enter':\n                    if (this.vm?.selectActive()) {\n                        event.preventDefault();\n                    } else {\n                        this.onSubmit();\n                    }\n                    break;\n                case 'Escape':\n                    this.vm?.close();\n                    break;\n            }\n        }\n\n        private value(): string {\n            return this.input?.value ?? ''\n        }\n    }\n\n    type EhSpdSearchPanel = 'history' | 'results' | 'empty' | 'info';\n\n    class EhSpdSearchViewModel {\n\n        public static HAS_ERROR_CLASSNAME: string = 'ehel-spd-search--has-error';\n        public static IS_LOADING_CLASSNAME: string = 'ehel-spd-search--is-loading';\n        public static HIDDEN_CLASSNAME: string = 'ehtw-hidden';\n        public static ACTIVE_CLASSNAME: string = 'is-active';\n\n        public static ITEMS_CLASSNAME: string = 'ehel-search-dropdown--items';\n        public static ITEM_IMAGE_CLASSNAME: string = 'ehel-search-dropdown--item-image';\n        public static ITEM_TITLE_CLASSNAME: string = 'ehel-search-dropdown--item-title';\n        public static ITEM_LEADING_CLASSNAME: string = 'ehel-search-dropdown--item-leading';\n        public static ITEM_MATCH_CLASSNAME: string = 'ehel-search-dropdown--item-match';\n        public static ITEM_TAILING_CLASSNAME: string = 'ehel-search-dropdown--item-tailing';\n        public static ITEM_ROOT_CODE_CLASSNAME: string = 'ehel-search-dropdown--item-root-code';\n        public static ITEM_SERIAL_CLASSNAME: string = 'ehel-search-dropdown--item-serial';\n        public static ITEM_ORDER_CODE_CLASSNAME: string = 'ehel-search-dropdown--item-order-code';\n        public static COUNT_CLASSNAME: string = 'ehel-search-dropdown--count';\n\n        public static MIN_QUERY_LENGTH: number = 2;\n        public static HISTORY_KEY: string = 'eh.spd-search.history';\n        public static HISTORY_MAX: number = 3;\n\n        private itemTemplate: HTMLElement | null | undefined;\n\n        private activeIndex: number = -1;\n        private queryToken: number = 0;\n        private keyboardSubtype: string | undefined;\n\n        constructor(\n            private el: HTMLElement,\n            private input: HTMLInputElement,\n            private dropdown: HTMLElement,\n        ) {\n            const template = this.dropdown.querySelector(`.${EhSpdSearchController.ITEM_TEMPLATE_CLASSNAME}`);\n\n            this.itemTemplate = template?.querySelector(`.${EhSpdSearchController.ITEM_CLASSNAME}`) as HTMLElement;\n        }\n\n        public async search(query: string, submitted: boolean = false): Promise<void> {\n\n            const trimmed = query.trim();\n\n            this.setLoading(false);\n\n            if (!trimmed.length) {\n                const history = this.readHistory();\n\n                this.renderItems('history', history);\n                this.openPanel(history.length ? 'history' : 'empty');\n                return;\n            }\n\n            if (trimmed.length < EhSpdSearchViewModel.MIN_QUERY_LENGTH) {\n                this.openPanel('info');\n                return;\n            }\n\n            const token = ++this.queryToken;\n\n            this.setLoading(true);\n\n            const response = await this.query(trimmed, submitted);\n\n            if (token !== this.queryToken) {\n                return;\n            }\n\n            this.setLoading(false);\n\n            const items = response.items ?? [];\n\n            if (!items.length) {\n                this.close();\n                this.setError(submitted);\n                return;\n            }\n\n            if (submitted && response.mode === 'code' && items[0].href) {\n                const hit = { ...items[0], code: trimmed };\n\n                this.addEntry(hit);\n                this.trackHit(hit, 'first_selection');\n                await this.follow(hit);\n                return;\n            }\n\n            if (submitted) {\n                const first = items[0];\n                this.trackHit({ ...first, name: `${first.leading ?? ''}${first.match ?? ''}${first.name}` }, 'first_selection');\n            }\n\n            this.renderItems('results', items, trimmed);\n            this.openPanel('results');\n        }\n\n        public openPanel(name: EhSpdSearchPanel): void {\n\n            this.panels().forEach(panel => {\n                panel.classList.toggle(EhSpdSearchViewModel.HIDDEN_CLASSNAME, panel.dataset['panel'] !== name);\n            });\n\n            this.dropdown.classList.remove(EhSpdSearchViewModel.HIDDEN_CLASSNAME);\n            this.input.setAttribute('aria-expanded', 'true');\n\n            this.setActive(name === 'results' ? 0 : -1);\n        }\n\n        public close(): void {\n            this.setLoading(false);\n            this.setActive(-1);\n            this.dropdown.classList.add(EhSpdSearchViewModel.HIDDEN_CLASSNAME);\n            this.input.setAttribute('aria-expanded', 'false');\n        }\n\n        public setError(hasError: boolean): void {\n            this.el.classList.toggle(EhSpdSearchViewModel.HAS_ERROR_CLASSNAME, hasError);\n        }\n\n        public setLoading(isLoading: boolean): void {\n            this.el.classList.toggle(EhSpdSearchViewModel.IS_LOADING_CLASSNAME, isLoading);\n        }\n\n        public clearInput(): void {\n            this.input.value = '';\n            this.input.focus();\n            this.setError(false);\n        }\n\n        public moveActive(offset: number): void {\n\n            const items = this.visibleItems();\n\n            if (!items.length) {\n                return;\n            }\n\n            if (this.activeIndex < 0) {\n                this.setActive(offset > 0 ? 0 : items.length - 1);\n                return;\n            }\n\n            this.setActive(Math.min(Math.max(this.activeIndex + offset, 0), items.length - 1));\n        }\n\n        public resetActive(): void {\n            this.setActive(-1);\n        }\n\n        public activate(item: HTMLElement): void {\n\n            const index = this.visibleItems().indexOf(item);\n\n            if (index >= 0) {\n                this.setActive(index);\n            }\n        }\n\n        public selectActive(): boolean {\n            const item = this.visibleItems()[this.activeIndex];\n\n            if (!item) {\n                return false;\n            }\n\n            this.keyboardSubtype = this.activeIndex === 0 ? 'first_selection' : 'list_selection';\n            item.click();\n            this.keyboardSubtype = undefined;\n            return true;\n        }\n\n        public selectItem(node: HTMLElement, event: Event): void {\n\n            const item = this.readItem(node);\n\n            this.addEntry(item);\n            this.trackHit(item, this.keyboardSubtype ?? 'list_selection');\n\n            if (item.href && item.code) {\n                event.preventDefault();\n                void this.follow(item);\n            }\n        }\n\n        private async follow(item: EhSpdSearchItem): Promise<void> {\n\n            if (item.rootCode && item.code) {\n                const locale = document.documentElement.lang || 'en';\n\n                this.setLoading(true);\n\n                await DeviceProfile.lookupProduct(locale, item.rootCode, item.code, item.rootCode);\n            }\n\n            window.location.assign(item.href!);\n        }\n\n        private trackHit(hit: EhSpdSearchItem, subtype: string): void {\n            eh.Tracking.injectTrackingEvent({\n                event_id: null,\n                event_subtype: subtype,\n                event_linkname: hit.name,\n                event_product_id: hit.rootCode,\n                event_order_code: hit.code,\n                event_product_name: hit.productName\n            }, $(this.el), 'search');\n        }\n\n        public addEntry(entry: EhSpdSearchItem): void {\n\n            const key = this.historyKeyOf(entry);\n            const history = this.readHistory().filter(stored => this.historyKeyOf(stored) !== key);\n\n            history.unshift(entry);\n            this.writeHistory(history.slice(0, EhSpdSearchViewModel.HISTORY_MAX));\n        }\n\n        public clearHistory(): void {\n            this.writeHistory([]);\n            this.openPanel('empty');\n        }\n\n        private async query(query: string, submitted: boolean): Promise<EhSpdSearchResponse> {\n\n            try {\n                return await EhSpdSearchViewModel.fetchProvider(query, submitted);\n            } catch {\n                return { success: false, mode: 'name', items: [] };\n            }\n        }\n\n        private static fetchProvider: EhSpdSearchProvider = async (query, submitted) => {\n\n            const locale = document.documentElement.lang || 'en';\n            const params = new URLSearchParams({ q: query });\n\n            if (submitted) {\n                params.set('submit', '1');\n            }\n\n            const response = await fetch(`${EhSpdSearchController.ENDPOINT}/${encodeURIComponent(locale)}?${params}`,\n                { headers: { 'Accept': 'application/json' } });\n\n            if (!response.ok) {\n                throw new Error(`spd search failed: ${response.status}`);\n            }\n\n            return await response.json();\n        }\n\n        private static split(text: string, query: string): [string, string, string] {\n\n            const index = query ? text.toLowerCase().indexOf(query.toLowerCase()) : -1;\n\n            if (index === -1) {\n                return [text, '', ''];\n            }\n\n            return [text.slice(0, index), text.slice(index, index + query.length), text.slice(index + query.length)];\n        }\n\n        private renderItems(panelName: EhSpdSearchPanel, items: EhSpdSearchItem[], query: string = ''): void {\n\n            const panel = this.panel(panelName);\n            const list = panel?.querySelector(`.${EhSpdSearchViewModel.ITEMS_CLASSNAME}`);\n\n            if (!list || !this.itemTemplate) {\n                return;\n            }\n\n            list.innerHTML = '';\n            items.forEach(item => list.appendChild(this.createItem(item, query)));\n\n            const count = panel?.querySelector(`.${EhSpdSearchViewModel.COUNT_CLASSNAME}`);\n\n            if (count) {\n                count.textContent = String(items.length);\n            }\n        }\n\n        private createItem(item: EhSpdSearchItem, query: string = ''): HTMLElement {\n\n            const node = this.itemTemplate?.cloneNode(true) as HTMLElement;\n\n            node.classList.remove(EhSpdSearchViewModel.ACTIVE_CLASSNAME);\n            node.setAttribute('href', item.href ?? '#!');\n\n            const image = node.querySelector(`.${EhSpdSearchViewModel.ITEM_IMAGE_CLASSNAME}`);\n\n            if (image && item.image) {\n                image.setAttribute('src', item.image);\n            }\n\n            const leading = node.querySelector(`.${EhSpdSearchViewModel.ITEM_LEADING_CLASSNAME}`);\n\n            if (leading) {\n                leading.textContent = item.leading ?? '';\n            }\n\n            const match = node.querySelector(`.${EhSpdSearchViewModel.ITEM_MATCH_CLASSNAME}`);\n\n            if (match) {\n                match.textContent = item.match ?? '';\n            }\n\n            const tailing = node.querySelector(`.${EhSpdSearchViewModel.ITEM_TAILING_CLASSNAME}`);\n\n            if (tailing) {\n                tailing.textContent = item.name;\n            }\n\n            if (item.code) {\n                node.dataset['spdCode'] = item.code;\n            }\n\n            if (item.productName) {\n                node.dataset['spdProductName'] = item.productName;\n            }\n\n            this.setItemPart(node, EhSpdSearchViewModel.ITEM_ROOT_CODE_CLASSNAME, item.rootCode, query);\n            this.setItemPart(node, EhSpdSearchViewModel.ITEM_SERIAL_CLASSNAME, item.serial);\n            this.setItemPart(node, EhSpdSearchViewModel.ITEM_ORDER_CODE_CLASSNAME, item.serial ? undefined : item.code);\n\n            return node;\n        }\n\n        private setItemPart(node: HTMLElement, className: string, value: string | undefined, query?: string): void {\n\n            const part = node.querySelector(`.${className}`);\n\n            if (!part) {\n                return;\n            }\n\n            if (!value) {\n                part.remove();\n                return;\n            }\n\n            const text = part.querySelector('span') ?? part;\n            const [before, match, after] = query ? EhSpdSearchViewModel.split(value, query) : [value, '', ''];\n\n            text.textContent = before;\n\n            if (!match) {\n                return;\n            }\n\n            const strong = document.createElement('strong');\n\n            strong.className = `${EhSpdSearchViewModel.ITEM_MATCH_CLASSNAME} ehtw-typo-label-bold-medium md:ehtw-typo-title-bold-small`;\n            strong.textContent = match;\n\n            text.appendChild(strong);\n            text.appendChild(document.createTextNode(after));\n        }\n\n        private setActive(index: number): void {\n\n            const items = this.visibleItems();\n\n            items.forEach(item => item.classList.remove(EhSpdSearchViewModel.ACTIVE_CLASSNAME));\n\n            if (!items.length || index < 0) {\n                this.activeIndex = -1;\n                this.input.removeAttribute('aria-activedescendant');\n                return;\n            }\n\n            this.activeIndex = Math.min(index, items.length - 1);\n\n            const active = items[this.activeIndex];\n\n            active.classList.add(EhSpdSearchViewModel.ACTIVE_CLASSNAME);\n            active.scrollIntoView({ block: 'nearest' });\n        }\n\n        private panels(): HTMLElement[] {\n            return Array.from(this.dropdown.querySelectorAll(`.${EhSpdSearchController.PANEL_CLASSNAME}`)) as HTMLElement[];\n        }\n\n        private panel(name: EhSpdSearchPanel): HTMLElement | undefined {\n            return this.panels().find(panel => panel.dataset['panel'] === name);\n        }\n\n        private visibleItems(): HTMLElement[] {\n\n            const panel = this.panels().find(p => !p.classList.contains(EhSpdSearchViewModel.HIDDEN_CLASSNAME));\n\n            return this.itemsOf(panel);\n        }\n\n        private itemsOf(root: HTMLElement | null | undefined): HTMLElement[] {\n\n            const items = Array.from(root?.querySelectorAll(`.${EhSpdSearchController.ITEM_CLASSNAME}`) ?? []) as HTMLElement[];\n\n            return items.filter(item => !item.closest(`.${EhSpdSearchController.ITEM_TEMPLATE_CLASSNAME}`));\n        }\n\n        private readItem(item: HTMLElement): EhSpdSearchItem {\n\n            const text = (className: string): string => (item.querySelector(`.${className}`)?.textContent ?? '').trim();\n\n            return {\n                image: item.querySelector(`.${EhSpdSearchViewModel.ITEM_IMAGE_CLASSNAME}`)?.getAttribute('src') ?? undefined,\n                match: '',\n                name: text(EhSpdSearchViewModel.ITEM_TITLE_CLASSNAME),\n                rootCode: text(EhSpdSearchViewModel.ITEM_ROOT_CODE_CLASSNAME) || undefined,\n                serial: text(EhSpdSearchViewModel.ITEM_SERIAL_CLASSNAME) || undefined,\n                href: item.getAttribute('href') ?? undefined,\n                code: item.dataset['spdCode'] || undefined,\n                productName: item.dataset['spdProductName'] || undefined,\n            };\n        }\n\n        private historyKeyOf(item: EhSpdSearchItem): string {\n            return `${item.rootCode || item.name}|${item.serial || item.code || ''}`;\n        }\n\n        private readHistory(): EhSpdSearchItem[] {\n\n            try {\n                const raw = window.localStorage.getItem(EhSpdSearchViewModel.HISTORY_KEY);\n                const parsed = raw ? JSON.parse(raw) : [];\n\n                return Array.isArray(parsed) ? parsed : [];\n            } catch {\n                return [];\n            }\n        }\n\n        private writeHistory(items: EhSpdSearchItem[]): void {\n\n            try {\n                window.localStorage.setItem(EhSpdSearchViewModel.HISTORY_KEY, JSON.stringify(items));\n            } catch {}\n        }\n    }\n}\n","namespace eh {\n\n    export class SearchController {\n\n        public static INPUT_CLASSNAME = 'ehel-search--input';\n        public static CONTENT_CLASSNAME = 'ehel-search--content';\n        public static GROUP_OF_SEARCH_CLASSNAME = 'ehel-search--group-of-search';\n        public static NO_RESULTS_CLASSNAME = 'ehel-search--no-results';\n        public static SEARCH_ACTIVE_CLASSNAME = 'ehel-search--active';\n        public static SEARCH_RESET_CLASSNAME = 'ehel-search--reset';\n        public static SEARCH_CLEAR_CLASSNAME = 'ehel-search--clear';\n        public static SEARCH_COUNT_CLASSNAME = 'ehel-search--count';\n        public static SEARCH_SELECT_ALL_CLASSNAME = 'ehel-search--select-all';\n        public static SEARCH_CONTAINER_CLASSNAME = 'ehel-search';\n\n        public static SEARCH_PILL_ACTIVE_TEMPLATE_CLASSNAME = 'ehel-search--pill-active-template';\n        public static SEARCH_ACTIVE_PILLS_CLASSNAME = 'ehel-search--active-pills';\n\n        static init($base: JQuery<HTMLElement>, isSnippet: boolean): void {\n            const searchContainers = document.querySelectorAll(`.${SearchController.SEARCH_CONTAINER_CLASSNAME}`);\n            searchContainers.forEach(container => {\n                new SearchController(container as HTMLElement);\n            });\n        }\n\n        private inputs: NodeListOf<HTMLElement> | undefined;\n        private content: NodeListOf<HTMLElement> | undefined;\n        private groupOfSearchElement: NodeListOf<HTMLElement> | undefined;\n        private noResults: HTMLElement | null | undefined;\n        private reset: HTMLElement | null | undefined;\n        private clear: HTMLElement | null | undefined;\n        private count: HTMLElement | null | undefined;\n        private pillActiveTemplate: HTMLElement | null | undefined;\n        private activePills: HTMLElement | null | undefined;\n        private selectAll: NodeListOf<HTMLElement> | undefined;\n\n        private vm: EhSearchViewModel;\n\n        constructor(\n            private readonly base: HTMLElement | null,\n        ) {\n            if (!this.base) {\n                throw new Error(`Missing required element`);\n            }\n\n            this.inputs = this.base.querySelectorAll(`.${SearchController.INPUT_CLASSNAME}`);\n            this.content = this.base.querySelectorAll(`.${SearchController.CONTENT_CLASSNAME}`);\n            this.groupOfSearchElement = this.base.querySelectorAll(`.${SearchController.GROUP_OF_SEARCH_CLASSNAME}`) as NodeListOf<HTMLElement>;\n            this.noResults = this.base.querySelector(`.${SearchController.NO_RESULTS_CLASSNAME}`) as HTMLElement;\n            this.reset = this.base.querySelector(`.${SearchController.SEARCH_RESET_CLASSNAME}`) as HTMLElement;\n            this.clear = this.base.querySelector(`.${SearchController.SEARCH_CLEAR_CLASSNAME}`) as HTMLElement;\n            this.count = this.base.querySelector(`.${SearchController.SEARCH_COUNT_CLASSNAME}`) as HTMLElement;\n            this.pillActiveTemplate = this.base.querySelector(`.${SearchController.SEARCH_PILL_ACTIVE_TEMPLATE_CLASSNAME}`) as HTMLElement;\n            this.activePills = this.base.querySelector(`.${SearchController.SEARCH_ACTIVE_PILLS_CLASSNAME}`) as HTMLElement;\n            this.selectAll = this.base.querySelectorAll(`.${SearchController.SEARCH_SELECT_ALL_CLASSNAME}`) as NodeListOf<HTMLElement>;\n\n            if (!this.content || !this.groupOfSearchElement || ((!this.inputs || this.inputs.length === 0) && !this.selectAll && !this.clear) ) {\n                return;\n            }\n\n            this.vm = new EhSearchViewModel(this.base, this.content, this.groupOfSearchElement, this.noResults, this.count, this.inputs, this.pillActiveTemplate, this.activePills, this.reset, this.selectAll);\n            this.init();\n        }\n\n        private init(): void {\n            this.registerControls();\n            this.checkInitialState();\n        }\n\n        private checkInitialState(): void {\n            this.triggerSearch();\n        }\n\n        private registerControls(): void {\n            this.inputs?.forEach(input => {\n                if (input.tagName === 'SELECT') {\n                    if (typeof $ !== 'undefined') {\n                        $(input).on('change select2:select select2:unselect', (e: any) => {\n                            this.onSelect(e);\n                        });\n                    } else {\n                        input.addEventListener('change', this.onSelect);\n                    }\n                } else if (input.tagName === 'INPUT' && (input as HTMLInputElement).type === 'radio') {\n                    input.addEventListener('change', this.onSelect);\n                } else if (input.tagName === 'INPUT' && (input as HTMLInputElement).type === 'checkbox') {\n                    input.addEventListener('change', this.onSelect);\n                } else {\n                    input.addEventListener('input', this.onInput);\n                    input.addEventListener('keydown', this.onKeyDown);\n                }\n                input.addEventListener('blur', this.onClear);\n            });\n            \n            this.reset?.addEventListener('click', this.onReset);\n            this.clear?.addEventListener('click', this.onClear);\n            this.selectAll?.forEach(selectAllElement => {\n                selectAllElement.addEventListener('click', this.onSelectAll);\n            });\n        }\n\n        private onInput = (e: Event): void => {\n            eh.debounce(() => {\n                this.triggerSearch();\n            }, 300)();\n        }\n\n        private onKeyDown = (e: KeyboardEvent): void => {\n            if (e.key === 'Enter') {\n                e.preventDefault();\n            }\n        }\n\n        private onSelect = (e: Event): void => {\n            this.triggerSearch();\n        }\n\n        private onReset = (e: Event): void => {\n            this.vm.resetSearch(e.currentTarget as HTMLElement);\n        }\n\n        private onClear = (e: Event): void => {\n            this.vm.clearSearch();\n            this.triggerSearch();\n        }\n\n        private onSelectAll = (e: Event): void => {\n            this.vm.selectAll(e.target as HTMLElement);\n            this.triggerSearch();\n        }\n\n        private triggerSearch(): void {\n            const criteria: { term: string, highlight: boolean }[] = [];\n            \n            this.inputs?.forEach(input => {\n                const element = input as HTMLInputElement | HTMLSelectElement;\n                const value = element.value;\n                const isSelect = element.tagName === 'SELECT';\n                const isRadio = element.tagName === 'INPUT' && (element as HTMLInputElement).type === 'radio';\n                const isCheckbox = element.tagName === 'INPUT' && (element as HTMLInputElement).type === 'checkbox';\n                const minLength = isSelect ? 1 : 2;\n                \n                if (value && value.trim().length >= minLength \n                        && (!isRadio || (isRadio && (element as HTMLInputElement).checked)) \n                        && (!isCheckbox || (isCheckbox && (element as HTMLInputElement).checked))) {\n\n                    criteria.push({\n                        term: value,\n                        highlight: !isSelect && !isRadio && !isCheckbox\n                    });\n\n                    this.base?.classList.add(SearchController.SEARCH_ACTIVE_CLASSNAME);\n                } else {\n                    this.base?.classList.remove(SearchController.SEARCH_ACTIVE_CLASSNAME);\n                }\n            });\n            this.vm.searchAndHighlight(criteria);\n        }\n    }\n\n    class EhSearchViewModel {\n\n        public static HIGHLIGHT_CLASS = 'ehtw-bg-surface-warning';\n        public static HIDDEN_CLASS = '!ehtw-hidden';\n        public static DISABLED_CLASS = 'is-disabled';\n        public static SEARCH_PILL_ACTIVE_CLASSNAME = 'ehel-search--pill-active';\n\n        constructor(\n            private base: HTMLElement | null | undefined,\n            private container: NodeListOf<HTMLElement> | undefined,\n            private groupOfSearchElement: NodeListOf<HTMLElement> | undefined,\n            private noResults: HTMLElement | null | undefined,\n            private count: HTMLElement | null | undefined,\n            private inputs: NodeListOf<HTMLElement> | undefined,\n            private pillActiveTemplate: HTMLElement | null | undefined,\n            private activePills: HTMLElement | null | undefined,\n            private clear: HTMLElement | null | undefined,\n            private selAll: NodeListOf<HTMLElement> | undefined\n        ) {\n        }\n\n        public resetSearch(resetElement: HTMLElement): void {\n\n            const searchId = resetElement.dataset['searchId'];\n            if (!searchId || !this.base) {\n                return;\n            }\n\n            const inputElement = this.base?.querySelector(`#${searchId}`) as HTMLInputElement | null;\n            if (inputElement) {\n                inputElement.value = '';\n                inputElement.dispatchEvent(new Event('input'));\n            }\n        }\n\n        public clearSearch(): void {\n\n            this.inputs?.forEach((input) => {\n                if (input.tagName === 'INPUT' && (input as HTMLInputElement).type === 'checkbox') {\n                    (input as HTMLInputElement).checked = false;\n                }\n            });\n        }\n\n        public selectAll(selectAllElement: HTMLElement): void {\n            this.inputs?.forEach((input) => {\n                if (input.tagName === 'INPUT' && (input as HTMLInputElement).type === 'checkbox') {\n                    (input as HTMLInputElement).checked = true;\n                }\n            });\n        }\n\n        public searchAndHighlight(criteria: { term: string, highlight: boolean }[]): void {\n            // 1. Clear previous highlights\n            this.clearHighlights();\n            this.clearActivePills();\n\n            if (!this.groupOfSearchElement) {\n                return;\n            }\n\n            if (criteria.length === 0) {\n                this.groupOfSearchElement.forEach(element => element.classList.remove(EhSearchViewModel.HIDDEN_CLASS));\n                if (this.noResults) {\n                    this.noResults.classList.add(EhSearchViewModel.HIDDEN_CLASS);\n                }\n\n                this.countResults();\n                return;\n            }\n\n            let hasVisibleGroups = false;\n\n            // 2. Find and highlight per group\n            this.groupOfSearchElement.forEach(group => {\n                let matchesAll = true;\n\n                // First pass: Check if all criteria match (without highlighting)\n                for (const criterion of criteria) {\n                    const count = this.highlightText(group, criterion.term, false);\n                    if (count === 0) {\n                        matchesAll = false;\n                        break;\n                    }\n                }\n                \n                if (matchesAll) {\n                    group.classList.remove(EhSearchViewModel.HIDDEN_CLASS);\n                    hasVisibleGroups = true;\n                    // Second pass: Apply highlights\n                    for (const criterion of criteria) {\n                        if (criterion.highlight) {\n                            this.highlightText(group, criterion.term, true);\n                        }\n                    }\n                } else {\n                    group.classList.add(EhSearchViewModel.HIDDEN_CLASS);\n                }\n            });\n\n            if (this.noResults) {\n                if (hasVisibleGroups) {\n                    this.noResults.classList.add(EhSearchViewModel.HIDDEN_CLASS);\n                } else {\n                    this.noResults.classList.remove(EhSearchViewModel.HIDDEN_CLASS);\n                }\n            }\n\n            this.addActivePills();\n            this.countResults();\n            \n        }\n\n        public clearHighlights(): void {\n            if (!this.container) return;\n\n            this.container.forEach(container => {\n                const highlights = container.querySelectorAll(`.${EhSearchViewModel.HIGHLIGHT_CLASS}`);\n                highlights.forEach(span => {\n                    const parent = span.parentNode;\n                    if (parent) {\n                        parent.replaceChild(document.createTextNode(span.textContent || ''), span);\n                        parent.normalize();\n                    }\n                });\n            });\n        }\n\n        private addActivePills(): void {\n            if (!this.container || !this.activePills || !this.pillActiveTemplate) return;\n\n            this.inputs?.forEach(input => {\n                const element = input as HTMLInputElement | HTMLSelectElement;\n                const isCheckbox = element.tagName === 'INPUT' && (element as HTMLInputElement).type === 'checkbox';\n\n                if (element.value && element.value.trim().length > 0 && (!isCheckbox || (isCheckbox && (element as HTMLInputElement).checked))) {\n                    const pill = this.pillActiveTemplate?.cloneNode(true) as HTMLElement;\n                    pill.classList.remove(EhSearchViewModel.HIDDEN_CLASS, SearchController.SEARCH_PILL_ACTIVE_TEMPLATE_CLASSNAME);\n                    pill.classList.add(EhSearchViewModel.SEARCH_PILL_ACTIVE_CLASSNAME);\n                    const textElement = pill.querySelector('.eh-label') as HTMLElement | null;\n                    if (textElement) {\n                        textElement.textContent = element.labels?.[0]?.textContent || element.value;\n                    }\n                    this.activePills?.prepend(pill);\n\n                    pill.addEventListener('click', () => {\n                        (element as HTMLInputElement).checked = false;\n                        element.dispatchEvent(new Event('change'));\n                    });\n                }\n            });\n\n            if (this.activePills?.children.length > 1) {\n                this.activePills.classList.remove(EhSearchViewModel.HIDDEN_CLASS);\n            } else {\n                this.activePills.classList.add(EhSearchViewModel.HIDDEN_CLASS);\n            }\n\n            window.dispatchEvent(new Event('resize'));\n        }\n\n        private clearActivePills(): void {\n            if (!this.container || !this.activePills) return;\n\n            this.activePills.querySelectorAll(`.${EhSearchViewModel.SEARCH_PILL_ACTIVE_CLASSNAME}`).forEach(pill => {\n                pill.remove();\n            });\n\n            this.activePills.classList.add(EhSearchViewModel.HIDDEN_CLASS);\n        }\n\n\n        private countResults () {\n            if (this.count) {\n                const visibleCount = Array.from(this.groupOfSearchElement || []).filter(group => !group.classList.contains(EhSearchViewModel.HIDDEN_CLASS)).length;\n                this.count.textContent = visibleCount.toString();\n            }\n        }\n\n        private highlightText(node: Node, searchTerm: string, highlight: boolean = true): number {\n            let count = 0;\n            if (node.nodeType === Node.TEXT_NODE) {\n                const text = node.nodeValue || '';\n                // Escape regex characters in search term\n                const escapedSearchTerm = this.escapeRegExp(searchTerm);\n                const regex = new RegExp(`(${escapedSearchTerm})`, 'gi');\n                \n                if (regex.test(text)) {\n                    if (!highlight) {\n                        const matches = text.match(regex);\n                        if (matches) {\n                            count = matches.length;\n                        }\n                    } else {\n                        const fragment = document.createDocumentFragment();\n                        let lastIndex = 0;\n                        let match;\n                        \n                        regex.lastIndex = 0; // Reset for exec loop\n\n                        while ((match = regex.exec(text)) !== null) {\n                            count++;\n                            // Text before match\n                            const before = text.slice(lastIndex, match.index);\n                            if (before.length > 0) {\n                                fragment.appendChild(document.createTextNode(before));\n                            }\n\n                            // Highlighted match\n                            const span = document.createElement('span');\n                            span.className = EhSearchViewModel.HIGHLIGHT_CLASS;\n                            span.textContent = match[0];\n                            fragment.appendChild(span);\n\n                            lastIndex = regex.lastIndex;\n                        }\n\n                        // Text after last match\n                        const after = text.slice(lastIndex);\n                        if (after.length > 0) {\n                            fragment.appendChild(document.createTextNode(after));\n                        }\n\n                        node.parentNode?.replaceChild(fragment, node);\n                    }\n                }\n            } else if (node.nodeType === Node.ELEMENT_NODE) {\n                const element = node as HTMLElement;\n\n                const searchTag = element.getAttribute('data-search-tag');\n                if (searchTag && searchTag.toLowerCase().includes(searchTerm.toLowerCase())) {\n                    count++;\n                }\n\n                // Skip script, style tags and already highlighted elements\n                if (element.tagName !== 'SCRIPT' && \n                    element.tagName !== 'STYLE' && \n                    !element.classList.contains(EhSearchViewModel.HIGHLIGHT_CLASS)) {\n                    \n                    Array.from(element.childNodes).forEach(child => {\n                        count += this.highlightText(child, searchTerm, highlight);\n                    });\n                }\n            }\n            return count;\n        }\n\n        private escapeRegExp(string: string): string {\n            return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n        }\n    }\n}"]}