diff options
author | Hakim El Hattab <hakim.elhattab@gmail.com> | 2011-06-07 21:10:59 +0200 |
---|---|---|
committer | Hakim El Hattab <hakim.elhattab@gmail.com> | 2011-06-07 21:10:59 +0200 |
commit | fdd6b36f01b34cdf8c978ce2144784baf995fc57 (patch) | |
tree | ce53dc64b56ab4b0fe6526c4aaffa736e86a0bf3 | |
download | fosdem-2018-presentation-fdd6b36f01b34cdf8c978ce2144784baf995fc57.tar fosdem-2018-presentation-fdd6b36f01b34cdf8c978ce2144784baf995fc57.tar.gz |
initial commit
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | LICENSE | 19 | ||||
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | assets/fonts/leaguegothic/league_gothic-webfont.ttf | bin | 0 -> 42324 bytes | |||
-rw-r--r-- | assets/images/breakdom.jpg | bin | 0 -> 56714 bytes | |||
-rw-r--r-- | css/main.css | 218 | ||||
-rw-r--r-- | css/reset.css | 57 | ||||
-rw-r--r-- | index.html | 151 | ||||
-rw-r--r-- | js/slideshow.js | 282 |
9 files changed, 732 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dec0ea4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +.svn +log/*.log +tmp/** @@ -0,0 +1,19 @@ +Copyright (C) 2011 Hakim El Hattab, http://hakim.se + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.
\ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..923ddb8 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# CSS 3D Slideshow diff --git a/assets/fonts/leaguegothic/league_gothic-webfont.ttf b/assets/fonts/leaguegothic/league_gothic-webfont.ttf Binary files differnew file mode 100644 index 0000000..29f896a --- /dev/null +++ b/assets/fonts/leaguegothic/league_gothic-webfont.ttf diff --git a/assets/images/breakdom.jpg b/assets/images/breakdom.jpg Binary files differnew file mode 100644 index 0000000..64dc3f3 --- /dev/null +++ b/assets/images/breakdom.jpg diff --git a/css/main.css b/css/main.css new file mode 100644 index 0000000..494cfc2 --- /dev/null +++ b/css/main.css @@ -0,0 +1,218 @@ +/** + * @author Hakim El Hattab + */ + + +/********************************************* + * FONT-FACE DEFINITIONS + *********************************************/ + +@font-face { + font-family: 'League Gothic'; + src: url('../assets/fonts/leaguegothic/league_gothic-webfont.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + + +/********************************************* + * GLOBAL STYLES + *********************************************/ + +html, body { + padding: 0; + margin: 0; + overflow: hidden; + + font-family: 'Crimson Text', Times, 'Times New Roman', serif; + font-size: 36px; + + background: #fff; + color: #222; + + width: 100%; + height: 100%; + + background-image: -webkit-gradient( + radial, + 50% 50%, 0, + 50% 50%, 1000, + from(rgba(245,245,245,1.0)), + to(rgba(100,100,100,1.0)) + ); + + background-image: -moz-radial-gradient( + 50% 50% 90deg, + rgba(245,245,245,1.0) 0%, + rgba(100,100,100,1.0) 100% + ); + +} + + +/********************************************* + * HEADERS + *********************************************/ +h1, h2, h3, h4 { + margin: 0 0 20px 0; + font-family: 'League Gothic', Arial, Helvetica, sans-serif; + line-height: 0.9em; + letter-spacing: 0.02em; + text-transform: uppercase; + color: #222; + text-shadow: 0px 0px 2px #fff, 0px 0px 4px #bbb; +} + +h1 { font-size: 136px; } +h2 { font-size: 76px; } +h3 { font-size: 56px; } +h4 { font-size: 36px; } + +h1.inverted, +h2.inverted, +h3.inverted, +h4.inverted { + color: #fff; + text-shadow: 0px 0px 2px #fff, 0px 0px 2px #888; +} + + +/********************************************* + * SLIDES + *********************************************/ +#main { + position: absolute; + width: 800px; + height: 600px; + + left: 50%; + top: 50%; + margin-left: -400px; + margin-top: -320px; + + text-align: center; + + -webkit-perspective: 600px; + -webkit-perspective-origin: 50% 25%; +} + +#main>section, +#main>section>section { + display: none; + + position: absolute; + width: 100%; + min-height: 600px; + + -webkit-transform-style: preserve-3d; + + -webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); +} + +#main section.past { + display: block; + opacity: 0; + + -webkit-transform: translate3d(-100%, 0, 0) + rotateY(-90deg) + translate3d(-100%, 0, 0); +} + +#main section.present { + display: block; +} + +#main section.future { + display: block; + opacity: 0; + + -webkit-transform: translate3d(100%, 0, 0) + rotateY(90deg) + translate3d(100%, 0, 0); +} + +#main section>section.past { + display: block; + opacity: 0; + + -webkit-transform: translate3d(0, -50%, 0) + rotateX(70deg) + translate3d(0, -50%, 0); +} +#main section>section.future { + display: block; + opacity: 0; + + -webkit-transform: translate3d(0, 50%, 0) + rotateX(-70deg) + translate3d(0, 50%, 0); +} + + +/********************************************* + * DEFAULT ELEMENT STYLES + *********************************************/ + +#main>section { + line-height: 1.2em; + text-shadow: 0px 0px 2px #fff, 0px 0px 4px #bbb; + font-weight: 600; +} + +ol { + list-style: decimal; + list-style-position: inside; +} + +li, p { + margin-bottom: 10px; +} + +a:not(.image) { + color: #1b6263; + text-decoration: none; + border-bottom: 1px dashed rgba(0,0,0,0.3); + padding: 1px 3px; +} + + a:not(.image):hover { + color: #fff; + background: #2fa794; + text-shadow: none; + border: none; + } + +img { + margin: 30px 0 0 0; + background: rgba(255,255,255,0.12); + border: 4px solid #eee; + + -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + + -webkit-transition: all .11s linear; + -moz-transition: all .11s linear; + -o-transition: all .11s linear; + transition: all .11s linear; +} + + a.image:hover img { + background: rgba(255,255,255,0.2); + + -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.25); + box-shadow: 0 0 20px rgba(0, 0, 0, 0.25); + } + + + + + + + + + diff --git a/css/reset.css b/css/reset.css new file mode 100644 index 0000000..68f227a --- /dev/null +++ b/css/reset.css @@ -0,0 +1,57 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + 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, +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, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + + +/* HTML5BP: + These selection declarations have to be separate. + No text-shadow: twitter.com/miketaylr/status/12228805301 + Also: hot pink. */ +::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; } +::selection { background:#FF5E99; color:#fff; text-shadow: none; } + diff --git a/index.html b/index.html new file mode 100644 index 0000000..5c71250 --- /dev/null +++ b/index.html @@ -0,0 +1,151 @@ +<!doctype html> +<html lang="en"> + + <head> + <meta charset="utf-8"> + + <title>CSS 3D Slideshow</title> + + <link href='http://fonts.googleapis.com/css?family=Crimson+Text:regular,600,bold' rel='stylesheet' type='text/css'> + + <link rel="stylesheet" href="css/reset.css"> + <link rel="stylesheet" href="css/main.css"> + </head> + + <body> + + <!-- Any section element inside of this container is displayed as a slide --> + <div id="main"> + + <section> + <h1>Slideshow</h1> + <h3 class="inverted">With 3D effects. And stuff.</h3> + <script> + // Delicously hacky. Look away. + var message = navigator.userAgent.match( /(iPhone|iPad|iPod|Android)/i ) ? 'Tap to navigate' : 'Navigate via keyboard'; + document.write( '<p style="color: rgba(0,0,0,0.1); text-shadow: none;">('+message+')</p>' ); + </script> + </section> + + <section> + <h2>Heads Up</h2> + <p> + This requires a browser with support for CSS3 3D transforms, such as Mobile Safari. + </p> + </section> + + <!-- Example of nested vertical slides --> + <section> + <section> + <h2>Vertical Slides</h2> + <p> + Slides can be nested inside of other slides,<br/> + try pressing <a href="#/2/1">down</a>. + </p> + <a href="#/2/1" class="image"> + <img src="data:image/png;base64,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"> + </a> + </section> + <section> + <h2>Basement Level 1</h2> + <p>Press down or up to navigate.</p> + </section> + <section> + <h2>Basement Level 2</h2> + <p>This is totally the Google logo:</p> + <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWwAAAB+CAIAAACPlLzKAAAACXBIWXMAAC4jAAAuIwF4pT92AABmE0lEQVR42u29d5wlV3Unfs69VfXy69c5h+lJyhlJIBBgwAQD9hKMcc72OoFt7LX3t7bxrtPa68CusbFxAIwxJiNAgISEJFBAOUtIM6NJPdO5X66qe+855/fHfd0zGqVJPUp9PqOWNDP9um7Vre898ftFEYEN27ANO9lWd42vLF41a+dJmIRYhIUZQABYRIRZ2LKNOUlt4lIzszSTo+i3L/zNSwcvfH6tNNh42Bu2YSfXWtT+xtI3v7z89UW7wsKpOMvWsiNmEiYQFrHsYpfUXLXZrrmVRBYNJPjbl7xvAHvTNA3DUCm1ASJHawLALCLAT3CJFAIiKIW4sTE37PlgS2bpq8tXf2HpyzWqKwlCCBG1RsUYkBIBYAJEFqaEkhW72KhXeS6VfeaVvZf/3mX/LdJRvNBq6mZXV9cGiDylLTd43yIt1mmlwQt1XqxTvSXNmFPLiAgAwgIICkFAQCATYSGLxSz2lnRfl64UsLuoByp6pDfIhBvYsmHPFbujdudnFz731eWrWtR2RCKoUOeCfCkoRyqnUDMLMRGwY2pRe8ksNKtVmTGyJ90ebv+ZwR9bml+qVCqVSkVr/TxCkFMEIrMrdP9et2vW7V9wu+ecJWACIgAWxyKCwoIgAgAIwAIIiAAoCkFrBBClUKH14IKICqWUV6M9aqQ3mB4Ot49FQz0bcdmGPTvWpvbnZz//qYOfvmfl/oqr9JqKMc6RA6VMNt1T2l2MunIqj6iJyQmlbGpptbVSl/2pzFisyk9d9KOIODAwMD4+3tPTk8/nn18gguuXWN1x0N23296+y84skjFiLbATY4UJiFhIgJlZWAREEABWLwUBAAERQaFCVBqVBq1AB6gD0Aq0BsBDV65A+iv69PHwgq3ZbWNRV0Fv7OwNO2Vm2MzFc0VbXF5anpubW1lZabVaSZIQEQC8t+t3g2ImG+S1CpnZsk0oNbWYDxiZsbxip8qb/+D83x0fH9+2bVt/f38Yhs+7O3DyD/ClOt+2w9zyiN09R9aKSdlYIMPWChOzJSaPyATMgCLMKCIgAAKCHQgBBFSAHkJQaa20UgpVqLTGMIQgRK1Ba//3YXaZ9i/SVXe0owAv3hadvyV7yRn5XEZtbPENW28LMezX/cu15UajYYyJoiiTyaz9qV5WbCnFVDMTO0vWpQ7qDFWWtgjLptJkqVQaHR3t6+t7PiLISQaRvQt0zX3pzd+1iRFnJE3FJGJTctaxdWScOCtiNbpypt1daVfycT4yYegixQCiFDADgzJWWQoaSabayq608s0k50AhBkprDDQqrQIVhDoMMQghjFAHiACBAka0Tm64L7n+3qR8ZfUlp2W/9yWl7ROZjY2+YetqSqlCoTAyMjI0NISr1vmzm5QKtEatAAkARJAACIABQABxrDhaLpe7urqepwhy0kBk9zxddU965y6bGLGpxLGkMZuE2FpKUrJG2PQUG0N99bGeeiXfzkWktQ7DMAgCrTVicPh9FxERYm4S1Zxz1Zaaq2b2L5VnV8qNVhZVoMLA6cDoQAcqiFQUQRgppUFpVAigAAXqbf76ba2vfad11qbw+19eftnZxY29vmHrkhFA9Du5XC7jEwqJKqu0DgMVCCCyAkAQABFBAQWosJLpyufzmUwGn7dFyBMFkeUGf/3u9FvftakRa6Td5HZbTOzEpi5JKE0jnWwbmp/srw2UW0EQRFGUyZQzmUwul8vlctls9jAo6dxEZiYi51yapkmSJEkyGcfnprUkXdg1m915sLzzYA+DDqKQg8Ca0IQ6CCXKYBSh1ugzJVojixDDPY+kdzw4f9rkyg+9rvLyc0sbm37D1gNHngoCdBBqDBRoXzfwAAKd5B8CogaVzWaD4HlcGTihS7/+AfP525I4BWs4TqDZoLTFlKaUxCZu58L2hVtmN/UtF3KYyWTy+b5SqVQul0ulUqFQOBw+lFJHeCLMvAYlxpgkSZrNZr1eHxxonLWpPru0ct/u4r27+ynVOgzFhWRCZwIbYZTBIAClUbiTZgEBYbjn4fTuBw68/PzMr7xrcGwwt7HvN+wUGDNrDBQoRDyEHR0XpZPOQ4XPr9aykwYii3X+9M3xvfuInKSpNBvSapKLLSUtG8fskvM2HThjdDGfxXy+0NXV1d3d3dPTUy6X8/l8FEX+rh2l/yYiRGSMMca02+1qtTq0vDwxvHz2pj03P1TeMdOtyaogAM6QDZwLokgFoSAKMzgCZ8UZQiFhd/13km/fvvLL7x74oTeM4EYL24atf67EVwuebFv7MuQzODIvWBC5c5f9+Lfi2AJZabe53pC4QRS3PYIMV5YvPe1AT9Hl8/nu7u6BgYG+vr5yuZzL5Y4PcRExCIIgCPL5fLlc7unpGRwcrFarAwMLE0Pz9+3c9827+xpJTjOpIHQckQmCjFYKQICIyRA7y2SFnJAzhv/yw3s+feXBv/xvp20a20iUbNipMFn79UKcVTtmELni9vTq+1JhYCeNptRrnDYdJ03TargkufT0mbMmVqIo6u4eGBoaGhwc7O7uzuVyJyvkU0pls9lMJlMqlXp6evr6+np6ZreMLXz11tyDe7oDFggYObQcQKf/lcRaJkNkxTl2DoDJSr1mqtXlpC94Xie0Nuz5AB9yCEj8oSjAAIAA8uIDEUfyL9cm9+53ImCM1Gtcr5FtGYobaaupuPWml+wd7U1LpfLQ0NDIyEhfX1+xWFyPjBEi+pioUChUKpXu7u6eyoHr7pz/xh0DzKwDQtICCCDCjp1jmzI5ISfsiGR61Lz79TauR7Vapq+vT+uN5rQNW08npPOPHAEoAi8QHDnaNzxO5e++3n5siVEgTaVW4/oK2Vbi2vW02SplGm966Z5KEXp6+sbHx0dHRyuVShRF63rIeyjxbcLlcrlY3D/QPfeZ6/uNFaUcAHjgYGeYrDALk7N02mbzhosbzuWZeWOHb9gpwJBDPocHElmLb+CFASNHBSKNWP7mK+25BqNAknKtxrUVss2Y2tWk0a4UGm+9dG+pEPT3909OTo6MjJRKpVN2vCulfLLW14y7SzMf/Vq53tQIjonYGWEr7ISZSc7ckr7uJe1isTg2NjY1NfX8mpXcsOdvNgRAxP/zQgGOYwORxMhffbm92GQUSA03GlJfIdtoU1xLGq182Pr+l+4pFaLh4eFNmzYNDQ3lcrlT/2YGQdDd3R2GYRRF+eyef/1KZnYOAYyIFXZMzE4uODu9/Jx2qVQaHx+fnp7u7e19/vYIbtjzC0lkzfNYGw+TFw6WqGfE0b++Mp5vMgJYy40G11acbSUU19JmCzj5/pfvKxWikZGRrVu3jo6OPosDiFrrUqk0OTl53tlb3/MuymaJiYRJGETw4nOSV54bl8vlycnJzZs3P3/nFDbs+Ycfq4Nhnd/osFy8cFySZ3jh/+Gq9p4lp0Wsk1ZL6jW2rdS1a6bdIpO++WX7u4s4NDS0efPmoaGhbDb77FY6fGgzNja2ko4a4xOrwA5efmH7snOSrq6uqakp74M8rxsEN+z5Fc+wrIYzh6PGCyikebp36Su3J3fvdRECMbTbXKtR2rSu3XBJy8TpJWcujvXa/v5BH8UcPrn4LBoiWgr+6iPLtProLr+occE2U6lUJicnJycnu7u7NxBkw06hJwKIj4OQw5MjLww0ecrX6bsz7kt3mUABCaSptJqSNJniJiUt0077u5MLt1S7u3unpqaGh4efIwji7fc/uMMYQAFmePXFjXOnbaXS7RGkUqlsIMiGPRvuyFpR5vHY8QIu8SZGPvi1NgKAgHPSakurQRTHlLRsmgjTay+YLRQKY2NjIyMjuVzuudOv9dlr5m+8rb55MixG7dGe2uZhU6lUpqamfC1moyVkw549+JC1ptUXWEDz5CDykW/GiZNIoyVIEmk1yCaO0pYzsU3dudtq/RUYHBwcHR0tlUrPnSopC3QV9F//zrDEe/bvX3aOy+W+iYmJiYmJDQTZsGcpnBFBQFkNYeQwD0ReuJ7IfbvtHY/ZUAGROCOttqRt5qTlTEzGBpou3rZYqfSNjo52d3c/p95MhfDy8wozM9WZFvf19RUKBT9ocyr7VjZsw470RA7rK+NVh+SwZOsLDkRY4F+/GfsyNjEkqcR+uj9ts03I0kWnr5QK2aGhoYGBgedUKmTNCoXC5ORkJpPJZrPZbDaKoo2Osg17NmFEOoSfAk9oeH9BeiJX3p7UYwk0EIEx0o7FJkRpTDZ1xmnN507XK5WBoaGhYrH4HBxd843wfvB3Y7Juw54LnggICIq3w6KYF8zozONBJDFyxW2pz6cygzWSxsImZZuws+z4jOlGVykzMDDwnC2UKqWiKNrYuxv23EERRsE1zDi89f0F2bF65e2JYVAITOKsJIlQSmxScpYdIcrpE/Vyudzf35/P5ze2x4Zt2DNjiDwuM/I4esQXigWHuyFfu9soEWZ0DMaDiLVkDTtHROWiGR/Anp6erq6ujW6LDduwo4eRTiizCh9rkc2p90ek1YS4LXEMAJjLQS6PheJJA5FvP5AmViKNxCJOTMrOMJtUyAo7IZkeaeXz+d7e3g035Ggf2OI8zx2UvXv44AFZWpYkgTiBxAkC5LOQyUC+gAODamJMT0ypoWHMZp+TyyBID0L8GMQ7IN4PdhEoBmp0DlmVgSAPWITcGOS3QGErZMdBbbDYHpYTWf3KhxIhCEf0ra7fBSzN8+6d8ujDsn+GV1ZkpQap6cRXDBJGWCphdzdOjOuzztKbt2JX5fhB5Gv3GABgEWawTowRsk7IMjlhBuTNI3GpNPC8Fsg4FWYN736U77id77yT9x+AxICx4rhz/iBCEAgqEABUoJV4mS4RKBbU2WeEL3tZeN55WHoOsNJTG5r3wfJ1UL0FkhlAB+xAuBPYaw2CgOpJ4uKgLKWX4OAboOti0MUNEOnoSq+2mp2auozUluneO/nbN8jOnWgspBYcAzMACgAoJahAKcCEaw3YMyO332M/c4UopS6+MHrTG8Pzzj9mEHls1s0tcxB4fBLnxFoAdsxOmIUlimSkD7q6up53QqGnzHhmD99+M3/7Btg/B802pAaNZUPgiJ0Ier0iRK1Qawk1BIFEIYQhKA2opNqga29y37ixnYnC170y88bvDbZtf3ZW0noYlq+Gua+BmwdOQBywAyZwBMDAAiCgAUCBVgABQAAYgAoAFCCCqeLilbBwBQRFGXgbDr8dCtuflbd35wG7f4n2ztOuObfSZOtEaUTVKbYqBFklYWcBZHEszKIAmMGRCAMLMImQWCfWCJGwIyARIXKUtCkI5G2v6377a3v7K+FTBTOyytUsaxO8LOuHI7x/N3/7Wrr2m9hoQ5oqayE1nFi2DMwgAIgQaAgCCUOJQghCCAIIUBjBOr7mxvhr18dnbsv8xA9nLn3pMYDIDfenzCyEAkAEzoE4EeuESISYeKQ3LeSzXV1dz83ekGcZPnbvcNddJd++ERttbLelFVMztW3nLFsAQkhLBYchBJKJk6gZa4EAlI4UZkPJRJCJIApBBxIoYYA4sZ/8cvrJL6nveWn+J38k2rrt1K2kcQ/MfQaWbwDXBEiBUkhTlxqXElkhVimWLGWU4iw2srqltOgAdCaEKAQKASPQIYAG1IAApoH7Pwx7P8QDb8Pp92B+06lZxP177J07zJ07zOwyWS/WCoIASgEiqAADJYFGr3aGq50bAtChjiBhBufEOXCWnOsIBhAxOxKyQkSWtKYf/N7i97+qlMuojIqthSfvKvAogo/rEJH1iWVkecF97Qq+7jqot1QcQ7vNjcS0rCFxCO2usilktXWFej1MUy0QhArzGclGksn4HQiIkNGCAnc+FN/y3+I3XF763d/W5fJRgchNDxkfswELERjD5JwPZIQZBEb64lwuVywWN2KZxz226pK78gt8/Q3QaGHcxkbTVeOkbmPAxU1jc1unlocHk0LRZjIQhoiorYmardzy8uCjjw0/9FhhsR1GqSqEkM1IJoNRBFqBQskFYIi+fH39S98MfuJtXb/2y7jetz3dDwc+BkvXgGsCJ8CxxHHSSExL5mH7jDtjkUbbUjZQBFRKKQ1pFmplnB0PHpgI7stl6mEuhDACiUBlQAUgClABRIBGHfxPOPAftOl9asv71q95xzi56SFz1V3xrgOUpEJGrBXy3gUDAqAS1EoHGAQYBBJFykvEBwqURhBhFiFxBERijZiErWVnmR2zs0JWyJG1zHzB9uSV58Y9pcU9j2W7uro8ucThAmxHwgiskog8rlXkZPoidMNV7tOfgloD2zE26rTcThqmXsjPXHTGwanJRleXKRS9TkuQxNmVav/uvRMPPNI9Ww2zKRaNZLOQzUAQACCi4qwW0PKFa6s33pn/4J/mzj73GUDksVnXTAQRgIUFHAkTMJGIYyYv+dff5fL5fDab3YhlDj22W66n//wPaTSh1VbVGtea7eW0Sbj74nP2nHtm3NMbBEEmkylGkZfpCoJARJxz1tr95523p9Xsu/3Ozd+8vbiUhAXCnJOsg0wEgQZA0AryEcTG/v2nF756Q+kvfz937nnrtZKFK2D/P4BtAiUATUhaSa0d1/lResUOuqSNfWEYZnKZYhR5DUOttYhYa1N72oPmZQ+Y6mTrujOTq/LZli5YUAZ0FnQIqEEARIGKgI1+5E9o/utw7od0cctJX8GND6afvSU+uEhxLCYREztKSYEZ7amXskmIxjpppdFyXKq3iqi0DjDI6DDEMAIvnKg1MHs3XJwVa6gnWqob7YBRWVaWwTFwd1d8/vTiQFfKadblKn60olwuh2H45AjiQxkGEGA4vERz0jIjUl9xn/wI33kvxG1sNGC5miy06xA89JqX7TnzTMzmoigqZLPdURRFURAEzGyMWT7ttIOvfuXA7XecfvWNhcW2KhM4hlwGgkBQQCEoBTkNB5dbb/0Z+4//u/iaVz/Vux8AwK3fTYhEa2QAYSAScgJMQuzDOKWgXFTFYnGjj6tjSew+9W98222SJths4tKKXWo2q27vaVPffdVL456+bDbbVyx2dXV1dXUVi8VMJhOGoZ/fsdZ6Fa56vV4dHLrzJReOfeFr47d+N2NIGyvZLOQyGIQACIgQKMhr2TVTe8vPp3/6G+V3/+BJBnFXg30fgJUbwRmgGKRO9WZrMd5tzr6f3hCr/mw+27+6EK9b6McIPBqmadput2u12lJ19JrGK85ofXwivTtTdJhxQBkIIxCv3YEACoJQr9wK33yJveCjwchbTpZLMrPk/vPbyd27TJJIEkvcJNs23fn6WVtmhorzGZ2sqSx6ZcX9K8VH5wZ3zg86E9pI60CFEYYRBCEqBBAgJ8awSaS7r/rq6Z0d8bpV88q7pVLvwMDA4OBgb29voVB4mo4HYRAl4gVn5JAq4+H+yAmF0nt3ug/9rVRrkMa4UoXFamsh2bt5/N7Xv9p2dRfyeS8dVy6XC4VCJpPx98EYE8dxvV5f7uu77ZyztvzH50cf3qt89SgLoH3gpwBQIhQj7R/7LffZD1ReetmTbr8AAB6dcSCCAgJILMzALCC8xgypFFZK6iTKxzy/Q5jlefcPfysH58QZrNVxYSlZaNUbfP8bXrrvoouiKBqoVPr7+/v7+9cU/9akQgHAK4Raa5MkaTQai4tDc4NDrU1Xbfn3a7NOAifgSHJZCANA6DzLjAai+Nf/wuzd3/vbv37Shgnj3bDrD8DMAxFQC7hqq836bHyPfP8ueHkmm1lbSFdXl4ePp1pIvV5fWBh8dG6iXv34GStXZIqscwxAgBFo3VkFIwQhpGl46w+mZ/11uPkXThwQb3rYfOz6dpKKTaXdlLjpXNy+cHLn6YN7A61yuVyhMOixb817Ghxsbx+b3TG7eP0DU41WIcgEZLVNVRCpIACFwCzkgEnu2TsOKnrzRY3D8c6z5/X29npFlKdyQI5wNVbhAg+jAZAT73vnh+5x//JhSRIwqVpa4YWVxnz6yAVnPPj612QymYHubj/jVi6XvWrt4c/OOefVaecHBvYODNK//NvErQ+jQkSETNTJkSOCiGggJbV3/pq6+XPl8cknPrXAONl50HVQUoRJ2Emn0issLCKYj1y5gH4PvdhzqAf2ur/7ALTbwhardZxfihdaKzW6+93fu7j99HKpNDg4ODIy0tvb+1Q7TCmllAqCIJfLlUolLzA6Uy7vqJQ3ffCLWXYhsSKWbBYC3cERRAgBCO1ffHwuTQb+x++cBDRv3ge7/hdwG5iBGsBVs9yoHUy+gz8+r8/tKpWGhoaGh4f7+vry+fwxLGTml+7b33XGykezLGGBQBFABtDXgxEEQCkQFd713sSazPZfOZEd9dmb46vuM0RgUmk0JG4Y02y/9sx7xirVQqHg3/Pu7u5CobB2/USUpmmtVhsYWJgaeOwzNw0fXCkHUcA2IKetVkohoK/IMALd/lAZoPA7P9m3dsO9J3IMco4CLKJRvCb0IX7VE3ZD+JH76Z8+DGTBWbVclaVqYzbZce7WB1//mmKxODQ0ND4+7pvLn7hb/HRIFEWFQsErZO/71V8s/Nn/6XtohnWAgBCEwCwiSMIkNgDX4Jkf+eXw65/O5/NHbIbgsVnXTAABiEUAWIAZhNnHMj4vlM9SFAYbIMIH97kP/KVP4mOtoeaX2kut5RW67x2vWjrtjO5KZWJiYmxsrLu7+yg1d4IgKJVK2Wy2UCjsy+X2pHb8Q1/OIGQoVSSSy4LWoBCUBiBRwBnkv/zMwXxu+Dfec0I40nwAdvwBKAJmcA3gmllpVve37tQ/Mq/P7enp8QupVCrPeNI+2UJ+dueOeHr5P4UgyieQYcAIQAMiCPrKKgCGt/9mW3flt/zY8W2q//hWfP1DRkhMKo06x01rWq3vOf2e8e56T0/v2NjY8PCwd6COyHcyc3d3d19fX2/vfHfX/g9/hWaWylHOsQSEWimNyuctSJi15lvv5Q9+pvqHv7Tt+G64eB9fHp9IlcP8EDm+w2yP+/A/ALCQw2pdllaaC8lsT9f9b36j1zPYtGmT1zN4+sentfbhdi6X2/1b76384u/olhFAcCQMaBw5siLWSZoBe/e+3X//j1t+9ZeOKNGqPXOWxN9cYAYRD0CHDx1iJmKvxvBizqpKdcn937/y2wuaLbW4nK40V5b5sUu2L5x7Xnd39/T09PT0dH9//7FKc4Zh2NPTs2nTpp53vWv+LRcnLYqJXWygFYtxwD6oQUAEBM5j8kcfm/3c54joeBM6+2Dn+zv8ka4FXHONZm1/a6dcdiB4SU9Pj19Ib2/vMcmPeS2xvr6+6elp3vaeudylSdWZlkCagkuBbadDATpQIloFN/1c68BNx6Ei9oVb4useMgrBWWk2OW2TabS3Deyd7K339fVt3rzZM4d7AcYjluCVWHt6eqamprZv3/5LP2BL2dgmjpwRskJWmETWGjkkCOWqb7U/8oWdzrnj2TarTsfqyyRr/92p3BzHZ8Yt97d/A8zit+LSSrKSVNtw3zvekM/nR0dH/T48ysfnH1x/f//kaafP/eRbpe0ksdJOoRVzbIylhCQhiR3Fmpf/5J+W52aP2Htqoep8F2LnSfJqOnUVIVFjoMHXF168w/Ui9kP/D5wDZElStVJzy/VajVYywa43vM4rUXgO1+M7V7XWXV1dExMTuff+cmu828SSElNiIUnEWhCGTrSKgiABNn7+j1d27TweET9OYcfvAlgAAZuANCRp1Q+2643cA9HbPSH+xMREuVw+kYVMTU3VT/vfBvJpi0xbwBlgA0J+zwL4TKsCBvzm25qN+jGpXN+xw3z9PhMikBPPd2PbqeLmSzbt8VSYk5OTz0hk51Mbw8PD27Zt+dm3pr52AsKr7xUgIiqNWqNSYaT+6dP1h3bMHxdwr8pWyROSIMcrwej+7cOQGFACcaJqdVdr1Ws0c+ZEOjw6MDAwNTXV19d3rH5TEAR9fX25t72TC4HEhhJjExtbbjlpO247ioljlCSWx/7+n+M4ftzNXKoRigALAiALC4AIPj5iQwVBELyY3RD7yX+BxSUIUFLjq2itlqs2ZdebXpotFEZGRsbHx8vl8oncIqVUuVweHx83v/8rjsE6MCScOE6tkO9zWPWEA2HGmZ94b7vdPmaR+d1/BrYOosClIE0wjfZi3FowD+d/wB9iJ74QjyPjk5sObH4/ObYxuFh86N55bxAVALKIVtBeTm746SRJjvLD623+528mCOBY4lRaLbGxs+3Wpv7ZUiEzPDw8OjpaLBaP8vqjKBoYGLj0/MmXnxsTrd1i8BCCSisdYhBorQT1H/3jgVardcw3XLBTm/EUGwIdL+d4EYTuulkefAQCFGOx2YaVRqvp6g72vfKScrk8Ojp63IooURT1j462XnauNWyctJ00HTcdNy01iVrMMXOMvPIfX11ZWTncL1NzK9zBRxZfk0G/TuncTI/La3ndF6HRvbfJbXdCqMA6iBNVrae1uNaUWilTPe/8np4enwc58YSR1rpSqYy97LLWm1/CCVgRRyzGgWMQFFSI0NmKEcPd+/d9+J+ttcfwA5a+DrXbAAMQAxwDNakZNxfTli3M5y/p7e0dHR09KdKiWuvu7u7Kth9olC5k46wBTgXIAa22XatVFTilM7u+WNv5taMMFj58VduRAAA5SBNI20xpIi7eMrTc1dXl8yDHdP1hGPb39//E93XlV9WZERFAodYq0Ki1UiEoHUZqz0F99U0zxpjj8UNwTdFbjjuKAQBJE/rkJ0CDEEGSqnrDNuNmW1YGy25soq+vz0fTx/3gcrlccOYZBJg4bllqWtdwrkHUIG4Rt4hipHi+vu+rVx2O+6raZPZNfXJYUVcOBUz+r714A5k0po9/DLQCJjEGmy2uNlsxN9u8cN6WfKEwNDTU09NzsorfQRD09PQU3/tLnEEmcAJMJJaks8EVrm5NDqD1P/9p+eDBo/WxXQ32/R2gBiBgA9IG02pXTbxsZzKXFk72QsIw7Ovra532flDIjp0REQKhzvuDiKozvieC6sZfq9frzxidPbDXPXSANAg5MUaShJ1xbBJhO9gtx01SkclkRoaH3nKZE0FArxSDqBC1QqU7XxEB4N+/2qzVascWRYp37B9Pa3a8dRm6+kvQTgEBrMF2zI1WHFM7lZXTNxWLxYGBgaP3wp5q+4XZrCNOSdrETUcNR03iNnPCnIqkIomR+U9+qdForN0H1Yw7mR7pZFWBfUIZDwGJ4xdvIOO+9GlILSgQ6zz2m1bSMhIDN8/a1tXV1d/fn8udzMn3TCYzMDWVvP1ysEAAxCDOiT9/O9lVAAAOhBPY9+cfOCJAfUrb+3fAKSgAtkApuLZrp+26tQkvFy/o6urq6+s7uQvJZrN9ExfUei4XIiZgC8B0eN4BEIBBNOragdq9/5Km6dN/4L9f3wYQEnAExohJRawla8u5pLscVSqV47t+RCwWi//lVb35nDABwlpVQRA7tSQA1FoOzuM9D80943UemVhdww4+oZkZidt8zTUQKCGC1GK7TbFJLBjh1tbpUqlUqVROtB1UmL50tSGJiduOm8Q+inEixMAEpNC+4nT3mkuq1eqaU6YSI8Cdjlx54mAQIiLGqRaRFyGCyMoif/tGCBCIwDpstbneSmKOU0kyWjZNd3d3F4vFk1v5RsRSqdT1iz8tEYoTBmA/FskMPrkKqzOhgdh/u2ppZuaZY4FkD1SvBwyAHJAFicHGScOaBjkXucJkd3f3SVf/8Fket+03ERFYhARc500ChUqDWq1xMkPm7r98+kP+wb1udoVxtanaGCFD7IywK+bSKIpOZLDLC8J/zwXMvNrJwatbvuMuCQAw8TW31prN5rG8DrLar3qinGZ0y3WSWgEA58AYaCfOOEtAAcrw8IlP2Nu77qy+9YfN3TtjJW3HLaI2syFgQmGQ8V7+oVe59/8i/+hbYfvWNE3Xdp2yDkiEO05IJ3GOfuQB/Z7F2ISpoeOpBTzf3ZCvfhEsAaI4gjSFRsu1TOwgdRL3VbLF4nGffs8YC/RMTtnLz0FC9luQO4XB1Z4tEAFWQBZn/uXj7Xb7GT7xwEcADCCDEHAKHHOamha5NjWy45l8uVKpZNeBEikMw/LIS5LyWcLkuxdBZDW7CodlRlA352vf/cLTZFivuTuxJOTE+ek4I2RJiEQkE0o2m81kMieC5rlc7vteXtbBIVL2x0fwIsIA/PBjXKvVjj4VdehgPuFjmK65GkD8eA+mVox1DljA5bNhpVIqlY7PDZEkSb9xVeOnfr759p9v3fFwC6XpqEnUcmIsSKjkkm32PT9of/tn1atfXhobHRwcHBsbOzzyDZhFBFhAcC35I6tZagRBVBgbnzp5cYGINOt8000QaHAE1kI7gVZsDKUOHLHtq2Sz2fUba87n87kffydfey8KMIBiEdUZ5jq8UMMI5gvXVn/55560MbFjZh5WvgUQADOwBU6BUps4mxIZbhVHfJPYesw0IGKhUFga++H8w7/rZ9GQuXP1PlTwtQsGJlAPf7y+/QeedMgzMXLPYxZYRCEzWAfkBIGEyWfs/GjZCSaDJ0fKm0Zmdx0IAuW9BnwcGAiD8MIyLiyuDAwMHO0b64dm+EQxhPfvhvlliDQwgXNgrFhHLETgKtkgm/VNtMf2mbMHzDXXmv/8IuyaoVbaIm6A1FNqGG4xp+O97sLt7sJzsKucyWQKhYKfV/aTOLlcbu0OBFqBdYAgggC4lghBUICIq2QqWG2Qc05EXjwZVrrzO5BayCIwQ2ogTjg2xoFlcQKuUi5lMn6iaT1+ehiGlZe9bLE/rxYTCIQFkDvgccgZARAtsm9l7uZber7vTcXiU9CILV4NnILOgjggC2DAWZcwpcJOKOr2x/g6LSSKonD63bLzD0FSEQRG0J2ChSf46LyhCLmDt1bndz+pT/TAHtuKWWkk54Nz8Z3pnSfF6qnG8I/VGbn0zOCxgyirlEWd/pE1NBA2Ke/a19i65VhqNCcjFUC33QTWQaBAGCyBNWyZGJjF5bLH2gvqHnrAXvk1++WrodqSxJjUth3XU2mm1FC0ctGW9oVn0vbNYRiWstlisdjd3e3hY20Q6fC7HYSKY0ZP1neIlBoBcS2cUQBSbYgxhplfPJ3vdN214E89FkkttlP2ISgzs0ClczfX7wLy+Ty89dX44SslAOkMbyHgWreWjwyEGVe+eWPrVa8sFApPPo0+fwWSAFDHExEj1jnDTAIAonPrOlqJiIViJem+tLTyTRDd8XbxUESzdnBx2yW7rmqPbXsiiOyZd5YhQqBOa/VafCcAkFKAfq+emAVBcM6Wwievif2kDz4+gdGZJhNeWDZpmjLz0by0woLqUAPK8XsiOx4FYGDq7MnUsSNmlADQqaPsBRVr3HduMZ+/gm+7R5qJpNYZl6TUSrnJUh2qLF24rX7W6VLpymQylUKhq6urp6fHux5+lPTJp3gzITALIgID+kne1dh7dcsiACzWlLWWiF4kICL1FXhsNwCKc0ACqZXUkBMSIAZBgCA6cRf6Gc/w/Cteav/5yg5Rp6ztxU7NwGM+A7g7HqzX635m5wkp1RlM9wMoIAYkAAvk2BI7Fk/aiMEaTcE6WSaTaY/8AFavO1Sy8HGZPpR3YAJhhIN3NJvNJ/ab7pmzzOBAUFBYmFfnYRERsd4OmenEc/+IeOZ0oVyMG+3VWu/aGK4fLGNG4GbTpWlKREd78p+4724t7HoMQMAROALrxHUazcGKCtlPVz/dfq6u2G9db/7zs7BzRuKUnXPGpTG3U24pWTxjcv6iM5vbNodhWDjM9ahUKsVi8Ymux5EgUi7AwUVBBSigFIJ0en4FERUKd3Kr+xdCY8zxz2s879yQhx+QtoEoBBYhAmPROCIh35IXAFq13l28SqniSy5aLkWqlYJarckcyokggLAAK5GH91UPHhwaGnoiiEj9duQUVAZQQAjYAbsOea4IMqA6ObHA06cb9NCr4WGFLKChk2tY++Jrqgwgkpm7q9lsWmuPAJGZRQfEJKh8ioEOb6fGdhLWmuak5Oyy2Wh6BO7ZuQrV4KsMLNKZa2cmIvJe+Snbjbx/N9QaoDUQAJE45wfk/F3Qxj3N46Ndj9prr7Wf/RIu1SG15MimLk247aTW3zV33tbFs7bb3p4oinpWXQ9Ps/Q0rseRINJXwodEkEEpIBb0j7gz8aXAt/8qNbucieP4+GaQnpcgcs/dkDjxN8HnsRwRA3miYiuYgVMwB5CrVOTSM+Hrd0IkACirALKKJyLex7VSf3RnesYZpSfQxEv1FmQHqAEQiIAJxAdkPtpHEDkF7ciZ8qTJT2XjnYfzwqMAqk4PLjAIQKY+s7Q8k46OHhHR1JqdGXOBTo1YOpVuRERBtVRzJ2VzBkEw2BviTqcVigD5eRcREBYSERamKGKiU1qspNkDEBvIRKBYiMEykPh2LqUwaCfyZBfjbrnRfvlKuuEWbCZAzlmyMScpt0EWzpyaPfe06rbNOgwzmUz3quvR09NzNK7HE0CkC4VFCARAAYg67Fs9k4UHexPsORhPT9sXCYjwY3tACKwCZHEOrBNilkP8duhsp8KwnhaGYXDmNvz6nQAg3sM+XFKtQ1IhJNDeN5MkyZME6q3HAACEgBGEAMnTxAB5oWkJ1KnwLqMoavW+Mrd/56ortTreCdJBlVVq9XTpsTQ9ktHTOWECUOhb1TqBCyIqBERhtXdee+/gBJFdKTXUo1Xgj9NVzGJmIo8gwlzMneoyJS8uiWPQrnPU0+OKPdo6ieM1UOOVFXv11+mTn+Mde4RYEJ0jG3PspN5fnj1ny+yZp5neniiKKvl8uVz2rodnrju+Sf2gp6xBHAIwAWhA7kjrICillACKHx5lvH8Xveyi9EVSoOG5BXQECgEQHIFjYV+o80IxqOrxaqi8jqaUyp5zRqpWM6mPD7AFkAUYgAHSfbNJkhwZqAthcqDTidx5UwmIxR/pKCiiJD0FnYRaa6ycjQfhcVff6b3tMPcIgViw9bknwkGowVjQSkSBT9/5fB2i75+XnQcySZI4506cwXOkPwS0yo/IdRwRBiFhx0SBpt7yyfDdjuW7qdlEY0EB+niO2L+nnU3STl0YMnP7jjtan/mC+cyVOiVEEK1EhJykAPNnTc+duWVh2xYdBNlstlIsVioVX3DxRDAnMqMfjA9oASEWrdC3RPq5BlCIrFApEY1KENUj+8J2u+2ce8ETvkujhnML0Ok0RyDyk2OyenYCg242T02GKHv+eWlGgXuS3efdEhZwIqpa80mrxz0ds4C0fNipRf5glbWgCCFwjUPcMetmiKjL2wEQ/PSPf0HValP4ajjDDNheemLaslKAPQcFFIBCUMDMnVBGadRaaZlZyrfabWPMiYNIKa8DjQhAJCLCREzEjoSJicpdLpfVJyEVfSz3W1ptIAKrQDGICBEwCKN/bi7Qmeu+vfKJzy5dc4smxHyopkZcuWCy2XYmbJbyi5Njrf6+KIq68/lyuewjl8NZV080Bjx9MsroZuoQRFAhKOmkpX2TiEJkFESlYe9c5uB8fXAwfeGDSLUqcbpKi4lCDGuzidIBlmCpdmoC40x/P48Nqsfm5PDNt8r4yyIETIDSjA/vRO78XbOI7AAR2AEAYMebAk/+IIAKI7PIzKfAGVFd50iYQTKHKEXkkMCkd/TYAtimtfaIGzvWA3eRgCCxaAWAwCCIiEohKhWoOIU7HmpOTpgTv84wUEp3yE+ERdixs7Kaix4dsGF4wtX9Y53BMxYcidcAEAAS7xSzCIOAIZibx9e+svvXfqGBuNRqrdTr7XbbO3SIGATBQD6/5nr4rMdRctYdFYgU8+H4AD26TwEqYYG1om6nfKZ9s6RSYg3c+kB82tbkKZuaXjCxTKMtjvx4GCjsvKy8WlQEUAi61vQ17/W+mDAM1VAf7Jr3I2uySm4jqzNPHVk6S09898Q2vHsJKJ50F4Q78KEBNSgFWTvbfMI3rktEk+124UhIuwF8dnWtD0N81VbYN7I459wR1zM+gOxpBJQiwdXSK3aog4DByW0PB2+8PD7xtAgq9E+eSYS9WpVlsiCMCs7cZLLZ3hNi+ZNjDmdEBKz3ODUAAvvBYB8SIiaUlov17VtNGDYajXaSKKW83G0QBGEYZrPZcrl8El2PI0EkDMOpYfXIXu70+aLiVQTxVyigANgnsW57SL39da1KpfICo30nksODXCYS8rVuBvadvKvPrLNzMVhpmkbjFICI1lqNDJJ66PG76lCTCIuQiA6Vp19/HBoyq07OXHU6S1hWG4BAAWKIWTNXjVdOwUKCIHBRL8S7V8eQVyGEOwzGbIEdCOgnunjnTIcICQgCsSCCUthJTmmlWUSpEB7aW5iZrfb29p7gEFA7EUDw/BhCjq1lciJETnq63Fi/8uTpx5kEOS4eAMlEYAgUglBHyPkQhTeggvydD5p3mEqlUiqVtNZe5Mgzafv/DcPwJLoeRz5ZpdQlZ2SuuqUNLIBKSFD7gwvQt/5qhYJCqAPcO5fZsWflOMjXTrrd91hy/T2tdsqrd6WT7sXOsHyHH7czkOkLmixkmVicFefYOXGWiWh2IX3NpV0/9/bxtRssYQCOfGITlPJH5WpsD8r/durMzAydf/4pWKwaH+a1Luy1VAiAr0GSAAGqQvaJIYlgANzxy1eDCAYQREEFqEFpECZuzpyC4r1SSrJDUMdO55w8bq7Eq/2KiNXFJy5kuC+aGnQ7Z1Br30qqZY0WAVHpAMBZI1+5Od6yqX2CIDK7wp2rImJnyKXsjGfcefl5zVyuWKlUjpn4B0+IRkQyWSQSp0BrUACrnGEKAQGVwsyeOSbq6empVCo+6Xsqqx8BAJy3LRfotiNRmgGASXUUJzrPCVFpYUEAIv7aLeac09tPpI0/ZfbI/vQLNzbueCR2bpXM0ZdLUAAgCJRSq4ACAoIswizOsTXsLFvDNqUkEZc6IetS19+Ll53d22o21rq/savkk6kSaFAaEJF9WWYN/1ERyKM7fQSx3g0jwVC/Wy1o+GkO3ypBIiRCIAwIlfKTbJ2gAkB+ThY6pDDS6SdUiBpQI6asmntOSn30KF6G0c5NlA5hs28v8AjCToTBZStPrH1EUfTaC/DRvax8xk6JJzUSAVAKAZB1GMkN9+Tf/b3VUql0Imm7A4vOEVjL7Cy7lK1lds7Q6LDbMsqVSsWT4K9vEuQICCoVxRJoBBFQutNk0KFgA6VBtZy59TY488xn5XRXAFDIZc6aJvalQvHesTDLocSIUqgUICqNtzwQLS5Vj42V7yTZwSX7oSuWfvtDc9+6s9WsU7tJ7bpr112rTu2Gi1vkDDtLTAIsGlkpRCVKQaBE+R1LTJbTmMkYoISS+LSp5L//eNxY3r20tHSIH6Gnl0pFcQBOwDmxjhnWhtc9I5cCwZ37Tk0Dnuoqi4K1TjOfFvFt4A48XxjjQO8Tq3QSDQiEnYELoE7YgB0fRGlQClBBrn6/L4is+yMMux83hOyZCVh8SpUJBIAzlSd2OmmtX3NRIZ9hSglYhNg/y1VEBKW1UugIP3JlfLQsTU9h9+6yRMKOyKZkUibLjlHBGy6pHSd7GJ8wuPQPAKA43/buhHiN6sTHpkqEv3NXHMfPSk+58jD/yvMjYfbV+k76bQ1ClO9b7YCIs+pz36yd4HM6VltpuH/+0tJP/fH+T11dq6/YZtXUl9P6ctJYjhsrSWM5ri8ltUVTWza1FdtquNSQdcDEwoIijsSfLSbhuEXOWrGpjePp0dobL9y7sLBgrfVii51VByFVKmLZH/Tee/SeiMJOnREVhLtn2u32KcBTnStAoHG1OOqjGNfxRMAxEEg42PfEuqMKS071gHNADtitlnilE5F5HAmw0HzwFLUjhwU47PXzXW/sgCwQCTtgFVJu8IkL8ZQC73ylcY6ZHDvrrBUi8L98xlupINQ33Z+5/YHl434odz0azy0zWxFn2CTsDDkrLG++vNZTDgYGBgYGBo4tXJKT4J6oqWlBgM6G9KounSCpIyUSYPaWB2rzc8dKAXvSwhml1KVnFbPRQmqV1so30wJwp07jx2eUUqJZQGm++tbwB7+3uk4MFI9DcIFH9iafv7529U0N64SZkZnIgZAGo8FmAtKao1CUwkwESqtcRnSo5uJhchKGqDUCiHXiHNmUkjZ7BCGT5LPxGy6cDcPC0NDQpk2bDk/0KKVksF/u2eEHikB3Zk+x0ySJClFpzDw21963z05OrvdDwnwEjL6rwhf2CMABOBEH4gAkF4bDQ09UF1NK2WgYkl0gAKxWi9aduoxWQAoxgFy6f76+YMz4ehAsPW4hYQ5YVltFOoEMWWDbcajavRMY5Z9UXC6bzb7hpZWrb13cOxsEgQiAsEJUSq3CK4BSyAz/5z/cGZvrA33dxxGd/ds3GqkBMo5MTDYha9jxK1/S2DLiensHx8bGTgqRdcc9OeoAJ+jrjydGwkf2AmgIsNMDCYAIGlEjKiVBixpXXxNvml7vh/jkIAIAlXL+snP46ltQKQZBAUZQsDbC7DUQUaESBZKm+LGvLP/WT3aXy+V1vTjreNdMEiL/2BtzGRU702jWlp2pkYs12DCAMBB8MvvEHf3OaRDF2ldbxBlOY7HWAVl2qbNmYqyRy+XGx8c3b97c19d3eJSLiHLuWfTVm4FYsQCz+HIAoALRCBqRFHIKyR13mYsvXu8uXrQM2osOCDCTgBOxzBbEiRBAcNpUkM1mMpkjYF0p5YoXhEs3gEbVkXrvUMcoDRig0qICFONw9ptm61nrvt3YQqA6PbYszEBWyABZIAvsoNl3upd3fOKL6suWv/y2xd/5IDkjWoMACSpGp5QGpVApBNAKmi38/z5U/X/vy+Xz+WO6uk9d3/juPj/inJKJyRhy7rLzGudvSXt6eiYnJ4+Bi+jpfZNjrKcHQeCmJ9WDe1AzigMdAAJIpyc0QCAFoDH89NdaP/LDz6i5sy7hjI9o3nxZUQfCxJ1Glk5oAx33HRRq5ZMjQYjfvD3YuXd5vR3gTKhee1H+x75XXbhpaaS0vzc7N9zdGu1XU6OlyfG+sdEBL/gyMTExOTk5NTW1adOm6enp/pEtacrOsEnJGDFWrGGTcJoSkGGbMBlgk9HU3d3t9UqfmCfTF7+ENFKHb1380CSsZiRVJzkC6o77W63WugeiqQFQq6MzQiJ29ZcDYVH6tMlMJvOknGDUfTkTsiUinzwhEEYUpVGHoCLQASqQ3OLNpyCiRk5W2d4FBNgJJV6RRoQBFbR7Ts/n80/Vy5DL5bZtGvq5t9SZmKxvJLXiLFnD1rBz5IiFg4B37MP3/d/5ZvsYGJWvvqv9qRtaNhWbWDJtG6dkzPdcXLvotKRSqUxOTo6NjZ1QPQEPi26O8TOUUnjeOcToGJlYrBPP36FUiBAoDJUKI8zsXlq+/vqjF/E5yZ6I1nrrZNe28ZWHdoVB5KvRChSsup6ACoRXXyLNZOADn6z/zfuaXV1d63oI+94Hz6PrIw5f+j7c1mpa3pbqRHZemESUDgQQxHESM1vLJiWXMhl2NgigXC6XSqUnDcqirdvjroJaaiAoRtS+v0lYAWgEjaAQVSDZ7zzYmJ83g4PrGtlRs4aiBNmf3k7AihhgI+wAETl7/lm+DfGJ7x52nUcQISXIGoiVz70ioAKlUAfIWpRW5fod9eqiOdnM9UdejKuuaiaIsLgUnAGXADtgC1wopn3neGnYp3qXKpXKKy4crtZ3f/IbZSHvjwCgQlLIhKgg0IyB1vLgbvm5P537nZ/oPXdL4emvqpXwp77V/Nrtcdwi03Zs2qbV1pi+6ZWLm4aoUun2qnonSmT9RAcEjxZOEDF81avMn/wdOBGNGkU5EqUAUCOGqBhZlKBC88GPNV772lwudyql5oLDYf7dr8v9/oesOE/p2fFSpHM1vge+U+MPQn5kt/7idXPvflP+JDh4T5OJC0PPjIKIPmnvIeNw4DjiW4yk7GbJoQiRA0R0Rqxx4gyTYbLiHJOLQniaCYgok3Gvf4X+6JWgQQF7IWpf2VCAPqJhjZJK87obkq1bj9VzPjYkPbgofuyVmJgNSCqcMlsAYgy3DmZHhsvl8pO+e1G22Ky8vnDw850aFYgKDqV6SIMOULIIcdPtvzoZ37S+IJIcAEBQAsLsxKZgU3BG2IEQrIxekMnly+Xy0+yoMAwHBwdf99IEZd+nri0bg1oDAAEgEqLWijWGIiA6CGaX9G/8be2tlyVveXlpevhJPnOlSd95JP3a7e2FKqdtSlpESWzbzZ5i/XsvmustY09P79TU1Pj4+InGCE+aQz2WoCY7NNzcMhbcv4ezSlAFIrjK/q8QNCoGgUgy351b+vKXun7kR09lZiQ4/PGcd1rv9qm9D+0KghBQCZMofVjU0+nWVAICgiqAD3/eXXrO8tapgfWDPa31sd6OjmoIIrOgIIM4Ep/9X53mJkTGp+XRCMMwfMsb3UevFBL2fgeC6oyeikLUCAQIIOqL32i++13rGoi6vTO+b06YnUAqkgqlIg4EBMJXvySXyz0ViIRhSMPv5P2fA2DRIIxAvo1QlAYdAGvQGkVDcf9nW60fOWmJw6cEkc7IoEvAJmBjcCl4wpPF8df1FApPz32NiLlcbmxs7Hsu5Z7Sni/cEO0+kEOPjIjerUJmFRAI6FABq6/fZq5/cPnsTeHWsXCkL8xFyAzzNdoz7x6eMakFayRuuWadbDuxcaM3X/2Byw5ms1FfX9/U1JTX5TxRBDnydxDk2IKaKIrk+99A9/wjMnrVW61QKQ2ACkUjsEJg4QDgT/+59sY3ZYaHT5kzog5/PMVi8afenEWUjigeEXu5E6HDgzmltHcLRPD9/7B0PAKl613OUKiUdKpfSnCtLOE7WBEFwPc+PhWIIGLhzLOTM8YoJsfiiImA1gq9ABpAI2KImYcPrtx/3zEJGh0ziOybBURwzI5SkYQ5FjYgxKhLUeaSC7u6uny/85OGANHQ5Wk0wallI94VY2IQQezgiNKgM6rUvKcx99C6LkQle0EBAINjk4JpgY3FV2fioWnu2lSpVAqFwtPvfqVUsVicmJi44OxNP/Nm94ZLFrpLCRmyiXUmdTYhE3Oask18osQ6YSePzLir7kr+/brmR65pfPS65ldub9+3xxgLzkjcokaNTDs1rVZ3vvq2V8wUCrmxsbHt27dPTEw81Y09TgQ5XgU8rXXujW+gDDrDjsExOgJyTph9sj9A1KhUBHo5Xvm9PzqVTRjqCLQ7fXP/y881zoAwsccRR53pKL/41V5jQKVD3HMA//xjB56V6vRTH1agA9+w3uGsP0RiL6vzhaKCUD89K0Qul8Of/qHOPWCxzI6Y2M/RdyIapVA5Sf/lP45R0OhYNmGa0o59AgCWLEnMHAslLA6EGcMfeEU+n+/t7X0qlma/kObEz7HzlDpCzuOIeD4gFYAOQYUIyNGOD67jkdB8CO2Sn2xzRkwLbFtcDMwAAvu2vqNQKPT29h6N4+lxZHJy8rTTTnv9ZX0//9ba9168MDXcErKUGpuk1iQuTV0as0ld6tJErPXyEsACXr4eBKyRNKZmg0zsKE0UxN930T5fs9u2bdvY2NgzItqxBzV4fGUaRCz0DySvfxmlTCyOxLE4Rn8cdJL9fk/mIPrCzfNXfPGU8RCqIy60VCr95Fu6clnnLIMQk2NyQl4LlgGlQ4StvIuvgoy65jvymW8cfE4xJ/o6ku8tXU0Md/4th0ZHn4GXLAzDrte+Lp3sowRIwBH7J8erXo0v0WMEmW/es7JzxzohaXzr7dBIhYmdS0VioZg5BXGEqhJlXnmZVwN5mmmOMAyj6R+xYQ8lRMZXVYWMiAjoTteZVhCEqjL/1frS3nVqn5P63Z6cERylMaRNMG1wBJxAMjJtes70ox9H2VGulMrn86Ojo9u3b9++fftrLu159+uSH3/j/KsvWDx3y8pwd70QNTXEYhOwqdhUu1YRV5wRsuI7eJ0VYzhuk0mIbUpp8pJts+ViMDw8PD09PTg4mMlkTlrRQJ6EUepY/ZFMJpP7mR9lDWTZMVliR+w6U9mgELVvp1aIIch7/nz54QdPDYdj8MTQa2So/6ffsvK3/6m1AkARFgZRIAABKuUL1LAqTw8IOpS/+3TcV5l/7aWDzwUueARAjUCsFSIgoQDC6qu/ysOBcjTYXyqV5v/bL7hf+BNwggiEoEUC9GMfSoFoRNEosbT+z9+1Pvx/oyg66bWq9jXfBktirHHcEm4xtYGtAAkWfuL78vn84OBguVx+mgNTKVUqlQ5s/u89d/8mMrIGpUULggBqUAiiQUIAVJy64L7/2R78yLoky2c+A8IgjmJJqpg2xMbAKQDAY2f9zFpH+dHfQESMoqivr69YLPb39y8uLg4MLE+NVpMksbZq7UI7AUsIIFpJNqTZZPzu5a5cFgMNLOCcmJSTRMg4tgaV3T7a8JnUgYGBk0macwSCrEqJHhoAOMp3NQi6tp2293Uvib58K+QUIjBIICSotAIEpTojmighQCKtd/1K9hufLA0Nr/eYm3rigykWi6++ePjiM2OTEjMJ+0Zjx86yI1hTQhT0WQelldL4v/6p8a27lp4jKnmerL6TjFwNTGWVguLon1wmk+m7/JXJ5adTm52wJTbEhoUEWQRBNGCAqDIYXXPv4i03n/QzXNI0vuI6IcupbTM3hVrCqbAljC6cypx7dm9v79E0Ymez2cKWtze7znGJJSMuFZewP5Z9E5vWoAPRoeqau7Jx4PaT74yYeZy7FoTAUNzAuC5pG5wFimHh3Ddxcay/v7+vr+84wMu7JAMDA9PT02ecccbZZ599+umnb9myZWpqasv0yJapvk3jPROjvcPDw48sb3VWjBVj2TkxhkzKzhKKA3H5yHWXo6GhoeO7jKd+hPi4Wq48Hj6O0RnJ5/P59/2KC8EasSSWxRAYFkfCzL5wr/1sVxbVXGPlLT8dLy6e0nBmDfB6e3v/6zu6B3uNM/w4HCHHRD457NMNfsBcaYUKfu/vlr9153MDR+QQUKjDkqqwSumDclTepO+SzP/Bb7li4FKwIJYlJTbEjpk7opailCgA81t/3mg0Tu7ya5/4NM83xdjEcUOoyS4WTgkxH2R/+p3lcnl4ePhoCkN+Ic1z/ooFKSYybFO2vuRNHW5EVKAjVIHk7v6lk5/i2fG/gWNw1rSkVYW0ATYB1wIzPDoz8bbu7u7h4eETacTwUNLb2zs2NrZ58+bTTjvt7LPPPvfcc89btZGpcw8shTalNOE0lTRlk7Kznh3MiYgA+k842dV6PBIyDmUV8ZCwzdFZGIa9E5Pxr76TU3YshsQQp45TAstA7PNcqymSDKjdc0tv+rH2Y7tONYj4g2t4ePi979ZBwGRZ2DETkxNn2BlxDrjDN42CCAoElUZA9T/+fuXKby88uziyRiDayZ55eYUOBUPHLzn6B5fJZAYnp9I/+mXnxFmxApYlZTEslomYRAAFVYTB3ur8+//kJFY3uN2q/cW/iklNYhvCDaGWcMxIAPn3/mCuXB4aGhoaGjrKebBsNts/etrs6X9IjikVMuBisW1xbWGSjlCbAgx0prHT3P17J7NMk+yHXR8GJom5tYRJVdIWuCZAoB658NeLxeLIyEh/f/+Jn/+IGIZhPp/3eaLBwcHh4eGxsbGxsbHldtkZMkbSmJOY0tgZI+xr/yIA2E4zKWc9ZfFJdYoRAYHV4/Yc+vIegAII8Jg+rVgs9v/Yj8XnT7hYLIhhSZlTopTIkhCzCKOIpwNSWVR75lZe96P1665bvxKqeipcL5fLZ2yb+KW3pyDMloWckPMDlOQsO9thHsXV2XhEFSAg/tlH6/9yxeyziyOoERVodaiC2+k49ShzLNfmb8Xoa1/X/vk3UgKWxDCnxAmJIbAMLMg+xZIB9dFr5j71qZOVY57/zffLQsulaZO5LtRkajMYhsLPvD7asqW/v39sbOzpsyFPdEZKp71rcfxdlBCl4lIxCdhYbCxkhY0fRhEMdXHXh1q7PnvSkuV3vBtsG1JqVbFdk7QJpgns4NHLf1Pl+wcHB30vxnqE7mrVWjEBM1l2lm3K1gK7Dt8FolJai+hvP1CAk83gj6AQOq2RAKvlGI0QIEQIETh9bD8uDMPe3t7Mn/yOyymK2YoYgoQkdpwQpyR+Tx6qBGUVtEzjh9+3+L//mumkVT9W/u1T6aM7ng5E1oKayy6c+NE3tpwltsTsyDn/HMim5Aw5B6scv76hNQhQa/nol5p/8I/7kvTZqdcggNKoPU0RgogwgZ99FXIiHQGRo5dZDsOwv79/8Gd/qvW2l7hEOjjCnBB5l4TEK9GBBGDe89cL11574hha/dgnks/dSDZpOaoJNcg1WRLG/LsvDy+9uLe3d3Jy8kmnfp7GoigaGBhQ5//uytCrXUyUClkxiZi22La4dLUlCBFA5b/zU60D3zoJh8HDvwMLtwBxUpXWsiQ1SKrAKTx2+S/F5dP7+/snJyd7enrWOyWfzwJqhV5tT2AVPjwPfaCCIMgEtz9c+tZd9ZObD9I61EGgdeAd9o4PEiFkEXIKsqpBzWNeSz4/um27/YtfdwzWgBG/G6VN3CZOiM1qGVEYgABCFIXpB/5j9nXvanz9qhPdmf/+mR1nvymdm5X+PmutiOj3v//9T71+nc1m+7sgChbuezQAFkQR4Q5Pp8gqTdaqCAh0JjKUxt0H6Zrb6tOj4XBf5hSDSCtxV3xrhRkYgYmdAWuIrBGbsDPsrIgD5s2TeN4Z/b29vUfjRWutoyhKT99WXdiLDx1g1WH46fA3r+XeFaCA++w3+NxNuc3Tx3201j/9hepv/g3FcZtoRbjGtsrSZsz80Cui11ze09OzadOm8fHx45gH83Sbi7kLzfIjmZXdwtihWffUvwLoNV0UIkL42MdN/8vC8qbj9xF2/jk8+MfgyNaksQCtZWgvgU3hsct+sd5zUX9//+bNm0efoHe3PkeLu/I7qVKACv0Z4zetrJ7YSiNCcMv9XCm70zedNLfoz7779wo1ABI751Ig7oh2sP+5XMhXvm/za7u7u4/+PFBKhWGoenvnerS6/p4OWbcnymQhARbhTii/6v4okABhoZ5+6brWzTdjKRuOjeKxnEB230zt3z994Cd+d/nfriz99o8FP/rO2Fp/JU8HIn5cJZvN9ndJPly4f0fIxIgia7rsHZXjThuoz7OqVQruVgu+/p1mbOxZ09kwUKcSRL54Q5VYyJFNwaTE1rCJybSJjLCn/+fNk+roQcQH25lMJj19azVegnv3MgAjkCAfooaQDo4wmM9eQ72Z/PnnHsdeXPm//1j9/z5IrXbMrspcZVclaYFEP/um6BWXViqVTZs2TUxMHH0g88SFRFG0ULiw3ZrNLTzix3rZqxAQiKBPdHmqWr33E7YwpruPZyHw4PvgoT8B42wd6ovQWoL2PCSQe/SS9zS7z+vr69u8efPxQeFxWC6Sq29vxSl61rRVYgUAQGFPBKpRISB85z7biNOLzzw5OPK/HvgAMVkXu3ZbmhbaDLFAImA8ayXO0eIbJl430T92TCkhf6rByPBCBfGG+wmAcI2kSqhDUAh+Hl9EkAX9OBwC71tMv3J94zNfsrMHwKQQaF3petKfQkvLyT33tr5yzdIf/7/53/qL2lduay82yp/8n82Lz69Wq77l7xlAZG3PZbPZvgr0lRbu36mtXeU+9wKlHf0C7ojWd2jb0LdUI8IDu8y1dzRKedg8ljtlIPL565ZtyjYVmzK5lNOYTJtdKmSEnL/arVP66EHEw38URZlMxm2drpYYbn2YHJASr9vQSYt4xnwFIGCvui3e8VD2onOCo2ZdSR54cOHX/7D9r192cdxmqgpX2VWdxEPl4D3vCs88zfsgExMTJzKqo5TKZDKZTGYlf/ayg+LcXWJFHHpaID93tMoVhogSHPgyt3fiwCswOOqyxcpNcMcPw57PQEqmAY0laC1AewGq5c0Pn/8brmu6r69venp6YmLimKkGT8Dqjfp9jylEIGJhIOpIGooIiIJV7i1U6sGd7vYH65eenc9nTyjJ+rHHPv/Z3Z9z7YRXYpi3sECwQlAjaDDEDEZAFIG9YvEqF2I2my8EuVyQPXocyWQyMDqyOFLEb9/DVgiFxbN6CnVIvDuxtqzKFKGPJwCkEbs7Ho6vvL75759vXfG1+IZb4ptvi6+7Jf7Gt9vfuK7xn1fU/vYjK//rg7V//WLjaze1duyPHbSzoj7yP+Z6e+I4LpVK/f39hULBz788c2qAmRuNxr59++6+f/cnvq4PzgdK+yEuhUqjUhgESoeotdIh6kB5uikFiIKezQfwvO3RO7+n55Iz112zZqVufui/P9JssLMkzpCJybTZJuQSrx4iwkLwxldnfuKdZ27duvWYZHScc9Vqdc+ePXu/faP846fVzkVUopXPlGEEGKGKPMUDYOh0UI5K//VdXT/xg+HY2NPBx30PND/15dZHruBGYsm2mGvCdcc1cckrz4J3vCHK5XweZHx8/ESnOVYXsry8vHv37pVHrh1+6O+ytRnUoDRqDToDQQ6CDIQZDDKgQwiU6FJFzniP3vRzkBl62rt/I+z9GOz9GNhUEknq2FyW9gLENdg38fo9Y+/IZDL9/f1TU1MjIyOnEkFE5MDBuV/467TVFvQUwnKoeHfYZFhnwIoIukv4/l/ou+C042Te+uy+q95x7buhyVBlWGaoE6QCBGuiaIAAIUJOQwmhoqAcFvKlocLwaHawL+gpSK7RqF04dN77LvvlbJB5mhdz7969u2+6mT7wMdy1BFoQRQEqhAAwQAwRQ8BQQYAYAgaI/t1dYz7tCIh0oh4RBjFMTETiRAyyFUgJXT5s/9HPxQP9pVJpfHx8ZGRkbR/iUeaimbnVas3MzOzevfsz34hvfyiHgJ0ZQlCAWmmNOlBBCCpQOlAqUIFSGpUW33Luu1zPmo7eennlZWcXM+F67Z5Gy771vQ+3mg7II0jMLiabsLOwFi2yvPFV2eMAEQAgolqttn///r179zY/8yV9xY3YtgpFawwBI+zgSIgYoooEQ0YdYfbVF2VfeUnm/DN1Xz9mMyDCcez27E/vvC/9zj3pHd+VlnFkE6aWQMNxg11z62D61lfglulCoTAwMDAxMTE0NHQSpzmcc7Vabd++ffv27Ss+8pGhx76CxqgM6gh0gDoDYQaCLERZCLIYhBIGgtmcDL0Khl6LXedDZgBUFoDBNaG9E5ZvgYUboHoPOAOWbRviGrSWIKnDfP70XSP/pV2YLhaLw8PD4+PjAwMDp5jzAgCazeaXrtv991cUUKgTlfvZh86kJgL4K+q8E+RARH71XeV3vKbvWC91T+vg1CfOgqqBZYQVgiaD5cdPyqzKAGqELEJBQx4hAgABB9BmSHi0f/J/vuX3337mmwu5/FMVnpm52Wzu379/9+7dzX/+hL7yNhEA3Wlx882QAWIAECIGh/2v75H306Rr4or+9XAsDsCCGAFLYIXTi7c03vFa7u72LqTnZ1q7J3j0BS1mTpJkbm5uz549t9yz9PWbMss1pXQnFYKoO72rOlRhiEqjDjpeiULtpRdUhxiypxK85qLCpWeWzpo+mTHOYs3e+kDjC9cu3fNQi00qNnamTS5hEzNZkUO0lkLympdnfu6HzzoOEFl7cnNzczMzM/OP7TZfulp/615VTzVioCRQGIGK0AMKhoihYMiglcJAoUbwSpA+oeSYHTlhwxwLtEja4Jqnj7ZfcS6fe2YUReVyeWRkZHR01A/InNz0ARH5hezfv7968JGevV/o23eDsonWoL0bkoEwg2HWOyYQRBKEogKEQAEq0KvtUsTADkjYgkshbUBchbQNc9kz9/S8ZqV4dhRFlUplZGRkbGysp6dn/YSUnn6xs7Oz//aVmSu/U/bDiD434ilzVRh0BtRX4UJInBMReOvlmd/4kZGj9/72tWanP3Kum6/Dsoaag0SADnd58JDvA6t9TbqjIgMAQDLWPfHzl//Ma6Yv9339AwMDT9MCx8ztdnt2dnbfvn3z37mNPnsV3LvHc3l62goE8A5I0MER0LA6aOO1YVaVFRnECRCIY7EMTsRsHmi/6aXu9G3ZbHZgYMBzIxyRxsJjqoqLiDFmeXl53759+/bPXP0d95378sKrvkYn9x0oFYAOVBAoHaAKUWmlldKeChOU7nTsaQUTQ+F52/JnbsqdMZXtrxzntMLcsr1nR+vOR1rfuqNWr3PaduISNm2ybWcScQmT66SBvZguAiJ8/+uyP/T9Zx4fiPhbkaZptVqdnZ09ePBgdW7O3ngb3vqAfmS/YgxQhQihwtBHN4AhogYIOrmtTks+C5KIFTTCCUrSnWtesCU+ZxtPT0ZRVCwWe3t7h4aGBgYGnoqB7cSNmY0xKysrBw8enJ2dbS3uLc59q3fuO8XaLgWgQggi0BEGOQgiCDIQRKBDCAIvfyXop7sdkAMyYGMwKTax70DuwoP58xvZ6SiKSqVSX1/f0NBQf39/sVg8xdooItCMudqklQbNL7X3z8x99MvOGFrL6AEA6kAHAaoAVKBDVBqFBUhYhEjIyUvPCf/sV8eP8sp31fdd8eBXdF0d3Lu/tlx7ctJJgadqVw1UcNHwedlMtlgs9vT0jI6ODg4OPn0Ba+3F3L9//8GDB2s338bX3yp3PCrS8XcQxMOj9oI9CLqDIKvg5s9YAWIgAALiMybsy85153dOsoGBgdHRUe9CHnEA4HG01jjn6vX67OzsgQMHduxe+tbdeP+jWWFADag64zSoNKoAtf8aKB2AChRqDJRC1AEo7Qs5XvoEtYKxwXB8IJocikb7o6HesJBTuUiFAYZBx+FyJESSGG4nvFynvXPpntl0z2y6+2AaJ+ISShNyxopN2LZdJ5AxwgQggFLMQU9FRgdhZEB6yzIyVN6+fftxg8ja4dZut1dWVubn5xcXF+v1erJvhh7dpR/cpfYv6pVGkNgAVCAYIGolPk2Egj4PywpsT9kOdiVbRtvTY3ZiVIdhJpMpFArd3d1+nMQzfa23509ErVZreXnZL6TRaEB1Z6H2cFf1wWJ7JueWNDqlQIegI1AiGKKOPKNYJwPf1n0tPbiY3b4QbKlGm7QOstmsX8jAwICXoV+PAcUjczJNWq7T3nm3d8HNLNqVBq/UaXGZmi1yKZExbFOQzgDHau+XUkHgnWgdRqB1EKhOloCFiEHEpXL6ZvWB35os5KKjweXl5eUdO3bMzs4eX9dJEARdXV0DAwN+Azwp8eWTvpjNZnN+fn52dnZpaamxa7e950G65xE5sAj1tm8/w7XKBwoI4uFYhgLlnIz0whmb5cwtMDwYRZHnZxgcHOzv7y+Xy0/qQuLx9ef50KZarR44cGB2dnbXvvrtD6mHdkZpip5so8NvoLTSAWCgVtEEtfaBD6JC/0V7CWVRXg0Fwes8aOVT0BgG6C+UGCyJ724TYiIkZueYnZAhZ610ZkJiMglTKmx7KzLQx/3dMjYgfRWOwsA3SkRR1NXVtWnTprGxsRNvUnDOtdvter2+vLy8vLxcr9eTJDHG2HpD5hdxqaqaTdVM0AgCYIBSzHAhT5Uy9XRxV9kX230VrFAoVCqV7u5uTwq5HvLLT3Oa+YXUarWVlZXl5eVGoxHHsTEGkuUomc2apcjVQ9fUAaECdtplCkaXEt3TDvpS3X34QorF4uELWVccrLf5kRm784C9d1fy2EGXGCEnzgkROMPsyFli54CMbxRicsDMRKuK2H4rhjqMMAiVDpUOtA88pePFgrC1MjWC//g/poqF7DO+HfV6fXFxMU3T4wPNMAxLpdLRw8cRfmWj0VhaWlpcXFxZWWm1WiaO7d79NDMvS8vSTMAYsCQkoAAjDVGExTz2d8NgPwz16ygKgiCTyeTz+Uql0tfX19fXVyqVnmYr4ok0+TrnWq3W0tLS3NzcwsLC3ELj/l3y0K5wdlEzdZ4OauUplxAD1AGqDoj4rlKv5oirQpidBOyqCuZhzerCDIgdInphEWEmFvZfnXSIIlJg29+djPSlfRUa6JbeLtBa+52dyWRyuVwulysUCsVisVgsdnV1ncQ8JRGladput5vNZqPRaDQa7XY7TVNjDBF5kepOdy+i78HxYsvZbNa/daVSqVgsFgoFP8FxivOOhz9Wv5BGo+HXcsRCOmXR1YUopbyCdDab9be3XC4Xi8V8Pp/NZtcv/ZFauf3R9M6d6V070labk4Stn+tyHS54siRE7ByIlU7eiVBcAIToRIQYrVMgSoVaqRCDUAWB0qEKIhUEqJVSAAzkif5YrOGtE/jP79/y9G0BIkJEzrnj1hLxt/S4N4CHklarVa/Xa7VavV5vt9v+YFvbh4dCucMeoj8A8vl8qVTq6uoql8uFQuEZTzI8wUkBEbHWek94cXFxaWmp0Wjsn0sf2QOPHQjmlzVZlE4LmloNcxBRdzwQ0KAUYkdkT2Rt2mVtwHG1E8VThJPP/rAweTE4rVwxZ0o5M9ybDvWa7qIr5XFNBt0Daj6f98Dh5QiiKPJ/+vTMZsd9Q4jIHGZpmqZp6pxzzvku8jWtdt94Eh1mzyJ2PKljYq1N09R/9Watpc7QWqcdcc37OGULWazRtffGNz+cLtYoScSmlLbZpOQskXXsLLBDoGI2LWWTSiHuyifFTJIJbBRQGEig2D95FrVYD66/q7Jcz+pAo9ZKhSqKlA5UEGIQImpPi8fMQizsnIHLLgj+9Nc2rys/+Ul8gn4HJkkSx7H3K51zayfB2nnmvQ9/DPhH6WWMjuYFwZMybuShxLv03hP24LdSS/fN4YF5XKqpxapuxgjio7EOpgCoTovrapZHAFA6hWtZreR35BoUFHKuq2iLOSpkuFy0PUVbzrt8FvxdWNvN+XzeQ4a3NeA49a8oM6+5IUd4ImvaF+uBZeuxEL/5jliIH287ZQtpxvz1O9tX3RUnRqyRuE1xi01CNrVsDJk0DMxEf3WwqzlcaVYKZg2vvanHm/cf4yT58o3hfY8WlFIqCDDwNYFQBxHqAH1czcJEIsTEzsov/mDhx9+66VlRzz6RfXj4E/SvrX9eaw/Ri8ke6zuCJ3dm0XvCrVar0Wh4P6rZbHo/yhi7sMIrdWkn2E6xFat2jKlFS8qkhzpegkDCEKNAshnJZyWXkUzEuQznM1zMUTEnh+vO+J3hjz6fUCgUCvl8PpfLZTIZjylPVIfesOep3fxw8pmbmtWmkJOkTY0mJy0ysaEkYZt05RtnTCxODdQLGfEHqT9a18xvibXN43eFc67RaMzOzt5wR/3L3yoLoI40qkAFodYB6ECHEaICWQMRIksA8vE/GZ2eHHguUPk964brwTLg/SjvRPkcQavV8t5UkiTWWo+L/quIrJ1shwdpa6fcGkz6sM1vDg8ca7tkLUJZc6Q3gOOFZI7ko9c0bt1hmMUZbrW4XqW45TiJbdwOVevS0w5uG6mv5XR9PF8qlXK5nN8S/oxdky7y22wtfeC7Fu596OCnrs0vV6Mg1Kg1dvIjIaqgs62F2DlhskYuOVf+7L2nrxODwfPL1sUf8xM3YRgWi0Uistb6SMzDik/R+XjbB9geUA7/9jXIONx8jsPjxRF/4TmSR9iw9bBai/76S/WDywSrCLKyQmnDUNqy7damwcXLTp8t5lWx2NXT09PX19fd3e31AD18PP1L7oWNfCNGPp8f6t37n99wD+8uKAClFAMBoAoAUHvVvtXEJ992Dz362NxZp2We+8mR5yWIHPGQ/Cjw4VlrH5UdHmCvpU/XtGDUk9nzJYOwYSfL6i36409Xq21RItZyq83VFUobqYvrptW6YMvcxdtXstlsb2/vyMiI78rLZrPHGsN6ndYoinK53M8U933x+sa37y4DsA5JEIUQ9aE2U6+M5qxcce3spvHeZ6X79sUFIkd4KN5x2Hg3NuxozDr540/XlhscKHAO2ok0apw0DMW1tNG8YNv8JafVSqWy76bv6+s7fKDjWM0Ptntqgndl93QVl7/y7QoqVopZCAmVbyP3Rx4JAN3zsKlWq08v2bcBIhu2Yc+m/f2V9bkaZQMghtRQo0Fxw7ikkTZaY/3VS0+rdXV1TUxMTE1NVSqVk0LRms1mBwcHwzB8a7Q3E819/oYeZEAU0OLJL1YZegWR9x7EvTNLx8ovtwEiG7Zhp8hufKB9x04bBeBIrOG4zUmDXJK4uCUufu0Fi15Mc3p6ulKpnET31hODBkHwfUGQuPmv3dSlNKyS+6wpn5EAM/F3d1XP2B6fyOTEC8A28pEb9lw04+Rfrm4qIWBxlo2RZoPT2LBpuzQ5fVOtUgqHh4cnJiZOLoJ401p3dXVNTU2947WDZ21NyKnOyGTHuDPJKW5xOYnj+MlH7DZAZMM27Fm0q25vxSmDgHXsHMQxm9iJTckmQvas6XZXV9fo6GhPT886pdi01uVyeWJi4hffVszmhNnPY6z+saf1Y4oTmyTJBohs2IY95+yrt7WAhViIxDpJE3bGCaXsXBTxSJ/u6+vzvCTr+G4oVS6XpzdNvPoiAjms3OMDGyZhYWbfprABIhu2Yc8he2hvOrdCIOIcGyvWkDUs5JhYRHortljIeam69a6taq0rlcoPvKo/CD0xhy/0yioHGGs8slVyA0Q2bMOefXtwd0IkjoEI/IQ2Owb2s5dQzHEulztlhdUwDDdP9vZ146piHXRI1JmZKJfljee1ASIb9pyzHTMpWSbD7IScWK+YC4QgqNCznJ8CoqY1y+VywwMhgOpMhXYSIgzAvV2w1h75orWNEu+GPeds70FLjkEQFXQ0jjoaaQpQWQr83MOpe0mCoLcSgDK+QtPRtyfq6XI95Y2piw0Q2bDnntWbriPpoHC1OUPWuJyWGplTfPJ3pkE1sl3lBGAS4vEhG0V532W/ASIbtmHPpRgb0VlRyrPRAnInoYmoMNRtk1uqm1OsGN+MO7NdzA7ECbCI3T5JnnfiRQ4iGzmRDXvOWVfukG6ytUI+nNEalNY6EFB3PcKefPCUXdLBZRLvgzjH7NjYngpPj4aebeBFnhPZAJENe87Z+AASsbNsDTvH5Fbp4JRnwdM33Z9vt9vOuVNzPXvn0sUVFmFhy2zFWbLusvNNLpfr7u7OZDIv8ue1ASIb9pyzreOBEAk7YCdEzATiuWk1qCCIdKMVff76apIkp+Z6vnpzNU2FHLEz4lJnbF+vO20SKpVKV1fXi3z6bgNENuy5aJecmQ+1ZevYWnFOHHXYgFAprUBpFarPXBN8d/fKKWgVjVP+0rfr5Fhc4hFEyL358qRYLHr6kg1CrA0Q2bDnnFVKmZedLc6zaDrL/hf5JIhSSusgQFS/9/eNgwuN9c6M/OUnZ6srzNawicmkZMzllySDPYFXtzxx0aINENmwDTv5FkXRu19fRnRkrbDjjuiU80GNVyQKQtVoqV/989kD8631u5Iv3VS95pYGGcsmZmdMkm6bTi/a7rq7u0dHR8vl8oYbsgEiG/ZcNK31+HDl+y+31jATMRGTE7LsDJPz2pcCqEKcr+LP/NHBG+5cWQ9/5Ms3Vf/q4/Np27Fpk0lsEo8OJt/3srhcLo+NjQ0MDGykVL3hi3x2aMOem2atnZmZ+e//b993d+kg8Iq/iFopFYDSSmtArZRCpVhAa3zjy/I/+Zb+wZ6Tw5mcpPzPVy5+7ppqXLcujTltmrg52tf4L69slkrFycnJrVu39vT0bOhFbIDIhj13TUQajcaOHTvf/6Hq/lkd+AKIF1HUWimNOlBKe0Dx+mfZHLzxpcW3vqJ7avj4HYTU8rV3Nv7j6pW9+9K0bdnELm3ZuHXWlvr3nN/K5/Pj4+Nbtmzp7+/foAreAJENe64bES0tLT308CN/84n27v2B1uj9EaUU6gCDQGmv7hyg0jpQqEBrCEM8fVPm8vNKp09lp4ajTHhUAXuS8s6D6R3fbV1zW3P/rEljcollG7t2i6n9yvNXzp5Oi8Xi2NjY9PT0BqnqBohs2PMpqJmfn9+xY8e/fbl+50NZAEEvO6U0ao0qVEGotEYVogpUoLRWKgBUoDQGGrvLevtEZnQg6impciEo5VU2wkArZrEkjZgaLV6suZl588BjyXKNTMomIWcdpSmlMdt4aqjx0rOqfV1YLpfHx8cnJyd7e3s3EGQDRDbs+WTGmIWFhV27dn3r9oWrb41WahoAlEJApZRGFaAOlQ4w0KgDxAC1VyhCHSAqAIVKgUJAhb6QgijAIIh+jE5InBNyQo7IWjKWbcou7au0LtxW3TJiMplMd3f32NjY2NjYevC5vgBs445s2HPaoigaGBjwHCKnTc5cf0fr7key1boCAQkUKoUUsNJoNahABQEqjRig0qBQddrk0fOjigiqTplYRDy5IXsKRrJknTgj4sYHW6dP1LeMJGEYlss9/f39IyMj/f39hUJhI5O64Yls2PPVnHP1en12dvbgwYMLi0t3PUzf3aN3z0TMAB3RZo06QKUQA9QIqJXSgBoQfV+J/xzp7HgGEfZUJeSECYS6u9Lp4dbUYHuwm8IwLBQKPT09g4ODAwMD5XI5iqIN3cUNENmw57cxc5Ik1Wp1fn5+YWGhVqsdWEj2HZTdB/XcUlhvKgEFgAJKaYWo/cQeIsoq85iId0MEgAFEgRRytr9iRvvTwe50oOK8XHw+n+/u7u7r6+vr6/OinBsdZRsgsmEvHCOiOI7r9fry8vLy8nKtVovjOE3TlbpbquFyHRtt3YqVsWgtMqCAQgBUoFCiEKJA8lkuF6lScJUSFbIcaB0EQRRF2Wy2WCxWKhU/VlcsFjOZzAZ8bIDIhr1goSRN03a73Ww2G41Go9FotVpxHFtrnXNERESyaof2eoehrKMMHwRBGIbZbDafzxeLxWKx6MlBstnshkb3Bohs2IvCRISIjDHGmDRNk1UzxngtGC/m4Hf4GoJorcMw9K5HNpvNZDKe9jkMww3s2ACRDXtRAwozO+e8J8LMhyOIBxFYS8KueiKeY3kDOE7Q/n900u9wPXI3MwAAAABJRU5ErkJggg%3D%3D"> + </section> + <section> + <h2>Basement Level 3</h2> + <p>That's it, time to go back up.</p> + <a href="#/2" class="image"> + <img style="-webkit-transform: rotate(180deg);" src="data:image/png;base64,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"> + </a> + </section> + </section> + + <section> + <h2>Marvelous Unordered List</h2> + <ul> + <li>No order here</li> + <li>Or here</li> + <li>Or here</li> + <li>Or here</li> + </ul> + </section> + + <section> + <h2>Fantastic Ordered List</h2> + <ol> + <li>One is smaller than...</li> + <li>Two is smaller than...</li> + <li>Three!</li> + </ol> + </section> + + <section> + <h2>Intergalactic Interconnections</h2> + <p> + You can link between slides internally,<br/> + <a href="#/2/3">like this</a>. + </p> + </section> + + <section> + <h2>Spectacular image!</h2> + <a class="image" href="http://hakim.se/experiments/html5/breakdom/" target="_blank"> + <img src="assets/images/breakdom.jpg"> + </a> + </section> + + <section> + <h2>Stellar Links</h2> + <ul> + <li><a href="hakim-slideshow-0.3.zip">Download this slideshow</a></li> + <li><a href="http://hakim.se/experiments/css3-3d-slideshow">Read more on my site</a></li> + <li><a href="http://twitter.com/hakimel">Follow me on Twitter</a></li> + </ul> + </section> + + <section> + <h1>THE END</h1> + <h3 class="inverted">BY Hakim El Hattab / hakim.se</h3> + </section> + + </div> + + <script src="js/slideshow.js"></script> + + + + <!-- Everything below this point is unrelated to the slideshow --> + + <div class="tweet-button" style="position: absolute; bottom: 10px; left: 50%; margin-left: -25px"> + <a href="http://twitter.com/share" class="twitter-share-button" data-text="A CSS 3D slideshow by @hakimel." data-url="http://hakim.se/experiments/css3-3d-slideshow" data-count="none" data-related="hakimel"></a> + <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> + </div> + + <script> + var _gaq = [['_setAccount', 'UA-15240703-1'], ['_trackPageview']]; + (function(d, t) { + var g = d.createElement(t), + s = d.getElementsByTagName(t)[0]; + g.async = true; + g.src = ('https:' == location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + s.parentNode.insertBefore(g, s); + })(document, 'script'); + </script> + + <style>a[href="http://www.w3counter.com"] { display: none!important; }</style> + <script src="http://www.w3counter.com/tracker.js"></script> + <script> + w3counter(49720); + var ps = document.createElement('script'); + ps.type = 'text/javascript'; + ps.async = true; + ps.src = '//pulse.w3counter.com/pulse.js?id=49720'; + (document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(ps); + </script> + + </body> +</html>
\ No newline at end of file diff --git a/js/slideshow.js b/js/slideshow.js new file mode 100644 index 0000000..8165a40 --- /dev/null +++ b/js/slideshow.js @@ -0,0 +1,282 @@ +/** + * Copyright (C) 2011 Hakim El Hattab, http://hakim.se + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * Handles the very minimal navigation logic involved in the + * slideshow. Including keyboard navigation, touch interaction + * and URL history behavior. + * + * Slides are given unique hash based URL's so that they can be + * opened directly. I didn't use the HTML5 History API for this + * as it would have required the addition of server side rewrite + * rules and hence require more effort for anyone to set up. + * + * This component can be called from other scripts via a tiny API: + * - Slideshow.navigateTo( indexh, indexv ); + * - Slideshow.navigateLeft(); + * - Slideshow.navigateRight(); + * - Slideshow.navigateUp(); + * - Slideshow.navigateDown(); + * + * + * version 0.1: + * - First release + * + * version 0.2: + * - Refactored code and added inline documentation + * - Slides now have unique URL's + * - A basic API to invoke navigation was added + * + * version 0.3: + * - Added licensing terms + * + * + * @author Hakim El Hattab + * @version 0.3 + */ +var Slideshow = (function(){ + + var indexh = 0, + indexv = 0; + + /** + * Activates the main program logic. + */ + function initialize() { + document.addEventListener('keydown', onDocumentKeyDown, false); + document.addEventListener('touchstart', onDocumentTouchStart, false); + window.addEventListener('hashchange', onWindowHashChange, false); + + // Read the initial state of the URL (hash) + readURL(); + } + + /** + * Handler for the document level 'keydown' event. + * + * @param {Object} event + */ + function onDocumentKeyDown( event ) { + + if( event.keyCode >= 37 && event.keyCode <= 40 ) { + + switch( event.keyCode ) { + case 37: navigateLeft(); break; // left + case 39: navigateRight(); break; // right + case 38: navigateUp(); break; // up + case 40: navigateDown(); break; // down + } + + slide(); + + event.preventDefault(); + + } + } + + /** + * Handler for the document level 'touchstart' event. + * + * This enables very basic tap interaction for touch + * devices. Added mainly for performance testing of 3D + * transforms on iOS but was so happily surprised with + * how smoothly it runs so I left it in here. Apple +1 + * + * @param {Object} event + */ + function onDocumentTouchStart( event ) { + + // We're only interested in one point taps + if (event.touches.length == 1) { + event.preventDefault(); + + var point = { + x: event.touches[0].clientX, + y: event.touches[0].clientY + }; + + // Define the extent of the areas that may be tapped + // to navigate + var wt = window.innerWidth * 0.3; + var ht = window.innerHeight * 0.3; + + if( point.x < wt ) { + navigateLeft(); + } + else if( point.x > window.innerWidth - wt ) { + navigateRight(); + } + else if( point.y < ht ) { + navigateUp(); + } + else if( point.y > window.innerHeight - ht ) { + navigateDown(); + } + + slide(); + + } + } + + + /** + * Handler for the window level 'hashchange' event. + * + * @param {Object} event + */ + function onWindowHashChange( event ) { + readURL(); + } + + /** + * Updates one dimension of slides by showing the slide + * with the specified index. + * + * @param {String} selector A CSS selector that will fetch + * the group of slides we are working with + * @param {Number} index The index of the slide that should be + * shown + * + * @return {Number} The index of the slide that is now shown, + * might differ from the passed in index if it was out of + * bounds. + */ + function updateSlides( selector, index ) { + + // Select all slides and convert the NodeList result to + // an array + var slides = Array.prototype.slice.call( document.querySelectorAll( selector ) ); + + if( slides.length ) { + // Enforce max and minimum index bounds + index = Math.max(Math.min(index, slides.length - 1), 0); + + slides[index].setAttribute('class', 'present'); + + // Any element previous to index is given the 'past' class + slides.slice(0, index).map(function(element){ + element.setAttribute('class', 'past'); + }); + + // Any element subsequent to index is given the 'future' class + slides.slice(index + 1).map(function(element){ + element.setAttribute('class', 'future'); + }); + } + else { + // Since there are no slides we can't be anywhere beyond the + // zeroth index + index = 0; + } + + return index; + + } + + /** + * Updates the visual slides to represent the currently + * set indices. + */ + function slide() { + indexh = updateSlides( '#main>section', indexh ); + indexv = updateSlides( 'section.present>section', indexv ); + + writeURL(); + } + + /** + * Reads the current URL (hash) and navigates accordingly. + */ + function readURL() { + // Break the hash down to separate components + var bits = window.location.hash.slice(2).split('/'); + + // Read the index components of the hash + indexh = bits[0] ? parseInt( bits[0] ) : 0; + indexv = bits[1] ? parseInt( bits[1] ) : 0; + + navigateTo( indexh, indexv ); + } + + /** + * Updates the page URL (hash) to reflect the current + * navigational state. + */ + function writeURL() { + var url = '/'; + + // Only include the minimum possible number of components in + // the URL + if( indexh > 0 || indexv > 0 ) url += indexh + if( indexv > 0 ) url += '/' + indexv + + window.location.hash = url; + } + + /** + * Triggers a navigation to the specified indices. + * + * @param {Number} h The horizontal index of the slide to show + * @param {Number} v The vertical index of the slide to show + */ + function navigateTo( h, v ) { + indexh = h === undefined ? indexh : h; + indexv = v === undefined ? indexv : v; + + slide(); + } + + function navigateLeft() { + indexh --; + indexv = 0; + slide(); + } + function navigateRight() { + indexh ++; + indexv = 0; + slide(); + } + function navigateUp() { + indexv --; + slide(); + } + function navigateDown() { + indexv ++; + slide(); + } + + // Initialize the program. Done right before returning to ensure + // that any inline variable definitions are available to all + // functions + initialize(); + + // Expose some methods publicly + return { + navigateTo: navigateTo, + navigateLeft: navigateLeft, + navigateRight: navigateRight, + navigateUp: navigateUp, + navigateDown: navigateDown + }; + +})(); + |