CINXE.COM
Libby
<!DOCTYPE html> <html class="data-libby-ribbon_charlie"> <head> <title>Libby</title> <meta charset="utf-8" /> <meta name="description" content="All over the world, local libraries offer millions of ebooks and audiobooks. You can borrow them — for free, instantly — with a library card and Libby: the award-winning, much-loved app for libraries." /> <meta name="keywords" content="library,library card,library app, ebook,audiobook,magazine, novels,comics,manga, free ebooks,free audiobooks,epub" /> <link rel="author" href="https://overdrive.com" /> <meta name="x-dewey-version" content="18.7.1" /> <meta name="x-dewey-env" content="charlie" /> <meta name="x-roster-root" content="https://libbyapp.com" /> <meta name="x-sentry-uri" content="https://sentry.libbyapp.com" /> <meta name="x-sage-uri" content="https://sage.libbyapp.com" /> <meta name="x-vandal-uri" content="https://vandal.libbyapp.com" /> <meta name="x-thunder-uri" content="https://thunder.api.overdrive.com" /> <meta name="x-autocomplete-uri" content="https://autocomplete-cache.libbyapp.com" /> <meta name="x-autocomplete-key" content="ow232u624ymgimt8ilqxbq0ngu2ai502" /> <meta name="x-ntc-api-uri" content="https://ntc.api.overdrive.com" /> <meta name="x-ntc-site-uri" content="https://extras.overdrive.com" /> <meta name="x-ntc-target-client" content="ntc-website" /> <meta name="x-omc-faq-uri" content="" /> <meta name="viewport" content="initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,viewport-fit=cover" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="mobile-web-app-capable" content="yes" /> <meta name="theme-color" content="#FFF" /> <meta name="color-scheme" content="light dark" /> <meta name="supported-color-schemes" content="light dark" /> <link rel="manifest" href="/dewey-18.7.1/inc/web-app-manifest.json" /> <link rel="icon" href="/dewey-18.7.1/inc/images/libby-icon-android-192.png" sizes="192x192" /> <link rel="apple-touch-icon" href="/dewey-18.7.1/inc/images/libby-icon-ios-180.png" sizes="180x180" /> <style type="text/css" id="SPARK-splash"> html { font-size: 10px; } body { background: #F7F7F7; } #SPARK-style-canary { position: absolute; width: 100px; height: 100px; } .resource-error body { overflow: auto; } .resource-error .splash, .resource-error .arena { display: none; } .resource-error-message { position: absolute; top: 50%; left: 0; right: 0; width: 300px; margin: auto; color: #111; font-size: 1.7rem; line-height: 1.5; font-family: -apple-system,".SFNSText-Regular","San Francisco",Roboto,"Segoe UI","Helvetica Neue","Lucida Grande",sans-serif; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-text-size-adjust: none; -webkit-touch-callout: none; -ms-content-zooming: none; -ms-content-zoom-chaining: chained; -ms-content-zoom-limit-min: 100%; -ms-content-zoom-limit-max: 100%; -ms-touch-select: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .resource-error-button { -webkit-appearance: none; -moz-appearance: none; -ms-appearance: none; appearance: none; -webkit-transform: translateY(-50%); -moz-transform: translateY(-50%); -ms-transform: translateY(-50%); transform: translateY(-50%); display: block; width: 100%; color: #FFF; background-color: #A61C49; padding-top: 2rem; padding-bottom: 2rem; border-radius: 12px; font-size: 2.4rem; font-weight: 600; text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.25); outline: none !important; box-sizing: border-box; padding: 16px; border: 1px solid transparent; border-top-width: 0; border-bottom-width: 3px; border-bottom-color: rgba(0, 0, 0, 0.2); text-align: center; cursor: pointer; } .resource-error-button:active { border-width: 1px; border-top-width: 2px; border-color: rgba(0, 0, 0, 0.15); } .resource-error-message p { } .resource-error-message p a { color: #A61C49; text-decoration: underline; } .resource-error-reattempts { position: absolute; left: 0; right: 0; top: 100%; padding: 32px; text-align: center; font-size: 1.2rem; text-transform: uppercase; color: #CCC; } .spinner { position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 64px; height: 64px; } .spinner line { opacity: 0.2; animation: spinner-spoke 1440ms infinite; } .spinner line:nth-child(1) { animation-delay: 0ms; } .spinner line:nth-child(2) { animation-delay: 120ms; } .spinner line:nth-child(3) { animation-delay: 240ms; } .spinner line:nth-child(4) { animation-delay: 360ms; } .spinner line:nth-child(5) { animation-delay: 480ms; } .spinner line:nth-child(6) { animation-delay: 600ms; } .spinner line:nth-child(7) { animation-delay: 720ms; } .spinner line:nth-child(8) { animation-delay: 840ms; } .spinner line:nth-child(9) { animation-delay: 960ms; } .spinner line:nth-child(10) { animation-delay: 1080ms; } .spinner line:nth-child(11) { animation-delay: 1200ms; } .spinner line:nth-child(12) { animation-delay: 1320ms; } @keyframes spinner-spoke { 0% { opacity: 0.2; } 20% { opacity: 1; } 40% { opacity: 0.2; } } .splash { z-index: 999999; position: absolute; top: 0; left: 0; right: 0; bottom: 0; } .splash .wall { width: 100%; height: 100%; border: 40vw solid #F7F7F7; border-top-width: 40vh; border-bottom-width: 40vh; box-sizing: border-box; overflow: hidden; opacity: 1; transform: none; transition: opacity 100ms, transform 500ms ease-in-out; will-change: transform; } .splash .porthole { position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; width: 54px; height: 54px; border-radius: 100%; box-shadow: 0 0 0 500px #F7F7F7; } .splash .spinner { width: 172px; height: 172px; opacity: 0.1; transition: opacity 300ms linear 200ms; } .splash .mascot-app { position: absolute; width: 56px; height: 56px; top: 0; right: 0; bottom: 0; left: 0; margin: auto; overflow: hidden; border-radius: 50%; background: #631A35; transition: opacity 300ms linear 200ms; } .splash .mascot-hide { display: none; } .splash .mascot-libby { transform: translate3d(176px, 460px, 0); } .splash .mascot-book { transform: translate3d(93px, 660px, 0); display: block; } .data-libby-ribbon_beta .splash .mascot-env { fill: #FF6557; } .data-libby-ribbon_alpha .splash .mascot-env { fill: #F9A61F; } .data-libby-ribbon_dev .splash .mascot-env { fill: #FF00FF; } .data-splash_animate .splash { pointer-events: none; } .data-splash_animate .splash .wall { opacity: 0; transform: scale(20); transition: opacity 100ms linear 900ms, transform 500ms ease-in-out 500ms; } .data-splash_animate .splash .spinner { opacity: 0; transition: opacity 600ms; } .data-splash_animate .splash .mascot-app { opacity: 0; transition: opacity 200ms linear 300ms; } .data-splash_animate .splash .mascot-libby { transform: translate3d(176px, 1200px, 0); transition: transform 400ms ease-in-out; } .data-splash_animate .splash .mascot-book { transform: translate3d(93px, 1000px, 0); transition: transform 400ms ease-in-out; } .data-splash_hide .splash { display: none; } @media screen and (prefers-color-scheme: dark) { body { background: #000; } .splash .wall { border-color: #000; } .splash .porthole { box-shadow: 0 0 0 500px #000; } .resource-error-message { color: #DDD; } .resource-error-reattempts { color: #555; } } </style> </head> <body> <noscript></noscript> <div class="intro"> <h1>Libby</h1> <h2>The library app by OverDrive.®</h2> <p>Welcome! Thousands of public libraries offer ebooks and audiobooks (for free!) in Libby. Let me guide you to your library.</p> </div> <div class="splash" aria-hidden="true"> <div class="wall"> <div class="porthole"></div> </div> <svg class="spinner" version="1.1" viewBox="0 0 64 64" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"> <g fill="none" fill-rule="evenodd" stroke="none" stroke-linecap="round" stroke-width="1"> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="32" x2="32" y1="12.875" y2="16.125" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="41.5625" x2="39.9375" y1="15.4372642" y2="18.2518467" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="48.5627358" x2="45.7481533" y1="22.4375" y2="24.0625" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="51.125" x2="47.875" y1="32" y2="32" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="48.5627358" x2="45.7481533" y1="41.5625" y2="39.9375" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="41.5625" x2="39.9375" y1="48.5627358" y2="45.7481533" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="32" x2="32" y1="51.125" y2="47.875" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="22.4375" x2="24.0625" y1="48.5627358" y2="45.7481533" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="15.4372642" x2="18.2518467" y1="41.5625" y2="39.9375" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="12.875" x2="16.125" y1="32" y2="32" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="15.4372642" x2="18.2518467" y1="22.4375" y2="24.0625" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="22.4375" x2="24.0625" y1="15.4372642" y2="18.2518467" /> </g> </svg> <svg class="mascot-app" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"> <g class="mascot-symbol" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"> <rect class="mascot-field mascot-neg" fill="#631A35" height="1024" width="1024" x="0" y="0" /> <g class="mascot-libby" transform="translate(176, 141)"> <circle class="mascot-face mascot-skin" cx="335.288889" cy="408.6" fill="#FFEEAA" r="301.511111" /> <path class="mascot-ribbon mascot-env" d="M575.866667,0 L575.866877,132.724501 C536.369383,98.542223 489.840917,73.6268263 439.334189,59.2576616 L439.333333,0 C439.333333,0 495.85658,27.2560909 508.011843,27.2560909 C520.167106,27.2560909 575.866667,0 575.866667,0 Z" fill="#29CFC3" /> <path class="mascot-smile mascot-neg" d="M337.437218,637 C373.577624,637 411.903786,609.069428 402.581421,589.556231 C397.632623,579.495828 370.434217,602.351116 337.437218,602.735055 C306.017084,602.491949 279.100681,581.590515 273.595899,589.556231 C260.020059,608.630715 302.420908,637 337.437218,637 Z" fill="#631A35" /> <path class="mascot-eye-open mascot-neg" d="M466.064444,429.8 C489.260404,429.8 508.064444,448.574426 508.064444,471.733853 C508.064444,487.739636 499.082934,501.650978 485.877375,508.717912 C481.341414,490.449203 464.80951,476.908 445.109899,476.908 C437.944925,476.908 431.198994,478.699312 425.296858,481.857853 C424.491581,478.615212 424.064444,475.224336 424.064444,471.733853 C424.064444,448.574426 442.868485,429.8 466.064444,429.8 Z" fill="#631A35" /> <path class="mascot-eye-closed mascot-neg mascot-hide" d="M478.507344,506 C449.511019,506 416.962801,468.48562 420.61501,463.104313 C424.26722,457.723006 456.070312,472.539085 476.659354,472.539085 C499.009861,472.539085 533.454969,457.784134 537.056637,462.93865 C540.658305,468.093166 508.445302,506 478.507344,506 Z" fill="#631A35" /> <path class="mascot-mustache mascot-neg mascot-hide" d="M364.398286,547.097158 C337.797333,547.097158 335.291048,562.147285 335.291048,562.147285 C335.291048,562.147285 332.782387,547.097158 306.18381,547.097158 C279.585232,547.097158 273.060794,583.222428 244.449524,583.222428 C229.485628,583.222428 216.99331,576.525984 206.972571,563.133097 L206.972793,563.132931 C205.82782,561.599605 203.65663,561.284782 202.123303,562.429755 C201.094289,563.198146 200.574668,564.472658 200.773106,565.741484 C207.403339,607.840708 234.005871,628.890365 280.58127,628.890365 C280.58127,628.890365 315.715683,630.899441 335.288889,604.301349 C354.863175,630.899603 389.996508,628.890365 389.996508,628.890365 C437.882082,628.890365 464.655443,606.6367 470.316588,562.129372 L470.317028,562.129428 C470.496206,560.705419 469.487073,559.405779 468.063064,559.226601 C467.092307,559.104453 466.135217,559.537899 465.586699,560.348096 C455.251708,575.598104 442.096245,583.222428 426.122317,583.222428 C397.524,583.222428 390.999238,547.097158 364.398286,547.097158 Z" fill="#631A35" fill-rule="nonzero" /> <path class="mascot-hair" d="M336.14766,72.96 C518.312487,72.96 666.886702,209.915953 671.192855,400.58409 L671.199549,401.213192 L671.212174,401.83984 C671.23153,402.485024 671.242336,403.133604 671.251472,403.782796 C671.275141,405.555149 671.288889,407.329776 671.288889,409.10766 C671.288889,409.8799 671.288889,410.651537 671.281031,411.422562 L671.288889,409.10766 C671.288889,508.801959 632.049541,585.242896 569.006039,636.163849 L533.568342,636.170345 C579.609824,596.089855 613.382597,542.264551 628.444214,481.136659 L496.18663,353.422269 C526.332821,315.870732 551.293469,273.978176 569.982138,228.831035 L570.1092,228.427696 C570.329001,227.678111 570.490722,226.843305 570.581305,225.981466 C571.302924,219.115725 565.322128,212.964955 558.456388,212.243337 C553.138432,211.684397 548.106684,214.562929 545.852234,219.315022 C545.748937,219.53276 545.651955,219.753612 545.561421,219.977364 L545.549203,219.972028 C468.082235,404.31415 285.824633,533.76 73.3333333,533.76 C69.2499845,533.76 65.1778003,533.712199 61.1173096,533.617125 C79.1361408,573.092655 105.456985,608.021359 137.867435,636.170345 L102.423304,636.163849 C39.2419003,585.242012 0,508.799213 0,409.10766 C0,214.022593 150.273136,72.96 336.14766,72.96 Z" fill="#A81C49" /> </g> <g class="mascot-mortarboard mascot-hide" transform="translate(111, 151)"> <path class="mascot-cap mascot-neg" d="M398.965847,333.167852 L398.965689,333.273245 L398.821596,333.220247 L398.675689,333.273245 L398.675986,333.166694 C193.960441,257.874978 187.130471,258.336351 94.2264864,258.336351 L122.507124,110.283518 L679.571066,110.283518 L708.207435,258.336351 C614.134364,258.336351 606.260443,257.874973 398.965847,333.167852 L398.965847,333.167852 Z" fill="#631A35" /> <path class="mascot-ribbon-shadow mascot-neg" d="M254.217568,322.183483 L254.217568,416.86198 L213.445396,400.512974 L172.673223,416.86198 L172.673223,322.183483 C172.673223,302.78902 186.20008,286.551676 204.275328,282.37854 L204.275328,173.742098 L222.909635,177.162459 L222.909635,282.37854 C240.863557,286.651941 254.217568,302.88081 254.217568,322.183483 Z" fill="#631A35" /> <path class="mascot-cap-board" d="M381.4471,2.48810171 L16.6792885,98.0075246 C12.9655141,98.9800271 9.86622078,100.194075 7.34516521,101.789329 C2.99305793,104.543221 -0.0587289394,108.5816 0,114.24146 C0.0604381746,119.900781 3.19595551,123.873745 7.60436538,126.535684 C10.1580504,128.07768 13.2817343,129.226518 17.0144338,130.120996 L381.576491,217.482099 C394.280424,220.526381 413.842707,220.491659 426.531411,217.402157 L784.750563,130.181372 C788.491285,129.270565 791.623357,128.100015 794.182249,126.529726 C798.556872,123.845195 801.655527,119.854242 801.713179,114.234693 C801.769219,108.618285 798.755489,104.566977 794.43981,101.792322 C791.914734,100.168889 788.808169,98.9324179 785.087801,97.9425308 L426.664822,2.57609022 C413.883215,-0.824741861 394.243211,-0.862734446 381.4471,2.48810171 Z" fill="#A81C49" fill-rule="nonzero" /> <path class="mascot-cap-ribbon mascot-env" d="M240.323202,313.739402 L240.323202,408.4179 L199.551029,392.068893 L158.778857,408.4179 L158.778857,313.739402 C158.778857,294.34494 172.305714,278.107596 190.380961,273.934459 L190.380961,168.718378 L384.06543,106.051996 C385.897506,101.273195 392.717062,97.7239443 400.849711,97.7239443 C410.386683,97.7239443 418.117925,102.604772 418.117925,108.625579 C418.117925,114.646385 410.386683,119.527213 400.849711,119.527213 C398.688361,119.527213 396.619754,119.276531 394.712861,118.81871 L209.015269,176.296192 L209.015269,273.934459 C226.969191,278.207861 240.323202,294.43673 240.323202,313.739402 Z" fill="#50DCD2" /> </g> <g class="mascot-book mascot-hide" transform="translate(93, 740)"> <path class="mascot-pages-outline mascot-neg" d="M155.386355,4.08339989 C282.100479,26.4523541 362.63836,47.4071684 397,66.9478425 C407.794501,67.0271275 429.675832,67.0271275 441,66.9478425 C475.416135,47.4096207 553.831275,26.5967509 676.24542,4.50923327 L676.245358,4.50888964 C730.596387,-5.29672836 782.605625,30.8144618 792.411243,85.1654904 C793.468333,91.0247783 794.000031,96.9667663 794,102.920647 L794,567.948688 L794,567.948688 L38,567.948688 L38.0000001,102.555916 C38.0023843,47.3274407 82.7758421,2.55784848 138.004317,2.56023272 C143.831647,2.56048429 149.647802,3.07010008 155.38638,4.08326174 Z" fill="#631A35" /> <path class="mascot-pages" d="M110.482558,32.2879359 C263.234748,57.5234101 358.740562,81.0387852 397,102.834061 C407.794501,102.784069 429.675832,102.784069 441,102.834061 C479.468998,80.9574333 572.909855,57.5208232 721.32257,32.524231 L721.322674,32.5248449 C755.264155,26.80614 787.415088,49.6852206 793.133793,83.6267018 C793.710343,87.0486207 794.000085,90.5127152 794,93.9828648 L794,580.834061 L794,580.834061 L38,580.834061 L38,93.7777867 C37.999661,59.3579127 65.9022071,31.4548168 100.322081,31.4544778 C103.725978,31.4544443 107.124156,31.7332774 110.482518,32.2881794 Z" fill="#FFFFFF" /> <path class="mascot-back-cover" d="M419,580.834061 L419,126.834061 L52,59.8340611 C23.0931158,54.3789139 0.500429554,74.2934641 1,103.834061 L0,580.834061 L419,580.834061 Z" fill="#29CFC3" /> <path class="mascot-front-cover" d="M419,580.834061 L419,125.834061 L786,58.8340611 C815.291609,53.3821225 839,73.2823301 839,102.834061 L839,580.834061 L419,580.834061 Z" fill="#23B0A7" /> <polygon class="mascot-spine" fill="#26BFB5" points="473 580.834061 473 116.834061 364 116.834061 364 580.834061" /> </g> </g> </svg> </div> <div class="runtime" aria-hidden="true"> <div id="SPARK-style-canary"></div> <script type="text/javascript" id="SPARK-error-handling"> window.SPARK = {}; SPARK.handleReady = function () { clearTimeout(SPARK.loadTimer); SPARK.reattempts(0); var scriptTag = document.querySelector('#SPARK-error-handling'); if (scriptTag) { scriptTag.parentNode.removeChild(scriptTag); } } SPARK.onScriptError = function (errorMessage, url, lineNumber) { if (window.stop) { window.stop(); } SPARK.handleError({ message: 'SCRIPT ERROR: '+errorMessage, source: url + (lineNumber ? ':' + lineNumber : '') }); } SPARK.onResourceError = function (elem) { if (window.stop) { window.stop(); } var source = elem; try { source = elem.href || elem.src || elem.outerHTML; } catch (e) {}; SPARK.handleError({ message: 'RESOURCE ERROR', source: source }); } SPARK.handleError = function (errorInfo) { var noscript = document.querySelector('noscript'); var intro = document.querySelector('.intro'); if (noscript && intro && noscript != intro.parentNode) { noscript.appendChild(intro); } console.warn('[SPARK] %s: %s', errorInfo.message, errorInfo.source); SPARK.errorInfo = errorInfo; SPARK.errorsDuringLaunch = SPARK.errorsDuringLaunch || []; SPARK.errorsDuringLaunch.push(errorInfo); SPARK.submitAutomaticErrorReport(); SPARK.schedule(SPARK.autoRepair, 250); } SPARK.submitAutomaticErrorReport = function () { SPARK.transmitViaBridge({ name: 'diagnostics:client:error', error: SPARK.errorInfo }); try { var sageURL = 'https://sage.libbyapp.com/submit/error'; var sageBody = JSON.stringify({ errorMessage: SPARK.errorInfo.message, errorSource: SPARK.errorInfo.source, errorData: { phase: 'launch' }, userAgentString: navigator.userAgent, userAgentWidth: window.innerWidth, userAgentHeight: window.innerHeight, shouldPersist: false }); if (location.origin.match(/^ms-local-stream/)) { sageURL += '?_nautilus_origin='+location.origin; } console.log('[SAGE] -> '+sageURL, sageBody); var xhr = new XMLHttpRequest(); xhr.open('POST', sageURL, true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(sageBody); } catch (e) { console.warn('[SAGE] Error submitting auto report', e); } } SPARK.transmitViaBridge = function (msg) { try { msg.dest = msg.dest || 'shell'; if (window.BRIDGE && window.BRIDGE.clientToShell) { window.BRIDGE.clientToShell(msg); return true; } else if (window.BRIDGE && window.BRIDGE.clientToShellAsJSON) { window.BRIDGE.clientToShellAsJSON(JSON.stringify(msg)); return true; } } catch (e) {} console.warn('[SPARK] failed to transmit:', msg); return false; } SPARK.showRetryButton = function () { var msgBox = document.querySelector('.resource-error-message'); if (msgBox) { return msgBox; }; document.documentElement.className = 'resource-error'; msgBox = document.createElement('div'); msgBox.className = 'resource-error-message'; document.body.appendChild(msgBox); var retryForm = document.createElement('form'); retryForm.className = 'resource-error-form'; retryForm.setAttribute('action', '/'); retryForm.addEventListener('submit', function (evt) { evt.preventDefault(); SPARK.manualRepair(); }, false); msgBox.appendChild(retryForm); var retryTimestamp = document.createElement('input'); retryTimestamp.setAttribute('type', 'hidden'); retryTimestamp.setAttribute('name', 'repair'); retryTimestamp.setAttribute('value', (new Date()).getTime()); retryForm.appendChild(retryTimestamp); var retryButton = document.createElement('input'); retryButton.className = 'resource-error-button'; retryButton.setAttribute('type', 'submit'); retryButton.setAttribute('value', 'Try Again'); retryForm.appendChild(retryButton); var reattempts = SPARK.reattempts(); if (reattempts) { var reattemptCounter = document.createElement('div'); reattemptCounter.className = 'resource-error-reattempts'; reattemptCounter.innerHTML = 'Attempts'+': '+reattempts; msgBox.appendChild(reattemptCounter); } SPARK.transmitViaBridge({ name: 'client:view:reveal' }); return msgBox; } SPARK.manualRepair = function (callback) { SPARK.reattempts(SPARK.reattempts() + 1); SPARK.transmitViaBridge({ name: 'roster:wipe', roster: { id: 'dewey-js', version: '18.7.1' } }); SPARK.schedule(function () { document.documentElement.removeAttribute('class'); location.href = '/?repair='+(new Date()).getTime(); }, 200); } SPARK.autoRepair = function () { var reattempts = SPARK.reattempts(); if (reattempts < 1) { SPARK.schedule(SPARK.showRetryButton, 200); } else { SPARK.transmitViaBridge({ name: 'client:view:failure', error: SPARK.errorInfo }); SPARK.schedule(SPARK.fallbackWithApology, 500); } } SPARK.fallbackWithApology = function () { var msgBox = SPARK.showRetryButton(); var apologyPara = msgBox.querySelector('.resource-error-apology'); if (!apologyPara) { apologyPara = document.createElement('p'); apologyPara.className = 'resource-error-apology'; apologyPara.innerHTML = 'We’re having no luck repairing your access to Libby. Sorry, we understand this is frustrating. Consider reporting the problem to our <a href="https://www.surveygizmo.com/s3/3216684/Libby-Support-Form" target="_blank" rel="noopener" >Support</a> team.'; msgBox.appendChild(apologyPara); } } SPARK.schedule = function (callback, ms) { clearTimeout(SPARK.errorTimer); SPARK.errorTimer = setTimeout(callback, ms || 0); } SPARK.reattempts = function (assignValue) { var key = 'SPARK-retry-attempts'; if (typeof assignValue != 'undefined') { try { if (assignValue) { localStorage.setItem(key, assignValue); } else { localStorage.removeItem(key); } return assignValue; } catch (e) {}; } try { return parseFloat(localStorage.getItem(key)) || 0; } catch (e) {}; return 0; } SPARK.loadTimeout = function () { SPARK.handleError({ message: 'LOAD TIMEOUT' }); } SPARK.loadTimer = setTimeout(SPARK.loadTimeout, 30000); window.onerror = SPARK.onScriptError; window.addEventListener('environment:ready', SPARK.handleReady, true); </script> <link rel="stylesheet" type="text/css" href="/dewey-18.7.1/css/main.css" onerror="SPARK.onResourceError(this)" /> <style type="text/css" id="SPARK-display-area"></style> <script type="text/javascript" id="SPARK-script-loading"> SPARK.locale = (function () { var locale = {}; locale.available = ["en-US","de-DE","es-419","fr-CA","it-IT","ja-JP","ru-RU","sv-SE","zh-Hans-CN","zh-Hant-TW","en-GB","da-DK","is-IS","ko-KR","ms-SG","ta-SG","mi-NZ","cy-GB"]; var inferenceRanges = [ 'zh-cmn', 'zh-cmn-Hans', 'zh-cmn-Hant', 'zh-cmn-CN', 'zh-cmn-SG', 'zh-cmn-HK', 'zh-cmn-TW', 'zh-cmn-MO', 'zh-cmn-Hans-CN', 'zh-cmn-Hans-SG', 'zh-cmn-Hant-HK', 'zh-cmn-Hant-TW', 'zh-cmn-Hant-MO' ]; var inferenceRules = []; for (var i = 0, ii = inferenceRanges.length; i < ii; ++i) { var subtags = inferenceRanges[i].toUpperCase().split('-'); inferenceRules.push([ subtags.length - 2, subtags.slice(0, -2), subtags[subtags.length - 2], subtags[subtags.length - 1] ]); } inferenceRules.sort(function (a, b) { return a[0] - b[0]; }); var nautAndroidOverrides = function () { var navTags = Array.prototype.slice.apply(window.navigator.languages || []); if (navTags.length <= 1) { return []; } else if (navTags[navTags.length - 1] == 'en-US') { navTags.pop(); } var overrideTags = []; for (var i = 0, ii = navTags.length; i < ii; ++i) { if (!navTags[i].match('-')) { overrideTags = navTags; break; } overrideTags.push(navTags[i]); var lang = navTags[i].replace(/-[^-]*$/, ''); if ( overrideTags.indexOf(lang) < 0 && (navTags[i+1] || '').replace(/-[^-]*$/, '') != lang ) { overrideTags.push(lang); } } return overrideTags.slice(0, 16); } var prepareSubtags = function (tag, inferences) { var subtags = tag.toUpperCase().split('-'); for (var i = 0, ii = inferenceRules.length; i < ii; ++i) { var rule = inferenceRules[i]; var index = rule[0], prefix = rule[1], insert = rule[2], match = rule[3]; if (subtags[index] == match && subtags.slice(0,index).join('-') == prefix.join('-')) { if (inferences) { inferences[prefix] = inferences[prefix] || []; inferences[prefix].push(prefix.concat([insert])); } subtags.splice(index, 0, insert); } } return subtags; } var prepareRanges = function (ranges) { var inferences = {}; var out = []; for (var i = 0, ii = ranges.length; i < ii; ++i) { var range = ranges[i]; if (range == '*') { out.push(range); } else { var subtags = prepareSubtags(range, inferences); out.push(expandRange(subtags, inferences)); } } return flatten(out, 1); } var expandRange = function (range, inferences) { var out = []; if (inferences[range]) { for (var i = 0, ii = inferences[range].length; i < ii; ++i) { out.push(expandRange(inferences[range][i], inferences)); } } return flatten(out, 1).concat([range]); } var flatten = function (arr, level) { level = (typeof level == 'number') ? level : Infinity; var out = []; for (var i = 0, ii = arr.length; i < ii; ++i) { if (level && arr[i] instanceof Array) { out = out.concat(flatten(arr[i], level - 1)); } else { out.push(arr[i]); } } return out; } var compact = function (arr) { var out = []; for (var i = 0, ii = arr.length; i < ii; ++i) { if (arr[i] && out.indexOf(arr[i]) < 0) { out.push(arr[i]); } } return out; } locale.negotiate = function (requestedRanges, availableRanges) { if (!(requestedRanges instanceof Array)) { return []; } if (typeof requestedRanges[0] != 'string') { return []; } if (typeof availableRanges == 'undefined') { availableRanges = locale.available; } var availableRules = []; for (var i = 0, ii = availableRanges.length; i < ii; ++i) { availableRules.push([ availableRanges[i], prepareSubtags(availableRanges[i]) ]); } var ranges = prepareRanges(requestedRanges); var combos = []; for (var i = 0, ii = ranges.length; i < ii; ++i) { var range = ranges[i]; for (var j = 0, jj = availableRules.length; j < jj; ++j) { var tag = availableRules[j][0], subtags = availableRules[j][1]; var divergence = range.length; if (range[0] != '*') { for (var k = 0, kk = range.length; k < kk; ++k) { if (range[k] != subtags[k]) { divergence = k; break; } } } var precision = divergence / range.length; if (precision > 0) { combos.push([tag, precision, combos.length]); } } } combos.sort(function (a,b) { return (b[1] == a[1]) ? (a[2] - b[2]) : (b[1] - a[1]); }); var out = []; for (var i = 0, ii = combos.length; i < ii; ++i) { if (out.indexOf(combos[i][0]) < 0) { out.push(combos[i][0]); } } return out; } locale.determine = function () { this.userOverrideTags = [( window.localStorage && window.localStorage.getItem('SPARK:locale') )]; if (navigator.userAgent.match(/Dewey.*Android/)) { this.userOverrideTags.push.apply(this.userOverrideTags, nautAndroidOverrides()); } this.userOverrideTags = compact(this.userOverrideTags); this.userAgentTags = compact(flatten([ window.navigator.languages, window.navigator.language, window.navigator.browserLanguage ])); this.serverDefaultTag = 'en-US'; this.tag = ( this.negotiate(this.userOverrideTags)[0] || this.negotiate(this.userAgentTags)[0] || this.serverDefaultTag ); this.acceptTags = compact(flatten([this.userOverrideTags, this.userAgentTags])); this.isUserAgentDefault = (this.tag == this.negotiate(this.userAgentTags)[0]); this.isEnglish = this.tag.match(/^en(-|$)/) ? true : false; } locale.determine(); return locale; })(); SPARK.loadJavaScript = function (src) { var script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', src); script.async = false; script.onerror = SPARK.onResourceError.bind(this); document.getElementsByClassName('runtime')[0].appendChild(script); return script; } if ( !window.Intl || !window.Intl.PluralRules || !window.Intl.ListFormat || !window.Intl.RelativeTimeFormat ) { SPARK.loadJavaScript('/dewey-18.7.1/inc/polyfills/i18n/'+SPARK.locale.tag+'.js'); } SPARK.loadJavaScript('/dewey-18.7.1/inc/str/'+SPARK.locale.tag+'.js'); SPARK.loadJavaScript('/dewey-18.7.1/src/main.js'); document.querySelector('noscript').appendChild(document.querySelector('.intro')); </script> </div> </body> </html>