diff --git a/inst/rmarkdown/templates/revealjs_presentation/js/reveal.min.js b/inst/rmarkdown/templates/revealjs_presentation/js/reveal.min.js
index e7cec6f..9474dac 100644
--- a/inst/rmarkdown/templates/revealjs_presentation/js/reveal.min.js
+++ b/inst/rmarkdown/templates/revealjs_presentation/js/reveal.min.js
@@ -1,9 +1,9 @@
 /*!
- * reveal.js 2.6.1 (2013-12-02, 12:23)
+ * reveal.js 3.0.0 (2015-03-05, 09:06)
  * http://lab.hakim.se/reveal-js
  * MIT licensed
  *
- * Copyright (C) 2013 Hakim El Hattab, http://hakim.se
+ * Copyright (C) 2015 Hakim El Hattab, http://hakim.se
  */
-var Reveal=function(){"use strict";function a(a){if(b(),!ec.transforms2d&&!ec.transforms3d)return document.body.setAttribute("class","no-transforms"),void 0;window.addEventListener("load",A,!1);var d=Reveal.getQueryHash();"undefined"!=typeof d.dependencies&&delete d.dependencies,k(_b,a),k(_b,d),r(),c()}function b(){ec.transforms3d="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,ec.transforms2d="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,ec.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,ec.requestAnimationFrame="function"==typeof ec.requestAnimationFrameMethod,ec.canvas=!!document.createElement("canvas").getContext,Vb=navigator.userAgent.match(/(iphone|ipod|android)/gi)}function c(){function a(){e.length&&head.js.apply(null,e),d()}function b(b){head.ready(b.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],function(){"function"==typeof b.callback&&b.callback.apply(this),0===--f&&a()})}for(var c=[],e=[],f=0,g=0,h=_b.dependencies.length;h>g;g++){var i=_b.dependencies[g];(!i.condition||i.condition())&&(i.async?e.push(i.src):c.push(i.src),b(i))}c.length?(f=c.length,head.js.apply(null,c)):a()}function d(){e(),Q(),h(),cb(),X(!0),setTimeout(function(){dc.slides.classList.remove("no-transition"),ac=!0,t("ready",{indexh:Qb,indexv:Rb,currentSlide:Tb})},1)}function e(){dc.theme=document.querySelector("#theme"),dc.wrapper=document.querySelector(".reveal"),dc.slides=document.querySelector(".reveal .slides"),dc.slides.classList.add("no-transition"),dc.background=f(dc.wrapper,"div","backgrounds",null),dc.progress=f(dc.wrapper,"div","progress","<span></span>"),dc.progressbar=dc.progress.querySelector("span"),f(dc.wrapper,"aside","controls",'<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>'),dc.slideNumber=f(dc.wrapper,"div","slide-number",""),f(dc.wrapper,"div","state-background",null),f(dc.wrapper,"div","pause-overlay",null),dc.controls=document.querySelector(".reveal .controls"),dc.controlsLeft=l(document.querySelectorAll(".navigate-left")),dc.controlsRight=l(document.querySelectorAll(".navigate-right")),dc.controlsUp=l(document.querySelectorAll(".navigate-up")),dc.controlsDown=l(document.querySelectorAll(".navigate-down")),dc.controlsPrev=l(document.querySelectorAll(".navigate-prev")),dc.controlsNext=l(document.querySelectorAll(".navigate-next"))}function f(a,b,c,d){var e=a.querySelector("."+c);return e||(e=document.createElement(b),e.classList.add(c),null!==d&&(e.innerHTML=d),a.appendChild(e)),e}function g(){function a(a,b){var c={background:a.getAttribute("data-background"),backgroundSize:a.getAttribute("data-background-size"),backgroundImage:a.getAttribute("data-background-image"),backgroundColor:a.getAttribute("data-background-color"),backgroundRepeat:a.getAttribute("data-background-repeat"),backgroundPosition:a.getAttribute("data-background-position"),backgroundTransition:a.getAttribute("data-background-transition")},d=document.createElement("div");return d.className="slide-background",c.background&&(/^(http|file|\/\/)/gi.test(c.background)||/\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test(c.background)?d.style.backgroundImage="url("+c.background+")":d.style.background=c.background),(c.background||c.backgroundColor||c.backgroundImage)&&d.setAttribute("data-background-hash",c.background+c.backgroundSize+c.backgroundImage+c.backgroundColor+c.backgroundRepeat+c.backgroundPosition+c.backgroundTransition),c.backgroundSize&&(d.style.backgroundSize=c.backgroundSize),c.backgroundImage&&(d.style.backgroundImage='url("'+c.backgroundImage+'")'),c.backgroundColor&&(d.style.backgroundColor=c.backgroundColor),c.backgroundRepeat&&(d.style.backgroundRepeat=c.backgroundRepeat),c.backgroundPosition&&(d.style.backgroundPosition=c.backgroundPosition),c.backgroundTransition&&d.setAttribute("data-background-transition",c.backgroundTransition),b.appendChild(d),d}q()&&document.body.classList.add("print-pdf"),dc.background.innerHTML="",dc.background.classList.add("no-transition"),l(document.querySelectorAll(Yb)).forEach(function(b){var c;c=q()?a(b,b):a(b,dc.background),l(b.querySelectorAll("section")).forEach(function(b){q()?a(b,b):a(b,c)})}),_b.parallaxBackgroundImage?(dc.background.style.backgroundImage='url("'+_b.parallaxBackgroundImage+'")',dc.background.style.backgroundSize=_b.parallaxBackgroundSize,setTimeout(function(){dc.wrapper.classList.add("has-parallax-background")},1)):(dc.background.style.backgroundImage="",dc.wrapper.classList.remove("has-parallax-background"))}function h(a){var b=document.querySelectorAll(Xb).length;if(dc.wrapper.classList.remove(_b.transition),"object"==typeof a&&k(_b,a),ec.transforms3d===!1&&(_b.transition="linear"),dc.wrapper.classList.add(_b.transition),dc.wrapper.setAttribute("data-transition-speed",_b.transitionSpeed),dc.wrapper.setAttribute("data-background-transition",_b.backgroundTransition),dc.controls.style.display=_b.controls?"block":"none",dc.progress.style.display=_b.progress?"block":"none",_b.rtl?dc.wrapper.classList.add("rtl"):dc.wrapper.classList.remove("rtl"),_b.center?dc.wrapper.classList.add("center"):dc.wrapper.classList.remove("center"),_b.mouseWheel?(document.addEventListener("DOMMouseScroll",Bb,!1),document.addEventListener("mousewheel",Bb,!1)):(document.removeEventListener("DOMMouseScroll",Bb,!1),document.removeEventListener("mousewheel",Bb,!1)),_b.rollingLinks?u():v(),_b.previewLinks?w():(x(),w("[data-preview-link]")),b>1&&_b.autoSlide&&_b.autoSlideStoppable&&ec.canvas&&ec.requestAnimationFrame?(Wb=new Pb(dc.wrapper,function(){return Math.min(Math.max((Date.now()-mc)/kc,0),1)}),Wb.on("click",Ob),nc=!1):Wb&&(Wb.destroy(),Wb=null),_b.theme&&dc.theme){var c=dc.theme.getAttribute("href"),d=/[^\/]*?(?=\.css)/,e=c.match(d)[0];_b.theme!==e&&(c=c.replace(d,_b.theme),dc.theme.setAttribute("href",c))}P()}function i(){if(jc=!0,window.addEventListener("hashchange",Jb,!1),window.addEventListener("resize",Kb,!1),_b.touch&&(dc.wrapper.addEventListener("touchstart",vb,!1),dc.wrapper.addEventListener("touchmove",wb,!1),dc.wrapper.addEventListener("touchend",xb,!1),window.navigator.msPointerEnabled&&(dc.wrapper.addEventListener("MSPointerDown",yb,!1),dc.wrapper.addEventListener("MSPointerMove",zb,!1),dc.wrapper.addEventListener("MSPointerUp",Ab,!1))),_b.keyboard&&document.addEventListener("keydown",ub,!1),_b.progress&&dc.progress&&dc.progress.addEventListener("click",Cb,!1),_b.focusBodyOnPageVisiblityChange){var a;"hidden"in document?a="visibilitychange":"msHidden"in document?a="msvisibilitychange":"webkitHidden"in document&&(a="webkitvisibilitychange"),a&&document.addEventListener(a,Lb,!1)}["touchstart","click"].forEach(function(a){dc.controlsLeft.forEach(function(b){b.addEventListener(a,Db,!1)}),dc.controlsRight.forEach(function(b){b.addEventListener(a,Eb,!1)}),dc.controlsUp.forEach(function(b){b.addEventListener(a,Fb,!1)}),dc.controlsDown.forEach(function(b){b.addEventListener(a,Gb,!1)}),dc.controlsPrev.forEach(function(b){b.addEventListener(a,Hb,!1)}),dc.controlsNext.forEach(function(b){b.addEventListener(a,Ib,!1)})})}function j(){jc=!1,document.removeEventListener("keydown",ub,!1),window.removeEventListener("hashchange",Jb,!1),window.removeEventListener("resize",Kb,!1),dc.wrapper.removeEventListener("touchstart",vb,!1),dc.wrapper.removeEventListener("touchmove",wb,!1),dc.wrapper.removeEventListener("touchend",xb,!1),window.navigator.msPointerEnabled&&(dc.wrapper.removeEventListener("MSPointerDown",yb,!1),dc.wrapper.removeEventListener("MSPointerMove",zb,!1),dc.wrapper.removeEventListener("MSPointerUp",Ab,!1)),_b.progress&&dc.progress&&dc.progress.removeEventListener("click",Cb,!1),["touchstart","click"].forEach(function(a){dc.controlsLeft.forEach(function(b){b.removeEventListener(a,Db,!1)}),dc.controlsRight.forEach(function(b){b.removeEventListener(a,Eb,!1)}),dc.controlsUp.forEach(function(b){b.removeEventListener(a,Fb,!1)}),dc.controlsDown.forEach(function(b){b.removeEventListener(a,Gb,!1)}),dc.controlsPrev.forEach(function(b){b.removeEventListener(a,Hb,!1)}),dc.controlsNext.forEach(function(b){b.removeEventListener(a,Ib,!1)})})}function k(a,b){for(var c in b)a[c]=b[c]}function l(a){return Array.prototype.slice.call(a)}function m(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function n(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function o(a){var b=0;if(a){var c=0;l(a.childNodes).forEach(function(a){"number"==typeof a.offsetTop&&a.style&&("absolute"===a.style.position&&(c+=1),b=Math.max(b,a.offsetTop+a.offsetHeight))}),0===c&&(b=a.offsetHeight)}return b}function p(a,b){if(b=b||0,a){var c=a.parentNode,d=c.childNodes;l(d).forEach(function(c){if("number"==typeof c.offsetHeight&&c!==a){var d=window.getComputedStyle(c),e=parseInt(d.marginTop,10),f=parseInt(d.marginBottom,10);b-=c.offsetHeight+e+f}});var e=window.getComputedStyle(a);b-=parseInt(e.marginTop,10)+parseInt(e.marginBottom,10)}return b}function q(){return/print-pdf/gi.test(window.location.search)}function r(){_b.hideAddressBar&&Vb&&(window.addEventListener("load",s,!1),window.addEventListener("orientationchange",s,!1))}function s(){setTimeout(function(){window.scrollTo(0,1)},10)}function t(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),k(c,b),dc.wrapper.dispatchEvent(c)}function u(){if(ec.transforms3d&&!("msPerspective"in document.body.style))for(var a=document.querySelectorAll(Xb+" a:not(.image)"),b=0,c=a.length;c>b;b++){var d=a[b];if(!(!d.textContent||d.querySelector("*")||d.className&&d.classList.contains(d,"roll"))){var e=document.createElement("span");e.setAttribute("data-title",d.text),e.innerHTML=d.innerHTML,d.classList.add("roll"),d.innerHTML="",d.appendChild(e)}}}function v(){for(var a=document.querySelectorAll(Xb+" a.roll"),b=0,c=a.length;c>b;b++){var d=a[b],e=d.querySelector("span");e&&(d.classList.remove("roll"),d.innerHTML=e.innerHTML)}}function w(a){var b=l(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",Nb,!1)})}function x(){var a=l(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",Nb,!1)})}function y(a){z(),dc.preview=document.createElement("div"),dc.preview.classList.add("preview-link-overlay"),dc.wrapper.appendChild(dc.preview),dc.preview.innerHTML=["<header>",'<a class="close" href="#"><span class="icon"></span></a>','<a class="external" href="'+a+'" target="_blank"><span class="icon"></span></a>',"</header>",'<div class="spinner"></div>','<div class="viewport">','<iframe src="'+a+'"></iframe>',"</div>"].join(""),dc.preview.querySelector("iframe").addEventListener("load",function(){dc.preview.classList.add("loaded")},!1),dc.preview.querySelector(".close").addEventListener("click",function(a){z(),a.preventDefault()},!1),dc.preview.querySelector(".external").addEventListener("click",function(){z()},!1),setTimeout(function(){dc.preview.classList.add("visible")},1)}function z(){dc.preview&&(dc.preview.setAttribute("src",""),dc.preview.parentNode.removeChild(dc.preview),dc.preview=null)}function A(){if(dc.wrapper&&!q()){var a=dc.wrapper.offsetWidth,b=dc.wrapper.offsetHeight;a-=b*_b.margin,b-=b*_b.margin;var c=_b.width,d=_b.height,e=20;B(_b.width,_b.height,e),"string"==typeof c&&/%$/.test(c)&&(c=parseInt(c,10)/100*a),"string"==typeof d&&/%$/.test(d)&&(d=parseInt(d,10)/100*b),dc.slides.style.width=c+"px",dc.slides.style.height=d+"px",cc=Math.min(a/c,b/d),cc=Math.max(cc,_b.minScale),cc=Math.min(cc,_b.maxScale),"undefined"==typeof dc.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)?n(dc.slides,"translate(-50%, -50%) scale("+cc+") translate(50%, 50%)"):dc.slides.style.zoom=cc;for(var f=l(document.querySelectorAll(Xb)),g=0,h=f.length;h>g;g++){var i=f[g];"none"!==i.style.display&&(i.style.top=_b.center||i.classList.contains("center")?i.classList.contains("stack")?0:Math.max(-(o(i)/2)-e,-d/2)+"px":"")}U(),Y()}}function B(a,b,c){l(dc.slides.querySelectorAll("section > .stretch")).forEach(function(d){var e=p(d,b-2*c);if(/(img|video)/gi.test(d.nodeName)){var f=d.naturalWidth||d.videoWidth,g=d.naturalHeight||d.videoHeight,h=Math.min(a/f,e/g);d.style.width=f*h+"px",d.style.height=g*h+"px"}else d.style.width=a+"px",d.style.height=e+"px"})}function C(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function D(a){if("object"==typeof a&&"function"==typeof a.setAttribute&&a.classList.contains("stack")){var b=a.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(a.getAttribute(b)||0,10)}return 0}function E(){if(_b.overview){kb();var a=dc.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;dc.wrapper.classList.add("overview"),dc.wrapper.classList.remove("overview-deactivating"),clearTimeout(hc),clearTimeout(ic),hc=setTimeout(function(){for(var c=document.querySelectorAll(Yb),d=0,e=c.length;e>d;d++){var f=c[d],g=_b.rtl?-105:105;if(f.setAttribute("data-index-h",d),n(f,"translateZ(-"+b+"px) translate("+(d-Qb)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===Qb?Rb:D(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),n(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",Mb,!0)}else f.addEventListener("click",Mb,!0)}T(),A(),a||t("overviewshown",{indexh:Qb,indexv:Rb,currentSlide:Tb})},10)}}function F(){_b.overview&&(clearTimeout(hc),clearTimeout(ic),dc.wrapper.classList.remove("overview"),dc.wrapper.classList.add("overview-deactivating"),ic=setTimeout(function(){dc.wrapper.classList.remove("overview-deactivating")},1),l(document.querySelectorAll(Xb)).forEach(function(a){n(a,""),a.removeEventListener("click",Mb,!0)}),O(Qb,Rb),jb(),t("overviewhidden",{indexh:Qb,indexv:Rb,currentSlide:Tb}))}function G(a){"boolean"==typeof a?a?E():F():H()?F():E()}function H(){return dc.wrapper.classList.contains("overview")}function I(a){return a=a?a:Tb,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function J(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function K(){var a=dc.wrapper.classList.contains("paused");kb(),dc.wrapper.classList.add("paused"),a===!1&&t("paused")}function L(){var a=dc.wrapper.classList.contains("paused");dc.wrapper.classList.remove("paused"),jb(),a&&t("resumed")}function M(){N()?L():K()}function N(){return dc.wrapper.classList.contains("paused")}function O(a,b,c,d){Sb=Tb;var e=document.querySelectorAll(Yb);void 0===b&&(b=D(e[a])),Sb&&Sb.parentNode&&Sb.parentNode.classList.contains("stack")&&C(Sb.parentNode,Rb);var f=bc.concat();bc.length=0;var g=Qb||0,h=Rb||0;Qb=S(Yb,void 0===a?Qb:a),Rb=S(Zb,void 0===b?Rb:b),T(),A();a:for(var i=0,j=bc.length;j>i;i++){for(var k=0;k<f.length;k++)if(f[k]===bc[i]){f.splice(k,1);continue a}document.documentElement.classList.add(bc[i]),t(bc[i])}for(;f.length;)document.documentElement.classList.remove(f.pop());H()&&E();var m=e[Qb],n=m.querySelectorAll("section");Tb=n[Rb]||m,"undefined"!=typeof c&&gb(c);var o=Qb!==g||Rb!==h;o?t("slidechanged",{indexh:Qb,indexv:Rb,previousSlide:Sb,currentSlide:Tb,origin:d}):Sb=null,Sb&&(Sb.classList.remove("present"),document.querySelector($b).classList.contains("present")&&setTimeout(function(){var a,b=l(document.querySelectorAll(Yb+".stack"));for(a in b)b[a]&&C(b[a],0)},0)),o&&(ab(Sb),_(Tb)),W(),U(),X(),Y(),V(),db(),jb()}function P(){j(),i(),A(),kc=_b.autoSlide,jb(),g(),R(),W(),U(),X(!0),V()}function Q(){var a=l(document.querySelectorAll(Yb));a.forEach(function(a){var b=l(a.querySelectorAll("section"));b.forEach(function(a,b){b>0&&(a.classList.remove("present"),a.classList.remove("past"),a.classList.add("future"))})})}function R(){var a=l(document.querySelectorAll(Yb));a.forEach(function(a){var b=l(a.querySelectorAll("section"));b.forEach(function(a){fb(a.querySelectorAll(".fragment"))}),0===b.length&&fb(a.querySelectorAll(".fragment"))})}function S(a,b){var c=l(document.querySelectorAll(a)),d=c.length;if(d){_b.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var e=0;d>e;e++){var f=c[e],g=_b.rtl&&!I(f);if(f.classList.remove("past"),f.classList.remove("present"),f.classList.remove("future"),f.setAttribute("hidden",""),b>e){f.classList.add(g?"future":"past");for(var h=l(f.querySelectorAll(".fragment"));h.length;){var i=h.pop();i.classList.add("visible"),i.classList.remove("current-fragment")}}else if(e>b){f.classList.add(g?"past":"future");for(var j=l(f.querySelectorAll(".fragment.visible"));j.length;){var k=j.pop();k.classList.remove("visible"),k.classList.remove("current-fragment")}}f.querySelector("section")&&f.classList.add("stack")}c[b].classList.add("present"),c[b].removeAttribute("hidden");var m=c[b].getAttribute("data-state");m&&(bc=bc.concat(m.split(" ")))}else b=0;return b}function T(){var a,b,c=l(document.querySelectorAll(Yb)),d=c.length;if(d){var e=H()?10:_b.viewDistance;Vb&&(e=H()?6:1);for(var f=0;d>f;f++){var g=c[f],h=l(g.querySelectorAll("section")),i=h.length;if(a=Math.abs((Qb-f)%(d-e))||0,g.style.display=a>e?"none":"block",i)for(var j=D(g),k=0;i>k;k++){var m=h[k];b=f===Qb?Math.abs(Rb-k):Math.abs(k-j),m.style.display=a+b>e?"none":"block"}}}}function U(){if(_b.progress&&dc.progress){var a=l(document.querySelectorAll(Yb)),b=document.querySelectorAll(Xb+":not(.stack)").length,c=0;a:for(var d=0;d<a.length;d++){for(var e=a[d],f=l(e.querySelectorAll("section")),g=0;g<f.length;g++){if(f[g].classList.contains("present"))break a;c++}if(e.classList.contains("present"))break;e.classList.contains("stack")===!1&&c++}dc.progressbar.style.width=c/(b-1)*window.innerWidth+"px"}}function V(){if(_b.slideNumber&&dc.slideNumber){var a=Qb;Rb>0&&(a+=" - "+Rb),dc.slideNumber.innerHTML=a}}function W(){var a=Z(),b=$();dc.controlsLeft.concat(dc.controlsRight).concat(dc.controlsUp).concat(dc.controlsDown).concat(dc.controlsPrev).concat(dc.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&dc.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&dc.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&dc.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&dc.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&dc.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&dc.controlsNext.forEach(function(a){a.classList.add("enabled")}),Tb&&(b.prev&&dc.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&dc.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),I(Tb)?(b.prev&&dc.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&dc.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&dc.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&dc.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function X(a){var b=null,c=_b.rtl?"future":"past",d=_b.rtl?"past":"future";if(l(dc.background.childNodes).forEach(function(e,f){Qb>f?e.className="slide-background "+c:f>Qb?e.className="slide-background "+d:(e.className="slide-background present",b=e),(a||f===Qb)&&l(e.childNodes).forEach(function(a,c){Rb>c?a.className="slide-background past":c>Rb?a.className="slide-background future":(a.className="slide-background present",f===Qb&&(b=a))})}),b){var e=Ub?Ub.getAttribute("data-background-hash"):null,f=b.getAttribute("data-background-hash");f&&f===e&&b!==Ub&&dc.background.classList.add("no-transition"),Ub=b}setTimeout(function(){dc.background.classList.remove("no-transition")},1)}function Y(){if(_b.parallaxBackgroundImage){var a,b,c=document.querySelectorAll(Yb),d=document.querySelectorAll(Zb),e=dc.background.style.backgroundSize.split(" ");1===e.length?a=b=parseInt(e[0],10):(a=parseInt(e[0],10),b=parseInt(e[1],10));var f=dc.background.offsetWidth,g=c.length,h=-(a-f)/(g-1)*Qb,i=dc.background.offsetHeight,j=d.length,k=j>0?-(b-i)/(j-1)*Rb:0;dc.background.style.backgroundPosition=h+"px "+k+"px"}}function Z(){var a=document.querySelectorAll(Yb),b=document.querySelectorAll(Zb),c={left:Qb>0||_b.loop,right:Qb<a.length-1||_b.loop,up:Rb>0,down:Rb<b.length-1};if(_b.rtl){var d=c.left;c.left=c.right,c.right=d}return c}function $(){if(Tb&&_b.fragments){var a=Tb.querySelectorAll(".fragment"),b=Tb.querySelectorAll(".fragment:not(.visible)");return{prev:a.length-b.length>0,next:!!b.length}}return{prev:!1,next:!1}}function _(a){a&&!bb()&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:start","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function ab(a){a&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:stop","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-ignore")||"function"!=typeof a.contentWindow.postMessage||a.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function bb(){return!!window.location.search.match(/receiver/gi)}function cb(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d=document.querySelector("#"+c);if(d){var e=Reveal.getIndices(d);O(e.h,e.v)}else O(Qb||0,Rb||0)}else{var f=parseInt(b[0],10)||0,g=parseInt(b[1],10)||0;(f!==Qb||g!==Rb)&&O(f,g)}}function db(a){if(_b.history)if(clearTimeout(gc),"number"==typeof a)gc=setTimeout(db,a);else{var b="/";Tb&&"string"==typeof Tb.getAttribute("id")?b="/"+Tb.getAttribute("id"):((Qb>0||Rb>0)&&(b+=Qb),Rb>0&&(b+="/"+Rb)),window.location.hash=b}}function eb(a){var b,c=Qb,d=Rb;if(a){var e=I(a),f=e?a.parentNode:a,g=l(document.querySelectorAll(Yb));c=Math.max(g.indexOf(f),0),e&&(d=Math.max(l(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&Tb){var h=Tb.querySelectorAll(".fragment").length>0;if(h){var i=Tb.querySelectorAll(".fragment.visible");b=i.length-1}}return{h:c,v:d,f:b}}function fb(a){a=l(a);var b=[],c=[],d=[];a.forEach(function(a){if(a.hasAttribute("data-fragment-index")){var d=parseInt(a.getAttribute("data-fragment-index"),10);b[d]||(b[d]=[]),b[d].push(a)}else c.push([a])}),b=b.concat(c);var e=0;return b.forEach(function(a){a.forEach(function(a){d.push(a),a.setAttribute("data-fragment-index",e)}),e++}),d}function gb(a,b){if(Tb&&_b.fragments){var c=fb(Tb.querySelectorAll(".fragment"));if(c.length){if("number"!=typeof a){var d=fb(Tb.querySelectorAll(".fragment.visible")).pop();a=d?parseInt(d.getAttribute("data-fragment-index")||0,10):-1}"number"==typeof b&&(a+=b);var e=[],f=[];return l(c).forEach(function(b,c){b.hasAttribute("data-fragment-index")&&(c=parseInt(b.getAttribute("data-fragment-index"),10)),a>=c?(b.classList.contains("visible")||e.push(b),b.classList.add("visible"),b.classList.remove("current-fragment"),c===a&&b.classList.add("current-fragment")):(b.classList.contains("visible")&&f.push(b),b.classList.remove("visible"),b.classList.remove("current-fragment"))}),f.length&&t("fragmenthidden",{fragment:f[0],fragments:f}),e.length&&t("fragmentshown",{fragment:e[0],fragments:e}),W(),!(!e.length&&!f.length)}}return!1}function hb(){return gb(null,1)}function ib(){return gb(null,-1)}function jb(){if(kb(),Tb){var a=Tb.parentNode?Tb.parentNode.getAttribute("data-autoslide"):null,b=Tb.getAttribute("data-autoslide");kc=b?parseInt(b,10):a?parseInt(a,10):_b.autoSlide,l(Tb.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&kc&&1e3*a.duration>kc&&(kc=1e3*a.duration+1e3)}),!kc||nc||N()||H()||Reveal.isLastSlide()&&_b.loop!==!0||(lc=setTimeout(sb,kc),mc=Date.now()),Wb&&Wb.setPlaying(-1!==lc)}}function kb(){clearTimeout(lc),lc=-1}function lb(){nc=!0,clearTimeout(lc),Wb&&Wb.setPlaying(!1)}function mb(){nc=!1,jb()}function nb(){_b.rtl?(H()||hb()===!1)&&Z().left&&O(Qb+1):(H()||ib()===!1)&&Z().left&&O(Qb-1)}function ob(){_b.rtl?(H()||ib()===!1)&&Z().right&&O(Qb-1):(H()||hb()===!1)&&Z().right&&O(Qb+1)}function pb(){(H()||ib()===!1)&&Z().up&&O(Qb,Rb-1)}function qb(){(H()||hb()===!1)&&Z().down&&O(Qb,Rb+1)}function rb(){if(ib()===!1)if(Z().up)pb();else{var a=document.querySelector(Yb+".past:nth-child("+Qb+")");if(a){var b=a.querySelectorAll("section").length-1||void 0,c=Qb-1;O(c,b)}}}function sb(){hb()===!1&&(Z().down?qb():ob()),jb()}function tb(){_b.autoSlideStoppable&&lb()}function ub(a){tb(a),document.activeElement;var b=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(b||a.shiftKey&&32!==a.keyCode||a.altKey||a.ctrlKey||a.metaKey)){if(N()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var c=!1;if("object"==typeof _b.keyboard)for(var d in _b.keyboard)if(parseInt(d,10)===a.keyCode){var e=_b.keyboard[d];"function"==typeof e?e.apply(null,[a]):"string"==typeof e&&"function"==typeof Reveal[e]&&Reveal[e].call(),c=!0}if(c===!1)switch(c=!0,a.keyCode){case 80:case 33:rb();break;case 78:case 34:sb();break;case 72:case 37:nb();break;case 76:case 39:ob();break;case 75:case 38:pb();break;case 74:case 40:qb();break;case 36:O(0);break;case 35:O(Number.MAX_VALUE);break;case 32:H()?F():a.shiftKey?rb():sb();break;case 13:H()?F():c=!1;break;case 66:case 190:case 191:M();break;case 70:J();break;default:c=!1}c?a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!ec.transforms3d||(dc.preview?z():G(),a.preventDefault()),jb()}}function vb(a){oc.startX=a.touches[0].clientX,oc.startY=a.touches[0].clientY,oc.startCount=a.touches.length,2===a.touches.length&&_b.overview&&(oc.startSpan=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:oc.startX,y:oc.startY}))}function wb(a){if(oc.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{tb(a);var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===oc.startCount&&_b.overview){var d=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:oc.startX,y:oc.startY});Math.abs(oc.startSpan-d)>oc.threshold&&(oc.captured=!0,d<oc.startSpan?E():F()),a.preventDefault()}else if(1===a.touches.length&&2!==oc.startCount){var e=b-oc.startX,f=c-oc.startY;e>oc.threshold&&Math.abs(e)>Math.abs(f)?(oc.captured=!0,nb()):e<-oc.threshold&&Math.abs(e)>Math.abs(f)?(oc.captured=!0,ob()):f>oc.threshold?(oc.captured=!0,pb()):f<-oc.threshold&&(oc.captured=!0,qb()),_b.embedded?(oc.captured||I(Tb))&&a.preventDefault():a.preventDefault()}}}function xb(){oc.captured=!1}function yb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],vb(a))}function zb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],wb(a))}function Ab(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],xb(a))}function Bb(a){if(Date.now()-fc>600){fc=Date.now();var b=a.detail||-a.wheelDelta;b>0?sb():rb()}}function Cb(a){tb(a),a.preventDefault();var b=l(document.querySelectorAll(Yb)).length,c=Math.floor(a.clientX/dc.wrapper.offsetWidth*b);O(c)}function Db(a){a.preventDefault(),tb(),nb()}function Eb(a){a.preventDefault(),tb(),ob()}function Fb(a){a.preventDefault(),tb(),pb()}function Gb(a){a.preventDefault(),tb(),qb()}function Hb(a){a.preventDefault(),tb(),rb()}function Ib(a){a.preventDefault(),tb(),sb()}function Jb(){cb()}function Kb(){A()}function Lb(){var a=document.webkitHidden||document.msHidden||document.hidden;a===!1&&document.activeElement!==document.body&&(document.activeElement.blur(),document.body.focus())}function Mb(a){if(jc&&H()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(F(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);O(c,d)}}}function Nb(a){var b=a.target.getAttribute("href");b&&(y(b),a.preventDefault())}function Ob(){Reveal.isLastSlide()&&_b.loop===!1?(O(0,0),mb()):nc?mb():lb()}function Pb(a,b){this.diameter=50,this.thickness=3,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=a,this.progressCheck=b,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}var Qb,Rb,Sb,Tb,Ub,Vb,Wb,Xb=".reveal .slides section",Yb=".reveal .slides>section",Zb=".reveal .slides>section.present>section",$b=".reveal .slides>section:first-of-type",_b={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,slideNumber:!1,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,embedded:!1,autoSlide:0,autoSlideStoppable:!0,mouseWheel:!1,rollingLinks:!1,hideAddressBar:!0,previewLinks:!1,focusBodyOnPageVisiblityChange:!0,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",parallaxBackgroundImage:"",parallaxBackgroundSize:"",viewDistance:3,dependencies:[]},ac=!1,bc=[],cc=1,dc={},ec={},fc=0,gc=0,hc=0,ic=0,jc=!1,kc=0,lc=0,mc=-1,nc=!1,oc={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return Pb.prototype.setPlaying=function(a){var b=this.playing;this.playing=a,!b&&this.playing?this.animate():this.render()},Pb.prototype.animate=function(){var a=this.progress;this.progress=this.progressCheck(),a>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&ec.requestAnimationFrameMethod.call(window,this.animate.bind(this))},Pb.prototype.render=function(){var a=this.playing?this.progress:0,b=this.diameter/2-this.thickness,c=this.diameter/2,d=this.diameter/2,e=14;this.progressOffset+=.1*(1-this.progressOffset);var f=-Math.PI/2+a*2*Math.PI,g=-Math.PI/2+this.progressOffset*2*Math.PI;this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(c,d,b+2,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(c,d,b,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#666",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(c,d,b,g,f,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(c-e/2,d-e/2),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,e/2-2,e),this.context.fillRect(e/2+2,0,e/2-2,e)):(this.context.beginPath(),this.context.translate(2,0),this.context.moveTo(0,0),this.context.lineTo(e-2,e/2),this.context.lineTo(0,e),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()},Pb.prototype.on=function(a,b){this.canvas.addEventListener(a,b,!1)},Pb.prototype.off=function(a,b){this.canvas.removeEventListener(a,b,!1)},Pb.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},{initialize:a,configure:h,sync:P,slide:O,left:nb,right:ob,up:pb,down:qb,prev:rb,next:sb,navigateFragment:gb,prevFragment:ib,nextFragment:hb,navigateTo:O,navigateLeft:nb,navigateRight:ob,navigateUp:pb,navigateDown:qb,navigatePrev:rb,navigateNext:sb,layout:A,availableRoutes:Z,availableFragments:$,toggleOverview:G,togglePause:M,isOverview:H,isPaused:N,addEventListeners:i,removeEventListeners:j,getIndices:eb,getSlide:function(a,b){var c=document.querySelectorAll(Yb)[a],d=c&&c.querySelectorAll("section");
-return"undefined"!=typeof b?d?d[b]:void 0:c},getPreviousSlide:function(){return Sb},getCurrentSlide:function(){return Tb},getScale:function(){return cc},getConfig:function(){return _b},getQueryHash:function(){var a={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,function(b){a[b.split("=").shift()]=b.split("=").pop()});for(var b in a){var c=a[b];a[b]=unescape(c),"null"===c?a[b]=null:"true"===c?a[b]=!0:"false"===c?a[b]=!1:c.match(/^\d+$/)&&(a[b]=parseFloat(c))}return a},isFirstSlide:function(){return null==document.querySelector(Xb+".past")?!0:!1},isLastSlide:function(){return Tb?Tb.nextElementSibling?!1:I(Tb)&&Tb.parentNode.nextElementSibling?!1:!0:!1},isReady:function(){return ac},addEventListener:function(a,b,c){"addEventListener"in window&&(dc.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(dc.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}();
\ No newline at end of file
+!function(a,b){"function"==typeof define&&define.amd?define(function(){return a.Reveal=b(),a.Reveal}):"object"==typeof exports?module.exports=b():a.Reveal=b()}(this,function(){"use strict";function a(a){if(b(),Bc.transforms2d||Bc.transforms3d){Ac.wrapper=document.querySelector(".reveal"),Ac.slides=document.querySelector(".reveal .slides"),window.addEventListener("load",J,!1);var d=kc.getQueryHash();"undefined"!=typeof d.dependencies&&delete d.dependencies,o(wc,a),o(wc,d),z(),c()}else{document.body.setAttribute("class","no-transforms");for(var e=document.getElementsByTagName("img"),f=0,g=e.length;g>f;f++){var h=e[f];h.getAttribute("data-src")&&(h.setAttribute("src",h.getAttribute("data-src")),h.removeAttribute("data-src"))}}}function b(){Bc.transforms3d="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,Bc.transforms2d="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,Bc.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,Bc.requestAnimationFrame="function"==typeof Bc.requestAnimationFrameMethod,Bc.canvas=!!document.createElement("canvas").getContext,Bc.touch=!!("ontouchstart"in window),qc=navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)}function c(){function a(){e.length&&head.js.apply(null,e),d()}function b(b){head.ready(b.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],function(){"function"==typeof b.callback&&b.callback.apply(this),0===--f&&a()})}for(var c=[],e=[],f=0,g=0,h=wc.dependencies.length;h>g;g++){var i=wc.dependencies[g];(!i.condition||i.condition())&&(i.async?e.push(i.src):c.push(i.src),b(i))}c.length?(f=c.length,head.js.apply(null,c)):a()}function d(){e(),k(),ab(),l(),sb(),hb(!0),setTimeout(function(){Ac.slides.classList.remove("no-transition"),xc=!0,B("ready",{indexh:lc,indexv:mc,currentSlide:oc})},1),y()&&(n(),"complete"===document.readyState?g():window.addEventListener("load",g))}function e(){Ac.slides.classList.add("no-transition"),Ac.background=h(Ac.wrapper,"div","backgrounds",null),Ac.progress=h(Ac.wrapper,"div","progress","<span></span>"),Ac.progressbar=Ac.progress.querySelector("span"),h(Ac.wrapper,"aside","controls",'<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>'),Ac.slideNumber=h(Ac.wrapper,"div","slide-number",""),h(Ac.wrapper,"div","pause-overlay",null),Ac.controls=document.querySelector(".reveal .controls"),Ac.theme=document.querySelector("#theme"),Ac.wrapper.setAttribute("role","application"),Ac.controlsLeft=p(document.querySelectorAll(".navigate-left")),Ac.controlsRight=p(document.querySelectorAll(".navigate-right")),Ac.controlsUp=p(document.querySelectorAll(".navigate-up")),Ac.controlsDown=p(document.querySelectorAll(".navigate-down")),Ac.controlsPrev=p(document.querySelectorAll(".navigate-prev")),Ac.controlsNext=p(document.querySelectorAll(".navigate-next")),Ac.statusDiv=f()}function f(){var a=document.getElementById("aria-status-div");return a||(a=document.createElement("div"),a.style.position="absolute",a.style.height="1px",a.style.width="1px",a.style.overflow="hidden",a.style.clip="rect( 1px, 1px, 1px, 1px )",a.setAttribute("id","aria-status-div"),a.setAttribute("aria-live","polite"),a.setAttribute("aria-atomic","true"),Ac.wrapper.appendChild(a)),a}function g(){var a=L(window.innerWidth,window.innerHeight),b=Math.floor(a.width*(1+wc.margin)),c=Math.floor(a.height*(1+wc.margin)),d=a.width,e=a.height;t("@page{size:"+b+"px "+c+"px; margin: 0;}"),t(".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: "+d+"px; max-height:"+e+"px}"),document.body.classList.add("print-pdf"),document.body.style.width=b+"px",document.body.style.height=c+"px",p(Ac.wrapper.querySelectorAll(sc)).forEach(function(a){if(a.classList.contains("stack")===!1){var f=(b-d)/2,g=(c-e)/2,h=w(a),i=Math.max(Math.ceil(h/c),1);(1===i&&wc.center||a.classList.contains("center"))&&(g=Math.max((c-h)/2,0)),a.style.left=f+"px",a.style.top=g+"px",a.style.width=d+"px";var j=a.querySelector(".slide-background");j&&(j.style.width=b+"px",j.style.height=c*i+"px",j.style.top=-g+"px",j.style.left=-f+"px")}}),p(Ac.wrapper.querySelectorAll(sc+" .fragment")).forEach(function(a){a.classList.add("visible")})}function h(a,b,c,d){for(var e=a.querySelectorAll("."+c),f=0;f<e.length;f++){var g=e[f];if(g.parentNode===a)return g}var h=document.createElement(b);return h.classList.add(c),"string"==typeof d&&(h.innerHTML=d),a.appendChild(h),h}function i(){var a=y();Ac.background.innerHTML="",Ac.background.classList.add("no-transition"),p(Ac.wrapper.querySelectorAll(tc)).forEach(function(b){var c;c=a?j(b,b):j(b,Ac.background),p(b.querySelectorAll("section")).forEach(function(b){a?j(b,b):j(b,c),c.classList.add("stack")})}),wc.parallaxBackgroundImage?(Ac.background.style.backgroundImage='url("'+wc.parallaxBackgroundImage+'")',Ac.background.style.backgroundSize=wc.parallaxBackgroundSize,setTimeout(function(){Ac.wrapper.classList.add("has-parallax-background")},1)):(Ac.background.style.backgroundImage="",Ac.wrapper.classList.remove("has-parallax-background"))}function j(a,b){var c={background:a.getAttribute("data-background"),backgroundSize:a.getAttribute("data-background-size"),backgroundImage:a.getAttribute("data-background-image"),backgroundVideo:a.getAttribute("data-background-video"),backgroundIframe:a.getAttribute("data-background-iframe"),backgroundColor:a.getAttribute("data-background-color"),backgroundRepeat:a.getAttribute("data-background-repeat"),backgroundPosition:a.getAttribute("data-background-position"),backgroundTransition:a.getAttribute("data-background-transition")},d=document.createElement("div");d.className="slide-background "+a.className.replace(/present|past|future/,""),c.background&&(/^(http|file|\/\/)/gi.test(c.background)||/\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test(c.background)?a.setAttribute("data-background-image",c.background):d.style.background=c.background),(c.background||c.backgroundColor||c.backgroundImage||c.backgroundVideo||c.backgroundIframe)&&d.setAttribute("data-background-hash",c.background+c.backgroundSize+c.backgroundImage+c.backgroundVideo+c.backgroundIframe+c.backgroundColor+c.backgroundRepeat+c.backgroundPosition+c.backgroundTransition),c.backgroundSize&&(d.style.backgroundSize=c.backgroundSize),c.backgroundColor&&(d.style.backgroundColor=c.backgroundColor),c.backgroundRepeat&&(d.style.backgroundRepeat=c.backgroundRepeat),c.backgroundPosition&&(d.style.backgroundPosition=c.backgroundPosition),c.backgroundTransition&&d.setAttribute("data-background-transition",c.backgroundTransition),b.appendChild(d),a.classList.remove("has-dark-background"),a.classList.remove("has-light-background");var e=window.getComputedStyle(d).backgroundColor;if(e){var f=u(e);f&&0!==f.a&&a.classList.add(v(e)<128?"has-dark-background":"has-light-background")}return d}function k(){wc.postMessage&&window.addEventListener("message",function(a){var b=a.data;"{"===b.charAt(0)&&"}"===b.charAt(b.length-1)&&(b=JSON.parse(b),b.method&&"function"==typeof kc[b.method]&&kc[b.method].apply(kc,b.args))},!1)}function l(a){var b=Ac.wrapper.querySelectorAll(sc).length;Ac.wrapper.classList.remove(wc.transition),"object"==typeof a&&o(wc,a),Bc.transforms3d===!1&&(wc.transition="linear"),Ac.wrapper.classList.add(wc.transition),Ac.wrapper.setAttribute("data-transition-speed",wc.transitionSpeed),Ac.wrapper.setAttribute("data-background-transition",wc.backgroundTransition),Ac.controls.style.display=wc.controls?"block":"none",Ac.progress.style.display=wc.progress?"block":"none",wc.rtl?Ac.wrapper.classList.add("rtl"):Ac.wrapper.classList.remove("rtl"),wc.center?Ac.wrapper.classList.add("center"):Ac.wrapper.classList.remove("center"),wc.pause===!1&&V(),wc.mouseWheel?(document.addEventListener("DOMMouseScroll",Xb,!1),document.addEventListener("mousewheel",Xb,!1)):(document.removeEventListener("DOMMouseScroll",Xb,!1),document.removeEventListener("mousewheel",Xb,!1)),wc.rollingLinks?C():D(),wc.previewLinks?E():(F(),E("[data-preview-link]")),rc&&(rc.destroy(),rc=null),b>1&&wc.autoSlide&&wc.autoSlideStoppable&&Bc.canvas&&Bc.requestAnimationFrame&&(rc=new jc(Ac.wrapper,function(){return Math.min(Math.max((Date.now()-Hc)/Fc,0),1)}),rc.on("click",ic),Ic=!1),wc.fragments===!1&&p(Ac.slides.querySelectorAll(".fragment")).forEach(function(a){a.classList.add("visible"),a.classList.remove("current-fragment")}),_()}function m(){if(Ec=!0,window.addEventListener("hashchange",dc,!1),window.addEventListener("resize",ec,!1),wc.touch&&(Ac.wrapper.addEventListener("touchstart",Rb,!1),Ac.wrapper.addEventListener("touchmove",Sb,!1),Ac.wrapper.addEventListener("touchend",Tb,!1),window.navigator.pointerEnabled?(Ac.wrapper.addEventListener("pointerdown",Ub,!1),Ac.wrapper.addEventListener("pointermove",Vb,!1),Ac.wrapper.addEventListener("pointerup",Wb,!1)):window.navigator.msPointerEnabled&&(Ac.wrapper.addEventListener("MSPointerDown",Ub,!1),Ac.wrapper.addEventListener("MSPointerMove",Vb,!1),Ac.wrapper.addEventListener("MSPointerUp",Wb,!1))),wc.keyboard&&(document.addEventListener("keydown",Qb,!1),document.addEventListener("keypress",Pb,!1)),wc.progress&&Ac.progress&&Ac.progress.addEventListener("click",Yb,!1),wc.focusBodyOnPageVisibilityChange){var a;"hidden"in document?a="visibilitychange":"msHidden"in document?a="msvisibilitychange":"webkitHidden"in document&&(a="webkitvisibilitychange"),a&&document.addEventListener(a,fc,!1)}var b=["touchstart","click"];navigator.userAgent.match(/android/gi)&&(b=["touchstart"]),b.forEach(function(a){Ac.controlsLeft.forEach(function(b){b.addEventListener(a,Zb,!1)}),Ac.controlsRight.forEach(function(b){b.addEventListener(a,$b,!1)}),Ac.controlsUp.forEach(function(b){b.addEventListener(a,_b,!1)}),Ac.controlsDown.forEach(function(b){b.addEventListener(a,ac,!1)}),Ac.controlsPrev.forEach(function(b){b.addEventListener(a,bc,!1)}),Ac.controlsNext.forEach(function(b){b.addEventListener(a,cc,!1)})})}function n(){Ec=!1,document.removeEventListener("keydown",Qb,!1),document.removeEventListener("keypress",Pb,!1),window.removeEventListener("hashchange",dc,!1),window.removeEventListener("resize",ec,!1),Ac.wrapper.removeEventListener("touchstart",Rb,!1),Ac.wrapper.removeEventListener("touchmove",Sb,!1),Ac.wrapper.removeEventListener("touchend",Tb,!1),window.navigator.pointerEnabled?(Ac.wrapper.removeEventListener("pointerdown",Ub,!1),Ac.wrapper.removeEventListener("pointermove",Vb,!1),Ac.wrapper.removeEventListener("pointerup",Wb,!1)):window.navigator.msPointerEnabled&&(Ac.wrapper.removeEventListener("MSPointerDown",Ub,!1),Ac.wrapper.removeEventListener("MSPointerMove",Vb,!1),Ac.wrapper.removeEventListener("MSPointerUp",Wb,!1)),wc.progress&&Ac.progress&&Ac.progress.removeEventListener("click",Yb,!1),["touchstart","click"].forEach(function(a){Ac.controlsLeft.forEach(function(b){b.removeEventListener(a,Zb,!1)}),Ac.controlsRight.forEach(function(b){b.removeEventListener(a,$b,!1)}),Ac.controlsUp.forEach(function(b){b.removeEventListener(a,_b,!1)}),Ac.controlsDown.forEach(function(b){b.removeEventListener(a,ac,!1)}),Ac.controlsPrev.forEach(function(b){b.removeEventListener(a,bc,!1)}),Ac.controlsNext.forEach(function(b){b.removeEventListener(a,cc,!1)})})}function o(a,b){for(var c in b)a[c]=b[c]}function p(a){return Array.prototype.slice.call(a)}function q(a){if("string"==typeof a){if("null"===a)return null;if("true"===a)return!0;if("false"===a)return!1;if(a.match(/^\d+$/))return parseFloat(a)}return a}function r(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function s(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function t(a){var b=document.createElement("style");b.type="text/css",b.styleSheet?b.styleSheet.cssText=a:b.appendChild(document.createTextNode(a)),document.getElementsByTagName("head")[0].appendChild(b)}function u(a){var b=a.match(/^#([0-9a-f]{3})$/i);if(b&&b[1])return b=b[1],{r:17*parseInt(b.charAt(0),16),g:17*parseInt(b.charAt(1),16),b:17*parseInt(b.charAt(2),16)};var c=a.match(/^#([0-9a-f]{6})$/i);if(c&&c[1])return c=c[1],{r:parseInt(c.substr(0,2),16),g:parseInt(c.substr(2,2),16),b:parseInt(c.substr(4,2),16)};var d=a.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(d)return{r:parseInt(d[1],10),g:parseInt(d[2],10),b:parseInt(d[3],10)};var e=a.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i);return e?{r:parseInt(e[1],10),g:parseInt(e[2],10),b:parseInt(e[3],10),a:parseFloat(e[4])}:null}function v(a){return"string"==typeof a&&(a=u(a)),a?(299*a.r+587*a.g+114*a.b)/1e3:null}function w(a){var b=0;if(a){var c=0;p(a.childNodes).forEach(function(a){"number"==typeof a.offsetTop&&a.style&&("absolute"===window.getComputedStyle(a).position&&(c+=1),b=Math.max(b,a.offsetTop+a.offsetHeight))}),0===c&&(b=a.offsetHeight)}return b}function x(a,b){if(b=b||0,a){var c,d=a.style.height;return a.style.height="0px",c=b-a.parentNode.offsetHeight,a.style.height=d+"px",c}return b}function y(){return/print-pdf/gi.test(window.location.search)}function z(){wc.hideAddressBar&&qc&&(window.addEventListener("load",A,!1),window.addEventListener("orientationchange",A,!1))}function A(){setTimeout(function(){window.scrollTo(0,1)},10)}function B(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),o(c,b),Ac.wrapper.dispatchEvent(c),wc.postMessageEvents&&window.parent!==window.self&&window.parent.postMessage(JSON.stringify({namespace:"reveal",eventName:a,state:yb()}),"*")}function C(){if(Bc.transforms3d&&!("msPerspective"in document.body.style))for(var a=Ac.wrapper.querySelectorAll(sc+" a"),b=0,c=a.length;c>b;b++){var d=a[b];if(!(!d.textContent||d.querySelector("*")||d.className&&d.classList.contains(d,"roll"))){var e=document.createElement("span");e.setAttribute("data-title",d.text),e.innerHTML=d.innerHTML,d.classList.add("roll"),d.innerHTML="",d.appendChild(e)}}}function D(){for(var a=Ac.wrapper.querySelectorAll(sc+" a.roll"),b=0,c=a.length;c>b;b++){var d=a[b],e=d.querySelector("span");e&&(d.classList.remove("roll"),d.innerHTML=e.innerHTML)}}function E(a){var b=p(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",hc,!1)})}function F(){var a=p(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",hc,!1)})}function G(a){I(),Ac.overlay=document.createElement("div"),Ac.overlay.classList.add("overlay"),Ac.overlay.classList.add("overlay-preview"),Ac.wrapper.appendChild(Ac.overlay),Ac.overlay.innerHTML=["<header>",'<a class="close" href="#"><span class="icon"></span></a>','<a class="external" href="'+a+'" target="_blank"><span class="icon"></span></a>',"</header>",'<div class="spinner"></div>','<div class="viewport">','<iframe src="'+a+'"></iframe>',"</div>"].join(""),Ac.overlay.querySelector("iframe").addEventListener("load",function(){Ac.overlay.classList.add("loaded")},!1),Ac.overlay.querySelector(".close").addEventListener("click",function(a){I(),a.preventDefault()},!1),Ac.overlay.querySelector(".external").addEventListener("click",function(){I()},!1),setTimeout(function(){Ac.overlay.classList.add("visible")},1)}function H(){if(wc.help){I(),Ac.overlay=document.createElement("div"),Ac.overlay.classList.add("overlay"),Ac.overlay.classList.add("overlay-help"),Ac.wrapper.appendChild(Ac.overlay);var a='<p class="title">Keyboard Shortcuts</p><br/>';a+="<table><th>KEY</th><th>ACTION</th>";for(var b in Kc)a+="<tr><td>"+b+"</td><td>"+Kc[b]+"</td></tr>";a+="</table>",Ac.overlay.innerHTML=["<header>",'<a class="close" href="#"><span class="icon"></span></a>',"</header>",'<div class="viewport">','<div class="viewport-inner">'+a+"</div>","</div>"].join(""),Ac.overlay.querySelector(".close").addEventListener("click",function(a){I(),a.preventDefault()},!1),setTimeout(function(){Ac.overlay.classList.add("visible")},1)}}function I(){Ac.overlay&&(Ac.overlay.parentNode.removeChild(Ac.overlay),Ac.overlay=null)}function J(){if(Ac.wrapper&&!y()){var a=L(),b=20;K(wc.width,wc.height,b),Ac.slides.style.width=a.width+"px",Ac.slides.style.height=a.height+"px",zc=Math.min(a.presentationWidth/a.width,a.presentationHeight/a.height),zc=Math.max(zc,wc.minScale),zc=Math.min(zc,wc.maxScale),1===zc?(Ac.slides.style.zoom="",Ac.slides.style.left="",Ac.slides.style.top="",Ac.slides.style.bottom="",Ac.slides.style.right="",s(Ac.slides,"")):!qc&&/chrome/i.test(navigator.userAgent)&&"undefined"!=typeof Ac.slides.style.zoom?Ac.slides.style.zoom=zc:(Ac.slides.style.left="50%",Ac.slides.style.top="50%",Ac.slides.style.bottom="auto",Ac.slides.style.right="auto",s(Ac.slides,"translate(-50%, -50%) scale("+zc+")"));for(var c=p(Ac.wrapper.querySelectorAll(sc)),d=0,e=c.length;e>d;d++){var f=c[d];"none"!==f.style.display&&(f.style.top=wc.center||f.classList.contains("center")?f.classList.contains("stack")?0:Math.max((a.height-w(f))/2-b,0)+"px":"")}eb(),ib()}}function K(a,b){p(Ac.slides.querySelectorAll("section > .stretch")).forEach(function(c){var d=x(c,b);if(/(img|video)/gi.test(c.nodeName)){var e=c.naturalWidth||c.videoWidth,f=c.naturalHeight||c.videoHeight,g=Math.min(a/e,d/f);c.style.width=e*g+"px",c.style.height=f*g+"px"}else c.style.width=a+"px",c.style.height=d+"px"})}function L(a,b){var c={width:wc.width,height:wc.height,presentationWidth:a||Ac.wrapper.offsetWidth,presentationHeight:b||Ac.wrapper.offsetHeight};return c.presentationWidth-=c.presentationHeight*wc.margin,c.presentationHeight-=c.presentationHeight*wc.margin,"string"==typeof c.width&&/%$/.test(c.width)&&(c.width=parseInt(c.width,10)/100*c.presentationWidth),"string"==typeof c.height&&/%$/.test(c.height)&&(c.height=parseInt(c.height,10)/100*c.presentationHeight),c}function M(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function N(a){if("object"==typeof a&&"function"==typeof a.setAttribute&&a.classList.contains("stack")){var b=a.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(a.getAttribute(b)||0,10)}return 0}function O(){if(wc.overview){Fb();var a=Ac.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;Ac.wrapper.classList.add("overview"),Ac.wrapper.classList.remove("overview-deactivating");for(var c=Ac.wrapper.querySelectorAll(tc),d=0,e=c.length;e>d;d++){var f=c[d],g=wc.rtl?-105:105;if(f.setAttribute("data-index-h",d),s(f,"translateZ(-"+b+"px) translate("+(d-lc)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===lc?mc:N(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),s(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",gc,!0)}else f.addEventListener("click",gc,!0)}db(),J(),a||B("overviewshown",{indexh:lc,indexv:mc,currentSlide:oc})}}function P(){wc.overview&&(Ac.wrapper.classList.remove("overview"),Ac.wrapper.classList.add("overview-deactivating"),setTimeout(function(){Ac.wrapper.classList.remove("overview-deactivating")},1),p(Ac.wrapper.querySelectorAll(sc)).forEach(function(a){s(a,""),a.removeEventListener("click",gc,!0)}),$(lc,mc),Eb(),B("overviewhidden",{indexh:lc,indexv:mc,currentSlide:oc}))}function Q(a){"boolean"==typeof a?a?O():P():R()?P():O()}function R(){return Ac.wrapper.classList.contains("overview")}function S(a){return a=a?a:oc,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function T(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullscreen;b&&b.apply(a)}function U(){if(wc.pause){var a=Ac.wrapper.classList.contains("paused");Fb(),Ac.wrapper.classList.add("paused"),a===!1&&B("paused")}}function V(){var a=Ac.wrapper.classList.contains("paused");Ac.wrapper.classList.remove("paused"),Eb(),a&&B("resumed")}function W(a){"boolean"==typeof a?a?U():V():X()?V():U()}function X(){return Ac.wrapper.classList.contains("paused")}function Y(a){"boolean"==typeof a?a?Hb():Gb():Ic?Hb():Gb()}function Z(){return!(!Fc||Ic)}function $(a,b,c,d){nc=oc;var e=Ac.wrapper.querySelectorAll(tc);void 0===b&&(b=N(e[a])),nc&&nc.parentNode&&nc.parentNode.classList.contains("stack")&&M(nc.parentNode,mc);var f=yc.concat();yc.length=0;var g=lc||0,h=mc||0;lc=cb(tc,void 0===a?lc:a),mc=cb(uc,void 0===b?mc:b),db(),J();a:for(var i=0,j=yc.length;j>i;i++){for(var k=0;k<f.length;k++)if(f[k]===yc[i]){f.splice(k,1);continue a}document.documentElement.classList.add(yc[i]),B(yc[i])}for(;f.length;)document.documentElement.classList.remove(f.pop());R()&&O();var l=e[lc],m=l.querySelectorAll("section");oc=m[mc]||l,"undefined"!=typeof c&&Bb(c);var n=lc!==g||mc!==h;n?B("slidechanged",{indexh:lc,indexv:mc,previousSlide:nc,currentSlide:oc,origin:d}):nc=null,nc&&(nc.classList.remove("present"),nc.setAttribute("aria-hidden","true"),Ac.wrapper.querySelector(vc).classList.contains("present")&&setTimeout(function(){var a,b=p(Ac.wrapper.querySelectorAll(tc+".stack"));for(a in b)b[a]&&M(b[a],0)},0)),(n||!nc)&&(pb(nc),ob(oc)),Ac.statusDiv.textContent=oc.textContent,gb(),eb(),hb(),ib(),fb(),tb(),Eb()}function _(){n(),m(),J(),Fc=wc.autoSlide,Eb(),i(),tb(),bb(),gb(),eb(),hb(!0),fb(),db(),nb()}function ab(){var a=p(Ac.wrapper.querySelectorAll(tc));a.forEach(function(a){var b=p(a.querySelectorAll("section"));b.forEach(function(a,b){b>0&&(a.classList.remove("present"),a.classList.remove("past"),a.classList.add("future"),a.setAttribute("aria-hidden","true"))})})}function bb(){var a=p(Ac.wrapper.querySelectorAll(tc));a.forEach(function(a){var b=p(a.querySelectorAll("section"));b.forEach(function(a){Ab(a.querySelectorAll(".fragment"))}),0===b.length&&Ab(a.querySelectorAll(".fragment"))})}function cb(a,b){var c=p(Ac.wrapper.querySelectorAll(a)),d=c.length,e=y();if(d){wc.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var f=0;d>f;f++){var g=c[f],h=wc.rtl&&!S(g);if(g.classList.remove("past"),g.classList.remove("present"),g.classList.remove("future"),g.setAttribute("hidden",""),g.setAttribute("aria-hidden","true"),g.querySelector("section")&&g.classList.add("stack"),e)g.classList.add("present");else if(b>f){if(g.classList.add(h?"future":"past"),wc.fragments)for(var i=p(g.querySelectorAll(".fragment"));i.length;){var j=i.pop();j.classList.add("visible"),j.classList.remove("current-fragment")}}else if(f>b&&(g.classList.add(h?"past":"future"),wc.fragments))for(var k=p(g.querySelectorAll(".fragment.visible"));k.length;){var l=k.pop();l.classList.remove("visible"),l.classList.remove("current-fragment")}}c[b].classList.add("present"),c[b].removeAttribute("hidden"),c[b].removeAttribute("aria-hidden");var m=c[b].getAttribute("data-state");m&&(yc=yc.concat(m.split(" ")))}else b=0;return b}function db(){var a,b,c=p(Ac.wrapper.querySelectorAll(tc)),d=c.length;if(d&&"undefined"!=typeof lc){var e=R()?10:wc.viewDistance;qc&&(e=R()?6:2),y()&&(e=Number.MAX_VALUE);for(var f=0;d>f;f++){var g=c[f],h=p(g.querySelectorAll("section")),i=h.length;if(a=Math.abs(((lc||0)-f)%(d-e))||0,e>a?jb(g):kb(g),i)for(var j=N(g),k=0;i>k;k++){var l=h[k];b=Math.abs(f===(lc||0)?(mc||0)-k:k-j),e>a+b?jb(l):kb(l)}}}}function eb(){wc.progress&&Ac.progressbar&&(Ac.progressbar.style.width=qb()*Ac.wrapper.offsetWidth+"px")}function fb(){if(wc.slideNumber&&Ac.slideNumber){var a=lc;mc>0&&(a+=" - "+mc),Ac.slideNumber.innerHTML=a}}function gb(){var a=lb(),b=mb();Ac.controlsLeft.concat(Ac.controlsRight).concat(Ac.controlsUp).concat(Ac.controlsDown).concat(Ac.controlsPrev).concat(Ac.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&Ac.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&Ac.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&Ac.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&Ac.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&Ac.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&Ac.controlsNext.forEach(function(a){a.classList.add("enabled")}),oc&&(b.prev&&Ac.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&Ac.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),S(oc)?(b.prev&&Ac.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&Ac.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&Ac.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&Ac.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function hb(a){var b=null,c=wc.rtl?"future":"past",d=wc.rtl?"past":"future";if(p(Ac.background.childNodes).forEach(function(e,f){e.classList.remove("past"),e.classList.remove("present"),e.classList.remove("future"),lc>f?e.classList.add(c):f>lc?e.classList.add(d):(e.classList.add("present"),b=e),(a||f===lc)&&p(e.querySelectorAll(".slide-background")).forEach(function(a,c){a.classList.remove("past"),a.classList.remove("present"),a.classList.remove("future"),mc>c?a.classList.add("past"):c>mc?a.classList.add("future"):(a.classList.add("present"),f===lc&&(b=a))})}),pc){var e=pc.querySelector("video");e&&e.pause()}if(b){var f=b.querySelector("video");f&&(f.currentTime=0,f.play());var g=pc?pc.getAttribute("data-background-hash"):null,h=b.getAttribute("data-background-hash");h&&h===g&&b!==pc&&Ac.background.classList.add("no-transition"),pc=b}oc&&["has-light-background","has-dark-background"].forEach(function(a){oc.classList.contains(a)?Ac.wrapper.classList.add(a):Ac.wrapper.classList.remove(a)}),setTimeout(function(){Ac.background.classList.remove("no-transition")},1)}function ib(){if(wc.parallaxBackgroundImage){var a,b,c=Ac.wrapper.querySelectorAll(tc),d=Ac.wrapper.querySelectorAll(uc),e=Ac.background.style.backgroundSize.split(" ");1===e.length?a=b=parseInt(e[0],10):(a=parseInt(e[0],10),b=parseInt(e[1],10));var f=Ac.background.offsetWidth,g=c.length,h=-(a-f)/(g-1)*lc,i=Ac.background.offsetHeight,j=d.length,k=j>1?-(b-i)/(j-1)*mc:0;Ac.background.style.backgroundPosition=h+"px "+k+"px"}}function jb(a){a.style.display="block",p(a.querySelectorAll("img[data-src], video[data-src], audio[data-src], iframe[data-src]")).forEach(function(a){a.setAttribute("src",a.getAttribute("data-src")),a.removeAttribute("data-src")}),p(a.querySelectorAll("video, audio")).forEach(function(a){var b=0;p(a.querySelectorAll("source[data-src]")).forEach(function(a){a.setAttribute("src",a.getAttribute("data-src")),a.removeAttribute("data-src"),b+=1}),b>0&&a.load()});var b=ub(a),c=xb(b.h,b.v);if(c&&(c.style.display="block",c.hasAttribute("data-loaded")===!1)){c.setAttribute("data-loaded","true");var d=a.getAttribute("data-background-image"),e=a.getAttribute("data-background-video"),f=a.getAttribute("data-background-iframe");if(d)c.style.backgroundImage="url("+d+")";else if(e&&!rb()){var g=document.createElement("video");e.split(",").forEach(function(a){g.innerHTML+='<source src="'+a+'">'}),c.appendChild(g)}else if(f){var h=document.createElement("iframe");h.setAttribute("src",f),h.style.width="100%",h.style.height="100%",h.style.maxHeight="100%",h.style.maxWidth="100%",c.appendChild(h)}}}function kb(a){a.style.display="none";var b=ub(a),c=xb(b.h,b.v);c&&(c.style.display="none")}function lb(){var a=Ac.wrapper.querySelectorAll(tc),b=Ac.wrapper.querySelectorAll(uc),c={left:lc>0||wc.loop,right:lc<a.length-1||wc.loop,up:mc>0,down:mc<b.length-1};if(wc.rtl){var d=c.left;c.left=c.right,c.right=d}return c}function mb(){if(oc&&wc.fragments){var a=oc.querySelectorAll(".fragment"),b=oc.querySelectorAll(".fragment:not(.visible)");return{prev:a.length-b.length>0,next:!!b.length}}return{prev:!1,next:!1}}function nb(){p(Ac.slides.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){var b=a.getAttribute("src");/enablejsapi\=1/gi.test(b)||a.setAttribute("src",b+(/\?/.test(b)?"&":"?")+"enablejsapi=1")}),p(Ac.slides.querySelectorAll('iframe[src*="player.vimeo.com/"]')).forEach(function(a){var b=a.getAttribute("src");/api\=1/gi.test(b)||a.setAttribute("src",b+(/\?/.test(b)?"&":"?")+"api=1")})}function ob(a){a&&!rb()&&(p(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),p(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:start","*")}),p(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}),p(a.querySelectorAll('iframe[src*="player.vimeo.com/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"method":"play"}',"*")}))}function pb(a){a&&a.parentNode&&(p(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),p(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:stop","*")}),p(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-ignore")||"function"!=typeof a.contentWindow.postMessage||a.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}),p(a.querySelectorAll('iframe[src*="player.vimeo.com/"]')).forEach(function(a){a.hasAttribute("data-ignore")||"function"!=typeof a.contentWindow.postMessage||a.contentWindow.postMessage('{"method":"pause"}',"*")}))}function qb(){var a=p(Ac.wrapper.querySelectorAll(tc)),b=vb(),c=0;a:for(var d=0;d<a.length;d++){for(var e=a[d],f=p(e.querySelectorAll("section")),g=0;g<f.length;g++){if(f[g].classList.contains("present"))break a;c++}if(e.classList.contains("present"))break;e.classList.contains("stack")===!1&&c++}if(oc){var h=oc.querySelectorAll(".fragment");if(h.length>0){var i=oc.querySelectorAll(".fragment.visible"),j=.9;c+=i.length/h.length*j}}return c/(b-1)}function rb(){return!!window.location.search.match(/receiver/gi)}function sb(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d;if(/^[a-zA-Z][\w:.-]*$/.test(c)&&(d=document.querySelector("#"+c)),d){var e=kc.getIndices(d);$(e.h,e.v)}else $(lc||0,mc||0)}else{var f=parseInt(b[0],10)||0,g=parseInt(b[1],10)||0;(f!==lc||g!==mc)&&$(f,g)}}function tb(a){if(wc.history)if(clearTimeout(Dc),"number"==typeof a)Dc=setTimeout(tb,a);else if(oc){var b="/",c=oc.getAttribute("id");c&&(c=c.toLowerCase(),c=c.replace(/[^a-zA-Z0-9\-\_\:\.]/g,"")),"string"==typeof c&&c.length?b="/"+c:((lc>0||mc>0)&&(b+=lc),mc>0&&(b+="/"+mc)),window.location.hash=b}}function ub(a){var b,c=lc,d=mc;if(a){var e=S(a),f=e?a.parentNode:a,g=p(Ac.wrapper.querySelectorAll(tc));c=Math.max(g.indexOf(f),0),d=void 0,e&&(d=Math.max(p(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&oc){var h=oc.querySelectorAll(".fragment").length>0;if(h){var i=oc.querySelector(".current-fragment");b=i&&i.hasAttribute("data-fragment-index")?parseInt(i.getAttribute("data-fragment-index"),10):oc.querySelectorAll(".fragment.visible").length-1}}return{h:c,v:d,f:b}}function vb(){return Ac.wrapper.querySelectorAll(sc+":not(.stack)").length}function wb(a,b){var c=Ac.wrapper.querySelectorAll(tc)[a],d=c&&c.querySelectorAll("section");return d&&d.length&&"number"==typeof b?d?d[b]:void 0:c}function xb(a,b){if(y()){var c=wb(a,b);if(c){var d=c.querySelector(".slide-background");if(d&&d.parentNode===c)return d}return void 0}var e=Ac.wrapper.querySelectorAll(".backgrounds>.slide-background")[a],f=e&&e.querySelectorAll(".slide-background");return f&&f.length&&"number"==typeof b?f?f[b]:void 0:e}function yb(){var a=ub();return{indexh:a.h,indexv:a.v,indexf:a.f,paused:X(),overview:R()}}function zb(a){if("object"==typeof a){$(q(a.indexh),q(a.indexv),q(a.indexf));var b=q(a.paused),c=q(a.overview);
+"boolean"==typeof b&&b!==X()&&W(b),"boolean"==typeof c&&c!==R()&&Q(c)}}function Ab(a){a=p(a);var b=[],c=[],d=[];a.forEach(function(a){if(a.hasAttribute("data-fragment-index")){var d=parseInt(a.getAttribute("data-fragment-index"),10);b[d]||(b[d]=[]),b[d].push(a)}else c.push([a])}),b=b.concat(c);var e=0;return b.forEach(function(a){a.forEach(function(a){d.push(a),a.setAttribute("data-fragment-index",e)}),e++}),d}function Bb(a,b){if(oc&&wc.fragments){var c=Ab(oc.querySelectorAll(".fragment"));if(c.length){if("number"!=typeof a){var d=Ab(oc.querySelectorAll(".fragment.visible")).pop();a=d?parseInt(d.getAttribute("data-fragment-index")||0,10):-1}"number"==typeof b&&(a+=b);var e=[],f=[];return p(c).forEach(function(b,c){b.hasAttribute("data-fragment-index")&&(c=parseInt(b.getAttribute("data-fragment-index"),10)),a>=c?(b.classList.contains("visible")||e.push(b),b.classList.add("visible"),b.classList.remove("current-fragment"),Ac.statusDiv.innerHTML=b.textContent,c===a&&b.classList.add("current-fragment")):(b.classList.contains("visible")&&f.push(b),b.classList.remove("visible"),b.classList.remove("current-fragment"))}),f.length&&B("fragmenthidden",{fragment:f[0],fragments:f}),e.length&&B("fragmentshown",{fragment:e[0],fragments:e}),gb(),eb(),!(!e.length&&!f.length)}}return!1}function Cb(){return Bb(null,1)}function Db(){return Bb(null,-1)}function Eb(){if(Fb(),oc){var a=oc.querySelector(".current-fragment"),b=a?a.getAttribute("data-autoslide"):null,c=oc.parentNode?oc.parentNode.getAttribute("data-autoslide"):null,d=oc.getAttribute("data-autoslide");Fc=b?parseInt(b,10):d?parseInt(d,10):c?parseInt(c,10):wc.autoSlide,p(oc.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&Fc&&1e3*a.duration>Fc&&(Fc=1e3*a.duration+1e3)}),!Fc||Ic||X()||R()||kc.isLastSlide()&&!mb().next&&wc.loop!==!0||(Gc=setTimeout(Nb,Fc),Hc=Date.now()),rc&&rc.setPlaying(-1!==Gc)}}function Fb(){clearTimeout(Gc),Gc=-1}function Gb(){Fc&&!Ic&&(Ic=!0,B("autoslidepaused"),clearTimeout(Gc),rc&&rc.setPlaying(!1))}function Hb(){Fc&&Ic&&(Ic=!1,B("autoslideresumed"),Eb())}function Ib(){wc.rtl?(R()||Cb()===!1)&&lb().left&&$(lc+1):(R()||Db()===!1)&&lb().left&&$(lc-1)}function Jb(){wc.rtl?(R()||Db()===!1)&&lb().right&&$(lc-1):(R()||Cb()===!1)&&lb().right&&$(lc+1)}function Kb(){(R()||Db()===!1)&&lb().up&&$(lc,mc-1)}function Lb(){(R()||Cb()===!1)&&lb().down&&$(lc,mc+1)}function Mb(){if(Db()===!1)if(lb().up)Kb();else{var a;if(a=wc.rtl?p(Ac.wrapper.querySelectorAll(tc+".future")).pop():p(Ac.wrapper.querySelectorAll(tc+".past")).pop()){var b=a.querySelectorAll("section").length-1||void 0,c=lc-1;$(c,b)}}}function Nb(){Cb()===!1&&(lb().down?Lb():wc.rtl?Ib():Jb()),Eb()}function Ob(){wc.autoSlideStoppable&&Gb()}function Pb(a){a.shiftKey&&63===a.charCode&&(Ac.overlay?I():H(!0))}function Qb(a){if("function"==typeof wc.keyboardCondition&&wc.keyboardCondition()===!1)return!0;var b=Ic;Ob(a);var c=document.activeElement&&"inherit"!==document.activeElement.contentEditable,d=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName);if(!(c||d||a.shiftKey&&32!==a.keyCode||a.altKey||a.ctrlKey||a.metaKey)){if(X()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var e=!1;if("object"==typeof wc.keyboard)for(var f in wc.keyboard)if(parseInt(f,10)===a.keyCode){var g=wc.keyboard[f];"function"==typeof g?g.apply(null,[a]):"string"==typeof g&&"function"==typeof kc[g]&&kc[g].call(),e=!0}if(e===!1)switch(e=!0,a.keyCode){case 80:case 33:Mb();break;case 78:case 34:Nb();break;case 72:case 37:Ib();break;case 76:case 39:Jb();break;case 75:case 38:Kb();break;case 74:case 40:Lb();break;case 36:$(0);break;case 35:$(Number.MAX_VALUE);break;case 32:R()?P():a.shiftKey?Mb():Nb();break;case 13:R()?P():e=!1;break;case 58:case 59:case 66:case 190:case 191:W();break;case 70:T();break;case 65:wc.autoSlideStoppable&&Y(b);break;default:e=!1}e?a.preventDefault&&a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!Bc.transforms3d||(Ac.overlay?I():Q(),a.preventDefault&&a.preventDefault()),Eb()}}function Rb(a){Jc.startX=a.touches[0].clientX,Jc.startY=a.touches[0].clientY,Jc.startCount=a.touches.length,2===a.touches.length&&wc.overview&&(Jc.startSpan=r({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:Jc.startX,y:Jc.startY}))}function Sb(a){if(Jc.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{Ob(a);var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===Jc.startCount&&wc.overview){var d=r({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:Jc.startX,y:Jc.startY});Math.abs(Jc.startSpan-d)>Jc.threshold&&(Jc.captured=!0,d<Jc.startSpan?O():P()),a.preventDefault()}else if(1===a.touches.length&&2!==Jc.startCount){var e=b-Jc.startX,f=c-Jc.startY;e>Jc.threshold&&Math.abs(e)>Math.abs(f)?(Jc.captured=!0,Ib()):e<-Jc.threshold&&Math.abs(e)>Math.abs(f)?(Jc.captured=!0,Jb()):f>Jc.threshold?(Jc.captured=!0,Kb()):f<-Jc.threshold&&(Jc.captured=!0,Lb()),wc.embedded?(Jc.captured||S(oc))&&a.preventDefault():a.preventDefault()}}}function Tb(){Jc.captured=!1}function Ub(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],Rb(a))}function Vb(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],Sb(a))}function Wb(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],Tb(a))}function Xb(a){if(Date.now()-Cc>600){Cc=Date.now();var b=a.detail||-a.wheelDelta;b>0?Nb():Mb()}}function Yb(a){Ob(a),a.preventDefault();var b=p(Ac.wrapper.querySelectorAll(tc)).length,c=Math.floor(a.clientX/Ac.wrapper.offsetWidth*b);$(c)}function Zb(a){a.preventDefault(),Ob(),Ib()}function $b(a){a.preventDefault(),Ob(),Jb()}function _b(a){a.preventDefault(),Ob(),Kb()}function ac(a){a.preventDefault(),Ob(),Lb()}function bc(a){a.preventDefault(),Ob(),Mb()}function cc(a){a.preventDefault(),Ob(),Nb()}function dc(){sb()}function ec(){J()}function fc(){var a=document.webkitHidden||document.msHidden||document.hidden;a===!1&&document.activeElement!==document.body&&(document.activeElement.blur(),document.body.focus())}function gc(a){if(Ec&&R()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(P(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);$(c,d)}}}function hc(a){if(a.currentTarget&&a.currentTarget.hasAttribute("href")){var b=a.currentTarget.getAttribute("href");b&&(G(b),a.preventDefault())}}function ic(){kc.isLastSlide()&&wc.loop===!1?($(0,0),Hb()):Ic?Hb():Gb()}function jc(a,b){this.diameter=50,this.thickness=3,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=a,this.progressCheck=b,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}var kc,lc,mc,nc,oc,pc,qc,rc,sc=".slides section",tc=".slides>section",uc=".slides>section.present>section",vc=".slides>section:first-of-type",wc={width:960,height:700,margin:.1,minScale:.2,maxScale:1.5,controls:!0,progress:!0,slideNumber:!1,history:!1,keyboard:!0,keyboardCondition:null,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,embedded:!1,help:!0,pause:!0,autoSlide:0,autoSlideStoppable:!0,mouseWheel:!1,rollingLinks:!1,hideAddressBar:!0,previewLinks:!1,postMessage:!0,postMessageEvents:!1,focusBodyOnPageVisibilityChange:!0,transition:"slide",transitionSpeed:"default",backgroundTransition:"fade",parallaxBackgroundImage:"",parallaxBackgroundSize:"",viewDistance:3,dependencies:[]},xc=!1,yc=[],zc=1,Ac={},Bc={},Cc=0,Dc=0,Ec=!1,Fc=0,Gc=0,Hc=-1,Ic=!1,Jc={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40},Kc={"N  ,  SPACE":"Next slide",P:"Previous slide","&#8592;  ,  H":"Navigate left","&#8594;  ,  L":"Navigate right","&#8593;  ,  K":"Navigate up","&#8595;  ,  J":"Navigate down",Home:"First slide",End:"Last slide","B  ,  .":"Pause",F:"Fullscreen","ESC, O":"Slide overview"};return jc.prototype.setPlaying=function(a){var b=this.playing;this.playing=a,!b&&this.playing?this.animate():this.render()},jc.prototype.animate=function(){var a=this.progress;this.progress=this.progressCheck(),a>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&Bc.requestAnimationFrameMethod.call(window,this.animate.bind(this))},jc.prototype.render=function(){var a=this.playing?this.progress:0,b=this.diameter/2-this.thickness,c=this.diameter/2,d=this.diameter/2,e=14;this.progressOffset+=.1*(1-this.progressOffset);var f=-Math.PI/2+2*a*Math.PI,g=-Math.PI/2+2*this.progressOffset*Math.PI;this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(c,d,b+2,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(c,d,b,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#666",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(c,d,b,g,f,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(c-e/2,d-e/2),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,e/2-2,e),this.context.fillRect(e/2+2,0,e/2-2,e)):(this.context.beginPath(),this.context.translate(2,0),this.context.moveTo(0,0),this.context.lineTo(e-2,e/2),this.context.lineTo(0,e),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()},jc.prototype.on=function(a,b){this.canvas.addEventListener(a,b,!1)},jc.prototype.off=function(a,b){this.canvas.removeEventListener(a,b,!1)},jc.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},kc={initialize:a,configure:l,sync:_,slide:$,left:Ib,right:Jb,up:Kb,down:Lb,prev:Mb,next:Nb,navigateFragment:Bb,prevFragment:Db,nextFragment:Cb,navigateTo:$,navigateLeft:Ib,navigateRight:Jb,navigateUp:Kb,navigateDown:Lb,navigatePrev:Mb,navigateNext:Nb,layout:J,availableRoutes:lb,availableFragments:mb,toggleOverview:Q,togglePause:W,toggleAutoSlide:Y,isOverview:R,isPaused:X,isAutoSliding:Z,addEventListeners:m,removeEventListeners:n,getState:yb,setState:zb,getProgress:qb,getIndices:ub,getTotalSlides:vb,getSlide:wb,getSlideBackground:xb,getPreviousSlide:function(){return nc},getCurrentSlide:function(){return oc},getScale:function(){return zc},getConfig:function(){return wc},getQueryHash:function(){var a={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,function(b){a[b.split("=").shift()]=b.split("=").pop()});for(var b in a){var c=a[b];a[b]=q(unescape(c))}return a},isFirstSlide:function(){return 0===lc&&0===mc},isLastSlide:function(){return oc?oc.nextElementSibling?!1:S(oc)&&oc.parentNode.nextElementSibling?!1:!0:!1},isReady:function(){return xc},addEventListener:function(a,b,c){"addEventListener"in window&&(Ac.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(Ac.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)},triggerKey:function(a){Qb({keyCode:a})}}});
\ No newline at end of file
