{"version":3,"sources":["app.base.js","loadingOverlay.js","toast.js","cookiePopup.js","dataLayer.js","general.js","navigation.js","navMobile.js","app.init.js"],"names":["breakpoint_sm","breakpoint_md","breakpoint_lg","breakpoint_xl","breakpoint_xxl","breakpoint_xs_max","breakpoint_sm_max","breakpoint_md_max","breakpoint_lg_max","breakpoint_xl_max","window","NodeList","prototype","forEach","Array","util","frontEndVersion","debugMode","uiCulture","uiLanguage","homePageId","path","youTubeRegex","vimeoRegex","getVersionedUrl","url","this","onDocumentReady","callback","document","readyState","addEventListener","endsWith","str","lookup","indexOf","length","startsWith","escapeRegExp","replace","isValidEmail","email","test","getCookie","name","let","value","cookie","parts","split","undefined","pop","shift","setCookie","expiryDays","domain","expirationDate","Date","setDate","getDate","toUTCString","push","join","deleteCookie","deepExtend","extended","Object","assign","target","i","arguments","key","source","hasOwnProperty","call","apply","isPlainObject","obj","constructor","isMobile","navigator","userAgent","isIE","isEdge","getQueryString","regex","RegExp","results","exec","location","href","getAnchor","urlParts","URL","debounce","func","timeout","_this","timer","args","clearTimeout","setTimeout","debounceLeading","_this2","addGlobalEventListener","type","selector","event","matches","getVideoEmbedHtmlFromUrl","youTubeMatch","vimeoMatch","dnt","hasCookieConsent","toString","slideUp","duration","cb","style","transitionProperty","transitionDuration","boxSizing","height","offsetHeight","overflow","paddingTop","paddingBottom","marginTop","marginBottom","display","visibility","removeProperty","slideDown","getComputedStyle","opacity","slideToggle","areEqualArrays","first","second","includes","scrollContainerTo","container","offset","contains","scrollTo","top","offsetTop","behavior","isKeyboardEvent","KeyboardEvent","clientX","clientY","isVisible","element","offsetParent","rect","getBoundingClientRect","width","isFocusable","tagName","disabled","onclick","hasAttribute","getAttribute","firstFocusable","parent","allElements","body","querySelectorAll","from","find","category","updateCookieConsent","ccPopup","acceptCategory","getAncestorClassNames","classNames","Set","className","cls","add","parentElement","app","LoadingOverlay","opts","querySelector","styleProperty","onClose","targetElement","targetPositionStyle","position","currentStyle","defaultView","getPropertyValue","overlay","createElement","overlayIcon","classList","minHeight","close","remove","removeChild","innerHTML","appendChild","module","exports","Toast","message","status","closeLabel","toastTimeout","toast","closeButton","toastMessage","setAttribute","e","preventDefault","toastContainer","toastWrapper","parentNode","insertBefore","children","ccConfig","ccContainer","cookiePopup","init","getElementById","showConsoleLog","enableDataLayerEvents","theme","content","infoLinkHref","dataset","infoLinkTarget","onInitialise","state","onStatusChange","chosenBefore","dataLayer","pushEvent","consent","grantedCategories","onPopupOpen","onPopupClose","loadPopupScript","js","id","defer","src","after","console","log","open","eventName","gtmEvent","gtmElements","telElements","pathname","pagePart","mailtoElements","atob","searchResults","keywords","searchKeywords","general","updateAppHeight","documentElement","setProperty","innerHeight","initEmailLinks","links","link","initAppHeight","passive","initAnchorLinks","scrollY","navigation","KEY_ESCAPE","_mediaQueryIsMobile","matchMedia","_mainNav","_megaMenu","_megaMenuTriggers","_megaMenuContainers","_clickedTrigger","_openMenuId","closeAllMegaMenus","trigger","closeText","focus","triggerClickHandler","menuId","openText","removeAttribute","pageUrl","destinationUrl","title","keyboardHandler","code","onWindowResize","_langTrigger","_langClose","_langContainer","closeLangSwitch","setFocus","requestAnimationFrame","sticky","navMobile","_toggles","_containers","toggleClickHandler","toggle","initMenu","min","version","culture","homepageId","info","error","toastMessages","index","toastType","toLowerCase","ljs","load","accordion","carousel","videos","lightbox","VideoLightbox","removeConsentWarning","scrollIntoView","infoBlocks","infoBlocksGrid","aspnetValidation","projectListing","partnerListing","genericForm","popup","stickyElements"],"mappings":"AAIA,IAAIA,cAAgB,qBAChBC,cAAgB,qBAChBC,cAAgB,qBAChBC,cAAgB,sBAChBC,eAAiB,sBAEjBC,kBAAoB,wBACpBC,kBAAoB,wBACpBC,kBAAoB,wBACpBC,kBAAoB,yBACpBC,kBAAoB,yBAMpBC,OAAOC,WAAaA,SAASC,UAAUC,UACzCF,SAASC,UAAUC,QAAUC,MAAMF,UAAUC,SAO/C,MAAME,KAAO,CACXC,gBAAiB,IACjBC,WAAW,EACXC,UAAW,KACXC,WAAY,KACZC,WAAY,KACZC,KAAM,KACNC,aACE,wIACFC,WAAY,qGAEZC,gBAAiB,SAAUC,GACzB,OAAOA,EAAM,QAAUC,KAAKV,iBAG9BW,gBAAiB,SAAUC,GACc,MAAvBC,SAASC,YAA6C,WAAvBD,SAASC,WAGtDF,IAEAC,SAASE,iBAAiB,mBAAoBH,IAIlDI,SAAU,SAAUC,EAAKC,GACvB,OAA4D,IAArDD,EAAIE,QAAQD,EAAQD,EAAIG,OAASF,EAAOE,SAGjDC,WAAY,SAAUJ,EAAKC,GACzB,OAA+B,IAAxBD,EAAIE,QAAQD,IAIrBI,aAAc,SAAUL,GACtB,OAAOA,EAAIM,QAAQ,sCAAuC,SA2B5DC,aAAc,SAAUC,GACtB,QAAKA,GAEE,yEAAyEC,KAAKD,IAGvFE,UAAW,SAAUC,GACnBC,IAAIC,EAAQ,KAAOjB,SAASkB,OACxBC,EAAQF,EAAMG,MAAM,KAAOL,EAAO,KACtC,OAAwB,IAAjBI,EAAMZ,YAAec,EAAYF,EAAMG,MAAMF,MAAM,KAAKG,SAGjEC,UAAW,SAAUT,EAAME,EAAOQ,EAAYC,EAAQlC,GACpDwB,IAAIW,EAAiB,IAAIC,KAGrBV,GAFJS,EAAeE,QAAQF,EAAeG,WAAaL,GAAc,MAEpD,CACXV,EAAO,IAAME,EACb,WAAaU,EAAeI,cAC5B,SAAWvC,GAAQ,KACnB,iBAGEkC,GACFR,EAAOc,KAAK,UAAYN,GAG1B1B,SAASkB,OAASA,EAAOe,KAAK,MAGhCC,aAAc,SAAUnB,GACtBlB,KAAK2B,UAAUT,EAAM,IAAK,IAG5BoB,WAAY,WACVnB,IAAIoB,EACFC,OAAOC,QACP,SAAUC,GACR,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAUlC,OAAQiC,IAAK,CACzC,IAESE,EAFLC,EAASF,UAAUD,GAEvB,IAASE,KAAOC,EACVN,OAAOtD,UAAU6D,eAAeC,KAAKF,EAAQD,KAC/CH,EAAOG,GAAOC,EAAOD,IAK3B,OAAOH,GAGX,OAAOH,EAASU,MAAMjD,KAAM4C,YAG9BM,cAAe,SAAUC,GAEvB,MAAsB,iBAARA,GAA4B,OAARA,GAAgBA,EAAIC,cAAgBZ,QAGxEa,SAAU,WACR,MAAO,iEAAiErC,KAAKsC,UAAUC,YAGzFC,KAAM,WAEJ,OAA+C,EAAxCF,UAAUC,UAAU9C,QAAQ,WAA4D,EAA3C6C,UAAUC,UAAU9C,QAAQ,aAGlFgD,OAAQ,WACN,OAA+C,EAAxCH,UAAUC,UAAU9C,QAAQ,UAGrCiD,eAAgB,SAAUxC,GACxBA,EAAOA,EAAKL,QAAQ,OAAQ,OAAOA,QAAQ,OAAQ,OAEnD,MAAM8C,EAAQ,IAAIC,OADH,SAAW1C,EAAO,aAE7B2C,EAAUF,EAAMG,KAAK9E,OAAO+E,SAASC,MACzC,OAAgB,OAAZH,EACK,GAEAA,EAAQ,IAInBI,UAAW,WACT,IAAMC,EAAW/D,SAASgE,IAAI5C,MAAM,KACpC,OAAyB,EAAlB2C,EAASxD,OAAawD,EAAS,GAAK,MAmH7CE,SAAU,SAAUC,EAAMC,GAAS,IAAAC,EAAAvE,KACjCsE,EAAUA,GAAW,IAErBnD,IAAIqD,EACJ,OAAO,YAAIC,GACTC,aAAaF,GACbA,EAAQG,WAAW,WACjBN,EAAKpB,MAAMsB,EAAME,IAChBH,KAIPM,gBAAiB,SAAUP,EAAMC,GAAS,IAAAO,EAAA7E,KACxCsE,EAAUA,GAAW,IAErBnD,IAAIqD,EACJ,OAAO,YAAIC,GACJD,GACHH,EAAKpB,MAAM4B,EAAMJ,GAGnBC,aAAaF,GACbA,EAAQG,WAAW,WACjBH,OAAQhD,GACP8C,KAIPQ,uBAAwB,SAAUC,EAAMC,EAAU9E,GAChDC,SAASE,iBAAiB0E,EAAM,SAACE,GAC3BA,EAAMvC,OAAOwC,QAAQF,IAAW9E,EAAS+E,MAIjDE,yBAA0B,SAAUpF,GAClCoB,IAAIiE,EAAe/F,KAAKO,aAAakE,KAAK/D,GACtCsF,EAAahG,KAAKQ,WAAWiE,KAAK/D,GAGtC,GAAIqF,GAAuC,GAAvBA,EAAa1E,OAC/B,MACE,iFACA0E,EAAa,GACb,gLAKJ,GAAIC,GAAmC,GAArBA,EAAW3E,OAAa,CACxC,MAAM4E,EAAMjG,KAAKkG,iBAAiB,aAAe,EAAI,EAErD,MACE,yEACAF,EAAW,GACX,mBACAC,EAAIE,WACJ,wJAIJ,MAAO,IAGTC,QAAS,SAAU/C,EAAQgD,EAAUC,GACnCD,EAAWA,GAAY,IAEvBhD,EAAOkD,MAAMC,mBAAqB,mCAClCnD,EAAOkD,MAAME,mBAAqBJ,EAAW,KAC7ChD,EAAOkD,MAAMG,UAAY,aACzBrD,EAAOkD,MAAMI,OAAStD,EAAOuD,aAAe,KAC5CvD,EAAOuD,aACPvD,EAAOkD,MAAMM,SAAW,SAExBxD,EAAOkD,MAAMI,OAAS,EACtBtD,EAAOkD,MAAMO,WAAa,EAC1BzD,EAAOkD,MAAMQ,cAAgB,EAC7B1D,EAAOkD,MAAMS,UAAY,EACzB3D,EAAOkD,MAAMU,aAAe,EAE5BtH,OAAO2F,WAAW,WAChBjC,EAAOkD,MAAMW,QAAU,OACvB7D,EAAOkD,MAAMY,WAAa,SAC1B9D,EAAOkD,MAAMa,eAAe,UAC5B/D,EAAOkD,MAAMa,eAAe,eAC5B/D,EAAOkD,MAAMa,eAAe,kBAC5B/D,EAAOkD,MAAMa,eAAe,cAC5B/D,EAAOkD,MAAMa,eAAe,iBAC5B/D,EAAOkD,MAAMa,eAAe,YAC5B/D,EAAOkD,MAAMa,eAAe,uBAC5B/D,EAAOkD,MAAMa,eAAe,uBAC5B/D,EAAOkD,MAAMa,eAAe,cAC5B/D,EAAOkD,MAAMa,eAAe,YAC3Bf,GAEe,mBAAPC,GACT3G,OAAO2F,WAAWgB,EAAID,IAI1BgB,UAAW,SAAUhE,EAAQgD,EAAUC,GACrCD,EAAWA,GAAY,IAEvBhD,EAAOkD,MAAMa,eAAe,WAC5BtF,IAAIoF,EAAUvH,OAAO2H,iBAAiBjE,GAAQ6D,QAC9B,SAAZA,IAAoBA,EAAU,SAClC7D,EAAOkD,MAAMW,QAAUA,EACvBpF,IAAI6E,EAAStD,EAAOuD,aACpBvD,EAAOkD,MAAMM,SAAW,SACxBxD,EAAOkD,MAAMgB,QAAU,EACvBlE,EAAOkD,MAAMI,OAAS,EACtBtD,EAAOkD,MAAMO,WAAa,EAC1BzD,EAAOkD,MAAMQ,cAAgB,EAC7B1D,EAAOkD,MAAMS,UAAY,EACzB3D,EAAOkD,MAAMU,aAAe,EAC5B5D,EAAOuD,aACPvD,EAAOkD,MAAMG,UAAY,aACzBrD,EAAOkD,MAAMC,mBAAqB,mCAClCnD,EAAOkD,MAAME,mBAAqBJ,EAAW,KAC7ChD,EAAOkD,MAAMI,OAASA,EAAS,KAC/BtD,EAAOkD,MAAMa,eAAe,eAC5B/D,EAAOkD,MAAMa,eAAe,kBAC5B/D,EAAOkD,MAAMa,eAAe,cAC5B/D,EAAOkD,MAAMa,eAAe,iBAC5B/D,EAAOkD,MAAMgB,QAAU,EACvBlE,EAAOkD,MAAMY,WAAa,UAE1BxH,OAAO2F,WAAW,WAChBjC,EAAOkD,MAAMa,eAAe,UAC5B/D,EAAOkD,MAAMa,eAAe,YAC5B/D,EAAOkD,MAAMa,eAAe,uBAC5B/D,EAAOkD,MAAMa,eAAe,wBAC3Bf,GAEe,mBAAPC,GACT3G,OAAO2F,WAAWgB,EAAID,IAI1BmB,YAAa,SAAUnE,EAAQgD,EAAUC,GAGvC,OAFAD,EAAWA,GAAY,KAEyB,SAA5C1G,OAAO2H,iBAAiBjE,GAAQ6D,QAC3BG,UAEAjB,SAFU/C,EAAQgD,EAAUC,IAMvCmB,eAAgB,SAAUC,EAAOC,GAC/B,GAAID,EAAMrG,SAAWsG,EAAOtG,OAC1B,OAAO,EAET,IAAKS,IAAIwB,EAAI,EAAGA,EAAIoE,EAAMrG,OAAQiC,IAChC,IAAkC,IAA9BqE,EAAOC,SAASF,EAAMpE,IACxB,OAAO,EAGX,OAAO,GAGTuE,kBAAmB,SAAUC,EAAWzE,EAAQ0E,GAC9C,IAAID,EAAUE,SAAS3E,GAOrB,KAAM,yDALNyE,EAAUG,SAAS,CACjBC,IAAK7E,EAAO8E,WAFdJ,EAA2B,iBAAXA,EAAsBA,EAAS,GAG7CK,SAAU,YAOhBC,gBAAiB,SAAUzC,GACzB,OAAOA,aAAiB0C,eAAoC,IAAlB1C,EAAM2C,SAAmC,IAAlB3C,EAAM4C,SAGzEC,UAAW,SAAUC,GAEnB,IAAKA,GAAoC,OAAzBA,EAAQC,cAAyE,WAAhDhJ,OAAO2H,iBAAiBoB,GAASvB,WAChF,OAAO,EAIHyB,EAAOF,EAAQG,wBACrB,OAAmB,IAAfD,EAAKE,OAA+B,IAAhBF,EAAKjC,QAO/BoC,YAAa,SAAUL,GAIrB,SAHsB,CAAC,IAAK,SAAU,QAAS,WAAY,UAGzCd,SAASc,EAAQM,WAAYrI,KAAK8H,UAAUC,IAAaA,EAAQO,YAMtD,mBAApBP,EAAQQ,SACfR,EAAQS,aAAa,YACY,WAAjCT,EAAQU,aAAa,UAIzBC,eAAgB,SAAUC,GAElBC,GADND,EAASA,GAAUxI,SAAS0I,MACDC,iBAAiB,oBAC5C,OAAO1J,MAAM2J,KAAKH,GAAaI,KAAK,SAACjB,GAAD,OAAa1I,KAAK+I,YAAYL,MAGpExC,iBAAkB,SAAU0D,GAC1B,MAAuD,aAAhD5J,KAAK4B,UAAU,iBAAmBgI,IAG3CC,oBAAqB,SAAUD,GACN,oBAAZE,SACTA,QAAQC,eAAeH,IAS3BI,sBAAuB,SAAUtB,GAC/B5G,IAAImI,EAAa,IAAIC,IAErB,KAAOxB,GACDA,EAAQyB,WAA0C,iBAAtBzB,EAAQyB,WACtCzB,EAAQyB,UAAUjI,MAAM,OAAOpC,QAAQ,SAACsK,GAAD,OAASH,EAAWI,IAAID,KAGjE1B,EAAUA,EAAQ4B,cAGpB,OAAOvK,MAAM2J,KAAKO,KAStB,IAAIM,IAAMA,KAAO,IC3hBjB,wBAGE,SAASC,EAAenH,EAAQ4B,EAASwF,GAEvCpH,EAASA,GAAUvC,SAAS4J,cAAc,QAC1CzF,EAAUA,GAAW,EAErBwF,EAAOA,GAAQ,GAEf3I,IAoE2B6I,EAhE3BF,EAAOzK,KAAKiD,WAJG,CACb2H,QAAS,cAGsBH,GAGjC3I,IAAI+I,EAQAC,GANFD,EADoB,iBAAXxH,EACOvC,SAAS4J,cAAcrH,GAEvBA,GAIsBkD,MAAMwE,SAGF,YAkD1BrC,EAlDLmC,EAkDcF,EAlDC,WAmDtBjC,EAAQsC,aACHtC,EAAQsC,aAAaL,GACnBhL,OAAO2H,iBACTxG,SAASmK,YACb3D,iBAAiBoB,EAAS,MAC1BwC,iBAAiBP,GAEb,QAzDTE,EAActE,MAAMwE,SAAW,YAIjC,MAAMI,EAAUrK,SAASsK,cAAc,OAcjCC,GAbNF,EAAQG,UAAUjB,IAAI,kBAGQ,SAA1BQ,EAAc7B,SAChBmC,EAAQ5E,MAAMwE,SAAW,QACzBI,EAAQ5E,MAAMI,OAAS,oBACvBwE,EAAQ5E,MAAMgF,UAAY,UAE1BJ,EAAQ5E,MAAMwE,SAAW,WACzBI,EAAQ5E,MAAMI,OAAS,QAIL7F,SAASsK,cAAc,QAmB3C,SAASI,IACPX,EAAcS,UAAUG,OAAO,6BAC/BZ,EAAca,YAAYP,GAC1BV,EAAKG,UAEuB,KAAxBE,EACFD,EAActE,MAAMwE,SAAWD,EAE/BD,EAActE,MAAMa,eAAe,YAgBvC,OA1CAiE,EAAYC,UAAUjB,IAAI,wBAC1BgB,EAAYM,UACV,+YAGFR,EAAQS,YAAYP,GAGpBR,EAAcS,UAAUjB,IAAI,6BAC5BQ,EAAce,YAAYT,GAGZ,EAAVlG,GACFtF,OAAO2F,WAAW,WAChBkG,KACCvG,GA2BE,CACLuG,MAAOA,GAIW,oBAAXK,aAAoD,IAAnBA,OAAOC,QACjDD,OAAOC,QAAUtB,EAEjB7K,OAAO6K,eAAiBA,EAlG5B,GCAA,wBAGE,SAASuB,EAAMC,EAASC,EAAQhH,EAASwF,GAEvCuB,EAAUA,GAAW,GACrBC,EAASA,GAAU,OACnBhH,EAAUA,GAAW,IAErBwF,EAAOA,GAAQ,GAOfA,EAAOzK,KAAKiD,WALG,CACb2H,QAAS,aACTsB,WAAY,sBAGmBzB,GAGjC3I,IAAIqK,EAGJ,MAAMC,EAAQtL,SAASsK,cAAc,OAO/BiB,GANND,EAAMd,UAAUjB,IAAI,eAGpB+B,EAAMd,UAAUjB,IAAI,MAAQ4B,GAGRnL,SAASsK,cAAc,MAQrCkB,GAPND,EAAYf,UAAUjB,IAAI,gBAC1BgC,EAAYE,aAAa,aAAc9B,EAAKyB,YAC5CG,EAAY1H,KAAO,IACnB0H,EAAYV,UACV,8UAGmB7K,SAASsK,cAAc,QAC5CkB,EAAahB,UAAUjB,IAAI,kBAC3BiC,EAAaX,UAAYK,EAEzBI,EAAMR,YAAYS,GAClBD,EAAMR,YAAYU,GAGlBD,EAAYrL,iBAAiB,QAAS,SAACwL,GACrCA,EAAEC,iBACFjB,MAGFY,EAAMpL,iBAAiB,YAAa,YACc,IAA5CoL,EAAMd,UAAUtD,SAAS,gBAC3B3C,aAAa8G,KAGjBC,EAAMpL,iBAAiB,WAAY,WACjCmL,EAAexM,OAAO2F,WAAW,WAC/BkG,KACC,OAIL1J,IAAI4K,EAAiB5L,SAAS4J,cAAc,qBACxCiC,EAAe7L,SAAS4J,cAAc,mBAqB1C,SAASc,IACHY,EAAMQ,aACRR,EAAMd,UAAUjB,IAAI,eACpB8B,EAAexM,OAAO2F,WAAW,WAC/B8G,EAAMQ,WAAWlB,YAAYU,GAC7B3B,EAAKG,WACJ,MAIP,OA5BK8B,KACHA,EAAiB5L,SAASsK,cAAc,QACzBE,UAAUjB,IAAI,qBAE7BsC,EAAe7L,SAASsK,cAAc,QACzBE,UAAUjB,IAAI,kBAE3BqC,EAAed,YAAYe,GAC3B7L,SAAS4J,cAAc,QAAQkB,YAAYc,IAG7CC,EAAaE,aAAaT,EAAOO,EAAaG,SAAS,IAGvDX,EAAexM,OAAO2F,WAAW,WAC/BkG,KACCvG,GAYI,CACLuG,MAAOA,GAIW,oBAAXK,aAAoD,IAAnBA,OAAOC,QACjDD,OAAOC,QAAUC,EAEjBpM,OAAOoM,MAAQA,EAtGnB,GCIAjK,IAAIiL,SAAW,KACXC,YAAc,KAElBzC,IAAI0C,YAAe,wBA2DjB,MAAO,CACLC,KAdF,WAGE,GAFAF,YAAclM,SAASqM,eAAe,WAEtC,CA7CAJ,SAAW,CACTK,gBAAgB,EAChBC,uBAAuB,EACvBtC,SAAU,cACVuC,MAAO,SACPtL,OAAQ,CACNH,KAAM,2BAER0L,QAAS,CACPC,aAAcR,YAAYS,QAAQD,aAClCE,eAAgB,UAIlBC,aAAc,SAAUC,EAAO3B,KAC/B4B,eAAgB,SAAUD,EAAO3B,EAAQ6B,GAEvCvD,IAAIwD,UAAUC,UAAU,gBAAiB,CACvCC,QAASL,EAAMM,kBAAkBnL,UAGrCoL,YAAa,SAAUP,EAAO3B,KAC9BmC,aAAc,SAAUR,MA6B1BS,CAxBAvM,IAAIwM,EAAKxN,SAASsK,cAAc,UAChCkD,EAAGC,GAAK,gBACRD,EAAGE,MAAQ,OACXF,EAAGG,IAAMzB,YAAYS,QAAQgB,IAE7BzB,YAAY0B,MAAMJ,GAClBtB,YAAYvB,eAaVkD,QAAQC,IAAI,wCAWdC,KArBF,WACyB,oBAAZ/E,SACTA,QAAQ+E,SA1CK,GCHnBtE,IAAIwD,UAAa,wBAGfpO,OAAOoO,UAAYpO,OAAOoO,WAAa,GA8FrB,SAAZC,EAAsBc,EAAW1J,GACrC,GAAkB,KAAd0J,EAAJ,CAIAhN,IAAIiN,EAAW,CAAEnJ,MAAOkJ,GAExB,IAAK,MAAMtL,KAJX4B,EAAOA,GAAQ,GAKTA,EAAK1B,eAAeF,KACtBuL,EAASvL,GAAO4B,EAAK5B,IAKzB7D,OAAOoO,UAAUjL,KAAKiM,GAElB/O,KAAKE,WAAWyO,QAAQC,IAAIG,IAIlC,MAAO,CACL7B,KAjHW,WACX,MAAM8B,EAAclO,SAAS2I,iBAAiB,oBA0BxCwF,GAxBND,EAAYlP,QAAQ,SAAC4I,GACnBA,EAAQ1H,iBAAiB,QAAS,SAAC4E,GACjC9D,IAAIgN,EAAYpG,EAAQ+E,QAAQsB,UAE5B,GAEJ,GAAkB,KAAdD,EAAJ,CACAhN,IAAIsD,EAAO,GAEXA,EAAI,QAAczF,OAAO+E,SAASwK,SAClC9J,EAAI,eAAqBsD,EAAQU,aAAa,QAE1CV,EAAQ+E,QAAQ0B,WAClB/J,EAAI,SAAesD,EAAQ+E,QAAQ0B,UAGrCnB,EAAUc,EAAW1J,QAQLtE,SAAS2I,iBAAiB,mBAwBxC2F,GAtBNH,EAAYnP,QAAQ,SAAC4I,QAEqB,IAA7BA,EAAQ+E,QAAQsB,UAE3BrG,EAAQ1H,iBAAiB,QAAS,SAAC4E,GACjC9D,IAAIsD,EAAO,GAEXA,EAAI,QAAczF,OAAO+E,SAASwK,SAClC9J,EAAI,QAAcsD,EAAQU,aAAa,QAEnCV,EAAQ+E,QAAQ0B,WAClB/J,EAAI,SAAesD,EAAQ+E,QAAQ0B,UAGrCnB,EAAU,mBAAoB5I,OAQXtE,SAAS2I,iBAC9B,oCAGF2F,EAAetP,QAAQ,SAAC4I,QAEkB,IAA7BA,EAAQ+E,QAAQsB,UAE3BrG,EAAQ1H,iBAAiB,QAAS,SAAC4E,GACjC9D,IAAIsD,EAAO,GACP1D,EAAQ,GAGVA,OADmC,IAA1BgH,EAAQ+E,QAAQ/L,MACjB,UAAY2N,KAAK3G,EAAQU,aAAa,eAEtCV,EAAQU,aAAa,QAG/BhE,EAAI,QAAczF,OAAO+E,SAASwK,SAClC9J,EAAI,QAAc1D,EAEdgH,EAAQ+E,QAAQ0B,WAClB/J,EAAI,SAAesD,EAAQ+E,QAAQ0B,UAGrCnB,EAAU,aAAc5I,OAQ5B,IAAMkK,EAAgBxO,SAAS4J,cAAc,0BACzC4E,GACFtB,EAAU,SAAU,CAClBuB,SAAUD,EAAc7B,QAAQ+B,kBA2BpCxB,UAAWA,GAvHE,GCAjBzD,IAAIkF,QAAW,wBAkCb,MAAMC,EAAkB1P,KAAK+E,SAAS,WACpCjE,SAAS6O,gBAAgBpJ,MAAMqJ,YAC7B,eACAjQ,OAAOkQ,YAAc,OAEtB,KAgFH,MAAO,CACLC,eArHF,WAEE,MAAMC,EAAQjP,SAAS2I,iBAAiB,iBAExCsG,EAAMjQ,QAAQ,SAACkQ,GACbA,EAAKhP,iBAAiB,QAAS,SAAC4E,GAC9BA,EAAM6G,iBACF/K,EAAQ2N,KAAKW,EAAK5G,aAAa,eACnCzJ,OAAO+E,SAASC,KAAO,UAAYjD,OA+GvCuO,cAjFF,WAEEP,IAGA/P,OAAOqB,iBACL,SACA,WACE0O,KAEF,CAAEQ,SAAS,KAwEbR,gBAAiBA,EAEjBS,gBA5CF,WACE,MAAMJ,EAAQjP,SAAS2I,iBAAiB,gBAExCsG,EAAMjQ,QAAQ,SAACkQ,GACb,IAAMrL,EAAOqL,EAAK5G,aAAa,QAC/B,GAAa,MAATzE,EAAJ,CAEA,MAAMtB,EAASvC,SAAS4J,cAAc/F,GACjCtB,GAEL2M,EAAKhP,iBAAiB,QAAS,SAAC4E,GAC9BA,EAAM6G,iBAgBYpJ,EAfHA,EAiBb6E,EAjBa7E,EAiBAwF,wBAAwBX,IAAMvI,OAAOyQ,QAExDzQ,OAAOsI,SAAS,CACdC,IAAKA,EAJQ,IAKbE,SAAU,kBAlHD,GCAfmC,IAAI8F,WAAc,wBAGhB,MAAMC,EAAa,SAEbC,EAAsB5Q,OAAO6Q,WAAW,0BACxCC,EAAW3P,SAAS4J,cAAc,mBAClCgG,EAAY5P,SAAS4J,cAAc,oBACnCiG,EAAoB7P,SAAS2I,iBAAiB,4BAC9CmH,EAAsB9P,SAAS2I,iBAAiB,8BACtD3H,IAAI+O,EAAkB,KAClBC,EAAc,KAuClB,SAASC,IAEPH,EAAoB9Q,QAAQ,SAACgI,GAC3BA,EAAUyE,aAAa,SAAU,YAInCoE,EAAkB7Q,QAAQ,SAACkR,GACzBA,EAAQzE,aAAa,iBAAiB,GACtCyE,EAAQzE,aAAa,aAAcyE,EAAQvD,QAAQwD,aAIjDJ,IACFA,EAAgBK,QAChBL,EAAkB,MAGpBC,EAAc,KAGhB,SAASK,EAAoBvL,GAC3BA,EAAM6G,iBAGN,MAAM2E,EAASxL,EAAMvC,OAAO+F,aAAa,iBAGrC0H,GAAeA,IAAgBM,GAAQL,IAG3CF,EAAkB7Q,KAAKqI,gBAAgBzC,GAASA,EAAMvC,OAAS,KAG/D,IAxCgC2N,EAwC1BlJ,EAAY/H,MAAM2J,KAAKkH,GAAqBjH,KAAK,SAAC7B,GACtD,OAAOA,EAAUyG,KAAO6C,IAGrBtJ,IAG8C,SAA/ClC,EAAMvC,OAAO+F,aAAa,kBA/CE4H,EAgDLpL,EAAMvC,OAAjByE,EA/CNyE,aAAa,SAAU,UACjCyE,EAAQzE,aAAa,iBAAiB,GACtCyE,EAAQzE,aAAa,aAAcyE,EAAQvD,QAAQ4D,UA8CjDP,EAAc,OAvDeE,EAyDLpL,EAAMvC,OAAjByE,EAxDLwJ,gBAAgB,UAC1BN,EAAQzE,aAAa,iBAAiB,GACtCyE,EAAQzE,aAAa,aAAcyE,EAAQvD,QAAQwD,WAuDjDH,EAAcM,EAGd7G,IAAIwD,UAAUC,UAAU,mBAAoB,CAC1CuD,QAAS5R,OAAO+E,SAASwK,SACzBsC,eAAgB,cAAgB5L,EAAMvC,OAAOoK,QAAQgE,UAK3D,SAASC,EAAgB9L,GACnBA,EAAM+L,OAASrB,GACjBS,IA4BJ,SAASa,IACHrB,EAAoB1K,SACtBkL,IAIJR,EAAoBvP,iBAAiB,SAAU4Q,GAC/CA,IAMA,MAAMC,EAAe/Q,SAAS4J,cAAc,8BACtCoH,EAAahR,SAAS4J,cAAc,4BACpCqH,EAAiBjR,SAAS4J,cAAc,gCA4C9C,SAASsH,EAAgBC,GACvBA,EAAWA,IAAY,EACvBF,EAAezG,UAAUG,OAAO,WAG5BwG,GAAUJ,EAAaX,QAG3BW,EAAatF,aAAa,aAAcsF,EAAapE,QAAQ4D,UAC7DQ,EAAatF,aAAa,iBAAiB,GAE3C5M,OAAO2F,WAAW,WAChByM,EAAexL,MAAMY,WAAa,UACjC,KAIL,MAAO,CACL+F,KAxMF,WAWEvN,OAAOqB,iBAAiB,SAAU,WAGhCkR,sBAAsB,WACpB,IAAInK,EAASwI,EAAoB1K,QAAU,EAAI,GAC/C4K,EAAShD,QAAQ0E,OAASxS,OAAOyQ,SAAWrI,MAoF3C2I,IAGLC,EAAkB7Q,QAAQ,SAACkR,GACzBA,EAAQhQ,iBAAiB,QAASmQ,KAIpCT,EAAU1P,iBAAiB,UAAW0Q,GAGtC5Q,SAASE,iBAAiB,QAAS,SAAC4E,IACmC,IAAjE5F,KAAKgK,sBAAsBpE,EAAMvC,QAAQuE,SAAS,YACpDmJ,OA4BCc,GAAiBE,IAEtBF,EAAa7Q,iBAAiB,QAAS,SAAC4E,GACtCA,EAAM6G,iBAE6C,UAA/CoF,EAAazI,aAAa,kBA4BhC2I,EAAezG,UAAUjB,IAAI,WAC7B0H,EAAexL,MAAMY,WAAa,UAGlC0K,EAAatF,aAAa,aAAcsF,EAAapE,QAAQwD,WAC7DY,EAAatF,aAAa,iBAAiB,IA9BvCyF,GAAgB,KAIpBF,EAAW9Q,iBAAiB,QAAS,SAAC4E,GACpCA,EAAM6G,iBACNuF,GAAgB,KAGlBlR,SAASE,iBAAiB,QAAS,SAAC4E,GAClC,MAAMqE,EAAarE,EAAMvC,OAAO+F,aAAa,SAE1B,OAAfa,IAA6D,IAAtCA,EAAW7I,QAAQ,eAC5C4Q,GAAgB,KAIpBD,EAAe/Q,iBAAiB,UAAW,SAAC4E,GACtCA,EAAM+L,OAASrB,GACjB0B,GAAgB,QArLN,GCAlBzH,IAAI6H,UAAa,wBAGf,MAAMC,EAAWvR,SAAS2I,iBAAiB,+BACrC6I,EAAcxR,SAAS2I,iBAAiB,kCAmB9C,SAAS8I,EAAmB3M,GAC1BA,EAAM6G,iBAGN,MAAM2E,EAASxL,EAAMvC,OAAO+F,aAAa,iBAGzC,IAboBtB,EAAW0K,EAazB1K,EAAY/H,MAAM2J,KAAK4I,GAAa3I,KAAK,SAAC7B,GAC9C,OAAOA,EAAUyG,KAAO6C,IAGrBtJ,IAG8C,SAA/ClC,EAAMvC,OAAO+F,aAAa,kBApBVtB,EAqBLA,EArBgB0K,EAqBL5M,EAAMvC,OApBhCyE,EAAUvB,MAAMgB,QAAU,EAC1BvH,KAAKoG,QAAQ0B,EAAW,KACxB0K,EAAOjG,aAAa,iBAAiB,KATlBzE,EA6BLA,EA7BgB0K,EA6BL5M,EAAMvC,OA5B/ByE,EAAUvB,MAAMgB,QAAU,EAC1BvH,KAAKqH,UAAUS,EAAW,KAC1B0K,EAAOjG,aAAa,iBAAiB,GA6BnChC,IAAIwD,UAAUC,UAAU,mBAAoB,CAC1CuD,QAAS5R,OAAO+E,SAASwK,SACzBsC,eAAgB,cAAgB5L,EAAMvC,OAAOoK,QAAQgE,UAkC3D,MAAO,CACLvE,KA1EF,WA6COmF,GAAaC,GAGlBD,EAASvS,QAAQ,SAAC0S,GAChBA,EAAOxR,iBAAiB,QAASuR,KA/CnCE,CAoDA,MAAMzB,EAAUlQ,SAAS4J,cAAc,6BACjC5C,EAAYhH,SAAS4J,cAAc,+BArDzC+H,YAuDKzB,GAAYlJ,GAEjBkJ,EAAQhQ,iBAAiB,QAAS,SAAC4E,GACjCA,EAAM6G,iBAEwC,SAA1CuE,EAAQ5H,aAAa,kBACvBtB,EAAUwD,UAAUG,OAAO,WAC3BuF,EAAQzE,aAAa,iBAAiB,KAEtCzE,EAAUwD,UAAUjB,IAAI,WACxB2G,EAAQzE,aAAa,iBAAiB,UAzE7B,GCAjBvM,KAAKY,gBAAgB,WACnB,IAAM4I,EAAO1I,SAASqM,eAAe,QA4C/BuF,GAzCN1S,KAAKC,gBAAkBuJ,EAAKiE,QAAQkF,QAGpC3S,KAAKE,UAAuC,SAA3BsJ,EAAKiE,QAAQvN,UAG9BF,KAAKG,UAAYqJ,EAAKiE,QAAQmF,QAG9B5S,KAAKI,WAAaJ,KAAKG,UAAYH,KAAKG,UAAU+B,MAAM,KAAK,GAAK,KAGlElC,KAAKK,WAAamJ,EAAKiE,QAAQoF,WAG/B7S,KAAKM,KAAOkJ,EAAKiE,QAAQnN,KAErBN,KAAKE,YACPyO,QAAQmE,KAAK9S,KAAKG,UAAWH,KAAKI,WAAYJ,KAAKK,WAAYL,KAAKM,MAC/DN,KAAKG,WAAWwO,QAAQoE,MAAM,sBAC9B/S,KAAKI,YAAYuO,QAAQoE,MAAM,uBAC/B/S,KAAKK,YAAYsO,QAAQoE,MAAM,yBAC/B/S,KAAKM,MAAMqO,QAAQoE,MAAM,oBAIhCjS,SAAS6O,gBAAgBrE,UAAUG,OAAO,cAK1ClB,IAAIkF,QAAQQ,gBAEZ1F,IAAI8F,WAAWnD,OACf3C,IAAI6H,UAAUlF,OAEd3C,IAAIkF,QAAQK,iBAEZvF,IAAI0C,YAAYC,OAChB3C,IAAIwD,UAAUb,QAEiB,IAAnBlN,KAAKE,UAAsB,OAAS,IAEhD,GAA+D,EAA3DY,SAAS2I,iBAAiB,wBAAwBpI,OAAY,CAEhE,MAAM2R,EAAgBlS,SAAS2I,iBAAiB,wBAChDuJ,EAAclT,QAAQ,SAACkM,EAASiH,GAC9BtT,OAAO2F,WAAW,WAChByG,MAAMC,EAAQL,UAAWK,EAAQyB,QAAQyF,UAAUC,cAAenH,EAAQyB,QAAQtB,cAAgB,OACzF,IAAR8G,KAIyD,EAA5DnS,SAAS2I,iBAAiB,yBAAyBpI,QACrD+R,IAAIC,KAAKrT,KAAKS,gBAAgB,kCAAoCiS,EAAM,OAAQ,WAC9EnI,IAAI+I,UAAUpG,UAKsC,EAAtDpM,SAAS2I,iBAAiB,mBAAmBpI,QACc,EAA3DP,SAAS2I,iBAAiB,wBAAwBpI,QACS,EAA3DP,SAAS2I,iBAAiB,wBAAwBpI,QACS,EAA3DP,SAAS2I,iBAAiB,wBAAwBpI,SAElD+R,IAAIC,KACFrT,KAAKS,gBAAgB,sBAAwBiS,EAAM,OACnD1S,KAAKS,gBAAgB,wCAA0CiS,EAAM,OACrE1S,KAAKS,gBAAgB,iCAAmCiS,EAAM,OAC9D,WACEnI,IAAIgJ,SAASrG,SAKoC,EAAnDpM,SAAS2I,iBAAiB,gBAAgBpI,QAC5C+R,IAAIC,KAAKrT,KAAKS,gBAAgB,+BAAiCiS,EAAM,OAAQ,WAC3EnI,IAAIiJ,OAAOtG,SAIiD,EAA5DpM,SAAS2I,iBAAiB,yBAAyBpI,QACrD+R,IAAIC,KAAKrT,KAAKS,gBAAgB,8BAAgCiS,EAAM,OAAQ,WAC1E,IAAMc,EAAS1S,SAAS2I,iBAAiB,yBACzC,MAAMgK,EAAWC,cAAcF,GAE/B1S,SAASE,iBAAiB,uBAAwB,WAC5ChB,KAAKkG,iBAAiB,cACxBuN,EAASE,2BAMb7S,SAAS4J,cAAc,oBACkB,EAAvC5J,SAAS4D,SAASC,KAAKvD,QAAQ,MACjCkE,WAAW,WACTxE,SAAS4J,cAAc,yBAAyBkJ,eAAe,CAC7DxL,SAAU,YAEX,KAIqD,EAAxDtH,SAAS2I,iBAAiB,qBAAqBpI,QACjD+R,IAAIC,KACFrT,KAAKS,gBAAgB,4BAA8BiS,EAAM,OACzD1S,KAAKS,gBAAgB,mCAAqCiS,EAAM,OAChE,WACEnI,IAAIsJ,WAAW3G,SAKsC,EAAvDpM,SAAS2I,iBAAiB,oBAAoBpI,QAChD+R,IAAIC,KAAKrT,KAAKS,gBAAgB,uCAAyCiS,EAAM,OAAQ,WACnFnI,IAAIuJ,eAAe5G,SAIvBkG,IAAIC,KAAKrT,KAAKS,gBAAgB,iCAAmCiS,EAAM,OAAQ,WAG7E/S,OAAO2F,WAAW,WACuB,iBAA5B3F,OAAOoU,kBAChBX,IAAIC,KACF,yCACArT,KAAKS,gBAAgB,yCACrB,eAGH,OAG4D,EAA7DK,SAAS2I,iBAAiB,0BAA0BpI,QACtD+R,IAAIC,KAAKrT,KAAKS,gBAAgB,uCAAyCiS,EAAM,OAAQ,WACnFnI,IAAIyJ,eAAe9G,SAImC,EAAtDpM,SAAS2I,iBAAiB,mBAAmBpI,QAC/C+R,IAAIC,KAAKrT,KAAKS,gBAAgB,uCAAyCiS,EAAM,OAAQ,WACnFnI,IAAI0J,eAAe/G,SAIuC,EAA1DpM,SAAS2I,iBAAiB,uBAAuBpI,QACnD+R,IAAIC,KACFrT,KAAKS,gBAAgB,kCAAoCiS,EAAM,OAC/D1S,KAAKS,gBAAgB,iCAAmCiS,EAAM,OAC9D1S,KAAKS,gBAAgB,8BAAgCiS,EAAM,OAC3D,WACEnI,IAAI2J,YAAYhH,SAKiC,EAAnDpM,SAAS2I,iBAAiB,gBAAgBpI,QAC5C+R,IAAIC,KAAKrT,KAAKS,gBAAgB,8BAAgCiS,EAAM,OAAQ,WAC1EnI,IAAI4J,MAAMjH,SAIkD,EAA5DpM,SAAS2I,iBAAiB,yBAAyBpI,QACrD+R,IAAIC,KACFrT,KAAKS,gBAAgB,+BAAiCiS,EAAM,OAC5D1S,KAAKS,gBAAgB,uCAAyCiS,EAAM,OACpE,WAEEnI,IAAI6J,eAAelH","file":"../app.min.js","sourcesContent":["/* ========================================================================\n Breakpoints\n ========================================================================== */\n\nvar breakpoint_sm = '(min-width: 576px)';\nvar breakpoint_md = '(min-width: 768px)';\nvar breakpoint_lg = '(min-width: 992px)';\nvar breakpoint_xl = '(min-width: 1200px)';\nvar breakpoint_xxl = '(min-width: 1400px)';\n\nvar breakpoint_xs_max = '(max-width: 575.98px)';\nvar breakpoint_sm_max = '(max-width: 767.98px)';\nvar breakpoint_md_max = '(max-width: 991.98px)';\nvar breakpoint_lg_max = '(max-width: 1199.98px)';\nvar breakpoint_xl_max = '(max-width: 1399.98px)';\n\n/* ========================================================================\n Polyfills\n ========================================================================== */\n\nif (window.NodeList && !NodeList.prototype.forEach) {\n NodeList.prototype.forEach = Array.prototype.forEach;\n}\n\n/* ========================================================================\n Utilities\n ========================================================================== */\n\nconst util = {\n frontEndVersion: '1',\n debugMode: false,\n uiCulture: null,\n uiLanguage: null,\n homePageId: null,\n path: null,\n youTubeRegex:\n /https?:\\/\\/.*(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\/|live\\/)|(?:(?:watch)?\\?v(?:i)?=|\\&v(?:i)?=))([^#\\&\\?\\/]*).*/i,\n vimeoRegex: /https?:\\/\\/(?:www.)?vimeo.com\\/(?:channels\\/(?:w+\\/)?|groups\\/(?:[^\\/]*)\\/videos\\/|)(\\d+)(?:|\\/?)/i,\n\n getVersionedUrl: function (url) {\n return url + '?cdv=' + this.frontEndVersion;\n },\n\n onDocumentReady: function (callback) {\n const isReady = document.readyState != null && document.readyState != 'loading';\n\n if (isReady) {\n callback();\n } else {\n document.addEventListener('DOMContentLoaded', callback);\n }\n },\n\n endsWith: function (str, lookup) {\n return str.indexOf(lookup, str.length - lookup.length) !== -1;\n },\n\n startsWith: function (str, lookup) {\n return str.indexOf(lookup) === 0;\n },\n\n // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\n escapeRegExp: function (str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&');\n },\n\n // hasClass: function (element, selector) {\n // let s = ' ';\n // return (\n // element.nodeType === 1 &&\n // (s + element.className + s)\n // .replace(/[\\n\\t]/g, s)\n // .indexOf(s + selector + s) >= 0\n // );\n // },\n\n // addClass: function (element, className) {\n // if (this.hasClass(element, className) === false) {\n // element.className += ' ' + className;\n // }\n // },\n\n // removeClass: function (element, className) {\n // const regex = new RegExp(\n // '[\\\\b|\\\\s]*' + this.escapeRegExp(className) + '[\\\\b|\\\\s]*',\n // 'gi'\n // );\n // element.className = element.className.replace(regex, '');\n // },\n\n isValidEmail: function (email) {\n if (!email) return false;\n\n return /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]{2,})+$/.test(email);\n },\n\n getCookie: function (name) {\n let value = '; ' + document.cookie;\n let parts = value.split('; ' + name + '=');\n return parts.length !== 2 ? undefined : parts.pop().split(';').shift();\n },\n\n setCookie: function (name, value, expiryDays, domain, path) {\n let expirationDate = new Date();\n expirationDate.setDate(expirationDate.getDate() + (expiryDays || 365));\n\n let cookie = [\n name + '=' + value,\n 'Expires=' + expirationDate.toUTCString(),\n 'Path=' + (path || '/'),\n 'SameSite=Lax',\n ];\n\n if (domain) {\n cookie.push('Domain=' + domain);\n }\n\n document.cookie = cookie.join(';');\n },\n\n deleteCookie: function (name) {\n this.setCookie(name, '', -1);\n },\n\n deepExtend: function () {\n let extended =\n Object.assign ||\n function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return extended.apply(this, arguments);\n },\n\n isPlainObject: function (obj) {\n // The code \"typeof obj === 'object' && obj !== null\" allows Array objects\n return typeof obj === 'object' && obj !== null && obj.constructor === Object;\n },\n\n isMobile: function () {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n },\n\n isIE: function () {\n // MSIE used to detect old browsers and Trident used to newer ones\n return navigator.userAgent.indexOf('MSIE ') > -1 || navigator.userAgent.indexOf('Trident/') > -1;\n },\n\n isEdge: function () {\n return navigator.userAgent.indexOf('Edge/') > -1;\n },\n\n getQueryString: function (name) {\n name = name.replace(/[\\[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n const regexS = '[\\\\?&]' + name + '=([^&#]*)';\n const regex = new RegExp(regexS);\n let results = regex.exec(window.location.href);\n if (results === null) {\n return '';\n } else {\n return results[1];\n }\n },\n\n getAnchor: function () {\n const urlParts = document.URL.split('#');\n return urlParts.length > 1 ? urlParts[1] : null;\n },\n\n // sortSelect: function (el, sortVal) {\n // sortVal = sortVal || 'text';\n\n // // Checks for an object or string. Uses string as ID.\n // switch (typeof el) {\n // case 'string':\n // el = document.getElementById(el);\n // break;\n // case 'object':\n // if (el == null) return false;\n // break;\n // default:\n // return false;\n // }\n\n // // Builds the options list.\n // let arr = new Array();\n // for (var i = 0; i < el.options.length; i++) {\n // arr[i] = new Array();\n // arr[i][0] = el.options[i].text;\n // arr[i][1] = el.options[i].value;\n // }\n\n // // Allows sortVal to be optional, defaults to text.\n // switch (sortVal) {\n // case 'value': // sort by value\n // sortVal = 1;\n // break;\n // default:\n // // sort by text\n // sortVal = 0;\n // }\n\n // arr.sort((a, b) => {\n // return a[sortVal] == b[sortVal] ? 0 : a[sortVal] < b[sortVal] ? -1 : 1;\n // });\n\n // // Removes all options from the select.\n // while (el.options.length > 0) {\n // el.options[0] = null;\n // }\n\n // // Recreates all options with the new order.\n // for (var i = 0; i < arr.length; i++) {\n // var op = new Option(arr[i][0], arr[i][1]);\n // el.options[i] = op;\n // }\n\n // return true;\n // },\n\n // Requires `smoothscroll.js` polyfill for unsupported browsers: http://iamdustan.com/smoothscroll/\n // scrollTo: function (el, options) {\n // options = options || {};\n\n // if (el.length === 0) return;\n\n // let defaults = {\n // offset: 0,\n // pushHash: true,\n // };\n\n // options = util.deepExtend(defaults, options);\n\n // let hash = el.getAttribute('href');\n\n // if (hash !== '#') {\n // let target = document.querySelector(hash);\n\n // if (!target) {\n // target = document.querySelector(\n // 'a[name=\"' + hash.replace('#', '') + '\"]'\n // );\n // }\n\n // if (!target) return;\n\n // target.scrollIntoView({\n // behavior: 'smooth',\n // });\n\n // let elementPosition = target.offsetTop;\n // let offsetPosition = elementPosition - options.offset;\n\n // window.scrollTo({\n // top: offsetPosition,\n // behavior: 'smooth',\n // });\n\n // if (options.pushHash) {\n // window.location.hash = hash.replace('#', '');\n // }\n // }\n // },\n\n // Use `insertBefore` instead of `appendChild`: https://www.paulirish.com/2011/surefire-dom-element-insertion/\n // injectFile: function (path, type, ref) {\n // if (type == 'js') {\n // let el = document.createElement('script');\n // el.setAttribute('type', 'text/javascript');\n // el.setAttribute('src', path);\n // placeholder.parentNode.insertBefore(el, ref);\n // } else if (type == 'css') {\n // let el = document.createElement('link');\n // el.setAttribute('rel', 'stylesheet');\n // el.setAttribute('type', 'text/css');\n // el.setAttribute('href', path);\n // placeholder.parentNode.insertBefore(el, ref);\n // }\n // },\n\n // https://www.freecodecamp.org/news/javascript-debounce-example/\n debounce: function (func, timeout) {\n timeout = timeout || 250;\n\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n func.apply(this, args);\n }, timeout);\n };\n },\n\n debounceLeading: function (func, timeout) {\n timeout = timeout || 250;\n\n let timer;\n return (...args) => {\n if (!timer) {\n func.apply(this, args);\n }\n\n clearTimeout(timer);\n timer = setTimeout(() => {\n timer = undefined;\n }, timeout);\n };\n },\n\n addGlobalEventListener: function (type, selector, callback) {\n document.addEventListener(type, (event) => {\n if (event.target.matches(selector)) callback(event);\n });\n },\n\n getVideoEmbedHtmlFromUrl: function (url) {\n let youTubeMatch = util.youTubeRegex.exec(url);\n let vimeoMatch = util.vimeoRegex.exec(url);\n\n // YouTube\n if (youTubeMatch && youTubeMatch.length >= 2) {\n return (\n ''\n );\n }\n\n // Vimeo\n if (vimeoMatch && vimeoMatch.length >= 2) {\n const dnt = util.hasCookieConsent('analytics') ? 0 : 1;\n\n return (\n ''\n );\n }\n\n return '';\n },\n\n slideUp: function (target, duration, cb) {\n duration = duration || 500;\n\n target.style.transitionProperty = 'height, margin, padding, opacity';\n target.style.transitionDuration = duration + 'ms';\n target.style.boxSizing = 'border-box';\n target.style.height = target.offsetHeight + 'px';\n target.offsetHeight;\n target.style.overflow = 'hidden';\n // target.style.opacity = 0;\n target.style.height = 0;\n target.style.paddingTop = 0;\n target.style.paddingBottom = 0;\n target.style.marginTop = 0;\n target.style.marginBottom = 0;\n\n window.setTimeout(() => {\n target.style.display = 'none';\n target.style.visibility = 'hidden';\n target.style.removeProperty('height');\n target.style.removeProperty('padding-top');\n target.style.removeProperty('padding-bottom');\n target.style.removeProperty('margin-top');\n target.style.removeProperty('margin-bottom');\n target.style.removeProperty('overflow');\n target.style.removeProperty('transition-duration');\n target.style.removeProperty('transition-property');\n target.style.removeProperty('box-sizing');\n target.style.removeProperty('opacity');\n }, duration);\n\n if (typeof cb === 'function') {\n window.setTimeout(cb, duration);\n }\n },\n\n slideDown: function (target, duration, cb) {\n duration = duration || 500;\n\n target.style.removeProperty('display');\n let display = window.getComputedStyle(target).display;\n if (display === 'none') display = 'block';\n target.style.display = display;\n let height = target.offsetHeight;\n target.style.overflow = 'hidden';\n target.style.opacity = 0;\n target.style.height = 0;\n target.style.paddingTop = 0;\n target.style.paddingBottom = 0;\n target.style.marginTop = 0;\n target.style.marginBottom = 0;\n target.offsetHeight;\n target.style.boxSizing = 'border-box';\n target.style.transitionProperty = 'height, margin, padding, opacity';\n target.style.transitionDuration = duration + 'ms';\n target.style.height = height + 'px';\n target.style.removeProperty('padding-top');\n target.style.removeProperty('padding-bottom');\n target.style.removeProperty('margin-top');\n target.style.removeProperty('margin-bottom');\n target.style.opacity = 1;\n target.style.visibility = 'visible';\n\n window.setTimeout(() => {\n target.style.removeProperty('height');\n target.style.removeProperty('overflow');\n target.style.removeProperty('transition-duration');\n target.style.removeProperty('transition-property');\n }, duration);\n\n if (typeof cb === 'function') {\n window.setTimeout(cb, duration);\n }\n },\n\n slideToggle: function (target, duration, cb) {\n duration = duration || 500;\n\n if (window.getComputedStyle(target).display === 'none') {\n return slideDown(target, duration, cb);\n } else {\n return slideUp(target, duration, cb);\n }\n },\n\n areEqualArrays: function (first, second) {\n if (first.length !== second.length) {\n return false;\n }\n for (let i = 0; i < first.length; i++) {\n if (second.includes(first[i]) === false) {\n return false;\n }\n }\n return true;\n },\n\n scrollContainerTo: function (container, target, offset) {\n if (container.contains(target)) {\n offset = typeof offset === 'number' ? offset : 0;\n container.scrollTo({\n top: target.offsetTop - offset,\n behavior: 'smooth',\n });\n } else {\n throw 'scrollContainerTo Error: target not found in container';\n }\n },\n\n isKeyboardEvent: function (event) {\n return event instanceof KeyboardEvent || (event.clientX === 0 && event.clientY === 0);\n },\n\n isVisible: function (element) {\n // Check if the element itself or any parent is `display: none` or `visibility: hidden`\n if (!element || element.offsetParent === null || window.getComputedStyle(element).visibility === 'hidden') {\n return false;\n }\n\n // Check if the element's width or height is zero\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n return false;\n }\n\n return true;\n },\n\n isFocusable: function (element) {\n const focusableTags = ['A', 'BUTTON', 'INPUT', 'TEXTAREA', 'SELECT'];\n\n // Check if the tag itself is known to be clickable\n if (focusableTags.includes(element.tagName) && this.isVisible(element) && !element.disabled) {\n return true;\n }\n\n // Check if it has an event listener like \"onclick\"\n return (\n typeof element.onclick === 'function' ||\n element.hasAttribute('onclick') ||\n element.getAttribute('role') === 'button'\n );\n },\n\n firstFocusable: function (parent) {\n parent = parent || document.body;\n const allElements = parent.querySelectorAll('*:not(.skipLink)');\n return Array.from(allElements).find((element) => util.isFocusable(element));\n },\n\n hasCookieConsent: function (category) {\n return util.getCookie('cookieconsent_' + category) === 'accepted';\n },\n\n updateCookieConsent: function (category) {\n if (typeof ccPopup !== 'undefined') {\n ccPopup.acceptCategory(category);\n }\n },\n\n /**\n * Get all ancestor class names of an element\n * @param {HTMLElement} element\n * @returns {string[]}\n */\n getAncestorClassNames: function (element) {\n let classNames = new Set();\n\n while (element) {\n if (element.className && typeof element.className === 'string') {\n element.className.split(/\\s+/).forEach((cls) => classNames.add(cls));\n }\n\n element = element.parentElement;\n }\n\n return Array.from(classNames);\n },\n};\n\n/* ========================================================================\n Use module pattern to encapsulate JavaScript: http://bit.ly/2jM4ptd\n Define custom namespace\n ========================================================================== */\n\nvar app = app || {};\n","(function () {\n 'use strict';\n\n function LoadingOverlay(target, timeout, opts) {\n // Set default values\n target = target || document.querySelector('body');\n timeout = timeout || 0;\n\n opts = opts || {};\n\n let defaults = {\n onClose: function () {},\n };\n\n opts = util.deepExtend(defaults, opts);\n\n // Check if target is selector or element\n let targetElement;\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n } else {\n targetElement = target;\n }\n\n // Save target's position style\n let targetPositionStyle = targetElement.style.position;\n\n // Set target's position style to relative if needed\n if (getStyle(targetElement, 'position') === 'static') {\n targetElement.style.position = 'relative';\n }\n\n // Create overlay\n const overlay = document.createElement('div');\n overlay.classList.add('loadingOverlay');\n\n // Set overlay height\n if (targetElement.tagName === 'BODY') {\n overlay.style.position = 'fixed';\n overlay.style.height = 'var(--app-height)';\n overlay.style.minHeight = '100vh';\n } else {\n overlay.style.position = 'absolute';\n overlay.style.height = '100%';\n }\n\n // Create overlay icon\n const overlayIcon = document.createElement('div');\n overlayIcon.classList.add('loadingOverlay__icon');\n overlayIcon.innerHTML =\n '';\n\n // Add icon to overlay\n overlay.appendChild(overlayIcon);\n\n // Add overlay to target element\n targetElement.classList.add('loadingOverlay__container');\n targetElement.appendChild(overlay);\n\n // Auto-close overlay if timeout has been set\n if (timeout > 0) {\n window.setTimeout(() => {\n close();\n }, timeout);\n }\n\n function close() {\n targetElement.classList.remove('loadingOverlay__container');\n targetElement.removeChild(overlay);\n opts.onClose();\n\n if (targetPositionStyle === '') {\n targetElement.style.position = targetPositionStyle;\n } else {\n targetElement.style.removeProperty('position');\n }\n }\n\n function getStyle(element, styleProperty) {\n if (element.currentStyle) {\n return element.currentStyle[styleProperty];\n } else if (window.getComputedStyle) {\n return document.defaultView\n .getComputedStyle(element, null)\n .getPropertyValue(styleProperty);\n } else {\n return null;\n }\n }\n\n return {\n close: close,\n };\n }\n\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n module.exports = LoadingOverlay;\n } else {\n window.LoadingOverlay = LoadingOverlay;\n }\n})();\n","(function () {\n 'use strict';\n\n function Toast(message, status, timeout, opts) {\n // Set default values\n message = message || '';\n status = status || 'info';\n timeout = timeout || 5000;\n\n opts = opts || {};\n\n let defaults = {\n onClose: function () {},\n closeLabel: 'Close notification',\n };\n\n opts = util.deepExtend(defaults, opts);\n\n // Used to determine whether to remove setTimeout or not\n let toastTimeout;\n\n // Create alert element\n const toast = document.createElement('div');\n toast.classList.add('toast__item');\n\n // Attach correct colour to alert\n toast.classList.add('is-' + status);\n\n // Create close button\n const closeButton = document.createElement('a');\n closeButton.classList.add('toast__close');\n closeButton.setAttribute('aria-label', opts.closeLabel);\n closeButton.href = '#';\n closeButton.innerHTML =\n '';\n\n // Add message and close button\n const toastMessage = document.createElement('div');\n toastMessage.classList.add('toast__message');\n toastMessage.innerHTML = message;\n\n toast.appendChild(closeButton);\n toast.appendChild(toastMessage);\n\n // Event listeners\n closeButton.addEventListener('click', (e) => {\n e.preventDefault();\n close();\n });\n\n toast.addEventListener('mouseover', () => {\n if (toast.classList.contains('is-fade-out') === false)\n clearTimeout(toastTimeout);\n });\n\n toast.addEventListener('mouseout', () => {\n toastTimeout = window.setTimeout(() => {\n close();\n }, 3000);\n });\n\n // Prepend new alert to container\n let toastContainer = document.querySelector('.toast__container');\n let toastWrapper = document.querySelector('.toast__wrapper');\n\n // Create container if it doesn't exist\n if (!toastContainer) {\n toastContainer = document.createElement('div');\n toastContainer.classList.add('toast__container');\n\n toastWrapper = document.createElement('div');\n toastWrapper.classList.add('toast__wrapper');\n\n toastContainer.appendChild(toastWrapper);\n document.querySelector('body').appendChild(toastContainer);\n }\n\n toastWrapper.insertBefore(toast, toastWrapper.children[0]);\n\n // If they haven't clicked close within the timeout period, fade out and remove element\n toastTimeout = window.setTimeout(() => {\n close();\n }, timeout);\n\n function close() {\n if (toast.parentNode) {\n toast.classList.add('is-fade-out');\n toastTimeout = window.setTimeout(() => {\n toast.parentNode.removeChild(toast);\n opts.onClose();\n }, 500);\n }\n }\n\n return {\n close: close,\n };\n }\n\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n module.exports = Toast;\n } else {\n window.Toast = Toast;\n }\n})();\n","/* ========================================================================\n Cookie popup\n ========================================================================== */\n\nlet ccConfig = null;\nlet ccContainer = null;\n\napp.cookiePopup = (function () {\n 'use strict';\n\n function initConfig() {\n ccConfig = {\n showConsoleLog: true,\n enableDataLayerEvents: true,\n position: 'bottom-left',\n theme: 'custom',\n cookie: {\n name: 'cookieconsent_status_v3',\n },\n content: {\n infoLinkHref: ccContainer.dataset.infoLinkHref,\n infoLinkTarget: '_blank',\n },\n // blacklistPage: ['/cookieverklaring/'],\n\n onInitialise: function (state, status) {},\n onStatusChange: function (state, status, chosenBefore) {\n // DATALAYER\n app.dataLayer.pushEvent('cookieConsent', {\n consent: state.grantedCategories.join(),\n });\n },\n onPopupOpen: function (state, status) {},\n onPopupClose: function (state) {},\n };\n }\n\n function loadPopupScript() {\n let js = document.createElement('script');\n js.id = 'ccPopupScript';\n js.defer = 'true';\n js.src = ccContainer.dataset.src;\n\n ccContainer.after(js);\n ccContainer.remove();\n }\n\n function open() {\n if (typeof ccPopup !== 'undefined') {\n ccPopup.open();\n }\n }\n\n function init() {\n ccContainer = document.getElementById('ccPopup');\n\n if (!ccContainer) {\n console.log('Cookie popup: container is missing!');\n return;\n }\n\n initConfig();\n loadPopupScript();\n }\n\n // Expose public functions and variables\n return {\n init: init,\n open: open,\n };\n})();\n","/* ========================================================================\n Data Layer (GTM)\n ========================================================================== */\n\napp.dataLayer = (function () {\n 'use strict';\n\n window.dataLayer = window.dataLayer || [];\n\n const init = function () {\n const gtmElements = document.querySelectorAll('[data-gtm-event]');\n\n gtmElements.forEach((element) => {\n element.addEventListener('click', (event) => {\n let eventName = element.dataset.gtmEvent\n ? element.dataset.gtmEvent\n : '';\n\n if (eventName === '') return;\n let args = {};\n\n args['pageUrl'] = window.location.pathname;\n args['destinationUrl'] = element.getAttribute('href');\n\n if (element.dataset.pagePart) {\n args['pagePart'] = element.dataset.pagePart;\n }\n\n pushEvent(eventName, args);\n });\n });\n\n //\n // Handle tel: links\n //\n\n const telElements = document.querySelectorAll('[href^=\"tel:\"]');\n\n telElements.forEach((element) => {\n // Check if element already has a custom event\n if (typeof element.dataset.gtmEvent !== 'undefined') return;\n\n element.addEventListener('click', (event) => {\n let args = {};\n\n args['pageUrl'] = window.location.pathname;\n args['contact'] = element.getAttribute('href');\n\n if (element.dataset.pagePart) {\n args['pagePart'] = element.dataset.pagePart;\n }\n\n pushEvent('phoneNumberClick', args);\n });\n });\n\n //\n // Handle mailto: links\n //\n\n const mailtoElements = document.querySelectorAll(\n '[href^=\"mailto:\"], [data-email]'\n );\n\n mailtoElements.forEach((element) => {\n // Check if element already has a custom event\n if (typeof element.dataset.gtmEvent !== 'undefined') return;\n\n element.addEventListener('click', (event) => {\n let args = {};\n let email = '';\n\n if (typeof element.dataset.email !== 'undefined') {\n email = 'mailto:' + atob(element.getAttribute('data-email'));\n } else {\n email = element.getAttribute('href');\n }\n\n args['pageUrl'] = window.location.pathname;\n args['contact'] = email;\n\n if (element.dataset.pagePart) {\n args['pagePart'] = element.dataset.pagePart;\n }\n\n pushEvent('emailClick', args);\n });\n });\n\n //\n // Handle search keywords\n //\n\n const searchResults = document.querySelector('[data-search-keywords]');\n if (searchResults) {\n pushEvent('search', {\n keywords: searchResults.dataset.searchKeywords,\n });\n }\n };\n\n const pushEvent = function (eventName, args) {\n if (eventName === '') return;\n\n args = args || {};\n\n let gtmEvent = { event: eventName };\n\n for (const key in args) {\n if (args.hasOwnProperty(key)) {\n gtmEvent[key] = args[key];\n }\n }\n\n // DATALAYER\n window.dataLayer.push(gtmEvent);\n\n if (util.debugMode) console.log(gtmEvent);\n };\n\n // Expose public functions and variables\n return {\n init: init,\n pushEvent: pushEvent,\n };\n})();\n","/* ========================================================================\n General\n ========================================================================== */\n\napp.general = (function () {\n 'use strict';\n\n function initEmailLinks() {\n // Handle base-64 encoded mailto-links\n const links = document.querySelectorAll('a[data-email]');\n\n links.forEach((link) => {\n link.addEventListener('click', (event) => {\n event.preventDefault();\n let email = atob(link.getAttribute('data-email'));\n window.location.href = 'mailto:' + email;\n });\n });\n }\n\n // function initLax() {\n // lax.init();\n\n // // Add a driver that we use to control our animations\n // lax.addDriver('scrollY', function () {\n // return window.scrollY;\n // });\n\n // lax.addElements('[data-lax]]', {\n // scrollY: {\n // translateY: [\n // ['elInY', 'elOutY'],\n // [0, -250],\n // ],\n // },\n // });\n // }\n\n const updateAppHeight = util.debounce(() => {\n document.documentElement.style.setProperty(\n '--app-height',\n window.innerHeight + 'px'\n );\n }, 250);\n\n function initAppHeight() {\n // Init app height\n updateAppHeight();\n\n // Handle app height on resize\n window.addEventListener(\n 'resize',\n () => {\n updateAppHeight();\n },\n { passive: true }\n );\n }\n\n // let isTouch = false;\n // let isTouchTimer;\n // const isTouchClass = 'is-touch';\n\n // function addTouchClass() {\n // window.clearTimeout(isTouchTimer);\n // if (isTouch === true) return;\n\n // isTouchTimer = window.setTimeout(() => {\n // document.documentElement.classList.add(isTouchClass);\n // isTouch = true;\n // }, 250);\n // }\n\n // function removeTouchClass() {\n // if (isTouch === false) return;\n\n // document.documentElement.classList.remove(isTouchClass);\n // isTouch = false;\n // }\n\n // function initTouch() {\n // document.addEventListener('touchstart', addTouchClass, { passive: true });\n // document.addEventListener('mouseup', removeTouchClass);\n // }\n\n function initAnchorLinks() {\n const links = document.querySelectorAll('a[href^=\"#\"]');\n\n links.forEach((link) => {\n const href = link.getAttribute('href');\n if (href === '#') return;\n\n const target = document.querySelector(href);\n if (!target) return;\n\n link.addEventListener('click', (event) => {\n event.preventDefault();\n scrollToTarget(target);\n });\n });\n\n // var gotoQs = util.getQueryString('goto');\n // if (gotoQs) {\n // const target = document.querySelector('#' + gotoQs);\n // if (!target) return;\n\n // setTimeout(() => {\n // scrollToTarget(target);\n // }, 500);\n // }\n }\n\n function scrollToTarget(target) {\n const offset = 100;\n const top = target.getBoundingClientRect().top + window.scrollY;\n\n window.scrollTo({\n top: top - offset,\n behavior: 'smooth',\n });\n }\n\n // Expose public functions and variables\n return {\n initEmailLinks: initEmailLinks,\n // initLax: initLax,\n initAppHeight: initAppHeight,\n updateAppHeight: updateAppHeight,\n // initTouch: initTouch,\n initAnchorLinks: initAnchorLinks,\n };\n})();\n","/* ========================================================================\n Navigation\n ========================================================================== */\n\napp.navigation = (function () {\n 'use strict';\n\n const KEY_ESCAPE = 'Escape';\n\n const _mediaQueryIsMobile = window.matchMedia('(max-width: 1199.98px)');\n const _mainNav = document.querySelector('[data-main-nav]');\n const _megaMenu = document.querySelector('[data-mega-menu]');\n const _megaMenuTriggers = document.querySelectorAll('[data-mega-menu-trigger]');\n const _megaMenuContainers = document.querySelectorAll('[data-mega-menu-container]');\n let _clickedTrigger = null;\n let _openMenuId = null;\n\n function init() {\n initStickyNav();\n initMegaMenu();\n initLangSwitch();\n }\n\n //\n // Sticky navigation\n //\n\n function initStickyNav() {\n window.addEventListener('scroll', () => {\n // Using requestAnimationFrame inside the scroll event prevents\n // performance issues caused by excessive event firing.\n requestAnimationFrame(() => {\n var offset = _mediaQueryIsMobile.matches ? 0 : 50;\n _mainNav.dataset.sticky = window.scrollY >= offset;\n });\n });\n }\n\n //\n // Mega menu\n //\n\n function openMegaMenu(container, trigger) {\n container.removeAttribute('hidden');\n trigger.setAttribute('aria-expanded', true);\n trigger.setAttribute('aria-label', trigger.dataset.closeText);\n }\n\n function closeMegaMenu(container, trigger) {\n container.setAttribute('hidden', 'hidden');\n trigger.setAttribute('aria-expanded', false);\n trigger.setAttribute('aria-label', trigger.dataset.openText);\n }\n\n function closeAllMegaMenus() {\n // Close all mega menus\n _megaMenuContainers.forEach((container) => {\n container.setAttribute('hidden', 'hidden');\n });\n\n // Reset all triggers\n _megaMenuTriggers.forEach((trigger) => {\n trigger.setAttribute('aria-expanded', false);\n trigger.setAttribute('aria-label', trigger.dataset.closeText);\n });\n\n // Switch focus back to the clicked trigger\n if (_clickedTrigger) {\n _clickedTrigger.focus();\n _clickedTrigger = null;\n }\n\n _openMenuId = null;\n }\n\n function triggerClickHandler(event) {\n event.preventDefault();\n\n // Get the ID of the clicked trigger\n const menuId = event.target.getAttribute('aria-controls');\n\n // Close all other mega menus\n if (_openMenuId && _openMenuId !== menuId) closeAllMegaMenus();\n\n // Store the clicked trigger to focus on it later\n _clickedTrigger = util.isKeyboardEvent(event) ? event.target : null;\n\n // Find the corresponding container\n const container = Array.from(_megaMenuContainers).find((container) => {\n return container.id === menuId;\n });\n\n if (!container) return;\n\n // Toggle the mega menu based on its current state\n if (event.target.getAttribute('aria-expanded') === 'true') {\n closeMegaMenu(container, event.target);\n _openMenuId = null;\n } else {\n openMegaMenu(container, event.target);\n _openMenuId = menuId;\n\n // DATALAYER\n app.dataLayer.pushEvent('primaireNavClick', {\n pageUrl: window.location.pathname,\n destinationUrl: 'Open menu: ' + event.target.dataset.title,\n });\n }\n }\n\n function keyboardHandler(event) {\n if (event.code === KEY_ESCAPE) {\n closeAllMegaMenus();\n }\n }\n\n function initMegaMenu() {\n if (!_megaMenu) return;\n\n // Add event listeners to mega menu triggers\n _megaMenuTriggers.forEach((trigger) => {\n trigger.addEventListener('click', triggerClickHandler);\n });\n\n // Add event listeners to the mega menu (ESC key)\n _megaMenu.addEventListener('keydown', keyboardHandler);\n\n // Close mega menu when clicking outside\n document.addEventListener('click', (event) => {\n if (util.getAncestorClassNames(event.target).includes('navMain') === false) {\n closeAllMegaMenus();\n }\n });\n }\n\n //\n // Handle submenus on window resize\n // Close all submenus on mobile\n //\n\n function onWindowResize() {\n if (_mediaQueryIsMobile.matches) {\n closeAllMegaMenus();\n }\n }\n\n _mediaQueryIsMobile.addEventListener('change', onWindowResize);\n onWindowResize();\n\n //\n // Language switch\n //\n\n const _langTrigger = document.querySelector('[data-lang-switch-trigger]');\n const _langClose = document.querySelector('[data-lang-switch-close]');\n const _langContainer = document.querySelector('[data-lang-switch-container]');\n\n function initLangSwitch() {\n if (!_langTrigger || !_langContainer) return;\n\n _langTrigger.addEventListener('click', (event) => {\n event.preventDefault();\n\n if (_langTrigger.getAttribute('aria-expanded') === 'false') {\n openLangSwitch();\n } else {\n closeLangSwitch(false);\n }\n });\n\n _langClose.addEventListener('click', (event) => {\n event.preventDefault();\n closeLangSwitch(false);\n });\n\n document.addEventListener('click', (event) => {\n const classNames = event.target.getAttribute('class');\n\n if (classNames !== null && classNames.indexOf('langSwitch') === -1) {\n closeLangSwitch(false);\n }\n });\n\n _langContainer.addEventListener('keydown', (event) => {\n if (event.code === KEY_ESCAPE) {\n closeLangSwitch(true);\n }\n });\n }\n\n function openLangSwitch() {\n _langContainer.classList.add('is-open');\n _langContainer.style.visibility = 'visible';\n\n // a11y: update aria attributes\n _langTrigger.setAttribute('aria-label', _langTrigger.dataset.closeText);\n _langTrigger.setAttribute('aria-expanded', true);\n }\n\n function closeLangSwitch(setFocus) {\n setFocus = setFocus || false;\n _langContainer.classList.remove('is-open');\n\n // a11y: switch focus back to trigger\n if (setFocus) _langTrigger.focus();\n\n // a11y: update aria attributes\n _langTrigger.setAttribute('aria-label', _langTrigger.dataset.openText);\n _langTrigger.setAttribute('aria-expanded', false);\n\n window.setTimeout(() => {\n _langContainer.style.visibility = 'hidden';\n }, 500);\n }\n\n // Expose public functions and variables\n return {\n init: init,\n };\n})();\n","/* ========================================================================\r\n Mobile navigation\r\n ========================================================================== */\r\n\r\napp.navMobile = (function () {\r\n 'use strict';\r\n\r\n const _toggles = document.querySelectorAll('[data-mobile-subnav-toggle]');\r\n const _containers = document.querySelectorAll('[data-mobile-subnav-container]');\r\n\r\n function init() {\r\n initSubmenus();\r\n initMenu();\r\n }\r\n\r\n function openSubmenu(container, toggle) {\r\n container.style.opacity = 1;\r\n util.slideDown(container, 250);\r\n toggle.setAttribute('aria-expanded', true);\r\n }\r\n\r\n function closeSubmenu(container, toggle) {\r\n container.style.opacity = 0;\r\n util.slideUp(container, 250);\r\n toggle.setAttribute('aria-expanded', false);\r\n }\r\n\r\n function toggleClickHandler(event) {\r\n event.preventDefault();\r\n\r\n // Get the ID of the clicked toggle\r\n const menuId = event.target.getAttribute('aria-controls');\r\n\r\n // Find the corresponding container\r\n const container = Array.from(_containers).find((container) => {\r\n return container.id === menuId;\r\n });\r\n\r\n if (!container) return;\r\n\r\n // Toggle the mega menu based on its current state\r\n if (event.target.getAttribute('aria-expanded') === 'true') {\r\n closeSubmenu(container, event.target);\r\n } else {\r\n openSubmenu(container, event.target);\r\n\r\n // DATALAYER\r\n app.dataLayer.pushEvent('primaireNavClick', {\r\n pageUrl: window.location.pathname,\r\n destinationUrl: 'Open menu: ' + event.target.dataset.title,\r\n });\r\n }\r\n }\r\n\r\n function initSubmenus() {\r\n if (!_toggles || !_containers) return;\r\n\r\n // Add event listeners to triggers\r\n _toggles.forEach((toggle) => {\r\n toggle.addEventListener('click', toggleClickHandler);\r\n });\r\n }\r\n\r\n function initMenu() {\r\n const trigger = document.querySelector('[data-mobile-nav-trigger]');\r\n const container = document.querySelector('[data-mobile-nav-container]');\r\n\r\n if (!trigger || !container) return;\r\n\r\n trigger.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n\r\n if (trigger.getAttribute('aria-expanded') === 'true') {\r\n container.classList.remove('is-open');\r\n trigger.setAttribute('aria-expanded', false);\r\n } else {\r\n container.classList.add('is-open');\r\n trigger.setAttribute('aria-expanded', true);\r\n }\r\n });\r\n }\r\n\r\n // Expose public functions and variables\r\n return {\r\n init: init,\r\n };\r\n})();\r\n","/* ========================================================================\n On document ready do stuff\n ========================================================================== */\n\nutil.onDocumentReady(function () {\n const body = document.getElementById('body');\n\n // Set frontend version\n util.frontEndVersion = body.dataset.version;\n\n // Set debug mode\n util.debugMode = body.dataset.debugMode === 'true';\n\n // Set culture\n util.uiCulture = body.dataset.culture;\n\n // Set language\n util.uiLanguage = util.uiCulture ? util.uiCulture.split('-')[0] : null;\n\n // Set homepage Id\n util.homePageId = body.dataset.homepageId;\n\n // Set path\n util.path = body.dataset.path;\n\n if (util.debugMode) {\n console.info(util.uiCulture, util.uiLanguage, util.homePageId, util.path);\n if (!util.uiCulture) console.error('Culture is not set');\n if (!util.uiLanguage) console.error('Language is not set');\n if (!util.homePageId) console.error('HomePageId is not set');\n if (!util.path) console.error('Path is not set');\n }\n\n // Enable transitions\n document.documentElement.classList.remove('is-loading');\n\n // Enable SVG in IE11\n // svg4everybody();\n\n app.general.initAppHeight();\n // app.general.initAnchorLinks();\n app.navigation.init();\n app.navMobile.init();\n // app.navigation.initSearchBox();\n app.general.initEmailLinks();\n // app.general.initLax();\n app.cookiePopup.init();\n app.dataLayer.init();\n\n const min = util.debugMode === false ? '.min' : '';\n\n if (document.querySelectorAll('[data-toast-message]').length > 0) {\n // show toast messages (with delay)\n const toastMessages = document.querySelectorAll('[data-toast-message]');\n toastMessages.forEach((message, index) => {\n window.setTimeout(() => {\n Toast(message.innerHTML, message.dataset.toastType.toLowerCase(), message.dataset.toastTimeout ?? 7500);\n }, index * 1000);\n });\n }\n\n if (document.querySelectorAll('[data-accordion-list]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.accordion' + min + '.js'), () => {\n app.accordion.init();\n });\n }\n\n if (\n document.querySelectorAll('[data-carousel]').length > 0 ||\n document.querySelectorAll('[data-hero-carousel]').length > 0 ||\n document.querySelectorAll('[data-logo-carousel]').length > 0 ||\n document.querySelectorAll('[data-tabs-carousel]').length > 0\n ) {\n ljs.load(\n util.getVersionedUrl('/scripts/dist/embla' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/embla-carousel-autoplay' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/modules.carousel' + min + '.js'),\n () => {\n app.carousel.init();\n }\n );\n }\n\n if (document.querySelectorAll('[data-video]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.videos' + min + '.js'), () => {\n app.videos.init();\n });\n }\n\n if (document.querySelectorAll('[data-video-lightbox]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/videoLightbox' + min + '.js'), () => {\n const videos = document.querySelectorAll('[data-video-lightbox]');\n const lightbox = VideoLightbox(videos);\n\n document.addEventListener('cookieconsent_update', () => {\n if (util.hasCookieConsent('marketing')) {\n lightbox.removeConsentWarning();\n }\n });\n });\n }\n\n if (document.querySelector('.searchResults')) {\n if (document.location.href.indexOf('?') > -1) {\n setTimeout(() => {\n document.querySelector('[data-results-anchor]').scrollIntoView({\n behavior: 'smooth',\n });\n }, 500);\n }\n }\n\n if (document.querySelectorAll('[data-info-block]').length > 0) {\n ljs.load(\n util.getVersionedUrl('/scripts/dist/matchheight' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/modules.infoBlocks' + min + '.js'),\n () => {\n app.infoBlocks.init();\n }\n );\n }\n\n if (document.querySelectorAll('[data-info-grid]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.infoBlocksGrid' + min + '.js'), () => {\n app.infoBlocksGrid.init();\n });\n }\n\n ljs.load(util.getVersionedUrl('/scripts/dist/forms.newsletter' + min + '.js'), () => {\n // Load aspnet-validation if not loaded yet\n // Use a delay to make sure it doesn't conflict with Umbraco Forms' version of aspnet-validation\n window.setTimeout(() => {\n if (typeof window.aspnetValidation !== 'object') {\n ljs.load(\n '/scripts/dist/aspnet-validation.min.js',\n util.getVersionedUrl('/scripts/dist/forms.validation.min.js'),\n () => {}\n );\n }\n }, 2000);\n });\n\n if (document.querySelectorAll('[data-project-listing]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.projectListing' + min + '.js'), () => {\n app.projectListing.init();\n });\n }\n\n if (document.querySelectorAll('[data-partners]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.partnerListing' + min + '.js'), () => {\n app.partnerListing.init();\n });\n }\n\n if (document.querySelectorAll('[data-generic-form]').length > 0) {\n ljs.load(\n util.getVersionedUrl('/scripts/dist/aspnet-validation' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/forms.validation' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/forms.generic' + min + '.js'),\n () => {\n app.genericForm.init();\n }\n );\n }\n\n if (document.querySelectorAll('[data-popup]').length > 0) {\n ljs.load(util.getVersionedUrl('/scripts/dist/modules.popup' + min + '.js'), () => {\n app.popup.init();\n });\n }\n\n if (document.querySelectorAll('[data-sticky-element]').length > 0) {\n ljs.load(\n util.getVersionedUrl('/scripts/dist/sticky.compile' + min + '.js'),\n util.getVersionedUrl('/scripts/dist/modules.stickyElements' + min + '.js'),\n () => {\n // var sticky = new Sticky('[data-sticky-element]');\n app.stickyElements.init();\n }\n );\n }\n});\n"]}