").parent().attr("hidden",a)),i._toggleImmediate(l,!0),i.toggleElement(s[0]._wrapper,a,e).then(function(){s.hasClass(i.clsOpen)===a&&(a||i._toggleImmediate(l,!1),s[0]._wrapper=null,l.unwrap())})}})}}})}function gt(t){t.component("alert",{mixins:[He,Me],args:"animation",props:{close:String},defaults:{animation:[!0],close:".uk-alert-close",duration:150,hideProps:{opacity:0}},events:[{name:"click",delegate:function(){return this.close},handler:function(t){t.preventDefault(),this.closeAlert()}}],methods:{closeAlert:function(){var t=this;this.toggleElement(this.$el).then(function(){return t.$destroy(!0)})}}})}function mt(t){t.component("cover",{mixins:[He],props:{automute:Boolean,width:Number,height:Number},defaults:{automute:!0},computed:{el:function(){return this.$el[0]},parent:function(){return this.$el.parent()[0]}},ready:function(){if(this.$el.is("iframe")&&(this.$el.css("pointerEvents","none"),this.automute)){var t=this.$el.attr("src");this.$el.attr("src",t+(~t.indexOf("?")?"&":"?")+"enablejsapi=1&api=1").on("load",function(t){return t.target.contentWindow.postMessage('{"event": "command", "func": "mute", "method":"setVolume", "value":0}',"*")})}},update:{write:function(){0!==this.el.offsetHeight&&this.$el.css({width:"",height:""}).css(ee.cover({width:this.width||this.el.clientWidth,height:this.height||this.el.clientHeight},{width:this.parent.offsetWidth,height:this.parent.offsetHeight}))},events:["load","resize"]},events:{loadedmetadata:function(){this.$emit()}}})}function vt(t){function e(){n||(n=!0,Gt.on("click",function(t){for(var e;i&&i!==e&&!l(t.target,i.$el)&&(!i.toggle||!l(t.target,i.toggle.$el));)e=i,i.hide(!1)}))}var i;t.component("drop",{mixins:[Le,Me],args:"pos",props:{mode:"list",toggle:Boolean,boundary:"jQuery",boundaryAlign:Boolean,delayShow:Number,delayHide:Number,clsDrop:String},defaults:{mode:["click","hover"],toggle:"- :first",boundary:window,boundaryAlign:!1,delayShow:0,delayHide:800,clsDrop:!1,hoverIdle:200,animation:["uk-animation-fade"],cls:"uk-open"},init:function(){this.tracker=new Y,this.clsDrop=this.clsDrop||"uk-"+this.$options.name,this.clsPos=this.clsDrop,this.$el.addClass(this.clsDrop)},ready:function(){this.updateAria(this.$el),this.toggle&&(this.toggle=t.toggle(g(this.toggle,this.$el),{target:this.$el,mode:this.mode}))},events:[{name:"click",delegate:function(){return"."+this.clsDrop+"-close"},handler:function(t){t.preventDefault(),this.hide(!1)}},{name:"click",delegate:function(){return'a[href^="#"]'},handler:function(t){if(!t.isDefaultPrevented()){var e=Vt(t.target).attr("href");1===e.length&&t.preventDefault(),1!==e.length&&l(e,this.$el)||this.hide(!1)}}},{name:"toggle",handler:function(t,e){e&&!this.$el.is(e.target)||(t.preventDefault(),this.isToggled()?this.hide(!1):this.show(e,!1))}},{name:ge,filter:function(){return~this.mode.indexOf("hover")},handler:function(t){nt(t)||(i&&i!==this&&i.toggle&&~i.toggle.mode.indexOf("hover")&&!l(t.target,i.$el)&&!l(t.target,i.toggle.$el)&&i.hide(!1),t.preventDefault(),this.show(this.toggle))}},{name:"toggleshow",handler:function(t,e){e&&!this.$el.is(e.target)||(t.preventDefault(),this.show(e||this.toggle))}},{name:"togglehide "+me,handler:function(t,e){nt(t)||e&&!this.$el.is(e.target)||(t.preventDefault(),this.toggle&&~this.toggle.mode.indexOf("hover")&&this.hide())}},{name:"beforeshow",self:!0,handler:function(){this.clearTimers()}},{name:"show",self:!0,handler:function(){this.tracker.init(),this.toggle.$el.addClass(this.cls).attr("aria-expanded","true"),e()}},{name:"beforehide",self:!0,handler:function(){this.clearTimers()}},{name:"hide",handler:function(t){var e=t.target;if(!this.$el.is(e))return void(i=null===i&&l(e,this.$el)&&this.isToggled()?this:i);i=this.isActive()?null:i,this.toggle.$el.removeClass(this.cls).attr("aria-expanded","false").blur().find("a, button").blur(),this.tracker.cancel()}}],update:{write:function(){this.isToggled()&&!Kt.inProgress(this.$el)&&this.position()},events:["resize"]},methods:{show:function(t,e){var n=this;void 0===e&&(e=!0);var o=function(){n.isToggled()||(n.position(),n.toggleElement(n.$el,!0))},s=function(){if(n.toggle=t||n.toggle,n.clearTimers(),!n.isActive()){if(e&&i&&i!==n&&i.isDelaying)return void(n.showTimer=setTimeout(n.show,10));if(n.isParentOf(i)){if(!i.hideTimer)return;i.hide(!1)}else if(i&&!n.isChildOf(i)&&!n.isParentOf(i))for(var s;i&&i!==s;)s=i,i.hide(!1);e&&n.delayShow?n.showTimer=setTimeout(o,n.delayShow):o(),i=n}};t&&this.toggle&&!this.toggle.$el.is(t.$el)?(this.$el.one("hide",s),this.hide(!1)):s()},hide:function(t){var e=this;void 0===t&&(t=!0);var i=function(){return e.toggleNow(e.$el,!1)};this.clearTimers(),this.isDelaying=this.tracker.movesTo(this.$el),t&&this.isDelaying?this.hideTimer=setTimeout(this.hide,this.hoverIdle):t&&this.delayHide?this.hideTimer=setTimeout(i,this.delayHide):i()},clearTimers:function(){clearTimeout(this.showTimer),clearTimeout(this.hideTimer),this.showTimer=null,this.hideTimer=null,this.isDelaying=!1},isActive:function(){return i===this},isChildOf:function(t){return t&&t!==this&&l(this.$el,t.$el)},isParentOf:function(t){return t&&t!==this&&l(t.$el,this.$el)},position:function(){c(this.$el,this.clsDrop+"-(stack|boundary)").css({top:"",left:""}),this.$el.show().toggleClass(this.clsDrop+"-boundary",this.boundaryAlign);var t=X(this.boundary),e=this.boundaryAlign?t:X(this.toggle.$el);if("justify"===this.align){var i="y"===this.getAxis()?"width":"height";this.$el.css(i,e[i])}else this.$el.outerWidth()>Math.max(t.right-e.left,e.right-t.left)&&(this.$el.addClass(this.clsDrop+"-stack"),this.$el.trigger("stack",[this]));this.positionAt(this.$el,this.boundaryAlign?this.boundary:this.toggle.$el,this.boundary),this.$el[0].style.display=""}}}),t.drop.getActive=function(){return i};var n}function wt(t){t.component("dropdown",t.components.drop.extend({name:"dropdown"}))}function yt(t){t.component("form-custom",{mixins:[He],args:"target",props:{target:Boolean},defaults:{target:!1},computed:{input:function(){return this.$el.find(":input:first")},state:function(){return this.input.next()},target:function(){return this.$props.target&&g(!0===this.$props.target?"> :input:first + :first":this.$props.target,this.$el)}},connected:function(){this.input.trigger("change")},events:[{name:"focusin focusout mouseenter mouseleave",delegate:":input:first",handler:function(t){var e=t.type;this.state.toggleClass("uk-"+(~e.indexOf("focus")?"focus":"hover"),~["focusin","mouseenter"].indexOf(e))}},{name:"change",handler:function(){this.target&&this.target[this.target.is(":input")?"val":"text"](this.input[0].files&&this.input[0].files[0]?this.input[0].files[0].name:this.input.is("select")?this.input.find("option:selected").text():this.input.val())}}]})}function bt(t){t.component("gif",{update:{read:function(){var t=d(this.$el);!this.isInView&&t&&(this.$el[0].src=this.$el[0].src),this.isInView=t},events:["scroll","load","resize"]}})}function $t(t){t.component("grid",t.components.margin.extend({mixins:[He],name:"grid",defaults:{margin:"uk-grid-margin",clsStack:"uk-grid-stack"},update:{write:function(){this.$el.toggleClass(this.clsStack,this.stacks)},events:["load","resize"]}}))}function xt(t){t.component("height-match",{args:"target",props:{target:String,row:Boolean},defaults:{target:"> *",row:!0},computed:{elements:function(){return Vt(this.target,this.$el)}},update:{read:function(){var t=this,e=!1;this.elements.css("minHeight",""),this.rows=this.row?this.elements.toArray().reduce(function(t,i){return e!==i.offsetTop?t.push([i]):t[t.length-1].push(i),e=i.offsetTop,t},[]).map(function(e){return t.match(Vt(e))}):[this.match(this.elements)]},write:function(){this.rows.forEach(function(t){var e=t.height,i=t.elements;return i&&i.each(function(t,i){return i.style.minHeight=e+"px"})})},events:["resize"]},methods:{match:function(t){if(t.length<2)return{};var e=0,i=[];return t=t.each(function(t,n){var o,s,r;0===n.offsetHeight&&(o=Vt(n),s=o.attr("style")||null,r=o.attr("hidden")||null,o.attr({style:s+";display:block !important;",hidden:null})),e=Math.max(e,n.offsetHeight),i.push(n.offsetHeight),o&&o.attr({style:s,hidden:r})}).filter(function(t){return i[t]
0&&this.$el.css("min-height",e=this.$el.outerHeight()+o)}else{var s=G(this.$el);if(s=this.$el.outerHeight()&&this.$el.css("height",e)},events:["load","resize"]}})}function Ct(t){i(function(){if(ue){var e="uk-hover";Qt.on("tap",function(t){var i=t.target;return Vt("."+e).filter(function(t,e){return!l(i,e)}).removeClass(e)}),Object.defineProperty(t,"hoverSelector",{set:function(t){Qt.on("tap",t,function(t){return t.currentTarget.classList.add(e)})}}),t.hoverSelector=".uk-animation-toggle, .uk-transition-toggle, [uk-hover]"}})}function Tt(e){function i(t,i){e.component(t,e.components.icon.extend({name:t,mixins:i?[i]:[],defaults:{icon:t}}))}var n={},o={spinner:Ke,totop:ti,"close-icon":Fe,"close-large":We,"navbar-toggle-icon":ze,"overlay-icon":qe,"pagination-next":Ye,"pagination-previous":Re,"search-icon":Ue,"search-large":Ve,"search-navbar":Xe,"slidenav-next":Ge,"slidenav-next-large":Qe,"slidenav-previous":Je,"slidenav-previous-large":Ze};e.component("icon",e.components.svg.extend({attrs:["icon","ratio"],mixins:[He],name:"icon",args:"icon",props:["icon"],defaults:{exclude:["id","style","class","src"]},init:function(){this.$el.addClass("uk-icon"),Jt&&(this.icon=H(H(this.icon,"left","right"),"previous","next"))},update:{read:function(){if(this.delay){var t=this.getIcon();t&&this.delay(t)}},events:["load"]},methods:{getSvg:function(){var t=this,e=this.getIcon();return e?w.resolve(e):"complete"!==document.readyState?w(function(e){t.delay=e}):w.reject("Icon not found.")},getIcon:function(){return o[this.icon]?(n[this.icon]||(n[this.icon]=this.parse(o[this.icon])),n[this.icon]):null}}})),["navbar-toggle-icon","overlay-icon","pagination-previous","pagination-next","totop"].forEach(function(t){return i(t)}),["slidenav-previous","slidenav-next"].forEach(function(t){return i(t,{init:function(){this.$el.addClass("uk-slidenav"),this.$el.hasClass("uk-slidenav-large")&&(this.icon+="-large")}})}),i("search-icon",{init:function(){this.$el.hasClass("uk-search-icon")&&this.$el.parents(".uk-search-large").length?this.icon="search-large":this.$el.parents(".uk-search-navbar").length&&(this.icon="search-navbar")}}),i("close",{init:function(){this.icon="close-"+(this.$el.hasClass("uk-close-large")?"large":"icon")}}),i("spinner",{connected:function(){var t=this;this.height=this.width=this.$el.width(),this.svg.then(function(e){var i=Vt(e).find("circle"),n=Math.floor(t.width/2);e.setAttribute("viewBox","0 0 "+t.width+" "+t.width),i.attr({cx:n,cy:n,r:n-parseFloat(i.css("stroke-width")||0)})})}}),e.icon.add=function(e){return t.extend(o,e)}}function _t(t){t.component("margin",{props:{margin:String,firstColumn:Boolean},defaults:{margin:"uk-margin-small-top",firstColumn:"uk-first-column"},update:{read:function(){var t=this;if(0===this.$el[0].offsetHeight)return void(this.hidden=!0);this.hidden=!1,this.stacks=!0;var e=this.$el.children().filter(function(t,e){return e.offsetHeight>0});this.rows=[[e.get(0)]],e.slice(1).each(function(e,i){for(var n=Math.ceil(i.offsetTop),o=n+i.offsetHeight,s=t.rows.length-1;s>=0;s--){var r=t.rows[s],a=Math.ceil(r[0].offsetTop);if(n>=a+r[0].offsetHeight){t.rows.push([i]);break}if(o>a){if(t.stacks=!1,i.offsetLeftthis.panel.outerHeight(!0)).css("display",this.$el.hasClass("uk-flex")?"":"block")},events:["resize"]},events:[{name:"beforeshow",self:!0,handler:function(){this.$el.css("display","block").height()}},{name:"hidden",self:!0,handler:function(){this.$el.css("display","").removeClass("uk-flex uk-flex-center uk-flex-middle")}}]}),e.component("overflow-auto",{mixins:[He],computed:{panel:function(){return this.$el.closest(".uk-modal-dialog")}},connected:function(){this.$el.css("min-height",150)},update:{write:function(){var t=this.$el.css("max-height");this.$el.css("max-height",150).css("max-height",Math.max(150,150-(this.panel.outerHeight(!0)-window.innerHeight))),t!==this.$el.css("max-height")&&this.$el.trigger("resize")},events:["load","resize"]}}),e.modal.dialog=function(t,i){var n=e.modal('",i);return n.$el.on("hidden",function(t){t.target===t.currentTarget&&n.$destroy(!0)}),n.show(),n},e.modal.alert=function(i,n){return n=t.extend({bgClose:!1,escClose:!1,labels:e.modal.labels},n),w(function(t){return e.modal.dialog('\n '+(k(i)?i:Vt(i).html())+'
\n \n ",n).$el.on("hide",t)})},e.modal.confirm=function(i,n){return n=t.extend({bgClose:!1,escClose:!1,labels:e.modal.labels},n),w(function(t,o){return e.modal.dialog('\n '+(k(i)?i:Vt(i).html())+'
\n \n ",n).$el.on("click",".uk-modal-footer button",function(e){return 0===Vt(e.target).index()?o():t()})})},e.modal.prompt=function(i,n,o){return o=t.extend({bgClose:!1,escClose:!1,labels:e.modal.labels},o),w(function(t){var s=!1,r=e.modal.dialog('\n \n ",o),a=r.$el.find("input").val(n);r.$el.on("submit","form",function(e){e.preventDefault(),t(a.val()),s=!0,r.hide()}).on("hide",function(){s||t(null)})})},e.modal.labels={ok:"Ok",cancel:"Cancel"}}function Et(t){t.component("nav",t.components.accordion.extend({name:"nav",defaults:{targets:"> .uk-parent",toggle:"> a",content:"ul:first"}}))}function At(e){e.component("navbar",{mixins:[He],props:{dropdown:String,mode:"list",align:String,offset:Number,boundary:Boolean,boundaryAlign:Boolean,clsDrop:String,delayShow:Number,delayHide:Number,dropbar:Boolean,dropbarMode:String,dropbarAnchor:"jQuery",duration:Number},defaults:{dropdown:".uk-navbar-nav > li",align:Jt?"right":"left",clsDrop:"uk-navbar-dropdown",mode:void 0,offset:void 0,delayShow:void 0,delayHide:void 0,boundaryAlign:void 0,flip:"x",boundary:!0,dropbar:!1,dropbarMode:"slide",dropbarAnchor:!1,duration:200},computed:{boundary:function(){return!0===this.$props.boundary||this.boundaryAlign?this.$el:this.$props.boundary},pos:function(){return"bottom-"+this.align}},ready:function(){this.dropbar&&e.navbarDropbar(g(this.dropbar,this.$el)||Vt("
").insertAfter(this.dropbarAnchor||this.$el),{clsDrop:this.clsDrop,mode:this.dropbarMode,duration:this.duration,navbar:this})},update:function(){e.drop(Vt(this.dropdown+" ."+this.clsDrop,this.$el),t.extend({},this))},events:[{name:ge,delegate:function(){return this.dropdown},handler:function(t){var e=t.currentTarget,i=this.getActive();i&&i.toggle&&!l(i.toggle.$el,e)&&!i.tracker.movesTo(i.$el)&&i.hide(!1)}}],methods:{getActive:function(){var t=e.drop.getActive();return t&&"click"!==t.mode&&l(t.toggle.$el,this.$el)&&t}}}),e.component("navbar-dropbar",{mixins:[He],defaults:{clsDrop:"",mode:"slide",navbar:null,duration:200},init:function(){"slide"===this.mode&&this.$el.addClass("uk-navbar-dropbar-slide")},events:[{name:"beforeshow",el:function(){return this.navbar.$el},handler:function(t,e){var i=e.$el;if("bottom"===e.dir&&!l(i,this.$el))return i.appendTo(this.$el),e.show(),!1}},{name:"mouseleave",handler:function(){var t=this.navbar.getActive();t&&!this.$el.is(":hover")&&t.hide()}},{name:"beforeshow",handler:function(t,e){var i=e.$el;this.clsDrop&&i.addClass(this.clsDrop+"-dropbar"),this.transitionTo(i.outerHeight(!0))}},{name:"beforehide",handler:function(t,e){var i=e.$el,n=this.navbar.getActive();if(this.$el.is(":hover")&&n&&n.$el.is(i))return!1}},{name:"hide",handler:function(t,e){var i=e.$el,n=this.navbar.getActive();(!n||n&&n.$el.is(i))&&this.transitionTo(0)}}],methods:{transitionTo:function(t){var e=this;return this.$el.height(this.$el[0].offsetHeight?this.$el.height():0),Zt.cancel(this.$el).then(function(){return Zt.start(e.$el,{height:t},e.duration)})}}})}function Ot(t){t.component("offcanvas",{mixins:[je],args:"mode",props:{content:String,mode:String,flip:Boolean,overlay:Boolean},defaults:{content:".uk-offcanvas-content:first",mode:"slide",flip:!1,overlay:!1,clsPage:"uk-offcanvas-page",clsContainer:"uk-offcanvas-container",clsPanel:"uk-offcanvas-bar",clsFlip:"uk-offcanvas-flip",clsContent:"uk-offcanvas-content",clsContentAnimation:"uk-offcanvas-content-animation",clsSidebarAnimation:"uk-offcanvas-bar-animation",clsMode:"uk-offcanvas",clsOverlay:"uk-offcanvas-overlay",selClose:".uk-offcanvas-close"},computed:{content:function(){return Vt(g(this.$props.content,this.$el))},clsFlip:function(){return this.flip?this.$props.clsFlip:""},clsOverlay:function(){return this.overlay?this.$props.clsOverlay:""},clsMode:function(){return this.$props.clsMode+"-"+this.mode},clsSidebarAnimation:function(){return"none"===this.mode||"reveal"===this.mode?"":this.$props.clsSidebarAnimation},clsContentAnimation:function(){return"push"!==this.mode&&"reveal"!==this.mode?"":this.$props.clsContentAnimation},transitionElement:function(){return"reveal"===this.mode?this.panel.parent():this.panel}},update:{write:function(){this.isToggled()&&((this.overlay||this.clsContentAnimation)&&this.content.width(window.innerWidth-this.scrollbarWidth),this.overlay&&(this.content.height(window.innerHeight),Pe&&this.content.scrollTop(Pe.y)))},events:["resize"]},events:[{name:"beforeshow",self:!0,handler:function(){Pe=Pe||{x:window.pageXOffset,y:window.pageYOffset},"reveal"!==this.mode||this.panel.parent().hasClass(this.clsMode)||this.panel.wrap("").parent().addClass(this.clsMode),Qt.css("overflow-y",(!this.clsContentAnimation||this.flip)&&this.scrollbarWidth&&this.overlay?"scroll":""),this.body.addClass(this.clsContainer+" "+this.clsFlip+" "+this.clsOverlay).height(),this.content.addClass(this.clsContentAnimation),this.panel.addClass(this.clsSidebarAnimation+" "+("reveal"!==this.mode?this.clsMode:"")),this.$el.addClass(this.clsOverlay).css("display","block").height()}},{name:"beforehide",self:!0,handler:function(){this.content.removeClass(this.clsContentAnimation),("none"===this.mode||this.getActive()&&this.getActive()!==this)&&this.panel.trigger(we)}},{name:"hidden",self:!0,handler:function(){"reveal"===this.mode&&this.panel.unwrap(),this.overlay||(Pe={x:window.pageXOffset,y:window.pageYOffset}),this.panel.removeClass(this.clsSidebarAnimation+" "+this.clsMode),this.$el.removeClass(this.clsOverlay).css("display",""),this.body.removeClass(this.clsContainer+" "+this.clsFlip+" "+this.clsOverlay).scrollTop(Pe.y),Qt.css("overflow-y",""),this.content.width("").height(""),window.scrollTo(Pe.x,Pe.y),Pe=null}},{name:"swipeLeft swipeRight",handler:function(t){this.isToggled()&&nt(t)&&("swipeLeft"===t.type&&!this.flip||"swipeRight"===t.type&&this.flip)&&this.hide()}}]})}function Dt(t){t.component("responsive",{props:["width","height"],init:function(){this.$el.addClass("uk-responsive-width")},update:{write:function(){this.$el.is(":visible")&&this.width&&this.height&&this.$el.height(ee.fit({height:this.height,width:this.width},{width:this.$el.parent().width(),height:this.height||this.$el.height()}).height)},events:["load","resize"]}})}function It(t){t.component("scroll",{props:{duration:Number,transition:String,offset:Number},defaults:{duration:1e3,
+transition:"easeOutExpo",offset:0},methods:{scrollToElement:function(t){var e=this;t=Vt(t);var i=G(t)-this.offset,n=document.documentElement.offsetHeight,o=window.innerHeight;i+o>n&&(i=n-o),Vt("html,body").stop().animate({scrollTop:Math.round(i)},this.duration,this.transition).promise().then(function(){return e.$el.trigger("scrolled",[e])})}},events:{click:function(t){t.isDefaultPrevented()||(t.preventDefault(),this.scrollToElement(Vt(this.$el[0].hash).length?this.$el[0].hash:"body"))}}}),Vt.easing.easeOutExpo||(Vt.easing.easeOutExpo=function(t,e,i,n,o){return e===o?i+n:n*(1-Math.pow(2,-10*e/o))+i})}function Nt(t){t.component("scrollspy",{args:"cls",props:{cls:"list",target:String,hidden:Boolean,offsetTop:Number,offsetLeft:Number,repeat:Boolean,delay:Number},defaults:{cls:["uk-scrollspy-inview"],target:!1,hidden:!0,offsetTop:0,offsetLeft:0,repeat:!1,delay:0,inViewClass:"uk-scrollspy-inview"},init:function(){this.$emitSync()},computed:{elements:function(){return this.target&&Vt(this.target,this.$el)||this.$el}},update:[{write:function(){this.hidden&&this.elements.filter(":not(."+this.inViewClass+")").css("visibility","hidden")}},{read:function(){var t=this;this.elements.each(function(e,i){if(!i._scrollspy){var n=Vt(i).attr("uk-scrollspy-class");i._scrollspy={toggles:n&&n.split(",")||t.cls}}i._scrollspy.show=d(i,t.offsetTop,t.offsetLeft)})},write:function(){var t=this,e=1===this.elements.length?1:0;this.elements.each(function(i,n){var o=Vt(n),s=n._scrollspy;s.show?s.inview||s.timer||(s.timer=setTimeout(function(){o.css("visibility","").addClass(t.inViewClass).toggleClass(s.toggles[0]).trigger("inview"),s.inview=!0,delete s.timer},t.delay*e++)):s.inview&&t.repeat&&(s.timer&&(clearTimeout(s.timer),delete s.timer),o.removeClass(t.inViewClass).toggleClass(s.toggles[0]).css("visibility",t.hidden?"hidden":"").trigger("outview"),s.inview=!1),s.toggles.reverse()})},events:["scroll","load","resize"]}]})}function Bt(t){t.component("scrollspy-nav",{props:{cls:String,closest:String,scroll:Boolean,overflow:Boolean,offset:Number},defaults:{cls:"uk-active",closest:!1,scroll:!1,overflow:!0,offset:0},computed:{links:function(){return this.$el.find('a[href^="#"]').filter(function(t,e){return e.hash})},elements:function(){return this.closest?this.links.closest(this.closest):this.links},targets:function(){return Vt(this.links.toArray().map(function(t){return t.hash}).join(","))}},update:[{read:function(){this.scroll&&t.scroll(this.links,{offset:this.offset||0})}},{read:function(){var t=this,e=window.pageYOffset+this.offset,i=document.documentElement.scrollHeight-window.innerHeight+this.offset;this.active=!1,this.targets.each(function(n,o){o=Vt(o);var s=G(o),r=n+1===t.targets.length;if(!t.overflow&&(0===n&&s>e||r&&s+o[0].offsetTop
=i)for(var a=t.targets.length-1;a>n;a--)if(d(t.targets.eq(a))){o=t.targets.eq(a);break}return!(t.active=E(t.links.filter('[href="#'+o.attr("id")+'"]')))}})},write:function(){this.links.blur(),this.elements.removeClass(this.cls),this.active&&this.$el.trigger("active",[this.active,(this.closest?this.active.closest(this.closest):this.active).addClass(this.cls)])},events:["scroll","load","resize"]}]})}function Pt(e){e.component("sticky",{mixins:[He],attrs:!0,props:{top:null,bottom:Boolean,offset:Number,animation:String,clsActive:String,clsInactive:String,clsFixed:String,widthElement:"jQuery",showOnUp:Boolean,media:"media",target:Number},defaults:{top:0,bottom:!1,offset:0,animation:"",clsActive:"uk-active",clsInactive:"",clsFixed:"uk-sticky-fixed",widthElement:!1,showOnUp:!1,media:!1,target:!1},connected:function(){this.placeholder=Vt('
'),this.widthElement=this.$props.widthElement||this.placeholder,this.isActive||this.$el.addClass(this.clsInactive)},disconnected:function(){this.isActive&&(this.isActive=!1,this.hide(),this.$el.removeClass(this.clsInactive)),this.placeholder.remove(),this.placeholder=null,this.widthElement=null},ready:function(){var t=this;if(this.target&&location.hash&&window.pageYOffset>0){var e=g(location.hash);e&&ae(function(){var i=G(e),n=G(t.$el),o=t.$el[0].offsetHeight;n+o>=i&&n<=i+e[0].offsetHeight&&window.scrollTo(0,i-o-t.target-t.offset)})}},update:[{write:function(){var e,i=this,n=this.$el[0].offsetHeight;this.placeholder.css("height","absolute"!==this.$el.css("position")?n:"").css(this.$el.css(["marginTop","marginBottom","marginLeft","marginRight"])),document.documentElement.contains(this.placeholder[0])||this.placeholder.insertAfter(this.$el).attr("hidden",!0),this.width=this.widthElement.attr("hidden",null)[0].offsetWidth,this.widthElement.attr("hidden",!this.isActive),this.topOffset=G(this.isActive?this.placeholder:this.$el),this.bottomOffset=this.topOffset+n,["top","bottom"].forEach(function(n){i[n]=i.$props[n],i[n]&&(t.isNumeric(i[n])?i[n]=i[n+"Offset"]+parseFloat(i[n]):k(i[n])&&i[n].match(/^-?\d+vh$/)?i[n]=window.innerHeight*parseFloat(i[n])/100:(e=!0===i[n]?i.$el.parent():g(i[n],i.$el))&&(i[n]=G(e)+e[0].offsetHeight))}),this.top=Math.max(parseFloat(this.top),this.topOffset)-this.offset,this.bottom=this.bottom&&this.bottom-n,this.inactive=this.media&&!window.matchMedia(this.media).matches,this.isActive&&this.update()},events:["load","resize"]},{read:function(){this.offsetTop=G(this.$el)},write:function(t){var e=this;void 0===t&&(t={});var i=t.dir,n=window.pageYOffset;if(!(n<0||!this.$el.is(":visible")||this.disabled||this.showOnUp&&!i))if(this.inactive||nthis.top;this.bottom&&e>this.bottom-this.offset&&(t=this.bottom-e),this.$el.css({position:"fixed",top:t+"px",width:this.width}).addClass(this.clsFixed).toggleClass(this.clsActive,i).toggleClass(this.clsInactive,!i)}}})}function Ht(e){e.component("svg",{attrs:!0,props:{id:String,icon:String,src:String,style:String,width:Number,height:Number,ratio:Number,class:String},defaults:{ratio:1,id:!1,exclude:["src"],class:""},init:function(){this.class+=" uk-svg"},connected:function(){var t=this;if(!this.icon&&this.src&&~this.src.indexOf("#")){var e=this.src.split("#");e.length>1&&(this.src=e[0],this.icon=e[1])}this.width=this.$props.width,this.height=this.$props.height,this.svg=this.getSvg().then(function(e){return w(function(i,n){return $e.mutate(function(){var o,s;if(!e)return void n("SVG not found.");if(t.icon)if(o=e.getElementById(t.icon)){var r=o.outerHTML;if(!r){var a=document.createElement("div");a.appendChild(o.cloneNode(!0)),r=a.innerHTML}r=r.replace(//g,"svg>"),s=ii.parseFromString(r,"image/svg+xml").documentElement}else e.querySelector("symbol")||(s=e.documentElement.cloneNode(!0));else s=e.documentElement.cloneNode(!0);if(!s)return void n("SVG not found.");var l=s.getAttribute("viewBox");l&&(l=l.split(" "),t.width=t.width||l[2],t.height=t.height||l[3]),t.width*=t.ratio,t.height*=t.ratio;for(var h in t.$options.props)t[h]&&!~t.exclude.indexOf(h)&&s.setAttribute(h,t[h]);t.id||s.removeAttribute("id"),t.width&&!t.height&&s.removeAttribute("height"),t.height&&!t.width&&s.removeAttribute("width");var c=t.$el[0];p(c)||"CANVAS"===c.tagName?(t.$el.attr({hidden:!0,id:null}),c.nextSibling?c.parentNode.insertBefore(s,c.nextSibling):c.parentNode.appendChild(s)):c.appendChild(s),i(s)})})}).then(null,function(){}),this._isReady||this.$emitSync()},disconnected:function(){p(this.$el)&&this.$el.attr({hidden:null,id:this.id||null}),this.svg&&(this.svg.then(function(t){return t&&t.parentNode&&t.parentNode.removeChild(t)}),this.svg=null)},methods:{getSvg:function(){var e=this;return this.src?ei[this.src]?ei[this.src]:(ei[this.src]=w(function(i,n){0===e.src.lastIndexOf("data:",0)?i(e.parse(decodeURIComponent(e.src.split(",")[1]))):t.ajax(e.src,{dataType:"html"}).then(function(t){i(e.parse(t))},function(){n("SVG not found.")})}),ei[this.src]):w.reject()},parse:function(t){var e=ii.parseFromString(t,"image/svg+xml");return e.documentElement&&"svg"===e.documentElement.nodeName?e:null}}})}function Mt(t){t.component("switcher",{mixins:[Me],args:"connect",props:{connect:String,toggle:String,active:Number,swiping:Boolean},defaults:{connect:!1,toggle:" > *",active:0,swiping:!0,cls:"uk-active",clsContainer:"uk-switcher",attrItem:"uk-switcher-item",queued:!0},connected:function(){this.$emitSync()},computed:{connects:function(){return g(this.connect,this.$el)||Vt(this.$el.next("."+this.clsContainer))},toggles:function(){return Vt(this.toggle,this.$el)}},events:[{name:"click",delegate:function(){return this.toggle+":not(.uk-disabled)"},handler:function(t){t.preventDefault(),this.show(t.currentTarget)}},{name:"click",el:function(){return this.connects},delegate:function(){return"["+this.attrItem+"],[data-"+this.attrItem+"]"},handler:function(t){t.preventDefault(),this.show(Vt(t.currentTarget)[t.currentTarget.hasAttribute(this.attrItem)?"attr":"data"](this.attrItem))}},{name:"swipeRight swipeLeft",filter:function(){return this.swiping},el:function(){return this.connects},handler:function(t){nt(t)&&(t.preventDefault(),window.getSelection().toString()||this.show("swipeLeft"===t.type?"next":"previous"))}}],update:function(){this.updateAria(this.connects.children()),this.show(E(this.toggles.filter("."+this.cls+":first"))||E(this.toggles.eq(this.active))||this.toggles.first())},methods:{show:function(t){for(var e,i=this,n=this.toggles.length,o=this.connects.children("."+this.cls).index(),s=o>=0,r=f(t,this.toggles,o),a="previous"===t?-1:1,l=0;l=0&&e.hasClass(this.cls)||o===r||(this.toggles.removeClass(this.cls).attr("aria-expanded",!1),e.addClass(this.cls).attr("aria-expanded",!0),s?this.toggleElement(this.connects.children(":nth-child("+(o+1)+"),:nth-child("+(r+1)+")")):this.toggleNow(this.connects.children(":nth-child("+(r+1)+")")))}}})}function jt(t){t.component("tab",t.components.switcher.extend({mixins:[He],name:"tab",props:{media:"media"},defaults:{media:960,attrItem:"uk-tab-item"},init:function(){var e=this.$el.hasClass("uk-tab-left")&&"uk-tab-left"||this.$el.hasClass("uk-tab-right")&&"uk-tab-right";e&&t.toggle(this.$el,{cls:e,mode:"media",media:this.media})}}))}function Lt(e){e.component("toggle",{mixins:[e.mixin.togglable],args:"target",props:{href:String,target:null,mode:"list",media:"media"},defaults:{href:!1,target:!1,mode:"click",queued:!0,media:!1},computed:{target:function(){return g(this.$props.target||this.href,this.$el)||this.$el}},events:[{name:ge+" "+me,filter:function(){return~this.mode.indexOf("hover")},handler:function(t){nt(t)||this.toggle("toggle"+(t.type===ge?"show":"hide"))}},{name:"click",filter:function(){return~this.mode.indexOf("click")||ue},handler:function(t){if(nt(t)||~this.mode.indexOf("click")){var e=Vt(t.target).closest("a[href]");(Vt(t.target).closest('a[href="#"], button').length||e.length&&(this.cls||!this.target.is(":visible")||"#"===e.attr("href")[0]&&this.target.is(e.attr("href"))))&&t.preventDefault(),this.toggle()}}}],update:{write:function(){if(~this.mode.indexOf("media")&&this.media){var t=this.isToggled(this.target);(window.matchMedia(this.media).matches?!t:t)&&this.toggle()}},events:["load","resize"]},methods:{toggle:function(e){var i=t.Event(e||"toggle");this.target.triggerHandler(i,[this]),i.isDefaultPrevented()||this.toggleElement(this.target)}}})}function Ft(t){t.component("leader",{mixins:[He],props:{fill:String,media:"media"},defaults:{fill:"",media:!1,clsWrapper:"uk-leader-fill",clsHide:"uk-leader-hide",attrFill:"data-fill"},computed:{fill:function(){return this.$props.fill||j("leader-fill")}},connected:function(){this.wrapper=this.$el.wrapInner('').children().first()},disconnected:function(){this.wrapper.contents().unwrap()},update:[{read:function(){var t=this._width;this._width=Math.floor(this.$el[0].offsetWidth/2),this._changed=t!==this._width,this._hide=this.media&&!window.matchMedia(this.media).matches},write:function(){this.wrapper.toggleClass(this.clsHide,this._hide),this._changed&&this.wrapper.attr(this.attrFill,Array(this._width).join(this.fill))},events:["load","resize"]}]})}function Wt(t){function e(t){var e=t-Date.now();return{total:e,seconds:e/1e3%60,minutes:e/1e3/60%60,hours:e/1e3/60/60%24,days:e/1e3/60/60/24}}Wt.installed||t.component("countdown",{mixins:[t.mixin.class],attrs:!0,props:{date:String,clsWrapper:String},defaults:{date:"",clsWrapper:".uk-countdown-%unit%"},computed:{date:function(){return Date.parse(this.$props.date)},days:function(){return this.$el.find(this.clsWrapper.replace("%unit%","days"))},hours:function(){return this.$el.find(this.clsWrapper.replace("%unit%","hours"))},minutes:function(){return this.$el.find(this.clsWrapper.replace("%unit%","minutes"))},seconds:function(){return this.$el.find(this.clsWrapper.replace("%unit%","seconds"))},units:function(){var t=this;return["days","hours","minutes","seconds"].filter(function(e){return t[e].length})}},connected:function(){this.start()},disconnected:function(){var t=this;this.stop(),this.units.forEach(function(e){return t[e].empty()})},update:{write:function(){var t=this,i=e(this.date);i.total<=0&&(this.stop(),i.days=i.hours=i.minutes=i.seconds=0),this.units.forEach(function(e){var n=String(Math.floor(i[e]));if(n=n.length<2?"0"+n:n,t[e].text()!==n){var o=t[e];n=n.split(""),n.length!==o.children().length&&o.empty().append(n.map(function(){return" "}).join("")),n.forEach(function(t,e){return o[0].childNodes[e].innerText=t})}})}},methods:{start:function(){var t=this;this.stop(),this.date&&this.units.length&&(this.$emit(),this.timer=setInterval(function(){return t.$emit()},1e3))},stop:function(){this.timer&&(clearInterval(this.timer),this.timer=null)}}})}function zt(t){if(!zt.installed){var e=t.util,i=e.$,n=e.ajax,o=e.doc,s=e.Event,r=e.extend,a=e.Dimensions,l=e.getIndex,h=e.Transition;t.component("lightbox",{name:"lightbox",props:{toggle:String,duration:Number,inverse:Boolean},defaults:{toggle:"a",duration:400,dark:!1,attrItem:"uk-lightbox-item",items:[],index:0},computed:{toggles:function(){var t=this;return i(this.toggle,this.$el).each(function(e,i){return t.items.push({source:i.getAttribute("href"),title:i.getAttribute("title"),type:i.getAttribute("type")})})}},events:[{name:"click",delegate:function(){return this.toggle+":not(.uk-disabled)"},handler:function(t){t.preventDefault(),this.show(this.toggles.index(t.currentTarget))}},{name:"showitem",handler:function(t){this.getItem().content&&(this.$update(),t.stopImmediatePropagation())}}],update:{write:function(){var t=this,e=this.getItem();if(this.modal&&e.content){var n=this.modal.panel,o={width:n.width(),height:n.height()},s={width:window.innerWidth-(n.outerWidth(!0)-o.width),height:window.innerHeight-(n.outerHeight(!0)-o.height)},r=a.fit({width:e.width,height:e.height},s);h.stop(n),h.stop(this.modal.content),this.modal.content&&this.modal.content.remove(),this.modal.content=i(e.content).css("opacity",0).appendTo(n),n.css(o),h.start(n,r,this.duration).then(function(){h.start(t.modal.content,{opacity:1},400).then(function(){n.find("[uk-transition-hide]").show(),n.find("[uk-transition-show]").hide()})})}},events:["resize"]},methods:{show:function(e){var n=this;this.index=l(e,this.items,this.index),this.modal||(this.modal=t.modal.dialog('\n \n \n ',{center:!0}),this.modal.$el.css("overflow","hidden").addClass("uk-modal-lightbox"),this.modal.panel.css({width:200,height:200}),this.modal.caption=i('
').appendTo(this.modal.panel),this.items.length>1&&i('\n ').appendTo(this.modal.panel.addClass("uk-slidenav-position")),this.modal.$el.on("hidden",this.hide).on("click","["+this.attrItem+"]",function(t){t.preventDefault(),n.show(i(t.currentTarget).attr(n.attrItem))}).on("swipeRight swipeLeft",function(t){t.preventDefault(),window.getSelection().toString()||n.show("swipeLeft"===t.type?"next":"previous")})),this.modal.panel.find("[uk-transition-hide]").hide(),this.modal.panel.find("[uk-transition-show]").show(),this.modal.content&&this.modal.content.remove(),this.modal.caption.text(this.getItem().title);var r=s("showitem");this.$el.trigger(r),r.isImmediatePropagationStopped()||this.setError(this.getItem()),o.on("keydown."+this.$options.name,function(t){switch(t.keyCode){case 37:n.show("previous");break;case 39:n.show("next")}})},hide:function(){var t=this;o.off("keydown."+this.$options.name),this.modal.hide().then(function(){t.modal.$destroy(!0),t.modal=null})},getItem:function(){return this.items[this.index]||{source:"",title:"",type:""}},setItem:function(t,e,i,n){void 0===i&&(i=200),void 0===n&&(n=200),r(t,{content:e,width:i,height:n}),this.$update()},setError:function(t){this.setItem(t,'Loading resource failed!
',400,300)}}}),t.mixin({events:{showitem:function(t){var e=this,i=this.getItem();if("image"===i.type||!i.source||i.source.match(/\.(jp(e)?g|png|gif|svg)$/i)){var n=new Image;n.onerror=function(){return e.setError(i)},n.onload=function(){return e.setItem(i,' ',n.width,n.height)},n.src=i.source,t.stopImmediatePropagation()}}}},"lightbox"),t.mixin({events:{showitem:function(t){var e=this,n=this.getItem();if("video"===n.type||!n.source||n.source.match(/\.(mp4|webm|ogv)$/i)){var o=i(' ').on("loadedmetadata",function(){return e.setItem(n,o.attr({width:o[0].videoWidth,height:o[0].videoHeight}),o[0].videoWidth,o[0].videoHeight)}).attr("src",n.source);t.stopImmediatePropagation()}}}},"lightbox"),t.mixin({events:{showitem:function(t){var e,i=this,n=this.getItem();if((e=n.source.match(/\/\/.*?youtube\.[a-z]+\/watch\?v=([^&]+)&?(.*)/))||n.source.match(/youtu\.be\/(.*)/)){var o=e[1],s=new Image,r=!1,a=function(t,e){return i.setItem(n,'',t,e)};s.onerror=function(){return a(640,320)},s.onload=function(){120===s.width&&90===s.height?r?a(640,320):(r=!0,s.src="//img.youtube.com/vi/"+o+"/0.jpg"):a(s.width,s.height)},s.src="//img.youtube.com/vi/"+o+"/maxresdefault.jpg",t.stopImmediatePropagation()}}}},"lightbox"),t.mixin({events:{showitem:function(t){var e,i=this,o=this.getItem();if(e=o.source.match(/(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/)){var s=e[2],r=function(t,e){return i.setItem(o,'',t,e)};n({type:"GET",url:"http://vimeo.com/api/oembed.json?url="+encodeURI(o.source),jsonp:"callback",dataType:"jsonp"}).then(function(t){return r(t.width,t.height)}),t.stopImmediatePropagation()}}}},"lightbox")}}function qt(t){if(!qt.installed){var e=t.util,i=e.$,n=e.each,o=e.pointerEnter,s=e.pointerLeave,r=e.Transition,a={};t.component("notification",{functional:!0,args:["message","status"],defaults:{message:"",status:"",timeout:5e3,group:null,pos:"top-center",onClose:null,clsClose:"uk-notification-close"},created:function(){a[this.pos]||(a[this.pos]=i('
').appendTo(t.container)),this.$mount(i('").appendTo(a[this.pos].show())[0])},ready:function(){var t=this,e=parseInt(this.$el.css("margin-bottom"),10);r.start(this.$el.css({opacity:0,marginTop:-1*this.$el.outerHeight(),marginBottom:0}),{opacity:1,marginTop:0,marginBottom:e}).then(function(){t.timeout&&(t.timer=setTimeout(t.close,t.timeout),t.$el.on(o,function(){return clearTimeout(t.timer)}).on(s,function(){return t.timer=setTimeout(t.close,t.timeout)}))})},events:{click:function(t){i(t.target).closest('a[href="#"]').length&&t.preventDefault(),this.close()}},methods:{close:function(t){var e=this,i=function(){e.onClose&&e.onClose(),e.$el.trigger("close",[e]).remove(),a[e.pos].children().length||a[e.pos].hide()};this.timer&&clearTimeout(this.timer),t?i():r.start(this.$el,{opacity:0,marginTop:-1*this.$el.outerHeight(),marginBottom:0}).then(i)}}}),t.notification.closeAll=function(e,i){n(t.instances,function(t,n){"notification"!==n.$options.name||e&&e!==n.group||n.close(i)})}}}function Yt(t){function e(i){return t.getComponent(i,"sortable")||i.parentNode&&e(i.parentNode)}function i(){var t=setTimeout(function(){return r.trigger("click")},0),e=function(i){i.preventDefault(),i.stopPropagation(),clearTimeout(t),u(r,"click",e,!0)};c(r,"click",e,!0)}if(!Yt.installed){var n=t.mixin,o=t.util,s=o.$,r=o.docElement,a=o.extend,l=o.getDimensions,h=o.isWithin,c=o.on,u=o.off,d=o.offsetTop,f=o.pointerDown,p=o.pointerMove,g=o.pointerUp,m=o.promise,v=o.win;t.component("sortable",{mixins:[n.class],props:{group:String,animation:Number,threshold:Number,clsItem:String,clsPlaceholder:String,clsDrag:String,clsDragState:String,clsBase:String,clsNoDrag:String,clsEmpty:String,clsCustom:String,handle:String},defaults:{group:!1,animation:150,threshold:5,clsItem:"uk-sortable-item",clsPlaceholder:"uk-sortable-placeholder",clsDrag:"uk-sortable-drag",clsDragState:"uk-drag",clsBase:"uk-sortable",clsNoDrag:"uk-sortable-nodrag",clsEmpty:"uk-sortable-empty",clsCustom:"",handle:!1},init:function(){var t=this;["init","start","move","end"].forEach(function(e){var i=t[e];t[e]=function(e){e=e.originalEvent||e,t.scrollY=window.scrollY;var n=e.touches&&e.touches[0]||e,o=n.pageX,s=n.pageY;t.pos={x:o,y:s},i(e)}})},events:(w={},w[f]="init",w),update:{write:function(){var t=this;if(this.clsEmpty&&this.$el.toggleClass(this.clsEmpty,!this.$el.children().length),this.drag){this.drag.offset({top:this.pos.y+this.origin.top,left:this.pos.x+this.origin.left});var e=d(this.drag),i=e+this.drag[0].offsetHeight;e>0&&ewindow.innerHeight+this.scrollY&&setTimeout(function(){return v.scrollTop(t.scrollY+5)},5)}}},methods:{init:function(t){var e=s(t.target),i=this.$el.children().filter(function(e,i){return h(t.target,i)});!i.length||e.is(":input")||this.handle&&!h(e,this.handle)||t.button&&0!==t.button||h(e,"."+this.clsNoDrag)||(t.preventDefault(),t.stopPropagation(),this.touched=[this],this.placeholder=i,this.origin=a({target:e,index:this.placeholder.index()},this.pos),r.on(p,this.move),r.on(g,this.end),v.on("scroll",this.scroll),this.threshold||this.start(t))},start:function(e){this.drag=s(this.placeholder[0].outerHTML.replace(/^$/i,"div>")).attr("uk-no-boot","").addClass(this.clsDrag+" "+this.clsCustom).css({boxSizing:"border-box",width:this.placeholder.outerWidth(),height:this.placeholder.outerHeight()}).css(this.placeholder.css(["paddingLeft","paddingRight","paddingTop","paddingBottom"])).appendTo(t.container),this.drag.children().first().height(this.placeholder.children().height());var i=l(this.placeholder),n=i.left,o=i.top;a(this.origin,{left:n-this.pos.x,top:o-this.pos.y}),this.placeholder.addClass(this.clsPlaceholder),this.$el.children().addClass(this.clsItem),r.addClass(this.clsDragState),this.$el.trigger("start",[this,this.placeholder,this.drag]),this.move(e)},move:function(t){if(!this.drag)return void((Math.abs(this.pos.x-this.origin.x)>this.threshold||Math.abs(this.pos.y-this.origin.y)>this.threshold)&&this.start(t));this.$emit();var i="mousemove"===t.type?t.target:document.elementFromPoint(this.pos.x-document.body.scrollLeft,this.pos.y-document.body.scrollTop),n=e(i),o=e(this.placeholder[0]),r=n!==o;if(n&&!h(i,this.placeholder)&&(!r||n.group&&n.group===o.group)){if(i=n.$el.is(i.parentNode)&&s(i)||n.$el.children().has(i),r)o.remove(this.placeholder);else if(!i.length)return;n.insert(this.placeholder,i),~this.touched.indexOf(n)||this.touched.push(n)}},scroll:function(){var t=window.scrollY;t!==this.scrollY&&(this.pos.y+=t-this.scrollY,this.scrollY=t,this.$emit())},end:function(t){if(r.off(p,this.move),r.off(g,this.end),v.off("scroll",this.scroll),!this.drag)return void("mouseup"!==t.type&&h(t.target,"a[href]")&&(location.href=s(t.target).closest("a[href]").attr("href")));i();var n=e(this.placeholder[0]);this===n?this.origin.index!==this.placeholder.index()&&this.$el.trigger("change",[this,this.placeholder,"moved"]):(n.$el.trigger("change",[n,this.placeholder,"added"]),this.$el.trigger("change",[this,this.placeholder,"removed"])),this.$el.trigger("stop",[this]),this.drag.remove(),this.drag=null,this.touched.forEach(function(t){return t.$el.children().removeClass(t.clsPlaceholder+" "+t.clsItem)}),r.removeClass(this.clsDragState)},insert:function(t,e){var i=this;this.$el.children().addClass(this.clsItem);var n=function(){e.length?!i.$el.has(t).length||t.prevAll().filter(e).length?t.insertBefore(e):t.insertAfter(e):i.$el.append(t)};this.animation?this.animate(n):n()},remove:function(t){this.$el.has(t).length&&(this.animation?this.animate(function(){return t.detach()}):t.detach())},animate:function(t){var e=this,i=[],n=this.$el.children().toArray().map(function(t){return t=s(t),i.push(a({position:"absolute",pointerEvents:"none",width:t.outerWidth(),height:t.outerHeight()},t.position())),t}),o={position:"",width:"",height:"",pointerEvents:"",top:"",left:""};t(),n.forEach(function(t){return t.stop()}),this.$el.children().css(o),this.$updateSync("update",!0),this.$el.css("min-height",this.$el.height());var r=n.map(function(t){return t.position()});m.all(n.map(function(t,n){return t.css(i[n]).animate(r[n],e.animation).promise()})).then(function(){e.$el.css("min-height","").children().css(o),e.$updateSync("update",!0)})}}});var w}}function Rt(t){if(!Rt.installed){var e,i=t.util,n=t.mixin,o=i.$,s=i.doc,r=i.fastdom,a=i.flipPosition,l=i.isTouch,h=i.isWithin,c=i.pointerDown,u=i.pointerEnter,d=i.pointerLeave;t.component("tooltip",{attrs:!0,mixins:[n.togglable,n.position],props:{delay:Number,container:Boolean,title:String},defaults:{pos:"top",title:"",delay:0,animation:["uk-animation-scale-up"],duration:100,cls:"uk-active",clsPos:"uk-tooltip",container:!0},computed:{container:function(){return o(!0===this.$props.container&&t.container||this.$props.container||t.container)}},connected:function(){var t=this;r.mutate(function(){return t.$el.removeAttr("title").attr("aria-expanded",!1)})},disconnected:function(){this.hide()},methods:{show:function(){var t=this;e!==this&&(e&&e.hide(),e=this,s.on("click."+this.$options.name,function(e){h(e.target,t.$el)||t.hide()}),clearTimeout(this.showTimer),this.tooltip=o('").appendTo(this.container),this.$el.attr("aria-expanded",!0),this.positionAt(this.tooltip,this.$el),this.origin="y"===this.getAxis()?a(this.dir)+"-"+this.align:this.align+"-"+a(this.dir),this.showTimer=setTimeout(function(){t.toggleElement(t.tooltip,!0),t.hideTimer=setInterval(function(){t.$el.is(":visible")||t.hide()},150)},this.delay))},hide:function(){this.$el.is("input")&&this.$el[0]===document.activeElement||(e=e!==this&&e||!1,clearTimeout(this.showTimer),clearInterval(this.hideTimer),this.$el.attr("aria-expanded",!1),this.toggleElement(this.tooltip,!1),this.tooltip&&this.tooltip.remove(),this.tooltip=!1,s.off("click."+this.$options.name))}},events:(f={blur:"hide"},f["focus "+u+" "+c]=function(t){t.type===c&&l(t)||this.show()},f[d]=function(t){l(t)||this.hide()},f)});var f}}function Ut(t){function e(t,e){return e.match(new RegExp("^"+t.replace(/\//g,"\\/").replace(/\*\*/g,"(\\/[^\\/]+)*").replace(/\*/g,"[^\\/]+").replace(/((?!\\))\?/g,"$1.")+"$","i"))}function i(t,e){for(var i=[],n=0;ni[t]?n.ratio(e,t,i[t]):e}),e},cover:function(e,i){var n=this;return e=this.fit(e,i),t.each(e,function(t){return e=e[t]0||navigator.pointerEnabled&&navigator.maxTouchPoints>0,de=ue?le?"touchstart":"pointerdown":"mousedown",fe=ue?le?"touchmove":"pointermove":"mousemove",pe=ue?le?"touchend":"pointerup":"mouseup",ge=ue&&he?"pointerenter":"mouseenter",me=ue&&he?"pointerleave":"mouseleave",ve=ue&&le?"touchcancel":"pointercancel",we=L("transition","transition-end"),ye=L("animation","animation-start"),be=L("animation","animation-end"),$e={reads:[],writes:[],measure:function(t){return this.reads.push(t),F(this),t},mutate:function(t){return this.writes.push(t),F(this),t},clear:function(t){return q(this.reads,t)||q(this.writes,t)}};Y.prototype={positions:[],position:null,init:function(){var t=this;this.positions=[],this.position=null;var e=!1;this.handler=function(i){e||setTimeout(function(){var n=Date.now(),o=t.positions.length;o&&n-t.positions[o-1].time>100&&t.positions.splice(0,o),t.positions.push({time:n,x:i.pageX,y:i.pageY}),t.positions.length>5&&t.positions.shift(),e=!1},5),e=!0},Gt.on("mousemove",this.handler)},cancel:function(){this.handler&&Gt.off("mousemove",this.handler)},movesTo:function(t){if(this.positions.length<2)return!1;var e=X(t),i=this.positions[this.positions.length-1],n=this.positions[0];if(e.left<=i.x&&i.x<=e.right&&e.top<=i.y&&i.y<=e.bottom)return!1;var o=[[{x:e.left,y:e.top},{x:e.right,y:e.bottom}],[{x:e.right,y:e.top},{x:e.left,y:e.bottom}]];return e.right<=i.x||(e.left>=i.x?(o[0].reverse(),o[1].reverse()):e.bottom<=i.y?o[0].reverse():e.top>=i.y&&o[1].reverse()),!!o.reduce(function(t,e){return t+(R(n,e[0])R(i,e[1]))},0)}};var xe={};xe.args=xe.created=xe.events=xe.init=xe.ready=xe.connected=xe.disconnected=xe.destroy=function(e,i){return e=e&&!t.isArray(e)?[e]:e,i?e?e.concat(i):t.isArray(i)?i:[i]:e},xe.update=function(e,i){return xe.args(e,t.isFunction(i)?{write:i}:i)},xe.props=function(e,i){return t.isArray(i)&&(i=i.reduce(function(t,e){return t[e]=String,t},{})),xe.methods(e,i)},xe.computed=xe.defaults=xe.methods=function(e,i){return i?e?t.extend(!0,{},e,i):i:e};var ke,Ce,Te,_e,Se,Ee=function(t,e){return T(e)?t:e},Ae={x:["width","left","right"],y:["height","top","bottom"]},Oe={};i(function(){var e,i,o,s=0,r=0;"MSGesture"in window&&(_e=new MSGesture,_e.target=document.body),n(document,"click",function(){return Se=!0},!0);var a=function(t){var e=t.velocityX>1?"Right":t.velocityX<-1?"Left":t.velocityY>1?"Down":t.velocityY<-1?"Up":null;e&&void 0!==Oe.el&&(Oe.el.trigger("swipe"),Oe.el.trigger("swipe"+e))};n(document,"MSGestureEnd",a),n(document,"gestureend",a),n(document,de,function(t){o=t.touches?t.touches[0]:t,e=Date.now(),i=e-(Oe.last||e),Oe.el=Vt("tagName"in o.target?o.target:o.target.parentNode),ke&&clearTimeout(ke),Oe.x1=o.pageX,Oe.y1=o.pageY,i>0&&i<=250&&(Oe.isDoubleTap=!0),Oe.last=e,!_e||"pointerdown"!==t.type&&"touchstart"!==t.type||_e.addPointer(t.pointerId),Se=t.button>0}),n(document,fe,function(t){o=t.touches?t.touches[0]:t,Oe.x2=o.pageX,Oe.y2=o.pageY,s+=Math.abs(Oe.x1-Oe.x2),r+=Math.abs(Oe.y1-Oe.y2)}),n(document,pe,function(){Oe.x2&&Math.abs(Oe.x1-Oe.x2)>30||Oe.y2&&Math.abs(Oe.y1-Oe.y2)>30?Te=setTimeout(function(){void 0!==Oe.el&&(Oe.el.trigger("swipe"),Oe.el.trigger("swipe"+et(Oe.x1,Oe.x2,Oe.y1,Oe.y2))),Oe={}},0):"last"in Oe&&(isNaN(s)||s<30&&r<30?Ce=setTimeout(function(){var e=t.Event("tap");e.cancelTouch=it,void 0!==Oe.el&&Oe.el.trigger(e),Oe.isDoubleTap?(void 0!==Oe.el&&Oe.el.trigger("doubleTap"),Oe={}):ke=setTimeout(function(){ke=null,void 0!==Oe.el&&(Oe.el.trigger("singleTap"),Se||Oe.el.trigger("click")),Oe={}},300)}):Oe={},s=r=0)}),n(document,ve,it),n(window,"scroll",it)});var De=!1;n(document,"touchstart",function(){return De=!0},!0),n(document,"click",function(){De=!1}),n(document,"touchcancel",function(){return De=!1},!0);var Ie=Object.freeze({win:Xt,doc:Gt,docElement:Qt,isRtl:Jt,isReady:e,ready:i,on:n,off:o,transition:s,Transition:Zt,animate:r,Animation:Kt,isJQuery:a,isWithin:l,attrFilter:h,removeClass:c,createEvent:u,isInView:d,getIndex:f,isVoidElement:p,Dimensions:ee,query:g,Observer:re,requestAnimationFrame:ae,hasPromise:ce,hasTouch:ue,pointerDown:de,pointerMove:fe,pointerUp:pe,pointerEnter:ge,pointerLeave:me,pointerCancel:ve,transitionend:we,animationstart:ye,animationend:be,getStyle:M,getCssVar:j,fastdom:$e,$:Vt,bind:m,hasOwn:v,promise:w,classify:y,hyphenate:b,camelize:$,isString:k,isNumber:C,isUndefined:T,isContextSelector:_,getContextSelectors:S,toJQuery:E,toNode:A,toBoolean:O,toNumber:D,toList:I,toMedia:N,coerce:B,toMs:P,swap:H,ajax:t.ajax,contains:t.contains,each:t.each,Event:t.Event,extend:t.extend,map:t.map,merge:t.merge,isArray:t.isArray,isNumeric:t.isNumeric,isFunction:t.isFunction,isPlainObject:t.isPlainObject,MouseTracker:Y,mergeOptions:U,position:V,getDimensions:X,offsetTop:G,flipPosition:tt,isTouch:nt}),Ne=function(t){this._init(t)};Ne.util=Ie,Ne.data="__uikit__",Ne.prefix="uk-",Ne.options={},Ne.instances={},Ne.elements=[],function(t){var e=t.data;t.use=function(t){if(!t.installed)return t.call(null,this),t.installed=!0,this},t.mixin=function(e,i){i=(k(i)?t.components[i]:i)||this,e=U({},e),e.mixins=i.options.mixins,delete i.options.mixins,i.options=U(e,i.options)},t.extend=function(t){t=t||{};var e=this,i=t.name||e.options.name,n=ot(i||"UIkitComponent");return n.prototype=Object.create(e.prototype),n.prototype.constructor=n,n.options=U(e.options,t),n.super=e,n.extend=e.extend,n},t.update=function(i,n,o){if(void 0===o&&(o=!1),i=u(i||"update"),!n)return void rt(t.instances,i);if(n=A(n),o)do{rt(n[e],i),n=n.parentNode}while(n);else st(n,function(t){return rt(t[e],i)})};var i;Object.defineProperty(t,"container",{get:function(){return i||document.body},set:function(t){i=t}})}(Ne),function(t){t.prototype._callHook=function(t){var e=this,i=this.$options[t];i&&i.forEach(function(t){return t.call(e)})},t.prototype._callReady=function(){this._isReady||(this._isReady=!0,this._callHook("ready"),this._callUpdate())},t.prototype._callConnected=function(){var e=this;this._connected||(~t.elements.indexOf(this.$options.el)||t.elements.push(this.$options.el),t.instances[this._uid]=this,this._initEvents(),this._callHook("connected"),this._connected=!0,this._initObserver(),this._isReady||i(function(){return e._callReady()}),this._callUpdate())},t.prototype._callDisconnected=function(){if(this._connected){this._observer&&(this._observer.disconnect(),this._observer=null);var e=t.elements.indexOf(this.$options.el);~e&&t.elements.splice(e,1),delete t.instances[this._uid],this._initEvents(!0),this._callHook("disconnected"),this._connected=!1}},t.prototype._callUpdate=function(t){var e=this;t=u(t||"update"),"update"===t.type&&(this._computeds={});var i=this.$options.update;i&&i.forEach(function(i,n){if("update"===t.type||i.events&&~i.events.indexOf(t.type)){if(t.sync)return i.read&&i.read.call(e,t),void(i.write&&i.write.call(e,t));i.read&&!~$e.reads.indexOf(e._frames.reads[n])&&(e._frames.reads[n]=$e.measure(function(){i.read.call(e,t),delete e._frames.reads[n]})),i.write&&!~$e.writes.indexOf(e._frames.writes[n])&&(e._frames.writes[n]=$e.mutate(function(){i.write.call(e,t),delete e._frames.writes[n]}))}})}}(Ne),function(e){var i=0;e.prototype.props={},e.prototype._init=function(t){t=t||{},t=this.$options=U(this.constructor.options,t,this),this.$el=null,this.$name=e.prefix+b(this.$options.name),this.$props={},this._uid=i++,this._initData(),this._initMethods(),this._initComputeds(),this._callHook("created"),this._frames={reads:{},writes:{}},t.el&&this.$mount(t.el)},e.prototype._initData=function(){var e=this,i=t.extend(!0,{},this.$options.defaults),n=this.$options.data||{},o=this.$options.args||[],s=this.$options.props||{};if(i){o.length&&t.isArray(n)&&(n=n.slice(0,o.length).reduce(function(e,i,n){return t.isPlainObject(i)?t.extend(e,i):e[o[n]]=i,e},{}));for(var r in i)e.$props[r]=e[r]=v(n,r)?B(s[r],n[r],e.$options.el):i[r]}},e.prototype._initMethods=function(){var t=this,e=this.$options.methods;if(e)for(var i in e)t[i]=m(e[i],t)},e.prototype._initComputeds=function(){var t=this,e=this.$options.computed;if(this._computeds={},e)for(var i in e)at(t,i,e[i])},e.prototype._initProps=function(e){var i=this;this._computeds={},t.extend(this.$props,e||this._getProps());var n=[this.$options.computed,this.$options.methods];for(var o in i.$props)ct(n,o)&&(i[o]=i.$props[o])},e.prototype._initEvents=function(t){var e=this,i=this.$options.events;i&&i.forEach(function(i){if(v(i,"handler"))lt(e,t,i);else for(var n in i)lt(e,t,i[n],n)})},e.prototype._initObserver=function(){var e=this;if(!this._observer&&this.$options.props&&this.$options.attrs&&re){var i=t.isArray(this.$options.attrs)?this.$options.attrs:Object.keys(this.$options.props).map(function(t){return b(t)});this._observer=new re(function(){var t=e._getProps();i.some(function(i){return!ut(t[i],e.$props[i])})&&e.$reset(t)}),this._observer.observe(this.$options.el,{attributes:!0,attributeFilter:i.concat([this.$name,"data-"+this.$name])})}},e.prototype._getProps=function(){var t,e,i={},n=this.$el[0],o=this.$options.args||[],s=this.$options.props||{},r=n.getAttribute(this.$name)||n.getAttribute("data-"+this.$name);if(!s)return i;for(t in s)if(e=b(t),n.hasAttribute(e)){var a=B(s[t],n.getAttribute(e),n);if("target"===e&&(!a||0===a.lastIndexOf("_",0)))continue;i[t]=a}if(!r)return i;if("{"===r[0])try{r=JSON.parse(r)}catch(t){console.warn("Invalid JSON."),r={}}else if(o.length&&!~r.indexOf(":")){l={},l[o[0]]=r,r=l;var l}else{var h={};r.split(";").forEach(function(t){var e=t.split(/:(.+)/),i=e[0],n=e[1];i&&n&&(h[i.trim()]=n.trim())}),r=h}for(t in r||{})e=$(t),void 0!==s[e]&&(i[e]=B(s[e],r[t],n));return i}}(Ne),function(t){var e=t.data;t.prototype.$mount=function(t){var i=this.$options.name;if(t[e]||(t[e]={}),t[e][i])return void console.warn('Component "'+i+'" is already mounted on element: ',t);t[e][i]=this,this.$el=Vt(t),this._initProps(),this._callHook("init"),document.documentElement.contains(t)&&this._callConnected()},t.prototype.$emit=function(t){this._callUpdate(t)},t.prototype.$emitSync=function(t){this._callUpdate(u(t||"update",!0,!1,{sync:!0}))},t.prototype.$update=function(e,i){t.update(e,this.$el,i)},t.prototype.$updateSync=function(t,e){this.$update(u(t||"update",!0,!1,{sync:!0}),e)},t.prototype.$reset=function(t){this._callDisconnected(),this._initProps(t),this._callConnected()},t.prototype.$destroy=function(t){void 0===t&&(t=!1);var i=this.$options.el;i&&this._callDisconnected(),this._callHook("destroy"),i&&i[e]&&(delete i[e][this.$options.name],Object.keys(i[e]).length||delete i[e],t&&this.$el.remove())}}(Ne),function(e){var i=e.data;e.components={},e.component=function(i,n){var o=$(i);return t.isPlainObject(n)?(n.name=o,n=e.extend(n)):n.options.name=o,e.components[o]=n,e[o]=function(i,n){for(var s=arguments.length,r=Array(s);s--;)r[s]=arguments[s];return t.isPlainObject(i)?new e.components[o]({data:i}):e.components[o].options.functional?new e.components[o]({data:[].concat(r)}):Vt(i).toArray().map(function(t){return e.getComponent(t,o)||new e.components[o]({el:t,data:n||{}})})[0]},e._initialized&&!n.options.functional&&$e.measure(function(){return e[o]("[uk-"+i+"],[data-uk-"+i+"]")}),e.components[o]},e.getComponents=function(t){return t&&(t=a(t)?t[0]:t)&&t[i]||{}},e.getComponent=function(t,i){return e.getComponents(t)[i]},e.connect=function(t){var n;if(t[i])for(n in t[i])t[i][n]._callConnected();for(var o=0;o ',We=' ',ze=' ',qe=' ',Ye=' ',Re=' ',Ue=' ',Ve=' ',Xe=' ',Ge=' ',Qe=' ',Je=' ',Ze=' ',Ke=' ',ti=' ',ei={},ii=new DOMParser;return Ne.version="3.0.0-beta.22",function(t){t.mixin.class=He,t.mixin.modal=je,t.mixin.position=Le,t.mixin.togglable=Me}(Ne),function(t){var e,i,o,s=null,r=0;Xt.on("load",t.update).on("resize",function(e){o||(ae(function(){t.update(e),o=!1}),o=!0)}).on("scroll",function(n){null===s&&(s=0),s!==window.pageYOffset&&(e=s' +
+ '
' +
+ ' ' +
+ '';
+ element.appendChild(element.resizeSensor);
+
+ if (element.resizeSensor.offsetParent !== element) {
+ element.style.position = 'relative';
+ }
+
+ var expand = element.resizeSensor.childNodes[0];
+ var expandChild = expand.childNodes[0];
+ var shrink = element.resizeSensor.childNodes[1];
+ var dirty, rafId, newWidth, newHeight;
+ var lastWidth = element.offsetWidth;
+ var lastHeight = element.offsetHeight;
+
+ var reset = function() {
+ expandChild.style.width = '100000px';
+ expandChild.style.height = '100000px';
+
+ expand.scrollLeft = 100000;
+ expand.scrollTop = 100000;
+
+ shrink.scrollLeft = 100000;
+ shrink.scrollTop = 100000;
+ };
+
+ reset();
+
+ var onResized = function() {
+ rafId = 0;
+
+ if (!dirty) return;
+
+ lastWidth = newWidth;
+ lastHeight = newHeight;
+
+ if (element.resizedAttached) {
+ element.resizedAttached.call();
+ }
+ };
+
+ var onScroll = function() {
+ newWidth = element.offsetWidth;
+ newHeight = element.offsetHeight;
+ dirty = newWidth != lastWidth || newHeight != lastHeight;
+
+ if (dirty && !rafId) {
+ rafId = requestAnimationFrame(onResized);
+ }
+
+ reset();
+ };
+
+ var addEvent = function(el, name, cb) {
+ if (el.attachEvent) {
+ el.attachEvent('on' + name, cb);
+ } else {
+ el.addEventListener(name, cb);
+ }
+ };
+
+ addEvent(expand, 'scroll', onScroll);
+ addEvent(shrink, 'scroll', onScroll);
+ }
+
+ forEachElement(element, function(elem){
+ attachResizeEvent(elem, callback);
+ });
+
+ this.detach = function(ev) {
+ ResizeSensor.detach(element, ev);
+ };
+ };
+
+ ResizeSensor.detach = function(element, ev) {
+ forEachElement(element, function(elem){
+ if (!elem) return
+ if(elem.resizedAttached && typeof ev == "function"){
+ elem.resizedAttached.remove(ev);
+ if(elem.resizedAttached.length()) return;
+ }
+ if (elem.resizeSensor) {
+ if (elem.contains(elem.resizeSensor)) {
+ elem.removeChild(elem.resizeSensor);
+ }
+ delete elem.resizeSensor;
+ delete elem.resizedAttached;
+ }
+ });
+ };
+
+ return ResizeSensor;
+
+}));
diff --git a/interactive-mining-angular-frontend/src/assets/js/jquery.sticky-sidebar.js b/interactive-mining-angular-frontend/src/assets/js/jquery.sticky-sidebar.js
new file mode 100644
index 0000000..1a0efdb
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/assets/js/jquery.sticky-sidebar.js
@@ -0,0 +1,745 @@
+/**
+ * Sticky Sidebar JavaScript Plugin.
+ * @version 3.3.0
+ * @author Ahmed Bouhuolia
+ * @license The MIT License (MIT)
+ */
+const StickySidebar = (() => {
+
+ // ---------------------------------
+ // # Define Constants
+ // ---------------------------------
+ //
+ const EVENT_KEY = '.stickySidebar';
+ const VERSION = '3.2.0';
+
+ const DEFAULTS = {
+
+ /**
+ * Additional top spacing of the element when it becomes sticky.
+ * @type {Numeric|Function}
+ */
+ topSpacing: 0,
+
+ /**
+ * Additional bottom spacing of the element when it becomes sticky.
+ * @type {Numeric|Function}
+ */
+ bottomSpacing: 0,
+
+ /**
+ * Container sidebar selector to know what the beginning and end of sticky element.
+ * @type {String|False}
+ */
+ containerSelector: false,
+
+ /**
+ * Inner wrapper selector.
+ * @type {String}
+ */
+ innerWrapperSelector: '.inner-wrapper-sticky',
+
+ /**
+ * The name of CSS class to apply to elements when they have become stuck.
+ * @type {String|False}
+ */
+ stickyClass: 'is-affixed',
+
+ /**
+ * Detect when sidebar and its container change height so re-calculate their dimensions.
+ * @type {Boolean}
+ */
+ resizeSensor: true,
+
+ /**
+ * The sidebar returns to its normal position if its width below this value.
+ * @type {Numeric}
+ */
+ minWidth: false
+ };
+
+ // ---------------------------------
+ // # Class Definition
+ // ---------------------------------
+ //
+ /**
+ * Sticky Sidebar Class.
+ * @public
+ */
+ class StickySidebar{
+
+ /**
+ * Sticky Sidebar Constructor.
+ * @constructor
+ * @param {HTMLElement|String} sidebar - The sidebar element or sidebar selector.
+ * @param {Object} options - The options of sticky sidebar.
+ */
+ constructor(sidebar, options = {}){
+ this.options = StickySidebar.extend(DEFAULTS, options);
+
+ // Sidebar element query if there's no one, throw error.
+ this.sidebar = ('string' === typeof sidebar ) ? document.querySelector(sidebar) : sidebar;
+ if( 'undefined' === typeof this.sidebar )
+ throw new Error("There is no specific sidebar element.");
+
+ this.sidebarInner = false;
+ this.container = this.sidebar.parentElement;
+
+ // Current Affix Type of sidebar element.
+ this.affixedType = 'STATIC';
+ this.direction = 'down';
+ this.support = {
+ transform: false,
+ transform3d: false
+ };
+
+ this._initialized = false;
+ this._reStyle = false;
+ this._breakpoint = false;
+ this._resizeListeners = [];
+
+ // Dimensions of sidebar, container and screen viewport.
+ this.dimensions = {
+ translateY: 0,
+ topSpacing: 0,
+ lastTopSpacing: 0,
+ bottomSpacing: 0,
+ lastBottomSpacing: 0,
+ sidebarHeight: 0,
+ sidebarWidth: 0,
+ containerTop: 0,
+ containerHeight: 0,
+ viewportHeight: 0,
+ viewportTop: 0,
+ lastViewportTop: 0,
+ };
+
+ // Bind event handlers for referencability.
+ ['handleEvent'].forEach( (method) => {
+ this[method] = this[method].bind(this);
+ });
+
+ // Initialize sticky sidebar for first time.
+ this.initialize();
+ }
+
+ /**
+ * Initializes the sticky sidebar by adding inner wrapper, define its container,
+ * min-width breakpoint, calculating dimensions, adding helper classes and inline style.
+ * @private
+ */
+ initialize(){
+ this._setSupportFeatures();
+
+ // Get sticky sidebar inner wrapper, if not found, will create one.
+ if( this.options.innerWrapperSelector ){
+ this.sidebarInner = this.sidebar.querySelector(this.options.innerWrapperSelector);
+
+ if( null === this.sidebarInner )
+ this.sidebarInner = false;
+ }
+
+ if( ! this.sidebarInner ){
+ let wrapper = document.createElement('div');
+ wrapper.setAttribute('class', 'inner-wrapper-sticky');
+ this.sidebar.appendChild(wrapper);
+
+ while( this.sidebar.firstChild != wrapper )
+ wrapper.appendChild(this.sidebar.firstChild);
+
+ this.sidebarInner = this.sidebar.querySelector('.inner-wrapper-sticky');
+ }
+
+ // Container wrapper of the sidebar.
+ if( this.options.containerSelector ){
+ let containers = document.querySelectorAll(this.options.containerSelector);
+ containers = Array.prototype.slice.call(containers);
+
+ containers.forEach((container, item) => {
+ if( ! container.contains(this.sidebar) ) return;
+ this.container = container;
+ });
+
+ if( ! containers.length )
+ throw new Error("The container does not contains on the sidebar.");
+ }
+
+ // If top/bottom spacing is not function parse value to integer.
+ if( 'function' !== typeof this.options.topSpacing )
+ this.options.topSpacing = parseInt(this.options.topSpacing) || 0;
+
+ if( 'function' !== typeof this.options.bottomSpacing )
+ this.options.bottomSpacing = parseInt(this.options.bottomSpacing) || 0;
+
+ // Breakdown sticky sidebar if screen width below `options.minWidth`.
+ this._widthBreakpoint();
+
+ // Calculate dimensions of sidebar, container and viewport.
+ this.calcDimensions();
+
+ // Affix sidebar in proper position.
+ this.stickyPosition();
+
+ // Bind all events.
+ this.bindEvents();
+
+ // Inform other properties the sticky sidebar is initialized.
+ this._initialized = true;
+ }
+
+ /**
+ * Bind all events of sticky sidebar plugin.
+ * @protected
+ */
+ bindEvents(){
+ window.addEventListener('resize', this, {passive: true});
+ window.addEventListener('scroll', this, {passive: true});
+
+ this.sidebar.addEventListener('update' + EVENT_KEY, this);
+
+ if( this.options.resizeSensor && 'undefined' !== typeof ResizeSensor ){
+ new ResizeSensor(this.sidebarInner, this.handleEvent);
+ new ResizeSensor(this.container, this.handleEvent);
+ }
+ }
+
+ /**
+ * Handles all events of the plugin.
+ * @param {Object} event - Event object passed from listener.
+ */
+ handleEvent(event){
+ this.updateSticky(event);
+ }
+
+ /**
+ * Calculates dimensions of sidebar, container and screen viewpoint
+ * @public
+ */
+ calcDimensions(){
+ if( this._breakpoint ) return;
+ var dims = this.dimensions;
+
+ // Container of sticky sidebar dimensions.
+ dims.containerTop = StickySidebar.offsetRelative(this.container).top;
+ dims.containerHeight = this.container.clientHeight;
+ dims.containerBottom = dims.containerTop + dims.containerHeight;
+
+ // Sidebar dimensions.
+ dims.sidebarHeight = this.sidebarInner.offsetHeight;
+ dims.sidebarWidth = this.sidebar.offsetWidth;
+
+ // Screen viewport dimensions.
+ dims.viewportHeight = window.innerHeight;
+
+ this._calcDimensionsWithScroll();
+ }
+
+ /**
+ * Some dimensions values need to be up-to-date when scrolling the page.
+ * @private
+ */
+ _calcDimensionsWithScroll(){
+ var dims = this.dimensions;
+
+ dims.sidebarLeft = StickySidebar.offsetRelative(this.sidebar).left;
+
+ dims.viewportTop = document.documentElement.scrollTop || document.body.scrollTop;
+ dims.viewportBottom = dims.viewportTop + dims.viewportHeight;
+ dims.viewportLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
+
+ dims.topSpacing = this.options.topSpacing;
+ dims.bottomSpacing = this.options.bottomSpacing;
+
+ if( 'function' === typeof dims.topSpacing )
+ dims.topSpacing = parseInt(dims.topSpacing(this.sidebar)) || 0;
+
+ if( 'function' === typeof dims.bottomSpacing )
+ dims.bottomSpacing = parseInt(dims.bottomSpacing(this.sidebar)) || 0;
+
+ if( 'VIEWPORT-TOP' === this.affixedType ){
+ // Adjust translate Y in the case decrease top spacing value.
+ if( dims.topSpacing < dims.lastTopSpacing ){
+ dims.translateY += dims.lastTopSpacing - dims.topSpacing;
+ this._reStyle = true;
+ }
+
+ } else if( 'VIEWPORT-BOTTOM' === this.affixedType ){
+ // Adjust translate Y in the case decrease bottom spacing value.
+ if( dims.bottomSpacing < dims.lastBottomSpacing ){
+ dims.translateY += dims.lastBottomSpacing - dims.bottomSpacing;
+ this._reStyle = true;
+ }
+ }
+
+ dims.lastTopSpacing = dims.topSpacing;
+ dims.lastBottomSpacing = dims.bottomSpacing;
+ }
+
+ /**
+ * Determine whether the sidebar is bigger than viewport.
+ * @public
+ * @return {Boolean}
+ */
+ isSidebarFitsViewport(){
+ return this.dimensions.sidebarHeight < this.dimensions.viewportHeight;
+ }
+
+ /**
+ * Observe browser scrolling direction top and down.
+ */
+ observeScrollDir(){
+ var dims = this.dimensions;
+ if( dims.lastViewportTop === dims.viewportTop ) return;
+
+ var furthest = 'down' === this.direction ? Math.min : Math.max;
+
+ // If the browser is scrolling not in the same direction.
+ if( dims.viewportTop === furthest(dims.viewportTop, dims.lastViewportTop) )
+ this.direction = 'down' === this.direction ? 'up' : 'down';
+ }
+
+ /**
+ * Gets affix type of sidebar according to current scrollTop and scrollLeft.
+ * Holds all logical affix of the sidebar when scrolling up and down and when sidebar
+ * is bigger than viewport and vice versa.
+ * @public
+ * @return {String|False} - Proper affix type.
+ */
+ getAffixType(){
+ var dims = this.dimensions, affixType = false;
+
+ this._calcDimensionsWithScroll();
+
+ var sidebarBottom = dims.sidebarHeight + dims.containerTop;
+ var colliderTop = dims.viewportTop + dims.topSpacing;
+ var colliderBottom = dims.viewportBottom - dims.bottomSpacing;
+
+ // When browser is scrolling top.
+ if( 'up' === this.direction ){
+ if( colliderTop <= dims.containerTop ){
+ dims.translateY = 0;
+ affixType = 'STATIC';
+
+ } else if( colliderTop <= dims.translateY + dims.containerTop ){
+ dims.translateY = colliderTop - dims.containerTop;
+ affixType = 'VIEWPORT-TOP';
+
+ } else if( ! this.isSidebarFitsViewport() && dims.containerTop <= colliderTop ){
+ affixType = 'VIEWPORT-UNBOTTOM';
+ }
+ // When browser is scrolling up.
+ } else {
+ // When sidebar element is not bigger than screen viewport.
+ if( this.isSidebarFitsViewport() ){
+
+ if( dims.sidebarHeight + colliderTop >= dims.containerBottom ){
+ dims.translateY = dims.containerBottom - sidebarBottom;
+ affixType = 'CONTAINER-BOTTOM';
+
+ } else if( colliderTop >= dims.containerTop ){
+ dims.translateY = colliderTop - dims.containerTop;
+ affixType = 'VIEWPORT-TOP';
+ }
+ // When sidebar element is bigger than screen viewport.
+ } else {
+
+ if( dims.containerBottom <= colliderBottom ){
+ dims.translateY = dims.containerBottom - sidebarBottom;
+ affixType = 'CONTAINER-BOTTOM';
+
+ } else if( sidebarBottom + dims.translateY <= colliderBottom ){
+ dims.translateY = colliderBottom - sidebarBottom;
+ affixType = 'VIEWPORT-BOTTOM';
+
+ } else if( dims.containerTop + dims.translateY <= colliderTop ){
+ affixType = 'VIEWPORT-UNBOTTOM';
+ }
+ }
+ }
+
+ // Make sure the translate Y is not bigger than container height.
+ dims.translateY = Math.max(0, dims.translateY);
+ dims.translateY = Math.min(dims.containerHeight, dims.translateY);
+
+ dims.lastViewportTop = dims.viewportTop;
+ return affixType;
+ }
+
+ /**
+ * Gets inline style of sticky sidebar wrapper and inner wrapper according
+ * to its affix type.
+ * @private
+ * @param {String} affixType - Affix type of sticky sidebar.
+ * @return {Object}
+ */
+ _getStyle(affixType){
+ if( 'undefined' === typeof affixType ) return;
+
+ var style = {inner: {}, outer: {}};
+ var dims = this.dimensions;
+
+ switch( affixType ){
+ case 'VIEWPORT-TOP':
+ style.inner = {position: 'fixed', top: dims.topSpacing,
+ left: dims.sidebarLeft - dims.viewportLeft, width: dims.sidebarWidth};
+ break;
+ case 'VIEWPORT-BOTTOM':
+ style.inner = {position: 'fixed', top: 'auto', left: dims.sidebarLeft,
+ bottom: dims.bottomSpacing, width: dims.sidebarWidth};
+ break;
+ case 'CONTAINER-BOTTOM':
+ case 'VIEWPORT-UNBOTTOM':
+ let translate = this._getTranslate(0, dims.translateY + 'px');
+
+ if( translate )
+ style.inner = {transform: translate};
+ else
+ style.inner = {position: 'absolute', top: dims.translateY, width: dims.sidebarWidth};
+ break;
+ }
+
+ switch( affixType ){
+ case 'VIEWPORT-TOP':
+ case 'VIEWPORT-BOTTOM':
+ case 'VIEWPORT-UNBOTTOM':
+ case 'CONTAINER-BOTTOM':
+ style.outer = {height: dims.sidebarHeight, position: 'relative'};
+ break;
+ }
+
+ style.outer = StickySidebar.extend({height: '', position: ''}, style.outer);
+ style.inner = StickySidebar.extend({position: 'relative', top: '', left: '',
+ bottom: '', width: '', transform: this._getTranslate()}, style.inner);
+
+ return style;
+ }
+
+ /**
+ * Cause the sidebar to be sticky according to affix type by adding inline
+ * style, adding helper class and trigger events.
+ * @function
+ * @protected
+ * @param {string} force - Update sticky sidebar position by force.
+ */
+ stickyPosition(force){
+ if( this._breakpoint ) return;
+
+ force = this._reStyle || force || false;
+
+ var offsetTop = this.options.topSpacing;
+ var offsetBottom = this.options.bottomSpacing;
+
+ var affixType = this.getAffixType();
+ var style = this._getStyle(affixType);
+
+ if( (this.affixedType != affixType || force) && affixType ){
+ let affixEvent = 'affix.' + affixType.toLowerCase().replace('viewport-', '') + EVENT_KEY;
+ StickySidebar.eventTrigger(this.sidebar, affixEvent);
+
+ if( 'STATIC' === affixType )
+ StickySidebar.removeClass(this.sidebar, this.options.stickyClass);
+ else
+ StickySidebar.addClass(this.sidebar, this.options.stickyClass);
+
+ for( let key in style.outer ){
+ let _unit = ('number' === typeof style.outer[key]) ? 'px' : '';
+ this.sidebar.style[key] = style.outer[key];
+ }
+
+ for( let key in style.inner ){
+ let _unit = ('number' === typeof style.inner[key]) ? 'px' : '';
+ this.sidebarInner.style[key] = style.inner[key] + _unit;
+ }
+
+ let affixedEvent = 'affixed.'+ affixType.toLowerCase().replace('viewport-', '') + EVENT_KEY;
+ StickySidebar.eventTrigger(this.sidebar, affixedEvent);
+ } else {
+ if( this._initialized ) this.sidebarInner.style.left = style.inner.left;
+ }
+
+ this.affixedType = affixType;
+ }
+
+ /**
+ * Breakdown sticky sidebar when window width is below `options.minWidth` value.
+ * @protected
+ */
+ _widthBreakpoint(){
+
+ if( window.innerWidth <= this.options.minWidth ){
+ this._breakpoint = true;
+ this.affixedType = 'STATIC';
+
+ this.sidebar.removeAttribute('style');
+ StickySidebar.removeClass(this.sidebar, this.options.stickyClass);
+ this.sidebarInner.removeAttribute('style');
+ } else {
+ this._breakpoint = false;
+ }
+ }
+
+ /**
+ * Switches between functions stack for each event type, if there's no
+ * event, it will re-initialize sticky sidebar.
+ * @public
+ */
+ updateSticky(event = {}){
+ if( this._running ) return;
+ this._running = true;
+
+ ((eventType) => {
+
+ requestAnimationFrame(() => {
+ switch( eventType ){
+ // When browser is scrolling and re-calculate just dimensions
+ // within scroll.
+ case 'scroll':
+ this._calcDimensionsWithScroll();
+ this.observeScrollDir();
+ this.stickyPosition();
+ break;
+
+ // When browser is resizing or there's no event, observe width
+ // breakpoint and re-calculate dimensions.
+ case 'resize':
+ default:
+ this._widthBreakpoint();
+ this.calcDimensions();
+ this.stickyPosition(true);
+ break;
+ }
+ this._running = false;
+ });
+ })(event.type);
+ }
+
+ /**
+ * Set browser support features to the public property.
+ * @private
+ */
+ _setSupportFeatures(){
+ var support = this.support;
+
+ support.transform = StickySidebar.supportTransform();
+ support.transform3d = StickySidebar.supportTransform(true);
+ }
+
+ /**
+ * Get translate value, if the browser supports transfrom3d, it will adopt it.
+ * and the same with translate. if browser doesn't support both return false.
+ * @param {Number} y - Value of Y-axis.
+ * @param {Number} x - Value of X-axis.
+ * @param {Number} z - Value of Z-axis.
+ * @return {String|False}
+ */
+ _getTranslate(y = 0, x = 0, z = 0){
+ if( this.support.transform3d ) return 'translate3d(' + y +', '+ x +', '+ z +')';
+ else if( this.support.translate ) return 'translate('+ y +', '+ x +')';
+ else return false;
+ }
+
+ /**
+ * Destroy sticky sidebar plugin.
+ * @public
+ */
+ destroy(){
+ window.removeEventListener('resize', this);
+ window.removeEventListener('scroll', this);
+
+ this.sidebar.classList.remove(this.options.stickyClass);
+ this.sidebar.style.minHeight = '';
+
+ this.sidebar.removeEventListener('update' + EVENT_KEY, this);
+
+ var styleReset = {inner: {}, outer: {}};
+
+ styleReset.inner = {position: '', top: '', left: '', bottom: '', width: '', transform: ''};
+ styleReset.outer = {height: '', position: ''};
+
+ for( let key in styleReset.outer )
+ this.sidebar.style[key] = styleReset.outer[key];
+
+ for( let key in styleReset.inner )
+ this.sidebarInner.style[key] = styleReset.inner[key];
+
+ if( this.options.resizeSensor && 'undefined' !== typeof ResizeSensor ){
+ ResizeSensor.detach(this.sidebarInner, this.handleEvent);
+ ResizeSensor.detach(this.container, this.handleEvent);
+ }
+ }
+
+ /**
+ * Determine if the browser supports CSS transform feature.
+ * @function
+ * @static
+ * @param {Boolean} transform3d - Detect transform with translate3d.
+ * @return {String}
+ */
+ static supportTransform(transform3d){
+ var result = false,
+ property = (transform3d) ? 'perspective' : 'transform',
+ upper = property.charAt(0).toUpperCase() + property.slice(1),
+ prefixes = ['Webkit', 'Moz', 'O', 'ms'],
+ support = document.createElement('support'),
+ style = support.style;
+
+ (property + ' ' + prefixes.join(upper + ' ') + upper).split(' ').forEach(function(property, i) {
+ if (style[property] !== undefined) {
+ result = property;
+ return false;
+ }
+ });
+ return result;
+ }
+
+ /**
+ * Trigger custom event.
+ * @static
+ * @param {DOMObject} element - Target element on the DOM.
+ * @param {String} eventName - Event name.
+ * @param {Object} data -
+ */
+ static eventTrigger(element, eventName, data){
+ try{
+ var event = new CustomEvent(eventName, {detail: data});
+ } catch(e){
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent(eventName, true, true, data);
+ }
+ element.dispatchEvent(event);
+ }
+
+ /**
+ * Extend options object with defaults.
+ * @function
+ * @static
+ */
+ static extend(defaults, options){
+ var results = {};
+ for( let key in defaults ){
+ if( 'undefined' !== typeof options[key] ) results[key] = options[key];
+ else results[key] = defaults[key];
+ }
+ return results;
+ }
+
+ /**
+ * Get current coordinates left and top of specific element.
+ * @static
+ */
+ static offsetRelative(element){
+ var result = {left: 0, top: 0};
+
+ do{
+ let offsetTop = element.offsetTop;
+ let offsetLeft = element.offsetLeft;
+
+ if( ! isNaN(offsetTop) )
+ result.top += offsetTop;
+
+ if( ! isNaN(offsetLeft) )
+ result.left += offsetLeft;
+
+ element = ( 'BODY' === element.tagName ) ?
+ element.parentElement : element.offsetParent;
+ } while(element)
+ return result;
+ }
+
+ /**
+ * Add specific class name to specific element.
+ * @static
+ * @param {ObjectDOM} element
+ * @param {String} className
+ */
+ static addClass(element, className){
+ if( ! StickySidebar.hasClass(element, className) ){
+ if (element.classList)
+ element.classList.add(className);
+ else
+ element.className += ' ' + className;
+ }
+ }
+
+ /**
+ * Remove specific class name to specific element
+ * @static
+ * @param {ObjectDOM} element
+ * @param {String} className
+ */
+ static removeClass(element, className){
+ if( StickySidebar.hasClass(element, className) ){
+ if (element.classList)
+ element.classList.remove(className);
+ else
+ element.className = element.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
+ }
+ }
+
+ /**
+ * Determine weather the element has specific class name.
+ * @static
+ * @param {ObjectDOM} element
+ * @param {String} className
+ */
+ static hasClass(element, className){
+ if (element.classList)
+ return element.classList.contains(className);
+ else
+ return new RegExp('(^| )' + className + '( |$)', 'gi').test(element.className);
+ }
+ }
+
+ return StickySidebar;
+ })();
+
+
+ // Global
+ // -------------------------
+ window.StickySidebar = StickySidebar;
+
+(() => {
+ if( 'undefined' === typeof window ) return;
+
+ const plugin = window.$ || window.jQuery || window.Zepto;
+ const DATA_NAMESPACE = 'stickySidebar';
+
+ // Make sure the site has jquery or zepto plugin.
+ if( plugin ){
+ /**
+ * Sticky Sidebar Plugin Defintion.
+ * @param {Object|String} - config
+ */
+ function _jQueryPlugin(config){
+ return this.each(function(){
+ var $this = plugin(this),
+ data = plugin(this).data(DATA_NAMESPACE);
+
+ if( ! data ){
+ data = new StickySidebar(this, typeof config == 'object' && config);
+ $this.data(DATA_NAMESPACE, data);
+ }
+
+ if( 'string' === typeof config){
+ if (data[config] === undefined && ['destroy', 'updateSticky'].indexOf(config) === -1)
+ throw new Error('No method named "'+ config +'"');
+
+ data[config]();
+ }
+ });
+ }
+
+ plugin.fn.stickySidebar = _jQueryPlugin;
+ plugin.fn.stickySidebar.Constructor = StickySidebar;
+
+ const old = plugin.fn.stickySidebar;
+
+ /**
+ * Sticky Sidebar No Conflict.
+ */
+ plugin.fn.stickySidebar.noConflict = function(){
+ plugin.fn.stickySidebar = old;
+ return this;
+ };
+ }
+})();
diff --git a/interactive-mining-angular-frontend/src/environments/environment.prod.ts b/interactive-mining-angular-frontend/src/environments/environment.prod.ts
new file mode 100644
index 0000000..3612073
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/environments/environment.prod.ts
@@ -0,0 +1,3 @@
+export const environment = {
+ production: true
+};
diff --git a/interactive-mining-angular-frontend/src/environments/environment.ts b/interactive-mining-angular-frontend/src/environments/environment.ts
new file mode 100644
index 0000000..b7f639a
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/environments/environment.ts
@@ -0,0 +1,8 @@
+// The file contents for the current environment will overwrite these during build.
+// The build system defaults to the dev environment which uses `environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in `.angular-cli.json`.
+
+export const environment = {
+ production: false
+};
diff --git a/interactive-mining-angular-frontend/src/favicon.ico b/interactive-mining-angular-frontend/src/favicon.ico
new file mode 100644
index 0000000..8081c7c
Binary files /dev/null and b/interactive-mining-angular-frontend/src/favicon.ico differ
diff --git a/interactive-mining-angular-frontend/src/index.html b/interactive-mining-angular-frontend/src/index.html
new file mode 100644
index 0000000..f8774c4
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/index.html
@@ -0,0 +1,222 @@
+
+
+
+
+ BETA Interactive Minin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ OpenAIRE uses cookies in order to function properly.
+ Cookies are small pieces of data that websites store in your browser to allow us to give you the best browsing experience possible.
+ By using the OpenAIRE portal you accept our use of cookies. Read more
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/interactive-mining-angular-frontend/src/main.ts b/interactive-mining-angular-frontend/src/main.ts
new file mode 100644
index 0000000..a9ca1ca
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/main.ts
@@ -0,0 +1,11 @@
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+ enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule);
diff --git a/interactive-mining-angular-frontend/src/polyfills.ts b/interactive-mining-angular-frontend/src/polyfills.ts
new file mode 100644
index 0000000..7831e97
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/polyfills.ts
@@ -0,0 +1,72 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ * file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+// import 'core-js/es6/symbol';
+// import 'core-js/es6/object';
+// import 'core-js/es6/function';
+// import 'core-js/es6/parse-int';
+// import 'core-js/es6/parse-float';
+// import 'core-js/es6/number';
+// import 'core-js/es6/math';
+// import 'core-js/es6/string';
+// import 'core-js/es6/date';
+// import 'core-js/es6/array';
+// import 'core-js/es6/regexp';
+// import 'core-js/es6/map';
+// import 'core-js/es6/weak-map';
+// import 'core-js/es6/set';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js'; // Run `npm install --save classlist.js`.
+
+/** Evergreen browsers require these. **/
+import 'core-js/es6/reflect';
+import 'core-js/es7/reflect';
+
+
+/**
+ * Required to support Web Animations `@angular/animation`.
+ * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
+ **/
+// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
+
+
+
+/***************************************************************************************************
+ * Zone JS is required by Angular itself.
+ */
+import 'zone.js/dist/zone'; // Included with Angular CLI.
+
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
+
+/**
+ * Date, currency, decimal and percent pipes.
+ * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
+ */
+// import 'intl'; // Run `npm install --save intl`.
+/**
+ * Need to import at least one locale-data with intl.
+ */
+// import 'intl/locale-data/jsonp/en';
diff --git a/interactive-mining-angular-frontend/src/styles.css b/interactive-mining-angular-frontend/src/styles.css
new file mode 100644
index 0000000..90d4ee0
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/styles.css
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */
diff --git a/interactive-mining-angular-frontend/src/test.ts b/interactive-mining-angular-frontend/src/test.ts
new file mode 100644
index 0000000..cd612ee
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/test.ts
@@ -0,0 +1,32 @@
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+import { getTestBed } from '@angular/core/testing';
+import {
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
+declare const __karma__: any;
+declare const require: any;
+
+// Prevent Karma from running prematurely.
+__karma__.loaded = function () {};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
+// Finally, start Karma to run the tests.
+__karma__.start();
diff --git a/interactive-mining-angular-frontend/src/tsconfig.app.json b/interactive-mining-angular-frontend/src/tsconfig.app.json
new file mode 100644
index 0000000..39ba8db
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/tsconfig.app.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/app",
+ "baseUrl": "./",
+ "module": "es2015",
+ "types": []
+ },
+ "exclude": [
+ "test.ts",
+ "**/*.spec.ts"
+ ]
+}
diff --git a/interactive-mining-angular-frontend/src/tsconfig.spec.json b/interactive-mining-angular-frontend/src/tsconfig.spec.json
new file mode 100644
index 0000000..63d89ff
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/tsconfig.spec.json
@@ -0,0 +1,20 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/spec",
+ "baseUrl": "./",
+ "module": "commonjs",
+ "target": "es5",
+ "types": [
+ "jasmine",
+ "node"
+ ]
+ },
+ "files": [
+ "test.ts"
+ ],
+ "include": [
+ "**/*.spec.ts",
+ "**/*.d.ts"
+ ]
+}
diff --git a/interactive-mining-angular-frontend/src/typings.d.ts b/interactive-mining-angular-frontend/src/typings.d.ts
new file mode 100644
index 0000000..ef5c7bd
--- /dev/null
+++ b/interactive-mining-angular-frontend/src/typings.d.ts
@@ -0,0 +1,5 @@
+/* SystemJS module definition */
+declare var module: NodeModule;
+interface NodeModule {
+ id: string;
+}
diff --git a/interactive-mining-angular-frontend/tsconfig.json b/interactive-mining-angular-frontend/tsconfig.json
new file mode 100644
index 0000000..a6c016b
--- /dev/null
+++ b/interactive-mining-angular-frontend/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "outDir": "./dist/out-tsc",
+ "sourceMap": true,
+ "declaration": false,
+ "moduleResolution": "node",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "target": "es5",
+ "typeRoots": [
+ "node_modules/@types"
+ ],
+ "lib": [
+ "es2017",
+ "dom"
+ ]
+ }
+}
diff --git a/interactive-mining-angular-frontend/tslint.json b/interactive-mining-angular-frontend/tslint.json
new file mode 100644
index 0000000..0db5751
--- /dev/null
+++ b/interactive-mining-angular-frontend/tslint.json
@@ -0,0 +1,142 @@
+{
+ "rulesDirectory": [
+ "node_modules/codelyzer"
+ ],
+ "rules": {
+ "arrow-return-shorthand": true,
+ "callable-types": true,
+ "class-name": true,
+ "comment-format": [
+ true,
+ "check-space"
+ ],
+ "curly": true,
+ "eofline": true,
+ "forin": true,
+ "import-blacklist": [
+ true,
+ "rxjs"
+ ],
+ "import-spacing": true,
+ "indent": [
+ true,
+ "spaces"
+ ],
+ "interface-over-type-literal": true,
+ "label-position": true,
+ "max-line-length": [
+ true,
+ 140
+ ],
+ "member-access": false,
+ "member-ordering": [
+ true,
+ {
+ "order": [
+ "static-field",
+ "instance-field",
+ "static-method",
+ "instance-method"
+ ]
+ }
+ ],
+ "no-arg": true,
+ "no-bitwise": true,
+ "no-console": [
+ true,
+ "debug",
+ "info",
+ "time",
+ "timeEnd",
+ "trace"
+ ],
+ "no-construct": true,
+ "no-debugger": true,
+ "no-duplicate-super": true,
+ "no-empty": false,
+ "no-empty-interface": true,
+ "no-eval": true,
+ "no-inferrable-types": [
+ true,
+ "ignore-params"
+ ],
+ "no-misused-new": true,
+ "no-non-null-assertion": true,
+ "no-shadowed-variable": true,
+ "no-string-literal": false,
+ "no-string-throw": true,
+ "no-switch-case-fall-through": true,
+ "no-trailing-whitespace": true,
+ "no-unnecessary-initializer": true,
+ "no-unused-expression": true,
+ "no-use-before-declare": true,
+ "no-var-keyword": true,
+ "object-literal-sort-keys": false,
+ "one-line": [
+ true,
+ "check-open-brace",
+ "check-catch",
+ "check-else",
+ "check-whitespace"
+ ],
+ "prefer-const": true,
+ "quotemark": [
+ true,
+ "single"
+ ],
+ "radix": true,
+ "semicolon": [
+ true,
+ "always"
+ ],
+ "triple-equals": [
+ true,
+ "allow-null-check"
+ ],
+ "typedef-whitespace": [
+ true,
+ {
+ "call-signature": "nospace",
+ "index-signature": "nospace",
+ "parameter": "nospace",
+ "property-declaration": "nospace",
+ "variable-declaration": "nospace"
+ }
+ ],
+ "typeof-compare": true,
+ "unified-signatures": true,
+ "variable-name": false,
+ "whitespace": [
+ true,
+ "check-branch",
+ "check-decl",
+ "check-operator",
+ "check-separator",
+ "check-type"
+ ],
+ "directive-selector": [
+ true,
+ "attribute",
+ "app",
+ "camelCase"
+ ],
+ "component-selector": [
+ true,
+ "element",
+ "app",
+ "kebab-case"
+ ],
+ "use-input-property-decorator": true,
+ "use-output-property-decorator": true,
+ "use-host-property-decorator": true,
+ "no-input-rename": true,
+ "no-output-rename": true,
+ "use-life-cycle-interface": true,
+ "use-pipe-transform-interface": true,
+ "component-class-suffix": true,
+ "directive-class-suffix": true,
+ "no-access-missing-member": true,
+ "templates-use-public": true,
+ "invoke-injectable": true
+ }
+}