diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/reveal.js | 1057 | ||||
-rw-r--r-- | js/reveal.min.js | 7 |
2 files changed, 736 insertions, 328 deletions
diff --git a/js/reveal.js b/js/reveal.js index e7debb5..06b217b 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -3,7 +3,7 @@ * http://lab.hakim.se/reveal-js * MIT licensed * - * Copyright (C) 2013 Hakim El Hattab, http://hakim.se + * Copyright (C) 2014 Hakim El Hattab, http://hakim.se */ var Reveal = (function(){ @@ -35,6 +35,9 @@ var Reveal = (function(){ // Display a presentation progress bar progress: true, + // Display the page number of the current slide + slideNumber: false, + // Push each slide change to the browser history history: false, @@ -109,6 +112,7 @@ var Reveal = (function(){ // Script dependencies to load dependencies: [] + }, // Flags if reveal.js is loaded (has dispatched the 'ready' event) @@ -122,6 +126,8 @@ var Reveal = (function(){ previousSlide, currentSlide, + previousBackground, + // Slides may hold a data-state attribute which we pick up and apply // as a class to the body. This list contains the combined state of // all current slides. @@ -145,12 +151,6 @@ var Reveal = (function(){ // Delays updates to the URL due to a Chrome thumbnailer bug writeURLTimeout = 0, - // A delay used to activate the overview mode - activateOverviewTimeout = 0, - - // A delay used to deactivate the overview mode - deactivateOverviewTimeout = 0, - // Flags if the interaction event listeners are bound eventsAreBound = false, @@ -236,17 +236,42 @@ var Reveal = (function(){ } - /** - * Loads the dependencies of reveal.js. Dependencies are - * defined via the configuration option 'dependencies' - * and will be loaded prior to starting/binding reveal.js. - * Some dependencies may have an 'async' flag, if so they - * will load after reveal.js has been started up. - */ + + /** + * Loads the dependencies of reveal.js. Dependencies are + * defined via the configuration option 'dependencies' + * and will be loaded prior to starting/binding reveal.js. + * Some dependencies may have an 'async' flag, if so they + * will load after reveal.js has been started up. + */ function load() { var scripts = [], - scriptsAsync = []; + scriptsAsync = [], + scriptsToPreload = 0; + + // Called once synchronous scripts finish loading + function proceed() { + if( scriptsAsync.length ) { + // Load asynchronous scripts + head.js.apply( null, scriptsAsync ); + } + + start(); + } + + function loadScript( s ) { + head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], function() { + // Extension may contain callback functions + if( typeof s.callback === 'function' ) { + s.callback.apply( this ); + } + + if( --scriptsToPreload === 0 ) { + proceed(); + } + }); + } for( var i = 0, len = config.dependencies.length; i < len; i++ ) { var s = config.dependencies[i]; @@ -260,25 +285,12 @@ var Reveal = (function(){ scripts.push( s.src ); } - // Extension may contain callback functions - if( typeof s.callback === 'function' ) { - head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], s.callback ); - } - } - } - - // Called once synchronous scripts finish loading - function proceed() { - if( scriptsAsync.length ) { - // Load asynchronous scripts - head.js.apply( null, scriptsAsync ); + loadScript( s ); } - - start(); } if( scripts.length ) { - head.ready( proceed ); + scriptsToPreload = scripts.length; // Load synchronous scripts head.js.apply( null, scripts ); @@ -298,8 +310,8 @@ var Reveal = (function(){ // Make sure we've got all the DOM elements we need setupDOM(); - // Decorate the slide DOM elements with state classes (past/future) - setupSlides(); + // Resets all vertical slides so that only the first is visible + resetVerticalSlides(); // Updates the presentation to match the current configuration values configure(); @@ -307,6 +319,9 @@ var Reveal = (function(){ // Read the initial hash readURL(); + // Update all backgrounds + updateBackground( true ); + // Notify listeners that the presentation is ready but use a 1ms // timeout to ensure it's not fired synchronously after #initialize() setTimeout( function() { @@ -325,26 +340,6 @@ var Reveal = (function(){ } /** - * Iterates through and decorates slides DOM elements with - * appropriate classes. - */ - function setupSlides() { - - var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); - horizontalSlides.forEach( function( horizontalSlide ) { - - var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); - verticalSlides.forEach( function( verticalSlide, y ) { - - if( y > 0 ) verticalSlide.classList.add( 'future' ); - - } ); - - } ); - - } - - /** * Finds and stores references to DOM elements which are * required by the presentation. If a required element is * not found, it is created. @@ -373,6 +368,9 @@ var Reveal = (function(){ '<div class="navigate-up"></div>' + '<div class="navigate-down"></div>' ); + // Slide number + dom.slideNumber = createSingletonNode( dom.wrapper, 'div', 'slide-number', '' ); + // State background element [DEPRECATED] createSingletonNode( dom.wrapper, 'div', 'state-background', null ); @@ -427,67 +425,26 @@ var Reveal = (function(){ dom.background.innerHTML = ''; dom.background.classList.add( 'no-transition' ); - // Helper method for creating a background element for the - // given slide - function _createBackground( slide, container ) { - - var data = { - background: slide.getAttribute( 'data-background' ), - backgroundSize: slide.getAttribute( 'data-background-size' ), - backgroundImage: slide.getAttribute( 'data-background-image' ), - backgroundColor: slide.getAttribute( 'data-background-color' ), - backgroundRepeat: slide.getAttribute( 'data-background-repeat' ), - backgroundPosition: slide.getAttribute( 'data-background-position' ), - backgroundTransition: slide.getAttribute( 'data-background-transition' ) - }; - - var element = document.createElement( 'div' ); - element.className = 'slide-background'; - - if( data.background ) { - // Auto-wrap image urls in url(...) - if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) { - element.style.backgroundImage = 'url('+ data.background +')'; - } - else { - element.style.background = data.background; - } - } - - // Additional and optional background properties - if( data.backgroundSize ) element.style.backgroundSize = data.backgroundSize; - if( data.backgroundImage ) element.style.backgroundImage = 'url("' + data.backgroundImage + '")'; - if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor; - if( data.backgroundRepeat ) element.style.backgroundRepeat = data.backgroundRepeat; - if( data.backgroundPosition ) element.style.backgroundPosition = data.backgroundPosition; - if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition ); - - container.appendChild( element ); - - return element; - - } - // Iterate over all horizontal slides toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( slideh ) { var backgroundStack; if( isPrintingPDF() ) { - backgroundStack = _createBackground( slideh, slideh ); + backgroundStack = createBackground( slideh, slideh ); } else { - backgroundStack = _createBackground( slideh, dom.background ); + backgroundStack = createBackground( slideh, dom.background ); } // Iterate over all vertical slides toArray( slideh.querySelectorAll( 'section' ) ).forEach( function( slidev ) { if( isPrintingPDF() ) { - _createBackground( slidev, slidev ); + createBackground( slidev, slidev ); } else { - _createBackground( slidev, backgroundStack ); + createBackground( slidev, backgroundStack ); } } ); @@ -519,6 +476,79 @@ var Reveal = (function(){ } /** + * Creates a background for the given slide. + * + * @param {HTMLElement} slide + * @param {HTMLElement} container The element that the background + * should be appended to + */ + function createBackground( slide, container ) { + + var data = { + background: slide.getAttribute( 'data-background' ), + backgroundSize: slide.getAttribute( 'data-background-size' ), + backgroundImage: slide.getAttribute( 'data-background-image' ), + backgroundVideo: slide.getAttribute( 'data-background-video' ), + backgroundColor: slide.getAttribute( 'data-background-color' ), + backgroundRepeat: slide.getAttribute( 'data-background-repeat' ), + backgroundPosition: slide.getAttribute( 'data-background-position' ), + backgroundTransition: slide.getAttribute( 'data-background-transition' ) + }; + + var element = document.createElement( 'div' ); + element.className = 'slide-background'; + + if( data.background ) { + // Auto-wrap image urls in url(...) + if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) { + element.style.backgroundImage = 'url('+ data.background +')'; + } + else { + element.style.background = data.background; + } + } + + // Create a hash for this combination of background settings. + // This is used to determine when two slide backgrounds are + // the same. + if( data.background || data.backgroundColor || data.backgroundImage || data.backgroundVideo ) { + element.setAttribute( 'data-background-hash', data.background + + data.backgroundSize + + data.backgroundImage + + data.backgroundVideo + + data.backgroundColor + + data.backgroundRepeat + + data.backgroundPosition + + data.backgroundTransition ); + } + + // Additional and optional background properties + if( data.backgroundSize ) element.style.backgroundSize = data.backgroundSize; + if( data.backgroundImage ) element.style.backgroundImage = 'url("' + data.backgroundImage + '")'; + if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor; + if( data.backgroundRepeat ) element.style.backgroundRepeat = data.backgroundRepeat; + if( data.backgroundPosition ) element.style.backgroundPosition = data.backgroundPosition; + if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition ); + + // Create video background element + if( data.backgroundVideo ) { + var video = document.createElement( 'video' ); + + // Support comma separated lists of video sources + data.backgroundVideo.split( ',' ).forEach( function( source ) { + video.innerHTML += '<source src="'+ source +'">'; + } ); + + element.appendChild( video ); + } + + container.appendChild( element ); + + return element; + + } + + /** * Applies the configuration settings from the config * object. May be called multiple times. */ @@ -583,7 +613,13 @@ var Reveal = (function(){ enablePreviewLinks( '[data-preview-link]' ); } - // Auto-slide playback controls + // Remove existing auto-slide controls + if( autoSlidePlayer ) { + autoSlidePlayer.destroy(); + autoSlidePlayer = null; + } + + // Generate auto-slide controls if needed if( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable && features.canvas && features.requestAnimationFrame ) { autoSlidePlayer = new Playback( dom.wrapper, function() { return Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 ); @@ -592,9 +628,13 @@ var Reveal = (function(){ autoSlidePlayer.on( 'click', onAutoSlidePlayerClick ); autoSlidePaused = false; } - else if( autoSlidePlayer ) { - autoSlidePlayer.destroy(); - autoSlidePlayer = null; + + // When fragments are turned off they should be visible + if( config.fragments === false ) { + toArray( dom.slides.querySelectorAll( '.fragment' ) ).forEach( function( element ) { + element.classList.add( 'visible' ); + element.classList.remove( 'current-fragment' ); + } ); } // Load the theme in the config, if it's not already loaded @@ -629,7 +669,14 @@ var Reveal = (function(){ dom.wrapper.addEventListener( 'touchend', onTouchEnd, false ); // Support pointer-style touch interaction as well - if( window.navigator.msPointerEnabled ) { + if( window.navigator.pointerEnabled ) { + // IE 11 uses un-prefixed version of pointer events + dom.wrapper.addEventListener( 'pointerdown', onPointerDown, false ); + dom.wrapper.addEventListener( 'pointermove', onPointerMove, false ); + dom.wrapper.addEventListener( 'pointerup', onPointerUp, false ); + } + else if( window.navigator.msPointerEnabled ) { + // IE 10 uses prefixed version of pointer events dom.wrapper.addEventListener( 'MSPointerDown', onPointerDown, false ); dom.wrapper.addEventListener( 'MSPointerMove', onPointerMove, false ); dom.wrapper.addEventListener( 'MSPointerUp', onPointerUp, false ); @@ -688,7 +735,14 @@ var Reveal = (function(){ dom.wrapper.removeEventListener( 'touchmove', onTouchMove, false ); dom.wrapper.removeEventListener( 'touchend', onTouchEnd, false ); - if( window.navigator.msPointerEnabled ) { + // IE11 + if( window.navigator.pointerEnabled ) { + dom.wrapper.removeEventListener( 'pointerdown', onPointerDown, false ); + dom.wrapper.removeEventListener( 'pointermove', onPointerMove, false ); + dom.wrapper.removeEventListener( 'pointerup', onPointerUp, false ); + } + // IE10 + else if( window.navigator.msPointerEnabled ) { dom.wrapper.removeEventListener( 'MSPointerDown', onPointerDown, false ); dom.wrapper.removeEventListener( 'MSPointerMove', onPointerMove, false ); dom.wrapper.removeEventListener( 'MSPointerUp', onPointerUp, false ); @@ -731,6 +785,22 @@ var Reveal = (function(){ } /** + * Utility for deserializing a value. + */ + function deserialize( value ) { + + if( typeof value === 'string' ) { + if( value === 'null' ) return null; + else if( value === 'true' ) return true; + else if( value === 'false' ) return false; + else if( value.match( /^\d+$/ ) ) return parseFloat( value ); + } + + return value; + + } + + /** * Measures the distance in pixels between point a * and point b. * @@ -796,40 +866,26 @@ var Reveal = (function(){ /** * Returns the remaining height within the parent of the - * target element after subtracting the height of all - * siblings. + * target element. * - * remaining height = [parent height] - [ siblings height] + * remaining height = [ configured parent height ] - [ current parent height ] */ function getRemainingHeight( element, height ) { height = height || 0; if( element ) { - var parent = element.parentNode; - var siblings = parent.childNodes; - - // Subtract the height of each sibling - toArray( siblings ).forEach( function( sibling ) { + var newHeight, oldHeight = element.style.height; - if( typeof sibling.offsetHeight === 'number' && sibling !== element ) { + // Change the .stretch element height to 0 in order find the height of all + // the other elements + element.style.height = '0px'; + newHeight = height - element.parentNode.offsetHeight; - var styles = window.getComputedStyle( sibling ), - marginTop = parseInt( styles.marginTop, 10 ), - marginBottom = parseInt( styles.marginBottom, 10 ); - - height -= sibling.offsetHeight + marginTop + marginBottom; - - } - - } ); - - var elementStyles = window.getComputedStyle( element ); - - // Subtract the margins of the target element - height -= parseInt( elementStyles.marginTop, 10 ) + - parseInt( elementStyles.marginBottom, 10 ); + // Restore the old height, just in case + element.style.height = oldHeight + 'px'; + return newHeight; } return height; @@ -889,7 +945,7 @@ var Reveal = (function(){ function enableRollingLinks() { if( features.transforms3d && !( 'msPerspective' in document.body.style ) ) { - var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a:not(.image)' ); + var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a' ); for( var i = 0, len = anchors.length; i < len; i++ ) { var anchor = anchors[i]; @@ -1012,38 +1068,6 @@ var Reveal = (function(){ } /** - * Return a sorted fragments list, ordered by an increasing - * "data-fragment-index" attribute. - * - * Fragments will be revealed in the order that they are returned by - * this function, so you can use the index attributes to control the - * order of fragment appearance. - * - * To maintain a sensible default fragment order, fragments are presumed - * to be passed in document order. This function adds a "fragment-index" - * attribute to each node if such an attribute is not already present, - * and sets that attribute to an integer value which is the position of - * the fragment within the fragments list. - */ - function sortFragments( fragments ) { - - var a = toArray( fragments ); - - a.forEach( function( el, idx ) { - if( !el.hasAttribute( 'data-fragment-index' ) ) { - el.setAttribute( 'data-fragment-index', idx ); - } - } ); - - a.sort( function( l, r ) { - return l.getAttribute( 'data-fragment-index' ) - r.getAttribute( 'data-fragment-index'); - } ); - - return a; - - } - - /** * Applies JavaScript-controlled layout rules to the * presentation. */ @@ -1087,14 +1111,17 @@ var Reveal = (function(){ scale = Math.max( scale, config.minScale ); scale = Math.min( scale, config.maxScale ); - // Prefer applying scale via zoom since Chrome blurs scaled content - // with nested transforms - if( typeof dom.slides.style.zoom !== 'undefined' && !navigator.userAgent.match( /(iphone|ipod|ipad|android)/gi ) ) { + // Prefer zooming in WebKit so that content remains crisp + if( /webkit/i.test( navigator.userAgent ) && typeof dom.slides.style.zoom !== 'undefined' ) { dom.slides.style.zoom = scale; } // Apply scale transform as a fallback else { - transformElement( dom.slides, 'translate(-50%, -50%) scale('+ scale +') translate(50%, 50%)' ); + dom.slides.style.left = '50%'; + dom.slides.style.top = '50%'; + dom.slides.style.bottom = 'auto'; + dom.slides.style.right = 'auto'; + transformElement( dom.slides, 'translate(-50%, -50%) scale('+ scale +')' ); } // Select all slides, vertical and horizontal @@ -1115,7 +1142,7 @@ var Reveal = (function(){ slide.style.top = 0; } else { - slide.style.top = Math.max( - ( getAbsoluteHeight( slide ) / 2 ) - slidePadding, -slideHeight / 2 ) + 'px'; + slide.style.top = Math.max( ( ( slideHeight - getAbsoluteHeight( slide ) ) / 2 ) - slidePadding, 0 ) + 'px'; } } else { @@ -1141,7 +1168,7 @@ var Reveal = (function(){ toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( function( element ) { // Determine how much vertical space we can use - var remainingHeight = getRemainingHeight( element, ( height - ( padding * 2 ) ) ); + var remainingHeight = getRemainingHeight( element, height ); // Consider the aspect ratio of media elements if( /(img|video)/gi.test( element.nodeName ) ) { @@ -1222,67 +1249,57 @@ var Reveal = (function(){ dom.wrapper.classList.add( 'overview' ); dom.wrapper.classList.remove( 'overview-deactivating' ); - clearTimeout( activateOverviewTimeout ); - clearTimeout( deactivateOverviewTimeout ); - - // Not the pretties solution, but need to let the overview - // class apply first so that slides are measured accurately - // before we can position them - activateOverviewTimeout = setTimeout( function() { - - var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); + var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); - for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) { - var hslide = horizontalSlides[i], - hoffset = config.rtl ? -105 : 105; + for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) { + var hslide = horizontalSlides[i], + hoffset = config.rtl ? -105 : 105; - hslide.setAttribute( 'data-index-h', i ); + hslide.setAttribute( 'data-index-h', i ); - // Apply CSS transform - transformElement( hslide, 'translateZ(-'+ depth +'px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)' ); + // Apply CSS transform + transformElement( hslide, 'translateZ(-'+ depth +'px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)' ); - if( hslide.classList.contains( 'stack' ) ) { + if( hslide.classList.contains( 'stack' ) ) { - var verticalSlides = hslide.querySelectorAll( 'section' ); + var verticalSlides = hslide.querySelectorAll( 'section' ); - for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) { - var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide ); + for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) { + var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide ); - var vslide = verticalSlides[j]; + var vslide = verticalSlides[j]; - vslide.setAttribute( 'data-index-h', i ); - vslide.setAttribute( 'data-index-v', j ); + vslide.setAttribute( 'data-index-h', i ); + vslide.setAttribute( 'data-index-v', j ); - // Apply CSS transform - transformElement( vslide, 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)' ); - - // Navigate to this slide on click - vslide.addEventListener( 'click', onOverviewSlideClicked, true ); - } - - } - else { + // Apply CSS transform + transformElement( vslide, 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)' ); // Navigate to this slide on click - hslide.addEventListener( 'click', onOverviewSlideClicked, true ); - + vslide.addEventListener( 'click', onOverviewSlideClicked, true ); } - } - updateSlidesVisibility(); + } + else { - layout(); + // Navigate to this slide on click + hslide.addEventListener( 'click', onOverviewSlideClicked, true ); - if( !wasActive ) { - // Notify observers of the overview showing - dispatchEvent( 'overviewshown', { - 'indexh': indexh, - 'indexv': indexv, - 'currentSlide': currentSlide - } ); } + } + + updateSlidesVisibility(); - }, 10 ); + layout(); + + if( !wasActive ) { + // Notify observers of the overview showing + dispatchEvent( 'overviewshown', { + 'indexh': indexh, + 'indexv': indexv, + 'currentSlide': currentSlide + } ); + } } @@ -1297,9 +1314,6 @@ var Reveal = (function(){ // Only proceed if enabled in config if( config.overview ) { - clearTimeout( activateOverviewTimeout ); - clearTimeout( deactivateOverviewTimeout ); - dom.wrapper.classList.remove( 'overview' ); // Temporarily add a class so that transitions can do different things @@ -1307,7 +1321,7 @@ var Reveal = (function(){ // moving from slide to slide dom.wrapper.classList.add( 'overview-deactivating' ); - deactivateOverviewTimeout = setTimeout( function () { + setTimeout( function () { dom.wrapper.classList.remove( 'overview-deactivating' ); }, 1 ); @@ -1394,7 +1408,7 @@ var Reveal = (function(){ element.webkitRequestFullscreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || - element.msRequestFullScreen; + element.msRequestFullscreen; if( requestMethod ) { requestMethod.apply( element ); @@ -1438,13 +1452,13 @@ var Reveal = (function(){ /** * Toggles the paused mode on and off. */ - function togglePause() { + function togglePause( override ) { - if( isPaused() ) { - resume(); + if( typeof override === 'boolean' ) { + override ? pause() : resume(); } else { - pause(); + isPaused() ? resume() : pause(); } } @@ -1459,6 +1473,34 @@ var Reveal = (function(){ } /** + * Toggles the auto slide mode on and off. + * + * @param {Boolean} override Optional flag which sets the desired state. + * True means autoplay starts, false means it stops. + */ + + function toggleAutoSlide( override ) { + + if( typeof override === 'boolean' ) { + override ? resumeAutoSlide() : pauseAutoSlide(); + } + + else { + autoSlidePaused ? resumeAutoSlide() : pauseAutoSlide(); + } + + } + + /** + * Checks if the auto slide mode is currently on. + */ + function isAutoSliding() { + + return !!( autoSlide && !autoSlidePaused ); + + } + + /** * Steps from the current point in the presentation to the * slide which matches the specified horizontal and vertical * indices. @@ -1544,16 +1586,7 @@ var Reveal = (function(){ // Show fragment, if specified if( typeof f !== 'undefined' ) { - var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment' ) ); - - toArray( fragments ).forEach( function( fragment, indexf ) { - if( indexf < f ) { - fragment.classList.add( 'visible' ); - } - else { - fragment.classList.remove( 'visible' ); - } - } ); + navigateFragment( f ); } // Dispatch an event if the slide changed @@ -1604,6 +1637,7 @@ var Reveal = (function(){ updateProgress(); updateBackground(); updateParallax(); + updateSlideNumber(); // Update the URL hash writeURL(); @@ -1635,9 +1669,58 @@ var Reveal = (function(){ // Re-create the slide backgrounds createBackgrounds(); + sortAllFragments(); + updateControls(); updateProgress(); - updateBackground(); + updateBackground( true ); + updateSlideNumber(); + + } + + /** + * Resets all vertical slides so that only the first + * is visible. + */ + function resetVerticalSlides() { + + var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + horizontalSlides.forEach( function( horizontalSlide ) { + + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); + verticalSlides.forEach( function( verticalSlide, y ) { + + if( y > 0 ) { + verticalSlide.classList.remove( 'present' ); + verticalSlide.classList.remove( 'past' ); + verticalSlide.classList.add( 'future' ); + } + + } ); + + } ); + + } + + /** + * Sorts and formats all of fragments in the + * presentation. + */ + function sortAllFragments() { + + var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + horizontalSlides.forEach( function( horizontalSlide ) { + + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); + verticalSlides.forEach( function( verticalSlide, y ) { + + sortFragments( verticalSlide.querySelectorAll( '.fragment' ) ); + + } ); + + if( verticalSlides.length === 0 ) sortFragments( horizontalSlide.querySelectorAll( '.fragment' ) ); + + } ); } @@ -1690,16 +1773,31 @@ var Reveal = (function(){ if( i < index ) { // Any element previous to index is given the 'past' class element.classList.add( reverse ? 'future' : 'past' ); + + if( config.fragments ) { + var pastFragments = toArray( element.querySelectorAll( '.fragment' ) ); + + // Show all fragments on prior slides + while( pastFragments.length ) { + var pastFragment = pastFragments.pop(); + pastFragment.classList.add( 'visible' ); + pastFragment.classList.remove( 'current-fragment' ); + } + } } else if( i > index ) { // Any element subsequent to index is given the 'future' class element.classList.add( reverse ? 'past' : 'future' ); - var fragments = toArray( element.querySelectorAll( '.fragment.visible' ) ); + if( config.fragments ) { + var futureFragments = toArray( element.querySelectorAll( '.fragment.visible' ) ); - // No fragments in future slides should be visible ahead of time - while( fragments.length ) { - fragments.pop().classList.remove( 'visible' ); + // No fragments in future slides should be visible ahead of time + while( futureFragments.length ) { + var futureFragment = futureFragments.pop(); + futureFragment.classList.remove( 'visible' ); + futureFragment.classList.remove( 'current-fragment' ); + } } } @@ -1794,43 +1892,27 @@ var Reveal = (function(){ // Update progress if enabled if( config.progress && dom.progress ) { - var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); - - // The number of past and total slides - var totalCount = document.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length; - var pastCount = 0; - - // Step through all slides and count the past ones - mainLoop: for( var i = 0; i < horizontalSlides.length; i++ ) { + dom.progressbar.style.width = getProgress() * window.innerWidth + 'px'; - var horizontalSlide = horizontalSlides[i]; - var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); - - for( var j = 0; j < verticalSlides.length; j++ ) { - - // Stop as soon as we arrive at the present - if( verticalSlides[j].classList.contains( 'present' ) ) { - break mainLoop; - } - - pastCount++; + } - } + } - // Stop as soon as we arrive at the present - if( horizontalSlide.classList.contains( 'present' ) ) { - break; - } + /** + * Updates the slide number div to reflect the current slide. + */ + function updateSlideNumber() { - // Don't count the wrapping section for vertical slides - if( horizontalSlide.classList.contains( 'stack' ) === false ) { - pastCount++; - } + // Update slide number if enabled + if( config.slideNumber && dom.slideNumber) { + // Display the number of the page using 'indexh - indexv' format + var indexString = indexh; + if( indexv > 0 ) { + indexString += ' - ' + indexv; } - dom.progressbar.style.width = ( pastCount / ( totalCount - 1 ) ) * window.innerWidth + 'px'; - + dom.slideNumber.innerHTML = indexString; } } @@ -1888,27 +1970,82 @@ var Reveal = (function(){ /** * Updates the background elements to reflect the current * slide. + * + * @param {Boolean} includeAll If true, the backgrounds of + * all vertical slides (not just the present) will be updated. */ - function updateBackground() { + function updateBackground( includeAll ) { + + var currentBackground = null; + + // Reverse past/future classes when in RTL mode + var horizontalPast = config.rtl ? 'future' : 'past', + horizontalFuture = config.rtl ? 'past' : 'future'; // Update the classes of all backgrounds to match the // states of their slides (past/present/future) toArray( dom.background.childNodes ).forEach( function( backgroundh, h ) { - // Reverse past/future classes when in RTL mode - var horizontalPast = config.rtl ? 'future' : 'past', - horizontalFuture = config.rtl ? 'past' : 'future'; + if( h < indexh ) { + backgroundh.className = 'slide-background ' + horizontalPast; + } + else if ( h > indexh ) { + backgroundh.className = 'slide-background ' + horizontalFuture; + } + else { + backgroundh.className = 'slide-background present'; - backgroundh.className = 'slide-background ' + ( h < indexh ? horizontalPast : h > indexh ? horizontalFuture : 'present' ); + // Store a reference to the current background element + currentBackground = backgroundh; + } - toArray( backgroundh.childNodes ).forEach( function( backgroundv, v ) { + if( includeAll || h === indexh ) { + toArray( backgroundh.querySelectorAll( 'section' ) ).forEach( function( backgroundv, v ) { + + if( v < indexv ) { + backgroundv.className = 'slide-background past'; + } + else if ( v > indexv ) { + backgroundv.className = 'slide-background future'; + } + else { + backgroundv.className = 'slide-background present'; - backgroundv.className = 'slide-background ' + ( v < indexv ? 'past' : v > indexv ? 'future' : 'present' ); + // Only if this is the present horizontal and vertical slide + if( h === indexh ) currentBackground = backgroundv; + } - } ); + } ); + } } ); + // Stop any currently playing video background + if( previousBackground ) { + + var previousVideo = previousBackground.querySelector( 'video' ); + if( previousVideo ) previousVideo.pause(); + + } + + if( currentBackground ) { + + // Start video playback + var currentVideo = currentBackground.querySelector( 'video' ); + if( currentVideo ) currentVideo.play(); + + // Don't transition between identical backgrounds. This + // prevents unwanted flicker. + var previousBackgroundHash = previousBackground ? previousBackground.getAttribute( 'data-background-hash' ) : null; + var currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' ); + if( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== previousBackground ) { + dom.background.classList.add( 'no-transition' ); + } + + previousBackground = currentBackground; + + } + // Allow the first background to apply without transition setTimeout( function() { dom.background.classList.remove( 'no-transition' ); @@ -1944,7 +2081,7 @@ var Reveal = (function(){ var slideHeight = dom.background.offsetHeight; var verticalSlideCount = verticalSlides.length; - var verticalOffset = verticalSlideCount > 0 ? -( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 ) * indexv : 0; + var verticalOffset = verticalSlideCount > 1 ? -( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 ) * indexv : 0; dom.background.style.backgroundPosition = horizontalOffset + 'px ' + verticalOffset + 'px'; @@ -2062,6 +2199,70 @@ var Reveal = (function(){ } /** + * Returns a value ranging from 0-1 that represents + * how far into the presentation we have navigated. + */ + function getProgress() { + + var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + + // The number of past and total slides + var totalCount = document.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length; + var pastCount = 0; + + // Step through all slides and count the past ones + mainLoop: for( var i = 0; i < horizontalSlides.length; i++ ) { + + var horizontalSlide = horizontalSlides[i]; + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); + + for( var j = 0; j < verticalSlides.length; j++ ) { + + // Stop as soon as we arrive at the present + if( verticalSlides[j].classList.contains( 'present' ) ) { + break mainLoop; + } + + pastCount++; + + } + + // Stop as soon as we arrive at the present + if( horizontalSlide.classList.contains( 'present' ) ) { + break; + } + + // Don't count the wrapping section for vertical slides + if( horizontalSlide.classList.contains( 'stack' ) === false ) { + pastCount++; + } + + } + + if( currentSlide ) { + + var allFragments = currentSlide.querySelectorAll( '.fragment' ); + + // If there are fragments in the current slide those should be + // accounted for in the progress. + if( allFragments.length > 0 ) { + var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' ); + + // This value represents how big a portion of the slide progress + // that is made up by its fragments (0-1) + var fragmentWeight = 0.9; + + // Add fragment progress to the past slide count + pastCount += ( visibleFragments.length / allFragments.length ) * fragmentWeight; + } + + } + + return pastCount / ( totalCount - 1 ); + + } + + /** * Checks if this presentation is running inside of the * speaker notes window. */ @@ -2085,8 +2286,16 @@ var Reveal = (function(){ // If the first bit is invalid and there is a name we can // assume that this is a named link if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) { - // Find the slide with the specified name - var element = document.querySelector( '#' + name ); + var element; + + try { + // Find the slide with the specified name + element = document.querySelector( '#' + name ); + } + catch( e ) { + // If the ID is an invalid selector a harmless SyntaxError + // may be thrown here. + } if( element ) { // Find the position of the named slide and navigate to it @@ -2131,9 +2340,16 @@ var Reveal = (function(){ else { var url = '/'; + // Attempt to create a named link based on the slide's ID + var id = currentSlide.getAttribute( 'id' ); + if( id ) { + id = id.toLowerCase(); + id = id.replace( /[^a-zA-Z0-9\-\_\:\.]/g, '' ); + } + // If the current slide has an ID, use that as a named link - if( currentSlide && typeof currentSlide.getAttribute( 'id' ) === 'string' ) { - url = '/' + currentSlide.getAttribute( 'id' ); + if( currentSlide && typeof id === 'string' && id.length ) { + url = '/' + id; } // Otherwise use the /h/v index else { @@ -2185,7 +2401,7 @@ var Reveal = (function(){ var hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0; if( hasFragments ) { var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' ); - f = visibleFragments.length; + f = visibleFragments.length - 1; } } @@ -2194,67 +2410,188 @@ var Reveal = (function(){ } /** - * Navigate to the next slide fragment. + * Retrieves the total number of slides in this presentation. + */ + function getTotalSlides() { + + return document.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length; + + } + + /** + * Retrieves the current state of the presentation as + * an object. This state can then be restored at any + * time. + */ + function getState() { + + var indices = getIndices(); + + return { + indexh: indices.h, + indexv: indices.v, + indexf: indices.f, + paused: isPaused(), + overview: isOverview() + }; + + } + + /** + * Restores the presentation to the given state. * - * @return {Boolean} true if there was a next fragment, - * false otherwise + * @param {Object} state As generated by getState() */ - function nextFragment() { + function setState( state ) { - if( currentSlide && config.fragments ) { - var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment:not(.visible)' ) ); + if( typeof state === 'object' ) { + slide( deserialize( state.indexh ), deserialize( state.indexv ), deserialize( state.indexf ) ); + togglePause( deserialize( state.paused ) ); + toggleOverview( deserialize( state.overview ) ); + } - if( fragments.length ) { - // Find the index of the next fragment - var index = fragments[0].getAttribute( 'data-fragment-index' ); + } - // Find all fragments with the same index - fragments = currentSlide.querySelectorAll( '.fragment[data-fragment-index="'+ index +'"]' ); + /** + * Return a sorted fragments list, ordered by an increasing + * "data-fragment-index" attribute. + * + * Fragments will be revealed in the order that they are returned by + * this function, so you can use the index attributes to control the + * order of fragment appearance. + * + * To maintain a sensible default fragment order, fragments are presumed + * to be passed in document order. This function adds a "fragment-index" + * attribute to each node if such an attribute is not already present, + * and sets that attribute to an integer value which is the position of + * the fragment within the fragments list. + */ + function sortFragments( fragments ) { - toArray( fragments ).forEach( function( element ) { - element.classList.add( 'visible' ); - } ); + fragments = toArray( fragments ); - // Notify subscribers of the change - dispatchEvent( 'fragmentshown', { fragment: fragments[0], fragments: fragments } ); + var ordered = [], + unordered = [], + sorted = []; - updateControls(); - return true; + // Group ordered and unordered elements + fragments.forEach( function( fragment, i ) { + if( fragment.hasAttribute( 'data-fragment-index' ) ) { + var index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 ); + + if( !ordered[index] ) { + ordered[index] = []; + } + + ordered[index].push( fragment ); } - } + else { + unordered.push( [ fragment ] ); + } + } ); - return false; + // Append fragments without explicit indices in their + // DOM order + ordered = ordered.concat( unordered ); + + // Manually count the index up per group to ensure there + // are no gaps + var index = 0; + + // Push all fragments in their sorted order to an array, + // this flattens the groups + ordered.forEach( function( group ) { + group.forEach( function( fragment ) { + sorted.push( fragment ); + fragment.setAttribute( 'data-fragment-index', index ); + } ); + + index ++; + } ); + + return sorted; } /** - * Navigate to the previous slide fragment. + * Navigate to the specified slide fragment. * - * @return {Boolean} true if there was a previous fragment, - * false otherwise + * @param {Number} index The index of the fragment that + * should be shown, -1 means all are invisible + * @param {Number} offset Integer offset to apply to the + * fragment index + * + * @return {Boolean} true if a change was made in any + * fragments visibility as part of this call */ - function previousFragment() { + function navigateFragment( index, offset ) { if( currentSlide && config.fragments ) { - var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment.visible' ) ); + var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment' ) ); if( fragments.length ) { - // Find the index of the previous fragment - var index = fragments[ fragments.length - 1 ].getAttribute( 'data-fragment-index' ); - // Find all fragments with the same index - fragments = currentSlide.querySelectorAll( '.fragment[data-fragment-index="'+ index +'"]' ); + // If no index is specified, find the current + if( typeof index !== 'number' ) { + var lastVisibleFragment = sortFragments( currentSlide.querySelectorAll( '.fragment.visible' ) ).pop(); + + if( lastVisibleFragment ) { + index = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 ); + } + else { + index = -1; + } + } + + // If an offset is specified, apply it to the index + if( typeof offset === 'number' ) { + index += offset; + } + + var fragmentsShown = [], + fragmentsHidden = []; + + toArray( fragments ).forEach( function( element, i ) { + + if( element.hasAttribute( 'data-fragment-index' ) ) { + i = parseInt( element.getAttribute( 'data-fragment-index' ), 10 ); + } + + // Visible fragments + if( i <= index ) { + if( !element.classList.contains( 'visible' ) ) fragmentsShown.push( element ); + element.classList.add( 'visible' ); + element.classList.remove( 'current-fragment' ); + + if( i === index ) { + element.classList.add( 'current-fragment' ); + } + } + // Hidden fragments + else { + if( element.classList.contains( 'visible' ) ) fragmentsHidden.push( element ); + element.classList.remove( 'visible' ); + element.classList.remove( 'current-fragment' ); + } + - toArray( fragments ).forEach( function( f ) { - f.classList.remove( 'visible' ); } ); - // Notify subscribers of the change - dispatchEvent( 'fragmenthidden', { fragment: fragments[0], fragments: fragments } ); + if( fragmentsHidden.length ) { + dispatchEvent( 'fragmenthidden', { fragment: fragmentsHidden[0], fragments: fragmentsHidden } ); + } + + if( fragmentsShown.length ) { + dispatchEvent( 'fragmentshown', { fragment: fragmentsShown[0], fragments: fragmentsShown } ); + } updateControls(); - return true; + updateProgress(); + + return !!( fragmentsShown.length || fragmentsHidden.length ); + } + } return false; @@ -2262,6 +2599,30 @@ var Reveal = (function(){ } /** + * Navigate to the next slide fragment. + * + * @return {Boolean} true if there was a next fragment, + * false otherwise + */ + function nextFragment() { + + return navigateFragment( null, 1 ); + + } + + /** + * Navigate to the previous slide fragment. + * + * @return {Boolean} true if there was a previous fragment, + * false otherwise + */ + function previousFragment() { + + return navigateFragment( null, -1 ); + + } + + /** * Cues a new automated slide if enabled in the config. */ function cueAutoSlide() { @@ -2270,16 +2631,41 @@ var Reveal = (function(){ if( currentSlide ) { - // If the current slide has a data-autoslide use that, - // otherwise use the config.autoSlide value + var currentFragment = currentSlide.querySelector( '.current-fragment' ); + + var fragmentAutoSlide = currentFragment ? currentFragment.getAttribute( 'data-autoslide' ) : null; + var parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null; var slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' ); - if( slideAutoSlide ) { + + // Pick value in the following priority order: + // 1. Current fragment's data-autoslide + // 2. Current slide's data-autoslide + // 3. Parent slide's data-autoslide + // 4. Global autoSlide setting + if( fragmentAutoSlide ) { + autoSlide = parseInt( fragmentAutoSlide, 10 ); + } + else if( slideAutoSlide ) { autoSlide = parseInt( slideAutoSlide, 10 ); } + else if( parentAutoSlide ) { + autoSlide = parseInt( parentAutoSlide, 10 ); + } else { autoSlide = config.autoSlide; } + // If there are media elements with data-autoplay, + // automatically set the autoSlide duration to the + // length of that media + toArray( currentSlide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { + if( el.hasAttribute( 'data-autoplay' ) ) { + if( autoSlide && el.duration * 1000 > autoSlide ) { + autoSlide = ( el.duration * 1000 ) + 1000; + } + } + } ); + // Cue the next auto-slide if: // - There is an autoSlide value // - Auto-sliding isn't paused by the user @@ -2312,6 +2698,7 @@ var Reveal = (function(){ function pauseAutoSlide() { autoSlidePaused = true; + dispatchEvent( 'autoslidepaused' ); clearTimeout( autoSlideTimeout ); if( autoSlidePlayer ) { @@ -2323,6 +2710,7 @@ var Reveal = (function(){ function resumeAutoSlide() { autoSlidePaused = false; + dispatchEvent( 'autoslideresumed' ); cueAutoSlide(); } @@ -2440,6 +2828,9 @@ var Reveal = (function(){ */ function onDocumentKeyDown( event ) { + // Remember if auto-sliding was paused so we can toggle it + var autoSlideWasPaused = autoSlidePaused; + onUserInput( event ); // Check if there's a focused element that could be using @@ -2512,10 +2903,12 @@ var Reveal = (function(){ case 32: isOverview() ? deactivateOverview() : event.shiftKey ? navigatePrev() : navigateNext(); break; // return case 13: isOverview() ? deactivateOverview() : triggered = false; break; - // b, period, Logitech presenter tools "black screen" button - case 66: case 190: case 191: togglePause(); break; + // two-spot, semicolon, b, period, Logitech presenter tools "black screen" button + case 58: case 59: case 66: case 190: case 191: togglePause(); break; // f case 70: enterFullscreen(); break; + // a + case 65: if ( config.autoSlideStoppable ) toggleAutoSlide( autoSlideWasPaused ); break; default: triggered = false; } @@ -2670,7 +3063,7 @@ var Reveal = (function(){ */ function onPointerDown( event ) { - if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) { + if( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === "touch" ) { event.touches = [{ clientX: event.clientX, clientY: event.clientY }]; onTouchStart( event ); } @@ -2682,7 +3075,7 @@ var Reveal = (function(){ */ function onPointerMove( event ) { - if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) { + if( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === "touch" ) { event.touches = [{ clientX: event.clientX, clientY: event.clientY }]; onTouchMove( event ); } @@ -2694,7 +3087,7 @@ var Reveal = (function(){ */ function onPointerUp( event ) { - if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) { + if( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === "touch" ) { event.touches = [{ clientX: event.clientX, clientY: event.clientY }]; onTouchEnd( event ); } @@ -3038,6 +3431,9 @@ var Reveal = (function(){ down: navigateDown, prev: navigatePrev, next: navigateNext, + + // Fragment methods + navigateFragment: navigateFragment, prevFragment: previousFragment, nextFragment: nextFragment, @@ -3065,17 +3461,30 @@ var Reveal = (function(){ // Toggles the "black screen" mode on/off togglePause: togglePause, + // Toggles the auto slide mode on/off + toggleAutoSlide: toggleAutoSlide, + // State checks isOverview: isOverview, isPaused: isPaused, + isAutoSliding: isAutoSliding, // Adds or removes all internal event listeners (such as keyboard) addEventListeners: addEventListeners, removeEventListeners: removeEventListeners, + // Facility for persisting and restoring the presentation state + getState: getState, + setState: setState, + + // Presentation progress on range of 0-1 + getProgress: getProgress, + // Returns the indices of the current, or specified, slide getIndices: getIndices, + getTotalSlides: getTotalSlides, + // Returns the slide at the specified index, y is optional getSlide: function( x, y ) { var horizontalSlide = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR )[ x ]; @@ -3112,17 +3521,15 @@ var Reveal = (function(){ getQueryHash: function() { var query = {}; - location.search.replace( /[A-Z0-9]+?=(\w*)/gi, function(a) { + location.search.replace( /[A-Z0-9]+?=([\w\.%-]*)/gi, function(a) { query[ a.split( '=' ).shift() ] = a.split( '=' ).pop(); } ); // Basic deserialization for( var i in query ) { var value = query[ i ]; - if( value === 'null' ) query[ i ] = null; - else if( value === 'true' ) query[ i ] = true; - else if( value === 'false' ) query[ i ] = false; - else if( !isNaN( parseFloat( value ) ) ) query[ i ] = parseFloat( value ); + + query[ i ] = deserialize( unescape( value ) ); } return query; diff --git a/js/reveal.min.js b/js/reveal.min.js index c114ee6..b91011c 100644 --- a/js/reveal.min.js +++ b/js/reveal.min.js @@ -1,8 +1,9 @@ /*! - * reveal.js 2.6.0-dev (2013-10-28, 08:44) + * reveal.js 2.7.0-dev (2014-04-04, 11:35) * http://lab.hakim.se/reveal-js * MIT licensed * - * Copyright (C) 2013 Hakim El Hattab, http://hakim.se + * Copyright (C) 2014 Hakim El Hattab, http://hakim.se */ -var Reveal=function(){"use strict";function a(a){if(b(),!ac.transforms2d&&!ac.transforms3d)return document.body.setAttribute("class","no-transforms"),void 0;window.addEventListener("load",C,!1);var d=Reveal.getQueryHash();"undefined"!=typeof d.dependencies&&delete d.dependencies,l(Xb,a),l(Xb,d),s(),c()}function b(){ac.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,ac.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,ac.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,ac.requestAnimationFrame="function"==typeof ac.requestAnimationFrameMethod,ac.canvas=!!document.createElement("canvas").getContext,Rb=navigator.userAgent.match(/(iphone|ipod|android)/gi)}function c(){function a(){c.length&&head.js.apply(null,c),d()}for(var b=[],c=[],e=0,f=Xb.dependencies.length;f>e;e++){var g=Xb.dependencies[e];(!g.condition||g.condition())&&(g.async?c.push(g.src):b.push(g.src),"function"==typeof g.callback&&head.ready(g.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],g.callback))}b.length?(head.ready(a),head.js.apply(null,b)):a()}function d(){f(),e(),i(),bb(),setTimeout(function(){_b.slides.classList.remove("no-transition"),Yb=!0,u("ready",{indexh:Nb,indexv:Ob,currentSlide:Qb})},1)}function e(){var a=m(document.querySelectorAll(Ub));a.forEach(function(a){var b=m(a.querySelectorAll("section"));b.forEach(function(a,b){b>0&&a.classList.add("future")})})}function f(){_b.theme=document.querySelector("#theme"),_b.wrapper=document.querySelector(".reveal"),_b.slides=document.querySelector(".reveal .slides"),_b.slides.classList.add("no-transition"),_b.background=g(_b.wrapper,"div","backgrounds",null),_b.progress=g(_b.wrapper,"div","progress","<span></span>"),_b.progressbar=_b.progress.querySelector("span"),g(_b.wrapper,"aside","controls",'<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>'),g(_b.wrapper,"div","state-background",null),g(_b.wrapper,"div","pause-overlay",null),_b.controls=document.querySelector(".reveal .controls"),_b.controlsLeft=m(document.querySelectorAll(".navigate-left")),_b.controlsRight=m(document.querySelectorAll(".navigate-right")),_b.controlsUp=m(document.querySelectorAll(".navigate-up")),_b.controlsDown=m(document.querySelectorAll(".navigate-down")),_b.controlsPrev=m(document.querySelectorAll(".navigate-prev")),_b.controlsNext=m(document.querySelectorAll(".navigate-next"))}function g(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 h(){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.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}r()&&document.body.classList.add("print-pdf"),_b.background.innerHTML="",_b.background.classList.add("no-transition"),m(document.querySelectorAll(Ub)).forEach(function(b){var c;c=r()?a(b,b):a(b,_b.background),m(b.querySelectorAll("section")).forEach(function(b){r()?a(b,b):a(b,c)})}),Xb.parallaxBackgroundImage?(_b.background.style.backgroundImage='url("'+Xb.parallaxBackgroundImage+'")',_b.background.style.backgroundSize=Xb.parallaxBackgroundSize,setTimeout(function(){_b.wrapper.classList.add("has-parallax-background")},1)):(_b.background.style.backgroundImage="",_b.wrapper.classList.remove("has-parallax-background"))}function i(a){var b=document.querySelectorAll(Tb).length;if(_b.wrapper.classList.remove(Xb.transition),"object"==typeof a&&l(Xb,a),ac.transforms3d===!1&&(Xb.transition="linear"),_b.wrapper.classList.add(Xb.transition),_b.wrapper.setAttribute("data-transition-speed",Xb.transitionSpeed),_b.wrapper.setAttribute("data-background-transition",Xb.backgroundTransition),_b.controls.style.display=Xb.controls?"block":"none",_b.progress.style.display=Xb.progress?"block":"none",Xb.rtl?_b.wrapper.classList.add("rtl"):_b.wrapper.classList.remove("rtl"),Xb.center?_b.wrapper.classList.add("center"):_b.wrapper.classList.remove("center"),Xb.mouseWheel?(document.addEventListener("DOMMouseScroll",yb,!1),document.addEventListener("mousewheel",yb,!1)):(document.removeEventListener("DOMMouseScroll",yb,!1),document.removeEventListener("mousewheel",yb,!1)),Xb.rollingLinks?v():w(),Xb.previewLinks?x():(y(),x("[data-preview-link]")),b>1&&Xb.autoSlide&&Xb.autoSlideStoppable&&ac.canvas&&ac.requestAnimationFrame?(Sb=new Mb(_b.wrapper,function(){return Math.min(Math.max((Date.now()-ic)/gc,0),1)}),Sb.on("click",Lb),jc=!1):Sb&&(Sb.destroy(),Sb=null),Xb.theme&&_b.theme){var c=_b.theme.getAttribute("href"),d=/[^\/]*?(?=\.css)/,e=c.match(d)[0];Xb.theme!==e&&(c=c.replace(d,Xb.theme),_b.theme.setAttribute("href",c))}R()}function j(){if(fc=!0,window.addEventListener("hashchange",Gb,!1),window.addEventListener("resize",Hb,!1),Xb.touch&&(_b.wrapper.addEventListener("touchstart",sb,!1),_b.wrapper.addEventListener("touchmove",tb,!1),_b.wrapper.addEventListener("touchend",ub,!1),window.navigator.msPointerEnabled&&(_b.wrapper.addEventListener("MSPointerDown",vb,!1),_b.wrapper.addEventListener("MSPointerMove",wb,!1),_b.wrapper.addEventListener("MSPointerUp",xb,!1))),Xb.keyboard&&document.addEventListener("keydown",rb,!1),Xb.progress&&_b.progress&&_b.progress.addEventListener("click",zb,!1),Xb.focusBodyOnPageVisiblityChange){var a;"hidden"in document?a="visibilitychange":"msHidden"in document?a="msvisibilitychange":"webkitHidden"in document&&(a="webkitvisibilitychange"),a&&document.addEventListener(a,Ib,!1)}["touchstart","click"].forEach(function(a){_b.controlsLeft.forEach(function(b){b.addEventListener(a,Ab,!1)}),_b.controlsRight.forEach(function(b){b.addEventListener(a,Bb,!1)}),_b.controlsUp.forEach(function(b){b.addEventListener(a,Cb,!1)}),_b.controlsDown.forEach(function(b){b.addEventListener(a,Db,!1)}),_b.controlsPrev.forEach(function(b){b.addEventListener(a,Eb,!1)}),_b.controlsNext.forEach(function(b){b.addEventListener(a,Fb,!1)})})}function k(){fc=!1,document.removeEventListener("keydown",rb,!1),window.removeEventListener("hashchange",Gb,!1),window.removeEventListener("resize",Hb,!1),_b.wrapper.removeEventListener("touchstart",sb,!1),_b.wrapper.removeEventListener("touchmove",tb,!1),_b.wrapper.removeEventListener("touchend",ub,!1),window.navigator.msPointerEnabled&&(_b.wrapper.removeEventListener("MSPointerDown",vb,!1),_b.wrapper.removeEventListener("MSPointerMove",wb,!1),_b.wrapper.removeEventListener("MSPointerUp",xb,!1)),Xb.progress&&_b.progress&&_b.progress.removeEventListener("click",zb,!1),["touchstart","click"].forEach(function(a){_b.controlsLeft.forEach(function(b){b.removeEventListener(a,Ab,!1)}),_b.controlsRight.forEach(function(b){b.removeEventListener(a,Bb,!1)}),_b.controlsUp.forEach(function(b){b.removeEventListener(a,Cb,!1)}),_b.controlsDown.forEach(function(b){b.removeEventListener(a,Db,!1)}),_b.controlsPrev.forEach(function(b){b.removeEventListener(a,Eb,!1)}),_b.controlsNext.forEach(function(b){b.removeEventListener(a,Fb,!1)})})}function l(a,b){for(var c in b)a[c]=b[c]}function m(a){return Array.prototype.slice.call(a)}function n(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function o(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function p(a){var b=0;if(a){var c=0;m(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 q(a,b){if(b=b||0,a){var c=a.parentNode,d=c.childNodes;m(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 r(){return/print-pdf/gi.test(window.location.search)}function s(){Xb.hideAddressBar&&Rb&&(window.addEventListener("load",t,!1),window.addEventListener("orientationchange",t,!1))}function t(){setTimeout(function(){window.scrollTo(0,1)},10)}function u(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),l(c,b),_b.wrapper.dispatchEvent(c)}function v(){if(ac.transforms3d&&!("msPerspective"in document.body.style))for(var a=document.querySelectorAll(Tb+" 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 w(){for(var a=document.querySelectorAll(Tb+" 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 x(a){var b=m(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",Kb,!1)})}function y(){var a=m(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",Kb,!1)})}function z(a){A(),_b.preview=document.createElement("div"),_b.preview.classList.add("preview-link-overlay"),_b.wrapper.appendChild(_b.preview),_b.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(""),_b.preview.querySelector("iframe").addEventListener("load",function(){_b.preview.classList.add("loaded")},!1),_b.preview.querySelector(".close").addEventListener("click",function(a){A(),a.preventDefault()},!1),_b.preview.querySelector(".external").addEventListener("click",function(){A()},!1),setTimeout(function(){_b.preview.classList.add("visible")},1)}function A(){_b.preview&&(_b.preview.setAttribute("src",""),_b.preview.parentNode.removeChild(_b.preview),_b.preview=null)}function B(a){var b=m(a);return b.forEach(function(a,b){a.hasAttribute("data-fragment-index")||a.setAttribute("data-fragment-index",b)}),b.sort(function(a,b){return a.getAttribute("data-fragment-index")-b.getAttribute("data-fragment-index")}),b}function C(){if(_b.wrapper&&!r()){var a=_b.wrapper.offsetWidth,b=_b.wrapper.offsetHeight;a-=b*Xb.margin,b-=b*Xb.margin;var c=Xb.width,d=Xb.height,e=20;D(Xb.width,Xb.height,e),"string"==typeof c&&/%$/.test(c)&&(c=parseInt(c,10)/100*a),"string"==typeof d&&/%$/.test(d)&&(d=parseInt(d,10)/100*b),_b.slides.style.width=c+"px",_b.slides.style.height=d+"px",$b=Math.min(a/c,b/d),$b=Math.max($b,Xb.minScale),$b=Math.min($b,Xb.maxScale),"undefined"==typeof _b.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)?o(_b.slides,"translate(-50%, -50%) scale("+$b+") translate(50%, 50%)"):_b.slides.style.zoom=$b;for(var f=m(document.querySelectorAll(Tb)),g=0,h=f.length;h>g;g++){var i=f[g];"none"!==i.style.display&&(i.style.top=Xb.center||i.classList.contains("center")?i.classList.contains("stack")?0:Math.max(-(p(i)/2)-e,-d/2)+"px":"")}U(),X()}}function D(a,b,c){m(_b.slides.querySelectorAll("section > .stretch")).forEach(function(d){var e=q(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 E(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function F(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 G(){if(Xb.overview){hb();var a=_b.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;_b.wrapper.classList.add("overview"),_b.wrapper.classList.remove("overview-deactivating"),clearTimeout(dc),clearTimeout(ec),dc=setTimeout(function(){for(var c=document.querySelectorAll(Ub),d=0,e=c.length;e>d;d++){var f=c[d],g=Xb.rtl?-105:105;if(f.setAttribute("data-index-h",d),o(f,"translateZ(-"+b+"px) translate("+(d-Nb)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===Nb?Ob:F(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),o(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",Jb,!0)}else f.addEventListener("click",Jb,!0)}T(),C(),a||u("overviewshown",{indexh:Nb,indexv:Ob,currentSlide:Qb})},10)}}function H(){Xb.overview&&(clearTimeout(dc),clearTimeout(ec),_b.wrapper.classList.remove("overview"),_b.wrapper.classList.add("overview-deactivating"),ec=setTimeout(function(){_b.wrapper.classList.remove("overview-deactivating")},1),m(document.querySelectorAll(Tb)).forEach(function(a){o(a,""),a.removeEventListener("click",Jb,!0)}),Q(Nb,Ob),gb(),u("overviewhidden",{indexh:Nb,indexv:Ob,currentSlide:Qb}))}function I(a){"boolean"==typeof a?a?G():H():J()?H():G()}function J(){return _b.wrapper.classList.contains("overview")}function K(a){return a=a?a:Qb,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function L(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function M(){var a=_b.wrapper.classList.contains("paused");hb(),_b.wrapper.classList.add("paused"),a===!1&&u("paused")}function N(){var a=_b.wrapper.classList.contains("paused");_b.wrapper.classList.remove("paused"),gb(),a&&u("resumed")}function O(){P()?N():M()}function P(){return _b.wrapper.classList.contains("paused")}function Q(a,b,c,d){Pb=Qb;var e=document.querySelectorAll(Ub);void 0===b&&(b=F(e[a])),Pb&&Pb.parentNode&&Pb.parentNode.classList.contains("stack")&&E(Pb.parentNode,Ob);var f=Zb.concat();Zb.length=0;var g=Nb||0,h=Ob||0;Nb=S(Ub,void 0===a?Nb:a),Ob=S(Vb,void 0===b?Ob:b),T(),C();a:for(var i=0,j=Zb.length;j>i;i++){for(var k=0;k<f.length;k++)if(f[k]===Zb[i]){f.splice(k,1);continue a}document.documentElement.classList.add(Zb[i]),u(Zb[i])}for(;f.length;)document.documentElement.classList.remove(f.pop());J()&&G();var l=e[Nb],n=l.querySelectorAll("section");if(Qb=n[Ob]||l,"undefined"!=typeof c){var o=B(Qb.querySelectorAll(".fragment"));m(o).forEach(function(a,b){c>b?a.classList.add("visible"):a.classList.remove("visible")})}var p=Nb!==g||Ob!==h;p?u("slidechanged",{indexh:Nb,indexv:Ob,previousSlide:Pb,currentSlide:Qb,origin:d}):Pb=null,Pb&&(Pb.classList.remove("present"),document.querySelector(Wb).classList.contains("present")&&setTimeout(function(){var a,b=m(document.querySelectorAll(Ub+".stack"));for(a in b)b[a]&&E(b[a],0)},0)),p&&(_(Pb),$(Qb)),V(),U(),W(),X(),cb(),gb()}function R(){k(),j(),C(),gc=Xb.autoSlide,gb(),h(),V(),U(),W()}function S(a,b){var c=m(document.querySelectorAll(a)),d=c.length;if(d){Xb.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=Xb.rtl&&!K(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");else if(e>b){f.classList.add(g?"past":"future");for(var h=m(f.querySelectorAll(".fragment.visible"));h.length;)h.pop().classList.remove("visible")}f.querySelector("section")&&f.classList.add("stack")}c[b].classList.add("present"),c[b].removeAttribute("hidden");var i=c[b].getAttribute("data-state");i&&(Zb=Zb.concat(i.split(" ")))}else b=0;return b}function T(){var a,b,c=m(document.querySelectorAll(Ub)),d=c.length;if(d){var e=J()?10:Xb.viewDistance;Rb&&(e=J()?6:1);for(var f=0;d>f;f++){var g=c[f],h=m(g.querySelectorAll("section")),i=h.length;if(a=Math.abs((Nb-f)%(d-e))||0,g.style.display=a>e?"none":"block",i)for(var j=F(g),k=0;i>k;k++){var l=h[k];b=f===Nb?Math.abs(Ob-k):Math.abs(k-j),l.style.display=a+b>e?"none":"block"}}}}function U(){if(Xb.progress&&_b.progress){var a=m(document.querySelectorAll(Ub)),b=document.querySelectorAll(Tb+":not(.stack)").length,c=0;a:for(var d=0;d<a.length;d++){for(var e=a[d],f=m(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++}_b.progressbar.style.width=c/(b-1)*window.innerWidth+"px"}}function V(){var a=Y(),b=Z();_b.controlsLeft.concat(_b.controlsRight).concat(_b.controlsUp).concat(_b.controlsDown).concat(_b.controlsPrev).concat(_b.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&_b.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&_b.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&_b.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&_b.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&_b.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&_b.controlsNext.forEach(function(a){a.classList.add("enabled")}),Qb&&(b.prev&&_b.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&_b.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),K(Qb)?(b.prev&&_b.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&_b.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&_b.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&_b.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function W(){m(_b.background.childNodes).forEach(function(a,b){var c=Xb.rtl?"future":"past",d=Xb.rtl?"past":"future";a.className="slide-background "+(Nb>b?c:b>Nb?d:"present"),m(a.childNodes).forEach(function(a,b){a.className="slide-background "+(Ob>b?"past":b>Ob?"future":"present")})}),setTimeout(function(){_b.background.classList.remove("no-transition")},1)}function X(){if(Xb.parallaxBackgroundImage){var a,b,c=document.querySelectorAll(Ub),d=document.querySelectorAll(Vb),e=_b.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=_b.background.offsetWidth,g=c.length,h=-(a-f)/(g-1)*Nb,i=_b.background.offsetHeight,j=d.length,k=j>0?-(b-i)/(j-1)*Ob:0;_b.background.style.backgroundPosition=h+"px "+k+"px"}}function Y(){var a=document.querySelectorAll(Ub),b=document.querySelectorAll(Vb),c={left:Nb>0||Xb.loop,right:Nb<a.length-1||Xb.loop,up:Ob>0,down:Ob<b.length-1};if(Xb.rtl){var d=c.left;c.left=c.right,c.right=d}return c}function Z(){if(Qb&&Xb.fragments){var a=Qb.querySelectorAll(".fragment"),b=Qb.querySelectorAll(".fragment:not(.visible)");return{prev:a.length-b.length>0,next:!!b.length}}return{prev:!1,next:!1}}function $(a){a&&!ab()&&(m(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),m(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:start","*")}),m(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function _(a){a&&(m(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),m(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:stop","*")}),m(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 ab(){return!!window.location.search.match(/receiver/gi)}function bb(){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);Q(e.h,e.v)}else Q(Nb||0,Ob||0)}else{var f=parseInt(b[0],10)||0,g=parseInt(b[1],10)||0;(f!==Nb||g!==Ob)&&Q(f,g)}}function cb(a){if(Xb.history)if(clearTimeout(cc),"number"==typeof a)cc=setTimeout(cb,a);else{var b="/";Qb&&"string"==typeof Qb.getAttribute("id")?b="/"+Qb.getAttribute("id"):((Nb>0||Ob>0)&&(b+=Nb),Ob>0&&(b+="/"+Ob)),window.location.hash=b}}function db(a){var b,c=Nb,d=Ob;if(a){var e=K(a),f=e?a.parentNode:a,g=m(document.querySelectorAll(Ub));c=Math.max(g.indexOf(f),0),e&&(d=Math.max(m(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&Qb){var h=Qb.querySelectorAll(".fragment").length>0;if(h){var i=Qb.querySelectorAll(".fragment.visible");b=i.length}}return{h:c,v:d,f:b}}function eb(){if(Qb&&Xb.fragments){var a=B(Qb.querySelectorAll(".fragment:not(.visible)"));if(a.length){var b=a[0].getAttribute("data-fragment-index");return a=Qb.querySelectorAll('.fragment[data-fragment-index="'+b+'"]'),m(a).forEach(function(a){a.classList.add("visible")}),u("fragmentshown",{fragment:a[0],fragments:a}),V(),!0}}return!1}function fb(){if(Qb&&Xb.fragments){var a=B(Qb.querySelectorAll(".fragment.visible"));if(a.length){var b=a[a.length-1].getAttribute("data-fragment-index");return a=Qb.querySelectorAll('.fragment[data-fragment-index="'+b+'"]'),m(a).forEach(function(a){a.classList.remove("visible")}),u("fragmenthidden",{fragment:a[0],fragments:a}),V(),!0}}return!1}function gb(){if(hb(),Qb){var a=Qb.getAttribute("data-autoslide");gc=a?parseInt(a,10):Xb.autoSlide,!gc||jc||P()||J()||Reveal.isLastSlide()&&Xb.loop!==!0||(hc=setTimeout(pb,gc),ic=Date.now()),Sb&&Sb.setPlaying(-1!==hc)}}function hb(){clearTimeout(hc),hc=-1}function ib(){jc=!0,clearTimeout(hc),Sb&&Sb.setPlaying(!1)}function jb(){jc=!1,gb()}function kb(){Xb.rtl?(J()||eb()===!1)&&Y().left&&Q(Nb+1):(J()||fb()===!1)&&Y().left&&Q(Nb-1)}function lb(){Xb.rtl?(J()||fb()===!1)&&Y().right&&Q(Nb-1):(J()||eb()===!1)&&Y().right&&Q(Nb+1)}function mb(){(J()||fb()===!1)&&Y().up&&Q(Nb,Ob-1)}function nb(){(J()||eb()===!1)&&Y().down&&Q(Nb,Ob+1)}function ob(){if(fb()===!1)if(Y().up)mb();else{var a=document.querySelector(Ub+".past:nth-child("+Nb+")");if(a){var b=a.querySelectorAll("section").length-1||void 0,c=Nb-1;Q(c,b)}}}function pb(){eb()===!1&&(Y().down?nb():lb()),gb()}function qb(){Xb.autoSlideStoppable&&ib()}function rb(a){qb(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(P()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var c=!1;if("object"==typeof Xb.keyboard)for(var d in Xb.keyboard)if(parseInt(d,10)===a.keyCode){var e=Xb.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:ob();break;case 78:case 34:pb();break;case 72:case 37:kb();break;case 76:case 39:lb();break;case 75:case 38:mb();break;case 74:case 40:nb();break;case 36:Q(0);break;case 35:Q(Number.MAX_VALUE);break;case 32:J()?H():a.shiftKey?ob():pb();break;case 13:J()?H():c=!1;break;case 66:case 190:case 191:O();break;case 70:L();break;default:c=!1}c?a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!ac.transforms3d||(_b.preview?A():I(),a.preventDefault()),gb()}}function sb(a){kc.startX=a.touches[0].clientX,kc.startY=a.touches[0].clientY,kc.startCount=a.touches.length,2===a.touches.length&&Xb.overview&&(kc.startSpan=n({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:kc.startX,y:kc.startY}))}function tb(a){if(kc.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{qb(a);var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===kc.startCount&&Xb.overview){var d=n({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:kc.startX,y:kc.startY});Math.abs(kc.startSpan-d)>kc.threshold&&(kc.captured=!0,d<kc.startSpan?G():H()),a.preventDefault()}else if(1===a.touches.length&&2!==kc.startCount){var e=b-kc.startX,f=c-kc.startY;e>kc.threshold&&Math.abs(e)>Math.abs(f)?(kc.captured=!0,kb()):e<-kc.threshold&&Math.abs(e)>Math.abs(f)?(kc.captured=!0,lb()):f>kc.threshold?(kc.captured=!0,mb()):f<-kc.threshold&&(kc.captured=!0,nb()),Xb.embedded?(kc.captured||K(Qb))&&a.preventDefault():a.preventDefault()}}}function ub(){kc.captured=!1}function vb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],sb(a))}function wb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],tb(a))}function xb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],ub(a))}function yb(a){if(Date.now()-bc>600){bc=Date.now();var b=a.detail||-a.wheelDelta;b>0?pb():ob()}}function zb(a){qb(a),a.preventDefault();var b=m(document.querySelectorAll(Ub)).length,c=Math.floor(a.clientX/_b.wrapper.offsetWidth*b);Q(c)}function Ab(a){a.preventDefault(),qb(),kb()}function Bb(a){a.preventDefault(),qb(),lb()}function Cb(a){a.preventDefault(),qb(),mb()}function Db(a){a.preventDefault(),qb(),nb()}function Eb(a){a.preventDefault(),qb(),ob()}function Fb(a){a.preventDefault(),qb(),pb()}function Gb(){bb()}function Hb(){C()}function Ib(){var a=document.webkitHidden||document.msHidden||document.hidden;a===!1&&document.activeElement!==document.body&&(document.activeElement.blur(),document.body.focus())}function Jb(a){if(fc&&J()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(H(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);Q(c,d)}}}function Kb(a){var b=a.target.getAttribute("href");b&&(z(b),a.preventDefault())}function Lb(){Reveal.isLastSlide()&&Xb.loop===!1?(Q(0,0),jb()):jc?jb():ib()}function Mb(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 Nb,Ob,Pb,Qb,Rb,Sb,Tb=".reveal .slides section",Ub=".reveal .slides>section",Vb=".reveal .slides>section.present>section",Wb=".reveal .slides>section:first-of-type",Xb={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,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:[]},Yb=!1,Zb=[],$b=1,_b={},ac={},bc=0,cc=0,dc=0,ec=0,fc=!1,gc=0,hc=0,ic=-1,jc=!1,kc={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return Mb.prototype.setPlaying=function(a){var b=this.playing;this.playing=a,!b&&this.playing?this.animate():this.render()},Mb.prototype.animate=function(){var a=this.progress;this.progress=this.progressCheck(),a>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&ac.requestAnimationFrameMethod.call(window,this.animate.bind(this))},Mb.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()},Mb.prototype.on=function(a,b){this.canvas.addEventListener(a,b,!1)},Mb.prototype.off=function(a,b){this.canvas.removeEventListener(a,b,!1)},Mb.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},{initialize:a,configure:i,sync:R,slide:Q,left:kb,right:lb,up:mb,down:nb,prev:ob,next:pb,prevFragment:fb,nextFragment:eb,navigateTo:Q,navigateLeft:kb,navigateRight:lb,navigateUp:mb,navigateDown:nb,navigatePrev:ob,navigateNext:pb,layout:C,availableRoutes:Y,availableFragments:Z,toggleOverview:I,togglePause:O,isOverview:J,isPaused:P,addEventListeners:j,removeEventListeners:k,getIndices:db,getSlide:function(a,b){var c=document.querySelectorAll(Ub)[a],d=c&&c.querySelectorAll("section");return"undefined"!=typeof b?d?d[b]:void 0:c},getPreviousSlide:function(){return Pb},getCurrentSlide:function(){return Qb},getScale:function(){return $b},getConfig:function(){return Xb},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];"null"===c?a[b]=null:"true"===c?a[b]=!0:"false"===c?a[b]=!1:isNaN(parseFloat(c))||(a[b]=parseFloat(c))}return a},isFirstSlide:function(){return null==document.querySelector(Tb+".past")?!0:!1},isLastSlide:function(){return Qb?Qb.nextElementSibling?!1:K(Qb)&&Qb.parentNode.nextElementSibling?!1:!0:!1},isReady:function(){return Yb},addEventListener:function(a,b,c){"addEventListener"in window&&(_b.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(_b.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}();
\ No newline at end of file +var Reveal=function(){"use strict";function a(a){if(b(),!mc.transforms2d&&!mc.transforms3d)return document.body.setAttribute("class","no-transforms"),void 0;window.addEventListener("load",C,!1);var d=Reveal.getQueryHash();"undefined"!=typeof d.dependencies&&delete d.dependencies,l(hc,a),l(hc,d),t(),c()}function b(){mc.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,mc.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,mc.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,mc.requestAnimationFrame="function"==typeof mc.requestAnimationFrameMethod,mc.canvas=!!document.createElement("canvas").getContext,bc=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=hc.dependencies.length;h>g;g++){var i=hc.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(),U(),i(),hb(),_(!0),setTimeout(function(){lc.slides.classList.remove("no-transition"),ic=!0,v("ready",{indexh:Yb,indexv:Zb,currentSlide:_b})},1)}function e(){lc.theme=document.querySelector("#theme"),lc.wrapper=document.querySelector(".reveal"),lc.slides=document.querySelector(".reveal .slides"),lc.slides.classList.add("no-transition"),lc.background=f(lc.wrapper,"div","backgrounds",null),lc.progress=f(lc.wrapper,"div","progress","<span></span>"),lc.progressbar=lc.progress.querySelector("span"),f(lc.wrapper,"aside","controls",'<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>'),lc.slideNumber=f(lc.wrapper,"div","slide-number",""),f(lc.wrapper,"div","state-background",null),f(lc.wrapper,"div","pause-overlay",null),lc.controls=document.querySelector(".reveal .controls"),lc.controlsLeft=m(document.querySelectorAll(".navigate-left")),lc.controlsRight=m(document.querySelectorAll(".navigate-right")),lc.controlsUp=m(document.querySelectorAll(".navigate-up")),lc.controlsDown=m(document.querySelectorAll(".navigate-down")),lc.controlsPrev=m(document.querySelectorAll(".navigate-prev")),lc.controlsNext=m(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(){s()&&document.body.classList.add("print-pdf"),lc.background.innerHTML="",lc.background.classList.add("no-transition"),m(document.querySelectorAll(ec)).forEach(function(a){var b;b=s()?h(a,a):h(a,lc.background),m(a.querySelectorAll("section")).forEach(function(a){s()?h(a,a):h(a,b)})}),hc.parallaxBackgroundImage?(lc.background.style.backgroundImage='url("'+hc.parallaxBackgroundImage+'")',lc.background.style.backgroundSize=hc.parallaxBackgroundSize,setTimeout(function(){lc.wrapper.classList.add("has-parallax-background")},1)):(lc.background.style.backgroundImage="",lc.wrapper.classList.remove("has-parallax-background"))}function h(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"),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");if(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||c.backgroundVideo)&&d.setAttribute("data-background-hash",c.background+c.backgroundSize+c.backgroundImage+c.backgroundVideo+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),c.backgroundVideo){var e=document.createElement("video");c.backgroundVideo.split(",").forEach(function(a){e.innerHTML+='<source src="'+a+'">'}),d.appendChild(e)}return b.appendChild(d),d}function i(a){var b=document.querySelectorAll(dc).length;if(lc.wrapper.classList.remove(hc.transition),"object"==typeof a&&l(hc,a),mc.transforms3d===!1&&(hc.transition="linear"),lc.wrapper.classList.add(hc.transition),lc.wrapper.setAttribute("data-transition-speed",hc.transitionSpeed),lc.wrapper.setAttribute("data-background-transition",hc.backgroundTransition),lc.controls.style.display=hc.controls?"block":"none",lc.progress.style.display=hc.progress?"block":"none",hc.rtl?lc.wrapper.classList.add("rtl"):lc.wrapper.classList.remove("rtl"),hc.center?lc.wrapper.classList.add("center"):lc.wrapper.classList.remove("center"),hc.mouseWheel?(document.addEventListener("DOMMouseScroll",Jb,!1),document.addEventListener("mousewheel",Jb,!1)):(document.removeEventListener("DOMMouseScroll",Jb,!1),document.removeEventListener("mousewheel",Jb,!1)),hc.rollingLinks?w():x(),hc.previewLinks?y():(z(),y("[data-preview-link]")),cc&&(cc.destroy(),cc=null),b>1&&hc.autoSlide&&hc.autoSlideStoppable&&mc.canvas&&mc.requestAnimationFrame&&(cc=new Xb(lc.wrapper,function(){return Math.min(Math.max((Date.now()-sc)/qc,0),1)}),cc.on("click",Wb),tc=!1),hc.fragments===!1&&m(lc.slides.querySelectorAll(".fragment")).forEach(function(a){a.classList.add("visible"),a.classList.remove("current-fragment")}),hc.theme&&lc.theme){var c=lc.theme.getAttribute("href"),d=/[^\/]*?(?=\.css)/,e=c.match(d)[0];hc.theme!==e&&(c=c.replace(d,hc.theme),lc.theme.setAttribute("href",c))}T()}function j(){if(pc=!0,window.addEventListener("hashchange",Rb,!1),window.addEventListener("resize",Sb,!1),hc.touch&&(lc.wrapper.addEventListener("touchstart",Db,!1),lc.wrapper.addEventListener("touchmove",Eb,!1),lc.wrapper.addEventListener("touchend",Fb,!1),window.navigator.pointerEnabled?(lc.wrapper.addEventListener("pointerdown",Gb,!1),lc.wrapper.addEventListener("pointermove",Hb,!1),lc.wrapper.addEventListener("pointerup",Ib,!1)):window.navigator.msPointerEnabled&&(lc.wrapper.addEventListener("MSPointerDown",Gb,!1),lc.wrapper.addEventListener("MSPointerMove",Hb,!1),lc.wrapper.addEventListener("MSPointerUp",Ib,!1))),hc.keyboard&&document.addEventListener("keydown",Cb,!1),hc.progress&&lc.progress&&lc.progress.addEventListener("click",Kb,!1),hc.focusBodyOnPageVisiblityChange){var a;"hidden"in document?a="visibilitychange":"msHidden"in document?a="msvisibilitychange":"webkitHidden"in document&&(a="webkitvisibilitychange"),a&&document.addEventListener(a,Tb,!1)}["touchstart","click"].forEach(function(a){lc.controlsLeft.forEach(function(b){b.addEventListener(a,Lb,!1)}),lc.controlsRight.forEach(function(b){b.addEventListener(a,Mb,!1)}),lc.controlsUp.forEach(function(b){b.addEventListener(a,Nb,!1)}),lc.controlsDown.forEach(function(b){b.addEventListener(a,Ob,!1)}),lc.controlsPrev.forEach(function(b){b.addEventListener(a,Pb,!1)}),lc.controlsNext.forEach(function(b){b.addEventListener(a,Qb,!1)})})}function k(){pc=!1,document.removeEventListener("keydown",Cb,!1),window.removeEventListener("hashchange",Rb,!1),window.removeEventListener("resize",Sb,!1),lc.wrapper.removeEventListener("touchstart",Db,!1),lc.wrapper.removeEventListener("touchmove",Eb,!1),lc.wrapper.removeEventListener("touchend",Fb,!1),window.navigator.pointerEnabled?(lc.wrapper.removeEventListener("pointerdown",Gb,!1),lc.wrapper.removeEventListener("pointermove",Hb,!1),lc.wrapper.removeEventListener("pointerup",Ib,!1)):window.navigator.msPointerEnabled&&(lc.wrapper.removeEventListener("MSPointerDown",Gb,!1),lc.wrapper.removeEventListener("MSPointerMove",Hb,!1),lc.wrapper.removeEventListener("MSPointerUp",Ib,!1)),hc.progress&&lc.progress&&lc.progress.removeEventListener("click",Kb,!1),["touchstart","click"].forEach(function(a){lc.controlsLeft.forEach(function(b){b.removeEventListener(a,Lb,!1)}),lc.controlsRight.forEach(function(b){b.removeEventListener(a,Mb,!1)}),lc.controlsUp.forEach(function(b){b.removeEventListener(a,Nb,!1)}),lc.controlsDown.forEach(function(b){b.removeEventListener(a,Ob,!1)}),lc.controlsPrev.forEach(function(b){b.removeEventListener(a,Pb,!1)}),lc.controlsNext.forEach(function(b){b.removeEventListener(a,Qb,!1)})})}function l(a,b){for(var c in b)a[c]=b[c]}function m(a){return Array.prototype.slice.call(a)}function n(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 o(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function p(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function q(a){var b=0;if(a){var c=0;m(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 r(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 s(){return/print-pdf/gi.test(window.location.search)}function t(){hc.hideAddressBar&&bc&&(window.addEventListener("load",u,!1),window.addEventListener("orientationchange",u,!1))}function u(){setTimeout(function(){window.scrollTo(0,1)},10)}function v(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),l(c,b),lc.wrapper.dispatchEvent(c)}function w(){if(mc.transforms3d&&!("msPerspective"in document.body.style))for(var a=document.querySelectorAll(dc+" 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 x(){for(var a=document.querySelectorAll(dc+" 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 y(a){var b=m(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",Vb,!1)})}function z(){var a=m(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",Vb,!1)})}function A(a){B(),lc.preview=document.createElement("div"),lc.preview.classList.add("preview-link-overlay"),lc.wrapper.appendChild(lc.preview),lc.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(""),lc.preview.querySelector("iframe").addEventListener("load",function(){lc.preview.classList.add("loaded")},!1),lc.preview.querySelector(".close").addEventListener("click",function(a){B(),a.preventDefault()},!1),lc.preview.querySelector(".external").addEventListener("click",function(){B()},!1),setTimeout(function(){lc.preview.classList.add("visible")},1)}function B(){lc.preview&&(lc.preview.setAttribute("src",""),lc.preview.parentNode.removeChild(lc.preview),lc.preview=null)}function C(){if(lc.wrapper&&!s()){var a=lc.wrapper.offsetWidth,b=lc.wrapper.offsetHeight;a-=b*hc.margin,b-=b*hc.margin;var c=hc.width,d=hc.height,e=20;D(hc.width,hc.height,e),"string"==typeof c&&/%$/.test(c)&&(c=parseInt(c,10)/100*a),"string"==typeof d&&/%$/.test(d)&&(d=parseInt(d,10)/100*b),lc.slides.style.width=c+"px",lc.slides.style.height=d+"px",kc=Math.min(a/c,b/d),kc=Math.max(kc,hc.minScale),kc=Math.min(kc,hc.maxScale),/webkit/i.test(navigator.userAgent)&&"undefined"!=typeof lc.slides.style.zoom?lc.slides.style.zoom=kc:(lc.slides.style.left="50%",lc.slides.style.top="50%",lc.slides.style.bottom="auto",lc.slides.style.right="auto",p(lc.slides,"translate(-50%, -50%) scale("+kc+")"));for(var f=m(document.querySelectorAll(dc)),g=0,h=f.length;h>g;g++){var i=f[g];"none"!==i.style.display&&(i.style.top=hc.center||i.classList.contains("center")?i.classList.contains("stack")?0:Math.max((d-q(i))/2-e,0)+"px":"")}Y(),ab()}}function D(a,b){m(lc.slides.querySelectorAll("section > .stretch")).forEach(function(c){var d=r(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 E(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function F(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 G(){if(hc.overview){sb();var a=lc.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;lc.wrapper.classList.add("overview"),lc.wrapper.classList.remove("overview-deactivating");for(var c=document.querySelectorAll(ec),d=0,e=c.length;e>d;d++){var f=c[d],g=hc.rtl?-105:105;if(f.setAttribute("data-index-h",d),p(f,"translateZ(-"+b+"px) translate("+(d-Yb)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===Yb?Zb:F(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),p(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",Ub,!0)}else f.addEventListener("click",Ub,!0)}X(),C(),a||v("overviewshown",{indexh:Yb,indexv:Zb,currentSlide:_b})}}function H(){hc.overview&&(lc.wrapper.classList.remove("overview"),lc.wrapper.classList.add("overview-deactivating"),setTimeout(function(){lc.wrapper.classList.remove("overview-deactivating")},1),m(document.querySelectorAll(dc)).forEach(function(a){p(a,""),a.removeEventListener("click",Ub,!0)}),S(Yb,Zb),rb(),v("overviewhidden",{indexh:Yb,indexv:Zb,currentSlide:_b}))}function I(a){"boolean"==typeof a?a?G():H():J()?H():G()}function J(){return lc.wrapper.classList.contains("overview")}function K(a){return a=a?a:_b,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function L(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullscreen;b&&b.apply(a)}function M(){var a=lc.wrapper.classList.contains("paused");sb(),lc.wrapper.classList.add("paused"),a===!1&&v("paused")}function N(){var a=lc.wrapper.classList.contains("paused");lc.wrapper.classList.remove("paused"),rb(),a&&v("resumed")}function O(a){"boolean"==typeof a?a?M():N():P()?N():M()}function P(){return lc.wrapper.classList.contains("paused")}function Q(a){"boolean"==typeof a?a?ub():tb():tc?ub():tb()}function R(){return!(!qc||tc)}function S(a,b,c,d){$b=_b;var e=document.querySelectorAll(ec);void 0===b&&(b=F(e[a])),$b&&$b.parentNode&&$b.parentNode.classList.contains("stack")&&E($b.parentNode,Zb);var f=jc.concat();jc.length=0;var g=Yb||0,h=Zb||0;Yb=W(ec,void 0===a?Yb:a),Zb=W(fc,void 0===b?Zb:b),X(),C();a:for(var i=0,j=jc.length;j>i;i++){for(var k=0;k<f.length;k++)if(f[k]===jc[i]){f.splice(k,1);continue a}document.documentElement.classList.add(jc[i]),v(jc[i])}for(;f.length;)document.documentElement.classList.remove(f.pop());J()&&G();var l=e[Yb],n=l.querySelectorAll("section");_b=n[Zb]||l,"undefined"!=typeof c&&ob(c);var o=Yb!==g||Zb!==h;o?v("slidechanged",{indexh:Yb,indexv:Zb,previousSlide:$b,currentSlide:_b,origin:d}):$b=null,$b&&($b.classList.remove("present"),document.querySelector(gc).classList.contains("present")&&setTimeout(function(){var a,b=m(document.querySelectorAll(ec+".stack"));for(a in b)b[a]&&E(b[a],0)},0)),o&&(eb($b),db(_b)),$(),Y(),_(),ab(),Z(),ib(),rb()}function T(){k(),j(),C(),qc=hc.autoSlide,rb(),g(),V(),$(),Y(),_(!0),Z()}function U(){var a=m(document.querySelectorAll(ec));a.forEach(function(a){var b=m(a.querySelectorAll("section"));b.forEach(function(a,b){b>0&&(a.classList.remove("present"),a.classList.remove("past"),a.classList.add("future"))})})}function V(){var a=m(document.querySelectorAll(ec));a.forEach(function(a){var b=m(a.querySelectorAll("section"));b.forEach(function(a){nb(a.querySelectorAll(".fragment"))}),0===b.length&&nb(a.querySelectorAll(".fragment"))})}function W(a,b){var c=m(document.querySelectorAll(a)),d=c.length;if(d){hc.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=hc.rtl&&!K(f);if(f.classList.remove("past"),f.classList.remove("present"),f.classList.remove("future"),f.setAttribute("hidden",""),b>e){if(f.classList.add(g?"future":"past"),hc.fragments)for(var h=m(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"),hc.fragments))for(var j=m(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 l=c[b].getAttribute("data-state");l&&(jc=jc.concat(l.split(" ")))}else b=0;return b}function X(){var a,b,c=m(document.querySelectorAll(ec)),d=c.length;if(d){var e=J()?10:hc.viewDistance;bc&&(e=J()?6:1);for(var f=0;d>f;f++){var g=c[f],h=m(g.querySelectorAll("section")),i=h.length;if(a=Math.abs((Yb-f)%(d-e))||0,g.style.display=a>e?"none":"block",i)for(var j=F(g),k=0;i>k;k++){var l=h[k];b=f===Yb?Math.abs(Zb-k):Math.abs(k-j),l.style.display=a+b>e?"none":"block"}}}}function Y(){hc.progress&&lc.progress&&(lc.progressbar.style.width=fb()*window.innerWidth+"px")}function Z(){if(hc.slideNumber&&lc.slideNumber){var a=Yb;Zb>0&&(a+=" - "+Zb),lc.slideNumber.innerHTML=a}}function $(){var a=bb(),b=cb();lc.controlsLeft.concat(lc.controlsRight).concat(lc.controlsUp).concat(lc.controlsDown).concat(lc.controlsPrev).concat(lc.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&lc.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&lc.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&lc.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&lc.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&lc.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&lc.controlsNext.forEach(function(a){a.classList.add("enabled")}),_b&&(b.prev&&lc.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&lc.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),K(_b)?(b.prev&&lc.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&lc.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&lc.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&lc.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function _(a){var b=null,c=hc.rtl?"future":"past",d=hc.rtl?"past":"future";if(m(lc.background.childNodes).forEach(function(e,f){Yb>f?e.className="slide-background "+c:f>Yb?e.className="slide-background "+d:(e.className="slide-background present",b=e),(a||f===Yb)&&m(e.querySelectorAll("section")).forEach(function(a,c){Zb>c?a.className="slide-background past":c>Zb?a.className="slide-background future":(a.className="slide-background present",f===Yb&&(b=a))})}),ac){var e=ac.querySelector("video");e&&e.pause()}if(b){var f=b.querySelector("video");f&&f.play();var g=ac?ac.getAttribute("data-background-hash"):null,h=b.getAttribute("data-background-hash");h&&h===g&&b!==ac&&lc.background.classList.add("no-transition"),ac=b}setTimeout(function(){lc.background.classList.remove("no-transition")},1)}function ab(){if(hc.parallaxBackgroundImage){var a,b,c=document.querySelectorAll(ec),d=document.querySelectorAll(fc),e=lc.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=lc.background.offsetWidth,g=c.length,h=-(a-f)/(g-1)*Yb,i=lc.background.offsetHeight,j=d.length,k=j>1?-(b-i)/(j-1)*Zb:0;lc.background.style.backgroundPosition=h+"px "+k+"px"}}function bb(){var a=document.querySelectorAll(ec),b=document.querySelectorAll(fc),c={left:Yb>0||hc.loop,right:Yb<a.length-1||hc.loop,up:Zb>0,down:Zb<b.length-1};if(hc.rtl){var d=c.left;c.left=c.right,c.right=d}return c}function cb(){if(_b&&hc.fragments){var a=_b.querySelectorAll(".fragment"),b=_b.querySelectorAll(".fragment:not(.visible)");return{prev:a.length-b.length>0,next:!!b.length}}return{prev:!1,next:!1}}function db(a){a&&!gb()&&(m(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),m(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:start","*")}),m(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function eb(a){a&&(m(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),m(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:stop","*")}),m(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 fb(){var a=m(document.querySelectorAll(ec)),b=document.querySelectorAll(dc+":not(.stack)").length,c=0;a:for(var d=0;d<a.length;d++){for(var e=a[d],f=m(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(_b){var h=_b.querySelectorAll(".fragment");if(h.length>0){var i=_b.querySelectorAll(".fragment.visible"),j=.9;c+=i.length/h.length*j}}return c/(b-1)}function gb(){return!!window.location.search.match(/receiver/gi)}function hb(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d;try{d=document.querySelector("#"+c)}catch(e){}if(d){var f=Reveal.getIndices(d);S(f.h,f.v)}else S(Yb||0,Zb||0)}else{var g=parseInt(b[0],10)||0,h=parseInt(b[1],10)||0;(g!==Yb||h!==Zb)&&S(g,h)}}function ib(a){if(hc.history)if(clearTimeout(oc),"number"==typeof a)oc=setTimeout(ib,a);else{var b="/",c=_b.getAttribute("id");c&&(c=c.toLowerCase(),c=c.replace(/[^a-zA-Z0-9\-\_\:\.]/g,"")),_b&&"string"==typeof c&&c.length?b="/"+c:((Yb>0||Zb>0)&&(b+=Yb),Zb>0&&(b+="/"+Zb)),window.location.hash=b}}function jb(a){var b,c=Yb,d=Zb;if(a){var e=K(a),f=e?a.parentNode:a,g=m(document.querySelectorAll(ec));c=Math.max(g.indexOf(f),0),e&&(d=Math.max(m(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&_b){var h=_b.querySelectorAll(".fragment").length>0;if(h){var i=_b.querySelectorAll(".fragment.visible");b=i.length-1}}return{h:c,v:d,f:b}}function kb(){return document.querySelectorAll(dc+":not(.stack)").length}function lb(){var a=jb();return{indexh:a.h,indexv:a.v,indexf:a.f,paused:P(),overview:J()}}function mb(a){"object"==typeof a&&(S(n(a.indexh),n(a.indexv),n(a.indexf)),O(n(a.paused)),I(n(a.overview)))}function nb(a){a=m(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 ob(a,b){if(_b&&hc.fragments){var c=nb(_b.querySelectorAll(".fragment"));if(c.length){if("number"!=typeof a){var d=nb(_b.querySelectorAll(".fragment.visible")).pop();a=d?parseInt(d.getAttribute("data-fragment-index")||0,10):-1}"number"==typeof b&&(a+=b);var e=[],f=[];return m(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&&v("fragmenthidden",{fragment:f[0],fragments:f}),e.length&&v("fragmentshown",{fragment:e[0],fragments:e}),$(),Y(),!(!e.length&&!f.length)}}return!1}function pb(){return ob(null,1)}function qb(){return ob(null,-1)}function rb(){if(sb(),_b){var a=_b.querySelector(".current-fragment"),b=a?a.getAttribute("data-autoslide"):null,c=_b.parentNode?_b.parentNode.getAttribute("data-autoslide"):null,d=_b.getAttribute("data-autoslide");qc=b?parseInt(b,10):d?parseInt(d,10):c?parseInt(c,10):hc.autoSlide,m(_b.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&qc&&1e3*a.duration>qc&&(qc=1e3*a.duration+1e3)}),!qc||tc||P()||J()||Reveal.isLastSlide()&&hc.loop!==!0||(rc=setTimeout(Ab,qc),sc=Date.now()),cc&&cc.setPlaying(-1!==rc)}}function sb(){clearTimeout(rc),rc=-1}function tb(){tc=!0,v("autoslidepaused"),clearTimeout(rc),cc&&cc.setPlaying(!1)}function ub(){tc=!1,v("autoslideresumed"),rb()}function vb(){hc.rtl?(J()||pb()===!1)&&bb().left&&S(Yb+1):(J()||qb()===!1)&&bb().left&&S(Yb-1)}function wb(){hc.rtl?(J()||qb()===!1)&&bb().right&&S(Yb-1):(J()||pb()===!1)&&bb().right&&S(Yb+1)}function xb(){(J()||qb()===!1)&&bb().up&&S(Yb,Zb-1)}function yb(){(J()||pb()===!1)&&bb().down&&S(Yb,Zb+1)}function zb(){if(qb()===!1)if(bb().up)xb();else{var a=document.querySelector(ec+".past:nth-child("+Yb+")");if(a){var b=a.querySelectorAll("section").length-1||void 0,c=Yb-1;S(c,b)}}}function Ab(){pb()===!1&&(bb().down?yb():wb()),rb()}function Bb(){hc.autoSlideStoppable&&tb()}function Cb(a){var b=tc;Bb(a),document.activeElement;var c=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(c||a.shiftKey&&32!==a.keyCode||a.altKey||a.ctrlKey||a.metaKey)){if(P()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var d=!1;if("object"==typeof hc.keyboard)for(var e in hc.keyboard)if(parseInt(e,10)===a.keyCode){var f=hc.keyboard[e];"function"==typeof f?f.apply(null,[a]):"string"==typeof f&&"function"==typeof Reveal[f]&&Reveal[f].call(),d=!0}if(d===!1)switch(d=!0,a.keyCode){case 80:case 33:zb();break;case 78:case 34:Ab();break;case 72:case 37:vb();break;case 76:case 39:wb();break;case 75:case 38:xb();break;case 74:case 40:yb();break;case 36:S(0);break;case 35:S(Number.MAX_VALUE);break;case 32:J()?H():a.shiftKey?zb():Ab();break;case 13:J()?H():d=!1;break;case 58:case 59:case 66:case 190:case 191:O();break;case 70:L();break;case 65:hc.autoSlideStoppable&&Q(b);break;default:d=!1}d?a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!mc.transforms3d||(lc.preview?B():I(),a.preventDefault()),rb()}}function Db(a){uc.startX=a.touches[0].clientX,uc.startY=a.touches[0].clientY,uc.startCount=a.touches.length,2===a.touches.length&&hc.overview&&(uc.startSpan=o({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:uc.startX,y:uc.startY}))}function Eb(a){if(uc.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{Bb(a);var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===uc.startCount&&hc.overview){var d=o({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:uc.startX,y:uc.startY});Math.abs(uc.startSpan-d)>uc.threshold&&(uc.captured=!0,d<uc.startSpan?G():H()),a.preventDefault()}else if(1===a.touches.length&&2!==uc.startCount){var e=b-uc.startX,f=c-uc.startY;e>uc.threshold&&Math.abs(e)>Math.abs(f)?(uc.captured=!0,vb()):e<-uc.threshold&&Math.abs(e)>Math.abs(f)?(uc.captured=!0,wb()):f>uc.threshold?(uc.captured=!0,xb()):f<-uc.threshold&&(uc.captured=!0,yb()),hc.embedded?(uc.captured||K(_b))&&a.preventDefault():a.preventDefault()}}}function Fb(){uc.captured=!1}function Gb(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],Db(a))}function Hb(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],Eb(a))}function Ib(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],Fb(a))}function Jb(a){if(Date.now()-nc>600){nc=Date.now();var b=a.detail||-a.wheelDelta;b>0?Ab():zb()}}function Kb(a){Bb(a),a.preventDefault();var b=m(document.querySelectorAll(ec)).length,c=Math.floor(a.clientX/lc.wrapper.offsetWidth*b);S(c)}function Lb(a){a.preventDefault(),Bb(),vb()}function Mb(a){a.preventDefault(),Bb(),wb()}function Nb(a){a.preventDefault(),Bb(),xb()}function Ob(a){a.preventDefault(),Bb(),yb()}function Pb(a){a.preventDefault(),Bb(),zb()}function Qb(a){a.preventDefault(),Bb(),Ab()}function Rb(){hb()}function Sb(){C()}function Tb(){var a=document.webkitHidden||document.msHidden||document.hidden;a===!1&&document.activeElement!==document.body&&(document.activeElement.blur(),document.body.focus())}function Ub(a){if(pc&&J()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(H(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);S(c,d)}}}function Vb(a){var b=a.target.getAttribute("href");b&&(A(b),a.preventDefault())}function Wb(){Reveal.isLastSlide()&&hc.loop===!1?(S(0,0),ub()):tc?ub():tb()}function Xb(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 Yb,Zb,$b,_b,ac,bc,cc,dc=".reveal .slides section",ec=".reveal .slides>section",fc=".reveal .slides>section.present>section",gc=".reveal .slides>section:first-of-type",hc={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:[]},ic=!1,jc=[],kc=1,lc={},mc={},nc=0,oc=0,pc=!1,qc=0,rc=0,sc=-1,tc=!1,uc={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return Xb.prototype.setPlaying=function(a){var b=this.playing;this.playing=a,!b&&this.playing?this.animate():this.render()},Xb.prototype.animate=function(){var a=this.progress;this.progress=this.progressCheck(),a>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&mc.requestAnimationFrameMethod.call(window,this.animate.bind(this)) +},Xb.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()},Xb.prototype.on=function(a,b){this.canvas.addEventListener(a,b,!1)},Xb.prototype.off=function(a,b){this.canvas.removeEventListener(a,b,!1)},Xb.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},{initialize:a,configure:i,sync:T,slide:S,left:vb,right:wb,up:xb,down:yb,prev:zb,next:Ab,navigateFragment:ob,prevFragment:qb,nextFragment:pb,navigateTo:S,navigateLeft:vb,navigateRight:wb,navigateUp:xb,navigateDown:yb,navigatePrev:zb,navigateNext:Ab,layout:C,availableRoutes:bb,availableFragments:cb,toggleOverview:I,togglePause:O,toggleAutoSlide:Q,isOverview:J,isPaused:P,isAutoSliding:R,addEventListeners:j,removeEventListeners:k,getState:lb,setState:mb,getProgress:fb,getIndices:jb,getTotalSlides:kb,getSlide:function(a,b){var c=document.querySelectorAll(ec)[a],d=c&&c.querySelectorAll("section");return"undefined"!=typeof b?d?d[b]:void 0:c},getPreviousSlide:function(){return $b},getCurrentSlide:function(){return _b},getScale:function(){return kc},getConfig:function(){return hc},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]=n(unescape(c))}return a},isFirstSlide:function(){return null==document.querySelector(dc+".past")?!0:!1},isLastSlide:function(){return _b?_b.nextElementSibling?!1:K(_b)&&_b.parentNode.nextElementSibling?!1:!0:!1},isReady:function(){return ic},addEventListener:function(a,b,c){"addEventListener"in window&&(lc.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(lc.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}();
\ No newline at end of file |