commit 2e1bf3588dc21b4a14a4cddcb3e8f43498fcf79d Author: gman Date: Sat May 31 23:08:10 2025 +0300 first commit diff --git a/contacts.html b/contacts.html new file mode 100644 index 0000000..13749c7 --- /dev/null +++ b/contacts.html @@ -0,0 +1,43 @@ + + + + + + + Document + + + + +
+ +
+ +
+
+
+
Свяжитесь с нами
+
Отправьте письмо
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/fonts/DecimaMonoPro.otf b/fonts/DecimaMonoPro.otf new file mode 100644 index 0000000..7795239 Binary files /dev/null and b/fonts/DecimaMonoPro.otf differ diff --git a/fonts/DecimaMonoPro.woff b/fonts/DecimaMonoPro.woff new file mode 100644 index 0000000..ec79ef5 Binary files /dev/null and b/fonts/DecimaMonoPro.woff differ diff --git a/fonts/DecimaMonoPro.woff2 b/fonts/DecimaMonoPro.woff2 new file mode 100644 index 0000000..1434ca1 Binary files /dev/null and b/fonts/DecimaMonoPro.woff2 differ diff --git a/fonts/GOST.woff b/fonts/GOST.woff new file mode 100644 index 0000000..195259f Binary files /dev/null and b/fonts/GOST.woff differ diff --git a/fonts/GOST.woff2 b/fonts/GOST.woff2 new file mode 100644 index 0000000..ebb2278 Binary files /dev/null and b/fonts/GOST.woff2 differ diff --git a/fullpage/fullpage.css b/fullpage/fullpage.css new file mode 100644 index 0000000..2cdf30c --- /dev/null +++ b/fullpage/fullpage.css @@ -0,0 +1,324 @@ +/*! + * fullPage 4.0.35 + * https://github.com/alvarotrigo/fullPage.js + * + * @license GPLv3 for open source use only + * or Fullpage Commercial License for commercial use + * http://alvarotrigo.com/fullPage/pricing/ + * + * Copyright (C) 2021 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo + */ +html.fp-enabled, +.fp-enabled body { + margin: 0; + padding: 0; + overflow:hidden; + + /*Avoid flicker on slides transitions for mobile phones #336 */ + -webkit-tap-highlight-color: rgba(0,0,0,0); +} +.fp-section { + position: relative; + -webkit-box-sizing: border-box; /* Safari<=5 Android<=3 */ + -moz-box-sizing: border-box; /* <=28 */ + box-sizing: border-box; + height: 100%; + display: block; +} +.fp-slide { + float: left; +} +.fp-slide, .fp-slidesContainer { + height: 100%; + display: block; +} +.fp-slides { + z-index:1; + height: 100%; + overflow: hidden; + position: relative; + -webkit-transition: all 0.3s ease-out; /* Safari<=6 Android<=4.3 */ + transition: all 0.3s ease-out; +} +.fp-table{ + display: flex; + flex-direction: column; + justify-content: center; + width: 100%; +} +.fp-slidesContainer { + float: left; + position: relative; +} +.fp-controlArrow { + -webkit-user-select: none; /* webkit (safari, chrome) browsers */ + -moz-user-select: none; /* mozilla browsers */ + -khtml-user-select: none; /* webkit (konqueror) browsers */ + -ms-user-select: none; /* IE10+ */ + position: absolute; + z-index: 4; + top: 50%; + cursor: pointer; + margin-top: -38px; + -webkit-transform: translate3d(0,0,0); + -ms-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); +} +.fp-prev{ + left: 15px; +} +.fp-next{ + right: 15px; +} +.fp-arrow{ + width: 0; + height: 0; + border-style: solid; +} +.fp-arrow.fp-prev { + border-width: 38.5px 34px 38.5px 0; + border-color: transparent #fff transparent transparent; +} +.fp-arrow.fp-next { + border-width: 38.5px 0 38.5px 34px; + border-color: transparent transparent transparent #fff; +} +.fp-notransition { + -webkit-transition: none !important; + transition: none !important; +} +#fp-nav { + position: fixed; + z-index: 100; + top: 50%; + opacity: 1; + transform: translateY(-50%); + -ms-transform: translateY(-50%); + -webkit-transform: translate3d(0,-50%,0); + pointer-events: none; +} +#fp-nav.fp-right { + right: 17px; +} +#fp-nav.fp-left { + left: 17px; +} +.fp-slidesNav{ + position: absolute; + z-index: 4; + opacity: 1; + -webkit-transform: translate3d(0,0,0); + -ms-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + left: 0 !important; + right: 0; + margin: 0 auto !important; + pointer-events: none; +} +.fp-slidesNav.fp-bottom { + bottom: 17px; +} +.fp-slidesNav.fp-top { + top: 17px; +} +#fp-nav ul, +.fp-slidesNav ul { + margin: 0; + padding: 0; +} +#fp-nav ul li, +.fp-slidesNav ul li { + display: block; + width: 14px; + height: 13px; + margin: 7px; + position:relative; +} +.fp-slidesNav ul li { + display: inline-block; +} +#fp-nav ul li a, +.fp-slidesNav ul li a { + display: block; + position: relative; + z-index: 1; + width: 100%; + height: 100%; + cursor: pointer; + text-decoration: none; + pointer-events: all; +} +#fp-nav ul li a.active span, +.fp-slidesNav ul li a.active span, +#fp-nav ul li:hover a.active span, +.fp-slidesNav ul li:hover a.active span{ + height: 12px; + width: 12px; + margin: -6px 0 0 -6px; + border-radius: 100%; + } +#fp-nav ul li a span, +.fp-slidesNav ul li a span { + border-radius: 50%; + position: absolute; + z-index: 1; + height: 4px; + width: 4px; + border: 0; + background: #333; + left: 50%; + top: 50%; + margin: -2px 0 0 -2px; + -webkit-transition: all 0.1s ease-in-out; + -moz-transition: all 0.1s ease-in-out; + -o-transition: all 0.1s ease-in-out; + transition: all 0.1s ease-in-out; +} +#fp-nav ul li:hover a span, +.fp-slidesNav ul li:hover a span{ + width: 10px; + height: 10px; + margin: -5px 0px 0px -5px; +} +#fp-nav ul li .fp-tooltip { + position: absolute; + top: -2px; + color: #fff; + font-size: 14px; + font-family: arial, helvetica, sans-serif; + white-space: nowrap; + max-width: 220px; + overflow: hidden; + display: block; + opacity: 0; + width: 0; + cursor: pointer; +} +#fp-nav ul li:hover .fp-tooltip, +#fp-nav.fp-show-active a.active + .fp-tooltip { + -webkit-transition: opacity 0.2s ease-in; + transition: opacity 0.2s ease-in; + width: auto; + opacity: 1; +} +#fp-nav ul li .fp-tooltip.fp-right { + right: 20px; +} +#fp-nav ul li .fp-tooltip.fp-left { + left: 20px; +} +.fp-auto-height.fp-section, +.fp-auto-height .fp-slide{ + height: auto !important; +} + +.fp-responsive .fp-is-overflow.fp-section{ + height: auto !important; +} + +/* Tries to prevent overwrites #4657 */ +.fp-enabled .fp-scrollable{ + overflow: visible; + height: initial; +} + +/* Used with autoScrolling: false */ +.fp-scrollable.fp-responsive .fp-is-overflow.fp-section, +.fp-scrollable .fp-section, +.fp-scrollable .fp-slide{ + /* Fallback for browsers that do not support Custom Properties */ + height: 100vh; + height: calc(var(--vh, 1vh) * 100); +} + +.fp-scrollable.fp-responsive .fp-is-overflow.fp-section:not(.fp-auto-height):not([data-percentage]), +.fp-scrollable .fp-section:not(.fp-auto-height):not([data-percentage]), +.fp-scrollable .fp-slide:not(.fp-auto-height):not([data-percentage]){ + /* Fallback for browsers that do not support Custom Properties */ + min-height: 100vh; + min-height: calc(var(--vh, 1vh) * 100); +} + +/* Disabling vertical centering on scrollable elements */ +.fp-overflow{ + justify-content: flex-start; +} + +body:not(.fp-responsive) .fp-overflow{ + max-height: 100vh; + max-height: 100dvh; /* fix for new browsers */ +} + +/* No scrollable when using auto-height */ +.fp-scrollable .fp-auto-height .fp-overflow{ + max-height: none; +} + +.fp-is-overflow .fp-overflow.fp-auto-height-responsive, +.fp-is-overflow .fp-overflow.fp-auto-height, +.fp-is-overflow > .fp-overflow{ + overflow-y: auto; +} +.fp-overflow{ + outline:none; +} + +.fp-overflow.fp-table{ + display: block; +} + +.fp-responsive .fp-auto-height-responsive.fp-section, +.fp-responsive .fp-auto-height-responsive .fp-slide, +.fp-responsive .fp-auto-height-responsive .fp-overflow{ + height: auto !important; + min-height: auto !important; +} + +/*Only display content to screen readers*/ +.fp-sr-only{ + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Customize website's scrollbar like Mac OS +Not supports in Firefox and IE */ +.fp-scroll-mac .fp-overflow::-webkit-scrollbar { + background-color: transparent; + width: 9px; +} +.fp-scroll-mac .fp-overflow::-webkit-scrollbar-track { + background-color: transparent; +} +.fp-scroll-mac .fp-overflow::-webkit-scrollbar-thumb { + background-color: rgba(0,0,0,.4); + border-radius: 16px; + border: 4px solid transparent; +} +.fp-warning, +.fp-watermark{ + z-index: 9999999; + position: absolute; + bottom: 0; +} +.fp-warning, +.fp-watermark a{ + text-decoration: none; + color: #000; + background: rgba(255,255,255,0.6); + padding: 5px 8px; + font-size: 14px; + font-family: arial; + color: black; + display: inline-block; + border-radius: 3px; + margin: 12px; +} +.fp-noscroll .fp-overflow{ + overflow: hidden; +} \ No newline at end of file diff --git a/fullpage/fullpage.extensions.min.js b/fullpage/fullpage.extensions.min.js new file mode 100644 index 0000000..2d26414 --- /dev/null +++ b/fullpage/fullpage.extensions.min.js @@ -0,0 +1,11 @@ +/*! +* fullPage 4.0.35 +* https://github.com/alvarotrigo/fullPage.js +* +* @license GPLv3 for open source use only +* or Fullpage Commercial License for commercial use +* http://alvarotrigo.com/fullPage/pricing/ +* +* Copyright (C) 2018 http://alvarotrigo.com/fullPage/ - A project by Alvaro Trigo +*/ +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(n="undefined"!=typeof globalThis?globalThis:n||self).fullpage=t()}(this,(function(){"use strict";var n,t,e,i,r=Object.freeze({__proto__:null,get showError(){return Ae},get isVisible(){return xe},get getVisible(){return Oe},get $(){return ke},get deepExtend(){return Ee},get hasClass(){return Re},get getWindowHeight(){return Le},get t(){return je},get css(){return De},get prev(){return ze},get next(){return Ne},get last(){return Ie},get index(){return Pe},get getList(){return He},get hide(){return Ce},get show(){return We},get isArrayOrList(){return Fe},get addClass(){return Ve},get removeClass(){return Be},get appendTo(){return Ze},get wrap(){return Ye},get wrapAll(){return Ge},get wrapInner(){return Xe},get unwrap(){return Ue},get closest(){return _e},get after(){return Qe},get before(){return Je},get insertBefore(){return Ke},get getScrollTop(){return $e},get siblings(){return qe},get preventDefault(){return ni},get i(){return ti},get o(){return ei},get u(){return ii},get l(){return ri},get v(){return oi},get isFunction(){return ai},get trigger(){return ui},get matches(){return li},get toggle(){return ci},get createElementFromHTML(){return si},get remove(){return fi},get filter(){return di},get untilAll(){return vi},get nextAll(){return pi},get prevAll(){return hi},get toArray(){return gi},get p(){return mi},get h(){return wi},get g(){return bi},get S(){return Si},get M(){return yi}});Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(n){if(null==this)throw new TypeError('"this" is null or not defined');var t=Object(this),e=t.length>>>0;if("function"!=typeof n)throw new TypeError("predicate must be a function");for(var i=arguments[1],r=0;r0?1:-1)*Math.floor(Math.abs(t)):t}(n);return Math.min(Math.max(t,0),e)},function(n){var e=this,r=Object(n);if(null==n)throw new TypeError("Array.from requires an array-like object - not null or undefined");var o,a=arguments.length>1?arguments[1]:void 0;if(void 0!==a){if(!t(a))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(o=arguments[2])}for(var u,l=i(r.length),c=t(e)?Object(new e(l)):new Array(l),s=0;s0||navigator.maxTouchPoints,f=!!window.MSInputMethodContext&&!!document.documentMode,d={test:{},shared:{}},v=(o=window.self!==window.top,function(){return o});a.NodeList&&!NodeList.prototype.forEach&&(NodeList.prototype.forEach=function(n,t){t=t||window;for(var e=0;e','
'],controlArrowColor:"#fff",verticalCentered:!0,sectionsColor:[],paddingTop:0,paddingBottom:0,fixedElements:null,responsive:0,responsiveWidth:0,responsiveHeight:0,responsiveSlides:!1,parallax:!1,parallaxOptions:{type:"reveal",percentage:62,property:"translate"},cards:!1,cardsOptions:{perspective:100,fadeContent:!0,fadeBackground:!0},sectionSelector:".section",slideSelector:".slide",afterLoad:null,beforeLeave:null,onLeave:null,afterRender:null,afterResize:null,afterReBuild:null,afterSlideLoad:null,onSlideLeave:null,afterResponsive:null,onScrollOverflow:null,lazyLoading:!0,lazyLoadThreshold:0,observer:!0,scrollBeyondFullpage:!0},_=null,Q=!1,J=Ee({},U),K=null;function $(n){return _}function q(){return K||U}function nn(){return J}function tn(n,t,e){K[n]=t,"internal"!==e&&(J[n]=t)}function en(){if(!q().anchors.length){var n=ke(q().sectionSelector.split(",").join("[data-anchor],")+"[data-anchor]",_);n.length&&n.length===ke(q().sectionSelector,_).length&&(Q=!0,n.forEach((function(n){q().anchors.push(ti(n,"data-anchor").toString())})))}if(!q().navigationTooltips.length){var t=ke(q().sectionSelector.split(",").join("[data-tooltip],")+"[data-tooltip]",_);t.length&&t.forEach((function(n){q().navigationTooltips.push(ti(n,"data-tooltip").toString())}))}}var rn={A:0,O:0,slides:[],R:[],L:null,j:null,D:!1,N:!1,I:!1,P:!1,H:!1,C:void 0,W:void 0,F:!1,canScroll:!0,V:"none",B:"none",Z:!1,Y:!1,G:!0,X:0,U:Le(),_:!1,J:{},scrollY:0,scrollX:0,K:!1};function on(n){Object.assign(rn,n)}function an(){return rn}function un(n){return void 0!==window["fp_"+n+"Extension"]}function ln(n){var t=q();return null!==t[n]&&"[object Array]"===Object.prototype.toString.call(t[n])?t[n].length&&d[n]:t[n]&&d[n]}function cn(n,t,e){if(ln(n))return ai(d[n][t])?d[n][t](e):d[n][t]}function sn(){return cn("dragAndMove","isAnimating")}function fn(){return cn("dragAndMove","isGrabbing")}function dn(n){if(q().offsetSections&&d.offsetSections){var t=cn("offsetSections","getWindowHeight",n);return""!==t?Math.round(t)+"px":t}return Le()+"px"}function vn(n,t){n.insertBefore(t,n.firstChild)}function pn(n){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";function e(n){var e,i,r,o,a,u,l="",c=0;for(n=n.replace(/[^A-Za-z0-9+/=]/g,"");c>4,i=(15&o)<<4|(a=t.indexOf(n.charAt(c++)))>>2,r=(3&a)<<6|(u=t.indexOf(n.charAt(c++))),l+=String.fromCharCode(e),64!=a&&(l+=String.fromCharCode(i)),64!=u&&(l+=String.fromCharCode(r));return l=function(n){for(var t,e="",i=0,r=0,o=0;i191&&r<224?(o=n.charCodeAt(i+1),e+=String.fromCharCode((31&r)<<6|63&o),i+=2):(o=n.charCodeAt(i+1),t=n.charCodeAt(i+2),e+=String.fromCharCode((15&r)<<12|(63&o)<<6|63&t),i+=3);return e}(l),l}function i(n){return n.slice(3).slice(0,-3)}return function(n){var t=n.split("_");if(t.length>1){var r=t[1];return e(n.replace(i(t[1]),"").split("_")[0].slice(2).slice(0,-2))+"_"+e(r.slice(3).slice(0,-3))}return i(n)}(e(n))}a.state=rn,a.fp_utils=a.fp_utils||{},Object.assign(a.fp_utils,{prependTo:vn,toggleClass:function(n,t,e){if(n.classList&&null==e)n.classList.toggle(t);else{var i=Re(n,t);i&&null==e||!e?Be(n,t):(!i&&null==e||e)&&Ve(n,t)}}});var hn=function(n){this.anchor=n.anchor,this.item=n.item,this.index=n.index(),this.isLast=this.index===n.item.parentElement.querySelectorAll(n.selector).length-1,this.isFirst=!this.index,this.isActive=n.isActive},gn=function(n,t){this.parent=this.parent||null,this.selector=t,this.anchor=ti(n,"data-anchor")||q().anchors[Pe(n,q().sectionSelector)],this.item=n,this.isVisible=xe(n),this.isActive=Re(n,y),this.q=Re(n,H)||null!=ke(C,n)[0],this.nn=t===q().sectionSelector,this.container=_e(n,I)||_e(n,h),this.index=function(){return this.siblings().indexOf(this)}};function mn(n){return n.map((function(n){return n.item}))}function wn(n,t){return n.find((function(n){return n.item===t}))}gn.prototype.siblings=function(){return this.nn?this.isVisible?rn.R:rn.tn:this.parent?this.parent.slides:0},gn.prototype.prev=function(){var n=this.siblings(),t=(this.nn?n.indexOf(this):this.parent.slides.indexOf(this))-1;return t>=0?n[t]:null},gn.prototype.next=function(){var n=this.siblings(),t=(this.nn?n.indexOf(this):this.parent.slides.indexOf(this))+1;return ti?"up":"down"}function En(n){return Ve(n,w)}function Rn(n){return{"-webkit-transform":n,"-moz-transform":n,"-ms-transform":n,transform:n}}function Ln(n,t){t?On($()):En($()),clearTimeout(bn),De($(),Rn(n)),d.test.on=n,bn=setTimeout((function(){Be($(),w)}),10)}function jn(n){var t=Math.round(n);if(q().css3&&q().autoScrolling&&!q().scrollBar)Ln("translate3d(0px, -"+t+"px, 0px)",!1);else if(q().autoScrolling&&!q().scrollBar)De($(),{top:-t+"px"}),d.test.top=-t+"px";else{var e=An(t);xn(e.element,e.options)}}function Dn(n,t){"internal"!==t&&(cn("fadingEffect","update",n),cn("effects","update",n)),cn("cards","update_",n),tn("scrollingSpeed",n,t)}d.setScrollingSpeed=Dn;var zn,Nn=null,In=null,Pn=null;function Hn(n,t,e,i){var r,o=function(n){return n.self!=a&&Re(n,D)?n.scrollLeft:!q().autoScrolling||q().scrollBar?$e():n.offsetTop}(n),u=t-o,l=!1,c=rn.F;on({F:!0}),zn&&window.cancelAnimationFrame(zn),zn=function(s){r||(r=s);var f=Math.floor(s-r);if(rn.F){var d=t;e&&(d=a.fp_easings[q().easing](f,o,u,e)),f<=e&&xn(n,d),f=n.HAVE_FUTURE_DATA?n.play():n.addEventListener("canplay",(function t(){n.play(),n.removeEventListener("canplay",t)})))})),ke('iframe[src*="youtube.com/embed/"]',t).forEach((function(n){Cn(n)&&Fn(n),n.onload=function(){Cn(n)&&Fn(n)}}))}function Fn(n){n.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}function Vn(n){var t=Mn(n);ke("video, audio",t).forEach((function(n){n.hasAttribute("data-keepplaying")||"function"!=typeof n.pause||n.pause()})),ke('iframe[src*="youtube.com/embed/"]',t).forEach((function(n){/youtube\.com\/embed\//.test(ti(n,"src"))&&!n.hasAttribute("data-keepplaying")&&n.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function Bn(n){if(q().lazyLoading){var t=Mn(n);ke("img[data-src], img[data-srcset], source[data-src], source[data-srcset], video[data-src], audio[data-src], iframe[data-src]",t).forEach((function(n){if(["src","srcset"].forEach((function(t){var e=ti(n,"data-"+t);null!=e&&e&&(bi(n,t),n.addEventListener("load",(function(){})))})),li(n,"source")){var t=_e(n,"video, audio");t&&(t.load(),t.onloadeddata=function(){})}})),Ve(t,A)}}function Zn(n){var t=q().lazyLoadThreshold;Bn(n.item),t&&(Yn(n,"prev",t),Yn(n,"next",t))}function Yn(n,t,e){for(var i=n,r=0;r-1&&this.an[n].splice(e,1)}},ln:function(n){for(var t=this,e=arguments.length,i=new Array(e>1?e-1:0),r=1;rt?"left":"right"}function jt(){clearTimeout(yt)}function Dt(n){cn("continuousHorizontal","afterSlideLoads",n),cn("dragAndMove","afterSlideLoads",n),n.localIsResizing||(cn("parallax","afterSlideLoads"),cn("scrollOverflowReset","setPrevious",n.prevSlide),cn("scrollOverflowReset","reset"),ai(q().afterSlideLoad)&&Yt("afterSlideLoad",n),on({canScroll:!0}),Wn(n.destiny),Jn.ln(wt,n)),on({I:!1}),cn("interlockedSlides","interlockedSlides",n)}function zt(n,t){Dn(0,"internal"),void 0!==t&&on({P:!0}),Et(_e(n,z),n),void 0!==t&&on({P:!1}),Dn(nn().scrollingSpeed,"internal")}Mt.m={up:!0,down:!0,left:!0,right:!0},Mt.k=Ee({},Mt.m),Jn.un(qn,(function(n){var t=n.target;(li(t,Z)||_e(t,Z))&&xt.call(t,n)})),d.landscapeScroll=Et,Jn.un(rt,(function(){Jn.un(pt,kt)}));var Nt=null,It=null;function Pt(){rn.L=null,rn.R.map((function(n){var t=Re(n.item,y);n.isActive=t,n.q=Te.q(n.item),t&&(rn.L=n),n.slides.length&&(n.activeSlide=null,n.slides.map((function(t){var e=Re(t.item,y);t.q=Te.q(n.item),t.isActive=e,e&&(n.activeSlide=t)})))})),function(){var n=rn.L,t=!!rn.L&&rn.L.slides.length,e=rn.L?rn.L.activeSlide:null;if(!n&&rn.R.length&&!an().D){if(Nt){var i=Wt(Nt,rn.R);i&&(rn.L=i,rn.L.isActive=!0,Ve(rn.L.item,y)),rn.L&&jn(rn.L.item.offsetTop)}if(t&&!e&&It){var r=Wt(It,rn.L.slides);r&&(rn.L.activeSlide=r,rn.L.activeSlide.isActive=!0,Ve(rn.L.activeSlide.item,y)),rn.L.activeSlide&&zt(rn.L.activeSlide.item,"internal")}}}(),ui($(),"onUpdateStateDone")}function Ht(){var n=ke(q().sectionSelector+", "+O,$()),t=Oe(n),e=Array.from(n).map((function(n){return new Ft(n)})),i=e.filter((function(n){return n.isVisible})),r=i.reduce((function(n,t){return n.concat(t.slides)}),[]);Nt=Ct(rn.L),It=Ct(rn.L?rn.L.activeSlide:null),rn.A=t.length,rn.O=i.reduce((function(n,t){return n+t.slides.length}),0),rn.R=i,rn.tn=e,rn.slides=r,rn.rn=rn.R.concat(rn.slides)}function Ct(n){if(!n)return null;var t=n?n.item:null,e=n.nn?rn.tn:rn.L.dn;if(t){var i=wn(e,t);return i?i.index():null}return null}function Wt(n,t){var e,i=n-1,r=n;do{if(e=t[i]||t[r])break;i-=1,r+=1}while(i>=0||r0,o=i>2&&i'+Kn(o.index(),"Section")+"";var l=q().navigationTooltips[o.index()];void 0!==l&&""!==l&&(i+='
'+l+"
"),i+=""}ke("ul",e)[0].innerHTML=i;var c=ke("li",ke(E)[0])[an().L.index()];Ve(ke("a",c),y)}function Kt(n){n.preventDefault&&ni(n),on({j:"verticalNav"});var t=Pe(_e(this,"#fp-nav li"));Jn.ln(ft,{destination:an().R[t]})}function $t(n,t){var e;e=n,q().menu&&q().menu.length&&ke(q().menu).forEach((function(n){null!=n&&(Be(ke(M,n),y),Ve(ke('[data-menuanchor="'+e+'"]',n),y))})),function(n,t){var e=ke(E)[0];q().navigation&&null!=e&&"none"!==e.style.display&&(Be(ke(M,e),y),Ve(n?ke('a[href="#'+n+'"]',e):ke("a",ke("li",e)[t]),y))}(n,t)}Vt.prototype=gn.prototype,Vt.prototype.constructor=Ft,d.setRecordHistory=Gt,d.setAutoScrolling=Xt,d.test.setAutoScrolling=Xt,(new Date).getTime();var qt,ne,te,ee,ie,re,oe=(ne=!0,te=(new Date).getTime(),ee=!a.fullpage_api,function(n,t){var e=(new Date).getTime(),i="wheel"===n?q().scrollingSpeed:100;return ne=ee||e-te>=i,ee=!a.fullpage_api,ne&&(qt=t(),te=e),void 0===qt||qt});function ae(n,t){if(ai(q().beforeLeave))return oe(an().j,(function(){return Yt(n,t)}))}function ue(n,t,e){var i=n.item;if(null!=i){var r,o,a={element:i,callback:t,isMovementUp:e,dtop:le(i),yMovement:kn(an().L,i),anchorLink:n.anchor,sectionIndex:n.index(),activeSlide:n.activeSlide?n.activeSlide.item:null,leavingSection:an().L.index()+1,localIsResizing:rn.P,items:{origin:an().L,destination:n},direction:null};if(!(an().L.item==i&&!rn.P||q().scrollBar&&$e()===a.dtop&&!Re(i,"fp-auto-height"))){if(null!=a.activeSlide&&(r=ti(a.activeSlide,"data-anchor"),o=Pe(a.activeSlide,null)),!a.localIsResizing){var u=a.yMovement;if(void 0!==e&&(u=e?"up":"down"),a.direction=u,un("dropEffect")&&d.dropEffect.onLeave_(a),un("waterEffect")&&d.waterEffect.onLeave_(a),cn("effects","beforeLeave",a),ai(q().beforeLeave)&&!1===ae("beforeLeave",a))return;if(ai(q().onLeave)&&!Yt("onLeave",a))return}cn("parallax","apply",a),cn("cards","apply",a),cn("dropEffect","apply",a),cn("waterEffect","apply",a),q().autoScrolling&&q().continuousVertical&&void 0!==a.isMovementUp&&(!a.isMovementUp&&"up"==a.yMovement||a.isMovementUp&&"down"==a.yMovement)&&(a=function(n){on({_:!0});var t=an().L.item;return n.isMovementUp?Je(t,pi(t,O)):Qe(t,hi(t,O).reverse()),jn(an().L.item.offsetTop),Ut(),n.hn=t,n.dtop=n.element.offsetTop,n.yMovement=kn(an().L,n.element),n.leavingSection=n.items.origin.index()+1,n.sectionIndex=n.items.destination.index(),ui($(),"onContinuousVertical",n),n}(a)),cn("scrollOverflowReset","setPrevious",an().L.item),a.localIsResizing||Vn(an().L.item),ln("dropEffect")&&q().dropEffect||(Ve(i,y),Be(qe(i),y)),Pt(),Zn(n),on({canScroll:d.test.gn}),Un(o,r,a.anchorLink),Jn.ln(gt,a),function(n){on({V:"none",scrollY:Math.round(n.dtop)}),Jn.ln(pt,n),ln("effects")&&cn("effects","performMovement",n);var t=q().scrollingSpeed<700,e=t?700:q().scrollingSpeed;if(q().css3&&q().autoScrolling&&!q().scrollBar)Ln("translate3d(0px, -"+Math.round(n.dtop)+"px, 0px)",!0),ln("waterEffect")&&Ut(),q().scrollingSpeed?(clearTimeout(ie),ie=setTimeout((function(){ce(n),on({canScroll:!t||d.test.gn})}),q().scrollingSpeed)):ce(n);else{var i=An(n.dtop);d.test.top=-n.dtop+"px",clearTimeout(ie),Hn(i.element,i.options,q().scrollingSpeed,(function(){q().scrollBar?ie=setTimeout((function(){ce(n)}),30):(ce(n),on({canScroll:!t||d.test.gn}))}))}t&&(clearTimeout(re),re=setTimeout((function(){on({canScroll:!0})}),e))}(a),on({C:a.anchorLink}),$t(a.anchorLink,function(n){return null!=n.hn?n.isMovementUp?rn.A-1:0:n.sectionIndex}(a))}}}function le(n){var t=n.offsetHeight,e=n.offsetTop,i=e,r=ln("dragAndMove")&&cn("dragAndMove","isGrabbing")?cn("dragAndMove","isScrollingDown"):e>rn.X,o=i-Le()+t,a=q().bigSectionsDestination;return t>Le()?(r||a)&&"bottom"!==a||(i=o):(r||rn.P&&null==Ne(n))&&(i=o),ln("offsetSections")&&(i=d.offsetSections.getSectionPosition_(r,i,n)),on({X:i}),i}function ce(n){on({D:!1}),function(n){null!=n.hn&&(n.isMovementUp?Je(ke(O)[0],n.hn):Qe(ke(O)[an().R.length-1],n.hn),jn(an().L.item.offsetTop),function(){for(var n=ke(j),t=0;t-1&&!Te.An)return ni(n),!1},yn:function(){Te.Tn=rn.canScroll},onLeave:function(){clearTimeout(ge),Te.An=!1},afterLoad:function(){Te.An=!1,clearTimeout(ge),ge=setTimeout((function(){Te.Tn=rn.canScroll}),200)},Rn:function(){u.activeElement===this.Mn&&(this.Mn.blur(),Te.An=!1)},Sn:function(){if(q().scrollOverflow&&Te.Tn){Te.Rn();var n=Te.Ln(an().L.item);!n||l||s||(this.Mn=n,requestAnimationFrame((function(){n.focus({jn:!0}),Te.An=!0}))),Te.Tn=!1}},bn:function(){q().scrollOverflowMacStyle&&!c&&Ve(Nn,"fp-scroll-mac"),an().rn.forEach((function(n){if(!(n.slides&&n.slides.length||Re(n.item,"fp-auto-height-responsive")&&pe())){var t,e=Mn(n.item),i=Te.mn(n.item),o=(t=n).nn?t:t.parent;if(f){var a=i?"addClass":"removeClass";r[a](o.item,W),r[a](n.item,W)}else Ve(o.item,W),Ve(n.item,W);n.q||(Te.Dn(e),Te.zn(e)),n.q=!0}}))},zn:function(n){Te.Ln(n).addEventListener("scroll",Te.Nn),n.addEventListener("wheel",Te.kn,{passive:!1}),n.addEventListener("keydown",Te.En,{passive:!1})},Dn:function(n){var t=document.createElement("div");t.className=H,Xe(n,t),t.setAttribute("tabindex","-1")},In:function(n){var t=ke(C,n)[0];t&&(Ue(t),n.removeAttribute("tabindex"))},Ln:function(n){var t=Mn(n);return ke(C,t)[0]||t},q:function(n){return Re(n,H)||null!=ke(C,n)[0]},wn:function(n){return n.nn&&n.activeSlide?n.activeSlide.q:n.q},mn:function(n){return Te.Ln(n).scrollHeight>a.innerHeight},isScrolled:function(n,t){if(!rn.canScroll)return!1;if(q().scrollBar)return!0;var e=Te.Ln(t);if(!q().scrollOverflow||!Re(e,H)||Re(t,"fp-noscroll")||Re(Mn(t),"fp-noscroll"))return!0;var i=f?1:0,r=e.scrollTop,o="up"===n&&r<=0,a="down"===n&&e.scrollHeight<=Math.ceil(e.offsetHeight+r)+i,u=o||a;return u||"none"===n||(this.xn=(new Date).getTime()),u},Pn:function(){this.On=(new Date).getTime();var n=this.On-Te.xn,t=(l||s)&&rn.Z,e=rn.Y&&n>600;return t&&n>400||e},Nn:(ye=0,function(n){var t=n.target.scrollTop,e="none"!==rn.V?rn.V:ye1?t:document)?t.querySelectorAll(n):null}function Ee(n){n=n||{};for(var t=1,e=arguments.length;t1&&(q().controlArrows&&function(n){var t=n.item,e=[si(q().controlArrowsHTML[0]),si(q().controlArrowsHTML[1])];Qe(ke(z,t)[0],e),Ve(e,B),Ve(e[0],Y),Ve(e[1],"fp-next"),"#fff"!==q().controlArrowColor&&(De(ke(X,t),{"border-color":"transparent transparent transparent "+q().controlArrowColor}),De(ke(G,t),{"border-color":"transparent "+q().controlArrowColor+" transparent transparent"})),q().loopHorizontal||Ce(ke(G,t))}(n),q().slidesNavigation&&function(n){var t=n.item,e=n.slides.length;Ze(si('
    '),t);var i=ke(F,t)[0];Ve(i,"fp-"+q().slidesNavPosition);for(var r=0;r'+Kn(r,"Slide",ke(L,t)[r])+""),ke("ul",i)[0]);De(i,{"margin-left":"-"+i.innerWidth/2+"px"});var o=n.activeSlide?n.activeSlide.index():0;Ve(ke("a",ke("li",i)[o]),y)}(n)),i.forEach((function(n){De(n.item,{width:o+"%"}),q().verticalCentered&&he(n)}));var c=ln("responsiveSlides")?null:n.activeSlide||null;null!=c&&rn.L&&(0!==rn.L.index()||0===rn.L.index()&&0!==c.index())?(zt(c.item,"internal"),Ve(c.item,"fp-initial")):Ve(e[0],y)}window.fp_utils=Object.assign(a.fp_utils||{},{$:ke,deepExtend:Ee,hasClass:Re,getWindowHeight:Le,css:De,prev:ze,next:Ne,last:Ie,index:Pe,getList:He,hide:Ce,show:We,isArrayOrList:Fe,addClass:Ve,removeClass:Be,appendTo:Ze,wrap:Ye,wrapAll:Ge,wrapInner:Xe,unwrap:Ue,closest:_e,after:Qe,before:Je,insertBefore:Ke,getScrollTop:$e,siblings:qe,preventDefault:ni,isFunction:ai,trigger:ui,matches:li,toggle:ci,createElementFromHTML:si,remove:fi,filter:di,untilAll:vi,nextAll:pi,prevAll:hi,showError:Ae,scrollOverflowHandler:Te}),Jn.un(rt,(function(){["click","touchstart"].forEach((function(n){ei(n,Mi,{passive:!1})})),ii("focus",Ai),Jn.un(ot,Ti)}));var ki={attributes:!1,subtree:!0,childList:!0,characterData:!0};function Ei(){return cn("responsiveSlides","isResponsiveSlidesChanging")||Oe(ke(q().slideSelector,$())).length!==an().O}function Ri(n){var t=Ei();(Ei()||cn("responsiveSlides","isResponsiveSlidesChanging")||Oe(ke(q().sectionSelector,$())).length!==an().A)&&!rn._&&(q().observer&&Me&&Me.disconnect(),Ht(),Pt(),q().anchors=[],fi(ke(E)),cn("responsiveSlides","isResponsiveSlidesChanging")||xi(),en(),q().navigation&&Jt(),t&&(fi(ke(F)),fi(ke(Z))),an().R.forEach((function(n){n.slides.length?t&&Oi(n):we(n)}))),q().observer&&Me&&ke(h)[0]&&Me.observe(ke(h)[0],ki)}Jn.un(rt,(function(){var n,t,e;q().observer&&"MutationObserver"in window&&ke(h)[0]&&(n=ke(h)[0],t=ki,(e=new MutationObserver(Ri)).observe(n,t),Me=e),Jn.un(at,Ri)})),d.render=Ri;var Li=function(){var n=!1;try{var t=Object.defineProperty({},"passive",{get:function(){n=!0}});ii("testPassive",null,t),oi("testPassive",null,t)}catch(n){}return function(){return n}}();function ji(){return!!Li()&&{passive:!1}}var Di,zi,Ni,Ii,Pi=(Ni=(new Date).getTime(),Ii=[],{Cn:function(n){var t=(n=n||a.event).wheelDelta||-n.deltaY||-n.detail,e=Math.max(-1,Math.min(1,t)),i=void 0!==n.wheelDeltaX||void 0!==n.deltaX;Di=Math.abs(n.wheelDeltaX)149&&Ii.shift(),Ii.push(Math.abs(t));var o=r-Ni;Ni=r,o>200&&(Ii=[])},Wn:function(){var n=wi(Ii,10)>=wi(Ii,70);return!!Ii.length&&n&&Di},Fn:function(){return zi}});function Hi(){var n=q().css3?$e()+Le():mi(an().R).item.offsetTop+mi(an().R).item.offsetHeight,t=An(n);d.test.top=-n+"px",on({canScroll:!1}),Hn(t.element,t.options,q().scrollingSpeed,(function(){setTimeout((function(){on({D:!0}),on({canScroll:!0})}),30)}))}function Ci(){$().getBoundingClientRect().bottom>=0&&Wi()}function Wi(){var n=An(mi(an().R).item.offsetTop);on({canScroll:!1}),Hn(n.element,n.options,q().scrollingSpeed,(function(){on({canScroll:!0}),on({D:!1}),on({Vn:!1})}))}var Fi,Vi,Bi,Zi=(Fi=!1,Vi={},Bi={},function(n,t,e){switch(n){case"set":Vi[t]=(new Date).getTime(),Bi[t]=e;break;case"isNewKeyframe":var i=(new Date).getTime();Fi=i-Vi[t]>Bi[t]}return Fi});function Yi(){var n=an().L.next();n||!q().loopBottom&&!q().continuousVertical||(n=an().R[0]),null!=n?ue(n,null,!1):$().scrollHeightXi&&At().m.down&&Yi()),Xi=n.pageY)}function _i(n){if(At().m[n]){var t="down"===n?Yi:Gi;ln("scrollHorizontally")&&(t=cn("scrollHorizontally","getScrollSection",{type:n,scrollSection:t})),q().scrollOverflow&&Te.wn(an().L)?Te.isScrolled(n,an().L.item)&&Te.Pn()&&t():t()}}var Qi,Ji,Ki,$i=0,qi=0,nr=0,tr=0,er=cr(),ir={Bn:"ontouchmove"in window?"touchmove":er?er.move:null,Zn:"ontouchstart"in window?"touchstart":er?er.down:null};function rr(n){var t=_e(n.target,O)||an().L.item,e=Te.wn(an().L);if(or(n)){on({Z:!0,Y:!1}),q().autoScrolling&&(e&&!rn.canScroll||q().scrollBar)&&ni(n);var i=lr(n);nr=i.y,tr=i.x;var r=Math.abs($i-nr)>a.innerHeight/100*q().touchSensitivity,o=Math.abs(qi-tr)>je()/100*q().touchSensitivity,u=ke(z,t).length&&Math.abs(qi-tr)>Math.abs($i-nr),l=$i>nr?"down":"up";on({V:u?qi>tr?"right":"left":l}),u?!rn.I&&o&&(qi>tr?At().m.right&&Jn.ln(tt,{section:t}):At().m.left&&Jn.ln(nt,{section:t})):q().autoScrolling&&rn.canScroll&&r&&_i(l)}}function or(n){return void 0===n.pointerType||"mouse"!=n.pointerType}function ar(n){if(q().fitToSection&&on({F:!1}),or(n)){var t=lr(n);$i=t.y,qi=t.x}ii("touchend",ur)}function ur(){oi("touchend",ur),on({Z:!1})}function lr(n){var t={};return t.y=void 0!==n.pageY&&(n.pageY||n.pageX)?n.pageY:n.touches[0].pageY,t.x=void 0!==n.pageX&&(n.pageY||n.pageX)?n.pageX:n.touches[0].pageX,s&&or(n)&&q().scrollBar&&void 0!==n.touches&&(t.y=n.touches[0].pageY,t.x=n.touches[0].pageX),t}function cr(){var n;return a.PointerEvent&&(n={down:"pointerdown",move:"pointermove"}),n}function sr(n){q().autoScrolling&&or(n)&&At().m.up&&(rn.canScroll||ni(n))}function fr(n,t){var e=null==t?an().L.item:t,i=wn(rn.R,e),r=ke(z,e)[0];if(!(null==r||sn()||rn.I||i.slides.length<2)){var o=i.activeSlide,a="left"===n?o.prev():o.next();if(!a){if(!q().loopHorizontal)return;a="left"===n?mi(i.slides):i.slides[0]}on({I:!d.test.gn}),Et(r,a.item,n)}}function dr(n){fr("left",n)}function vr(n){fr("right",n)}function pr(n){var t=an().R.filter((function(t){return t.anchor===n}))[0];if(!t){var e=void 0!==n?n-1:0;t=an().R[e]}return t}function hr(n){null!=n&&Et(_e(n,z),n)}function gr(n,t){var e=pr(n);if(null!=e){var i=function(n,t){var e=t.slides.filter((function(t){return t.anchor===n}))[0];return null==e&&(n=void 0!==n?n:0,e=t.slides[n]),e?e.item:null}(t,e);e.anchor&&e.anchor===rn.C||Re(e.item,y)?hr(i):ue(e,(function(){hr(i)}))}}function mr(n,t){var e=pr(n);void 0!==t?gr(n,t):null!=e&&ue(e)}function wr(){clearTimeout(Ji),ri("keydown",br),ri("keyup",Sr)}function br(n){clearTimeout(Ji);var t=n.keyCode,e=[37,39].indexOf(t)>-1,i=q().autoScrolling||q().fitToSection||e;9===t?function(n){var t=n.shiftKey,e=u.activeElement,i=xr(Mn(an().L.item));function r(n){return ni(n),i[0]?i[0].focus():null}if(rn.canScroll){if(!function(n){var t=xr(u),e=t.indexOf(u.activeElement),i=t[n.shiftKey?e-1:e+1],r=_e(i,L),o=_e(i,O);return!r&&!o}(n)){e?null==_e(e,".fp-section.active,.fp-section.active .fp-slide.active")&&(e=r(n)):r(n);var o=e==i[0],a=e==i[i.length-1],l=t&&o;if(l||!t&&a){ni(n);var c=function(n){var t,e=n?"prevPanel":"nextPanel",i=[],r=Tn((rn.L&&rn.L.activeSlide?rn.L.activeSlide:rn.L)[e]());do{(i=xr(r.item)).length&&(t={Yn:r,Gn:i[n?i.length-1:0]}),r=Tn(r[e]())}while(r&&0===i.length);return t}(l),s=c?c.Yn:null;if(s){var f=s.nn?s:s.parent;Jn.ln(lt,{Xn:f.index()+1,slideAnchor:s.nn?0:s.index()}),Ki=c.Gn,ni(n)}}}}else ni(n)}(n):!yi()&&q().keyboardScrolling&&i&&(Qi=n.ctrlKey,Ji=setTimeout((function(){!function(n){var t=n.shiftKey,e=u.activeElement,i=li(e,"video")||li(e,"audio"),r=Te.isScrolled("up",an().L.item),o=Te.isScrolled("down",an().L.item),a=[37,39].indexOf(n.keyCode)>-1;if(function(n){(function(n){return[40,38,32,33,34].indexOf(n.keyCode)>-1&&!rn.D})(n)&&!_e(n.target,C)&&n.preventDefault()}(n),rn.canScroll||a)switch(on({j:"keydown"}),n.keyCode){case 38:case 33:At().k.up&&r?rn.D?Jn.ln(ct,{e:n}):Gi():Te.Sn();break;case 32:if(t&&At().k.up&&!i&&r){Gi();break}case 40:case 34:if(At().k.down&&o){if(rn.D)return;32===n.keyCode&&i||Yi()}else Te.Sn();break;case 36:At().k.up&&mr(1);break;case 35:At().k.down&&mr(an().R.length);break;case 37:At().k.left&&dr();break;case 39:At().k.right&&vr()}}(n)}),0))}function Sr(n){rn.G&&(Qi=n.ctrlKey)}function yr(){on({G:!1}),Qi=!1}function Mr(n){Ar()}function Tr(n){_e(Ki,L)&&!_e(Ki,j)||Ar()}function Ar(){Ki&&(Ki.focus(),Ki=null)}function xr(n){return[].slice.call(ke('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], summary:not([disabled]), [contenteditable]',n)).filter((function(n){return"-1"!==ti(n,"tabindex")&&null!==n.offsetParent}))}d.moveSlideLeft=dr,d.moveSlideRight=vr,d.moveTo=mr,Jn.un(rt,(function(){ii("blur",yr),ei("keydown",br),ei("keyup",Sr),Jn.un(ot,wr),Jn.un(wt,Mr),Jn.un(mt,Tr)}));var Or=(new Date).getTime(),kr=[];function Er(n){n?(function(){var n,t="";a.addEventListener?n="addEventListener":(n="attachEvent",t="on");var e="onwheel"in u.createElement("div")?"wheel":void 0!==u.onmousewheel?"mousewheel":"DOMMouseScroll",i=ji();"DOMMouseScroll"==e?u[n](t+"MozMousePixelScroll",Rr,i):u[n](t+e,Rr,i)}(),$().addEventListener("mousedown",Lr),$().addEventListener("mouseup",jr)):(u.addEventListener?(ri("mousewheel",Rr,!1),ri("wheel",Rr,!1),ri("MozMousePixelScroll",Rr,!1)):u.detachEvent("onmousewheel",Rr),$().removeEventListener("mousedown",Lr),$().removeEventListener("mouseup",jr))}function Rr(n){var t=(new Date).getTime(),e=Re(ke(".fp-completely")[0],"fp-normal-scroll"),i=function(n,t){(new Date).getTime();var e=an().D&&n.getBoundingClientRect().bottom>=0&&"up"===Pi.Fn(),i=an().Vn;if(i)return ni(t),!1;if(an().D){if(e){var r;if(!(i||Zi("isNewKeyframe","beyondFullpage")&&Pi.Wn()))return(r=An(mi(an().R).item.offsetTop+mi(an().R).item.offsetHeight)).element.scrollTo(0,r.options),on({Vn:!1}),ni(t),!1;if(Pi.Wn())return e=!1,on({Vn:!0}),on({j:"wheel"}),Wi(),ni(t),!1}else Zi("set","beyondFullpage",1e3);if(!i&&!e)return!0}}($(),n);if(rn.Y||on({Z:!1,Y:!0,V:"none"}),!At().m.down&&!At().m.up)return!1;if(i)return!0;if(!1===i)return ni(n),!1;if(q().autoScrolling&&!Qi&&!e){var r=(n=n||a.event).wheelDelta||-n.deltaY||-n.detail,o=Math.max(-1,Math.min(1,r)),u=void 0!==n.wheelDeltaX||void 0!==n.deltaX,l=Math.abs(n.wheelDeltaX)0?"up":"none";kr.length>149&&kr.shift(),kr.push(Math.abs(r)),q().scrollBar&&ni(n);var s=t-Or;return Or=t,s>200&&(kr=[]),on({B:c}),rn.canScroll&&!sn()&&wi(kr,10)>=wi(kr,70)&&l&&(on({j:"wheel"}),_i(o<0?"down":"up")),!1}q().fitToSection&&on({F:!1})}function Lr(n){var t;2==n.which&&(t=n.pageY,Xi=t,$().addEventListener("mousemove",Ui))}function jr(n){2==n.which&&$().removeEventListener("mousemove",Ui)}function Dr(n){n?(Er(!0),function(){if(ir.Bn&&(l||s)&&(!ln("dragAndMove")||"mouseonly"===q().dragAndMove)){q().autoScrolling&&(Nn.removeEventListener(ir.Bn,sr,{passive:!1}),Nn.addEventListener(ir.Bn,sr,{passive:!1}));var n=q().touchWrapper;n.removeEventListener(ir.Zn,ar),n.removeEventListener(ir.Bn,rr,{passive:!1}),n.addEventListener(ir.Zn,ar),n.addEventListener(ir.Bn,rr,{passive:!1})}}()):(Er(!1),function(){if(ir.Bn&&(l||s)){q().autoScrolling&&(Nn.removeEventListener(ir.Bn,rr,{passive:!1}),Nn.removeEventListener(ir.Bn,sr,{passive:!1}));var n=q().touchWrapper;n.removeEventListener(ir.Zn,ar),n.removeEventListener(ir.Bn,rr,{passive:!1})}}())}d.setMouseWheelScrolling=Er;var zr=!0;function Nr(){["mouseenter","touchstart","mouseleave","touchend"].forEach((function(n){ri(n,Pr,!0)}))}function Ir(n,t){document["fp_"+n]=t,ei(n,Pr,!0)}function Pr(n){var t=n.type,e=!1,i="mouseleave"===t?n.toElement||n.relatedTarget:n.target;i!=document&&i?("touchend"===t&&(zr=!1,setTimeout((function(){zr=!0}),800)),("mouseenter"!==t||zr)&&(q().normalScrollElements.split(",").forEach((function(n){if(!e){var t=li(i,n),r=_e(i,n);(t||r)&&(d.shared.Un||Dr(!1),d.shared.Un=!0,e=!0)}})),!e&&d.shared.Un&&(Dr(!0),d.shared.Un=!1))):Dr(!0)}function Hr(n,t){Dn(0,"internal"),mr(n,t),Dn(nn().scrollingSpeed,"internal")}Jn.un(rt,(function(){q().normalScrollElements&&(["mouseenter","touchstart"].forEach((function(n){Ir(n,!1)})),["mouseleave","touchend"].forEach((function(n){Ir(n,!0)}))),Jn.un(ot,Nr)})),d.silentMoveTo=Hr;var Cr,Wr,Fr=Le(),Vr=je(),Br=!1;function Zr(){clearTimeout(Cr),clearTimeout(Wr),oi("resize",Yr)}function Yr(){Br||(q().autoScrolling&&!q().scrollBar||!q().fitToSection)&&Xr(Le()),rn.K&&function(){if(l)for(var n=0;n<4;n++)Wr=setTimeout((function(){window.requestAnimationFrame((function(){q().autoScrolling&&!q().scrollBar&&(on({P:!0}),Hr(rn.L.index()+1),on({P:!1}))}))}),200*n)}(),Br=!0,clearTimeout(Cr),Cr=setTimeout((function(){!function(){var n,t,e;if(on({P:!0}),(!l||q().adjustOnNavChange)&&(Xr(""),ui($(),"onResize"),rn.D||q().autoScrolling||(n=.01*a.innerHeight,u.documentElement.style.setProperty("--vh","".concat(n,"px")))),Jn.ln(at),Pt(),de(),l){var i=u.activeElement;if(!li(i,"textarea")&&!li(i,"input")&&!li(i,"select")){var r=Le();Math.abs(r-Fr)>20*Math.max(Fr,r)/100&&(Gr(!0),Fr=r)}}else t=Le(),e=je(),rn.U===t&&Vr===e||(on({U:t}),Vr=e,Gr(!0));ui($(),"onResizeEnds"),on({P:!1})}(),Br=!1}),400)}function Gr(n){if(!Re($(),b)){on({P:!0,U:Le(),_n:je()});for(var t=an().R,e=0;e1&&Et(r,i.activeSlide.item)}q().scrollOverflow&&Te.bn();var u=an().L.index();rn.D||!u||ln("fadingEffect")||ln("dropEffect")||ln("waterEffect")||Hr(u+1),on({P:!1}),ai(q().afterResize)&&n&&q().afterResize.call($(),a.innerWidth,a.innerHeight),ai(q().afterReBuild)&&!n&&q().afterReBuild.call($()),ui($(),"afterRebuild")}}function Xr(n){an().R.forEach((function(t){var e=""!==n||ln("offsetSections")?dn(t.item):"";De(t.item,{height:e})}))}function Ur(){var n,t,e=a.location.hash;if(e.length){var i=e.replace("#","").split("/"),r=e.indexOf("#/")>-1;n=r?"/"+i[1]:decodeURIComponent(i[0]);var o=r?i[2]:i[1];o&&o.length&&(t=decodeURIComponent(o))}return{section:n,pn:t}}function _r(){oi("hashchange",Qr)}function Qr(){if(!rn.H&&!q().lockAnchors){var n=Ur(),t=n.section,e=n.pn,i=void 0===rn.C,r=void 0===rn.C&&void 0===e&&!rn.I;t&&t.length&&(t&&t!==rn.C&&!i||r&&!sn()||!rn.I&&rn.W!=e&&!sn())&&Jn.ln(lt,{Xn:t,slideAnchor:e})}}function Jr(n){var t=n.target;_e(t,q().menu+" [data-menuanchor]")&&Kr.call(t,n.e)}function Kr(n){if(on({j:"menu"}),ke(q().menu)[0]&&(q().lockAnchors||!q().anchors.length)){ni(n);var t=_e(this,"[data-menuanchor]");Jn.ln(st,{anchor:ti(t,"data-menuanchor")})}}function $r(n){var t=n.target;t&&_e(t,"#fp-nav a")?Kt.call(t,n.e):li(t,".fp-tooltip")?Qt.call(t):(li(t,V)||null!=_e(t,V))&&bt.call(t,n.e)}d.reBuild=Gr,Jn.un(rt,(function(){Yr(),ii("resize",Yr),Jn.un(ot,Zr)})),d.setLockAnchors=function(n){q().lockAnchors=n},Jn.un(rt,(function(){ii("hashchange",Qr),Jn.un(ot,_r)})),Jn.un(rt,(function(){ei("wheel",Pi.Cn,ji()),Jn.un(vt,Hi),Jn.un(ct,Ci)})),Jn.un(rt,(function(){Jn.un(qn,Jr)})),Jn.un(rt,(function(){Jn.un(qn,$r)}));var qr,no,to=0;function eo(n){var t,e,i,r,o;if(ui($(),"onScroll"),!rn.P&&an().L&&(mi(an().R),!an().D&&!an().Vn&&(!q().autoScrolling||q().scrollBar||ln("dragAndMove"))&&!fn())){var a=ln("dragAndMove")?Math.abs(cn("dragAndMove","getCurrentScroll")):$e(),u=function(n){var t=n>to?"down":"up";return to=n,on({X:n}),t}(a),c=0,s=a+Le()/2,f=(ln("dragAndMove")?cn("dragAndMove","getDocumentHeight"):Nn.scrollHeight-Le())===a,d=an().R;if(on({scrollY:a}),f)c=d.length-1;else if(a)for(var v=0;v=$e()+Le():r<=$e())&&(Re(an().L.item,T)||(Ve(an().L.item,T),Be(qe(an().L.item),T))),e=(t=d[c]).item,!t.isActive){on({H:!0});var p,h,g=an().L.item,m=an().L.index()+1,w=kn(an().L,e),b=t.anchor,S=t.index()+1,M=t.activeSlide,A={L:g,sectionIndex:S-1,anchorLink:b,element:e,leavingSection:m,direction:w,items:{origin:an().L,destination:t}};if(M&&(h=M.anchor,p=M.index()),rn.canScroll)Be(d.filter((function(n){return n.index()!==t.index()})).map((function(n){return n.item})),y),Ve(e,y),cn("parallax","afterLoad"),ai(q().beforeLeave)&&ae("beforeLeave",A),ai(q().onLeave)&&Yt("onLeave",A),ai(q().afterLoad)&&Yt("afterLoad",A),cn("resetSliders","apply",{localIsResizing:rn.P,leavingSection:m}),Vn(g),Zn(t),Wn(e),$t(b,S-1),q().anchors.length&&on({C:b}),Pt(),Un(p,h,b);clearTimeout(qr),qr=setTimeout((function(){on({H:!1})}),100)}q().fitToSection&&rn.canScroll&&(clearTimeout(no),no=setTimeout((function(){var n;if(!rn.R.filter((function(n){var t=n.item.getBoundingClientRect();return Math.round(t.bottom)===Math.round(Le())||0===Math.round(t.top)})).length){if(l&&(n=document.activeElement)&&n.matches("input, textarea"))return;fe()}}),q().fitToSectionDelay))}}function io(n){var t=n.items.destination.activeSlide;on({scrollX:t?Math.round(t.offsetLeft):0})}function ro(n){var t=q().skipIntermediateItems,e=n.items.origin.nn?"sections":"slides",i=Math.abs(n.items.origin.index()-n.items.destination.index())>1;(!0===t||t===e)&&i&&Dn(0,"internal")}function oo(){q().skipIntermediateItems&&tn("scrollingSpeed",nn().scrollingSpeed,"internal")}function ao(n,t){void 0!==t?(t=t.replace(/ /g,"").split(",")).forEach((function(t){Tt(n,t,"k")})):(Tt(n,"all","k"),q().keyboardScrolling=n)}function uo(n){var t=n.index();void 0!==q().anchors[t]&&n.isActive&&$t(q().anchors[t],t),q().menu&&q().css3&&null!=_e(ke(q().menu)[0],h)&&ke(q().menu).forEach((function(n){Nn.appendChild(n)}))}function lo(){var n,t,e=an().L,i=an().L.item;Ve(i,T),Zn(an().L),_t(),Wn(i),t=pr((n=Ur()).section),n.section&&t&&(void 0===t||t.index()!==Pe(me))||!ai(q().afterLoad)||Yt("afterLoad",{L:i,element:i,direction:null,anchorLink:e.anchor,sectionIndex:e.index(),items:{origin:an().L,destination:an().L}}),ai(q().afterRender)&&Yt("afterRender"),ui($(),"afterRender")}function co(n,t){void 0!==t?(t=t.replace(/ /g,"").split(",")).forEach((function(t){Tt(n,t,"m")})):Tt(n,"all","m"),ui($(),"setAllowScrolling",{value:n,Qn:t})}function so(){var n=Ur(),t=n.section,e=n.pn;t?q().animateAnchor?gr(t,e):Hr(t,e):Jn.ln($n,null)}Jn.un(ot,(function(){clearTimeout(qr),clearTimeout(no)})),Jn.un(rt,(function(){ii("scroll",eo),u.body.addEventListener("scroll",eo),Jn.un(lt,(function(n){gr(n.Xn,n.slideAnchor)})),Jn.un(st,(function(n){mr(n.anchor,void 0)})),Jn.un(ut,(function(n){("down"===n.direction?Yi:Gi)()})),Jn.un(ft,(function(n){ue(n.destination)}))})),Jn.un(ot,(function(){oi("scroll",eo)})),d.getActiveSlide=function(){return Zt(an().L.activeSlide)},d.getScrollX=function(){return rn.scrollX},Jn.un(rt,(function(){Jn.un(ot,jt),Jn.un(dt,(function(n){Et(n.slides,n.destination)})),Jn.un(tt,(function(n){vr(n.section)})),Jn.un(nt,(function(n){dr(n.section)})),Jn.un(mt,io)})),Jn.un(rt,(function(){var n=q().credits.position,t=["left","right"].indexOf(n)>-1?"".concat(n,": 0;"):"",e='\n \n "),i=mi(rn.R),r=!rn.Jn||q().credits.enabled;i&&i.item&&r&&i.item.insertAdjacentHTML("beforeend",e)})),function(){Jn.un(et,(function(){var t,u,l;on({Jn:(q().licenseKey,t=q().licenseKey,u=function(t){var e=parseInt("514").toString(16);if(!t||t.length<29||4===t.split(n[0]).length)return null;var i=["Each","for"][r()]().join(""),u=t[["split"]]("-"),l=[];u[i]((function(n,t){if(t<4){var i=function(n){var t=n[n.length-1],e=["NaN","is"][r()]().join("");return window[e](t)?o(t):function(n){return n-y.length}(t)}(n);l.push(i);var a=o(n[i]);if(1===t){var u=["pa","dS","t","art"].join("");a=a.toString()[u](2,"0")}e+=a,0!==t&&1!==t||(e+="-")}}));var c=0,s="";return t.split("-").forEach((function(n,t){if(t<4){for(var e=0,i=0;i<4;i++)i!==l[t]&&(e+=Math.abs(o(n[i])),isNaN(n[i])||c++);var r=a(e);s+=r}})),s+=a(c),{Kn:new Date(e+"T00:00"),$n:e.split("-")[2]===8*(y.length-2)+"",qn:s}}(t),l=function(n){var t=i[r()]().join("");return n&&0===t.indexOf(n)&&n.length===t.length}(t)||function(n){return new RegExp("^(?=.*?[A-Y])(?=.*?[a-y])(?=.*?[0-8])(?=.*?[#?!@$%^&*-]).{8,}$").test(n)}(t),(u||l)&&(u&&e<=u.Kn&&u.qn===t.split(n[0])[4]||l||u.$n)||!1)})}));var n=["-"],t="2025-2-25".split("-"),e=new Date(t[0],t[1],t[2]),i=["se","licen","-","v3","l","gp"];function r(){return[["re","verse"].join("")]["".length]}function o(n){return n?isNaN(n)?n.charCodeAt(0)-72:n:""}function a(n){var t=72+n;return t>90&&t<97&&(t+=15),String.fromCharCode(t).toUpperCase()}}(),Jn.un(pt,ro),Jn.un(mt,oo),Jn.un(ht,ro),Jn.un(wt,oo),Jn.un(it,(function(){ao(!0)})),d.setKeyboardScrolling=ao,d.shared.nt=lo,d.setAllowScrolling=co;var fo={};function vo(){return fo}var po,ho,go,mo,wo=!Re(Nn,pn("OHNsd3AtZnVsbHBhZ2UtanM5T20="));function bo(n){if(ho=u.createElement("div"),po=pn("MTIzPGRpdj48YSBocmVmPSJodHRwOi8vYWx2YXJvdHJpZ28uY29tL2Z1bGxQYWdlL2V4dGVuc2lvbnMvIiBzdHlsZT0iY29sb3I6ICNmZmYgIWltcG9ydGFudDsgdGV4dC1kZWNvcmF0aW9uOm5vbmUgIWltcG9ydGFudDsiPlVubGljZW5zZWQgZnVsbFBhZ2UuanMgRXh0ZW5zaW9uPC9hPjwvZGl2PjEyMw=="),wo||(po=po.replace("extensions/","").replace("Extension","")),ho.innerHTML=po,ho=ho.firstChild,"MutationObserver"in window&&new MutationObserver(yo).observe(u.body,{childList:!0,subtree:!1}),(!wo||ln(n)&&d[n])&&(!function(n){var t=void 0!==vo()[n]&&vo()[n].length,e=[],i=!1;return Fe(vo()[n])?e=vo()[n]:e.push(vo()[n]),e.forEach((function(e){var r=function(){if(u.domain.length){for(var n=u.domain.replace(/^(www\.)/,"").split(".");n.length>2;)n.shift();return n.join(".").replace(/(^\.*)|(\.*$)/g,"")}return""}(),o=["MTM0bG9jYWxob3N0MjM0","MTM0MC4xMjM0","MTM0anNoZWxsLm5ldDIzNA==","UDdDQU5ZNlNN","NTY3YnVuZGxlNzg5","NTU1S2V5Nzc3","NDU2dGVzdDQ1Ng=="],a=pn(o[0]),l=pn(o[1]),c=pn(o[2]),s=pn(o[6]),f=pn(o[3]),d=pn(o[4]),v=pn(o[5]),p=void 0!==q()[d+v];t=t||p;var h=[a,l,c,s].indexOf(r)<0&&0!==r.length;if(!t&&!p&&h)return!1;var g=t?pn(e):"",m=(g=g.split("_")).length>1&&g[1].indexOf(n,g[1].length-n.length)>-1,w=g.length>1&&g[1].toLowerCase().indexOf(d)>-1,b=g[0].indexOf(r,g[0].length-r.length)<0,S=m||w;i=i||!(b&&h&&f!=g[0])&&S||!h})),i}(n)||!wo)){So();var t=pn("MzQ1c2V0SW50ZXJ2YWwxMjM=");window[t](So,2e3)}}function So(){ho&&(mo||(Math.random()<.5?vn(Nn,ho):Ze(ho,Nn),mo=!0),ho.setAttribute("style",pn("MTIzei1pbmRleDo5OTk5OTk5O3Bvc2l0aW9uOmZpeGVkO3RvcDoyMHB4O2JvdHRvbTphdXRvO2xlZnQ6MjBweDtyaWdodDphdXRvO2JhY2tncm91bmQ6cmVkO3BhZGRpbmc6N3B4IDE1cHg7Zm9udC1zaXplOjE0cHg7Zm9udC1mYW1pbHk6YXJpYWw7Y29sb3I6I2ZmZjtkaXNwbGF5OmlubGluZS1ibG9jazt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO29wYWNpdHk6MTtoZWlnaHQ6YXV0bzt3aWR0aDphdXRvO3pvb206MTttYXJnaW46YXV0bztib3JkZXI6bm9uZTt2aXNpYmlsaXR5OnZpc2libGU7Y2xpcC1wYXRoOm5vbmU7MTIz").replace(/;/g,pn("MTIzICFpbXBvcnRhbnQ7MzQ1"))))}function yo(n){n.forEach((function(n){if(n.removedNodes[0]&&n.removedNodes[0].isEqualNode(ho)){clearTimeout(go);var t=pn("bDIwc2V0VGltZW91dDAzbA==");go=window[t](Mo,900)}}))}function Mo(){mo=!1}function To(){Ht(),Pt(),q().scrollBar=q().scrollBar||q().hybrid,en(),function(){De(Si($(),"body"),{height:"100%",position:"relative"}),Ve($(),p),Ve(In,S),on({U:Le()}),Be($(),b),xi(),cn("parallax","init");for(var n=an().tn,t=0;t0&&Oi(e)}q().fixedElements&&q().css3&&ke(q().fixedElements).forEach((function(n){Nn.appendChild(n)})),q().navigation&&Jt(),ke('iframe[src*="youtube.com/embed/"]',$()).forEach((function(n){var t,e;e=ti(t=n,"src"),t.setAttribute("src",e+(/\?/.test(e)?"&":"?")+"enablejsapi=1")})),cn("fadingEffect","apply"),cn("waterEffect","init"),cn("dropEffect","init"),cn("cards","init"),cn("effects","init"),q().scrollOverflow&&Te.bn()}(),co(!0),Dr(!0),Xt(q().autoScrolling,"internal"),de(),Gn(),"complete"===u.readyState&&so(),ii("load",so),lo(),wo||bo("l"),Ht(),Pt()}function Ao(){var n=q().licenseKey;""===q().licenseKey.trim()?(Ae("error","Fullpage.js requires a `licenseKey` option. Read about it on the following website:"),Ae("error","https://alvarotrigo.com/fullPage/docs/#licensekey")):q()&&rn.Jn||u.domain.indexOf("alvarotrigo.com")>-1?n&&n.length:(Ae("error","Incorrect `licenseKey`. Get one for fullPage.js version 4 here:"),Ae("error","https://alvarotrigo.com/fullPage/pricing")),Re(In,S)?Ae("error","Fullpage.js can only be initialized once and you are doing it multiple times!"):(q().continuousVertical&&(q().loopTop||q().loopBottom)&&(q().continuousVertical=!1,Ae("warn","Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled")),!q().scrollOverflow||!q().scrollBar&&q().autoScrolling||Ae("warn","Options scrollBar:true and autoScrolling:false are mutually exclusive with scrollOverflow:true. Sections with scrollOverflow might not work well in Firefox"),!q().continuousVertical||!q().scrollBar&&q().autoScrolling||(q().continuousVertical=!1,Ae("warn","Scroll bars (`scrollBar:true` or `autoScrolling:false`) are mutually exclusive with `continuousVertical`; `continuousVertical` disabled")),q().anchors.forEach((function(n){var t=[].slice.call(ke("[name]")).filter((function(t){return ti(t,"name")&&ti(t,"name").toLowerCase()==n.toLowerCase()})),e=[].slice.call(ke("[id]")).filter((function(t){return ti(t,"id")&&ti(t,"id").toLowerCase()==n.toLowerCase()}));if(e.length||t.length){Ae("error","data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).");var i=e.length?"id":"name";(e.length||t.length)&&Ae("error",'"'+n+'" is is being used by another element `'+i+"` property")}})))}function xo(){return{options:q(),internals:{container:$(),canScroll:rn.canScroll,isScrollAllowed:At(),getDestinationPosition:le,isTouch:s,c:bo,getXmovement:Lt,removeAnimation:En,getTransforms:Rn,lazyLoad:Bn,addAnimation:On,performHorizontalMove:Rt,landscapeScroll:Et,silentLandscapeScroll:zt,keepSlidesPosition:Ut,silentScroll:jn,styleSlides:Oi,styleSection:we,scrollHandler:eo,getEventsPage:lr,getMSPointer:cr,isReallyTouch:or,usingExtension:ln,toggleControlArrows:Ot,touchStartHandler:ar,touchMoveHandler:rr,nullOrSection:Bt,items:{SectionPanel:Ft,SlidePanel:Vt,Item:gn},getVisible:Oe,getState:an,updateState:Pt,updateStructuralState:Ht,activeSlidesNavigation:St,getPanels:function(){return rn.rn},getSections:function(){return rn.R},setActiveSection:function(n){rn.L=n}}}}function Oo(n){var t=["NTY3YnVuZGxlNzg5","NTU1S2V5Nzc3"],e=pn(t[0]),i=pn(t[1]),r=void 0!==q()[e+i],o="fp_"+n+"Extension";vo()[n]=r?q()[e+i]:q()[n+i],d[n]=void 0!==window[o]?new window[o]:null,d[n]&&d[n].c(n)}function ko(n,t){var e;if(Nn=ke("body")[0],In=ke("html")[0],Pn=ke("html, body"),!Re(In,S))return"touchWrapper",e="string"==typeof n?ke(n)[0]:n,U.touchWrapper=e,function(n){K=Ee({},U,n),J=Object.assign({},K)}(t),function(n){_=n}("string"==typeof n?ke(n)[0]:n),Jn.ln(et),Ao(),d.getFullpageData=xo,d.version="4.0.35",d.test=Object.assign(d.test,{top:"0px",on:"translate3d(0px, 0px, 0px)",cn:function(){for(var n=[],t=0;t>> 0; // 3. If IsCallable(predicate) is false, throw a TypeError exception. + + if (typeof predicate !== 'function') { + throw new TypeError('predicate must be a function'); + } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. + + + var thisArg = arguments[1]; // 5. Let k be 0. + + var k = 0; // 6. Repeat, while k < len + + while (k < len) { + // a. Let Pk be ! ToString(k). + // b. Let kValue be ? Get(O, Pk). + // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). + // d. If testResult is true, return kValue. + var kValue = o[k]; + + if (predicate.call(thisArg, kValue, k, o)) { + return kValue; + } // e. Increase k by 1. + + + k++; + } // 7. Return undefined. + + + return undefined; + } + }); + } + + // Production steps of ECMA-262, Edition 6, 22.1.2.1 + if (!Array.from) { + Array.from = function () { + var toStr = Object.prototype.toString; + + var isCallable = function isCallable(fn) { + return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; + }; + + var toInteger = function toInteger(value) { + var number = Number(value); + + if (isNaN(number)) { + return 0; + } + + if (number === 0 || !isFinite(number)) { + return number; + } + + return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); + }; + + var maxSafeInteger = Math.pow(2, 53) - 1; + + var toLength = function toLength(value) { + var len = toInteger(value); + return Math.min(Math.max(len, 0), maxSafeInteger); + }; // The length property of the from method is 1. + + + return function from(arrayLike + /*, mapFn, thisArg */ + ) { + // 1. Let C be the this value. + var C = this; // 2. Let items be ToObject(arrayLike). + + var items = Object(arrayLike); // 3. ReturnIfAbrupt(items). + + if (arrayLike == null) { + throw new TypeError('Array.from requires an array-like object - not null or undefined'); + } // 4. If mapfn is undefined, then let mapping be false. + + + var mapFn = arguments.length > 1 ? arguments[1] : void undefined; + var T; + + if (typeof mapFn !== 'undefined') { + // 5. else + // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. + if (!isCallable(mapFn)) { + throw new TypeError('Array.from: when provided, the second argument must be a function'); + } // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. + + + if (arguments.length > 2) { + T = arguments[2]; + } + } // 10. Let lenValue be Get(items, "length"). + // 11. Let len be ToLength(lenValue). + + + var len = toLength(items.length); // 13. If IsConstructor(C) is true, then + // 13. a. Let A be the result of calling the [[Construct]] internal method + // of C with an argument list containing the single item len. + // 14. a. Else, Let A be ArrayCreate(len). + + var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Let k be 0. + + var k = 0; // 17. Repeat, while k < len… (also steps a - h) + + var kValue; + + while (k < len) { + kValue = items[k]; + + if (mapFn) { + A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); + } else { + A[k] = kValue; + } + + k += 1; + } // 18. Let putStatus be Put(A, "length", len, true). + + + A.length = len; // 20. Return A. + + return A; + }; + }(); + } + + var win = window; + var doc = document; + var isTouchDevice = navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/) || navigator.userAgent.includes("Mac") && "ontouchend" in document; // iPad on iOS 13 detection + + var isMacDevice = /(Mac|iPhone|iPod|iPad)/i.test(win.navigator.userAgent); // @ts-ignore + + var isTouch = 'ontouchstart' in win || navigator.msMaxTouchPoints > 0 || navigator.maxTouchPoints; + var isIE11 = !!window.MSInputMethodContext && !!document.documentMode; // taken from https://github.com/udacity/ud891/blob/gh-pages/lesson2-focus/07-modals-and-keyboard-traps/solution/modal.js + + var focusableElementsString = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], summary:not([disabled]), [contenteditable]'; // cache common elements + + var FP = { + test: {}, + shared: {} + }; + var extensions = ['parallax', 'scrollOverflowReset', 'dragAndMove', 'offsetSections', 'fadingEffect', 'responsiveSlides', 'continuousHorizontal', 'interlockedSlides', 'scrollHorizontally', 'resetSliders', 'cards', 'dropEffect', 'waterEffect']; + var isInsideIframe = function () { + var inIframe = window.self !== window.top; + return function () { + return inIframe; + }; + }(); + + /** + * forEach polyfill for IE + * https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Browser_Compatibility + */ + + if (win.NodeList && !NodeList.prototype.forEach) { + NodeList.prototype.forEach = function (callback, thisArg) { + thisArg = thisArg || window; + + for (var i = 0; i < this.length; i++) { + callback.call(thisArg, this[i], i, this); + } + }; + } + + if (typeof Object.assign != 'function') { + // Must be writable: true, enumerable: false, configurable: true + Object.defineProperty(Object, 'assign', { + value: function assign(target, varArgs) { + + if (target == null) { + // TypeError if undefined or null + throw new TypeError('Cannot convert undefined or null to object'); + } + + var to = Object(target); + + for (var index = 1; index < arguments.length; index++) { + var nextSource = arguments[index]; + + if (nextSource != null) { + // Skip over if undefined or null + for (var nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + + return to; + }, + writable: true, + configurable: true + }); + } + + // https://stackoverflow.com/questions/51719553/padstart-not-working-in-ie11 + // https://github.com/behnammodi/polyfill/blob/master/string.polyfill.js + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart + if (!String.prototype.padStart) { + String.prototype.padStart = function padStart(targetLength, padString) { + targetLength = targetLength >> 0; //truncate if number or convert non-number to 0; + + padString = String(typeof padString !== 'undefined' ? padString : ' '); + + if (this.length > targetLength) { + return String(this); + } else { + targetLength = targetLength - this.length; + + if (targetLength > padString.length) { + padString += Array.apply(null, Array(targetLength)).map(function () { + return padString; + }).join(""); + } + + return padString.slice(0, targetLength) + String(this); + } + }; + } + + //utils + /** + * Shows a message in the console of the given type. + */ + + function showError(type, text) { + win.console && win.console[type] && win.console[type]('fullPage: ' + text); + } + function isVisible(el) { + var style = win.getComputedStyle(el); + return style.display !== 'none'; + } + function getVisible(elements) { + return Array.from(elements).filter(function (e) { + return isVisible(e); + }); + } + /** + * Equivalent of jQuery function $(). + */ + + function $(selector, context) { + context = arguments.length > 1 ? context : document; + return context ? context.querySelectorAll(selector) : null; + } + /** + * Extends a given Object properties and its childs. + */ + + function deepExtend(out) { + out = out || {}; + + for (var i = 1, len = arguments.length; i < len; ++i) { + var obj = arguments[i]; + + if (!obj) { + continue; + } + + for (var key in obj) { + if (!obj.hasOwnProperty(key) || key == '__proto__' || key == 'constructor') { + continue; + } // based on https://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/ + + + if (Object.prototype.toString.call(obj[key]) === '[object Object]') { + out[key] = deepExtend(out[key], obj[key]); + continue; + } + + out[key] = obj[key]; + } + } + + return out; + } + /** + * Checks if the passed element contains the passed class. + */ + + function hasClass(el, className) { + if (el == null) { + return false; + } + + return el.classList.contains(className); + } + /** + * Gets the window height. Crossbrowser. + */ + + function getWindowHeight() { + return 'innerHeight' in win ? win.innerHeight : doc.documentElement.offsetHeight; + } + /** + * Gets the window width. + */ + + function getWindowWidth() { + return win.innerWidth; + } + /** + * Set's the CSS properties for the passed item/s. + * @param {NodeList|HTMLElement|Object} items + * @param {Object} props css properties and values. + */ + + function css(items, props) { + items = getList(items); + var key; + + for (key in props) { + if (props.hasOwnProperty(key)) { + if (key !== null) { + for (var i = 0; i < items.length; i++) { + var item = items[i]; + item.style[key] = props[key]; + } + } + } + } + + return items; + } + /** + * Gets the previous element to the passed element. + */ + + function prev(item) { + return item.previousElementSibling; + } + /** + * Gets the next element to the passed element. + */ + + function next(item) { + return item.nextElementSibling; + } + /** + * Gets the last element from the passed list of elements. + */ + + function last(item) { + return item[item.length - 1]; + } + /** + * Gets index from the passed element. + * @param {String} selector is optional. + */ + + function index(item, selector) { + item = isArrayOrList(item) ? item[0] : item; + var children = selector != null ? $(selector, item.parentNode) : item.parentNode.childNodes; + var num = 0; + + for (var i = 0; i < children.length; i++) { + if (children[i] == item) return num; + if (children[i].nodeType == 1) num++; + } + + return -1; + } + /** + * Gets an iterable element for the passed element/s + */ + + function getList(item) { + return !isArrayOrList(item) ? [item] : item; + } + /** + * Adds the display=none property for the passed element/s + */ + + function hide(el) { + el = getList(el); + + for (var i = 0; i < el.length; i++) { + el[i].style.display = 'none'; + } + + return el; + } + /** + * Adds the display=block property for the passed element/s + */ + + function show(el) { + el = getList(el); + + for (var i = 0; i < el.length; i++) { + el[i].style.display = 'block'; + } + + return el; + } + /** + * Checks if the passed element is an iterable element or not + */ + + function isArrayOrList(el) { + return Object.prototype.toString.call(el) === '[object Array]' || Object.prototype.toString.call(el) === '[object NodeList]'; + } + /** + * Adds the passed class to the passed element/s + */ + + function addClass(el, className) { + el = getList(el); + + for (var i = 0; i < el.length; i++) { + var item = el[i]; + item.classList.add(className); + } + + return el; + } + /** + * Removes the passed class to the passed element/s + * @param {String} `className` can be multiple classnames separated by whitespace + */ + + function removeClass(el, className) { + el = getList(el); + var classNames = className.split(' '); + + for (var a = 0; a < classNames.length; a++) { + className = classNames[a]; + + for (var i = 0; i < el.length; i++) { + var item = el[i]; + item.classList.remove(className); + } + } + + return el; + } + /** + * Appends the given element ot the given parent. + */ + + function appendTo(el, parent) { + parent.appendChild(el); + } + /** + Usage: + + var wrapper = document.createElement('div'); + wrapper.className = 'fp-slides'; + wrap($('.slide'), wrapper); + + https://jsfiddle.net/qwzc7oy3/15/ (vanilla) + https://jsfiddle.net/oya6ndka/1/ (jquery equivalent) + */ + + function wrap(toWrap, wrapper, isWrapAll) { + var newParent; + wrapper = wrapper || doc.createElement('div'); + + for (var i = 0; i < toWrap.length; i++) { + var item = toWrap[i]; + + if (isWrapAll && !i || !isWrapAll) { + newParent = wrapper.cloneNode(true); + item.parentNode.insertBefore(newParent, item); + } + + newParent.appendChild(item); + } + + return toWrap; + } + /** + Usage: + var wrapper = document.createElement('div'); + wrapper.className = 'fp-slides'; + wrap($('.slide'), wrapper); + + https://jsfiddle.net/qwzc7oy3/27/ (vanilla) + https://jsfiddle.net/oya6ndka/4/ (jquery equivalent) + */ + + function wrapAll(toWrap, wrapper) { + wrap(toWrap, wrapper, true); + } + /** + * Usage: + * wrapInner(document.querySelector('#pepe'), '
    afdas
    '); + * wrapInner(document.querySelector('#pepe'), element); + * + * https://jsfiddle.net/zexxz0tw/6/ + * + * https://stackoverflow.com/a/21817590/1081396 + */ + + function wrapInner(parent, wrapper) { + parent.appendChild(wrapper); + + while (parent.firstChild !== wrapper) { + wrapper.appendChild(parent.firstChild); + } + } + /** + * Usage: + * unwrap(document.querySelector('#pepe')); + * unwrap(element); + * + * https://jsfiddle.net/szjt0hxq/1/ + * + */ + + function unwrap(wrapper) { + var wrapperContent = doc.createDocumentFragment(); + + while (wrapper.firstChild) { + wrapperContent.appendChild(wrapper.firstChild); + } + + wrapper.parentNode.replaceChild(wrapperContent, wrapper); + } + /** + * http://stackoverflow.com/questions/22100853/dom-pure-javascript-solution-to-jquery-closest-implementation + * Returns the element or `false` if there's none + */ + + function closest(el, selector) { + if (el && el.nodeType === 1) { + if (matches(el, selector)) { + return el; + } + + return closest(el.parentNode, selector); + } + + return null; + } + /** + * Places one element (rel) after another one or group of them (reference). + * @param {HTMLElement} reference + * @param {HTMLElement|NodeList|String|Array} el + * https://jsfiddle.net/9s97hhzv/1/ + */ + + function after(reference, el) { + insertBefore(reference, reference.nextSibling, el); + } + /** + * Places one element (rel) before another one or group of them (reference). + * @param {HTMLElement} reference + * @param {HTMLElement|NodeList|String|Array} el + * https://jsfiddle.net/9s97hhzv/1/ + */ + + function before(reference, el) { + insertBefore(reference, reference, el); + } + /** + * Based in https://stackoverflow.com/a/19316024/1081396 + * and https://stackoverflow.com/a/4793630/1081396 + */ + + function insertBefore(reference, beforeElement, el) { + if (!isArrayOrList(el)) { + if (typeof el == 'string') { + el = createElementFromHTML(el); + } + + el = [el]; + } + + for (var i = 0; i < el.length; i++) { + reference.parentNode.insertBefore(el[i], beforeElement); + } + } //http://stackoverflow.com/questions/3464876/javascript-get-window-x-y-position-for-scroll + + function getScrollTop() { + var docElement = doc.documentElement; + return (win.pageYOffset || docElement.scrollTop) - (docElement.clientTop || 0); + } + /** + * Gets the siblings of the passed element + */ + + function siblings(el) { + return Array.prototype.filter.call(el.parentNode.children, function (child) { + return child !== el; + }); + } + function preventDefault(event) { + event.preventDefault(); + } + function getAttr(el, attr) { + return el.getAttribute(attr); + } + function docAddEvent(event, callback, options) { + doc.addEventListener(event, callback, options === 'undefined' ? null : options); + } + function windowAddEvent(event, callback, options) { + win.addEventListener(event, callback, options === 'undefined' ? null : options); + } + function docRemoveEvent(event, callback, options) { + doc.removeEventListener(event, callback, options === 'undefined' ? null : options); + } + function windowRemoveEvent(event, callback, options) { + win.removeEventListener(event, callback, options === 'undefined' ? null : options); + } + /** + * Determines whether the passed item is of function type. + */ + + function isFunction(item) { + if (typeof item === 'function') { + return true; + } + + var type = Object.prototype.toString.call(item); + return type === '[object Function]' || type === '[object GeneratorFunction]'; + } + /** + * Trigger custom events + */ + + function trigger(el, eventName, data) { + var event; + data = typeof data === 'undefined' ? {} : data; // Native + + if (typeof win.CustomEvent === "function") { + event = new CustomEvent(eventName, { + detail: data + }); + } else { + event = doc.createEvent('CustomEvent'); + event.initCustomEvent(eventName, true, true, data); + } + + el.dispatchEvent(event); + } + /** + * Polyfill of .matches() + */ + + function matches(el, selector) { + return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector); + } + /** + * Toggles the visibility of the passed element el. + */ + + function toggle(el, value) { + if (typeof value === "boolean") { + for (var i = 0; i < el.length; i++) { + el[i].style.display = value ? 'block' : 'none'; + } + } //we don't use it in other way, so no else :) + + + return el; + } + /** + * Creates a HTMLElement from the passed HTML string. + * https://stackoverflow.com/a/494348/1081396 + */ + + function createElementFromHTML(htmlString) { + var div = doc.createElement('div'); + div.innerHTML = htmlString.trim(); // Change this to div.childNodes to support multiple top-level nodes + + return div.firstChild; + } + /** + * Removes the passed item/s from the DOM. + */ + + function remove(items) { + items = getList(items); + + for (var i = 0; i < items.length; i++) { + var item = items[i]; + + if (item && item.parentElement) { + item.parentNode.removeChild(item); + } + } + } //https://jsfiddle.net/w1rktecz/ + + function untilAll(item, selector, fn) { + var sibling = item[fn]; + var siblings = []; + + while (sibling) { + if (matches(sibling, selector) || selector == null) { + siblings.push(sibling); + } + + sibling = sibling[fn]; + } + + return siblings; + } + /** + * Gets all next elements matching the passed selector. + */ + + function nextAll(item, selector) { + return untilAll(item, selector, 'nextElementSibling'); + } + /** + * Gets all previous elements matching the passed selector. + */ + + function prevAll(item, selector) { + return untilAll(item, selector, 'previousElementSibling'); + } + /** + * Converts an object to an array. + */ + + function toArray(objectData) { + return Object.keys(objectData).map(function (key) { + return objectData[key]; + }); + } + function getLast(items) { + return items[items.length - 1]; + } + /** + * Gets the average of the last `number` elements of the given array. + */ + + function getAverage(elements, number) { + var sum = 0; //taking `number` elements from the end to make the average, if there are not enought, 1 + + var lastElements = elements.slice(Math.max(elements.length - number, 1)); + + for (var i = 0; i < lastElements.length; i++) { + sum = sum + lastElements[i]; + } + + return Math.ceil(sum / number); + } + /** + * Sets the value for the given attribute from the `data-` attribute with the same suffix + * ie: data-srcset ==> srcset | data-src ==> src + */ + + function setSrc(element, attribute) { + element.setAttribute(attribute, getAttr(element, 'data-' + attribute)); + element.removeAttribute('data-' + attribute); + } + function getParentsUntil(item, topParentSelector) { + var parents = [item]; + + do { + item = item.parentNode; + parents.push(item); + } while (!matches(item, topParentSelector)); + + return parents; + } + function isInsideInput() { + var activeElement = doc.activeElement; + return matches(activeElement, 'textarea') || matches(activeElement, 'input') || matches(activeElement, 'select') || getAttr(activeElement, 'contentEditable') == "true" || getAttr(activeElement, 'contentEditable') == ''; + } //utils are public, so we can use it wherever we want + // @ts-ignore + + window["fp_utils"] = { + "$": $, + "deepExtend": deepExtend, + "hasClass": hasClass, + "getWindowHeight": getWindowHeight, + "css": css, + "prev": prev, + "next": next, + "last": last, + "index": index, + "getList": getList, + "hide": hide, + "show": show, + "isArrayOrList": isArrayOrList, + "addClass": addClass, + "removeClass": removeClass, + "appendTo": appendTo, + "wrap": wrap, + "wrapAll": wrapAll, + "unwrap": unwrap, + "closest": closest, + "after": after, + "before": before, + "insertBefore": insertBefore, + "getScrollTop": getScrollTop, + "siblings": siblings, + "preventDefault": preventDefault, + "isFunction": isFunction, + "trigger": trigger, + "matches": matches, + "toggle": toggle, + "createElementFromHTML": createElementFromHTML, + "remove": remove, + // "filter": filter, + "untilAll": untilAll, + "nextAll": nextAll, + "prevAll": prevAll, + "showError": showError + }; + + var utils = /*#__PURE__*/Object.freeze({ + __proto__: null, + showError: showError, + isVisible: isVisible, + getVisible: getVisible, + $: $, + deepExtend: deepExtend, + hasClass: hasClass, + getWindowHeight: getWindowHeight, + getWindowWidth: getWindowWidth, + css: css, + prev: prev, + next: next, + last: last, + index: index, + getList: getList, + hide: hide, + show: show, + isArrayOrList: isArrayOrList, + addClass: addClass, + removeClass: removeClass, + appendTo: appendTo, + wrap: wrap, + wrapAll: wrapAll, + wrapInner: wrapInner, + unwrap: unwrap, + closest: closest, + after: after, + before: before, + insertBefore: insertBefore, + getScrollTop: getScrollTop, + siblings: siblings, + preventDefault: preventDefault, + getAttr: getAttr, + docAddEvent: docAddEvent, + windowAddEvent: windowAddEvent, + docRemoveEvent: docRemoveEvent, + windowRemoveEvent: windowRemoveEvent, + isFunction: isFunction, + trigger: trigger, + matches: matches, + toggle: toggle, + createElementFromHTML: createElementFromHTML, + remove: remove, + untilAll: untilAll, + nextAll: nextAll, + prevAll: prevAll, + toArray: toArray, + getLast: getLast, + getAverage: getAverage, + setSrc: setSrc, + getParentsUntil: getParentsUntil, + isInsideInput: isInsideInput + }); + + function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + var EventEmitter = { + events: {}, + on: function on(event, listener) { + var _this = this; + + if (_typeof(this.events[event]) !== 'object') { + this.events[event] = []; + } + + this.events[event].push(listener); + return function () { + return _this.removeListener(event, listener); + }; + }, + removeListener: function removeListener(event, listener) { + if (_typeof(this.events[event]) === 'object') { + var idx = this.events[event].indexOf(listener); + + if (idx > -1) { + this.events[event].splice(idx, 1); + } + } + }, + emit: function emit(event) { + var _this2 = this; + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (_typeof(this.events[event]) === 'object') { + this.events[event].forEach(function (listener) { + return listener.apply(_this2, args); + }); + } + }, + once: function once(event, listener) { + var _this3 = this; + + var remove = this.on(event, function () { + remove(); + + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + listener.apply(_this3, args); + }); + } + }; + + var state = { + numSections: 0, + numSlides: 0, + slides: [], + sections: [], + activeSection: null, + scrollTrigger: null, + isBeyondFullpage: false, + aboutToScrollToFullPage: false, + slideMoving: false, + isResizing: false, + isScrolling: false, + lastScrolledDestiny: undefined, + lastScrolledSlide: undefined, + activeAnimation: false, + canScroll: true, + touchDirection: 'none', + wheelDirection: 'none', + isGrabbing: false, + isUsingWheel: false, + isWindowFocused: true, + previousDestTop: 0, + windowsHeight: getWindowHeight(), + isDoingContinousVertical: false, + timeouts: {}, + scrollY: 0, + scrollX: 0, + isFullpageInitDone: false + }; // @ts-ignore + + win.state = state; + function setState(props) { + Object.assign(state, props); + } + function getState() { + return state; + } + function getActivePanel() { + return state.activeSection && state.activeSection.activeSlide ? state.activeSection.activeSlide : state.activeSection; + } + + var events = { + onAfterRenderNoAnchor: 'onAfterRenderNoAnchor', + onClickOrTouch: 'onClickOrTouch', + moveSlideLeft: 'moveSlideLeft', + moveSlideRight: 'moveSlideRight', + onInitialise: 'onInitialise', + beforeInit: 'beforeInit', + bindEvents: 'bindEvents', + onDestroy: 'onDestroy', + contentChanged: 'contentChanged', + onScrollOverflowScrolled: 'onScrollOverflowScrolled', + onScrollPageAndSlide: 'onScrollPageAndSlide', + onKeyDown: 'onKeyDown', + onMenuClick: 'onMenuClick', + scrollPage: 'scrollPage', + landscapeScroll: 'landscapeScroll', + scrollBeyondFullpage: 'scrollBeyondFullpage', + onPerformMovement: 'onPerformMovement', + onSlideLeave: 'onSlideLeave', + onLeave: 'onLeave', + afterSectionLoads: 'afterSectionLoads', + afterSlideLoads: 'afterSlideLoads' + }; + + EventEmitter.on(events.bindEvents, bindEvents$c); + + function bindEvents$c() { + //Scrolls to the section when clicking the navigation bullet + //simulating the jQuery .on('click') event using delegation + ['click', 'touchstart'].forEach(function (eventName) { + docAddEvent(eventName, delegatedEvents); + }); + windowAddEvent('focus', focusHandler); + internalEvents(); + } + + function internalEvents() { + EventEmitter.on(events.onDestroy, onDestroy$9); + } + + function delegatedEvents(e) { + EventEmitter.emit(events.onClickOrTouch, { + e: e, + target: e.target + }); + } + + function onDestroy$9() { + ['click', 'touchstart'].forEach(function (eventName) { + docRemoveEvent(eventName, delegatedEvents); + }); + } // changing isWindowFocused to true on focus event + + + function focusHandler() { + setState({ + isWindowFocused: true + }); + } + + // keeping central set of classnames and selectors + var WRAPPER = 'fullpage-wrapper'; + var WRAPPER_SEL = '.' + WRAPPER; // slimscroll + + var SCROLLABLE = 'fp-scrollable'; + + var RESPONSIVE = 'fp-responsive'; + var NO_TRANSITION = 'fp-notransition'; + var DESTROYED = 'fp-destroyed'; + var ENABLED = 'fp-enabled'; + var VIEWING_PREFIX = 'fp-viewing'; + var ACTIVE = 'active'; + var ACTIVE_SEL = '.' + ACTIVE; + var COMPLETELY = 'fp-completely'; + var COMPLETELY_SEL = '.' + COMPLETELY; + var LOADED = 'fp-loaded'; + + var SECTION_DEFAULT_SEL = '.section'; + var SECTION = 'fp-section'; + var SECTION_SEL = '.' + SECTION; + var SECTION_ACTIVE_SEL = SECTION_SEL + ACTIVE_SEL; + var TABLE_CELL = 'fp-tableCell'; + var TABLE_CELL_SEL = '.' + TABLE_CELL; + var AUTO_HEIGHT = 'fp-auto-height'; + var AUTO_HEIGHT_SEL = '.' + AUTO_HEIGHT; + var AUTO_HEIGHT_RESPONSIVE = 'fp-auto-height-responsive'; + var AUTO_HEIGHT_RESPONSIVE_SEL = '.' + AUTO_HEIGHT_RESPONSIVE; + var NORMAL_SCROLL = 'fp-normal-scroll'; + + var SECTION_NAV = 'fp-nav'; + var SECTION_NAV_SEL = '#' + SECTION_NAV; + var SECTION_NAV_TOOLTIP = 'fp-tooltip'; + var SECTION_NAV_TOOLTIP_SEL = '.' + SECTION_NAV_TOOLTIP; + var SHOW_ACTIVE_TOOLTIP = 'fp-show-active'; // slide + + var SLIDE_DEFAULT_SEL = '.slide'; + var SLIDE = 'fp-slide'; + var SLIDE_SEL = '.' + SLIDE; + var SLIDE_ACTIVE_SEL = SLIDE_SEL + ACTIVE_SEL; + var SLIDES_WRAPPER = 'fp-slides'; + var SLIDES_WRAPPER_SEL = '.' + SLIDES_WRAPPER; + var SLIDES_CONTAINER = 'fp-slidesContainer'; + var SLIDES_CONTAINER_SEL = '.' + SLIDES_CONTAINER; + var TABLE = 'fp-table'; + var OVERFLOW = 'fp-overflow'; + var OVERFLOW_SEL = '.' + OVERFLOW; + var IS_OVERFLOW = 'fp-is-overflow'; // slide nav + + var SLIDES_NAV = 'fp-slidesNav'; + var SLIDES_NAV_SEL = '.' + SLIDES_NAV; + var SLIDES_NAV_LINK_SEL = SLIDES_NAV_SEL + ' a'; + var SLIDES_STYLED_ARROW = 'fp-arrow'; + var SLIDES_ARROW = 'fp-controlArrow'; + var SLIDES_ARROW_SEL = '.' + SLIDES_ARROW; + var SLIDES_PREV = 'fp-prev'; + var SLIDES_PREV_SEL = '.' + SLIDES_PREV; + var SLIDES_ARROW_PREV_SEL = SLIDES_ARROW_SEL + SLIDES_PREV_SEL; + var SLIDES_NEXT = 'fp-next'; + var SLIDES_NEXT_SEL = '.' + SLIDES_NEXT; + var SLIDES_ARROW_NEXT_SEL = SLIDES_ARROW_SEL + SLIDES_NEXT_SEL; // Watermark + + var WATERMARK = 'fp-watermark'; + var WATERMARK_SEL = '.' + WATERMARK; + + var defaultOptions = { + //navigation + menu: false, + anchors: [], + lockAnchors: false, + navigation: false, + navigationPosition: 'right', + navigationTooltips: [], + showActiveTooltip: false, + slidesNavigation: false, + slidesNavPosition: 'bottom', + scrollBar: false, + hybrid: false, + licenseKey: '', + credits: { + "enabled": true, + "label": 'Made with fullPage.js', + "position": 'right' + }, + //scrolling + css3: true, + scrollingSpeed: 700, + autoScrolling: true, + fitToSection: true, + fitToSectionDelay: 600, + easing: 'easeInOutCubic', + easingcss3: 'ease', + loopBottom: false, + loopTop: false, + loopHorizontal: true, + continuousVertical: false, + continuousHorizontal: false, + scrollHorizontally: false, + interlockedSlides: false, + dragAndMove: false, + offsetSections: false, + resetSliders: false, + fadingEffect: false, + normalScrollElements: null, + scrollOverflow: true, + scrollOverflowReset: false, + skipIntermediateItems: false, + touchSensitivity: 5, + touchWrapper: null, + bigSectionsDestination: null, + adjustOnNavChange: true, + //Accessibility + keyboardScrolling: true, + animateAnchor: true, + recordHistory: true, + allowCorrectDirection: false, + //design + scrollOverflowMacStyle: true, + controlArrows: true, + controlArrowsHTML: ['
    ', '
    '], + controlArrowColor: '#fff', + verticalCentered: true, + sectionsColor: [], + paddingTop: 0, + paddingBottom: 0, + fixedElements: null, + responsive: 0, + //backwards compabitility with responsiveWiddth + responsiveWidth: 0, + responsiveHeight: 0, + responsiveSlides: false, + parallax: false, + parallaxOptions: { + type: 'reveal', + percentage: 62, + property: 'translate' + }, + cards: false, + cardsOptions: { + perspective: 100, + fadeContent: true, + fadeBackground: true + }, + //Custom selectors + sectionSelector: SECTION_DEFAULT_SEL, + slideSelector: SLIDE_DEFAULT_SEL, + //events + afterLoad: null, + beforeLeave: null, + onLeave: null, + afterRender: null, + afterResize: null, + afterReBuild: null, + afterSlideLoad: null, + onSlideLeave: null, + afterResponsive: null, + onScrollOverflow: null, + lazyLoading: true, + lazyLoadThreshold: 0, + observer: true, + scrollBeyondFullpage: true + }; + + var container = null; + var g_initialAnchorsInDom = false; + var originals = deepExtend({}, defaultOptions); //deep copy + + var g_options = null; + function getInitialAnchorsInDom() { + return g_initialAnchorsInDom; + } + function setContainer(value) { + container = value; + } + function getContainer(value) { + return container; + } + function getOptions() { + return g_options || defaultOptions; + } + function setOptions(options) { + g_options = deepExtend({}, defaultOptions, options); + originals = Object.assign({}, g_options); + } + function getOriginals() { + return originals; + } + function setOption(name, value) { + defaultOptions[name] = value; + } + /* + * Sets the state for a variable with multiple states (original, and temporal) + * Some variables such as `autoScrolling` or `recordHistory` might change automatically its state when using `responsive` or `autoScrolling:false`. + * This function is used to keep track of both states, the original and the temporal one. + * If type is not 'internal', then we assume the user is globally changing the variable. + */ + + function setVariableState(variable, value, type) { + g_options[variable] = value; + + if (type !== 'internal') { + originals[variable] = value; + } + } + /** + * Setting options from DOM elements if they are not provided. + */ + + function setOptionsFromDOM() { + //no anchors option? Checking for them in the DOM attributes + if (!getOptions().anchors.length) { + var anchorsAttribute = '[data-anchor]'; + var anchors = $(getOptions().sectionSelector.split(',').join(anchorsAttribute + ',') + anchorsAttribute, container); + + if (anchors.length && anchors.length === $(getOptions().sectionSelector, container).length) { + g_initialAnchorsInDom = true; + anchors.forEach(function (item) { + getOptions().anchors.push(getAttr(item, 'data-anchor').toString()); + }); + } + } //no tooltips option? Checking for them in the DOM attributes + + + if (!getOptions().navigationTooltips.length) { + var tooltipsAttribute = '[data-tooltip]'; + var tooltips = $(getOptions().sectionSelector.split(',').join(tooltipsAttribute + ',') + tooltipsAttribute, container); + + if (tooltips.length) { + tooltips.forEach(function (item) { + getOptions().navigationTooltips.push(getAttr(item, 'data-tooltip').toString()); + }); + } + } + } + + var plainItem = function plainItem(panel) { + this.anchor = panel.anchor; + this.item = panel.item; + this.index = panel.index(); + this.isLast = this.index === panel.item.parentElement.querySelectorAll(panel.selector).length - 1; + this.isFirst = !this.index; + this.isActive = panel.isActive; + }; + /** + * Item. Slide or Section objects share the same properties. + */ + + var Item = function Item(el, selector) { + this.parent = this.parent || null; + this.selector = selector; + this.anchor = getAttr(el, 'data-anchor') || getOptions().anchors[index(el, getOptions().sectionSelector)]; + this.item = el; + this.isVisible = isVisible(el); + this.isActive = hasClass(el, ACTIVE); + this.hasScroll = hasClass(el, OVERFLOW) || $(OVERFLOW_SEL, el)[0] != null; + this.isSection = selector === getOptions().sectionSelector; + this.container = closest(el, SLIDES_CONTAINER_SEL) || closest(el, WRAPPER_SEL); + + this.index = function () { + return this.siblings().indexOf(this); + }; + }; + + Item.prototype.siblings = function () { + if (this.isSection) { + if (this.isVisible) { + return state.sections; + } else { + return state.sectionsIncludingHidden; + } + } + + return this.parent ? this.parent.slides : 0; + }; + + Item.prototype.prev = function () { + var siblings = this.siblings(); + var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this); + var prevIndex = currentIndex - 1; + + if (prevIndex >= 0) { + return siblings[prevIndex]; + } + + return null; + }; + + Item.prototype.next = function () { + var siblings = this.siblings(); + var currentIndex = this.isSection ? siblings.indexOf(this) : this.parent.slides.indexOf(this); + var nextIndex = currentIndex + 1; + + if (nextIndex < siblings.length) { + return siblings[nextIndex]; + } + + return null; + }; + + Item.prototype["prevPanel"] = function () { + return this.prev() || (this.parent ? this.parent.prev() : null); + }; + + Item.prototype["nextPanel"] = function () { + return this.next() || (this.parent ? this.parent.next() : null); + }; + + Item.prototype.getSiblings = function () { + if (this.isSection) { + return state.sections; + } + + return state.panels; + }; + + function getNodes(panels) { + return panels.map(function (panel) { + return panel.item; + }); + } + function getPanelByElement(panels, el) { + return panels.find(function (panel) { + return panel.item === el; + }); + } + var Section = function Section(el) { + plainItem.call(this, el); + }; + var Slide = function Slide(el) { + plainItem.call(this, el); + }; + + /** + * Gets the active slide (or section) for the given section + */ + + function getSlideOrSection(destiny) { + var slide = $(SLIDE_ACTIVE_SEL, destiny); + + if (slide.length) { + destiny = slide[0]; + } + + return destiny; + } + function getSlideOrSectionPanel(panel) { + if (!panel) { + return null; + } + + return panel.activeSlide ? panel.activeSlide : panel; + } + function isFullPageAbove() { + return getContainer().getBoundingClientRect().bottom >= 0; + } + /** + * Gets the scrolling settings depending on the plugin autoScrolling option + */ + + function getScrollSettings(top) { + var options = getOptions(); + var position; + var element; //top property animation + + if (options.autoScrolling && !options.scrollBar) { + position = -top; + element = $(WRAPPER_SEL)[0]; + } //window real scrolling + else { + position = top; + element = window; + } + + return { + options: position, + element: element + }; + } + /** + * Scrolls the page / slider the given number of pixels. + * It will do it one or another way dependiong on the library's config. + */ + + function setScrolling(element, val) { + if (!getOptions().autoScrolling || getOptions().scrollBar || element.self != window && hasClass(element, SLIDES_WRAPPER)) { + //scrolling horizontally through the slides? + if (element.self != window && hasClass(element, SLIDES_WRAPPER)) { + element.scrollLeft = val; + } //vertical scroll + else { + element.scrollTo(0, val); + } + } else { + element.style.top = val + 'px'; + } + } + /** + * Adds transition animations for the given element + */ + + function addAnimation(element) { + var transition = 'transform ' + getOptions().scrollingSpeed + 'ms ' + getOptions().easingcss3; + removeClass(element, NO_TRANSITION); + return css(element, { + '-webkit-transition': transition, + 'transition': transition + }); + } + /** + * Retuns `up` or `down` depending on the scrolling movement to reach its destination + * from the current section. + */ + + function getYmovement(activeSection, destiny) { + var fromIndex = activeSection.index(); + var toIndex = index(destiny, SECTION_SEL); + + if (fromIndex == toIndex) { + return 'none'; + } + + if (fromIndex > toIndex) { + return 'up'; + } + + return 'down'; + } + /** + * Remove transition animations for the given element + */ + + function removeAnimation(element) { + return addClass(element, NO_TRANSITION); + } + /** + * Returns the cross-browser transform string. + */ + + function getTransforms(translate3d) { + return { + '-webkit-transform': translate3d, + '-moz-transform': translate3d, + '-ms-transform': translate3d, + 'transform': translate3d + }; + } + + var silentScrollId; + /** + * Adds a css3 transform property to the container class with or without animation depending on the animated param. + */ + + function transformContainer(translate3d, animated) { + if (animated) { + addAnimation(getContainer()); + } else { + removeAnimation(getContainer()); + } + + clearTimeout(silentScrollId); + css(getContainer(), getTransforms(translate3d)); + FP.test.translate3d = translate3d; //syncronously removing the class after the animation has been applied. + + silentScrollId = setTimeout(function () { + removeClass(getContainer(), NO_TRANSITION); + }, 10); + } + + /** + * Scrolls silently (with no animation) the page to the given Y position. + */ + + function silentScroll(top) { + // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625 + // that's why we round it to 0. + var roundedTop = Math.round(top); + + if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar) { + var translate3d = 'translate3d(0px, -' + roundedTop + 'px, 0px)'; + transformContainer(translate3d, false); + } else if (getOptions().autoScrolling && !getOptions().scrollBar) { + css(getContainer(), { + 'top': -roundedTop + 'px' + }); + FP.test.top = -roundedTop + 'px'; + } else { + var scrollSettings = getScrollSettings(roundedTop); + setScrolling(scrollSettings.element, scrollSettings.options); + } + } + + FP.setScrollingSpeed = setScrollingSpeed; + /** + * Defines the scrolling speed + */ + + function setScrollingSpeed(value, type) { + setVariableState('scrollingSpeed', value, type); + } + + var $body = null; + var $html = null; + var $htmlBody = null; // caching common elements + + function setCache() { + $body = $('body')[0]; + $html = $('html')[0]; + $htmlBody = $('html, body'); + } + + //@ts-check + + var _g_animateScroll; + /** + * Simulates the animated scrollTop of jQuery. Used when css3:false or scrollBar:true or autoScrolling:false + * http://stackoverflow.com/a/16136789/1081396 + */ + + + function scrollTo(element, to, duration, callback) { + var start = getScrolledPosition(element); + var change = to - start; + var isCallbackFired = false; + var startTime; + var wasAnimationActive = state.activeAnimation; + setState({ + activeAnimation: true + }); // Cancelling any possible previous animations (io: clicking on nav dots very fast) + + if (_g_animateScroll) { + window.cancelAnimationFrame(_g_animateScroll); + } + + _g_animateScroll = function g_animateScroll(timestamp) { + if (!startTime) { + startTime = timestamp; + } + + var currentTime = Math.floor(timestamp - startTime); + + if (state.activeAnimation) { + //in order to stope it from other function whenever we want + var val = to; + + if (duration) { + // @ts-ignore + val = win.fp_easings[getOptions().easing](currentTime, start, change, duration); + } + + if (currentTime <= duration) { + setScrolling(element, val); + } + + if (currentTime < duration) { + window.requestAnimationFrame(_g_animateScroll); + } else if (typeof callback !== 'undefined' && !isCallbackFired) { + setScrolling(element, to); + callback(); + setState({ + activeAnimation: false + }); + isCallbackFired = true; + } + } else if (!isCallbackFired && !wasAnimationActive) { + callback(); + setState({ + activeAnimation: false + }); + isCallbackFired = true; + } + }; + + window.requestAnimationFrame(_g_animateScroll); + } + /** + * Getting the position of the element to scroll when using jQuery animations + */ + + function getScrolledPosition(element) { + var position; //is not the window element and is a slide? + + if (element.self != win && hasClass(element, SLIDES_WRAPPER)) { + position = element.scrollLeft; + } else if (!getOptions().autoScrolling || getOptions().scrollBar) { + position = getScrollTop(); + } else { + position = element.offsetTop; + } //gets the top property of the wrapper + + + return position; + } + + /** + * Makes sure to only create a Panel object if the element exist + */ + + function nullOrSection(el) { + if (el && !el.item) { + return new Section(new SectionPanel(el)); + } + + return el ? new Section(el) : null; + } + + function nullOrSlide(el) { + return el ? new Slide(el) : null; + } + + /** + * Dispatch events & callbacks + */ + + function fireCallback(eventName, v) { + var eventData = getEventData(eventName, v); + trigger(getContainer(), eventName, eventData); + + if (getOptions()[eventName].apply(eventData[Object.keys(eventData)[0]], toArray(eventData)) === false) { + return false; + } + + return true; + } + /** + * Gets the event's data for the given event on the right format. + */ + + function getEventData(eventName, v) { + //using functions to run only the necessary bits within the object + var paramsPerEvent = { + afterRender: function afterRender() { + return { + section: nullOrSection(getState().activeSection), + slide: nullOrSlide(getState().activeSection.activeSlide) + }; + }, + onLeave: function onLeave() { + return { + origin: nullOrSection(v.items.origin), + destination: nullOrSection(v.items.destination), + direction: v.direction, + trigger: getState().scrollTrigger + }; + }, + afterLoad: function afterLoad() { + return paramsPerEvent.onLeave(); + }, + afterSlideLoad: function afterSlideLoad() { + return { + section: nullOrSection(v.items.section), + origin: nullOrSection(v.items.origin), + destination: nullOrSection(v.items.destination), + direction: v.direction, + trigger: getState().scrollTrigger + }; + }, + onSlideLeave: function onSlideLeave() { + return paramsPerEvent.afterSlideLoad(); + }, + beforeLeave: function beforeLeave() { + return paramsPerEvent.onLeave(); + }, + onScrollOverflow: function onScrollOverflow() { + return { + section: nullOrSection(getState().activeSection), + slide: nullOrSlide(getState().activeSection.activeSlide), + position: v.position, + direction: v.direction + }; + } + }; + return paramsPerEvent[eventName](); + } + + function hasAutoPlay(item) { + return item.hasAttribute('data-autoplay') || item.hasAttribute('autoplay'); + } + /** + * Plays video and audio elements. + */ + + + function playMedia(destiny) { + var panel = getSlideOrSection(destiny); //playing HTML5 media elements + + $('video, audio', panel).forEach(function (element) { + if (hasAutoPlay(element) && typeof element.play === 'function') { + element.play(); + } + }); //youtube videos + + $('iframe[src*="youtube.com/embed/"]', panel).forEach(function (element) { + if (hasAutoPlay(element)) { + playYoutube(element); + } //in case the URL was not loaded yet. On page load we need time for the new URL (with the API string) to load. + + + element.onload = function () { + if (hasAutoPlay(element)) { + playYoutube(element); + } + }; + }); + } + /** + * Plays a youtube video + */ + + function playYoutube(element) { + element.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*'); + } + /** + * Stops video and audio elements. + */ + + + function stopMedia(destiny) { + var panel = getSlideOrSection(destiny); //stopping HTML5 media elements + + $('video, audio', panel).forEach(function (element) { + if (!element.hasAttribute('data-keepplaying') && typeof element.pause === 'function') { + element.pause(); + } + }); //youtube videos + + $('iframe[src*="youtube.com/embed/"]', panel).forEach(function (element) { + if (/youtube\.com\/embed\//.test(getAttr(element, 'src')) && !element.hasAttribute('data-keepplaying')) { + element.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*'); + } + }); + } + /* + * Enables the Youtube videos API so we can control their flow if necessary. + */ + + function enableYoutubeAPI() { + $('iframe[src*="youtube.com/embed/"]', getContainer()).forEach(function (item) { + addURLParam(item, 'enablejsapi=1'); + }); + } + /** + * Adds a new parameter and its value to the `src` of a given element + */ + + function addURLParam(element, newParam) { + var originalSrc = getAttr(element, 'src'); + element.setAttribute('src', originalSrc + getUrlParamSign(originalSrc) + newParam); + } + /* + * Returns the prefix sign to use for a new parameter in an existen URL. + * + * @return {String} ? | & + */ + + + function getUrlParamSign(url) { + return !/\?/.test(url) ? '?' : '&'; + } + + /** + * Lazy loads image, video and audio elements. + */ + + function lazyLoad(destiny) { + if (!getOptions().lazyLoading) { + return; + } + + var panel = getSlideOrSection(destiny); + $('img[data-src], img[data-srcset], source[data-src], source[data-srcset], video[data-src], audio[data-src], iframe[data-src]', panel).forEach(function (element) { + ['src', 'srcset'].forEach(function (type) { + var attribute = getAttr(element, 'data-' + type); + + if (attribute != null && attribute) { + setSrc(element, type); + element.addEventListener('load', function () { + }); + } + }); + + if (matches(element, 'source')) { + var elementToPlay = closest(element, 'video, audio'); + + if (elementToPlay) { + elementToPlay.load(); + + elementToPlay.onloadeddata = function () { + }; + } + } + }); // Add fp-loaded class to the panel after lazy loading + + addClass(panel, LOADED); + } + function lazyLoadPanels(panel) { + var lazyLoadThresold = getOptions().lazyLoadThreshold; + lazyLoad(panel.item); + + if (lazyLoadThresold) { + lazyLoadDirection(panel, 'prev', lazyLoadThresold); + lazyLoadDirection(panel, 'next', lazyLoadThresold); + } + } // Lazy load "count" number of panels in a specific direction + + function lazyLoadDirection(startPanel, direction, count) { + var currentPanel = startPanel; + + for (var i = 0; i < count && (currentPanel = currentPanel[direction]()); i++) { + console.log(currentPanel.item); + lazyLoad(currentPanel.item); + } + } + + /** + * Sets a class for the body of the page depending on the active section / slide + */ + + function setBodyClass() { + var section = getState().activeSection.item; + var slide = getState().activeSection.activeSlide; + var sectionAnchor = getAnchor(section); + var text = String(sectionAnchor); + + if (slide) { + var slideAnchor = getAnchor(slide.item); + text = text + '-' + slideAnchor; + } //changing slash for dash to make it a valid CSS style + + + text = text.replace('/', '-').replace('#', '').replace(/\s/g, ''); //removing previous anchor classes + + var classRe = new RegExp('\\b\\s?' + VIEWING_PREFIX + '-[^\\s]+\\b', "g"); + $body.className = $body.className.replace(classRe, ''); //adding the current anchor + + addClass($body, VIEWING_PREFIX + '-' + text); + } + /** + * Gets the anchor for the given slide / section. Its index will be used if there's none. + */ + + function getAnchor(element) { + if (!element) { + return null; + } + + var anchor = getAttr(element, 'data-anchor'); + var elementIndex = index(element); //Slide without anchor link? We take the index instead. + + if (anchor == null) { + anchor = elementIndex; + } + + return anchor; + } + + /** + * Sets the state of the website depending on the active section/slide. + * It changes the URL hash when needed and updates the body class. + */ + + function setPageStatus(slideIndex, slideAnchor, anchorLink) { + var sectionHash = ''; + + if (getOptions().anchors.length && !getOptions().lockAnchors) { + //isn't it the first slide? + if (slideIndex) { + if (anchorLink != null) { + sectionHash = anchorLink; + } //slide without anchor link? We take the index instead. + + + if (slideAnchor == null) { + slideAnchor = slideIndex; + } + + setState({ + lastScrolledSlide: slideAnchor + }); + setUrlHash(sectionHash + '/' + slideAnchor); //first slide won't have slide anchor, just the section one + } else if (slideIndex != null) { + setState({ + lastScrolledSlide: slideAnchor + }); + setUrlHash(anchorLink); + } //section without slides + else { + setUrlHash(anchorLink); + } + } + + setBodyClass(); + } + /** + * Sets the URL hash. + */ + + function setUrlHash(url) { + if (getOptions().recordHistory) { + location.hash = url; + } else { + //Mobile Chrome doesn't work the normal way, so... lets use HTML5 for phones :) + if (isTouchDevice || isTouch) { + win.history.replaceState(undefined, undefined, '#' + url); + } else { + var baseUrl = win.location.href.split('#')[0]; + win.location.replace(baseUrl + '#' + url); + } + } + } + + /** + * Gets the name for screen readers for a section/slide navigation bullet. + */ + + function getBulletLinkName(i, defaultName, item) { + var anchor = defaultName === 'Section' ? getOptions().anchors[i] : getAttr(item, 'data-anchor'); + return encodeURI(getOptions().navigationTooltips[i] || anchor || defaultName + ' ' + (i + 1)); + } + + function slideBulletHandler(e) { + // not all events are cancellable + // https://www.uriports.com/blog/easy-fix-for-intervention-ignored-attempt-to-cancel-a-touchmove-event-with-cancelable-false/ + if (e.cancelable) { + preventDefault(e); + } + + setState({ + scrollTrigger: 'horizontalNav' + }); + /*jshint validthis:true */ + + var sectionElem = closest(this, SECTION_SEL); + var slides = $(SLIDES_WRAPPER_SEL, closest(this, SECTION_SEL))[0]; + var section = getPanelByElement(getState().sections, sectionElem); + var destiny = section.slides[index(closest(this, 'li'))]; + EventEmitter.emit(events.landscapeScroll, { + slides: slides, + destination: destiny.item + }); + } + /** + * Sets the state for the horizontal bullet navigations. + */ + + function activeSlidesNavigation(slidesNav, slideIndex) { + if (getOptions().slidesNavigation && slidesNav != null) { + removeClass($(ACTIVE_SEL, slidesNav), ACTIVE); + addClass($('a', $('li', slidesNav)[slideIndex]), ACTIVE); + } + } + /** + * Creates a landscape navigation bar with dots for horizontal sliders. + */ + + function addSlidesNavigation(section) { + var sectionElem = section.item; + var numSlides = section.slides.length; + appendTo(createElementFromHTML('
      '), sectionElem); + var nav = $(SLIDES_NAV_SEL, sectionElem)[0]; //top or bottom + + addClass(nav, 'fp-' + getOptions().slidesNavPosition); + + for (var i = 0; i < numSlides; i++) { + var slide = $(SLIDE_SEL, sectionElem)[i]; + appendTo(createElementFromHTML('
    • ' + getBulletLinkName(i, 'Slide', slide) + '
    • '), $('ul', nav)[0]); + } //centering it + + + css(nav, { + 'margin-left': '-' + nav.innerWidth / 2 + 'px' + }); + var activeSlideIndex = section.activeSlide ? section.activeSlide.index() : 0; + addClass($('a', $('li', nav)[activeSlideIndex]), ACTIVE); + } + + var isScrollAllowed = {}; + isScrollAllowed.m = { + 'up': true, + 'down': true, + 'left': true, + 'right': true + }; + isScrollAllowed.k = deepExtend({}, isScrollAllowed.m); + /** + * Allowing or disallowing the mouse/swipe scroll in a given direction. (not for keyboard) + * @param type m (mouse) or k (keyboard) + */ + + function setIsScrollAllowed(value, direction, type) { + //up, down, left, right + if (direction !== 'all') { + isScrollAllowed[type][direction] = value; + } //all directions? + else { + Object.keys(isScrollAllowed[type]).forEach(function (key) { + isScrollAllowed[type][key] = value; + }); + } + } + function getIsScrollAllowed() { + return isScrollAllowed; + } + + EventEmitter.on(events.onClickOrTouch, onClickOrTouch$2); + + function onClickOrTouch$2(params) { + var target = params.target; + + if (matches(target, SLIDES_ARROW_SEL) || closest(target, SLIDES_ARROW_SEL)) { + slideArrowHandler.call(target, params); + } + } //Scrolling horizontally when clicking on the slider controls. + + + function slideArrowHandler() { + /*jshint validthis:true */ + var section = closest(this, SECTION_SEL); + var isPrevArrow = hasClass(this, SLIDES_PREV) || closest(this, SLIDES_PREV_SEL); + /*jshint validthis:true */ + + if (isPrevArrow) { + if (getIsScrollAllowed().m.left) { + setState({ + scrollTrigger: 'slideArrow' + }); + EventEmitter.emit(events.moveSlideLeft, { + section: section + }); + } + } else { + if (getIsScrollAllowed().m.right) { + setState({ + scrollTrigger: 'slideArrow' + }); + EventEmitter.emit(events.moveSlideRight, { + section: section + }); + } + } + } + /** + * Creates the control arrows for the given section + */ + + + function createSlideArrows(section) { + var sectionElem = section.item; + var arrows = [createElementFromHTML(getOptions().controlArrowsHTML[0]), createElementFromHTML(getOptions().controlArrowsHTML[1])]; + after($(SLIDES_WRAPPER_SEL, sectionElem)[0], arrows); + addClass(arrows, SLIDES_ARROW); + addClass(arrows[0], SLIDES_PREV); + addClass(arrows[1], SLIDES_NEXT); + + if (getOptions().controlArrowColor !== '#fff') { + css($(SLIDES_ARROW_NEXT_SEL, sectionElem), { + 'border-color': 'transparent transparent transparent ' + getOptions().controlArrowColor + }); + css($(SLIDES_ARROW_PREV_SEL, sectionElem), { + 'border-color': 'transparent ' + getOptions().controlArrowColor + ' transparent transparent' + }); + } + + if (!getOptions().loopHorizontal) { + hide($(SLIDES_ARROW_PREV_SEL, sectionElem)); + } + } + function toggleControlArrows(v) { + if (!getOptions().loopHorizontal && getOptions().controlArrows) { + //hidding it for the fist slide, showing for the rest + toggle($(SLIDES_ARROW_PREV_SEL, v.section), v.slideIndex !== 0); //hidding it for the last slide, showing for the rest + + toggle($(SLIDES_ARROW_NEXT_SEL, v.section), next(v.destiny) != null); + } + } + + FP.setRecordHistory = setRecordHistory; + /** + * Defines wheter to record the history for each hash change in the URL. + */ + + function setRecordHistory(value, type) { + setVariableState('recordHistory', value, type); + } + + FP.setAutoScrolling = setAutoScrolling; + FP.test.setAutoScrolling = setAutoScrolling; + /** + * Sets the autoScroll option. + * It changes the scroll bar visibility and the history of the site as a result. + */ + + function setAutoScrolling(value, type) { + //removing the transformation + if (!value) { + silentScroll(0); + } + + setVariableState('autoScrolling', value, type); + var element = getState().activeSection.item; + + if (getOptions().autoScrolling && !getOptions().scrollBar) { + css($htmlBody, { + 'overflow': 'hidden', + 'height': '100%' + }); + removeClass($body, SCROLLABLE); + setRecordHistory(getOriginals().recordHistory, 'internal'); //for IE touch devices + + css(getContainer(), { + '-ms-touch-action': 'none', + 'touch-action': 'none' + }); + + if (element != null) { + //moving the container up + silentScroll(element.offsetTop); + } + } else { + css($htmlBody, { + 'overflow': 'visible', + 'height': 'initial' + }); + addClass($body, SCROLLABLE); + var recordHistory = !getOptions().autoScrolling ? false : getOriginals().recordHistory; + setRecordHistory(recordHistory, 'internal'); //for IE touch devices + + css(getContainer(), { + '-ms-touch-action': '', + 'touch-action': '' + }); //scrolling the page to the section with no animation + + if (element != null) { + var scrollSettings = getScrollSettings(element.offsetTop); + scrollSettings.element.scrollTo(0, scrollSettings.options); + } + } + } + + //@ts-check + /** + * Adds sections before or after the current one to create the infinite effect. + */ + + function createInfiniteSections(v) { + setState({ + isDoingContinousVertical: true + }); + var activeSectionItem = getState().activeSection.item; // Scrolling down + + if (!v.isMovementUp) { + // Move all previous sections to after the active section + after(activeSectionItem, prevAll(activeSectionItem, SECTION_SEL).reverse()); + } else { + // Scrolling up + // Move all next sections to before the active section + before(activeSectionItem, nextAll(activeSectionItem, SECTION_SEL)); + } // Maintain the displayed position (now that we changed the element order) + + + silentScroll(getState().activeSection.item.offsetTop); // Maintain the active slides visible in the viewport + + keepSlidesPosition$1(); // save for later the elements that still need to be reordered + + v.wrapAroundElements = activeSectionItem; // Recalculate animation variables + + v.dtop = v.element.offsetTop; + v.yMovement = getYmovement(getState().activeSection, v.element); + return v; + } + /** + * Maintains the active slides in the viewport + * (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical) + */ + + function keepSlidesPosition$1() { + var activeSlides = $(SLIDE_ACTIVE_SEL); + + for (var i = 0; i < activeSlides.length; i++) { + silentLandscapeScroll(activeSlides[i], 'internal'); + } + } + + //@ts-check + /** + * Maintains the active slides in the viewport + * (Because the `scroll` animation might get lost with some actions, such as when using continuousVertical) + */ + + function keepSlidesPosition() { + var activeSlides = $(SLIDE_ACTIVE_SEL); + + for (var i = 0; i < activeSlides.length; i++) { + silentLandscapeScroll(activeSlides[i], 'internal'); + } + } + /** + * Fix section order after continuousVertical changes have been animated + */ + + + function continuousVerticalFixSectionOrder(v) { + // If continuousVertical is in effect (and autoScrolling would also be in effect then), + // finish moving the elements around so the direct navigation will function more simply + if (v.wrapAroundElements == null) { + return; + } + + if (v.isMovementUp) { + before($(SECTION_SEL)[0], v.wrapAroundElements); + } else { + after($(SECTION_SEL)[getState().sections.length - 1], v.wrapAroundElements); + } + + silentScroll(getState().activeSection.item.offsetTop); // Maintain the active slides visible in the viewport + + keepSlidesPosition(); + setState({ + isDoingContinousVertical: false + }); + } + + /** + * Makes sure lazyload is done for other sections in the viewport that are not the + * active one. + */ + + function lazyLoadOthers() { + var hasAutoHeightSections = $(AUTO_HEIGHT_SEL)[0] || isResponsiveMode() && $(AUTO_HEIGHT_RESPONSIVE_SEL)[0]; //quitting when it doesn't apply + + if (!getOptions().lazyLoading || !hasAutoHeightSections) { + return; + } //making sure to lazy load auto-height sections that are in the viewport + + + $(SECTION_SEL + ':not(' + ACTIVE_SEL + ')').forEach(function (section) { + if (isSectionInViewport(section)) { + lazyLoadPanels(getPanelByElement(getState().sections, section)); + } + }); + } + /** + * Determines whether a section is in the viewport or not. + */ + + function isSectionInViewport(el) { + var rect = el.getBoundingClientRect(); + var top = rect.top; + var bottom = rect.bottom; //sometimes there's a 1px offset on the bottom of the screen even when the + //section's height is the window.innerHeight one. I guess because pixels won't allow decimals. + //using this prevents from lazyLoading the section that is not yet visible + //(only 1 pixel offset is) + + var pixelOffset = 2; + var isTopInView = top + pixelOffset < state.windowsHeight && top > 0; + var isBottomInView = bottom > pixelOffset && bottom < state.windowsHeight; + return isTopInView || isBottomInView; + } + + function tooltipTextHandler() { + /*jshint validthis:true */ + trigger(prev(this), 'click'); + } + /** + * Activating the vertical navigation bullets according to the given slide name. + */ + + function activateNavDots(name, sectionIndex) { + var nav = $(SECTION_NAV_SEL)[0]; + + if (getOptions().navigation && nav != null && nav.style.display !== 'none') { + removeClass($(ACTIVE_SEL, nav), ACTIVE); + + if (name) { + addClass($('a[href="#' + name + '"]', nav), ACTIVE); + } else { + addClass($('a', $('li', nav)[sectionIndex]), ACTIVE); + } + } + } + /** + * Creates a vertical navigation bar. + */ + + function addVerticalNavigation() { + remove($(SECTION_NAV_SEL)); + var navigation = doc.createElement('div'); + navigation.setAttribute('id', SECTION_NAV); + var divUl = doc.createElement('ul'); + navigation.appendChild(divUl); + appendTo(navigation, $body); + var nav = $(SECTION_NAV_SEL)[0]; + addClass(nav, 'fp-' + getOptions().navigationPosition); + + if (getOptions().showActiveTooltip) { + addClass(nav, SHOW_ACTIVE_TOOLTIP); + } + + var li = ''; + + for (var i = 0; i < getState().sections.length; i++) { + var section = getState().sections[i]; + var link = ''; + + if (getOptions().anchors.length) { + link = section.anchor; + } + + li += '
    • ' + getBulletLinkName(section.index(), 'Section') + ''; // Only add tooltip if needed (defined by user) + + var tooltip = getOptions().navigationTooltips[section.index()]; + + if (typeof tooltip !== 'undefined' && tooltip !== '') { + li += '
      ' + tooltip + '
      '; + } + + li += '
    • '; + } + + $('ul', nav)[0].innerHTML = li; //activating the current active section + + var bullet = $('li', $(SECTION_NAV_SEL)[0])[getState().activeSection.index()]; + addClass($('a', bullet), ACTIVE); + } //Scrolls to the section when clicking the navigation bullet + + function sectionBulletHandler(e) { + if (e.preventDefault) { + preventDefault(e); + } + + setState({ + scrollTrigger: 'verticalNav' + }); + /*jshint validthis:true */ + // @ts-ignore + + var indexBullet = index(closest(this, SECTION_NAV_SEL + ' li')); + EventEmitter.emit(events.scrollPage, { + destination: getState().sections[indexBullet] + }); + } + + /** + * Sets to active the current menu and vertical nav items. + */ + + function activateMenuAndNav(anchor, index) { + activateMenuElement(anchor); + activateNavDots(anchor, index); + } + /** + * Activating the website main menu elements according to the given slide name. + */ + + function activateMenuElement(name) { + if (getOptions().menu && getOptions().menu.length) { + $(getOptions().menu).forEach(function (menu) { + if (menu != null) { + removeClass($(ACTIVE_SEL, menu), ACTIVE); + addClass($('[data-menuanchor="' + name + '"]', menu), ACTIVE); + } + }); + } + } + + new Date().getTime(); + /** + * Triggers the callback once per scroll wheel action. + * Based on scrolling speed delay. + */ + + var oncePerScroll = function () { + var canTriggerEvent = true; + var prevWheelTime = new Date().getTime(); + var result; + var isScrollingOnInit = !win.fullpage_api; + return function (scrollTrigger, callback) { + var currentTime = new Date().getTime(); + var timeThreshold = scrollTrigger === 'wheel' ? getOptions().scrollingSpeed : 100; + canTriggerEvent = isScrollingOnInit || currentTime - prevWheelTime >= timeThreshold; + isScrollingOnInit = !win.fullpage_api; + + if (canTriggerEvent) { + result = callback(); + prevWheelTime = currentTime; + } + + return typeof result !== 'undefined' ? result : true; + }; + }(); + + /** + * Fires the wheel event once per mouse wheel trigger. + */ + + function fireCallbackOncePerScroll(callbackName, params) { + if (!isFunction(getOptions().beforeLeave)) { + return; + } + + var result = oncePerScroll(getState().scrollTrigger, function () { + return fireCallback(callbackName, params); + }); + return result; + } + + FP.moveTo = moveTo; + + FP.getScrollY = function () { + return state.scrollY; + }; + + var g_afterSectionLoadsId; + var g_transitionLapseId; + EventEmitter.on(events.onDestroy, onDestroy$8); + /** + * Scrolls the site to the given element and scrolls to the slide if a callback is given. + */ + + function scrollPage(section, callback, isMovementUp) { + var element = section.item; + + if (element == null) { + return; + } //there's no element to scroll, leaving the function + + + var dtop = getDestinationPosition(element); + var slideAnchorLink; + var slideIndex; //local variables + + var v = { + "element": element, + "callback": callback, + "isMovementUp": isMovementUp, + "dtop": dtop, + "yMovement": getYmovement(getState().activeSection, element), + "anchorLink": section.anchor, + "sectionIndex": section.index(), + "activeSlide": section.activeSlide ? section.activeSlide.item : null, + "leavingSection": getState().activeSection.index() + 1, + //caching the value of isResizing at the momment the function is called + //because it will be checked later inside a setTimeout and the value might change + "localIsResizing": state.isResizing, + "items": { + "origin": getState().activeSection, + "destination": section + }, + "direction": null + }; //quiting when destination scroll is the same as the current one + + if (getState().activeSection.item == element && !state.isResizing || getOptions().scrollBar && getScrollTop() === v.dtop && !hasClass(element, AUTO_HEIGHT)) { + return; + } + + if (v.activeSlide != null) { + slideAnchorLink = getAttr(v.activeSlide, 'data-anchor'); + slideIndex = index(v.activeSlide, null); + } //callback (onLeave) if the site is not just resizing and readjusting the slides + + + if (!v.localIsResizing) { + var direction = v.yMovement; //required for continousVertical + + if (typeof isMovementUp !== 'undefined') { + direction = isMovementUp ? 'up' : 'down'; + } //for the callback + + + v.direction = direction; + + if (isFunction(getOptions().beforeLeave)) { + if (fireCallbackOncePerScroll('beforeLeave', v) === false) { + return; + } + } + + if (isFunction(getOptions().onLeave)) { + if (!fireCallback('onLeave', v)) { + return; + } + } + } // If continuousVertical && we need to wrap around + + + if (getOptions().autoScrolling && getOptions().continuousVertical && typeof v.isMovementUp !== "undefined" && (!v.isMovementUp && v.yMovement == 'up' || // Intending to scroll down but about to go up or + v.isMovementUp && v.yMovement == 'down')) { + // intending to scroll up but about to go down + v = createInfiniteSections(v); + } //pausing media of the leaving section (if we are not just resizing, as destinatino will be the same one) + + + if (!v.localIsResizing) { + stopMedia(getState().activeSection.item); + } + + addClass(element, ACTIVE); + removeClass(siblings(element), ACTIVE); + updateState(); + lazyLoadPanels(section); //preventing from activating the MouseWheelHandler event + //more than once if the page is scrolling + + setState({ + canScroll: FP.test.isTesting + }); + setPageStatus(slideIndex, slideAnchorLink, v.anchorLink); + EventEmitter.emit(events.onLeave, v); + performMovement(v); //flag to avoid callingn `scrollPage()` twice in case of using anchor links + + setState({ + lastScrolledDestiny: v.anchorLink + }); //avoid firing it twice (as it does also on scroll) + + activateMenuAndNav(v.anchorLink, v.sectionIndex); + } + + function onDestroy$8() { + clearTimeout(g_afterSectionLoadsId); + clearTimeout(g_transitionLapseId); + } + /** + * Returns the destination Y position based on the scrolling direction and + * the height of the section. + */ + + + function getDestinationPosition(element) { + var elementHeight = element.offsetHeight; + var elementTop = element.offsetTop; //top of the desination will be at the top of the viewport + + var position = elementTop; + var isScrollingDown = elementTop > state.previousDestTop; + var sectionBottom = position - getWindowHeight() + elementHeight; + var bigSectionsDestination = getOptions().bigSectionsDestination; //is the destination element bigger than the viewport? + + if (elementHeight > getWindowHeight()) { + //scrolling up? + if (!isScrollingDown && !bigSectionsDestination || bigSectionsDestination === 'bottom') { + position = sectionBottom; + } + } //sections equal or smaller than the viewport height && scrolling down? || is resizing and its in the last section + else if (isScrollingDown || state.isResizing && next(element) == null) { + //The bottom of the destination will be at the bottom of the viewport + position = sectionBottom; + } + /* + Keeping record of the last scrolled position to determine the scrolling direction. + No conventional methods can be used as the scroll bar might not be present + AND the section might not be active if it is auto-height and didnt reach the middle + of the viewport. + */ + + + setState({ + previousDestTop: position + }); + return position; + } + /** + * Performs the vertical movement (by CSS3 or by jQuery) + */ + + + function performMovement(v) { + setState({ + touchDirection: 'none', + scrollY: Math.round(v.dtop) + }); + EventEmitter.emit(events.onPerformMovement, v); + var isFastSpeed = getOptions().scrollingSpeed < 700; + var transitionLapse = isFastSpeed ? 700 : getOptions().scrollingSpeed; // using CSS3 translate functionality + + if (getOptions().css3 && getOptions().autoScrolling && !getOptions().scrollBar) { + // The first section can have a negative value in iOS 10. Not quite sure why: -0.0142822265625 + // that's why we round it to 0. + var translate3d = 'translate3d(0px, -' + Math.round(v.dtop) + 'px, 0px)'; + transformContainer(translate3d, true); //even when the scrollingSpeed is 0 there's a little delay, which might cause the + //scrollingSpeed to change in case of using silentMoveTo();ç + + if (getOptions().scrollingSpeed) { + clearTimeout(g_afterSectionLoadsId); + g_afterSectionLoadsId = setTimeout(function () { + afterSectionLoads$1(v); //disabling canScroll when using fastSpeed + + setState({ + canScroll: !isFastSpeed || FP.test.isTesting + }); + }, getOptions().scrollingSpeed); + } else { + afterSectionLoads$1(v); + } + } // using JS to animate + else { + var scrollSettings = getScrollSettings(v.dtop); + FP.test.top = -v.dtop + 'px'; + clearTimeout(g_afterSectionLoadsId); + scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () { + if (getOptions().scrollBar) { + /* Hack! + The timeout prevents setting the most dominant section in the viewport as "active" when the user + scrolled to a smaller section by using the mousewheel (auto scrolling) rather than draging the scroll bar. + When using scrollBar:true It seems like the scroll events still getting propagated even after the scrolling animation has finished. + */ + g_afterSectionLoadsId = setTimeout(function () { + afterSectionLoads$1(v); + }, 30); + } else { + afterSectionLoads$1(v); //disabling canScroll when using fastSpeed + + setState({ + canScroll: !isFastSpeed || FP.test.isTesting + }); + } + }); + } // enabling canScroll after the minimum transition laps + + + if (isFastSpeed) { + clearTimeout(g_transitionLapseId); + g_transitionLapseId = setTimeout(function () { + setState({ + canScroll: true + }); + }, transitionLapse); + } + } + /** + * Actions to do once the section is loaded. + */ + + + function afterSectionLoads$1(v) { + setState({ + isBeyondFullpage: false + }); + continuousVerticalFixSectionOrder(v); //callback (afterLoad) if the site is not just resizing and readjusting the slides + + if (isFunction(getOptions().afterLoad) && !v.localIsResizing) { + fireCallback('afterLoad', v); + } + + updateState(); + + if (!v.localIsResizing) { + playMedia(v.element); + } + + addClass(v.element, COMPLETELY); + removeClass(siblings(v.element), COMPLETELY); + lazyLoadOthers(); + setState({ + canScroll: true + }); + EventEmitter.emit(events.afterSectionLoads, v); + + if (isFunction(v.callback)) { + v.callback(); + } + } + + FP.setFitToSection = setFitToSection; + FP.fitToSection = fitToSection; + /** + * Sets fitToSection + */ + + function setFitToSection(value, type) { + setVariableState('fitToSection', value, type); + } + /** + * Fits the site to the nearest active section + */ + + function fitToSection() { + //checking fitToSection again in case it was set to false before the timeout delay + if (state.canScroll && getOptions().fitToSection) { + //allows to scroll to an active section and + //if the section is already active, we prevent firing callbacks + setState({ + isResizing: true + }); + scrollPage(state.activeSection); + setState({ + isResizing: false + }); + } + } + + FP.setResponsive = setResponsive; + /** + * Checks if the site needs to get responsive and disables autoScrolling if so. + * A class `fp-responsive` is added to the plugin's container in case the user wants to use it for his own responsive CSS. + */ + + function responsive() { + var widthLimit = getOptions().responsive || getOptions().responsiveWidth; //backwards compatiblity + + var heightLimit = getOptions().responsiveHeight; //only calculating what we need. Remember its called on the resize event. + + var isBreakingPointWidth = widthLimit && win.innerWidth < widthLimit; + var isBreakingPointHeight = heightLimit && win.innerHeight < heightLimit; + + if (widthLimit && heightLimit) { + setResponsive(isBreakingPointWidth || isBreakingPointHeight); + } else if (widthLimit) { + setResponsive(isBreakingPointWidth); + } else if (heightLimit) { + setResponsive(isBreakingPointHeight); + } + } + /** + * Turns fullPage.js to normal scrolling mode when the viewport `width` or `height` + * are smaller than the set limit values. + */ + + function setResponsive(active) { + var isResponsive = isResponsiveMode(); + + if (active) { + if (!isResponsive) { + setAutoScrolling(false, 'internal'); + setFitToSection(false, 'internal'); + hide($(SECTION_NAV_SEL)); + addClass($body, RESPONSIVE); + + if (isFunction(getOptions().afterResponsive)) { + getOptions().afterResponsive.call(getContainer(), active); + } + } + } else if (isResponsive) { + setAutoScrolling(getOriginals().autoScrolling, 'internal'); + setFitToSection(getOriginals().autoScrolling, 'internal'); + show($(SECTION_NAV_SEL)); + removeClass($body, RESPONSIVE); + + if (isFunction(getOptions().afterResponsive)) { + getOptions().afterResponsive.call(getContainer(), active); + } + } + } + /** + * Determines whether fullpage.js is in responsive mode or not. + */ + + + function isResponsiveMode() { + return hasClass($body, RESPONSIVE); + } + + function addTableClass(element) { + if (!getOptions().verticalCentered) { + return; + } // Overflowing sections when scrollOverflow is disabled will be autoHeight + // and won't require vertical aligment + + + if (!getOptions().scrollOverflow && scrollOverflowHandler.shouldBeScrollable(element.item)) { + return; + } + + if (!scrollOverflowHandler.isScrollable(element)) { + //In case we are styling for the 2nd time as in with reponsiveSlides + if (!hasClass(element.item, TABLE)) { + addClass(element.item, TABLE); + } + } + } + + var startingSection = null; + FP.getActiveSection = getActiveSection; + function getStartingSection() { + return startingSection; + } + /** + * Styling vertical sections + */ + + function styleSection(section) { + var sectionElem = section.item; + var hasSlides = section.allSlidesItems.length; + var index = section.index(); //if no active section is defined, the 1st one will be the default one + + if (!getState().activeSection && section.isVisible) { + addClass(sectionElem, ACTIVE); + updateState(); + } + + if (!startingSection && section.isVisible) { + startingSection = getState().activeSection.item; + } + + if (getOptions().paddingTop) { + css(sectionElem, { + 'padding-top': getOptions().paddingTop + }); + } + + if (getOptions().paddingBottom) { + css(sectionElem, { + 'padding-bottom': getOptions().paddingBottom + }); + } + + if (typeof getOptions().sectionsColor[index] !== 'undefined') { + css(sectionElem, { + 'background-color': getOptions().sectionsColor[index] + }); + } + + if (typeof getOptions().anchors[index] !== 'undefined') { + sectionElem.setAttribute('data-anchor', section.anchor); + } + + if (!hasSlides) { + addTableClass(section); + } + } + /** + * Gets the active section. + */ + + function getActiveSection() { + return getState().activeSection; + } + + function getSectionFromPanel(panel) { + return panel.isSection ? panel : panel.parent; + } + + var g_focusScrollableId; + EventEmitter.on(events.bindEvents, bindEvents$b); + + function bindEvents$b() { + // We can't focus scrollOverflow before scrolling + // to the anchor (if we need to) + EventEmitter.on(events.onAfterRenderNoAnchor, afterRender); + EventEmitter.on(events.onLeave, scrollOverflowHandler.onLeave); + EventEmitter.on(events.onSlideLeave, scrollOverflowHandler.onLeave); + EventEmitter.on(events.afterSlideLoads, scrollOverflowHandler.afterLoad); + EventEmitter.on(events.afterSectionLoads, scrollOverflowHandler.afterLoad); + EventEmitter.on(events.onDestroy, onDestroy$7); + docAddEvent('keyup', scrollOverflowHandler.keyUpHandler); + } + + function afterRender() { + if (getOptions().scrollOverflow && !getOptions().scrollBar) { + scrollOverflowHandler.makeScrollable(); + scrollOverflowHandler.focusScrollable(); + } + } + + function onDestroy$7() { + EventEmitter.removeListener(events.onAfterRenderNoAnchor, afterRender); + docRemoveEvent('keyup', scrollOverflowHandler.keyUpHandler); + } + + var scrollOverflowHandler = { + focusedElem: null, + shouldFocusScrollable: true, + isInnerScrollAllowed: true, + timeBeforeReachingLimit: null, + timeLastScroll: null, + preventScrollWithMouseWheel: function preventScrollWithMouseWheel(e) { + var activeSection = getState().activeSection; + + if (!state.canScroll || isInsideIframe() && getOptions().scrollOverflow && scrollOverflowHandler.isScrollable(activeSection) && scrollOverflowHandler.isScrolled(getState().wheelDirection, activeSection.item)) { + preventDefault(e); + return false; + } + }, + preventScrollWithKeyboard: function preventScrollWithKeyboard(e) { + if (!isInsideInput() && getOptions().keyboardScrolling) { + var directionKeys = [38, 33, 32, 40, 34, 36, 35]; + + if (directionKeys.indexOf(e.keyCode) > -1 && !scrollOverflowHandler.isInnerScrollAllowed) { + preventDefault(e); + return false; + } + } + }, + keyUpHandler: function keyUpHandler() { + scrollOverflowHandler.shouldFocusScrollable = state.canScroll; + }, + // Leaving sections or slides + onLeave: function onLeave() { + clearTimeout(g_focusScrollableId); + scrollOverflowHandler.isInnerScrollAllowed = false; + }, + // Loading sections or slides + afterLoad: function afterLoad() { + scrollOverflowHandler.isInnerScrollAllowed = false; // Delaying it to avoid issues on Safari when focusing elements #4484 & #4493 + + clearTimeout(g_focusScrollableId); + g_focusScrollableId = setTimeout(function () { + scrollOverflowHandler.shouldFocusScrollable = state.canScroll; + }, 200); + }, + // Unfocusing the scrollable element from the orgin section/slide + unfocusScrollable: function unfocusScrollable() { + if (doc.activeElement === this.focusedElem) { + // @ts-ignore + this.focusedElem.blur(); + scrollOverflowHandler.isInnerScrollAllowed = false; + } + }, + focusScrollable: function focusScrollable() { + if (!getOptions().scrollOverflow || !scrollOverflowHandler.shouldFocusScrollable) { + return; + } + + scrollOverflowHandler.unfocusScrollable(); + var scrollableItem = scrollOverflowHandler.getScrollableItem(getState().activeSection.item); // On desktop we focus the scrollable to be able to use the mouse wheel + // We avoid it on mobile due to a bug in iOS Safari + + if (scrollableItem && !isTouchDevice && !isTouch) { + this.focusedElem = scrollableItem; // Forcing the focus on the next paint + // to avoid issue #4484 & #4493 on Safari + + requestAnimationFrame(function () { + scrollableItem.focus({ + preventScroll: true + }); + scrollOverflowHandler.isInnerScrollAllowed = true; + }); + } + + scrollOverflowHandler.shouldFocusScrollable = false; + }, + makeScrollable: function makeScrollable() { + if (getOptions().scrollOverflowMacStyle && !isMacDevice) { + addClass($body, 'fp-scroll-mac'); + } + + getState().panels.forEach(function (el) { + if (el.slides && el.slides.length) { + return; + } + + if (hasClass(el.item, AUTO_HEIGHT_RESPONSIVE) && isResponsiveMode()) { + return; + } else { + var item = getSlideOrSection(el.item); + var shouldBeScrollable = scrollOverflowHandler.shouldBeScrollable(el.item); + var section = getSectionFromPanel(el); + + if (isIE11) { + var toggleAction = shouldBeScrollable ? 'addClass' : 'removeClass'; + utils[toggleAction](section.item, IS_OVERFLOW); + utils[toggleAction](el.item, IS_OVERFLOW); + } else { + addClass(section.item, IS_OVERFLOW); + addClass(el.item, IS_OVERFLOW); + } + + if (!el.hasScroll) { + scrollOverflowHandler.createWrapper(item); + scrollOverflowHandler.bindEvents(item); + } // updating the state now in case + // this is executed on page load (after images load) + + + el.hasScroll = true; + } + }); + }, + bindEvents: function bindEvents(item) { + scrollOverflowHandler.getScrollableItem(item).addEventListener('scroll', scrollOverflowHandler.onPanelScroll); + item.addEventListener('wheel', scrollOverflowHandler.preventScrollWithMouseWheel, { + passive: false + }); + item.addEventListener('keydown', scrollOverflowHandler.preventScrollWithKeyboard, { + passive: false + }); + }, + createWrapper: function createWrapper(item) { + var overflowWrapper = document.createElement('div'); + overflowWrapper.className = OVERFLOW; + wrapInner(item, overflowWrapper); + overflowWrapper.setAttribute('tabindex', '-1'); + }, + destroyWrapper: function destroyWrapper(item) { + var overflowWrapper = $(OVERFLOW_SEL, item)[0]; + + if (overflowWrapper) { + unwrap(overflowWrapper); + item.removeAttribute('tabindex'); + } + }, + getScrollableItem: function getScrollableItem(sectionItem) { + var panel = getSlideOrSection(sectionItem); + return $(OVERFLOW_SEL, panel)[0] || panel; + }, + hasScroll: function hasScroll(panelItem) { + return hasClass(panelItem, OVERFLOW) || $(OVERFLOW_SEL, panelItem)[0] != null; + }, + isScrollable: function isScrollable(panel) { + return panel.isSection && panel.activeSlide ? panel.activeSlide.hasScroll : panel.hasScroll; + }, + shouldBeScrollable: function shouldBeScrollable(item) { + var scrollable = scrollOverflowHandler.getScrollableItem(item); + return scrollable.scrollHeight > win.innerHeight; + }, + isScrolled: function isScrolled(direction, el) { + if (!state.canScroll) { + return false; + } // we won't allow scrolloverflow on scrollBar:true + + + if (getOptions().scrollBar) { + return true; + } + + var scrollableItem = scrollOverflowHandler.getScrollableItem(el); + + if (!getOptions().scrollOverflow || !hasClass(scrollableItem, OVERFLOW) || // Checking the section first + // In case they apply to both section + slide #4505 + hasClass(el, 'fp-noscroll') || // Checking the slide (in case it has) + hasClass(getSlideOrSection(el), 'fp-noscroll')) { + return true; + } // ie11 wrongly calculates scrollHeight when using the CSS style + // overflow: auto It adds 1 more pixel compared to offsetHeight + + + var ie11offset = isIE11 ? 1 : 0; + var positionY = scrollableItem.scrollTop; + var isTopReached = direction === 'up' && positionY <= 0; + var isBottomReached = direction === 'down' && scrollableItem.scrollHeight <= Math.ceil(scrollableItem.offsetHeight + positionY) + ie11offset; + var isScrolled = isTopReached || isBottomReached; + + if (!isScrolled && direction !== 'none') { + this.timeBeforeReachingLimit = new Date().getTime(); + } + + return isScrolled; + }, + shouldMovePage: function shouldMovePage() { + this.timeLastScroll = new Date().getTime(); + var timeDiff = this.timeLastScroll - scrollOverflowHandler.timeBeforeReachingLimit; + var isUsingTouch = isTouchDevice || isTouch; + var isGrabbing = isUsingTouch && state.isGrabbing; + var isNotFirstTimeReachingLimit = state.isUsingWheel && timeDiff > 600; + return isGrabbing && timeDiff > 400 || isNotFirstTimeReachingLimit; + }, + onPanelScroll: function () { + var prevPosition = 0; + return function (e) { + var currentPosition = e.target.scrollTop; + var direction = state.touchDirection !== 'none' ? state.touchDirection : prevPosition < currentPosition ? 'down' : 'up'; + prevPosition = currentPosition; + + if (isFunction(getOptions().onScrollOverflow)) { + fireCallback('onScrollOverflow', { + position: currentPosition, + direction: direction + }); + } + + if (hasClass(e.target, OVERFLOW) && state.canScroll) { + if (scrollOverflowHandler.isScrolled(direction, e.target) && scrollOverflowHandler.shouldMovePage()) { + // Checking again if we have a scrollable content + // To avoid issues like #4479 where the scroll event gets + // triggered after removing/hidding content if this was scrolled + if (scrollOverflowHandler.shouldBeScrollable(getState().activeSection.item)) { + EventEmitter.emit(events.onScrollOverflowScrolled, { + direction: direction + }); + } + } + } + }; + }() + }; + + var g_afterSlideLoadsId; + FP.landscapeScroll = landscapeScroll; + EventEmitter.on(events.bindEvents, bindEvents$a); + + function bindEvents$a() { + EventEmitter.on(events.onPerformMovement, onPerformMovement); + } + + function onPerformMovement() { + clearTimeout(g_afterSlideLoadsId); + setState({ + slideMoving: false + }); + } + /** + * Scrolls horizontal sliders. + */ + + + function landscapeScroll(slides, destiny, direction) { + var sectionElem = closest(slides, SECTION_SEL); + var section = getState().sections.filter(function (section) { + return section.item == sectionElem; + })[0]; + var slide = section.slides.filter(function (slide) { + return slide.item == destiny; + })[0]; + var v = { + "slides": slides, + "destiny": destiny, + "direction": direction, + "destinyPos": { + "left": destiny.offsetLeft + }, + "slideIndex": slide.index(), + "section": sectionElem, + "sectionIndex": section.index(), + "anchorLink": section.anchor, + "slidesNav": $(SLIDES_NAV_SEL, sectionElem)[0], + "slideAnchor": slide.anchor, + "prevSlide": section.activeSlide.item, + "prevSlideIndex": section.activeSlide.index(), + "items": { + "section": section, + "origin": section.activeSlide, + "destination": slide + }, + //caching the value of isResizing at the momment the function is called + //because it will be checked later inside a setTimeout and the value might change + "localIsResizing": state.isResizing + }; + v.xMovement = getXmovement(v.prevSlideIndex, v.slideIndex); + v.direction = v.direction ? v.direction : v.xMovement; //important!! Only do it when not resizing + + if (!v.localIsResizing) { + //preventing from scrolling to the next/prev section when using scrollHorizontally + setState({ + canScroll: false + }); + } + + if (getOptions().onSlideLeave) { + //if the site is not just resizing and readjusting the slides + if (!v.localIsResizing && v.xMovement !== 'none') { + if (isFunction(getOptions().onSlideLeave)) { + if (fireCallback('onSlideLeave', v) === false) { + setState({ + slideMoving: false + }); + return; + } + } + } + } + + addClass(destiny, ACTIVE); + removeClass(siblings(destiny), ACTIVE); + updateState(); + + if (!v.localIsResizing) { + stopMedia(v.prevSlide); + lazyLoadPanels(slide); + } + + toggleControlArrows(v); //only changing the URL if the slides are in the current section (not for resize re-adjusting) + + if (section.isActive && !v.localIsResizing) { + setPageStatus(v.slideIndex, v.slideAnchor, v.anchorLink); + } + + EventEmitter.emit(events.onSlideLeave, v); + performHorizontalMove(slides, v, true); + } + /** + * Performs the horizontal movement. (CSS3 or jQuery) + * + * @param fireCallback {Boolean} - determines whether or not to fire the callback + */ + + function performHorizontalMove(slides, v, fireCallback) { + var destinyPos = v.destinyPos; + activeSlidesNavigation(v.slidesNav, v.slideIndex); + setState({ + scrollX: Math.round(destinyPos.left) + }); + + if (getOptions().css3) { + var translate3d = 'translate3d(-' + Math.round(destinyPos.left) + 'px, 0px, 0px)'; + FP.test.translate3dH[v.sectionIndex] = translate3d; + css(addAnimation($(SLIDES_CONTAINER_SEL, slides)), getTransforms(translate3d)); + clearTimeout(g_afterSlideLoadsId); + g_afterSlideLoadsId = setTimeout(function () { + if (fireCallback) { + afterSlideLoads(v); + } + }, getOptions().scrollingSpeed); + } else { + FP.test.left[v.sectionIndex] = Math.round(destinyPos.left); + scrollTo(slides, Math.round(destinyPos.left), getOptions().scrollingSpeed, function () { + if (fireCallback) { + afterSlideLoads(v); + } + }); + } + } + /** + * Retuns `right` or `left` depending on the scrolling movement to reach its destination + * from the current slide. + */ + + + function getXmovement(fromIndex, toIndex) { + if (fromIndex == toIndex) { + return 'none'; + } + + if (fromIndex > toIndex) { + return 'left'; + } + + return 'right'; + } + + function onDestroy$6() { + clearTimeout(g_afterSlideLoadsId); + } + + function afterSlideLoads(v) { + //if the site is not just resizing and readjusting the slides + if (!v.localIsResizing) { + if (isFunction(getOptions().afterSlideLoad)) { + fireCallback('afterSlideLoad', v); + } //needs to be inside the condition to prevent problems with continuousVertical and scrollHorizontally + //and to prevent double scroll right after a windows resize + + + setState({ + canScroll: true + }); + playMedia(v.destiny); + EventEmitter.emit(events.afterSlideLoads, v); + } //letting them slide again + + + setState({ + slideMoving: false + }); + } + + /** + * Slides silently (with no animation) the active slider to the given slide. + * @param noCallback {bool} true or defined -> no callbacks + */ + + function silentLandscapeScroll(activeSlide, noCallbacks) { + setScrollingSpeed(0, 'internal'); + + if (typeof noCallbacks !== 'undefined') { + //preventing firing callbacks afterSlideLoad etc. + setState({ + isResizing: true + }); + } + + landscapeScroll(closest(activeSlide, SLIDES_WRAPPER_SEL), activeSlide); + + if (typeof noCallbacks !== 'undefined') { + setState({ + isResizing: false + }); + } + + setScrollingSpeed(getOriginals().scrollingSpeed, 'internal'); + } + + var g_prevActiveSectionIndex = null; + var g_prevActiveSlideIndex = null; + /** + * Updates the state of the app. + */ + + function updateState() { + state.activeSection = null; + state.sections.map(function (section) { + var isActive = hasClass(section.item, ACTIVE); + section.isActive = isActive; + section.hasScroll = scrollOverflowHandler.hasScroll(section.item); + + if (isActive) { + state.activeSection = section; + } + + if (section.slides.length) { + section.activeSlide = null; + section.slides.map(function (slide) { + var isActiveSlide = hasClass(slide.item, ACTIVE); + slide.hasScroll = scrollOverflowHandler.hasScroll(section.item); + slide.isActive = isActiveSlide; + + if (isActiveSlide) { + section.activeSlide = slide; + } + }); + } + }); + scrollToNewActivePanel(); + } + function updateStructuralState() { + var allSectionItems = $(getOptions().sectionSelector, getContainer()); + var sectionsItems = getVisible(allSectionItems); + var allSections = Array.from(allSectionItems).map(function (item) { + return new SectionPanel(item); + }); + var sections = allSections.filter(function (item) { + return item.isVisible; + }); + var slides = sections.reduce(function (acc, section) { + return acc.concat(section.slides); + }, []); // keeping track of the previously active section + + g_prevActiveSectionIndex = getPrevActivePanelIndex(state.activeSection); + g_prevActiveSlideIndex = getPrevActivePanelIndex(state.activeSection ? state.activeSection.activeSlide : null); + state.numSections = sectionsItems.length; + state.numSlides = sections.reduce(function (acc, section) { + return acc + section.slides.length; + }, 0); + state.sections = sections; + state.sectionsIncludingHidden = allSections; + state.slides = slides; + state.panels = state.sections.concat(state.slides); + } + + function getPrevActivePanelIndex(activePanel) { + if (!activePanel) { + return null; + } + + var prevActivePanelItem = activePanel ? activePanel.item : null; + var hiddenPanels = activePanel.isSection ? state.sectionsIncludingHidden : state.activeSection.slidesIncludingHidden; + + if (prevActivePanelItem) { + var panel = getPanelByElement(hiddenPanels, prevActivePanelItem); + return panel ? panel.index() : null; + } + + return null; + } + /** + * When changes in the DOM take place there's a change + * the active section is now hidden or removed. + * fullPage.js will scroll to the closest section nearby. + */ + + + function scrollToNewActivePanel() { + var activeSection = state.activeSection; + var activeSectionHasSlides = state.activeSection ? state.activeSection.slides.length : false; + var activeSlide = state.activeSection ? state.activeSection.activeSlide : null; // Hidding / removing the active section ? + + if (!activeSection && state.sections.length && !getState().isBeyondFullpage && g_prevActiveSectionIndex) { + var newActiveSection = getNewActivePanel(g_prevActiveSectionIndex, state.sections); + + if (newActiveSection) { + state.activeSection = newActiveSection; + state.activeSection.isActive = true; + addClass(state.activeSection.item, ACTIVE); + } + + if (state.activeSection) { + silentScroll(state.activeSection.item.offsetTop); + } + } + + if (activeSectionHasSlides && !activeSlide && g_prevActiveSlideIndex) { + var newActiveSlide = getNewActivePanel(g_prevActiveSlideIndex, state.activeSection.slides); + + if (newActiveSlide) { + state.activeSection.activeSlide = newActiveSlide; + state.activeSection.activeSlide.isActive = true; + addClass(state.activeSection.activeSlide.item, ACTIVE); + } + + if (state.activeSection.activeSlide) { + silentLandscapeScroll(state.activeSection.activeSlide.item, 'internal'); + } + } + } + + function getNewActivePanel(prevActivePanelIndex, siblings) { + var newActiveSection; + var prevIndex = prevActivePanelIndex - 1; + var nextIndex = prevActivePanelIndex; + + do { + newActiveSection = siblings[prevIndex] || siblings[nextIndex]; + + if (newActiveSection) { + break; + } + + prevIndex = prevIndex - 1; + nextIndex = nextIndex + 1; + } while (prevIndex >= 0 || nextIndex < siblings.length); + + return newActiveSection; + } + /** + * Section object + */ + + + var SectionPanel = function SectionPanel(el) { + var _this = this; + + [].push.call(arguments, getOptions().sectionSelector); + Item.apply(this, arguments); + this.allSlidesItems = $(getOptions().slideSelector, el); + this.slidesIncludingHidden = Array.from(this.allSlidesItems).map(function (item) { + return new SlidePanel(item, _this); + }); + this.slides = this.slidesIncludingHidden.filter(function (slidePanel) { + return slidePanel.isVisible; + }); + this.activeSlide = this.slides.length ? this.slides.filter(function (slide) { + return slide.isActive; + })[0] || this.slides[0] : null; + }; + SectionPanel.prototype = Item.prototype; + SectionPanel.prototype.constructor = SectionPanel; + /** + * Slide object + */ + + var SlidePanel = function SlidePanel(el, section) { + this.parent = section; + Item.call(this, el, getOptions().slideSelector); + }; + + SlidePanel.prototype = Item.prototype; + SlidePanel.prototype.constructor = SectionPanel; + + /** + * Adds internal classes to be able to provide customizable selectors + * keeping the link with the style sheet. + */ + + function addInternalSelectors() { + addClass($(getOptions().sectionSelector, getContainer()), SECTION); + addClass($(getOptions().slideSelector, getContainer()), SLIDE); + } + + /** + * Styles the horizontal slides for a section. + */ + + function styleSlides(section) { + var numSlides = section.slides.length; + var slidesElems = section.allSlidesItems; + var slides = section.slides; + var sliderWidth = numSlides * 100; + var slideWidth = 100 / numSlides; + + if (!$(SLIDES_WRAPPER_SEL, section.item)[0]) { + var slidesWrapper = doc.createElement('div'); + slidesWrapper.className = SLIDES_WRAPPER; //fp-slides + + wrapAll(slidesElems, slidesWrapper); + var slidesContainer = doc.createElement('div'); + slidesContainer.className = SLIDES_CONTAINER; //fp-slidesContainer + + wrapAll(slidesElems, slidesContainer); + } + + css($(SLIDES_CONTAINER_SEL, section.item), { + 'width': sliderWidth + '%' + }); + + if (numSlides > 1) { + if (getOptions().controlArrows) { + createSlideArrows(section); + } + + if (getOptions().slidesNavigation) { + addSlidesNavigation(section); + } + } + + slides.forEach(function (slide) { + css(slide.item, { + 'width': slideWidth + '%' + }); + + if (getOptions().verticalCentered) { + addTableClass(slide); + } + }); + var startingSlide = section.activeSlide || null; //if the slide won't be an starting point, the default will be the first one + //the active section isn't the first one? Is not the first slide of the first section? Then we load that section/slide by default. + + if (startingSlide != null && state.activeSection && (state.activeSection.index() !== 0 || state.activeSection.index() === 0 && startingSlide.index() !== 0)) { + silentLandscapeScroll(startingSlide.item, 'internal'); + } else { + addClass(slidesElems[0], ACTIVE); + } + } + + var g_wrapperObserver; + var g_wrapperObserveConfig = { + attributes: false, + subtree: true, + childList: true, + characterData: true + }; + EventEmitter.on(events.bindEvents, bindEvents$9); + FP["render"] = onContentChange; + + function bindEvents$9() { + if (getOptions().observer && "MutationObserver" in window && $(WRAPPER_SEL)[0]) { + g_wrapperObserver = createObserver($(WRAPPER_SEL)[0], onContentChange, g_wrapperObserveConfig); + } + + EventEmitter.on(events.contentChanged, onContentChange); + } + /** + * Creates a Mutation observer. + */ + + + function createObserver(target, callback, config) { + var observer = new MutationObserver(callback); + observer.observe(target, config); + return observer; + } + + function didSlidesChange() { + return getVisible($(getOptions().slideSelector, getContainer())).length !== getState().numSlides; + } + + function didSectionsChange() { + return getVisible($(getOptions().sectionSelector, getContainer())).length !== getState().numSections; + } + + function didSectionsOrSlidesChange() { + return didSlidesChange() || didSectionsChange(); + } + /** + * Listen to changes on sections and fires reBuild + * when those changes affect the section height. + */ + + + function onContentChange(mutations) { + var _didSlidesChange = didSlidesChange(); + + if (didSectionsOrSlidesChange() && !state.isDoingContinousVertical) { + if (getOptions().observer && g_wrapperObserver) { + // Temporally disabling the observer while + // we modidy the DOM again + g_wrapperObserver.disconnect(); + } + + updateStructuralState(); + updateState(); // Removing navs and anchors options + + getOptions().anchors = []; + remove($(SECTION_NAV_SEL)); + addInternalSelectors(); + setOptionsFromDOM(); + + if (getOptions().navigation) { + addVerticalNavigation(); + } + + if (_didSlidesChange) { + remove($(SLIDES_NAV_SEL)); + remove($(SLIDES_ARROW_SEL)); + } + + getState().sections.forEach(function (section) { + if (section.slides.length) { + if (_didSlidesChange) { + styleSlides(section); + } + } else { + styleSection(section); + } + }); + } + + if (getOptions().observer && g_wrapperObserver && $(WRAPPER_SEL)[0]) { + g_wrapperObserver.observe($(WRAPPER_SEL)[0], g_wrapperObserveConfig); + } + } + + var supportsPassiveEvents = function () { + //cheks for passive event support + var g_supportsPassive = false; + + try { + var opts = Object.defineProperty({}, 'passive', { + get: function get() { + g_supportsPassive = true; + } + }); + windowAddEvent("testPassive", null, opts); + windowRemoveEvent("testPassive", null, opts); + } catch (e) {} + + return function () { + return g_supportsPassive; + }; + }(); + + function getPassiveOptionsIfPossible() { + return supportsPassiveEvents() ? { + passive: false + } : false; + } + + var wheelDataHandler = function () { + var _prevTime = new Date().getTime(); + + var _scrollings = []; + var isScrollingVertically; + var direction; + return { + registerEvent: function registerEvent(e) { + e = e || win.event; + var value = e.wheelDelta || -e.deltaY || -e.detail; + var delta = Math.max(-1, Math.min(1, value)); + var horizontalDetection = typeof e.wheelDeltaX !== 'undefined' || typeof e.deltaX !== 'undefined'; + isScrollingVertically = Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta) || Math.abs(e.deltaX) < Math.abs(e.deltaY) || !horizontalDetection; + var curTime = new Date().getTime(); + direction = delta < 0 ? 'down' : 'up'; //Limiting the array to 150 (lets not waste memory!) + + if (_scrollings.length > 149) { + _scrollings.shift(); + } //keeping record of the previous scrollings + + + _scrollings.push(Math.abs(value)); //time difference between the last scroll and the current one + + + var timeDiff = curTime - _prevTime; + _prevTime = curTime; //haven't they scrolled in a while? + //(enough to be consider a different scrolling action to scroll another section) + + if (timeDiff > 200) { + //emptying the array, we dont care about old scrollings for our averages + _scrollings = []; + } + }, + isAccelerating: function isAccelerating() { + var averageEnd = getAverage(_scrollings, 10); + var averageMiddle = getAverage(_scrollings, 70); + var isAccelerating = averageEnd >= averageMiddle; + return _scrollings.length ? isAccelerating && isScrollingVertically : false; + }, + getDirection: function getDirection() { + return direction; + } + }; + }(); + + function scrollBeyondFullPage() { + var dtop = getDestinationOffset(); + var scrollSettings = getScrollSettings(dtop); + FP.test.top = -dtop + 'px'; + setState({ + canScroll: false + }); + scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () { + setTimeout(function () { + setState({ + isBeyondFullpage: true + }); + setState({ + canScroll: true + }); + }, 30); + }); + } + function onKeyDown() { + if (!isFullPageAbove()) { + return; + } else { + scrollUpToFullpage(); + } + } + function scrollUpToFullpage() { + var scrollSettings = getScrollSettings(getLast(getState().sections).item.offsetTop); + setState({ + canScroll: false + }); + scrollTo(scrollSettings.element, scrollSettings.options, getOptions().scrollingSpeed, function () { + setState({ + canScroll: true + }); + setState({ + isBeyondFullpage: false + }); + setState({ + isAboutToScrollToFullPage: false + }); + }); + } + + function getDestinationOffset() { + if (!getOptions().css3) { + return getLast(getState().sections).item.offsetTop + getLast(getState().sections).item.offsetHeight; + } + + return getScrollTop() + getWindowHeight(); + } + + function beyondFullPageHandler(container, e) { + new Date().getTime(); + var pauseScroll = getState().isBeyondFullpage && container.getBoundingClientRect().bottom >= 0 && wheelDataHandler.getDirection() === 'up'; + var g_isAboutToScrollToFullPage = getState().isAboutToScrollToFullPage; + + if (g_isAboutToScrollToFullPage) { + preventDefault(e); + return false; + } + + if (getState().isBeyondFullpage) { + if (!pauseScroll) { + keyframeTime('set', 'beyondFullpage', 1000); + } else { + var shouldSetFixedPosition = !g_isAboutToScrollToFullPage && (!keyframeTime('isNewKeyframe', 'beyondFullpage') || !wheelDataHandler.isAccelerating()); + var scrollSettings; + + if (shouldSetFixedPosition) { + scrollSettings = getScrollSettings(getLast(getState().sections).item.offsetTop + getLast(getState().sections).item.offsetHeight); + scrollSettings.element.scrollTo(0, scrollSettings.options); + setState({ + isAboutToScrollToFullPage: false + }); + preventDefault(e); + return false; + } else if (wheelDataHandler.isAccelerating()) { + pauseScroll = false; + setState({ + isAboutToScrollToFullPage: true + }); + setState({ + scrollTrigger: 'wheel' + }); + scrollUpToFullpage(); + preventDefault(e); + return false; + } + } + + if (!g_isAboutToScrollToFullPage) { + // allow normal scrolling, but quitting + if (!pauseScroll) { + return true; + } + } + } + } + + var keyframeTime = function () { + var isNew = false; + var frames = {}; + var timeframes = {}; + return function (action, name, timeframe) { + switch (action) { + case 'set': + frames[name] = new Date().getTime(); + timeframes[name] = timeframe; + break; + + case 'isNewKeyframe': + var current = new Date().getTime(); + isNew = current - frames[name] > timeframes[name]; + break; + } + + return isNew; + }; + }(); + + FP.moveSectionDown = moveSectionDown; + /** + * Moves the page down one section. + */ + + function moveSectionDown() { + var next = getState().activeSection.next(); //looping to the top if there's no more sections below + + if (!next && (getOptions().loopBottom || getOptions().continuousVertical)) { + next = getState().sections[0]; + } + + if (next != null) { + scrollPage(next, null, false); + } else if (hasContentBeyondFullPage()) { + EventEmitter.emit(events.scrollBeyondFullpage); + } + } + + function hasContentBeyondFullPage() { + return getContainer().scrollHeight < $body.scrollHeight && getOptions().scrollBar && getOptions().scrollBeyondFullpage; + } + + FP.moveSectionUp = moveSectionUp; + /** + * Moves the page up one section. + */ + + function moveSectionUp() { + var prev = getState().activeSection.prev(); //looping to the bottom if there's no more sections above + + if (!prev && (getOptions().loopTop || getOptions().continuousVertical)) { + prev = getLast(getState().sections); + } + + if (prev != null) { + scrollPage(prev, null, true); + } + } + + var oldPageY = 0; + /** + * Detecting the direction of the mouse movement. + * Used only for the middle button of the mouse. + */ + + function mouseMoveHandler(e) { + if (!getOptions().autoScrolling) { + return; + } + + if (state.canScroll) { + // moving up + if (e.pageY < oldPageY && getIsScrollAllowed().m.up) { + moveSectionUp(); + } // moving down + else if (e.pageY > oldPageY && getIsScrollAllowed().m.down) { + moveSectionDown(); + } + } + + oldPageY = e.pageY; + } + function setOldPageY(value) { + oldPageY = value; + } + + /** + * Determines the way of scrolling up or down: + * by 'automatically' scrolling a section or by using the default and normal scrolling. + */ + + function scrolling(type) { + if (!getIsScrollAllowed().m[type]) { + return; + } + + var scrollSection = type === 'down' ? moveSectionDown : moveSectionUp; + + if (getOptions().scrollOverflow && scrollOverflowHandler.isScrollable(getState().activeSection)) { + //is the scrollbar at the start/end of the scroll? + if (scrollOverflowHandler.isScrolled(type, getState().activeSection.item) && scrollOverflowHandler.shouldMovePage()) { + scrollSection(); + } + } else { + scrollSection(); + } + } + + var touchStartY = 0; + var touchStartX = 0; + var touchEndY = 0; + var touchEndX = 0; + var MSPointer = getMSPointer(); + var pointers = { + touchmove: 'ontouchmove' in window ? 'touchmove' : MSPointer ? MSPointer.move : null, + touchstart: 'ontouchstart' in window ? 'touchstart' : MSPointer ? MSPointer.down : null + }; + /** + * Adds the possibility to auto scroll through sections on touch devices. + */ + + function addTouchHandler() { + if (!pointers.touchmove) { + return; + } + + if (isTouchDevice || isTouch) { + if (getOptions().autoScrolling) { + $body.removeEventListener(pointers.touchmove, preventBouncing, { + passive: false + }); + $body.addEventListener(pointers.touchmove, preventBouncing, { + passive: false + }); + } + + var touchWrapper = getOptions().touchWrapper; + touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler); + touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, { + passive: false + }); + touchWrapper.addEventListener(pointers.touchstart, touchStartHandler); + touchWrapper.addEventListener(pointers.touchmove, touchMoveHandler, { + passive: false + }); + } + } + /** + * Removes the auto scrolling for touch devices. + */ + + function removeTouchHandler() { + if (!pointers.touchmove) { + return; + } + + if (isTouchDevice || isTouch) { + // normalScrollElements requires it off #2691 + if (getOptions().autoScrolling) { + $body.removeEventListener(pointers.touchmove, touchMoveHandler, { + passive: false + }); + $body.removeEventListener(pointers.touchmove, preventBouncing, { + passive: false + }); + } + + var touchWrapper = getOptions().touchWrapper; + touchWrapper.removeEventListener(pointers.touchstart, touchStartHandler); + touchWrapper.removeEventListener(pointers.touchmove, touchMoveHandler, { + passive: false + }); + } + } + /* Detecting touch events + + * As we are changing the top property of the page on scrolling, we can not use the traditional way to detect it. + * This way, the touchstart and the touch moves shows an small difference between them which is the + * used one to determine the direction. + */ + + function touchMoveHandler(e) { + var activeSection = closest(e.target, SECTION_SEL) || getState().activeSection.item; + var hasActiveSectionOverflow = scrollOverflowHandler.isScrollable(getState().activeSection); + + if (isReallyTouch(e)) { + setState({ + isGrabbing: true, + isUsingWheel: false + }); + + if (getOptions().autoScrolling) { + if (hasActiveSectionOverflow && !state.canScroll || getOptions().scrollBar) { + //preventing the easing on iOS devices + preventDefault(e); + } + } + + var touchEvents = getEventsPage(e); + touchEndY = touchEvents.y; + touchEndX = touchEvents.x; + var isVerticalMovementEnough = Math.abs(touchStartY - touchEndY) > win.innerHeight / 100 * getOptions().touchSensitivity; + var isHorizontalMovementEnough = Math.abs(touchStartX - touchEndX) > getWindowWidth() / 100 * getOptions().touchSensitivity; + var isHorizontalPredominantMove = $(SLIDES_WRAPPER_SEL, activeSection).length && Math.abs(touchStartX - touchEndX) > Math.abs(touchStartY - touchEndY); + var directionH = touchStartX > touchEndX ? 'right' : 'left'; + var directionV = touchStartY > touchEndY ? 'down' : 'up'; + var direction = isHorizontalPredominantMove ? directionH : directionV; + setState({ + touchDirection: direction + }); //if movement in the X axys is greater than in the Y and the currect section has slides... + + if (isHorizontalPredominantMove) { + //is the movement greater than the minimum resistance to scroll? + if (!state.slideMoving && isHorizontalMovementEnough) { + if (touchStartX > touchEndX) { + if (getIsScrollAllowed().m.right) { + EventEmitter.emit(events.moveSlideRight, { + section: activeSection + }); + } + } else { + if (getIsScrollAllowed().m.left) { + EventEmitter.emit(events.moveSlideLeft, { + section: activeSection + }); + } + } + } + } //vertical scrolling (only when autoScrolling is enabled) + else if (getOptions().autoScrolling && state.canScroll) { + //is the movement greater than the minimum resistance to scroll? + if (isVerticalMovementEnough) { + scrolling(directionV); + } + } + } + } + /** + * As IE >= 10 fires both touch and mouse events when using a mouse in a touchscreen + * this way we make sure that is really a touch event what IE is detecting. + */ + + + function isReallyTouch(e) { + //if is not IE || IE is detecting `touch` or `pen` + return typeof e.pointerType === 'undefined' || e.pointerType != 'mouse'; + } + /** + * Handler for the touch start event. + */ + + + function touchStartHandler(e) { + //stopping the auto scroll to adjust to a section + if (getOptions().fitToSection) { + setState({ + activeAnimation: false + }); + } + + if (isReallyTouch(e)) { + var touchEvents = getEventsPage(e); + touchStartY = touchEvents.y; + touchStartX = touchEvents.x; + } + + windowAddEvent('touchend', touchEndHandler); + } + /** + * Handler for the touch end event. + */ + + + function touchEndHandler() { + windowRemoveEvent('touchend', touchEndHandler); + setState({ + isGrabbing: false + }); + } + /** + * Gets the pageX and pageY properties depending on the browser. + * https://github.com/alvarotrigo/fullPage.js/issues/194#issuecomment-34069854 + */ + + + function getEventsPage(e) { + var events = {}; + events.y = typeof e.pageY !== 'undefined' && (e.pageY || e.pageX) ? e.pageY : e.touches[0].pageY; + events.x = typeof e.pageX !== 'undefined' && (e.pageY || e.pageX) ? e.pageX : e.touches[0].pageX; //in touch devices with scrollBar:true, e.pageY is detected, but we have to deal with touch events. #1008 + + if (isTouch && isReallyTouch(e) && getOptions().scrollBar && typeof e.touches !== 'undefined') { + events.y = e.touches[0].pageY; + events.x = e.touches[0].pageX; + } + + return events; + } + /* + * Returns and object with Microsoft pointers (for IE<11 and for IE >= 11) + * http://msdn.microsoft.com/en-us/library/ie/dn304886(v=vs.85).aspx + */ + + + function getMSPointer() { + var pointer; //IE >= 11 & rest of browsers + + if (win.PointerEvent) { + pointer = { + down: 'pointerdown', + move: 'pointermove' + }; + } + + return pointer; + } + /* + * Preventing bouncing in iOS #2285 + */ + + + function preventBouncing(e) { + if (getOptions().autoScrolling && isReallyTouch(e) && getIsScrollAllowed().m.up) { + //preventing the easing on iOS devices + if (!state.canScroll) { + preventDefault(e); + } + } + } + + FP.moveSlideLeft = moveSlideLeft; + FP.moveSlideRight = moveSlideRight; + /** + * Slides a slider to the given direction. + * Optional `section` param. + */ + + function moveSlide(direction, section) { + var activeSectionItem = section == null ? getState().activeSection.item : section; + var activeSection = getPanelByElement(state.sections, activeSectionItem); + var slides = $(SLIDES_WRAPPER_SEL, activeSectionItem)[0]; // more than one slide needed and nothing should be sliding + + if (slides == null || state.slideMoving || activeSection.slides.length < 2) { + return; + } + + var currentSlide = activeSection.activeSlide; + var destiny = direction === 'left' ? currentSlide.prev() : currentSlide.next(); //isn't there a next slide in the secuence? + + if (!destiny) { + //respect loopHorizontal setting + if (!getOptions().loopHorizontal) return; + destiny = direction === 'left' ? getLast(activeSection.slides) : activeSection.slides[0]; + } + + setState({ + slideMoving: !FP.test.isTesting + }); + landscapeScroll(slides, destiny.item, direction); + } + /** + * Slides left the slider of the active section. + * Optional `section` param. + */ + + function moveSlideLeft(section) { + moveSlide('left', section); + } + /** + * Slides right the slider of the active section. + * Optional `section` param. + */ + + function moveSlideRight(section) { + moveSlide('right', section); + } + + /** + * Gets a section by its anchor / index + */ + + function getSectionByAnchor(sectionAnchor) { + var section = getState().sections.filter(function (section) { + return section.anchor === sectionAnchor; + })[0]; + + if (!section) { + var sectionIndex = typeof sectionAnchor !== 'undefined' ? sectionAnchor - 1 : 0; + section = getState().sections[sectionIndex]; + } + + return section; + } + + /** + * Scrolls the slider to the given slide destination for the given section + */ + + function scrollSlider(slideElem) { + if (slideElem != null) { + landscapeScroll(closest(slideElem, SLIDES_WRAPPER_SEL), slideElem); + } + } + + /** + * Scrolls to the given section and slide anchors + */ + + function scrollPageAndSlide(sectionAnchor, slideAnchor) { + var section = getSectionByAnchor(sectionAnchor); //do nothing if there's no section with the given anchor name + + if (section == null) return; + var slideElem = getSlideByAnchor(slideAnchor, section); //we need to scroll to the section and then to the slide + + if ((!section.anchor || section.anchor !== state.lastScrolledDestiny) && !hasClass(section.item, ACTIVE)) { + scrollPage(section, function () { + scrollSlider(slideElem); + }); + } //if we were already in the section + else { + scrollSlider(slideElem); + } + } + /** + * Gets a slide inside a given section by its anchor / index + */ + + function getSlideByAnchor(slideAnchor, section) { + var slide = section.slides.filter(function (slide) { + return slide.anchor === slideAnchor; + })[0]; + + if (slide == null) { + slideAnchor = typeof slideAnchor !== 'undefined' ? slideAnchor : 0; + slide = section.slides[slideAnchor]; + } + + return slide ? slide.item : null; + } + + FP.moveTo = moveTo$1; + /** + * Moves the page to the given section and slide. + * Anchors or index positions can be used as params. + */ + + function moveTo$1(sectionAnchor, slideAnchor) { + var destiny = getSectionByAnchor(sectionAnchor); + + if (typeof slideAnchor !== 'undefined') { + scrollPageAndSlide(sectionAnchor, slideAnchor); + } else if (destiny != null) { + scrollPage(destiny); + } + } + + //@ts-check + var g_controlPressed; + var g_keydownId; + var g_elToFocus; + EventEmitter.on(events.bindEvents, bindEvents$8); + + function bindEvents$8() { + //when opening a new tab (ctrl + t), `control` won't be pressed when coming back. + windowAddEvent('blur', blurHandler); //Sliding with arrow keys, both, vertical and horizontal + + docAddEvent('keydown', keydownHandler); //to prevent scrolling while zooming + + docAddEvent('keyup', keyUpHandler); + EventEmitter.on(events.onDestroy, onDestroy$5); + EventEmitter.on(events.afterSlideLoads, onAfterSlideLoads); + EventEmitter.on(events.afterSectionLoads, afterSectionLoads); + } + + function onDestroy$5() { + clearTimeout(g_keydownId); + docRemoveEvent('keydown', keydownHandler); + docRemoveEvent('keyup', keyUpHandler); + } //Sliding with arrow keys, both, vertical and horizontal + + + function keydownHandler(e) { + clearTimeout(g_keydownId); + var keyCode = e.keyCode; + var isPressingHorizontalArrows = [37, 39].indexOf(keyCode) > -1; + var canScrollWithKeyboard = getOptions().autoScrolling || getOptions().fitToSection || isPressingHorizontalArrows; //tab? + + if (keyCode === 9) { + onTab(e); + } else if (!isInsideInput() && getOptions().keyboardScrolling && canScrollWithKeyboard) { + g_controlPressed = e.ctrlKey; + g_keydownId = setTimeout(function () { + onkeydown(e); + }, 0); + } + } + /** + * Keydown event + */ + + + function onkeydown(e) { + var shiftPressed = e.shiftKey; + var activeElement = doc.activeElement; + var isMediaFocused = matches(activeElement, 'video') || matches(activeElement, 'audio'); + var isScrolled = { + up: scrollOverflowHandler.isScrolled('up', getState().activeSection.item), + down: scrollOverflowHandler.isScrolled('down', getState().activeSection.item) + }; + var isUsingHorizontalArrowKeys = [37, 39].indexOf(e.keyCode) > -1; + cancelDirectionKeyEvents(e); //do nothing if we can not scroll or we are not using horizotnal key arrows. + + if (!state.canScroll && !isUsingHorizontalArrowKeys) { + return; + } + + setState({ + scrollTrigger: 'keydown' + }); + + switch (e.keyCode) { + //up + case 38: + case 33: + if (getIsScrollAllowed().k.up && isScrolled.up) { + if (state.isBeyondFullpage) { + EventEmitter.emit(events.onKeyDown, { + e: e + }); + } else { + moveSectionUp(); + } + } else { + scrollOverflowHandler.focusScrollable(); + } + + break; + //down + + case 32: + //spacebar + if (shiftPressed && getIsScrollAllowed().k.up && !isMediaFocused && isScrolled.up) { + moveSectionUp(); + break; + } + + /* falls through */ + + case 40: + case 34: + if (getIsScrollAllowed().k.down && isScrolled.down) { + if (state.isBeyondFullpage) { + return; + } // space bar? + + + if (e.keyCode !== 32 || !isMediaFocused) { + moveSectionDown(); + } + } else { + scrollOverflowHandler.focusScrollable(); + } + + break; + //Home + + case 36: + if (getIsScrollAllowed().k.up) { + moveTo$1(1); + } + + break; + //End + + case 35: + if (getIsScrollAllowed().k.down) { + moveTo$1(getState().sections.length); + } + + break; + //left + + case 37: + if (getIsScrollAllowed().k.left) { + moveSlideLeft(); + } + + break; + //right + + case 39: + if (getIsScrollAllowed().k.right) { + moveSlideRight(); + } + + break; + + default: + return; + // exit this handler for other keys + } + } //to prevent scrolling while zooming + + + function keyUpHandler(e) { + if (state.isWindowFocused) { + //the keyup gets fired on new tab ctrl + t in Firefox + g_controlPressed = e.ctrlKey; + } + } //when opening a new tab (ctrl + t), `control` won't be pressed when coming back. + + + function blurHandler() { + setState({ + isWindowFocused: false + }); + g_controlPressed = false; + } + /** + * Makes sure the tab key will only focus elements within the current section/slide + * preventing this way from breaking the page. + * Based on "Modals and keyboard traps" + * from https://developers.google.com/web/fundamentals/accessibility/focus/using-tabindex + */ + + + function onTab(e) { + var isShiftPressed = e.shiftKey; + var activeElement = doc.activeElement; + var focusableElements = getFocusables(getSlideOrSection(getState().activeSection.item)); + + function preventAndFocusFirst(e) { + preventDefault(e); + return focusableElements[0] ? focusableElements[0].focus() : null; + } // deactivating tab while scrolling #4550 + + + if (!state.canScroll) { + preventDefault(e); + return; + } //outside any section or slide? Let's not hijack the tab! + + + if (isFocusOutside(e)) { + return; + } //is there an element with focus? + + + if (activeElement) { + if (closest(activeElement, SECTION_ACTIVE_SEL + ',' + SECTION_ACTIVE_SEL + ' ' + SLIDE_ACTIVE_SEL) == null) { + activeElement = preventAndFocusFirst(e); + } + } //no element if focused? Let's focus the first one of the section/slide + else { + preventAndFocusFirst(e); + } //when reached the first or last focusable element of the section/slide + //we prevent the tab action to keep it in the last focusable element + + + var isFirstFocusableInSection = activeElement == focusableElements[0]; + var isLastFocusableInSection = activeElement == focusableElements[focusableElements.length - 1]; + var isNextItem = !isShiftPressed && isLastFocusableInSection; + var isPrevItem = isShiftPressed && isFirstFocusableInSection; + + if (isPrevItem || isNextItem) { + preventDefault(e); + var focusInfo = getPanelWithFocusable(isPrevItem); + var destinationPanel = focusInfo ? focusInfo.panel : null; + + if (destinationPanel) { + var destinationSection = destinationPanel.isSection ? destinationPanel : destinationPanel.parent; + EventEmitter.emit(events.onScrollPageAndSlide, { + sectionAnchor: destinationSection.index() + 1, + slideAnchor: destinationPanel.isSection ? 0 : destinationPanel.index() + }); + g_elToFocus = focusInfo.itemToFocus; + preventDefault(e); + } + } + } + + function onAfterSlideLoads(v) { + focusItem(); + } + + function afterSectionLoads(v) { + if (!closest(g_elToFocus, SLIDE_SEL) || closest(g_elToFocus, SLIDE_ACTIVE_SEL)) { + focusItem(); + } + } + + function focusItem() { + if (g_elToFocus) { + g_elToFocus.focus(); + g_elToFocus = null; + } + } + /** + * Get's the panel containing the element to focus. + * + */ + + + function getPanelWithFocusable(isPrevItem) { + var action = isPrevItem ? 'prevPanel' : 'nextPanel'; + var focusableElements = []; + var panelWithFocusables; + var currentPanel = getSlideOrSectionPanel(getActivePanel()[action]()); + + do { + focusableElements = getFocusables(currentPanel.item); + + if (focusableElements.length) { + panelWithFocusables = { + panel: currentPanel, + itemToFocus: focusableElements[isPrevItem ? focusableElements.length - 1 : 0] + }; + } + + currentPanel = getSlideOrSectionPanel(currentPanel[action]()); + } while (currentPanel && focusableElements.length === 0); + + return panelWithFocusables; + } + /** + * Gets all the focusable elements inside the passed element. + */ + + + function getFocusables(el) { + return [].slice.call($(focusableElementsString, el)).filter(function (item) { + return getAttr(item, 'tabindex') !== '-1' && //are also not hidden elements (or with hidden parents) + item.offsetParent !== null; + }); + } + /** + * Determines whether the focus is outside fullpage.js sections/slides or not. + */ + + + function isFocusOutside(e) { + var allFocusables = getFocusables(doc); + var currentFocusIndex = allFocusables.indexOf(doc.activeElement); + var focusDestinationIndex = e.shiftKey ? currentFocusIndex - 1 : currentFocusIndex + 1; + var focusDestination = allFocusables[focusDestinationIndex]; + var destinationItemSlide = closest(focusDestination, SLIDE_SEL); + var destinationItemSection = closest(focusDestination, SECTION_SEL); + return !destinationItemSlide && !destinationItemSection; + } + + function shouldCancelKeyboardNavigation(e) { + // https://keycode.info/for/34 + // 40 = arrow down + // 38 = arrow up + // 32 = spacebar + // 33 = PageUp + // 34 = PageDown + var keyControls = [40, 38, 32, 33, 34]; + return keyControls.indexOf(e.keyCode) > -1 && !state.isBeyondFullpage; + } //preventing the scroll with arrow keys & spacebar & Page Up & Down keys + + + function cancelDirectionKeyEvents(e) { + if (shouldCancelKeyboardNavigation(e) && !closest(e.target, OVERFLOW_SEL)) { + e.preventDefault(); + } + } + + function getControlPressed() { + return g_controlPressed; + } + + var prevTime = new Date().getTime(); + var scrollings = []; + FP.setMouseWheelScrolling = setMouseWheelScrolling; + /** + * Adds or remove the possibility of scrolling through sections by using the mouse wheel or the trackpad. + */ + + function setMouseWheelScrolling(value) { + if (value) { + addMouseWheelHandler(); + addMiddleWheelHandler(); + } else { + removeMouseWheelHandler(); + removeMiddleWheelHandler(); + } + } + /** + * Adds the auto scrolling action for the mouse wheel and trackpad. + * After this function is called, the mousewheel and trackpad movements will scroll through sections + * https://developer.mozilla.org/en-US/docs/Web/Events/wheel + */ + + + function addMouseWheelHandler() { + var prefix = ''; + + var _addEventListener; + + if (win.addEventListener) { + _addEventListener = "addEventListener"; + } else { + _addEventListener = "attachEvent"; + prefix = 'on'; + } // detect available wheel event + + + var support = 'onwheel' in doc.createElement('div') ? 'wheel' : // Modern browsers support "wheel" + // @ts-ignore + doc.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least "mousewheel" + 'DOMMouseScroll'; // let's assume that remaining browsers are older Firefox + + var passiveEvent = getPassiveOptionsIfPossible(); + + if (support == 'DOMMouseScroll') { + doc[_addEventListener](prefix + 'MozMousePixelScroll', MouseWheelHandler, passiveEvent); + } //handle MozMousePixelScroll in older Firefox + else { + doc[_addEventListener](prefix + support, MouseWheelHandler, passiveEvent); + } + } + /** + * Binding the mousemove when the mouse's middle button is pressed + */ + + + function addMiddleWheelHandler() { + getContainer().addEventListener('mousedown', mouseDownHandler); + getContainer().addEventListener('mouseup', mouseUpHandler); + } + /** + * Removes the auto scrolling action fired by the mouse wheel and trackpad. + * After this function is called, the mousewheel and trackpad movements won't scroll through sections. + */ + + + function removeMouseWheelHandler() { + if (doc.addEventListener) { + docRemoveEvent('mousewheel', MouseWheelHandler, false); //IE9, Chrome, Safari, Oper + + docRemoveEvent('wheel', MouseWheelHandler, false); //Firefox + + docRemoveEvent('MozMousePixelScroll', MouseWheelHandler, false); //old Firefox + } else { + // @ts-ignore + doc.detachEvent('onmousewheel', MouseWheelHandler); //IE 6/7/8 + } + } + /** + * Unbinding the mousemove when the mouse's middle button is released + */ + + + function removeMiddleWheelHandler() { + getContainer().removeEventListener('mousedown', mouseDownHandler); + getContainer().removeEventListener('mouseup', mouseUpHandler); + } + /** + * Detecting mousewheel scrolling + * + * http://blogs.sitepointstatic.com/examples/tech/mouse-wheel/index.html + * http://www.sitepoint.com/html5-javascript-mouse-wheel/ + */ + + + function MouseWheelHandler(e) { + var curTime = new Date().getTime(); + var isNormalScroll = hasClass($(COMPLETELY_SEL)[0], NORMAL_SCROLL); + var isScrollAllowedBeyondFullPage = beyondFullPageHandler(getContainer(), e); + + if (!state.isUsingWheel) { + setState({ + isGrabbing: false, + isUsingWheel: true, + touchDirection: 'none' + }); + } //is scroll allowed? + + + if (!getIsScrollAllowed().m.down && !getIsScrollAllowed().m.up) { + return false; + } + + if (isScrollAllowedBeyondFullPage) { + return true; + } else if (isScrollAllowedBeyondFullPage === false) { + preventDefault(e); + return false; + } //autoscrolling and not zooming? + + + if (getOptions().autoScrolling && !getControlPressed() && !isNormalScroll) { + // cross-browser wheel delta + e = e || win.event; + var value = e.wheelDelta || -e.deltaY || -e.detail; + var delta = Math.max(-1, Math.min(1, value)); + var horizontalDetection = typeof e.wheelDeltaX !== 'undefined' || typeof e.deltaX !== 'undefined'; + var isScrollingVertically = Math.abs(e.wheelDeltaX) < Math.abs(e.wheelDelta) || Math.abs(e.deltaX) < Math.abs(e.deltaY) || !horizontalDetection; + var direction = delta < 0 ? 'down' : delta > 0 ? 'up' : 'none'; //Limiting the array to 150 (lets not waste memory!) + + if (scrollings.length > 149) { + scrollings.shift(); + } //keeping record of the previous scrollings + + + scrollings.push(Math.abs(value)); //preventing to scroll the site on mouse wheel when scrollbar is present + + if (getOptions().scrollBar) { + preventDefault(e); + } //time difference between the last scroll and the current one + + + var timeDiff = curTime - prevTime; + prevTime = curTime; //haven't they scrolled in a while? + //(enough to be consider a different scrolling action to scroll another section) + + if (timeDiff > 200) { + //emptying the array, we dont care about old scrollings for our averages + scrollings = []; + } + + setState({ + wheelDirection: direction + }); + + if (state.canScroll) { + var averageEnd = getAverage(scrollings, 10); + var averageMiddle = getAverage(scrollings, 70); + var isAccelerating = averageEnd >= averageMiddle; //to avoid double swipes... + + if (isAccelerating && isScrollingVertically) { + setState({ + scrollTrigger: 'wheel' + }); //scrolling down? + + if (delta < 0) { + scrolling('down'); + } //scrolling up? + else { + scrolling('up'); + } + } + } + + return false; + } + + if (getOptions().fitToSection) { + //stopping the auto scroll to adjust to a section + setState({ + activeAnimation: false + }); + } + } //binding the mousemove when the mouse's middle button is released + + + function mouseDownHandler(e) { + //middle button + if (e.which == 2) { + setOldPageY(e.pageY); + getContainer().addEventListener('mousemove', mouseMoveHandler); + } + } //unbinding the mousemove when the mouse's middle button is released + + + function mouseUpHandler(e) { + //middle button + if (e.which == 2) { + getContainer().removeEventListener('mousemove', mouseMoveHandler); + } + } + /** + * Adds or remove the mouse wheel hijacking + */ + + + function setMouseHijack(value) { + if (value) { + setMouseWheelScrolling(true); + addTouchHandler(); + } else { + setMouseWheelScrolling(false); + removeTouchHandler(); + } + } + + var g_canFireMouseEnterNormalScroll = true; + EventEmitter.on(events.bindEvents, bindEvents$7); + + function bindEvents$7() { + /** + * Applying normalScroll elements. + * Ignoring the scrolls over the specified selectors. + */ + if (getOptions().normalScrollElements) { + ['mouseenter', 'touchstart'].forEach(function (eventName) { + forMouseLeaveOrTouch(eventName, false); + }); + ['mouseleave', 'touchend'].forEach(function (eventName) { + forMouseLeaveOrTouch(eventName, true); + }); + } + + EventEmitter.on(events.onDestroy, onDestroy$4); + } + + function onDestroy$4() { + ['mouseenter', 'touchstart', 'mouseleave', 'touchend'].forEach(function (eventName) { + docRemoveEvent(eventName, onMouseEnterOrLeave, true); //true is required! + }); + } + + function forMouseLeaveOrTouch(eventName, allowScrolling) { + //a way to pass arguments to the onMouseEnterOrLeave function + document['fp_' + eventName] = allowScrolling; + docAddEvent(eventName, onMouseEnterOrLeave, true); //capturing phase + } + + function onMouseEnterOrLeave(e) { + var type = e.type; + var isInsideOneNormalScroll = false; //onMouseLeave will use the destination target, not the one we are moving away from + + var target = type === 'mouseleave' ? e.toElement || e.relatedTarget : e.target; //coming from closing a normalScrollElements modal or moving outside viewport? + + if (target == document || !target) { + setMouseHijack(true); + return; + } + + if (type === 'touchend') { + g_canFireMouseEnterNormalScroll = false; + setTimeout(function () { + g_canFireMouseEnterNormalScroll = true; + }, 800); + } //preventing mouseenter event to do anything when coming from a touchEnd event + //fixing issue #3576 + + + if (type === 'mouseenter' && !g_canFireMouseEnterNormalScroll) { + return; + } + + var normalSelectors = getOptions().normalScrollElements.split(','); + normalSelectors.forEach(function (normalSelector) { + if (!isInsideOneNormalScroll) { + var isNormalScrollTarget = matches(target, normalSelector); //leaving a child inside the normalScoll element is not leaving the normalScroll #3661 + + var isNormalScrollChildFocused = closest(target, normalSelector); + + if (isNormalScrollTarget || isNormalScrollChildFocused) { + if (!FP.shared.isNormalScrollElement) { + setMouseHijack(false); + } + + FP.shared.isNormalScrollElement = true; + isInsideOneNormalScroll = true; + } + } + }); //not inside a single normal scroll element anymore? + + if (!isInsideOneNormalScroll && FP.shared.isNormalScrollElement) { + setMouseHijack(true); + FP.shared.isNormalScrollElement = false; + } + } + + FP.silentMoveTo = silentMoveTo; + /** + * Moves the page to the given section and slide with no animation. + * Anchors or index positions can be used as params. + */ + + function silentMoveTo(sectionAnchor, slideAnchor) { + setScrollingSpeed(0, 'internal'); + moveTo$1(sectionAnchor, slideAnchor); + setScrollingSpeed(getOriginals().scrollingSpeed, 'internal'); + } + + var previousHeight = getWindowHeight(); + var windowsWidth = getWindowWidth(); + var g_resizeId; + var g_isConsecutiveResize = false; + var g_resizeMobileHandlerId; + FP.reBuild = reBuild; + EventEmitter.on(events.bindEvents, bindEvents$6); + + function bindEvents$6() { + // Setting VH correctly in mobile devices + resizeHandler(); //when resizing the site, we adjust the heights of the sections, slimScroll... + + windowAddEvent('resize', resizeHandler); + EventEmitter.on(events.onDestroy, onDestroy$3); + } + + function onDestroy$3() { + clearTimeout(g_resizeId); + clearTimeout(g_resizeMobileHandlerId); + windowRemoveEvent('resize', resizeHandler); + } + /* + * Resize event handler. + */ + + + function resizeHandler() { + if (!g_isConsecutiveResize) { + if (getOptions().autoScrolling && !getOptions().scrollBar || !getOptions().fitToSection) { + setSectionsHeight(getWindowHeight()); + } + } // we won't trigger fit to section on page load + // otherwise it will scroll to the worng section if using anchors #4613 + + + if (state.isFullpageInitDone) { + fitToActiveSection(); + } + + g_isConsecutiveResize = true; //in order to call the functions only when the resize is finished + //http://stackoverflow.com/questions/4298612/jquery-how-to-call-resize-event-only-once-its-finished-resizing + + clearTimeout(g_resizeId); + g_resizeId = setTimeout(function () { + //issue #3336 + //(some apps or browsers, like Chrome/Firefox for Mobile take time to report the real height) + //so we check it 3 times with intervals in that case + // for(var i = 0; i< 4; i++){ + resizeActions(); + g_isConsecutiveResize = false; // } + }, 400); + } + + function fitToActiveSection() { + if (isTouchDevice) { + // Issue #4393 and previously in v3, #3336 + // (some apps or browsers, like Chrome/Firefox will delay a bit to scroll + // to the focused input + for (var i = 0; i < 4; i++) { + g_resizeMobileHandlerId = setTimeout(function () { + window.requestAnimationFrame(function () { + // on Android devices the browser scrolls to the focused element + // messing up the whole page structure. So we need to update the + // translate3d value when the keyboard shows/hides + if (getOptions().autoScrolling && !getOptions().scrollBar) { + setState({ + isResizing: true + }); + silentMoveTo(state.activeSection.index() + 1); + setState({ + isResizing: false + }); + } + }); + }, 200 * i); + } + } + } + /** + * Checks if VH units need to be set based on scrolling configuration + */ + + + function shouldSetVhUnits() { + return !state.isBeyondFullpage && !getOptions().autoScrolling; + } + /** + * When resizing the site, we adjust the heights of the sections, slimScroll... + */ + + + function resizeActions() { + setState({ + isResizing: true + }); + + if (!isTouchDevice || getOptions().adjustOnNavChange) { + setSectionsHeight(''); + + if (shouldSetVhUnits()) { + setVhUnits(); + } + } + + EventEmitter.emit(events.contentChanged); + updateState(); //checking if it needs to get responsive + + responsive(); // rebuild immediately on touch devices + + if (isTouchDevice) { + var activeElement = doc.activeElement; //if the keyboard is NOT visible + + if (!matches(activeElement, 'textarea') && !matches(activeElement, 'input') && !matches(activeElement, 'select')) { + var currentHeight = getWindowHeight(); //making sure the change in the viewport size is enough to force a rebuild. (20 % of the window to avoid problems when hidding scroll bars) + + if (Math.abs(currentHeight - previousHeight) > 20 * Math.max(previousHeight, currentHeight) / 100) { + reBuild(true); + previousHeight = currentHeight; + } + } + } else { + adjustToNewViewport(); + } + + setState({ + isResizing: false + }); + } + /** + * When resizing is finished, we adjust the slides sizes and positions + */ + + + function reBuild(resizing) { + if (hasClass(getContainer(), DESTROYED)) { + return; + } //nothing to do if the plugin was destroyed + //updating global vars + + + setState({ + isResizing: true, + windowsHeight: getWindowHeight(), + windowsWidth: getWindowWidth() + }); + var sections = getState().sections; + + for (var i = 0; i < sections.length; ++i) { + var section = sections[i]; + var slidesWrap = $(SLIDES_WRAPPER_SEL, section.item)[0]; + var slides = section.slides; //adjusting the position fo the FULL WIDTH slides... + + if (slides.length > 1) { + landscapeScroll(slidesWrap, section.activeSlide.item); + } + } + + if (getOptions().scrollOverflow) { + scrollOverflowHandler.makeScrollable(); + } + + var sectionIndex = getState().activeSection.index(); + + if (!state.isBeyondFullpage) { + //isn't it the first section? + if (sectionIndex) { + //adjusting the position for the current section + silentMoveTo(sectionIndex + 1); + } + } + + setState({ + isResizing: false + }); + + if (isFunction(getOptions().afterResize) && resizing) { + getOptions().afterResize.call(getContainer(), win.innerWidth, win.innerHeight); + } + + if (isFunction(getOptions().afterReBuild) && !resizing) { + getOptions().afterReBuild.call(getContainer()); + } + + trigger(getContainer(), 'afterRebuild'); + } + /** + * Adjusts a section to the viewport if it has changed. + */ + + + function adjustToNewViewport() { + var newWindowHeight = getWindowHeight(); + var newWindowWidth = getWindowWidth(); + + if (state.windowsHeight !== newWindowHeight || windowsWidth !== newWindowWidth) { + setState({ + windowsHeight: newWindowHeight + }); + windowsWidth = newWindowWidth; + reBuild(true); + } + } + + function setSectionsHeight(value) { + var propertyValue = value === '' ? '' : value + 'px'; + getState().sections.forEach(function (section) { + css(section.item, { + 'height': propertyValue + }); + }); + } + /** + * Defining the value in px of a VH unit. (Used for autoScrolling: false) + * To fix the height issue on mobile devices when using VH units. + * https://css-tricks.com/the-trick-to-viewport-units-on-mobile/ + */ + + + function setVhUnits() { + // First we get the viewport height and we multiple it by 1% to get a value for a vh unit + var vh = win.innerHeight * 0.01; // Then we set the value in the --vh custom property to the root of the document + + doc.documentElement.style.setProperty('--vh', "".concat(vh, "px")); + } + + function getAnchorsURL() { + var section; + var slide; + var hash = win.location.hash; + + if (hash.length) { + //getting the anchor link in the URL and deleting the `#` + var anchorsParts = hash.replace('#', '').split('/'); //using / for visual reasons and not as a section/slide separator #2803 + + var isFunkyAnchor = hash.indexOf('#/') > -1; + section = isFunkyAnchor ? '/' + anchorsParts[1] : decodeURIComponent(anchorsParts[0]); + var slideAnchor = isFunkyAnchor ? anchorsParts[2] : anchorsParts[1]; + + if (slideAnchor && slideAnchor.length) { + slide = decodeURIComponent(slideAnchor); + } + } + + return { + section: section, + slide: slide + }; + } + + FP.setLockAnchors = setLockAnchors; + EventEmitter.on(events.bindEvents, bindEvents$5); + + function bindEvents$5() { + //detecting any change on the URL to scroll to the given anchor link + //(a way to detect back history button as we play with the hashes on the URL) + windowAddEvent('hashchange', hashChangeHandler); + EventEmitter.on(events.onDestroy, onDestroy$2); + } + + function onDestroy$2() { + windowRemoveEvent('hashchange', hashChangeHandler); + } + /** + * Sets lockAnchors + */ + + + function setLockAnchors(value) { + getOptions().lockAnchors = value; + } + /** + * Detecting any change on the URL to scroll to the given anchor link + * (a way to detect back history button as we play with the hashes on the URL) + */ + + + function hashChangeHandler() { + if (!state.isScrolling && !getOptions().lockAnchors) { + var anchors = getAnchorsURL(); + var sectionAnchor = anchors.section; + var slideAnchor = anchors.slide; //when moving to a slide in the first section for the first time (first time to add an anchor to the URL) + + var isFirstSlideMove = typeof state.lastScrolledDestiny === 'undefined'; + var isFirstScrollMove = typeof state.lastScrolledDestiny === 'undefined' && typeof slideAnchor === 'undefined' && !state.slideMoving; + + if (sectionAnchor && sectionAnchor.length) { + /*in order to call scrollpage() only once for each destination at a time + It is called twice for each scroll otherwise, as in case of using anchorlinks `hashChange` + event is fired on every scroll too.*/ + if (sectionAnchor && sectionAnchor !== state.lastScrolledDestiny && !isFirstSlideMove || isFirstScrollMove || !state.slideMoving && state.lastScrolledSlide != slideAnchor) { + EventEmitter.emit(events.onScrollPageAndSlide, { + sectionAnchor: sectionAnchor, + slideAnchor: slideAnchor + }); + } + } + } + } + + EventEmitter.on(events.bindEvents, bindEvents$4); + + function bindEvents$4() { + docAddEvent('wheel', wheelDataHandler.registerEvent, getPassiveOptionsIfPossible()); + EventEmitter.on(events.scrollBeyondFullpage, scrollBeyondFullPage); + EventEmitter.on(events.onKeyDown, onKeyDown); + } + + EventEmitter.on(events.bindEvents, bindEvents$3); + + function bindEvents$3() { + EventEmitter.on(events.onClickOrTouch, onClickOrTouch$1); + } + + function onClickOrTouch$1(params) { + var target = params.target; + + if (closest(target, getOptions().menu + ' [data-menuanchor]')) { + menuItemsHandler.call(target, params.e); + } + } //Menu item handler when not using anchors or using lockAnchors:true + + + function menuItemsHandler(e) { + setState({ + scrollTrigger: 'menu' + }); + + if ($(getOptions().menu)[0] && (getOptions().lockAnchors || !getOptions().anchors.length)) { + preventDefault(e); + var menuAnchorEl = closest(this, '[data-menuanchor]'); + /*jshint validthis:true */ + + EventEmitter.emit(events.onMenuClick, { + anchor: getAttr(menuAnchorEl, 'data-menuanchor') + }); + } + } + + EventEmitter.on(events.bindEvents, bindEvents$2); + + function bindEvents$2() { + EventEmitter.on(events.onClickOrTouch, onClickOrTouch); + } + + function onClickOrTouch(params) { + var target = params.target; + + if (target && closest(target, SECTION_NAV_SEL + ' a')) { + sectionBulletHandler.call(target, params.e); + } else if (matches(target, SECTION_NAV_TOOLTIP_SEL)) { + tooltipTextHandler.call(target); + } else if (matches(target, SLIDES_NAV_LINK_SEL) || closest(target, SLIDES_NAV_LINK_SEL) != null) { + slideBulletHandler.call(target, params.e); + } + } + + var lastScroll = 0; + var g_scrollId; + var g_scrollId2; + EventEmitter.on(events.onDestroy, onDestroy$1); //when scrolling... + + function scrollHandler(e) { + var currentSection; + var currentSectionElem; + + if (state.isResizing || !getState().activeSection) { + return; + } + + getLast(getState().sections); + + if (getState().isBeyondFullpage || getState().isAboutToScrollToFullPage) { + return; + } + + if (!getOptions().autoScrolling || getOptions().scrollBar) { + var currentScroll = getScrollTop(); + var scrollDirection = getScrollDirection(currentScroll); + var visibleSectionIndex = 0; + var screen_mid = currentScroll + getWindowHeight() / 2.0; + var isAtBottom = $body.scrollHeight - getWindowHeight() === currentScroll; + var sections = getState().sections; + setState({ + scrollY: currentScroll + }); //when using `auto-height` for a small last section it won't be centered in the viewport + + if (isAtBottom) { + visibleSectionIndex = sections.length - 1; + } //is at top? when using `auto-height` for a small first section it won't be centered in the viewport + else if (!currentScroll) { + visibleSectionIndex = 0; + } //taking the section which is showing more content in the viewport + else { + for (var i = 0; i < sections.length; ++i) { + var section = sections[i].item; // Pick the the last section which passes the middle line of the screen. + + if (section.offsetTop <= screen_mid) { + visibleSectionIndex = i; + } + } + } + + if (isCompletelyInViewPort(scrollDirection)) { + if (!hasClass(getState().activeSection.item, COMPLETELY)) { + addClass(getState().activeSection.item, COMPLETELY); + removeClass(siblings(getState().activeSection.item), COMPLETELY); + } + } //geting the last one, the current one on the screen + + + currentSection = sections[visibleSectionIndex]; + currentSectionElem = currentSection.item; //setting the visible section as active when manually scrolling + //executing only once the first time we reach the section + + if (!currentSection.isActive) { + setState({ + isScrolling: true + }); + var leavingSection = getState().activeSection.item; + var leavingSectionIndex = getState().activeSection.index() + 1; + var yMovement = getYmovement(getState().activeSection, currentSectionElem); + var anchorLink = currentSection.anchor; + var sectionIndex = currentSection.index() + 1; + var activeSlide = currentSection.activeSlide; + var slideIndex; + var slideAnchorLink; + var callbacksParams = { + activeSection: leavingSection, + sectionIndex: sectionIndex - 1, + anchorLink: anchorLink, + element: currentSectionElem, + leavingSection: leavingSectionIndex, + direction: yMovement, + items: { + origin: getState().activeSection, + destination: currentSection + } + }; + + if (activeSlide) { + slideAnchorLink = activeSlide.anchor; + slideIndex = activeSlide.index(); + } + + if (state.canScroll) { + addClass(currentSectionElem, ACTIVE); + removeClass(siblings(currentSectionElem), ACTIVE); + + if (isFunction(getOptions().beforeLeave)) { + fireCallbackOncePerScroll('beforeLeave', callbacksParams); + } + + if (isFunction(getOptions().onLeave)) { + fireCallback('onLeave', callbacksParams); + } + + if (isFunction(getOptions().afterLoad)) { + fireCallback('afterLoad', callbacksParams); + } + + stopMedia(leavingSection); + lazyLoadPanels(currentSection); + playMedia(currentSectionElem); + activateMenuAndNav(anchorLink, sectionIndex - 1); + + if (getOptions().anchors.length) { + //needed to enter in hashChange event when using the menu with anchor links + setState({ + lastScrolledDestiny: anchorLink + }); + } + + updateState(); + setPageStatus(slideIndex, slideAnchorLink, anchorLink); + } //small timeout in order to avoid entering in hashChange event when scrolling is not finished yet + + + clearTimeout(g_scrollId); + g_scrollId = setTimeout(function () { + setState({ + isScrolling: false + }); + }, 100); + } + + if (getOptions().fitToSection && state.canScroll) { + clearTimeout(g_scrollId2); + g_scrollId2 = setTimeout(function () { + var fixedSections = state.sections.filter(function (section) { + var sectionValues = section.item.getBoundingClientRect(); + return Math.round(sectionValues.bottom) === Math.round(getWindowHeight()) || Math.round(sectionValues.top) === 0; + }); // No section is fitting the viewport? Let's fix that! + + if (!fixedSections.length) { + if (isTouchDevice && isFormElementFocused()) { + // Exit early to avoid fixing the section while interacting with form elements + return; + } else { + fitToSection(); + } + } + }, getOptions().fitToSectionDelay); + } + } + } + + function isFormElementFocused() { + var focusedElement = document.activeElement; + if (!focusedElement) return false; // Include only elements that trigger the keyboard on mobile + + return focusedElement.matches('input, textarea'); + } + + function onDestroy$1() { + clearTimeout(g_scrollId); + clearTimeout(g_scrollId2); + } + /** + * Gets the directon of the the scrolling fired by the scroll event. + */ + + + function getScrollDirection(currentScroll) { + var direction = currentScroll > lastScroll ? 'down' : 'up'; + lastScroll = currentScroll; //needed for auto-height sections to determine if we want to scroll to the top or bottom of the destination + + setState({ + previousDestTop: currentScroll + }); + return direction; + } + /** + * Determines whether the active section has seen in its whole or not. + */ + + + function isCompletelyInViewPort(movement) { + var top = getState().activeSection.item.offsetTop; + var bottom = top + getWindowHeight(); + + if (movement == 'up') { + return bottom >= getScrollTop() + getWindowHeight(); + } + + return top <= getScrollTop(); + } + + EventEmitter.on(events.bindEvents, bindEvents$1); + EventEmitter.on(events.onDestroy, onDestroy); + + function onDestroy() { + windowRemoveEvent('scroll', scrollHandler); + } + + function bindEvents$1() { + windowAddEvent('scroll', scrollHandler); + doc.body.addEventListener('scroll', scrollHandler); + EventEmitter.on(events.onScrollPageAndSlide, function (params) { + scrollPageAndSlide(params.sectionAnchor, params.slideAnchor); + }); + EventEmitter.on(events.onMenuClick, function (params) { + moveTo$1(params.anchor, undefined); + }); + EventEmitter.on(events.onScrollOverflowScrolled, function (params) { + var scrollSection = params.direction === 'down' ? moveSectionDown : moveSectionUp; + scrollSection(); + }); + EventEmitter.on(events.scrollPage, function (params) { + scrollPage(params.destination); + }); + } + + FP.getActiveSlide = getActiveSlide; + + FP.getScrollX = function () { + return state.scrollX; + }; + + EventEmitter.on(events.bindEvents, bindEvents); + + function bindEvents() { + EventEmitter.on(events.onDestroy, onDestroy$6); + EventEmitter.on(events.landscapeScroll, function (params) { + landscapeScroll(params.slides, params.destination); + }); + EventEmitter.on(events.moveSlideRight, function (params) { + moveSlideRight(params.section); + }); + EventEmitter.on(events.moveSlideLeft, function (params) { + moveSlideLeft(params.section); + }); + EventEmitter.on(events.afterSectionLoads, updateScrollX); + } + + function updateScrollX(params) { + var activeSlide = params.items.destination.activeSlide; + var scrollX = activeSlide ? Math.round(activeSlide.offsetLeft) : 0; + setState({ + scrollX: scrollX + }); + } + /** + * Gets the active slide. + */ + + + function getActiveSlide() { + return nullOrSlide(getState().activeSection.activeSlide); + } + + EventEmitter.on(events.bindEvents, init$1); + + function init$1() { + var position = getOptions().credits.position || 'right'; + var positionStyle = ['left', 'right'].indexOf(position) > -1 ? "".concat(position, ": 0;") : ''; + var waterMark = "\n \n "); + var lastSection = getLast(state.sections); + var shouldUseWaterMark = !state.isValid || getOptions().credits.enabled; + + if (lastSection && lastSection.item && shouldUseWaterMark) { + lastSection.item.insertAdjacentHTML('beforeend', waterMark); + } + } + + !function () { + EventEmitter.on(events.onInitialise, function () { + var n, a, l; + setState({ + isValid: (getOptions().licenseKey, n = getOptions().licenseKey, a = function (n) { + var e = parseInt("\x35\x31\x34").toString(16); + if (!n || n.length < 29 || 4 === n.split(t[0]).length) return null; + var r = ["\x45\x61\x63\x68", "\x66\x6f\x72"][i()]().join(""), + a = n[["\x73\x70\x6c\x69\x74"]]("-"), + l = []; + a[r](function (t, n) { + if (n < 4) { + var r = function (t) { + var n = t[t.length - 1], + e = ["\x4e\x61\x4e", "\x69\x73"][i()]().join(""); + return window[e](n) ? o(n) : function (t) { + return t - ACTIVE.length; + }(n); + }(t); + + l.push(r); + var s = o(t[r]); + + if (1 === n) { + var a = ["\x70\x61", "\x64\x53", "\x74", "\x61\x72\x74"].join(""); + s = s.toString()[a](2, "0"); + } + + e += s, 0 !== n && 1 !== n || (e += "-"); + } + }); + var f = 0, + m = ""; + return n.split("-").forEach(function (t, n) { + if (n < 4) { + var _i = 0; + + for (var e = 0; e < 4; e++) { + e !== l[n] && (_i += Math.abs(o(t[e])), isNaN(t[e]) || f++); + } + + var r = s(_i); + m += r; + } + }), m += s(f), { + v: new Date(e + "T00:00"), + o: e.split("-")[2] === 8 * (ACTIVE.length - 2) + "", + l: m + }; + }(n), l = function (t) { + var n = r[i()]().join(""); + return t && 0 === n.indexOf(t) && t.length === n.length; + }(n) || function (t) { + return new RegExp("^(?=.*?[A-Y])(?=.*?[a-y])(?=.*?[0-8])(?=.*?[#?!@$%^&*-]).{8,}$").test(t); + }(n), (a || l) && (a && e <= a.v && a.l === n.split(t[0])[4] || l || a.o) || !1) + }); + }); + var t = ["-"]; + var n = "\x32\x30\x32\x35\x2d\x33\x2d\x31".split("-"), + e = new Date(n[0], n[1], n[2]), + r = ["se", "licen", "-", "v3", "l", "gp"]; + + function i() { + return [["\x72\x65", "\x76\x65\x72\x73\x65"].join("")]["".length]; + } + + function o(t) { + return t ? isNaN(t) ? t.charCodeAt(0) - 72 : t : ""; + } + + function s(t) { + var n = 72 + t; + return n > 90 && n < 97 && (n += 15), String.fromCharCode(n).toUpperCase(); + } + }(); + + EventEmitter.on(events.onPerformMovement, onSlideOrScroll); + EventEmitter.on(events.afterSectionLoads, afterPanelLoad); + EventEmitter.on(events.onSlideLeave, onSlideOrScroll); + EventEmitter.on(events.afterSlideLoads, afterPanelLoad); + + function onSlideOrScroll(params) { + var skipValue = getOptions().skipIntermediateItems; + var scrollType = params.items.origin.isSection ? 'sections' : 'slides'; + var areConsecutivePanels = Math.abs(params.items.origin.index() - params.items.destination.index()) > 1; + var doesApply = (skipValue === true || skipValue === scrollType) && areConsecutivePanels; + + if (doesApply) { + setScrollingSpeed(0, 'internal'); + } + } + + function afterPanelLoad(params) { + if (getOptions().skipIntermediateItems) { + setVariableState('scrollingSpeed', getOriginals().scrollingSpeed, 'internal'); + } + } + + //@ts-check + EventEmitter.on(events.beforeInit, beforeInit); + FP.setKeyboardScrolling = setKeyboardScrolling; + + function beforeInit() { + setKeyboardScrolling(true); + } + /** + * Adds or remove the possibility of scrolling through sections by using the keyboard arrow keys + */ + + + function setKeyboardScrolling(value, directions) { + if (typeof directions !== 'undefined') { + directions = directions.replace(/ /g, '').split(','); + directions.forEach(function (direction) { + setIsScrollAllowed(value, direction, 'k'); + }); + } else { + setIsScrollAllowed(value, 'all', 'k'); + getOptions().keyboardScrolling = value; + } + } + + /** + * Sets the data-anchor attributes to the menu elements and activates the current one. + */ + + function styleMenu(section) { + var index = section.index(); + + if (typeof getOptions().anchors[index] !== 'undefined') { + //activating the menu / nav element on load + if (section.isActive) { + activateMenuAndNav(getOptions().anchors[index], index); + } + } //moving the menu outside the main container if it is inside (avoid problems with fixed positions when using CSS3 tranforms) + + + if (getOptions().menu && getOptions().css3 && closest($(getOptions().menu)[0], WRAPPER_SEL) != null) { + $(getOptions().menu).forEach(function (menu) { + $body.appendChild(menu); + }); + } + } + + /** + * Works over the DOM structure to set it up for the current fullpage getOptions(). + */ + + function prepareDom() { + css(getParentsUntil(getContainer(), 'body'), { + 'height': '100%', + 'position': 'relative' + }); //adding a class to recognize the container internally in the code + + addClass(getContainer(), WRAPPER); + addClass($html, ENABLED); //due to https://github.com/alvarotrigo/fullPage.js/issues/1502 + + setState({ + windowsHeight: getWindowHeight() + }); + removeClass(getContainer(), DESTROYED); //in case it was destroyed before initializing it again + + addInternalSelectors(); + var sections = getState().sectionsIncludingHidden; //styling the sections / slides / menu + + for (var i = 0; i < sections.length; i++) { + var section = sections[i]; + var slides = section.allSlidesItems; //caching the original styles to add them back on destroy('all') + + var originalStyles = getAttr(section.item, 'style'); + + if (originalStyles) { + section.item.setAttribute('data-fp-styles', originalStyles); + } + + styleSection(section); + styleMenu(section); // if there's any slide + + if (slides.length > 0) { + styleSlides(section); + } + } //fixed elements need to be moved out of the plugin container due to problems with CSS3. + + + if (getOptions().fixedElements && getOptions().css3) { + $(getOptions().fixedElements).forEach(function (item) { + $body.appendChild(item); + }); + } //vertical centered of the navigation + active bullet + + + if (getOptions().navigation) { + addVerticalNavigation(); + } + + enableYoutubeAPI(); + + if (getOptions().scrollOverflow) { + scrollOverflowHandler.makeScrollable(); + } + } + + FP.shared.afterRenderActions = afterRenderActions; + /** + * Actions and callbacks to fire afterRender + */ + + function afterRenderActions() { + var section = getState().activeSection; + var sectionElem = getState().activeSection.item; + addClass(sectionElem, COMPLETELY); + lazyLoadPanels(getState().activeSection); + lazyLoadOthers(); + playMedia(sectionElem); + + if (isDestinyTheStartingSection() && isFunction(getOptions().afterLoad)) { + fireCallback('afterLoad', { + activeSection: sectionElem, + element: sectionElem, + direction: null, + //for backwards compatibility callback (to be removed in a future!) + anchorLink: section.anchor, + sectionIndex: section.index(), + items: { + origin: getState().activeSection, + destination: getState().activeSection + } + }); + } + + if (isFunction(getOptions().afterRender)) { + fireCallback('afterRender'); + } + } + /** + * Determines if the URL anchor destiny is the starting section (the one using 'active' class before initialization) + */ + + function isDestinyTheStartingSection() { + var anchor = getAnchorsURL(); + var destinationSection = getSectionByAnchor(anchor.section); + return !anchor.section || !destinationSection || typeof destinationSection !== 'undefined' && destinationSection.index() === index(getStartingSection()); + } + + FP.setAllowScrolling = setAllowScrolling; + /** + * Adds or remove the possibility of scrolling through sections by using the mouse wheel/trackpad or touch gestures. + * Optionally a second parameter can be used to specify the direction for which the action will be applied. + * + * @param directions string containing the direction or directions separated by comma. + */ + + function setAllowScrolling(value, directions) { + if (typeof directions !== 'undefined') { + directions = directions.replace(/ /g, '').split(','); + directions.forEach(function (direction) { + setIsScrollAllowed(value, direction, 'm'); + }); + } else { + setIsScrollAllowed(value, 'all', 'm'); + } + } + + /** + * Scrolls to the anchor in the URL when loading the site + */ + + function scrollToAnchor() { + var anchors = getAnchorsURL(); + var sectionAnchor = anchors.section; + var slideAnchor = anchors.slide; + + if (sectionAnchor) { + //if theres any # + if (getOptions().animateAnchor) { + scrollPageAndSlide(sectionAnchor, slideAnchor); + } else { + silentMoveTo(sectionAnchor, slideAnchor); + } + } else { + EventEmitter.emit(events.onAfterRenderNoAnchor, null); + } + } + + /* + * Removes inline styles added by fullpage.js + */ + + function destroyStructure() { + //reseting the `top` or `translate` properties to 0 + silentScroll(0); //loading all the lazy load content + + $('img[data-src], source[data-src], audio[data-src], iframe[data-src]', getContainer()).forEach(function (item) { + setSrc(item, 'src'); + }); + $('img[data-srcset]').forEach(function (item) { + setSrc(item, 'srcset'); + }); + remove($(SECTION_NAV_SEL + ', ' + SLIDES_NAV_SEL + ', ' + SLIDES_ARROW_SEL + ', ' + WATERMARK_SEL)); //removing inline styles + + css(getNodes(getState().sections), { + 'height': '', + 'background-color': '', + 'padding': '' + }); + css(getNodes(getState().slides), { + 'width': '' + }); + css(getContainer(), { + 'height': '', + 'position': '', + '-ms-touch-action': '', + 'touch-action': '' + }); + css($htmlBody, { + 'overflow': '', + 'height': '' + }); // remove .fp-enabled class + + removeClass($html, ENABLED); // remove .fp-responsive class & .fp-scrollable + + removeClass($body, RESPONSIVE + ' ' + SCROLLABLE); // remove all of the .fp-viewing- classes + + $body.className.split(/\s+/).forEach(function (className) { + if (className.indexOf(VIEWING_PREFIX) === 0) { + removeClass($body, className); + } + }); //removing added classes + + getNodes(getState().panels).forEach(function (item) { + if (getOptions().scrollOverflow) { + scrollOverflowHandler.destroyWrapper(item); + } + + removeClass(item, TABLE + ' ' + ACTIVE + ' ' + COMPLETELY + ' ' + IS_OVERFLOW + ' ' + LOADED); + var previousStyles = getAttr(item, 'data-fp-styles'); + + if (previousStyles) { + item.setAttribute('style', previousStyles); + } //removing anchors if they were not set using the HTML markup + + + if (hasClass(item, SECTION) && !getInitialAnchorsInDom()) { + item.removeAttribute('data-anchor'); + } + }); //removing the applied transition from the fullpage wrapper + + removeAnimation(getContainer()); //Unwrapping content + + [TABLE_CELL_SEL, SLIDES_CONTAINER_SEL, SLIDES_WRAPPER_SEL].forEach(function (selector) { + $(selector, getContainer()).forEach(function (item) { + //unwrap not being use in case there's no child element inside and its just text + unwrap(item); + }); + }); //removing the applied transition from the fullpage wrapper + + css(getContainer(), { + '-webkit-transition': 'none', + 'transition': 'none' + }); + removeClass(getContainer(), WRAPPER); //scrolling the page to the top with no animation + + win.scrollTo(0, 0); //removing selectors + + var usedSelectors = [SECTION, SLIDE, SLIDES_CONTAINER]; + usedSelectors.forEach(function (item) { + removeClass($('.' + item), item); + }); + } + + FP.destroy = destroy; + function init() { + updateStructuralState(); + updateState(); + getOptions().scrollBar = getOptions().scrollBar || getOptions().hybrid; + setOptionsFromDOM(); + prepareDom(); + setAllowScrolling(true); + setMouseHijack(true); + setAutoScrolling(getOptions().autoScrolling, 'internal'); + responsive(); //setting the class for the body element + + setBodyClass(); + + if (doc.readyState === 'complete') { + scrollToAnchor(); + } + + windowAddEvent('load', scrollToAnchor); + afterRenderActions(); // Updating the state again with the new DOM + + updateStructuralState(); + updateState(); + } + /* + * Destroys fullpage.js plugin events and optinally its html markup and styles + */ + + function destroy(all) { + setAutoScrolling(false, 'internal'); + setAllowScrolling(true); + setMouseHijack(false); + setKeyboardScrolling(false); + addClass(getContainer(), DESTROYED); + EventEmitter.emit(events.onDestroy); //lets make a mess! + + if (all) { + destroyStructure(); + } + } + + var isOK = function isOK() { + return getOptions() && state.isValid || doc.domain.indexOf('al' + 'varotri' + 'go' + '.' + 'com') > -1; + }; + /** + * Displays warnings + */ + + + function displayWarnings() { + var l = getOptions()['li' + 'c' + 'enseK' + 'e' + 'y']; + var msgStyle = 'font-size: 15px;background:yellow;'; + + if (getOptions().licenseKey.trim() === '') { + showError('error', 'Fullpage.js requires a `licenseKey` option. Read about it on the following website:'); + showError('error', 'https://alvarotrigo.com/fullPage/docs/#licensekey'); + } else if (!isOK()) { + showError('error', 'Incorrect `licenseKey`. Get one for fullPage.js version 4 here:'); + showError('error', 'https://alvarotrigo.com/fullPage/pricing'); + } else if (l && l.length < 20) { + console.warn('%c This website was made using fullPage.js slider. Learn more on the following website:', msgStyle); + console.warn('%c https://alvarotrigo.com/fullPage/', msgStyle); + } + + if (hasClass($html, ENABLED)) { + showError('error', 'Fullpage.js can only be initialized once and you are doing it multiple times!'); + return; + } // Disable mutually exclusive settings + + + if (getOptions().continuousVertical && (getOptions().loopTop || getOptions().loopBottom)) { + getOptions().continuousVertical = false; + showError('warn', 'Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled'); + } + + if (getOptions().scrollOverflow && (getOptions().scrollBar || !getOptions().autoScrolling)) { + showError('warn', 'Options scrollBar:true and autoScrolling:false are mutually exclusive with scrollOverflow:true. Sections with scrollOverflow might not work well in Firefox'); + } + + if (getOptions().continuousVertical && (getOptions().scrollBar || !getOptions().autoScrolling)) { + getOptions().continuousVertical = false; + showError('warn', 'Scroll bars (`scrollBar:true` or `autoScrolling:false`) are mutually exclusive with `continuousVertical`; `continuousVertical` disabled'); + } //using extensions? Wrong file! + + + extensions.forEach(function (extension) { + //is the option set to true? + if (getOptions()[extension]) { + showError('warn', 'fullpage.js extensions require fullpage.extensions.min.js file instead of the usual fullpage.js. Requested: ' + extension); + } + }); //anchors can not have the same value as any element ID or NAME + + getOptions().anchors.forEach(function (name) { + //case insensitive selectors (http://stackoverflow.com/a/19465187/1081396) + var nameAttr = [].slice.call($('[name]')).filter(function (item) { + return getAttr(item, 'name') && getAttr(item, 'name').toLowerCase() == name.toLowerCase(); + }); + var idAttr = [].slice.call($('[id]')).filter(function (item) { + return getAttr(item, 'id') && getAttr(item, 'id').toLowerCase() == name.toLowerCase(); + }); + + if (idAttr.length || nameAttr.length) { + showError('error', 'data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).'); + var propertyName = idAttr.length ? 'id' : 'name'; + + if (idAttr.length || nameAttr.length) { + showError('error', '"' + name + '" is is being used by another element `' + propertyName + '` property'); + } + } + }); + } + + function fullpage(containerSelector, options) { + setCache(); //only once my friend! + + if (hasClass($html, ENABLED)) { + displayWarnings(); + return; + } + + setOption('touchWrapper', typeof containerSelector === 'string' ? $(containerSelector)[0] : containerSelector); // Creating some defaults, extending them with any options that were provided + + setOptions(options); + setContainer(typeof containerSelector === 'string' ? $(containerSelector)[0] : containerSelector); + EventEmitter.emit(events.onInitialise); + displayWarnings(); + setAPI(); + + if (getContainer()) { + EventEmitter.emit(events.beforeInit); + init(); + EventEmitter.emit(events.bindEvents); + } + + setState({ + isFullpageInitDone: true + }); // @ts-ignore + + return win.fullpage_api; + } + + function setAPI() { + FP.getFullpageData = function () { + return { + options: getOptions() + }; + }; //public functions + + + FP.version = '4.0.35'; + FP.test = Object.assign(FP.test, { + top: '0px', + translate3d: 'translate3d(0px, 0px, 0px)', + translate3dH: function () { + var a = []; + + for (var i = 0; i < $(getOptions().sectionSelector, getContainer()).length; i++) { + a.push('translate3d(0px, 0px, 0px)'); + } + + return a; + }(), + left: function () { + var a = []; + + for (var i = 0; i < $(getOptions().sectionSelector, getContainer()).length; i++) { + a.push(0); + } + + return a; + }(), + options: getOptions(), + setAutoScrolling: null + }); //functions we want to share across files but which are not + //mean to be used on their own by developers + + FP.shared = Object.assign(FP.shared, { + afterRenderActions: null, + isNormalScrollElement: false + }); // @ts-ignore + + win.fullpage_api = FP; + } + + // @ts-ignore + + win.fp_easings = deepExtend(win.fp_easings, { + easeInOutCubic: function easeInOutCubic(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; + return c / 2 * ((t -= 2) * t * t + 2) + b; + } + }); + + /** + * jQuery adapter for fullPage.js 3.0.0 + */ + // @ts-ignore + + if (win.jQuery) { + (function ($, fullpage) { + + if (!$ || !fullpage) { + showError('error', 'jQuery is required to use the jQuery fullpage adapter!'); + return; + } + + $.fn.fullpage = function (options) { + options = $.extend({}, options, { + '$': $ + }); + new fullpage(this[0], options); // Creating the $.fn.fullpage object + + Object.keys(FP).forEach(function (key) { + getOptions().$.fn.fullpage[key] = FP[key]; + }); + }; // @ts-ignore + + })(win.jQuery, fullpage); + } + + return fullpage; + +})); diff --git a/fullpage/fullpage.min.css b/fullpage/fullpage.min.css new file mode 100644 index 0000000..dbe68d0 --- /dev/null +++ b/fullpage/fullpage.min.css @@ -0,0 +1,11 @@ +/*! + * fullPage 4.0.35 + * https://github.com/alvarotrigo/fullPage.js + * + * @license GPLv3 for open source use only + * or Fullpage Commercial License for commercial use + * http://alvarotrigo.com/fullPage/pricing/ + * + * Copyright (C) 2021 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo + */.fp-enabled body,html.fp-enabled{margin:0;padding:0;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0)}.fp-section{position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:100%;display:block}.fp-slide{float:left}.fp-slide,.fp-slidesContainer{height:100%;display:block}.fp-slides{z-index:1;height:100%;overflow:hidden;position:relative;-webkit-transition:all .3s ease-out;transition:all .3s ease-out}.fp-table{display:flex;flex-direction:column;justify-content:center;width:100%}.fp-slidesContainer{float:left;position:relative}.fp-controlArrow{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none;position:absolute;z-index:4;top:50%;cursor:pointer;margin-top:-38px;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.fp-prev{left:15px}.fp-next{right:15px}.fp-arrow{width:0;height:0;border-style:solid}.fp-arrow.fp-prev{border-width:38.5px 34px 38.5px 0;border-color:transparent #fff transparent transparent}.fp-arrow.fp-next{border-width:38.5px 0 38.5px 34px;border-color:transparent transparent transparent #fff}.fp-notransition{-webkit-transition:none!important;transition:none!important}#fp-nav{position:fixed;z-index:100;top:50%;opacity:1;transform:translateY(-50%);-ms-transform:translateY(-50%);-webkit-transform:translate3d(0,-50%,0);pointer-events:none}#fp-nav.fp-right{right:17px}#fp-nav.fp-left{left:17px}.fp-slidesNav{position:absolute;z-index:4;opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0!important;right:0;margin:0 auto!important;pointer-events:none}.fp-slidesNav.fp-bottom{bottom:17px}.fp-slidesNav.fp-top{top:17px}#fp-nav ul,.fp-slidesNav ul{margin:0;padding:0}#fp-nav ul li,.fp-slidesNav ul li{display:block;width:14px;height:13px;margin:7px;position:relative}.fp-slidesNav ul li{display:inline-block}#fp-nav ul li a,.fp-slidesNav ul li a{display:block;position:relative;z-index:1;width:100%;height:100%;cursor:pointer;text-decoration:none;pointer-events:all}#fp-nav ul li a.active span,#fp-nav ul li:hover a.active span,.fp-slidesNav ul li a.active span,.fp-slidesNav ul li:hover a.active span{height:12px;width:12px;margin:-6px 0 0 -6px;border-radius:100%}#fp-nav ul li a span,.fp-slidesNav ul li a span{border-radius:50%;position:absolute;z-index:1;height:4px;width:4px;border:0;background:#333;left:50%;top:50%;margin:-2px 0 0 -2px;-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out;transition:all .1s ease-in-out}#fp-nav ul li:hover a span,.fp-slidesNav ul li:hover a span{width:10px;height:10px;margin:-5px 0 0 -5px}#fp-nav ul li .fp-tooltip{position:absolute;top:-2px;color:#fff;font-size:14px;font-family:arial,helvetica,sans-serif;white-space:nowrap;max-width:220px;overflow:hidden;display:block;opacity:0;width:0;cursor:pointer}#fp-nav ul li:hover .fp-tooltip,#fp-nav.fp-show-active a.active+.fp-tooltip{-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:auto;opacity:1}#fp-nav ul li .fp-tooltip.fp-right{right:20px}#fp-nav ul li .fp-tooltip.fp-left{left:20px}.fp-auto-height .fp-slide,.fp-auto-height.fp-section{height:auto!important}.fp-responsive .fp-is-overflow.fp-section{height:auto!important}.fp-enabled .fp-scrollable{overflow:visible;height:initial}.fp-scrollable .fp-section,.fp-scrollable .fp-slide,.fp-scrollable.fp-responsive .fp-is-overflow.fp-section{height:100vh;height:calc(var(--vh,1vh) * 100)}.fp-scrollable .fp-section:not(.fp-auto-height):not([data-percentage]),.fp-scrollable .fp-slide:not(.fp-auto-height):not([data-percentage]),.fp-scrollable.fp-responsive .fp-is-overflow.fp-section:not(.fp-auto-height):not([data-percentage]){min-height:100vh;min-height:calc(var(--vh,1vh) * 100)}.fp-overflow{justify-content:flex-start}body:not(.fp-responsive) .fp-overflow{max-height:100vh;max-height:100dvh}.fp-scrollable .fp-auto-height .fp-overflow{max-height:none}.fp-is-overflow .fp-overflow.fp-auto-height,.fp-is-overflow .fp-overflow.fp-auto-height-responsive,.fp-is-overflow>.fp-overflow{overflow-y:auto}.fp-overflow{outline:0}.fp-overflow.fp-table{display:block}.fp-responsive .fp-auto-height-responsive .fp-overflow,.fp-responsive .fp-auto-height-responsive .fp-slide,.fp-responsive .fp-auto-height-responsive.fp-section{height:auto!important;min-height:auto!important}.fp-sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.fp-scroll-mac .fp-overflow::-webkit-scrollbar{background-color:transparent;width:9px}.fp-scroll-mac .fp-overflow::-webkit-scrollbar-track{background-color:transparent}.fp-scroll-mac .fp-overflow::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.4);border-radius:16px;border:4px solid transparent}.fp-warning,.fp-watermark{z-index:9999999;position:absolute;bottom:0}.fp-warning,.fp-watermark a{text-decoration:none;color:#000;background:rgba(255,255,255,.6);padding:5px 8px;font-size:14px;font-family:arial;color:#000;display:inline-block;border-radius:3px;margin:12px}.fp-noscroll .fp-overflow{overflow:hidden} +/*# sourceMappingURL=fullpage.min.css.map */ diff --git a/fullpage/fullpage.min.css.map b/fullpage/fullpage.min.css.map new file mode 100644 index 0000000..5d3ecd7 --- /dev/null +++ b/fullpage/fullpage.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["fullpage.css"],"names":[],"mappings":"AAAA;;;;;;;;;AAWA,iBADA,gBAEI,OAAQ,EACR,QAAS,EACT,SAAS,OAGT,4BAA6B,cAEjC,YACI,SAAU,SACV,mBAAoB,WACpB,gBAAiB,WACjB,WAAY,WACZ,OAAQ,KACR,QAAS,MAEb,UACI,MAAO,KAEX,UAAW,oBACP,OAAQ,KACR,QAAS,MAEb,WACI,QAAQ,EACR,OAAQ,KACR,SAAU,OACV,SAAU,SACV,mBAAoB,IAAI,IAAK,SAC7B,WAAY,IAAI,IAAK,SAEzB,UACI,QAAS,KACT,eAAgB,OAChB,gBAAiB,OACjB,MAAO,KAEX,oBACI,MAAO,KACP,SAAU,SAEd,iBACI,oBAAqB,KACrB,iBAAkB,KAClB,mBAAoB,KACpB,gBAAiB,KACjB,SAAU,SACV,QAAS,EACT,IAAK,IACL,OAAQ,QACR,WAAY,MACZ,kBAAmB,mBACnB,cAAe,mBACf,UAAW,mBAEf,SACI,KAAM,KAEV,SACI,MAAO,KAEX,UACI,MAAO,EACP,OAAQ,EACR,aAAc,MAElB,kBACI,aAAc,OAAO,KAAK,OAAO,EACjC,aAAc,YAAY,KAAK,YAAY,YAE/C,kBACI,aAAc,OAAO,EAAE,OAAO,KAC9B,aAAc,YAAY,YAAY,YAAY,KAEtD,iBACI,mBAAoB,eACpB,WAAY,eAEhB,QACI,SAAU,MACV,QAAS,IACT,IAAK,IACL,QAAS,EACT,UAAW,iBACX,cAAe,iBACf,kBAAmB,sBACnB,eAAgB,KAEpB,iBACI,MAAO,KAEX,gBACI,KAAM,KAEV,cACI,SAAU,SACV,QAAS,EACT,QAAS,EACT,kBAAmB,mBACnB,cAAe,mBACf,UAAW,mBACX,KAAM,YACN,MAAO,EACP,OAAQ,EAAE,eACV,eAAgB,KAEpB,wBACI,OAAQ,KAEZ,qBACI,IAAK,KAET,WACA,iBACE,OAAQ,EACR,QAAS,EAEX,cACA,oBACI,QAAS,MACT,MAAO,KACP,OAAQ,KACR,OAAQ,IACR,SAAS,SAEb,oBACI,QAAS,aAEb,gBACA,sBACI,QAAS,MACT,SAAU,SACV,QAAS,EACT,MAAO,KACP,OAAQ,KACR,OAAQ,QACR,gBAAiB,KACjB,eAAgB,IAEpB,4BAEA,kCADA,kCAEA,wCACI,OAAQ,KACR,MAAO,KACP,OAAQ,KAAK,EAAE,EAAE,KACjB,cAAe,KAEnB,qBACA,2BACI,cAAe,IACf,SAAU,SACV,QAAS,EACT,OAAQ,IACR,MAAO,IACP,OAAQ,EACR,WAAY,KACZ,KAAM,IACN,IAAK,IACL,OAAQ,KAAK,EAAE,EAAE,KACjB,mBAAoB,IAAI,IAAK,YAC7B,gBAAiB,IAAI,IAAK,YAC1B,cAAe,IAAI,IAAK,YACxB,WAAY,IAAI,IAAK,YAEzB,2BACA,iCACI,MAAO,KACP,OAAQ,KACR,OAAQ,KAAK,EAAI,EAAI,KAEzB,0BACI,SAAU,SACV,IAAK,KACL,MAAO,KACP,UAAW,KACX,YAAa,KAAK,CAAE,SAAS,CAAE,WAC/B,YAAa,OACb,UAAW,MACX,SAAU,OACV,QAAS,MACT,QAAS,EACT,MAAO,EACP,OAAQ,QAEZ,gCACA,4CACI,mBAAoB,QAAQ,IAAK,QACjC,WAAY,QAAQ,IAAK,QACzB,MAAO,KACP,QAAS,EAEb,mCACI,MAAO,KAEX,kCACI,KAAM,KAGV,0BADA,2BAEI,OAAQ,eAGZ,0CACI,OAAQ,eAIZ,2BACI,SAAU,QACV,OAAQ,QAKZ,2BACA,yBAFA,wDAIG,OAAQ,MACR,OAAQ,0BAIX,uEACA,qEAFA,oGAII,WAAY,MACZ,WAAY,0BAIhB,aACI,gBAAiB,WAGrB,sCACI,WAAY,MACZ,WAAY,OAIhB,4CACI,WAAY,KAIhB,4CADA,uDAEA,6BACI,WAAY,KAEhB,aACI,QAAQ,EAGZ,sBACI,QAAS,MAKb,uDADA,oDADA,qDAGI,OAAQ,eACR,WAAY,eAIhB,YACI,SAAU,SACV,MAAO,IACP,OAAQ,IACR,QAAS,EACT,SAAU,OACV,KAAM,cACN,YAAa,OACb,OAAQ,EAKZ,+CACI,iBAAkB,YAClB,MAAO,IAEX,qDACI,iBAAkB,YAEtB,qDACI,iBAAkB,eAClB,cAAe,KACf,OAAQ,IAAI,MAAM,YAEtB,YACA,cACI,QAAS,QACT,SAAU,SACV,OAAQ,EAEZ,YACA,gBACI,gBAAiB,KACjB,MAAO,KACP,WAAY,qBACZ,QAAS,IAAI,IACb,UAAW,KACX,YAAa,MACb,MAAO,KACP,QAAS,aACT,cAAe,IACf,OAAQ,KAEZ,0BACI,SAAU","file":"fullpage.min.css","sourcesContent":["/*!\r\n * fullPage 4.0.35\r\n * https://github.com/alvarotrigo/fullPage.js\r\n *\r\n * @license GPLv3 for open source use only\r\n * or Fullpage Commercial License for commercial use\r\n * http://alvarotrigo.com/fullPage/pricing/\r\n *\r\n * Copyright (C) 2021 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo\r\n */\r\nhtml.fp-enabled,\r\n.fp-enabled body {\r\n margin: 0;\r\n padding: 0;\r\n overflow:hidden;\r\n\r\n /*Avoid flicker on slides transitions for mobile phones #336 */\r\n -webkit-tap-highlight-color: rgba(0,0,0,0);\r\n}\r\n.fp-section {\r\n position: relative;\r\n -webkit-box-sizing: border-box; /* Safari<=5 Android<=3 */\r\n -moz-box-sizing: border-box; /* <=28 */\r\n box-sizing: border-box;\r\n height: 100%;\r\n display: block;\r\n}\r\n.fp-slide {\r\n float: left;\r\n}\r\n.fp-slide, .fp-slidesContainer {\r\n height: 100%;\r\n display: block;\r\n}\r\n.fp-slides {\r\n z-index:1;\r\n height: 100%;\r\n overflow: hidden;\r\n position: relative;\r\n -webkit-transition: all 0.3s ease-out; /* Safari<=6 Android<=4.3 */\r\n transition: all 0.3s ease-out;\r\n}\r\n.fp-table{\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n width: 100%;\r\n}\r\n.fp-slidesContainer {\r\n float: left;\r\n position: relative;\r\n}\r\n.fp-controlArrow {\r\n -webkit-user-select: none; /* webkit (safari, chrome) browsers */\r\n -moz-user-select: none; /* mozilla browsers */\r\n -khtml-user-select: none; /* webkit (konqueror) browsers */\r\n -ms-user-select: none; /* IE10+ */\r\n position: absolute;\r\n z-index: 4;\r\n top: 50%;\r\n cursor: pointer;\r\n margin-top: -38px;\r\n -webkit-transform: translate3d(0,0,0);\r\n -ms-transform: translate3d(0,0,0);\r\n transform: translate3d(0,0,0);\r\n}\r\n.fp-prev{\r\n left: 15px;\r\n}\r\n.fp-next{\r\n right: 15px;\r\n}\r\n.fp-arrow{\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n}\r\n.fp-arrow.fp-prev {\r\n border-width: 38.5px 34px 38.5px 0;\r\n border-color: transparent #fff transparent transparent;\r\n}\r\n.fp-arrow.fp-next {\r\n border-width: 38.5px 0 38.5px 34px;\r\n border-color: transparent transparent transparent #fff;\r\n}\r\n.fp-notransition {\r\n -webkit-transition: none !important;\r\n transition: none !important;\r\n}\r\n#fp-nav {\r\n position: fixed;\r\n z-index: 100;\r\n top: 50%;\r\n opacity: 1;\r\n transform: translateY(-50%);\r\n -ms-transform: translateY(-50%);\r\n -webkit-transform: translate3d(0,-50%,0);\r\n pointer-events: none;\r\n}\r\n#fp-nav.fp-right {\r\n right: 17px;\r\n}\r\n#fp-nav.fp-left {\r\n left: 17px;\r\n}\r\n.fp-slidesNav{\r\n position: absolute;\r\n z-index: 4;\r\n opacity: 1;\r\n -webkit-transform: translate3d(0,0,0);\r\n -ms-transform: translate3d(0,0,0);\r\n transform: translate3d(0,0,0);\r\n left: 0 !important;\r\n right: 0;\r\n margin: 0 auto !important;\r\n pointer-events: none;\r\n}\r\n.fp-slidesNav.fp-bottom {\r\n bottom: 17px;\r\n}\r\n.fp-slidesNav.fp-top {\r\n top: 17px;\r\n}\r\n#fp-nav ul,\r\n.fp-slidesNav ul {\r\n margin: 0;\r\n padding: 0;\r\n}\r\n#fp-nav ul li,\r\n.fp-slidesNav ul li {\r\n display: block;\r\n width: 14px;\r\n height: 13px;\r\n margin: 7px;\r\n position:relative;\r\n}\r\n.fp-slidesNav ul li {\r\n display: inline-block;\r\n}\r\n#fp-nav ul li a,\r\n.fp-slidesNav ul li a {\r\n display: block;\r\n position: relative;\r\n z-index: 1;\r\n width: 100%;\r\n height: 100%;\r\n cursor: pointer;\r\n text-decoration: none;\r\n pointer-events: all;\r\n}\r\n#fp-nav ul li a.active span,\r\n.fp-slidesNav ul li a.active span,\r\n#fp-nav ul li:hover a.active span,\r\n.fp-slidesNav ul li:hover a.active span{\r\n height: 12px;\r\n width: 12px;\r\n margin: -6px 0 0 -6px;\r\n border-radius: 100%;\r\n }\r\n#fp-nav ul li a span,\r\n.fp-slidesNav ul li a span {\r\n border-radius: 50%;\r\n position: absolute;\r\n z-index: 1;\r\n height: 4px;\r\n width: 4px;\r\n border: 0;\r\n background: #333;\r\n left: 50%;\r\n top: 50%;\r\n margin: -2px 0 0 -2px;\r\n -webkit-transition: all 0.1s ease-in-out;\r\n -moz-transition: all 0.1s ease-in-out;\r\n -o-transition: all 0.1s ease-in-out;\r\n transition: all 0.1s ease-in-out;\r\n}\r\n#fp-nav ul li:hover a span,\r\n.fp-slidesNav ul li:hover a span{\r\n width: 10px;\r\n height: 10px;\r\n margin: -5px 0px 0px -5px;\r\n}\r\n#fp-nav ul li .fp-tooltip {\r\n position: absolute;\r\n top: -2px;\r\n color: #fff;\r\n font-size: 14px;\r\n font-family: arial, helvetica, sans-serif;\r\n white-space: nowrap;\r\n max-width: 220px;\r\n overflow: hidden;\r\n display: block;\r\n opacity: 0;\r\n width: 0;\r\n cursor: pointer;\r\n}\r\n#fp-nav ul li:hover .fp-tooltip,\r\n#fp-nav.fp-show-active a.active + .fp-tooltip {\r\n -webkit-transition: opacity 0.2s ease-in;\r\n transition: opacity 0.2s ease-in;\r\n width: auto;\r\n opacity: 1;\r\n}\r\n#fp-nav ul li .fp-tooltip.fp-right {\r\n right: 20px;\r\n}\r\n#fp-nav ul li .fp-tooltip.fp-left {\r\n left: 20px;\r\n}\r\n.fp-auto-height.fp-section,\r\n.fp-auto-height .fp-slide{\r\n height: auto !important;\r\n}\r\n\r\n.fp-responsive .fp-is-overflow.fp-section{\r\n height: auto !important;\r\n}\r\n\r\n/* Tries to prevent overwrites #4657 */\r\n.fp-enabled .fp-scrollable{\r\n overflow: visible;\r\n height: initial;\r\n}\r\n\r\n/* Used with autoScrolling: false */ \r\n.fp-scrollable.fp-responsive .fp-is-overflow.fp-section,\r\n.fp-scrollable .fp-section,\r\n.fp-scrollable .fp-slide{\r\n /* Fallback for browsers that do not support Custom Properties */\r\n height: 100vh;\r\n height: calc(var(--vh, 1vh) * 100);\r\n}\r\n\r\n.fp-scrollable.fp-responsive .fp-is-overflow.fp-section:not(.fp-auto-height):not([data-percentage]),\r\n.fp-scrollable .fp-section:not(.fp-auto-height):not([data-percentage]),\r\n.fp-scrollable .fp-slide:not(.fp-auto-height):not([data-percentage]){\r\n /* Fallback for browsers that do not support Custom Properties */\r\n min-height: 100vh;\r\n min-height: calc(var(--vh, 1vh) * 100);\r\n}\r\n\r\n/* Disabling vertical centering on scrollable elements */\r\n.fp-overflow{\r\n justify-content: flex-start;\r\n}\r\n\r\nbody:not(.fp-responsive) .fp-overflow{\r\n max-height: 100vh;\r\n max-height: 100dvh; /* fix for new browsers */\r\n}\r\n\r\n/* No scrollable when using auto-height */\r\n.fp-scrollable .fp-auto-height .fp-overflow{\r\n max-height: none;\r\n}\r\n\r\n.fp-is-overflow .fp-overflow.fp-auto-height-responsive,\r\n.fp-is-overflow .fp-overflow.fp-auto-height,\r\n.fp-is-overflow > .fp-overflow{\r\n overflow-y: auto;\r\n}\r\n.fp-overflow{\r\n outline:none;\r\n}\r\n\r\n.fp-overflow.fp-table{\r\n display: block;\r\n}\r\n\r\n.fp-responsive .fp-auto-height-responsive.fp-section,\r\n.fp-responsive .fp-auto-height-responsive .fp-slide,\r\n.fp-responsive .fp-auto-height-responsive .fp-overflow{\r\n height: auto !important;\r\n min-height: auto !important;\r\n}\r\n\r\n/*Only display content to screen readers*/\r\n.fp-sr-only{\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: 0;\r\n}\r\n\r\n/* Customize website's scrollbar like Mac OS\r\nNot supports in Firefox and IE */\r\n.fp-scroll-mac .fp-overflow::-webkit-scrollbar {\r\n background-color: transparent;\r\n width: 9px;\r\n}\r\n.fp-scroll-mac .fp-overflow::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n}\r\n.fp-scroll-mac .fp-overflow::-webkit-scrollbar-thumb {\r\n background-color: rgba(0,0,0,.4);\r\n border-radius: 16px;\r\n border: 4px solid transparent;\r\n}\r\n.fp-warning,\r\n.fp-watermark{\r\n z-index: 9999999;\r\n position: absolute;\r\n bottom: 0;\r\n}\r\n.fp-warning,\r\n.fp-watermark a{\r\n text-decoration: none;\r\n color: #000;\r\n background: rgba(255,255,255,0.6);\r\n padding: 5px 8px;\r\n font-size: 14px;\r\n font-family: arial;\r\n color: black;\r\n display: inline-block;\r\n border-radius: 3px;\r\n margin: 12px;\r\n}\r\n.fp-noscroll .fp-overflow{\r\n overflow: hidden;\r\n}"]} \ No newline at end of file diff --git a/fullpage/fullpage.min.js b/fullpage/fullpage.min.js new file mode 100644 index 0000000..27250fa --- /dev/null +++ b/fullpage/fullpage.min.js @@ -0,0 +1,11 @@ +/*! +* fullPage 4.0.35 +* https://github.com/alvarotrigo/fullPage.js +* +* @license GPLv3 for open source use only +* or Fullpage Commercial License for commercial use +* http://alvarotrigo.com/fullPage/pricing/ +* +* Copyright (C) 2018 http://alvarotrigo.com/fullPage - A project by Alvaro Trigo +*/ +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(n="undefined"!=typeof globalThis?globalThis:n||self).fullpage=t()}(this,(function(){"use strict";var n,t,e,i;Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(n){if(null==this)throw new TypeError('"this" is null or not defined');var t=Object(this),e=t.length>>>0;if("function"!=typeof n)throw new TypeError("predicate must be a function");for(var i=arguments[1],o=0;o0?1:-1)*Math.floor(Math.abs(t)):t}(n);return Math.min(Math.max(t,0),e)},function(n){var e=this,o=Object(n);if(null==n)throw new TypeError("Array.from requires an array-like object - not null or undefined");var r,a=arguments.length>1?arguments[1]:void 0;if(void 0!==a){if(!t(a))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(r=arguments[2])}for(var u,l=i(o.length),c=t(e)?Object(new e(l)):new Array(l),f=0;f0||navigator.maxTouchPoints,f=!!window.MSInputMethodContext&&!!document.documentMode,s={test:{},shared:{}},v=["parallax","scrollOverflowReset","dragAndMove","offsetSections","fadingEffect","responsiveSlides","continuousHorizontal","interlockedSlides","scrollHorizontally","resetSliders","cards","dropEffect","waterEffect"],d=(o=window.self!==window.top,function(){return o});function h(n,t){r.console&&r.console[n]&&r.console[n]("fullPage: "+t)}function p(n){return"none"!==r.getComputedStyle(n).display}function g(n){return Array.from(n).filter((function(n){return p(n)}))}function m(n,t){return(t=arguments.length>1?t:document)?t.querySelectorAll(n):null}function w(n){n=n||{};for(var t=1,e=arguments.length;t>=0,t=String(void 0!==t?t:" "),this.length>n?String(this):((n-=this.length)>t.length&&(t+=Array.apply(null,Array(n)).map((function(){return t})).join("")),t.slice(0,n)+String(this))}),window.fp_utils={$:m,deepExtend:w,hasClass:b,getWindowHeight:y,css:T,prev:M,next:A,last:x,index:k,getList:O,hide:j,show:L,isArrayOrList:D,addClass:E,removeClass:R,appendTo:P,wrap:F,wrapAll:z,unwrap:I,closest:N,after:B,before:H,insertBefore:W,getScrollTop:V,siblings:U,preventDefault:_,isFunction:X,trigger:Q,matches:J,toggle:Z,createElementFromHTML:nn,remove:tn,untilAll:en,nextAll:on,prevAll:rn,showError:h};var vn=Object.freeze({__proto__:null,showError:h,isVisible:p,o:g,$:m,deepExtend:w,hasClass:b,getWindowHeight:y,u:S,css:T,prev:M,next:A,last:x,index:k,getList:O,hide:j,show:L,isArrayOrList:D,addClass:E,removeClass:R,appendTo:P,wrap:F,wrapAll:z,l:C,unwrap:I,closest:N,after:B,before:H,insertBefore:W,getScrollTop:V,siblings:U,preventDefault:_,v:K,h:q,p:G,g:$,S:Y,isFunction:X,trigger:Q,matches:J,toggle:Z,createElementFromHTML:nn,remove:tn,untilAll:en,nextAll:on,prevAll:rn,toArray:an,T:un,M:ln,A:cn,O:fn,j:sn});function dn(n){return dn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},dn(n)}var hn={L:{},D:function(n,t){var e=this;return"object"!==dn(this.L[n])&&(this.L[n]=[]),this.L[n].push(t),function(){return e.removeListener(n,t)}},removeListener:function(n,t){if("object"===dn(this.L[n])){var e=this.L[n].indexOf(t);e>-1&&this.L[n].splice(e,1)}},R:function(n){for(var t=this,e=arguments.length,i=new Array(e>1?e-1:0),o=1;o','
      '],controlArrowColor:"#fff",verticalCentered:!0,sectionsColor:[],paddingTop:0,paddingBottom:0,fixedElements:null,responsive:0,responsiveWidth:0,responsiveHeight:0,responsiveSlides:!1,parallax:!1,parallaxOptions:{type:"reveal",percentage:62,property:"translate"},cards:!1,cardsOptions:{perspective:100,fadeContent:!0,fadeBackground:!0},sectionSelector:".section",slideSelector:".slide",afterLoad:null,beforeLeave:null,onLeave:null,afterRender:null,afterResize:null,afterReBuild:null,afterSlideLoad:null,onSlideLeave:null,afterResponsive:null,onScrollOverflow:null,lazyLoading:!0,lazyLoadThreshold:0,observer:!0,scrollBeyondFullpage:!0},Tt=null,Mt=!1,At=w({},St),xt=null;function kt(n){return Tt}function Ot(){return xt||St}function jt(){return At}function Lt(n,t,e){xt[n]=t,"internal"!==e&&(At[n]=t)}function Dt(){if(!Ot().anchors.length){var n=m(Ot().sectionSelector.split(",").join("[data-anchor],")+"[data-anchor]",Tt);n.length&&n.length===m(Ot().sectionSelector,Tt).length&&(Mt=!0,n.forEach((function(n){Ot().anchors.push(K(n,"data-anchor").toString())})))}if(!Ot().navigationTooltips.length){var t=m(Ot().sectionSelector.split(",").join("[data-tooltip],")+"[data-tooltip]",Tt);t.length&&t.forEach((function(n){Ot().navigationTooltips.push(K(n,"data-tooltip").toString())}))}}var Et=function(n){this.anchor=n.anchor,this.item=n.item,this.index=n.index(),this.isLast=this.index===n.item.parentElement.querySelectorAll(n.selector).length-1,this.isFirst=!this.index,this.isActive=n.isActive},Rt=function(n,t){this.parent=this.parent||null,this.selector=t,this.anchor=K(n,"data-anchor")||Ot().anchors[k(n,Ot().sectionSelector)],this.item=n,this.isVisible=p(n),this.isActive=b(n,Yn),this.un=b(n,st)||null!=m(vt,n)[0],this.ln=t===Ot().sectionSelector,this.cn=N(n,ct)||N(n,Un),this.index=function(){return this.siblings().indexOf(this)}};function Pt(n){return n.map((function(n){return n.item}))}function Ft(n,t){return n.find((function(n){return n.item===t}))}Rt.prototype.siblings=function(){return this.ln?this.isVisible?pn.C:pn.sn:this.parent?this.parent.slides:0},Rt.prototype.prev=function(){var n=this.siblings(),t=(this.ln?n.indexOf(this):this.parent.slides.indexOf(this))-1;return t>=0?n[t]:null},Rt.prototype.next=function(){var n=this.siblings(),t=(this.ln?n.indexOf(this):this.parent.slides.indexOf(this))+1;return ti?"up":"down"}function _t(n){return E(n,qn)}function Kt(n){return{"-webkit-transform":n,"-moz-transform":n,"-ms-transform":n,transform:n}}function qt(n,t){t?Vt(kt()):_t(kt()),clearTimeout(zt),T(kt(),Kt(n)),s.test.hn=n,zt=setTimeout((function(){R(kt(),qn)}),10)}function Gt(n){var t=Math.round(n);if(Ot().css3&&Ot().autoScrolling&&!Ot().scrollBar)qt("translate3d(0px, -"+t+"px, 0px)",!1);else if(Ot().autoScrolling&&!Ot().scrollBar)T(kt(),{top:-t+"px"}),s.test.top=-t+"px";else{var e=Ht(t);Wt(e.element,e.options)}}function $t(n,t){Lt("scrollingSpeed",n,t)}s.setScrollingSpeed=$t;var Yt,Xt=null,Qt=null,Jt=null;function Zt(n,t,e,i){var o,a=function(n){return n.self!=r&&b(n,at)?n.scrollLeft:!Ot().autoScrolling||Ot().scrollBar?V():n.offsetTop}(n),u=t-a,l=!1,c=pn.q;gn({q:!0}),Yt&&window.cancelAnimationFrame(Yt),Yt=function(f){o||(o=f);var s=Math.floor(f-o);if(pn.q){var v=t;e&&(v=r.fp_easings[Ot().easing](s,a,u,e)),s<=e&&Wt(n,v),s0,r=i>2&&i'+he(r.index(),"Section")+"";var l=Ot().navigationTooltips[r.index()];void 0!==l&&""!==l&&(i+='
      '+l+"
      "),i+=""}m("ul",e)[0].innerHTML=i;var c=m("li",m(et)[0])[mn().I.index()];E(m("a",c),Yn)}function xe(n){n.preventDefault&&_(n),gn({N:"verticalNav"});var t=k(N(this,"#fp-nav li"));hn.R(En,{destination:mn().C[t]})}function ke(n,t){var e;e=n,Ot().menu&&Ot().menu.length&&m(Ot().menu).forEach((function(n){null!=n&&(R(m(Xn,n),Yn),E(m('[data-menuanchor="'+e+'"]',n),Yn))})),function(n,t){var e=m(et)[0];Ot().navigation&&null!=e&&"none"!==e.style.display&&(R(m(Xn,e),Yn),E(n?m('a[href="#'+n+'"]',e):m("a",m("li",e)[t]),Yn))}(n,t)}ge.m={up:!0,down:!0,left:!0,right:!0},ge.k=w({},ge.m),hn.D(bn,(function(n){var t=n.target;(J(t,mt)||N(t,mt))&&be.call(t,n)})),s.setRecordHistory=ye,s.setAutoScrolling=Se,s.test.setAutoScrolling=Se,(new Date).getTime();var Oe,je,Le,De,Ee,Re,Pe=(je=!0,Le=(new Date).getTime(),De=!r.fullpage_api,function(n,t){var e=(new Date).getTime(),i="wheel"===n?Ot().scrollingSpeed:100;return je=De||e-Le>=i,De=!r.fullpage_api,je&&(Oe=t(),Le=e),void 0===Oe||Oe});function Fe(n,t){if(X(Ot().beforeLeave))return Pe(mn().N,(function(){return ee(n,t)}))}function ze(n,t,e){var i=n.item;if(null!=i){var o,r,a=function(n){var t=n.offsetHeight,e=n.offsetTop,i=e,o=e>pn.tn,r=i-y()+t,a=Ot().bigSectionsDestination;return t>y()?(o||a)&&"bottom"!==a||(i=r):(o||pn.V&&null==A(n))&&(i=r),gn({tn:i}),i}(i),u={element:i,callback:t,isMovementUp:e,dtop:a,yMovement:Ut(mn().I,i),anchorLink:n.anchor,sectionIndex:n.index(),activeSlide:n.activeSlide?n.activeSlide.item:null,leavingSection:mn().I.index()+1,localIsResizing:pn.V,items:{origin:mn().I,destination:n},direction:null};if(!(mn().I.item==i&&!pn.V||Ot().scrollBar&&V()===u.dtop&&!b(i,"fp-auto-height"))){if(null!=u.activeSlide&&(o=K(u.activeSlide,"data-anchor"),r=k(u.activeSlide,null)),!u.localIsResizing){var l=u.yMovement;if(void 0!==e&&(l=e?"up":"down"),u.direction=l,X(Ot().beforeLeave)&&!1===Fe("beforeLeave",u))return;if(X(Ot().onLeave)&&!ee("onLeave",u))return}Ot().autoScrolling&&Ot().continuousVertical&&void 0!==u.isMovementUp&&(!u.isMovementUp&&"up"==u.yMovement||u.isMovementUp&&"down"==u.yMovement)&&(u=function(n){gn({on:!0});var t=mn().I.item;return n.isMovementUp?H(t,on(t,nt)):B(t,rn(t,nt).reverse()),Gt(mn().I.item.offsetTop),function(){for(var n=m(rt),t=0;t-1&&!Xe.kn)return _(n),!1},Mn:function(){Xe.xn=pn.G},onLeave:function(){clearTimeout(Ue),Xe.kn=!1},afterLoad:function(){Xe.kn=!1,clearTimeout(Ue),Ue=setTimeout((function(){Xe.xn=pn.G}),200)},En:function(){a.activeElement===this.An&&(this.An.blur(),Xe.kn=!1)},Tn:function(){if(Ot().scrollOverflow&&Xe.xn){Xe.En();var n=Xe.Rn(mn().I.item);!n||u||c||(this.An=n,requestAnimationFrame((function(){n.focus({Pn:!0}),Xe.kn=!0}))),Xe.xn=!1}},Sn:function(){Ot().scrollOverflowMacStyle&&!l&&E(Xt,"fp-scroll-mac"),mn().dn.forEach((function(n){if(!(n.slides&&n.slides.length||b(n.item,"fp-auto-height-responsive")&&We())){var t,e=Nt(n.item),i=Xe.wn(n.item),o=(t=n).ln?t:t.parent;if(f){var r=i?"addClass":"removeClass";vn[r](o.item,dt),vn[r](n.item,dt)}else E(o.item,dt),E(n.item,dt);n.un||(Xe.Fn(e),Xe.zn(e)),n.un=!0}}))},zn:function(n){Xe.Rn(n).addEventListener("scroll",Xe.Cn),n.addEventListener("wheel",Xe.Ln,{passive:!1}),n.addEventListener("keydown",Xe.Dn,{passive:!1})},Fn:function(n){var t=document.createElement("div");t.className=st,C(n,t),t.setAttribute("tabindex","-1")},In:function(n){var t=m(vt,n)[0];t&&(I(t),n.removeAttribute("tabindex"))},Rn:function(n){var t=Nt(n);return m(vt,t)[0]||t},un:function(n){return b(n,st)||null!=m(vt,n)[0]},bn:function(n){return n.ln&&n.activeSlide?n.activeSlide.un:n.un},wn:function(n){return Xe.Rn(n).scrollHeight>r.innerHeight},isScrolled:function(n,t){if(!pn.G)return!1;if(Ot().scrollBar)return!0;var e=Xe.Rn(t);if(!Ot().scrollOverflow||!b(e,st)||b(t,"fp-noscroll")||b(Nt(t),"fp-noscroll"))return!0;var i=f?1:0,o=e.scrollTop,r="up"===n&&o<=0,a="down"===n&&e.scrollHeight<=Math.ceil(e.offsetHeight+o)+i,u=r||a;return u||"none"===n||(this.On=(new Date).getTime()),u},Nn:function(){this.jn=(new Date).getTime();var n=this.jn-Xe.On,t=(u||c)&&pn.J,e=pn.Z&&n>600;return t&&n>400||e},Cn:($e=0,function(n){var t=n.target.scrollTop,e="none"!==pn.Y?pn.Y:$eo?"left":"right"),l.direction=l.direction?l.direction:l.Bn,l.localIsResizing||gn({G:!1}),Ot().onSlideLeave&&!l.localIsResizing&&"none"!==l.Bn&&X(Ot().onSlideLeave)&&!1===ee("onSlideLeave",l)?gn({W:!1}):(E(t,Yn),R(U(t),Yn),oi(),l.localIsResizing||(ae(l.prevSlide),le(u)),function(n){!Ot().loopHorizontal&&Ot().controlArrows&&(Z(m(bt,n.section),0!==n.slideIndex),Z(m(yt,n.section),null!=A(n.destiny)))}(l),a.isActive&&!l.localIsResizing&&ve(l.slideIndex,l.slideAnchor,l.anchorLink),hn.R(zn,l),function(n,t,e){var i,o,r=t.destinyPos;if(i=t.slidesNav,o=t.slideIndex,Ot().slidesNavigation&&null!=i&&(R(m(Xn,i),Yn),E(m("a",m("li",i)[o]),Yn)),gn({scrollX:Math.round(r.left)}),Ot().css3){var a="translate3d(-"+Math.round(r.left)+"px, 0px, 0px)";s.test.Hn[t.sectionIndex]=a,T(Vt(m(ct,n)),Kt(a)),clearTimeout(Ye),Ye=setTimeout((function(){ni(t)}),Ot().scrollingSpeed)}else s.test.left[t.sectionIndex]=Math.round(r.left),Zt(n,Math.round(r.left),Ot().scrollingSpeed,(function(){ni(t)}))}(n,l))}function Ze(){clearTimeout(Ye)}function ni(n){n.localIsResizing||(X(Ot().afterSlideLoad)&&ee("afterSlideLoad",n),gn({G:!0}),oe(n.destiny),hn.R(Nn,n)),gn({W:!1})}function ti(n,t){$t(0,"internal"),void 0!==t&&gn({V:!0}),Je(N(n,ut),n),void 0!==t&&gn({V:!1}),$t(jt().scrollingSpeed,"internal")}s.landscapeScroll=Je,hn.D(An,(function(){hn.D(Fn,Qe)}));var ei=null,ii=null;function oi(){pn.I=null,pn.C.map((function(n){var t=b(n.item,Yn);n.isActive=t,n.un=Xe.un(n.item),t&&(pn.I=n),n.slides.length&&(n.activeSlide=null,n.slides.map((function(t){var e=b(t.item,Yn);t.un=Xe.un(n.item),t.isActive=e,e&&(n.activeSlide=t)})))})),function(){var n=pn.I,t=!!pn.I&&pn.I.slides.length,e=pn.I?pn.I.activeSlide:null;if(!n&&pn.C.length&&!mn().B&&ei){var i=ui(ei,pn.C);i&&(pn.I=i,pn.I.isActive=!0,E(pn.I.item,Yn)),pn.I&&Gt(pn.I.item.offsetTop)}if(t&&!e&&ii){var o=ui(ii,pn.I.slides);o&&(pn.I.activeSlide=o,pn.I.activeSlide.isActive=!0,E(pn.I.activeSlide.item,Yn)),pn.I.activeSlide&&ti(pn.I.activeSlide.item,"internal")}}()}function ri(){var n=m(Ot().sectionSelector,kt()),t=g(n),e=Array.from(n).map((function(n){return new li(n)})),i=e.filter((function(n){return n.isVisible})),o=i.reduce((function(n,t){return n.concat(t.slides)}),[]);ei=ai(pn.I),ii=ai(pn.I?pn.I.activeSlide:null),pn.P=t.length,pn.F=i.reduce((function(n,t){return n+t.slides.length}),0),pn.C=i,pn.sn=e,pn.slides=o,pn.dn=pn.C.concat(pn.slides)}function ai(n){if(!n)return null;var t=n?n.item:null,e=n.ln?pn.sn:pn.I.Wn;if(t){var i=Ft(e,t);return i?i.index():null}return null}function ui(n,t){var e,i=n-1,o=n;do{if(e=t[i]||t[o])break;i-=1,o+=1}while(i>=0||o1&&(Ot().controlArrows&&function(n){var t=n.item,e=[nn(Ot().controlArrowsHTML[0]),nn(Ot().controlArrowsHTML[1])];B(m(ut,t)[0],e),E(e,gt),E(e[0],wt),E(e[1],"fp-next"),"#fff"!==Ot().controlArrowColor&&(T(m(yt,t),{"border-color":"transparent transparent transparent "+Ot().controlArrowColor}),T(m(bt,t),{"border-color":"transparent "+Ot().controlArrowColor+" transparent transparent"})),Ot().loopHorizontal||j(m(bt,t))}(n),Ot().slidesNavigation&&function(n){var t=n.item,e=n.slides.length;P(nn('
        '),t);var i=m(ht,t)[0];E(i,"fp-"+Ot().slidesNavPosition);for(var o=0;o'+he(o,"Slide",m(ot,t)[o])+""),m("ul",i)[0]);T(i,{"margin-left":"-"+i.innerWidth/2+"px"});var r=n.activeSlide?n.activeSlide.index():0;E(m("a",m("li",i)[r]),Yn)}(n)),i.forEach((function(n){T(n.item,{width:r+"%"}),Ot().verticalCentered&&Ve(n)}));var c=n.activeSlide||null;null!=c&&pn.I&&(0!==pn.I.index()||0===pn.I.index()&&0!==c.index())?ti(c.item,"internal"):E(e[0],Yn)}fi.prototype=Rt.prototype,fi.prototype.constructor=li;var di={attributes:!1,subtree:!0,childList:!0,characterData:!0};function hi(){return g(m(Ot().slideSelector,kt())).length!==mn().F}function pi(n){var t=hi();(hi()||g(m(Ot().sectionSelector,kt())).length!==mn().P)&&!pn.on&&(Ot().observer&&ci&&ci.disconnect(),ri(),oi(),Ot().anchors=[],tn(m(et)),si(),Dt(),Ot().navigation&&Ae(),t&&(tn(m(ht)),tn(m(mt))),mn().C.forEach((function(n){n.slides.length?t&&vi(n):Ke(n)}))),Ot().observer&&ci&&m(Un)[0]&&ci.observe(m(Un)[0],di)}hn.D(An,(function(){var n,t,e;Ot().observer&&"MutationObserver"in window&&m(Un)[0]&&(n=m(Un)[0],t=di,(e=new MutationObserver(pi)).observe(n,t),ci=e),hn.D(kn,pi)})),s.render=pi;var gi=function(){var n=!1;try{var t=Object.defineProperty({},"passive",{get:function(){n=!0}});G("testPassive",null,t),Y("testPassive",null,t)}catch(n){}return function(){return n}}();function mi(){return!!gi()&&{passive:!1}}var wi,bi,yi,Si,Ti=(yi=(new Date).getTime(),Si=[],{Vn:function(n){var t=(n=n||r.event).wheelDelta||-n.deltaY||-n.detail,e=Math.max(-1,Math.min(1,t)),i=void 0!==n.wheelDeltaX||void 0!==n.deltaX;wi=Math.abs(n.wheelDeltaX)149&&Si.shift(),Si.push(Math.abs(t));var a=o-yi;yi=o,a>200&&(Si=[])},Un:function(){var n=ln(Si,10)>=ln(Si,70);return!!Si.length&&n&&wi},_n:function(){return bi}});function Mi(){var n=Ot().css3?V()+y():un(mn().C).item.offsetTop+un(mn().C).item.offsetHeight,t=Ht(n);s.test.top=-n+"px",gn({G:!1}),Zt(t.element,t.options,Ot().scrollingSpeed,(function(){setTimeout((function(){gn({B:!0}),gn({G:!0})}),30)}))}function Ai(){kt().getBoundingClientRect().bottom>=0&&xi()}function xi(){var n=Ht(un(mn().C).item.offsetTop);gn({G:!1}),Zt(n.element,n.options,Ot().scrollingSpeed,(function(){gn({G:!0}),gn({B:!1}),gn({Kn:!1})}))}var ki,Oi,ji,Li=(ki=!1,Oi={},ji={},function(n,t,e){switch(n){case"set":Oi[t]=(new Date).getTime(),ji[t]=e;break;case"isNewKeyframe":var i=(new Date).getTime();ki=i-Oi[t]>ji[t]}return ki});function Di(){var n=mn().I.next();n||!Ot().loopBottom&&!Ot().continuousVertical||(n=mn().C[0]),null!=n?ze(n,null,!1):kt().scrollHeightRi&&we().m.down&&Di()),Ri=n.pageY)}function Fi(n){if(we().m[n]){var t="down"===n?Di:Ei;Ot().scrollOverflow&&Xe.bn(mn().I)?Xe.isScrolled(n,mn().I.item)&&Xe.Nn()&&t():t()}}var zi,Ci,Ii,Ni,Bi=0,Hi=0,Wi=0,Vi=0,Ui=(r.PointerEvent&&(Ni={down:"pointerdown",move:"pointermove"}),Ni),_i={qn:"ontouchmove"in window?"touchmove":Ui?Ui.move:null,Gn:"ontouchstart"in window?"touchstart":Ui?Ui.down:null};function Ki(n){var t=N(n.target,nt)||mn().I.item,e=Xe.bn(mn().I);if(qi(n)){gn({J:!0,Z:!1}),Ot().autoScrolling&&(e&&!pn.G||Ot().scrollBar)&&_(n);var i=Yi(n);Wi=i.y,Vi=i.x;var o=Math.abs(Bi-Wi)>r.innerHeight/100*Ot().touchSensitivity,a=Math.abs(Hi-Vi)>S()/100*Ot().touchSensitivity,u=m(ut,t).length&&Math.abs(Hi-Vi)>Math.abs(Bi-Wi),l=Bi>Wi?"down":"up";gn({Y:u?Hi>Vi?"right":"left":l}),u?!pn.W&&a&&(Hi>Vi?we().m.right&&hn.R(Sn,{section:t}):we().m.left&&hn.R(yn,{section:t})):Ot().autoScrolling&&pn.G&&o&&Fi(l)}}function qi(n){return void 0===n.pointerType||"mouse"!=n.pointerType}function Gi(n){if(Ot().fitToSection&&gn({q:!1}),qi(n)){var t=Yi(n);Bi=t.y,Hi=t.x}G("touchend",$i)}function $i(){Y("touchend",$i),gn({J:!1})}function Yi(n){var t={};return t.y=void 0!==n.pageY&&(n.pageY||n.pageX)?n.pageY:n.touches[0].pageY,t.x=void 0!==n.pageX&&(n.pageY||n.pageX)?n.pageX:n.touches[0].pageX,c&&qi(n)&&Ot().scrollBar&&void 0!==n.touches&&(t.y=n.touches[0].pageY,t.x=n.touches[0].pageX),t}function Xi(n){Ot().autoScrolling&&qi(n)&&we().m.up&&(pn.G||_(n))}function Qi(n,t){var e=null==t?mn().I.item:t,i=Ft(pn.C,e),o=m(ut,e)[0];if(!(null==o||pn.W||i.slides.length<2)){var r=i.activeSlide,a="left"===n?r.prev():r.next();if(!a){if(!Ot().loopHorizontal)return;a="left"===n?un(i.slides):i.slides[0]}gn({W:!s.test.mn}),Je(o,a.item,n)}}function Ji(n){Qi("left",n)}function Zi(n){Qi("right",n)}function no(n){var t=mn().C.filter((function(t){return t.anchor===n}))[0];if(!t){var e=void 0!==n?n-1:0;t=mn().C[e]}return t}function to(n){null!=n&&Je(N(n,ut),n)}function eo(n,t){var e=no(n);if(null!=e){var i=function(n,t){var e=t.slides.filter((function(t){return t.anchor===n}))[0];return null==e&&(n=void 0!==n?n:0,e=t.slides[n]),e?e.item:null}(t,e);e.anchor&&e.anchor===pn._||b(e.item,Yn)?to(i):ze(e,(function(){to(i)}))}}function io(n,t){var e=no(n);void 0!==t?eo(n,t):null!=e&&ze(e)}function oo(){clearTimeout(Ci),$("keydown",ro),$("keyup",ao)}function ro(n){clearTimeout(Ci);var t=n.keyCode,e=[37,39].indexOf(t)>-1,i=Ot().autoScrolling||Ot().fitToSection||e;9===t?function(n){var t=n.shiftKey,e=a.activeElement,i=so(Nt(mn().I.item));function o(n){return _(n),i[0]?i[0].focus():null}if(pn.G){if(!function(n){var t=so(a),e=t.indexOf(a.activeElement),i=t[n.shiftKey?e-1:e+1],o=N(i,ot),r=N(i,nt);return!o&&!r}(n)){e?null==N(e,".fp-section.active,.fp-section.active .fp-slide.active")&&(e=o(n)):o(n);var r=e==i[0],u=e==i[i.length-1],l=t&&r;if(l||!t&&u){_(n);var c=function(n){var t,e=n?"prevPanel":"nextPanel",i=[],o=Bt((pn.I&&pn.I.activeSlide?pn.I.activeSlide:pn.I)[e]());do{(i=so(o.item)).length&&(t={$n:o,Yn:i[n?i.length-1:0]}),o=Bt(o[e]())}while(o&&0===i.length);return t}(l),f=c?c.$n:null;if(f){var s=f.ln?f:f.parent;hn.R(jn,{Xn:s.index()+1,slideAnchor:f.ln?0:f.index()}),Ii=c.Yn,_(n)}}}}else _(n)}(n):!sn()&&Ot().keyboardScrolling&&i&&(zi=n.ctrlKey,Ci=setTimeout((function(){!function(n){var t=n.shiftKey,e=a.activeElement,i=J(e,"video")||J(e,"audio"),o=Xe.isScrolled("up",mn().I.item),r=Xe.isScrolled("down",mn().I.item),u=[37,39].indexOf(n.keyCode)>-1;if(function(n){(function(n){return[40,38,32,33,34].indexOf(n.keyCode)>-1&&!pn.B})(n)&&!N(n.target,vt)&&n.preventDefault()}(n),pn.G||u)switch(gn({N:"keydown"}),n.keyCode){case 38:case 33:we().k.up&&o?pn.B?hn.R(Ln,{e:n}):Ei():Xe.Tn();break;case 32:if(t&&we().k.up&&!i&&o){Ei();break}case 40:case 34:if(we().k.down&&r){if(pn.B)return;32===n.keyCode&&i||Di()}else Xe.Tn();break;case 36:we().k.up&&io(1);break;case 35:we().k.down&&io(mn().C.length);break;case 37:we().k.left&&Ji();break;case 39:we().k.right&&Zi()}}(n)}),0))}function ao(n){pn.nn&&(zi=n.ctrlKey)}function uo(){gn({nn:!1}),zi=!1}function lo(n){fo()}function co(n){N(Ii,ot)&&!N(Ii,rt)||fo()}function fo(){Ii&&(Ii.focus(),Ii=null)}function so(n){return[].slice.call(m('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], summary:not([disabled]), [contenteditable]',n)).filter((function(n){return"-1"!==K(n,"tabindex")&&null!==n.offsetParent}))}s.moveSlideLeft=Ji,s.moveSlideRight=Zi,s.moveTo=io,hn.D(An,(function(){G("blur",uo),q("keydown",ro),q("keyup",ao),hn.D(xn,oo),hn.D(Nn,lo),hn.D(In,co)}));var vo=(new Date).getTime(),ho=[];function po(n){n?(function(){var n,t="";r.addEventListener?n="addEventListener":(n="attachEvent",t="on");var e="onwheel"in a.createElement("div")?"wheel":void 0!==a.onmousewheel?"mousewheel":"DOMMouseScroll",i=mi();"DOMMouseScroll"==e?a[n](t+"MozMousePixelScroll",go,i):a[n](t+e,go,i)}(),kt().addEventListener("mousedown",mo),kt().addEventListener("mouseup",wo)):(a.addEventListener?($("mousewheel",go,!1),$("wheel",go,!1),$("MozMousePixelScroll",go,!1)):a.detachEvent("onmousewheel",go),kt().removeEventListener("mousedown",mo),kt().removeEventListener("mouseup",wo))}function go(n){var t=(new Date).getTime(),e=b(m(".fp-completely")[0],"fp-normal-scroll"),i=function(n,t){(new Date).getTime();var e=mn().B&&n.getBoundingClientRect().bottom>=0&&"up"===Ti._n(),i=mn().Kn;if(i)return _(t),!1;if(mn().B){if(e){var o;if(!(i||Li("isNewKeyframe","beyondFullpage")&&Ti.Un()))return(o=Ht(un(mn().C).item.offsetTop+un(mn().C).item.offsetHeight)).element.scrollTo(0,o.options),gn({Kn:!1}),_(t),!1;if(Ti.Un())return e=!1,gn({Kn:!0}),gn({N:"wheel"}),xi(),_(t),!1}else Li("set","beyondFullpage",1e3);if(!i&&!e)return!0}}(kt(),n);if(pn.Z||gn({J:!1,Z:!0,Y:"none"}),!we().m.down&&!we().m.up)return!1;if(i)return!0;if(!1===i)return _(n),!1;if(Ot().autoScrolling&&!zi&&!e){var o=(n=n||r.event).wheelDelta||-n.deltaY||-n.detail,a=Math.max(-1,Math.min(1,o)),u=void 0!==n.wheelDeltaX||void 0!==n.deltaX,l=Math.abs(n.wheelDeltaX)0?"up":"none";ho.length>149&&ho.shift(),ho.push(Math.abs(o)),Ot().scrollBar&&_(n);var f=t-vo;return vo=t,f>200&&(ho=[]),gn({X:c}),pn.G&&ln(ho,10)>=ln(ho,70)&&l&&(gn({N:"wheel"}),Fi(a<0?"down":"up")),!1}Ot().fitToSection&&gn({q:!1})}function mo(n){var t;2==n.which&&(t=n.pageY,Ri=t,kt().addEventListener("mousemove",Pi))}function wo(n){2==n.which&&kt().removeEventListener("mousemove",Pi)}function bo(n){n?(po(!0),function(){if(_i.qn&&(u||c)){Ot().autoScrolling&&(Xt.removeEventListener(_i.qn,Xi,{passive:!1}),Xt.addEventListener(_i.qn,Xi,{passive:!1}));var n=Ot().touchWrapper;n.removeEventListener(_i.Gn,Gi),n.removeEventListener(_i.qn,Ki,{passive:!1}),n.addEventListener(_i.Gn,Gi),n.addEventListener(_i.qn,Ki,{passive:!1})}}()):(po(!1),function(){if(_i.qn&&(u||c)){Ot().autoScrolling&&(Xt.removeEventListener(_i.qn,Ki,{passive:!1}),Xt.removeEventListener(_i.qn,Xi,{passive:!1}));var n=Ot().touchWrapper;n.removeEventListener(_i.Gn,Gi),n.removeEventListener(_i.qn,Ki,{passive:!1})}}())}s.setMouseWheelScrolling=po;var yo=!0;function So(){["mouseenter","touchstart","mouseleave","touchend"].forEach((function(n){$(n,Mo,!0)}))}function To(n,t){document["fp_"+n]=t,q(n,Mo,!0)}function Mo(n){var t=n.type,e=!1,i="mouseleave"===t?n.toElement||n.relatedTarget:n.target;i!=document&&i?("touchend"===t&&(yo=!1,setTimeout((function(){yo=!0}),800)),("mouseenter"!==t||yo)&&(Ot().normalScrollElements.split(",").forEach((function(n){if(!e){var t=J(i,n),o=N(i,n);(t||o)&&(s.shared.Qn||bo(!1),s.shared.Qn=!0,e=!0)}})),!e&&s.shared.Qn&&(bo(!0),s.shared.Qn=!1))):bo(!0)}function Ao(n,t){$t(0,"internal"),io(n,t),$t(jt().scrollingSpeed,"internal")}hn.D(An,(function(){Ot().normalScrollElements&&(["mouseenter","touchstart"].forEach((function(n){To(n,!1)})),["mouseleave","touchend"].forEach((function(n){To(n,!0)}))),hn.D(xn,So)})),s.silentMoveTo=Ao;var xo,ko,Oo=y(),jo=S(),Lo=!1;function Do(){clearTimeout(xo),clearTimeout(ko),Y("resize",Eo)}function Eo(){Lo||(Ot().autoScrolling&&!Ot().scrollBar||!Ot().fitToSection)&&Po(y()),pn.an&&function(){if(u)for(var n=0;n<4;n++)ko=setTimeout((function(){window.requestAnimationFrame((function(){Ot().autoScrolling&&!Ot().scrollBar&&(gn({V:!0}),Ao(pn.I.index()+1),gn({V:!1}))}))}),200*n)}(),Lo=!0,clearTimeout(xo),xo=setTimeout((function(){!function(){var n,t,e;if(gn({V:!0}),(!u||Ot().adjustOnNavChange)&&(Po(""),pn.B||Ot().autoScrolling||(n=.01*r.innerHeight,a.documentElement.style.setProperty("--vh","".concat(n,"px")))),hn.R(kn),oi(),Be(),u){var i=a.activeElement;if(!J(i,"textarea")&&!J(i,"input")&&!J(i,"select")){var o=y();Math.abs(o-Oo)>20*Math.max(Oo,o)/100&&(Ro(!0),Oo=o)}}else t=y(),e=S(),pn.en===t&&jo===e||(gn({en:t}),jo=e,Ro(!0));gn({V:!1})}(),Lo=!1}),400)}function Ro(n){if(!b(kt(),Gn)){gn({V:!0,en:y(),Jn:S()});for(var t=mn().C,e=0;e1&&Je(o,i.activeSlide.item)}Ot().scrollOverflow&&Xe.Sn();var a=mn().I.index();pn.B||a&&Ao(a+1),gn({V:!1}),X(Ot().afterResize)&&n&&Ot().afterResize.call(kt(),r.innerWidth,r.innerHeight),X(Ot().afterReBuild)&&!n&&Ot().afterReBuild.call(kt()),Q(kt(),"afterRebuild")}}function Po(n){var t=""===n?"":n+"px";mn().C.forEach((function(n){T(n.item,{height:t})}))}function Fo(){var n,t,e=r.location.hash;if(e.length){var i=e.replace("#","").split("/"),o=e.indexOf("#/")>-1;n=o?"/"+i[1]:decodeURIComponent(i[0]);var a=o?i[2]:i[1];a&&a.length&&(t=decodeURIComponent(a))}return{section:n,pn:t}}function zo(){Y("hashchange",Co)}function Co(){if(!pn.U&&!Ot().lockAnchors){var n=Fo(),t=n.section,e=n.pn,i=void 0===pn._,o=void 0===pn._&&void 0===e&&!pn.W;t&&t.length&&(t&&t!==pn._&&!i||o||!pn.W&&pn.K!=e)&&hn.R(jn,{Xn:t,slideAnchor:e})}}function Io(n){var t=n.target;N(t,Ot().menu+" [data-menuanchor]")&&No.call(t,n.e)}function No(n){if(gn({N:"menu"}),m(Ot().menu)[0]&&(Ot().lockAnchors||!Ot().anchors.length)){_(n);var t=N(this,"[data-menuanchor]");hn.R(Dn,{anchor:K(t,"data-menuanchor")})}}function Bo(n){var t=n.target;t&&N(t,"#fp-nav a")?xe.call(t,n.e):J(t,".fp-tooltip")?Me.call(t):(J(t,pt)||null!=N(t,pt))&&pe.call(t,n.e)}s.reBuild=Ro,hn.D(An,(function(){Eo(),G("resize",Eo),hn.D(xn,Do)})),s.setLockAnchors=function(n){Ot().lockAnchors=n},hn.D(An,(function(){G("hashchange",Co),hn.D(xn,zo)})),hn.D(An,(function(){q("wheel",Ti.Vn,mi()),hn.D(Pn,Mi),hn.D(Ln,Ai)})),hn.D(An,(function(){hn.D(bn,Io)})),hn.D(An,(function(){hn.D(bn,Bo)}));var Ho,Wo,Vo=0;function Uo(n){var t,e,i,o,r;if(!pn.V&&mn().I&&(un(mn().C),!mn().B&&!mn().Kn&&(!Ot().autoScrolling||Ot().scrollBar))){var a=V(),l=function(n){var t=n>Vo?"down":"up";return Vo=n,gn({tn:n}),t}(a),c=0,f=a+y()/2,s=Xt.scrollHeight-y()===a,v=mn().C;if(gn({scrollY:a}),s)c=v.length-1;else if(a)for(var d=0;d=V()+y():o<=V())&&(b(mn().I.item,Qn)||(E(mn().I.item,Qn),R(U(mn().I.item),Qn))),e=(t=v[c]).item,!t.isActive){gn({U:!0});var h,p,g=mn().I.item,m=mn().I.index()+1,w=Ut(mn().I,e),S=t.anchor,T=t.index()+1,M=t.activeSlide,A={I:g,sectionIndex:T-1,anchorLink:S,element:e,leavingSection:m,direction:w,items:{origin:mn().I,destination:t}};M&&(p=M.anchor,h=M.index()),pn.G&&(E(e,Yn),R(U(e),Yn),X(Ot().beforeLeave)&&Fe("beforeLeave",A),X(Ot().onLeave)&&ee("onLeave",A),X(Ot().afterLoad)&&ee("afterLoad",A),ae(g),le(t),oe(e),ke(S,T-1),Ot().anchors.length&&gn({_:S}),oi(),ve(h,p,S)),clearTimeout(Ho),Ho=setTimeout((function(){gn({U:!1})}),100)}Ot().fitToSection&&pn.G&&(clearTimeout(Wo),Wo=setTimeout((function(){var n;if(!pn.C.filter((function(n){var t=n.item.getBoundingClientRect();return Math.round(t.bottom)===Math.round(y())||0===Math.round(t.top)})).length){if(u&&(n=document.activeElement)&&n.matches("input, textarea"))return;Ne()}}),Ot().fitToSectionDelay))}}function _o(n){var t=n.items.destination.activeSlide;gn({scrollX:t?Math.round(t.offsetLeft):0})}function Ko(n){var t=Ot().skipIntermediateItems,e=n.items.origin.ln?"sections":"slides",i=Math.abs(n.items.origin.index()-n.items.destination.index())>1;(!0===t||t===e)&&i&&$t(0,"internal")}function qo(n){Ot().skipIntermediateItems&&Lt("scrollingSpeed",jt().scrollingSpeed,"internal")}function Go(n,t){void 0!==t?(t=t.replace(/ /g,"").split(",")).forEach((function(t){me(n,t,"k")})):(me(n,"all","k"),Ot().keyboardScrolling=n)}function $o(n){var t=n.index();void 0!==Ot().anchors[t]&&n.isActive&&ke(Ot().anchors[t],t),Ot().menu&&Ot().css3&&null!=N(m(Ot().menu)[0],Un)&&m(Ot().menu).forEach((function(n){Xt.appendChild(n)}))}function Yo(){var n,t,e=mn().I,i=mn().I.item;E(i,Qn),le(mn().I),Te(),oe(i),t=no((n=Fo()).section),n.section&&t&&(void 0===t||t.index()!==k(_e))||!X(Ot().afterLoad)||ee("afterLoad",{I:i,element:i,direction:null,anchorLink:e.anchor,sectionIndex:e.index(),items:{origin:mn().I,destination:mn().I}}),X(Ot().afterRender)&&ee("afterRender")}function Xo(n,t){void 0!==t?(t=t.replace(/ /g,"").split(",")).forEach((function(t){me(n,t,"m")})):me(n,"all","m")}function Qo(){var n=Fo(),t=n.section,e=n.pn;t?Ot().animateAnchor?eo(t,e):Ao(t,e):hn.R(wn,null)}function Jo(){ri(),oi(),Ot().scrollBar=Ot().scrollBar||Ot().hybrid,Dt(),function(){T(fn(kt(),"body"),{height:"100%",position:"relative"}),E(kt(),Vn),E(Qt,$n),gn({en:y()}),R(kt(),Gn),si();for(var n=mn().sn,t=0;t0&&vi(e)}Ot().fixedElements&&Ot().css3&&m(Ot().fixedElements).forEach((function(n){Xt.appendChild(n)})),Ot().navigation&&Ae(),m('iframe[src*="youtube.com/embed/"]',kt()).forEach((function(n){var t,e;e=K(t=n,"src"),t.setAttribute("src",e+(/\?/.test(e)?"&":"?")+"enablejsapi=1")})),Ot().scrollOverflow&&Xe.Sn()}(),Xo(!0),bo(!0),Se(Ot().autoScrolling,"internal"),Be(),fe(),"complete"===a.readyState&&Qo(),G("load",Qo),Yo(),ri(),oi()}function Zo(){var n=Ot().licenseKey;""===Ot().licenseKey.trim()?(h("error","Fullpage.js requires a `licenseKey` option. Read about it on the following website:"),h("error","https://alvarotrigo.com/fullPage/docs/#licensekey")):Ot()&&pn.Zn||a.domain.indexOf("alvarotrigo.com")>-1?n&&n.length:(h("error","Incorrect `licenseKey`. Get one for fullPage.js version 4 here:"),h("error","https://alvarotrigo.com/fullPage/pricing")),b(Qt,$n)?h("error","Fullpage.js can only be initialized once and you are doing it multiple times!"):(Ot().continuousVertical&&(Ot().loopTop||Ot().loopBottom)&&(Ot().continuousVertical=!1,h("warn","Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled")),!Ot().scrollOverflow||!Ot().scrollBar&&Ot().autoScrolling||h("warn","Options scrollBar:true and autoScrolling:false are mutually exclusive with scrollOverflow:true. Sections with scrollOverflow might not work well in Firefox"),!Ot().continuousVertical||!Ot().scrollBar&&Ot().autoScrolling||(Ot().continuousVertical=!1,h("warn","Scroll bars (`scrollBar:true` or `autoScrolling:false`) are mutually exclusive with `continuousVertical`; `continuousVertical` disabled")),v.forEach((function(n){Ot()[n]&&h("warn","fullpage.js extensions require fullpage.extensions.min.js file instead of the usual fullpage.js. Requested: "+n)})),Ot().anchors.forEach((function(n){var t=[].slice.call(m("[name]")).filter((function(t){return K(t,"name")&&K(t,"name").toLowerCase()==n.toLowerCase()})),e=[].slice.call(m("[id]")).filter((function(t){return K(t,"id")&&K(t,"id").toLowerCase()==n.toLowerCase()}));if(e.length||t.length){h("error","data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).");var i=e.length?"id":"name";(e.length||t.length)&&h("error",'"'+n+'" is is being used by another element `'+i+"` property")}})))}function nr(n,t){var e;if(Xt=m("body")[0],Qt=m("html")[0],Jt=m("html, body"),!b(Qt,$n))return"touchWrapper",e="string"==typeof n?m(n)[0]:n,St.touchWrapper=e,function(n){xt=w({},St,n),At=Object.assign({},xt)}(t),function(n){Tt=n}("string"==typeof n?m(n)[0]:n),hn.R(Tn),Zo(),s.getFullpageData=function(){return{options:Ot()}},s.version="4.0.35",s.test=Object.assign(s.test,{top:"0px",hn:"translate3d(0px, 0px, 0px)",Hn:function(){for(var n=[],t=0;t-1?"".concat(n,": 0;"):"",e='\n \n "),i=un(pn.C),o=!pn.Zn||Ot().credits.enabled;i&&i.item&&o&&i.item.insertAdjacentHTML("beforeend",e)})),function(){hn.D(Tn,(function(){var t,u,l;gn({Zn:(Ot().licenseKey,t=Ot().licenseKey,u=function(t){var e=parseInt("514").toString(16);if(!t||t.length<29||4===t.split(n[0]).length)return null;var i=["Each","for"][o()]().join(""),u=t[["split"]]("-"),l=[];u[i]((function(n,t){if(t<4){var i=function(n){var t=n[n.length-1],e=["NaN","is"][o()]().join("");return window[e](t)?r(t):function(n){return n-Yn.length}(t)}(n);l.push(i);var a=r(n[i]);if(1===t){var u=["pa","dS","t","art"].join("");a=a.toString()[u](2,"0")}e+=a,0!==t&&1!==t||(e+="-")}}));var c=0,f="";return t.split("-").forEach((function(n,t){if(t<4){for(var e=0,i=0;i<4;i++)i!==l[t]&&(e+=Math.abs(r(n[i])),isNaN(n[i])||c++);var o=a(e);f+=o}})),f+=a(c),{tt:new Date(e+"T00:00"),et:e.split("-")[2]===8*(Yn.length-2)+"",it:f}}(t),l=function(n){var t=i[o()]().join("");return n&&0===t.indexOf(n)&&n.length===t.length}(t)||function(n){return new RegExp("^(?=.*?[A-Y])(?=.*?[a-y])(?=.*?[0-8])(?=.*?[#?!@$%^&*-]).{8,}$").test(n)}(t),(u||l)&&(u&&e<=u.tt&&u.it===t.split(n[0])[4]||l||u.et)||!1)})}));var n=["-"],t="2025-3-1".split("-"),e=new Date(t[0],t[1],t[2]),i=["se","licen","-","v3","l","gp"];function o(){return[["re","verse"].join("")]["".length]}function r(n){return n?isNaN(n)?n.charCodeAt(0)-72:n:""}function a(n){var t=72+n;return t>90&&t<97&&(t+=15),String.fromCharCode(t).toUpperCase()}}(),hn.D(Fn,Ko),hn.D(In,qo),hn.D(zn,Ko),hn.D(Nn,qo),hn.D(Mn,(function(){Go(!0)})),s.setKeyboardScrolling=Go,s.shared.nt=Yo,s.setAllowScrolling=Xo,s.destroy=function(n){Se(!1,"internal"),Xo(!0),bo(!1),Go(!1),E(kt(),Gn),hn.R(xn),n&&(Gt(0),m("img[data-src], source[data-src], audio[data-src], iframe[data-src]",kt()).forEach((function(n){cn(n,"src")})),m("img[data-srcset]").forEach((function(n){cn(n,"srcset")})),tn(m("#fp-nav, .fp-slidesNav, .fp-controlArrow, .fp-watermark")),T(Pt(mn().C),{height:"","background-color":"",padding:""}),T(Pt(mn().slides),{width:""}),T(kt(),{height:"",position:"","-ms-touch-action":"","touch-action":""}),T(Jt,{overflow:"",height:""}),R(Qt,$n),R(Xt,Kn+" "+_n),Xt.className.split(/\s+/).forEach((function(n){0===n.indexOf("fp-viewing")&&R(Xt,n)})),Pt(mn().dn).forEach((function(n){Ot().scrollOverflow&&Xe.In(n),R(n,"fp-table active fp-completely fp-is-overflow "+Jn);var t=K(n,"data-fp-styles");t&&n.setAttribute("style",t),b(n,Zn)&&!Mt&&n.removeAttribute("data-anchor")})),_t(kt()),[tt,ct,ut].forEach((function(n){m(n,kt()).forEach((function(n){I(n)}))})),T(kt(),{"-webkit-transition":"none",transition:"none"}),R(kt(),Vn),r.scrollTo(0,0),[Zn,it,lt].forEach((function(n){R(m("."+n),n)})))},r.fp_easings=w(r.fp_easings,{easeInOutCubic:function(n,t,e,i){return(n/=i/2)<1?e/2*n*n*n+t:e/2*((n-=2)*n*n+2)+t}}),r.jQuery&&function(n,t){n&&t?n.fn.fullpage=function(e){e=n.extend({},e,{$:n}),new t(this[0],e),Object.keys(s).forEach((function(n){Ot().$.fn.fullpage[n]=s[n]}))}:h("error","jQuery is required to use the jQuery fullpage adapter!")}(r.jQuery,nr),nr})); diff --git a/images/projects/agglom.jpg b/images/projects/agglom.jpg new file mode 100644 index 0000000..1e5c597 Binary files /dev/null and b/images/projects/agglom.jpg differ diff --git a/images/projects/arial.jpeg b/images/projects/arial.jpeg new file mode 100644 index 0000000..be7cccf Binary files /dev/null and b/images/projects/arial.jpeg differ diff --git a/images/projects/greenpeace.jpg b/images/projects/greenpeace.jpg new file mode 100644 index 0000000..015caf9 Binary files /dev/null and b/images/projects/greenpeace.jpg differ diff --git a/images/projects/gulag.jpg b/images/projects/gulag.jpg new file mode 100644 index 0000000..e698d2e Binary files /dev/null and b/images/projects/gulag.jpg differ diff --git a/images/projects/magistral.jpg b/images/projects/magistral.jpg new file mode 100644 index 0000000..3f99b0e Binary files /dev/null and b/images/projects/magistral.jpg differ diff --git a/images/projects/mapsme.jpg b/images/projects/mapsme.jpg new file mode 100644 index 0000000..1d98698 Binary files /dev/null and b/images/projects/mapsme.jpg differ diff --git a/images/projects/thumb.agglom.jpg b/images/projects/thumb.agglom.jpg new file mode 100644 index 0000000..551b3a4 Binary files /dev/null and b/images/projects/thumb.agglom.jpg differ diff --git a/images/projects/thumb.arial.jpeg b/images/projects/thumb.arial.jpeg new file mode 100644 index 0000000..ea9b42a Binary files /dev/null and b/images/projects/thumb.arial.jpeg differ diff --git a/images/projects/thumb.gulag.jpg b/images/projects/thumb.gulag.jpg new file mode 100644 index 0000000..b2b245a Binary files /dev/null and b/images/projects/thumb.gulag.jpg differ diff --git a/images/projects/thumb.magistral.jpg b/images/projects/thumb.magistral.jpg new file mode 100644 index 0000000..7b3c43e Binary files /dev/null and b/images/projects/thumb.magistral.jpg differ diff --git a/images/projects/thumb.mapsme.jpg b/images/projects/thumb.mapsme.jpg new file mode 100644 index 0000000..b748fec Binary files /dev/null and b/images/projects/thumb.mapsme.jpg differ diff --git a/images/projects/thumb.muf.jpg b/images/projects/thumb.muf.jpg new file mode 100644 index 0000000..7be54ab Binary files /dev/null and b/images/projects/thumb.muf.jpg differ diff --git a/images/projects/thumb.velobike.jpg b/images/projects/thumb.velobike.jpg new file mode 100644 index 0000000..2464c18 Binary files /dev/null and b/images/projects/thumb.velobike.jpg differ diff --git a/images/projects/thumb.ws.jpg b/images/projects/thumb.ws.jpg new file mode 100644 index 0000000..fa74781 Binary files /dev/null and b/images/projects/thumb.ws.jpg differ diff --git a/images/projects/velobike.jpg b/images/projects/velobike.jpg new file mode 100644 index 0000000..b658a34 Binary files /dev/null and b/images/projects/velobike.jpg differ diff --git a/images/projects/ws.jpg b/images/projects/ws.jpg new file mode 100644 index 0000000..73cb862 Binary files /dev/null and b/images/projects/ws.jpg differ diff --git a/images/technologies/galton.jpg b/images/technologies/galton.jpg new file mode 100644 index 0000000..4463eb7 Binary files /dev/null and b/images/technologies/galton.jpg differ diff --git a/images/technologies/martin.jpg b/images/technologies/martin.jpg new file mode 100644 index 0000000..f77d418 Binary files /dev/null and b/images/technologies/martin.jpg differ diff --git a/images/technologies/react.jpg b/images/technologies/react.jpg new file mode 100644 index 0000000..13e9e4d Binary files /dev/null and b/images/technologies/react.jpg differ diff --git a/images/technologies/thumb.galton.jpg b/images/technologies/thumb.galton.jpg new file mode 100644 index 0000000..792b313 Binary files /dev/null and b/images/technologies/thumb.galton.jpg differ diff --git a/images/technologies/thumb.martin.jpg b/images/technologies/thumb.martin.jpg new file mode 100644 index 0000000..daf62b7 Binary files /dev/null and b/images/technologies/thumb.martin.jpg differ diff --git a/images/technologies/thumb.react.jpg b/images/technologies/thumb.react.jpg new file mode 100644 index 0000000..9040dc0 Binary files /dev/null and b/images/technologies/thumb.react.jpg differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..0713521 --- /dev/null +++ b/index.html @@ -0,0 +1,116 @@ + + + + + + + Пространственные Системы + + + + + + +
        +
        +
        + Разработка геоинформационных ML/AutoML систем +
        +
        +
        + +
        +
        +
        +
        Наши особенности
        +
        +
        +
        True data driven
        +
        В основе наших систем лежит предиктивная аналитика на базе + машинного обучения на реальных ретроспективных данных, что делает содержание системы + отражением реальности
        +
        +
        +
        AutoML
        +
        Все data science процессы автоматизированы, предиктивные модели + обновляются по мере накопления новых данных, что позволяет поддерживать системы в + актуальном состоянии
        +
        +
        +
        Реактивность
        +
        Наши системы оснащены инструментами симуляций, позволяющими пользователю + перед принятием реального решения в режиме онлайн смоделировать целевую ситуацию и + оценить эффект её реализации
        +
        +
        +
        Прозрачность
        +
        Мы используем модели машинного обучения, позволяющие интерпретировать + каждый прогноз и понять какие именно факторы и в какой степени повлияли на итоговое значение +
        +
        +
        +
        +
        +
        + +
        +
        +
        +
        + Нам доверяют +
        +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        +
        + +
        +
        + + + \ No newline at end of file diff --git a/partners_logo/autoru.png b/partners_logo/autoru.png new file mode 100644 index 0000000..0d0cfcc Binary files /dev/null and b/partners_logo/autoru.png differ diff --git a/partners_logo/autoru_new.png b/partners_logo/autoru_new.png new file mode 100644 index 0000000..de2a2ad Binary files /dev/null and b/partners_logo/autoru_new.png differ diff --git a/partners_logo/dt.png b/partners_logo/dt.png new file mode 100644 index 0000000..21fe28f Binary files /dev/null and b/partners_logo/dt.png differ diff --git a/partners_logo/dvorulica.png b/partners_logo/dvorulica.png new file mode 100644 index 0000000..b6a2198 Binary files /dev/null and b/partners_logo/dvorulica.png differ diff --git a/partners_logo/gulag.png b/partners_logo/gulag.png new file mode 100644 index 0000000..a997fec Binary files /dev/null and b/partners_logo/gulag.png differ diff --git a/partners_logo/mapbox.png b/partners_logo/mapbox.png new file mode 100644 index 0000000..c2dd580 Binary files /dev/null and b/partners_logo/mapbox.png differ diff --git a/partners_logo/mapsme.png b/partners_logo/mapsme.png new file mode 100644 index 0000000..23e6792 Binary files /dev/null and b/partners_logo/mapsme.png differ diff --git a/partners_logo/pik.png b/partners_logo/pik.png new file mode 100644 index 0000000..6d7702b Binary files /dev/null and b/partners_logo/pik.png differ diff --git a/partners_logo/yandex.png b/partners_logo/yandex.png new file mode 100644 index 0000000..d4bfd87 Binary files /dev/null and b/partners_logo/yandex.png differ diff --git a/partners_logo/youdrive.png b/partners_logo/youdrive.png new file mode 100644 index 0000000..53318d1 Binary files /dev/null and b/partners_logo/youdrive.png differ diff --git a/project-post.html b/project-post.html new file mode 100644 index 0000000..2dcf1a6 --- /dev/null +++ b/project-post.html @@ -0,0 +1,71 @@ + + + + + + + Пространственные Системы + + + + + + + + +
        +
        +

        Section 1

        +
        +
        +
        +

        Slide 2.1

        +
        +
        +

        Slide 2.2

        +

        Lorem ipsum dolor sit amet consectetur adipisicing elit. Sequi delectus natus animi, necessitatibus + distinctio praesentium! Eligendi itaque hic aut quo, nesciunt explicabo fugit exercitationem totam + eveniet aliquid molestias, tempora possimus.

        +
        +
        +
        +

        Section 3

        +

        Lorem ipsum dolor sit amet consectetur adipisicing elit. Sequi delectus natus animi, necessitatibus + distinctio praesentium! Eligendi itaque hic aut quo, nesciunt explicabo fugit exercitationem totam + eveniet aliquid molestias, tempora possimus.

        +
        +
        + + + + + \ No newline at end of file diff --git a/projects.html b/projects.html new file mode 100644 index 0000000..11ea362 --- /dev/null +++ b/projects.html @@ -0,0 +1,64 @@ + + + + + + + Пространственные Системы + + + + + +
        +
        +
        Проекты
        +
        + +
        +
        + Городская инфраструктура
        +
        +
        +
        +
        +
        + Аварийность объектов ЖКХ
        +
        +
        +
        +
        +
        + Постаматы
        +
        +
        +
        + + +
        +
        + + + \ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..0813b2f --- /dev/null +++ b/style.css @@ -0,0 +1,630 @@ +/* Variables */ +:root { + --primary-font: "GOST", monospace; + --primary-color: rgb(20, 20, 28); + --primary-text-color: #cccccc; + --accent-text-color: rgb(227, 178, 179); + --font-size: 30px; + --padding: 30px; +} + +/* Font Face */ +@font-face { + font-family: "GOST"; + font-display: auto; + font-style: normal; + font-weight: normal; + src: url("./fonts/GOST.woff") format("woff"), + url("./fonts/GOST.woff2") format("woff2"); +} + +/* Global Styles */ +html { + font-family: var(--primary-font); + background: var(--primary-color); + font-size: var(--font-size); +} + +/* Navigation */ +.container { + position: fixed; + top: 0; + left: 0; + width: 100%; + padding: 0 30px; + box-sizing: border-box; + align-items: center; + background: var(--primary-color); + z-index: 1; + + div { + display: flex; + } +} + +#wrap { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + height: 80px; + border-bottom: 1px solid #cccccc; + + @media (max-width: 850px) { + flex-direction: column; + align-items: flex-start; + margin-top: 20px; + height: auto; + } +} + +#row { + @media (max-width: 850px) { + width: 100%; + margin-left: 0; + justify-content: space-between; + } +} + +#logo-container { + padding-top: 20px; + padding-bottom: 30px; + transition: opacity 0.3s; + font-size: 30px; + letter-spacing: 3px; + line-height: 33px; + text-transform: uppercase; + text-decoration: none; + color: #e4e4e4; + + @media (min-width: 850px) { + padding-top: 0; + padding-bottom: 0; + + &:hover { + opacity: 0.5; + } + } +} + +#navigation { + margin-left: auto; + + @media (max-width: 850px) { + width: 100%; + border-top: 1px solid #cccccc; + margin-left: 0; + justify-content: space-between; + } +} + +#navigation-link { + font-size: 30px; + line-height: 71px; + padding-top: 5px; + text-transform: uppercase; + margin-left: 30px; + text-decoration: none; + border-bottom: 3px solid transparent; + + color: rgba(204, 204, 204, 1); + + transition: color 0.3s; + + @media (min-width: 850px) { + &:hover { + color: rgba(204, 204, 204, 0.5); + } + } + + @media (max-width: 850px) { + margin-left: 0; + } +} + +#navigation-link-active { + font-size: 30px; + line-height: 71px; + padding-top: 5px; + text-transform: uppercase; + margin-left: 30px; + text-decoration: none; + border-bottom: 3px solid #ccc; + + color: rgba(204, 204, 204, 1); + + transition: color 0.3s; + + @media (min-width: 850px) { + &:hover { + color: rgba(204, 204, 204, 0.5); + } + } + + @media (max-width: 850px) { + margin-left: 0; + } +} + + +/* Hero */ +#first-container { + display: flex; + position: relative; + flex-direction: column; + padding: 80px 30px 0; + width: 100%; + + box-sizing: border-box; + + @media (max-width: 850px) { + padding-top: 170px; + } +} + +#first-wrap { + display: flex; + flex-direction: column; + position: relative; + justify-content: center; + align-items: center; + width: calc(100vw - 60px); + min-height: calc(80vh - 80px); + box-sizing: border-box; + padding: 60px 0 50px 0; + + @media (max-width: 850px) { + min-height: calc(100vh - 170px); + } +} + +#first-title { + line-height: calc(100vw / 23); + font-size: calc(100vw / 30); + text-transform: uppercase; + + background-size: 100%; + background-repeat: repeat; + background-clip: text; + -webkit-text-fill-color: transparent; + background-image: linear-gradient(55deg, rgb(255, 255, 255) 20%, rgba(245, 192, 192, 0.8) 100%); + + margin-bottom: 30px; + + @media (max-width: 850px) { + max-width: 100%; + line-height: 33px; + font-size: 30px; + } +} + +/* Наши особенности */ +#what-container { + border-top: 1px solid #CCCCCC; + display: flex; + position: relative; + width: 100%; + background: var(--primary-color); + justify-content: center; + align-items: center; + box-sizing: border-box; +} + +#what-wrap { + display: flex; + flex-direction: column; + position: relative; + justify-content: space-between; + width: calc(100vw - 60px); + min-height: inherit; + box-sizing: border-box; + padding: 50px 0; + + @media (max-width: 850px) { + min-height: inherit; + } +} + +#what-title { + line-height: 40px; + font-size: xx-large; + text-transform: uppercase; + + color: var(--primary-text-color); + + mix-blend-mode: normal; + margin-bottom: 30px; +} + +#what-content { + display: flex; + width: 100%; + flex-wrap: wrap; + justify-content: space-between; + margin-top: 60px; +} + +.block-container { + display: flex; + flex-direction: column; + width: 50%; + background: var(--primary-color); + flex-shrink: 0; + margin-bottom: 60px; + + @media (max-width: 850px) { + width: 100%; + } +} + +.block-title { + max-width: 200px; + min-height: 80px; + line-height: 40px; + font-size: 28px; + text-transform: uppercase; + color: var(--primary-text-color); + margin-bottom: 15px; + margin-right: 200px; +} + +.block-text { + max-width: 450px; + line-height: 40px; + font-size: 28px; + padding-right: 50px; + + color: var(--accent-text-color); +} + + + + + + + +/* Нам доверяют */ +#trusted-container { + display: flex; + flex-direction: column; + width: 100%; + justify-content: center; + align-items: center; +} + +#trusted-wrap { + display: flex; + flex-direction: column; + position: relative; + justify-content: space-between; + width: calc(100vw - 60px); + min-height: calc(100vh - 80px); + border-top: 1px solid #CCCCCC; + box-sizing: border-box; + padding: 50px 0; + + @media (max-width: 850px) { + min-height: calc(100vh - 170px); + } +} + +#trusted-title { + line-height: 40px; + font-size: 30px; + text-transform: uppercase; + + color: #cccccc; + + mix-blend-mode: normal; + margin-bottom: 30px; +} + +#trusted-content { + display: flex; + width: 100%; + flex-wrap: wrap; + justify-content: space-between; + margin-top: 60px; + margin-bottom: 60px; +} + +.trusted-block { + display: flex; + position: relative; + width: 25%; + flex-shrink: 0; + padding: 30px 0 90px; + align-items: center; + + img { + height: 45px; + } + + @media (max-width: 850px) { + width: 50%; + } +} + +#footer-container { + display: flex; + flex-direction: column; + width: 100%; + height: 180px; + border: 1px solid #CCCCCC; + justify-content: center; + align-items: center; + text-decoration: none; + color: #CCCCCC; +} + +#footer-title { + line-height: 40px; + font-size: 30px; + text-transform: uppercase; + + color: #cccccc; + + mix-blend-mode: normal; + margin-bottom: 30px; +} + +#footer-link { + position: relative; + font-family: 'IBM Plex Mono', monospace; + font-style: normal; + font-weight: normal; + font-size: 30px; + text-decoration-line: underline; + + color: #CCCCCC; + + transition: opacity 0.3s; + + &:after { + position: absolute; + content: ''; + right: -35px; + top: 10px; + width: 20px; + height: 25px; + background: url("./svg/Arrow.svg") no-repeat; + background-size: contain; + } + + &:hover { + opacity: 0.5; + } +} + +/* Projects */ +#projects-container { + display: flex; + flex-direction: column; + + width: 100%; + padding-top: 80px; + + box-sizing: border-box; + align-items: center; + + @media (max-width: 850px) { + padding-top: 200px; + } +} + +#projects-wrap { + display: flex; + flex-direction: column; + position: relative; + justify-content: space-between; + width: calc(100vw - 60px); + min-height: calc(100vh - 80px); + box-sizing: border-box; + padding: 50px 0; + + @media (max-width: 850px) { + min-height: calc(100vh - 170px); + } +} + +#projects-title { + line-height: 40px; + font-size: xx-large; + text-transform: uppercase; + + color: #cccccc; + + mix-blend-mode: normal; + margin-bottom: 30px; +} + +#projects-content { + display: flex; + position: relative; + justify-content: space-between; + flex-wrap: wrap; + padding-bottom: 60px; +} + + +.project-container { + display: block; + position: relative; + width: calc(33% - 15px); + height: auto; + margin-bottom: 30px; + cursor: pointer; + overflow: hidden; + text-decoration: none; + + @media (max-width: 1100px) { + width: calc(50% - 15px); + } + + @media (max-width: 850px) { + width: 100%; + + :before { + background-blend-mode: normal; + } + } +} + +.project-image { + content: ""; + display: block; + padding-top: 100%; + transition: background-color 0.3s; + background-position: center; + background-repeat: no-repeat; + background-blend-mode: luminosity; + background-size: cover; + cursor: pointer; +} + +.project-title .project-arrow { + display: block; + height: 25px; + width: 25px; + margin: 0 10px 3px; + background: url("./svg/Arrow_to_bottom.svg") no-repeat center; + background-size: contain; + transform: rotate(-90deg); + transition: transform 0.5s; +} + + +.project-container:hover .project-title { + backdrop-filter: invert(0.4); +} + +.project-container:hover .project-arrow { + transform: rotate(-90deg) translateY(10px); +} + +.project-title { + display: flex; + position: absolute; + top: 50%; + /* left: 50%; */ + /* transform: translate(-50%, -50%); */ + width: 100%; + backdrop-filter: invert(0.7); + font-size: 30px; + line-height: 37px; + transition: backdrop-filter 0.5s; + height: 3em; + + + text-transform: uppercase; + /* padding-left: 25px; */ + align-items: center; + + color: var(--primary-text-color); + + cursor: pointer; +} + +.project-title span { + display: flex; + margin: 1em; + align-items: center; +} + + + +.project-text { + font-size: 28px; + line-height: 37px; + color: #aaaaaa; +} + +/* Contacts */ +.contacts-container { + display: flex; + flex-direction: column; + width: 100%; + min-height: calc(100vh - 80px); + padding: 110px 30px 0; + background: var(--primary-color); + color: var(--primary-text-color); + + box-sizing: border-box; + + @media (max-width: 850px) { + padding-top: 230px; + } +} + +.contacts-main { + display: flex; + flex-grow: 1; + width: 100%; + justify-content: space-between; + padding-bottom: 50px; + + @media (max-width: 1200px) { + flex-direction: column; + } +} + +.contacts-content { + width: 33%; + + @media (max-width: 1200px) { + width: 50%; + padding-bottom: 30px; + } + + @media (max-width: 850px) { + width: 100%; + padding-bottom: 30px; + } +} + +.contacts-title { + line-height: 40px; + font-size: 30px; + text-transform: uppercase; + + color: #cccccc; + + mix-blend-mode: normal; + margin-bottom: 30px; + + @media (max-width: 1200px) { + width: 100%; + } +} + +.contacts-text { + width: 320px; + line-height: 40px; + font-size: 28px; + + color: #CCCCCC; + + mix-blend-mode: normal; + + @media (max-width: 1200px) { + width: 100%; + } +} + +.contacts-link { + position: relative; + font-style: normal; + font-weight: normal; + font-size: 30px; + text-decoration-line: underline; + + color: #cccccc; + + transition: opacity 0.3s; + + &:hover { + opacity: 0.5; + } + + cursor: pointer; +} \ No newline at end of file diff --git a/svg/Arrow.svg b/svg/Arrow.svg new file mode 100644 index 0000000..241b7d5 --- /dev/null +++ b/svg/Arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/svg/Arrow_to_bottom.svg b/svg/Arrow_to_bottom.svg new file mode 100644 index 0000000..74265fe --- /dev/null +++ b/svg/Arrow_to_bottom.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/svg/URBICA.svg b/svg/URBICA.svg new file mode 100644 index 0000000..e442896 --- /dev/null +++ b/svg/URBICA.svg @@ -0,0 +1,3 @@ + + +