{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"jQuery\"","webpack:///./src/assets/src/common/js/utilities.js","webpack:///./src/assets/src/frontend/js/course-dashboard.js","webpack:///./src/assets/src/frontend/js/course-timer.js","webpack:///./src/assets/src/frontend/js/lazy-course-navigation.js","webpack:///./src/assets/src/frontend/index.js","webpack:///./node_modules/css-element-queries/src/ElementQueries.js","webpack:///./node_modules/css-element-queries/src/ResizeSensor.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","jQuery","restCall","endPoint","data","onSuccess","onFail","validEndpoints","includes","$","ajax","method","url","UncannyToolkitPro","restURL","param","doing_rest","beforeSend","xhr","setRequestHeader","nonce","success","response","isDefined","statusCode","403","location","reload","fail","console","error","variable","isEmpty","isArray","length","isObject","keys","ElementQueries","require","CourseDashboard","this","hasDashboard","init","getElements","defineSettings","createCourses","slideAll","filters","$elements","form","selects","settings","slideToggleDuration","$courses","each","index","$element","Course","on","expandAll","collapseAll","courses","container","toggle","lessons","topics","quizzes","elementType","$containers","find","trigger","$container","dashboardSettings","defineCssClasses","getCourseData","toggleCourseContent","createLessons","createQuizzes","courseData","courseId","status","hasLessons","parseInt","hasQuizzes","hasCertificate","cssClasses","collapsed","collapsing","expanding","expanded","allToggle","map","item","join","toggleBtn","content","isCollapsed","setToggleClass","hide","slideDown","show","slideUp","$lessons","Lesson","$quizzesContainers","Quizzes","removeClass","addClass","hasClass","getLessonData","toggleLessonContent","createTopics","lessonData","course","lessonId","availableOn","isCompleted","isAvailable","hasTopics","$topics","Topic","getTopicData","toggleTopicContent","topicData","lesson","topicId","log","toggleQuizzesContent","createIndividualQuizzes","individual","$quizzes","Quiz","getQuizData","openStatistics","quizData","quizId","passed","statistics","btn","event","preventDefault","CourseTimer","isCourseTimerEnabled","isLearnDashPost","setSettings","listenActivityInsideIframePageLoad","e","listenNewIframes","iframes","document","querySelectorAll","events","eventSettings","bubbles","cancelable","detail","forEach","iframe","listenActivityInIframe","eventName","contentWindow","addEventListener","triggerEvent","MutationObserver","mutations","mutation","addedNodes","node","nodeName","observe","body","childList","subtree","attributeFilter","createEvent","initCustomEvent","dispatchEvent","window","uoTimer","querySelector","LazyCourseNavigation","isLazyCourseNavigation","getCourseNavigation","courseNavigation","setCourseNavigation","callback","course_id","UncannyToolkitProLazyCourseNavigation","lesson_id","topic_id","html","ResizeSensor","cssStyleElement","allQueries","idToSelectorMapping","getEmSize","element","documentElement","fontSize","getComputedStyle","parseFloat","convertToPx","numbers","split","units","clientWidth","clientHeight","vw","vh","chooser","Math","SetupInformation","id","option","elementSize","actualValue","attrValues","attrValue","attrName","attributes","getBoundingClientRect","width","offsetWidth","height","offsetHeight","rect","round","getElementSize","indexOf","k","setAttribute","substr","removeAttribute","setupElement","elementQueriesSetupInformation","elementQueriesSensor","queueQuery","selector","innerHTML","push","getQuery","query","$$","attachResponsiveImage","children","rules","sources","defaultImageId","lastActiveImage","loadedImages","tagName","toLowerCase","minWidth","getAttribute","src","rule","style","display","check","imageToDisplay","image","Image","onload","resizeSensorInstance","regex","attrRegex","extractQuery","css","match","smatch","attrs","attrMatch","replace","exec","readRules","j","type","selectorText","cssText","cssRules","styleSheet","defaultCssInjected","animationStart","target","styles","animationName","getPropertyValue","resizeSensor","createElement","getElementsByTagName","appendChild","styleSheets","href","warn","elements","findResponsiveImages","findElementQueriesElements","update","instance","detach","listen","test","navigator","userAgent","DOMLoadTimer","setInterval","readyState","clearInterval","domLoaded","globalWindow","self","Function","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","fn","setTimeout","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","timer","clearTimeout","forEachElement","elementsType","toString","isCollectionTyped","Elements","setStyle","lastAnimationFrameForInvisibleCheck","EventQueue","q","add","ev","sizeInfo","remove","newQueue","attachResizeEvent","resized","resizedAttached","dir","className","pointerEvents","position","left","top","right","bottom","overflow","zIndex","visibility","maxWidth","styleChild","transition","expand","expandChild","shrink","shrinkChild","computedStyle","dirty","rafId","size","lastWidth","lastHeight","initialHiddenCheck","reset","scrollLeft","scrollTop","resetSensor","onResized","onScroll","addEvent","el","cb","attachEvent","elem","contains","removeChild","observer","items"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,I,gBClFrDhC,EAAOD,QAAUkC,Q,4XCaV,SAASC,IAAyE,IAA/DC,EAA+D,uDAApD,KAAMC,EAA8C,uDAAvC,KAAMC,EAAiC,uDAArB,KAAMC,EAAe,uDAAN,KAE3EC,EAAiB,CAAE,oBAAqB,mBAAoB,oBAAqB,4BAGhFA,EAAeC,SAAUL,GAE1BM,IAAEC,KAAK,CACHC,OAAQ,OACRC,IAAQC,kBAAkBC,QAAUX,EAAW,IAC/CC,KAAQK,IAAEM,MAAOX,GAAS,IAAMK,IAAEM,MAAM,CAAEC,WAAY,IAGtDC,WAAY,SAAUC,GAClBA,EAAIC,iBAAkB,aAAcN,kBAAkBO,QAG1DC,QAAS,SAAUC,GAEVC,EAAWlB,IAEZA,EAAWiB,IAInBE,WAAY,CACRC,IAAK,WACDC,SAASC,WAIjBC,KAAM,SAAWN,GACRC,EAAWjB,IACZA,EAAQgB,MAMpBO,QAAQC,MAAR,cAAuB3B,EAAvB,8BAWD,IAAMoB,EAAY,SAAEQ,GAEvB,OAAO,MAAOA,GAULC,EAAU,SAAED,GACrB,IAAIT,GAAW,EAgBf,OAbKC,EAAWQ,KAGRT,EADCS,EAASE,QACoB,GAAnBF,EAASG,OAEdC,EAAUJ,GACLpD,OAAOyD,KAAML,GAAWG,OAGZ,IAAZH,GAIZT,GAUEa,EAAW,SAAEJ,GACtB,MAA2B,WAApB,EAAOA,IAAsC,OAAbA,I,sXCvG3C,IAAMM,EAAiBC,EAAS,IAO1BC,E,WACL,aAAa,UAEPC,KAAKC,iBAETJ,EAAeK,OAGfF,KAAKG,cAGLH,KAAKI,iBAGLJ,KAAKK,gBAGLL,KAAKM,WAGLN,KAAKO,W,qCAIP,WACCP,KAAKQ,UAAY,CAChBD,QAAS,CACRE,KAASxC,EAAG,gCACZyC,QAASzC,EAAG,2C,4BAKf,WAEC+B,KAAKW,SAAW,CACfC,oBAAqB,O,2BAIvB,WAAe,WAERC,EAAW5C,EAAG,0BAGpBA,EAAE6C,KAAMD,GAAU,SAAEE,EAAOC,GAE1B,IAAIC,EAAQhD,EAAG+C,GAAY,EAAKL,e,0BAIlC,WACC,OAAO1C,EAAG,2BAA4ByB,OAAS,I,sBAGhD,WAECzB,EAAG,mDAAoDiD,GAAI,SAAS,WACnEC,OAGDlD,EAAG,qDAAsDiD,GAAI,SAAS,WACrEE,OAGD,IAAMD,EAAY,WAqBjBlD,EAAE6C,KAnB0B,CAC3BO,QAAS,CACRC,UAAW,oCACXC,OAAW,sCAEZC,QAAS,CACRF,UAAW,oCACXC,OAAW,sCAEZE,OAAQ,CACPH,UAAW,mCACXC,OAAW,qCAEZG,QAAS,CACRJ,UAAW,qCACXC,OAAW,gDAIgB,SAAER,EAAOY,GAErC,IAAMC,EAAc3D,EAAG0D,EAAYL,WAGnCrD,EAAE6C,KAAMc,GAAa,SAAEb,EAAOO,GAEVrD,EAAGqD,GAGWO,KAAMF,EAAYJ,QAGrCO,QAAS,gBAKpBV,EAAc,WAiBnBnD,EAAE6C,KAfyB,CAC1BO,QAAS,CACRC,UAAW,mCACXC,OAAW,sCAEZC,QAAS,CACRF,UAAW,mCACXC,OAAW,sCAEZG,QAAS,CACRJ,UAAW,oCACXC,OAAW,gDAIe,SAAER,EAAOY,GAEpC,IAAMC,EAAc3D,EAAG0D,EAAYL,WAGnCrD,EAAE6C,KAAMc,GAAa,SAAEb,EAAOO,GAEVrD,EAAGqD,GAGWO,KAAMF,EAAYJ,QAGrCO,QAAS,kB,qBAM3B,WAAS,WAER9B,KAAKQ,UAAUD,QAAQG,QAAQQ,GAAI,UAAU,WAE5C,EAAKV,UAAUD,QAAQE,KAAKqB,QAAS,iB,KAKlCb,E,WACL,WAAac,EAAYpB,GAAU,UAElCX,KAAKgC,kBAAoBrB,EAGzBX,KAAKiC,mBAGLjC,KAAKG,YAAa4B,GAGlB/B,KAAKkC,gBAGLlC,KAAKmC,sBAGLnC,KAAKoC,gBAGLpC,KAAKqC,gB,uCAGN,WACCrC,KAAKsC,WAAa,CACjBC,SAAgBvC,KAAKQ,UAAUc,UAAU1D,KAAM,aAC/C4E,OAAgBxC,KAAKQ,UAAUc,UAAU1D,KAAM,UAC/C6E,aAAmBC,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,gBAC5D+E,aAAmBD,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,gBAC5DgF,iBAAmBF,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,uB,8BAI9D,WAAkB,WACjBoC,KAAK6C,WAAa,CACjBtB,OAAQ,CACPuB,UAAY,mCACZC,WAAY,oCACZC,UAAY,mCACZC,SAAY,oCAIdjD,KAAK6C,WAAWK,UAAY/G,OAAOyD,KAAMI,KAAK6C,WAAWtB,QAAS4B,KAAK,SAAAC,GAAI,OAAI,EAAKP,WAAWtB,OAAQ6B,MAASC,KAAM,O,yBAGvH,SAAatB,GACZ/B,KAAKQ,UAAY,CAChBc,UAAWS,EACXuB,UAAWvB,EAAWF,KAAM,sCAC5B0B,QAAWxB,EAAWF,KAAM,sC,iCAI9B,WAAqB,YAEf7B,KAAKsC,WAAWG,YAAczC,KAAKsC,WAAWK,aAElD3C,KAAKQ,UAAU8C,UAAUpC,GAAI,SAAS,WAEhC,EAAKsC,eAIT,EAAKC,eAAgB,aAGrB,EAAKjD,UAAU+C,QAAQG,OAAOC,UAAW,EAAK3B,kBAAkBpB,qBAAqB,WAEpF,EAAK6C,eAAgB,iBAQtB,EAAKA,eAAgB,cAGrB,EAAKjD,UAAU+C,QAAQK,OAAOC,QAAS,EAAK7B,kBAAkBpB,qBAAqB,WAElF,EAAK6C,eAAgB,sB,2BAO1B,WAAe,WAERK,EAAW9D,KAAKQ,UAAUc,UAAUO,KAAM,0BAGhD5D,EAAE6C,KAAMgD,GAAU,SAAE/C,EAAOC,GAE1B,IAAI+C,EAAQ9F,EAAG+C,GAAY,EAAKgB,kBAAmB,EAAKM,iB,2BAI1D,WAAe,WAER0B,EAAqBhE,KAAKQ,UAAUc,UAAUO,KAAM,2DAG1D5D,EAAE6C,KAAMkD,GAAoB,SAAEjD,EAAOC,GAEpC,IAAIiD,EAAShG,EAAG+C,GAAY,EAAKgB,kBAAmB,EAAKM,iB,4BAI3D,SAAgBE,GAEfxC,KAAKQ,UAAUc,UAAU4C,YAAalE,KAAK6C,WAAWK,WAGtDlD,KAAKQ,UAAUc,UAAU6C,SAAUnE,KAAK6C,WAAWtB,OAAQiB,M,yBAG5D,WAEC,OAAOxC,KAAKQ,UAAUc,UAAU8C,SAAUpE,KAAK6C,WAAWtB,OAAOuB,e,KAI7DiB,E,WACL,WAAahC,EAAYpB,EAAU2B,GAAY,UAE9CtC,KAAKgC,kBAAoBrB,EAEzBX,KAAKsC,WAAaA,EAGlBtC,KAAKiC,mBAGLjC,KAAKG,YAAa4B,GAGlB/B,KAAKqE,gBAGLrE,KAAKsE,sBAGLtE,KAAKuE,eAGLvE,KAAKqC,gB,uCAGN,WACCrC,KAAKwE,WAAa,CACjBC,OAAgBzE,KAAKsC,WACrBoC,SAAgB1E,KAAKQ,UAAUc,UAAU1D,KAAM,aAC/C+G,YAAkBnF,YAASQ,KAAKQ,UAAUc,UAAU1D,KAAM,iBAAmF,KAA9D8E,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,iBACxHgH,cAAmBlC,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,iBAC5DiH,cAAmBnC,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,iBAC5DkH,YAAmBpC,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,eAC5D+E,aAAmBD,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,mB,8BAI9D,WAAkB,WACjBoC,KAAK6C,WAAa,CACjBtB,OAAQ,CACPuB,UAAY,mCACZC,WAAY,oCACZC,UAAY,mCACZC,SAAY,oCAIdjD,KAAK6C,WAAWK,UAAY/G,OAAOyD,KAAMI,KAAK6C,WAAWtB,QAAS4B,KAAK,SAAAC,GAAI,OAAI,EAAKP,WAAWtB,OAAQ6B,MAASC,KAAM,O,yBAGvH,SAAatB,GACZ/B,KAAKQ,UAAY,CAChBc,UAAWS,EACXuB,UAAWvB,EAAWF,KAAM,sCAC5B0B,QAAWxB,EAAWF,KAAM,sC,iCAI9B,WAAqB,YAEf7B,KAAKwE,WAAWM,WAAa9E,KAAKwE,WAAW7B,aAEjD3C,KAAKQ,UAAU8C,UAAUpC,GAAI,SAAS,WAEhC,EAAKsC,eAIT,EAAKC,eAAgB,aAGrB,EAAKjD,UAAU+C,QAAQG,OAAOC,UAAW,EAAK3B,kBAAkBpB,qBAAqB,WAEpF,EAAK6C,eAAgB,iBAQtB,EAAKA,eAAgB,cAGrB,EAAKjD,UAAU+C,QAAQK,OAAOC,QAAS,EAAK7B,kBAAkBpB,qBAAqB,WAElF,EAAK6C,eAAgB,sB,0BAO1B,WAAc,WAEPsB,EAAU/E,KAAKQ,UAAUc,UAAUO,KAAM,yBAG/C5D,EAAE6C,KAAMiE,GAAS,SAAEhE,EAAOC,GAEzB,IAAIgE,EAAO/G,EAAG+C,GAAY,EAAKgB,kBAAmB,EAAKM,WAAY,EAAKkC,iB,2BAI1E,WAAe,WAERR,EAAqBhE,KAAKQ,UAAUc,UAAUO,KAAM,2DAG1D5D,EAAE6C,KAAMkD,GAAoB,SAAEjD,EAAOC,GAEpC,IAAIiD,EAAShG,EAAG+C,GAAY,EAAKgB,kBAAmB,EAAKM,WAAY,EAAKkC,iB,4BAI5E,SAAgBhC,GAEfxC,KAAKQ,UAAUc,UAAU4C,YAAalE,KAAK6C,WAAWK,WAGtDlD,KAAKQ,UAAUc,UAAU6C,SAAUnE,KAAK6C,WAAWtB,OAAQiB,M,yBAG5D,WAEC,OAAOxC,KAAKQ,UAAUc,UAAU8C,SAAUpE,KAAK6C,WAAWtB,OAAOuB,e,KAI7DkC,E,WACL,WAAajD,EAAYpB,EAAU2B,EAAYkC,GAAY,UAE1DxE,KAAKgC,kBAAoBrB,EAEzBX,KAAKsC,WAAaA,EAElBtC,KAAKwE,WAAaA,EAGlBxE,KAAKG,YAAa4B,GAGlB/B,KAAKiC,mBAGLjC,KAAKiF,eAGLjF,KAAKkF,qB,qCAGN,SAAanD,GACZ/B,KAAKQ,UAAY,CAChBc,UAAWS,EACXuB,UAAWvB,EAAWF,KAAM,qCAC5B0B,QAAWxB,EAAWF,KAAM,qC,0BAI9B,WACC7B,KAAKmF,UAAY,CAChBV,OAAgBzE,KAAKsC,WACrB8C,OAAgBpF,KAAKwE,WACrBa,QAAgBrF,KAAKQ,UAAUc,UAAU1D,KAAM,YAC/CgH,cAAmBlC,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,iBAC5D+E,aAAmBD,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,wBAGtDoC,KAAKmF,UAAUC,OAAOX,S,8BAG9B,WAAkB,WACjBzE,KAAK6C,WAAa,CACjBtB,OAAQ,CACPuB,UAAY,kCACZC,WAAY,mCACZC,UAAY,kCACZC,SAAY,mCAIdjD,KAAK6C,WAAWK,UAAY/G,OAAOyD,KAAMI,KAAK6C,WAAWtB,QAAS4B,KAAK,SAAAC,GAAI,OAAI,EAAKP,WAAWtB,OAAQ6B,MAASC,KAAM,O,4BAGvH,SAAgBb,GAEfxC,KAAKQ,UAAUc,UAAU4C,YAAalE,KAAK6C,WAAWK,WAGtDlD,KAAKQ,UAAUc,UAAU6C,SAAUnE,KAAK6C,WAAWtB,OAAQiB,M,gCAG5D,WAAoB,WACnBnD,QAAQiG,IAAKtF,KAAKmF,UAAUxC,YAGvB3C,KAAKmF,UAAUxC,aAEnBtD,QAAQiG,IAAKtF,KAAKQ,UAAU8C,WAG5BtD,KAAKQ,UAAU8C,UAAUpC,GAAI,SAAS,WAEhC,EAAKsC,eAIT,EAAKC,eAAgB,aAGrB,EAAKjD,UAAU+C,QAAQG,OAAOC,UAAW,EAAK3B,kBAAkBpB,qBAAqB,WAEpF,EAAK6C,eAAgB,iBAQtB,EAAKA,eAAgB,cAGrB,EAAKjD,UAAU+C,QAAQK,OAAOC,QAAS,EAAK7B,kBAAkBpB,qBAAqB,WAElF,EAAK6C,eAAgB,uB,yBAO1B,WAEC,OAAOzD,KAAKQ,UAAUc,UAAU8C,SAAUpE,KAAK6C,WAAWtB,OAAOuB,e,KAI7DmB,E,WACL,WAAalC,EAAYpB,EAAU2B,GAAgC,IAApBkC,EAAoB,kEAElExE,KAAKgC,kBAAoBrB,EAEzBX,KAAKsC,WAAoBA,EAEzBtC,KAAKwE,WAAoBA,EAGzBxE,KAAKiC,mBAGLjC,KAAKG,YAAa4B,GAGlB/B,KAAKuF,uBAGLvF,KAAKwF,0B,0CAGN,WAAkB,WACjBxF,KAAK6C,WAAa,CACjB4C,WAAgB,sBAChBlE,OAAQ,CACPuB,UAAY,oCACZC,WAAY,qCACZC,UAAY,oCACZC,SAAY,qCAIdjD,KAAK6C,WAAWK,UAAY/G,OAAOyD,KAAMI,KAAK6C,WAAWtB,QAAS4B,KAAK,SAAAC,GAAI,OAAI,EAAKP,WAAWtB,OAAQ6B,MAASC,KAAM,O,yBAGvH,SAAatB,GACZ/B,KAAKQ,UAAY,CAChBc,UAAWS,EACXuB,UAAWvB,EAAWF,KAAM,8CAC5B0B,QAAWxB,EAAWF,KAAM,oC,kCAI9B,WAAsB,WAErB7B,KAAKQ,UAAU8C,UAAUpC,GAAI,SAAS,WAEhC,EAAKsC,eAIT,EAAKC,eAAgB,aAGrB,EAAKjD,UAAU+C,QAAQG,OAAOC,UAAW,EAAK3B,kBAAkBpB,qBAAqB,WAEpF,EAAK6C,eAAgB,iBAQtB,EAAKA,eAAgB,cAGrB,EAAKjD,UAAU+C,QAAQK,OAAOC,QAAS,EAAK7B,kBAAkBpB,qBAAqB,WAElF,EAAK6C,eAAgB,sB,4BAMzB,SAAgBjB,GAEfxC,KAAKQ,UAAUc,UAAU4C,YAAalE,KAAK6C,WAAWK,WAGtDlD,KAAKQ,UAAUc,UAAU6C,SAAUnE,KAAK6C,WAAWtB,OAAQiB,M,yBAG5D,WAEC,OAAOxC,KAAKQ,UAAUc,UAAU8C,SAAUpE,KAAK6C,WAAWtB,OAAOuB,a,qCAGlE,WAAyB,WAElB4C,EAAW1F,KAAKQ,UAAUc,UAAUO,KAAzB,WAAoC7B,KAAK6C,WAAW4C,aAGrExH,EAAE6C,KAAM4E,GAAU,SAAE3E,EAAOC,GAE1B,IAAI2E,EAAM1H,EAAG+C,GAAY,EAAKgB,kBAAmB,EAAKM,WAAY,EAAKkC,mB,KAKpEmB,E,WACL,WAAa5D,EAAYpB,EAAU2B,GAAgC,IAApBkC,EAAoB,kEAElExE,KAAKgC,kBAAoBrB,EAEzBX,KAAKsC,WAAoBA,EAGzBtC,KAAKwE,WAAoBA,EAGzBxE,KAAKiC,mBAGLjC,KAAKG,YAAa4B,GAGlB/B,KAAK4F,cAGL5F,KAAK6F,iB,qCAGN,WACC7F,KAAK8F,SAAW,CACfrB,OAAazE,KAAKsC,WAClByD,OAAa/F,KAAKQ,UAAUc,UAAU1D,KAAM,WAC5CgH,cAAgBlC,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,iBACzDoI,SAAgBtD,SAAU1C,KAAKQ,UAAUc,UAAU1D,KAAM,YAGrDmB,YAAWiB,KAAKQ,UAAUc,UAAU1D,KAAM,gBAC9CoC,KAAK8F,SAASV,OAASpF,KAAKwE,kBACrBxE,KAAK8F,SAASV,OAAOX,U,8BAI9B,WACCzE,KAAK6C,WAAa,CACjBoD,WAAY,CACXC,IAAS,iCACT3C,QAAS,O,yBAKZ,SAAaxB,GACZ/B,KAAKQ,UAAY,CAChBc,UAAWS,EACXkE,WAAY,CACXC,IAAOnE,EAAWF,KAAX,WAAsB7B,KAAK6C,WAAWoD,WAAWC,U,4BAM3D,WAAgB,WAEflG,KAAKQ,UAAUyF,WAAWC,IAAIhF,GAAI,SAAS,SAAEiF,GAE5CA,EAAMC,iBAGN/G,QAAQiG,IAAK,EAAKQ,iB,KAKN/F,Q,gPC9qBTsG,E,WACL,aAGC,G,4FAHY,SAGPrG,KAAKsG,wBAA0BtG,KAAKuG,kBAAmB,CAE3DvG,KAAKwG,cAGLxG,KAAKG,cAEL,IAECH,KAAKyG,qCAEN,MAAQC,GAAKrH,QAAQiG,IAAKoB,GAE1B,IAEC1G,KAAK2G,mBAEN,MAAQD,GAAKrH,QAAQiG,IAAKoB,K,kDAI5B,WACC1G,KAAKQ,UAAY,CAChBoG,QAASC,SAASC,iBAAkB,wB,yBAItC,WACC9G,KAAKW,SAAW,CACfoG,OAAQ,CACP,YACA,YACA,WACA,SACA,aACA,SAEDC,cAAe,CACdC,SAAY,EACZC,YAAY,EACZC,OAAY,S,gDAKf,WAAoC,WAEnCnH,KAAKQ,UAAUoG,QAAQQ,SAAQ,SAAEC,GAEhC,EAAKC,uBAAwBD,Q,oCAI/B,SAAwBA,GAAQ,WAC/B,IAECpJ,EAAGoJ,GAASnG,GAAI,QAAQ,WAEvB,EAAKP,SAASoG,OAAOK,SAAQ,SAAEG,GAE9B,IACCF,EAAOG,cAAcC,iBACpBF,GACA,SAAApB,GAAK,OAAI,EAAKuB,aAAcL,EAAQE,MAGtC,MAAQb,WAIX,MAAQA,GAAKrH,QAAQiG,IAAKoB,M,8BAI3B,WAAkB,WAEF,IAAIiB,kBAAiB,SAAEC,GAErCA,EAAUR,SAAQ,SAAES,GAEdA,EAASC,WAAWpI,OAAS,GACjCmI,EAASC,WAAWV,SAAQ,SAACW,GAEL,WAAlBA,EAAKC,UAET,EAAKV,uBAAwBS,YAQzBE,QAASpB,SAASqB,KAAM,CAChCC,WAAW,EACXC,SAAW,EACXC,gBAAiB,CAAE,gB,0BAIrB,SAAchB,EAAQE,GAErB,IAAIpB,EAAQU,SAASyB,YAAa,eAClCnC,EAAMoC,gBACLhB,EACAvH,KAAKW,SAASqG,cAAcC,QAC5BjH,KAAKW,SAASqG,cAAcE,WAC5BlH,KAAKW,SAASqG,cAAcG,QAI7BE,EAAOmB,cAAerC,K,kCAGvB,WACC,OAAOpH,YAAW0J,OAAOC,W,6BAG1B,WACC,OAAO3J,YAAW8H,SAAS8B,cAAe,oB,gCAI7BtC,Q,gPC9HTuC,E,WACL,aAAa,Y,4FAAA,SAEZ5I,KAAKG,cAGAH,KAAK6I,0BAET7I,KAAK8I,qBAAoB,SAAEC,GAE1B,EAAKC,oBAAqBD,M,kDAK7B,WAEC/I,KAAKQ,UAAY,CAChBc,UAAWrD,EAAG,mC,iCAIhB,SAAqBgL,GAEpBvL,YAAU,oBAAqB,CAC9BwL,UAAWC,sCAAsCD,UACxCE,UAAWD,sCAAsCC,UACjDC,SAAUF,sCAAsCE,SAChDzK,MAAOuK,sCAAsCvK,QACpD,SAAEE,GAEJmK,EAAUnK,MACR,WAEFO,QAAQC,MAAR,wD,iCAIF,SAAqByJ,GAEpB/I,KAAKQ,UAAUc,UAAU4C,YAAa,wCAGtCjG,EAAE6C,KAAMd,KAAKQ,UAAUc,WAAW,SAAEP,EAAOO,GAEvBrD,EAAGqD,GAGXgI,KAAMP,EAAiBO,W,oCAIpC,WACC,OAAOtJ,KAAKQ,UAAUc,UAAU5B,OAAS,GAAKX,YAAWoK,4C,gCAI5CP,Q,iDC9Df,sCAOA/B,SAASY,iBAAkB,oBAAoB,WAC9C,IAAI1H,IACJ,IAAIsG,IACJ,IAAIuC,Q,gDCVL,sBAgBoB,oBAAXH,QAAyBA,OAP1B,EAAO,CAAC,YAA6B,0BAAP,EAOW,SAAUc,GAOvD,IAAI1J,EAAiB,WAEjB,IAAI2J,EAGAC,EAAa,GAGbC,EAAsB,GAO1B,SAASC,EAAUC,GACVA,IACDA,EAAU/C,SAASgD,iBAEvB,IAAIC,EAAWrB,OAAOsB,iBAAiBH,EAAS,MAAME,SACtD,OAAOE,WAAWF,IAAa,GA+BnC,SAASG,EAAYL,EAASlN,GAC1B,IAAIwN,EAAUxN,EAAMyN,MAAM,MACtBC,EAAQF,EAAQA,EAAQxK,OAAS,GAErC,OADAhD,EAAQsN,WAAWtN,GACX0N,GACJ,IAAK,KACD,OAAO1N,EACX,IAAK,KACD,OAAOA,EAAQiN,EAAUC,GAC7B,IAAK,MACD,OAAOlN,EAAQiN,IAInB,IAAK,KACD,OAAOjN,EAAQmK,SAASgD,gBAAgBQ,YAAc,IAC1D,IAAK,KACD,OAAO3N,EAAQmK,SAASgD,gBAAgBS,aAAe,IAC3D,IAAK,OACL,IAAK,OACD,IAAIC,EAAK1D,SAASgD,gBAAgBQ,YAAc,IAC5CG,EAAK3D,SAASgD,gBAAgBS,aAAe,IAEjD,OAAO5N,GAAQ+N,EADDC,KAAe,SAAVN,EAAmB,MAAQ,QACvBG,EAAIC,GAC/B,QACI,OAAO9N,GAYnB,SAASiO,EAAiBf,EAASgB,GAE/B,IAAI5N,EAAK6N,EAAQC,EAAapO,EAAOqO,EAAaC,EAAYC,EAAWC,EADzElL,KAAK4J,QAAUA,EAGf,IAAIuB,EAAa,CAAC,YAAa,aAAc,YAAa,cAK1DnL,KAAKpE,KAAO,WAMR,IAAKoB,KAJL8N,EAvER,SAAwBlB,GACpB,IAAKA,EAAQwB,sBACT,MAAO,CACHC,MAAOzB,EAAQ0B,YACfC,OAAQ3B,EAAQ4B,cAIxB,IAAIC,EAAO7B,EAAQwB,wBACnB,MAAO,CACHC,MAAOX,KAAKgB,MAAMD,EAAKJ,OACvBE,OAAQb,KAAKgB,MAAMD,EAAKF,SA4DVI,CAAe3L,KAAK4J,SAElCoB,EAAa,GAEDvB,EAAWmB,GACdnB,EAAWmB,GAAItN,eAAeN,KAGnC6N,EAASpB,EAAWmB,GAAI5N,GAExBN,EAAQuN,EAAYjK,KAAK4J,QAASiB,EAAOnO,OAEzCqO,EAAkC,UAApBF,EAAOzN,SAAuB0N,EAAYO,MAAQP,EAAYS,OAC5EL,EAAWL,EAAOjO,KAAO,IAAMiO,EAAOzN,SACtC6N,EAAY,GAEQ,QAAhBJ,EAAOjO,MAAkBmO,GAAerO,IACxCuO,GAAaJ,EAAOnO,OAGJ,QAAhBmO,EAAOjO,MAAkBmO,GAAerO,IACxCuO,GAAaJ,EAAOnO,OAGnBsO,EAAWE,KAAWF,EAAWE,GAAY,IAC9CD,IAAc,KAAO,IAAMD,EAAWE,GAAY,KAAKU,QAAQ,IAAMX,EAAY,OACjFD,EAAWE,IAAa,IAAMD,IAItC,IAAK,IAAIY,KAAKV,EACLA,EAAW7N,eAAeuO,KAE3Bb,EAAWG,EAAWU,IACtB7L,KAAK4J,QAAQkC,aAAaX,EAAWU,GAAIb,EAAWG,EAAWU,IAAIE,OAAO,IAE1E/L,KAAK4J,QAAQoC,gBAAgBb,EAAWU,MAUxD,SAASI,EAAarC,EAASgB,GACtBhB,EAAQsC,iCACTtC,EAAQsC,+BAAiC,IAAIvB,EAAiBf,EAASgB,IAGtEhB,EAAQuC,uBACTvC,EAAQuC,qBAAuB,IAAI5C,EAAaK,GAAS,WACrDA,EAAQsC,+BAA+BtQ,WAanD,SAASwQ,EAAWC,EAAUzP,EAAMQ,EAAUV,GAC1C,QAAqC,IAA1B+M,EAAW4C,GAA4B,CAC9C5C,EAAW4C,GAAY,GAGvB,IAAIzB,EAAKlB,EAAoBhK,OAC7B8J,EAAgB8C,WAAa,KAAOD,EAAW,sCAC/C7C,EAAgB8C,WAAa,KAAOD,EAAW,iCAAiCzB,EAAG,OACnFlB,EAAoB6C,KAAKF,GAG7B5C,EAAW4C,GAAUE,KAAK,CACtB3P,KAAMA,EACNQ,SAAUA,EACVV,MAAOA,IAIf,SAAS8P,EAASlL,GACd,IAAImL,EAKJ,GAJI5F,SAASC,mBAAkB2F,EAAQ,EAAcnL,EAAUwF,iBAAiB7J,KAAKqE,GAAauF,SAASC,iBAAiB7J,KAAK4J,WAC5H4F,GAAS,oBAAuBC,KAAID,EAAQC,IAC5CD,QAAS,IAAuBhP,IAAQgP,EAAQhP,IAEhDgP,EACD,KAAM,+DAGV,OAAOA,EAuBX,SAASE,EAAsB/C,GAC3B,IAAIgD,EAAW,GACXC,EAAQ,GACRC,EAAU,GACVC,EAAiB,EACjBC,GAAmB,EACnBC,EAAe,GAEnB,IAAK,IAAIxR,KAAKmO,EAAQgD,SAClB,GAAKhD,EAAQgD,SAAStP,eAAe7B,IAEjCmO,EAAQgD,SAASnR,GAAGyR,SAAyD,QAA9CtD,EAAQgD,SAASnR,GAAGyR,QAAQC,cAAyB,CACpFP,EAASL,KAAK3C,EAAQgD,SAASnR,IAE/B,IAAI2R,EAAWxD,EAAQgD,SAASnR,GAAG4R,aAAa,cAAgBzD,EAAQgD,SAASnR,GAAG4R,aAAa,kBAE7FC,EAAM1D,EAAQgD,SAASnR,GAAG4R,aAAa,aAAezD,EAAQgD,SAASnR,GAAG4R,aAAa,OAE3FP,EAAQP,KAAKe,GAEb,IAAIC,EAAO,CACPH,SAAUA,GAGdP,EAAMN,KAAKgB,GAENH,EAIDxD,EAAQgD,SAASnR,GAAG+R,MAAMC,QAAU,QAHpCV,EAAiBH,EAASlN,OAAS,EACnCkK,EAAQgD,SAASnR,GAAG+R,MAAMC,QAAU,SAShD,SAASC,IACL,IAA4BjS,EAAxBkS,GAAiB,EAErB,IAAKlS,KAAKmR,EACDA,EAAStP,eAAe7B,IAEzBoR,EAAMpR,GAAG2R,UACLxD,EAAQ0B,YAAcuB,EAAMpR,GAAG2R,WAC/BO,EAAiBlS,GAU7B,GALKkS,IAEDA,EAAiBZ,GAGjBC,IAAoBW,EAGpB,GAAKV,EAAaU,GAkBdf,EAASI,GAAiBQ,MAAMC,QAAU,OAC1Cb,EAASe,GAAgBH,MAAMC,QAAU,QACzCT,EAAkBW,MApBa,CAI/B,IAAIC,EAAQ,IAAIC,MAChBD,EAAME,OAAS,WACXlB,EAASe,GAAgBL,IAAMR,EAAQa,GAEvCf,EAASI,GAAiBQ,MAAMC,QAAU,OAC1Cb,EAASe,GAAgBH,MAAMC,QAAU,QAEzCR,EAAaU,IAAkB,EAE/BX,EAAkBW,GAGtBC,EAAMN,IAAMR,EAAQa,QAQxBf,EAASe,GAAgBL,IAAMR,EAAQa,GA/C/CX,EAAkBD,EAmDlBnD,EAAQmE,qBAAuB,IAAIxE,EAAaK,EAAS8D,GACzDA,IAYJ,IAAIM,EAAQ,4HACRC,EAAY,mFAKhB,SAASC,EAAaC,GAClB,IAAIC,EAAOC,EAAQC,EAAOC,EAG1B,IADAJ,EAAMA,EAAIK,QAAQ,KAAM,KACjB,QAAUJ,EAAQJ,EAAMS,KAAKN,KAIhC,IAHAE,EAASD,EAAM,GAAKA,EAAM,GAC1BE,EAAQF,EAAM,GAEP,QAAUG,EAAYN,EAAUQ,KAAKH,KACxClC,EAAWiC,EAAQE,EAAU,GAAIA,EAAU,GAAIA,EAAU,IAQrE,SAASG,EAAU7B,GACf,IAAIR,EAAW,GAEf,GAAKQ,EAIL,GAAI,iBAAoBA,GAEf,KADLA,EAAQA,EAAMM,eACGvB,QAAQ,eAAiB,IAAMiB,EAAMjB,QAAQ,cAC1DsC,EAAarB,QAGjB,IAAK,IAAIpR,EAAI,EAAGkT,EAAI9B,EAAMnN,OAAQjE,EAAIkT,EAAGlT,IACjC,IAAMoR,EAAMpR,GAAGmT,MAEV,KADLvC,EAAWQ,EAAMpR,GAAGoT,cAAgBhC,EAAMpR,GAAGqT,SACzBlD,QAAQ,gBAAkB,IAAMS,EAAST,QAAQ,cACjEsC,EAAa7B,IACL,IAAMA,EAAST,QAAQ,eAAiB,IAAMS,EAAST,QAAQ,cACvEsC,EAAa7B,GAEV,IAAMQ,EAAMpR,GAAGmT,KACtBF,EAAU7B,EAAMpR,GAAGsT,UAAYlC,EAAMpR,GAAGoR,OACjC,IAAMA,EAAMpR,GAAGmT,MACnB/B,EAAMpR,GAAGuT,WAAW1R,eAAe,aAClCoR,EAAU7B,EAAMpR,GAAGuT,WAAWD,UAOlD,IAAIE,GAAqB,EAKzBjP,KAAKE,KAAO,WACR,IAAIgP,EAAiB,sBACgD,IAA1DrI,SAASgD,gBAAgB2D,MAA2B,oBAC3D0B,EAAiB,4BACoD,IAAvDrI,SAASgD,gBAAgB2D,MAAwB,iBAC/D0B,EAAiB,yBACkD,IAArDrI,SAASgD,gBAAgB2D,MAAsB,iBAC7D0B,EAAiB,mBAGrBrI,SAASqB,KAAKT,iBAAiByH,GAAgB,SAAUxI,GACrD,IAAIkD,EAAUlD,EAAEyI,OACZC,EAASxF,GAAWnB,OAAOsB,iBAAiBH,EAAS,MACrDyF,EAAgBD,GAAUA,EAAOE,iBAAiB,kBAGtD,GAFoBD,IAAmB,IAAMA,EAAczD,QAAQ,mBAEhD,CACfhC,EAAQuC,qBAAuB,IAAI5C,EAAaK,GAAS,WACjDA,EAAQsC,gCACRtC,EAAQsC,+BAA+BtQ,UAI/C,IACIgP,EADenC,OAAOsB,iBAAiBH,EAAQ2F,aAAc,MAC3CD,iBAAiB,aACvC1E,EAAKlI,SAASkI,EAAG4D,QAAQ,KAAM,KAC/BvC,EAAavF,EAAEyI,OAAQzF,EAAoBkB,QAI9CqE,KACDzF,EAAkB3C,SAAS2I,cAAc,UACzBZ,KAAO,WACvBpF,EAAgB8C,UAAY,4JAG5B9C,EAAgB8C,WAAa,+DAC7BzF,SAAS4I,qBAAqB,QAAQ,GAAGC,YAAYlG,GACrDyF,GAAqB,GAGzB,IAAK,IAAIxT,EAAI,EAAGkT,EAAI9H,SAAS8I,YAAYjQ,OAAQjE,EAAIkT,EAAGlT,IACpD,IACQoL,SAAS8I,YAAYlU,GAAGmU,MAAQ,IAAM/I,SAAS8I,YAAYlU,GAAGmU,KAAKhE,QAAQ,YAC3EvM,QAAQwQ,KAAK,uDAAyDhJ,SAAS8I,YAAYlU,GAAGmU,MAGlGlB,EAAU7H,SAAS8I,YAAYlU,GAAGsT,UAAYlI,SAAS8I,YAAYlU,GAAGoR,OAAShG,SAAS8I,YAAYlU,GAAGqT,SACzG,MAAOpI,KArHjB,WAII,IAHA,IAEIoJ,EAFQtD,GAEGC,CAAM,8CACZhR,EAAI,EAAGkT,EAAImB,EAASpQ,OAAQjE,EAAIkT,EAAGlT,IACxCkR,EAAsBmD,EAASrU,IAoHnCsU,IAUJ/P,KAAKgQ,2BAA6B,SAAU1O,IA9O5C,SAAoCA,GAChC,IAAImL,EAAQD,EAASlL,GAErB,IAAK,IAAI+K,KAAY5C,EAAY,GAAIA,EAAWnM,eAAe+O,GAI3D,IAFA,IAAIyD,EAAWrD,EAAMJ,EAAU/K,GAEtB7F,EAAI,EAAGkT,EAAImB,EAASpQ,OAAQjE,EAAIkT,EAAGlT,IACxCwQ,EAAa6D,EAASrU,GAAI4Q,GAuOlC2D,CAA2B1O,IAG/BtB,KAAKiQ,OAAS,WACVjQ,KAAKE,SA8Db,OA1DAL,EAAeoQ,OAAS,WACpBpQ,EAAeqQ,SAASD,UAQ5BpQ,EAAesQ,OAAS,SAAUvG,GAC1BA,EAAQsC,gCAERtC,EAAQuC,qBAAqBgE,gBACtBvG,EAAQsC,sCACRtC,EAAQuC,sBAERvC,EAAQmE,uBAGfnE,EAAQmE,qBAAqBoC,gBACtBvG,EAAQmE,uBAIvBlO,EAAeK,KAAO,WACbL,EAAeqQ,WAChBrQ,EAAeqQ,SAAW,IAAIrQ,GAGlCA,EAAeqQ,SAAShQ,QAqB5BL,EAAemQ,2BAA6B,SAAU1O,GAClDzB,EAAeqQ,SAASF,2BAA2B1O,IAGvDzB,EAAeuQ,OAAS,YAtBR,SAAUnH,GAEtB,GAAIpC,SAASY,iBACTZ,SAASY,iBAAiB,mBAAoBwB,GAAU,QAGvD,GAAI,qBAAqBoH,KAAKC,UAAUC,WACzC,IAAIC,EAAeC,aAAY,WACvB,mBAAmBJ,KAAKxJ,SAAS6J,cACjCzH,IACA0H,cAAcH,MAEnB,SAGF/H,OAAOqF,OAAS7E,EAQrB2H,CAAU/Q,EAAeK,OAGtBL,IAtgBkC,iC,+CCT7C,oBAeoB,oBAAX4I,QAAyBA,YANZ,0BAAd,EAMyC,WAG7C,GAAsB,oBAAXA,OACP,OAAO,KAIX,IAAIoI,EAAgC,oBAAVpI,QAAyBA,OAAOiC,MAAQA,KAC5DjC,OACe,oBAARqI,MAAuBA,KAAKpG,MAAQA,KACvCoG,KACAC,SAAS,cAATA,GAINC,EAAwBH,EAAaG,uBACrCH,EAAaI,0BACbJ,EAAaK,6BACb,SAAUC,GACN,OAAON,EAAaO,WAAWD,EAAI,KAGvCE,EAAuBR,EAAaQ,sBACpCR,EAAaS,yBACbT,EAAaU,4BACb,SAAUC,GACNX,EAAaY,aAAaD,IASlC,SAASE,EAAe5B,EAAU7G,GAC9B,IAAI0I,EAAexV,OAAOkB,UAAUuU,SAAShW,KAAKkU,GAC9C+B,EAAqB,mBAAqBF,GACtC,sBAAwBA,GACxB,4BAA8BA,GAC9B,oBAAsBA,QACtB,IAAuBlU,GAAUqS,aAAoBrS,GACrD,oBAAuBqU,UAAYhC,aAAoBgC,SAE3DrW,EAAI,EAAGkT,EAAImB,EAASpQ,OACxB,GAAImS,EACA,KAAOpW,EAAIkT,EAAGlT,IACVwN,EAAS6G,EAASrU,SAGtBwN,EAAS6G,GASjB,SAASnE,EAAe/B,GACpB,IAAKA,EAAQwB,sBACT,MAAO,CACHC,MAAOzB,EAAQ0B,YACfC,OAAQ3B,EAAQ4B,cAIxB,IAAIC,EAAO7B,EAAQwB,wBACnB,MAAO,CACHC,MAAOX,KAAKgB,MAAMD,EAAKJ,OACvBE,OAAQb,KAAKgB,MAAMD,EAAKF,SAUhC,SAASwG,EAASnI,EAAS4D,GACvBrR,OAAOyD,KAAK4N,GAAOpG,SAAQ,SAASpK,GAChC4M,EAAQ4D,MAAMxQ,GAAOwQ,EAAMxQ,MAYnC,IAAIuM,EAAe,SAASK,EAASX,GAEjC,IAAI+I,EAAsC,EAM1C,SAASC,IACL,IAKIxW,EAAGkT,EALHuD,EAAI,GACRlS,KAAKmS,IAAM,SAASC,GAChBF,EAAE3F,KAAK6F,IAIXpS,KAAKpE,KAAO,SAASyW,GACjB,IAAK5W,EAAI,EAAGkT,EAAIuD,EAAExS,OAAQjE,EAAIkT,EAAGlT,IAC7ByW,EAAEzW,GAAGG,KAAKoE,KAAMqS,IAIxBrS,KAAKsS,OAAS,SAASF,GACnB,IAAIG,EAAW,GACf,IAAI9W,EAAI,EAAGkT,EAAIuD,EAAExS,OAAQjE,EAAIkT,EAAGlT,IACzByW,EAAEzW,KAAO2W,GAAIG,EAAShG,KAAK2F,EAAEzW,IAEpCyW,EAAIK,GAGRvS,KAAKN,OAAS,WACV,OAAOwS,EAAExS,QASjB,SAAS8S,EAAkB5I,EAAS6I,GAChC,GAAK7I,EACL,GAAIA,EAAQ8I,gBACR9I,EAAQ8I,gBAAgBP,IAAIM,OADhC,CAKA7I,EAAQ8I,gBAAkB,IAAIT,EAC9BrI,EAAQ8I,gBAAgBP,IAAIM,GAE5B7I,EAAQ2F,aAAe1I,SAAS2I,cAAc,OAC9C5F,EAAQ2F,aAAaoD,IAAM,MAC3B/I,EAAQ2F,aAAaqD,UAAY,gBAEjC,IAAIpF,EAAQ,CACRqF,cAAe,OACfC,SAAU,WACVC,KAAM,MACNC,IAAK,MACLC,MAAO,MACPC,OAAQ,MACRC,SAAU,SACVC,OAAQ,KACRC,WAAY,SACZC,SAAU,QAEVC,EAAa,CACbT,SAAU,WACVC,KAAM,MACNC,IAAK,MACLQ,WAAY,MAGhBzB,EAASnI,EAAQ2F,aAAc/B,GAE/B,IAAIiG,EAAS5M,SAAS2I,cAAc,OACpCiE,EAAOb,UAAY,uBACnBb,EAAS0B,EAAQjG,GAEjB,IAAIkG,EAAc7M,SAAS2I,cAAc,OACzCuC,EAAS2B,EAAaH,GACtBE,EAAO/D,YAAYgE,GAEnB,IAAIC,EAAS9M,SAAS2I,cAAc,OACpCmE,EAAOf,UAAY,uBACnBb,EAAS4B,EAAQnG,GAEjB,IAAIoG,EAAc/M,SAAS2I,cAAc,OACzCuC,EAAS6B,EAAaL,GACtBxB,EAAS6B,EAAa,CAAEvI,MAAO,OAAQE,OAAQ,SAC/CoI,EAAOjE,YAAYkE,GAEnBhK,EAAQ2F,aAAaG,YAAY+D,GACjC7J,EAAQ2F,aAAaG,YAAYiE,GACjC/J,EAAQ8F,YAAY9F,EAAQ2F,cAE5B,IAAIsE,EAAgBpL,OAAOsB,iBAAiBH,GACxCkJ,EAAWe,EAAgBA,EAAcvE,iBAAiB,YAAc,KACxE,aAAewD,GAAY,aAAeA,GAAY,UAAYA,GAAY,WAAaA,IAC3FlJ,EAAQ4D,MAAMsF,SAAW,YAG7B,IAAIgB,GAAQ,EAGRC,EAAQ,EACRC,EAAOrI,EAAe/B,GACtBqK,EAAY,EACZC,EAAa,EACbC,GAAqB,EACzBnC,EAAsC,EAEtC,IAcIoC,EAAQ,WAER,GAAID,EAAoB,CAEpB,GADwC,IAAxBvK,EAAQ0B,aAA8C,IAAzB1B,EAAQ4B,aAUjD,YAPKwG,IACDA,EAAsChB,GAAsB,WACxDgB,EAAsC,EACtCoC,SAORD,GAAqB,EA9BT,IAChB9I,EACAE,EADAF,EAAQzB,EAAQ0B,YAChBC,EAAS3B,EAAQ4B,aAErBkI,EAAYlG,MAAMnC,MAASA,EAAQ,GAAM,KACzCqI,EAAYlG,MAAMjC,OAAUA,EAAS,GAAM,KAE3CkI,EAAOY,WAAahJ,EAAQ,GAC5BoI,EAAOa,UAAY/I,EAAS,GAE5BoI,EAAOU,WAAahJ,EAAQ,GAC5BsI,EAAOW,UAAY/I,EAAS,IAyBhC3B,EAAQ2F,aAAagF,YAAcH,EAEnC,IAAII,EAAY,WACZT,EAAQ,EAEHD,IAELG,EAAYD,EAAK3I,MACjB6I,EAAaF,EAAKzI,OAEd3B,EAAQ8I,iBACR9I,EAAQ8I,gBAAgB9W,KAAKoY,KAIjCS,EAAW,WACXT,EAAOrI,EAAe/B,IACtBkK,EAAQE,EAAK3I,QAAU4I,GAAaD,EAAKzI,SAAW2I,KAEtCH,IACVA,EAAQ/C,EAAsBwD,IAGlCJ,KAGAM,EAAW,SAASC,EAAI3Y,EAAM4Y,GAC1BD,EAAGE,YACHF,EAAGE,YAAY,KAAO7Y,EAAM4Y,GAE5BD,EAAGlN,iBAAiBzL,EAAM4Y,IAIlCF,EAASjB,EAAQ,SAAUgB,GAC3BC,EAASf,EAAQ,SAAUc,GAG3BzC,EAAsChB,GAAsB,WACxDgB,EAAsC,EACtCoC,QAIR1C,EAAe9H,GAAS,SAASkL,GAC7BtC,EAAkBsC,EAAM7L,MAG5BjJ,KAAKmQ,OAAS,SAASiC,GAEdJ,IACDX,EAAqBW,GACrBA,EAAsC,GAE1CzI,EAAa4G,OAAOvG,EAASwI,IAGjCpS,KAAKoU,MAAQ,WACTxK,EAAQ2F,aAAagF,gBA2B7B,GAvBAhL,EAAa6K,MAAQ,SAASxK,GAC1B8H,EAAe9H,GAAS,SAASkL,GAC7BA,EAAKvF,aAAagF,kBAI1BhL,EAAa4G,OAAS,SAASvG,EAASwI,GACpCV,EAAe9H,GAAS,SAASkL,GACxBA,IACFA,EAAKpC,iBAAiC,mBAAPN,IAC9B0C,EAAKpC,gBAAgBJ,OAAOF,GACzB0C,EAAKpC,gBAAgBhT,WAExBoV,EAAKvF,eACDuF,EAAKC,SAASD,EAAKvF,eACnBuF,EAAKE,YAAYF,EAAKvF,qBAEnBuF,EAAKvF,oBACLuF,EAAKpC,sBAKQ,oBAArB/K,iBAAkC,CACzC,IAAIsN,EAAW,IAAItN,kBAAiB,SAAUC,GAC1C,IAAK,IAAInM,KAAKmM,EACV,GAAIA,EAAUtK,eAAe7B,GAEzB,IADA,IAAIyZ,EAAQtN,EAAUnM,GAAGqM,WAChB6G,EAAI,EAAGA,EAAIuG,EAAMxV,OAAQiP,IAC1BuG,EAAMvG,GAAGY,cACThG,EAAa6K,MAAMc,EAAMvG,OAO7C9H,SAASY,iBAAiB,oBAAoB,SAAUtB,GACpD8O,EAAShN,QAAQpB,SAASqB,KAAM,CAC5BC,WAAW,EACXC,SAAS,OAKrB,OAAOmB,IAnWW,oC","file":"frontend/bundle.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 12);\n","module.exports = jQuery;","import $ from 'jquery';\n\n/**\n * Performs a REST Call\n * \n * @param {string}    endPoint - Endpoint of the REST call\n * @param {object}    data - Data to be sent in the call\n * @param {callback}  [onSuccess] - Function to be invoked if the call is successful\n * @param {callback}  [onFail] - Function to be invoked if the call fails\n * \n * @return null\n */\n\nexport function restCall( endPoint = null, data = null, onSuccess = null, onFail = null ){\n    // Define the valid endpoints\n    let validEndpoints = [ 'course_navigation', 'update_drip_date', 'get_group_courses', 'try-automator-visibility' ];\n\n    // Check if the endPoint parameter is a valid endpoint\n    if ( validEndpoints.includes( endPoint ) ){\n        // Do AJAX\n        $.ajax({\n            method: 'POST',\n            url:    UncannyToolkitPro.restURL + endPoint + '/',\n            data:   $.param( data ) + '&' + $.param({ doing_rest: 1 }),\n\n            // Attach Nonce the the header of the request\n            beforeSend: function( xhr ){\n                xhr.setRequestHeader( 'X-WP-Nonce', UncannyToolkitPro.nonce );\n            },\n\n            success: function( response ){\n                // Check if onSuccess\n                if ( isDefined( onSuccess ) ){\n                    // Invoke callback\n                    onSuccess( response );\n                }\n            },\n\n            statusCode: {\n                403: function(){\n                    location.reload();\n                }\n            },\n\n            fail: function ( response ){\n                if ( isDefined( onFail ) ){\n                    onFail( response );\n                }\n            },\n        });\n    }\n    else {\n        console.error( `The ${ endPoint } endPoint does not exists` );\n    }\n}\n\n/**\n * Determine if a variable is set and is not NULL\n *\n * @param  {mixed}      variable - The variable being evaluated\n * @return {boolean}    TRUE if the variable is defined\n */\n\nexport const isDefined = ( variable ) => {\n\t// Returns true if the variable is undefined\n    return typeof variable !== 'undefined' && variable !== null;\n}\n\n/**\n * Determine whether a variable is empty\n *\n * @param   {mixed}     variable - The variable being evaluated\n * @return  {boolean}   TRUE if the variable is empty\n */\n\nexport const isEmpty = ( variable ) => {\n    let response = true;\n\n    // Check if the variable is defined, otherwise is empty\n    if ( isDefined( variable ) ){\n        // Check if it's array\n        if ( variable.isArray ){\n            response = variable.length == 0;\n        }\n        else if ( isObject( variable ) ){\n            response = Object.keys( variable ).length;\n        }\n        else {\n            response = variable == '';\n        }\n    }\n\n    return response;\n}\n\n/**\n * Determine whether a variable is an object\n *\n * @param   {mixed}     variable - The variable being evaluated\n * @return  {boolean}   TRUE if the variable is an object\n */\n\nexport const isObject = ( variable ) => {\n    return typeof variable === 'object' && variable !== null;\n}","const ElementQueries = require( 'css-element-queries/src/ElementQueries' );\n\nimport {\n\tisDefined,\n\tisEmpty\n} from '../../common/js/utilities.js';\n\nclass CourseDashboard {\n\tconstructor(){\n\t\t// Check if the required container is defined\n\t\tif ( this.hasDashboard() ){\n\t\t\t// Init ResizeSensor\n\t\t\tElementQueries.init();\n\n\t\t\t// Get elements\n\t\t\tthis.getElements();\n\n\t\t\t// Define global settings\n\t\t\tthis.defineSettings();\n\t\t\t\n\t\t\t// Create courses using the DOM elements\n\t\t\tthis.createCourses();\n\n\t\t\t// Add function to expand and collapse all containers\n\t\t\tthis.slideAll();\n\n\t\t\t// Listen filters\n\t\t\tthis.filters();\n\t\t}\n\t}\n\n\tgetElements(){\n\t\tthis.$elements = {\n\t\t\tfilters: {\n\t\t\t\tform:    $( '#ultp-dashboard-filters-form' ),\n\t\t\t\tselects: $( '#ultp-dashboard-filters-form select' )\n\t\t\t}\n\t\t}\n\t}\n\n\tdefineSettings(){\n\t\t// Create settings\n\t\tthis.settings = {\n\t\t\tslideToggleDuration: 300\n\t\t}\n\t}\n\n\tcreateCourses(){\n\t\t// Get all courses\n\t\tconst $courses = $( '.ultp-dashboard-course' );\n\n\t\t// Create Courses\n\t\t$.each( $courses, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Course( $( $element ), this.settings );\n\t\t});\n\t}\n\n\thasDashboard(){\n\t\treturn $( '.ultp-dashboard-courses' ).length > 0;\n\t}\n\n\tslideAll(){\n\t\t// Listen to the clicks on the buttons\n\t\t$( '.ultp-dashboard .ultp-dashboard-btn--expand-all' ).on( 'click', () => {\n\t\t\texpandAll();\n\t\t});\n\n\t\t$( '.ultp-dashboard .ultp-dashboard-btn--collapse-all' ).on( 'click', () => {\n\t\t\tcollapseAll();\n\t\t});\n\n\t\tconst expandAll = () => {\n\t\t\t// Get all the collapsed containers\n\t\t\tconst collapsedContainers = {\n\t\t\t\tcourses: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-course--collapsed',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-course__toggle-btn'\n\t\t\t\t},\n\t\t\t\tlessons: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-lesson--collapsed',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-lesson__toggle-btn'\n\t\t\t\t},\n\t\t\t\ttopics: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-topic--collapsed',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-topic__toggle-btn'\n\t\t\t\t},\n\t\t\t\tquizzes: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-quizzes--collapsed',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-quizzes__header-toggle-btn'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.each( collapsedContainers, ( index, elementType ) => {\n\t\t\t\t// Get containers\n\t\t\t\tconst $containers = $( elementType.container );\n\n\t\t\t\t// Iterate each container\n\t\t\t\t$.each( $containers, ( index, container ) => {\n\t\t\t\t\t// Get container element\n\t\t\t\t\tconst $container = $( container );\n\n\t\t\t\t\t// Get toggle button\n\t\t\t\t\tconst $toggleButton = $container.find( elementType.toggle );\n\n\t\t\t\t\t// Trigger click\n\t\t\t\t\t$toggleButton.trigger( 'click' );\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst collapseAll = () => {\n\t\t\t// Get all the expanded containers\n\t\t\tconst expandedContainers = {\n\t\t\t\tcourses: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-course--expanded',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-course__toggle-btn'\n\t\t\t\t},\n\t\t\t\tlessons: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-lesson--expanded',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-lesson__toggle-btn'\n\t\t\t\t},\n\t\t\t\tquizzes: {\n\t\t\t\t\tcontainer: '.ultp-dashboard-quizzes--expanded',\n\t\t\t\t\ttoggle:    '.ultp-dashboard-quizzes__header-toggle-btn'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.each( expandedContainers, ( index, elementType ) => {\n\t\t\t\t// Get containers\n\t\t\t\tconst $containers = $( elementType.container );\n\n\t\t\t\t// Iterate each container\n\t\t\t\t$.each( $containers, ( index, container ) => {\n\t\t\t\t\t// Get container element\n\t\t\t\t\tconst $container = $( container );\n\n\t\t\t\t\t// Get toggle button\n\t\t\t\t\tconst $toggleButton = $container.find( elementType.toggle );\n\n\t\t\t\t\t// Trigger click\n\t\t\t\t\t$toggleButton.trigger( 'click' );\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\tfilters(){\n\t\t// Listen to changes\n\t\tthis.$elements.filters.selects.on( 'change', () => {\n\t\t\t// Submit form\n\t\t\tthis.$elements.filters.form.trigger( 'submit' );\n\t\t});\n\t}\n}\n\nclass Course {\n\tconstructor( $container, settings ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get important elements from the container\n\t\tthis.getElements( $container );\n\n\t\t// Get course data\n\t\tthis.getCourseData();\n\n\t\t// Add toggle functionality\n\t\tthis.toggleCourseContent();\n\n\t\t// Create lessons using the DOM elements\n\t\tthis.createLessons();\n\n\t\t// Create quizzes using the DOM elements\n\t\tthis.createQuizzes();\n\t}\n\n\tgetCourseData(){\n\t\tthis.courseData = {\n\t\t\tcourseId:       this.$elements.container.data( 'course-id' ),\n\t\t\tstatus:         this.$elements.container.data( 'status' ),\n\t\t\thasLessons:     !! parseInt( this.$elements.container.data( 'has-lessons' ) ),\n\t\t\thasQuizzes:     !! parseInt( this.$elements.container.data( 'has-quizzes' ) ),\n\t\t\thasCertificate: !! parseInt( this.$elements.container.data( 'has-certificate' ) ),\n\t\t}\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\ttoggle: {\n\t\t\t\tcollapsed:  'ultp-dashboard-course--collapsed',\n\t\t\t\tcollapsing: 'ultp-dashboard-course--collapsing',\n\t\t\t\texpanding:  'ultp-dashboard-course--expanding',\n\t\t\t\texpanded:   'ultp-dashboard-course--expanded',\n\t\t\t}\n\t\t}\n\n\t\tthis.cssClasses.allToggle = Object.keys( this.cssClasses.toggle ).map( item => this.cssClasses.toggle[ item ] ).join( ' ' );\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\ttoggleBtn: $container.find( '.ultp-dashboard-course__toggle-btn' ),\n\t\t\tcontent:   $container.find( '.ultp-dashboard-course__content' )\n\t\t}\n\t}\n\n\ttoggleCourseContent(){\n\t\t// Check if the course has lessons or quizzes\n\t\tif ( this.courseData.hasLessons || this.courseData.hasQuizzes ){\n\t\t\t// Listen to clicks on the toggle button\n\t\t\tthis.$elements.toggleBtn.on( 'click', () => {\n\t\t\t\t// Check if we have to close it or open it\n\t\t\t\tif ( this.isCollapsed() ){\n\t\t\t\t\t// As it's collapsed, we have to expand it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'expanding' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.hide().slideDown( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'expanded' );\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// As it's expanded, we have to collapse it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'collapsing' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.show().slideUp( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'collapsed' );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tcreateLessons(){\n\t\t// Get all lessons\n\t\tconst $lessons = this.$elements.container.find( '.ultp-dashboard-lesson' );\n\n\t\t// Create Courses\n\t\t$.each( $lessons, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Lesson( $( $element ), this.dashboardSettings, this.courseData );\n\t\t});\n\t}\n\n\tcreateQuizzes(){\n\t\t// Get all quizzes containers\n\t\tconst $quizzesContainers = this.$elements.container.find( '.ultp-dashboard-course__quizzes .ultp-dashboard-quizzes' );\n\n\t\t// Create Quizzes\n\t\t$.each( $quizzesContainers, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Quizzes( $( $element ), this.dashboardSettings, this.courseData );\n\t\t});\n\t}\n\n\tsetToggleClass( status ){\n\t\t// First remove all the classes\n\t\tthis.$elements.container.removeClass( this.cssClasses.allToggle );\n\n\t\t// Then add the correct class\n\t\tthis.$elements.container.addClass( this.cssClasses.toggle[ status ] );\n\t}\n\n\tisCollapsed(){\n\t\t// Check if the container has the collapsed class\n\t\treturn this.$elements.container.hasClass( this.cssClasses.toggle.collapsed );\n\t}\n}\n\nclass Lesson {\n\tconstructor( $container, settings, courseData ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\t\t// Save courseData\n\t\tthis.courseData = courseData;\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get important elements from the container\n\t\tthis.getElements( $container );\n\n\t\t// Get lesson data\n\t\tthis.getLessonData();\n\n\t\t// Add toggle functionality\n\t\tthis.toggleLessonContent();\n\n\t\t// Create topics using the DOM elements\n\t\tthis.createTopics();\n\n\t\t// Create quizzes using the DOM elements\n\t\tthis.createQuizzes();\n\t}\n\n\tgetLessonData(){\n\t\tthis.lessonData = {\n\t\t\tcourse:         this.courseData,\n\t\t\tlessonId:       this.$elements.container.data( 'lesson-id' ),\n\t\t\tavailableOn:    ! isEmpty( this.$elements.container.data( 'available-on' ) ) ? parseInt( this.$elements.container.data( 'available-on' ) ) : null,\n\t\t\tisCompleted:    !! parseInt( this.$elements.container.data( 'is-completed' ) ),\n\t\t\tisAvailable:    !! parseInt( this.$elements.container.data( 'is-available' ) ),\n\t\t\thasTopics:      !! parseInt( this.$elements.container.data( 'has-topics' ) ),\n\t\t\thasQuizzes:     !! parseInt( this.$elements.container.data( 'has-quizzes' ) ),\n\t\t}\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\ttoggle: {\n\t\t\t\tcollapsed:  'ultp-dashboard-lesson--collapsed',\n\t\t\t\tcollapsing: 'ultp-dashboard-lesson--collapsing',\n\t\t\t\texpanding:  'ultp-dashboard-lesson--expanding',\n\t\t\t\texpanded:   'ultp-dashboard-lesson--expanded',\n\t\t\t}\n\t\t}\n\n\t\tthis.cssClasses.allToggle = Object.keys( this.cssClasses.toggle ).map( item => this.cssClasses.toggle[ item ] ).join( ' ' );\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\ttoggleBtn: $container.find( '.ultp-dashboard-lesson__toggle-btn' ),\n\t\t\tcontent:   $container.find( '.ultp-dashboard-lesson__content' )\n\t\t}\n\t}\n\n\ttoggleLessonContent(){\n\t\t// Check if the lesson has topics or quizzes\n\t\tif ( this.lessonData.hasTopics || this.lessonData.hasQuizzes ){\n\t\t\t// Listen to clicks on the toggle button\n\t\t\tthis.$elements.toggleBtn.on( 'click', () => {\n\t\t\t\t// Check if we have to close it or open it\n\t\t\t\tif ( this.isCollapsed() ){\n\t\t\t\t\t// As it's collapsed, we have to expand it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'expanding' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.hide().slideDown( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'expanded' );\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// As it's expanded, we have to collapse it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'collapsing' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.show().slideUp( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'collapsed' );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tcreateTopics(){\n\t\t// Get all topics\n\t\tconst $topics = this.$elements.container.find( '.ultp-dashboard-topic' );\n\n\t\t// Create Courses\n\t\t$.each( $topics, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Topic( $( $element ), this.dashboardSettings, this.courseData, this.lessonData );\n\t\t});\n\t}\n\n\tcreateQuizzes(){\n\t\t// Get all quizzes containers\n\t\tconst $quizzesContainers = this.$elements.container.find( '.ultp-dashboard-lesson__quizzes .ultp-dashboard-quizzes' );\n\n\t\t// Create Quizzes\n\t\t$.each( $quizzesContainers, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Quizzes( $( $element ), this.dashboardSettings, this.courseData, this.lessonData );\n\t\t});\n\t}\n\n\tsetToggleClass( status ){\n\t\t// First remove all the classes\n\t\tthis.$elements.container.removeClass( this.cssClasses.allToggle );\n\n\t\t// Then add the correct class\n\t\tthis.$elements.container.addClass( this.cssClasses.toggle[ status ] );\n\t}\n\n\tisCollapsed(){\n\t\t// Check if the container has the collapsed class\n\t\treturn this.$elements.container.hasClass( this.cssClasses.toggle.collapsed );\n\t}\n}\n\nclass Topic {\n\tconstructor( $container, settings, courseData, lessonData ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\t\t// Save course data\n\t\tthis.courseData = courseData;\n\t\t// Save lesson data\n\t\tthis.lessonData = lessonData;\n\n\t\t// Get elements\n\t\tthis.getElements( $container );\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get lesson data\n\t\tthis.getTopicData();\n\n\t\t// Add toggle functionality\n\t\tthis.toggleTopicContent();\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\ttoggleBtn: $container.find( '.ultp-dashboard-topic__toggle-btn' ),\n\t\t\tcontent:   $container.find( '.ultp-dashboard-topic__content' )\n\t\t}\n\t}\n\n\tgetTopicData(){\n\t\tthis.topicData = {\n\t\t\tcourse:         this.courseData,\n\t\t\tlesson:         this.lessonData,\n\t\t\ttopicId:        this.$elements.container.data( 'topic-id' ),\n\t\t\tisCompleted:    !! parseInt( this.$elements.container.data( 'is-completed' ) ),\n\t\t\thasQuizzes:     !! parseInt( this.$elements.container.data( 'has-quizzes' ) )\n\t\t}\n\n\t\tdelete this.topicData.lesson.course;\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\ttoggle: {\n\t\t\t\tcollapsed:  'ultp-dashboard-topic--collapsed',\n\t\t\t\tcollapsing: 'ultp-dashboard-topic--collapsing',\n\t\t\t\texpanding:  'ultp-dashboard-topic--expanding',\n\t\t\t\texpanded:   'ultp-dashboard-topic--expanded',\n\t\t\t}\n\t\t}\n\n\t\tthis.cssClasses.allToggle = Object.keys( this.cssClasses.toggle ).map( item => this.cssClasses.toggle[ item ] ).join( ' ' );\n\t}\n\n\tsetToggleClass( status ){\n\t\t// First remove all the classes\n\t\tthis.$elements.container.removeClass( this.cssClasses.allToggle );\n\n\t\t// Then add the correct class\n\t\tthis.$elements.container.addClass( this.cssClasses.toggle[ status ] );\n\t}\n\n\ttoggleTopicContent(){\n\t\tconsole.log( this.topicData.hasQuizzes );\n\n\t\t// Check if the topic has topics or quizzes\n\t\tif ( this.topicData.hasQuizzes ){\n\n\t\t\tconsole.log( this.$elements.toggleBtn );\n\n\t\t\t// Listen to clicks on the toggle button\n\t\t\tthis.$elements.toggleBtn.on( 'click', () => {\n\t\t\t\t// Check if we have to close it or open it\n\t\t\t\tif ( this.isCollapsed() ){\n\t\t\t\t\t// As it's collapsed, we have to expand it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'expanding' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.hide().slideDown( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'expanded' );\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// As it's expanded, we have to collapse it\n\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'collapsing' );\n\n\t\t\t\t\t// Do the slideDown\n\t\t\t\t\tthis.$elements.content.show().slideUp( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t\t// Set status\n\t\t\t\t\t\tthis.setToggleClass( 'collapsed' );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tisCollapsed(){\n\t\t// Check if the container has the collapsed class\n\t\treturn this.$elements.container.hasClass( this.cssClasses.toggle.collapsed );\n\t}\n}\n\nclass Quizzes {\n\tconstructor( $container, settings, courseData, lessonData = false ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\t\t// Save course data\n\t\tthis.courseData        = courseData;\n\t\t// Save lesson data\n\t\tthis.lessonData        = lessonData;\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get important elements from the container\n\t\tthis.getElements( $container );\n\n\t\t// Add toggle functionality\n\t\tthis.toggleQuizzesContent();\n\n\t\t// Create Quiz instances\n\t\tthis.createIndividualQuizzes();\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\tindividual:     'ultp-dashboard-quiz',\n\t\t\ttoggle: {\n\t\t\t\tcollapsed:  'ultp-dashboard-quizzes--collapsed',\n\t\t\t\tcollapsing: 'ultp-dashboard-quizzes--collapsing',\n\t\t\t\texpanding:  'ultp-dashboard-quizzes--expanding',\n\t\t\t\texpanded:   'ultp-dashboard-quizzes--expanded',\n\t\t\t}\n\t\t}\n\n\t\tthis.cssClasses.allToggle = Object.keys( this.cssClasses.toggle ).map( item => this.cssClasses.toggle[ item ] ).join( ' ' );\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\ttoggleBtn: $container.find( '.ultp-dashboard-quizzes__header-toggle-btn' ),\n\t\t\tcontent:   $container.find( '.ultp-dashboard-quizzes__list' )\n\t\t}\n\t}\n\n\ttoggleQuizzesContent(){\n\t\t// Listen to clicks on the toggle button\n\t\tthis.$elements.toggleBtn.on( 'click', () => {\n\t\t\t// Check if we have to close it or open it\n\t\t\tif ( this.isCollapsed() ){\n\t\t\t\t// As it's collapsed, we have to expand it\n\n\t\t\t\t// Set status\n\t\t\t\tthis.setToggleClass( 'expanding' );\n\n\t\t\t\t// Do the slideDown\n\t\t\t\tthis.$elements.content.hide().slideDown( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'expanded' );\n\t\t\t\t});\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// As it's expanded, we have to collapse it\n\n\t\t\t\t// Set status\n\t\t\t\tthis.setToggleClass( 'collapsing' );\n\n\t\t\t\t// Do the slideDown\n\t\t\t\tthis.$elements.content.show().slideUp( this.dashboardSettings.slideToggleDuration, () => {\n\t\t\t\t\t// Set status\n\t\t\t\t\tthis.setToggleClass( 'collapsed' );\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tsetToggleClass( status ){\n\t\t// First remove all the classes\n\t\tthis.$elements.container.removeClass( this.cssClasses.allToggle );\n\n\t\t// Then add the correct class\n\t\tthis.$elements.container.addClass( this.cssClasses.toggle[ status ] );\n\t}\n\n\tisCollapsed(){\n\t\t// Check if the container has the collapsed class\n\t\treturn this.$elements.container.hasClass( this.cssClasses.toggle.collapsed );\n\t}\n\n\tcreateIndividualQuizzes(){\n\t\t// Find quizzes\n\t\tconst $quizzes = this.$elements.container.find( `.${ this.cssClasses.individual }` );\n\n\t\t// Iterate each quiz\n\t\t$.each( $quizzes, ( index, $element ) => {\n\t\t\t// Create instance of Course\n\t\t\tnew Quiz( $( $element ), this.dashboardSettings, this.courseData, this.lessonData );\n\t\t});\n\t}\n}\n\nclass Quiz {\n\tconstructor( $container, settings, courseData, lessonData = false ){\n\t\t// Save settings in the object's instance\n\t\tthis.dashboardSettings = settings;\n\t\t// Save course data\n\t\tthis.courseData        = courseData;\n\t\t// Save lesson data. This will be false\n\t\t// if the quiz is not inside a lesson\n\t\tthis.lessonData        = lessonData;\n\n\t\t// Define the important CSS classes\n\t\tthis.defineCssClasses();\n\n\t\t// Get important elements from the container\n\t\tthis.getElements( $container );\n\n\t\t// Get quiz data\n\t\tthis.getQuizData();\n\n\t\t// Add toggle functionality\n\t\tthis.openStatistics();\n\t}\n\n\tgetQuizData(){\n\t\tthis.quizData = {\n\t\t\tcourse:      this.courseData,\n\t\t\tquizId:      this.$elements.container.data( 'quiz-id' ),\n\t\t\tisCompleted: !! parseInt( this.$elements.container.data( 'is-completed' ) ),\n\t\t\tpassed:      !! parseInt( this.$elements.container.data( 'passed' ) ),\n\t\t}\n\n\t\tif ( isDefined( this.$elements.container.data( 'lesson-id' ) ) ){\n\t\t\tthis.quizData.lesson = this.lessonData;\n\t\t\tdelete this.quizData.lesson.course;\n\t\t}\n\t}\n\n\tdefineCssClasses(){\n\t\tthis.cssClasses = {\n\t\t\tstatistics: {\n\t\t\t\tbtn:     'ultp-dashboard-btn--statistics',\n\t\t\t\tcontent: '',\n\t\t\t}\n\t\t}\n\t}\n\n\tgetElements( $container ){\n\t\tthis.$elements = {\n\t\t\tcontainer: $container,\n\t\t\tstatistics: {\n\t\t\t\tbtn:   $container.find( `.${ this.cssClasses.statistics.btn }` ),\n\t\t\t\t// content: $container.find( `.${ this.cssClasses.statistics.content }` )\n\t\t\t}\n\t\t}\n\t}\n\n\topenStatistics(){\n\t\t// Listen clicks on the statistics button\n\t\tthis.$elements.statistics.btn.on( 'click', ( event ) => {\n\t\t\t// Prevent default\n\t\t\tevent.preventDefault();\n\n\t\t\t// Open statistics\n\t\t\tconsole.log( this.quizData );\n\t\t});\n\t}\n}\n\nexport default CourseDashboard;","import {\n\tisDefined\n} from '../../common/js/utilities.js';\n\nclass CourseTimer {\n\tconstructor(){\n\t\t// Check if the user has the courseTimer activated\n\t\t// and if this is an LD post\n\t\tif ( this.isCourseTimerEnabled() && this.isLearnDashPost() ){\n\t\t\t// Set settings\n\t\t\tthis.setSettings();\n\n\t\t\t// Get elements\n\t\t\tthis.getElements();\n\n\t\t\ttry {\n\t\t\t\t// Listen activity inside iframes\n\t\t\t\tthis.listenActivityInsideIframePageLoad();\n\t\t\t}\n\t\t\tcatch ( e ){ console.log( e ); }\n\n\t\t\ttry {\n\t\t\t\t// Detect if a new iframe is added to the page\n\t\t\t\tthis.listenNewIframes();\n\t\t\t}\n\t\t\tcatch ( e ){ console.log( e ); }\n\t\t}\t\n\t}\n\n\tgetElements(){\n\t\tthis.$elements = {\n\t\t\tiframes: document.querySelectorAll( '.learndash iframe' )\n\t\t}\n\t}\n\n\tsetSettings(){\n\t\tthis.settings = {\n\t\t\tevents: [\n\t\t\t\t'mousedown',\n\t\t\t\t'mousemove',\n\t\t\t\t'keypress',\n\t\t\t\t'scroll',\n\t\t\t\t'touchstart',\n\t\t\t\t'wheel'\n\t\t\t],\n\t\t\teventSettings: {\n\t\t\t\tbubbles:    true,\n\t\t\t\tcancelable: false,\n\t\t\t\tdetail:     null\n\t\t\t}\n\t\t}\n\t}\n\n\tlistenActivityInsideIframePageLoad(){\n\t\t// Iterate all iframes\n\t\tthis.$elements.iframes.forEach(( iframe ) => {\n\t\t\t// Listen activity inside each iframe\n\t\t\tthis.listenActivityInIframe( iframe );\n\t\t});\n\t}\n\n\tlistenActivityInIframe( iframe ){\n\t\ttry {\n\t\t\t// Check if the iframe loaded\n\t\t\t$( iframe ).on( 'load', () => {\n\t\t\t\t// Iterate the all the events\n\t\t\t\tthis.settings.events.forEach(( eventName ) => {\n\t\t\t\t\t// Add event listeners by iframe\n\t\t\t\t\ttry {\n\t\t\t\t\t\tiframe.contentWindow.addEventListener(\n\t\t\t\t\t\t\teventName,\n\t\t\t\t\t\t\tevent => this.triggerEvent( iframe, eventName )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tcatch ( e ){}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\tcatch ( e ){ console.log( e ); }\n\t\t\t\n\t}\n\n\tlistenNewIframes(){\n\t\t// Create the Mutation Observer\n\t\tvar observer = new MutationObserver(( mutations ) => {\n\t\t\t// Iterate the mutations\n\t\t\tmutations.forEach(( mutation ) => {\n\t\t\t\t// Check if nodes are added\n\t\t\t\tif ( mutation.addedNodes.length > 0 ){\n\t\t\t\t\tmutation.addedNodes.forEach((node) => {\n\t\t\t\t\t\t// Check if the added node is an iframe\n\t\t\t\t\t\tif ( node.nodeName === 'IFRAME' ){\n\t\t\t\t\t\t\t// Listen activity inside the iframe\n\t\t\t\t\t\t\tthis.listenActivityInIframe( node );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n    \t});\n\n\t\t// Observer the mark as complete buttons\n\t\tobserver.observe( document.body, {\n\t\t\tchildList: true,\n\t\t\tsubtree:   true,\n\t\t\tattributeFilter: [ 'disabled' ]\n\t\t});\n\t}\n\n\ttriggerEvent( iframe, eventName ){\n\t\t// Create the event\n\t\tvar event = document.createEvent( 'CustomEvent' );\n\t\tevent.initCustomEvent(\n\t\t\teventName,\n\t\t\tthis.settings.eventSettings.bubbles,\n\t\t\tthis.settings.eventSettings.cancelable,\n\t\t\tthis.settings.eventSettings.detail\n\t\t);\n\n\t\t// Dispatch the event\n\t\tiframe.dispatchEvent( event );\n\t}\n\n\tisCourseTimerEnabled(){\n\t\treturn isDefined( window.uoTimer );\n\t}\n\n\tisLearnDashPost(){\n\t\treturn isDefined( document.querySelector( '.learndash' ) );\n\t}\n}\n\nexport default CourseTimer;","import {\n\trestCall,\n\tisDefined\n} from '../../common/js/utilities.js';\n\nclass LazyCourseNavigation {\n\tconstructor(){\n\t\t// Get elements\n\t\tthis.getElements();\n\n\t\t// Check if we have to execute the code\n\t\tif ( this.isLazyCourseNavigation() ){\n\t\t\t// Get course navigation\n\t\t\tthis.getCourseNavigation(( courseNavigation ) => {\n\t\t\t\t// Set course navigation\n\t\t\t\tthis.setCourseNavigation( courseNavigation );\n\t\t\t});\n\t\t}\n\t}\n\n\tgetElements(){\n\t\t// Create elements property\n\t\tthis.$elements = {\n\t\t\tcontainer: $( '.ultp-lazy-course-navigation' )\n\t\t}\n\t}\n\n\tgetCourseNavigation( callback ){\n\t\t// Do AJAX request\n\t\trestCall( 'course_navigation', {\n\t\t\tcourse_id: UncannyToolkitProLazyCourseNavigation.course_id,\n            lesson_id: UncannyToolkitProLazyCourseNavigation.lesson_id,\n            topic_id: UncannyToolkitProLazyCourseNavigation.topic_id,\n            nonce: UncannyToolkitProLazyCourseNavigation.nonce\n\t\t}, ( response ) => {\n\t\t\t// On success\n\t\t\tcallback( response );\n\t\t}, () => {\n\t\t\t// On fail\n\t\t\tconsole.error( `We couldn't load the course navigation content.` );\n\t\t});\n\t}\n\n\tsetCourseNavigation( courseNavigation ){\n\t\t// Remove loading class\n\t\tthis.$elements.container.removeClass( 'ultp-lazy-course-navigation--loading' );\n\n\t\t// Set the content in each container\n\t\t$.each( this.$elements.container, ( index, container ) => {\n\t\t\t// Get jQuery DOM element\n\t\t\tconst $container = $( container );\n\n\t\t\t// Set the content\n\t\t\t$container.html( courseNavigation.html );\n\t\t});\n\t}\n\n\tisLazyCourseNavigation(){\n\t\treturn this.$elements.container.length > 0 && isDefined( UncannyToolkitProLazyCourseNavigation );\n\t}\n}\n\nexport default LazyCourseNavigation;","import './scss/main.scss';\n\nimport CourseDashboard      from './js/course-dashboard.js';\nimport CourseTimer          from './js/course-timer.js';\nimport LazyCourseNavigation from './js/lazy-course-navigation.js';\n\n// Do on DOM ready\ndocument.addEventListener( 'DOMContentLoaded', () => {\n\tnew CourseDashboard();\n\tnew CourseTimer();\n\tnew LazyCourseNavigation();\n});","'use strict';\n\n/**\n * Copyright Marc J. Schmidt. See the LICENSE file at the top-level\n * directory of this distribution and at\n * https://github.com/marcj/css-element-queries/blob/master/LICENSE.\n */\n(function (root, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define(['./ResizeSensor.js'], factory);\n    } else if (typeof exports === \"object\") {\n        module.exports = factory(require('./ResizeSensor.js'));\n    } else {\n        root.ElementQueries = factory(root.ResizeSensor);\n        root.ElementQueries.listen();\n    }\n}(typeof window !== 'undefined' ? window : this, function (ResizeSensor) {\n\n    /**\n     *\n     * @type {Function}\n     * @constructor\n     */\n    var ElementQueries = function () {\n        //<style> element with our dynamically created styles\n        var cssStyleElement;\n\n        //all rules found for element queries\n        var allQueries = {};\n\n        //association map to identify which selector belongs to a element from the animationstart event.\n        var idToSelectorMapping = [];\n\n        /**\n         *\n         * @param element\n         * @returns {Number}\n         */\n        function getEmSize(element) {\n            if (!element) {\n                element = document.documentElement;\n            }\n            var fontSize = window.getComputedStyle(element, null).fontSize;\n            return parseFloat(fontSize) || 16;\n        }\n\n        /**\n         * Get element size\n         * @param {HTMLElement} element\n         * @returns {Object} {width, height}\n         */\n        function getElementSize(element) {\n            if (!element.getBoundingClientRect) {\n                return {\n                    width: element.offsetWidth,\n                    height: element.offsetHeight\n                }\n            }\n\n            var rect = element.getBoundingClientRect();\n            return {\n                width: Math.round(rect.width),\n                height: Math.round(rect.height)\n            }\n        }\n\n        /**\n         *\n         * @copyright https://github.com/Mr0grog/element-query/blob/master/LICENSE\n         *\n         * @param {HTMLElement} element\n         * @param {*} value\n         * @returns {*}\n         */\n        function convertToPx(element, value) {\n            var numbers = value.split(/\\d/);\n            var units = numbers[numbers.length - 1];\n            value = parseFloat(value);\n            switch (units) {\n                case \"px\":\n                    return value;\n                case \"em\":\n                    return value * getEmSize(element);\n                case \"rem\":\n                    return value * getEmSize();\n                // Viewport units!\n                // According to http://quirksmode.org/mobile/tableViewport.html\n                // documentElement.clientWidth/Height gets us the most reliable info\n                case \"vw\":\n                    return value * document.documentElement.clientWidth / 100;\n                case \"vh\":\n                    return value * document.documentElement.clientHeight / 100;\n                case \"vmin\":\n                case \"vmax\":\n                    var vw = document.documentElement.clientWidth / 100;\n                    var vh = document.documentElement.clientHeight / 100;\n                    var chooser = Math[units === \"vmin\" ? \"min\" : \"max\"];\n                    return value * chooser(vw, vh);\n                default:\n                    return value;\n                // for now, not supporting physical units (since they are just a set number of px)\n                // or ex/ch (getting accurate measurements is hard)\n            }\n        }\n\n        /**\n         *\n         * @param {HTMLElement} element\n         * @param {String} id\n         * @constructor\n         */\n        function SetupInformation(element, id) {\n            this.element = element;\n            var key, option, elementSize, value, actualValue, attrValues, attrValue, attrName;\n\n            var attributes = ['min-width', 'min-height', 'max-width', 'max-height'];\n\n            /**\n             * Extracts the computed width/height and sets to min/max- attribute.\n             */\n            this.call = function () {\n                // extract current dimensions\n                elementSize = getElementSize(this.element);\n\n                attrValues = {};\n\n                for (key in allQueries[id]) {\n                    if (!allQueries[id].hasOwnProperty(key)) {\n                        continue;\n                    }\n                    option = allQueries[id][key];\n\n                    value = convertToPx(this.element, option.value);\n\n                    actualValue = option.property === 'width' ? elementSize.width : elementSize.height;\n                    attrName = option.mode + '-' + option.property;\n                    attrValue = '';\n\n                    if (option.mode === 'min' && actualValue >= value) {\n                        attrValue += option.value;\n                    }\n\n                    if (option.mode === 'max' && actualValue <= value) {\n                        attrValue += option.value;\n                    }\n\n                    if (!attrValues[attrName]) attrValues[attrName] = '';\n                    if (attrValue && -1 === (' ' + attrValues[attrName] + ' ').indexOf(' ' + attrValue + ' ')) {\n                        attrValues[attrName] += ' ' + attrValue;\n                    }\n                }\n\n                for (var k in attributes) {\n                    if (!attributes.hasOwnProperty(k)) continue;\n\n                    if (attrValues[attributes[k]]) {\n                        this.element.setAttribute(attributes[k], attrValues[attributes[k]].substr(1));\n                    } else {\n                        this.element.removeAttribute(attributes[k]);\n                    }\n                }\n            };\n        }\n\n        /**\n         * @param {HTMLElement} element\n         * @param {Object}      id\n         */\n        function setupElement(element, id) {\n            if (!element.elementQueriesSetupInformation) {\n                element.elementQueriesSetupInformation = new SetupInformation(element, id);\n            }\n\n            if (!element.elementQueriesSensor) {\n                element.elementQueriesSensor = new ResizeSensor(element, function () {\n                    element.elementQueriesSetupInformation.call();\n                });\n            }\n        }\n\n        /**\n         * Stores rules to the selector that should be applied once resized.\n         *\n         * @param {String} selector\n         * @param {String} mode min|max\n         * @param {String} property width|height\n         * @param {String} value\n         */\n        function queueQuery(selector, mode, property, value) {\n            if (typeof(allQueries[selector]) === 'undefined') {\n                allQueries[selector] = [];\n                // add animation to trigger animationstart event, so we know exactly when a element appears in the DOM\n\n                var id = idToSelectorMapping.length;\n                cssStyleElement.innerHTML += '\\n' + selector + ' {animation: 0.1s element-queries;}';\n                cssStyleElement.innerHTML += '\\n' + selector + ' > .resize-sensor {min-width: '+id+'px;}';\n                idToSelectorMapping.push(selector);\n            }\n\n            allQueries[selector].push({\n                mode: mode,\n                property: property,\n                value: value\n            });\n        }\n\n        function getQuery(container) {\n            var query;\n            if (document.querySelectorAll) query = (container) ? container.querySelectorAll.bind(container) : document.querySelectorAll.bind(document);\n            if (!query && 'undefined' !== typeof $$) query = $$;\n            if (!query && 'undefined' !== typeof jQuery) query = jQuery;\n\n            if (!query) {\n                throw 'No document.querySelectorAll, jQuery or Mootools\\'s $$ found.';\n            }\n\n            return query;\n        }\n\n        /**\n         * If animationStart didn't catch a new element in the DOM, we can manually search for it\n         */\n        function findElementQueriesElements(container) {\n            var query = getQuery(container);\n\n            for (var selector in allQueries) if (allQueries.hasOwnProperty(selector)) {\n                // find all elements based on the extract query selector from the element query rule\n                var elements = query(selector, container);\n\n                for (var i = 0, j = elements.length; i < j; i++) {\n                    setupElement(elements[i], selector);\n                }\n            }\n        }\n\n        /**\n         *\n         * @param {HTMLElement} element\n         */\n        function attachResponsiveImage(element) {\n            var children = [];\n            var rules = [];\n            var sources = [];\n            var defaultImageId = 0;\n            var lastActiveImage = -1;\n            var loadedImages = [];\n\n            for (var i in element.children) {\n                if (!element.children.hasOwnProperty(i)) continue;\n\n                if (element.children[i].tagName && element.children[i].tagName.toLowerCase() === 'img') {\n                    children.push(element.children[i]);\n\n                    var minWidth = element.children[i].getAttribute('min-width') || element.children[i].getAttribute('data-min-width');\n                    //var minHeight = element.children[i].getAttribute('min-height') || element.children[i].getAttribute('data-min-height');\n                    var src = element.children[i].getAttribute('data-src') || element.children[i].getAttribute('url');\n\n                    sources.push(src);\n\n                    var rule = {\n                        minWidth: minWidth\n                    };\n\n                    rules.push(rule);\n\n                    if (!minWidth) {\n                        defaultImageId = children.length - 1;\n                        element.children[i].style.display = 'block';\n                    } else {\n                        element.children[i].style.display = 'none';\n                    }\n                }\n            }\n\n            lastActiveImage = defaultImageId;\n\n            function check() {\n                var imageToDisplay = false, i;\n\n                for (i in children) {\n                    if (!children.hasOwnProperty(i)) continue;\n\n                    if (rules[i].minWidth) {\n                        if (element.offsetWidth > rules[i].minWidth) {\n                            imageToDisplay = i;\n                        }\n                    }\n                }\n\n                if (!imageToDisplay) {\n                    //no rule matched, show default\n                    imageToDisplay = defaultImageId;\n                }\n\n                if (lastActiveImage !== imageToDisplay) {\n                    //image change\n\n                    if (!loadedImages[imageToDisplay]) {\n                        //image has not been loaded yet, we need to load the image first in memory to prevent flash of\n                        //no content\n\n                        var image = new Image();\n                        image.onload = function () {\n                            children[imageToDisplay].src = sources[imageToDisplay];\n\n                            children[lastActiveImage].style.display = 'none';\n                            children[imageToDisplay].style.display = 'block';\n\n                            loadedImages[imageToDisplay] = true;\n\n                            lastActiveImage = imageToDisplay;\n                        };\n\n                        image.src = sources[imageToDisplay];\n                    } else {\n                        children[lastActiveImage].style.display = 'none';\n                        children[imageToDisplay].style.display = 'block';\n                        lastActiveImage = imageToDisplay;\n                    }\n                } else {\n                    //make sure for initial check call the .src is set correctly\n                    children[imageToDisplay].src = sources[imageToDisplay];\n                }\n            }\n\n            element.resizeSensorInstance = new ResizeSensor(element, check);\n            check();\n        }\n\n        function findResponsiveImages() {\n            var query = getQuery();\n\n            var elements = query('[data-responsive-image],[responsive-image]');\n            for (var i = 0, j = elements.length; i < j; i++) {\n                attachResponsiveImage(elements[i]);\n            }\n        }\n\n        var regex = /,?[\\s\\t]*([^,\\n]*?)((?:\\[[\\s\\t]*?(?:min|max)-(?:width|height)[\\s\\t]*?[~$\\^]?=[\\s\\t]*?\"[^\"]*?\"[\\s\\t]*?])+)([^,\\n\\s\\{]*)/mgi;\n        var attrRegex = /\\[[\\s\\t]*?(min|max)-(width|height)[\\s\\t]*?[~$\\^]?=[\\s\\t]*?\"([^\"]*?)\"[\\s\\t]*?]/mgi;\n\n        /**\n         * @param {String} css\n         */\n        function extractQuery(css) {\n            var match, smatch, attrs, attrMatch;\n\n            css = css.replace(/'/g, '\"');\n            while (null !== (match = regex.exec(css))) {\n                smatch = match[1] + match[3];\n                attrs = match[2];\n\n                while (null !== (attrMatch = attrRegex.exec(attrs))) {\n                    queueQuery(smatch, attrMatch[1], attrMatch[2], attrMatch[3]);\n                }\n            }\n        }\n\n        /**\n         * @param {CssRule[]|String} rules\n         */\n        function readRules(rules) {\n            var selector = '';\n\n            if (!rules) {\n                return;\n            }\n\n            if ('string' === typeof rules) {\n                rules = rules.toLowerCase();\n                if (-1 !== rules.indexOf('min-width') || -1 !== rules.indexOf('max-width')) {\n                    extractQuery(rules);\n                }\n            } else {\n                for (var i = 0, j = rules.length; i < j; i++) {\n                    if (1 === rules[i].type) {\n                        selector = rules[i].selectorText || rules[i].cssText;\n                        if (-1 !== selector.indexOf('min-height') || -1 !== selector.indexOf('max-height')) {\n                            extractQuery(selector);\n                        } else if (-1 !== selector.indexOf('min-width') || -1 !== selector.indexOf('max-width')) {\n                            extractQuery(selector);\n                        }\n                    } else if (4 === rules[i].type) {\n                        readRules(rules[i].cssRules || rules[i].rules);\n                    } else if (3 === rules[i].type) {\n                        if(rules[i].styleSheet.hasOwnProperty(\"cssRules\")) {\n                            readRules(rules[i].styleSheet.cssRules);\n                        }\n                    }\n                }\n            }\n        }\n\n        var defaultCssInjected = false;\n\n        /**\n         * Searches all css rules and setups the event listener to all elements with element query rules..\n         */\n        this.init = function () {\n            var animationStart = 'animationstart';\n            if (typeof document.documentElement.style['webkitAnimationName'] !== 'undefined') {\n                animationStart = 'webkitAnimationStart';\n            } else if (typeof document.documentElement.style['MozAnimationName'] !== 'undefined') {\n                animationStart = 'mozanimationstart';\n            } else if (typeof document.documentElement.style['OAnimationName'] !== 'undefined') {\n                animationStart = 'oanimationstart';\n            }\n\n            document.body.addEventListener(animationStart, function (e) {\n                var element = e.target;\n                var styles = element && window.getComputedStyle(element, null);\n                var animationName = styles && styles.getPropertyValue('animation-name');\n                var requiresSetup = animationName && (-1 !== animationName.indexOf('element-queries'));\n\n                if (requiresSetup) {\n                    element.elementQueriesSensor = new ResizeSensor(element, function () {\n                        if (element.elementQueriesSetupInformation) {\n                            element.elementQueriesSetupInformation.call();\n                        }\n                    });\n\n                    var sensorStyles = window.getComputedStyle(element.resizeSensor, null);\n                    var id = sensorStyles.getPropertyValue('min-width');\n                    id = parseInt(id.replace('px', ''));\n                    setupElement(e.target, idToSelectorMapping[id]);\n                }\n            });\n\n            if (!defaultCssInjected) {\n                cssStyleElement = document.createElement('style');\n                cssStyleElement.type = 'text/css';\n                cssStyleElement.innerHTML = '[responsive-image] > img, [data-responsive-image] {overflow: hidden; padding: 0; } [responsive-image] > img, [data-responsive-image] > img {width: 100%;}';\n\n                //safari wants at least one rule in keyframes to start working\n                cssStyleElement.innerHTML += '\\n@keyframes element-queries { 0% { visibility: inherit; } }';\n                document.getElementsByTagName('head')[0].appendChild(cssStyleElement);\n                defaultCssInjected = true;\n            }\n\n            for (var i = 0, j = document.styleSheets.length; i < j; i++) {\n                try {\n                    if (document.styleSheets[i].href && 0 === document.styleSheets[i].href.indexOf('file://')) {\n                        console.warn(\"CssElementQueries: unable to parse local css files, \" + document.styleSheets[i].href);\n                    }\n\n                    readRules(document.styleSheets[i].cssRules || document.styleSheets[i].rules || document.styleSheets[i].cssText);\n                } catch (e) {\n                }\n            }\n\n            findResponsiveImages();\n        };\n\n        /**\n         * Go through all collected rules (readRules()) and attach the resize-listener.\n         * Not necessary to call it manually, since we detect automatically when new elements\n         * are available in the DOM. However, sometimes handy for dirty DOM modifications.\n         *\n         * @param {HTMLElement} container only elements of the container are considered (document.body if not set)\n         */\n        this.findElementQueriesElements = function (container) {\n            findElementQueriesElements(container);\n        };\n\n        this.update = function () {\n            this.init();\n        };\n    };\n\n    ElementQueries.update = function () {\n        ElementQueries.instance.update();\n    };\n\n    /**\n     * Removes all sensor and elementquery information from the element.\n     *\n     * @param {HTMLElement} element\n     */\n    ElementQueries.detach = function (element) {\n        if (element.elementQueriesSetupInformation) {\n            //element queries\n            element.elementQueriesSensor.detach();\n            delete element.elementQueriesSetupInformation;\n            delete element.elementQueriesSensor;\n\n        } else if (element.resizeSensorInstance) {\n            //responsive image\n\n            element.resizeSensorInstance.detach();\n            delete element.resizeSensorInstance;\n        }\n    };\n\n    ElementQueries.init = function () {\n        if (!ElementQueries.instance) {\n            ElementQueries.instance = new ElementQueries();\n        }\n\n        ElementQueries.instance.init();\n    };\n\n    var domLoaded = function (callback) {\n        /* Mozilla, Chrome, Opera */\n        if (document.addEventListener) {\n            document.addEventListener('DOMContentLoaded', callback, false);\n        }\n        /* Safari, iCab, Konqueror */\n        else if (/KHTML|WebKit|iCab/i.test(navigator.userAgent)) {\n            var DOMLoadTimer = setInterval(function () {\n                if (/loaded|complete/i.test(document.readyState)) {\n                    callback();\n                    clearInterval(DOMLoadTimer);\n                }\n            }, 10);\n        }\n        /* Other web browsers */\n        else window.onload = callback;\n    };\n\n    ElementQueries.findElementQueriesElements = function (container) {\n        ElementQueries.instance.findElementQueriesElements(container);\n    };\n\n    ElementQueries.listen = function () {\n        domLoaded(ElementQueries.init);\n    };\n\n    return ElementQueries;\n\n}));\n","'use strict';\n\n/**\n * Copyright Marc J. Schmidt. See the LICENSE file at the top-level\n * directory of this distribution and at\n * https://github.com/marcj/css-element-queries/blob/master/LICENSE.\n */\n(function (root, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define(factory);\n    } else if (typeof exports === \"object\") {\n        module.exports = factory();\n    } else {\n        root.ResizeSensor = factory();\n    }\n}(typeof window !== 'undefined' ? window : this, function () {\n\n    // Make sure it does not throw in a SSR (Server Side Rendering) situation\n    if (typeof window === \"undefined\") {\n        return null;\n    }\n    // https://github.com/Semantic-Org/Semantic-UI/issues/3855\n    // https://github.com/marcj/css-element-queries/issues/257\n    var globalWindow = typeof window != 'undefined' && window.Math == Math\n        ? window\n        : typeof self != 'undefined' && self.Math == Math\n            ? self\n            : Function('return this')();\n    // Only used for the dirty checking, so the event callback count is limited to max 1 call per fps per sensor.\n    // In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and\n    // would generate too many unnecessary events.\n    var requestAnimationFrame = globalWindow.requestAnimationFrame ||\n        globalWindow.mozRequestAnimationFrame ||\n        globalWindow.webkitRequestAnimationFrame ||\n        function (fn) {\n            return globalWindow.setTimeout(fn, 20);\n        };\n\n    var cancelAnimationFrame = globalWindow.cancelAnimationFrame ||\n        globalWindow.mozCancelAnimationFrame ||\n        globalWindow.webkitCancelAnimationFrame ||\n        function (timer) {\n            globalWindow.clearTimeout(timer);\n        };\n\n    /**\n     * Iterate over each of the provided element(s).\n     *\n     * @param {HTMLElement|HTMLElement[]} elements\n     * @param {Function}                  callback\n     */\n    function forEachElement(elements, callback){\n        var elementsType = Object.prototype.toString.call(elements);\n        var isCollectionTyped = ('[object Array]' === elementsType\n            || ('[object NodeList]' === elementsType)\n            || ('[object HTMLCollection]' === elementsType)\n            || ('[object Object]' === elementsType)\n            || ('undefined' !== typeof jQuery && elements instanceof jQuery) //jquery\n            || ('undefined' !== typeof Elements && elements instanceof Elements) //mootools\n        );\n        var i = 0, j = elements.length;\n        if (isCollectionTyped) {\n            for (; i < j; i++) {\n                callback(elements[i]);\n            }\n        } else {\n            callback(elements);\n        }\n    }\n\n    /**\n    * Get element size\n    * @param {HTMLElement} element\n    * @returns {Object} {width, height}\n    */\n    function getElementSize(element) {\n        if (!element.getBoundingClientRect) {\n            return {\n                width: element.offsetWidth,\n                height: element.offsetHeight\n            }\n        }\n\n        var rect = element.getBoundingClientRect();\n        return {\n            width: Math.round(rect.width),\n            height: Math.round(rect.height)\n        }\n    }\n\n    /**\n     * Apply CSS styles to element.\n     *\n     * @param {HTMLElement} element\n     * @param {Object} style\n     */\n    function setStyle(element, style) {\n        Object.keys(style).forEach(function(key) {\n            element.style[key] = style[key];\n        });\n    }\n\n    /**\n     * Class for dimension change detection.\n     *\n     * @param {Element|Element[]|Elements|jQuery} element\n     * @param {Function} callback\n     *\n     * @constructor\n     */\n    var ResizeSensor = function(element, callback) {\n        //Is used when checking in reset() only for invisible elements\n        var lastAnimationFrameForInvisibleCheck = 0;\n\n        /**\n         *\n         * @constructor\n         */\n        function EventQueue() {\n            var q = [];\n            this.add = function(ev) {\n                q.push(ev);\n            };\n\n            var i, j;\n            this.call = function(sizeInfo) {\n                for (i = 0, j = q.length; i < j; i++) {\n                    q[i].call(this, sizeInfo);\n                }\n            };\n\n            this.remove = function(ev) {\n                var newQueue = [];\n                for(i = 0, j = q.length; i < j; i++) {\n                    if(q[i] !== ev) newQueue.push(q[i]);\n                }\n                q = newQueue;\n            };\n\n            this.length = function() {\n                return q.length;\n            }\n        }\n\n        /**\n         *\n         * @param {HTMLElement} element\n         * @param {Function}    resized\n         */\n        function attachResizeEvent(element, resized) {\n            if (!element) return;\n            if (element.resizedAttached) {\n                element.resizedAttached.add(resized);\n                return;\n            }\n\n            element.resizedAttached = new EventQueue();\n            element.resizedAttached.add(resized);\n\n            element.resizeSensor = document.createElement('div');\n            element.resizeSensor.dir = 'ltr';\n            element.resizeSensor.className = 'resize-sensor';\n\n            var style = {\n                pointerEvents: 'none',\n                position: 'absolute',\n                left: '0px',\n                top: '0px',\n                right: '0px',\n                bottom: '0px',\n                overflow: 'hidden',\n                zIndex: '-1',\n                visibility: 'hidden',\n                maxWidth: '100%'\n            };\n            var styleChild = {\n                position: 'absolute',\n                left: '0px',\n                top: '0px',\n                transition: '0s',\n            };\n\n            setStyle(element.resizeSensor, style);\n\n            var expand = document.createElement('div');\n            expand.className = 'resize-sensor-expand';\n            setStyle(expand, style);\n\n            var expandChild = document.createElement('div');\n            setStyle(expandChild, styleChild);\n            expand.appendChild(expandChild);\n\n            var shrink = document.createElement('div');\n            shrink.className = 'resize-sensor-shrink';\n            setStyle(shrink, style);\n\n            var shrinkChild = document.createElement('div');\n            setStyle(shrinkChild, styleChild);\n            setStyle(shrinkChild, { width: '200%', height: '200%' });\n            shrink.appendChild(shrinkChild);\n\n            element.resizeSensor.appendChild(expand);\n            element.resizeSensor.appendChild(shrink);\n            element.appendChild(element.resizeSensor);\n\n            var computedStyle = window.getComputedStyle(element);\n            var position = computedStyle ? computedStyle.getPropertyValue('position') : null;\n            if ('absolute' !== position && 'relative' !== position && 'fixed' !== position && 'sticky' !== position) {\n                element.style.position = 'relative';\n            }\n\n            var dirty = false;\n\n            //last request animation frame id used in onscroll event\n            var rafId = 0;\n            var size = getElementSize(element);\n            var lastWidth = 0;\n            var lastHeight = 0;\n            var initialHiddenCheck = true;\n            lastAnimationFrameForInvisibleCheck = 0;\n\n            var resetExpandShrink = function () {\n                var width = element.offsetWidth;\n                var height = element.offsetHeight;\n\n                expandChild.style.width = (width + 10) + 'px';\n                expandChild.style.height = (height + 10) + 'px';\n\n                expand.scrollLeft = width + 10;\n                expand.scrollTop = height + 10;\n\n                shrink.scrollLeft = width + 10;\n                shrink.scrollTop = height + 10;\n            };\n\n            var reset = function() {\n                // Check if element is hidden\n                if (initialHiddenCheck) {\n                    var invisible = element.offsetWidth === 0 && element.offsetHeight === 0;\n                    if (invisible) {\n                        // Check in next frame\n                        if (!lastAnimationFrameForInvisibleCheck){\n                            lastAnimationFrameForInvisibleCheck = requestAnimationFrame(function(){\n                                lastAnimationFrameForInvisibleCheck = 0;\n                                reset();\n                            });\n                        }\n\n                        return;\n                    } else {\n                        // Stop checking\n                        initialHiddenCheck = false;\n                    }\n                }\n\n                resetExpandShrink();\n            };\n            element.resizeSensor.resetSensor = reset;\n\n            var onResized = function() {\n                rafId = 0;\n\n                if (!dirty) return;\n\n                lastWidth = size.width;\n                lastHeight = size.height;\n\n                if (element.resizedAttached) {\n                    element.resizedAttached.call(size);\n                }\n            };\n\n            var onScroll = function() {\n                size = getElementSize(element);\n                dirty = size.width !== lastWidth || size.height !== lastHeight;\n\n                if (dirty && !rafId) {\n                    rafId = requestAnimationFrame(onResized);\n                }\n\n                reset();\n            };\n\n            var addEvent = function(el, name, cb) {\n                if (el.attachEvent) {\n                    el.attachEvent('on' + name, cb);\n                } else {\n                    el.addEventListener(name, cb);\n                }\n            };\n\n            addEvent(expand, 'scroll', onScroll);\n            addEvent(shrink, 'scroll', onScroll);\n\n            // Fix for custom Elements and invisible elements\n            lastAnimationFrameForInvisibleCheck = requestAnimationFrame(function(){\n                lastAnimationFrameForInvisibleCheck = 0;\n                reset();\n            });\n        }\n\n        forEachElement(element, function(elem){\n            attachResizeEvent(elem, callback);\n        });\n\n        this.detach = function(ev) {\n            // clean up the unfinished animation frame to prevent a potential endless requestAnimationFrame of reset\n            if (!lastAnimationFrameForInvisibleCheck) {\n                cancelAnimationFrame(lastAnimationFrameForInvisibleCheck);\n                lastAnimationFrameForInvisibleCheck = 0;\n            }\n            ResizeSensor.detach(element, ev);\n        };\n\n        this.reset = function() {\n            element.resizeSensor.resetSensor();\n        };\n    };\n\n    ResizeSensor.reset = function(element) {\n        forEachElement(element, function(elem){\n            elem.resizeSensor.resetSensor();\n        });\n    };\n\n    ResizeSensor.detach = function(element, ev) {\n        forEachElement(element, function(elem){\n            if (!elem) return;\n            if(elem.resizedAttached && typeof ev === \"function\"){\n                elem.resizedAttached.remove(ev);\n                if(elem.resizedAttached.length()) return;\n            }\n            if (elem.resizeSensor) {\n                if (elem.contains(elem.resizeSensor)) {\n                    elem.removeChild(elem.resizeSensor);\n                }\n                delete elem.resizeSensor;\n                delete elem.resizedAttached;\n            }\n        });\n    };\n\n    if (typeof MutationObserver !== \"undefined\") {\n        var observer = new MutationObserver(function (mutations) {\n            for (var i in mutations) {\n                if (mutations.hasOwnProperty(i)) {\n                    var items = mutations[i].addedNodes;\n                    for (var j = 0; j < items.length; j++) {\n                        if (items[j].resizeSensor) {\n                            ResizeSensor.reset(items[j]);\n                        }\n                    }\n                }\n            }\n        });\n\n        document.addEventListener(\"DOMContentLoaded\", function (event) {\n            observer.observe(document.body, {\n                childList: true,\n                subtree: true,\n            });\n        });\n    }\n\n    return ResizeSensor;\n\n}));\n"],"sourceRoot":""}