From 69b593a45428d5af24a3a3093e46c3f652c72e1d Mon Sep 17 00:00:00 2001 From: Merlise Clyde Date: Sun, 21 Apr 2024 00:44:45 -0400 Subject: [PATCH] Built site for gh-pages --- .nojekyll | 1 + AMC-talk.html | 1180 +++++++++ .../figure-revealjs/unnamed-chunk-2-1.png | Bin 0 -> 61643 bytes .../figure-revealjs/unnamed-chunk-3-1.png | Bin 0 -> 75586 bytes .../figure-revealjs/unnamed-chunk-4-1.png | Bin 0 -> 71864 bytes .../libs/clipboard/clipboard.min.js | 7 + .../libs/quarto-html/light-border.css | 1 + AMC-talk_files/libs/quarto-html/popper.min.js | 6 + .../libs/quarto-html/quarto-html.min.css | 1 + .../quarto-syntax-highlighting.css | 203 ++ AMC-talk_files/libs/quarto-html/tabby.min.js | 418 +++ AMC-talk_files/libs/quarto-html/tippy.css | 1 + .../libs/quarto-html/tippy.umd.min.js | 2 + AMC-talk_files/libs/revealjs/dist/reset.css | 30 + AMC-talk_files/libs/revealjs/dist/reveal.css | 8 + .../libs/revealjs/dist/reveal.esm.js | 9 + .../libs/revealjs/dist/reveal.esm.js.map | 1 + AMC-talk_files/libs/revealjs/dist/reveal.js | 9 + .../libs/revealjs/dist/reveal.js.map | 1 + .../dist/theme/fonts/league-gothic/LICENSE | 2 + .../fonts/league-gothic/league-gothic.css | 10 + .../fonts/league-gothic/league-gothic.eot | Bin 0 -> 25696 bytes .../fonts/league-gothic/league-gothic.ttf | Bin 0 -> 64256 bytes .../fonts/league-gothic/league-gothic.woff | Bin 0 -> 30764 bytes .../dist/theme/fonts/source-sans-pro/LICENSE | 45 + .../source-sans-pro-italic.eot | Bin 0 -> 75720 bytes .../source-sans-pro-italic.ttf | Bin 0 -> 238084 bytes .../source-sans-pro-italic.woff | Bin 0 -> 98556 bytes .../source-sans-pro-regular.eot | Bin 0 -> 88070 bytes .../source-sans-pro-regular.ttf | Bin 0 -> 288008 bytes .../source-sans-pro-regular.woff | Bin 0 -> 114324 bytes .../source-sans-pro-semibold.eot | Bin 0 -> 89897 bytes .../source-sans-pro-semibold.ttf | Bin 0 -> 284640 bytes .../source-sans-pro-semibold.woff | Bin 0 -> 115648 bytes .../source-sans-pro-semibolditalic.eot | Bin 0 -> 75706 bytes .../source-sans-pro-semibolditalic.ttf | Bin 0 -> 240944 bytes .../source-sans-pro-semibolditalic.woff | Bin 0 -> 98816 bytes .../fonts/source-sans-pro/source-sans-pro.css | 39 + .../libs/revealjs/dist/theme/quarto.css | 5 + .../plugin/highlight/highlight.esm.js | 5 + .../revealjs/plugin/highlight/highlight.js | 5 + .../revealjs/plugin/highlight/monokai.css | 71 + .../libs/revealjs/plugin/highlight/plugin.js | 439 ++++ .../revealjs/plugin/highlight/zenburn.css | 80 + .../revealjs/plugin/markdown/markdown.esm.js | 1 + .../libs/revealjs/plugin/markdown/markdown.js | 1 + .../libs/revealjs/plugin/markdown/plugin.js | 475 ++++ .../libs/revealjs/plugin/math/katex.js | 96 + .../libs/revealjs/plugin/math/math.esm.js | 1 + .../libs/revealjs/plugin/math/math.js | 1 + .../libs/revealjs/plugin/math/mathjax2.js | 89 + .../libs/revealjs/plugin/math/mathjax3.js | 77 + .../libs/revealjs/plugin/math/plugin.js | 15 + .../libs/revealjs/plugin/notes/notes.esm.js | 1 + .../libs/revealjs/plugin/notes/notes.js | 1 + .../libs/revealjs/plugin/notes/plugin.js | 236 ++ .../revealjs/plugin/notes/speaker-view.html | 884 +++++++ .../revealjs/plugin/pdf-export/pdfexport.js | 111 + .../revealjs/plugin/pdf-export/plugin.yml | 2 + .../quarto-line-highlight/line-highlight.css | 31 + .../quarto-line-highlight/line-highlight.js | 351 +++ .../plugin/quarto-line-highlight/plugin.yml | 4 + .../revealjs/plugin/quarto-support/footer.css | 110 + .../revealjs/plugin/quarto-support/plugin.yml | 5 + .../revealjs/plugin/quarto-support/support.js | 290 +++ .../plugin/reveal-chalkboard/README.md | 160 ++ .../font-awesome/LICENSE.txt | 34 + .../font-awesome/css/all.css | 5 + .../font-awesome/css/brands.css | 5 + .../font-awesome/css/fontawesome.css | 5 + .../font-awesome/css/regular.css | 5 + .../font-awesome/css/solid.css | 5 + .../font-awesome/css/svg-with-js.css | 5 + .../font-awesome/css/v4-shims.css | 2170 ++++++++++++++++ .../font-awesome/css/v4-shims.min.css | 5 + .../font-awesome/webfonts/fa-brands-400.eot | Bin 0 -> 115052 bytes .../font-awesome/webfonts/fa-brands-400.svg | 1127 +++++++++ .../font-awesome/webfonts/fa-brands-400.ttf | Bin 0 -> 114816 bytes .../font-awesome/webfonts/fa-brands-400.woff | Bin 0 -> 73920 bytes .../font-awesome/webfonts/fa-brands-400.woff2 | Bin 0 -> 63376 bytes .../font-awesome/webfonts/fa-regular-400.eot | Bin 0 -> 40744 bytes .../font-awesome/webfonts/fa-regular-400.svg | 467 ++++ .../font-awesome/webfonts/fa-regular-400.ttf | Bin 0 -> 40516 bytes .../font-awesome/webfonts/fa-regular-400.woff | Bin 0 -> 18212 bytes .../webfonts/fa-regular-400.woff2 | Bin 0 -> 14952 bytes .../font-awesome/webfonts/fa-solid-900.eot | Bin 0 -> 160768 bytes .../font-awesome/webfonts/fa-solid-900.svg | 2231 +++++++++++++++++ .../font-awesome/webfonts/fa-solid-900.ttf | Bin 0 -> 160548 bytes .../font-awesome/webfonts/fa-solid-900.woff | Bin 0 -> 76632 bytes .../font-awesome/webfonts/fa-solid-900.woff2 | Bin 0 -> 59572 bytes .../reveal-chalkboard/img/blackboard.png | Bin 0 -> 32733 bytes .../img/boardmarker-black.png | Bin 0 -> 2142 bytes .../img/boardmarker-blue.png | Bin 0 -> 2127 bytes .../img/boardmarker-green.png | Bin 0 -> 2106 bytes .../img/boardmarker-orange.png | Bin 0 -> 2240 bytes .../img/boardmarker-purple.png | Bin 0 -> 2044 bytes .../reveal-chalkboard/img/boardmarker-red.png | Bin 0 -> 2119 bytes .../img/boardmarker-yellow.png | Bin 0 -> 2105 bytes .../reveal-chalkboard/img/chalk-blue.png | Bin 0 -> 5150 bytes .../reveal-chalkboard/img/chalk-green.png | Bin 0 -> 4801 bytes .../reveal-chalkboard/img/chalk-orange.png | Bin 0 -> 5010 bytes .../reveal-chalkboard/img/chalk-purple.png | Bin 0 -> 5250 bytes .../reveal-chalkboard/img/chalk-red.png | Bin 0 -> 4786 bytes .../reveal-chalkboard/img/chalk-white.png | Bin 0 -> 5199 bytes .../reveal-chalkboard/img/chalk-yellow.png | Bin 0 -> 5097 bytes .../plugin/reveal-chalkboard/img/sponge.png | Bin 0 -> 3612 bytes .../reveal-chalkboard/img/whiteboard.png | Bin 0 -> 34129 bytes .../plugin/reveal-chalkboard/plugin.js | 1976 +++++++++++++++ .../plugin/reveal-chalkboard/plugin.yml | 7 + .../plugin/reveal-chalkboard/style.css | 44 + .../libs/revealjs/plugin/reveal-menu/menu.css | 346 +++ .../libs/revealjs/plugin/reveal-menu/menu.js | 1 + .../revealjs/plugin/reveal-menu/plugin.yml | 9 + .../plugin/reveal-menu/quarto-menu.css | 68 + .../plugin/reveal-menu/quarto-menu.js | 43 + .../libs/revealjs/plugin/search/plugin.js | 243 ++ .../libs/revealjs/plugin/search/search.esm.js | 7 + .../libs/revealjs/plugin/search/search.js | 7 + .../libs/revealjs/plugin/zoom/plugin.js | 264 ++ .../libs/revealjs/plugin/zoom/zoom.esm.js | 4 + .../libs/revealjs/plugin/zoom/zoom.js | 4 + img/The_hindoo_earth.png | Bin 0 -> 2738175 bytes img/basu-elephant.png | Bin 0 -> 383638 bytes img/circus-ship.jpeg | Bin 0 -> 1270464 bytes img/dont-panic.png | Bin 0 -> 675244 bytes img/model_agency.png | Bin 0 -> 222442 bytes img/shocked-statistician.png | Bin 0 -> 655160 bytes img/tree_v1.png | Bin 0 -> 62254 bytes img/turtles_all_the_way_down.jpg | Bin 0 -> 319323 bytes index.html | 1180 +++++++++ 130 files changed, 15788 insertions(+) create mode 100644 .nojekyll create mode 100644 AMC-talk.html create mode 100644 AMC-talk_files/figure-revealjs/unnamed-chunk-2-1.png create mode 100644 AMC-talk_files/figure-revealjs/unnamed-chunk-3-1.png create mode 100644 AMC-talk_files/figure-revealjs/unnamed-chunk-4-1.png create mode 100644 AMC-talk_files/libs/clipboard/clipboard.min.js create mode 100644 AMC-talk_files/libs/quarto-html/light-border.css create mode 100644 AMC-talk_files/libs/quarto-html/popper.min.js create mode 100644 AMC-talk_files/libs/quarto-html/quarto-html.min.css create mode 100644 AMC-talk_files/libs/quarto-html/quarto-syntax-highlighting.css create mode 100644 AMC-talk_files/libs/quarto-html/tabby.min.js create mode 100644 AMC-talk_files/libs/quarto-html/tippy.css create mode 100644 AMC-talk_files/libs/quarto-html/tippy.umd.min.js create mode 100644 AMC-talk_files/libs/revealjs/dist/reset.css create mode 100644 AMC-talk_files/libs/revealjs/dist/reveal.css create mode 100644 AMC-talk_files/libs/revealjs/dist/reveal.esm.js create mode 100644 AMC-talk_files/libs/revealjs/dist/reveal.esm.js.map create mode 100644 AMC-talk_files/libs/revealjs/dist/reveal.js create mode 100644 AMC-talk_files/libs/revealjs/dist/reveal.js.map create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/league-gothic/LICENSE create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.css create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.eot create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.ttf create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.woff create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/LICENSE create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot create mode 100755 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot create mode 100755 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot create mode 100755 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot create mode 100755 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro.css create mode 100644 AMC-talk_files/libs/revealjs/dist/theme/quarto.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/highlight/highlight.esm.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/highlight/highlight.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/highlight/monokai.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/highlight/plugin.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/highlight/zenburn.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/markdown/markdown.esm.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/markdown/markdown.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/markdown/plugin.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/math/katex.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/math/math.esm.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/math/math.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/math/mathjax2.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/math/mathjax3.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/math/plugin.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/notes/notes.esm.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/notes/notes.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/notes/plugin.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/notes/speaker-view.html create mode 100644 AMC-talk_files/libs/revealjs/plugin/pdf-export/pdfexport.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/pdf-export/plugin.yml create mode 100644 AMC-talk_files/libs/revealjs/plugin/quarto-line-highlight/line-highlight.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/quarto-line-highlight/line-highlight.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/quarto-line-highlight/plugin.yml create mode 100644 AMC-talk_files/libs/revealjs/plugin/quarto-support/footer.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/quarto-support/plugin.yml create mode 100644 AMC-talk_files/libs/revealjs/plugin/quarto-support/support.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/README.md create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/LICENSE.txt create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/all.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/brands.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/fontawesome.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/regular.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/solid.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/svg-with-js.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.min.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.eot create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.svg create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.ttf create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff2 create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.eot create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.svg create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.ttf create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff2 create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.eot create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.svg create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.ttf create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff2 create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/blackboard.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-black.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-blue.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-green.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-orange.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-purple.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-red.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-yellow.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-blue.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-green.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-orange.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-purple.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-red.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-white.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-yellow.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/sponge.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/img/whiteboard.png create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/plugin.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/plugin.yml create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-chalkboard/style.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-menu/menu.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-menu/menu.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-menu/plugin.yml create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-menu/quarto-menu.css create mode 100644 AMC-talk_files/libs/revealjs/plugin/reveal-menu/quarto-menu.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/search/plugin.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/search/search.esm.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/search/search.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/zoom/plugin.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/zoom/zoom.esm.js create mode 100644 AMC-talk_files/libs/revealjs/plugin/zoom/zoom.js create mode 100644 img/The_hindoo_earth.png create mode 100644 img/basu-elephant.png create mode 100644 img/circus-ship.jpeg create mode 100644 img/dont-panic.png create mode 100644 img/model_agency.png create mode 100644 img/shocked-statistician.png create mode 100644 img/tree_v1.png create mode 100644 img/turtles_all_the_way_down.jpg create mode 100644 index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..8f60abd --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ +0ac74900 \ No newline at end of file diff --git a/AMC-talk.html b/AMC-talk.html new file mode 100644 index 0000000..e52dfa8 --- /dev/null +++ b/AMC-talk.html @@ -0,0 +1,1180 @@ + + + + + + + + + + + + + + In Search of Basu’s Elephants + + + + + + + + + + + + + + + + + +
+
+ +
+

In Search of Basu’s Elephants

+

Theory and Foundations of Statistics in the Era of Big Data
+Conference Honoring Bahadur and Basu

+ +
+
+
+Merlise Clyde +
+

+ Duke University +

+
+
+ +
+
+

Basu’s Elephants

+
+
+

Circus Owner plans to ship his 50 elephants

+
    +
  • needs an approximate total weight of the 50 elephants
  • +
  • Sambo is a typical elephant of average weight
  • +
  • decides to take 50 \(\times\) Sambo’s current weight as an estimate of the total weight of his herd
  • +
+
+

+
+
+
+
+

Sampling Design

+
+
+

Circus Statistician is shocked!

+
    +
  • we need a sampling design to create an unbiased estimator!
  • +
  • they compromised and came up with the following plan: +
      +
    • sample Sambo with probability \(99/100\)
    • +
    • the rest of the elephants with probability \(1/4900\)
    • +
  • +
+
+

+
+
+
+
+

Unbiased Estimation & Horvitz-Thompson

+
+
+

Everyone was happy when Sambo was selected!

+
    +
  • Circus Owner proposes using \(50 \times\) Sambo’s current weight
  • +
  • Circus Statistician: we should use the Horvitz-Thompson Estimator (HT) +
      +
    • unique hyper-admissible estimator in the class of all generalized polynomial unbiased estimators!
    • +
  • +
  • HT estimate is Sambo’s weight \(\div\) probability Sambo was selected -or- W \(\times 100/99\)
  • +
  • But what if the largest elephant Jumbo had been selected? asked the Circus Owner
  • +
  • Well, said the sheepish statistician, HT would lead to Jumbo’s weight \(W \times 4900/1\)!
  • +
  • and thus the Circus statistician lost their job (and became an instructor of statistics)!
  • +
+
+

+
+
+
+
+

Several years later…

+
+
+

+
+

Statistical Modelling Agency has ad out for help sampling models

+
    +
  • Circus statistician applies

  • +
  • Agency: we want to implement Bayesian Model Averaging and need your help in sampling models and estimation

  • +
  • Former Circus Statistician: I know all about sampling! Tell me more!

  • +
  • and being an instructor of statistics does not pay enough

  • +
+
+
+
+
+

Canonical Regression Model

+
    +
  • Observe response vector \(\mathbf{Y}\) with predictor variables \(X_1 \dots X_p\).

  • +
  • Model for data under a specific model \({\cal M}_\gamma\): \[\begin{equation*} +\mathbf{Y}\mid \alpha, \boldsymbol{\beta_\gamma}, \phi, {\cal M}_\gamma\sim \textsf{N}(\mathbf{1}_n\alpha + \mathbf{X}_{\boldsymbol{\gamma}}\boldsymbol{\beta_\gamma}, \mathbf{I}_n/\phi) +\label{eq:linear.model} +\end{equation*}\]

  • +
  • Models \({\cal M}_\gamma\) encoded by \(\boldsymbol{\gamma}= (\gamma_1, \ldots \gamma_p)^T\) binary vector with \(\gamma_j = 1\) indicating that \(X_j\) is included in model \({\cal M}_\gamma\) where \[\begin{align*} +\gamma_j = 0 & \Leftrightarrow \beta_j = 0 \\ +\gamma_j = 1 & \Leftrightarrow \beta_j \neq 0 +\end{align*}\]

  • +
  • \(\mathbf{X}_{\boldsymbol{\gamma}}\): the \(n \times p_{\boldsymbol{\gamma}}\) design matrix for model \({\cal M}_\gamma\)

  • +
  • \(\boldsymbol{\beta_\gamma}\): the \(p_{\boldsymbol{\gamma}}\) vector of non-zero regression coefficients under \({\cal M}_\gamma\)

  • +
  • intercept \(\alpha\), precision \(\phi\) common to all models

  • +
+
+
+

Bayesian Model Averaging (BMA)

+
    +
  • prior distributions on all unknowns \((\boldsymbol{\beta_\gamma}, \boldsymbol{\gamma}, \alpha, \phi)\) and turn the Bayesian crank to get posterior distributions!

  • +
  • key component is posterior distribution over models \[ +p({\cal M}_\gamma\mid\ Y) = \frac {p(\mathbf{Y}\mid {\cal M}_\gamma) p({\cal M}_\gamma)} {\sum_{\boldsymbol{\gamma}\in \Gamma} p(\mathbf{Y}\mid {\cal M}_\gamma)p({\cal M}_\gamma)} +\]

  • +
  • for nice priors, we can integrate out the parameters \(\boldsymbol{\theta}_{\boldsymbol{\gamma}}= (\boldsymbol{\beta_\gamma}, \alpha, \phi)\) to obtain the marginal likelihood of \({\cal M}_\gamma\) which is proportional to \[ +p(\mathbf{Y}\mid {\cal M}_\gamma) = \int p(\mathbf{Y}\mid \boldsymbol{\theta}_{\boldsymbol{\gamma}}, {\cal M}_\gamma)p(\boldsymbol{\theta}_{\boldsymbol{\gamma}}\mid {\cal M}_\gamma) d\boldsymbol{\theta}_{\boldsymbol{\gamma}} +\]

  • +
  • posterior distribution of quantities \(\Delta\) of interest under BMA \[ +\sum_{\boldsymbol{\gamma}\in \Gamma} p({\cal M}_\gamma\mid \mathbf{Y}) p(\Delta \mid \mathbf{Y}, {\cal M}_\gamma) +\]

  • +
  • estimations \(\textsf{E}[\mathbf{Y}]\), predictive distribution of \(\mathbf{Y}^*\), \(\gamma_j\) (marginal inclusion probabilities)

  • +
+
+
+

Implementation

+

The Former Circus Statistician asked - “What if you can’t enumerate all of the models in \(\gamma\)?

+
    +
  • With \(88\) predictor variables there are \(2^{88} > 3 \times 10^{26}\) models!

  • +
  • more than the number of stars (\(10^{24}\)) in the universe!

  • +
+
+

+
+
+
+

Sampling

+

Well, then we just use a sample, said the agency statistician

+
    +
  • simple random sampling with or without replacement doesn’t work very well (inefficient)

  • +
  • Box used importance sampling in the 80’s, but that didn’t seem to scale

  • +
  • non-random samples using Branch & Bound, but those are biased (also does not scale)

  • +
  • but then Bayesians discovered MCMC so Markov Chain Monte Carlo is now pretty standard for implementation of BMA

  • +
+
+
+

MCMC

+
    +
  • design a Markov Chain to transition through \(\Gamma\) so that ultimately models are sampled proportional to their posterior probabilities \[ + p({\cal M}_\gamma\mid \mathbf{Y}) \propto p(\mathbf{Y}\mid {\cal M}_\gamma) p({\cal M}_\gamma) + \]

  • +
  • propose a new model from \(q(\boldsymbol{\gamma}^* \mid \boldsymbol{\gamma})\)

  • +
  • accept moving to \(\boldsymbol{\gamma}^*\) with probability \[ +\textsf{MH} = \max(1, \frac{p({\cal M}_\gamma* \mid \mathbf{Y})p({\cal M}_\gamma^*)/q(\boldsymbol{\gamma}^* \mid \boldsymbol{\gamma})} + {p({\cal M}_\gamma\mid \mathbf{Y})p({\cal M}_\gamma)/q(\boldsymbol{\gamma})}) +\]

  • +
  • otherwise stay at model \({\cal M}_\gamma\)

  • +
  • the normalizing constant is the same in the numerator and denominator so we just need \(p(\mathbf{Y}\mid {\cal M}_\gamma) p({\cal M}_\gamma)\)!

  • +
+
+
+

Estimation in BMA

+

The Former Circus Statistician asks: “So how do you estimate the probabilities of models?

+
    +
  • we just use the Monte Carlo frequencies of models or ergodic averages \[\begin{align*} +\widehat{p({\cal M}_\gamma\mid \mathbf{Y})} & = \frac{\sum_{t = 1}^T I({{\cal M}}_t = {\cal M}_\gamma)} {T} \\ +& = \frac{\sum_{\boldsymbol{\gamma}\in S} n_{\boldsymbol{\gamma}} I({\cal M}_\gamma\in S)} {\sum n_{\boldsymbol{\gamma}}} \\ +\end{align*}\]

  • +
  • \(T\) = # MCMC samples

  • +
  • \(S\) is the collection of unique sampled models

  • +
  • \(n_{\boldsymbol{\gamma}}\) is the frequency of model \({\cal M}_\gamma\) in \(S\)

  • +
+
+
    +
  • asymptotically unbiased as \(T \to \infty\)
  • +
+
+
+
+

Shocked (II)

+
+
+

+

What! You just the Monte Carlo frequencies! exclaimed the Former Circus Statistician

+
    +
  • I don’t know much about Bayes, but that doesn’t seem particularly Bayesian!
  • +
+
+
    +
  • what happened to the (observed) marginal likelihoods \(\times\) prior probabilities?

  • +
  • since you are sampling from a finite population, can you use survey sampling estimates of \[C = \sum_{\boldsymbol{\gamma}\in \Gamma } p(\mathbf{Y}\mid {\cal M}_\gamma) p({\cal M}_\gamma)\] with the observed \(p(\mathbf{Y}\mid {\cal M}_\gamma) p({\cal M}_\gamma)\)?

  • +
  • Agency Statistician: We tried using \[ +\widehat{p({\cal M}_\gamma\mid\ Y)} = \frac {p(\mathbf{Y}\mid {\cal M}_\gamma) p({\cal M}_\gamma)} {\sum_{\boldsymbol{\gamma}\in S} p(\mathbf{Y}\mid {\cal M}_\gamma)p({\cal M}_\gamma)} +\]

  • +
  • it’s Fisher Consistent, but biased in finite samples

  • +
  • that’s why we need you!

  • +
+
+
+
+
+

Inverse Probability Weighting

+

Former Circus Statistician: Let’s try the Hansen-Hurwitz estimator in PPS sampling

+
    +
  • Goal is to estimate \(C= \sum_i^N p(\mathbf{Y}\mid {{\cal M}}_i) p({{\cal M}}_i)\)
  • +
  • Let \(\rho_i\) be the probability of selecting \({{\cal M}}_i\)
  • +
  • Hansen-Hurwitz or importance sampling estimate is \[\hat{C} = \frac{1}{n}\sum_i^n \frac{ p(\mathbf{Y}\mid {{\cal M}}_i) p({{\cal M}}_i)}{\rho_i} +\]
  • +
  • If we have “perfect” samples from the posterior then \[\rho_i = \frac{p(\mathbf{Y}\mid {{\cal M}}_i)p({{\cal M}}_i)}{C}\] and recover \(C\)!
  • +
+
+
+

Self-Normalized Importance Sampling

+

Since \(C\) is unknown, we can apply the ratio estimator \[ +\hat{C} = \frac{\frac1 n \sum_i^n \frac{p(\mathbf{Y}\mid {{\cal M}}_i) p({{\cal M}}_i)}{\rho_i}}{ \frac1 n \sum_i^n \frac{1}{\rho_i}} = \left[ \sum_i \frac{1}{p(\mathbf{Y}\mid {{\cal M}}_i) p({{\cal M}}_i)} \right]^{-1} +\]

+
+

But this is the “infamous” harmonic mean estimator, said the Agency Statistician! While unbiased, it’s is highly unstable!

+
+
+

The Former Circus Statistician (hoping to keep this gig):

+
    +
  • Wait! - I know that the Horvitz-Thompson (HT) estimator uses only the unique sampled values and not the frequencies

  • +
  • HT dominates the Hansen-Hurwitz in terms of variance!

  • +
  • but we can’t use MCMC…

  • +
+
+
+
+

Proposal Distribution

+

Former Circus Statistician: So tell me more about \(q\) in MCMC

+
    +
  • ratio \(\frac{p(\mathbf{Y}\mid {\cal M}_\gamma^*) p({\cal M}_\gamma^*)}{q({\cal M}_\gamma^* \mid {\cal M}_\gamma)}\) looks like importance sampling

  • +
  • what are choices for \(q({\cal M}_\gamma^* \mid {\cal M}_\gamma)\)?

  • +
  • what about independent proposals \(q({\cal M}_\gamma^*)\)?

  • +
+
+
+

Adaptive Independent Metropolis

+

Griffin et al (2021):

+
    +
  • Independent Metropolis Hastings \[q(\boldsymbol{\gamma}) = \prod \pi_i^{\gamma_i} (1 - \pi_i)^{1-\gamma_i}\]

  • +
  • Product of Independent Bernoullis

  • +
  • Use adaptive Independent Metropolis Hastings to learn \(\pi_i\) from past samples plus Rao-Blackwellization

  • +
  • optimal for target where \(\gamma_j\) are independent a posteriori

  • +
  • still uses Metropolis-Hastings Ratio to accept

  • +
  • And they use Monte Carlo frequencies!

  • +
  • but it does not work well for sampling with replacement and importance sampling in general

  • +
+
+
+

Factor Target

+
    +
  • The joint posterior distribution of \(\boldsymbol{\gamma}\) (dropping \(\mathbf{Y}\)) may be factored: \[p({\cal M}_\gamma\mid \mathbf{Y}) \equiv p(\boldsymbol{\gamma}) = \prod_{j = 1}^p p(\gamma_j \mid \boldsymbol{\gamma}_{<j}) +\] where \(\boldsymbol{\gamma}_{< j}\equiv \{\gamma_k\}\) for \(k < j\) and \(p(\gamma_1 \mid \boldsymbol{\gamma}_{<1}) \equiv p(\gamma_1)\).

  • +
  • As \(\gamma_j\) are binary, re-express as \[\begin{equation*} +p(\boldsymbol{\gamma}) = \prod_{j=1}^p(\rho_{j \mid <j})^{\gamma_j}{(1-\rho_{j + \mid <j})}^{1-\gamma_j} +\end{equation*}\] where \(\rho_{j \mid <j} \equiv \Pr(\gamma_j = 1 \mid \boldsymbol{\gamma}_{<j})\) and \(\rho_{1 \mid < 1} = \rho_1\), the marginal probability.

  • +
  • Product of Dependent Bernoullis

  • +
+
+
+

Global Adaptive MCMC Proposal

+
+
+

Factor proposal \[q(\boldsymbol{\gamma}) = \prod_{j = 1}^p q(\gamma_j \mid \boldsymbol{\gamma}_{<j}) = \prod_j \textsf{Ber}(\hat{\rho}_{j \mid <j}) +\]

+
    +
  • Note: \(\Pr(\gamma_j = 1 \mid \boldsymbol{\gamma}_{<j}) = \textsf{E}[\gamma_j = 1 \mid \boldsymbol{\gamma}_{<j}]\)

  • +
  • Fit a sequence of \(p\) regressions \(\gamma_j\) on \(\gamma_{<j}\) \[\begin{align*} +\gamma_1 & = \mu_1 + \epsilon_1 \\ +\gamma_2 & = \mu_2 + \beta_{2 1} (\gamma_1 - \mu_1) + \epsilon_2 \\ +\gamma_3 & = \mu_3 + \beta_{3 1} (\gamma_1 - + \mu_1) + \beta_{3 2} (\gamma_2 - + \mu_2) + \epsilon_3 \\ +& \vdots \\ +\gamma_p & = \mu_p + \beta_{p 1} (\gamma_1 - + \mu_1) \ldots + \beta_{p-1 \, p-1} (\gamma_{p-1} - + \mu_{p-1})+ \epsilon_p +\end{align*}\]

  • +
+
+

+
+
+
+
+

Compositional Regression

+

Approximate model \[\boldsymbol{\gamma}\sim \textsf{N}(\boldsymbol{\mu}, \boldsymbol{\Sigma}_{\boldsymbol{\gamma}})\]

+
    +
  • Wermouth (1980) compositional regression \[ \mathbf{G}= \mathbf{1}_{T} \boldsymbol{\mu}^T + (\mathbf{G}- \mathbf{1}_T \boldsymbol{\mu}^T) \mathbf{B}+ \boldsymbol{\epsilon} +\]

  • +
  • \(\mathbf{G}\) is \(T \times p\) matrix where row \(t\) is \(\boldsymbol{\gamma}_t\)

  • +
  • \(\boldsymbol{\mu}\) is the \(p\) dimensional vector of \(\textsf{E}[\boldsymbol{\gamma}]\)

  • +
  • \(\boldsymbol{\Sigma}_{\boldsymbol{\gamma}} = \mathbf{U}^T \mathbf{U}\) where \(\mathbf{U}\) is upper triangular Cholesky decomposition of covariance matrix of \(\boldsymbol{\gamma}\) (\(p \times p\))

  • +
  • \(\mathbf{B}^T = \mathbf{I}_p - diag(\mathbf{U})^{-1} \mathbf{U}^{-T}\) (lower triangle)

  • +
  • \(\mathbf{B}\) is a \(p \times p\) upper triangular matrix with zeros on the diagonal and regression coefficients for \(jth\) regression in row \(j\)

  • +
+
+
+

Estimators of \(\mathbf{B}\) and \(\boldsymbol{\mu}\)

+
    +
  • OLS is BLUE and consistent, but \(\mathbf{G}\) may not be full rank

  • +
  • apply Bayesian Shrinkage with “priors” on \(\boldsymbol{\mu}\) (non-informative or Normal) and \(\Sigma\) (inverse-Wishart)

  • +
  • pseudo-posterior mean \(\boldsymbol{\mu}\) is the current estimate of the marginal inclusion probabilities \(\bar{\boldsymbol{\gamma}} = \hat{\boldsymbol{\mu}}\)

  • +
  • use pseudo-posterior mean for \(\boldsymbol{\Sigma}\)

  • +
  • one Cholesky decomposition provides all coefficients for the \(p\) predictions for proposing \(\boldsymbol{\gamma}^*\)

  • +
  • constrain predicted values \(\hat{\rho}_{j \mid <j} \in (\delta, 1-\delta)\)

  • +
  • generate \(\boldsymbol{\gamma}^*_j \mid \boldsymbol{\gamma}^*_{< j} \sim \textsf{Ber}(\hat{\rho}_{j \mid <j})\)

  • +
  • use as proposal for Adaptive Independent Metropolis-Hastings or Importance Sampling (Accept all)

  • +
+
+
+

Horvitz-Thompson

+
    +
  • use only the \(n\) unique models

  • +
  • inclusion probability that \(\boldsymbol{\gamma}_i \in S\) is included under IS (PPSWR) \[\pi_i = 1 - (1 - q(\boldsymbol{\gamma}_i))^T\]

  • +
  • HT estimate of normalizing constant \[\hat{C} = \frac{1}{n} \sum_{i \in n} \frac{p(\mathbf{Y}\mid {{\cal M}}_i)p({{\cal M}}_i)} {\pi_i}\]

  • +
  • Ratio HT estimate of posterior probabilities \[p({\cal M}_\gamma\mid \mathbf{Y}) = \frac{\sum_{i \in n} I({{\cal M}}_i = {\cal M}_\gamma) p(\mathbf{Y}\mid {{\cal M}}_i)p({{\cal M}}_i)/\pi_{\boldsymbol{\gamma}}} +{\sum_{i \in n} \frac{p(\mathbf{Y}\mid {{\cal M}}_i)p({{\cal M}}_i)} {\pi_i}} = +\frac { p(\mathbf{Y}\mid {\cal M}_\gamma)p({{\cal M}}_i)/\pi_{\boldsymbol{\gamma}}} +{\sum_{i \in n} \frac{p(\mathbf{Y}\mid {{\cal M}}_i)p({{\cal M}}_i)} {\pi_i}}\]

  • +
  • Estimate of Marginal Inclusion Probabilities

  • +
+

\[p(\gamma_j = 1 \mid \mathbf{Y}) = \frac{\sum_{i \in n} p(\mathbf{Y}\mid {{\cal M}}_i)p({\cal M}_\gamma)/\pi_{\boldsymbol{\gamma}}} +{\sum_{i \in n} \frac{p(\mathbf{Y}\mid {{\cal M}}_i)p({{\cal M}}_i)} {\pi_i}}$ +\]

+
+
+

Simulation

+
+
+
+
    +
  • tecator data (Griffin et al (2021))

  • +
  • a sample of \(p = 20\) variables

  • +
  • compare

    +
      +
    • enumeration
    • +
    • MCMC with add, delete, and swap moves
    • +
    • Adaptive MCMC
    • +
    • Importance Sampling with HT
    • +
  • +
  • same settings burnin.it, MCMC.it, thin
    +

  • +
+
+
+
+

+
+
+
+
+
+
+
+

MSE Comparision

+
+
+
+
+

+
+
+
+
+
+

+
+
+
+
+
+
+

Basu’s Estimator of Total

+

Basu (197), Meeden and Ghosh (1983) : \[C = \sum_{i \in S} p(\mathbf{Y}\mid {{\cal M}}_i) p({{\cal M}}_i) + \frac{1}{n} \sum_{i \in S} \frac{p(\mathbf{Y}\mid {{\cal M}}_i)p({{\cal M}}_i)}{\pi_i} \times (1 - \sum_{i \notin S} \pi_i)\]

+
    +
  • Model-based: Let \(m_i = p(\mathbf{Y}\mid {{\cal M}}_i) p({{\cal M}}_i)\) \[\begin{align} +m_i \mid \pi_i &\mathrel{\mathop{\sim}\limits^{\rm ind}}N(\pi_i \beta, \sigma^2 \pi_i^2) \\ +p(\beta, \sigma^2) & \propto 1/\sigma^2 +\end{align}\]

  • +
  • posterior mean of \(\beta\) is \(\frac{1}{n} \sum_{i \in S} \frac{m_i}{\pi_i}\) (HT)

  • +
  • using posterior predictive \[\begin{align*} \hat{C} & = \sum_i m_i + \sum_{i \notin S} \hat{\beta} \pi_i += \sum_i m_i + \frac{1}{n} \sum_{i \in S} \frac{m_i}{\pi_i}\sum_{i \in S} (1 - \pi_i) +\end{align*}\]

  • +
  • accounts for probability on models not yet observed!

  • +
+
+
+

Final Posterior Estimates

+
    +
  • estimate of posterior probability \({\cal M}_\gamma\) \[ +\frac{p(\mathbf{Y}\mid {\cal M}_\gamma) p({\cal M}_\gamma)}{\sum_{i in S} p(\mathbf{Y}\mid {{\cal M}}_i) p({{\cal M}}_i)} + \frac{1}{n} \sum_{i \in S} \frac{p(\mathbf{Y}\mid {{\cal M}}_i) p(\boldsymbol{{\cal M}}_i)}{\pi_i}\sum_{i \in S} (1 - \pi_i) +\]

  • +
  • Uses renormalized marginal likelihoods of sampled models

  • +
  • Computing marginal inclusion probabilities

  • +
  • What about \(\textsf{E}[\boldsymbol{\beta}\mid \mathbf{Y}]\), \(\textsf{E}[\mathbf{X}\boldsymbol{\beta}\mid \mathbf{Y}]\), \(\textsf{E}[\mathbf{Y}^* \mid \mathbf{Y}]\) or \(p(\Delta \mid \mathbf{Y})\)?

  • +
+
+
+

Continued Adaptation ?

+
    +
  • can update Cholesky with rank 1 updates with new models
  • +
  • how to combine IS with MH samples (weighting) ?
  • +
  • HT/Hajek - computational complexity involved if we need to compute inclusion probability for all models based on updates (previous models and future models)
  • +
  • Basu (1971) suggests approach for PPSWOR (adaptation?)
  • +
+
+
+

Refinements

+
+
+
    +
  • Need to avoid MCMC for pseudo Bayesian posteriors for +
      +
    • learning proposal distribution in sample design for models
    • +
    • estimation of posterior model probabilities in model-based approaches (ie sampling from predictive distribution)
    • +
    • estimation of general quantities under BMA?
    • +
  • +
  • avoid infinite regret
  • +
+
+

+
+
+
+
+

Summary

+
+
+
    +
  • Adaptive Independent Metropolis proposal for models (use in more complex IS)

  • +
  • Use observed values of unique marginal likelihoods of models for estimating posterior distribution

  • +
  • Bayes estimates of MC output

  • +
  • Basu’s Elephants seem to be well, holding up the Bayesian World

  • +
  • and the Circus Statistician is still employed!

  • +
+
+

+
+
+
+
+

Thank You!

+

Code in development version of BAS on https://github.com/merliseclyde/BAS

+
+
+

References

+

Meeden and Ghosh (1983) https://www.jstor.org/stable/2240483

+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AMC-talk_files/figure-revealjs/unnamed-chunk-2-1.png b/AMC-talk_files/figure-revealjs/unnamed-chunk-2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..75cc30181b0e604bbe69f088ff65e5bf7d953d95 GIT binary patch literal 61643 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 bKzMq8i=&=P^WJgz-{uV(>%-RW`ThR@&Yv)R literal 0 HcmV?d00001 diff --git a/AMC-talk_files/figure-revealjs/unnamed-chunk-3-1.png b/AMC-talk_files/figure-revealjs/unnamed-chunk-3-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3621e3ea9adcc6905f80b5b567d458d1d90f1a33 GIT binary patch literal 75586 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 z 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 literal 0 HcmV?d00001 diff --git a/AMC-talk_files/libs/clipboard/clipboard.min.js b/AMC-talk_files/libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/AMC-talk_files/libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light-border]>.tippy-arrow:after,.tippy-box[data-theme~=light-border]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=light-border]>.tippy-arrow:after{border-color:transparent;border-style:solid}.tippy-box[data-theme~=light-border][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light-border][data-placement^=top]>.tippy-arrow:after{border-top-color:rgba(0,8,16,.2);border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=light-border][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=light-border][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=light-border][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=light-border][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:rgba(0,8,16,.2);border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=light-border][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:16px}.tippy-box[data-theme~=light-border][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=light-border][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light-border][data-placement^=left]>.tippy-arrow:after{border-left-color:rgba(0,8,16,.2);border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=light-border][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=light-border][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=light-border][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=light-border][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:rgba(0,8,16,.2)}.tippy-box[data-theme~=light-border][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=light-border][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=light-border]>.tippy-svg-arrow{fill:#fff}.tippy-box[data-theme~=light-border]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px} \ No newline at end of file diff --git a/AMC-talk_files/libs/quarto-html/popper.min.js b/AMC-talk_files/libs/quarto-html/popper.min.js new file mode 100644 index 0000000..2269d66 --- /dev/null +++ b/AMC-talk_files/libs/quarto-html/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.11.4 - MIT License + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect(),o=1,i=1;if(r(e)&&t){var a=e.offsetHeight,f=e.offsetWidth;f>0&&(o=s(n.width)/f||1),a>0&&(i=s(n.height)/a||1)}return{width:n.width/o,height:n.height/i,top:n.top/i,right:n.right/o,bottom:n.bottom/i,left:n.left/o,x:n.left/o,y:n.top/i}}function c(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function p(e){return e?(e.nodeName||"").toLowerCase():null}function u(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function l(e){return f(u(e)).left+c(e).scrollLeft}function d(e){return t(e).getComputedStyle(e)}function h(e){var t=d(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function m(e,n,o){void 0===o&&(o=!1);var i,a,d=r(n),m=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),v=u(n),g=f(e,m),y={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(d||!d&&!o)&&(("body"!==p(n)||h(v))&&(y=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:c(i)),r(n)?((b=f(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):v&&(b.x=l(v))),{x:g.left+y.scrollLeft-b.x,y:g.top+y.scrollTop-b.y,width:g.width,height:g.height}}function v(e){var t=f(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function g(e){return"html"===p(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||u(e)}function y(e){return["html","body","#document"].indexOf(p(e))>=0?e.ownerDocument.body:r(e)&&h(e)?e:y(g(e))}function b(e,n){var r;void 0===n&&(n=[]);var o=y(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],h(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(b(g(s)))}function x(e){return["table","td","th"].indexOf(p(e))>=0}function w(e){return r(e)&&"fixed"!==d(e).position?e.offsetParent:null}function O(e){for(var n=t(e),i=w(e);i&&x(i)&&"static"===d(i).position;)i=w(i);return i&&("html"===p(i)||"body"===p(i)&&"static"===d(i).position)?n:i||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&r(e)&&"fixed"===d(e).position)return null;var n=g(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(p(n))<0;){var i=d(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var j="top",E="bottom",D="right",A="left",L="auto",P=[j,E,D,A],M="start",k="end",W="viewport",B="popper",H=P.reduce((function(e,t){return e.concat([t+"-"+M,t+"-"+k])}),[]),T=[].concat(P,[L]).reduce((function(e,t){return e.concat([t,t+"-"+M,t+"-"+k])}),[]),R=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function S(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function q(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function V(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function N(e,r){return r===W?V(function(e){var n=t(e),r=u(e),o=n.visualViewport,i=r.clientWidth,a=r.clientHeight,s=0,f=0;return o&&(i=o.width,a=o.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=o.offsetLeft,f=o.offsetTop)),{width:i,height:a,x:s+l(e),y:f}}(e)):n(r)?function(e){var t=f(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(r):V(function(e){var t,n=u(e),r=c(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+l(e),p=-r.scrollTop;return"rtl"===d(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:p}}(u(e)))}function I(e,t,o){var s="clippingParents"===t?function(e){var t=b(g(e)),o=["absolute","fixed"].indexOf(d(e).position)>=0&&r(e)?O(e):e;return n(o)?t.filter((function(e){return n(e)&&q(e,o)&&"body"!==p(e)})):[]}(e):[].concat(t),f=[].concat(s,[o]),c=f[0],u=f.reduce((function(t,n){var r=N(e,n);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),N(e,c));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function _(e){return e.split("-")[1]}function F(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function U(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?_(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case j:t={x:s,y:n.y-r.height};break;case E:t={x:s,y:n.y+n.height};break;case D:t={x:n.x+n.width,y:f};break;case A:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?F(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case M:t[c]=t[c]-(n[p]/2-r[p]/2);break;case k:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function z(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function X(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Y(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.boundary,s=void 0===a?"clippingParents":a,c=r.rootBoundary,p=void 0===c?W:c,l=r.elementContext,d=void 0===l?B:l,h=r.altBoundary,m=void 0!==h&&h,v=r.padding,g=void 0===v?0:v,y=z("number"!=typeof g?g:X(g,P)),b=d===B?"reference":B,x=e.rects.popper,w=e.elements[m?b:d],O=I(n(w)?w:w.contextElement||u(e.elements.popper),s,p),A=f(e.elements.reference),L=U({reference:A,element:x,strategy:"absolute",placement:i}),M=V(Object.assign({},x,L)),k=d===B?M:A,H={top:O.top-k.top+y.top,bottom:k.bottom-O.bottom+y.bottom,left:O.left-k.left+y.left,right:k.right-O.right+y.right},T=e.modifiersData.offset;if(d===B&&T){var R=T[i];Object.keys(H).forEach((function(e){var t=[D,E].indexOf(e)>=0?1:-1,n=[j,E].indexOf(e)>=0?"y":"x";H[e]+=R[n]*t}))}return H}var G={placement:"bottom",modifiers:[],strategy:"absolute"};function J(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[A,D].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},ie={left:"right",right:"left",bottom:"top",top:"bottom"};function ae(e){return e.replace(/left|right|bottom|top/g,(function(e){return ie[e]}))}var se={start:"end",end:"start"};function fe(e){return e.replace(/start|end/g,(function(e){return se[e]}))}function ce(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?T:f,p=_(r),u=p?s?H:H.filter((function(e){return _(e)===p})):P,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=Y(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var pe={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,g=C(v),y=f||(g===v||!h?[ae(v)]:function(e){if(C(e)===L)return[];var t=ae(e);return[fe(e),t,fe(t)]}(v)),b=[v].concat(y).reduce((function(e,n){return e.concat(C(n)===L?ce(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,P=!0,k=b[0],W=0;W=0,S=R?"width":"height",q=Y(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),V=R?T?D:A:T?E:j;x[S]>w[S]&&(V=ae(V));var N=ae(V),I=[];if(i&&I.push(q[H]<=0),s&&I.push(q[V]<=0,q[N]<=0),I.every((function(e){return e}))){k=B,P=!1;break}O.set(B,I)}if(P)for(var F=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return k=t,"break"},U=h?3:1;U>0;U--){if("break"===F(U))break}t.placement!==k&&(t.modifiersData[r]._skip=!0,t.placement=k,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function ue(e,t,n){return i(e,a(t,n))}var le={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,g=n.tetherOffset,y=void 0===g?0:g,b=Y(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=_(t.placement),L=!w,P=F(x),k="x"===P?"y":"x",W=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,q={x:0,y:0};if(W){if(s){var V,N="y"===P?j:A,I="y"===P?E:D,U="y"===P?"height":"width",z=W[P],X=z+b[N],G=z-b[I],J=m?-H[U]/2:0,K=w===M?B[U]:H[U],Q=w===M?-H[U]:-B[U],Z=t.elements.arrow,$=m&&Z?v(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=ue(0,B[U],$[U]),oe=L?B[U]/2-J-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=L?-B[U]/2+J+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&O(t.elements.arrow),se=ae?"y"===P?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(V=null==S?void 0:S[P])?V:0,ce=z+ie-fe,pe=ue(m?a(X,z+oe-fe-se):X,z,m?i(G,ce):G);W[P]=pe,q[P]=pe-z}if(c){var le,de="x"===P?j:A,he="x"===P?E:D,me=W[k],ve="y"===k?"height":"width",ge=me+b[de],ye=me-b[he],be=-1!==[j,A].indexOf(x),xe=null!=(le=null==S?void 0:S[k])?le:0,we=be?ge:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ye,je=m&&be?function(e,t,n){var r=ue(e,t,n);return r>n?n:r}(we,me,Oe):ue(m?we:ge,me,m?Oe:ye);W[k]=je,q[k]=je-me}t.modifiersData[r]=q}},requiresIfExists:["offset"]};var de={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=F(s),c=[A,D].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return z("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:X(e,P))}(o.padding,n),u=v(i),l="y"===f?j:A,d="y"===f?E:D,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],g=O(i),y=g?"y"===f?g.clientHeight||0:g.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],L=y/2-u[c]/2+b,M=ue(x,L,w),k=f;n.modifiersData[r]=((t={})[k]=M,t.centerOffset=M-L,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&q(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function he(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function me(e){return[j,D,E,A].some((function(t){return e[t]>=0}))}var ve={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=Y(t,{elementContext:"reference"}),s=Y(t,{altBoundary:!0}),f=he(a,r),c=he(s,o,i),p=me(f),u=me(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},ge=K({defaultModifiers:[Z,$,ne,re]}),ye=[Z,$,ne,re,oe,pe,le,de,ve],be=K({defaultModifiers:ye});e.applyStyles=re,e.arrow=de,e.computeStyles=ne,e.createPopper=be,e.createPopperLite=ge,e.defaultModifiers=ye,e.detectOverflow=Y,e.eventListeners=Z,e.flip=pe,e.hide=ve,e.offset=oe,e.popperGenerator=K,e.popperOffsets=$,e.preventOverflow=le,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/AMC-talk_files/libs/quarto-html/quarto-html.min.css b/AMC-talk_files/libs/quarto-html/quarto-html.min.css new file mode 100644 index 0000000..c2857c3 --- /dev/null +++ b/AMC-talk_files/libs/quarto-html/quarto-html.min.css @@ -0,0 +1 @@ +/*# sourceMappingURL=0a6b880beb84f9b6f36107a76f82c5b1.css.map */ diff --git a/AMC-talk_files/libs/quarto-html/quarto-syntax-highlighting.css b/AMC-talk_files/libs/quarto-html/quarto-syntax-highlighting.css new file mode 100644 index 0000000..d9fd98f --- /dev/null +++ b/AMC-talk_files/libs/quarto-html/quarto-syntax-highlighting.css @@ -0,0 +1,203 @@ +/* quarto syntax highlight colors */ +:root { + --quarto-hl-ot-color: #003B4F; + --quarto-hl-at-color: #657422; + --quarto-hl-ss-color: #20794D; + --quarto-hl-an-color: #5E5E5E; + --quarto-hl-fu-color: #4758AB; + --quarto-hl-st-color: #20794D; + --quarto-hl-cf-color: #003B4F; + --quarto-hl-op-color: #5E5E5E; + --quarto-hl-er-color: #AD0000; + --quarto-hl-bn-color: #AD0000; + --quarto-hl-al-color: #AD0000; + --quarto-hl-va-color: #111111; + --quarto-hl-bu-color: inherit; + --quarto-hl-ex-color: inherit; + --quarto-hl-pp-color: #AD0000; + --quarto-hl-in-color: #5E5E5E; + --quarto-hl-vs-color: #20794D; + --quarto-hl-wa-color: #5E5E5E; + --quarto-hl-do-color: #5E5E5E; + --quarto-hl-im-color: #00769E; + --quarto-hl-ch-color: #20794D; + --quarto-hl-dt-color: #AD0000; + --quarto-hl-fl-color: #AD0000; + --quarto-hl-co-color: #5E5E5E; + --quarto-hl-cv-color: #5E5E5E; + --quarto-hl-cn-color: #8f5902; + --quarto-hl-sc-color: #5E5E5E; + --quarto-hl-dv-color: #AD0000; + --quarto-hl-kw-color: #003B4F; +} + +/* other quarto variables */ +:root { + --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +pre > code.sourceCode > span { + color: #003B4F; +} + +code span { + color: #003B4F; +} + +code.sourceCode > span { + color: #003B4F; +} + +div.sourceCode, +div.sourceCode pre.sourceCode { + color: #003B4F; +} + +code span.ot { + color: #003B4F; + font-style: inherit; +} + +code span.at { + color: #657422; + font-style: inherit; +} + +code span.ss { + color: #20794D; + font-style: inherit; +} + +code span.an { + color: #5E5E5E; + font-style: inherit; +} + +code span.fu { + color: #4758AB; + font-style: inherit; +} + +code span.st { + color: #20794D; + font-style: inherit; +} + +code span.cf { + color: #003B4F; + font-style: inherit; +} + +code span.op { + color: #5E5E5E; + font-style: inherit; +} + +code span.er { + color: #AD0000; + font-style: inherit; +} + +code span.bn { + color: #AD0000; + font-style: inherit; +} + +code span.al { + color: #AD0000; + font-style: inherit; +} + +code span.va { + color: #111111; + font-style: inherit; +} + +code span.bu { + font-style: inherit; +} + +code span.ex { + font-style: inherit; +} + +code span.pp { + color: #AD0000; + font-style: inherit; +} + +code span.in { + color: #5E5E5E; + font-style: inherit; +} + +code span.vs { + color: #20794D; + font-style: inherit; +} + +code span.wa { + color: #5E5E5E; + font-style: italic; +} + +code span.do { + color: #5E5E5E; + font-style: italic; +} + +code span.im { + color: #00769E; + font-style: inherit; +} + +code span.ch { + color: #20794D; + font-style: inherit; +} + +code span.dt { + color: #AD0000; + font-style: inherit; +} + +code span.fl { + color: #AD0000; + font-style: inherit; +} + +code span.co { + color: #5E5E5E; + font-style: inherit; +} + +code span.cv { + color: #5E5E5E; + font-style: italic; +} + +code span.cn { + color: #8f5902; + font-style: inherit; +} + +code span.sc { + color: #5E5E5E; + font-style: inherit; +} + +code span.dv { + color: #AD0000; + font-style: inherit; +} + +code span.kw { + color: #003B4F; + font-style: inherit; +} + +.prevent-inlining { + content: " !el.hasAttribute("disabled") && !el.getAttribute("aria-hidden") + ); + }; + + /** + * Remove roles and attributes from a tab and its content + * @param {Node} tab The tab + * @param {Node} content The tab content + * @param {Object} settings User settings and options + */ + var destroyTab = function (tab, content, settings) { + // Remove the generated ID + if (tab.id.slice(0, settings.idPrefix.length) === settings.idPrefix) { + tab.id = ""; + } + + // remove event listener + tab.removeEventListener("focus", focusHandler, true); + + // Remove roles + tab.removeAttribute("role"); + tab.removeAttribute("aria-controls"); + tab.removeAttribute("aria-selected"); + tab.removeAttribute("tabindex"); + tab.closest("li").removeAttribute("role"); + content.removeAttribute("role"); + content.removeAttribute("aria-labelledby"); + content.removeAttribute("hidden"); + }; + + /** + * Add the required roles and attributes to a tab and its content + * @param {Node} tab The tab + * @param {Node} content The tab content + * @param {Object} settings User settings and options + */ + var setupTab = function (tab, content, settings) { + // Give tab an ID if it doesn't already have one + if (!tab.id) { + tab.id = settings.idPrefix + content.id; + } + + // Add roles + tab.setAttribute("role", "tab"); + tab.setAttribute("aria-controls", content.id); + tab.closest("li").setAttribute("role", "presentation"); + content.setAttribute("role", "tabpanel"); + content.setAttribute("aria-labelledby", tab.id); + + // Add selected state + if (tab.matches(settings.default)) { + tab.setAttribute("aria-selected", "true"); + } else { + tab.setAttribute("aria-selected", "false"); + content.setAttribute("hidden", "hidden"); + } + + // add focus event listender + tab.addEventListener("focus", focusHandler); + }; + + /** + * Hide a tab and its content + * @param {Node} newTab The new tab that's replacing it + */ + var hide = function (newTab) { + // Variables + var tabGroup = newTab.closest('[role="tablist"]'); + if (!tabGroup) return {}; + var tab = tabGroup.querySelector('[role="tab"][aria-selected="true"]'); + if (!tab) return {}; + var content = document.querySelector(tab.hash); + + // Hide the tab + tab.setAttribute("aria-selected", "false"); + + // Hide the content + if (!content) return { previousTab: tab }; + content.setAttribute("hidden", "hidden"); + + // Return the hidden tab and content + return { + previousTab: tab, + previousContent: content, + }; + }; + + /** + * Show a tab and its content + * @param {Node} tab The tab + * @param {Node} content The tab content + */ + var show = function (tab, content) { + tab.setAttribute("aria-selected", "true"); + content.removeAttribute("hidden"); + tab.focus(); + }; + + /** + * Toggle a new tab + * @param {Node} tab The tab to show + */ + var toggle = function (tab) { + // Make sure there's a tab to toggle and it's not already active + if (!tab || tab.getAttribute("aria-selected") == "true") return; + + // Variables + var content = document.querySelector(tab.hash); + if (!content) return; + + // Hide active tab and content + var details = hide(tab); + + // Show new tab and content + show(tab, content); + + // Add event details + details.tab = tab; + details.content = content; + + // Emit a custom event + emitEvent(tab, details); + }; + + /** + * Get all of the tabs in a tablist + * @param {Node} tab A tab from the list + * @return {Object} The tabs and the index of the currently active one + */ + var getTabsMap = function (tab) { + var tabGroup = tab.closest('[role="tablist"]'); + var tabs = tabGroup ? tabGroup.querySelectorAll('[role="tab"]') : null; + if (!tabs) return; + return { + tabs: tabs, + index: Array.prototype.indexOf.call(tabs, tab), + }; + }; + + /** + * Switch the active tab based on keyboard activity + * @param {Node} tab The currently active tab + * @param {Key} key The key that was pressed + */ + var switchTabs = function (tab, key) { + // Get a map of tabs + var map = getTabsMap(tab); + if (!map) return; + var length = map.tabs.length - 1; + var index; + + // Go to previous tab + if (["ArrowUp", "ArrowLeft", "Up", "Left"].indexOf(key) > -1) { + index = map.index < 1 ? length : map.index - 1; + } + + // Go to next tab + else if (["ArrowDown", "ArrowRight", "Down", "Right"].indexOf(key) > -1) { + index = map.index === length ? 0 : map.index + 1; + } + + // Go to home + else if (key === "Home") { + index = 0; + } + + // Go to end + else if (key === "End") { + index = length; + } + + // Toggle the tab + toggle(map.tabs[index]); + }; + + /** + * Create the Constructor object + */ + var Constructor = function (selector, options) { + // + // Variables + // + + var publicAPIs = {}; + var settings, tabWrapper; + + // + // Methods + // + + publicAPIs.destroy = function () { + // Get all tabs + var tabs = tabWrapper.querySelectorAll("a"); + + // Add roles to tabs + Array.prototype.forEach.call(tabs, function (tab) { + // Get the tab content + var content = document.querySelector(tab.hash); + if (!content) return; + + // Setup the tab + destroyTab(tab, content, settings); + }); + + // Remove role from wrapper + tabWrapper.removeAttribute("role"); + + // Remove event listeners + document.documentElement.removeEventListener( + "click", + clickHandler, + true + ); + tabWrapper.removeEventListener("keydown", keyHandler, true); + + // Reset variables + settings = null; + tabWrapper = null; + }; + + /** + * Setup the DOM with the proper attributes + */ + publicAPIs.setup = function () { + // Variables + tabWrapper = document.querySelector(selector); + if (!tabWrapper) return; + var tabs = tabWrapper.querySelectorAll("a"); + + // Add role to wrapper + tabWrapper.setAttribute("role", "tablist"); + + // Add roles to tabs. provide dynanmic tab indexes if we are within reveal + var contentTabindexes = + window.document.body.classList.contains("reveal-viewport"); + var nextTabindex = 1; + Array.prototype.forEach.call(tabs, function (tab) { + if (contentTabindexes) { + tab.setAttribute("tabindex", "" + nextTabindex++); + } else { + tab.setAttribute("tabindex", "0"); + } + + // Get the tab content + var content = document.querySelector(tab.hash); + if (!content) return; + + // set tab indexes for content + if (contentTabindexes) { + getKeyboardFocusableElements(content).forEach(function (el) { + el.setAttribute("tabindex", "" + nextTabindex++); + }); + } + + // Setup the tab + setupTab(tab, content, settings); + }); + }; + + /** + * Toggle a tab based on an ID + * @param {String|Node} id The tab to toggle + */ + publicAPIs.toggle = function (id) { + // Get the tab + var tab = id; + if (typeof id === "string") { + tab = document.querySelector( + selector + ' [role="tab"][href*="' + id + '"]' + ); + } + + // Toggle the tab + toggle(tab); + }; + + /** + * Handle click events + */ + var clickHandler = function (event) { + // Only run on toggles + var tab = event.target.closest(selector + ' [role="tab"]'); + if (!tab) return; + + // Prevent link behavior + event.preventDefault(); + + // Toggle the tab + toggle(tab); + }; + + /** + * Handle keydown events + */ + var keyHandler = function (event) { + // Only run if a tab is in focus + var tab = document.activeElement; + if (!tab.matches(selector + ' [role="tab"]')) return; + + // Only run for specific keys + if (["Home", "End"].indexOf(event.key) < 0) return; + + // Switch tabs + switchTabs(tab, event.key); + }; + + /** + * Initialize the instance + */ + var init = function () { + // Merge user options with defaults + settings = extend(defaults, options || {}); + + // Setup the DOM + publicAPIs.setup(); + + // Add event listeners + document.documentElement.addEventListener("click", clickHandler, true); + tabWrapper.addEventListener("keydown", keyHandler, true); + }; + + // + // Initialize and return the Public APIs + // + + init(); + return publicAPIs; + }; + + // + // Return the Constructor + // + + return Constructor; + } +); diff --git a/AMC-talk_files/libs/quarto-html/tippy.css b/AMC-talk_files/libs/quarto-html/tippy.css new file mode 100644 index 0000000..e6ae635 --- /dev/null +++ b/AMC-talk_files/libs/quarto-html/tippy.css @@ -0,0 +1 @@ +.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/AMC-talk_files/libs/quarto-html/tippy.umd.min.js b/AMC-talk_files/libs/quarto-html/tippy.umd.min.js new file mode 100644 index 0000000..ca292be --- /dev/null +++ b/AMC-talk_files/libs/quarto-html/tippy.umd.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); + diff --git a/AMC-talk_files/libs/revealjs/dist/reset.css b/AMC-talk_files/libs/revealjs/dist/reset.css new file mode 100644 index 0000000..e238539 --- /dev/null +++ b/AMC-talk_files/libs/revealjs/dist/reset.css @@ -0,0 +1,30 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v4.0 | 20180602 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +main, menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, main, menu, nav, section { + display: block; +} \ No newline at end of file diff --git a/AMC-talk_files/libs/revealjs/dist/reveal.css b/AMC-talk_files/libs/revealjs/dist/reveal.css new file mode 100644 index 0000000..5f80fd0 --- /dev/null +++ b/AMC-talk_files/libs/revealjs/dist/reveal.css @@ -0,0 +1,8 @@ +/*! +* reveal.js 4.3.1 +* https://revealjs.com +* MIT licensed +* +* Copyright (C) 2011-2022 Hakim El Hattab, https://hakim.se +*/ +.reveal .r-stretch,.reveal .stretch{max-width:none;max-height:none}.reveal pre.r-stretch code,.reveal pre.stretch code{height:100%;max-height:100%;box-sizing:border-box}.reveal .r-fit-text{display:inline-block;white-space:nowrap}.reveal .r-stack{display:grid}.reveal .r-stack>*{grid-area:1/1;margin:auto}.reveal .r-hstack,.reveal .r-vstack{display:flex}.reveal .r-hstack img,.reveal .r-hstack video,.reveal .r-vstack img,.reveal .r-vstack video{min-width:0;min-height:0;-o-object-fit:contain;object-fit:contain}.reveal .r-vstack{flex-direction:column;align-items:center;justify-content:center}.reveal .r-hstack{flex-direction:row;align-items:center;justify-content:center}.reveal .items-stretch{align-items:stretch}.reveal .items-start{align-items:flex-start}.reveal .items-center{align-items:center}.reveal .items-end{align-items:flex-end}.reveal .justify-between{justify-content:space-between}.reveal .justify-around{justify-content:space-around}.reveal .justify-start{justify-content:flex-start}.reveal .justify-center{justify-content:center}.reveal .justify-end{justify-content:flex-end}html.reveal-full-page{width:100%;height:100%;height:100vh;height:calc(var(--vh,1vh) * 100);overflow:hidden}.reveal-viewport{height:100%;overflow:hidden;position:relative;line-height:1;margin:0;background-color:#fff;color:#000}.reveal-viewport:-webkit-full-screen{top:0!important;left:0!important;width:100%!important;height:100%!important;transform:none!important}.reveal-viewport:-ms-fullscreen{top:0!important;left:0!important;width:100%!important;height:100%!important;transform:none!important}.reveal-viewport:fullscreen{top:0!important;left:0!important;width:100%!important;height:100%!important;transform:none!important}.reveal .slides section .fragment{opacity:0;visibility:hidden;transition:all .2s ease;will-change:opacity}.reveal .slides section .fragment.visible{opacity:1;visibility:inherit}.reveal .slides section .fragment.disabled{transition:none}.reveal .slides section .fragment.grow{opacity:1;visibility:inherit}.reveal .slides section .fragment.grow.visible{transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1;visibility:inherit}.reveal .slides section .fragment.shrink.visible{transform:scale(.7)}.reveal .slides section .fragment.zoom-in{transform:scale(.1)}.reveal .slides section .fragment.zoom-in.visible{transform:none}.reveal .slides section .fragment.fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-out.visible{opacity:0;visibility:hidden}.reveal .slides section .fragment.semi-fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.strike{opacity:1;visibility:inherit}.reveal .slides section .fragment.strike.visible{text-decoration:line-through}.reveal .slides section .fragment.fade-up{transform:translate(0,40px)}.reveal .slides section .fragment.fade-up.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-down{transform:translate(0,-40px)}.reveal .slides section .fragment.fade-down.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-right{transform:translate(-40px,0)}.reveal .slides section .fragment.fade-right.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-left{transform:translate(40px,0)}.reveal .slides section .fragment.fade-left.visible{transform:translate(0,0)}.reveal .slides section .fragment.current-visible,.reveal .slides section .fragment.fade-in-then-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.current-visible.current-fragment,.reveal .slides section .fragment.fade-in-then-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.fade-in-then-semi-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-blue,.reveal .slides section .fragment.highlight-current-blue,.reveal .slides section .fragment.highlight-current-green,.reveal .slides section .fragment.highlight-current-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-red{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal .slides section .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .slides section .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .slides section .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:"";font-style:italic}.reveal iframe{z-index:1}.reveal a{position:relative}@keyframes bounce-right{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(10px)}30%{transform:translateX(-5px)}}@keyframes bounce-left{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(-10px)}30%{transform:translateX(5px)}}@keyframes bounce-down{0%,10%,25%,40%,50%{transform:translateY(0)}20%{transform:translateY(10px)}30%{transform:translateY(-5px)}}.reveal .controls{display:none;position:absolute;top:auto;bottom:12px;right:12px;left:auto;z-index:11;color:#000;pointer-events:none;font-size:10px}.reveal .controls button{position:absolute;padding:0;background-color:transparent;border:0;outline:0;cursor:pointer;color:currentColor;transform:scale(.9999);transition:color .2s ease,opacity .2s ease,transform .2s ease;z-index:2;pointer-events:auto;font-size:inherit;visibility:hidden;opacity:0;-webkit-appearance:none;-webkit-tap-highlight-color:transparent}.reveal .controls .controls-arrow:after,.reveal .controls .controls-arrow:before{content:"";position:absolute;top:0;left:0;width:2.6em;height:.5em;border-radius:.25em;background-color:currentColor;transition:all .15s ease,background-color .8s ease;transform-origin:.2em 50%;will-change:transform}.reveal .controls .controls-arrow{position:relative;width:3.6em;height:3.6em}.reveal .controls .controls-arrow:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal .controls .controls-arrow:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}.reveal .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(40deg)}.reveal .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-40deg)}.reveal .controls .controls-arrow:active:before{transform:translateX(.5em) translateY(1.55em) rotate(36deg)}.reveal .controls .controls-arrow:active:after{transform:translateX(.5em) translateY(1.55em) rotate(-36deg)}.reveal .controls .navigate-left{right:6.4em;bottom:3.2em;transform:translateX(-10px)}.reveal .controls .navigate-left.highlight{animation:bounce-left 2s 50 both ease-out}.reveal .controls .navigate-right{right:0;bottom:3.2em;transform:translateX(10px)}.reveal .controls .navigate-right .controls-arrow{transform:rotate(180deg)}.reveal .controls .navigate-right.highlight{animation:bounce-right 2s 50 both ease-out}.reveal .controls .navigate-up{right:3.2em;bottom:6.4em;transform:translateY(-10px)}.reveal .controls .navigate-up .controls-arrow{transform:rotate(90deg)}.reveal .controls .navigate-down{right:3.2em;bottom:-1.4em;padding-bottom:1.4em;transform:translateY(10px)}.reveal .controls .navigate-down .controls-arrow{transform:rotate(-90deg)}.reveal .controls .navigate-down.highlight{animation:bounce-down 2s 50 both ease-out}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled{opacity:.3}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled:hover{opacity:1}.reveal .controls[data-controls-back-arrows=hidden] .navigate-up.enabled{opacity:0;visibility:hidden}.reveal .controls .enabled{visibility:visible;opacity:.9;cursor:pointer;transform:none}.reveal .controls .enabled.fragmented{opacity:.5}.reveal .controls .enabled.fragmented:hover,.reveal .controls .enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled{opacity:.3}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=hidden] .navigate-left.enabled{opacity:0;visibility:hidden}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled{opacity:.3}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled:hover{opacity:1}.reveal.rtl .controls[data-controls-back-arrows=hidden] .navigate-right.enabled{opacity:0;visibility:hidden}.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-down,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-up{display:none}.reveal:not(.has-vertical-slides) .controls .navigate-left,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-left{bottom:1.4em;right:5.5em}.reveal:not(.has-vertical-slides) .controls .navigate-right,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-right{bottom:1.4em;right:.5em}.reveal:not(.has-horizontal-slides) .controls .navigate-up{right:1.4em;bottom:5em}.reveal:not(.has-horizontal-slides) .controls .navigate-down{right:1.4em;bottom:.5em}.reveal.has-dark-background .controls{color:#fff}.reveal.has-light-background .controls{color:#000}.reveal.no-hover .controls .controls-arrow:active:before,.reveal.no-hover .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal.no-hover .controls .controls-arrow:active:after,.reveal.no-hover .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}@media screen and (min-width:500px){.reveal .controls[data-controls-layout=edges]{top:0;right:0;bottom:0;left:0}.reveal .controls[data-controls-layout=edges] .navigate-down,.reveal .controls[data-controls-layout=edges] .navigate-left,.reveal .controls[data-controls-layout=edges] .navigate-right,.reveal .controls[data-controls-layout=edges] .navigate-up{bottom:auto;right:auto}.reveal .controls[data-controls-layout=edges] .navigate-left{top:50%;left:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-right{top:50%;right:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-up{top:.8em;left:50%;margin-left:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-down{bottom:-.3em;left:50%;margin-left:-1.8em}}.reveal .progress{position:absolute;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10;background-color:rgba(0,0,0,.2);color:#fff}.reveal .progress:after{content:"";display:block;position:absolute;height:10px;width:100%;top:-10px}.reveal .progress span{display:block;height:100%;width:100%;background-color:currentColor;transition:transform .8s cubic-bezier(.26,.86,.44,.985);transform-origin:0 0;transform:scaleX(0)}.reveal .slide-number{position:absolute;display:block;right:8px;bottom:8px;z-index:31;font-family:Helvetica,sans-serif;font-size:12px;line-height:1;color:#fff;background-color:rgba(0,0,0,.4);padding:5px}.reveal .slide-number a{color:currentColor}.reveal .slide-number-delimiter{margin:0 3px}.reveal{position:relative;width:100%;height:100%;overflow:hidden;touch-action:pinch-zoom}.reveal.embedded{touch-action:pan-y}.reveal .slides{position:absolute;width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin:auto;pointer-events:none;overflow:visible;z-index:1;text-align:center;perspective:600px;perspective-origin:50% 40%}.reveal .slides>section{perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;pointer-events:auto;z-index:10;transform-style:flat;transition:transform-origin .8s cubic-bezier(.26,.86,.44,.985),transform .8s cubic-bezier(.26,.86,.44,.985),visibility .8s cubic-bezier(.26,.86,.44,.985),opacity .8s cubic-bezier(.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{transition-duration:.4s}.reveal[data-transition-speed=slow] .slides section{transition-duration:1.2s}.reveal .slides section[data-transition-speed=fast]{transition-duration:.4s}.reveal .slides section[data-transition-speed=slow]{transition-duration:1.2s}.reveal .slides>section.stack{padding-top:0;padding-bottom:0;pointer-events:none;height:100%}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal .slides>section:empty,.reveal .slides>section>section:empty,.reveal .slides>section>section[data-background-interactive],.reveal .slides>section[data-background-interactive]{pointer-events:none}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:0!important}.reveal .slides>section:not(.present),.reveal .slides>section>section:not(.present){pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section.future,.reveal .slides>section.past,.reveal .slides>section>section.future,.reveal .slides>section>section.past{opacity:0}.reveal .slides>section[data-transition=slide].past,.reveal .slides>section[data-transition~=slide-out].past,.reveal.slide .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=slide].future,.reveal .slides>section[data-transition~=slide-in].future,.reveal.slide .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=slide].past,.reveal .slides>section>section[data-transition~=slide-out].past,.reveal.slide .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=slide].future,.reveal .slides>section>section[data-transition~=slide-in].future,.reveal.slide .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides>section[data-transition=linear].past,.reveal .slides>section[data-transition~=linear-out].past,.reveal.linear .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal .slides>section[data-transition~=linear-in].future,.reveal.linear .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal .slides>section>section[data-transition~=linear-out].past,.reveal.linear .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal .slides>section>section[data-transition~=linear-in].future,.reveal.linear .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides section[data-transition=default].stack,.reveal.default .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=default].past,.reveal .slides>section[data-transition~=default-out].past,.reveal.default .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section[data-transition~=default-in].future,.reveal.default .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section[data-transition~=default-out].past,.reveal.default .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section[data-transition~=default-in].future,.reveal.default .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=convex].stack,.reveal.convex .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=convex].past,.reveal .slides>section[data-transition~=convex-out].past,.reveal.convex .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=convex].future,.reveal .slides>section[data-transition~=convex-in].future,.reveal.convex .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=convex].past,.reveal .slides>section>section[data-transition~=convex-out].past,.reveal.convex .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=convex].future,.reveal .slides>section>section[data-transition~=convex-in].future,.reveal.convex .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=concave].stack,.reveal.concave .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=concave].past,.reveal .slides>section[data-transition~=concave-out].past,.reveal.concave .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal .slides>section[data-transition~=concave-in].future,.reveal.concave .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal .slides>section>section[data-transition~=concave-out].past,.reveal.concave .slides>section>section:not([data-transition]).past{transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal .slides>section>section[data-transition~=concave-in].future,.reveal.concave .slides>section>section:not([data-transition]).future{transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides section[data-transition=zoom],.reveal.zoom .slides section:not([data-transition]){transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal .slides>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section:not([data-transition]).past{visibility:hidden;transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal .slides>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section:not([data-transition]).future{visibility:hidden;transform:scale(.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal .slides>section>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section>section:not([data-transition]).past{transform:scale(16)}.reveal .slides>section>section[data-transition=zoom].future,.reveal .slides>section>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section>section:not([data-transition]).future{transform:scale(.2)}.reveal.cube .slides{perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box;transform-style:preserve-3d}.reveal.center.cube .slides section{min-height:0}.reveal.cube .slides section:not(.stack):before{content:"";position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:"";position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0 0}.reveal.cube .slides>section.past{transform-origin:100% 0;transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{transform-origin:0 0;transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{transform-origin:0 100%;transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{transform-origin:0 0;transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{perspective-origin:0 50%;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;box-sizing:border-box;transform-style:preserve-3d}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:"";position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:"";position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0 0}.reveal.page .slides>section.past{transform-origin:0 0;transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{transform-origin:100% 0;transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{transform-origin:0 0;transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{transform-origin:0 100%;transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section:not([data-transition]),.reveal.fade .slides>section>section:not([data-transition]){transform:none;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section{transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section:not([data-transition]){transform:none;transition:none}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;transition:all 1s ease}.reveal .pause-overlay .resume-button{position:absolute;bottom:20px;right:20px;color:#ccc;border-radius:2px;padding:6px 14px;border:2px solid #ccc;font-size:16px;background:0 0;cursor:pointer}.reveal .pause-overlay .resume-button:hover{color:#fff;border-color:#fff}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.reveal .no-transition,.reveal .no-transition *,.reveal .slides.disable-slide-transitions section{transition:none!important}.reveal .slides.disable-slide-transitions section{transform:none!important}.reveal .backgrounds{position:absolute;width:100%;height:100%;top:0;left:0;perspective:600px}.reveal .slide-background{display:none;position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;overflow:hidden;background-color:rgba(0,0,0,0);transition:all .8s cubic-bezier(.26,.86,.44,.985)}.reveal .slide-background-content{position:absolute;width:100%;height:100%;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.reveal .slide-background.stack{display:block}.reveal .slide-background.present{opacity:1;visibility:visible;z-index:2}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal .slide-background video{position:absolute;width:100%;height:100%;max-width:none;max-height:none;top:0;left:0;-o-object-fit:cover;object-fit:cover}.reveal .slide-background[data-background-size=contain] video{-o-object-fit:contain;object-fit:contain}.reveal>.backgrounds .slide-background[data-background-transition=none],.reveal[data-background-transition=none]>.backgrounds .slide-background:not([data-background-transition]){transition:none}.reveal>.backgrounds .slide-background[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background:not([data-background-transition]){opacity:1}.reveal>.backgrounds .slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.past:not([data-background-transition]){transform:translate(-100%,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.future:not([data-background-transition]){transform:translate(100%,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){transform:translate(0,-100%)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){transform:translate(0,100%)}.reveal>.backgrounds .slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background:not([data-background-transition]){transition-timing-function:ease}.reveal>.backgrounds .slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{transition-duration:.4s}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{transition-duration:1.2s}.reveal [data-auto-animate-target^=unmatched]{will-change:opacity}.reveal section[data-auto-animate]:not(.stack):not([data-auto-animate=running]) [data-auto-animate-target^=unmatched]{opacity:0}.reveal.overview{perspective-origin:50% 50%;perspective:700px}.reveal.overview .slides{-moz-transform-style:preserve-3d}.reveal.overview .slides section{height:100%;top:0!important;opacity:1!important;overflow:hidden;visibility:visible!important;cursor:pointer;box-sizing:border-box}.reveal.overview .slides section.present,.reveal.overview .slides section:hover{outline:10px solid rgba(150,150,150,.4);outline-offset:10px}.reveal.overview .slides section .fragment{opacity:1;transition:none}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0 0;outline:0;overflow:visible}.reveal.overview .backgrounds{perspective:inherit;-moz-transform-style:preserve-3d}.reveal.overview .backgrounds .slide-background{opacity:1;visibility:visible;outline:10px solid rgba(150,150,150,.1);outline-offset:10px}.reveal.overview .backgrounds .slide-background.stack{overflow:visible}.reveal.overview .slides section,.reveal.overview-deactivating .slides section{transition:none}.reveal.overview .backgrounds .slide-background,.reveal.overview-deactivating .backgrounds .slide-background{transition:none}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl code,.reveal.rtl pre{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{transform-origin:100% 0}.reveal.has-parallax-background .backgrounds{transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{transition-duration:.4s}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{transition-duration:1.2s}.reveal>.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);transition:all .3s ease}.reveal>.overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;transition:all .3s ease}.reveal>.overlay header{position:absolute;left:0;top:0;width:100%;padding:5px;z-index:2;box-sizing:border-box}.reveal>.overlay header a{display:inline-block;width:40px;height:40px;line-height:36px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal>.overlay header a:hover{opacity:1}.reveal>.overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal>.overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal>.overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal>.overlay .viewport{position:absolute;display:flex;top:50px;right:0;bottom:0;left:0}.reveal>.overlay.overlay-preview .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;transition:all .3s ease}.reveal>.overlay.overlay-preview.loaded .viewport iframe{opacity:1;visibility:visible}.reveal>.overlay.overlay-preview.loaded .viewport-inner{position:absolute;z-index:-1;left:0;top:45%;width:100%;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-preview .x-frame-error{opacity:0;transition:opacity .3s ease .3s}.reveal>.overlay.overlay-preview.loaded .x-frame-error{opacity:1}.reveal>.overlay.overlay-preview.loaded .spinner{opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.overlay.overlay-help .viewport{overflow:auto;color:#fff}.reveal>.overlay.overlay-help .viewport .viewport-inner{width:600px;margin:auto;padding:20px 20px 80px 20px;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-help .viewport .viewport-inner .title{font-size:20px}.reveal>.overlay.overlay-help .viewport .viewport-inner table{border:1px solid #fff;border-collapse:collapse;font-size:16px}.reveal>.overlay.overlay-help .viewport .viewport-inner table td,.reveal>.overlay.overlay-help .viewport .viewport-inner table th{width:200px;padding:14px;border:1px solid #fff;vertical-align:middle}.reveal>.overlay.overlay-help .viewport .viewport-inner table th{padding-top:20px;padding-bottom:20px}.reveal .playback{position:absolute;left:15px;bottom:20px;z-index:30;cursor:pointer;transition:all .4s ease;-webkit-tap-highlight-color:transparent}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .hljs{min-height:100%}.reveal .hljs table{margin:initial}.reveal .hljs-ln-code,.reveal .hljs-ln-numbers{padding:0;border:0}.reveal .hljs-ln-numbers{opacity:.6;padding-right:.75em;text-align:right;vertical-align:top}.reveal .hljs.has-highlights tr:not(.highlight-line){opacity:.4}.reveal .hljs:not(:first-child).fragment{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}.reveal pre[data-auto-animate-target]{overflow:hidden}.reveal pre[data-auto-animate-target] code{height:100%}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;perspective:400px;perspective-origin:50% 50%}.reveal .roll:hover{background:0 0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;transition:all .4s ease;transform-origin:50% 0;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);transform:translate3d(0,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-origin:50% 0;transform:translate3d(0,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.reveal .speaker-notes{display:none;position:absolute;width:33.3333333333%;height:100%;top:0;left:100%;padding:14px 18px 14px 18px;z-index:1;font-size:18px;line-height:1.4;border:1px solid rgba(0,0,0,.05);color:#222;background-color:#f5f5f5;overflow:auto;box-sizing:border-box;text-align:left;font-family:Helvetica,sans-serif;-webkit-overflow-scrolling:touch}.reveal .speaker-notes .notes-placeholder{color:#ccc;font-style:italic}.reveal .speaker-notes:focus{outline:0}.reveal .speaker-notes:before{content:"Speaker notes";display:block;margin-bottom:10px;opacity:.5}.reveal.show-notes{max-width:75%;overflow:visible}.reveal.show-notes .speaker-notes{display:block}@media screen and (min-width:1600px){.reveal .speaker-notes{font-size:20px}}@media screen and (max-width:1024px){.reveal.show-notes{border-left:0;max-width:none;max-height:70%;max-height:70vh;overflow:visible}.reveal.show-notes .speaker-notes{top:100%;left:0;width:100%;height:30vh;border:0}}@media screen and (max-width:600px){.reveal.show-notes{max-height:60%;max-height:60vh}.reveal.show-notes .speaker-notes{top:100%;height:40vh}.reveal .speaker-notes{font-size:14px}}.zoomed .reveal *,.zoomed .reveal :after,.zoomed .reveal :before{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .controls,.zoomed .reveal .progress{opacity:0}.zoomed .reveal .roll span{background:0 0}.zoomed .reveal .roll span:after{visibility:hidden}html.print-pdf *{-webkit-print-color-adjust:exact}html.print-pdf{width:100%;height:100%;overflow:visible}html.print-pdf body{margin:0 auto!important;border:0;padding:0;float:none!important;overflow:visible}html.print-pdf .nestedarrow,html.print-pdf .reveal .controls,html.print-pdf .reveal .playback,html.print-pdf .reveal .progress,html.print-pdf .reveal.overview,html.print-pdf .state-background{display:none!important}html.print-pdf .reveal pre code{overflow:hidden!important;font-family:Courier,"Courier New",monospace!important}html.print-pdf .reveal{width:auto!important;height:auto!important;overflow:hidden!important}html.print-pdf .reveal .slides{position:static;width:100%!important;height:auto!important;zoom:1!important;pointer-events:initial;left:auto;top:auto;margin:0!important;padding:0!important;overflow:visible;display:block;perspective:none;perspective-origin:50% 50%}html.print-pdf .reveal .slides .pdf-page{position:relative;overflow:hidden;z-index:1;page-break-after:always}html.print-pdf .reveal .slides section{visibility:visible!important;display:block!important;position:absolute!important;margin:0!important;padding:0!important;box-sizing:border-box!important;min-height:1px;opacity:1!important;transform-style:flat!important;transform:none!important}html.print-pdf .reveal section.stack{position:relative!important;margin:0!important;padding:0!important;page-break-after:avoid!important;height:auto!important;min-height:auto!important}html.print-pdf .reveal img{box-shadow:none}html.print-pdf .reveal .backgrounds{display:none}html.print-pdf .reveal .slide-background{display:block!important;position:absolute;top:0;left:0;width:100%;height:100%;z-index:auto!important}html.print-pdf .reveal.show-notes{max-width:none;max-height:none}html.print-pdf .reveal .speaker-notes-pdf{display:block;width:100%;height:auto;max-height:none;top:auto;right:auto;bottom:auto;left:auto;z-index:100}html.print-pdf .reveal .speaker-notes-pdf[data-layout=separate-page]{position:relative;color:inherit;background-color:transparent;padding:20px;page-break-after:always;border:0}html.print-pdf .reveal .slide-number-pdf{display:block;position:absolute;font-size:14px}html.print-pdf .aria-status{display:none}@media print{html:not(.print-pdf){background:#fff;width:auto;height:auto;overflow:visible}html:not(.print-pdf) body{background:#fff;font-size:20pt;width:auto;height:auto;border:0;margin:0 5%;padding:0;overflow:visible;float:none!important}html:not(.print-pdf) .controls,html:not(.print-pdf) .fork-reveal,html:not(.print-pdf) .nestedarrow,html:not(.print-pdf) .reveal .backgrounds,html:not(.print-pdf) .reveal .progress,html:not(.print-pdf) .reveal .slide-number,html:not(.print-pdf) .share-reveal,html:not(.print-pdf) .state-background{display:none!important}html:not(.print-pdf) body,html:not(.print-pdf) li,html:not(.print-pdf) p,html:not(.print-pdf) td{font-size:20pt!important;color:#000}html:not(.print-pdf) h1,html:not(.print-pdf) h2,html:not(.print-pdf) h3,html:not(.print-pdf) h4,html:not(.print-pdf) h5,html:not(.print-pdf) h6{color:#000!important;height:auto;line-height:normal;text-align:left;letter-spacing:normal}html:not(.print-pdf) h1{font-size:28pt!important}html:not(.print-pdf) h2{font-size:24pt!important}html:not(.print-pdf) h3{font-size:22pt!important}html:not(.print-pdf) h4{font-size:22pt!important;font-variant:small-caps}html:not(.print-pdf) h5{font-size:21pt!important}html:not(.print-pdf) h6{font-size:20pt!important;font-style:italic}html:not(.print-pdf) a:link,html:not(.print-pdf) a:visited{color:#000!important;font-weight:700;text-decoration:underline}html:not(.print-pdf) div,html:not(.print-pdf) ol,html:not(.print-pdf) p,html:not(.print-pdf) ul{visibility:visible;position:static;width:auto;height:auto;display:block;overflow:visible;margin:0;text-align:left!important}html:not(.print-pdf) .reveal pre,html:not(.print-pdf) .reveal table{margin-left:0;margin-right:0}html:not(.print-pdf) .reveal pre code{padding:20px}html:not(.print-pdf) .reveal blockquote{margin:20px 0}html:not(.print-pdf) .reveal .slides{position:static!important;width:auto!important;height:auto!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:0!important;zoom:1!important;transform:none!important;overflow:visible!important;display:block!important;text-align:left!important;perspective:none;perspective-origin:50% 50%}html:not(.print-pdf) .reveal .slides section{visibility:visible!important;position:static!important;width:auto!important;height:auto!important;display:block!important;overflow:visible!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:60px 20px!important;z-index:auto!important;opacity:1!important;page-break-after:always!important;transform-style:flat!important;transform:none!important;transition:none!important}html:not(.print-pdf) .reveal .slides section.stack{padding:0!important}html:not(.print-pdf) .reveal section:last-of-type{page-break-after:avoid!important}html:not(.print-pdf) .reveal section .fragment{opacity:1!important;visibility:visible!important;transform:none!important}html:not(.print-pdf) .reveal section img{display:block;margin:15px 0;background:#fff;border:1px solid #666;box-shadow:none}html:not(.print-pdf) .reveal section small{font-size:.8em}html:not(.print-pdf) .reveal .hljs{max-height:100%;white-space:pre-wrap;word-wrap:break-word;word-break:break-word;font-size:15pt}html:not(.print-pdf) .reveal .hljs .hljs-ln-numbers{white-space:nowrap}html:not(.print-pdf) .reveal .hljs td{font-size:inherit!important;color:inherit!important}} \ No newline at end of file diff --git a/AMC-talk_files/libs/revealjs/dist/reveal.esm.js b/AMC-talk_files/libs/revealjs/dist/reveal.esm.js new file mode 100644 index 0000000..f18da89 --- /dev/null +++ b/AMC-talk_files/libs/revealjs/dist/reveal.esm.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 +*/ +const e=(e,t)=>{for(let i in t)e[i]=t[i];return e},t=(e,t)=>Array.from(e.querySelectorAll(t)),i=(e,t,i)=>{i?e.classList.add(t):e.classList.remove(t)},s=e=>{if("string"==typeof e){if("null"===e)return null;if("true"===e)return!0;if("false"===e)return!1;if(e.match(/^-?[\d\.]+$/))return parseFloat(e)}return e},a=(e,t)=>{e.style.transform=t},n=(e,t)=>{let i=e.matches||e.matchesSelector||e.msMatchesSelector;return!(!i||!i.call(e,t))},r=(e,t)=>{if("function"==typeof e.closest)return e.closest(t);for(;e;){if(n(e,t))return e;e=e.parentNode}return null},o=(e,t,i,s="")=>{let a=e.querySelectorAll("."+i);for(let t=0;t{let t=document.createElement("style");return t.type="text/css",e&&e.length>0&&(t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e))),document.head.appendChild(t),t},d=()=>{let e={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,(t=>{e[t.split("=").shift()]=t.split("=").pop()}));for(let t in e){let i=e[t];e[t]=s(unescape(i))}return void 0!==e.dependencies&&delete e.dependencies,e},c=(e,t=0)=>{if(e){let i,s=e.style.height;return e.style.height="0px",e.parentNode.style.height="auto",i=t-e.parentNode.offsetHeight,e.style.height=s+"px",e.parentNode.style.removeProperty("height"),i}return t},h={mp4:"video/mp4",m4a:"video/mp4",ogv:"video/ogg",mpeg:"video/mpeg",webm:"video/webm"},u=navigator.userAgent,g=/(iphone|ipod|ipad|android)/gi.test(u)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1;/chrome/i.test(u)&&/edge/i.test(u);const v=/android/gi.test(u);var p={};Object.defineProperty(p,"__esModule",{value:!0});var m=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};return"string"==typeof e?x(t(document.querySelectorAll(e)),i):x([e],i)[0]}}("undefined"==typeof window?null:window);class b{constructor(e){this.Reveal=e,this.startEmbeddedIframe=this.startEmbeddedIframe.bind(this)}shouldPreload(e){let t=this.Reveal.getConfig().preloadIframes;return"boolean"!=typeof t&&(t=e.hasAttribute("data-preload")),t}load(e,i={}){e.style.display=this.Reveal.getConfig().display,t(e,"img[data-src], video[data-src], audio[data-src], iframe[data-src]").forEach((e=>{("IFRAME"!==e.tagName||this.shouldPreload(e))&&(e.setAttribute("src",e.getAttribute("data-src")),e.setAttribute("data-lazy-loaded",""),e.removeAttribute("data-src"))})),t(e,"video, audio").forEach((e=>{let i=0;t(e,"source[data-src]").forEach((e=>{e.setAttribute("src",e.getAttribute("data-src")),e.removeAttribute("data-src"),e.setAttribute("data-lazy-loaded",""),i+=1})),g&&"VIDEO"===e.tagName&&e.setAttribute("playsinline",""),i>0&&e.load()}));let s=e.slideBackgroundElement;if(s){s.style.display="block";let t=e.slideBackgroundContentElement,a=e.getAttribute("data-background-iframe");if(!1===s.hasAttribute("data-loaded")){s.setAttribute("data-loaded","true");let n=e.getAttribute("data-background-image"),r=e.getAttribute("data-background-video"),o=e.hasAttribute("data-background-video-loop"),l=e.hasAttribute("data-background-video-muted");if(n)/^data:/.test(n.trim())?t.style.backgroundImage=`url(${n.trim()})`:t.style.backgroundImage=n.split(",").map((e=>`url(${encodeURI(e.trim())})`)).join(",");else if(r&&!this.Reveal.isSpeakerNotes()){let e=document.createElement("video");o&&e.setAttribute("loop",""),l&&(e.muted=!0),g&&(e.muted=!0,e.setAttribute("playsinline","")),r.split(",").forEach((t=>{let i=((e="")=>h[e.split(".").pop()])(t);e.innerHTML+=i?``:``})),t.appendChild(e)}else if(a&&!0!==i.excludeIframes){let e=document.createElement("iframe");e.setAttribute("allowfullscreen",""),e.setAttribute("mozallowfullscreen",""),e.setAttribute("webkitallowfullscreen",""),e.setAttribute("allow","autoplay"),e.setAttribute("data-src",a),e.style.width="100%",e.style.height="100%",e.style.maxHeight="100%",e.style.maxWidth="100%",t.appendChild(e)}}let n=t.querySelector("iframe[data-src]");n&&this.shouldPreload(s)&&!/autoplay=(1|true|yes)/gi.test(a)&&n.getAttribute("src")!==a&&n.setAttribute("src",a)}this.layout(e)}layout(e){Array.from(e.querySelectorAll(".r-fit-text")).forEach((e=>{f(e,{minSize:24,maxSize:.8*this.Reveal.getConfig().height,observeMutations:!1,observeWindow:!1})}))}unload(e){e.style.display="none";let i=this.Reveal.getSlideBackground(e);i&&(i.style.display="none",t(i,"iframe[src]").forEach((e=>{e.removeAttribute("src")}))),t(e,"video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")})),t(e,"video[data-lazy-loaded] source[src], audio source[src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")}))}formatEmbeddedContent(){let e=(e,i,s)=>{t(this.Reveal.getSlidesElement(),"iframe["+e+'*="'+i+'"]').forEach((t=>{let i=t.getAttribute(e);i&&-1===i.indexOf(s)&&t.setAttribute(e,i+(/\?/.test(i)?"&":"?")+s)}))};e("src","youtube.com/embed/","enablejsapi=1"),e("data-src","youtube.com/embed/","enablejsapi=1"),e("src","player.vimeo.com/","api=1"),e("data-src","player.vimeo.com/","api=1")}startEmbeddedContent(e){e&&!this.Reveal.isSpeakerNotes()&&(t(e,'img[src$=".gif"]').forEach((e=>{e.setAttribute("src",e.getAttribute("src"))})),t(e,"video, audio").forEach((e=>{if(r(e,".fragment")&&!r(e,".fragment.visible"))return;let t=this.Reveal.getConfig().autoPlayMedia;if("boolean"!=typeof t&&(t=e.hasAttribute("data-autoplay")||!!r(e,".slide-background")),t&&"function"==typeof e.play)if(e.readyState>1)this.startEmbeddedMedia({target:e});else if(g){let t=e.play();t&&"function"==typeof t.catch&&!1===e.controls&&t.catch((()=>{e.controls=!0,e.addEventListener("play",(()=>{e.controls=!1}))}))}else e.removeEventListener("loadeddata",this.startEmbeddedMedia),e.addEventListener("loadeddata",this.startEmbeddedMedia)})),t(e,"iframe[src]").forEach((e=>{r(e,".fragment")&&!r(e,".fragment.visible")||this.startEmbeddedIframe({target:e})})),t(e,"iframe[data-src]").forEach((e=>{r(e,".fragment")&&!r(e,".fragment.visible")||e.getAttribute("src")!==e.getAttribute("data-src")&&(e.removeEventListener("load",this.startEmbeddedIframe),e.addEventListener("load",this.startEmbeddedIframe),e.setAttribute("src",e.getAttribute("data-src")))})))}startEmbeddedMedia(e){let t=!!r(e.target,"html"),i=!!r(e.target,".present");t&&i&&(e.target.currentTime=0,e.target.play()),e.target.removeEventListener("loadeddata",this.startEmbeddedMedia)}startEmbeddedIframe(e){let t=e.target;if(t&&t.contentWindow){let i=!!r(e.target,"html"),s=!!r(e.target,".present");if(i&&s){let e=this.Reveal.getConfig().autoPlayMedia;"boolean"!=typeof e&&(e=t.hasAttribute("data-autoplay")||!!r(t,".slide-background")),/youtube\.com\/embed\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*"):/player\.vimeo\.com\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"method":"play"}',"*"):t.contentWindow.postMessage("slide:start","*")}}}stopEmbeddedContent(i,s={}){s=e({unloadIframes:!0},s),i&&i.parentNode&&(t(i,"video, audio").forEach((e=>{e.hasAttribute("data-ignore")||"function"!=typeof e.pause||(e.setAttribute("data-paused-by-reveal",""),e.pause())})),t(i,"iframe").forEach((e=>{e.contentWindow&&e.contentWindow.postMessage("slide:stop","*"),e.removeEventListener("load",this.startEmbeddedIframe)})),t(i,'iframe[src*="youtube.com/embed/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")})),t(i,'iframe[src*="player.vimeo.com/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"method":"pause"}',"*")})),!0===s.unloadIframes&&t(i,"iframe[data-src]").forEach((e=>{e.setAttribute("src","about:blank"),e.removeAttribute("src")})))}}class y{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="slide-number",this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){let i="none";e.slideNumber&&!this.Reveal.isPrintingPDF()&&("all"===e.showSlideNumber||"speaker"===e.showSlideNumber&&this.Reveal.isSpeakerNotes())&&(i="block"),this.element.style.display=i}update(){this.Reveal.getConfig().slideNumber&&this.element&&(this.element.innerHTML=this.getSlideNumber())}getSlideNumber(e=this.Reveal.getCurrentSlide()){let t,i=this.Reveal.getConfig(),s="h.v";if("function"==typeof i.slideNumber)t=i.slideNumber(e);else{"string"==typeof i.slideNumber&&(s=i.slideNumber),/c/.test(s)||1!==this.Reveal.getHorizontalSlides().length||(s="c");let a=e&&"uncounted"===e.dataset.visibility?0:1;switch(t=[],s){case"c":t.push(this.Reveal.getSlidePastCount(e)+a);break;case"c/t":t.push(this.Reveal.getSlidePastCount(e)+a,"/",this.Reveal.getTotalSlides());break;default:let i=this.Reveal.getIndices(e);t.push(i.h+a);let n="h/v"===s?"/":".";this.Reveal.isVerticalSlide(e)&&t.push(n,i.v+1)}}let a="#"+this.Reveal.location.getHash(e);return this.formatNumber(t[0],t[1],t[2],a)}formatNumber(e,t,i,s="#"+this.Reveal.location.getHash()){return"number"!=typeof i||isNaN(i)?`\n\t\t\t\t\t${e}\n\t\t\t\t\t`:`\n\t\t\t\t\t${e}\n\t\t\t\t\t${t}\n\t\t\t\t\t${i}\n\t\t\t\t\t`}destroy(){this.element.remove()}}const w=e=>{let t=e.match(/^#([0-9a-f]{3})$/i);if(t&&t[1])return t=t[1],{r:17*parseInt(t.charAt(0),16),g:17*parseInt(t.charAt(1),16),b:17*parseInt(t.charAt(2),16)};let i=e.match(/^#([0-9a-f]{6})$/i);if(i&&i[1])return i=i[1],{r:parseInt(i.slice(0,2),16),g:parseInt(i.slice(2,4),16),b:parseInt(i.slice(4,6),16)};let s=e.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(s)return{r:parseInt(s[1],10),g:parseInt(s[2],10),b:parseInt(s[3],10)};let a=e.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i);return a?{r:parseInt(a[1],10),g:parseInt(a[2],10),b:parseInt(a[3],10),a:parseFloat(a[4])}:null};class E{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="backgrounds",this.Reveal.getRevealElement().appendChild(this.element)}create(){this.element.innerHTML="",this.element.classList.add("no-transition"),this.Reveal.getHorizontalSlides().forEach((e=>{let i=this.createBackground(e,this.element);t(e,"section").forEach((e=>{this.createBackground(e,i),i.classList.add("stack")}))})),this.Reveal.getConfig().parallaxBackgroundImage?(this.element.style.backgroundImage='url("'+this.Reveal.getConfig().parallaxBackgroundImage+'")',this.element.style.backgroundSize=this.Reveal.getConfig().parallaxBackgroundSize,this.element.style.backgroundRepeat=this.Reveal.getConfig().parallaxBackgroundRepeat,this.element.style.backgroundPosition=this.Reveal.getConfig().parallaxBackgroundPosition,setTimeout((()=>{this.Reveal.getRevealElement().classList.add("has-parallax-background")}),1)):(this.element.style.backgroundImage="",this.Reveal.getRevealElement().classList.remove("has-parallax-background"))}createBackground(e,t){let i=document.createElement("div");i.className="slide-background "+e.className.replace(/present|past|future/,"");let s=document.createElement("div");return s.className="slide-background-content",i.appendChild(s),t.appendChild(i),e.slideBackgroundElement=i,e.slideBackgroundContentElement=s,this.sync(e),i}sync(e){const t=e.slideBackgroundElement,i=e.slideBackgroundContentElement,s={background:e.getAttribute("data-background"),backgroundSize:e.getAttribute("data-background-size"),backgroundImage:e.getAttribute("data-background-image"),backgroundVideo:e.getAttribute("data-background-video"),backgroundIframe:e.getAttribute("data-background-iframe"),backgroundColor:e.getAttribute("data-background-color"),backgroundRepeat:e.getAttribute("data-background-repeat"),backgroundPosition:e.getAttribute("data-background-position"),backgroundTransition:e.getAttribute("data-background-transition"),backgroundOpacity:e.getAttribute("data-background-opacity")},a=e.hasAttribute("data-preload");e.classList.remove("has-dark-background"),e.classList.remove("has-light-background"),t.removeAttribute("data-loaded"),t.removeAttribute("data-background-hash"),t.removeAttribute("data-background-size"),t.removeAttribute("data-background-transition"),t.style.backgroundColor="",i.style.backgroundSize="",i.style.backgroundRepeat="",i.style.backgroundPosition="",i.style.backgroundImage="",i.style.opacity="",i.innerHTML="",s.background&&(/^(http|file|\/\/)/gi.test(s.background)||/\.(svg|png|jpg|jpeg|gif|bmp)([?#\s]|$)/gi.test(s.background)?e.setAttribute("data-background-image",s.background):t.style.background=s.background),(s.background||s.backgroundColor||s.backgroundImage||s.backgroundVideo||s.backgroundIframe)&&t.setAttribute("data-background-hash",s.background+s.backgroundSize+s.backgroundImage+s.backgroundVideo+s.backgroundIframe+s.backgroundColor+s.backgroundRepeat+s.backgroundPosition+s.backgroundTransition+s.backgroundOpacity),s.backgroundSize&&t.setAttribute("data-background-size",s.backgroundSize),s.backgroundColor&&(t.style.backgroundColor=s.backgroundColor),s.backgroundTransition&&t.setAttribute("data-background-transition",s.backgroundTransition),a&&t.setAttribute("data-preload",""),s.backgroundSize&&(i.style.backgroundSize=s.backgroundSize),s.backgroundRepeat&&(i.style.backgroundRepeat=s.backgroundRepeat),s.backgroundPosition&&(i.style.backgroundPosition=s.backgroundPosition),s.backgroundOpacity&&(i.style.opacity=s.backgroundOpacity);let n=s.backgroundColor;if(!n||!w(n)){let e=window.getComputedStyle(t);e&&e.backgroundColor&&(n=e.backgroundColor)}if(n){const t=w(n);t&&0!==t.a&&("string"==typeof(r=n)&&(r=w(r)),(r?(299*r.r+587*r.g+114*r.b)/1e3:null)<128?e.classList.add("has-dark-background"):e.classList.add("has-light-background"))}var r}update(e=!1){let i=this.Reveal.getCurrentSlide(),s=this.Reveal.getIndices(),a=null,n=this.Reveal.getConfig().rtl?"future":"past",r=this.Reveal.getConfig().rtl?"past":"future";if(Array.from(this.element.childNodes).forEach(((i,o)=>{i.classList.remove("past","present","future"),os.h?i.classList.add(r):(i.classList.add("present"),a=i),(e||o===s.h)&&t(i,".slide-background").forEach(((e,t)=>{e.classList.remove("past","present","future"),ts.v?e.classList.add("future"):(e.classList.add("present"),o===s.h&&(a=e))}))})),this.previousBackground&&this.Reveal.slideContent.stopEmbeddedContent(this.previousBackground,{unloadIframes:!this.Reveal.slideContent.shouldPreload(this.previousBackground)}),a){this.Reveal.slideContent.startEmbeddedContent(a);let e=a.querySelector(".slide-background-content");if(e){let t=e.style.backgroundImage||"";/\.gif/i.test(t)&&(e.style.backgroundImage="",window.getComputedStyle(e).opacity,e.style.backgroundImage=t)}let t=this.previousBackground?this.previousBackground.getAttribute("data-background-hash"):null,i=a.getAttribute("data-background-hash");i&&i===t&&a!==this.previousBackground&&this.element.classList.add("no-transition"),this.previousBackground=a}i&&["has-light-background","has-dark-background"].forEach((e=>{i.classList.contains(e)?this.Reveal.getRevealElement().classList.add(e):this.Reveal.getRevealElement().classList.remove(e)}),this),setTimeout((()=>{this.element.classList.remove("no-transition")}),1)}updateParallax(){let e=this.Reveal.getIndices();if(this.Reveal.getConfig().parallaxBackgroundImage){let t,i,s=this.Reveal.getHorizontalSlides(),a=this.Reveal.getVerticalSlides(),n=this.element.style.backgroundSize.split(" ");1===n.length?t=i=parseInt(n[0],10):(t=parseInt(n[0],10),i=parseInt(n[1],10));let r,o,l=this.element.offsetWidth,d=s.length;r="number"==typeof this.Reveal.getConfig().parallaxBackgroundHorizontal?this.Reveal.getConfig().parallaxBackgroundHorizontal:d>1?(t-l)/(d-1):0,o=r*e.h*-1;let c,h,u=this.element.offsetHeight,g=a.length;c="number"==typeof this.Reveal.getConfig().parallaxBackgroundVertical?this.Reveal.getConfig().parallaxBackgroundVertical:(i-u)/(g-1),h=g>0?c*e.v:0,this.element.style.backgroundPosition=o+"px "+-h+"px"}}destroy(){this.element.remove()}}const R=/registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener/,S=/fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/;let A=0;class k{constructor(e){this.Reveal=e}run(e,t){this.reset();let i=this.Reveal.getSlides(),s=i.indexOf(t),a=i.indexOf(e);if(e.hasAttribute("data-auto-animate")&&t.hasAttribute("data-auto-animate")&&e.getAttribute("data-auto-animate-id")===t.getAttribute("data-auto-animate-id")&&!(s>a?t:e).hasAttribute("data-auto-animate-restart")){this.autoAnimateStyleSheet=this.autoAnimateStyleSheet||l();let i=this.getAutoAnimateOptions(t);e.dataset.autoAnimate="pending",t.dataset.autoAnimate="pending",i.slideDirection=s>a?"forward":"backward";let n=this.getAutoAnimatableElements(e,t).map((e=>this.autoAnimateElements(e.from,e.to,e.options||{},i,A++)));if("false"!==t.dataset.autoAnimateUnmatched&&!0===this.Reveal.getConfig().autoAnimateUnmatched){let e=.8*i.duration,s=.2*i.duration;this.getUnmatchedAutoAnimateElements(t).forEach((e=>{let t=this.getAutoAnimateOptions(e,i),s="unmatched";t.duration===i.duration&&t.delay===i.delay||(s="unmatched-"+A++,n.push(`[data-auto-animate="running"] [data-auto-animate-target="${s}"] { transition: opacity ${t.duration}s ease ${t.delay}s; }`)),e.dataset.autoAnimateTarget=s}),this),n.push(`[data-auto-animate="running"] [data-auto-animate-target="unmatched"] { transition: opacity ${e}s ease ${s}s; }`)}this.autoAnimateStyleSheet.innerHTML=n.join(""),requestAnimationFrame((()=>{this.autoAnimateStyleSheet&&(getComputedStyle(this.autoAnimateStyleSheet).fontWeight,t.dataset.autoAnimate="running")})),this.Reveal.dispatchEvent({type:"autoanimate",data:{fromSlide:e,toSlide:t,sheet:this.autoAnimateStyleSheet}})}}reset(){t(this.Reveal.getRevealElement(),'[data-auto-animate]:not([data-auto-animate=""])').forEach((e=>{e.dataset.autoAnimate=""})),t(this.Reveal.getRevealElement(),"[data-auto-animate-target]").forEach((e=>{delete e.dataset.autoAnimateTarget})),this.autoAnimateStyleSheet&&this.autoAnimateStyleSheet.parentNode&&(this.autoAnimateStyleSheet.parentNode.removeChild(this.autoAnimateStyleSheet),this.autoAnimateStyleSheet=null)}autoAnimateElements(e,t,i,s,a){e.dataset.autoAnimateTarget="",t.dataset.autoAnimateTarget=a;let n=this.getAutoAnimateOptions(t,s);void 0!==i.delay&&(n.delay=i.delay),void 0!==i.duration&&(n.duration=i.duration),void 0!==i.easing&&(n.easing=i.easing);let r=this.getAutoAnimatableProperties("from",e,i),o=this.getAutoAnimatableProperties("to",t,i);if(t.classList.contains("fragment")&&(delete o.styles.opacity,e.classList.contains("fragment"))){(e.className.match(S)||[""])[0]===(t.className.match(S)||[""])[0]&&"forward"===s.slideDirection&&t.classList.add("visible","disabled")}if(!1!==i.translate||!1!==i.scale){let e=this.Reveal.getScale(),t={x:(r.x-o.x)/e,y:(r.y-o.y)/e,scaleX:r.width/o.width,scaleY:r.height/o.height};t.x=Math.round(1e3*t.x)/1e3,t.y=Math.round(1e3*t.y)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3;let s=!1!==i.translate&&(0!==t.x||0!==t.y),a=!1!==i.scale&&(0!==t.scaleX||0!==t.scaleY);if(s||a){let e=[];s&&e.push(`translate(${t.x}px, ${t.y}px)`),a&&e.push(`scale(${t.scaleX}, ${t.scaleY})`),r.styles.transform=e.join(" "),r.styles["transform-origin"]="top left",o.styles.transform="none"}}for(let e in o.styles){const t=o.styles[e],i=r.styles[e];t===i?delete o.styles[e]:(!0===t.explicitValue&&(o.styles[e]=t.value),!0===i.explicitValue&&(r.styles[e]=i.value))}let l="",d=Object.keys(o.styles);if(d.length>0){r.styles.transition="none",o.styles.transition=`all ${n.duration}s ${n.easing} ${n.delay}s`,o.styles["transition-property"]=d.join(", "),o.styles["will-change"]=d.join(", "),l='[data-auto-animate-target="'+a+'"] {'+Object.keys(r.styles).map((e=>e+": "+r.styles[e]+" !important;")).join("")+'}[data-auto-animate="running"] [data-auto-animate-target="'+a+'"] {'+Object.keys(o.styles).map((e=>e+": "+o.styles[e]+" !important;")).join("")+"}"}return l}getAutoAnimateOptions(t,i){let s={easing:this.Reveal.getConfig().autoAnimateEasing,duration:this.Reveal.getConfig().autoAnimateDuration,delay:0};if(s=e(s,i),t.parentNode){let e=r(t.parentNode,"[data-auto-animate-target]");e&&(s=this.getAutoAnimateOptions(e,s))}return t.dataset.autoAnimateEasing&&(s.easing=t.dataset.autoAnimateEasing),t.dataset.autoAnimateDuration&&(s.duration=parseFloat(t.dataset.autoAnimateDuration)),t.dataset.autoAnimateDelay&&(s.delay=parseFloat(t.dataset.autoAnimateDelay)),s}getAutoAnimatableProperties(e,t,i){let s=this.Reveal.getConfig(),a={styles:[]};if(!1!==i.translate||!1!==i.scale){let e;if("function"==typeof i.measure)e=i.measure(t);else if(s.center)e=t.getBoundingClientRect();else{let i=this.Reveal.getScale();e={x:t.offsetLeft*i,y:t.offsetTop*i,width:t.offsetWidth*i,height:t.offsetHeight*i}}a.x=e.x,a.y=e.y,a.width=e.width,a.height=e.height}const n=getComputedStyle(t);return(i.styles||s.autoAnimateStyles).forEach((t=>{let i;"string"==typeof t&&(t={property:t}),i=void 0!==t.from&&"from"===e?{value:t.from,explicitValue:!0}:void 0!==t.to&&"to"===e?{value:t.to,explicitValue:!0}:n[t.property],""!==i&&(a.styles[t.property]=i)})),a}getAutoAnimatableElements(e,t){let i=("function"==typeof this.Reveal.getConfig().autoAnimateMatcher?this.Reveal.getConfig().autoAnimateMatcher:this.getAutoAnimatePairs).call(this,e,t),s=[];return i.filter(((e,t)=>{if(-1===s.indexOf(e.to))return s.push(e.to),!0}))}getAutoAnimatePairs(e,t){let i=[];const s="h1, h2, h3, h4, h5, h6, p, li";return this.findAutoAnimateMatches(i,e,t,"[data-id]",(e=>e.nodeName+":::"+e.getAttribute("data-id"))),this.findAutoAnimateMatches(i,e,t,s,(e=>e.nodeName+":::"+e.innerText)),this.findAutoAnimateMatches(i,e,t,"img, video, iframe",(e=>e.nodeName+":::"+(e.getAttribute("src")||e.getAttribute("data-src")))),this.findAutoAnimateMatches(i,e,t,"pre",(e=>e.nodeName+":::"+e.innerText)),i.forEach((e=>{n(e.from,s)?e.options={scale:!1}:n(e.from,"pre")&&(e.options={scale:!1,styles:["width","height"]},this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-code",(e=>e.textContent),{scale:!1,styles:[],measure:this.getLocalBoundingBox.bind(this)}),this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-line[data-line-number]",(e=>e.getAttribute("data-line-number")),{scale:!1,styles:["width"],measure:this.getLocalBoundingBox.bind(this)}))}),this),i}getLocalBoundingBox(e){const t=this.Reveal.getScale();return{x:Math.round(e.offsetLeft*t*100)/100,y:Math.round(e.offsetTop*t*100)/100,width:Math.round(e.offsetWidth*t*100)/100,height:Math.round(e.offsetHeight*t*100)/100}}findAutoAnimateMatches(e,t,i,s,a,n){let r={},o={};[].slice.call(t.querySelectorAll(s)).forEach(((e,t)=>{const i=a(e);"string"==typeof i&&i.length&&(r[i]=r[i]||[],r[i].push(e))})),[].slice.call(i.querySelectorAll(s)).forEach(((t,i)=>{const s=a(t);let l;if(o[s]=o[s]||[],o[s].push(t),r[s]){const e=o[s].length-1,t=r[s].length-1;r[s][e]?(l=r[s][e],r[s][e]=null):r[s][t]&&(l=r[s][t],r[s][t]=null)}l&&e.push({from:l,to:t,options:n})}))}getUnmatchedAutoAnimateElements(e){return[].slice.call(e.children).reduce(((e,t)=>{const i=t.querySelector("[data-auto-animate-target]");return t.hasAttribute("data-auto-animate-target")||i||e.push(t),t.querySelector("[data-auto-animate-target]")&&(e=e.concat(this.getUnmatchedAutoAnimateElements(t))),e}),[])}}class L{constructor(e){this.Reveal=e}configure(e,t){!1===e.fragments?this.disable():!1===t.fragments&&this.enable()}disable(){t(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.add("visible"),e.classList.remove("current-fragment")}))}enable(){t(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.remove("visible"),e.classList.remove("current-fragment")}))}availableRoutes(){let e=this.Reveal.getCurrentSlide();if(e&&this.Reveal.getConfig().fragments){let t=e.querySelectorAll(".fragment:not(.disabled)"),i=e.querySelectorAll(".fragment:not(.disabled):not(.visible)");return{prev:t.length-i.length>0,next:!!i.length}}return{prev:!1,next:!1}}sort(e,t=!1){e=Array.from(e);let i=[],s=[],a=[];e.forEach((e=>{if(e.hasAttribute("data-fragment-index")){let t=parseInt(e.getAttribute("data-fragment-index"),10);i[t]||(i[t]=[]),i[t].push(e)}else s.push([e])})),i=i.concat(s);let n=0;return i.forEach((e=>{e.forEach((e=>{a.push(e),e.setAttribute("data-fragment-index",n)})),n++})),!0===t?i:a}sortAll(){this.Reveal.getHorizontalSlides().forEach((e=>{let i=t(e,"section");i.forEach(((e,t)=>{this.sort(e.querySelectorAll(".fragment"))}),this),0===i.length&&this.sort(e.querySelectorAll(".fragment"))}))}update(e,t){let i={shown:[],hidden:[]},s=this.Reveal.getCurrentSlide();if(s&&this.Reveal.getConfig().fragments&&(t=t||this.sort(s.querySelectorAll(".fragment"))).length){let a=0;if("number"!=typeof e){let t=this.sort(s.querySelectorAll(".fragment.visible")).pop();t&&(e=parseInt(t.getAttribute("data-fragment-index")||0,10))}Array.from(t).forEach(((t,s)=>{if(t.hasAttribute("data-fragment-index")&&(s=parseInt(t.getAttribute("data-fragment-index"),10)),a=Math.max(a,s),s<=e){let a=t.classList.contains("visible");t.classList.add("visible"),t.classList.remove("current-fragment"),s===e&&(this.Reveal.announceStatus(this.Reveal.getStatusText(t)),t.classList.add("current-fragment"),this.Reveal.slideContent.startEmbeddedContent(t)),a||(i.shown.push(t),this.Reveal.dispatchEvent({target:t,type:"visible",bubbles:!1}))}else{let e=t.classList.contains("visible");t.classList.remove("visible"),t.classList.remove("current-fragment"),e&&(this.Reveal.slideContent.stopEmbeddedContent(t),i.hidden.push(t),this.Reveal.dispatchEvent({target:t,type:"hidden",bubbles:!1}))}})),e="number"==typeof e?e:-1,e=Math.max(Math.min(e,a),-1),s.setAttribute("data-fragment",e)}return i}sync(e=this.Reveal.getCurrentSlide()){return this.sort(e.querySelectorAll(".fragment"))}goto(e,t=0){let i=this.Reveal.getCurrentSlide();if(i&&this.Reveal.getConfig().fragments){let s=this.sort(i.querySelectorAll(".fragment:not(.disabled)"));if(s.length){if("number"!=typeof e){let t=this.sort(i.querySelectorAll(".fragment:not(.disabled).visible")).pop();e=t?parseInt(t.getAttribute("data-fragment-index")||0,10):-1}e+=t;let a=this.update(e,s);return a.hidden.length&&this.Reveal.dispatchEvent({type:"fragmenthidden",data:{fragment:a.hidden[0],fragments:a.hidden}}),a.shown.length&&this.Reveal.dispatchEvent({type:"fragmentshown",data:{fragment:a.shown[0],fragments:a.shown}}),this.Reveal.controls.update(),this.Reveal.progress.update(),this.Reveal.getConfig().fragmentInURL&&this.Reveal.location.writeURL(),!(!a.shown.length&&!a.hidden.length)}}return!1}next(){return this.goto(null,1)}prev(){return this.goto(null,-1)}}class C{constructor(e){this.Reveal=e,this.active=!1,this.onSlideClicked=this.onSlideClicked.bind(this)}activate(){if(this.Reveal.getConfig().overview&&!this.isActive()){this.active=!0,this.Reveal.getRevealElement().classList.add("overview"),this.Reveal.cancelAutoSlide(),this.Reveal.getSlidesElement().appendChild(this.Reveal.getBackgroundsElement()),t(this.Reveal.getRevealElement(),".slides section").forEach((e=>{e.classList.contains("stack")||e.addEventListener("click",this.onSlideClicked,!0)}));const e=70,i=this.Reveal.getComputedSlideSize();this.overviewSlideWidth=i.width+e,this.overviewSlideHeight=i.height+e,this.Reveal.getConfig().rtl&&(this.overviewSlideWidth=-this.overviewSlideWidth),this.Reveal.updateSlidesVisibility(),this.layout(),this.update(),this.Reveal.layout();const s=this.Reveal.getIndices();this.Reveal.dispatchEvent({type:"overviewshown",data:{indexh:s.h,indexv:s.v,currentSlide:this.Reveal.getCurrentSlide()}})}}layout(){this.Reveal.getHorizontalSlides().forEach(((e,i)=>{e.setAttribute("data-index-h",i),a(e,"translate3d("+i*this.overviewSlideWidth+"px, 0, 0)"),e.classList.contains("stack")&&t(e,"section").forEach(((e,t)=>{e.setAttribute("data-index-h",i),e.setAttribute("data-index-v",t),a(e,"translate3d(0, "+t*this.overviewSlideHeight+"px, 0)")}))})),Array.from(this.Reveal.getBackgroundsElement().childNodes).forEach(((e,i)=>{a(e,"translate3d("+i*this.overviewSlideWidth+"px, 0, 0)"),t(e,".slide-background").forEach(((e,t)=>{a(e,"translate3d(0, "+t*this.overviewSlideHeight+"px, 0)")}))}))}update(){const e=Math.min(window.innerWidth,window.innerHeight),t=Math.max(e/5,150)/e,i=this.Reveal.getIndices();this.Reveal.transformSlides({overview:["scale("+t+")","translateX("+-i.h*this.overviewSlideWidth+"px)","translateY("+-i.v*this.overviewSlideHeight+"px)"].join(" ")})}deactivate(){if(this.Reveal.getConfig().overview){this.active=!1,this.Reveal.getRevealElement().classList.remove("overview"),this.Reveal.getRevealElement().classList.add("overview-deactivating"),setTimeout((()=>{this.Reveal.getRevealElement().classList.remove("overview-deactivating")}),1),this.Reveal.getRevealElement().appendChild(this.Reveal.getBackgroundsElement()),t(this.Reveal.getRevealElement(),".slides section").forEach((e=>{a(e,""),e.removeEventListener("click",this.onSlideClicked,!0)})),t(this.Reveal.getBackgroundsElement(),".slide-background").forEach((e=>{a(e,"")})),this.Reveal.transformSlides({overview:""});const e=this.Reveal.getIndices();this.Reveal.slide(e.h,e.v),this.Reveal.layout(),this.Reveal.cueAutoSlide(),this.Reveal.dispatchEvent({type:"overviewhidden",data:{indexh:e.h,indexv:e.v,currentSlide:this.Reveal.getCurrentSlide()}})}}toggle(e){"boolean"==typeof e?e?this.activate():this.deactivate():this.isActive()?this.deactivate():this.activate()}isActive(){return this.active}onSlideClicked(e){if(this.isActive()){e.preventDefault();let t=e.target;for(;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(this.deactivate(),t.nodeName.match(/section/gi))){let e=parseInt(t.getAttribute("data-index-h"),10),i=parseInt(t.getAttribute("data-index-v"),10);this.Reveal.slide(e,i)}}}}class x{constructor(e){this.Reveal=e,this.shortcuts={},this.bindings={},this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this),this.onDocumentKeyPress=this.onDocumentKeyPress.bind(this)}configure(e,t){"linear"===e.navigationMode?(this.shortcuts["→ , ↓ , SPACE , N , L , J"]="Next slide",this.shortcuts["← , ↑ , P , H , K"]="Previous slide"):(this.shortcuts["N , SPACE"]="Next slide",this.shortcuts["P , Shift SPACE"]="Previous slide",this.shortcuts["← , H"]="Navigate left",this.shortcuts["→ , L"]="Navigate right",this.shortcuts["↑ , K"]="Navigate up",this.shortcuts["↓ , J"]="Navigate down"),this.shortcuts["Alt + ←/↑/→/↓"]="Navigate without fragments",this.shortcuts["Shift + ←/↑/→/↓"]="Jump to first/last slide",this.shortcuts["B , ."]="Pause",this.shortcuts.F="Fullscreen",this.shortcuts["ESC, O"]="Slide overview"}bind(){document.addEventListener("keydown",this.onDocumentKeyDown,!1),document.addEventListener("keypress",this.onDocumentKeyPress,!1)}unbind(){document.removeEventListener("keydown",this.onDocumentKeyDown,!1),document.removeEventListener("keypress",this.onDocumentKeyPress,!1)}addKeyBinding(e,t){"object"==typeof e&&e.keyCode?this.bindings[e.keyCode]={callback:t,key:e.key,description:e.description}:this.bindings[e]={callback:t,key:null,description:null}}removeKeyBinding(e){delete this.bindings[e]}triggerKey(e){this.onDocumentKeyDown({keyCode:e})}registerKeyboardShortcut(e,t){this.shortcuts[e]=t}getShortcuts(){return this.shortcuts}getBindings(){return this.bindings}onDocumentKeyPress(e){e.shiftKey&&63===e.charCode&&this.Reveal.toggleHelp()}onDocumentKeyDown(e){let t=this.Reveal.getConfig();if("function"==typeof t.keyboardCondition&&!1===t.keyboardCondition(e))return!0;if("focused"===t.keyboardCondition&&!this.Reveal.isFocused())return!0;let i=e.keyCode,s=!this.Reveal.isAutoSliding();this.Reveal.onUserInput(e);let a=document.activeElement&&!0===document.activeElement.isContentEditable,n=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName),r=document.activeElement&&document.activeElement.className&&/speaker-notes/i.test(document.activeElement.className),o=!(-1!==[32,37,38,39,40,78,80].indexOf(e.keyCode)&&e.shiftKey||e.altKey)&&(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey);if(a||n||r||o)return;let l,d=[66,86,190,191];if("object"==typeof t.keyboard)for(l in t.keyboard)"togglePause"===t.keyboard[l]&&d.push(parseInt(l,10));if(this.Reveal.isPaused()&&-1===d.indexOf(i))return!1;let c="linear"===t.navigationMode||!this.Reveal.hasHorizontalSlides()||!this.Reveal.hasVerticalSlides(),h=!1;if("object"==typeof t.keyboard)for(l in t.keyboard)if(parseInt(l,10)===i){let i=t.keyboard[l];"function"==typeof i?i.apply(null,[e]):"string"==typeof i&&"function"==typeof this.Reveal[i]&&this.Reveal[i].call(),h=!0}if(!1===h)for(l in this.bindings)if(parseInt(l,10)===i){let t=this.bindings[l].callback;"function"==typeof t?t.apply(null,[e]):"string"==typeof t&&"function"==typeof this.Reveal[t]&&this.Reveal[t].call(),h=!0}!1===h&&(h=!0,80===i||33===i?this.Reveal.prev({skipFragments:e.altKey}):78===i||34===i?this.Reveal.next({skipFragments:e.altKey}):72===i||37===i?e.shiftKey?this.Reveal.slide(0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.left({skipFragments:e.altKey}):76===i||39===i?e.shiftKey?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.right({skipFragments:e.altKey}):75===i||38===i?e.shiftKey?this.Reveal.slide(void 0,0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.up({skipFragments:e.altKey}):74===i||40===i?e.shiftKey?this.Reveal.slide(void 0,Number.MAX_VALUE):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.down({skipFragments:e.altKey}):36===i?this.Reveal.slide(0):35===i?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):32===i?(this.Reveal.overview.isActive()&&this.Reveal.overview.deactivate(),e.shiftKey?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.next({skipFragments:e.altKey})):58===i||59===i||66===i||86===i||190===i||191===i?this.Reveal.togglePause():70===i?(e=>{let t=(e=e||document.documentElement).requestFullscreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullscreen;t&&t.apply(e)})(t.embedded?this.Reveal.getViewportElement():document.documentElement):65===i?t.autoSlideStoppable&&this.Reveal.toggleAutoSlide(s):h=!1),h?e.preventDefault&&e.preventDefault():27!==i&&79!==i||(!1===this.Reveal.closeOverlay()&&this.Reveal.overview.toggle(),e.preventDefault&&e.preventDefault()),this.Reveal.cueAutoSlide()}}class P{constructor(e){var t,i,s;s=1e3,(i="MAX_REPLACE_STATE_FREQUENCY")in(t=this)?Object.defineProperty(t,i,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[i]=s,this.Reveal=e,this.writeURLTimeout=0,this.replaceStateTimestamp=0,this.onWindowHashChange=this.onWindowHashChange.bind(this)}bind(){window.addEventListener("hashchange",this.onWindowHashChange,!1)}unbind(){window.removeEventListener("hashchange",this.onWindowHashChange,!1)}getIndicesFromHash(e=window.location.hash){let t=e.replace(/^#\/?/,""),i=t.split("/");if(/^[0-9]*$/.test(i[0])||!t.length){const e=this.Reveal.getConfig();let t,s=e.hashOneBasedIndex?1:0,a=parseInt(i[0],10)-s||0,n=parseInt(i[1],10)-s||0;return e.fragmentInURL&&(t=parseInt(i[2],10),isNaN(t)&&(t=void 0)),{h:a,v:n,f:t}}{let e,i;/\/[-\d]+$/g.test(t)&&(i=parseInt(t.split("/").pop(),10),i=isNaN(i)?void 0:i,t=t.split("/").shift());try{e=document.getElementById(decodeURIComponent(t))}catch(e){}if(e)return{...this.Reveal.getIndices(e),f:i}}return null}readURL(){const e=this.Reveal.getIndices(),t=this.getIndicesFromHash();t?t.h===e.h&&t.v===e.v&&void 0===t.f||this.Reveal.slide(t.h,t.v,t.f):this.Reveal.slide(e.h||0,e.v||0)}writeURL(e){let t=this.Reveal.getConfig(),i=this.Reveal.getCurrentSlide();if(clearTimeout(this.writeURLTimeout),"number"==typeof e)this.writeURLTimeout=setTimeout(this.writeURL,e);else if(i){let e=this.getHash();t.history?window.location.hash=e:t.hash&&("/"===e?this.debouncedReplaceState(window.location.pathname+window.location.search):this.debouncedReplaceState("#"+e))}}replaceState(e){window.history.replaceState(null,null,e),this.replaceStateTimestamp=Date.now()}debouncedReplaceState(e){clearTimeout(this.replaceStateTimeout),Date.now()-this.replaceStateTimestamp>this.MAX_REPLACE_STATE_FREQUENCY?this.replaceState(e):this.replaceStateTimeout=setTimeout((()=>this.replaceState(e)),this.MAX_REPLACE_STATE_FREQUENCY)}getHash(e){let t="/",i=e||this.Reveal.getCurrentSlide(),s=i?i.getAttribute("id"):null;s&&(s=encodeURIComponent(s));let a=this.Reveal.getIndices(e);if(this.Reveal.getConfig().fragmentInURL||(a.f=void 0),"string"==typeof s&&s.length)t="/"+s,a.f>=0&&(t+="/"+a.f);else{let e=this.Reveal.getConfig().hashOneBasedIndex?1:0;(a.h>0||a.v>0||a.f>=0)&&(t+=a.h+e),(a.v>0||a.f>=0)&&(t+="/"+(a.v+e)),a.f>=0&&(t+="/"+a.f)}return t}onWindowHashChange(e){this.readURL()}}class N{constructor(e){this.Reveal=e,this.onNavigateLeftClicked=this.onNavigateLeftClicked.bind(this),this.onNavigateRightClicked=this.onNavigateRightClicked.bind(this),this.onNavigateUpClicked=this.onNavigateUpClicked.bind(this),this.onNavigateDownClicked=this.onNavigateDownClicked.bind(this),this.onNavigatePrevClicked=this.onNavigatePrevClicked.bind(this),this.onNavigateNextClicked=this.onNavigateNextClicked.bind(this)}render(){const e=this.Reveal.getConfig().rtl,i=this.Reveal.getRevealElement();this.element=document.createElement("aside"),this.element.className="controls",this.element.innerHTML=`\n\t\t\t\n\t\t\t\n\t\t\t`,this.Reveal.getRevealElement().appendChild(this.element),this.controlsLeft=t(i,".navigate-left"),this.controlsRight=t(i,".navigate-right"),this.controlsUp=t(i,".navigate-up"),this.controlsDown=t(i,".navigate-down"),this.controlsPrev=t(i,".navigate-prev"),this.controlsNext=t(i,".navigate-next"),this.controlsRightArrow=this.element.querySelector(".navigate-right"),this.controlsLeftArrow=this.element.querySelector(".navigate-left"),this.controlsDownArrow=this.element.querySelector(".navigate-down")}configure(e,t){this.element.style.display=e.controls?"block":"none",this.element.setAttribute("data-controls-layout",e.controlsLayout),this.element.setAttribute("data-controls-back-arrows",e.controlsBackArrows)}bind(){let e=["touchstart","click"];v&&(e=["touchstart"]),e.forEach((e=>{this.controlsLeft.forEach((t=>t.addEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.addEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.addEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.addEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.addEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.addEventListener(e,this.onNavigateNextClicked,!1)))}))}unbind(){["touchstart","click"].forEach((e=>{this.controlsLeft.forEach((t=>t.removeEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.removeEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.removeEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.removeEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.removeEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.removeEventListener(e,this.onNavigateNextClicked,!1)))}))}update(){let e=this.Reveal.availableRoutes();[...this.controlsLeft,...this.controlsRight,...this.controlsUp,...this.controlsDown,...this.controlsPrev,...this.controlsNext].forEach((e=>{e.classList.remove("enabled","fragmented"),e.setAttribute("disabled","disabled")})),e.left&&this.controlsLeft.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.right&&this.controlsRight.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.up&&this.controlsUp.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.down&&this.controlsDown.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.left||e.up)&&this.controlsPrev.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.right||e.down)&&this.controlsNext.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")}));let t=this.Reveal.getCurrentSlide();if(t){let e=this.Reveal.fragments.availableRoutes();e.prev&&this.controlsPrev.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsNext.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),this.Reveal.isVerticalSlide(t)?(e.prev&&this.controlsUp.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsDown.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")}))):(e.prev&&this.controlsLeft.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsRight.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})))}if(this.Reveal.getConfig().controlsTutorial){let t=this.Reveal.getIndices();!this.Reveal.hasNavigatedVertically()&&e.down?this.controlsDownArrow.classList.add("highlight"):(this.controlsDownArrow.classList.remove("highlight"),this.Reveal.getConfig().rtl?!this.Reveal.hasNavigatedHorizontally()&&e.left&&0===t.v?this.controlsLeftArrow.classList.add("highlight"):this.controlsLeftArrow.classList.remove("highlight"):!this.Reveal.hasNavigatedHorizontally()&&e.right&&0===t.v?this.controlsRightArrow.classList.add("highlight"):this.controlsRightArrow.classList.remove("highlight"))}}destroy(){this.unbind(),this.element.remove()}onNavigateLeftClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.prev():this.Reveal.left()}onNavigateRightClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.next():this.Reveal.right()}onNavigateUpClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.up()}onNavigateDownClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.down()}onNavigatePrevClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.prev()}onNavigateNextClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.next()}}class M{constructor(e){this.Reveal=e,this.onProgressClicked=this.onProgressClicked.bind(this)}render(){this.element=document.createElement("div"),this.element.className="progress",this.Reveal.getRevealElement().appendChild(this.element),this.bar=document.createElement("span"),this.element.appendChild(this.bar)}configure(e,t){this.element.style.display=e.progress?"block":"none"}bind(){this.Reveal.getConfig().progress&&this.element&&this.element.addEventListener("click",this.onProgressClicked,!1)}unbind(){this.Reveal.getConfig().progress&&this.element&&this.element.removeEventListener("click",this.onProgressClicked,!1)}update(){if(this.Reveal.getConfig().progress&&this.bar){let e=this.Reveal.getProgress();this.Reveal.getTotalSlides()<2&&(e=0),this.bar.style.transform="scaleX("+e+")"}}getMaxWidth(){return this.Reveal.getRevealElement().offsetWidth}onProgressClicked(e){this.Reveal.onUserInput(e),e.preventDefault();let t=this.Reveal.getSlides(),i=t.length,s=Math.floor(e.clientX/this.getMaxWidth()*i);this.Reveal.getConfig().rtl&&(s=i-s);let a=this.Reveal.getIndices(t[s]);this.Reveal.slide(a.h,a.v)}destroy(){this.element.remove()}}class D{constructor(e){this.Reveal=e,this.lastMouseWheelStep=0,this.cursorHidden=!1,this.cursorInactiveTimeout=0,this.onDocumentCursorActive=this.onDocumentCursorActive.bind(this),this.onDocumentMouseScroll=this.onDocumentMouseScroll.bind(this)}configure(e,t){e.mouseWheel?(document.addEventListener("DOMMouseScroll",this.onDocumentMouseScroll,!1),document.addEventListener("mousewheel",this.onDocumentMouseScroll,!1)):(document.removeEventListener("DOMMouseScroll",this.onDocumentMouseScroll,!1),document.removeEventListener("mousewheel",this.onDocumentMouseScroll,!1)),e.hideInactiveCursor?(document.addEventListener("mousemove",this.onDocumentCursorActive,!1),document.addEventListener("mousedown",this.onDocumentCursorActive,!1)):(this.showCursor(),document.removeEventListener("mousemove",this.onDocumentCursorActive,!1),document.removeEventListener("mousedown",this.onDocumentCursorActive,!1))}showCursor(){this.cursorHidden&&(this.cursorHidden=!1,this.Reveal.getRevealElement().style.cursor="")}hideCursor(){!1===this.cursorHidden&&(this.cursorHidden=!0,this.Reveal.getRevealElement().style.cursor="none")}destroy(){this.showCursor(),document.removeEventListener("DOMMouseScroll",this.onDocumentMouseScroll,!1),document.removeEventListener("mousewheel",this.onDocumentMouseScroll,!1),document.removeEventListener("mousemove",this.onDocumentCursorActive,!1),document.removeEventListener("mousedown",this.onDocumentCursorActive,!1)}onDocumentCursorActive(e){this.showCursor(),clearTimeout(this.cursorInactiveTimeout),this.cursorInactiveTimeout=setTimeout(this.hideCursor.bind(this),this.Reveal.getConfig().hideCursorTime)}onDocumentMouseScroll(e){if(Date.now()-this.lastMouseWheelStep>1e3){this.lastMouseWheelStep=Date.now();let t=e.detail||-e.wheelDelta;t>0?this.Reveal.next():t<0&&this.Reveal.prev()}}}const I=(e,t)=>{const i=document.createElement("script");i.type="text/javascript",i.async=!1,i.defer=!1,i.src=e,"function"==typeof t&&(i.onload=i.onreadystatechange=e=>{("load"===e.type||/loaded|complete/.test(i.readyState))&&(i.onload=i.onreadystatechange=i.onerror=null,t())},i.onerror=e=>{i.onload=i.onreadystatechange=i.onerror=null,t(new Error("Failed loading script: "+i.src+"\n"+e))});const s=document.querySelector("head");s.insertBefore(i,s.lastChild)};class T{constructor(e){this.Reveal=e,this.state="idle",this.registeredPlugins={},this.asyncDependencies=[]}load(e,t){return this.state="loading",e.forEach(this.registerPlugin.bind(this)),new Promise((e=>{let i=[],s=0;if(t.forEach((e=>{e.condition&&!e.condition()||(e.async?this.asyncDependencies.push(e):i.push(e))})),i.length){s=i.length;const t=t=>{t&&"function"==typeof t.callback&&t.callback(),0==--s&&this.initPlugins().then(e)};i.forEach((e=>{"string"==typeof e.id?(this.registerPlugin(e),t(e)):"string"==typeof e.src?I(e.src,(()=>t(e))):(console.warn("Unrecognized plugin format",e),t())}))}else this.initPlugins().then(e)}))}initPlugins(){return new Promise((e=>{let t=Object.values(this.registeredPlugins),i=t.length;if(0===i)this.loadAsync().then(e);else{let s,a=()=>{0==--i?this.loadAsync().then(e):s()},n=0;s=()=>{let e=t[n++];if("function"==typeof e.init){let t=e.init(this.Reveal);t&&"function"==typeof t.then?t.then(a):a()}else a()},s()}}))}loadAsync(){return this.state="loaded",this.asyncDependencies.length&&this.asyncDependencies.forEach((e=>{I(e.src,e.callback)})),Promise.resolve()}registerPlugin(e){2===arguments.length&&"string"==typeof arguments[0]?(e=arguments[1]).id=arguments[0]:"function"==typeof e&&(e=e());let t=e.id;"string"!=typeof t?console.warn("Unrecognized plugin format; can't find plugin.id",e):void 0===this.registeredPlugins[t]?(this.registeredPlugins[t]=e,"loaded"===this.state&&"function"==typeof e.init&&e.init(this.Reveal)):console.warn('reveal.js: "'+t+'" plugin has already been registered')}hasPlugin(e){return!!this.registeredPlugins[e]}getPlugin(e){return this.registeredPlugins[e]}getRegisteredPlugins(){return this.registeredPlugins}destroy(){Object.values(this.registeredPlugins).forEach((e=>{"function"==typeof e.destroy&&e.destroy()})),this.registeredPlugins={},this.asyncDependencies=[]}}class F{constructor(e){this.Reveal=e}async setupPDF(){const e=this.Reveal.getConfig(),i=t(this.Reveal.getRevealElement(),".slides section"),s=e.slideNumber&&/all|print/i.test(e.showSlideNumber),a=this.Reveal.getComputedSlideSize(window.innerWidth,window.innerHeight),n=Math.floor(a.width*(1+e.margin)),r=Math.floor(a.height*(1+e.margin)),o=a.width,d=a.height;await new Promise(requestAnimationFrame),l("@page{size:"+n+"px "+r+"px; margin: 0px;}"),l(".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: "+o+"px; max-height:"+d+"px}"),document.documentElement.classList.add("print-pdf"),document.body.style.width=n+"px",document.body.style.height=r+"px";const c=document.querySelector(".reveal-viewport");let h;if(c){const e=window.getComputedStyle(c);e&&e.background&&(h=e.background)}await new Promise(requestAnimationFrame),this.Reveal.layoutSlideContents(o,d),await new Promise(requestAnimationFrame);const u=i.map((e=>e.scrollHeight)),g=[],v=i[0].parentNode;i.forEach((function(i,a){if(!1===i.classList.contains("stack")){let l=(n-o)/2,c=(r-d)/2;const v=u[a];let p=Math.max(Math.ceil(v/r),1);p=Math.min(p,e.pdfMaxPagesPerSlide),(1===p&&e.center||i.classList.contains("center"))&&(c=Math.max((r-v)/2,0));const m=document.createElement("div");if(g.push(m),m.className="pdf-page",m.style.height=(r+e.pdfPageHeightOffset)*p+"px",h&&(m.style.background=h),m.appendChild(i),i.style.left=l+"px",i.style.top=c+"px",i.style.width=o+"px",this.Reveal.slideContent.layout(i),i.slideBackgroundElement&&m.insertBefore(i.slideBackgroundElement,i),e.showNotes){const t=this.Reveal.getSlideNotes(i);if(t){const i=8,s="string"==typeof e.showNotes?e.showNotes:"inline",a=document.createElement("div");a.classList.add("speaker-notes"),a.classList.add("speaker-notes-pdf"),a.setAttribute("data-layout",s),a.innerHTML=t,"separate-page"===s?g.push(a):(a.style.left=i+"px",a.style.bottom=i+"px",a.style.width=n-2*i+"px",m.appendChild(a))}}if(s){const e=a+1,t=document.createElement("div");t.classList.add("slide-number"),t.classList.add("slide-number-pdf"),t.innerHTML=e,m.appendChild(t)}if(e.pdfSeparateFragments){const e=this.Reveal.fragments.sort(m.querySelectorAll(".fragment"),!0);let t;e.forEach((function(e){t&&t.forEach((function(e){e.classList.remove("current-fragment")})),e.forEach((function(e){e.classList.add("visible","current-fragment")}),this);const i=m.cloneNode(!0);g.push(i),t=e}),this),e.forEach((function(e){e.forEach((function(e){e.classList.remove("visible","current-fragment")}))}))}else t(m,".fragment:not(.fade-out)").forEach((function(e){e.classList.add("visible")}))}}),this),await new Promise(requestAnimationFrame),g.forEach((e=>v.appendChild(e))),this.Reveal.dispatchEvent({type:"pdf-ready"})}isPrintingPDF(){return/print-pdf/gi.test(window.location.search)}}class z{constructor(e){this.Reveal=e,this.touchStartX=0,this.touchStartY=0,this.touchStartCount=0,this.touchCaptured=!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this)}bind(){let e=this.Reveal.getRevealElement();"onpointerdown"in window?(e.addEventListener("pointerdown",this.onPointerDown,!1),e.addEventListener("pointermove",this.onPointerMove,!1),e.addEventListener("pointerup",this.onPointerUp,!1)):window.navigator.msPointerEnabled?(e.addEventListener("MSPointerDown",this.onPointerDown,!1),e.addEventListener("MSPointerMove",this.onPointerMove,!1),e.addEventListener("MSPointerUp",this.onPointerUp,!1)):(e.addEventListener("touchstart",this.onTouchStart,!1),e.addEventListener("touchmove",this.onTouchMove,!1),e.addEventListener("touchend",this.onTouchEnd,!1))}unbind(){let e=this.Reveal.getRevealElement();e.removeEventListener("pointerdown",this.onPointerDown,!1),e.removeEventListener("pointermove",this.onPointerMove,!1),e.removeEventListener("pointerup",this.onPointerUp,!1),e.removeEventListener("MSPointerDown",this.onPointerDown,!1),e.removeEventListener("MSPointerMove",this.onPointerMove,!1),e.removeEventListener("MSPointerUp",this.onPointerUp,!1),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1)}isSwipePrevented(e){if(n(e,"video, audio"))return!0;for(;e&&"function"==typeof e.hasAttribute;){if(e.hasAttribute("data-prevent-swipe"))return!0;e=e.parentNode}return!1}onTouchStart(e){if(this.isSwipePrevented(e.target))return!0;this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY,this.touchStartCount=e.touches.length}onTouchMove(e){if(this.isSwipePrevented(e.target))return!0;let t=this.Reveal.getConfig();if(this.touchCaptured)v&&e.preventDefault();else{this.Reveal.onUserInput(e);let i=e.touches[0].clientX,s=e.touches[0].clientY;if(1===e.touches.length&&2!==this.touchStartCount){let a=this.Reveal.availableRoutes({includeFragments:!0}),n=i-this.touchStartX,r=s-this.touchStartY;n>40&&Math.abs(n)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.next():this.Reveal.prev():this.Reveal.left()):n<-40&&Math.abs(n)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.prev():this.Reveal.next():this.Reveal.right()):r>40&&a.up?(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.prev():this.Reveal.up()):r<-40&&a.down&&(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.next():this.Reveal.down()),t.embedded?(this.touchCaptured||this.Reveal.isVerticalSlide())&&e.preventDefault():e.preventDefault()}}}onTouchEnd(e){this.touchCaptured=!1}onPointerDown(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchStart(e))}onPointerMove(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchMove(e))}onPointerUp(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchEnd(e))}}class H{constructor(e){this.Reveal=e,this.onRevealPointerDown=this.onRevealPointerDown.bind(this),this.onDocumentPointerDown=this.onDocumentPointerDown.bind(this)}configure(e,t){e.embedded?this.blur():(this.focus(),this.unbind())}bind(){this.Reveal.getConfig().embedded&&this.Reveal.getRevealElement().addEventListener("pointerdown",this.onRevealPointerDown,!1)}unbind(){this.Reveal.getRevealElement().removeEventListener("pointerdown",this.onRevealPointerDown,!1),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)}focus(){"focus"!==this.state&&(this.Reveal.getRevealElement().classList.add("focused"),document.addEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state="focus"}blur(){"blur"!==this.state&&(this.Reveal.getRevealElement().classList.remove("focused"),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state="blur"}isFocused(){return"focus"===this.state}destroy(){this.Reveal.getRevealElement().classList.remove("focused")}onRevealPointerDown(e){this.focus()}onDocumentPointerDown(e){let t=r(e.target,".reveal");t&&t===this.Reveal.getRevealElement()||this.blur()}}class q{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="speaker-notes",this.element.setAttribute("data-prevent-swipe",""),this.element.setAttribute("tabindex","0"),this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){e.showNotes&&this.element.setAttribute("data-layout","string"==typeof e.showNotes?e.showNotes:"inline")}update(){this.Reveal.getConfig().showNotes&&this.element&&this.Reveal.getCurrentSlide()&&!this.Reveal.print.isPrintingPDF()&&(this.element.innerHTML=this.getSlideNotes()||'No notes on this slide.')}updateVisibility(){this.Reveal.getConfig().showNotes&&this.hasNotes()&&!this.Reveal.print.isPrintingPDF()?this.Reveal.getRevealElement().classList.add("show-notes"):this.Reveal.getRevealElement().classList.remove("show-notes")}hasNotes(){return this.Reveal.getSlidesElement().querySelectorAll("[data-notes], aside.notes").length>0}isSpeakerNotesWindow(){return!!window.location.search.match(/receiver/gi)}getSlideNotes(e=this.Reveal.getCurrentSlide()){if(e.hasAttribute("data-notes"))return e.getAttribute("data-notes");let t=e.querySelector("aside.notes");return t?t.innerHTML:null}destroy(){this.element.remove()}}class B{constructor(e,t){this.diameter=100,this.diameter2=this.diameter/2,this.thickness=6,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=e,this.progressCheck=t,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.canvas.style.width=this.diameter2+"px",this.canvas.style.height=this.diameter2+"px",this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}setPlaying(e){const t=this.playing;this.playing=e,!t&&this.playing?this.animate():this.render()}animate(){const e=this.progress;this.progress=this.progressCheck(),e>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&requestAnimationFrame(this.animate.bind(this))}render(){let e=this.playing?this.progress:0,t=this.diameter2-this.thickness,i=this.diameter2,s=this.diameter2,a=28;this.progressOffset+=.1*(1-this.progressOffset);const n=-Math.PI/2+e*(2*Math.PI),r=-Math.PI/2+this.progressOffset*(2*Math.PI);this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(i,s,t+4,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(i,s,t,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="rgba( 255, 255, 255, 0.2 )",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(i,s,t,r,n,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(i-14,s-14),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,10,a),this.context.fillRect(18,0,10,a)):(this.context.beginPath(),this.context.translate(4,0),this.context.moveTo(0,0),this.context.lineTo(24,14),this.context.lineTo(0,a),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()}on(e,t){this.canvas.addEventListener(e,t,!1)}off(e,t){this.canvas.removeEventListener(e,t,!1)}destroy(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)}}var O={width:960,height:700,margin:.04,minScale:.2,maxScale:2,controls:!0,controlsTutorial:!0,controlsLayout:"bottom-right",controlsBackArrows:"faded",progress:!0,slideNumber:!1,showSlideNumber:"all",hashOneBasedIndex:!1,hash:!1,respondToHashChanges:!0,history:!1,keyboard:!0,keyboardCondition:null,disableLayout:!1,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,navigationMode:"default",shuffle:!1,fragments:!0,fragmentInURL:!0,embedded:!1,help:!0,pause:!0,showNotes:!1,showHiddenSlides:!1,autoPlayMedia:null,preloadIframes:null,autoAnimate:!0,autoAnimateMatcher:null,autoAnimateEasing:"ease",autoAnimateDuration:1,autoAnimateUnmatched:!0,autoAnimateStyles:["opacity","color","background-color","padding","font-size","line-height","letter-spacing","border-width","border-color","border-radius","outline","outline-offset"],autoSlide:0,autoSlideStoppable:!0,autoSlideMethod:null,defaultTiming:null,mouseWheel:!1,previewLinks:!1,postMessage:!0,postMessageEvents:!1,focusBodyOnPageVisibilityChange:!0,transition:"slide",transitionSpeed:"default",backgroundTransition:"fade",parallaxBackgroundImage:"",parallaxBackgroundSize:"",parallaxBackgroundRepeat:"",parallaxBackgroundPosition:"",parallaxBackgroundHorizontal:null,parallaxBackgroundVertical:null,pdfMaxPagesPerSlide:Number.POSITIVE_INFINITY,pdfSeparateFragments:!0,pdfPageHeightOffset:-1,viewDistance:3,mobileViewDistance:2,display:"block",hideInactiveCursor:!0,hideCursorTime:5e3,dependencies:[],plugins:[]};function U(n,l){arguments.length<2&&(l=arguments[0],n=document.querySelector(".reveal"));const h={};let u,v,p,m,f,w={},S=!1,A={hasNavigatedHorizontally:!1,hasNavigatedVertically:!1},I=[],U=1,W={layout:"",overview:""},K={},V="idle",$=0,j=0,X=-1,Y=!1,_=new b(h),J=new y(h),Q=new k(h),Z=new E(h),G=new L(h),ee=new C(h),te=new x(h),ie=new P(h),se=new N(h),ae=new M(h),ne=new D(h),re=new T(h),oe=new F(h),le=new H(h),de=new z(h),ce=new q(h);function he(e){if(!n)throw'Unable to find presentation root (
).';if(K.wrapper=n,K.slides=n.querySelector(".slides"),!K.slides)throw'Unable to find slides container (
).';return w={...O,...w,...l,...e,...d()},ue(),window.addEventListener("load",He,!1),re.load(w.plugins,w.dependencies).then(ge),new Promise((e=>h.on("ready",e)))}function ue(){!0===w.embedded?K.viewport=r(n,".reveal-viewport")||n:(K.viewport=document.body,document.documentElement.classList.add("reveal-full-page")),K.viewport.classList.add("reveal-viewport")}function ge(){S=!0,ve(),pe(),Ee(),ye(),we(),tt(),Re(),ie.readURL(),Z.update(!0),setTimeout((()=>{K.slides.classList.remove("no-transition"),K.wrapper.classList.add("ready"),Pe({type:"ready",data:{indexh:u,indexv:v,currentSlide:m}})}),1),oe.isPrintingPDF()&&(Ae(),"complete"===document.readyState?oe.setupPDF():window.addEventListener("load",(()=>{oe.setupPDF()})))}function ve(){w.showHiddenSlides||t(K.wrapper,'section[data-visibility="hidden"]').forEach((e=>{e.parentNode.removeChild(e)}))}function pe(){K.slides.classList.add("no-transition"),g?K.wrapper.classList.add("no-hover"):K.wrapper.classList.remove("no-hover"),Z.render(),J.render(),se.render(),ae.render(),ce.render(),K.pauseOverlay=o(K.wrapper,"div","pause-overlay",w.controls?'':null),K.statusElement=me(),K.wrapper.setAttribute("role","application")}function me(){let e=K.wrapper.querySelector(".aria-status");return e||(e=document.createElement("div"),e.style.position="absolute",e.style.height="1px",e.style.width="1px",e.style.overflow="hidden",e.style.clip="rect( 1px, 1px, 1px, 1px )",e.classList.add("aria-status"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),K.wrapper.appendChild(e)),e}function fe(e){K.statusElement.textContent=e}function be(e){let t="";if(3===e.nodeType)t+=e.textContent;else if(1===e.nodeType){let i=e.getAttribute("aria-hidden"),s="none"===window.getComputedStyle(e).display;"true"===i||s||Array.from(e.childNodes).forEach((e=>{t+=be(e)}))}return t=t.trim(),""===t?"":t+" "}function ye(){setInterval((()=>{0===K.wrapper.scrollTop&&0===K.wrapper.scrollLeft||(K.wrapper.scrollTop=0,K.wrapper.scrollLeft=0)}),1e3)}function we(){document.addEventListener("fullscreenchange",Ht),document.addEventListener("webkitfullscreenchange",Ht)}function Ee(){w.postMessage&&window.addEventListener("message",Dt,!1)}function Re(t){const s={...w};if("object"==typeof t&&e(w,t),!1===h.isReady())return;const a=K.wrapper.querySelectorAll(".slides section").length;K.wrapper.classList.remove(s.transition),K.wrapper.classList.add(w.transition),K.wrapper.setAttribute("data-transition-speed",w.transitionSpeed),K.wrapper.setAttribute("data-background-transition",w.backgroundTransition),K.viewport.style.setProperty("--slide-width",w.width+"px"),K.viewport.style.setProperty("--slide-height",w.height+"px"),w.shuffle&&it(),i(K.wrapper,"embedded",w.embedded),i(K.wrapper,"rtl",w.rtl),i(K.wrapper,"center",w.center),!1===w.pause&&Xe(),w.previewLinks?(Me(),De("[data-preview-link=false]")):(De(),Me("[data-preview-link]:not([data-preview-link=false])")),Q.reset(),f&&(f.destroy(),f=null),a>1&&w.autoSlide&&w.autoSlideStoppable&&(f=new B(K.wrapper,(()=>Math.min(Math.max((Date.now()-X)/$,0),1))),f.on("click",Bt),Y=!1),"default"!==w.navigationMode?K.wrapper.setAttribute("data-navigation-mode",w.navigationMode):K.wrapper.removeAttribute("data-navigation-mode"),ce.configure(w,s),le.configure(w,s),ne.configure(w,s),se.configure(w,s),ae.configure(w,s),te.configure(w,s),G.configure(w,s),J.configure(w,s),Ge()}function Se(){window.addEventListener("resize",Ft,!1),w.touch&&de.bind(),w.keyboard&&te.bind(),w.progress&&ae.bind(),w.respondToHashChanges&&ie.bind(),se.bind(),le.bind(),K.slides.addEventListener("click",Tt,!1),K.slides.addEventListener("transitionend",It,!1),K.pauseOverlay.addEventListener("click",Xe,!1),w.focusBodyOnPageVisibilityChange&&document.addEventListener("visibilitychange",zt,!1)}function Ae(){de.unbind(),le.unbind(),te.unbind(),se.unbind(),ae.unbind(),ie.unbind(),window.removeEventListener("resize",Ft,!1),K.slides.removeEventListener("click",Tt,!1),K.slides.removeEventListener("transitionend",It,!1),K.pauseOverlay.removeEventListener("click",Xe,!1)}function ke(){Ae(),Rt(),De(),ce.destroy(),le.destroy(),re.destroy(),ne.destroy(),se.destroy(),ae.destroy(),Z.destroy(),J.destroy(),document.removeEventListener("fullscreenchange",Ht),document.removeEventListener("webkitfullscreenchange",Ht),document.removeEventListener("visibilitychange",zt,!1),window.removeEventListener("message",Dt,!1),window.removeEventListener("load",He,!1),K.pauseOverlay&&K.pauseOverlay.remove(),K.statusElement&&K.statusElement.remove(),document.documentElement.classList.remove("reveal-full-page"),K.wrapper.classList.remove("ready","center","has-horizontal-slides","has-vertical-slides"),K.wrapper.removeAttribute("data-transition-speed"),K.wrapper.removeAttribute("data-background-transition"),K.viewport.classList.remove("reveal-viewport"),K.viewport.style.removeProperty("--slide-width"),K.viewport.style.removeProperty("--slide-height"),K.slides.style.removeProperty("width"),K.slides.style.removeProperty("height"),K.slides.style.removeProperty("zoom"),K.slides.style.removeProperty("left"),K.slides.style.removeProperty("top"),K.slides.style.removeProperty("bottom"),K.slides.style.removeProperty("right"),K.slides.style.removeProperty("transform"),Array.from(K.wrapper.querySelectorAll(".slides section")).forEach((e=>{e.style.removeProperty("display"),e.style.removeProperty("top"),e.removeAttribute("hidden"),e.removeAttribute("aria-hidden")}))}function Le(e,t,i){n.addEventListener(e,t,i)}function Ce(e,t,i){n.removeEventListener(e,t,i)}function xe(e){"string"==typeof e.layout&&(W.layout=e.layout),"string"==typeof e.overview&&(W.overview=e.overview),W.layout?a(K.slides,W.layout+" "+W.overview):a(K.slides,W.overview)}function Pe({target:t=K.wrapper,type:i,data:s,bubbles:a=!0}){let n=document.createEvent("HTMLEvents",1,2);return n.initEvent(i,a,!0),e(n,s),t.dispatchEvent(n),t===K.wrapper&&Ne(i),n}function Ne(t,i){if(w.postMessageEvents&&window.parent!==window.self){let s={namespace:"reveal",eventName:t,state:yt()};e(s,i),window.parent.postMessage(JSON.stringify(s),"*")}}function Me(e="a"){Array.from(K.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",qt,!1)}))}function De(e="a"){Array.from(K.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",qt,!1)}))}function Ie(e){ze(),K.overlay=document.createElement("div"),K.overlay.classList.add("overlay"),K.overlay.classList.add("overlay-preview"),K.wrapper.appendChild(K.overlay),K.overlay.innerHTML=`
\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
`,K.overlay.querySelector("iframe").addEventListener("load",(e=>{K.overlay.classList.add("loaded")}),!1),K.overlay.querySelector(".close").addEventListener("click",(e=>{ze(),e.preventDefault()}),!1),K.overlay.querySelector(".external").addEventListener("click",(e=>{ze()}),!1)}function Te(e){"boolean"==typeof e?e?Fe():ze():K.overlay?ze():Fe()}function Fe(){if(w.help){ze(),K.overlay=document.createElement("div"),K.overlay.classList.add("overlay"),K.overlay.classList.add("overlay-help"),K.wrapper.appendChild(K.overlay);let e='

Keyboard Shortcuts


',t=te.getShortcuts(),i=te.getBindings();e+="";for(let i in t)e+=``;for(let t in i)i[t].key&&i[t].description&&(e+=``);e+="
KEYACTION
${i}${t[i]}
${i[t].key}${i[t].description}
",K.overlay.innerHTML=`\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
${e}
\n\t\t\t\t
\n\t\t\t`,K.overlay.querySelector(".close").addEventListener("click",(e=>{ze(),e.preventDefault()}),!1)}}function ze(){return!!K.overlay&&(K.overlay.parentNode.removeChild(K.overlay),K.overlay=null,!0)}function He(){if(K.wrapper&&!oe.isPrintingPDF()){if(!w.disableLayout){g&&!w.embedded&&document.documentElement.style.setProperty("--vh",.01*window.innerHeight+"px");const e=Be(),t=U;qe(w.width,w.height),K.slides.style.width=e.width+"px",K.slides.style.height=e.height+"px",U=Math.min(e.presentationWidth/e.width,e.presentationHeight/e.height),U=Math.max(U,w.minScale),U=Math.min(U,w.maxScale),1===U?(K.slides.style.zoom="",K.slides.style.left="",K.slides.style.top="",K.slides.style.bottom="",K.slides.style.right="",xe({layout:""})):(K.slides.style.zoom="",K.slides.style.left="50%",K.slides.style.top="50%",K.slides.style.bottom="auto",K.slides.style.right="auto",xe({layout:"translate(-50%, -50%) scale("+U+")"}));const i=Array.from(K.wrapper.querySelectorAll(".slides section"));for(let t=0,s=i.length;t .stretch, section > .r-stretch").forEach((t=>{let s=c(t,i);if(/(img|video)/gi.test(t.nodeName)){const i=t.naturalWidth||t.videoWidth,a=t.naturalHeight||t.videoHeight,n=Math.min(e/i,s/a);t.style.width=i*n+"px",t.style.height=a*n+"px"}else t.style.width=e+"px",t.style.height=s+"px"}))}function Be(e,t){const i={width:w.width,height:w.height,presentationWidth:e||K.wrapper.offsetWidth,presentationHeight:t||K.wrapper.offsetHeight};return i.presentationWidth-=i.presentationWidth*w.margin,i.presentationHeight-=i.presentationHeight*w.margin,"string"==typeof i.width&&/%$/.test(i.width)&&(i.width=parseInt(i.width,10)/100*i.presentationWidth),"string"==typeof i.height&&/%$/.test(i.height)&&(i.height=parseInt(i.height,10)/100*i.presentationHeight),i}function Oe(e,t){"object"==typeof e&&"function"==typeof e.setAttribute&&e.setAttribute("data-previous-indexv",t||0)}function Ue(e){if("object"==typeof e&&"function"==typeof e.setAttribute&&e.classList.contains("stack")){const t=e.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(e.getAttribute(t)||0,10)}return 0}function We(e=m){return e&&e.parentNode&&!!e.parentNode.nodeName.match(/section/i)}function Ke(){return!(!m||!We(m))&&!m.nextElementSibling}function Ve(){return 0===u&&0===v}function $e(){return!!m&&(!m.nextElementSibling&&(!We(m)||!m.parentNode.nextElementSibling))}function je(){if(w.pause){const e=K.wrapper.classList.contains("paused");Rt(),K.wrapper.classList.add("paused"),!1===e&&Pe({type:"paused"})}}function Xe(){const e=K.wrapper.classList.contains("paused");K.wrapper.classList.remove("paused"),Et(),e&&Pe({type:"resumed"})}function Ye(e){"boolean"==typeof e?e?je():Xe():_e()?Xe():je()}function _e(){return K.wrapper.classList.contains("paused")}function Je(e){"boolean"==typeof e?e?At():St():Y?At():St()}function Qe(){return!(!$||Y)}function Ze(e,t,i,s){if(Pe({type:"beforeslidechange",data:{indexh:void 0===e?u:e,indexv:void 0===t?v:t,origin:s}}).defaultPrevented)return;p=m;const a=K.wrapper.querySelectorAll(".slides>section");if(0===a.length)return;void 0!==t||ee.isActive()||(t=Ue(a[e])),p&&p.parentNode&&p.parentNode.classList.contains("stack")&&Oe(p.parentNode,v);const n=I.concat();I.length=0;let r=u||0,o=v||0;u=st(".slides>section",void 0===e?u:e),v=st(".slides>section.present>section",void 0===t?v:t);let l=u!==r||v!==o;l||(p=null);let d=a[u],c=d.querySelectorAll("section");m=c[v]||d;let h=!1;l&&p&&m&&!ee.isActive()&&(p.hasAttribute("data-auto-animate")&&m.hasAttribute("data-auto-animate")&&p.getAttribute("data-auto-animate-id")===m.getAttribute("data-auto-animate-id")&&!(u>r||v>o?m:p).hasAttribute("data-auto-animate-restart")&&(h=!0,K.slides.classList.add("disable-slide-transitions")),V="running"),at(),He(),ee.isActive()&&ee.update(),void 0!==i&&G.goto(i),p&&p!==m&&(p.classList.remove("present"),p.setAttribute("aria-hidden","true"),Ve()&&setTimeout((()=>{ut().forEach((e=>{Oe(e,0)}))}),0));e:for(let e=0,t=I.length;e{fe(be(m))})),ae.update(),se.update(),ce.update(),Z.update(),Z.updateParallax(),J.update(),G.update(),ie.writeURL(),Et(),h&&(setTimeout((()=>{K.slides.classList.remove("disable-slide-transitions")}),0),w.autoAnimate&&Q.run(p,m))}function Ge(){Ae(),Se(),He(),$=w.autoSlide,Et(),Z.create(),ie.writeURL(),G.sortAll(),se.update(),ae.update(),at(),ce.update(),ce.updateVisibility(),Z.update(!0),J.update(),_.formatEmbeddedContent(),!1===w.autoPlayMedia?_.stopEmbeddedContent(m,{unloadIframes:!1}):_.startEmbeddedContent(m),ee.isActive()&&ee.layout()}function et(e=m){Z.sync(e),G.sync(e),_.load(e),Z.update(),ce.update()}function tt(){ct().forEach((e=>{t(e,"section").forEach(((e,t)=>{t>0&&(e.classList.remove("present"),e.classList.remove("past"),e.classList.add("future"),e.setAttribute("aria-hidden","true"))}))}))}function it(e=ct()){e.forEach(((t,i)=>{let s=e[Math.floor(Math.random()*e.length)];s.parentNode===t.parentNode&&t.parentNode.insertBefore(t,s);let a=t.querySelectorAll("section");a.length&&it(a)}))}function st(e,i){let s=t(K.wrapper,e),a=s.length,n=oe.isPrintingPDF();if(a){w.loop&&(i%=a)<0&&(i=a+i),i=Math.max(Math.min(i,a-1),0);for(let e=0;e{e.classList.add("visible"),e.classList.remove("current-fragment")}))):e>i&&(a.classList.add(r?"past":"future"),w.fragments&&t(a,".fragment.visible").forEach((e=>{e.classList.remove("visible","current-fragment")})))}let e=s[i],r=e.classList.contains("present");e.classList.add("present"),e.removeAttribute("hidden"),e.removeAttribute("aria-hidden"),r||Pe({target:e,type:"visible",bubbles:!1});let o=e.getAttribute("data-state");o&&(I=I.concat(o.split(" ")))}else i=0;return i}function at(){let e,i,s=ct(),a=s.length;if(a&&void 0!==u){let n=ee.isActive()?10:w.viewDistance;g&&(n=ee.isActive()?6:w.mobileViewDistance),oe.isPrintingPDF()&&(n=Number.MAX_VALUE);for(let r=0;rsection"),i=K.wrapper.querySelectorAll(".slides>section.present>section"),s={left:u>0,right:u0,down:v1&&(s.left=!0,s.right=!0),i.length>1&&(s.up=!0,s.down=!0)),t.length>1&&"linear"===w.navigationMode&&(s.right=s.right||s.down,s.left=s.left||s.up),!0===e){let e=G.availableRoutes();s.left=s.left||e.prev,s.up=s.up||e.prev,s.down=s.down||e.next,s.right=s.right||e.next}if(w.rtl){let e=s.left;s.left=s.right,s.right=e}return s}function rt(e=m){let t=ct(),i=0;e:for(let s=0;s0){let i=.9;t+=m.querySelectorAll(".fragment.visible").length/e.length*i}}return Math.min(t/(e-1),1)}function lt(e){let i,s=u,a=v;if(e){let i=We(e),n=i?e.parentNode:e,r=ct();s=Math.max(r.indexOf(n),0),a=void 0,i&&(a=Math.max(t(e.parentNode,"section").indexOf(e),0))}if(!e&&m){if(m.querySelectorAll(".fragment").length>0){let e=m.querySelector(".current-fragment");i=e&&e.hasAttribute("data-fragment-index")?parseInt(e.getAttribute("data-fragment-index"),10):m.querySelectorAll(".fragment.visible").length-1}}return{h:s,v:a,f:i}}function dt(){return t(K.wrapper,'.slides section:not(.stack):not([data-visibility="uncounted"])')}function ct(){return t(K.wrapper,".slides>section")}function ht(){return t(K.wrapper,".slides>section>section")}function ut(){return t(K.wrapper,".slides>section.stack")}function gt(){return ct().length>1}function vt(){return ht().length>1}function pt(){return dt().map((e=>{let t={};for(let i=0;i{e.hasAttribute("data-autoplay")&&$&&1e3*e.duration/e.playbackRate>$&&($=1e3*e.duration/e.playbackRate+1e3)}))),!$||Y||_e()||ee.isActive()||$e()&&!G.availableRoutes().next&&!0!==w.loop||(j=setTimeout((()=>{"function"==typeof w.autoSlideMethod?w.autoSlideMethod():Nt(),Et()}),$),X=Date.now()),f&&f.setPlaying(-1!==j)}}function Rt(){clearTimeout(j),j=-1}function St(){$&&!Y&&(Y=!0,Pe({type:"autoslidepaused"}),clearTimeout(j),f&&f.setPlaying(!1))}function At(){$&&Y&&(Y=!1,Pe({type:"autoslideresumed"}),Et())}function kt({skipFragments:e=!1}={}){A.hasNavigatedHorizontally=!0,w.rtl?(ee.isActive()||e||!1===G.next())&&nt().left&&Ze(u+1,"grid"===w.navigationMode?v:void 0):(ee.isActive()||e||!1===G.prev())&&nt().left&&Ze(u-1,"grid"===w.navigationMode?v:void 0)}function Lt({skipFragments:e=!1}={}){A.hasNavigatedHorizontally=!0,w.rtl?(ee.isActive()||e||!1===G.prev())&&nt().right&&Ze(u-1,"grid"===w.navigationMode?v:void 0):(ee.isActive()||e||!1===G.next())&&nt().right&&Ze(u+1,"grid"===w.navigationMode?v:void 0)}function Ct({skipFragments:e=!1}={}){(ee.isActive()||e||!1===G.prev())&&nt().up&&Ze(u,v-1)}function xt({skipFragments:e=!1}={}){A.hasNavigatedVertically=!0,(ee.isActive()||e||!1===G.next())&&nt().down&&Ze(u,v+1)}function Pt({skipFragments:e=!1}={}){if(e||!1===G.prev())if(nt().up)Ct({skipFragments:e});else{let i;if(i=w.rtl?t(K.wrapper,".slides>section.future").pop():t(K.wrapper,".slides>section.past").pop(),i&&i.classList.contains("stack")){let e=i.querySelectorAll("section").length-1||void 0;Ze(u-1,e)}else kt({skipFragments:e})}}function Nt({skipFragments:e=!1}={}){if(A.hasNavigatedHorizontally=!0,A.hasNavigatedVertically=!0,e||!1===G.next()){let t=nt();t.down&&t.right&&w.loop&&Ke()&&(t.down=!1),t.down?xt({skipFragments:e}):w.rtl?kt({skipFragments:e}):Lt({skipFragments:e})}}function Mt(e){w.autoSlideStoppable&&St()}function Dt(e){let t=e.data;if("string"==typeof t&&"{"===t.charAt(0)&&"}"===t.charAt(t.length-1)&&(t=JSON.parse(t),t.method&&"function"==typeof h[t.method]))if(!1===R.test(t.method)){const e=h[t.method].apply(h,t.args);Ne("callback",{method:t.method,result:e})}else console.warn('reveal.js: "'+t.method+'" is is blacklisted from the postMessage API')}function It(e){"running"===V&&/section/gi.test(e.target.nodeName)&&(V="idle",Pe({type:"slidetransitionend",data:{indexh:u,indexv:v,previousSlide:p,currentSlide:m}}))}function Tt(e){const t=r(e.target,'a[href^="#"]');if(t){const i=t.getAttribute("href"),s=ie.getIndicesFromHash(i);s&&(h.slide(s.h,s.v,s.f),e.preventDefault())}}function Ft(e){He()}function zt(e){!1===document.hidden&&document.activeElement!==document.body&&("function"==typeof document.activeElement.blur&&document.activeElement.blur(),document.body.focus())}function Ht(e){(document.fullscreenElement||document.webkitFullscreenElement)===K.wrapper&&(e.stopImmediatePropagation(),setTimeout((()=>{h.layout(),h.focus.focus()}),1))}function qt(e){if(e.currentTarget&&e.currentTarget.hasAttribute("href")){let t=e.currentTarget.getAttribute("href");t&&(Ie(t),e.preventDefault())}}function Bt(e){$e()&&!1===w.loop?(Ze(0,0),At()):Y?At():St()}const Ot={VERSION:"4.3.1",initialize:he,configure:Re,destroy:ke,sync:Ge,syncSlide:et,syncFragments:G.sync.bind(G),slide:Ze,left:kt,right:Lt,up:Ct,down:xt,prev:Pt,next:Nt,navigateLeft:kt,navigateRight:Lt,navigateUp:Ct,navigateDown:xt,navigatePrev:Pt,navigateNext:Nt,navigateFragment:G.goto.bind(G),prevFragment:G.prev.bind(G),nextFragment:G.next.bind(G),on:Le,off:Ce,addEventListener:Le,removeEventListener:Ce,layout:He,shuffle:it,availableRoutes:nt,availableFragments:G.availableRoutes.bind(G),toggleHelp:Te,toggleOverview:ee.toggle.bind(ee),togglePause:Ye,toggleAutoSlide:Je,isFirstSlide:Ve,isLastSlide:$e,isLastVerticalSlide:Ke,isVerticalSlide:We,isPaused:_e,isAutoSliding:Qe,isSpeakerNotes:ce.isSpeakerNotesWindow.bind(ce),isOverview:ee.isActive.bind(ee),isFocused:le.isFocused.bind(le),isPrintingPDF:oe.isPrintingPDF.bind(oe),isReady:()=>S,loadSlide:_.load.bind(_),unloadSlide:_.unload.bind(_),showPreview:Ie,hidePreview:ze,addEventListeners:Se,removeEventListeners:Ae,dispatchEvent:Pe,getState:yt,setState:wt,getProgress:ot,getIndices:lt,getSlidesAttributes:pt,getSlidePastCount:rt,getTotalSlides:mt,getSlide:ft,getPreviousSlide:()=>p,getCurrentSlide:()=>m,getSlideBackground:bt,getSlideNotes:ce.getSlideNotes.bind(ce),getSlides:dt,getHorizontalSlides:ct,getVerticalSlides:ht,hasHorizontalSlides:gt,hasVerticalSlides:vt,hasNavigatedHorizontally:()=>A.hasNavigatedHorizontally,hasNavigatedVertically:()=>A.hasNavigatedVertically,addKeyBinding:te.addKeyBinding.bind(te),removeKeyBinding:te.removeKeyBinding.bind(te),triggerKey:te.triggerKey.bind(te),registerKeyboardShortcut:te.registerKeyboardShortcut.bind(te),getComputedSlideSize:Be,getScale:()=>U,getConfig:()=>w,getQueryHash:d,getSlidePath:ie.getHash.bind(ie),getRevealElement:()=>n,getSlidesElement:()=>K.slides,getViewportElement:()=>K.viewport,getBackgroundsElement:()=>Z.element,registerPlugin:re.registerPlugin.bind(re),hasPlugin:re.hasPlugin.bind(re),getPlugin:re.getPlugin.bind(re),getPlugins:re.getRegisteredPlugins.bind(re)};return e(h,{...Ot,announceStatus:fe,getStatusText:be,print:oe,focus:le,progress:ae,controls:se,location:ie,overview:ee,fragments:G,slideContent:_,slideNumber:J,onUserInput:Mt,closeOverlay:ze,updateSlidesVisibility:at,layoutSlideContents:qe,transformSlides:xe,cueAutoSlide:Et,cancelAutoSlide:Rt}),Ot}let W=U,K=[];W.initialize=e=>(Object.assign(W,new U(document.querySelector(".reveal"),e)),K.map((e=>e(W))),W.initialize()),["configure","on","off","addEventListener","removeEventListener","registerPlugin"].forEach((e=>{W[e]=(...t)=>{K.push((i=>i[e].call(null,...t)))}})),W.isReady=()=>!1,W.VERSION="4.3.1";export default W; +//# sourceMappingURL=reveal.esm.js.map diff --git a/AMC-talk_files/libs/revealjs/dist/reveal.esm.js.map b/AMC-talk_files/libs/revealjs/dist/reveal.esm.js.map new file mode 100644 index 0000000..286c75a --- /dev/null +++ b/AMC-talk_files/libs/revealjs/dist/reveal.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"reveal.esm.js","sources":["../js/utils/util.js","../js/utils/device.js","../node_modules/fitty/dist/fitty.module.js","../js/controllers/slidecontent.js","../js/controllers/slidenumber.js","../js/utils/color.js","../js/controllers/backgrounds.js","../js/utils/constants.js","../js/controllers/autoanimate.js","../js/controllers/fragments.js","../js/controllers/overview.js","../js/controllers/keyboard.js","../js/controllers/location.js","../js/controllers/controls.js","../js/controllers/progress.js","../js/controllers/pointer.js","../js/utils/loader.js","../js/controllers/plugins.js","../js/controllers/print.js","../js/controllers/touch.js","../js/controllers/focus.js","../js/controllers/notes.js","../js/components/playback.js","../js/config.js","../js/reveal.js","../js/index.js"],"sourcesContent":["/**\n * Extend object a with the properties of object b.\n * If there's a conflict, object b takes precedence.\n *\n * @param {object} a\n * @param {object} b\n */\nexport const extend = ( a, b ) => {\n\n\tfor( let i in b ) {\n\t\ta[ i ] = b[ i ];\n\t}\n\n\treturn a;\n\n}\n\n/**\n * querySelectorAll but returns an Array.\n */\nexport const queryAll = ( el, selector ) => {\n\n\treturn Array.from( el.querySelectorAll( selector ) );\n\n}\n\n/**\n * classList.toggle() with cross browser support\n */\nexport const toggleClass = ( el, className, value ) => {\n\tif( value ) {\n\t\tel.classList.add( className );\n\t}\n\telse {\n\t\tel.classList.remove( className );\n\t}\n}\n\n/**\n * Utility for deserializing a value.\n *\n * @param {*} value\n * @return {*}\n */\nexport const deserialize = ( value ) => {\n\n\tif( typeof value === 'string' ) {\n\t\tif( value === 'null' ) return null;\n\t\telse if( value === 'true' ) return true;\n\t\telse if( value === 'false' ) return false;\n\t\telse if( value.match( /^-?[\\d\\.]+$/ ) ) return parseFloat( value );\n\t}\n\n\treturn value;\n\n}\n\n/**\n * Measures the distance in pixels between point a\n * and point b.\n *\n * @param {object} a point with x/y properties\n * @param {object} b point with x/y properties\n *\n * @return {number}\n */\nexport const distanceBetween = ( a, b ) => {\n\n\tlet dx = a.x - b.x,\n\t\tdy = a.y - b.y;\n\n\treturn Math.sqrt( dx*dx + dy*dy );\n\n}\n\n/**\n * Applies a CSS transform to the target element.\n *\n * @param {HTMLElement} element\n * @param {string} transform\n */\nexport const transformElement = ( element, transform ) => {\n\n\telement.style.transform = transform;\n\n}\n\n/**\n * Element.matches with IE support.\n *\n * @param {HTMLElement} target The element to match\n * @param {String} selector The CSS selector to match\n * the element against\n *\n * @return {Boolean}\n */\nexport const matches = ( target, selector ) => {\n\n\tlet matchesMethod = target.matches || target.matchesSelector || target.msMatchesSelector;\n\n\treturn !!( matchesMethod && matchesMethod.call( target, selector ) );\n\n}\n\n/**\n * Find the closest parent that matches the given\n * selector.\n *\n * @param {HTMLElement} target The child element\n * @param {String} selector The CSS selector to match\n * the parents against\n *\n * @return {HTMLElement} The matched parent or null\n * if no matching parent was found\n */\nexport const closest = ( target, selector ) => {\n\n\t// Native Element.closest\n\tif( typeof target.closest === 'function' ) {\n\t\treturn target.closest( selector );\n\t}\n\n\t// Polyfill\n\twhile( target ) {\n\t\tif( matches( target, selector ) ) {\n\t\t\treturn target;\n\t\t}\n\n\t\t// Keep searching\n\t\ttarget = target.parentNode;\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Handling the fullscreen functionality via the fullscreen API\n *\n * @see http://fullscreen.spec.whatwg.org/\n * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode\n */\nexport const enterFullscreen = element => {\n\n\telement = element || document.documentElement;\n\n\t// Check which implementation is available\n\tlet requestMethod = element.requestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullScreen ||\n\t\t\t\t\t\telement.mozRequestFullScreen ||\n\t\t\t\t\t\telement.msRequestFullscreen;\n\n\tif( requestMethod ) {\n\t\trequestMethod.apply( element );\n\t}\n\n}\n\n/**\n * Creates an HTML element and returns a reference to it.\n * If the element already exists the existing instance will\n * be returned.\n *\n * @param {HTMLElement} container\n * @param {string} tagname\n * @param {string} classname\n * @param {string} innerHTML\n *\n * @return {HTMLElement}\n */\nexport const createSingletonNode = ( container, tagname, classname, innerHTML='' ) => {\n\n\t// Find all nodes matching the description\n\tlet nodes = container.querySelectorAll( '.' + classname );\n\n\t// Check all matches to find one which is a direct child of\n\t// the specified container\n\tfor( let i = 0; i < nodes.length; i++ ) {\n\t\tlet testNode = nodes[i];\n\t\tif( testNode.parentNode === container ) {\n\t\t\treturn testNode;\n\t\t}\n\t}\n\n\t// If no node was found, create it now\n\tlet node = document.createElement( tagname );\n\tnode.className = classname;\n\tnode.innerHTML = innerHTML;\n\tcontainer.appendChild( node );\n\n\treturn node;\n\n}\n\n/**\n * Injects the given CSS styles into the DOM.\n *\n * @param {string} value\n */\nexport const createStyleSheet = ( value ) => {\n\n\tlet tag = document.createElement( 'style' );\n\ttag.type = 'text/css';\n\n\tif( value && value.length > 0 ) {\n\t\tif( tag.styleSheet ) {\n\t\t\ttag.styleSheet.cssText = value;\n\t\t}\n\t\telse {\n\t\t\ttag.appendChild( document.createTextNode( value ) );\n\t\t}\n\t}\n\n\tdocument.head.appendChild( tag );\n\n\treturn tag;\n\n}\n\n/**\n * Returns a key:value hash of all query params.\n */\nexport const getQueryHash = () => {\n\n\tlet query = {};\n\n\tlocation.search.replace( /[A-Z0-9]+?=([\\w\\.%-]*)/gi, a => {\n\t\tquery[ a.split( '=' ).shift() ] = a.split( '=' ).pop();\n\t} );\n\n\t// Basic deserialization\n\tfor( let i in query ) {\n\t\tlet value = query[ i ];\n\n\t\tquery[ i ] = deserialize( unescape( value ) );\n\t}\n\n\t// Do not accept new dependencies via query config to avoid\n\t// the potential of malicious script injection\n\tif( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies'];\n\n\treturn query;\n\n}\n\n/**\n * Returns the remaining height within the parent of the\n * target element.\n *\n * remaining height = [ configured parent height ] - [ current parent height ]\n *\n * @param {HTMLElement} element\n * @param {number} [height]\n */\nexport const getRemainingHeight = ( element, height = 0 ) => {\n\n\tif( element ) {\n\t\tlet newHeight, oldHeight = element.style.height;\n\n\t\t// Change the .stretch element height to 0 in order find the height of all\n\t\t// the other elements\n\t\telement.style.height = '0px';\n\n\t\t// In Overview mode, the parent (.slide) height is set of 700px.\n\t\t// Restore it temporarily to its natural height.\n\t\telement.parentNode.style.height = 'auto';\n\n\t\tnewHeight = height - element.parentNode.offsetHeight;\n\n\t\t// Restore the old height, just in case\n\t\telement.style.height = oldHeight + 'px';\n\n\t\t// Clear the parent (.slide) height. .removeProperty works in IE9+\n\t\telement.parentNode.style.removeProperty('height');\n\n\t\treturn newHeight;\n\t}\n\n\treturn height;\n\n}\n\nconst fileExtensionToMimeMap = {\n\t'mp4': 'video/mp4',\n\t'm4a': 'video/mp4',\n\t'ogv': 'video/ogg',\n\t'mpeg': 'video/mpeg',\n\t'webm': 'video/webm'\n}\n\n/**\n * Guess the MIME type for common file formats.\n */\nexport const getMimeTypeFromFile = ( filename='' ) => {\n\treturn fileExtensionToMimeMap[filename.split('.').pop()]\n}","const UA = navigator.userAgent;\n\nexport const isMobile = /(iphone|ipod|ipad|android)/gi.test( UA ) ||\n\t\t\t\t\t\t( navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1 ); // iPadOS\n\nexport const isChrome = /chrome/i.test( UA ) && !/edge/i.test( UA );\n\nexport const isAndroid = /android/gi.test( UA );","/*\n * fitty v2.3.3 - Snugly resizes text to fit its parent container\n * Copyright (c) 2020 Rik Schennink (https://pqina.nl/)\n */\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.default = function (w) {\n\n // no window, early exit\n if (!w) return;\n\n // node list to array helper method\n var toArray = function toArray(nl) {\n return [].slice.call(nl);\n };\n\n // states\n var DrawState = {\n IDLE: 0,\n DIRTY_CONTENT: 1,\n DIRTY_LAYOUT: 2,\n DIRTY: 3\n };\n\n // all active fitty elements\n var fitties = [];\n\n // group all redraw calls till next frame, we cancel each frame request when a new one comes in. If no support for request animation frame, this is an empty function and supports for fitty stops.\n var redrawFrame = null;\n var requestRedraw = 'requestAnimationFrame' in w ? function () {\n w.cancelAnimationFrame(redrawFrame);\n redrawFrame = w.requestAnimationFrame(function () {\n return redraw(fitties.filter(function (f) {\n return f.dirty && f.active;\n }));\n });\n } : function () {};\n\n // sets all fitties to dirty so they are redrawn on the next redraw loop, then calls redraw\n var redrawAll = function redrawAll(type) {\n return function () {\n fitties.forEach(function (f) {\n return f.dirty = type;\n });\n requestRedraw();\n };\n };\n\n // redraws fitties so they nicely fit their parent container\n var redraw = function redraw(fitties) {\n\n // getting info from the DOM at this point should not trigger a reflow, let's gather as much intel as possible before triggering a reflow\n\n // check if styles of all fitties have been computed\n fitties.filter(function (f) {\n return !f.styleComputed;\n }).forEach(function (f) {\n f.styleComputed = computeStyle(f);\n });\n\n // restyle elements that require pre-styling, this triggers a reflow, please try to prevent by adding CSS rules (see docs)\n fitties.filter(shouldPreStyle).forEach(applyStyle);\n\n // we now determine which fitties should be redrawn\n var fittiesToRedraw = fitties.filter(shouldRedraw);\n\n // we calculate final styles for these fitties\n fittiesToRedraw.forEach(calculateStyles);\n\n // now we apply the calculated styles from our previous loop\n fittiesToRedraw.forEach(function (f) {\n applyStyle(f);\n markAsClean(f);\n });\n\n // now we dispatch events for all restyled fitties\n fittiesToRedraw.forEach(dispatchFitEvent);\n };\n\n var markAsClean = function markAsClean(f) {\n return f.dirty = DrawState.IDLE;\n };\n\n var calculateStyles = function calculateStyles(f) {\n\n // get available width from parent node\n f.availableWidth = f.element.parentNode.clientWidth;\n\n // the space our target element uses\n f.currentWidth = f.element.scrollWidth;\n\n // remember current font size\n f.previousFontSize = f.currentFontSize;\n\n // let's calculate the new font size\n f.currentFontSize = Math.min(Math.max(f.minSize, f.availableWidth / f.currentWidth * f.previousFontSize), f.maxSize);\n\n // if allows wrapping, only wrap when at minimum font size (otherwise would break container)\n f.whiteSpace = f.multiLine && f.currentFontSize === f.minSize ? 'normal' : 'nowrap';\n };\n\n // should always redraw if is not dirty layout, if is dirty layout, only redraw if size has changed\n var shouldRedraw = function shouldRedraw(f) {\n return f.dirty !== DrawState.DIRTY_LAYOUT || f.dirty === DrawState.DIRTY_LAYOUT && f.element.parentNode.clientWidth !== f.availableWidth;\n };\n\n // every fitty element is tested for invalid styles\n var computeStyle = function computeStyle(f) {\n\n // get style properties\n var style = w.getComputedStyle(f.element, null);\n\n // get current font size in pixels (if we already calculated it, use the calculated version)\n f.currentFontSize = parseFloat(style.getPropertyValue('font-size'));\n\n // get display type and wrap mode\n f.display = style.getPropertyValue('display');\n f.whiteSpace = style.getPropertyValue('white-space');\n };\n\n // determines if this fitty requires initial styling, can be prevented by applying correct styles through CSS\n var shouldPreStyle = function shouldPreStyle(f) {\n\n var preStyle = false;\n\n // if we already tested for prestyling we don't have to do it again\n if (f.preStyleTestCompleted) return false;\n\n // should have an inline style, if not, apply\n if (!/inline-/.test(f.display)) {\n preStyle = true;\n f.display = 'inline-block';\n }\n\n // to correctly calculate dimensions the element should have whiteSpace set to nowrap\n if (f.whiteSpace !== 'nowrap') {\n preStyle = true;\n f.whiteSpace = 'nowrap';\n }\n\n // we don't have to do this twice\n f.preStyleTestCompleted = true;\n\n return preStyle;\n };\n\n // apply styles to single fitty\n var applyStyle = function applyStyle(f) {\n f.element.style.whiteSpace = f.whiteSpace;\n f.element.style.display = f.display;\n f.element.style.fontSize = f.currentFontSize + 'px';\n };\n\n // dispatch a fit event on a fitty\n var dispatchFitEvent = function dispatchFitEvent(f) {\n f.element.dispatchEvent(new CustomEvent('fit', {\n detail: {\n oldValue: f.previousFontSize,\n newValue: f.currentFontSize,\n scaleFactor: f.currentFontSize / f.previousFontSize\n }\n }));\n };\n\n // fit method, marks the fitty as dirty and requests a redraw (this will also redraw any other fitty marked as dirty)\n var fit = function fit(f, type) {\n return function () {\n f.dirty = type;\n if (!f.active) return;\n requestRedraw();\n };\n };\n\n var init = function init(f) {\n\n // save some of the original CSS properties before we change them\n f.originalStyle = {\n whiteSpace: f.element.style.whiteSpace,\n display: f.element.style.display,\n fontSize: f.element.style.fontSize\n };\n\n // should we observe DOM mutations\n observeMutations(f);\n\n // this is a new fitty so we need to validate if it's styles are in order\n f.newbie = true;\n\n // because it's a new fitty it should also be dirty, we want it to redraw on the first loop\n f.dirty = true;\n\n // we want to be able to update this fitty\n fitties.push(f);\n };\n\n var destroy = function destroy(f) {\n return function () {\n\n // remove from fitties array\n fitties = fitties.filter(function (_) {\n return _.element !== f.element;\n });\n\n // stop observing DOM\n if (f.observeMutations) f.observer.disconnect();\n\n // reset the CSS properties we changes\n f.element.style.whiteSpace = f.originalStyle.whiteSpace;\n f.element.style.display = f.originalStyle.display;\n f.element.style.fontSize = f.originalStyle.fontSize;\n };\n };\n\n // add a new fitty, does not redraw said fitty\n var subscribe = function subscribe(f) {\n return function () {\n if (f.active) return;\n f.active = true;\n requestRedraw();\n };\n };\n\n // remove an existing fitty\n var unsubscribe = function unsubscribe(f) {\n return function () {\n return f.active = false;\n };\n };\n\n var observeMutations = function observeMutations(f) {\n\n // no observing?\n if (!f.observeMutations) return;\n\n // start observing mutations\n f.observer = new MutationObserver(fit(f, DrawState.DIRTY_CONTENT));\n\n // start observing\n f.observer.observe(f.element, f.observeMutations);\n };\n\n // default mutation observer settings\n var mutationObserverDefaultSetting = {\n subtree: true,\n childList: true,\n characterData: true\n };\n\n // default fitty options\n var defaultOptions = {\n minSize: 16,\n maxSize: 512,\n multiLine: true,\n observeMutations: 'MutationObserver' in w ? mutationObserverDefaultSetting : false\n };\n\n // array of elements in, fitty instances out\n function fittyCreate(elements, options) {\n\n // set options object\n var fittyOptions = _extends({}, defaultOptions, options);\n\n // create fitties\n var publicFitties = elements.map(function (element) {\n\n // create fitty instance\n var f = _extends({}, fittyOptions, {\n\n // internal options for this fitty\n element: element,\n active: true\n });\n\n // initialise this fitty\n init(f);\n\n // expose API\n return {\n element: element,\n fit: fit(f, DrawState.DIRTY),\n unfreeze: subscribe(f),\n freeze: unsubscribe(f),\n unsubscribe: destroy(f)\n };\n });\n\n // call redraw on newly initiated fitties\n requestRedraw();\n\n // expose fitties\n return publicFitties;\n }\n\n // fitty creation function\n function fitty(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n // if target is a string\n return typeof target === 'string' ?\n\n // treat it as a querySelector\n fittyCreate(toArray(document.querySelectorAll(target)), options) :\n\n // create single fitty\n fittyCreate([target], options)[0];\n }\n\n // handles viewport changes, redraws all fitties, but only does so after a timeout\n var resizeDebounce = null;\n var onWindowResized = function onWindowResized() {\n w.clearTimeout(resizeDebounce);\n resizeDebounce = w.setTimeout(redrawAll(DrawState.DIRTY_LAYOUT), fitty.observeWindowDelay);\n };\n\n // define observe window property, so when we set it to true or false events are automatically added and removed\n var events = ['resize', 'orientationchange'];\n Object.defineProperty(fitty, 'observeWindow', {\n set: function set(enabled) {\n var method = (enabled ? 'add' : 'remove') + 'EventListener';\n events.forEach(function (e) {\n w[method](e, onWindowResized);\n });\n }\n });\n\n // fitty global properties (by setting observeWindow to true the events above get added)\n fitty.observeWindow = true;\n fitty.observeWindowDelay = 100;\n\n // public fit all method, will force redraw no matter what\n fitty.fitAll = redrawAll(DrawState.DIRTY);\n\n // export our fitty function, we don't want to keep it to our selves\n return fitty;\n}(typeof window === 'undefined' ? null : window);","import { extend, queryAll, closest, getMimeTypeFromFile } from '../utils/util.js'\nimport { isMobile } from '../utils/device.js'\n\nimport fitty from 'fitty';\n\n/**\n * Handles loading, unloading and playback of slide\n * content such as images, videos and iframes.\n */\nexport default class SlideContent {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.startEmbeddedIframe = this.startEmbeddedIframe.bind( this );\n\n\t}\n\n\t/**\n\t * Should the given element be preloaded?\n\t * Decides based on local element attributes and global config.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tshouldPreload( element ) {\n\n\t\t// Prefer an explicit global preload setting\n\t\tlet preload = this.Reveal.getConfig().preloadIframes;\n\n\t\t// If no global setting is available, fall back on the element's\n\t\t// own preload setting\n\t\tif( typeof preload !== 'boolean' ) {\n\t\t\tpreload = element.hasAttribute( 'data-preload' );\n\t\t}\n\n\t\treturn preload;\n\t}\n\n\t/**\n\t * Called when the given slide is within the configured view\n\t * distance. Shows the slide element and loads any content\n\t * that is set to load lazily (data-src).\n\t *\n\t * @param {HTMLElement} slide Slide to show\n\t */\n\tload( slide, options = {} ) {\n\n\t\t// Show the slide element\n\t\tslide.style.display = this.Reveal.getConfig().display;\n\n\t\t// Media elements with data-src attributes\n\t\tqueryAll( slide, 'img[data-src], video[data-src], audio[data-src], iframe[data-src]' ).forEach( element => {\n\t\t\tif( element.tagName !== 'IFRAME' || this.shouldPreload( element ) ) {\n\t\t\t\telement.setAttribute( 'src', element.getAttribute( 'data-src' ) );\n\t\t\t\telement.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\telement.removeAttribute( 'data-src' );\n\t\t\t}\n\t\t} );\n\n\t\t// Media elements with children\n\t\tqueryAll( slide, 'video, audio' ).forEach( media => {\n\t\t\tlet sources = 0;\n\n\t\t\tqueryAll( media, 'source[data-src]' ).forEach( source => {\n\t\t\t\tsource.setAttribute( 'src', source.getAttribute( 'data-src' ) );\n\t\t\t\tsource.removeAttribute( 'data-src' );\n\t\t\t\tsource.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\tsources += 1;\n\t\t\t} );\n\n\t\t\t// Enable inline video playback in mobile Safari\n\t\t\tif( isMobile && media.tagName === 'VIDEO' ) {\n\t\t\t\tmedia.setAttribute( 'playsinline', '' );\n\t\t\t}\n\n\t\t\t// If we rewrote sources for this video/audio element, we need\n\t\t\t// to manually tell it to load from its new origin\n\t\t\tif( sources > 0 ) {\n\t\t\t\tmedia.load();\n\t\t\t}\n\t\t} );\n\n\n\t\t// Show the corresponding background element\n\t\tlet background = slide.slideBackgroundElement;\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'block';\n\n\t\t\tlet backgroundContent = slide.slideBackgroundContentElement;\n\t\t\tlet backgroundIframe = slide.getAttribute( 'data-background-iframe' );\n\n\t\t\t// If the background contains media, load it\n\t\t\tif( background.hasAttribute( 'data-loaded' ) === false ) {\n\t\t\t\tbackground.setAttribute( 'data-loaded', 'true' );\n\n\t\t\t\tlet backgroundImage = slide.getAttribute( 'data-background-image' ),\n\t\t\t\t\tbackgroundVideo = slide.getAttribute( 'data-background-video' ),\n\t\t\t\t\tbackgroundVideoLoop = slide.hasAttribute( 'data-background-video-loop' ),\n\t\t\t\t\tbackgroundVideoMuted = slide.hasAttribute( 'data-background-video-muted' );\n\n\t\t\t\t// Images\n\t\t\t\tif( backgroundImage ) {\n\t\t\t\t\t// base64\n\t\t\t\t\tif( /^data:/.test( backgroundImage.trim() ) ) {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = `url(${backgroundImage.trim()})`;\n\t\t\t\t\t}\n\t\t\t\t\t// URL(s)\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = backgroundImage.split( ',' ).map( background => {\n\t\t\t\t\t\t\treturn `url(${encodeURI(background.trim())})`;\n\t\t\t\t\t\t}).join( ',' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Videos\n\t\t\t\telse if ( backgroundVideo && !this.Reveal.isSpeakerNotes() ) {\n\t\t\t\t\tlet video = document.createElement( 'video' );\n\n\t\t\t\t\tif( backgroundVideoLoop ) {\n\t\t\t\t\t\tvideo.setAttribute( 'loop', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\tif( backgroundVideoMuted ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Enable inline playback in mobile Safari\n\t\t\t\t\t//\n\t\t\t\t\t// Mute is required for video to play when using\n\t\t\t\t\t// swipe gestures to navigate since they don't\n\t\t\t\t\t// count as direct user actions :'(\n\t\t\t\t\tif( isMobile ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t\tvideo.setAttribute( 'playsinline', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support comma separated lists of video sources\n\t\t\t\t\tbackgroundVideo.split( ',' ).forEach( source => {\n\t\t\t\t\t\tlet type = getMimeTypeFromFile( source );\n\t\t\t\t\t\tif( type ) {\n\t\t\t\t\t\t\tvideo.innerHTML += ``;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvideo.innerHTML += ``;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tbackgroundContent.appendChild( video );\n\t\t\t\t}\n\t\t\t\t// Iframes\n\t\t\t\telse if( backgroundIframe && options.excludeIframes !== true ) {\n\t\t\t\t\tlet iframe = document.createElement( 'iframe' );\n\t\t\t\t\tiframe.setAttribute( 'allowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'mozallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'webkitallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'allow', 'autoplay' );\n\n\t\t\t\t\tiframe.setAttribute( 'data-src', backgroundIframe );\n\n\t\t\t\t\tiframe.style.width = '100%';\n\t\t\t\t\tiframe.style.height = '100%';\n\t\t\t\t\tiframe.style.maxHeight = '100%';\n\t\t\t\t\tiframe.style.maxWidth = '100%';\n\n\t\t\t\t\tbackgroundContent.appendChild( iframe );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start loading preloadable iframes\n\t\t\tlet backgroundIframeElement = backgroundContent.querySelector( 'iframe[data-src]' );\n\t\t\tif( backgroundIframeElement ) {\n\n\t\t\t\t// Check if this iframe is eligible to be preloaded\n\t\t\t\tif( this.shouldPreload( background ) && !/autoplay=(1|true|yes)/gi.test( backgroundIframe ) ) {\n\t\t\t\t\tif( backgroundIframeElement.getAttribute( 'src' ) !== backgroundIframe ) {\n\t\t\t\t\t\tbackgroundIframeElement.setAttribute( 'src', backgroundIframe );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.layout( slide );\n\n\t}\n\n\t/**\n\t * Applies JS-dependent layout helpers for the given slide,\n\t * if there are any.\n\t */\n\tlayout( slide ) {\n\n\t\t// Autosize text with the r-fit-text class based on the\n\t\t// size of its container. This needs to happen after the\n\t\t// slide is visible in order to measure the text.\n\t\tArray.from( slide.querySelectorAll( '.r-fit-text' ) ).forEach( element => {\n\t\t\tfitty( element, {\n\t\t\t\tminSize: 24,\n\t\t\t\tmaxSize: this.Reveal.getConfig().height * 0.8,\n\t\t\t\tobserveMutations: false,\n\t\t\t\tobserveWindow: false\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Unloads and hides the given slide. This is called when the\n\t * slide is moved outside of the configured view distance.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tunload( slide ) {\n\n\t\t// Hide the slide element\n\t\tslide.style.display = 'none';\n\n\t\t// Hide the corresponding background element\n\t\tlet background = this.Reveal.getSlideBackground( slide );\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'none';\n\n\t\t\t// Unload any background iframes\n\t\t\tqueryAll( background, 'iframe[src]' ).forEach( element => {\n\t\t\t\telement.removeAttribute( 'src' );\n\t\t\t} );\n\t\t}\n\n\t\t// Reset lazy-loaded media elements with src attributes\n\t\tqueryAll( slide, 'video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]' ).forEach( element => {\n\t\t\telement.setAttribute( 'data-src', element.getAttribute( 'src' ) );\n\t\t\telement.removeAttribute( 'src' );\n\t\t} );\n\n\t\t// Reset lazy-loaded media elements with children\n\t\tqueryAll( slide, 'video[data-lazy-loaded] source[src], audio source[src]' ).forEach( source => {\n\t\t\tsource.setAttribute( 'data-src', source.getAttribute( 'src' ) );\n\t\t\tsource.removeAttribute( 'src' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Enforces origin-specific format rules for embedded media.\n\t */\n\tformatEmbeddedContent() {\n\n\t\tlet _appendParamToIframeSource = ( sourceAttribute, sourceURL, param ) => {\n\t\t\tqueryAll( this.Reveal.getSlidesElement(), 'iframe['+ sourceAttribute +'*=\"'+ sourceURL +'\"]' ).forEach( el => {\n\t\t\t\tlet src = el.getAttribute( sourceAttribute );\n\t\t\t\tif( src && src.indexOf( param ) === -1 ) {\n\t\t\t\t\tel.setAttribute( sourceAttribute, src + ( !/\\?/.test( src ) ? '?' : '&' ) + param );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\t// YouTube frames must include \"?enablejsapi=1\"\n\t\t_appendParamToIframeSource( 'src', 'youtube.com/embed/', 'enablejsapi=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'youtube.com/embed/', 'enablejsapi=1' );\n\n\t\t// Vimeo frames must include \"?api=1\"\n\t\t_appendParamToIframeSource( 'src', 'player.vimeo.com/', 'api=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'player.vimeo.com/', 'api=1' );\n\n\t}\n\n\t/**\n\t * Start playback of any embedded content inside of\n\t * the given element.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstartEmbeddedContent( element ) {\n\n\t\tif( element && !this.Reveal.isSpeakerNotes() ) {\n\n\t\t\t// Restart GIFs\n\t\t\tqueryAll( element, 'img[src$=\".gif\"]' ).forEach( el => {\n\t\t\t\t// Setting the same unchanged source like this was confirmed\n\t\t\t\t// to work in Chrome, FF & Safari\n\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'src' ) );\n\t\t\t} );\n\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = el.hasAttribute( 'data-autoplay' ) || !!closest( el, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\tif( autoplay && typeof el.play === 'function' ) {\n\n\t\t\t\t\t// If the media is ready, start playback\n\t\t\t\t\tif( el.readyState > 1 ) {\n\t\t\t\t\t\tthis.startEmbeddedMedia( { target: el } );\n\t\t\t\t\t}\n\t\t\t\t\t// Mobile devices never fire a loaded event so instead\n\t\t\t\t\t// of waiting, we initiate playback\n\t\t\t\t\telse if( isMobile ) {\n\t\t\t\t\t\tlet promise = el.play();\n\n\t\t\t\t\t\t// If autoplay does not work, ensure that the controls are visible so\n\t\t\t\t\t\t// that the viewer can start the media on their own\n\t\t\t\t\t\tif( promise && typeof promise.catch === 'function' && el.controls === false ) {\n\t\t\t\t\t\t\tpromise.catch( () => {\n\t\t\t\t\t\t\t\tel.controls = true;\n\n\t\t\t\t\t\t\t\t// Once the video does start playing, hide the controls again\n\t\t\t\t\t\t\t\tel.addEventListener( 'play', () => {\n\t\t\t\t\t\t\t\t\tel.controls = false;\n\t\t\t\t\t\t\t\t} );\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\t// If the media isn't loaded, wait before playing\n\t\t\t\t\telse {\n\t\t\t\t\t\tel.removeEventListener( 'loadeddata', this.startEmbeddedMedia ); // remove first to avoid dupes\n\t\t\t\t\t\tel.addEventListener( 'loadeddata', this.startEmbeddedMedia );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Normal iframes\n\t\t\tqueryAll( element, 'iframe[src]' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.startEmbeddedIframe( { target: el } );\n\t\t\t} );\n\n\t\t\t// Lazy loading iframes\n\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif( el.getAttribute( 'src' ) !== el.getAttribute( 'data-src' ) ) {\n\t\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe ); // remove first to avoid dupes\n\t\t\t\t\tel.addEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'data-src' ) );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Starts playing an embedded video/audio element after\n\t * it has finished loading.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedMedia( event ) {\n\n\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\tif( isAttachedToDOM && isVisible ) {\n\t\t\tevent.target.currentTime = 0;\n\t\t\tevent.target.play();\n\t\t}\n\n\t\tevent.target.removeEventListener( 'loadeddata', this.startEmbeddedMedia );\n\n\t}\n\n\t/**\n\t * \"Starts\" the content of an embedded iframe using the\n\t * postMessage API.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedIframe( event ) {\n\n\t\tlet iframe = event.target;\n\n\t\tif( iframe && iframe.contentWindow ) {\n\n\t\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\t\tif( isAttachedToDOM && isVisible ) {\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = iframe.hasAttribute( 'data-autoplay' ) || !!closest( iframe, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\t// YouTube postMessage API\n\t\t\t\tif( /youtube\\.com\\/embed\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Vimeo postMessage API\n\t\t\t\telse if( /player\\.vimeo\\.com\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"method\":\"play\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Generic postMessage API\n\t\t\t\telse {\n\t\t\t\t\tiframe.contentWindow.postMessage( 'slide:start', '*' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Stop playback of any embedded content inside of\n\t * the targeted slide.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstopEmbeddedContent( element, options = {} ) {\n\n\t\toptions = extend( {\n\t\t\t// Defaults\n\t\t\tunloadIframes: true\n\t\t}, options );\n\n\t\tif( element && element.parentNode ) {\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && typeof el.pause === 'function' ) {\n\t\t\t\t\tel.setAttribute('data-paused-by-reveal', '');\n\t\t\t\t\tel.pause();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Generic postMessage API for non-lazy loaded iframes\n\t\t\tqueryAll( element, 'iframe' ).forEach( el => {\n\t\t\t\tif( el.contentWindow ) el.contentWindow.postMessage( 'slide:stop', '*' );\n\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t});\n\n\t\t\t// YouTube postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"youtube.com/embed/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Vimeo postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"player.vimeo.com/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"method\":\"pause\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif( options.unloadIframes === true ) {\n\t\t\t\t// Unload lazy-loaded iframes\n\t\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\t\t// Only removing the src doesn't actually unload the frame\n\t\t\t\t\t// in all browsers (Firefox) so we set it to blank first\n\t\t\t\t\tel.setAttribute( 'src', 'about:blank' );\n\t\t\t\t\tel.removeAttribute( 'src' );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t}\n\n}\n","/**\n * Handles the display of reveal.js' optional slide number.\n */\nexport default class SlideNumber {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'slide-number';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tlet slideNumberDisplay = 'none';\n\t\tif( config.slideNumber && !this.Reveal.isPrintingPDF() ) {\n\t\t\tif( config.showSlideNumber === 'all' ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t\telse if( config.showSlideNumber === 'speaker' && this.Reveal.isSpeakerNotes() ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t}\n\n\t\tthis.element.style.display = slideNumberDisplay;\n\n\t}\n\n\t/**\n\t * Updates the slide number to match the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update slide number if enabled\n\t\tif( this.Reveal.getConfig().slideNumber && this.element ) {\n\t\t\tthis.element.innerHTML = this.getSlideNumber();\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the HTML string corresponding to the current slide\n\t * number, including formatting.\n\t */\n\tgetSlideNumber( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet value;\n\t\tlet format = 'h.v';\n\n\t\tif ( typeof config.slideNumber === 'function' ) {\n\t\t\tvalue = config.slideNumber( slide );\n\t\t} else {\n\t\t\t// Check if a custom number format is available\n\t\t\tif( typeof config.slideNumber === 'string' ) {\n\t\t\t\tformat = config.slideNumber;\n\t\t\t}\n\n\t\t\t// If there are ONLY vertical slides in this deck, always use\n\t\t\t// a flattened slide number\n\t\t\tif( !/c/.test( format ) && this.Reveal.getHorizontalSlides().length === 1 ) {\n\t\t\t\tformat = 'c';\n\t\t\t}\n\n\t\t\t// Offset the current slide number by 1 to make it 1-indexed\n\t\t\tlet horizontalOffset = slide && slide.dataset.visibility === 'uncounted' ? 0 : 1;\n\n\t\t\tvalue = [];\n\t\t\tswitch( format ) {\n\t\t\t\tcase 'c':\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'c/t':\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset, '/', this.Reveal.getTotalSlides() );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet indices = this.Reveal.getIndices( slide );\n\t\t\t\t\tvalue.push( indices.h + horizontalOffset );\n\t\t\t\t\tlet sep = format === 'h/v' ? '/' : '.';\n\t\t\t\t\tif( this.Reveal.isVerticalSlide( slide ) ) value.push( sep, indices.v + 1 );\n\t\t\t}\n\t\t}\n\n\t\tlet url = '#' + this.Reveal.location.getHash( slide );\n\t\treturn this.formatNumber( value[0], value[1], value[2], url );\n\n\t}\n\n\t/**\n\t * Applies HTML formatting to a slide number before it's\n\t * written to the DOM.\n\t *\n\t * @param {number} a Current slide\n\t * @param {string} delimiter Character to separate slide numbers\n\t * @param {(number|*)} b Total slides\n\t * @param {HTMLElement} [url='#'+locationHash()] The url to link to\n\t * @return {string} HTML string fragment\n\t */\n\tformatNumber( a, delimiter, b, url = '#' + this.Reveal.location.getHash() ) {\n\n\t\tif( typeof b === 'number' && !isNaN( b ) ) {\n\t\t\treturn `\n\t\t\t\t\t${a}\n\t\t\t\t\t${delimiter}\n\t\t\t\t\t${b}\n\t\t\t\t\t`;\n\t\t}\n\t\telse {\n\t\t\treturn `\n\t\t\t\t\t${a}\n\t\t\t\t\t`;\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","/**\n * Converts various color input formats to an {r:0,g:0,b:0} object.\n *\n * @param {string} color The string representation of a color\n * @example\n * colorToRgb('#000');\n * @example\n * colorToRgb('#000000');\n * @example\n * colorToRgb('rgb(0,0,0)');\n * @example\n * colorToRgb('rgba(0,0,0)');\n *\n * @return {{r: number, g: number, b: number, [a]: number}|null}\n */\nexport const colorToRgb = ( color ) => {\n\n\tlet hex3 = color.match( /^#([0-9a-f]{3})$/i );\n\tif( hex3 && hex3[1] ) {\n\t\thex3 = hex3[1];\n\t\treturn {\n\t\t\tr: parseInt( hex3.charAt( 0 ), 16 ) * 0x11,\n\t\t\tg: parseInt( hex3.charAt( 1 ), 16 ) * 0x11,\n\t\t\tb: parseInt( hex3.charAt( 2 ), 16 ) * 0x11\n\t\t};\n\t}\n\n\tlet hex6 = color.match( /^#([0-9a-f]{6})$/i );\n\tif( hex6 && hex6[1] ) {\n\t\thex6 = hex6[1];\n\t\treturn {\n\t\t\tr: parseInt( hex6.slice( 0, 2 ), 16 ),\n\t\t\tg: parseInt( hex6.slice( 2, 4 ), 16 ),\n\t\t\tb: parseInt( hex6.slice( 4, 6 ), 16 )\n\t\t};\n\t}\n\n\tlet rgb = color.match( /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i );\n\tif( rgb ) {\n\t\treturn {\n\t\t\tr: parseInt( rgb[1], 10 ),\n\t\t\tg: parseInt( rgb[2], 10 ),\n\t\t\tb: parseInt( rgb[3], 10 )\n\t\t};\n\t}\n\n\tlet rgba = color.match( /^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\,\\s*([\\d]+|[\\d]*.[\\d]+)\\s*\\)$/i );\n\tif( rgba ) {\n\t\treturn {\n\t\t\tr: parseInt( rgba[1], 10 ),\n\t\t\tg: parseInt( rgba[2], 10 ),\n\t\t\tb: parseInt( rgba[3], 10 ),\n\t\t\ta: parseFloat( rgba[4] )\n\t\t};\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Calculates brightness on a scale of 0-255.\n *\n * @param {string} color See colorToRgb for supported formats.\n * @see {@link colorToRgb}\n */\nexport const colorBrightness = ( color ) => {\n\n\tif( typeof color === 'string' ) color = colorToRgb( color );\n\n\tif( color ) {\n\t\treturn ( color.r * 299 + color.g * 587 + color.b * 114 ) / 1000;\n\t}\n\n\treturn null;\n\n}","import { queryAll } from '../utils/util.js'\nimport { colorToRgb, colorBrightness } from '../utils/color.js'\n\n/**\n * Creates and updates slide backgrounds.\n */\nexport default class Backgrounds {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'backgrounds';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Creates the slide background elements and appends them\n\t * to the background container. One element is created per\n\t * slide no matter if the given slide has visible background.\n\t */\n\tcreate() {\n\n\t\t// Clear prior backgrounds\n\t\tthis.element.innerHTML = '';\n\t\tthis.element.classList.add( 'no-transition' );\n\n\t\t// Iterate over all horizontal slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( slideh => {\n\n\t\t\tlet backgroundStack = this.createBackground( slideh, this.element );\n\n\t\t\t// Iterate over all vertical slides\n\t\t\tqueryAll( slideh, 'section' ).forEach( slidev => {\n\n\t\t\t\tthis.createBackground( slidev, backgroundStack );\n\n\t\t\t\tbackgroundStack.classList.add( 'stack' );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\t// Add parallax background if specified\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tthis.element.style.backgroundImage = 'url(\"' + this.Reveal.getConfig().parallaxBackgroundImage + '\")';\n\t\t\tthis.element.style.backgroundSize = this.Reveal.getConfig().parallaxBackgroundSize;\n\t\t\tthis.element.style.backgroundRepeat = this.Reveal.getConfig().parallaxBackgroundRepeat;\n\t\t\tthis.element.style.backgroundPosition = this.Reveal.getConfig().parallaxBackgroundPosition;\n\n\t\t\t// Make sure the below properties are set on the element - these properties are\n\t\t\t// needed for proper transitions to be set on the element via CSS. To remove\n\t\t\t// annoying background slide-in effect when the presentation starts, apply\n\t\t\t// these properties after short time delay\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.add( 'has-parallax-background' );\n\t\t\t}, 1 );\n\n\t\t}\n\t\telse {\n\n\t\t\tthis.element.style.backgroundImage = '';\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'has-parallax-background' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a background for the given slide.\n\t *\n\t * @param {HTMLElement} slide\n\t * @param {HTMLElement} container The element that the background\n\t * should be appended to\n\t * @return {HTMLElement} New background div\n\t */\n\tcreateBackground( slide, container ) {\n\n\t\t// Main slide background element\n\t\tlet element = document.createElement( 'div' );\n\t\telement.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' );\n\n\t\t// Inner background element that wraps images/videos/iframes\n\t\tlet contentElement = document.createElement( 'div' );\n\t\tcontentElement.className = 'slide-background-content';\n\n\t\telement.appendChild( contentElement );\n\t\tcontainer.appendChild( element );\n\n\t\tslide.slideBackgroundElement = element;\n\t\tslide.slideBackgroundContentElement = contentElement;\n\n\t\t// Syncs the background to reflect all current background settings\n\t\tthis.sync( slide );\n\n\t\treturn element;\n\n\t}\n\n\t/**\n\t * Renders all of the visual properties of a slide background\n\t * based on the various background attributes.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tsync( slide ) {\n\n\t\tconst element = slide.slideBackgroundElement,\n\t\t\tcontentElement = slide.slideBackgroundContentElement;\n\n\t\tconst data = {\n\t\t\tbackground: slide.getAttribute( 'data-background' ),\n\t\t\tbackgroundSize: slide.getAttribute( 'data-background-size' ),\n\t\t\tbackgroundImage: slide.getAttribute( 'data-background-image' ),\n\t\t\tbackgroundVideo: slide.getAttribute( 'data-background-video' ),\n\t\t\tbackgroundIframe: slide.getAttribute( 'data-background-iframe' ),\n\t\t\tbackgroundColor: slide.getAttribute( 'data-background-color' ),\n\t\t\tbackgroundRepeat: slide.getAttribute( 'data-background-repeat' ),\n\t\t\tbackgroundPosition: slide.getAttribute( 'data-background-position' ),\n\t\t\tbackgroundTransition: slide.getAttribute( 'data-background-transition' ),\n\t\t\tbackgroundOpacity: slide.getAttribute( 'data-background-opacity' ),\n\t\t};\n\n\t\tconst dataPreload = slide.hasAttribute( 'data-preload' );\n\n\t\t// Reset the prior background state in case this is not the\n\t\t// initial sync\n\t\tslide.classList.remove( 'has-dark-background' );\n\t\tslide.classList.remove( 'has-light-background' );\n\n\t\telement.removeAttribute( 'data-loaded' );\n\t\telement.removeAttribute( 'data-background-hash' );\n\t\telement.removeAttribute( 'data-background-size' );\n\t\telement.removeAttribute( 'data-background-transition' );\n\t\telement.style.backgroundColor = '';\n\n\t\tcontentElement.style.backgroundSize = '';\n\t\tcontentElement.style.backgroundRepeat = '';\n\t\tcontentElement.style.backgroundPosition = '';\n\t\tcontentElement.style.backgroundImage = '';\n\t\tcontentElement.style.opacity = '';\n\t\tcontentElement.innerHTML = '';\n\n\t\tif( data.background ) {\n\t\t\t// Auto-wrap image urls in url(...)\n\t\t\tif( /^(http|file|\\/\\/)/gi.test( data.background ) || /\\.(svg|png|jpg|jpeg|gif|bmp)([?#\\s]|$)/gi.test( data.background ) ) {\n\t\t\t\tslide.setAttribute( 'data-background-image', data.background );\n\t\t\t}\n\t\t\telse {\n\t\t\t\telement.style.background = data.background;\n\t\t\t}\n\t\t}\n\n\t\t// Create a hash for this combination of background settings.\n\t\t// This is used to determine when two slide backgrounds are\n\t\t// the same.\n\t\tif( data.background || data.backgroundColor || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) {\n\t\t\telement.setAttribute( 'data-background-hash', data.background +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundSize +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundImage +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundVideo +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundIframe +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundColor +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundRepeat +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundPosition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundTransition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundOpacity );\n\t\t}\n\n\t\t// Additional and optional background properties\n\t\tif( data.backgroundSize ) element.setAttribute( 'data-background-size', data.backgroundSize );\n\t\tif( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;\n\t\tif( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition );\n\n\t\tif( dataPreload ) element.setAttribute( 'data-preload', '' );\n\n\t\t// Background image options are set on the content wrapper\n\t\tif( data.backgroundSize ) contentElement.style.backgroundSize = data.backgroundSize;\n\t\tif( data.backgroundRepeat ) contentElement.style.backgroundRepeat = data.backgroundRepeat;\n\t\tif( data.backgroundPosition ) contentElement.style.backgroundPosition = data.backgroundPosition;\n\t\tif( data.backgroundOpacity ) contentElement.style.opacity = data.backgroundOpacity;\n\n\t\t// If this slide has a background color, we add a class that\n\t\t// signals if it is light or dark. If the slide has no background\n\t\t// color, no class will be added\n\t\tlet contrastColor = data.backgroundColor;\n\n\t\t// If no bg color was found, or it cannot be converted by colorToRgb, check the computed background\n\t\tif( !contrastColor || !colorToRgb( contrastColor ) ) {\n\t\t\tlet computedBackgroundStyle = window.getComputedStyle( element );\n\t\t\tif( computedBackgroundStyle && computedBackgroundStyle.backgroundColor ) {\n\t\t\t\tcontrastColor = computedBackgroundStyle.backgroundColor;\n\t\t\t}\n\t\t}\n\n\t\tif( contrastColor ) {\n\t\t\tconst rgb = colorToRgb( contrastColor );\n\n\t\t\t// Ignore fully transparent backgrounds. Some browsers return\n\t\t\t// rgba(0,0,0,0) when reading the computed background color of\n\t\t\t// an element with no background\n\t\t\tif( rgb && rgb.a !== 0 ) {\n\t\t\t\tif( colorBrightness( contrastColor ) < 128 ) {\n\t\t\t\t\tslide.classList.add( 'has-dark-background' );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tslide.classList.add( 'has-light-background' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the background elements to reflect the current\n\t * slide.\n\t *\n\t * @param {boolean} includeAll If true, the backgrounds of\n\t * all vertical slides (not just the present) will be updated.\n\t */\n\tupdate( includeAll = false ) {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tlet currentBackground = null;\n\n\t\t// Reverse past/future classes when in RTL mode\n\t\tlet horizontalPast = this.Reveal.getConfig().rtl ? 'future' : 'past',\n\t\t\thorizontalFuture = this.Reveal.getConfig().rtl ? 'past' : 'future';\n\n\t\t// Update the classes of all backgrounds to match the\n\t\t// states of their slides (past/present/future)\n\t\tArray.from( this.element.childNodes ).forEach( ( backgroundh, h ) => {\n\n\t\t\tbackgroundh.classList.remove( 'past', 'present', 'future' );\n\n\t\t\tif( h < indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalPast );\n\t\t\t}\n\t\t\telse if ( h > indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalFuture );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundh.classList.add( 'present' );\n\n\t\t\t\t// Store a reference to the current background element\n\t\t\t\tcurrentBackground = backgroundh;\n\t\t\t}\n\n\t\t\tif( includeAll || h === indices.h ) {\n\t\t\t\tqueryAll( backgroundh, '.slide-background' ).forEach( ( backgroundv, v ) => {\n\n\t\t\t\t\tbackgroundv.classList.remove( 'past', 'present', 'future' );\n\n\t\t\t\t\tif( v < indices.v ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'past' );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( v > indices.v ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'future' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundv.classList.add( 'present' );\n\n\t\t\t\t\t\t// Only if this is the present horizontal and vertical slide\n\t\t\t\t\t\tif( h === indices.h ) currentBackground = backgroundv;\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\n\t\t} );\n\n\t\t// Stop content inside of previous backgrounds\n\t\tif( this.previousBackground ) {\n\n\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( this.previousBackground, { unloadIframes: !this.Reveal.slideContent.shouldPreload( this.previousBackground ) } );\n\n\t\t}\n\n\t\t// Start content in the current background\n\t\tif( currentBackground ) {\n\n\t\t\tthis.Reveal.slideContent.startEmbeddedContent( currentBackground );\n\n\t\t\tlet currentBackgroundContent = currentBackground.querySelector( '.slide-background-content' );\n\t\t\tif( currentBackgroundContent ) {\n\n\t\t\t\tlet backgroundImageURL = currentBackgroundContent.style.backgroundImage || '';\n\n\t\t\t\t// Restart GIFs (doesn't work in Firefox)\n\t\t\t\tif( /\\.gif/i.test( backgroundImageURL ) ) {\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = '';\n\t\t\t\t\twindow.getComputedStyle( currentBackgroundContent ).opacity;\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = backgroundImageURL;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Don't transition between identical backgrounds. This\n\t\t\t// prevents unwanted flicker.\n\t\t\tlet previousBackgroundHash = this.previousBackground ? this.previousBackground.getAttribute( 'data-background-hash' ) : null;\n\t\t\tlet currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' );\n\t\t\tif( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== this.previousBackground ) {\n\t\t\t\tthis.element.classList.add( 'no-transition' );\n\t\t\t}\n\n\t\t\tthis.previousBackground = currentBackground;\n\n\t\t}\n\n\t\t// If there's a background brightness flag for this slide,\n\t\t// bubble it to the .reveal container\n\t\tif( currentSlide ) {\n\t\t\t[ 'has-light-background', 'has-dark-background' ].forEach( classToBubble => {\n\t\t\t\tif( currentSlide.classList.contains( classToBubble ) ) {\n\t\t\t\t\tthis.Reveal.getRevealElement().classList.add( classToBubble );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.getRevealElement().classList.remove( classToBubble );\n\t\t\t\t}\n\t\t\t}, this );\n\t\t}\n\n\t\t// Allow the first background to apply without transition\n\t\tsetTimeout( () => {\n\t\t\tthis.element.classList.remove( 'no-transition' );\n\t\t}, 1 );\n\n\t}\n\n\t/**\n\t * Updates the position of the parallax background based\n\t * on the current slide index.\n\t */\n\tupdateParallax() {\n\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tlet horizontalSlides = this.Reveal.getHorizontalSlides(),\n\t\t\t\tverticalSlides = this.Reveal.getVerticalSlides();\n\n\t\t\tlet backgroundSize = this.element.style.backgroundSize.split( ' ' ),\n\t\t\t\tbackgroundWidth, backgroundHeight;\n\n\t\t\tif( backgroundSize.length === 1 ) {\n\t\t\t\tbackgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundWidth = parseInt( backgroundSize[0], 10 );\n\t\t\t\tbackgroundHeight = parseInt( backgroundSize[1], 10 );\n\t\t\t}\n\n\t\t\tlet slideWidth = this.element.offsetWidth,\n\t\t\t\thorizontalSlideCount = horizontalSlides.length,\n\t\t\t\thorizontalOffsetMultiplier,\n\t\t\t\thorizontalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundHorizontal === 'number' ) {\n\t\t\t\thorizontalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundHorizontal;\n\t\t\t}\n\t\t\telse {\n\t\t\t\thorizontalOffsetMultiplier = horizontalSlideCount > 1 ? ( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) : 0;\n\t\t\t}\n\n\t\t\thorizontalOffset = horizontalOffsetMultiplier * indices.h * -1;\n\n\t\t\tlet slideHeight = this.element.offsetHeight,\n\t\t\t\tverticalSlideCount = verticalSlides.length,\n\t\t\t\tverticalOffsetMultiplier,\n\t\t\t\tverticalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundVertical === 'number' ) {\n\t\t\t\tverticalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundVertical;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tverticalOffsetMultiplier = ( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 );\n\t\t\t}\n\n\t\t\tverticalOffset = verticalSlideCount > 0 ? verticalOffsetMultiplier * indices.v : 0;\n\n\t\t\tthis.element.style.backgroundPosition = horizontalOffset + 'px ' + -verticalOffset + 'px';\n\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}\n","\nexport const SLIDES_SELECTOR = '.slides section';\nexport const HORIZONTAL_SLIDES_SELECTOR = '.slides>section';\nexport const VERTICAL_SLIDES_SELECTOR = '.slides>section.present>section';\n\n// Methods that may not be invoked via the postMessage API\nexport const POST_MESSAGE_METHOD_BLACKLIST = /registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener/;\n\n// Regex for retrieving the fragment style from a class attribute\nexport const FRAGMENT_STYLE_REGEX = /fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/;","import { queryAll, extend, createStyleSheet, matches, closest } from '../utils/util.js'\nimport { FRAGMENT_STYLE_REGEX } from '../utils/constants.js'\n\n// Counter used to generate unique IDs for auto-animated elements\nlet autoAnimateCounter = 0;\n\n/**\n * Automatically animates matching elements across\n * slides with the [data-auto-animate] attribute.\n */\nexport default class AutoAnimate {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Runs an auto-animation between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t */\n\trun( fromSlide, toSlide ) {\n\n\t\t// Clean up after prior animations\n\t\tthis.reset();\n\n\t\tlet allSlides = this.Reveal.getSlides();\n\t\tlet toSlideIndex = allSlides.indexOf( toSlide );\n\t\tlet fromSlideIndex = allSlides.indexOf( fromSlide );\n\n\t\t// Ensure that both slides are auto-animate targets with the same data-auto-animate-id value\n\t\t// (including null if absent on both) and that data-auto-animate-restart isn't set on the\n\t\t// physically latter slide (independent of slide direction)\n\t\tif( fromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' )\n\t\t\t\t&& fromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) \n\t\t\t\t&& !( toSlideIndex > fromSlideIndex ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' ) ) {\n\n\t\t\t// Create a new auto-animate sheet\n\t\t\tthis.autoAnimateStyleSheet = this.autoAnimateStyleSheet || createStyleSheet();\n\n\t\t\tlet animationOptions = this.getAutoAnimateOptions( toSlide );\n\n\t\t\t// Set our starting state\n\t\t\tfromSlide.dataset.autoAnimate = 'pending';\n\t\t\ttoSlide.dataset.autoAnimate = 'pending';\n\n\t\t\t// Flag the navigation direction, needed for fragment buildup\n\t\t\tanimationOptions.slideDirection = toSlideIndex > fromSlideIndex ? 'forward' : 'backward';\n\n\t\t\t// Inject our auto-animate styles for this transition\n\t\t\tlet css = this.getAutoAnimatableElements( fromSlide, toSlide ).map( elements => {\n\t\t\t\treturn this.autoAnimateElements( elements.from, elements.to, elements.options || {}, animationOptions, autoAnimateCounter++ );\n\t\t\t} );\n\n\t\t\t// Animate unmatched elements, if enabled\n\t\t\tif( toSlide.dataset.autoAnimateUnmatched !== 'false' && this.Reveal.getConfig().autoAnimateUnmatched === true ) {\n\n\t\t\t\t// Our default timings for unmatched elements\n\t\t\t\tlet defaultUnmatchedDuration = animationOptions.duration * 0.8,\n\t\t\t\t\tdefaultUnmatchedDelay = animationOptions.duration * 0.2;\n\n\t\t\t\tthis.getUnmatchedAutoAnimateElements( toSlide ).forEach( unmatchedElement => {\n\n\t\t\t\t\tlet unmatchedOptions = this.getAutoAnimateOptions( unmatchedElement, animationOptions );\n\t\t\t\t\tlet id = 'unmatched';\n\n\t\t\t\t\t// If there is a duration or delay set specifically for this\n\t\t\t\t\t// element our unmatched elements should adhere to those\n\t\t\t\t\tif( unmatchedOptions.duration !== animationOptions.duration || unmatchedOptions.delay !== animationOptions.delay ) {\n\t\t\t\t\t\tid = 'unmatched-' + autoAnimateCounter++;\n\t\t\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"${id}\"] { transition: opacity ${unmatchedOptions.duration}s ease ${unmatchedOptions.delay}s; }` );\n\t\t\t\t\t}\n\n\t\t\t\t\tunmatchedElement.dataset.autoAnimateTarget = id;\n\n\t\t\t\t}, this );\n\n\t\t\t\t// Our default transition for unmatched elements\n\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"unmatched\"] { transition: opacity ${defaultUnmatchedDuration}s ease ${defaultUnmatchedDelay}s; }` );\n\n\t\t\t}\n\n\t\t\t// Setting the whole chunk of CSS at once is the most\n\t\t\t// efficient way to do this. Using sheet.insertRule\n\t\t\t// is multiple factors slower.\n\t\t\tthis.autoAnimateStyleSheet.innerHTML = css.join( '' );\n\n\t\t\t// Start the animation next cycle\n\t\t\trequestAnimationFrame( () => {\n\t\t\t\tif( this.autoAnimateStyleSheet ) {\n\t\t\t\t\t// This forces our newly injected styles to be applied in Firefox\n\t\t\t\t\tgetComputedStyle( this.autoAnimateStyleSheet ).fontWeight;\n\n\t\t\t\t\ttoSlide.dataset.autoAnimate = 'running';\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'autoanimate',\n\t\t\t\tdata: {\n\t\t\t\t\tfromSlide,\n\t\t\t\t\ttoSlide,\n\t\t\t\t\tsheet: this.autoAnimateStyleSheet\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Rolls back all changes that we've made to the DOM so\n\t * that as part of animating.\n\t */\n\treset() {\n\n\t\t// Reset slides\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate]:not([data-auto-animate=\"\"])' ).forEach( element => {\n\t\t\telement.dataset.autoAnimate = '';\n\t\t} );\n\n\t\t// Reset elements\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate-target]' ).forEach( element => {\n\t\t\tdelete element.dataset.autoAnimateTarget;\n\t\t} );\n\n\t\t// Remove the animation sheet\n\t\tif( this.autoAnimateStyleSheet && this.autoAnimateStyleSheet.parentNode ) {\n\t\t\tthis.autoAnimateStyleSheet.parentNode.removeChild( this.autoAnimateStyleSheet );\n\t\t\tthis.autoAnimateStyleSheet = null;\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a FLIP animation where the `to` element starts out\n\t * in the `from` element position and animates to its original\n\t * state.\n\t *\n\t * @param {HTMLElement} from\n\t * @param {HTMLElement} to\n\t * @param {Object} elementOptions Options for this element pair\n\t * @param {Object} animationOptions Options set at the slide level\n\t * @param {String} id Unique ID that we can use to identify this\n\t * auto-animate element in the DOM\n\t */\n\tautoAnimateElements( from, to, elementOptions, animationOptions, id ) {\n\n\t\t// 'from' elements are given a data-auto-animate-target with no value,\n\t\t// 'to' elements are are given a data-auto-animate-target with an ID\n\t\tfrom.dataset.autoAnimateTarget = '';\n\t\tto.dataset.autoAnimateTarget = id;\n\n\t\t// Each element may override any of the auto-animate options\n\t\t// like transition easing, duration and delay via data-attributes\n\t\tlet options = this.getAutoAnimateOptions( to, animationOptions );\n\n\t\t// If we're using a custom element matcher the element options\n\t\t// may contain additional transition overrides\n\t\tif( typeof elementOptions.delay !== 'undefined' ) options.delay = elementOptions.delay;\n\t\tif( typeof elementOptions.duration !== 'undefined' ) options.duration = elementOptions.duration;\n\t\tif( typeof elementOptions.easing !== 'undefined' ) options.easing = elementOptions.easing;\n\n\t\tlet fromProps = this.getAutoAnimatableProperties( 'from', from, elementOptions ),\n\t\t\ttoProps = this.getAutoAnimatableProperties( 'to', to, elementOptions );\n\n\t\t// Maintain fragment visibility for matching elements when\n\t\t// we're navigating forwards, this way the viewer won't need\n\t\t// to step through the same fragments twice\n\t\tif( to.classList.contains( 'fragment' ) ) {\n\n\t\t\t// Don't auto-animate the opacity of fragments to avoid\n\t\t\t// conflicts with fragment animations\n\t\t\tdelete toProps.styles['opacity'];\n\n\t\t\tif( from.classList.contains( 'fragment' ) ) {\n\n\t\t\t\tlet fromFragmentStyle = ( from.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];\n\t\t\t\tlet toFragmentStyle = ( to.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];\n\n\t\t\t\t// Only skip the fragment if the fragment animation style\n\t\t\t\t// remains unchanged\n\t\t\t\tif( fromFragmentStyle === toFragmentStyle && animationOptions.slideDirection === 'forward' ) {\n\t\t\t\t\tto.classList.add( 'visible', 'disabled' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If translation and/or scaling are enabled, css transform\n\t\t// the 'to' element so that it matches the position and size\n\t\t// of the 'from' element\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\n\t\t\tlet presentationScale = this.Reveal.getScale();\n\n\t\t\tlet delta = {\n\t\t\t\tx: ( fromProps.x - toProps.x ) / presentationScale,\n\t\t\t\ty: ( fromProps.y - toProps.y ) / presentationScale,\n\t\t\t\tscaleX: fromProps.width / toProps.width,\n\t\t\t\tscaleY: fromProps.height / toProps.height\n\t\t\t};\n\n\t\t\t// Limit decimal points to avoid 0.0001px blur and stutter\n\t\t\tdelta.x = Math.round( delta.x * 1000 ) / 1000;\n\t\t\tdelta.y = Math.round( delta.y * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\n\t\t\tlet translate = elementOptions.translate !== false && ( delta.x !== 0 || delta.y !== 0 ),\n\t\t\t\tscale = elementOptions.scale !== false && ( delta.scaleX !== 0 || delta.scaleY !== 0 );\n\n\t\t\t// No need to transform if nothing's changed\n\t\t\tif( translate || scale ) {\n\n\t\t\t\tlet transform = [];\n\n\t\t\t\tif( translate ) transform.push( `translate(${delta.x}px, ${delta.y}px)` );\n\t\t\t\tif( scale ) transform.push( `scale(${delta.scaleX}, ${delta.scaleY})` );\n\n\t\t\t\tfromProps.styles['transform'] = transform.join( ' ' );\n\t\t\t\tfromProps.styles['transform-origin'] = 'top left';\n\n\t\t\t\ttoProps.styles['transform'] = 'none';\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Delete all unchanged 'to' styles\n\t\tfor( let propertyName in toProps.styles ) {\n\t\t\tconst toValue = toProps.styles[propertyName];\n\t\t\tconst fromValue = fromProps.styles[propertyName];\n\n\t\t\tif( toValue === fromValue ) {\n\t\t\t\tdelete toProps.styles[propertyName];\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// If these property values were set via a custom matcher providing\n\t\t\t\t// an explicit 'from' and/or 'to' value, we always inject those values.\n\t\t\t\tif( toValue.explicitValue === true ) {\n\t\t\t\t\ttoProps.styles[propertyName] = toValue.value;\n\t\t\t\t}\n\n\t\t\t\tif( fromValue.explicitValue === true ) {\n\t\t\t\t\tfromProps.styles[propertyName] = fromValue.value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet css = '';\n\n\t\tlet toStyleProperties = Object.keys( toProps.styles );\n\n\t\t// Only create animate this element IF at least one style\n\t\t// property has changed\n\t\tif( toStyleProperties.length > 0 ) {\n\n\t\t\t// Instantly move to the 'from' state\n\t\t\tfromProps.styles['transition'] = 'none';\n\n\t\t\t// Animate towards the 'to' state\n\t\t\ttoProps.styles['transition'] = `all ${options.duration}s ${options.easing} ${options.delay}s`;\n\t\t\ttoProps.styles['transition-property'] = toStyleProperties.join( ', ' );\n\t\t\ttoProps.styles['will-change'] = toStyleProperties.join( ', ' );\n\n\t\t\t// Build up our custom CSS. We need to override inline styles\n\t\t\t// so we need to make our styles vErY IMPORTANT!1!!\n\t\t\tlet fromCSS = Object.keys( fromProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + fromProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tlet toCSS = Object.keys( toProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + toProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tcss = \t'[data-auto-animate-target=\"'+ id +'\"] {'+ fromCSS +'}' +\n\t\t\t\t\t'[data-auto-animate=\"running\"] [data-auto-animate-target=\"'+ id +'\"] {'+ toCSS +'}';\n\n\t\t}\n\n\t\treturn css;\n\n\t}\n\n\t/**\n\t * Returns the auto-animate options for the given element.\n\t *\n\t * @param {HTMLElement} element Element to pick up options\n\t * from, either a slide or an animation target\n\t * @param {Object} [inheritedOptions] Optional set of existing\n\t * options\n\t */\n\tgetAutoAnimateOptions( element, inheritedOptions ) {\n\n\t\tlet options = {\n\t\t\teasing: this.Reveal.getConfig().autoAnimateEasing,\n\t\t\tduration: this.Reveal.getConfig().autoAnimateDuration,\n\t\t\tdelay: 0\n\t\t};\n\n\t\toptions = extend( options, inheritedOptions );\n\n\t\t// Inherit options from parent elements\n\t\tif( element.parentNode ) {\n\t\t\tlet autoAnimatedParent = closest( element.parentNode, '[data-auto-animate-target]' );\n\t\t\tif( autoAnimatedParent ) {\n\t\t\t\toptions = this.getAutoAnimateOptions( autoAnimatedParent, options );\n\t\t\t}\n\t\t}\n\n\t\tif( element.dataset.autoAnimateEasing ) {\n\t\t\toptions.easing = element.dataset.autoAnimateEasing;\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDuration ) {\n\t\t\toptions.duration = parseFloat( element.dataset.autoAnimateDuration );\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDelay ) {\n\t\t\toptions.delay = parseFloat( element.dataset.autoAnimateDelay );\n\t\t}\n\n\t\treturn options;\n\n\t}\n\n\t/**\n\t * Returns an object containing all of the properties\n\t * that can be auto-animated for the given element and\n\t * their current computed values.\n\t *\n\t * @param {String} direction 'from' or 'to'\n\t */\n\tgetAutoAnimatableProperties( direction, element, elementOptions ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\tlet properties = { styles: [] };\n\n\t\t// Position and size\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\t\t\tlet bounds;\n\n\t\t\t// Custom auto-animate may optionally return a custom tailored\n\t\t\t// measurement function\n\t\t\tif( typeof elementOptions.measure === 'function' ) {\n\t\t\t\tbounds = elementOptions.measure( element );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( config.center ) {\n\t\t\t\t\t// More precise, but breaks when used in combination\n\t\t\t\t\t// with zoom for scaling the deck ¯\\_(ツ)_/¯\n\t\t\t\t\tbounds = element.getBoundingClientRect();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet scale = this.Reveal.getScale();\n\t\t\t\t\tbounds = {\n\t\t\t\t\t\tx: element.offsetLeft * scale,\n\t\t\t\t\t\ty: element.offsetTop * scale,\n\t\t\t\t\t\twidth: element.offsetWidth * scale,\n\t\t\t\t\t\theight: element.offsetHeight * scale\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tproperties.x = bounds.x;\n\t\t\tproperties.y = bounds.y;\n\t\t\tproperties.width = bounds.width;\n\t\t\tproperties.height = bounds.height;\n\t\t}\n\n\t\tconst computedStyles = getComputedStyle( element );\n\n\t\t// CSS styles\n\t\t( elementOptions.styles || config.autoAnimateStyles ).forEach( style => {\n\t\t\tlet value;\n\n\t\t\t// `style` is either the property name directly, or an object\n\t\t\t// definition of a style property\n\t\t\tif( typeof style === 'string' ) style = { property: style };\n\n\t\t\tif( typeof style.from !== 'undefined' && direction === 'from' ) {\n\t\t\t\tvalue = { value: style.from, explicitValue: true };\n\t\t\t}\n\t\t\telse if( typeof style.to !== 'undefined' && direction === 'to' ) {\n\t\t\t\tvalue = { value: style.to, explicitValue: true };\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvalue = computedStyles[style.property];\n\t\t\t}\n\n\t\t\tif( value !== '' ) {\n\t\t\t\tproperties.styles[style.property] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn properties;\n\n\t}\n\n\t/**\n\t * Get a list of all element pairs that we can animate\n\t * between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t *\n\t * @return {Array} Each value is an array where [0] is\n\t * the element we're animating from and [1] is the\n\t * element we're animating to\n\t */\n\tgetAutoAnimatableElements( fromSlide, toSlide ) {\n\n\t\tlet matcher = typeof this.Reveal.getConfig().autoAnimateMatcher === 'function' ? this.Reveal.getConfig().autoAnimateMatcher : this.getAutoAnimatePairs;\n\n\t\tlet pairs = matcher.call( this, fromSlide, toSlide );\n\n\t\tlet reserved = [];\n\n\t\t// Remove duplicate pairs\n\t\treturn pairs.filter( ( pair, index ) => {\n\t\t\tif( reserved.indexOf( pair.to ) === -1 ) {\n\t\t\t\treserved.push( pair.to );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Identifies matching elements between slides.\n\t *\n\t * You can specify a custom matcher function by using\n\t * the `autoAnimateMatcher` config option.\n\t */\n\tgetAutoAnimatePairs( fromSlide, toSlide ) {\n\n\t\tlet pairs = [];\n\n\t\tconst codeNodes = 'pre';\n\t\tconst textNodes = 'h1, h2, h3, h4, h5, h6, p, li';\n\t\tconst mediaNodes = 'img, video, iframe';\n\n\t\t// Eplicit matches via data-id\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, '[data-id]', node => {\n\t\t\treturn node.nodeName + ':::' + node.getAttribute( 'data-id' );\n\t\t} );\n\n\t\t// Text\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, textNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.innerText;\n\t\t} );\n\n\t\t// Media\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, mediaNodes, node => {\n\t\t\treturn node.nodeName + ':::' + ( node.getAttribute( 'src' ) || node.getAttribute( 'data-src' ) );\n\t\t} );\n\n\t\t// Code\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, codeNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.innerText;\n\t\t} );\n\n\t\tpairs.forEach( pair => {\n\n\t\t\t// Disable scale transformations on text nodes, we transition\n\t\t\t// each individual text property instead\n\t\t\tif( matches( pair.from, textNodes ) ) {\n\t\t\t\tpair.options = { scale: false };\n\t\t\t}\n\t\t\t// Animate individual lines of code\n\t\t\telse if( matches( pair.from, codeNodes ) ) {\n\n\t\t\t\t// Transition the code block's width and height instead of scaling\n\t\t\t\t// to prevent its content from being squished\n\t\t\t\tpair.options = { scale: false, styles: [ 'width', 'height' ] };\n\n\t\t\t\t// Lines of code\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-code', node => {\n\t\t\t\t\treturn node.textContent;\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t\t// Line numbers\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-line[data-line-number]', node => {\n\t\t\t\t\treturn node.getAttribute( 'data-line-number' );\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [ 'width' ],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\treturn pairs;\n\n\t}\n\n\t/**\n\t * Helper method which returns a bounding box based on\n\t * the given elements offset coordinates.\n\t *\n\t * @param {HTMLElement} element\n\t * @return {Object} x, y, width, height\n\t */\n\tgetLocalBoundingBox( element ) {\n\n\t\tconst presentationScale = this.Reveal.getScale();\n\n\t\treturn {\n\t\t\tx: Math.round( ( element.offsetLeft * presentationScale ) * 100 ) / 100,\n\t\t\ty: Math.round( ( element.offsetTop * presentationScale ) * 100 ) / 100,\n\t\t\twidth: Math.round( ( element.offsetWidth * presentationScale ) * 100 ) / 100,\n\t\t\theight: Math.round( ( element.offsetHeight * presentationScale ) * 100 ) / 100\n\t\t};\n\n\t}\n\n\t/**\n\t * Finds matching elements between two slides.\n\t *\n\t * @param {Array} pairs \tList of pairs to push matches to\n\t * @param {HTMLElement} fromScope Scope within the from element exists\n\t * @param {HTMLElement} toScope Scope within the to element exists\n\t * @param {String} selector CSS selector of the element to match\n\t * @param {Function} serializer A function that accepts an element and returns\n\t * a stringified ID based on its contents\n\t * @param {Object} animationOptions Optional config options for this pair\n\t */\n\tfindAutoAnimateMatches( pairs, fromScope, toScope, selector, serializer, animationOptions ) {\n\n\t\tlet fromMatches = {};\n\t\tlet toMatches = {};\n\n\t\t[].slice.call( fromScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\tif( typeof key === 'string' && key.length ) {\n\t\t\t\tfromMatches[key] = fromMatches[key] || [];\n\t\t\t\tfromMatches[key].push( element );\n\t\t\t}\n\t\t} );\n\n\t\t[].slice.call( toScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\ttoMatches[key] = toMatches[key] || [];\n\t\t\ttoMatches[key].push( element );\n\n\t\t\tlet fromElement;\n\n\t\t\t// Retrieve the 'from' element\n\t\t\tif( fromMatches[key] ) {\n\t\t\t\tconst pimaryIndex = toMatches[key].length - 1;\n\t\t\t\tconst secondaryIndex = fromMatches[key].length - 1;\n\n\t\t\t\t// If there are multiple identical from elements, retrieve\n\t\t\t\t// the one at the same index as our to-element.\n\t\t\t\tif( fromMatches[key][ pimaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ pimaryIndex ];\n\t\t\t\t\tfromMatches[key][ pimaryIndex ] = null;\n\t\t\t\t}\n\t\t\t\t// If there are no matching from-elements at the same index,\n\t\t\t\t// use the last one.\n\t\t\t\telse if( fromMatches[key][ secondaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ secondaryIndex ];\n\t\t\t\t\tfromMatches[key][ secondaryIndex ] = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we've got a matching pair, push it to the list of pairs\n\t\t\tif( fromElement ) {\n\t\t\t\tpairs.push({\n\t\t\t\t\tfrom: fromElement,\n\t\t\t\t\tto: element,\n\t\t\t\t\toptions: animationOptions\n\t\t\t\t});\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns a all elements within the given scope that should\n\t * be considered unmatched in an auto-animate transition. If\n\t * fading of unmatched elements is turned on, these elements\n\t * will fade when going between auto-animate slides.\n\t *\n\t * Note that parents of auto-animate targets are NOT considerd\n\t * unmatched since fading them would break the auto-animation.\n\t *\n\t * @param {HTMLElement} rootElement\n\t * @return {Array}\n\t */\n\tgetUnmatchedAutoAnimateElements( rootElement ) {\n\n\t\treturn [].slice.call( rootElement.children ).reduce( ( result, element ) => {\n\n\t\t\tconst containsAnimatedElements = element.querySelector( '[data-auto-animate-target]' );\n\n\t\t\t// The element is unmatched if\n\t\t\t// - It is not an auto-animate target\n\t\t\t// - It does not contain any auto-animate targets\n\t\t\tif( !element.hasAttribute( 'data-auto-animate-target' ) && !containsAnimatedElements ) {\n\t\t\t\tresult.push( element );\n\t\t\t}\n\n\t\t\tif( element.querySelector( '[data-auto-animate-target]' ) ) {\n\t\t\t\tresult = result.concat( this.getUnmatchedAutoAnimateElements( element ) );\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}, [] );\n\n\t}\n\n}\n","import { extend, queryAll } from '../utils/util.js'\n\n/**\n * Handles sorting and navigation of slide fragments.\n * Fragments are elements within a slide that are\n * revealed/animated incrementally.\n */\nexport default class Fragments {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.fragments === false ) {\n\t\t\tthis.disable();\n\t\t}\n\t\telse if( oldConfig.fragments === false ) {\n\t\t\tthis.enable();\n\t\t}\n\n\t}\n\n\t/**\n\t * If fragments are disabled in the deck, they should all be\n\t * visible rather than stepped through.\n\t */\n\tdisable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.add( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Reverse of #disable(). Only called if fragments have\n\t * previously been disabled.\n\t */\n\tenable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.remove( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns an object describing the available fragment\n\t * directions.\n\t *\n\t * @return {{prev: boolean, next: boolean}}\n\t */\n\tavailableRoutes() {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\t\t\tlet fragments = currentSlide.querySelectorAll( '.fragment:not(.disabled)' );\n\t\t\tlet hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.disabled):not(.visible)' );\n\n\t\t\treturn {\n\t\t\t\tprev: fragments.length - hiddenFragments.length > 0,\n\t\t\t\tnext: !!hiddenFragments.length\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\treturn { prev: false, next: false };\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a sorted fragments list, ordered by an increasing\n\t * \"data-fragment-index\" attribute.\n\t *\n\t * Fragments will be revealed in the order that they are returned by\n\t * this function, so you can use the index attributes to control the\n\t * order of fragment appearance.\n\t *\n\t * To maintain a sensible default fragment order, fragments are presumed\n\t * to be passed in document order. This function adds a \"fragment-index\"\n\t * attribute to each node if such an attribute is not already present,\n\t * and sets that attribute to an integer value which is the position of\n\t * the fragment within the fragments list.\n\t *\n\t * @param {object[]|*} fragments\n\t * @param {boolean} grouped If true the returned array will contain\n\t * nested arrays for all fragments with the same index\n\t * @return {object[]} sorted Sorted array of fragments\n\t */\n\tsort( fragments, grouped = false ) {\n\n\t\tfragments = Array.from( fragments );\n\n\t\tlet ordered = [],\n\t\t\tunordered = [],\n\t\t\tsorted = [];\n\n\t\t// Group ordered and unordered elements\n\t\tfragments.forEach( fragment => {\n\t\t\tif( fragment.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\tlet index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 );\n\n\t\t\t\tif( !ordered[index] ) {\n\t\t\t\t\tordered[index] = [];\n\t\t\t\t}\n\n\t\t\t\tordered[index].push( fragment );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tunordered.push( [ fragment ] );\n\t\t\t}\n\t\t} );\n\n\t\t// Append fragments without explicit indices in their\n\t\t// DOM order\n\t\tordered = ordered.concat( unordered );\n\n\t\t// Manually count the index up per group to ensure there\n\t\t// are no gaps\n\t\tlet index = 0;\n\n\t\t// Push all fragments in their sorted order to an array,\n\t\t// this flattens the groups\n\t\tordered.forEach( group => {\n\t\t\tgroup.forEach( fragment => {\n\t\t\t\tsorted.push( fragment );\n\t\t\t\tfragment.setAttribute( 'data-fragment-index', index );\n\t\t\t} );\n\n\t\t\tindex ++;\n\t\t} );\n\n\t\treturn grouped === true ? ordered : sorted;\n\n\t}\n\n\t/**\n\t * Sorts and formats all of fragments in the\n\t * presentation.\n\t */\n\tsortAll() {\n\n\t\tthis.Reveal.getHorizontalSlides().forEach( horizontalSlide => {\n\n\t\t\tlet verticalSlides = queryAll( horizontalSlide, 'section' );\n\t\t\tverticalSlides.forEach( ( verticalSlide, y ) => {\n\n\t\t\t\tthis.sort( verticalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t\t}, this );\n\n\t\t\tif( verticalSlides.length === 0 ) this.sort( horizontalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Refreshes the fragments on the current slide so that they\n\t * have the appropriate classes (.visible + .current-fragment).\n\t *\n\t * @param {number} [index] The index of the current fragment\n\t * @param {array} [fragments] Array containing all fragments\n\t * in the current slide\n\t *\n\t * @return {{shown: array, hidden: array}}\n\t */\n\tupdate( index, fragments ) {\n\n\t\tlet changedFragments = {\n\t\t\tshown: [],\n\t\t\thidden: []\n\t\t};\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tfragments = fragments || this.sort( currentSlide.querySelectorAll( '.fragment' ) );\n\n\t\t\tif( fragments.length ) {\n\n\t\t\t\tlet maxIndex = 0;\n\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet currentFragment = this.sort( currentSlide.querySelectorAll( '.fragment.visible' ) ).pop();\n\t\t\t\t\tif( currentFragment ) {\n\t\t\t\t\t\tindex = parseInt( currentFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tArray.from( fragments ).forEach( ( el, i ) => {\n\n\t\t\t\t\tif( el.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\t\t\ti = parseInt( el.getAttribute( 'data-fragment-index' ), 10 );\n\t\t\t\t\t}\n\n\t\t\t\t\tmaxIndex = Math.max( maxIndex, i );\n\n\t\t\t\t\t// Visible fragments\n\t\t\t\t\tif( i <= index ) {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.add( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( i === index ) {\n\t\t\t\t\t\t\t// Announce the fragments one by one to the Screen Reader\n\t\t\t\t\t\t\tthis.Reveal.announceStatus( this.Reveal.getStatusText( el ) );\n\n\t\t\t\t\t\t\tel.classList.add( 'current-fragment' );\n\t\t\t\t\t\t\tthis.Reveal.slideContent.startEmbeddedContent( el );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif( !wasVisible ) {\n\t\t\t\t\t\t\tchangedFragments.shown.push( el )\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'visible',\n\t\t\t\t\t\t\t\tbubbles: false\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\t// Hidden fragments\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.remove( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( wasVisible ) {\n\t\t\t\t\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( el );\n\t\t\t\t\t\t\tchangedFragments.hidden.push( el );\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\t\t\tbubbles: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t// Write the current fragment index to the slide
.\n\t\t\t\t// This can be used by end users to apply styles based on\n\t\t\t\t// the current fragment index.\n\t\t\t\tindex = typeof index === 'number' ? index : -1;\n\t\t\t\tindex = Math.max( Math.min( index, maxIndex ), -1 );\n\t\t\t\tcurrentSlide.setAttribute( 'data-fragment', index );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn changedFragments;\n\n\t}\n\n\t/**\n\t * Formats the fragments on the given slide so that they have\n\t * valid indices. Call this if fragments are changed in the DOM\n\t * after reveal.js has already initialized.\n\t *\n\t * @param {HTMLElement} slide\n\t * @return {Array} a list of the HTML fragments that were synced\n\t */\n\tsync( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\treturn this.sort( slide.querySelectorAll( '.fragment' ) );\n\n\t}\n\n\t/**\n\t * Navigate to the specified slide fragment.\n\t *\n\t * @param {?number} index The index of the fragment that\n\t * should be shown, -1 means all are invisible\n\t * @param {number} offset Integer offset to apply to the\n\t * fragment index\n\t *\n\t * @return {boolean} true if a change was made in any\n\t * fragments visibility as part of this call\n\t */\n\tgoto( index, offset = 0 ) {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tlet fragments = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled)' ) );\n\t\t\tif( fragments.length ) {\n\n\t\t\t\t// If no index is specified, find the current\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet lastVisibleFragment = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled).visible' ) ).pop();\n\n\t\t\t\t\tif( lastVisibleFragment ) {\n\t\t\t\t\t\tindex = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tindex = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply the offset if there is one\n\t\t\t\tindex += offset;\n\n\t\t\t\tlet changedFragments = this.update( index, fragments );\n\n\t\t\t\tif( changedFragments.hidden.length ) {\n\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\ttype: 'fragmenthidden',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tfragment: changedFragments.hidden[0],\n\t\t\t\t\t\t\tfragments: changedFragments.hidden\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif( changedFragments.shown.length ) {\n\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\ttype: 'fragmentshown',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tfragment: changedFragments.shown[0],\n\t\t\t\t\t\t\tfragments: changedFragments.shown\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.Reveal.controls.update();\n\t\t\t\tthis.Reveal.progress.update();\n\n\t\t\t\tif( this.Reveal.getConfig().fragmentInURL ) {\n\t\t\t\t\tthis.Reveal.location.writeURL();\n\t\t\t\t}\n\n\t\t\t\treturn !!( changedFragments.shown.length || changedFragments.hidden.length );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Navigate to the next slide fragment.\n\t *\n\t * @return {boolean} true if there was a next fragment,\n\t * false otherwise\n\t */\n\tnext() {\n\n\t\treturn this.goto( null, 1 );\n\n\t}\n\n\t/**\n\t * Navigate to the previous slide fragment.\n\t *\n\t * @return {boolean} true if there was a previous fragment,\n\t * false otherwise\n\t */\n\tprev() {\n\n\t\treturn this.goto( null, -1 );\n\n\t}\n\n}","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { extend, queryAll, transformElement } from '../utils/util.js'\n\n/**\n * Handles all logic related to the overview mode\n * (birds-eye view of all slides).\n */\nexport default class Overview {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.active = false;\n\n\t\tthis.onSlideClicked = this.onSlideClicked.bind( this );\n\n\t}\n\n\t/**\n\t * Displays the overview of slides (quick nav) by scaling\n\t * down and arranging all slide elements.\n\t */\n\tactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview && !this.isActive() ) {\n\n\t\t\tthis.active = true;\n\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview' );\n\n\t\t\t// Don't auto-slide while in overview mode\n\t\t\tthis.Reveal.cancelAutoSlide();\n\n\t\t\t// Move the backgrounds element into the slide container to\n\t\t\t// that the same scaling is applied\n\t\t\tthis.Reveal.getSlidesElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clicking on an overview slide navigates to it\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\tif( !slide.classList.contains( 'stack' ) ) {\n\t\t\t\t\tslide.addEventListener( 'click', this.onSlideClicked, true );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Calculate slide sizes\n\t\t\tconst margin = 70;\n\t\t\tconst slideSize = this.Reveal.getComputedSlideSize();\n\t\t\tthis.overviewSlideWidth = slideSize.width + margin;\n\t\t\tthis.overviewSlideHeight = slideSize.height + margin;\n\n\t\t\t// Reverse in RTL mode\n\t\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\t\tthis.overviewSlideWidth = -this.overviewSlideWidth;\n\t\t\t}\n\n\t\t\tthis.Reveal.updateSlidesVisibility();\n\n\t\t\tthis.layout();\n\t\t\tthis.update();\n\n\t\t\tthis.Reveal.layout();\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\t// Notify observers of the overview showing\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewshown',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses CSS transforms to position all slides in a grid for\n\t * display inside of the overview mode.\n\t */\n\tlayout() {\n\n\t\t// Layout slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( ( hslide, h ) => {\n\t\t\thslide.setAttribute( 'data-index-h', h );\n\t\t\ttransformElement( hslide, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tif( hslide.classList.contains( 'stack' ) ) {\n\n\t\t\t\tqueryAll( hslide, 'section' ).forEach( ( vslide, v ) => {\n\t\t\t\t\tvslide.setAttribute( 'data-index-h', h );\n\t\t\t\t\tvslide.setAttribute( 'data-index-v', v );\n\n\t\t\t\t\ttransformElement( vslide, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t\t} );\n\n\t\t\t}\n\t\t} );\n\n\t\t// Layout slide backgrounds\n\t\tArray.from( this.Reveal.getBackgroundsElement().childNodes ).forEach( ( hbackground, h ) => {\n\t\t\ttransformElement( hbackground, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tqueryAll( hbackground, '.slide-background' ).forEach( ( vbackground, v ) => {\n\t\t\t\ttransformElement( vbackground, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Moves the overview viewport to the current slides.\n\t * Called each time the current slide changes.\n\t */\n\tupdate() {\n\n\t\tconst vmin = Math.min( window.innerWidth, window.innerHeight );\n\t\tconst scale = Math.max( vmin / 5, 150 ) / vmin;\n\t\tconst indices = this.Reveal.getIndices();\n\n\t\tthis.Reveal.transformSlides( {\n\t\t\toverview: [\n\t\t\t\t'scale('+ scale +')',\n\t\t\t\t'translateX('+ ( -indices.h * this.overviewSlideWidth ) +'px)',\n\t\t\t\t'translateY('+ ( -indices.v * this.overviewSlideHeight ) +'px)'\n\t\t\t].join( ' ' )\n\t\t} );\n\n\t}\n\n\t/**\n\t * Exits the slide overview and enters the currently\n\t * active slide.\n\t */\n\tdeactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview ) {\n\n\t\t\tthis.active = false;\n\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview' );\n\n\t\t\t// Temporarily add a class so that transitions can do different things\n\t\t\t// depending on whether they are exiting/entering overview, or just\n\t\t\t// moving from slide to slide\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview-deactivating' );\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview-deactivating' );\n\t\t\t}, 1 );\n\n\t\t\t// Move the background element back out\n\t\t\tthis.Reveal.getRevealElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clean up changes made to slides\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\ttransformElement( slide, '' );\n\n\t\t\t\tslide.removeEventListener( 'click', this.onSlideClicked, true );\n\t\t\t} );\n\n\t\t\t// Clean up changes made to backgrounds\n\t\t\tqueryAll( this.Reveal.getBackgroundsElement(), '.slide-background' ).forEach( background => {\n\t\t\t\ttransformElement( background, '' );\n\t\t\t} );\n\n\t\t\tthis.Reveal.transformSlides( { overview: '' } );\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\tthis.Reveal.slide( indices.h, indices.v );\n\t\t\tthis.Reveal.layout();\n\t\t\tthis.Reveal.cueAutoSlide();\n\n\t\t\t// Notify observers of the overview hiding\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewhidden',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\t}\n\n\t/**\n\t * Toggles the slide overview mode on and off.\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 * overview is open, false means it's closed.\n\t */\n\ttoggle( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.activate() : this.deactivate();\n\t\t}\n\t\telse {\n\t\t\tthis.isActive() ? this.deactivate() : this.activate();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the overview is currently active.\n\t *\n\t * @return {Boolean} true if the overview is active,\n\t * false otherwise\n\t */\n\tisActive() {\n\n\t\treturn this.active;\n\n\t}\n\n\t/**\n\t * Invoked when a slide is and we're in the overview.\n\t *\n\t * @param {object} event\n\t */\n\tonSlideClicked( event ) {\n\n\t\tif( this.isActive() ) {\n\t\t\tevent.preventDefault();\n\n\t\t\tlet element = event.target;\n\n\t\t\twhile( element && !element.nodeName.match( /section/gi ) ) {\n\t\t\t\telement = element.parentNode;\n\t\t\t}\n\n\t\t\tif( element && !element.classList.contains( 'disabled' ) ) {\n\n\t\t\t\tthis.deactivate();\n\n\t\t\t\tif( element.nodeName.match( /section/gi ) ) {\n\t\t\t\t\tlet h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),\n\t\t\t\t\t\tv = parseInt( element.getAttribute( 'data-index-v' ), 10 );\n\n\t\t\t\t\tthis.Reveal.slide( h, v );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}\n\n}","import { enterFullscreen } from '../utils/util.js'\n\n/**\n * Handles all reveal.js keyboard interactions.\n */\nexport default class Keyboard {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// A key:value map of keyboard keys and descriptions of\n\t\t// the actions they trigger\n\t\tthis.shortcuts = {};\n\n\t\t// Holds custom key code mappings\n\t\tthis.bindings = {};\n\n\t\tthis.onDocumentKeyDown = this.onDocumentKeyDown.bind( this );\n\t\tthis.onDocumentKeyPress = this.onDocumentKeyPress.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.navigationMode === 'linear' ) {\n\t\t\tthis.shortcuts['→ , ↓ , SPACE , N , L , J'] = 'Next slide';\n\t\t\tthis.shortcuts['← , ↑ , P , H , K'] = 'Previous slide';\n\t\t}\n\t\telse {\n\t\t\tthis.shortcuts['N , SPACE'] = 'Next slide';\n\t\t\tthis.shortcuts['P , Shift SPACE'] = 'Previous slide';\n\t\t\tthis.shortcuts['← , H'] = 'Navigate left';\n\t\t\tthis.shortcuts['→ , L'] = 'Navigate right';\n\t\t\tthis.shortcuts['↑ , K'] = 'Navigate up';\n\t\t\tthis.shortcuts['↓ , J'] = 'Navigate down';\n\t\t}\n\n\t\tthis.shortcuts['Alt + ←/↑/→/↓'] = 'Navigate without fragments';\n\t\tthis.shortcuts['Shift + ←/↑/→/↓'] = 'Jump to first/last slide';\n\t\tthis.shortcuts['B , .'] = 'Pause';\n\t\tthis.shortcuts['F'] = 'Fullscreen';\n\t\tthis.shortcuts['ESC, O'] = 'Slide overview';\n\n\t}\n\n\t/**\n\t * Starts listening for keyboard events.\n\t */\n\tbind() {\n\n\t\tdocument.addEventListener( 'keydown', this.onDocumentKeyDown, false );\n\t\tdocument.addEventListener( 'keypress', this.onDocumentKeyPress, false );\n\n\t}\n\n\t/**\n\t * Stops listening for keyboard events.\n\t */\n\tunbind() {\n\n\t\tdocument.removeEventListener( 'keydown', this.onDocumentKeyDown, false );\n\t\tdocument.removeEventListener( 'keypress', this.onDocumentKeyPress, false );\n\n\t}\n\n\t/**\n\t * Add a custom key binding with optional description to\n\t * be added to the help screen.\n\t */\n\taddKeyBinding( binding, callback ) {\n\n\t\tif( typeof binding === 'object' && binding.keyCode ) {\n\t\t\tthis.bindings[binding.keyCode] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: binding.key,\n\t\t\t\tdescription: binding.description\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\tthis.bindings[binding] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: null,\n\t\t\t\tdescription: null\n\t\t\t};\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes the specified custom key binding.\n\t */\n\tremoveKeyBinding( keyCode ) {\n\n\t\tdelete this.bindings[keyCode];\n\n\t}\n\n\t/**\n\t * Programmatically triggers a keyboard event\n\t *\n\t * @param {int} keyCode\n\t */\n\ttriggerKey( keyCode ) {\n\n\t\tthis.onDocumentKeyDown( { keyCode } );\n\n\t}\n\n\t/**\n\t * Registers a new shortcut to include in the help overlay\n\t *\n\t * @param {String} key\n\t * @param {String} value\n\t */\n\tregisterKeyboardShortcut( key, value ) {\n\n\t\tthis.shortcuts[key] = value;\n\n\t}\n\n\tgetShortcuts() {\n\n\t\treturn this.shortcuts;\n\n\t}\n\n\tgetBindings() {\n\n\t\treturn this.bindings;\n\n\t}\n\n\t/**\n\t * Handler for the document level 'keypress' event.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentKeyPress( event ) {\n\n\t\t// Check if the pressed key is question mark\n\t\tif( event.shiftKey && event.charCode === 63 ) {\n\t\t\tthis.Reveal.toggleHelp();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the document level 'keydown' event.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentKeyDown( event ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// If there's a condition specified and it returns false,\n\t\t// ignore this event\n\t\tif( typeof config.keyboardCondition === 'function' && config.keyboardCondition(event) === false ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If keyboardCondition is set, only capture keyboard events\n\t\t// for embedded decks when they are focused\n\t\tif( config.keyboardCondition === 'focused' && !this.Reveal.isFocused() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Shorthand\n\t\tlet keyCode = event.keyCode;\n\n\t\t// Remember if auto-sliding was paused so we can toggle it\n\t\tlet autoSlideWasPaused = !this.Reveal.isAutoSliding();\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\t// Is there a focused element that could be using the keyboard?\n\t\tlet activeElementIsCE = document.activeElement && document.activeElement.isContentEditable === true;\n\t\tlet activeElementIsInput = document.activeElement && document.activeElement.tagName && /input|textarea/i.test( document.activeElement.tagName );\n\t\tlet activeElementIsNotes = document.activeElement && document.activeElement.className && /speaker-notes/i.test( document.activeElement.className);\n\n\t\t// Whitelist certain modifiers for slide navigation shortcuts\n\t\tlet isNavigationKey = [32, 37, 38, 39, 40, 78, 80].indexOf( event.keyCode ) !== -1;\n\n\t\t// Prevent all other events when a modifier is pressed\n\t\tlet unusedModifier = \t!( isNavigationKey && event.shiftKey || event.altKey ) &&\n\t\t\t\t\t\t\t\t( event.shiftKey || event.altKey || event.ctrlKey || event.metaKey );\n\n\t\t// Disregard the event if there's a focused element or a\n\t\t// keyboard modifier key is present\n\t\tif( activeElementIsCE || activeElementIsInput || activeElementIsNotes || unusedModifier ) return;\n\n\t\t// While paused only allow resume keyboard events; 'b', 'v', '.'\n\t\tlet resumeKeyCodes = [66,86,190,191];\n\t\tlet key;\n\n\t\t// Custom key bindings for togglePause should be able to resume\n\t\tif( typeof config.keyboard === 'object' ) {\n\t\t\tfor( key in config.keyboard ) {\n\t\t\t\tif( config.keyboard[key] === 'togglePause' ) {\n\t\t\t\t\tresumeKeyCodes.push( parseInt( key, 10 ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( this.Reveal.isPaused() && resumeKeyCodes.indexOf( keyCode ) === -1 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Use linear navigation if we're configured to OR if\n\t\t// the presentation is one-dimensional\n\t\tlet useLinearMode = config.navigationMode === 'linear' || !this.Reveal.hasHorizontalSlides() || !this.Reveal.hasVerticalSlides();\n\n\t\tlet triggered = false;\n\n\t\t// 1. User defined key bindings\n\t\tif( typeof config.keyboard === 'object' ) {\n\n\t\t\tfor( key in config.keyboard ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet value = config.keyboard[ key ];\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof value === 'function' ) {\n\t\t\t\t\t\tvalue.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof value === 'string' && typeof this.Reveal[ value ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ value ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// 2. Registered custom key bindings\n\t\tif( triggered === false ) {\n\n\t\t\tfor( key in this.bindings ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet action = this.bindings[ key ].callback;\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof action === 'function' ) {\n\t\t\t\t\t\taction.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof action === 'string' && typeof this.Reveal[ action ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ action ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 3. System defined key bindings\n\t\tif( triggered === false ) {\n\n\t\t\t// Assume true and try to prove false\n\t\t\ttriggered = true;\n\n\t\t\t// P, PAGE UP\n\t\t\tif( keyCode === 80 || keyCode === 33 ) {\n\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// N, PAGE DOWN\n\t\t\telse if( keyCode === 78 || keyCode === 34 ) {\n\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// H, LEFT\n\t\t\telse if( keyCode === 72 || keyCode === 37 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.left({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// L, RIGHT\n\t\t\telse if( keyCode === 76 || keyCode === 39 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.right({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// K, UP\n\t\t\telse if( keyCode === 75 || keyCode === 38 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.up({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// J, DOWN\n\t\t\telse if( keyCode === 74 || keyCode === 40 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, Number.MAX_VALUE );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.down({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// HOME\n\t\t\telse if( keyCode === 36 ) {\n\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t}\n\t\t\t// END\n\t\t\telse if( keyCode === 35 ) {\n\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t}\n\t\t\t// SPACE\n\t\t\telse if( keyCode === 32 ) {\n\t\t\t\tif( this.Reveal.overview.isActive() ) {\n\t\t\t\t\tthis.Reveal.overview.deactivate();\n\t\t\t\t}\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TWO-SPOT, SEMICOLON, B, V, PERIOD, LOGITECH PRESENTER TOOLS \"BLACK SCREEN\" BUTTON\n\t\t\telse if( keyCode === 58 || keyCode === 59 || keyCode === 66 || keyCode === 86 || keyCode === 190 || keyCode === 191 ) {\n\t\t\t\tthis.Reveal.togglePause();\n\t\t\t}\n\t\t\t// F\n\t\t\telse if( keyCode === 70 ) {\n\t\t\t\tenterFullscreen( config.embedded ? this.Reveal.getViewportElement() : document.documentElement );\n\t\t\t}\n\t\t\t// A\n\t\t\telse if( keyCode === 65 ) {\n\t\t\t\tif ( config.autoSlideStoppable ) {\n\t\t\t\t\tthis.Reveal.toggleAutoSlide( autoSlideWasPaused );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttriggered = false;\n\t\t\t}\n\n\t\t}\n\n\t\t// If the input resulted in a triggered action we should prevent\n\t\t// the browsers default behavior\n\t\tif( triggered ) {\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\t\t// ESC or O key\n\t\telse if( keyCode === 27 || keyCode === 79 ) {\n\t\t\tif( this.Reveal.closeOverlay() === false ) {\n\t\t\t\tthis.Reveal.overview.toggle();\n\t\t\t}\n\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\n\t\t// If auto-sliding is enabled we need to cue up\n\t\t// another timeout\n\t\tthis.Reveal.cueAutoSlide();\n\n\t}\n\n}","/**\n * Reads and writes the URL based on reveal.js' current state.\n */\nexport default class Location {\n\n\t// The minimum number of milliseconds that must pass between\n\t// calls to history.replaceState\n\tMAX_REPLACE_STATE_FREQUENCY = 1000\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Delays updates to the URL due to a Chrome thumbnailer bug\n\t\tthis.writeURLTimeout = 0;\n\n\t\tthis.replaceStateTimestamp = 0;\n\n\t\tthis.onWindowHashChange = this.onWindowHashChange.bind( this );\n\n\t}\n\n\tbind() {\n\n\t\twindow.addEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\tunbind() {\n\n\t\twindow.removeEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\t/**\n\t * Returns the slide indices for the given hash link.\n\t *\n\t * @param {string} [hash] the hash string that we want to\n\t * find the indices for\n\t *\n\t * @returns slide indices or null\n\t */\n\tgetIndicesFromHash( hash=window.location.hash ) {\n\n\t\t// Attempt to parse the hash as either an index or name\n\t\tlet name = hash.replace( /^#\\/?/, '' );\n\t\tlet bits = name.split( '/' );\n\n\t\t// If the first bit is not fully numeric and there is a name we\n\t\t// can assume that this is a named link\n\t\tif( !/^[0-9]*$/.test( bits[0] ) && name.length ) {\n\t\t\tlet element;\n\n\t\t\tlet f;\n\n\t\t\t// Parse named links with fragments (#/named-link/2)\n\t\t\tif( /\\/[-\\d]+$/g.test( name ) ) {\n\t\t\t\tf = parseInt( name.split( '/' ).pop(), 10 );\n\t\t\t\tf = isNaN(f) ? undefined : f;\n\t\t\t\tname = name.split( '/' ).shift();\n\t\t\t}\n\n\t\t\t// Ensure the named link is a valid HTML ID attribute\n\t\t\ttry {\n\t\t\t\telement = document.getElementById( decodeURIComponent( name ) );\n\t\t\t}\n\t\t\tcatch ( error ) { }\n\n\t\t\tif( element ) {\n\t\t\t\treturn { ...this.Reveal.getIndices( element ), f };\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst config = this.Reveal.getConfig();\n\t\t\tlet hashIndexBase = config.hashOneBasedIndex ? 1 : 0;\n\n\t\t\t// Read the index components of the hash\n\t\t\tlet h = ( parseInt( bits[0], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tv = ( parseInt( bits[1], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tf;\n\n\t\t\tif( config.fragmentInURL ) {\n\t\t\t\tf = parseInt( bits[2], 10 );\n\t\t\t\tif( isNaN( f ) ) {\n\t\t\t\t\tf = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { h, v, f };\n\t\t}\n\n\t\t// The hash couldn't be parsed or no matching named link was found\n\t\treturn null\n\n\t}\n\n\t/**\n\t * Reads the current URL (hash) and navigates accordingly.\n\t */\n\treadURL() {\n\n\t\tconst currentIndices = this.Reveal.getIndices();\n\t\tconst newIndices = this.getIndicesFromHash();\n\n\t\tif( newIndices ) {\n\t\t\tif( ( newIndices.h !== currentIndices.h || newIndices.v !== currentIndices.v || newIndices.f !== undefined ) ) {\n\t\t\t\t\tthis.Reveal.slide( newIndices.h, newIndices.v, newIndices.f );\n\t\t\t}\n\t\t}\n\t\t// If no new indices are available, we're trying to navigate to\n\t\t// a slide hash that does not exist\n\t\telse {\n\t\t\tthis.Reveal.slide( currentIndices.h || 0, currentIndices.v || 0 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the page URL (hash) to reflect the current\n\t * state.\n\t *\n\t * @param {number} delay The time in ms to wait before\n\t * writing the hash\n\t */\n\twriteURL( delay ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\n\t\t// Make sure there's never more than one timeout running\n\t\tclearTimeout( this.writeURLTimeout );\n\n\t\t// If a delay is specified, timeout this call\n\t\tif( typeof delay === 'number' ) {\n\t\t\tthis.writeURLTimeout = setTimeout( this.writeURL, delay );\n\t\t}\n\t\telse if( currentSlide ) {\n\n\t\t\tlet hash = this.getHash();\n\n\t\t\t// If we're configured to push to history OR the history\n\t\t\t// API is not avaialble.\n\t\t\tif( config.history ) {\n\t\t\t\twindow.location.hash = hash;\n\t\t\t}\n\t\t\t// If we're configured to reflect the current slide in the\n\t\t\t// URL without pushing to history.\n\t\t\telse if( config.hash ) {\n\t\t\t\t// If the hash is empty, don't add it to the URL\n\t\t\t\tif( hash === '/' ) {\n\t\t\t\t\tthis.debouncedReplaceState( window.location.pathname + window.location.search );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.debouncedReplaceState( '#' + hash );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// UPDATE: The below nuking of all hash changes breaks\n\t\t\t// anchors on pages where reveal.js is running. Removed\n\t\t\t// in 4.0. Why was it here in the first place? ¯\\_(ツ)_/¯\n\t\t\t//\n\t\t\t// If history and hash are both disabled, a hash may still\n\t\t\t// be added to the URL by clicking on a href with a hash\n\t\t\t// target. Counter this by always removing the hash.\n\t\t\t// else {\n\t\t\t// \twindow.history.replaceState( null, null, window.location.pathname + window.location.search );\n\t\t\t// }\n\n\t\t}\n\n\t}\n\n\treplaceState( url ) {\n\n\t\twindow.history.replaceState( null, null, url );\n\t\tthis.replaceStateTimestamp = Date.now();\n\n\t}\n\n\tdebouncedReplaceState( url ) {\n\n\t\tclearTimeout( this.replaceStateTimeout );\n\n\t\tif( Date.now() - this.replaceStateTimestamp > this.MAX_REPLACE_STATE_FREQUENCY ) {\n\t\t\tthis.replaceState( url );\n\t\t}\n\t\telse {\n\t\t\tthis.replaceStateTimeout = setTimeout( () => this.replaceState( url ), this.MAX_REPLACE_STATE_FREQUENCY );\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a hash URL that will resolve to the given slide location.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide to link to\n\t */\n\tgetHash( slide ) {\n\n\t\tlet url = '/';\n\n\t\t// Attempt to create a named link based on the slide's ID\n\t\tlet s = slide || this.Reveal.getCurrentSlide();\n\t\tlet id = s ? s.getAttribute( 'id' ) : null;\n\t\tif( id ) {\n\t\t\tid = encodeURIComponent( id );\n\t\t}\n\n\t\tlet index = this.Reveal.getIndices( slide );\n\t\tif( !this.Reveal.getConfig().fragmentInURL ) {\n\t\t\tindex.f = undefined;\n\t\t}\n\n\t\t// If the current slide has an ID, use that as a named link,\n\t\t// but we don't support named links with a fragment index\n\t\tif( typeof id === 'string' && id.length ) {\n\t\t\turl = '/' + id;\n\n\t\t\t// If there is also a fragment, append that at the end\n\t\t\t// of the named link, like: #/named-link/2\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\t\t// Otherwise use the /h/v index\n\t\telse {\n\t\t\tlet hashIndexBase = this.Reveal.getConfig().hashOneBasedIndex ? 1 : 0;\n\t\t\tif( index.h > 0 || index.v > 0 || index.f >= 0 ) url += index.h + hashIndexBase;\n\t\t\tif( index.v > 0 || index.f >= 0 ) url += '/' + (index.v + hashIndexBase );\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\n\t\treturn url;\n\n\t}\n\n\t/**\n\t * Handler for the window level 'hashchange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tonWindowHashChange( event ) {\n\n\t\tthis.readURL();\n\n\t}\n\n}","import { queryAll } from '../utils/util.js'\nimport { isAndroid } from '../utils/device.js'\n\n/**\n * Manages our presentation controls. This includes both\n * the built-in control arrows as well as event monitoring\n * of any elements within the presentation with either of the\n * following helper classes:\n * - .navigate-up\n * - .navigate-right\n * - .navigate-down\n * - .navigate-left\n * - .navigate-next\n * - .navigate-prev\n */\nexport default class Controls {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onNavigateLeftClicked = this.onNavigateLeftClicked.bind( this );\n\t\tthis.onNavigateRightClicked = this.onNavigateRightClicked.bind( this );\n\t\tthis.onNavigateUpClicked = this.onNavigateUpClicked.bind( this );\n\t\tthis.onNavigateDownClicked = this.onNavigateDownClicked.bind( this );\n\t\tthis.onNavigatePrevClicked = this.onNavigatePrevClicked.bind( this );\n\t\tthis.onNavigateNextClicked = this.onNavigateNextClicked.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tconst rtl = this.Reveal.getConfig().rtl;\n\t\tconst revealElement = this.Reveal.getRevealElement();\n\n\t\tthis.element = document.createElement( 'aside' );\n\t\tthis.element.className = 'controls';\n\t\tthis.element.innerHTML =\n\t\t\t`\n\t\t\t\n\t\t\t\n\t\t\t`;\n\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\t// There can be multiple instances of controls throughout the page\n\t\tthis.controlsLeft = queryAll( revealElement, '.navigate-left' );\n\t\tthis.controlsRight = queryAll( revealElement, '.navigate-right' );\n\t\tthis.controlsUp = queryAll( revealElement, '.navigate-up' );\n\t\tthis.controlsDown = queryAll( revealElement, '.navigate-down' );\n\t\tthis.controlsPrev = queryAll( revealElement, '.navigate-prev' );\n\t\tthis.controlsNext = queryAll( revealElement, '.navigate-next' );\n\n\t\t// The left, right and down arrows in the standard reveal.js controls\n\t\tthis.controlsRightArrow = this.element.querySelector( '.navigate-right' );\n\t\tthis.controlsLeftArrow = this.element.querySelector( '.navigate-left' );\n\t\tthis.controlsDownArrow = this.element.querySelector( '.navigate-down' );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = config.controls ? 'block' : 'none';\n\n\t\tthis.element.setAttribute( 'data-controls-layout', config.controlsLayout );\n\t\tthis.element.setAttribute( 'data-controls-back-arrows', config.controlsBackArrows );\n\n\t}\n\n\tbind() {\n\n\t\t// Listen to both touch and click events, in case the device\n\t\t// supports both\n\t\tlet pointerEvents = [ 'touchstart', 'click' ];\n\n\t\t// Only support touch for Android, fixes double navigations in\n\t\t// stock browser\n\t\tif( isAndroid ) {\n\t\t\tpointerEvents = [ 'touchstart' ];\n\t\t}\n\n\t\tpointerEvents.forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.addEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.addEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.addEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.addEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.addEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.addEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t} );\n\n\t}\n\n\tunbind() {\n\n\t\t[ 'touchstart', 'click' ].forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.removeEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.removeEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.removeEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.removeEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.removeEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.removeEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates the state of all control/navigation arrows.\n\t */\n\tupdate() {\n\n\t\tlet routes = this.Reveal.availableRoutes();\n\n\t\t// Remove the 'enabled' class from all directions\n\t\t[...this.controlsLeft, ...this.controlsRight, ...this.controlsUp, ...this.controlsDown, ...this.controlsPrev, ...this.controlsNext].forEach( node => {\n\t\t\tnode.classList.remove( 'enabled', 'fragmented' );\n\n\t\t\t// Set 'disabled' attribute on all directions\n\t\t\tnode.setAttribute( 'disabled', 'disabled' );\n\t\t} );\n\n\t\t// Add the 'enabled' class to the available routes; remove 'disabled' attribute to enable buttons\n\t\tif( routes.left ) this.controlsLeft.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right ) this.controlsRight.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.up ) this.controlsUp.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.down ) this.controlsDown.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Prev/next buttons\n\t\tif( routes.left || routes.up ) this.controlsPrev.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right || routes.down ) this.controlsNext.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Highlight fragment directions\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide ) {\n\n\t\t\tlet fragmentsRoutes = this.Reveal.fragments.availableRoutes();\n\n\t\t\t// Always apply fragment decorator to prev/next buttons\n\t\t\tif( fragmentsRoutes.prev ) this.controlsPrev.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\tif( fragmentsRoutes.next ) this.controlsNext.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t\t// Apply fragment decorators to directional buttons based on\n\t\t\t// what slide axis they are in\n\t\t\tif( this.Reveal.isVerticalSlide( currentSlide ) ) {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsUp.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsDown.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsLeft.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsRight.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\n\t\t}\n\n\t\tif( this.Reveal.getConfig().controlsTutorial ) {\n\n\t\t\tlet indices = this.Reveal.getIndices();\n\n\t\t\t// Highlight control arrows with an animation to ensure\n\t\t\t// that the viewer knows how to navigate\n\t\t\tif( !this.Reveal.hasNavigatedVertically() && routes.down ) {\n\t\t\t\tthis.controlsDownArrow.classList.add( 'highlight' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.controlsDownArrow.classList.remove( 'highlight' );\n\n\t\t\t\tif( this.Reveal.getConfig().rtl ) {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.left && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.right && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy() {\n\n\t\tthis.unbind();\n\t\tthis.element.remove();\n\n\t}\n\n\t/**\n\t * Event handlers for navigation control buttons.\n\t */\n\tonNavigateLeftClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.prev();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.left();\n\t\t}\n\n\t}\n\n\tonNavigateRightClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.next();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.right();\n\t\t}\n\n\t}\n\n\tonNavigateUpClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.up();\n\n\t}\n\n\tonNavigateDownClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.down();\n\n\t}\n\n\tonNavigatePrevClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.prev();\n\n\t}\n\n\tonNavigateNextClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.next();\n\n\t}\n\n\n}","/**\n * Creates a visual progress bar for the presentation.\n */\nexport default class Progress {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onProgressClicked = this.onProgressClicked.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'progress';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\tthis.bar = document.createElement( 'span' );\n\t\tthis.element.appendChild( this.bar );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = config.progress ? 'block' : 'none';\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.addEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tif ( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.removeEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the progress bar to reflect the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update progress if enabled\n\t\tif( this.Reveal.getConfig().progress && this.bar ) {\n\n\t\t\tlet scale = this.Reveal.getProgress();\n\n\t\t\t// Don't fill the progress bar if there's only one slide\n\t\t\tif( this.Reveal.getTotalSlides() < 2 ) {\n\t\t\t\tscale = 0;\n\t\t\t}\n\n\t\t\tthis.bar.style.transform = 'scaleX('+ scale +')';\n\n\t\t}\n\n\t}\n\n\tgetMaxWidth() {\n\n\t\treturn this.Reveal.getRevealElement().offsetWidth;\n\n\t}\n\n\t/**\n\t * Clicking on the progress bar results in a navigation to the\n\t * closest approximate horizontal slide using this equation:\n\t *\n\t * ( clickX / presentationWidth ) * numberOfSlides\n\t *\n\t * @param {object} event\n\t */\n\tonProgressClicked( event ) {\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\tevent.preventDefault();\n\n\t\tlet slides = this.Reveal.getSlides();\n\t\tlet slidesTotal = slides.length;\n\t\tlet slideIndex = Math.floor( ( event.clientX / this.getMaxWidth() ) * slidesTotal );\n\n\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\tslideIndex = slidesTotal - slideIndex;\n\t\t}\n\n\t\tlet targetIndices = this.Reveal.getIndices(slides[slideIndex]);\n\t\tthis.Reveal.slide( targetIndices.h, targetIndices.v );\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","/**\n * Handles hiding of the pointer/cursor when inactive.\n */\nexport default class Pointer {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Throttles mouse wheel navigation\n\t\tthis.lastMouseWheelStep = 0;\n\n\t\t// Is the mouse pointer currently hidden from view\n\t\tthis.cursorHidden = false;\n\n\t\t// Timeout used to determine when the cursor is inactive\n\t\tthis.cursorInactiveTimeout = 0;\n\n\t\tthis.onDocumentCursorActive = this.onDocumentCursorActive.bind( this );\n\t\tthis.onDocumentMouseScroll = this.onDocumentMouseScroll.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.mouseWheel ) {\n\t\t\tdocument.addEventListener( 'DOMMouseScroll', this.onDocumentMouseScroll, false ); // FF\n\t\t\tdocument.addEventListener( 'mousewheel', this.onDocumentMouseScroll, false );\n\t\t}\n\t\telse {\n\t\t\tdocument.removeEventListener( 'DOMMouseScroll', this.onDocumentMouseScroll, false ); // FF\n\t\t\tdocument.removeEventListener( 'mousewheel', this.onDocumentMouseScroll, false );\n\t\t}\n\n\t\t// Auto-hide the mouse pointer when its inactive\n\t\tif( config.hideInactiveCursor ) {\n\t\t\tdocument.addEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.addEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\t\telse {\n\t\t\tthis.showCursor();\n\n\t\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Shows the mouse pointer after it has been hidden with\n\t * #hideCursor.\n\t */\n\tshowCursor() {\n\n\t\tif( this.cursorHidden ) {\n\t\t\tthis.cursorHidden = false;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = '';\n\t\t}\n\n\t}\n\n\t/**\n\t * Hides the mouse pointer when it's on top of the .reveal\n\t * container.\n\t */\n\thideCursor() {\n\n\t\tif( this.cursorHidden === false ) {\n\t\t\tthis.cursorHidden = true;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = 'none';\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.showCursor();\n\n\t\tdocument.removeEventListener( 'DOMMouseScroll', this.onDocumentMouseScroll, false );\n\t\tdocument.removeEventListener( 'mousewheel', this.onDocumentMouseScroll, false );\n\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\n\t}\n\n\t/**\n\t * Called whenever there is mouse input at the document level\n\t * to determine if the cursor is active or not.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentCursorActive( event ) {\n\n\t\tthis.showCursor();\n\n\t\tclearTimeout( this.cursorInactiveTimeout );\n\n\t\tthis.cursorInactiveTimeout = setTimeout( this.hideCursor.bind( this ), this.Reveal.getConfig().hideCursorTime );\n\n\t}\n\n\t/**\n\t * Handles mouse wheel scrolling, throttled to avoid skipping\n\t * multiple slides.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentMouseScroll( event ) {\n\n\t\tif( Date.now() - this.lastMouseWheelStep > 1000 ) {\n\n\t\t\tthis.lastMouseWheelStep = Date.now();\n\n\t\t\tlet delta = event.detail || -event.wheelDelta;\n\t\t\tif( delta > 0 ) {\n\t\t\t\tthis.Reveal.next();\n\t\t\t}\n\t\t\telse if( delta < 0 ) {\n\t\t\t\tthis.Reveal.prev();\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}","/**\n * Loads a JavaScript file from the given URL and executes it.\n *\n * @param {string} url Address of the .js file to load\n * @param {function} callback Method to invoke when the script\n * has loaded and executed\n */\nexport const loadScript = ( url, callback ) => {\n\n\tconst script = document.createElement( 'script' );\n\tscript.type = 'text/javascript';\n\tscript.async = false;\n\tscript.defer = false;\n\tscript.src = url;\n\n\tif( typeof callback === 'function' ) {\n\n\t\t// Success callback\n\t\tscript.onload = script.onreadystatechange = event => {\n\t\t\tif( event.type === 'load' || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t// Kill event listeners\n\t\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\t\tcallback();\n\n\t\t\t}\n\t\t};\n\n\t\t// Error callback\n\t\tscript.onerror = err => {\n\n\t\t\t// Kill event listeners\n\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\tcallback( new Error( 'Failed loading script: ' + script.src + '\\n' + err ) );\n\n\t\t};\n\n\t}\n\n\t// Append the script at the end of \n\tconst head = document.querySelector( 'head' );\n\thead.insertBefore( script, head.lastChild );\n\n}","import { loadScript } from '../utils/loader.js'\n\n/**\n * Manages loading and registering of reveal.js plugins.\n */\nexport default class Plugins {\n\n\tconstructor( reveal ) {\n\n\t\tthis.Reveal = reveal;\n\n\t\t// Flags our current state (idle -> loading -> loaded)\n\t\tthis.state = 'idle';\n\n\t\t// An id:instance map of currently registed plugins\n\t\tthis.registeredPlugins = {};\n\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n\t/**\n\t * Loads reveal.js dependencies, registers and\n\t * initializes plugins.\n\t *\n\t * Plugins are direct references to a reveal.js plugin\n\t * object that we register and initialize after any\n\t * synchronous dependencies have loaded.\n\t *\n\t * Dependencies are defined via the 'dependencies' config\n\t * option and will be loaded prior to starting reveal.js.\n\t * Some dependencies may have an 'async' flag, if so they\n\t * will load after reveal.js has been started up.\n\t */\n\tload( plugins, dependencies ) {\n\n\t\tthis.state = 'loading';\n\n\t\tplugins.forEach( this.registerPlugin.bind( this ) );\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet scripts = [],\n\t\t\t\tscriptsToLoad = 0;\n\n\t\t\tdependencies.forEach( s => {\n\t\t\t\t// Load if there's no condition or the condition is truthy\n\t\t\t\tif( !s.condition || s.condition() ) {\n\t\t\t\t\tif( s.async ) {\n\t\t\t\t\t\tthis.asyncDependencies.push( s );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tscripts.push( s );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif( scripts.length ) {\n\t\t\t\tscriptsToLoad = scripts.length;\n\n\t\t\t\tconst scriptLoadedCallback = (s) => {\n\t\t\t\t\tif( s && typeof s.callback === 'function' ) s.callback();\n\n\t\t\t\t\tif( --scriptsToLoad === 0 ) {\n\t\t\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Load synchronous scripts\n\t\t\t\tscripts.forEach( s => {\n\t\t\t\t\tif( typeof s.id === 'string' ) {\n\t\t\t\t\t\tthis.registerPlugin( s );\n\t\t\t\t\t\tscriptLoadedCallback( s );\n\t\t\t\t\t}\n\t\t\t\t\telse if( typeof s.src === 'string' ) {\n\t\t\t\t\t\tloadScript( s.src, () => scriptLoadedCallback(s) );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.warn( 'Unrecognized plugin format', s );\n\t\t\t\t\t\tscriptLoadedCallback();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Initializes our plugins and waits for them to be ready\n\t * before proceeding.\n\t */\n\tinitPlugins() {\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet pluginValues = Object.values( this.registeredPlugins );\n\t\t\tlet pluginsToInitialize = pluginValues.length;\n\n\t\t\t// If there are no plugins, skip this step\n\t\t\tif( pluginsToInitialize === 0 ) {\n\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t}\n\t\t\t// ... otherwise initialize plugins\n\t\t\telse {\n\n\t\t\t\tlet initNextPlugin;\n\n\t\t\t\tlet afterPlugInitialized = () => {\n\t\t\t\t\tif( --pluginsToInitialize === 0 ) {\n\t\t\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tinitNextPlugin();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet i = 0;\n\n\t\t\t\t// Initialize plugins serially\n\t\t\t\tinitNextPlugin = () => {\n\n\t\t\t\t\tlet plugin = pluginValues[i++];\n\n\t\t\t\t\t// If the plugin has an 'init' method, invoke it\n\t\t\t\t\tif( typeof plugin.init === 'function' ) {\n\t\t\t\t\t\tlet promise = plugin.init( this.Reveal );\n\n\t\t\t\t\t\t// If the plugin returned a Promise, wait for it\n\t\t\t\t\t\tif( promise && typeof promise.then === 'function' ) {\n\t\t\t\t\t\t\tpromise.then( afterPlugInitialized );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tafterPlugInitialized();\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\tafterPlugInitialized();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tinitNextPlugin();\n\n\t\t\t}\n\n\t\t} )\n\n\t}\n\n\t/**\n\t * Loads all async reveal.js dependencies.\n\t */\n\tloadAsync() {\n\n\t\tthis.state = 'loaded';\n\n\t\tif( this.asyncDependencies.length ) {\n\t\t\tthis.asyncDependencies.forEach( s => {\n\t\t\t\tloadScript( s.src, s.callback );\n\t\t\t} );\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n\t/**\n\t * Registers a new plugin with this reveal.js instance.\n\t *\n\t * reveal.js waits for all regisered plugins to initialize\n\t * before considering itself ready, as long as the plugin\n\t * is registered before calling `Reveal.initialize()`.\n\t */\n\tregisterPlugin( plugin ) {\n\n\t\t// Backwards compatibility to make reveal.js ~3.9.0\n\t\t// plugins work with reveal.js 4.0.0\n\t\tif( arguments.length === 2 && typeof arguments[0] === 'string' ) {\n\t\t\tplugin = arguments[1];\n\t\t\tplugin.id = arguments[0];\n\t\t}\n\t\t// Plugin can optionally be a function which we call\n\t\t// to create an instance of the plugin\n\t\telse if( typeof plugin === 'function' ) {\n\t\t\tplugin = plugin();\n\t\t}\n\n\t\tlet id = plugin.id;\n\n\t\tif( typeof id !== 'string' ) {\n\t\t\tconsole.warn( 'Unrecognized plugin format; can\\'t find plugin.id', plugin );\n\t\t}\n\t\telse if( this.registeredPlugins[id] === undefined ) {\n\t\t\tthis.registeredPlugins[id] = plugin;\n\n\t\t\t// If a plugin is registered after reveal.js is loaded,\n\t\t\t// initialize it right away\n\t\t\tif( this.state === 'loaded' && typeof plugin.init === 'function' ) {\n\t\t\t\tplugin.init( this.Reveal );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.warn( 'reveal.js: \"'+ id +'\" plugin has already been registered' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if a specific plugin has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\thasPlugin( id ) {\n\n\t\treturn !!this.registeredPlugins[id];\n\n\t}\n\n\t/**\n\t * Returns the specific plugin instance, if a plugin\n\t * with the given ID has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\tgetPlugin( id ) {\n\n\t\treturn this.registeredPlugins[id];\n\n\t}\n\n\tgetRegisteredPlugins() {\n\n\t\treturn this.registeredPlugins;\n\n\t}\n\n\tdestroy() {\n\n\t\tObject.values( this.registeredPlugins ).forEach( plugin => {\n\t\t\tif( typeof plugin.destroy === 'function' ) {\n\t\t\t\tplugin.destroy();\n\t\t\t}\n\t\t} );\n\n\t\tthis.registeredPlugins = {};\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n}\n","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { queryAll, createStyleSheet } from '../utils/util.js'\n\n/**\n * Setups up our presentation for printing/exporting to PDF.\n */\nexport default class Print {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Configures the presentation for printing to a static\n\t * PDF.\n\t */\n\tasync setupPDF() {\n\n\t\tconst config = this.Reveal.getConfig();\n\t\tconst slides = queryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR )\n\n\t\t// Compute slide numbers now, before we start duplicating slides\n\t\tconst doingSlideNumbers = config.slideNumber && /all|print/i.test( config.showSlideNumber );\n\n\t\tconst slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );\n\n\t\t// Dimensions of the PDF pages\n\t\tconst pageWidth = Math.floor( slideSize.width * ( 1 + config.margin ) ),\n\t\t\tpageHeight = Math.floor( slideSize.height * ( 1 + config.margin ) );\n\n\t\t// Dimensions of slides within the pages\n\t\tconst slideWidth = slideSize.width,\n\t\t\tslideHeight = slideSize.height;\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\t// Let the browser know what page size we want to print\n\t\tcreateStyleSheet( '@page{size:'+ pageWidth +'px '+ pageHeight +'px; margin: 0px;}' );\n\n\t\t// Limit the size of certain elements to the dimensions of the slide\n\t\tcreateStyleSheet( '.reveal section>img, .reveal section>video, .reveal section>iframe{max-width: '+ slideWidth +'px; max-height:'+ slideHeight +'px}' );\n\n\t\tdocument.documentElement.classList.add( 'print-pdf' );\n\t\tdocument.body.style.width = pageWidth + 'px';\n\t\tdocument.body.style.height = pageHeight + 'px';\n\n\t\tconst viewportElement = document.querySelector( '.reveal-viewport' );\n\t\tlet presentationBackground;\n\t\tif( viewportElement ) {\n\t\t\tconst viewportStyles = window.getComputedStyle( viewportElement );\n\t\t\tif( viewportStyles && viewportStyles.background ) {\n\t\t\t\tpresentationBackground = viewportStyles.background;\n\t\t\t}\n\t\t}\n\n\t\t// Make sure stretch elements fit on slide\n\t\tawait new Promise( requestAnimationFrame );\n\t\tthis.Reveal.layoutSlideContents( slideWidth, slideHeight );\n\n\t\t// Batch scrollHeight access to prevent layout thrashing\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tconst slideScrollHeights = slides.map( slide => slide.scrollHeight );\n\n\t\tconst pages = [];\n\t\tconst pageContainer = slides[0].parentNode;\n\n\t\t// Slide and slide background layout\n\t\tslides.forEach( function( slide, index ) {\n\n\t\t\t// Vertical stacks are not centred since their section\n\t\t\t// children will be\n\t\t\tif( slide.classList.contains( 'stack' ) === false ) {\n\t\t\t\t// Center the slide inside of the page, giving the slide some margin\n\t\t\t\tlet left = ( pageWidth - slideWidth ) / 2;\n\t\t\t\tlet top = ( pageHeight - slideHeight ) / 2;\n\n\t\t\t\tconst contentHeight = slideScrollHeights[ index ];\n\t\t\t\tlet numberOfPages = Math.max( Math.ceil( contentHeight / pageHeight ), 1 );\n\n\t\t\t\t// Adhere to configured pages per slide limit\n\t\t\t\tnumberOfPages = Math.min( numberOfPages, config.pdfMaxPagesPerSlide );\n\n\t\t\t\t// Center slides vertically\n\t\t\t\tif( numberOfPages === 1 && config.center || slide.classList.contains( 'center' ) ) {\n\t\t\t\t\ttop = Math.max( ( pageHeight - contentHeight ) / 2, 0 );\n\t\t\t\t}\n\n\t\t\t\t// Wrap the slide in a page element and hide its overflow\n\t\t\t\t// so that no page ever flows onto another\n\t\t\t\tconst page = document.createElement( 'div' );\n\t\t\t\tpages.push( page );\n\n\t\t\t\tpage.className = 'pdf-page';\n\t\t\t\tpage.style.height = ( ( pageHeight + config.pdfPageHeightOffset ) * numberOfPages ) + 'px';\n\n\t\t\t\t// Copy the presentation-wide background to each individual\n\t\t\t\t// page when printing\n\t\t\t\tif( presentationBackground ) {\n\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t}\n\n\t\t\t\tpage.appendChild( slide );\n\n\t\t\t\t// Position the slide inside of the page\n\t\t\t\tslide.style.left = left + 'px';\n\t\t\t\tslide.style.top = top + 'px';\n\t\t\t\tslide.style.width = slideWidth + 'px';\n\n\t\t\t\t// Re-run the slide layout so that r-fit-text is applied based on\n\t\t\t\t// the printed slide size\n\t\t\t\tthis.Reveal.slideContent.layout( slide )\n\n\t\t\t\tif( slide.slideBackgroundElement ) {\n\t\t\t\t\tpage.insertBefore( slide.slideBackgroundElement, slide );\n\t\t\t\t}\n\n\t\t\t\t// Inject notes if `showNotes` is enabled\n\t\t\t\tif( config.showNotes ) {\n\n\t\t\t\t\t// Are there notes for this slide?\n\t\t\t\t\tconst notes = this.Reveal.getSlideNotes( slide );\n\t\t\t\t\tif( notes ) {\n\n\t\t\t\t\t\tconst notesSpacing = 8;\n\t\t\t\t\t\tconst notesLayout = typeof config.showNotes === 'string' ? config.showNotes : 'inline';\n\t\t\t\t\t\tconst notesElement = document.createElement( 'div' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes-pdf' );\n\t\t\t\t\t\tnotesElement.setAttribute( 'data-layout', notesLayout );\n\t\t\t\t\t\tnotesElement.innerHTML = notes;\n\n\t\t\t\t\t\tif( notesLayout === 'separate-page' ) {\n\t\t\t\t\t\t\tpages.push( notesElement );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tnotesElement.style.left = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.bottom = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.width = ( pageWidth - notesSpacing*2 ) + 'px';\n\t\t\t\t\t\t\tpage.appendChild( notesElement );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Inject slide numbers if `slideNumbers` are enabled\n\t\t\t\tif( doingSlideNumbers ) {\n\t\t\t\t\tconst slideNumber = index + 1;\n\t\t\t\t\tconst numberElement = document.createElement( 'div' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number-pdf' );\n\t\t\t\t\tnumberElement.innerHTML = slideNumber;\n\t\t\t\t\tpage.appendChild( numberElement );\n\t\t\t\t}\n\n\t\t\t\t// Copy page and show fragments one after another\n\t\t\t\tif( config.pdfSeparateFragments ) {\n\n\t\t\t\t\t// Each fragment 'group' is an array containing one or more\n\t\t\t\t\t// fragments. Multiple fragments that appear at the same time\n\t\t\t\t\t// are part of the same group.\n\t\t\t\t\tconst fragmentGroups = this.Reveal.fragments.sort( page.querySelectorAll( '.fragment' ), true );\n\n\t\t\t\t\tlet previousFragmentStep;\n\n\t\t\t\t\tfragmentGroups.forEach( function( fragments ) {\n\n\t\t\t\t\t\t// Remove 'current-fragment' from the previous group\n\t\t\t\t\t\tif( previousFragmentStep ) {\n\t\t\t\t\t\t\tpreviousFragmentStep.forEach( function( fragment ) {\n\t\t\t\t\t\t\t\tfragment.classList.remove( 'current-fragment' );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Show the fragments for the current index\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.add( 'visible', 'current-fragment' );\n\t\t\t\t\t\t}, this );\n\n\t\t\t\t\t\t// Create a separate page for the current fragment state\n\t\t\t\t\t\tconst clonedPage = page.cloneNode( true );\n\t\t\t\t\t\tpages.push( clonedPage );\n\n\t\t\t\t\t\tpreviousFragmentStep = fragments;\n\n\t\t\t\t\t}, this );\n\n\t\t\t\t\t// Reset the first/original page so that all fragments are hidden\n\t\t\t\t\tfragmentGroups.forEach( function( fragments ) {\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.remove( 'visible', 'current-fragment' );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\t\t\t\t// Show all fragments\n\t\t\t\telse {\n\t\t\t\t\tqueryAll( page, '.fragment:not(.fade-out)' ).forEach( function( fragment ) {\n\t\t\t\t\t\tfragment.classList.add( 'visible' );\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tpages.forEach( page => pageContainer.appendChild( page ) );\n\n\t\t// Notify subscribers that the PDF layout is good to go\n\t\tthis.Reveal.dispatchEvent({ type: 'pdf-ready' });\n\n\t}\n\n\t/**\n\t * Checks if this instance is being used to print a PDF.\n\t */\n\tisPrintingPDF() {\n\n\t\treturn ( /print-pdf/gi ).test( window.location.search );\n\n\t}\n\n}\n","import { isAndroid } from '../utils/device.js'\nimport { matches } from '../utils/util.js'\n\nconst SWIPE_THRESHOLD = 40;\n\n/**\n * Controls all touch interactions and navigations for\n * a presentation.\n */\nexport default class Touch {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Holds information about the currently ongoing touch interaction\n\t\tthis.touchStartX = 0;\n\t\tthis.touchStartY = 0;\n\t\tthis.touchStartCount = 0;\n\t\tthis.touchCaptured = false;\n\n\t\tthis.onPointerDown = this.onPointerDown.bind( this );\n\t\tthis.onPointerMove = this.onPointerMove.bind( this );\n\t\tthis.onPointerUp = this.onPointerUp.bind( this );\n\t\tthis.onTouchStart = this.onTouchStart.bind( this );\n\t\tthis.onTouchMove = this.onTouchMove.bind( this );\n\t\tthis.onTouchEnd = this.onTouchEnd.bind( this );\n\n\t}\n\n\t/**\n\t *\n\t */\n\tbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\tif( 'onpointerdown' in window ) {\n\t\t\t// Use W3C pointer events\n\t\t\trevealElement.addEventListener( 'pointerdown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'pointermove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'pointerup', this.onPointerUp, false );\n\t\t}\n\t\telse if( window.navigator.msPointerEnabled ) {\n\t\t\t// IE 10 uses prefixed version of pointer events\n\t\t\trevealElement.addEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'MSPointerUp', this.onPointerUp, false );\n\t\t}\n\t\telse {\n\t\t\t// Fall back to touch events\n\t\t\trevealElement.addEventListener( 'touchstart', this.onTouchStart, false );\n\t\t\trevealElement.addEventListener( 'touchmove', this.onTouchMove, false );\n\t\t\trevealElement.addEventListener( 'touchend', this.onTouchEnd, false );\n\t\t}\n\n\t}\n\n\t/**\n\t *\n\t */\n\tunbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\trevealElement.removeEventListener( 'pointerdown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'pointermove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'pointerup', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'MSPointerUp', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'touchstart', this.onTouchStart, false );\n\t\trevealElement.removeEventListener( 'touchmove', this.onTouchMove, false );\n\t\trevealElement.removeEventListener( 'touchend', this.onTouchEnd, false );\n\n\t}\n\n\t/**\n\t * Checks if the target element prevents the triggering of\n\t * swipe navigation.\n\t */\n\tisSwipePrevented( target ) {\n\n\t\t// Prevent accidental swipes when scrubbing timelines\n\t\tif( matches( target, 'video, audio' ) ) return true;\n\n\t\twhile( target && typeof target.hasAttribute === 'function' ) {\n\t\t\tif( target.hasAttribute( 'data-prevent-swipe' ) ) return true;\n\t\t\ttarget = target.parentNode;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchstart' event, enables support for\n\t * swipe and pinch gestures.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchStart( event ) {\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tthis.touchStartX = event.touches[0].clientX;\n\t\tthis.touchStartY = event.touches[0].clientY;\n\t\tthis.touchStartCount = event.touches.length;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchmove' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchMove( event ) {\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// Each touch should only trigger one action\n\t\tif( !this.touchCaptured ) {\n\t\t\tthis.Reveal.onUserInput( event );\n\n\t\t\tlet currentX = event.touches[0].clientX;\n\t\t\tlet currentY = event.touches[0].clientY;\n\n\t\t\t// There was only one touch point, look for a swipe\n\t\t\tif( event.touches.length === 1 && this.touchStartCount !== 2 ) {\n\n\t\t\t\tlet availableRoutes = this.Reveal.availableRoutes({ includeFragments: true });\n\n\t\t\t\tlet deltaX = currentX - this.touchStartX,\n\t\t\t\t\tdeltaY = currentY - this.touchStartY;\n\n\t\t\t\tif( deltaX > SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.prev();\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\tthis.Reveal.left();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaX < -SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.next();\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\tthis.Reveal.right();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY > SWIPE_THRESHOLD && availableRoutes.up ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.up();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY < -SWIPE_THRESHOLD && availableRoutes.down ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.down();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If we're embedded, only block touch events if they have\n\t\t\t\t// triggered an action\n\t\t\t\tif( config.embedded ) {\n\t\t\t\t\tif( this.touchCaptured || this.Reveal.isVerticalSlide() ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Not embedded? Block them all to avoid needless tossing\n\t\t\t\t// around of the viewport in iOS\n\t\t\t\telse {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\t// There's a bug with swiping on some Android devices unless\n\t\t// the default action is always prevented\n\t\telse if( isAndroid ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the 'touchend' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchEnd( event ) {\n\n\t\tthis.touchCaptured = false;\n\n\t}\n\n\t/**\n\t * Convert pointer down to touch start.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerDown( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchStart( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer move to touch move.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerMove( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchMove( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer up to touch end.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerUp( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchEnd( event );\n\t\t}\n\n\t}\n\n}","import { closest } from '../utils/util.js'\n\n/**\n * Manages focus when a presentation is embedded. This\n * helps us only capture keyboard from the presentation\n * a user is currently interacting with in a page where\n * multiple presentations are embedded.\n */\n\nconst STATE_FOCUS = 'focus';\nconst STATE_BLUR = 'blur';\n\nexport default class Focus {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onRevealPointerDown = this.onRevealPointerDown.bind( this );\n\t\tthis.onDocumentPointerDown = this.onDocumentPointerDown.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.embedded ) {\n\t\t\tthis.blur();\n\t\t}\n\t\telse {\n\t\t\tthis.focus();\n\t\t\tthis.unbind();\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().embedded ) {\n\t\t\tthis.Reveal.getRevealElement().addEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tthis.Reveal.getRevealElement().removeEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\n\t}\n\n\tfocus() {\n\n\t\tif( this.state !== STATE_FOCUS ) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'focused' );\n\t\t\tdocument.addEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_FOCUS;\n\n\t}\n\n\tblur() {\n\n\t\tif( this.state !== STATE_BLUR ) {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\t\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_BLUR;\n\n\t}\n\n\tisFocused() {\n\n\t\treturn this.state === STATE_FOCUS;\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\n\t}\n\n\tonRevealPointerDown( event ) {\n\n\t\tthis.focus();\n\n\t}\n\n\tonDocumentPointerDown( event ) {\n\n\t\tlet revealElement = closest( event.target, '.reveal' );\n\t\tif( !revealElement || revealElement !== this.Reveal.getRevealElement() ) {\n\t\t\tthis.blur();\n\t\t}\n\n\t}\n\n}","/**\n * Handles the showing and \n */\nexport default class Notes {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'speaker-notes';\n\t\tthis.element.setAttribute( 'data-prevent-swipe', '' );\n\t\tthis.element.setAttribute( 'tabindex', '0' );\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.showNotes ) {\n\t\t\tthis.element.setAttribute( 'data-layout', typeof config.showNotes === 'string' ? config.showNotes : 'inline' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Pick up notes from the current slide and display them\n\t * to the viewer.\n\t *\n\t * @see {@link config.showNotes}\n\t */\n\tupdate() {\n\n\t\tif( this.Reveal.getConfig().showNotes && this.element && this.Reveal.getCurrentSlide() && !this.Reveal.print.isPrintingPDF() ) {\n\n\t\t\tthis.element.innerHTML = this.getSlideNotes() || 'No notes on this slide.';\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the visibility of the speaker notes sidebar that\n\t * is used to share annotated slides. The notes sidebar is\n\t * only visible if showNotes is true and there are notes on\n\t * one or more slides in the deck.\n\t */\n\tupdateVisibility() {\n\n\t\tif( this.Reveal.getConfig().showNotes && this.hasNotes() && !this.Reveal.print.isPrintingPDF() ) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'show-notes' );\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'show-notes' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if there are speaker notes for ANY slide in the\n\t * presentation.\n\t */\n\thasNotes() {\n\n\t\treturn this.Reveal.getSlidesElement().querySelectorAll( '[data-notes], aside.notes' ).length > 0;\n\n\t}\n\n\t/**\n\t * Checks if this presentation is running inside of the\n\t * speaker notes window.\n\t *\n\t * @return {boolean}\n\t */\n\tisSpeakerNotesWindow() {\n\n\t\treturn !!window.location.search.match( /receiver/gi );\n\n\t}\n\n\t/**\n\t * Retrieves the speaker notes from a slide. Notes can be\n\t * defined in two ways:\n\t * 1. As a data-notes attribute on the slide
\n\t * 2. As an