).';\n\n\t\t// Cache references to key DOM elements\n\t\tdom.wrapper = revealElement;\n\t\tdom.slides = revealElement.querySelector( '.slides' );\n\n\t\tif( !dom.slides ) throw 'Unable to find slides container (
).';\n\n\t\t// Compose our config object in order of increasing precedence:\n\t\t// 1. Default reveal.js options\n\t\t// 2. Options provided via Reveal.configure() prior to\n\t\t// initialization\n\t\t// 3. Options passed to the Reveal constructor\n\t\t// 4. Options passed to Reveal.initialize\n\t\t// 5. Query params\n\t\tconfig = { ...defaultConfig, ...config, ...options, ...initOptions, ...Util.getQueryHash() };\n\n\t\tsetViewport();\n\n\t\t// Force a layout when the whole page, incl fonts, has loaded\n\t\twindow.addEventListener( 'load', layout, false );\n\n\t\t// Register plugins and load dependencies, then move on to #start()\n\t\tplugins.load( config.plugins, config.dependencies ).then( start );\n\n\t\treturn new Promise( resolve => Reveal.on( 'ready', resolve ) );\n\n\t}\n\n\t/**\n\t * Encase the presentation in a reveal.js viewport. The\n\t * extent of the viewport differs based on configuration.\n\t */\n\tfunction setViewport() {\n\n\t\t// Embedded decks use the reveal element as their viewport\n\t\tif( config.embedded === true ) {\n\t\t\tdom.viewport = Util.closest( revealElement, '.reveal-viewport' ) || revealElement;\n\t\t}\n\t\t// Full-page decks use the body as their viewport\n\t\telse {\n\t\t\tdom.viewport = document.body;\n\t\t\tdocument.documentElement.classList.add( 'reveal-full-page' );\n\t\t}\n\n\t\tdom.viewport.classList.add( 'reveal-viewport' );\n\n\t}\n\n\t/**\n\t * Starts up reveal.js by binding input events and navigating\n\t * to the current URL deeplink if there is one.\n\t */\n\tfunction start() {\n\n\t\tready = true;\n\n\t\t// Remove slides hidden with data-visibility\n\t\tremoveHiddenSlides();\n\n\t\t// Make sure we've got all the DOM elements we need\n\t\tsetupDOM();\n\n\t\t// Listen to messages posted to this window\n\t\tsetupPostMessage();\n\n\t\t// Prevent the slides from being scrolled out of view\n\t\tsetupScrollPrevention();\n\n\t\t// Adds bindings for fullscreen mode\n\t\tsetupFullscreen();\n\n\t\t// Resets all vertical slides so that only the first is visible\n\t\tresetVerticalSlides();\n\n\t\t// Updates the presentation to match the current configuration values\n\t\tconfigure();\n\n\t\t// Read the initial hash\n\t\tlocation.readURL();\n\n\t\t// Create slide backgrounds\n\t\tbackgrounds.update( true );\n\n\t\t// Notify listeners that the presentation is ready but use a 1ms\n\t\t// timeout to ensure it's not fired synchronously after #initialize()\n\t\tsetTimeout( () => {\n\t\t\t// Enable transitions now that we're loaded\n\t\t\tdom.slides.classList.remove( 'no-transition' );\n\n\t\t\tdom.wrapper.classList.add( 'ready' );\n\n\t\t\tdispatchEvent({\n\t\t\t\ttype: 'ready',\n\t\t\t\tdata: {\n\t\t\t\t\tindexh,\n\t\t\t\t\tindexv,\n\t\t\t\t\tcurrentSlide\n\t\t\t\t}\n\t\t\t});\n\t\t}, 1 );\n\n\t\t// Special setup and config is required when printing to PDF\n\t\tif( print.isPrintingPDF() ) {\n\t\t\tremoveEventListeners();\n\n\t\t\t// The document needs to have loaded for the PDF layout\n\t\t\t// measurements to be accurate\n\t\t\tif( document.readyState === 'complete' ) {\n\t\t\t\tprint.setupPDF();\n\t\t\t}\n\t\t\telse {\n\t\t\t\twindow.addEventListener( 'load', () => {\n\t\t\t\t\tprint.setupPDF();\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes all slides with data-visibility=\"hidden\". This\n\t * is done right before the rest of the presentation is\n\t * initialized.\n\t *\n\t * If you want to show all hidden slides, initialize\n\t * reveal.js with showHiddenSlides set to true.\n\t */\n\tfunction removeHiddenSlides() {\n\n\t\tif( !config.showHiddenSlides ) {\n\t\t\tUtil.queryAll( dom.wrapper, 'section[data-visibility=\"hidden\"]' ).forEach( slide => {\n\t\t\t\tslide.parentNode.removeChild( slide );\n\t\t\t} );\n\t\t}\n\n\t}\n\n\t/**\n\t * Finds and stores references to DOM elements which are\n\t * required by the presentation. If a required element is\n\t * not found, it is created.\n\t */\n\tfunction setupDOM() {\n\n\t\t// Prevent transitions while we're loading\n\t\tdom.slides.classList.add( 'no-transition' );\n\n\t\tif( Device.isMobile ) {\n\t\t\tdom.wrapper.classList.add( 'no-hover' );\n\t\t}\n\t\telse {\n\t\t\tdom.wrapper.classList.remove( 'no-hover' );\n\t\t}\n\n\t\tbackgrounds.render();\n\t\tslideNumber.render();\n\t\tcontrols.render();\n\t\tprogress.render();\n\t\tnotes.render();\n\n\t\t// Overlay graphic which is displayed during the paused mode\n\t\tdom.pauseOverlay = Util.createSingletonNode( dom.wrapper, 'div', 'pause-overlay', config.controls ? '
Resume presentation ' : null );\n\n\t\tdom.statusElement = createStatusElement();\n\n\t\tdom.wrapper.setAttribute( 'role', 'application' );\n\t}\n\n\t/**\n\t * Creates a hidden div with role aria-live to announce the\n\t * current slide content. Hide the div off-screen to make it\n\t * available only to Assistive Technologies.\n\t *\n\t * @return {HTMLElement}\n\t */\n\tfunction createStatusElement() {\n\n\t\tlet statusElement = dom.wrapper.querySelector( '.aria-status' );\n\t\tif( !statusElement ) {\n\t\t\tstatusElement = document.createElement( 'div' );\n\t\t\tstatusElement.style.position = 'absolute';\n\t\t\tstatusElement.style.height = '1px';\n\t\t\tstatusElement.style.width = '1px';\n\t\t\tstatusElement.style.overflow = 'hidden';\n\t\t\tstatusElement.style.clip = 'rect( 1px, 1px, 1px, 1px )';\n\t\t\tstatusElement.classList.add( 'aria-status' );\n\t\t\tstatusElement.setAttribute( 'aria-live', 'polite' );\n\t\t\tstatusElement.setAttribute( 'aria-atomic','true' );\n\t\t\tdom.wrapper.appendChild( statusElement );\n\t\t}\n\t\treturn statusElement;\n\n\t}\n\n\t/**\n\t * Announces the given text to screen readers.\n\t */\n\tfunction announceStatus( value ) {\n\n\t\tdom.statusElement.textContent = value;\n\n\t}\n\n\t/**\n\t * Converts the given HTML element into a string of text\n\t * that can be announced to a screen reader. Hidden\n\t * elements are excluded.\n\t */\n\tfunction getStatusText( node ) {\n\n\t\tlet text = '';\n\n\t\t// Text node\n\t\tif( node.nodeType === 3 ) {\n\t\t\ttext += node.textContent;\n\t\t}\n\t\t// Element node\n\t\telse if( node.nodeType === 1 ) {\n\n\t\t\tlet isAriaHidden = node.getAttribute( 'aria-hidden' );\n\t\t\tlet isDisplayHidden = window.getComputedStyle( node )['display'] === 'none';\n\t\t\tif( isAriaHidden !== 'true' && !isDisplayHidden ) {\n\n\t\t\t\tArray.from( node.childNodes ).forEach( child => {\n\t\t\t\t\ttext += getStatusText( child );\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t\ttext = text.trim();\n\n\t\treturn text === '' ? '' : text + ' ';\n\n\t}\n\n\t/**\n\t * This is an unfortunate necessity. Some actions – such as\n\t * an input field being focused in an iframe or using the\n\t * keyboard to expand text selection beyond the bounds of\n\t * a slide – can trigger our content to be pushed out of view.\n\t * This scrolling can not be prevented by hiding overflow in\n\t * CSS (we already do) so we have to resort to repeatedly\n\t * checking if the slides have been offset :(\n\t */\n\tfunction setupScrollPrevention() {\n\n\t\tsetInterval( () => {\n\t\t\tif( dom.wrapper.scrollTop !== 0 || dom.wrapper.scrollLeft !== 0 ) {\n\t\t\t\tdom.wrapper.scrollTop = 0;\n\t\t\t\tdom.wrapper.scrollLeft = 0;\n\t\t\t}\n\t\t}, 1000 );\n\n\t}\n\n\t/**\n\t * After entering fullscreen we need to force a layout to\n\t * get our presentations to scale correctly. This behavior\n\t * is inconsistent across browsers but a force layout seems\n\t * to normalize it.\n\t */\n\tfunction setupFullscreen() {\n\n\t\tdocument.addEventListener( 'fullscreenchange', onFullscreenChange );\n\t\tdocument.addEventListener( 'webkitfullscreenchange', onFullscreenChange );\n\n\t}\n\n\t/**\n\t * Registers a listener to postMessage events, this makes it\n\t * possible to call all reveal.js API methods from another\n\t * window. For example:\n\t *\n\t * revealWindow.postMessage( JSON.stringify({\n\t * method: 'slide',\n\t * args: [ 2 ]\n\t * }), '*' );\n\t */\n\tfunction setupPostMessage() {\n\n\t\tif( config.postMessage ) {\n\t\t\twindow.addEventListener( 'message', onPostMessage, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the configuration settings from the config\n\t * object. May be called multiple times.\n\t *\n\t * @param {object} options\n\t */\n\tfunction configure( options ) {\n\n\t\tconst oldConfig = { ...config }\n\n\t\t// New config options may be passed when this method\n\t\t// is invoked through the API after initialization\n\t\tif( typeof options === 'object' ) Util.extend( config, options );\n\n\t\t// Abort if reveal.js hasn't finished loading, config\n\t\t// changes will be applied automatically once ready\n\t\tif( Reveal.isReady() === false ) return;\n\n\t\tconst numberOfSlides = dom.wrapper.querySelectorAll( SLIDES_SELECTOR ).length;\n\n\t\t// The transition is added as a class on the .reveal element\n\t\tdom.wrapper.classList.remove( oldConfig.transition );\n\t\tdom.wrapper.classList.add( config.transition );\n\n\t\tdom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );\n\t\tdom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition );\n\n\t\t// Expose our configured slide dimensions as custom props\n\t\tdom.viewport.style.setProperty( '--slide-width', config.width + 'px' );\n\t\tdom.viewport.style.setProperty( '--slide-height', config.height + 'px' );\n\n\t\tif( config.shuffle ) {\n\t\t\tshuffle();\n\t\t}\n\n\t\tUtil.toggleClass( dom.wrapper, 'embedded', config.embedded );\n\t\tUtil.toggleClass( dom.wrapper, 'rtl', config.rtl );\n\t\tUtil.toggleClass( dom.wrapper, 'center', config.center );\n\n\t\t// Exit the paused mode if it was configured off\n\t\tif( config.pause === false ) {\n\t\t\tresume();\n\t\t}\n\n\t\t// Iframe link previews\n\t\tif( config.previewLinks ) {\n\t\t\tenablePreviewLinks();\n\t\t\tdisablePreviewLinks( '[data-preview-link=false]' );\n\t\t}\n\t\telse {\n\t\t\tdisablePreviewLinks();\n\t\t\tenablePreviewLinks( '[data-preview-link]:not([data-preview-link=false])' );\n\t\t}\n\n\t\t// Reset all changes made by auto-animations\n\t\tautoAnimate.reset();\n\n\t\t// Remove existing auto-slide controls\n\t\tif( autoSlidePlayer ) {\n\t\t\tautoSlidePlayer.destroy();\n\t\t\tautoSlidePlayer = null;\n\t\t}\n\n\t\t// Generate auto-slide controls if needed\n\t\tif( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable ) {\n\t\t\tautoSlidePlayer = new Playback( dom.wrapper, () => {\n\t\t\t\treturn Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 );\n\t\t\t} );\n\n\t\t\tautoSlidePlayer.on( 'click', onAutoSlidePlayerClick );\n\t\t\tautoSlidePaused = false;\n\t\t}\n\n\t\t// Add the navigation mode to the DOM so we can adjust styling\n\t\tif( config.navigationMode !== 'default' ) {\n\t\t\tdom.wrapper.setAttribute( 'data-navigation-mode', config.navigationMode );\n\t\t}\n\t\telse {\n\t\t\tdom.wrapper.removeAttribute( 'data-navigation-mode' );\n\t\t}\n\n\t\tnotes.configure( config, oldConfig );\n\t\tfocus.configure( config, oldConfig );\n\t\tpointer.configure( config, oldConfig );\n\t\tcontrols.configure( config, oldConfig );\n\t\tprogress.configure( config, oldConfig );\n\t\tkeyboard.configure( config, oldConfig );\n\t\tfragments.configure( config, oldConfig );\n\t\tslideNumber.configure( config, oldConfig );\n\n\t\tsync();\n\n\t}\n\n\t/**\n\t * Binds all event listeners.\n\t */\n\tfunction addEventListeners() {\n\n\t\teventsAreBound = true;\n\n\t\twindow.addEventListener( 'resize', onWindowResize, false );\n\n\t\tif( config.touch ) touch.bind();\n\t\tif( config.keyboard ) keyboard.bind();\n\t\tif( config.progress ) progress.bind();\n\t\tif( config.respondToHashChanges ) location.bind();\n\t\tcontrols.bind();\n\t\tfocus.bind();\n\n\t\tdom.slides.addEventListener( 'click', onSlidesClicked, false );\n\t\tdom.slides.addEventListener( 'transitionend', onTransitionEnd, false );\n\t\tdom.pauseOverlay.addEventListener( 'click', resume, false );\n\n\t\tif( config.focusBodyOnPageVisibilityChange ) {\n\t\t\tdocument.addEventListener( 'visibilitychange', onPageVisibilityChange, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Unbinds all event listeners.\n\t */\n\tfunction removeEventListeners() {\n\n\t\teventsAreBound = false;\n\n\t\ttouch.unbind();\n\t\tfocus.unbind();\n\t\tkeyboard.unbind();\n\t\tcontrols.unbind();\n\t\tprogress.unbind();\n\t\tlocation.unbind();\n\n\t\twindow.removeEventListener( 'resize', onWindowResize, false );\n\n\t\tdom.slides.removeEventListener( 'click', onSlidesClicked, false );\n\t\tdom.slides.removeEventListener( 'transitionend', onTransitionEnd, false );\n\t\tdom.pauseOverlay.removeEventListener( 'click', resume, false );\n\n\t}\n\n\t/**\n\t * Uninitializes reveal.js by undoing changes made to the\n\t * DOM and removing all event listeners.\n\t */\n\tfunction destroy() {\n\n\t\tremoveEventListeners();\n\t\tcancelAutoSlide();\n\t\tdisablePreviewLinks();\n\n\t\t// Destroy controllers\n\t\tnotes.destroy();\n\t\tfocus.destroy();\n\t\tplugins.destroy();\n\t\tpointer.destroy();\n\t\tcontrols.destroy();\n\t\tprogress.destroy();\n\t\tbackgrounds.destroy();\n\t\tslideNumber.destroy();\n\n\t\t// Remove event listeners\n\t\tdocument.removeEventListener( 'fullscreenchange', onFullscreenChange );\n\t\tdocument.removeEventListener( 'webkitfullscreenchange', onFullscreenChange );\n\t\tdocument.removeEventListener( 'visibilitychange', onPageVisibilityChange, false );\n\t\twindow.removeEventListener( 'message', onPostMessage, false );\n\t\twindow.removeEventListener( 'load', layout, false );\n\n\t\t// Undo DOM changes\n\t\tif( dom.pauseOverlay ) dom.pauseOverlay.remove();\n\t\tif( dom.statusElement ) dom.statusElement.remove();\n\n\t\tdocument.documentElement.classList.remove( 'reveal-full-page' );\n\n\t\tdom.wrapper.classList.remove( 'ready', 'center', 'has-horizontal-slides', 'has-vertical-slides' );\n\t\tdom.wrapper.removeAttribute( 'data-transition-speed' );\n\t\tdom.wrapper.removeAttribute( 'data-background-transition' );\n\n\t\tdom.viewport.classList.remove( 'reveal-viewport' );\n\t\tdom.viewport.style.removeProperty( '--slide-width' );\n\t\tdom.viewport.style.removeProperty( '--slide-height' );\n\n\t\tdom.slides.style.removeProperty( 'width' );\n\t\tdom.slides.style.removeProperty( 'height' );\n\t\tdom.slides.style.removeProperty( 'zoom' );\n\t\tdom.slides.style.removeProperty( 'left' );\n\t\tdom.slides.style.removeProperty( 'top' );\n\t\tdom.slides.style.removeProperty( 'bottom' );\n\t\tdom.slides.style.removeProperty( 'right' );\n\t\tdom.slides.style.removeProperty( 'transform' );\n\n\t\tArray.from( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( slide => {\n\t\t\tslide.style.removeProperty( 'display' );\n\t\t\tslide.style.removeProperty( 'top' );\n\t\t\tslide.removeAttribute( 'hidden' );\n\t\t\tslide.removeAttribute( 'aria-hidden' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Adds a listener to one of our custom reveal.js events,\n\t * like slidechanged.\n\t */\n\tfunction on( type, listener, useCapture ) {\n\n\t\trevealElement.addEventListener( type, listener, useCapture );\n\n\t}\n\n\t/**\n\t * Unsubscribes from a reveal.js event.\n\t */\n\tfunction off( type, listener, useCapture ) {\n\n\t\trevealElement.removeEventListener( type, listener, useCapture );\n\n\t}\n\n\t/**\n\t * Applies CSS transforms to the slides container. The container\n\t * is transformed from two separate sources: layout and the overview\n\t * mode.\n\t *\n\t * @param {object} transforms\n\t */\n\tfunction transformSlides( transforms ) {\n\n\t\t// Pick up new transforms from arguments\n\t\tif( typeof transforms.layout === 'string' ) slidesTransform.layout = transforms.layout;\n\t\tif( typeof transforms.overview === 'string' ) slidesTransform.overview = transforms.overview;\n\n\t\t// Apply the transforms to the slides container\n\t\tif( slidesTransform.layout ) {\n\t\t\tUtil.transformElement( dom.slides, slidesTransform.layout + ' ' + slidesTransform.overview );\n\t\t}\n\t\telse {\n\t\t\tUtil.transformElement( dom.slides, slidesTransform.overview );\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event of the specified type from the\n\t * reveal DOM element.\n\t */\n\tfunction dispatchEvent({ target=dom.wrapper, type, data, bubbles=true }) {\n\n\t\tlet event = document.createEvent( 'HTMLEvents', 1, 2 );\n\t\tevent.initEvent( type, bubbles, true );\n\t\tUtil.extend( event, data );\n\t\ttarget.dispatchEvent( event );\n\n\t\tif( target === dom.wrapper ) {\n\t\t\t// If we're in an iframe, post each reveal.js event to the\n\t\t\t// parent window. Used by the notes plugin\n\t\t\tdispatchPostMessage( type );\n\t\t}\n\n\t\treturn event;\n\n\t}\n\n\t/**\n\t * Dispatched a postMessage of the given type from our window.\n\t */\n\tfunction dispatchPostMessage( type, data ) {\n\n\t\tif( config.postMessageEvents && window.parent !== window.self ) {\n\t\t\tlet message = {\n\t\t\t\tnamespace: 'reveal',\n\t\t\t\teventName: type,\n\t\t\t\tstate: getState()\n\t\t\t};\n\n\t\t\tUtil.extend( message, data );\n\n\t\t\twindow.parent.postMessage( JSON.stringify( message ), '*' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Bind preview frame links.\n\t *\n\t * @param {string} [selector=a] - selector for anchors\n\t */\n\tfunction enablePreviewLinks( selector = 'a' ) {\n\n\t\tArray.from( dom.wrapper.querySelectorAll( selector ) ).forEach( element => {\n\t\t\tif( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) {\n\t\t\t\telement.addEventListener( 'click', onPreviewLinkClicked, false );\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Unbind preview frame links.\n\t */\n\tfunction disablePreviewLinks( selector = 'a' ) {\n\n\t\tArray.from( dom.wrapper.querySelectorAll( selector ) ).forEach( element => {\n\t\t\tif( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) {\n\t\t\t\telement.removeEventListener( 'click', onPreviewLinkClicked, false );\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Opens a preview window for the target URL.\n\t *\n\t * @param {string} url - url for preview iframe src\n\t */\n\tfunction showPreview( url ) {\n\n\t\tcloseOverlay();\n\n\t\tdom.overlay = document.createElement( 'div' );\n\t\tdom.overlay.classList.add( 'overlay' );\n\t\tdom.overlay.classList.add( 'overlay-preview' );\n\t\tdom.wrapper.appendChild( dom.overlay );\n\n\t\tdom.overlay.innerHTML =\n\t\t\t`
\n\t\t\t\t \n\t\t\t\t \n\t\t\t \n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tUnable to load iframe. This is likely due to the site's policy (x-frame-options). \n\t\t\t\t \n\t\t\t
`;\n\n\t\tdom.overlay.querySelector( 'iframe' ).addEventListener( 'load', event => {\n\t\t\tdom.overlay.classList.add( 'loaded' );\n\t\t}, false );\n\n\t\tdom.overlay.querySelector( '.close' ).addEventListener( 'click', event => {\n\t\t\tcloseOverlay();\n\t\t\tevent.preventDefault();\n\t\t}, false );\n\n\t\tdom.overlay.querySelector( '.external' ).addEventListener( 'click', event => {\n\t\t\tcloseOverlay();\n\t\t}, false );\n\n\t}\n\n\t/**\n\t * Open or close help overlay window.\n\t *\n\t * @param {Boolean} [override] Flag which overrides the\n\t * toggle logic and forcibly sets the desired state. True means\n\t * help is open, false means it's closed.\n\t */\n\tfunction toggleHelp( override ){\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? showHelp() : closeOverlay();\n\t\t}\n\t\telse {\n\t\t\tif( dom.overlay ) {\n\t\t\t\tcloseOverlay();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tshowHelp();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Opens an overlay window with help material.\n\t */\n\tfunction showHelp() {\n\n\t\tif( config.help ) {\n\n\t\t\tcloseOverlay();\n\n\t\t\tdom.overlay = document.createElement( 'div' );\n\t\t\tdom.overlay.classList.add( 'overlay' );\n\t\t\tdom.overlay.classList.add( 'overlay-help' );\n\t\t\tdom.wrapper.appendChild( dom.overlay );\n\n\t\t\tlet html = '
Keyboard Shortcuts
';\n\n\t\t\tlet shortcuts = keyboard.getShortcuts(),\n\t\t\t\tbindings = keyboard.getBindings();\n\n\t\t\thtml += '
KEY ACTION ';\n\t\t\tfor( let key in shortcuts ) {\n\t\t\t\thtml += `${key} ${shortcuts[ key ]} `;\n\t\t\t}\n\n\t\t\t// Add custom key bindings that have associated descriptions\n\t\t\tfor( let binding in bindings ) {\n\t\t\t\tif( bindings[binding].key && bindings[binding].description ) {\n\t\t\t\t\thtml += `${bindings[binding].key} ${bindings[binding].description} `;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thtml += '
';\n\n\t\t\tdom.overlay.innerHTML = `\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
${html}
\n\t\t\t\t
\n\t\t\t`;\n\n\t\t\tdom.overlay.querySelector( '.close' ).addEventListener( 'click', event => {\n\t\t\t\tcloseOverlay();\n\t\t\t\tevent.preventDefault();\n\t\t\t}, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Closes any currently open overlay.\n\t */\n\tfunction closeOverlay() {\n\n\t\tif( dom.overlay ) {\n\t\t\tdom.overlay.parentNode.removeChild( dom.overlay );\n\t\t\tdom.overlay = null;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Applies JavaScript-controlled layout rules to the\n\t * presentation.\n\t */\n\tfunction layout() {\n\n\t\tif( dom.wrapper && !print.isPrintingPDF() ) {\n\n\t\t\tif( !config.disableLayout ) {\n\n\t\t\t\t// On some mobile devices '100vh' is taller than the visible\n\t\t\t\t// viewport which leads to part of the presentation being\n\t\t\t\t// cut off. To work around this we define our own '--vh' custom\n\t\t\t\t// property where 100x adds up to the correct height.\n\t\t\t\t//\n\t\t\t\t// https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n\t\t\t\tif( Device.isMobile && !config.embedded ) {\n\t\t\t\t\tdocument.documentElement.style.setProperty( '--vh', ( window.innerHeight * 0.01 ) + 'px' );\n\t\t\t\t}\n\n\t\t\t\tconst size = getComputedSlideSize();\n\n\t\t\t\tconst oldScale = scale;\n\n\t\t\t\t// Layout the contents of the slides\n\t\t\t\tlayoutSlideContents( config.width, config.height );\n\n\t\t\t\tdom.slides.style.width = size.width + 'px';\n\t\t\t\tdom.slides.style.height = size.height + 'px';\n\n\t\t\t\t// Determine scale of content to fit within available space\n\t\t\t\tscale = Math.min( size.presentationWidth / size.width, size.presentationHeight / size.height );\n\n\t\t\t\t// Respect max/min scale settings\n\t\t\t\tscale = Math.max( scale, config.minScale );\n\t\t\t\tscale = Math.min( scale, config.maxScale );\n\n\t\t\t\t// Don't apply any scaling styles if scale is 1\n\t\t\t\tif( scale === 1 ) {\n\t\t\t\t\tdom.slides.style.zoom = '';\n\t\t\t\t\tdom.slides.style.left = '';\n\t\t\t\t\tdom.slides.style.top = '';\n\t\t\t\t\tdom.slides.style.bottom = '';\n\t\t\t\t\tdom.slides.style.right = '';\n\t\t\t\t\ttransformSlides( { layout: '' } );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdom.slides.style.zoom = '';\n\t\t\t\t\tdom.slides.style.left = '50%';\n\t\t\t\t\tdom.slides.style.top = '50%';\n\t\t\t\t\tdom.slides.style.bottom = 'auto';\n\t\t\t\t\tdom.slides.style.right = 'auto';\n\t\t\t\t\ttransformSlides( { layout: 'translate(-50%, -50%) scale('+ scale +')' } );\n\t\t\t\t}\n\n\t\t\t\t// Select all slides, vertical and horizontal\n\t\t\t\tconst slides = Array.from( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) );\n\n\t\t\t\tfor( let i = 0, len = slides.length; i < len; i++ ) {\n\t\t\t\t\tconst slide = slides[ i ];\n\n\t\t\t\t\t// Don't bother updating invisible slides\n\t\t\t\t\tif( slide.style.display === 'none' ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif( config.center || slide.classList.contains( 'center' ) ) {\n\t\t\t\t\t\t// Vertical stacks are not centred since their section\n\t\t\t\t\t\t// children will be\n\t\t\t\t\t\tif( slide.classList.contains( 'stack' ) ) {\n\t\t\t\t\t\t\tslide.style.top = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tslide.style.top = Math.max( ( size.height - slide.scrollHeight ) / 2, 0 ) + 'px';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tslide.style.top = '';\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif( oldScale !== scale ) {\n\t\t\t\t\tdispatchEvent({\n\t\t\t\t\t\ttype: 'resize',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\toldScale,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\tsize\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdom.viewport.style.setProperty( '--slide-scale', scale );\n\n\t\t\tprogress.update();\n\t\t\tbackgrounds.updateParallax();\n\n\t\t\tif( overview.isActive() ) {\n\t\t\t\toverview.update();\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies layout logic to the contents of all slides in\n\t * the presentation.\n\t *\n\t * @param {string|number} width\n\t * @param {string|number} height\n\t */\n\tfunction layoutSlideContents( width, height ) {\n\n\t\t// Handle sizing of elements with the 'r-stretch' class\n\t\tUtil.queryAll( dom.slides, 'section > .stretch, section > .r-stretch' ).forEach( element => {\n\n\t\t\t// Determine how much vertical space we can use\n\t\t\tlet remainingHeight = Util.getRemainingHeight( element, height );\n\n\t\t\t// Consider the aspect ratio of media elements\n\t\t\tif( /(img|video)/gi.test( element.nodeName ) ) {\n\t\t\t\tconst nw = element.naturalWidth || element.videoWidth,\n\t\t\t\t\t nh = element.naturalHeight || element.videoHeight;\n\n\t\t\t\tconst es = Math.min( width / nw, remainingHeight / nh );\n\n\t\t\t\telement.style.width = ( nw * es ) + 'px';\n\t\t\t\telement.style.height = ( nh * es ) + 'px';\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\telement.style.width = width + 'px';\n\t\t\t\telement.style.height = remainingHeight + 'px';\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Calculates the computed pixel size of our slides. These\n\t * values are based on the width and height configuration\n\t * options.\n\t *\n\t * @param {number} [presentationWidth=dom.wrapper.offsetWidth]\n\t * @param {number} [presentationHeight=dom.wrapper.offsetHeight]\n\t */\n\tfunction getComputedSlideSize( presentationWidth, presentationHeight ) {\n\n\t\tconst size = {\n\t\t\t// Slide size\n\t\t\twidth: config.width,\n\t\t\theight: config.height,\n\n\t\t\t// Presentation size\n\t\t\tpresentationWidth: presentationWidth || dom.wrapper.offsetWidth,\n\t\t\tpresentationHeight: presentationHeight || dom.wrapper.offsetHeight\n\t\t};\n\n\t\t// Reduce available space by margin\n\t\tsize.presentationWidth -= ( size.presentationWidth * config.margin );\n\t\tsize.presentationHeight -= ( size.presentationHeight * config.margin );\n\n\t\t// Slide width may be a percentage of available width\n\t\tif( typeof size.width === 'string' && /%$/.test( size.width ) ) {\n\t\t\tsize.width = parseInt( size.width, 10 ) / 100 * size.presentationWidth;\n\t\t}\n\n\t\t// Slide height may be a percentage of available height\n\t\tif( typeof size.height === 'string' && /%$/.test( size.height ) ) {\n\t\t\tsize.height = parseInt( size.height, 10 ) / 100 * size.presentationHeight;\n\t\t}\n\n\t\treturn size;\n\n\t}\n\n\t/**\n\t * Stores the vertical index of a stack so that the same\n\t * vertical slide can be selected when navigating to and\n\t * from the stack.\n\t *\n\t * @param {HTMLElement} stack The vertical stack element\n\t * @param {string|number} [v=0] Index to memorize\n\t */\n\tfunction setPreviousVerticalIndex( stack, v ) {\n\n\t\tif( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) {\n\t\t\tstack.setAttribute( 'data-previous-indexv', v || 0 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Retrieves the vertical index which was stored using\n\t * #setPreviousVerticalIndex() or 0 if no previous index\n\t * exists.\n\t *\n\t * @param {HTMLElement} stack The vertical stack element\n\t */\n\tfunction getPreviousVerticalIndex( stack ) {\n\n\t\tif( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) {\n\t\t\t// Prefer manually defined start-indexv\n\t\t\tconst attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv';\n\n\t\t\treturn parseInt( stack.getAttribute( attributeName ) || 0, 10 );\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Checks if the current or specified slide is vertical\n\t * (nested within another slide).\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide to check\n\t * orientation of\n\t * @return {Boolean}\n\t */\n\tfunction isVerticalSlide( slide = currentSlide ) {\n\n\t\treturn slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i );\n\n\t}\n\n\t/**\n\t * Returns true if we're on the last slide in the current\n\t * vertical stack.\n\t */\n\tfunction isLastVerticalSlide() {\n\n\t\tif( currentSlide && isVerticalSlide( currentSlide ) ) {\n\t\t\t// Does this slide have a next sibling?\n\t\t\tif( currentSlide.nextElementSibling ) return false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns true if we're currently on the first slide in\n\t * the presentation.\n\t */\n\tfunction isFirstSlide() {\n\n\t\treturn indexh === 0 && indexv === 0;\n\n\t}\n\n\t/**\n\t * Returns true if we're currently on the last slide in\n\t * the presenation. If the last slide is a stack, we only\n\t * consider this the last slide if it's at the end of the\n\t * stack.\n\t */\n\tfunction isLastSlide() {\n\n\t\tif( currentSlide ) {\n\t\t\t// Does this slide have a next sibling?\n\t\t\tif( currentSlide.nextElementSibling ) return false;\n\n\t\t\t// If it's vertical, does its parent have a next sibling?\n\t\t\tif( isVerticalSlide( currentSlide ) && currentSlide.parentNode.nextElementSibling ) return false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Enters the paused mode which fades everything on screen to\n\t * black.\n\t */\n\tfunction pause() {\n\n\t\tif( config.pause ) {\n\t\t\tconst wasPaused = dom.wrapper.classList.contains( 'paused' );\n\n\t\t\tcancelAutoSlide();\n\t\t\tdom.wrapper.classList.add( 'paused' );\n\n\t\t\tif( wasPaused === false ) {\n\t\t\t\tdispatchEvent({ type: 'paused' });\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Exits from the paused mode.\n\t */\n\tfunction resume() {\n\n\t\tconst wasPaused = dom.wrapper.classList.contains( 'paused' );\n\t\tdom.wrapper.classList.remove( 'paused' );\n\n\t\tcueAutoSlide();\n\n\t\tif( wasPaused ) {\n\t\t\tdispatchEvent({ type: 'resumed' });\n\t\t}\n\n\t}\n\n\t/**\n\t * Toggles the paused mode on and off.\n\t */\n\tfunction togglePause( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? pause() : resume();\n\t\t}\n\t\telse {\n\t\t\tisPaused() ? resume() : pause();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if we are currently in the paused mode.\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction isPaused() {\n\n\t\treturn dom.wrapper.classList.contains( 'paused' );\n\n\t}\n\n\t/**\n\t * Toggles the auto slide mode on and off.\n\t *\n\t * @param {Boolean} [override] Flag which sets the desired state.\n\t * True means autoplay starts, false means it stops.\n\t */\n\n\tfunction toggleAutoSlide( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? resumeAutoSlide() : pauseAutoSlide();\n\t\t}\n\n\t\telse {\n\t\t\tautoSlidePaused ? resumeAutoSlide() : pauseAutoSlide();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the auto slide mode is currently on.\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction isAutoSliding() {\n\n\t\treturn !!( autoSlide && !autoSlidePaused );\n\n\t}\n\n\t/**\n\t * Steps from the current point in the presentation to the\n\t * slide which matches the specified horizontal and vertical\n\t * indices.\n\t *\n\t * @param {number} [h=indexh] Horizontal index of the target slide\n\t * @param {number} [v=indexv] Vertical index of the target slide\n\t * @param {number} [f] Index of a fragment within the\n\t * target slide to activate\n\t * @param {number} [origin] Origin for use in multimaster environments\n\t */\n\tfunction slide( h, v, f, origin ) {\n\n\t\t// Dispatch an event before hte slide\n\t\tconst slidechange = dispatchEvent({\n\t\t\ttype: 'beforeslidechange',\n\t\t\tdata: {\n\t\t\t\tindexh: h === undefined ? indexh : h,\n\t\t\t\tindexv: v === undefined ? indexv : v,\n\t\t\t\torigin\n\t\t\t}\n\t\t});\n\n\t\t// Abort if this slide change was prevented by an event listener\n\t\tif( slidechange.defaultPrevented ) return;\n\n\t\t// Remember where we were at before\n\t\tpreviousSlide = currentSlide;\n\n\t\t// Query all horizontal slides in the deck\n\t\tconst horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );\n\n\t\t// Abort if there are no slides\n\t\tif( horizontalSlides.length === 0 ) return;\n\n\t\t// If no vertical index is specified and the upcoming slide is a\n\t\t// stack, resume at its previous vertical index\n\t\tif( v === undefined && !overview.isActive() ) {\n\t\t\tv = getPreviousVerticalIndex( horizontalSlides[ h ] );\n\t\t}\n\n\t\t// If we were on a vertical stack, remember what vertical index\n\t\t// it was on so we can resume at the same position when returning\n\t\tif( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) {\n\t\t\tsetPreviousVerticalIndex( previousSlide.parentNode, indexv );\n\t\t}\n\n\t\t// Remember the state before this slide\n\t\tconst stateBefore = state.concat();\n\n\t\t// Reset the state array\n\t\tstate.length = 0;\n\n\t\tlet indexhBefore = indexh || 0,\n\t\t\tindexvBefore = indexv || 0;\n\n\t\t// Activate and transition to the new slide\n\t\tindexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );\n\t\tindexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );\n\n\t\t// Dispatch an event if the slide changed\n\t\tlet slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore );\n\n\t\t// Ensure that the previous slide is never the same as the current\n\t\tif( !slideChanged ) previousSlide = null;\n\n\t\t// Find the current horizontal slide and any possible vertical slides\n\t\t// within it\n\t\tlet currentHorizontalSlide = horizontalSlides[ indexh ],\n\t\t\tcurrentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );\n\n\t\t// Store references to the previous and current slides\n\t\tcurrentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide;\n\n\t\tlet autoAnimateTransition = false;\n\n\t\t// Detect if we're moving between two auto-animated slides\n\t\tif( slideChanged && previousSlide && currentSlide && !overview.isActive() ) {\n\n\t\t\t// If this is an auto-animated transition, we disable the\n\t\t\t// regular slide transition\n\t\t\t//\n\t\t\t// Note 20-03-2020:\n\t\t\t// This needs to happen before we update slide visibility,\n\t\t\t// otherwise transitions will still run in Safari.\n\t\t\tif( previousSlide.hasAttribute( 'data-auto-animate' ) && currentSlide.hasAttribute( 'data-auto-animate' )\n\t\t\t\t\t&& previousSlide.getAttribute( 'data-auto-animate-id' ) === currentSlide.getAttribute( 'data-auto-animate-id' )\n\t\t\t\t\t&& !( ( indexh > indexhBefore || indexv > indexvBefore ) ? currentSlide : previousSlide ).hasAttribute( 'data-auto-animate-restart' ) ) {\n\n\t\t\t\tautoAnimateTransition = true;\n\t\t\t\tdom.slides.classList.add( 'disable-slide-transitions' );\n\t\t\t}\n\n\t\t\ttransition = 'running';\n\n\t\t}\n\n\t\t// Update the visibility of slides now that the indices have changed\n\t\tupdateSlidesVisibility();\n\n\t\tlayout();\n\n\t\t// Update the overview if it's currently active\n\t\tif( overview.isActive() ) {\n\t\t\toverview.update();\n\t\t}\n\n\t\t// Show fragment, if specified\n\t\tif( typeof f !== 'undefined' ) {\n\t\t\tfragments.goto( f );\n\t\t}\n\n\t\t// Solves an edge case where the previous slide maintains the\n\t\t// 'present' class when navigating between adjacent vertical\n\t\t// stacks\n\t\tif( previousSlide && previousSlide !== currentSlide ) {\n\t\t\tpreviousSlide.classList.remove( 'present' );\n\t\t\tpreviousSlide.setAttribute( 'aria-hidden', 'true' );\n\n\t\t\t// Reset all slides upon navigate to home\n\t\t\tif( isFirstSlide() ) {\n\t\t\t\t// Launch async task\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tgetVerticalStacks().forEach( slide => {\n\t\t\t\t\t\tsetPreviousVerticalIndex( slide, 0 );\n\t\t\t\t\t} );\n\t\t\t\t}, 0 );\n\t\t\t}\n\t\t}\n\n\t\t// Apply the new state\n\t\tstateLoop: for( let i = 0, len = state.length; i < len; i++ ) {\n\t\t\t// Check if this state existed on the previous slide. If it\n\t\t\t// did, we will avoid adding it repeatedly\n\t\t\tfor( let j = 0; j < stateBefore.length; j++ ) {\n\t\t\t\tif( stateBefore[j] === state[i] ) {\n\t\t\t\t\tstateBefore.splice( j, 1 );\n\t\t\t\t\tcontinue stateLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdom.viewport.classList.add( state[i] );\n\n\t\t\t// Dispatch custom event matching the state's name\n\t\t\tdispatchEvent({ type: state[i] });\n\t\t}\n\n\t\t// Clean up the remains of the previous state\n\t\twhile( stateBefore.length ) {\n\t\t\tdom.viewport.classList.remove( stateBefore.pop() );\n\t\t}\n\n\t\tif( slideChanged ) {\n\t\t\tdispatchEvent({\n\t\t\t\ttype: 'slidechanged',\n\t\t\t\tdata: {\n\t\t\t\t\tindexh,\n\t\t\t\t\tindexv,\n\t\t\t\t\tpreviousSlide,\n\t\t\t\t\tcurrentSlide,\n\t\t\t\t\torigin\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Handle embedded content\n\t\tif( slideChanged || !previousSlide ) {\n\t\t\tslideContent.stopEmbeddedContent( previousSlide );\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t}\n\n\t\t// Announce the current slide contents to screen readers\n\t\t// Use animation frame to prevent getComputedStyle in getStatusText\n\t\t// from triggering layout mid-frame\n\t\trequestAnimationFrame( () => {\n\t\t\tannounceStatus( getStatusText( currentSlide ) );\n\t\t});\n\n\t\tprogress.update();\n\t\tcontrols.update();\n\t\tnotes.update();\n\t\tbackgrounds.update();\n\t\tbackgrounds.updateParallax();\n\t\tslideNumber.update();\n\t\tfragments.update();\n\n\t\t// Update the URL hash\n\t\tlocation.writeURL();\n\n\t\tcueAutoSlide();\n\n\t\t// Auto-animation\n\t\tif( autoAnimateTransition ) {\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tdom.slides.classList.remove( 'disable-slide-transitions' );\n\t\t\t}, 0 );\n\n\t\t\tif( config.autoAnimate ) {\n\t\t\t\t// Run the auto-animation between our slides\n\t\t\t\tautoAnimate.run( previousSlide, currentSlide );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Syncs the presentation with the current DOM. Useful\n\t * when new slides or control elements are added or when\n\t * the configuration has changed.\n\t */\n\tfunction sync() {\n\n\t\t// Subscribe to input\n\t\tremoveEventListeners();\n\t\taddEventListeners();\n\n\t\t// Force a layout to make sure the current config is accounted for\n\t\tlayout();\n\n\t\t// Reflect the current autoSlide value\n\t\tautoSlide = config.autoSlide;\n\n\t\t// Start auto-sliding if it's enabled\n\t\tcueAutoSlide();\n\n\t\t// Re-create all slide backgrounds\n\t\tbackgrounds.create();\n\n\t\t// Write the current hash to the URL\n\t\tlocation.writeURL();\n\n\t\tfragments.sortAll();\n\n\t\tcontrols.update();\n\t\tprogress.update();\n\n\t\tupdateSlidesVisibility();\n\n\t\tnotes.update();\n\t\tnotes.updateVisibility();\n\t\tbackgrounds.update( true );\n\t\tslideNumber.update();\n\t\tslideContent.formatEmbeddedContent();\n\n\t\t// Start or stop embedded content depending on global config\n\t\tif( config.autoPlayMedia === false ) {\n\t\t\tslideContent.stopEmbeddedContent( currentSlide, { unloadIframes: false } );\n\t\t}\n\t\telse {\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t}\n\n\t\tif( overview.isActive() ) {\n\t\t\toverview.layout();\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates reveal.js to keep in sync with new slide attributes. For\n\t * example, if you add a new `data-background-image` you can call\n\t * this to have reveal.js render the new background image.\n\t *\n\t * Similar to #sync() but more efficient when you only need to\n\t * refresh a specific slide.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tfunction syncSlide( slide = currentSlide ) {\n\n\t\tbackgrounds.sync( slide );\n\t\tfragments.sync( slide );\n\n\t\tslideContent.load( slide );\n\n\t\tbackgrounds.update();\n\t\tnotes.update();\n\n\t}\n\n\t/**\n\t * Resets all vertical slides so that only the first\n\t * is visible.\n\t */\n\tfunction resetVerticalSlides() {\n\n\t\tgetHorizontalSlides().forEach( horizontalSlide => {\n\n\t\t\tUtil.queryAll( horizontalSlide, 'section' ).forEach( ( verticalSlide, y ) => {\n\n\t\t\t\tif( y > 0 ) {\n\t\t\t\t\tverticalSlide.classList.remove( 'present' );\n\t\t\t\t\tverticalSlide.classList.remove( 'past' );\n\t\t\t\t\tverticalSlide.classList.add( 'future' );\n\t\t\t\t\tverticalSlide.setAttribute( 'aria-hidden', 'true' );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Randomly shuffles all slides in the deck.\n\t */\n\tfunction shuffle( slides = getHorizontalSlides() ) {\n\n\t\tslides.forEach( ( slide, i ) => {\n\n\t\t\t// Insert the slide next to a randomly picked sibling slide\n\t\t\t// slide. This may cause the slide to insert before itself,\n\t\t\t// but that's not an issue.\n\t\t\tlet beforeSlide = slides[ Math.floor( Math.random() * slides.length ) ];\n\t\t\tif( beforeSlide.parentNode === slide.parentNode ) {\n\t\t\t\tslide.parentNode.insertBefore( slide, beforeSlide );\n\t\t\t}\n\n\t\t\t// Randomize the order of vertical slides (if there are any)\n\t\t\tlet verticalSlides = slide.querySelectorAll( 'section' );\n\t\t\tif( verticalSlides.length ) {\n\t\t\t\tshuffle( verticalSlides );\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates one dimension of slides by showing the slide\n\t * with the specified index.\n\t *\n\t * @param {string} selector A CSS selector that will fetch\n\t * the group of slides we are working with\n\t * @param {number} index The index of the slide that should be\n\t * shown\n\t *\n\t * @return {number} The index of the slide that is now shown,\n\t * might differ from the passed in index if it was out of\n\t * bounds.\n\t */\n\tfunction updateSlides( selector, index ) {\n\n\t\t// Select all slides and convert the NodeList result to\n\t\t// an array\n\t\tlet slides = Util.queryAll( dom.wrapper, selector ),\n\t\t\tslidesLength = slides.length;\n\n\t\tlet printMode = print.isPrintingPDF();\n\t\tlet loopedForwards = false;\n\t\tlet loopedBackwards = false;\n\n\t\tif( slidesLength ) {\n\n\t\t\t// Should the index loop?\n\t\t\tif( config.loop ) {\n\t\t\t\tif( index >= slidesLength ) loopedForwards = true;\n\n\t\t\t\tindex %= slidesLength;\n\n\t\t\t\tif( index < 0 ) {\n\t\t\t\t\tindex = slidesLength + index;\n\t\t\t\t\tloopedBackwards = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Enforce max and minimum index bounds\n\t\t\tindex = Math.max( Math.min( index, slidesLength - 1 ), 0 );\n\n\t\t\tfor( let i = 0; i < slidesLength; i++ ) {\n\t\t\t\tlet element = slides[i];\n\n\t\t\t\tlet reverse = config.rtl && !isVerticalSlide( element );\n\n\t\t\t\t// Avoid .remove() with multiple args for IE11 support\n\t\t\t\telement.classList.remove( 'past' );\n\t\t\t\telement.classList.remove( 'present' );\n\t\t\t\telement.classList.remove( 'future' );\n\n\t\t\t\t// http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute\n\t\t\t\telement.setAttribute( 'hidden', '' );\n\t\t\t\telement.setAttribute( 'aria-hidden', 'true' );\n\n\t\t\t\t// If this element contains vertical slides\n\t\t\t\tif( element.querySelector( 'section' ) ) {\n\t\t\t\t\telement.classList.add( 'stack' );\n\t\t\t\t}\n\n\t\t\t\t// If we're printing static slides, all slides are \"present\"\n\t\t\t\tif( printMode ) {\n\t\t\t\t\telement.classList.add( 'present' );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif( i < index ) {\n\t\t\t\t\t// Any element previous to index is given the 'past' class\n\t\t\t\t\telement.classList.add( reverse ? 'future' : 'past' );\n\n\t\t\t\t\tif( config.fragments ) {\n\t\t\t\t\t\t// Show all fragments in prior slides\n\t\t\t\t\t\tshowFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( i > index ) {\n\t\t\t\t\t// Any element subsequent to index is given the 'future' class\n\t\t\t\t\telement.classList.add( reverse ? 'past' : 'future' );\n\n\t\t\t\t\tif( config.fragments ) {\n\t\t\t\t\t\t// Hide all fragments in future slides\n\t\t\t\t\t\thideFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Update the visibility of fragments when a presentation loops\n\t\t\t\t// in either direction\n\t\t\t\telse if( i === index && config.fragments ) {\n\t\t\t\t\tif( loopedForwards ) {\n\t\t\t\t\t\thideFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t\telse if( loopedBackwards ) {\n\t\t\t\t\t\tshowFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet slide = slides[index];\n\t\t\tlet wasPresent = slide.classList.contains( 'present' );\n\n\t\t\t// Mark the current slide as present\n\t\t\tslide.classList.add( 'present' );\n\t\t\tslide.removeAttribute( 'hidden' );\n\t\t\tslide.removeAttribute( 'aria-hidden' );\n\n\t\t\tif( !wasPresent ) {\n\t\t\t\t// Dispatch an event indicating the slide is now visible\n\t\t\t\tdispatchEvent({\n\t\t\t\t\ttarget: slide,\n\t\t\t\t\ttype: 'visible',\n\t\t\t\t\tbubbles: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If this slide has a state associated with it, add it\n\t\t\t// onto the current state of the deck\n\t\t\tlet slideState = slide.getAttribute( 'data-state' );\n\t\t\tif( slideState ) {\n\t\t\t\tstate = state.concat( slideState.split( ' ' ) );\n\t\t\t}\n\n\t\t}\n\t\telse {\n\t\t\t// Since there are no slides we can't be anywhere beyond the\n\t\t\t// zeroth index\n\t\t\tindex = 0;\n\t\t}\n\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Shows all fragment elements within the given contaienr.\n\t */\n\tfunction showFragmentsIn( container ) {\n\n\t\tUtil.queryAll( container, '.fragment' ).forEach( fragment => {\n\t\t\tfragment.classList.add( 'visible' );\n\t\t\tfragment.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Hides all fragment elements within the given contaienr.\n\t */\n\tfunction hideFragmentsIn( container ) {\n\n\t\tUtil.queryAll( container, '.fragment.visible' ).forEach( fragment => {\n\t\t\tfragment.classList.remove( 'visible', 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Optimization method; hide all slides that are far away\n\t * from the present slide.\n\t */\n\tfunction updateSlidesVisibility() {\n\n\t\t// Select all slides and convert the NodeList result to\n\t\t// an array\n\t\tlet horizontalSlides = getHorizontalSlides(),\n\t\t\thorizontalSlidesLength = horizontalSlides.length,\n\t\t\tdistanceX,\n\t\t\tdistanceY;\n\n\t\tif( horizontalSlidesLength && typeof indexh !== 'undefined' ) {\n\n\t\t\t// The number of steps away from the present slide that will\n\t\t\t// be visible\n\t\t\tlet viewDistance = overview.isActive() ? 10 : config.viewDistance;\n\n\t\t\t// Shorten the view distance on devices that typically have\n\t\t\t// less resources\n\t\t\tif( Device.isMobile ) {\n\t\t\t\tviewDistance = overview.isActive() ? 6 : config.mobileViewDistance;\n\t\t\t}\n\n\t\t\t// All slides need to be visible when exporting to PDF\n\t\t\tif( print.isPrintingPDF() ) {\n\t\t\t\tviewDistance = Number.MAX_VALUE;\n\t\t\t}\n\n\t\t\tfor( let x = 0; x < horizontalSlidesLength; x++ ) {\n\t\t\t\tlet horizontalSlide = horizontalSlides[x];\n\n\t\t\t\tlet verticalSlides = Util.queryAll( horizontalSlide, 'section' ),\n\t\t\t\t\tverticalSlidesLength = verticalSlides.length;\n\n\t\t\t\t// Determine how far away this slide is from the present\n\t\t\t\tdistanceX = Math.abs( ( indexh || 0 ) - x ) || 0;\n\n\t\t\t\t// If the presentation is looped, distance should measure\n\t\t\t\t// 1 between the first and last slides\n\t\t\t\tif( config.loop ) {\n\t\t\t\t\tdistanceX = Math.abs( ( ( indexh || 0 ) - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0;\n\t\t\t\t}\n\n\t\t\t\t// Show the horizontal slide if it's within the view distance\n\t\t\t\tif( distanceX < viewDistance ) {\n\t\t\t\t\tslideContent.load( horizontalSlide );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tslideContent.unload( horizontalSlide );\n\t\t\t\t}\n\n\t\t\t\tif( verticalSlidesLength ) {\n\n\t\t\t\t\tlet oy = getPreviousVerticalIndex( horizontalSlide );\n\n\t\t\t\t\tfor( let y = 0; y < verticalSlidesLength; y++ ) {\n\t\t\t\t\t\tlet verticalSlide = verticalSlides[y];\n\n\t\t\t\t\t\tdistanceY = x === ( indexh || 0 ) ? Math.abs( ( indexv || 0 ) - y ) : Math.abs( y - oy );\n\n\t\t\t\t\t\tif( distanceX + distanceY < viewDistance ) {\n\t\t\t\t\t\t\tslideContent.load( verticalSlide );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tslideContent.unload( verticalSlide );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Flag if there are ANY vertical slides, anywhere in the deck\n\t\t\tif( hasVerticalSlides() ) {\n\t\t\t\tdom.wrapper.classList.add( 'has-vertical-slides' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdom.wrapper.classList.remove( 'has-vertical-slides' );\n\t\t\t}\n\n\t\t\t// Flag if there are ANY horizontal slides, anywhere in the deck\n\t\t\tif( hasHorizontalSlides() ) {\n\t\t\t\tdom.wrapper.classList.add( 'has-horizontal-slides' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdom.wrapper.classList.remove( 'has-horizontal-slides' );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Determine what available routes there are for navigation.\n\t *\n\t * @return {{left: boolean, right: boolean, up: boolean, down: boolean}}\n\t */\n\tfunction availableRoutes({ includeFragments = false } = {}) {\n\n\t\tlet horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),\n\t\t\tverticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR );\n\n\t\tlet routes = {\n\t\t\tleft: indexh > 0,\n\t\t\tright: indexh < horizontalSlides.length - 1,\n\t\t\tup: indexv > 0,\n\t\t\tdown: indexv < verticalSlides.length - 1\n\t\t};\n\n\t\t// Looped presentations can always be navigated as long as\n\t\t// there are slides available\n\t\tif( config.loop ) {\n\t\t\tif( horizontalSlides.length > 1 ) {\n\t\t\t\troutes.left = true;\n\t\t\t\troutes.right = true;\n\t\t\t}\n\n\t\t\tif( verticalSlides.length > 1 ) {\n\t\t\t\troutes.up = true;\n\t\t\t\troutes.down = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( horizontalSlides.length > 1 && config.navigationMode === 'linear' ) {\n\t\t\troutes.right = routes.right || routes.down;\n\t\t\troutes.left = routes.left || routes.up;\n\t\t}\n\n\t\t// If includeFragments is set, a route will be considered\n\t\t// availalbe if either a slid OR fragment is available in\n\t\t// the given direction\n\t\tif( includeFragments === true ) {\n\t\t\tlet fragmentRoutes = fragments.availableRoutes();\n\t\t\troutes.left = routes.left || fragmentRoutes.prev;\n\t\t\troutes.up = routes.up || fragmentRoutes.prev;\n\t\t\troutes.down = routes.down || fragmentRoutes.next;\n\t\t\troutes.right = routes.right || fragmentRoutes.next;\n\t\t}\n\n\t\t// Reverse horizontal controls for rtl\n\t\tif( config.rtl ) {\n\t\t\tlet left = routes.left;\n\t\t\troutes.left = routes.right;\n\t\t\troutes.right = left;\n\t\t}\n\n\t\treturn routes;\n\n\t}\n\n\t/**\n\t * Returns the number of past slides. This can be used as a global\n\t * flattened index for slides.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide we're counting before\n\t *\n\t * @return {number} Past slide count\n\t */\n\tfunction getSlidePastCount( slide = currentSlide ) {\n\n\t\tlet horizontalSlides = getHorizontalSlides();\n\n\t\t// The number of past slides\n\t\tlet pastCount = 0;\n\n\t\t// Step through all slides and count the past ones\n\t\tmainLoop: for( let i = 0; i < horizontalSlides.length; i++ ) {\n\n\t\t\tlet horizontalSlide = horizontalSlides[i];\n\t\t\tlet verticalSlides = horizontalSlide.querySelectorAll( 'section' );\n\n\t\t\tfor( let j = 0; j < verticalSlides.length; j++ ) {\n\n\t\t\t\t// Stop as soon as we arrive at the present\n\t\t\t\tif( verticalSlides[j] === slide ) {\n\t\t\t\t\tbreak mainLoop;\n\t\t\t\t}\n\n\t\t\t\t// Don't count slides with the \"uncounted\" class\n\t\t\t\tif( verticalSlides[j].dataset.visibility !== 'uncounted' ) {\n\t\t\t\t\tpastCount++;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Stop as soon as we arrive at the present\n\t\t\tif( horizontalSlide === slide ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Don't count the wrapping section for vertical slides and\n\t\t\t// slides marked as uncounted\n\t\t\tif( horizontalSlide.classList.contains( 'stack' ) === false && horizontalSlide.dataset.visibility !== 'uncounted' ) {\n\t\t\t\tpastCount++;\n\t\t\t}\n\n\t\t}\n\n\t\treturn pastCount;\n\n\t}\n\n\t/**\n\t * Returns a value ranging from 0-1 that represents\n\t * how far into the presentation we have navigated.\n\t *\n\t * @return {number}\n\t */\n\tfunction getProgress() {\n\n\t\t// The number of past and total slides\n\t\tlet totalCount = getTotalSlides();\n\t\tlet pastCount = getSlidePastCount();\n\n\t\tif( currentSlide ) {\n\n\t\t\tlet allFragments = currentSlide.querySelectorAll( '.fragment' );\n\n\t\t\t// If there are fragments in the current slide those should be\n\t\t\t// accounted for in the progress.\n\t\t\tif( allFragments.length > 0 ) {\n\t\t\t\tlet visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' );\n\n\t\t\t\t// This value represents how big a portion of the slide progress\n\t\t\t\t// that is made up by its fragments (0-1)\n\t\t\t\tlet fragmentWeight = 0.9;\n\n\t\t\t\t// Add fragment progress to the past slide count\n\t\t\t\tpastCount += ( visibleFragments.length / allFragments.length ) * fragmentWeight;\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.min( pastCount / ( totalCount - 1 ), 1 );\n\n\t}\n\n\t/**\n\t * Retrieves the h/v location and fragment of the current,\n\t * or specified, slide.\n\t *\n\t * @param {HTMLElement} [slide] If specified, the returned\n\t * index will be for this slide rather than the currently\n\t * active one\n\t *\n\t * @return {{h: number, v: number, f: number}}\n\t */\n\tfunction getIndices( slide ) {\n\n\t\t// By default, return the current indices\n\t\tlet h = indexh,\n\t\t\tv = indexv,\n\t\t\tf;\n\n\t\t// If a slide is specified, return the indices of that slide\n\t\tif( slide ) {\n\t\t\tlet isVertical = isVerticalSlide( slide );\n\t\t\tlet slideh = isVertical ? slide.parentNode : slide;\n\n\t\t\t// Select all horizontal slides\n\t\t\tlet horizontalSlides = getHorizontalSlides();\n\n\t\t\t// Now that we know which the horizontal slide is, get its index\n\t\t\th = Math.max( horizontalSlides.indexOf( slideh ), 0 );\n\n\t\t\t// Assume we're not vertical\n\t\t\tv = undefined;\n\n\t\t\t// If this is a vertical slide, grab the vertical index\n\t\t\tif( isVertical ) {\n\t\t\t\tv = Math.max( Util.queryAll( slide.parentNode, 'section' ).indexOf( slide ), 0 );\n\t\t\t}\n\t\t}\n\n\t\tif( !slide && currentSlide ) {\n\t\t\tlet hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0;\n\t\t\tif( hasFragments ) {\n\t\t\t\tlet currentFragment = currentSlide.querySelector( '.current-fragment' );\n\t\t\t\tif( currentFragment && currentFragment.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\t\tf = parseInt( currentFragment.getAttribute( 'data-fragment-index' ), 10 );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tf = currentSlide.querySelectorAll( '.fragment.visible' ).length - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { h, v, f };\n\n\t}\n\n\t/**\n\t * Retrieves all slides in this presentation.\n\t */\n\tfunction getSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, SLIDES_SELECTOR + ':not(.stack):not([data-visibility=\"uncounted\"])' );\n\n\t}\n\n\t/**\n\t * Returns a list of all horizontal slides in the deck. Each\n\t * vertical stack is included as one horizontal slide in the\n\t * resulting array.\n\t */\n\tfunction getHorizontalSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR );\n\n\t}\n\n\t/**\n\t * Returns all vertical slides that exist within this deck.\n\t */\n\tfunction getVerticalSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, '.slides>section>section' );\n\n\t}\n\n\t/**\n\t * Returns all vertical stacks (each stack can contain multiple slides).\n\t */\n\tfunction getVerticalStacks() {\n\n\t\treturn Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.stack');\n\n\t}\n\n\t/**\n\t * Returns true if there are at least two horizontal slides.\n\t */\n\tfunction hasHorizontalSlides() {\n\n\t\treturn getHorizontalSlides().length > 1;\n\t}\n\n\t/**\n\t * Returns true if there are at least two vertical slides.\n\t */\n\tfunction hasVerticalSlides() {\n\n\t\treturn getVerticalSlides().length > 1;\n\n\t}\n\n\t/**\n\t * Returns an array of objects where each object represents the\n\t * attributes on its respective slide.\n\t */\n\tfunction getSlidesAttributes() {\n\n\t\treturn getSlides().map( slide => {\n\n\t\t\tlet attributes = {};\n\t\t\tfor( let i = 0; i < slide.attributes.length; i++ ) {\n\t\t\t\tlet attribute = slide.attributes[ i ];\n\t\t\t\tattributes[ attribute.name ] = attribute.value;\n\t\t\t}\n\t\t\treturn attributes;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Retrieves the total number of slides in this presentation.\n\t *\n\t * @return {number}\n\t */\n\tfunction getTotalSlides() {\n\n\t\treturn getSlides().length;\n\n\t}\n\n\t/**\n\t * Returns the slide element matching the specified index.\n\t *\n\t * @return {HTMLElement}\n\t */\n\tfunction getSlide( x, y ) {\n\n\t\tlet horizontalSlide = getHorizontalSlides()[ x ];\n\t\tlet verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' );\n\n\t\tif( verticalSlides && verticalSlides.length && typeof y === 'number' ) {\n\t\t\treturn verticalSlides ? verticalSlides[ y ] : undefined;\n\t\t}\n\n\t\treturn horizontalSlide;\n\n\t}\n\n\t/**\n\t * Returns the background element for the given slide.\n\t * All slides, even the ones with no background properties\n\t * defined, have a background element so as long as the\n\t * index is valid an element will be returned.\n\t *\n\t * @param {mixed} x Horizontal background index OR a slide\n\t * HTML element\n\t * @param {number} y Vertical background index\n\t * @return {(HTMLElement[]|*)}\n\t */\n\tfunction getSlideBackground( x, y ) {\n\n\t\tlet slide = typeof x === 'number' ? getSlide( x, y ) : x;\n\t\tif( slide ) {\n\t\t\treturn slide.slideBackgroundElement;\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Retrieves the current state of the presentation as\n\t * an object. This state can then be restored at any\n\t * time.\n\t *\n\t * @return {{indexh: number, indexv: number, indexf: number, paused: boolean, overview: boolean}}\n\t */\n\tfunction getState() {\n\n\t\tlet indices = getIndices();\n\n\t\treturn {\n\t\t\tindexh: indices.h,\n\t\t\tindexv: indices.v,\n\t\t\tindexf: indices.f,\n\t\t\tpaused: isPaused(),\n\t\t\toverview: overview.isActive()\n\t\t};\n\n\t}\n\n\t/**\n\t * Restores the presentation to the given state.\n\t *\n\t * @param {object} state As generated by getState()\n\t * @see {@link getState} generates the parameter `state`\n\t */\n\tfunction setState( state ) {\n\n\t\tif( typeof state === 'object' ) {\n\t\t\tslide( Util.deserialize( state.indexh ), Util.deserialize( state.indexv ), Util.deserialize( state.indexf ) );\n\n\t\t\tlet pausedFlag = Util.deserialize( state.paused ),\n\t\t\t\toverviewFlag = Util.deserialize( state.overview );\n\n\t\t\tif( typeof pausedFlag === 'boolean' && pausedFlag !== isPaused() ) {\n\t\t\t\ttogglePause( pausedFlag );\n\t\t\t}\n\n\t\t\tif( typeof overviewFlag === 'boolean' && overviewFlag !== overview.isActive() ) {\n\t\t\t\toverview.toggle( overviewFlag );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Cues a new automated slide if enabled in the config.\n\t */\n\tfunction cueAutoSlide() {\n\n\t\tcancelAutoSlide();\n\n\t\tif( currentSlide && config.autoSlide !== false ) {\n\n\t\t\tlet fragment = currentSlide.querySelector( '.current-fragment' );\n\n\t\t\t// When the slide first appears there is no \"current\" fragment so\n\t\t\t// we look for a data-autoslide timing on the first fragment\n\t\t\tif( !fragment ) fragment = currentSlide.querySelector( '.fragment' );\n\n\t\t\tlet fragmentAutoSlide = fragment ? fragment.getAttribute( 'data-autoslide' ) : null;\n\t\t\tlet parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null;\n\t\t\tlet slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' );\n\n\t\t\t// Pick value in the following priority order:\n\t\t\t// 1. Current fragment's data-autoslide\n\t\t\t// 2. Current slide's data-autoslide\n\t\t\t// 3. Parent slide's data-autoslide\n\t\t\t// 4. Global autoSlide setting\n\t\t\tif( fragmentAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( fragmentAutoSlide, 10 );\n\t\t\t}\n\t\t\telse if( slideAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( slideAutoSlide, 10 );\n\t\t\t}\n\t\t\telse if( parentAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( parentAutoSlide, 10 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tautoSlide = config.autoSlide;\n\n\t\t\t\t// If there are media elements with data-autoplay,\n\t\t\t\t// automatically set the autoSlide duration to the\n\t\t\t\t// length of that media. Not applicable if the slide\n\t\t\t\t// is divided up into fragments.\n\t\t\t\t// playbackRate is accounted for in the duration.\n\t\t\t\tif( currentSlide.querySelectorAll( '.fragment' ).length === 0 ) {\n\t\t\t\t\tUtil.queryAll( currentSlide, 'video, audio' ).forEach( el => {\n\t\t\t\t\t\tif( el.hasAttribute( 'data-autoplay' ) ) {\n\t\t\t\t\t\t\tif( autoSlide && (el.duration * 1000 / el.playbackRate ) > autoSlide ) {\n\t\t\t\t\t\t\t\tautoSlide = ( el.duration * 1000 / el.playbackRate ) + 1000;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Cue the next auto-slide if:\n\t\t\t// - There is an autoSlide value\n\t\t\t// - Auto-sliding isn't paused by the user\n\t\t\t// - The presentation isn't paused\n\t\t\t// - The overview isn't active\n\t\t\t// - The presentation isn't over\n\t\t\tif( autoSlide && !autoSlidePaused && !isPaused() && !overview.isActive() && ( !isLastSlide() || fragments.availableRoutes().next || config.loop === true ) ) {\n\t\t\t\tautoSlideTimeout = setTimeout( () => {\n\t\t\t\t\tif( typeof config.autoSlideMethod === 'function' ) {\n\t\t\t\t\t\tconfig.autoSlideMethod()\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnavigateNext();\n\t\t\t\t\t}\n\t\t\t\t\tcueAutoSlide();\n\t\t\t\t}, autoSlide );\n\t\t\t\tautoSlideStartTime = Date.now();\n\t\t\t}\n\n\t\t\tif( autoSlidePlayer ) {\n\t\t\t\tautoSlidePlayer.setPlaying( autoSlideTimeout !== -1 );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Cancels any ongoing request to auto-slide.\n\t */\n\tfunction cancelAutoSlide() {\n\n\t\tclearTimeout( autoSlideTimeout );\n\t\tautoSlideTimeout = -1;\n\n\t}\n\n\tfunction pauseAutoSlide() {\n\n\t\tif( autoSlide && !autoSlidePaused ) {\n\t\t\tautoSlidePaused = true;\n\t\t\tdispatchEvent({ type: 'autoslidepaused' });\n\t\t\tclearTimeout( autoSlideTimeout );\n\n\t\t\tif( autoSlidePlayer ) {\n\t\t\t\tautoSlidePlayer.setPlaying( false );\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfunction resumeAutoSlide() {\n\n\t\tif( autoSlide && autoSlidePaused ) {\n\t\t\tautoSlidePaused = false;\n\t\t\tdispatchEvent({ type: 'autoslideresumed' });\n\t\t\tcueAutoSlide();\n\t\t}\n\n\t}\n\n\tfunction navigateLeft({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\n\t\t// Reverse for RTL\n\t\tif( config.rtl ) {\n\t\t\tif( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().left ) {\n\t\t\t\tslide( indexh + 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t\t}\n\t\t}\n\t\t// Normal navigation\n\t\telse if( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().left ) {\n\t\t\tslide( indexh - 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t}\n\n\t}\n\n\tfunction navigateRight({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\n\t\t// Reverse for RTL\n\t\tif( config.rtl ) {\n\t\t\tif( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().right ) {\n\t\t\t\tslide( indexh - 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t\t}\n\t\t}\n\t\t// Normal navigation\n\t\telse if( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().right ) {\n\t\t\tslide( indexh + 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t}\n\n\t}\n\n\tfunction navigateUp({skipFragments=false}={}) {\n\n\t\t// Prioritize hiding fragments\n\t\tif( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().up ) {\n\t\t\tslide( indexh, indexv - 1 );\n\t\t}\n\n\t}\n\n\tfunction navigateDown({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedVertically = true;\n\n\t\t// Prioritize revealing fragments\n\t\tif( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().down ) {\n\t\t\tslide( indexh, indexv + 1 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Navigates backwards, prioritized in the following order:\n\t * 1) Previous fragment\n\t * 2) Previous vertical slide\n\t * 3) Previous horizontal slide\n\t */\n\tfunction navigatePrev({skipFragments=false}={}) {\n\n\t\t// Prioritize revealing fragments\n\t\tif( skipFragments || fragments.prev() === false ) {\n\t\t\tif( availableRoutes().up ) {\n\t\t\t\tnavigateUp({skipFragments});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Fetch the previous horizontal slide, if there is one\n\t\t\t\tlet previousSlide;\n\n\t\t\t\tif( config.rtl ) {\n\t\t\t\t\tpreviousSlide = Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.future' ).pop();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tpreviousSlide = Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.past' ).pop();\n\t\t\t\t}\n\n\t\t\t\t// When going backwards and arriving on a stack we start\n\t\t\t\t// at the bottom of the stack\n\t\t\t\tif( previousSlide && previousSlide.classList.contains( 'stack' ) ) {\n\t\t\t\t\tlet v = ( previousSlide.querySelectorAll( 'section' ).length - 1 ) || undefined;\n\t\t\t\t\tlet h = indexh - 1;\n\t\t\t\t\tslide( h, v );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnavigateLeft({skipFragments});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * The reverse of #navigatePrev().\n\t */\n\tfunction navigateNext({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\t\tnavigationHistory.hasNavigatedVertically = true;\n\n\t\t// Prioritize revealing fragments\n\t\tif( skipFragments || fragments.next() === false ) {\n\n\t\t\tlet routes = availableRoutes();\n\n\t\t\t// When looping is enabled `routes.down` is always available\n\t\t\t// so we need a separate check for when we've reached the\n\t\t\t// end of a stack and should move horizontally\n\t\t\tif( routes.down && routes.right && config.loop && isLastVerticalSlide() ) {\n\t\t\t\troutes.down = false;\n\t\t\t}\n\n\t\t\tif( routes.down ) {\n\t\t\t\tnavigateDown({skipFragments});\n\t\t\t}\n\t\t\telse if( config.rtl ) {\n\t\t\t\tnavigateLeft({skipFragments});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnavigateRight({skipFragments});\n\t\t\t}\n\t\t}\n\n\t}\n\n\n\t// --------------------------------------------------------------------//\n\t// ----------------------------- EVENTS -------------------------------//\n\t// --------------------------------------------------------------------//\n\n\t/**\n\t * Called by all event handlers that are based on user\n\t * input.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onUserInput( event ) {\n\n\t\tif( config.autoSlideStoppable ) {\n\t\t\tpauseAutoSlide();\n\t\t}\n\n\t}\n\n\t/**\n\t* Listener for post message events posted to this window.\n\t*/\n\tfunction onPostMessage( event ) {\n\n\t\tlet data = event.data;\n\n\t\t// Make sure we're dealing with JSON\n\t\tif( typeof data === 'string' && data.charAt( 0 ) === '{' && data.charAt( data.length - 1 ) === '}' ) {\n\t\t\tdata = JSON.parse( data );\n\n\t\t\t// Check if the requested method can be found\n\t\t\tif( data.method && typeof Reveal[data.method] === 'function' ) {\n\n\t\t\t\tif( POST_MESSAGE_METHOD_BLACKLIST.test( data.method ) === false ) {\n\n\t\t\t\t\tconst result = Reveal[data.method].apply( Reveal, data.args );\n\n\t\t\t\t\t// Dispatch a postMessage event with the returned value from\n\t\t\t\t\t// our method invocation for getter functions\n\t\t\t\t\tdispatchPostMessage( 'callback', { method: data.method, result: result } );\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.warn( 'reveal.js: \"'+ data.method +'\" is is blacklisted from the postMessage API' );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Event listener for transition end on the current slide.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onTransitionEnd( event ) {\n\n\t\tif( transition === 'running' && /section/gi.test( event.target.nodeName ) ) {\n\t\t\ttransition = 'idle';\n\t\t\tdispatchEvent({\n\t\t\t\ttype: 'slidetransitionend',\n\t\t\t\tdata: { indexh, indexv, previousSlide, currentSlide }\n\t\t\t});\n\t\t}\n\n\t}\n\n\t/**\n\t * A global listener for all click events inside of the\n\t * .slides container.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onSlidesClicked( event ) {\n\n\t\tconst anchor = Util.closest( event.target, 'a[href^=\"#\"]' );\n\n\t\t// If a hash link is clicked, we find the target slide\n\t\t// and navigate to it. We previously relied on 'hashchange'\n\t\t// for links like these but that prevented media with\n\t\t// audio tracks from playing in mobile browsers since it\n\t\t// wasn't considered a direct interaction with the document.\n\t\tif( anchor ) {\n\t\t\tconst hash = anchor.getAttribute( 'href' );\n\t\t\tconst indices = location.getIndicesFromHash( hash );\n\n\t\t\tif( indices ) {\n\t\t\t\tReveal.slide( indices.h, indices.v, indices.f );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the window level 'resize' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onWindowResize( event ) {\n\n\t\tlayout();\n\n\t}\n\n\t/**\n\t * Handle for the window level 'visibilitychange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onPageVisibilityChange( event ) {\n\n\t\t// If, after clicking a link or similar and we're coming back,\n\t\t// focus the document.body to ensure we can use keyboard shortcuts\n\t\tif( document.hidden === false && document.activeElement !== document.body ) {\n\t\t\t// Not all elements support .blur() - SVGs among them.\n\t\t\tif( typeof document.activeElement.blur === 'function' ) {\n\t\t\t\tdocument.activeElement.blur();\n\t\t\t}\n\t\t\tdocument.body.focus();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the document level 'fullscreenchange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onFullscreenChange( event ) {\n\n\t\tlet element = document.fullscreenElement || document.webkitFullscreenElement;\n\t\tif( element === dom.wrapper ) {\n\t\t\tevent.stopImmediatePropagation();\n\n\t\t\t// Timeout to avoid layout shift in Safari\n\t\t\tsetTimeout( () => {\n\t\t\t\tReveal.layout();\n\t\t\t\tReveal.focus.focus(); // focus.focus :'(\n\t\t\t}, 1 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Handles clicks on links that are set to preview in the\n\t * iframe overlay.\n\t *\n\t * @param {object} event\n\t */\n\tfunction onPreviewLinkClicked( event ) {\n\n\t\tif( event.currentTarget && event.currentTarget.hasAttribute( 'href' ) ) {\n\t\t\tlet url = event.currentTarget.getAttribute( 'href' );\n\t\t\tif( url ) {\n\t\t\t\tshowPreview( url );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Handles click on the auto-sliding controls element.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onAutoSlidePlayerClick( event ) {\n\n\t\t// Replay\n\t\tif( isLastSlide() && config.loop === false ) {\n\t\t\tslide( 0, 0 );\n\t\t\tresumeAutoSlide();\n\t\t}\n\t\t// Resume\n\t\telse if( autoSlidePaused ) {\n\t\t\tresumeAutoSlide();\n\t\t}\n\t\t// Pause\n\t\telse {\n\t\t\tpauseAutoSlide();\n\t\t}\n\n\t}\n\n\n\t// --------------------------------------------------------------------//\n\t// ------------------------------- API --------------------------------//\n\t// --------------------------------------------------------------------//\n\n\t// The public reveal.js API\n\tconst API = {\n\t\tVERSION,\n\n\t\tinitialize,\n\t\tconfigure,\n\t\tdestroy,\n\n\t\tsync,\n\t\tsyncSlide,\n\t\tsyncFragments: fragments.sync.bind( fragments ),\n\n\t\t// Navigation methods\n\t\tslide,\n\t\tleft: navigateLeft,\n\t\tright: navigateRight,\n\t\tup: navigateUp,\n\t\tdown: navigateDown,\n\t\tprev: navigatePrev,\n\t\tnext: navigateNext,\n\n\t\t// Navigation aliases\n\t\tnavigateLeft, navigateRight, navigateUp, navigateDown, navigatePrev, navigateNext,\n\n\t\t// Fragment methods\n\t\tnavigateFragment: fragments.goto.bind( fragments ),\n\t\tprevFragment: fragments.prev.bind( fragments ),\n\t\tnextFragment: fragments.next.bind( fragments ),\n\n\t\t// Event binding\n\t\ton,\n\t\toff,\n\n\t\t// Legacy event binding methods left in for backwards compatibility\n\t\taddEventListener: on,\n\t\tremoveEventListener: off,\n\n\t\t// Forces an update in slide layout\n\t\tlayout,\n\n\t\t// Randomizes the order of slides\n\t\tshuffle,\n\n\t\t// Returns an object with the available routes as booleans (left/right/top/bottom)\n\t\tavailableRoutes,\n\n\t\t// Returns an object with the available fragments as booleans (prev/next)\n\t\tavailableFragments: fragments.availableRoutes.bind( fragments ),\n\n\t\t// Toggles a help overlay with keyboard shortcuts\n\t\ttoggleHelp,\n\n\t\t// Toggles the overview mode on/off\n\t\ttoggleOverview: overview.toggle.bind( overview ),\n\n\t\t// Toggles the \"black screen\" mode on/off\n\t\ttogglePause,\n\n\t\t// Toggles the auto slide mode on/off\n\t\ttoggleAutoSlide,\n\n\t\t// Slide navigation checks\n\t\tisFirstSlide,\n\t\tisLastSlide,\n\t\tisLastVerticalSlide,\n\t\tisVerticalSlide,\n\n\t\t// State checks\n\t\tisPaused,\n\t\tisAutoSliding,\n\t\tisSpeakerNotes: notes.isSpeakerNotesWindow.bind( notes ),\n\t\tisOverview: overview.isActive.bind( overview ),\n\t\tisFocused: focus.isFocused.bind( focus ),\n\t\tisPrintingPDF: print.isPrintingPDF.bind( print ),\n\n\t\t// Checks if reveal.js has been loaded and is ready for use\n\t\tisReady: () => ready,\n\n\t\t// Slide preloading\n\t\tloadSlide: slideContent.load.bind( slideContent ),\n\t\tunloadSlide: slideContent.unload.bind( slideContent ),\n\n\t\t// Preview management\n\t\tshowPreview,\n\t\thidePreview: closeOverlay,\n\n\t\t// Adds or removes all internal event listeners\n\t\taddEventListeners,\n\t\tremoveEventListeners,\n\t\tdispatchEvent,\n\n\t\t// Facility for persisting and restoring the presentation state\n\t\tgetState,\n\t\tsetState,\n\n\t\t// Presentation progress on range of 0-1\n\t\tgetProgress,\n\n\t\t// Returns the indices of the current, or specified, slide\n\t\tgetIndices,\n\n\t\t// Returns an Array of key:value maps of the attributes of each\n\t\t// slide in the deck\n\t\tgetSlidesAttributes,\n\n\t\t// Returns the number of slides that we have passed\n\t\tgetSlidePastCount,\n\n\t\t// Returns the total number of slides\n\t\tgetTotalSlides,\n\n\t\t// Returns the slide element at the specified index\n\t\tgetSlide,\n\n\t\t// Returns the previous slide element, may be null\n\t\tgetPreviousSlide: () => previousSlide,\n\n\t\t// Returns the current slide element\n\t\tgetCurrentSlide: () => currentSlide,\n\n\t\t// Returns the slide background element at the specified index\n\t\tgetSlideBackground,\n\n\t\t// Returns the speaker notes string for a slide, or null\n\t\tgetSlideNotes: notes.getSlideNotes.bind( notes ),\n\n\t\t// Returns an Array of all slides\n\t\tgetSlides,\n\n\t\t// Returns an array with all horizontal/vertical slides in the deck\n\t\tgetHorizontalSlides,\n\t\tgetVerticalSlides,\n\n\t\t// Checks if the presentation contains two or more horizontal\n\t\t// and vertical slides\n\t\thasHorizontalSlides,\n\t\thasVerticalSlides,\n\n\t\t// Checks if the deck has navigated on either axis at least once\n\t\thasNavigatedHorizontally: () => navigationHistory.hasNavigatedHorizontally,\n\t\thasNavigatedVertically: () => navigationHistory.hasNavigatedVertically,\n\n\t\t// Adds/removes a custom key binding\n\t\taddKeyBinding: keyboard.addKeyBinding.bind( keyboard ),\n\t\tremoveKeyBinding: keyboard.removeKeyBinding.bind( keyboard ),\n\n\t\t// Programmatically triggers a keyboard event\n\t\ttriggerKey: keyboard.triggerKey.bind( keyboard ),\n\n\t\t// Registers a new shortcut to include in the help overlay\n\t\tregisterKeyboardShortcut: keyboard.registerKeyboardShortcut.bind( keyboard ),\n\n\t\tgetComputedSlideSize,\n\n\t\t// Returns the current scale of the presentation content\n\t\tgetScale: () => scale,\n\n\t\t// Returns the current configuration object\n\t\tgetConfig: () => config,\n\n\t\t// Helper method, retrieves query string as a key:value map\n\t\tgetQueryHash: Util.getQueryHash,\n\n\t\t// Returns the path to the current slide as represented in the URL\n\t\tgetSlidePath: location.getHash.bind( location ),\n\n\t\t// Returns reveal.js DOM elements\n\t\tgetRevealElement: () => revealElement,\n\t\tgetSlidesElement: () => dom.slides,\n\t\tgetViewportElement: () => dom.viewport,\n\t\tgetBackgroundsElement: () => backgrounds.element,\n\n\t\t// API for registering and retrieving plugins\n\t\tregisterPlugin: plugins.registerPlugin.bind( plugins ),\n\t\thasPlugin: plugins.hasPlugin.bind( plugins ),\n\t\tgetPlugin: plugins.getPlugin.bind( plugins ),\n\t\tgetPlugins: plugins.getRegisteredPlugins.bind( plugins )\n\n\t};\n\n\t// Our internal API which controllers have access to\n\tUtil.extend( Reveal, {\n\t\t...API,\n\n\t\t// Methods for announcing content to screen readers\n\t\tannounceStatus,\n\t\tgetStatusText,\n\n\t\t// Controllers\n\t\tprint,\n\t\tfocus,\n\t\tprogress,\n\t\tcontrols,\n\t\tlocation,\n\t\toverview,\n\t\tfragments,\n\t\tslideContent,\n\t\tslideNumber,\n\n\t\tonUserInput,\n\t\tcloseOverlay,\n\t\tupdateSlidesVisibility,\n\t\tlayoutSlideContents,\n\t\ttransformSlides,\n\t\tcueAutoSlide,\n\t\tcancelAutoSlide\n\t} );\n\n\treturn API;\n\n};\n","import Deck, { VERSION } from './reveal.js'\n\n/**\n * Expose the Reveal class to the window. To create a\n * new instance:\n * let deck = new Reveal( document.querySelector( '.reveal' ), {\n * controls: false\n * } );\n * deck.initialize().then(() => {\n * // reveal.js is ready\n * });\n */\nlet Reveal = Deck;\n\n\n/**\n * The below is a thin shell that mimics the pre 4.0\n * reveal.js API and ensures backwards compatibility.\n * This API only allows for one Reveal instance per\n * page, whereas the new API above lets you run many\n * presentations on the same page.\n *\n * Reveal.initialize( { controls: false } ).then(() => {\n * // reveal.js is ready\n * });\n */\n\nlet enqueuedAPICalls = [];\n\nReveal.initialize = options => {\n\n\t// Create our singleton reveal.js instance\n\tObject.assign( Reveal, new Deck( document.querySelector( '.reveal' ), options ) );\n\n\t// Invoke any enqueued API calls\n\tenqueuedAPICalls.map( method => method( Reveal ) );\n\n\treturn Reveal.initialize();\n\n}\n\n/**\n * The pre 4.0 API let you add event listener before\n * initializing. We maintain the same behavior by\n * queuing up premature API calls and invoking all\n * of them when Reveal.initialize is called.\n */\n[ 'configure', 'on', 'off', 'addEventListener', 'removeEventListener', 'registerPlugin' ].forEach( method => {\n\tReveal[method] = ( ...args ) => {\n\t\tenqueuedAPICalls.push( deck => deck[method].call( null, ...args ) );\n\t}\n} );\n\nReveal.isReady = () => false;\n\nReveal.VERSION = VERSION;\n\nexport default Reveal;"],"names":["extend","a","b","i","queryAll","el","selector","Array","from","querySelectorAll","toggleClass","className","value","classList","add","remove","deserialize","match","parseFloat","transformElement","element","transform","style","matches","target","matchesMethod","matchesSelector","msMatchesSelector","call","closest","parentNode","createSingletonNode","container","tagname","classname","innerHTML","nodes","length","testNode","node","document","createElement","appendChild","createStyleSheet","tag","type","styleSheet","cssText","createTextNode","head","getQueryHash","query","location","search","replace","split","shift","pop","unescape","getRemainingHeight","height","newHeight","oldHeight","offsetHeight","removeProperty","fileExtensionToMimeMap","UA","navigator","userAgent","isMobile","test","platform","maxTouchPoints","isAndroid","Object","defineProperty","fitty_module","_extends","assign","arguments","source","key","prototype","hasOwnProperty","w","toArray","nl","slice","DrawState","fitties","redrawFrame","requestRedraw","cancelAnimationFrame","requestAnimationFrame","redraw","filter","f","dirty","active","redrawAll","forEach","styleComputed","computeStyle","shouldPreStyle","applyStyle","fittiesToRedraw","shouldRedraw","calculateStyles","markAsClean","dispatchFitEvent","availableWidth","clientWidth","currentWidth","scrollWidth","previousFontSize","currentFontSize","Math","min","max","minSize","maxSize","whiteSpace","multiLine","getComputedStyle","getPropertyValue","display","preStyle","preStyleTestCompleted","fontSize","dispatchEvent","CustomEvent","detail","oldValue","newValue","scaleFactor","fit","destroy","_","observeMutations","observer","disconnect","originalStyle","subscribe","unsubscribe","MutationObserver","observe","defaultOptions","subtree","childList","characterData","resizeDebounce","onWindowResized","clearTimeout","setTimeout","fitty","observeWindowDelay","events","set","enabled","method","e","observeWindow","fitAll","fittyCreate","elements","options","fittyOptions","publicFitties","map","newbie","push","init","unfreeze","freeze","undefined","window","SlideContent","constructor","Reveal","startEmbeddedIframe","this","bind","shouldPreload","preload","getConfig","preloadIframes","hasAttribute","load","slide","tagName","setAttribute","getAttribute","removeAttribute","media","sources","background","slideBackgroundElement","backgroundContent","slideBackgroundContentElement","backgroundIframe","backgroundImage","backgroundVideo","backgroundVideoLoop","backgroundVideoMuted","trim","encodeURI","join","isSpeakerNotes","video","muted","filename","getMimeTypeFromFile","excludeIframes","iframe","width","maxHeight","maxWidth","backgroundIframeElement","querySelector","layout","scopeElement","unload","getSlideBackground","formatEmbeddedContent","_appendParamToIframeSource","sourceAttribute","sourceURL","param","getSlidesElement","src","indexOf","startEmbeddedContent","autoplay","autoPlayMedia","play","readyState","startEmbeddedMedia","promise","catch","controls","addEventListener","removeEventListener","event","isAttachedToDOM","isVisible","currentTime","contentWindow","postMessage","stopEmbeddedContent","unloadIframes","pause","SlideNumber","render","getRevealElement","configure","config","oldConfig","slideNumberDisplay","slideNumber","isPrintingPDF","showSlideNumber","update","getSlideNumber","getCurrentSlide","format","getHorizontalSlides","horizontalOffset","dataset","visibility","getSlidePastCount","getTotalSlides","indices","getIndices","h","sep","isVerticalSlide","v","url","getHash","formatNumber","delimiter","isNaN","colorToRgb","color","hex3","r","parseInt","charAt","g","hex6","rgb","rgba","Backgrounds","create","slideh","backgroundStack","createBackground","slidev","parallaxBackgroundImage","backgroundSize","parallaxBackgroundSize","backgroundRepeat","parallaxBackgroundRepeat","backgroundPosition","parallaxBackgroundPosition","contentElement","sync","data","backgroundColor","backgroundGradient","backgroundTransition","backgroundOpacity","dataPreload","opacity","contrastColor","computedBackgroundStyle","includeAll","currentSlide","currentBackground","horizontalPast","rtl","horizontalFuture","childNodes","backgroundh","backgroundv","previousBackground","slideContent","currentBackgroundContent","backgroundImageURL","previousBackgroundHash","currentBackgroundHash","classToBubble","contains","updateParallax","backgroundWidth","backgroundHeight","horizontalSlides","verticalSlides","getVerticalSlides","horizontalOffsetMultiplier","slideWidth","offsetWidth","horizontalSlideCount","parallaxBackgroundHorizontal","verticalOffsetMultiplier","verticalOffset","slideHeight","verticalSlideCount","parallaxBackgroundVertical","POST_MESSAGE_METHOD_BLACKLIST","FRAGMENT_STYLE_REGEX","autoAnimateCounter","AutoAnimate","run","fromSlide","toSlide","reset","allSlides","getSlides","toSlideIndex","fromSlideIndex","autoAnimateStyleSheet","animationOptions","getAutoAnimateOptions","autoAnimate","slideDirection","fromSlideIsHidden","css","getAutoAnimatableElements","autoAnimateElements","to","autoAnimateUnmatched","defaultUnmatchedDuration","duration","defaultUnmatchedDelay","getUnmatchedAutoAnimateElements","unmatchedElement","unmatchedOptions","id","delay","autoAnimateTarget","fontWeight","sheet","removeChild","elementOptions","easing","fromProps","getAutoAnimatableProperties","toProps","styles","translate","scale","presentationScale","getScale","delta","x","y","scaleX","scaleY","round","propertyName","toValue","fromValue","explicitValue","toStyleProperties","keys","inheritedOptions","autoAnimateEasing","autoAnimateDuration","autoAnimatedParent","autoAnimateDelay","direction","properties","bounds","measure","center","getBoundingClientRect","offsetLeft","offsetTop","computedStyles","autoAnimateStyles","property","pairs","autoAnimateMatcher","getAutoAnimatePairs","reserved","pair","index","textNodes","findAutoAnimateMatches","nodeName","innerText","textContent","getLocalBoundingBox","fromScope","toScope","serializer","fromMatches","toMatches","fromElement","pimaryIndex","secondaryIndex","rootElement","children","reduce","result","containsAnimatedElements","concat","Fragments","fragments","disable","enable","availableRoutes","hiddenFragments","prev","next","sort","grouped","ordered","unordered","sorted","fragment","group","sortAll","horizontalSlide","verticalSlide","changedFragments","shown","hidden","maxIndex","currentFragment","wasVisible","announceStatus","getStatusText","bubbles","goto","offset","lastVisibleFragment","progress","fragmentInURL","writeURL","Overview","onSlideClicked","activate","overview","isActive","cancelAutoSlide","getBackgroundsElement","margin","slideSize","getComputedSlideSize","overviewSlideWidth","overviewSlideHeight","updateSlidesVisibility","hslide","vslide","hbackground","vbackground","vmin","innerWidth","innerHeight","transformSlides","deactivate","cueAutoSlide","toggle","override","preventDefault","Keyboard","shortcuts","bindings","onDocumentKeyDown","onDocumentKeyPress","navigationMode","unbind","addKeyBinding","binding","callback","keyCode","description","removeKeyBinding","triggerKey","registerKeyboardShortcut","getShortcuts","getBindings","shiftKey","charCode","toggleHelp","keyboardCondition","isFocused","autoSlideWasPaused","isAutoSliding","onUserInput","activeElementIsCE","activeElement","isContentEditable","activeElementIsInput","activeElementIsNotes","unusedModifier","altKey","ctrlKey","metaKey","resumeKeyCodes","keyboard","isPaused","useLinearMode","hasHorizontalSlides","hasVerticalSlides","triggered","apply","action","skipFragments","left","right","up","Number","MAX_VALUE","down","togglePause","requestMethod","documentElement","requestFullscreen","webkitRequestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","enterFullscreen","embedded","getViewportElement","autoSlideStoppable","toggleAutoSlide","closeOverlay","Location","writeURLTimeout","replaceStateTimestamp","onWindowHashChange","getIndicesFromHash","hash","name","bits","hashIndexBase","hashOneBasedIndex","getElementById","decodeURIComponent","error","readURL","currentIndices","newIndices","history","debouncedReplaceState","pathname","replaceState","Date","now","replaceStateTimeout","MAX_REPLACE_STATE_FREQUENCY","s","encodeURIComponent","Controls","onNavigateLeftClicked","onNavigateRightClicked","onNavigateUpClicked","onNavigateDownClicked","onNavigatePrevClicked","onNavigateNextClicked","revealElement","controlsLeft","controlsRight","controlsUp","controlsDown","controlsPrev","controlsNext","controlsRightArrow","controlsLeftArrow","controlsDownArrow","controlsLayout","controlsBackArrows","pointerEvents","eventName","routes","fragmentsRoutes","controlsTutorial","hasNavigatedVertically","hasNavigatedHorizontally","Progress","onProgressClicked","bar","getProgress","getMaxWidth","slides","slidesTotal","slideIndex","floor","clientX","targetIndices","Pointer","lastMouseWheelStep","cursorHidden","cursorInactiveTimeout","onDocumentCursorActive","onDocumentMouseScroll","mouseWheel","hideInactiveCursor","showCursor","cursor","hideCursor","hideCursorTime","wheelDelta","loadScript","script","async","defer","onload","onreadystatechange","onerror","err","Error","insertBefore","lastChild","Plugins","reveal","state","registeredPlugins","asyncDependencies","plugins","dependencies","registerPlugin","Promise","resolve","scripts","scriptsToLoad","condition","scriptLoadedCallback","initPlugins","then","console","warn","pluginValues","values","pluginsToInitialize","loadAsync","initNextPlugin","afterPlugInitialized","plugin","hasPlugin","getPlugin","getRegisteredPlugins","Print","injectPageNumbers","pageWidth","pageHeight","body","viewportElement","presentationBackground","viewportStyles","layoutSlideContents","slideScrollHeights","scrollHeight","pages","pageContainer","top","contentHeight","numberOfPages","ceil","pdfMaxPagesPerSlide","page","pdfPageHeightOffset","showNotes","notes","getSlideNotes","notesSpacing","notesLayout","notesElement","bottom","numberElement","pdfSeparateFragments","fragmentGroups","previousFragmentStep","clonedPage","cloneNode","fragmentNumber","Touch","touchStartX","touchStartY","touchStartCount","touchCaptured","onPointerDown","onPointerMove","onPointerUp","onTouchStart","onTouchMove","onTouchEnd","msPointerEnabled","isSwipePrevented","touches","clientY","currentX","currentY","includeFragments","deltaX","deltaY","abs","pointerType","MSPOINTER_TYPE_TOUCH","Focus","onRevealPointerDown","onDocumentPointerDown","blur","focus","Notes","print","updateVisibility","hasNotes","isSpeakerNotesWindow","Playback","progressCheck","diameter","diameter2","thickness","playing","progressOffset","canvas","context","getContext","setPlaying","wasPlaying","animate","progressBefore","radius","iconSize","endAngle","PI","startAngle","save","clearRect","beginPath","arc","fillStyle","fill","lineWidth","strokeStyle","stroke","fillRect","moveTo","lineTo","restore","on","listener","off","minScale","maxScale","respondToHashChanges","disableLayout","touch","loop","shuffle","help","showHiddenSlides","autoSlide","autoSlideMethod","defaultTiming","previewLinks","postMessageEvents","focusBodyOnPageVisibilityChange","transition","transitionSpeed","POSITIVE_INFINITY","viewDistance","mobileViewDistance","indexh","indexv","previousSlide","autoSlidePlayer","ready","navigationHistory","slidesTransform","dom","autoSlideTimeout","autoSlideStartTime","autoSlidePaused","backgrounds","pointer","initialize","initOptions","wrapper","defaultConfig","Util","setViewport","start","viewport","removeHiddenSlides","setupDOM","setupPostMessage","setupScrollPrevention","setupFullscreen","resetVerticalSlides","removeEventListeners","setupPDF","Device","pauseOverlay","statusElement","createStatusElement","position","overflow","clip","text","nodeType","isAriaHidden","isDisplayHidden","child","setInterval","scrollTop","scrollLeft","onFullscreenChange","onPostMessage","isReady","numberOfSlides","setProperty","resume","enablePreviewLinks","disablePreviewLinks","onAutoSlidePlayerClick","addEventListeners","onWindowResize","onSlidesClicked","onTransitionEnd","onPageVisibilityChange","useCapture","transforms","createEvent","initEvent","dispatchPostMessage","parent","self","message","namespace","getState","JSON","stringify","onPreviewLinkClicked","showPreview","overlay","showHelp","html","size","oldScale","presentationWidth","presentationHeight","zoom","len","remainingHeight","nw","naturalWidth","videoWidth","nh","naturalHeight","videoHeight","es","setPreviousVerticalIndex","stack","getPreviousVerticalIndex","attributeName","isLastVerticalSlide","nextElementSibling","isFirstSlide","isLastSlide","wasPaused","resumeAutoSlide","pauseAutoSlide","origin","defaultPrevented","stateBefore","indexhBefore","indexvBefore","updateSlides","slideChanged","currentHorizontalSlide","currentVerticalSlides","autoAnimateTransition","getVerticalStacks","stateLoop","j","splice","syncSlide","beforeSlide","random","slidesLength","printMode","loopedForwards","loopedBackwards","reverse","showFragmentsIn","hideFragmentsIn","wasPresent","slideState","distanceX","distanceY","horizontalSlidesLength","verticalSlidesLength","oy","fragmentRoutes","pastCount","mainLoop","totalCount","allFragments","fragmentWeight","isVertical","SLIDES_SELECTOR","HORIZONTAL_SLIDES_SELECTOR","getSlidesAttributes","attributes","attribute","getSlide","indexf","paused","setState","pausedFlag","overviewFlag","fragmentAutoSlide","parentAutoSlide","slideAutoSlide","playbackRate","navigateNext","navigateLeft","navigateRight","navigateUp","navigateDown","navigatePrev","parse","args","anchor","fullscreenElement","webkitFullscreenElement","stopImmediatePropagation","currentTarget","API","VERSION","syncFragments","navigateFragment","prevFragment","nextFragment","availableFragments","toggleOverview","isOverview","loadSlide","unloadSlide","hidePreview","getPreviousSlide","getSlidePath","getPlugins","Deck","enqueuedAPICalls","deck"],"mappings":"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"}
\ No newline at end of file
diff --git a/mstreams/presentation/dist/reveal.js b/mstreams/presentation/dist/reveal.js
new file mode 100644
index 0000000..4dd6851
--- /dev/null
+++ b/mstreams/presentation/dist/reveal.js
@@ -0,0 +1,9 @@
+/*!
+* reveal.js 4.3.1
+* https://revealjs.com
+* MIT licensed
+*
+* Copyright (C) 2011-2022 Hakim El Hattab, https://hakim.se
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Reveal=t()}(this,(function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},t=function(e){return e&&e.Math==Math&&e},n=t("object"==typeof globalThis&&globalThis)||t("object"==typeof window&&window)||t("object"==typeof self&&self)||t("object"==typeof e&&e)||function(){return this}()||Function("return this")(),i={},r=function(e){try{return!!e()}catch(e){return!0}},a=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),o={},s={}.propertyIsEnumerable,l=Object.getOwnPropertyDescriptor,c=l&&!s.call({1:2},1);o.f=c?function(e){var t=l(this,e);return!!t&&t.enumerable}:s;var u=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},d={}.toString,h=function(e){return d.call(e).slice(8,-1)},f=h,v="".split,p=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?v.call(e,""):Object(e)}:Object,g=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},m=p,y=g,b=function(e){return m(y(e))},w=function(e){return"object"==typeof e?null!==e:"function"==typeof e},S=w,E=function(e,t){if(!S(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!S(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!S(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!S(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},k=g,A=function(e){return Object(k(e))},R=A,x={}.hasOwnProperty,L=function(e,t){return x.call(R(e),t)},P=w,C=n.document,N=P(C)&&P(C.createElement),M=function(e){return N?C.createElement(e):{}},I=M,T=!a&&!r((function(){return 7!=Object.defineProperty(I("div"),"a",{get:function(){return 7}}).a})),O=a,D=o,j=u,F=b,z=E,H=L,U=T,_=Object.getOwnPropertyDescriptor;i.f=O?_:function(e,t){if(e=F(e),t=z(t,!0),U)try{return _(e,t)}catch(e){}if(H(e,t))return j(!D.f.call(e,t),e[t])};var B={},q=w,W=function(e){if(!q(e))throw TypeError(String(e)+" is not an object");return e},V=a,K=T,Y=W,X=E,G=Object.defineProperty;B.f=V?G:function(e,t,n){if(Y(e),t=X(t,!0),Y(n),K)try{return G(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e};var $=B,J=u,Q=a?function(e,t,n){return $.f(e,t,J(1,n))}:function(e,t,n){return e[t]=n,e},Z={exports:{}},ee=n,te=Q,ne=function(e,t){try{te(ee,e,t)}catch(n){ee[e]=t}return t},ie=ne,re="__core-js_shared__",ae=n[re]||ie(re,{}),oe=ae,se=Function.toString;"function"!=typeof oe.inspectSource&&(oe.inspectSource=function(e){return se.call(e)});var le=oe.inspectSource,ce=le,ue=n.WeakMap,de="function"==typeof ue&&/native code/.test(ce(ue)),he={exports:{}},fe=ae;(he.exports=function(e,t){return fe[e]||(fe[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.12.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"});var ve,pe,ge,me=0,ye=Math.random(),be=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++me+ye).toString(36)},we=he.exports,Se=be,Ee=we("keys"),ke=function(e){return Ee[e]||(Ee[e]=Se(e))},Ae={},Re=de,xe=w,Le=Q,Pe=L,Ce=ae,Ne=ke,Me=Ae,Ie="Object already initialized",Te=n.WeakMap;if(Re||Ce.state){var Oe=Ce.state||(Ce.state=new Te),De=Oe.get,je=Oe.has,Fe=Oe.set;ve=function(e,t){if(je.call(Oe,e))throw new TypeError(Ie);return t.facade=e,Fe.call(Oe,e,t),t},pe=function(e){return De.call(Oe,e)||{}},ge=function(e){return je.call(Oe,e)}}else{var ze=Ne("state");Me[ze]=!0,ve=function(e,t){if(Pe(e,ze))throw new TypeError(Ie);return t.facade=e,Le(e,ze,t),t},pe=function(e){return Pe(e,ze)?e[ze]:{}},ge=function(e){return Pe(e,ze)}}var He={set:ve,get:pe,has:ge,enforce:function(e){return ge(e)?pe(e):ve(e,{})},getterFor:function(e){return function(t){var n;if(!xe(t)||(n=pe(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Ue=n,_e=Q,Be=L,qe=ne,We=le,Ve=He.get,Ke=He.enforce,Ye=String(String).split("String");(Z.exports=function(e,t,n,i){var r,a=!!i&&!!i.unsafe,o=!!i&&!!i.enumerable,s=!!i&&!!i.noTargetGet;"function"==typeof n&&("string"!=typeof t||Be(n,"name")||_e(n,"name",t),(r=Ke(n)).source||(r.source=Ye.join("string"==typeof t?t:""))),e!==Ue?(a?!s&&e[t]&&(o=!0):delete e[t],o?e[t]=n:_e(e,t,n)):o?e[t]=n:qe(t,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&Ve(this).source||We(this)}));var Xe=n,Ge=Xe,$e=n,Je=function(e){return"function"==typeof e?e:void 0},Qe=function(e,t){return arguments.length<2?Je(Ge[e])||Je($e[e]):Ge[e]&&Ge[e][t]||$e[e]&&$e[e][t]},Ze={},et=Math.ceil,tt=Math.floor,nt=function(e){return isNaN(e=+e)?0:(e>0?tt:et)(e)},it=nt,rt=Math.min,at=function(e){return e>0?rt(it(e),9007199254740991):0},ot=nt,st=Math.max,lt=Math.min,ct=function(e,t){var n=ot(e);return n<0?st(n+t,0):lt(n,t)},ut=b,dt=at,ht=ct,ft=function(e){return function(t,n,i){var r,a=ut(t),o=dt(a.length),s=ht(i,o);if(e&&n!=n){for(;o>s;)if((r=a[s++])!=r)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===n)return e||s||0;return!e&&-1}},vt={includes:ft(!0),indexOf:ft(!1)},pt=L,gt=b,mt=vt.indexOf,yt=Ae,bt=function(e,t){var n,i=gt(e),r=0,a=[];for(n in i)!pt(yt,n)&&pt(i,n)&&a.push(n);for(;t.length>r;)pt(i,n=t[r++])&&(~mt(a,n)||a.push(n));return a},wt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],St=bt,Et=wt.concat("length","prototype");Ze.f=Object.getOwnPropertyNames||function(e){return St(e,Et)};var kt={};kt.f=Object.getOwnPropertySymbols;var At=Ze,Rt=kt,xt=W,Lt=Qe("Reflect","ownKeys")||function(e){var t=At.f(xt(e)),n=Rt.f;return n?t.concat(n(e)):t},Pt=L,Ct=Lt,Nt=i,Mt=B,It=function(e,t){for(var n=Ct(t),i=Mt.f,r=Nt.f,a=0;a
r;)for(var s,l=an(arguments[r++]),c=a?en(l).concat(a(l)):en(l),u=c.length,d=0;u>d;)s=c[d++],Qt&&!o.call(l,s)||(n[s]=l[s]);return n}:on;Xt({target:"Object",stat:!0,forced:Object.assign!==ln},{assign:ln});var cn,un,dn=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},hn=dn,fn=function(e,t,n){if(hn(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}},vn=h,pn=Array.isArray||function(e){return"Array"==vn(e)},gn=Qe("navigator","userAgent")||"",mn=gn,yn=n.process,bn=yn&&yn.versions,wn=bn&&bn.v8;wn?un=(cn=wn.split("."))[0]<4?1:cn[0]+cn[1]:mn&&(!(cn=mn.match(/Edge\/(\d+)/))||cn[1]>=74)&&(cn=mn.match(/Chrome\/(\d+)/))&&(un=cn[1]);var Sn=un&&+un,En=Sn,kn=r,An=!!Object.getOwnPropertySymbols&&!kn((function(){return!String(Symbol())||!Symbol.sham&&En&&En<41})),Rn=An&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,xn=n,Ln=he.exports,Pn=L,Cn=be,Nn=An,Mn=Rn,In=Ln("wks"),Tn=xn.Symbol,On=Mn?Tn:Tn&&Tn.withoutSetter||Cn,Dn=function(e){return Pn(In,e)&&(Nn||"string"==typeof In[e])||(Nn&&Pn(Tn,e)?In[e]=Tn[e]:In[e]=On("Symbol."+e)),In[e]},jn=w,Fn=pn,zn=Dn("species"),Hn=function(e,t){var n;return Fn(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!Fn(n.prototype)?jn(n)&&null===(n=n[zn])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},Un=fn,_n=p,Bn=A,qn=at,Wn=Hn,Vn=[].push,Kn=function(e){var t=1==e,n=2==e,i=3==e,r=4==e,a=6==e,o=7==e,s=5==e||a;return function(l,c,u,d){for(var h,f,v=Bn(l),p=_n(v),g=Un(c,u,3),m=qn(p.length),y=0,b=d||Wn,w=t?b(l,m):n||o?b(l,0):void 0;m>y;y++)if((s||y in p)&&(f=g(h=p[y],y,v),e))if(t)w[y]=f;else if(f)switch(e){case 3:return!0;case 5:return h;case 6:return y;case 2:Vn.call(w,h)}else switch(e){case 4:return!1;case 7:Vn.call(w,h)}return a?-1:i||r?r:w}},Yn={forEach:Kn(0),map:Kn(1),filter:Kn(2),some:Kn(3),every:Kn(4),find:Kn(5),findIndex:Kn(6),filterOut:Kn(7)},Xn=r,Gn=Sn,$n=Dn("species"),Jn=function(e){return Gn>=51||!Xn((function(){var t=[];return(t.constructor={})[$n]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Qn=Yn.map;Xt({target:"Array",proto:!0,forced:!Jn("map")},{map:function(e){return Qn(this,e,arguments.length>1?arguments[1]:void 0)}});var Zn=E,ei=B,ti=u,ni=function(e,t,n){var i=Zn(t);i in e?ei.f(e,i,ti(0,n)):e[i]=n},ii=Xt,ri=r,ai=pn,oi=w,si=A,li=at,ci=ni,ui=Hn,di=Jn,hi=Sn,fi=Dn("isConcatSpreadable"),vi=9007199254740991,pi="Maximum allowed index exceeded",gi=hi>=51||!ri((function(){var e=[];return e[fi]=!1,e.concat()[0]!==e})),mi=di("concat"),yi=function(e){if(!oi(e))return!1;var t=e[fi];return void 0!==t?!!t:ai(e)};function bi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function wi(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,i=new Array(t);nvi)throw TypeError(pi);for(n=0;n=vi)throw TypeError(pi);ci(s,l++,a)}return s.length=l,s}});var Ci={};Ci[Dn("toStringTag")]="z";var Ni="[object z]"===String(Ci),Mi=Ni,Ii=h,Ti=Dn("toStringTag"),Oi="Arguments"==Ii(function(){return arguments}()),Di=Mi?Ii:function(e){var t,n,i;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),Ti))?n:Oi?Ii(t):"Object"==(i=Ii(t))&&"function"==typeof t.callee?"Arguments":i},ji=Di,Fi=Ni?{}.toString:function(){return"[object "+ji(this)+"]"},zi=Ni,Hi=Z.exports,Ui=Fi;zi||Hi(Object.prototype,"toString",Ui,{unsafe:!0});var _i=n.Promise,Bi=Z.exports,qi=w,Wi=W,Vi=function(e){if(!qi(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e},Ki=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,i){return Wi(n),Vi(i),t?e.call(n,i):n.__proto__=i,n}}():void 0),Yi=B.f,Xi=L,Gi=Dn("toStringTag"),$i=function(e,t,n){e&&!Xi(e=n?e:e.prototype,Gi)&&Yi(e,Gi,{configurable:!0,value:t})},Ji=Qe,Qi=B,Zi=a,er=Dn("species"),tr={},nr=tr,ir=Dn("iterator"),rr=Array.prototype,ar=function(e){return void 0!==e&&(nr.Array===e||rr[ir]===e)},or=Di,sr=tr,lr=Dn("iterator"),cr=function(e){if(null!=e)return e[lr]||e["@@iterator"]||sr[or(e)]},ur=W,dr=function(e){var t=e.return;if(void 0!==t)return ur(t.call(e)).value},hr=W,fr=ar,vr=at,pr=fn,gr=cr,mr=dr,yr=function(e,t){this.stopped=e,this.result=t},br=Dn("iterator"),wr=!1;try{var Sr=0,Er={next:function(){return{done:!!Sr++}},return:function(){wr=!0}};Er[br]=function(){return this},Array.from(Er,(function(){throw 2}))}catch(e){}var kr,Ar,Rr,xr=function(e,t){if(!t&&!wr)return!1;var n=!1;try{var i={};i[br]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(e){}return n},Lr=W,Pr=dn,Cr=Dn("species"),Nr=function(e,t){var n,i=Lr(e).constructor;return void 0===i||null==(n=Lr(i)[Cr])?t:Pr(n)},Mr=Qe("document","documentElement"),Ir=/(?:iphone|ipod|ipad).*applewebkit/i.test(gn),Tr="process"==h(n.process),Or=n,Dr=r,jr=fn,Fr=Mr,zr=M,Hr=Ir,Ur=Tr,_r=Or.location,Br=Or.setImmediate,qr=Or.clearImmediate,Wr=Or.process,Vr=Or.MessageChannel,Kr=Or.Dispatch,Yr=0,Xr={},Gr="onreadystatechange",$r=function(e){if(Xr.hasOwnProperty(e)){var t=Xr[e];delete Xr[e],t()}},Jr=function(e){return function(){$r(e)}},Qr=function(e){$r(e.data)},Zr=function(e){Or.postMessage(e+"",_r.protocol+"//"+_r.host)};Br&&qr||(Br=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return Xr[++Yr]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},kr(Yr),Yr},qr=function(e){delete Xr[e]},Ur?kr=function(e){Wr.nextTick(Jr(e))}:Kr&&Kr.now?kr=function(e){Kr.now(Jr(e))}:Vr&&!Hr?(Rr=(Ar=new Vr).port2,Ar.port1.onmessage=Qr,kr=jr(Rr.postMessage,Rr,1)):Or.addEventListener&&"function"==typeof postMessage&&!Or.importScripts&&_r&&"file:"!==_r.protocol&&!Dr(Zr)?(kr=Zr,Or.addEventListener("message",Qr,!1)):kr=Gr in zr("script")?function(e){Fr.appendChild(zr("script")).onreadystatechange=function(){Fr.removeChild(this),$r(e)}}:function(e){setTimeout(Jr(e),0)});var ea,ta,na,ia,ra,aa,oa,sa,la={set:Br,clear:qr},ca=/web0s(?!.*chrome)/i.test(gn),ua=n,da=i.f,ha=la.set,fa=Ir,va=ca,pa=Tr,ga=ua.MutationObserver||ua.WebKitMutationObserver,ma=ua.document,ya=ua.process,ba=ua.Promise,wa=da(ua,"queueMicrotask"),Sa=wa&&wa.value;Sa||(ea=function(){var e,t;for(pa&&(e=ya.domain)&&e.exit();ta;){t=ta.fn,ta=ta.next;try{t()}catch(e){throw ta?ia():na=void 0,e}}na=void 0,e&&e.enter()},fa||pa||va||!ga||!ma?ba&&ba.resolve?((oa=ba.resolve(void 0)).constructor=ba,sa=oa.then,ia=function(){sa.call(oa,ea)}):ia=pa?function(){ya.nextTick(ea)}:function(){ha.call(ua,ea)}:(ra=!0,aa=ma.createTextNode(""),new ga(ea).observe(aa,{characterData:!0}),ia=function(){aa.data=ra=!ra}));var Ea=Sa||function(e){var t={fn:e,next:void 0};na&&(na.next=t),ta||(ta=t,ia()),na=t},ka={},Aa=dn,Ra=function(e){var t,n;this.promise=new e((function(e,i){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=i})),this.resolve=Aa(t),this.reject=Aa(n)};ka.f=function(e){return new Ra(e)};var xa,La,Pa,Ca,Na=W,Ma=w,Ia=ka,Ta=n,Oa="object"==typeof window,Da=Xt,ja=n,Fa=Qe,za=_i,Ha=Z.exports,Ua=function(e,t,n){for(var i in t)Bi(e,i,t[i],n);return e},_a=Ki,Ba=$i,qa=function(e){var t=Ji(e),n=Qi.f;Zi&&t&&!t[er]&&n(t,er,{configurable:!0,get:function(){return this}})},Wa=w,Va=dn,Ka=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},Ya=le,Xa=function(e,t,n){var i,r,a,o,s,l,c,u=n&&n.that,d=!(!n||!n.AS_ENTRIES),h=!(!n||!n.IS_ITERATOR),f=!(!n||!n.INTERRUPTED),v=pr(t,u,1+d+f),p=function(e){return i&&mr(i),new yr(!0,e)},g=function(e){return d?(hr(e),f?v(e[0],e[1],p):v(e[0],e[1])):f?v(e,p):v(e)};if(h)i=e;else{if("function"!=typeof(r=gr(e)))throw TypeError("Target is not iterable");if(fr(r)){for(a=0,o=vr(e.length);o>a;a++)if((s=g(e[a]))&&s instanceof yr)return s;return new yr(!1)}i=r.call(e)}for(l=i.next;!(c=l.call(i)).done;){try{s=g(c.value)}catch(e){throw mr(i),e}if("object"==typeof s&&s&&s instanceof yr)return s}return new yr(!1)},Ga=xr,$a=Nr,Ja=la.set,Qa=Ea,Za=function(e,t){if(Na(e),Ma(t)&&t.constructor===e)return t;var n=Ia.f(e);return(0,n.resolve)(t),n.promise},eo=function(e,t){var n=Ta.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))},to=ka,no=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},io=He,ro=Ut,ao=Oa,oo=Tr,so=Sn,lo=Dn("species"),co="Promise",uo=io.get,ho=io.set,fo=io.getterFor(co),vo=za&&za.prototype,po=za,go=vo,mo=ja.TypeError,yo=ja.document,bo=ja.process,wo=to.f,So=wo,Eo=!!(yo&&yo.createEvent&&ja.dispatchEvent),ko="function"==typeof PromiseRejectionEvent,Ao="unhandledrejection",Ro=!1,xo=ro(co,(function(){var e=Ya(po)!==String(po);if(!e&&66===so)return!0;if(so>=51&&/native code/.test(po))return!1;var t=new po((function(e){e(1)})),n=function(e){e((function(){}),(function(){}))};return(t.constructor={})[lo]=n,!(Ro=t.then((function(){}))instanceof n)||!e&&ao&&!ko})),Lo=xo||!Ga((function(e){po.all(e).catch((function(){}))})),Po=function(e){var t;return!(!Wa(e)||"function"!=typeof(t=e.then))&&t},Co=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;Qa((function(){for(var i=e.value,r=1==e.state,a=0;n.length>a;){var o,s,l,c=n[a++],u=r?c.ok:c.fail,d=c.resolve,h=c.reject,f=c.domain;try{u?(r||(2===e.rejection&&To(e),e.rejection=1),!0===u?o=i:(f&&f.enter(),o=u(i),f&&(f.exit(),l=!0)),o===c.promise?h(mo("Promise-chain cycle")):(s=Po(o))?s.call(o,d,h):d(o)):h(i)}catch(e){f&&!l&&f.exit(),h(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&Mo(e)}))}},No=function(e,t,n){var i,r;Eo?((i=yo.createEvent("Event")).promise=t,i.reason=n,i.initEvent(e,!1,!0),ja.dispatchEvent(i)):i={promise:t,reason:n},!ko&&(r=ja["on"+e])?r(i):e===Ao&&eo("Unhandled promise rejection",n)},Mo=function(e){Ja.call(ja,(function(){var t,n=e.facade,i=e.value;if(Io(e)&&(t=no((function(){oo?bo.emit("unhandledRejection",i,n):No(Ao,n,i)})),e.rejection=oo||Io(e)?2:1,t.error))throw t.value}))},Io=function(e){return 1!==e.rejection&&!e.parent},To=function(e){Ja.call(ja,(function(){var t=e.facade;oo?bo.emit("rejectionHandled",t):No("rejectionhandled",t,e.value)}))},Oo=function(e,t,n){return function(i){e(t,i,n)}},Do=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,Co(e,!0))},jo=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw mo("Promise can't be resolved itself");var i=Po(t);i?Qa((function(){var n={done:!1};try{i.call(t,Oo(jo,n,e),Oo(Do,n,e))}catch(t){Do(n,t,e)}})):(e.value=t,e.state=1,Co(e,!1))}catch(t){Do({done:!1},t,e)}}};if(xo&&(go=(po=function(e){Ka(this,po,co),Va(e),xa.call(this);var t=uo(this);try{e(Oo(jo,t),Oo(Do,t))}catch(e){Do(t,e)}}).prototype,(xa=function(e){ho(this,{type:co,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=Ua(go,{then:function(e,t){var n=fo(this),i=wo($a(this,po));return i.ok="function"!=typeof e||e,i.fail="function"==typeof t&&t,i.domain=oo?bo.domain:void 0,n.parent=!0,n.reactions.push(i),0!=n.state&&Co(n,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),La=function(){var e=new xa,t=uo(e);this.promise=e,this.resolve=Oo(jo,t),this.reject=Oo(Do,t)},to.f=wo=function(e){return e===po||e===Pa?new La(e):So(e)},"function"==typeof za&&vo!==Object.prototype)){Ca=vo.then,Ro||(Ha(vo,"then",(function(e,t){var n=this;return new po((function(e,t){Ca.call(n,e,t)})).then(e,t)}),{unsafe:!0}),Ha(vo,"catch",go.catch,{unsafe:!0}));try{delete vo.constructor}catch(e){}_a&&_a(vo,go)}Da({global:!0,wrap:!0,forced:xo},{Promise:po}),Ba(po,co,!1),qa(co),Pa=Fa(co),Da({target:co,stat:!0,forced:xo},{reject:function(e){var t=wo(this);return t.reject.call(void 0,e),t.promise}}),Da({target:co,stat:!0,forced:xo},{resolve:function(e){return Za(this,e)}}),Da({target:co,stat:!0,forced:Lo},{all:function(e){var t=this,n=wo(t),i=n.resolve,r=n.reject,a=no((function(){var n=Va(t.resolve),a=[],o=0,s=1;Xa(e,(function(e){var l=o++,c=!1;a.push(void 0),s++,n.call(t,e).then((function(e){c||(c=!0,a[l]=e,--s||i(a))}),r)})),--s||i(a)}));return a.error&&r(a.value),n.promise},race:function(e){var t=this,n=wo(t),i=n.reject,r=no((function(){var r=Va(t.resolve);Xa(e,(function(e){r.call(t,e).then(n.resolve,i)}))}));return r.error&&i(r.value),n.promise}});var Fo=r,zo=function(e,t){var n=[][e];return!!n&&Fo((function(){n.call(null,t||function(){throw 1},1)}))},Ho=Yn.forEach,Uo=n,_o={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Bo=zo("forEach")?[].forEach:function(e){return Ho(this,e,arguments.length>1?arguments[1]:void 0)},qo=Q;for(var Wo in _o){var Vo=Uo[Wo],Ko=Vo&&Vo.prototype;if(Ko&&Ko.forEach!==Bo)try{qo(Ko,"forEach",Bo)}catch(e){Ko.forEach=Bo}}var Yo=W,Xo=dr,Go=fn,$o=A,Jo=function(e,t,n,i){try{return i?t(Yo(n)[0],n[1]):t(n)}catch(t){throw Xo(e),t}},Qo=ar,Zo=at,es=ni,ts=cr,ns=function(e){var t,n,i,r,a,o,s=$o(e),l="function"==typeof this?this:Array,c=arguments.length,u=c>1?arguments[1]:void 0,d=void 0!==u,h=ts(s),f=0;if(d&&(u=Go(u,c>2?arguments[2]:void 0,2)),null==h||l==Array&&Qo(h))for(n=new l(t=Zo(s.length));t>f;f++)o=d?u(s[f],f):s[f],es(n,f,o);else for(a=(r=h.call(s)).next,n=new l;!(i=a.call(r)).done;f++)o=d?Jo(r,u,[i.value,f],!0):i.value,es(n,f,o);return n.length=f,n};Xt({target:"Array",stat:!0,forced:!xr((function(e){Array.from(e)}))},{from:ns});var is,rs,as,os=nt,ss=g,ls=function(e){return function(t,n){var i,r,a=String(ss(t)),o=os(n),s=a.length;return o<0||o>=s?e?"":void 0:(i=a.charCodeAt(o))<55296||i>56319||o+1===s||(r=a.charCodeAt(o+1))<56320||r>57343?e?a.charAt(o):i:e?a.slice(o,o+2):r-56320+(i-55296<<10)+65536}},cs={codeAt:ls(!1),charAt:ls(!0)},us=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),ds=L,hs=A,fs=us,vs=ke("IE_PROTO"),ps=Object.prototype,gs=fs?Object.getPrototypeOf:function(e){return e=hs(e),ds(e,vs)?e[vs]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?ps:null},ms=r,ys=gs,bs=Q,ws=L,Ss=Dn("iterator"),Es=!1;[].keys&&("next"in(as=[].keys())?(rs=ys(ys(as)))!==Object.prototype&&(is=rs):Es=!0),(null==is||ms((function(){var e={};return is[Ss].call(e)!==e})))&&(is={}),ws(is,Ss)||bs(is,Ss,(function(){return this}));var ks,As={IteratorPrototype:is,BUGGY_SAFARI_ITERATORS:Es},Rs=B,xs=W,Ls=Jt,Ps=a?Object.defineProperties:function(e,t){xs(e);for(var n,i=Ls(t),r=i.length,a=0;r>a;)Rs.f(e,n=i[a++],t[n]);return e},Cs=W,Ns=Ps,Ms=wt,Is=Ae,Ts=Mr,Os=M,Ds=ke("IE_PROTO"),js=function(){},Fs=function(e){return"
+ -->
+
+
+
+
+
+
+
+
+
+
+
+
+ Message-Streams
+ universal communication for JVM applications
+
+
+
+
+ 🇺🇦 Maksym Ostroverkhov
+
+
+ jauntsdn.com / mostroverkhov@gmail / ostroverkhov@twitter / mostroverkhov@github
+
+
+
+
+
+
+ MESSAGE-STREAMS
+  
+ ⚡very fast GRPC-like services on JVM with rich streaming model over multiple network transports
+
+
+
+
+
+ Popular data format: Protocol Buffers .
+ Familiar workflow & tooling: GRPC .
+ Much faster , with several transports:
+
+ 🌐 TCP, VM & unix sockets, websockets, http2 (GRPC and websockets-over-http2), http/json transcoding
+
+
+ TL;DR
+
+ ⚡lean & very fast: millions messages/core, million of simultaneous streams on with commodity PC
+ multiple APIs: ☕CompletableFutures & virt. threads; 🌊streaming with grpc-api, reactor, rxjava, mutiny
+ pluggable networking: ⚡tcp, vm & unix sockets; 🌐grpc, websockets, websockets-over-http2
+ ☁️service APIs/codegen stubs [Message-Streams] are split from library runtime [RSocket-JVM]
+ ☁️transparent origin [RPC] & proxy load estimation for cpu-efficient load balancers
+ ☁️native image support with graalvm
+
+
+
+ Message-Streams: API
+ set of interactions with composable message streams
+ 🌊flow control ⚠️error handling 🚫cancellation
+
+ request-response 1:1
+ request-stream 1:n
+ request-channel n:n, n:1
+ fire-and-forget 1:0 - latency is not important
+
+
+
+ Message-Streams: GRPC API
+ set of interactions with composable message streams
+ 🌊flow control ⚠️error handling 🚫cancellation
+
+
+
+
+ Message-Streams: Reactive Streams API
+ set of interactions with composable message streams
+ 🌊flow control ⚠️error handling 🚫cancellation
+
+
+
+ Message-Streams
+ Smallrye-mutiny from Quarkus / RedHat
+
+
+
+
+ Message-Streams
+ Project-reactor from SpringBoot / Vmware
+
+
+
+
+ Message-Streams
+ Rxjava3 from ReactiveX
+
+
+
+
+ Message-Streams: message
+ binary data with optional metadata
+
+
+
+
+ Message-Streams: FUTURES API
+ subset of non-streaming interactions
+ CompletableFuture from Jdk8 ☕
+
+
+
+ Message-Streams: VIRTUAL THREADS
+ subset of non-streaming interactions
+ much cheaper* blocking with Jdk21 ☕ virtual threads
+
+
+
+
+ Message-Streams: RPC
+
+ 🇬 Protobuf/codegen RPC system on top of Message-Streams
+ 🇬 GRPC compatibility
+ 🇬 GRPC-like devexp: schema, compiler, client/server stubs
+ 🔧request ranks, idempotent requests
+ 🔧 non-opinionated instrumentation: prometheus, micrometer OOTB
+ 🌊 virtual threads & completablefuture; GRPC-stubs; smallrye-mutiny, project-reactor, rxjava3
+
+
+
+ Message-Streams: RPC schema
+ Protobuf service 📄API definition
+
+
+
+ Message-Streams: RPC codegen stubs
+ RPC-compiler generated service 📄API
+
+
+
+ Message-Streams: RPC codegen stubs
+ Message metadata📄
+
+ List of ASCII key-values
+ Protocol Buffers on wire
+
+
+ Message-Streams: RPC codegen stubs
+ RPC-compiler generated client & server stubs
+
+
+
+
+ Message-Streams: RPC
+ Interop demo. Kitchen application services
+
+ https://github.com/jauntsdn/rsocket-jvm-interop-examples
+
+
+ 🌾Farmer: Mstreams-RPC-reactor / TCP
+ 📄Recipes: Mstreams-RPC-futures / TCP
+ 🧑🍳Roundsman: Mstreams-RPC-mutiny / ws-http2
+ 👨🍳Chef: Mstreams-RPC-GRPC-stubs / unix sockets
+ 🔪Kitchen: Mstreams-RPC-rxjava / GRPC
+ 🍽️Gourmet: GRPC/grpc-java client
+
+
+
+
+ Message-Streams: runtime
+
+
+
+ extended alternative: JAUNTSDN / RSocket-JVM
+
+
+
+
+
+
+ Message-Streams: runtime
+ Jauntsdn / RSocket-JVM
+ ⚡ alternative to RSocket/RSocket-java
+ of reactive.foundation [🪦 fall 2021]
+ MOTIVATIONS
+
+ ⛔ bad perf: convoluted internals, dropped ball on RPC, use reflection for data[1]
+ ⛔ vulnerabilities: 4 trivial denial-of-service cases[2]
+ ⛔ no reusable parts for other vendor API, 🍃Spring libs only: reactor/reactor-netty, micrometer
+
+
+
+
+ RSocket / RSocket-java
+ Vulnerabilities
+ by reactive.foundation [🪦 fall 2021]
+
+ ⛔ D-O-S: FD exhaustion, memory overflow [2]
+ ⛔ 3 of 4 interactions: request-response, request-stream, request-channel
+ ⛔ last release: early Jun 2021
+
+
+ 🍃 team as main 📣, adopter & maintainer: 🙈🙉🙊
+
+
+
+
+ Message-Streams: runtime
+ RSocket protocol
+
+
+ ⚡low latency/high throughput L5 protocol
+ intended for high-performance services communication
+
+
+ symmetric interactions, 2 peers may start requests
+
+
+ 🌐 transport agnostic, runs on top of any reliable byte stream transport
+
+
+ 🌊 superset of Message-Streams
+
+
+
+
+
+ Message-Streams: API, RPC
+ 🌊flow control ⚠️error handling 🚫cancellation
+
+
+
+ RSocket-JVM: runtime
+ 🏃 runtime: networking, transports - datacenter & internet
+ ☁️ features: load estimation/circuit breaking, load balancing, real graceful close
+
+
+
+
+ Message-Streams: runtime
+ Jauntsdn / RSocket-JVM
+
+
+ ⚡high perf, tiny garbage production,
+ may serve 1 million streams with commodity PC
+
+
+ 🌐 transports: TCP, unix sockets, websockets-over-http2, 🇬 GRPC compatibility
+
+
+ ☁️ requests leasing: circuit breaking,
+ adaptive latency-based load estimation for lightweight load balancing
+
+
+ ☁️ request ranks: keep critical services under load, driven by responder with request leasing
+
+
+
+
+
+
+ ☁️ scalable keep-alives, lightweight coarse scheduler for timeouts
+
+
+ ☁️ graceful shutdown: client & server
+
+
+ ☁️ non-opinionated metrics: prometheus, micrometer OOTB
+
+
+ ☁️ symmetric interactions
+
+
+
+
+
+
+ Message-Streams: runtime
+ Jauntsdn / RSocket-JVM core
+ ♻️ Protocol core is shared by vendor libs: mutiny, reactor etc
+
+
+ ☮️♻️ components: framing, handshakes, keep-alives, requests leasing,
+ graceful close, error handling etc
+
+
+ ☮️ tiny & neutral: netty-buffer is only dependency
+
+
+ ☮️♻️ modules: transports, load estimators, metrics
+
+
+
+
+
+ Message-Streams: runtime
+ Network transports
+ 🌐 Internet transports (TLS) may share same port: websockets, websockets-http2, GRPC, http/json
+
+
+ Message-Streams: runtime
+ Network transports
+ ☁️ JSON transcoding: selected services can be served as http/json
+ Control plane, health endpoint etc
+
+
+
+
+ Message-Streams: runtime
+ request leasing
+ ⏳🎫Responder: time limited request credit: allow (duration, requests, rank)
+
+ Circuit breaking: responder driven / requester aware
+ Responder: request stats
+ Credit = f(svc latency stats/ success rate + RTT)
+ Duration (interval): cap requests rate
+ Lease = credit + request rank: service brownout
+ Requester: RSocket.availability(rank) [0 ; 1]
+
+
+
+ Message-Streams: runtime
+ leasing: stats
+
+
+
+
+ Message-Streams: runtime
+ leasing: load balancing
+
+ 📖theory: min(set(RSocket.availability)) + conn RTT
+ 🔨practice: more complex - still cpu-efficient
+ LB + lease: CPU utilization + connection RTT
+ LB + lease metadata: allowed fnf, indicative service latencies
+ service latency: call hash + latency
+
+
+
+ Message-Streams: runtime
+ RPC origin lease: latency based load estimator
+
+
+
+ Message-Streams: runtime
+ RPC origin lease: latency based load estimator
+
+ AIMD: additive inc⬆️ / multiplicative dec⬇️
+ service ⬅️response latency
+ 🔄RTT latency
+ ⚠️error rate
+ ♨️CPU / memory utilization
+ ♨️leased capacity utilization
+
+
+
+
+ Message-Streams: RPC
+ Interop demo. Kitchen application services
+
+ https://github.com/jauntsdn/rsocket-jvm-interop-examples
+
+
+ 🌾Farmer: Mstreams-RPC-reactor / TCP
+ 📄Recipes: Mstreams-RPC-futures / TCP
+ 🧑🍳Roundsman: Mstreams-RPC-mutiny / ws-http2
+ 👨🍳Chef: Mstreams-RPC-grpc-stubs / unix sockets
+ 🔪Kitchen: Mstreams-RPC-rxjava / GRPC
+ 🍽️Gourmet: GRPC/grpc-java client
+
+
+
+
+ Message-Streams: runtime
+ RPC througput test
+ ⚡Single vCPU RYZEN™ 5 2600X, reactor, non-TLS, TCP EPOLL /w linux 5.4.0, jdk11
+
+
+ msg size, bytes
+ 8
+ 128
+ 512
+
+
+ request-response
+ 1.45mil
+ 1.0mil
+ 0.55mil
+
+
+ request-stream
+ 3.3mil
+ 2.4mil
+ 0.9mil
+
+
+ request-channel
+ 3.5mil
+ 2.4mil
+ 1.25mil
+
+
+
+
+ Message-Streams: runtime
+ GRPC-RPC througput test
+ 🦥GRPC-java client, MStreams RPC server. Single vCPU RYZEN™ 5 2600X, reactor, non-TLS, TCP EPOLL /w linux 5.4.0, jdk11
+
+
+ msg size, bytes
+ 8
+
+
+ request-response
+ 0.1mil
+
+
+ request-stream
+ 1.4mil
+
+
+ request-channel
+ 1.2mil
+
+
+
+
+
+
+ Message-Streams: runtime
+ Load test
+ ♨️♨️1 million streams, 10k conns, single host [3]
+
+ Host: 16 vCPU / 32gb RAM, linux 5.4.0, jdk11
+ Scheduler: Nomad/Consul
+ 1 server: 8vCPU/16gb, 2 clients: 4vCPU/8gb each
+ TCP non-TLS /w EPOLL IO
+
+
+
+ Server, simultaneous streams
+ ♨️1 million streams over 10k connections, monotonically over ~16 mins
+
+
+
+ Host CPU usage
+ ♨️server: 60% of host CPU, 85% overall used by load test
+
+
+
+ Server, memory alloc rate
+ ❄️Peaks at only 50 Mb/sec => 50 bytes per inbound message
+
+
+
+
+
+ Message-Streams: RPC
+ Size & start time
+ ☕CompletableFutures: 1st request time & binaries size
+
+
+ app
+ TCP/-TLS
+ websocket-http2/+TLS
+
+
+ svc size
+ 2.9MB
+ 2.9MB
+
+
+ app size
+ 5.3MB
+ 7.7MB
+
+
+ 1st request ⏳
+ 350 ms
+ 600 ms
+
+
+
+ svc: netty 0.9MB, protobuf 1.7MB - room for 🔧
+
+
+
+ Message-Streams: RPC
+ Distribution size
+ ☕CompletableFutures: application image (/w JRE17) & alpine docker image size
+
+
+ app
+ TCP
+ websocket-http2/TLS
+
+
+ App JRE image
+ 49.5MB
+ 51.9MB
+
+
+ App alpine 📦
+ 57MB
+ 59.4MB
+
+
+
+
+ Message-Streams: RPC
+ Native binary size
+ ☕CompletableFutures: native executable /w Graalvm11, serial GC
+
+ ⚡TCP native binary size: 20.5MB, startup: instant
+
+
+
+
+
+ Summary
+
+ ⚡lean & very fast (millions messages/core) GRPC-like services on JVM with rich streaming model
+ multiple APIs: ☕CompletableFuture; 🌊streaming with reactor, rxjava, mutiny, grpc-stubs
+ pluggable networking: ⚡tcp, unix sockets; 🌐grpc, websockets-over-http2
+ ☁️service APIs/codegen stubs [Message-Streams] are split from library runtime [RSocket-JVM]
+ ☁️transparent origin [RPC] & proxy load estimation which enables cpu-efficient load balancers
+ ☁️native image support with graalvm
+
+
+
+
+
+
+ Questions
+ jauntsdn.com / mostroverkhov@gmail / ostroverkhov@twitter / mostroverkhov@github
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+