From 5e6c268e8366a7c7f868ee9d0ca06fa5abd6f7e6 Mon Sep 17 00:00:00 2001 From: Fred Chasen Date: Wed, 26 Oct 2016 17:05:27 +0200 Subject: [PATCH] Added webpack build, karma test runner, travis config --- .gitmodules | 3 - .jshintrc | 11 +- .npmignore | 1 + .travis.yml | 3 + dist/epub.js | 26599 ++++++++-------- dist/epub.js.map | 2 +- dist/epub.min.js | 53 +- dist/epub.min.js.map | 1 - gulpfile.js | 167 +- karma.conf.js | 102 + package.json | 24 +- src/epub.js | 1 - src/request.js | 12 +- test/epub.js | 31 +- test/epubcfi.js | 19 +- test/fixtures/alice.epub | Bin 0 -> 536540 bytes test/fixtures/alice/META-INF/container.xml | 5 + test/fixtures/alice/OPS/chapter_001.xhtml | 139 + test/fixtures/alice/OPS/chapter_002.xhtml | 141 + test/fixtures/alice/OPS/chapter_003.xhtml | 177 + test/fixtures/alice/OPS/chapter_004.xhtml | 159 + test/fixtures/alice/OPS/chapter_005.xhtml | 149 + test/fixtures/alice/OPS/chapter_006.xhtml | 122 + test/fixtures/alice/OPS/chapter_007.xhtml | 98 + test/fixtures/alice/OPS/chapter_008.xhtml | 151 + test/fixtures/alice/OPS/chapter_009.xhtml | 100 + test/fixtures/alice/OPS/chapter_010.xhtml | 104 + test/fixtures/alice/OPS/cover.xhtml | 12 + test/fixtures/alice/OPS/css/stylesheet.css | 105 + test/fixtures/alice/OPS/images/cover_th.jpg | Bin 0 -> 36192 bytes test/fixtures/alice/OPS/images/i001_th.jpg | Bin 0 -> 7606 bytes test/fixtures/alice/OPS/images/i002_th.jpg | Bin 0 -> 6100 bytes test/fixtures/alice/OPS/images/i003_th.jpg | Bin 0 -> 13746 bytes test/fixtures/alice/OPS/images/i004_th.jpg | Bin 0 -> 11550 bytes test/fixtures/alice/OPS/images/i005_th.jpg | Bin 0 -> 15846 bytes test/fixtures/alice/OPS/images/i006_th.jpg | Bin 0 -> 18305 bytes test/fixtures/alice/OPS/images/i007_th.jpg | Bin 0 -> 6636 bytes test/fixtures/alice/OPS/images/i008_th.jpg | Bin 0 -> 14681 bytes test/fixtures/alice/OPS/images/i009_th.jpg | Bin 0 -> 21200 bytes test/fixtures/alice/OPS/images/i010_th.jpg | Bin 0 -> 3448 bytes test/fixtures/alice/OPS/images/i011_th.jpg | Bin 0 -> 17046 bytes test/fixtures/alice/OPS/images/i012_th.jpg | Bin 0 -> 19514 bytes test/fixtures/alice/OPS/images/i013_th.jpg | Bin 0 -> 17064 bytes test/fixtures/alice/OPS/images/i014_th.jpg | Bin 0 -> 15247 bytes test/fixtures/alice/OPS/images/i015_th.jpg | Bin 0 -> 14489 bytes test/fixtures/alice/OPS/images/i016_th.jpg | Bin 0 -> 14909 bytes test/fixtures/alice/OPS/images/i017_th.jpg | Bin 0 -> 18503 bytes test/fixtures/alice/OPS/images/i018_th.jpg | Bin 0 -> 14143 bytes test/fixtures/alice/OPS/images/i019_th.jpg | Bin 0 -> 7215 bytes test/fixtures/alice/OPS/images/i020_th.jpg | Bin 0 -> 13649 bytes test/fixtures/alice/OPS/images/i022_th.jpg | Bin 0 -> 14295 bytes test/fixtures/alice/OPS/images/ii021_th.jpg | Bin 0 -> 10233 bytes test/fixtures/alice/OPS/images/plate01_th.jpg | Bin 0 -> 42546 bytes test/fixtures/alice/OPS/images/plate02_th.jpg | Bin 0 -> 42694 bytes test/fixtures/alice/OPS/images/plate03_th.jpg | Bin 0 -> 42230 bytes test/fixtures/alice/OPS/images/plate04_th.jpg | Bin 0 -> 44618 bytes test/fixtures/alice/OPS/images/title.jpg | Bin 0 -> 1667 bytes test/fixtures/alice/OPS/package.opf | 84 + test/fixtures/alice/OPS/titlepage.xhtml | 42 + test/fixtures/alice/OPS/toc.xhtml | 33 + test/fixtures/alice/mimetype | 1 + test/index.html | 27 +- webpack.config.js | 31 + 63 files changed, 15767 insertions(+), 12942 deletions(-) delete mode 100644 .gitmodules create mode 100644 .travis.yml delete mode 100644 dist/epub.min.js.map create mode 100644 karma.conf.js create mode 100644 test/fixtures/alice.epub create mode 100644 test/fixtures/alice/META-INF/container.xml create mode 100644 test/fixtures/alice/OPS/chapter_001.xhtml create mode 100644 test/fixtures/alice/OPS/chapter_002.xhtml create mode 100644 test/fixtures/alice/OPS/chapter_003.xhtml create mode 100644 test/fixtures/alice/OPS/chapter_004.xhtml create mode 100644 test/fixtures/alice/OPS/chapter_005.xhtml create mode 100644 test/fixtures/alice/OPS/chapter_006.xhtml create mode 100644 test/fixtures/alice/OPS/chapter_007.xhtml create mode 100644 test/fixtures/alice/OPS/chapter_008.xhtml create mode 100644 test/fixtures/alice/OPS/chapter_009.xhtml create mode 100644 test/fixtures/alice/OPS/chapter_010.xhtml create mode 100644 test/fixtures/alice/OPS/cover.xhtml create mode 100644 test/fixtures/alice/OPS/css/stylesheet.css create mode 100644 test/fixtures/alice/OPS/images/cover_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i001_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i002_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i003_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i004_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i005_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i006_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i007_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i008_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i009_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i010_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i011_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i012_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i013_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i014_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i015_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i016_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i017_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i018_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i019_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i020_th.jpg create mode 100644 test/fixtures/alice/OPS/images/i022_th.jpg create mode 100644 test/fixtures/alice/OPS/images/ii021_th.jpg create mode 100644 test/fixtures/alice/OPS/images/plate01_th.jpg create mode 100644 test/fixtures/alice/OPS/images/plate02_th.jpg create mode 100644 test/fixtures/alice/OPS/images/plate03_th.jpg create mode 100644 test/fixtures/alice/OPS/images/plate04_th.jpg create mode 100644 test/fixtures/alice/OPS/images/title.jpg create mode 100644 test/fixtures/alice/OPS/package.opf create mode 100644 test/fixtures/alice/OPS/titlepage.xhtml create mode 100644 test/fixtures/alice/OPS/toc.xhtml create mode 100644 test/fixtures/alice/mimetype create mode 100644 webpack.config.js diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 4f3760c1c..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "books"] - path = books - url = https://github.com/futurepress/books.git diff --git a/.jshintrc b/.jshintrc index aacee1a33..c2b6f01d5 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,16 +1,11 @@ { - // Environments "browser": true, "devel": true, "worker": true, - // Enforcing - //"maxlen": 80, - //"quotmark": "single", "trailing": true, "strict": false, - - // Relaxing + "boss": true, "funcscope": true, "globalstrict": true, @@ -19,8 +14,8 @@ "nonstandard": true, "sub": true, "validthis": true, - - "globals": { + + "globals": { "_": false, "define" : false, "module" : false diff --git a/.npmignore b/.npmignore index 99c53ca74..497933fb0 100644 --- a/.npmignore +++ b/.npmignore @@ -1 +1,2 @@ books +test diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..baa0031d5 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.8 diff --git a/dist/epub.js b/dist/epub.js index 1055064e6..ab317dbb7 100644 --- a/dist/epub.js +++ b/dist/epub.js @@ -1,12999 +1,14008 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ePub = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 -} - -function byteLength (b64) { - // base64 is 4/3 + up to two characters of the original data - return b64.length * 3 / 4 - placeHoldersCount(b64) -} - -function toByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - var len = b64.length - placeHolders = placeHoldersCount(b64) - - arr = new Arr(len * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len - - var L = 0 - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] - arr[L++] = (tmp >> 16) & 0xFF - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[L++] = tmp & 0xFF - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output.push(tripletToBase64(tmp)) - } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var output = '' - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - output += lookup[tmp >> 2] - output += lookup[(tmp << 4) & 0x3F] - output += '==' - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) - output += lookup[tmp >> 10] - output += lookup[(tmp >> 4) & 0x3F] - output += lookup[(tmp << 2) & 0x3F] - output += '=' - } - - parts.push(output) - - return parts.join('') -} - -},{}],3:[function(require,module,exports){ - -},{}],4:[function(require,module,exports){ -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],5:[function(require,module,exports){ -(function (process,global){ -/*! - * @overview RSVP - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE - * @version 3.3.2 - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global.RSVP = global.RSVP || {}))); -}(this, (function (exports) { 'use strict'; - -function indexOf(callbacks, callback) { - for (var i = 0, l = callbacks.length; i < l; i++) { - if (callbacks[i] === callback) { - return i; - } - } - - return -1; -} - -function callbacksFor(object) { - var callbacks = object._promiseCallbacks; - - if (!callbacks) { - callbacks = object._promiseCallbacks = {}; - } - - return callbacks; -} - -/** - @class RSVP.EventTarget -*/ -var EventTarget = { - - /** - `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For - Example: - ```javascript - let object = {}; - RSVP.EventTarget.mixin(object); - object.on('finished', function(event) { - // handle event - }); - object.trigger('finished', { detail: value }); - ``` - `EventTarget.mixin` also works with prototypes: - ```javascript - let Person = function() {}; - RSVP.EventTarget.mixin(Person.prototype); - let yehuda = new Person(); - let tom = new Person(); - yehuda.on('poke', function(event) { - console.log('Yehuda says OW'); - }); - tom.on('poke', function(event) { - console.log('Tom says OW'); - }); - yehuda.trigger('poke'); - tom.trigger('poke'); - ``` - @method mixin - @for RSVP.EventTarget - @private - @param {Object} object object to extend with EventTarget methods - */ - mixin: function mixin(object) { - object['on'] = this['on']; - object['off'] = this['off']; - object['trigger'] = this['trigger']; - object._promiseCallbacks = undefined; - return object; - }, - - /** - Registers a callback to be executed when `eventName` is triggered - ```javascript - object.on('event', function(eventInfo){ - // handle the event - }); - object.trigger('event'); - ``` - @method on - @for RSVP.EventTarget - @private - @param {String} eventName name of the event to listen for - @param {Function} callback function to be called when the event is triggered. - */ - on: function on(eventName, callback) { - if (typeof callback !== 'function') { - throw new TypeError('Callback must be a function'); - } - - var allCallbacks = callbacksFor(this), - callbacks = undefined; - - callbacks = allCallbacks[eventName]; - - if (!callbacks) { - callbacks = allCallbacks[eventName] = []; - } - - if (indexOf(callbacks, callback) === -1) { - callbacks.push(callback); - } - }, - - /** - You can use `off` to stop firing a particular callback for an event: - ```javascript - function doStuff() { // do stuff! } - object.on('stuff', doStuff); - object.trigger('stuff'); // doStuff will be called - // Unregister ONLY the doStuff callback - object.off('stuff', doStuff); - object.trigger('stuff'); // doStuff will NOT be called - ``` - If you don't pass a `callback` argument to `off`, ALL callbacks for the - event will not be executed when the event fires. For example: - ```javascript - let callback1 = function(){}; - let callback2 = function(){}; - object.on('stuff', callback1); - object.on('stuff', callback2); - object.trigger('stuff'); // callback1 and callback2 will be executed. - object.off('stuff'); - object.trigger('stuff'); // callback1 and callback2 will not be executed! - ``` - @method off - @for RSVP.EventTarget - @private - @param {String} eventName event to stop listening to - @param {Function} callback optional argument. If given, only the function - given will be removed from the event's callback queue. If no `callback` - argument is given, all callbacks will be removed from the event's callback - queue. - */ - off: function off(eventName, callback) { - var allCallbacks = callbacksFor(this), - callbacks = undefined, - index = undefined; - - if (!callback) { - allCallbacks[eventName] = []; - return; - } - - callbacks = allCallbacks[eventName]; - - index = indexOf(callbacks, callback); - - if (index !== -1) { - callbacks.splice(index, 1); - } - }, - - /** - Use `trigger` to fire custom events. For example: - ```javascript - object.on('foo', function(){ - console.log('foo event happened!'); - }); - object.trigger('foo'); - // 'foo event happened!' logged to the console - ``` - You can also pass a value as a second argument to `trigger` that will be - passed as an argument to all event listeners for the event: - ```javascript - object.on('foo', function(value){ - console.log(value.name); - }); - object.trigger('foo', { name: 'bar' }); - // 'bar' logged to the console - ``` - @method trigger - @for RSVP.EventTarget - @private - @param {String} eventName name of the event to be triggered - @param {*} options optional value to be passed to any event handlers for - the given `eventName` - */ - trigger: function trigger(eventName, options, label) { - var allCallbacks = callbacksFor(this), - callbacks = undefined, - callback = undefined; - - if (callbacks = allCallbacks[eventName]) { - // Don't cache the callbacks.length since it may grow - for (var i = 0; i < callbacks.length; i++) { - callback = callbacks[i]; - - callback(options, label); - } - } - } -}; - -var config = { - instrument: false -}; - -EventTarget['mixin'](config); - -function configure(name, value) { - if (name === 'onerror') { - // handle for legacy users that expect the actual - // error to be passed to their function added via - // `RSVP.configure('onerror', someFunctionHere);` - config['on']('error', value); - return; - } - - if (arguments.length === 2) { - config[name] = value; - } else { - return config[name]; - } -} - -function objectOrFunction(x) { - return typeof x === 'function' || typeof x === 'object' && x !== null; -} - -function isFunction(x) { - return typeof x === 'function'; -} - -function isMaybeThenable(x) { - return typeof x === 'object' && x !== null; -} - -var _isArray = undefined; -if (!Array.isArray) { - _isArray = function (x) { - return Object.prototype.toString.call(x) === '[object Array]'; - }; -} else { - _isArray = Array.isArray; -} - -var isArray = _isArray; - -// Date.now is not available in browsers < IE9 -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility -var now = Date.now || function () { - return new Date().getTime(); -}; - -function F() {} - -var o_create = Object.create || function (o) { - if (arguments.length > 1) { - throw new Error('Second argument not supported'); - } - if (typeof o !== 'object') { - throw new TypeError('Argument must be an object'); - } - F.prototype = o; - return new F(); -}; - -var queue = []; - -function scheduleFlush() { - setTimeout(function () { - for (var i = 0; i < queue.length; i++) { - var entry = queue[i]; - - var payload = entry.payload; - - payload.guid = payload.key + payload.id; - payload.childGuid = payload.key + payload.childId; - if (payload.error) { - payload.stack = payload.error.stack; - } - - config['trigger'](entry.name, entry.payload); - } - queue.length = 0; - }, 50); -} -function instrument(eventName, promise, child) { - if (1 === queue.push({ - name: eventName, - payload: { - key: promise._guidKey, - id: promise._id, - eventName: eventName, - detail: promise._result, - childId: child && child._id, - label: promise._label, - timeStamp: now(), - error: config["instrument-with-stack"] ? new Error(promise._label) : null - } })) { - scheduleFlush(); - } -} - -/** - `RSVP.Promise.resolve` returns a promise that will become resolved with the - passed `value`. It is shorthand for the following: - - ```javascript - let promise = new RSVP.Promise(function(resolve, reject){ - resolve(1); - }); - - promise.then(function(value){ - // value === 1 - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = RSVP.Promise.resolve(1); - - promise.then(function(value){ - // value === 1 - }); - ``` - - @method resolve - @static - @param {*} object value that the returned promise will be resolved with - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise that will become fulfilled with the given - `value` -*/ -function resolve$1(object, label) { - /*jshint validthis:true */ - var Constructor = this; - - if (object && typeof object === 'object' && object.constructor === Constructor) { - return object; - } - - var promise = new Constructor(noop, label); - resolve(promise, object); - return promise; -} - -function withOwnPromise() { - return new TypeError('A promises callback cannot return that same promise.'); -} - -function noop() {} - -var PENDING = void 0; -var FULFILLED = 1; -var REJECTED = 2; - -var GET_THEN_ERROR = new ErrorObject(); - -function getThen(promise) { - try { - return promise.then; - } catch (error) { - GET_THEN_ERROR.error = error; - return GET_THEN_ERROR; - } -} - -function tryThen(then, value, fulfillmentHandler, rejectionHandler) { - try { - then.call(value, fulfillmentHandler, rejectionHandler); - } catch (e) { - return e; - } -} - -function handleForeignThenable(promise, thenable, then) { - config.async(function (promise) { - var sealed = false; - var error = tryThen(then, thenable, function (value) { - if (sealed) { - return; - } - sealed = true; - if (thenable !== value) { - resolve(promise, value, undefined); - } else { - fulfill(promise, value); - } - }, function (reason) { - if (sealed) { - return; - } - sealed = true; - - reject(promise, reason); - }, 'Settle: ' + (promise._label || ' unknown promise')); - - if (!sealed && error) { - sealed = true; - reject(promise, error); - } - }, promise); -} - -function handleOwnThenable(promise, thenable) { - if (thenable._state === FULFILLED) { - fulfill(promise, thenable._result); - } else if (thenable._state === REJECTED) { - thenable._onError = null; - reject(promise, thenable._result); - } else { - subscribe(thenable, undefined, function (value) { - if (thenable !== value) { - resolve(promise, value, undefined); - } else { - fulfill(promise, value); - } - }, function (reason) { - return reject(promise, reason); - }); - } -} - -function handleMaybeThenable(promise, maybeThenable, then$$) { - if (maybeThenable.constructor === promise.constructor && then$$ === then && promise.constructor.resolve === resolve$1) { - handleOwnThenable(promise, maybeThenable); - } else { - if (then$$ === GET_THEN_ERROR) { - reject(promise, GET_THEN_ERROR.error); - } else if (then$$ === undefined) { - fulfill(promise, maybeThenable); - } else if (isFunction(then$$)) { - handleForeignThenable(promise, maybeThenable, then$$); - } else { - fulfill(promise, maybeThenable); - } - } -} - -function resolve(promise, value) { - if (promise === value) { - fulfill(promise, value); - } else if (objectOrFunction(value)) { - handleMaybeThenable(promise, value, getThen(value)); - } else { - fulfill(promise, value); - } -} - -function publishRejection(promise) { - if (promise._onError) { - promise._onError(promise._result); - } - - publish(promise); -} - -function fulfill(promise, value) { - if (promise._state !== PENDING) { - return; - } - - promise._result = value; - promise._state = FULFILLED; - - if (promise._subscribers.length === 0) { - if (config.instrument) { - instrument('fulfilled', promise); - } - } else { - config.async(publish, promise); - } -} - -function reject(promise, reason) { - if (promise._state !== PENDING) { - return; - } - promise._state = REJECTED; - promise._result = reason; - config.async(publishRejection, promise); -} - -function subscribe(parent, child, onFulfillment, onRejection) { - var subscribers = parent._subscribers; - var length = subscribers.length; - - parent._onError = null; - - subscribers[length] = child; - subscribers[length + FULFILLED] = onFulfillment; - subscribers[length + REJECTED] = onRejection; - - if (length === 0 && parent._state) { - config.async(publish, parent); - } -} - -function publish(promise) { - var subscribers = promise._subscribers; - var settled = promise._state; - - if (config.instrument) { - instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise); - } - - if (subscribers.length === 0) { - return; - } - - var child = undefined, - callback = undefined, - detail = promise._result; - - for (var i = 0; i < subscribers.length; i += 3) { - child = subscribers[i]; - callback = subscribers[i + settled]; - - if (child) { - invokeCallback(settled, child, callback, detail); - } else { - callback(detail); - } - } - - promise._subscribers.length = 0; -} - -function ErrorObject() { - this.error = null; -} - -var TRY_CATCH_ERROR = new ErrorObject(); - -function tryCatch(callback, detail) { - try { - return callback(detail); - } catch (e) { - TRY_CATCH_ERROR.error = e; - return TRY_CATCH_ERROR; - } -} - -function invokeCallback(settled, promise, callback, detail) { - var hasCallback = isFunction(callback), - value = undefined, - error = undefined, - succeeded = undefined, - failed = undefined; - - if (hasCallback) { - value = tryCatch(callback, detail); - - if (value === TRY_CATCH_ERROR) { - failed = true; - error = value.error; - value = null; - } else { - succeeded = true; - } - - if (promise === value) { - reject(promise, withOwnPromise()); - return; - } - } else { - value = detail; - succeeded = true; - } - - if (promise._state !== PENDING) { - // noop - } else if (hasCallback && succeeded) { - resolve(promise, value); - } else if (failed) { - reject(promise, error); - } else if (settled === FULFILLED) { - fulfill(promise, value); - } else if (settled === REJECTED) { - reject(promise, value); - } -} - -function initializePromise(promise, resolver) { - var resolved = false; - try { - resolver(function (value) { - if (resolved) { - return; - } - resolved = true; - resolve(promise, value); - }, function (reason) { - if (resolved) { - return; - } - resolved = true; - reject(promise, reason); - }); - } catch (e) { - reject(promise, e); - } -} - -function then(onFulfillment, onRejection, label) { - var _arguments = arguments; - - var parent = this; - var state = parent._state; - - if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) { - config.instrument && instrument('chained', parent, parent); - return parent; - } - - parent._onError = null; - - var child = new parent.constructor(noop, label); - var result = parent._result; - - config.instrument && instrument('chained', parent, child); - - if (state) { - (function () { - var callback = _arguments[state - 1]; - config.async(function () { - return invokeCallback(state, child, callback, result); - }); - })(); - } else { - subscribe(parent, child, onFulfillment, onRejection); - } - - return child; -} - -function makeSettledResult(state, position, value) { - if (state === FULFILLED) { - return { - state: 'fulfilled', - value: value - }; - } else { - return { - state: 'rejected', - reason: value - }; - } -} - -function Enumerator(Constructor, input, abortOnReject, label) { - this._instanceConstructor = Constructor; - this.promise = new Constructor(noop, label); - this._abortOnReject = abortOnReject; - - if (this._validateInput(input)) { - this._input = input; - this.length = input.length; - this._remaining = input.length; - - this._init(); - - if (this.length === 0) { - fulfill(this.promise, this._result); - } else { - this.length = this.length || 0; - this._enumerate(); - if (this._remaining === 0) { - fulfill(this.promise, this._result); - } - } - } else { - reject(this.promise, this._validationError()); - } -} - -Enumerator.prototype._validateInput = function (input) { - return isArray(input); -}; - -Enumerator.prototype._validationError = function () { - return new Error('Array Methods must be provided an Array'); -}; - -Enumerator.prototype._init = function () { - this._result = new Array(this.length); -}; - -Enumerator.prototype._enumerate = function () { - var length = this.length; - var promise = this.promise; - var input = this._input; - - for (var i = 0; promise._state === PENDING && i < length; i++) { - this._eachEntry(input[i], i); - } -}; - -Enumerator.prototype._settleMaybeThenable = function (entry, i) { - var c = this._instanceConstructor; - var resolve = c.resolve; - - if (resolve === resolve$1) { - var then$$ = getThen(entry); - - if (then$$ === then && entry._state !== PENDING) { - entry._onError = null; - this._settledAt(entry._state, i, entry._result); - } else if (typeof then$$ !== 'function') { - this._remaining--; - this._result[i] = this._makeResult(FULFILLED, i, entry); - } else if (c === Promise) { - var promise = new c(noop); - handleMaybeThenable(promise, entry, then$$); - this._willSettleAt(promise, i); - } else { - this._willSettleAt(new c(function (resolve) { - return resolve(entry); - }), i); - } - } else { - this._willSettleAt(resolve(entry), i); - } -}; - -Enumerator.prototype._eachEntry = function (entry, i) { - if (isMaybeThenable(entry)) { - this._settleMaybeThenable(entry, i); - } else { - this._remaining--; - this._result[i] = this._makeResult(FULFILLED, i, entry); - } -}; - -Enumerator.prototype._settledAt = function (state, i, value) { - var promise = this.promise; - - if (promise._state === PENDING) { - this._remaining--; - - if (this._abortOnReject && state === REJECTED) { - reject(promise, value); - } else { - this._result[i] = this._makeResult(state, i, value); - } - } - - if (this._remaining === 0) { - fulfill(promise, this._result); - } -}; - -Enumerator.prototype._makeResult = function (state, i, value) { - return value; -}; - -Enumerator.prototype._willSettleAt = function (promise, i) { - var enumerator = this; - - subscribe(promise, undefined, function (value) { - return enumerator._settledAt(FULFILLED, i, value); - }, function (reason) { - return enumerator._settledAt(REJECTED, i, reason); - }); -}; - -/** - `RSVP.Promise.all` accepts an array of promises, and returns a new promise which - is fulfilled with an array of fulfillment values for the passed promises, or - rejected with the reason of the first passed promise to be rejected. It casts all - elements of the passed iterable to promises as it runs this algorithm. - - Example: - - ```javascript - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.resolve(2); - let promise3 = RSVP.resolve(3); - let promises = [ promise1, promise2, promise3 ]; - - RSVP.Promise.all(promises).then(function(array){ - // The array here would be [ 1, 2, 3 ]; - }); - ``` - - If any of the `promises` given to `RSVP.all` are rejected, the first promise - that is rejected will be given as an argument to the returned promises's - rejection handler. For example: - - Example: - - ```javascript - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.reject(new Error("2")); - let promise3 = RSVP.reject(new Error("3")); - let promises = [ promise1, promise2, promise3 ]; - - RSVP.Promise.all(promises).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(error) { - // error.message === "2" - }); - ``` - - @method all - @static - @param {Array} entries array of promises - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when all `promises` have been - fulfilled, or rejected if any of them become rejected. - @static -*/ -function all(entries, label) { - return new Enumerator(this, entries, true, /* abort on reject */label).promise; -} - -/** - `RSVP.Promise.race` returns a new promise which is settled in the same way as the - first passed promise to settle. - - Example: - - ```javascript - let promise1 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 2'); - }, 100); - }); - - RSVP.Promise.race([promise1, promise2]).then(function(result){ - // result === 'promise 2' because it was resolved before promise1 - // was resolved. - }); - ``` - - `RSVP.Promise.race` is deterministic in that only the state of the first - settled promise matters. For example, even if other promises given to the - `promises` array argument are resolved, but the first settled promise has - become rejected before the other promises became fulfilled, the returned - promise will become rejected: - - ```javascript - let promise1 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new RSVP.Promise(function(resolve, reject){ - setTimeout(function(){ - reject(new Error('promise 2')); - }, 100); - }); - - RSVP.Promise.race([promise1, promise2]).then(function(result){ - // Code here never runs - }, function(reason){ - // reason.message === 'promise 2' because promise 2 became rejected before - // promise 1 became fulfilled - }); - ``` - - An example real-world use case is implementing timeouts: - - ```javascript - RSVP.Promise.race([ajax('foo.json'), timeout(5000)]) - ``` - - @method race - @static - @param {Array} entries array of promises to observe - @param {String} label optional string for describing the promise returned. - Useful for tooling. - @return {Promise} a promise which settles in the same way as the first passed - promise to settle. -*/ -function race(entries, label) { - /*jshint validthis:true */ - var Constructor = this; - - var promise = new Constructor(noop, label); - - if (!isArray(entries)) { - reject(promise, new TypeError('You must pass an array to race.')); - return promise; - } - - for (var i = 0; promise._state === PENDING && i < entries.length; i++) { - subscribe(Constructor.resolve(entries[i]), undefined, function (value) { - return resolve(promise, value); - }, function (reason) { - return reject(promise, reason); - }); - } - - return promise; -} - -/** - `RSVP.Promise.reject` returns a promise rejected with the passed `reason`. - It is shorthand for the following: - - ```javascript - let promise = new RSVP.Promise(function(resolve, reject){ - reject(new Error('WHOOPS')); - }); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = RSVP.Promise.reject(new Error('WHOOPS')); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - @method reject - @static - @param {*} reason value that the returned promise will be rejected with. - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise rejected with the given `reason`. -*/ -function reject$1(reason, label) { - /*jshint validthis:true */ - var Constructor = this; - var promise = new Constructor(noop, label); - reject(promise, reason); - return promise; -} - -var guidKey = 'rsvp_' + now() + '-'; -var counter = 0; - -function needsResolver() { - throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); -} - -function needsNew() { - throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); -} - -/** - Promise objects represent the eventual result of an asynchronous operation. The - primary way of interacting with a promise is through its `then` method, which - registers callbacks to receive either a promise’s eventual value or the reason - why the promise cannot be fulfilled. - - Terminology - ----------- - - - `promise` is an object or function with a `then` method whose behavior conforms to this specification. - - `thenable` is an object or function that defines a `then` method. - - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). - - `exception` is a value that is thrown using the throw statement. - - `reason` is a value that indicates why a promise was rejected. - - `settled` the final resting state of a promise, fulfilled or rejected. - - A promise can be in one of three states: pending, fulfilled, or rejected. - - Promises that are fulfilled have a fulfillment value and are in the fulfilled - state. Promises that are rejected have a rejection reason and are in the - rejected state. A fulfillment value is never a thenable. - - Promises can also be said to *resolve* a value. If this value is also a - promise, then the original promise's settled state will match the value's - settled state. So a promise that *resolves* a promise that rejects will - itself reject, and a promise that *resolves* a promise that fulfills will - itself fulfill. - - - Basic Usage: - ------------ - - ```js - let promise = new Promise(function(resolve, reject) { - // on success - resolve(value); - - // on failure - reject(reason); - }); - - promise.then(function(value) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Advanced Usage: - --------------- - - Promises shine when abstracting away asynchronous interactions such as - `XMLHttpRequest`s. - - ```js - function getJSON(url) { - return new Promise(function(resolve, reject){ - let xhr = new XMLHttpRequest(); - - xhr.open('GET', url); - xhr.onreadystatechange = handler; - xhr.responseType = 'json'; - xhr.setRequestHeader('Accept', 'application/json'); - xhr.send(); - - function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200) { - resolve(this.response); - } else { - reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); - } - } - }; - }); - } - - getJSON('/posts.json').then(function(json) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Unlike callbacks, promises are great composable primitives. - - ```js - Promise.all([ - getJSON('/posts'), - getJSON('/comments') - ]).then(function(values){ - values[0] // => postsJSON - values[1] // => commentsJSON - - return values; - }); - ``` - - @class RSVP.Promise - @param {function} resolver - @param {String} label optional string for labeling the promise. - Useful for tooling. - @constructor -*/ -function Promise(resolver, label) { - this._id = counter++; - this._label = label; - this._state = undefined; - this._result = undefined; - this._subscribers = []; - - config.instrument && instrument('created', this); - - if (noop !== resolver) { - typeof resolver !== 'function' && needsResolver(); - this instanceof Promise ? initializePromise(this, resolver) : needsNew(); - } -} - -Promise.cast = resolve$1; // deprecated -Promise.all = all; -Promise.race = race; -Promise.resolve = resolve$1; -Promise.reject = reject$1; - -Promise.prototype = { - constructor: Promise, - - _guidKey: guidKey, - - _onError: function _onError(reason) { - var promise = this; - config.after(function () { - if (promise._onError) { - config['trigger']('error', reason, promise._label); - } - }); - }, - - /** - The primary way of interacting with a promise is through its `then` method, - which registers callbacks to receive either a promise's eventual value or the - reason why the promise cannot be fulfilled. - - ```js - findUser().then(function(user){ - // user is available - }, function(reason){ - // user is unavailable, and you are given the reason why - }); - ``` - - Chaining - -------- - - The return value of `then` is itself a promise. This second, 'downstream' - promise is resolved with the return value of the first promise's fulfillment - or rejection handler, or rejected if the handler throws an exception. - - ```js - findUser().then(function (user) { - return user.name; - }, function (reason) { - return 'default name'; - }).then(function (userName) { - // If `findUser` fulfilled, `userName` will be the user's name, otherwise it - // will be `'default name'` - }); - - findUser().then(function (user) { - throw new Error('Found user, but still unhappy'); - }, function (reason) { - throw new Error('`findUser` rejected and we\'re unhappy'); - }).then(function (value) { - // never reached - }, function (reason) { - // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. - // If `findUser` rejected, `reason` will be '`findUser` rejected and we\'re unhappy'. - }); - ``` - If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. - - ```js - findUser().then(function (user) { - throw new PedagogicalException('Upstream error'); - }).then(function (value) { - // never reached - }).then(function (value) { - // never reached - }, function (reason) { - // The `PedgagocialException` is propagated all the way down to here - }); - ``` - - Assimilation - ------------ - - Sometimes the value you want to propagate to a downstream promise can only be - retrieved asynchronously. This can be achieved by returning a promise in the - fulfillment or rejection handler. The downstream promise will then be pending - until the returned promise is settled. This is called *assimilation*. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // The user's comments are now available - }); - ``` - - If the assimliated promise rejects, then the downstream promise will also reject. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // If `findCommentsByAuthor` fulfills, we'll have the value here - }, function (reason) { - // If `findCommentsByAuthor` rejects, we'll have the reason here - }); - ``` - - Simple Example - -------------- - - Synchronous Example - - ```javascript - let result; - - try { - result = findResult(); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - findResult(function(result, err){ - if (err) { - // failure - } else { - // success - } - }); - ``` - - Promise Example; - - ```javascript - findResult().then(function(result){ - // success - }, function(reason){ - // failure - }); - ``` - - Advanced Example - -------------- - - Synchronous Example - - ```javascript - let author, books; - - try { - author = findAuthor(); - books = findBooksByAuthor(author); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - - function foundBooks(books) { - - } - - function failure(reason) { - - } - - findAuthor(function(author, err){ - if (err) { - failure(err); - // failure - } else { - try { - findBoooksByAuthor(author, function(books, err) { - if (err) { - failure(err); - } else { - try { - foundBooks(books); - } catch(reason) { - failure(reason); - } - } - }); - } catch(error) { - failure(err); - } - // success - } - }); - ``` - - Promise Example; - - ```javascript - findAuthor(). - then(findBooksByAuthor). - then(function(books){ - // found books - }).catch(function(reason){ - // something went wrong - }); - ``` - - @method then - @param {Function} onFulfillment - @param {Function} onRejection - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} - */ - then: then, - - /** - `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same - as the catch block of a try/catch statement. - - ```js - function findAuthor(){ - throw new Error('couldn\'t find that author'); - } - - // synchronous - try { - findAuthor(); - } catch(reason) { - // something went wrong - } - - // async with promises - findAuthor().catch(function(reason){ - // something went wrong - }); - ``` - - @method catch - @param {Function} onRejection - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} - */ - 'catch': function _catch(onRejection, label) { - return this.then(undefined, onRejection, label); - }, - - /** - `finally` will be invoked regardless of the promise's fate just as native - try/catch/finally behaves - - Synchronous example: - - ```js - findAuthor() { - if (Math.random() > 0.5) { - throw new Error(); - } - return new Author(); - } - - try { - return findAuthor(); // succeed or fail - } catch(error) { - return findOtherAuther(); - } finally { - // always runs - // doesn't affect the return value - } - ``` - - Asynchronous example: - - ```js - findAuthor().catch(function(reason){ - return findOtherAuther(); - }).finally(function(){ - // author was either found, or not - }); - ``` - - @method finally - @param {Function} callback - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} - */ - 'finally': function _finally(callback, label) { - var promise = this; - var constructor = promise.constructor; - - return promise.then(function (value) { - return constructor.resolve(callback()).then(function () { - return value; - }); - }, function (reason) { - return constructor.resolve(callback()).then(function () { - throw reason; - }); - }, label); - } -}; - -function Result() { - this.value = undefined; -} - -var ERROR = new Result(); -var GET_THEN_ERROR$1 = new Result(); - -function getThen$1(obj) { - try { - return obj.then; - } catch (error) { - ERROR.value = error; - return ERROR; - } -} - -function tryApply(f, s, a) { - try { - f.apply(s, a); - } catch (error) { - ERROR.value = error; - return ERROR; - } -} - -function makeObject(_, argumentNames) { - var obj = {}; - var length = _.length; - var args = new Array(length); - - for (var x = 0; x < length; x++) { - args[x] = _[x]; - } - - for (var i = 0; i < argumentNames.length; i++) { - var _name = argumentNames[i]; - obj[_name] = args[i + 1]; - } - - return obj; -} - -function arrayResult(_) { - var length = _.length; - var args = new Array(length - 1); - - for (var i = 1; i < length; i++) { - args[i - 1] = _[i]; - } - - return args; -} - -function wrapThenable(_then, promise) { - return { - then: function then(onFulFillment, onRejection) { - return _then.call(promise, onFulFillment, onRejection); - } - }; -} - -/** - `RSVP.denodeify` takes a 'node-style' function and returns a function that - will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the - browser when you'd prefer to use promises over using callbacks. For example, - `denodeify` transforms the following: - - ```javascript - let fs = require('fs'); - - fs.readFile('myfile.txt', function(err, data){ - if (err) return handleError(err); - handleData(data); - }); - ``` - - into: - - ```javascript - let fs = require('fs'); - let readFile = RSVP.denodeify(fs.readFile); - - readFile('myfile.txt').then(handleData, handleError); - ``` - - If the node function has multiple success parameters, then `denodeify` - just returns the first one: - - ```javascript - let request = RSVP.denodeify(require('request')); - - request('http://example.com').then(function(res) { - // ... - }); - ``` - - However, if you need all success parameters, setting `denodeify`'s - second parameter to `true` causes it to return all success parameters - as an array: - - ```javascript - let request = RSVP.denodeify(require('request'), true); - - request('http://example.com').then(function(result) { - // result[0] -> res - // result[1] -> body - }); - ``` - - Or if you pass it an array with names it returns the parameters as a hash: - - ```javascript - let request = RSVP.denodeify(require('request'), ['res', 'body']); - - request('http://example.com').then(function(result) { - // result.res - // result.body - }); - ``` - - Sometimes you need to retain the `this`: - - ```javascript - let app = require('express')(); - let render = RSVP.denodeify(app.render.bind(app)); - ``` - - The denodified function inherits from the original function. It works in all - environments, except IE 10 and below. Consequently all properties of the original - function are available to you. However, any properties you change on the - denodeified function won't be changed on the original function. Example: - - ```javascript - let request = RSVP.denodeify(require('request')), - cookieJar = request.jar(); // <- Inheritance is used here - - request('http://example.com', {jar: cookieJar}).then(function(res) { - // cookieJar.cookies holds now the cookies returned by example.com - }); - ``` - - Using `denodeify` makes it easier to compose asynchronous operations instead - of using callbacks. For example, instead of: - - ```javascript - let fs = require('fs'); - - fs.readFile('myfile.txt', function(err, data){ - if (err) { ... } // Handle error - fs.writeFile('myfile2.txt', data, function(err){ - if (err) { ... } // Handle error - console.log('done') - }); - }); - ``` - - you can chain the operations together using `then` from the returned promise: - - ```javascript - let fs = require('fs'); - let readFile = RSVP.denodeify(fs.readFile); - let writeFile = RSVP.denodeify(fs.writeFile); - - readFile('myfile.txt').then(function(data){ - return writeFile('myfile2.txt', data); - }).then(function(){ - console.log('done') - }).catch(function(error){ - // Handle error - }); - ``` - - @method denodeify - @static - @for RSVP - @param {Function} nodeFunc a 'node-style' function that takes a callback as - its last argument. The callback expects an error to be passed as its first - argument (if an error occurred, otherwise null), and the value from the - operation as its second argument ('function(err, value){ }'). - @param {Boolean|Array} [options] An optional paramter that if set - to `true` causes the promise to fulfill with the callback's success arguments - as an array. This is useful if the node function has multiple success - paramters. If you set this paramter to an array with names, the promise will - fulfill with a hash with these names as keys and the success parameters as - values. - @return {Function} a function that wraps `nodeFunc` to return an - `RSVP.Promise` - @static -*/ -function denodeify(nodeFunc, options) { - var fn = function fn() { - var self = this; - var l = arguments.length; - var args = new Array(l + 1); - var promiseInput = false; - - for (var i = 0; i < l; ++i) { - var arg = arguments[i]; - - if (!promiseInput) { - // TODO: clean this up - promiseInput = needsPromiseInput(arg); - if (promiseInput === GET_THEN_ERROR$1) { - var p = new Promise(noop); - reject(p, GET_THEN_ERROR$1.value); - return p; - } else if (promiseInput && promiseInput !== true) { - arg = wrapThenable(promiseInput, arg); - } - } - args[i] = arg; - } - - var promise = new Promise(noop); - - args[l] = function (err, val) { - if (err) reject(promise, err);else if (options === undefined) resolve(promise, val);else if (options === true) resolve(promise, arrayResult(arguments));else if (isArray(options)) resolve(promise, makeObject(arguments, options));else resolve(promise, val); - }; - - if (promiseInput) { - return handlePromiseInput(promise, args, nodeFunc, self); - } else { - return handleValueInput(promise, args, nodeFunc, self); - } - }; - - fn.__proto__ = nodeFunc; - - return fn; -} - -function handleValueInput(promise, args, nodeFunc, self) { - var result = tryApply(nodeFunc, self, args); - if (result === ERROR) { - reject(promise, result.value); - } - return promise; -} - -function handlePromiseInput(promise, args, nodeFunc, self) { - return Promise.all(args).then(function (args) { - var result = tryApply(nodeFunc, self, args); - if (result === ERROR) { - reject(promise, result.value); - } - return promise; - }); -} - -function needsPromiseInput(arg) { - if (arg && typeof arg === 'object') { - if (arg.constructor === Promise) { - return true; - } else { - return getThen$1(arg); - } - } else { - return false; - } -} - -/** - This is a convenient alias for `RSVP.Promise.all`. - - @method all - @static - @for RSVP - @param {Array} array Array of promises. - @param {String} label An optional label. This is useful - for tooling. -*/ -function all$1(array, label) { - return Promise.all(array, label); -} - -function AllSettled(Constructor, entries, label) { - this._superConstructor(Constructor, entries, false, /* don't abort on reject */label); -} - -AllSettled.prototype = o_create(Enumerator.prototype); -AllSettled.prototype._superConstructor = Enumerator; -AllSettled.prototype._makeResult = makeSettledResult; -AllSettled.prototype._validationError = function () { - return new Error('allSettled must be called with an array'); -}; - -/** - `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing - a fail-fast method, it waits until all the promises have returned and - shows you all the results. This is useful if you want to handle multiple - promises' failure states together as a set. - - Returns a promise that is fulfilled when all the given promises have been - settled. The return promise is fulfilled with an array of the states of - the promises passed into the `promises` array argument. - - Each state object will either indicate fulfillment or rejection, and - provide the corresponding value or reason. The states will take one of - the following formats: - - ```javascript - { state: 'fulfilled', value: value } - or - { state: 'rejected', reason: reason } - ``` - - Example: - - ```javascript - let promise1 = RSVP.Promise.resolve(1); - let promise2 = RSVP.Promise.reject(new Error('2')); - let promise3 = RSVP.Promise.reject(new Error('3')); - let promises = [ promise1, promise2, promise3 ]; - - RSVP.allSettled(promises).then(function(array){ - // array == [ - // { state: 'fulfilled', value: 1 }, - // { state: 'rejected', reason: Error }, - // { state: 'rejected', reason: Error } - // ] - // Note that for the second item, reason.message will be '2', and for the - // third item, reason.message will be '3'. - }, function(error) { - // Not run. (This block would only be called if allSettled had failed, - // for instance if passed an incorrect argument type.) - }); - ``` - - @method allSettled - @static - @for RSVP - @param {Array} entries - @param {String} label - optional string that describes the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled with an array of the settled - states of the constituent promises. -*/ -function allSettled(entries, label) { - return new AllSettled(Promise, entries, label).promise; -} - -/** - This is a convenient alias for `RSVP.Promise.race`. - - @method race - @static - @for RSVP - @param {Array} array Array of promises. - @param {String} label An optional label. This is useful - for tooling. - */ -function race$1(array, label) { - return Promise.race(array, label); -} - -function PromiseHash(Constructor, object, label) { - this._superConstructor(Constructor, object, true, label); -} - -PromiseHash.prototype = o_create(Enumerator.prototype); -PromiseHash.prototype._superConstructor = Enumerator; -PromiseHash.prototype._init = function () { - this._result = {}; -}; - -PromiseHash.prototype._validateInput = function (input) { - return input && typeof input === 'object'; -}; - -PromiseHash.prototype._validationError = function () { - return new Error('Promise.hash must be called with an object'); -}; - -PromiseHash.prototype._enumerate = function () { - var enumerator = this; - var promise = enumerator.promise; - var input = enumerator._input; - var results = []; - - for (var key in input) { - if (promise._state === PENDING && Object.prototype.hasOwnProperty.call(input, key)) { - results.push({ - position: key, - entry: input[key] - }); - } - } - - var length = results.length; - enumerator._remaining = length; - var result = undefined; - - for (var i = 0; promise._state === PENDING && i < length; i++) { - result = results[i]; - enumerator._eachEntry(result.entry, result.position); - } -}; - -/** - `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array - for its `promises` argument. - - Returns a promise that is fulfilled when all the given promises have been - fulfilled, or rejected if any of them become rejected. The returned promise - is fulfilled with a hash that has the same key names as the `promises` object - argument. If any of the values in the object are not promises, they will - simply be copied over to the fulfilled object. - - Example: - - ```javascript - let promises = { - myPromise: RSVP.resolve(1), - yourPromise: RSVP.resolve(2), - theirPromise: RSVP.resolve(3), - notAPromise: 4 - }; - - RSVP.hash(promises).then(function(hash){ - // hash here is an object that looks like: - // { - // myPromise: 1, - // yourPromise: 2, - // theirPromise: 3, - // notAPromise: 4 - // } - }); - ```` - - If any of the `promises` given to `RSVP.hash` are rejected, the first promise - that is rejected will be given as the reason to the rejection handler. - - Example: - - ```javascript - let promises = { - myPromise: RSVP.resolve(1), - rejectedPromise: RSVP.reject(new Error('rejectedPromise')), - anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')), - }; - - RSVP.hash(promises).then(function(hash){ - // Code here never runs because there are rejected promises! - }, function(reason) { - // reason.message === 'rejectedPromise' - }); - ``` - - An important note: `RSVP.hash` is intended for plain JavaScript objects that - are just a set of keys and values. `RSVP.hash` will NOT preserve prototype - chains. - - Example: - - ```javascript - function MyConstructor(){ - this.example = RSVP.resolve('Example'); - } - - MyConstructor.prototype = { - protoProperty: RSVP.resolve('Proto Property') - }; - - let myObject = new MyConstructor(); - - RSVP.hash(myObject).then(function(hash){ - // protoProperty will not be present, instead you will just have an - // object that looks like: - // { - // example: 'Example' - // } - // - // hash.hasOwnProperty('protoProperty'); // false - // 'undefined' === typeof hash.protoProperty - }); - ``` - - @method hash - @static - @for RSVP - @param {Object} object - @param {String} label optional string that describes the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when all properties of `promises` - have been fulfilled, or rejected if any of them become rejected. -*/ -function hash(object, label) { - return new PromiseHash(Promise, object, label).promise; -} - -function HashSettled(Constructor, object, label) { - this._superConstructor(Constructor, object, false, label); -} - -HashSettled.prototype = o_create(PromiseHash.prototype); -HashSettled.prototype._superConstructor = Enumerator; -HashSettled.prototype._makeResult = makeSettledResult; - -HashSettled.prototype._validationError = function () { - return new Error('hashSettled must be called with an object'); -}; - -/** - `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object - instead of an array for its `promises` argument. - - Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method, - but like `RSVP.allSettled`, `hashSettled` waits until all the - constituent promises have returned and then shows you all the results - with their states and values/reasons. This is useful if you want to - handle multiple promises' failure states together as a set. - - Returns a promise that is fulfilled when all the given promises have been - settled, or rejected if the passed parameters are invalid. - - The returned promise is fulfilled with a hash that has the same key names as - the `promises` object argument. If any of the values in the object are not - promises, they will be copied over to the fulfilled object and marked with state - 'fulfilled'. - - Example: - - ```javascript - let promises = { - myPromise: RSVP.Promise.resolve(1), - yourPromise: RSVP.Promise.resolve(2), - theirPromise: RSVP.Promise.resolve(3), - notAPromise: 4 - }; - - RSVP.hashSettled(promises).then(function(hash){ - // hash here is an object that looks like: - // { - // myPromise: { state: 'fulfilled', value: 1 }, - // yourPromise: { state: 'fulfilled', value: 2 }, - // theirPromise: { state: 'fulfilled', value: 3 }, - // notAPromise: { state: 'fulfilled', value: 4 } - // } - }); - ``` - - If any of the `promises` given to `RSVP.hash` are rejected, the state will - be set to 'rejected' and the reason for rejection provided. - - Example: - - ```javascript - let promises = { - myPromise: RSVP.Promise.resolve(1), - rejectedPromise: RSVP.Promise.reject(new Error('rejection')), - anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')), - }; - - RSVP.hashSettled(promises).then(function(hash){ - // hash here is an object that looks like: - // { - // myPromise: { state: 'fulfilled', value: 1 }, - // rejectedPromise: { state: 'rejected', reason: Error }, - // anotherRejectedPromise: { state: 'rejected', reason: Error }, - // } - // Note that for rejectedPromise, reason.message == 'rejection', - // and for anotherRejectedPromise, reason.message == 'more rejection'. - }); - ``` - - An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that - are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype - chains. - - Example: - - ```javascript - function MyConstructor(){ - this.example = RSVP.Promise.resolve('Example'); - } - - MyConstructor.prototype = { - protoProperty: RSVP.Promise.resolve('Proto Property') - }; - - let myObject = new MyConstructor(); - - RSVP.hashSettled(myObject).then(function(hash){ - // protoProperty will not be present, instead you will just have an - // object that looks like: - // { - // example: { state: 'fulfilled', value: 'Example' } - // } - // - // hash.hasOwnProperty('protoProperty'); // false - // 'undefined' === typeof hash.protoProperty - }); - ``` - - @method hashSettled - @for RSVP - @param {Object} object - @param {String} label optional string that describes the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when when all properties of `promises` - have been settled. - @static -*/ -function hashSettled(object, label) { - return new HashSettled(Promise, object, label).promise; -} - -function rethrow(reason) { - setTimeout(function () { - throw reason; - }); - throw reason; -} - -/** - `RSVP.defer` returns an object similar to jQuery's `$.Deferred`. - `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s - interface. New code should use the `RSVP.Promise` constructor instead. - - The object returned from `RSVP.defer` is a plain object with three properties: - - * promise - an `RSVP.Promise`. - * reject - a function that causes the `promise` property on this object to - become rejected - * resolve - a function that causes the `promise` property on this object to - become fulfilled. - - Example: - - ```javascript - let deferred = RSVP.defer(); - - deferred.resolve("Success!"); - - deferred.promise.then(function(value){ - // value here is "Success!" - }); - ``` - - @method defer - @static - @for RSVP - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Object} - */ -function defer(label) { - var deferred = { resolve: undefined, reject: undefined }; - - deferred.promise = new Promise(function (resolve, reject) { - deferred.resolve = resolve; - deferred.reject = reject; - }, label); - - return deferred; -} - -/** - `RSVP.map` is similar to JavaScript's native `map` method, except that it - waits for all promises to become fulfilled before running the `mapFn` on - each item in given to `promises`. `RSVP.map` returns a promise that will - become fulfilled with the result of running `mapFn` on the values the promises - become fulfilled with. - - For example: - - ```javascript - - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.resolve(2); - let promise3 = RSVP.resolve(3); - let promises = [ promise1, promise2, promise3 ]; - - let mapFn = function(item){ - return item + 1; - }; - - RSVP.map(promises, mapFn).then(function(result){ - // result is [ 2, 3, 4 ] - }); - ``` - - If any of the `promises` given to `RSVP.map` are rejected, the first promise - that is rejected will be given as an argument to the returned promise's - rejection handler. For example: - - ```javascript - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.reject(new Error('2')); - let promise3 = RSVP.reject(new Error('3')); - let promises = [ promise1, promise2, promise3 ]; - - let mapFn = function(item){ - return item + 1; - }; - - RSVP.map(promises, mapFn).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(reason) { - // reason.message === '2' - }); - ``` - - `RSVP.map` will also wait if a promise is returned from `mapFn`. For example, - say you want to get all comments from a set of blog posts, but you need - the blog posts first because they contain a url to those comments. - - ```javscript - - let mapFn = function(blogPost){ - // getComments does some ajax and returns an RSVP.Promise that is fulfilled - // with some comments data - return getComments(blogPost.comments_url); - }; - - // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled - // with some blog post data - RSVP.map(getBlogPosts(), mapFn).then(function(comments){ - // comments is the result of asking the server for the comments - // of all blog posts returned from getBlogPosts() - }); - ``` - - @method map - @static - @for RSVP - @param {Array} promises - @param {Function} mapFn function to be called on each fulfilled promise. - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled with the result of calling - `mapFn` on each fulfilled promise or value when they become fulfilled. - The promise will be rejected if any of the given `promises` become rejected. - @static -*/ -function map(promises, mapFn, label) { - return Promise.all(promises, label).then(function (values) { - if (!isFunction(mapFn)) { - throw new TypeError("You must pass a function as map's second argument."); - } - - var length = values.length; - var results = new Array(length); - - for (var i = 0; i < length; i++) { - results[i] = mapFn(values[i]); - } - - return Promise.all(results, label); - }); -} - -/** - This is a convenient alias for `RSVP.Promise.resolve`. - - @method resolve - @static - @for RSVP - @param {*} value value that the returned promise will be resolved with - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise that will become fulfilled with the given - `value` -*/ -function resolve$2(value, label) { - return Promise.resolve(value, label); -} - -/** - This is a convenient alias for `RSVP.Promise.reject`. - - @method reject - @static - @for RSVP - @param {*} reason value that the returned promise will be rejected with. - @param {String} label optional string for identifying the returned promise. - Useful for tooling. - @return {Promise} a promise rejected with the given `reason`. -*/ -function reject$2(reason, label) { - return Promise.reject(reason, label); -} - -/** - `RSVP.filter` is similar to JavaScript's native `filter` method, except that it - waits for all promises to become fulfilled before running the `filterFn` on - each item in given to `promises`. `RSVP.filter` returns a promise that will - become fulfilled with the result of running `filterFn` on the values the - promises become fulfilled with. - - For example: - - ```javascript - - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.resolve(2); - let promise3 = RSVP.resolve(3); - - let promises = [promise1, promise2, promise3]; - - let filterFn = function(item){ - return item > 1; - }; - - RSVP.filter(promises, filterFn).then(function(result){ - // result is [ 2, 3 ] - }); - ``` - - If any of the `promises` given to `RSVP.filter` are rejected, the first promise - that is rejected will be given as an argument to the returned promise's - rejection handler. For example: - - ```javascript - let promise1 = RSVP.resolve(1); - let promise2 = RSVP.reject(new Error('2')); - let promise3 = RSVP.reject(new Error('3')); - let promises = [ promise1, promise2, promise3 ]; - - let filterFn = function(item){ - return item > 1; - }; - - RSVP.filter(promises, filterFn).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(reason) { - // reason.message === '2' - }); - ``` - - `RSVP.filter` will also wait for any promises returned from `filterFn`. - For instance, you may want to fetch a list of users then return a subset - of those users based on some asynchronous operation: - - ```javascript - - let alice = { name: 'alice' }; - let bob = { name: 'bob' }; - let users = [ alice, bob ]; - - let promises = users.map(function(user){ - return RSVP.resolve(user); - }); - - let filterFn = function(user){ - // Here, Alice has permissions to create a blog post, but Bob does not. - return getPrivilegesForUser(user).then(function(privs){ - return privs.can_create_blog_post === true; - }); - }; - RSVP.filter(promises, filterFn).then(function(users){ - // true, because the server told us only Alice can create a blog post. - users.length === 1; - // false, because Alice is the only user present in `users` - users[0] === bob; - }); - ``` - - @method filter - @static - @for RSVP - @param {Array} promises - @param {Function} filterFn - function to be called on each resolved value to - filter the final results. - @param {String} label optional string describing the promise. Useful for - tooling. - @return {Promise} -*/ - -function resolveAll(promises, label) { - return Promise.all(promises, label); -} - -function resolveSingle(promise, label) { - return Promise.resolve(promise, label).then(function (promises) { - return resolveAll(promises, label); - }); -} -function filter(promises, filterFn, label) { - var promise = isArray(promises) ? resolveAll(promises, label) : resolveSingle(promises, label); - return promise.then(function (values) { - if (!isFunction(filterFn)) { - throw new TypeError("You must pass a function as filter's second argument."); - } - - var length = values.length; - var filtered = new Array(length); - - for (var i = 0; i < length; i++) { - filtered[i] = filterFn(values[i]); - } - - return resolveAll(filtered, label).then(function (filtered) { - var results = new Array(length); - var newLength = 0; - - for (var i = 0; i < length; i++) { - if (filtered[i]) { - results[newLength] = values[i]; - newLength++; - } - } - - results.length = newLength; - - return results; - }); - }); -} - -var len = 0; -var vertxNext = undefined; -function asap(callback, arg) { - queue$1[len] = callback; - queue$1[len + 1] = arg; - len += 2; - if (len === 2) { - // If len is 1, that means that we need to schedule an async flush. - // If additional callbacks are queued before the queue is flushed, they - // will be processed by this flush that we are scheduling. - scheduleFlush$1(); - } -} - -var browserWindow = typeof window !== 'undefined' ? window : undefined; -var browserGlobal = browserWindow || {}; -var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; -var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]'; - -// test for web worker but not in IE10 -var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; - -// node -function useNextTick() { - var nextTick = process.nextTick; - // node version 0.10.x displays a deprecation warning when nextTick is used recursively - // setImmediate should be used instead instead - var version = process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/); - if (Array.isArray(version) && version[1] === '0' && version[2] === '10') { - nextTick = setImmediate; - } - return function () { - return nextTick(flush); - }; -} - -// vertx -function useVertxTimer() { - return function () { - return vertxNext(flush); - }; -} - -function useMutationObserver() { - var iterations = 0; - var observer = new BrowserMutationObserver(flush); - var node = document.createTextNode(''); - observer.observe(node, { characterData: true }); - - return function () { - return node.data = iterations = ++iterations % 2; - }; -} - -// web worker -function useMessageChannel() { - var channel = new MessageChannel(); - channel.port1.onmessage = flush; - return function () { - return channel.port2.postMessage(0); - }; -} - -function useSetTimeout() { - return function () { - return setTimeout(flush, 1); - }; -} - -var queue$1 = new Array(1000); - -function flush() { - for (var i = 0; i < len; i += 2) { - var callback = queue$1[i]; - var arg = queue$1[i + 1]; - - callback(arg); - - queue$1[i] = undefined; - queue$1[i + 1] = undefined; - } - - len = 0; -} - -function attemptVertex() { - try { - var r = require; - var vertx = r('vertx'); - vertxNext = vertx.runOnLoop || vertx.runOnContext; - return useVertxTimer(); - } catch (e) { - return useSetTimeout(); - } -} - -var scheduleFlush$1 = undefined; -// Decide what async method to use to triggering processing of queued callbacks: -if (isNode) { - scheduleFlush$1 = useNextTick(); -} else if (BrowserMutationObserver) { - scheduleFlush$1 = useMutationObserver(); -} else if (isWorker) { - scheduleFlush$1 = useMessageChannel(); -} else if (browserWindow === undefined && typeof require === 'function') { - scheduleFlush$1 = attemptVertex(); -} else { - scheduleFlush$1 = useSetTimeout(); -} - -var platform = undefined; - -/* global self */ -if (typeof self === 'object') { - platform = self; - - /* global global */ -} else if (typeof global === 'object') { - platform = global; - } else { - throw new Error('no global: `self` or `global` found'); - } - -var _async$filter; - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -// defaults - -// the default export here is for backwards compat: -// https://github.com/tildeio/rsvp.js/issues/434 -config.async = asap; -config.after = function (cb) { - return setTimeout(cb, 0); -}; -var cast = resolve$2; - -var async = function async(callback, arg) { - return config.async(callback, arg); -}; - -function on() { - config['on'].apply(config, arguments); -} - -function off() { - config['off'].apply(config, arguments); -} - -// Set up instrumentation through `window.__PROMISE_INTRUMENTATION__` -if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') { - var callbacks = window['__PROMISE_INSTRUMENTATION__']; - configure('instrument', true); - for (var eventName in callbacks) { - if (callbacks.hasOwnProperty(eventName)) { - on(eventName, callbacks[eventName]); - } - } -}var rsvp = (_async$filter = { - cast: cast, - Promise: Promise, - EventTarget: EventTarget, - all: all$1, - allSettled: allSettled, - race: race$1, - hash: hash, - hashSettled: hashSettled, - rethrow: rethrow, - defer: defer, - denodeify: denodeify, - configure: configure, - on: on, - off: off, - resolve: resolve$2, - reject: reject$2, - map: map -}, _defineProperty(_async$filter, 'async', async), _defineProperty(_async$filter, 'filter', // babel seems to error if async isn't a computed prop here... -filter), _async$filter); - -exports['default'] = rsvp; -exports.cast = cast; -exports.Promise = Promise; -exports.EventTarget = EventTarget; -exports.all = all$1; -exports.allSettled = allSettled; -exports.race = race$1; -exports.hash = hash; -exports.hashSettled = hashSettled; -exports.rethrow = rethrow; -exports.defer = defer; -exports.denodeify = denodeify; -exports.configure = configure; -exports.on = on; -exports.off = off; -exports.resolve = resolve$2; -exports.reject = reject$2; -exports.map = map; -exports.async = async; -exports.filter = filter; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"_process":4}],6:[function(require,module,exports){ -/*! - * URI.js - Mutating URLs - * Second Level Domain (SLD) Support - * - * Version: 1.18.1 - * - * Author: Rodney Rehm - * Web: http://medialize.github.io/URI.js/ - * - * Licensed under - * MIT License http://www.opensource.org/licenses/mit-license - * - */ - -(function (root, factory) { - 'use strict'; - // https://github.com/umdjs/umd/blob/master/returnExports.js - if (typeof exports === 'object') { - // Node - module.exports = factory(); - } else if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(factory); - } else { - // Browser globals (root is window) - root.SecondLevelDomains = factory(root); - } -}(this, function (root) { - 'use strict'; - - // save current SecondLevelDomains variable, if any - var _SecondLevelDomains = root && root.SecondLevelDomains; - - var SLD = { - // list of known Second Level Domains - // converted list of SLDs from https://github.com/gavingmiller/second-level-domains - // ---- - // publicsuffix.org is more current and actually used by a couple of browsers internally. - // downside is it also contains domains like "dyndns.org" - which is fine for the security - // issues browser have to deal with (SOP for cookies, etc) - but is way overboard for URI.js - // ---- - list: { - 'ac':' com gov mil net org ', - 'ae':' ac co gov mil name net org pro sch ', - 'af':' com edu gov net org ', - 'al':' com edu gov mil net org ', - 'ao':' co ed gv it og pb ', - 'ar':' com edu gob gov int mil net org tur ', - 'at':' ac co gv or ', - 'au':' asn com csiro edu gov id net org ', - 'ba':' co com edu gov mil net org rs unbi unmo unsa untz unze ', - 'bb':' biz co com edu gov info net org store tv ', - 'bh':' biz cc com edu gov info net org ', - 'bn':' com edu gov net org ', - 'bo':' com edu gob gov int mil net org tv ', - 'br':' adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ', - 'bs':' com edu gov net org ', - 'bz':' du et om ov rg ', - 'ca':' ab bc mb nb nf nl ns nt nu on pe qc sk yk ', - 'ck':' biz co edu gen gov info net org ', - 'cn':' ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ', - 'co':' com edu gov mil net nom org ', - 'cr':' ac c co ed fi go or sa ', - 'cy':' ac biz com ekloges gov ltd name net org parliament press pro tm ', - 'do':' art com edu gob gov mil net org sld web ', - 'dz':' art asso com edu gov net org pol ', - 'ec':' com edu fin gov info med mil net org pro ', - 'eg':' com edu eun gov mil name net org sci ', - 'er':' com edu gov ind mil net org rochest w ', - 'es':' com edu gob nom org ', - 'et':' biz com edu gov info name net org ', - 'fj':' ac biz com info mil name net org pro ', - 'fk':' ac co gov net nom org ', - 'fr':' asso com f gouv nom prd presse tm ', - 'gg':' co net org ', - 'gh':' com edu gov mil org ', - 'gn':' ac com gov net org ', - 'gr':' com edu gov mil net org ', - 'gt':' com edu gob ind mil net org ', - 'gu':' com edu gov net org ', - 'hk':' com edu gov idv net org ', - 'hu':' 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ', - 'id':' ac co go mil net or sch web ', - 'il':' ac co gov idf k12 muni net org ', - 'in':' ac co edu ernet firm gen gov i ind mil net nic org res ', - 'iq':' com edu gov i mil net org ', - 'ir':' ac co dnssec gov i id net org sch ', - 'it':' edu gov ', - 'je':' co net org ', - 'jo':' com edu gov mil name net org sch ', - 'jp':' ac ad co ed go gr lg ne or ', - 'ke':' ac co go info me mobi ne or sc ', - 'kh':' com edu gov mil net org per ', - 'ki':' biz com de edu gov info mob net org tel ', - 'km':' asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ', - 'kn':' edu gov net org ', - 'kr':' ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ', - 'kw':' com edu gov net org ', - 'ky':' com edu gov net org ', - 'kz':' com edu gov mil net org ', - 'lb':' com edu gov net org ', - 'lk':' assn com edu gov grp hotel int ltd net ngo org sch soc web ', - 'lr':' com edu gov net org ', - 'lv':' asn com conf edu gov id mil net org ', - 'ly':' com edu gov id med net org plc sch ', - 'ma':' ac co gov m net org press ', - 'mc':' asso tm ', - 'me':' ac co edu gov its net org priv ', - 'mg':' com edu gov mil nom org prd tm ', - 'mk':' com edu gov inf name net org pro ', - 'ml':' com edu gov net org presse ', - 'mn':' edu gov org ', - 'mo':' com edu gov net org ', - 'mt':' com edu gov net org ', - 'mv':' aero biz com coop edu gov info int mil museum name net org pro ', - 'mw':' ac co com coop edu gov int museum net org ', - 'mx':' com edu gob net org ', - 'my':' com edu gov mil name net org sch ', - 'nf':' arts com firm info net other per rec store web ', - 'ng':' biz com edu gov mil mobi name net org sch ', - 'ni':' ac co com edu gob mil net nom org ', - 'np':' com edu gov mil net org ', - 'nr':' biz com edu gov info net org ', - 'om':' ac biz co com edu gov med mil museum net org pro sch ', - 'pe':' com edu gob mil net nom org sld ', - 'ph':' com edu gov i mil net ngo org ', - 'pk':' biz com edu fam gob gok gon gop gos gov net org web ', - 'pl':' art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ', - 'pr':' ac biz com edu est gov info isla name net org pro prof ', - 'ps':' com edu gov net org plo sec ', - 'pw':' belau co ed go ne or ', - 'ro':' arts com firm info nom nt org rec store tm www ', - 'rs':' ac co edu gov in org ', - 'sb':' com edu gov net org ', - 'sc':' com edu gov net org ', - 'sh':' co com edu gov net nom org ', - 'sl':' com edu gov net org ', - 'st':' co com consulado edu embaixada gov mil net org principe saotome store ', - 'sv':' com edu gob org red ', - 'sz':' ac co org ', - 'tr':' av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ', - 'tt':' aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ', - 'tw':' club com ebiz edu game gov idv mil net org ', - 'mu':' ac co com gov net or org ', - 'mz':' ac co edu gov org ', - 'na':' co com ', - 'nz':' ac co cri geek gen govt health iwi maori mil net org parliament school ', - 'pa':' abo ac com edu gob ing med net nom org sld ', - 'pt':' com edu gov int net nome org publ ', - 'py':' com edu gov mil net org ', - 'qa':' com edu gov mil net org ', - 're':' asso com nom ', - 'ru':' ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ', - 'rw':' ac co com edu gouv gov int mil net ', - 'sa':' com edu gov med net org pub sch ', - 'sd':' com edu gov info med net org tv ', - 'se':' a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ', - 'sg':' com edu gov idn net org per ', - 'sn':' art com edu gouv org perso univ ', - 'sy':' com edu gov mil net news org ', - 'th':' ac co go in mi net or ', - 'tj':' ac biz co com edu go gov info int mil name net nic org test web ', - 'tn':' agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ', - 'tz':' ac co go ne or ', - 'ua':' biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ', - 'ug':' ac co go ne or org sc ', - 'uk':' ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ', - 'us':' dni fed isa kids nsn ', - 'uy':' com edu gub mil net org ', - 've':' co com edu gob info mil net org web ', - 'vi':' co com k12 net org ', - 'vn':' ac biz com edu gov health info int name net org pro ', - 'ye':' co com gov ltd me net org plc ', - 'yu':' ac co edu gov org ', - 'za':' ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ', - 'zm':' ac co com edu gov net org sch ' - }, - // gorhill 2013-10-25: Using indexOf() instead Regexp(). Significant boost - // in both performance and memory footprint. No initialization required. - // http://jsperf.com/uri-js-sld-regex-vs-binary-search/4 - // Following methods use lastIndexOf() rather than array.split() in order - // to avoid any memory allocations. - has: function(domain) { - var tldOffset = domain.lastIndexOf('.'); - if (tldOffset <= 0 || tldOffset >= (domain.length-1)) { - return false; - } - var sldOffset = domain.lastIndexOf('.', tldOffset-1); - if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) { - return false; - } - var sldList = SLD.list[domain.slice(tldOffset+1)]; - if (!sldList) { - return false; - } - return sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') >= 0; - }, - is: function(domain) { - var tldOffset = domain.lastIndexOf('.'); - if (tldOffset <= 0 || tldOffset >= (domain.length-1)) { - return false; - } - var sldOffset = domain.lastIndexOf('.', tldOffset-1); - if (sldOffset >= 0) { - return false; - } - var sldList = SLD.list[domain.slice(tldOffset+1)]; - if (!sldList) { - return false; - } - return sldList.indexOf(' ' + domain.slice(0, tldOffset) + ' ') >= 0; - }, - get: function(domain) { - var tldOffset = domain.lastIndexOf('.'); - if (tldOffset <= 0 || tldOffset >= (domain.length-1)) { - return null; - } - var sldOffset = domain.lastIndexOf('.', tldOffset-1); - if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) { - return null; - } - var sldList = SLD.list[domain.slice(tldOffset+1)]; - if (!sldList) { - return null; - } - if (sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') < 0) { - return null; - } - return domain.slice(sldOffset+1); - }, - noConflict: function(){ - if (root.SecondLevelDomains === this) { - root.SecondLevelDomains = _SecondLevelDomains; - } - return this; - } - }; - - return SLD; -})); - -},{}],7:[function(require,module,exports){ -/*! - * URI.js - Mutating URLs - * - * Version: 1.18.1 - * - * Author: Rodney Rehm - * Web: http://medialize.github.io/URI.js/ - * - * Licensed under - * MIT License http://www.opensource.org/licenses/mit-license - * - */ -(function (root, factory) { - 'use strict'; - // https://github.com/umdjs/umd/blob/master/returnExports.js - if (typeof exports === 'object') { - // Node - module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains')); - } else if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['./punycode', './IPv6', './SecondLevelDomains'], factory); - } else { - // Browser globals (root is window) - root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root); - } -}(this, function (punycode, IPv6, SLD, root) { - 'use strict'; - /*global location, escape, unescape */ - // FIXME: v2.0.0 renamce non-camelCase properties to uppercase - /*jshint camelcase: false */ - - // save current URI variable, if any - var _URI = root && root.URI; - - function URI(url, base) { - var _urlSupplied = arguments.length >= 1; - var _baseSupplied = arguments.length >= 2; - - // Allow instantiation without the 'new' keyword - if (!(this instanceof URI)) { - if (_urlSupplied) { - if (_baseSupplied) { - return new URI(url, base); - } - - return new URI(url); - } - - return new URI(); - } - - if (url === undefined) { - if (_urlSupplied) { - throw new TypeError('undefined is not a valid argument for URI'); - } - - if (typeof location !== 'undefined') { - url = location.href + ''; - } else { - url = ''; - } - } - - this.href(url); - - // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor - if (base !== undefined) { - return this.absoluteTo(base); - } - - return this; - } - - URI.version = '1.18.1'; - - var p = URI.prototype; - var hasOwn = Object.prototype.hasOwnProperty; - - function escapeRegEx(string) { - // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963 - return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); - } - - function getType(value) { - // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value - if (value === undefined) { - return 'Undefined'; - } - - return String(Object.prototype.toString.call(value)).slice(8, -1); - } - - function isArray(obj) { - return getType(obj) === 'Array'; - } - - function filterArrayValues(data, value) { - var lookup = {}; - var i, length; - - if (getType(value) === 'RegExp') { - lookup = null; - } else if (isArray(value)) { - for (i = 0, length = value.length; i < length; i++) { - lookup[value[i]] = true; - } - } else { - lookup[value] = true; - } - - for (i = 0, length = data.length; i < length; i++) { - /*jshint laxbreak: true */ - var _match = lookup && lookup[data[i]] !== undefined - || !lookup && value.test(data[i]); - /*jshint laxbreak: false */ - if (_match) { - data.splice(i, 1); - length--; - i--; - } - } - - return data; - } - - function arrayContains(list, value) { - var i, length; - - // value may be string, number, array, regexp - if (isArray(value)) { - // Note: this can be optimized to O(n) (instead of current O(m * n)) - for (i = 0, length = value.length; i < length; i++) { - if (!arrayContains(list, value[i])) { - return false; - } - } - - return true; - } - - var _type = getType(value); - for (i = 0, length = list.length; i < length; i++) { - if (_type === 'RegExp') { - if (typeof list[i] === 'string' && list[i].match(value)) { - return true; - } - } else if (list[i] === value) { - return true; - } - } - - return false; - } - - function arraysEqual(one, two) { - if (!isArray(one) || !isArray(two)) { - return false; - } - - // arrays can't be equal if they have different amount of content - if (one.length !== two.length) { - return false; - } - - one.sort(); - two.sort(); - - for (var i = 0, l = one.length; i < l; i++) { - if (one[i] !== two[i]) { - return false; - } - } - - return true; - } - - function trimSlashes(text) { - var trim_expression = /^\/+|\/+$/g; - return text.replace(trim_expression, ''); - } - - URI._parts = function() { - return { - protocol: null, - username: null, - password: null, - hostname: null, - urn: null, - port: null, - path: null, - query: null, - fragment: null, - // state - duplicateQueryParameters: URI.duplicateQueryParameters, - escapeQuerySpace: URI.escapeQuerySpace - }; - }; - // state: allow duplicate query parameters (a=1&a=1) - URI.duplicateQueryParameters = false; - // state: replaces + with %20 (space in query strings) - URI.escapeQuerySpace = true; - // static properties - URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i; - URI.idn_expression = /[^a-z0-9\.-]/i; - URI.punycode_expression = /(xn--)/i; - // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care? - URI.ip4_expression = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; - // credits to Rich Brown - // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096 - // specification: http://www.ietf.org/rfc/rfc4291.txt - URI.ip6_expression = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/; - // expression used is "gruber revised" (@gruber v2) determined to be the - // best solution in a regex-golf we did a couple of ages ago at - // * http://mathiasbynens.be/demo/url-regex - // * http://rodneyrehm.de/t/url-regex.html - URI.find_uri_expression = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig; - URI.findUri = { - // valid "scheme://" or "www." - start: /\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi, - // everything up to the next whitespace - end: /[\s\r\n]|$/, - // trim trailing punctuation captured by end RegExp - trim: /[`!()\[\]{};:'".,<>?«»“”„‘’]+$/ - }; - // http://www.iana.org/assignments/uri-schemes.html - // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports - URI.defaultPorts = { - http: '80', - https: '443', - ftp: '21', - gopher: '70', - ws: '80', - wss: '443' - }; - // allowed hostname characters according to RFC 3986 - // ALPHA DIGIT "-" "." "_" "~" "!" "$" "&" "'" "(" ")" "*" "+" "," ";" "=" %encoded - // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . - - URI.invalid_hostname_characters = /[^a-zA-Z0-9\.-]/; - // map DOM Elements to their URI attribute - URI.domAttributes = { - 'a': 'href', - 'blockquote': 'cite', - 'link': 'href', - 'base': 'href', - 'script': 'src', - 'form': 'action', - 'img': 'src', - 'area': 'href', - 'iframe': 'src', - 'embed': 'src', - 'source': 'src', - 'track': 'src', - 'input': 'src', // but only if type="image" - 'audio': 'src', - 'video': 'src' - }; - URI.getDomAttribute = function(node) { - if (!node || !node.nodeName) { - return undefined; - } - - var nodeName = node.nodeName.toLowerCase(); - // should only expose src for type="image" - if (nodeName === 'input' && node.type !== 'image') { - return undefined; - } - - return URI.domAttributes[nodeName]; - }; - - function escapeForDumbFirefox36(value) { - // https://github.com/medialize/URI.js/issues/91 - return escape(value); - } - - // encoding / decoding according to RFC3986 - function strictEncodeURIComponent(string) { - // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent - return encodeURIComponent(string) - .replace(/[!'()*]/g, escapeForDumbFirefox36) - .replace(/\*/g, '%2A'); - } - URI.encode = strictEncodeURIComponent; - URI.decode = decodeURIComponent; - URI.iso8859 = function() { - URI.encode = escape; - URI.decode = unescape; - }; - URI.unicode = function() { - URI.encode = strictEncodeURIComponent; - URI.decode = decodeURIComponent; - }; - URI.characters = { - pathname: { - encode: { - // RFC3986 2.1: For consistency, URI producers and normalizers should - // use uppercase hexadecimal digits for all percent-encodings. - expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig, - map: { - // -._~!'()* - '%24': '$', - '%26': '&', - '%2B': '+', - '%2C': ',', - '%3B': ';', - '%3D': '=', - '%3A': ':', - '%40': '@' - } - }, - decode: { - expression: /[\/\?#]/g, - map: { - '/': '%2F', - '?': '%3F', - '#': '%23' - } - } - }, - reserved: { - encode: { - // RFC3986 2.1: For consistency, URI producers and normalizers should - // use uppercase hexadecimal digits for all percent-encodings. - expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig, - map: { - // gen-delims - '%3A': ':', - '%2F': '/', - '%3F': '?', - '%23': '#', - '%5B': '[', - '%5D': ']', - '%40': '@', - // sub-delims - '%21': '!', - '%24': '$', - '%26': '&', - '%27': '\'', - '%28': '(', - '%29': ')', - '%2A': '*', - '%2B': '+', - '%2C': ',', - '%3B': ';', - '%3D': '=' - } - } - }, - urnpath: { - // The characters under `encode` are the characters called out by RFC 2141 as being acceptable - // for usage in a URN. RFC2141 also calls out "-", ".", and "_" as acceptable characters, but - // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also - // note that the colon character is not featured in the encoding map; this is because URI.js - // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it - // should not appear unencoded in a segment itself. - // See also the note above about RFC3986 and capitalalized hex digits. - encode: { - expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig, - map: { - '%21': '!', - '%24': '$', - '%27': '\'', - '%28': '(', - '%29': ')', - '%2A': '*', - '%2B': '+', - '%2C': ',', - '%3B': ';', - '%3D': '=', - '%40': '@' - } - }, - // These characters are the characters called out by RFC2141 as "reserved" characters that - // should never appear in a URN, plus the colon character (see note above). - decode: { - expression: /[\/\?#:]/g, - map: { - '/': '%2F', - '?': '%3F', - '#': '%23', - ':': '%3A' - } - } - } - }; - URI.encodeQuery = function(string, escapeQuerySpace) { - var escaped = URI.encode(string + ''); - if (escapeQuerySpace === undefined) { - escapeQuerySpace = URI.escapeQuerySpace; - } - - return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped; - }; - URI.decodeQuery = function(string, escapeQuerySpace) { - string += ''; - if (escapeQuerySpace === undefined) { - escapeQuerySpace = URI.escapeQuerySpace; - } - - try { - return URI.decode(escapeQuerySpace ? string.replace(/\+/g, '%20') : string); - } catch(e) { - // we're not going to mess with weird encodings, - // give up and return the undecoded original string - // see https://github.com/medialize/URI.js/issues/87 - // see https://github.com/medialize/URI.js/issues/92 - return string; - } - }; - // generate encode/decode path functions - var _parts = {'encode':'encode', 'decode':'decode'}; - var _part; - var generateAccessor = function(_group, _part) { - return function(string) { - try { - return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) { - return URI.characters[_group][_part].map[c]; - }); - } catch (e) { - // we're not going to mess with weird encodings, - // give up and return the undecoded original string - // see https://github.com/medialize/URI.js/issues/87 - // see https://github.com/medialize/URI.js/issues/92 - return string; - } - }; - }; - - for (_part in _parts) { - URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]); - URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]); - } - - var generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) { - return function(string) { - // Why pass in names of functions, rather than the function objects themselves? The - // definitions of some functions (but in particular, URI.decode) will occasionally change due - // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure - // that the functions we use here are "fresh". - var actualCodingFunc; - if (!_innerCodingFuncName) { - actualCodingFunc = URI[_codingFuncName]; - } else { - actualCodingFunc = function(string) { - return URI[_codingFuncName](URI[_innerCodingFuncName](string)); - }; - } - - var segments = (string + '').split(_sep); - - for (var i = 0, length = segments.length; i < length; i++) { - segments[i] = actualCodingFunc(segments[i]); - } - - return segments.join(_sep); - }; - }; - - // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions. - URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment'); - URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment'); - URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode'); - URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode'); - - URI.encodeReserved = generateAccessor('reserved', 'encode'); - - URI.parse = function(string, parts) { - var pos; - if (!parts) { - parts = {}; - } - // [protocol"://"[username[":"password]"@"]hostname[":"port]"/"?][path]["?"querystring]["#"fragment] - - // extract fragment - pos = string.indexOf('#'); - if (pos > -1) { - // escaping? - parts.fragment = string.substring(pos + 1) || null; - string = string.substring(0, pos); - } - - // extract query - pos = string.indexOf('?'); - if (pos > -1) { - // escaping? - parts.query = string.substring(pos + 1) || null; - string = string.substring(0, pos); - } - - // extract protocol - if (string.substring(0, 2) === '//') { - // relative-scheme - parts.protocol = null; - string = string.substring(2); - // extract "user:pass@host:port" - string = URI.parseAuthority(string, parts); - } else { - pos = string.indexOf(':'); - if (pos > -1) { - parts.protocol = string.substring(0, pos) || null; - if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) { - // : may be within the path - parts.protocol = undefined; - } else if (string.substring(pos + 1, pos + 3) === '//') { - string = string.substring(pos + 3); - - // extract "user:pass@host:port" - string = URI.parseAuthority(string, parts); - } else { - string = string.substring(pos + 1); - parts.urn = true; - } - } - } - - // what's left must be the path - parts.path = string; - - // and we're done - return parts; - }; - URI.parseHost = function(string, parts) { - // Copy chrome, IE, opera backslash-handling behavior. - // Back slashes before the query string get converted to forward slashes - // See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124 - // See: https://code.google.com/p/chromium/issues/detail?id=25916 - // https://github.com/medialize/URI.js/pull/233 - string = string.replace(/\\/g, '/'); - - // extract host:port - var pos = string.indexOf('/'); - var bracketPos; - var t; - - if (pos === -1) { - pos = string.length; - } - - if (string.charAt(0) === '[') { - // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6 - // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts - // IPv6+port in the format [2001:db8::1]:80 (for the time being) - bracketPos = string.indexOf(']'); - parts.hostname = string.substring(1, bracketPos) || null; - parts.port = string.substring(bracketPos + 2, pos) || null; - if (parts.port === '/') { - parts.port = null; - } - } else { - var firstColon = string.indexOf(':'); - var firstSlash = string.indexOf('/'); - var nextColon = string.indexOf(':', firstColon + 1); - if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) { - // IPv6 host contains multiple colons - but no port - // this notation is actually not allowed by RFC 3986, but we're a liberal parser - parts.hostname = string.substring(0, pos) || null; - parts.port = null; - } else { - t = string.substring(0, pos).split(':'); - parts.hostname = t[0] || null; - parts.port = t[1] || null; - } - } - - if (parts.hostname && string.substring(pos).charAt(0) !== '/') { - pos++; - string = '/' + string; - } - - return string.substring(pos) || '/'; - }; - URI.parseAuthority = function(string, parts) { - string = URI.parseUserinfo(string, parts); - return URI.parseHost(string, parts); - }; - URI.parseUserinfo = function(string, parts) { - // extract username:password - var firstSlash = string.indexOf('/'); - var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1); - var t; - - // authority@ must come before /path - if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) { - t = string.substring(0, pos).split(':'); - parts.username = t[0] ? URI.decode(t[0]) : null; - t.shift(); - parts.password = t[0] ? URI.decode(t.join(':')) : null; - string = string.substring(pos + 1); - } else { - parts.username = null; - parts.password = null; - } - - return string; - }; - URI.parseQuery = function(string, escapeQuerySpace) { - if (!string) { - return {}; - } - - // throw out the funky business - "?"[name"="value"&"]+ - string = string.replace(/&+/g, '&').replace(/^\?*&*|&+$/g, ''); - - if (!string) { - return {}; - } - - var items = {}; - var splits = string.split('&'); - var length = splits.length; - var v, name, value; - - for (var i = 0; i < length; i++) { - v = splits[i].split('='); - name = URI.decodeQuery(v.shift(), escapeQuerySpace); - // no "=" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters - value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null; - - if (hasOwn.call(items, name)) { - if (typeof items[name] === 'string' || items[name] === null) { - items[name] = [items[name]]; - } - - items[name].push(value); - } else { - items[name] = value; - } - } - - return items; - }; - - URI.build = function(parts) { - var t = ''; - - if (parts.protocol) { - t += parts.protocol + ':'; - } - - if (!parts.urn && (t || parts.hostname)) { - t += '//'; - } - - t += (URI.buildAuthority(parts) || ''); - - if (typeof parts.path === 'string') { - if (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') { - t += '/'; - } - - t += parts.path; - } - - if (typeof parts.query === 'string' && parts.query) { - t += '?' + parts.query; - } - - if (typeof parts.fragment === 'string' && parts.fragment) { - t += '#' + parts.fragment; - } - return t; - }; - URI.buildHost = function(parts) { - var t = ''; - - if (!parts.hostname) { - return ''; - } else if (URI.ip6_expression.test(parts.hostname)) { - t += '[' + parts.hostname + ']'; - } else { - t += parts.hostname; - } - - if (parts.port) { - t += ':' + parts.port; - } - - return t; - }; - URI.buildAuthority = function(parts) { - return URI.buildUserinfo(parts) + URI.buildHost(parts); - }; - URI.buildUserinfo = function(parts) { - var t = ''; - - if (parts.username) { - t += URI.encode(parts.username); - } - - if (parts.password) { - t += ':' + URI.encode(parts.password); - } - - if (t) { - t += '@'; - } - - return t; - }; - URI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) { - // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html - // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed - // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax! - // URI.js treats the query string as being application/x-www-form-urlencoded - // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type - - var t = ''; - var unique, key, i, length; - for (key in data) { - if (hasOwn.call(data, key) && key) { - if (isArray(data[key])) { - unique = {}; - for (i = 0, length = data[key].length; i < length; i++) { - if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) { - t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace); - if (duplicateQueryParameters !== true) { - unique[data[key][i] + ''] = true; - } - } - } - } else if (data[key] !== undefined) { - t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace); - } - } - } - - return t.substring(1); - }; - URI.buildQueryParameter = function(name, value, escapeQuerySpace) { - // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded - // don't append "=" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization - return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : ''); - }; - - URI.addQuery = function(data, name, value) { - if (typeof name === 'object') { - for (var key in name) { - if (hasOwn.call(name, key)) { - URI.addQuery(data, key, name[key]); - } - } - } else if (typeof name === 'string') { - if (data[name] === undefined) { - data[name] = value; - return; - } else if (typeof data[name] === 'string') { - data[name] = [data[name]]; - } - - if (!isArray(value)) { - value = [value]; - } - - data[name] = (data[name] || []).concat(value); - } else { - throw new TypeError('URI.addQuery() accepts an object, string as the name parameter'); - } - }; - URI.removeQuery = function(data, name, value) { - var i, length, key; - - if (isArray(name)) { - for (i = 0, length = name.length; i < length; i++) { - data[name[i]] = undefined; - } - } else if (getType(name) === 'RegExp') { - for (key in data) { - if (name.test(key)) { - data[key] = undefined; - } - } - } else if (typeof name === 'object') { - for (key in name) { - if (hasOwn.call(name, key)) { - URI.removeQuery(data, key, name[key]); - } - } - } else if (typeof name === 'string') { - if (value !== undefined) { - if (getType(value) === 'RegExp') { - if (!isArray(data[name]) && value.test(data[name])) { - data[name] = undefined; - } else { - data[name] = filterArrayValues(data[name], value); - } - } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) { - data[name] = undefined; - } else if (isArray(data[name])) { - data[name] = filterArrayValues(data[name], value); - } - } else { - data[name] = undefined; - } - } else { - throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter'); - } - }; - URI.hasQuery = function(data, name, value, withinArray) { - switch (getType(name)) { - case 'String': - // Nothing to do here - break; - - case 'RegExp': - for (var key in data) { - if (hasOwn.call(data, key)) { - if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) { - return true; - } - } - } - - return false; - - case 'Object': - for (var _key in name) { - if (hasOwn.call(name, _key)) { - if (!URI.hasQuery(data, _key, name[_key])) { - return false; - } - } - } - - return true; - - default: - throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter'); - } - - switch (getType(value)) { - case 'Undefined': - // true if exists (but may be empty) - return name in data; // data[name] !== undefined; - - case 'Boolean': - // true if exists and non-empty - var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]); - return value === _booly; - - case 'Function': - // allow complex comparison - return !!value(data[name], name, data); - - case 'Array': - if (!isArray(data[name])) { - return false; - } - - var op = withinArray ? arrayContains : arraysEqual; - return op(data[name], value); - - case 'RegExp': - if (!isArray(data[name])) { - return Boolean(data[name] && data[name].match(value)); - } - - if (!withinArray) { - return false; - } - - return arrayContains(data[name], value); - - case 'Number': - value = String(value); - /* falls through */ - case 'String': - if (!isArray(data[name])) { - return data[name] === value; - } - - if (!withinArray) { - return false; - } - - return arrayContains(data[name], value); - - default: - throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter'); - } - }; - - - URI.joinPaths = function() { - var input = []; - var segments = []; - var nonEmptySegments = 0; - - for (var i = 0; i < arguments.length; i++) { - var url = new URI(arguments[i]); - input.push(url); - var _segments = url.segment(); - for (var s = 0; s < _segments.length; s++) { - if (typeof _segments[s] === 'string') { - segments.push(_segments[s]); - } - - if (_segments[s]) { - nonEmptySegments++; - } - } - } - - if (!segments.length || !nonEmptySegments) { - return new URI(''); - } - - var uri = new URI('').segment(segments); - - if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') { - uri.path('/' + uri.path()); - } - - return uri.normalize(); - }; - - URI.commonPath = function(one, two) { - var length = Math.min(one.length, two.length); - var pos; - - // find first non-matching character - for (pos = 0; pos < length; pos++) { - if (one.charAt(pos) !== two.charAt(pos)) { - pos--; - break; - } - } - - if (pos < 1) { - return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : ''; - } - - // revert to last / - if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') { - pos = one.substring(0, pos).lastIndexOf('/'); - } - - return one.substring(0, pos + 1); - }; - - URI.withinString = function(string, callback, options) { - options || (options = {}); - var _start = options.start || URI.findUri.start; - var _end = options.end || URI.findUri.end; - var _trim = options.trim || URI.findUri.trim; - var _attributeOpen = /[a-z0-9-]=["']?$/i; - - _start.lastIndex = 0; - while (true) { - var match = _start.exec(string); - if (!match) { - break; - } - - var start = match.index; - if (options.ignoreHtml) { - // attribut(e=["']?$) - var attributeOpen = string.slice(Math.max(start - 3, 0), start); - if (attributeOpen && _attributeOpen.test(attributeOpen)) { - continue; - } - } - - var end = start + string.slice(start).search(_end); - var slice = string.slice(start, end).replace(_trim, ''); - if (options.ignore && options.ignore.test(slice)) { - continue; - } - - end = start + slice.length; - var result = callback(slice, start, end, string); - string = string.slice(0, start) + result + string.slice(end); - _start.lastIndex = start + result.length; - } - - _start.lastIndex = 0; - return string; - }; - - URI.ensureValidHostname = function(v) { - // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986) - // they are not part of DNS and therefore ignored by URI.js - - if (v.match(URI.invalid_hostname_characters)) { - // test punycode - if (!punycode) { - throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-] and Punycode.js is not available'); - } - - if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) { - throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]'); - } - } - }; - - // noConflict - URI.noConflict = function(removeAll) { - if (removeAll) { - var unconflicted = { - URI: this.noConflict() - }; - - if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') { - unconflicted.URITemplate = root.URITemplate.noConflict(); - } - - if (root.IPv6 && typeof root.IPv6.noConflict === 'function') { - unconflicted.IPv6 = root.IPv6.noConflict(); - } - - if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') { - unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict(); - } - - return unconflicted; - } else if (root.URI === this) { - root.URI = _URI; - } - - return this; - }; - - p.build = function(deferBuild) { - if (deferBuild === true) { - this._deferred_build = true; - } else if (deferBuild === undefined || this._deferred_build) { - this._string = URI.build(this._parts); - this._deferred_build = false; - } - - return this; - }; - - p.clone = function() { - return new URI(this); - }; - - p.valueOf = p.toString = function() { - return this.build(false)._string; - }; - - - function generateSimpleAccessor(_part){ - return function(v, build) { - if (v === undefined) { - return this._parts[_part] || ''; - } else { - this._parts[_part] = v || null; - this.build(!build); - return this; - } - }; - } - - function generatePrefixAccessor(_part, _key){ - return function(v, build) { - if (v === undefined) { - return this._parts[_part] || ''; - } else { - if (v !== null) { - v = v + ''; - if (v.charAt(0) === _key) { - v = v.substring(1); - } - } - - this._parts[_part] = v; - this.build(!build); - return this; - } - }; - } - - p.protocol = generateSimpleAccessor('protocol'); - p.username = generateSimpleAccessor('username'); - p.password = generateSimpleAccessor('password'); - p.hostname = generateSimpleAccessor('hostname'); - p.port = generateSimpleAccessor('port'); - p.query = generatePrefixAccessor('query', '?'); - p.fragment = generatePrefixAccessor('fragment', '#'); - - p.search = function(v, build) { - var t = this.query(v, build); - return typeof t === 'string' && t.length ? ('?' + t) : t; - }; - p.hash = function(v, build) { - var t = this.fragment(v, build); - return typeof t === 'string' && t.length ? ('#' + t) : t; - }; - - p.pathname = function(v, build) { - if (v === undefined || v === true) { - var res = this._parts.path || (this._parts.hostname ? '/' : ''); - return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res; - } else { - if (this._parts.urn) { - this._parts.path = v ? URI.recodeUrnPath(v) : ''; - } else { - this._parts.path = v ? URI.recodePath(v) : '/'; - } - this.build(!build); - return this; - } - }; - p.path = p.pathname; - p.href = function(href, build) { - var key; - - if (href === undefined) { - return this.toString(); - } - - this._string = ''; - this._parts = URI._parts(); - - var _URI = href instanceof URI; - var _object = typeof href === 'object' && (href.hostname || href.path || href.pathname); - if (href.nodeName) { - var attribute = URI.getDomAttribute(href); - href = href[attribute] || ''; - _object = false; - } - - // window.location is reported to be an object, but it's not the sort - // of object we're looking for: - // * location.protocol ends with a colon - // * location.query != object.search - // * location.hash != object.fragment - // simply serializing the unknown object should do the trick - // (for location, not for everything...) - if (!_URI && _object && href.pathname !== undefined) { - href = href.toString(); - } - - if (typeof href === 'string' || href instanceof String) { - this._parts = URI.parse(String(href), this._parts); - } else if (_URI || _object) { - var src = _URI ? href._parts : href; - for (key in src) { - if (hasOwn.call(this._parts, key)) { - this._parts[key] = src[key]; - } - } - } else { - throw new TypeError('invalid input'); - } - - this.build(!build); - return this; - }; - - // identification accessors - p.is = function(what) { - var ip = false; - var ip4 = false; - var ip6 = false; - var name = false; - var sld = false; - var idn = false; - var punycode = false; - var relative = !this._parts.urn; - - if (this._parts.hostname) { - relative = false; - ip4 = URI.ip4_expression.test(this._parts.hostname); - ip6 = URI.ip6_expression.test(this._parts.hostname); - ip = ip4 || ip6; - name = !ip; - sld = name && SLD && SLD.has(this._parts.hostname); - idn = name && URI.idn_expression.test(this._parts.hostname); - punycode = name && URI.punycode_expression.test(this._parts.hostname); - } - - switch (what.toLowerCase()) { - case 'relative': - return relative; - - case 'absolute': - return !relative; - - // hostname identification - case 'domain': - case 'name': - return name; - - case 'sld': - return sld; - - case 'ip': - return ip; - - case 'ip4': - case 'ipv4': - case 'inet4': - return ip4; - - case 'ip6': - case 'ipv6': - case 'inet6': - return ip6; - - case 'idn': - return idn; - - case 'url': - return !this._parts.urn; - - case 'urn': - return !!this._parts.urn; - - case 'punycode': - return punycode; - } - - return null; - }; - - // component specific input validation - var _protocol = p.protocol; - var _port = p.port; - var _hostname = p.hostname; - - p.protocol = function(v, build) { - if (v !== undefined) { - if (v) { - // accept trailing :// - v = v.replace(/:(\/\/)?$/, ''); - - if (!v.match(URI.protocol_expression)) { - throw new TypeError('Protocol "' + v + '" contains characters other than [A-Z0-9.+-] or doesn\'t start with [A-Z]'); - } - } - } - return _protocol.call(this, v, build); - }; - p.scheme = p.protocol; - p.port = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (v !== undefined) { - if (v === 0) { - v = null; - } - - if (v) { - v += ''; - if (v.charAt(0) === ':') { - v = v.substring(1); - } - - if (v.match(/[^0-9]/)) { - throw new TypeError('Port "' + v + '" contains characters other than [0-9]'); - } - } - } - return _port.call(this, v, build); - }; - p.hostname = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (v !== undefined) { - var x = {}; - var res = URI.parseHost(v, x); - if (res !== '/') { - throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]'); - } - - v = x.hostname; - } - return _hostname.call(this, v, build); - }; - - // compound accessors - p.origin = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (v === undefined) { - var protocol = this.protocol(); - var authority = this.authority(); - if (!authority) { - return ''; - } - - return (protocol ? protocol + '://' : '') + this.authority(); - } else { - var origin = URI(v); - this - .protocol(origin.protocol()) - .authority(origin.authority()) - .build(!build); - return this; - } - }; - p.host = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (v === undefined) { - return this._parts.hostname ? URI.buildHost(this._parts) : ''; - } else { - var res = URI.parseHost(v, this._parts); - if (res !== '/') { - throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]'); - } - - this.build(!build); - return this; - } - }; - p.authority = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (v === undefined) { - return this._parts.hostname ? URI.buildAuthority(this._parts) : ''; - } else { - var res = URI.parseAuthority(v, this._parts); - if (res !== '/') { - throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]'); - } - - this.build(!build); - return this; - } - }; - p.userinfo = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (v === undefined) { - var t = URI.buildUserinfo(this._parts); - return t ? t.substring(0, t.length -1) : t; - } else { - if (v[v.length-1] !== '@') { - v += '@'; - } - - URI.parseUserinfo(v, this._parts); - this.build(!build); - return this; - } - }; - p.resource = function(v, build) { - var parts; - - if (v === undefined) { - return this.path() + this.search() + this.hash(); - } - - parts = URI.parse(v); - this._parts.path = parts.path; - this._parts.query = parts.query; - this._parts.fragment = parts.fragment; - this.build(!build); - return this; - }; - - // fraction accessors - p.subdomain = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - // convenience, return "www" from "www.example.org" - if (v === undefined) { - if (!this._parts.hostname || this.is('IP')) { - return ''; - } - - // grab domain and add another segment - var end = this._parts.hostname.length - this.domain().length - 1; - return this._parts.hostname.substring(0, end) || ''; - } else { - var e = this._parts.hostname.length - this.domain().length; - var sub = this._parts.hostname.substring(0, e); - var replace = new RegExp('^' + escapeRegEx(sub)); - - if (v && v.charAt(v.length - 1) !== '.') { - v += '.'; - } - - if (v) { - URI.ensureValidHostname(v); - } - - this._parts.hostname = this._parts.hostname.replace(replace, v); - this.build(!build); - return this; - } - }; - p.domain = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (typeof v === 'boolean') { - build = v; - v = undefined; - } - - // convenience, return "example.org" from "www.example.org" - if (v === undefined) { - if (!this._parts.hostname || this.is('IP')) { - return ''; - } - - // if hostname consists of 1 or 2 segments, it must be the domain - var t = this._parts.hostname.match(/\./g); - if (t && t.length < 2) { - return this._parts.hostname; - } - - // grab tld and add another segment - var end = this._parts.hostname.length - this.tld(build).length - 1; - end = this._parts.hostname.lastIndexOf('.', end -1) + 1; - return this._parts.hostname.substring(end) || ''; - } else { - if (!v) { - throw new TypeError('cannot set domain empty'); - } - - URI.ensureValidHostname(v); - - if (!this._parts.hostname || this.is('IP')) { - this._parts.hostname = v; - } else { - var replace = new RegExp(escapeRegEx(this.domain()) + '$'); - this._parts.hostname = this._parts.hostname.replace(replace, v); - } - - this.build(!build); - return this; - } - }; - p.tld = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (typeof v === 'boolean') { - build = v; - v = undefined; - } - - // return "org" from "www.example.org" - if (v === undefined) { - if (!this._parts.hostname || this.is('IP')) { - return ''; - } - - var pos = this._parts.hostname.lastIndexOf('.'); - var tld = this._parts.hostname.substring(pos + 1); - - if (build !== true && SLD && SLD.list[tld.toLowerCase()]) { - return SLD.get(this._parts.hostname) || tld; - } - - return tld; - } else { - var replace; - - if (!v) { - throw new TypeError('cannot set TLD empty'); - } else if (v.match(/[^a-zA-Z0-9-]/)) { - if (SLD && SLD.is(v)) { - replace = new RegExp(escapeRegEx(this.tld()) + '$'); - this._parts.hostname = this._parts.hostname.replace(replace, v); - } else { - throw new TypeError('TLD "' + v + '" contains characters other than [A-Z0-9]'); - } - } else if (!this._parts.hostname || this.is('IP')) { - throw new ReferenceError('cannot set TLD on non-domain host'); - } else { - replace = new RegExp(escapeRegEx(this.tld()) + '$'); - this._parts.hostname = this._parts.hostname.replace(replace, v); - } - - this.build(!build); - return this; - } - }; - p.directory = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (v === undefined || v === true) { - if (!this._parts.path && !this._parts.hostname) { - return ''; - } - - if (this._parts.path === '/') { - return '/'; - } - - var end = this._parts.path.length - this.filename().length - 1; - var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : ''); - - return v ? URI.decodePath(res) : res; - - } else { - var e = this._parts.path.length - this.filename().length; - var directory = this._parts.path.substring(0, e); - var replace = new RegExp('^' + escapeRegEx(directory)); - - // fully qualifier directories begin with a slash - if (!this.is('relative')) { - if (!v) { - v = '/'; - } - - if (v.charAt(0) !== '/') { - v = '/' + v; - } - } - - // directories always end with a slash - if (v && v.charAt(v.length - 1) !== '/') { - v += '/'; - } - - v = URI.recodePath(v); - this._parts.path = this._parts.path.replace(replace, v); - this.build(!build); - return this; - } - }; - p.filename = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (v === undefined || v === true) { - if (!this._parts.path || this._parts.path === '/') { - return ''; - } - - var pos = this._parts.path.lastIndexOf('/'); - var res = this._parts.path.substring(pos+1); - - return v ? URI.decodePathSegment(res) : res; - } else { - var mutatedDirectory = false; - - if (v.charAt(0) === '/') { - v = v.substring(1); - } - - if (v.match(/\.?\//)) { - mutatedDirectory = true; - } - - var replace = new RegExp(escapeRegEx(this.filename()) + '$'); - v = URI.recodePath(v); - this._parts.path = this._parts.path.replace(replace, v); - - if (mutatedDirectory) { - this.normalizePath(build); - } else { - this.build(!build); - } - - return this; - } - }; - p.suffix = function(v, build) { - if (this._parts.urn) { - return v === undefined ? '' : this; - } - - if (v === undefined || v === true) { - if (!this._parts.path || this._parts.path === '/') { - return ''; - } - - var filename = this.filename(); - var pos = filename.lastIndexOf('.'); - var s, res; - - if (pos === -1) { - return ''; - } - - // suffix may only contain alnum characters (yup, I made this up.) - s = filename.substring(pos+1); - res = (/^[a-z0-9%]+$/i).test(s) ? s : ''; - return v ? URI.decodePathSegment(res) : res; - } else { - if (v.charAt(0) === '.') { - v = v.substring(1); - } - - var suffix = this.suffix(); - var replace; - - if (!suffix) { - if (!v) { - return this; - } - - this._parts.path += '.' + URI.recodePath(v); - } else if (!v) { - replace = new RegExp(escapeRegEx('.' + suffix) + '$'); - } else { - replace = new RegExp(escapeRegEx(suffix) + '$'); - } - - if (replace) { - v = URI.recodePath(v); - this._parts.path = this._parts.path.replace(replace, v); - } - - this.build(!build); - return this; - } - }; - p.segment = function(segment, v, build) { - var separator = this._parts.urn ? ':' : '/'; - var path = this.path(); - var absolute = path.substring(0, 1) === '/'; - var segments = path.split(separator); - - if (segment !== undefined && typeof segment !== 'number') { - build = v; - v = segment; - segment = undefined; - } - - if (segment !== undefined && typeof segment !== 'number') { - throw new Error('Bad segment "' + segment + '", must be 0-based integer'); - } - - if (absolute) { - segments.shift(); - } - - if (segment < 0) { - // allow negative indexes to address from the end - segment = Math.max(segments.length + segment, 0); - } - - if (v === undefined) { - /*jshint laxbreak: true */ - return segment === undefined - ? segments - : segments[segment]; - /*jshint laxbreak: false */ - } else if (segment === null || segments[segment] === undefined) { - if (isArray(v)) { - segments = []; - // collapse empty elements within array - for (var i=0, l=v.length; i < l; i++) { - if (!v[i].length && (!segments.length || !segments[segments.length -1].length)) { - continue; - } - - if (segments.length && !segments[segments.length -1].length) { - segments.pop(); - } - - segments.push(trimSlashes(v[i])); - } - } else if (v || typeof v === 'string') { - v = trimSlashes(v); - if (segments[segments.length -1] === '') { - // empty trailing elements have to be overwritten - // to prevent results such as /foo//bar - segments[segments.length -1] = v; - } else { - segments.push(v); - } - } - } else { - if (v) { - segments[segment] = trimSlashes(v); - } else { - segments.splice(segment, 1); - } - } - - if (absolute) { - segments.unshift(''); - } - - return this.path(segments.join(separator), build); - }; - p.segmentCoded = function(segment, v, build) { - var segments, i, l; - - if (typeof segment !== 'number') { - build = v; - v = segment; - segment = undefined; - } - - if (v === undefined) { - segments = this.segment(segment, v, build); - if (!isArray(segments)) { - segments = segments !== undefined ? URI.decode(segments) : undefined; - } else { - for (i = 0, l = segments.length; i < l; i++) { - segments[i] = URI.decode(segments[i]); - } - } - - return segments; - } - - if (!isArray(v)) { - v = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v; - } else { - for (i = 0, l = v.length; i < l; i++) { - v[i] = URI.encode(v[i]); - } - } - - return this.segment(segment, v, build); - }; - - // mutating query string - var q = p.query; - p.query = function(v, build) { - if (v === true) { - return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); - } else if (typeof v === 'function') { - var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); - var result = v.call(this, data); - this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); - this.build(!build); - return this; - } else if (v !== undefined && typeof v !== 'string') { - this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); - this.build(!build); - return this; - } else { - return q.call(this, v, build); - } - }; - p.setQuery = function(name, value, build) { - var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); - - if (typeof name === 'string' || name instanceof String) { - data[name] = value !== undefined ? value : null; - } else if (typeof name === 'object') { - for (var key in name) { - if (hasOwn.call(name, key)) { - data[key] = name[key]; - } - } - } else { - throw new TypeError('URI.addQuery() accepts an object, string as the name parameter'); - } - - this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); - if (typeof name !== 'string') { - build = value; - } - - this.build(!build); - return this; - }; - p.addQuery = function(name, value, build) { - var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); - URI.addQuery(data, name, value === undefined ? null : value); - this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); - if (typeof name !== 'string') { - build = value; - } - - this.build(!build); - return this; - }; - p.removeQuery = function(name, value, build) { - var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); - URI.removeQuery(data, name, value); - this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); - if (typeof name !== 'string') { - build = value; - } - - this.build(!build); - return this; - }; - p.hasQuery = function(name, value, withinArray) { - var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); - return URI.hasQuery(data, name, value, withinArray); - }; - p.setSearch = p.setQuery; - p.addSearch = p.addQuery; - p.removeSearch = p.removeQuery; - p.hasSearch = p.hasQuery; - - // sanitizing URLs - p.normalize = function() { - if (this._parts.urn) { - return this - .normalizeProtocol(false) - .normalizePath(false) - .normalizeQuery(false) - .normalizeFragment(false) - .build(); - } - - return this - .normalizeProtocol(false) - .normalizeHostname(false) - .normalizePort(false) - .normalizePath(false) - .normalizeQuery(false) - .normalizeFragment(false) - .build(); - }; - p.normalizeProtocol = function(build) { - if (typeof this._parts.protocol === 'string') { - this._parts.protocol = this._parts.protocol.toLowerCase(); - this.build(!build); - } - - return this; - }; - p.normalizeHostname = function(build) { - if (this._parts.hostname) { - if (this.is('IDN') && punycode) { - this._parts.hostname = punycode.toASCII(this._parts.hostname); - } else if (this.is('IPv6') && IPv6) { - this._parts.hostname = IPv6.best(this._parts.hostname); - } - - this._parts.hostname = this._parts.hostname.toLowerCase(); - this.build(!build); - } - - return this; - }; - p.normalizePort = function(build) { - // remove port of it's the protocol's default - if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) { - this._parts.port = null; - this.build(!build); - } - - return this; - }; - p.normalizePath = function(build) { - var _path = this._parts.path; - if (!_path) { - return this; - } - - if (this._parts.urn) { - this._parts.path = URI.recodeUrnPath(this._parts.path); - this.build(!build); - return this; - } - - if (this._parts.path === '/') { - return this; - } - - _path = URI.recodePath(_path); - - var _was_relative; - var _leadingParents = ''; - var _parent, _pos; - - // handle relative paths - if (_path.charAt(0) !== '/') { - _was_relative = true; - _path = '/' + _path; - } - - // handle relative files (as opposed to directories) - if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') { - _path += '/'; - } - - // resolve simples - _path = _path - .replace(/(\/(\.\/)+)|(\/\.$)/g, '/') - .replace(/\/{2,}/g, '/'); - - // remember leading parents - if (_was_relative) { - _leadingParents = _path.substring(1).match(/^(\.\.\/)+/) || ''; - if (_leadingParents) { - _leadingParents = _leadingParents[0]; - } - } - - // resolve parents - while (true) { - _parent = _path.search(/\/\.\.(\/|$)/); - if (_parent === -1) { - // no more ../ to resolve - break; - } else if (_parent === 0) { - // top level cannot be relative, skip it - _path = _path.substring(3); - continue; - } - - _pos = _path.substring(0, _parent).lastIndexOf('/'); - if (_pos === -1) { - _pos = _parent; - } - _path = _path.substring(0, _pos) + _path.substring(_parent + 3); - } - - // revert to relative - if (_was_relative && this.is('relative')) { - _path = _leadingParents + _path.substring(1); - } - - this._parts.path = _path; - this.build(!build); - return this; - }; - p.normalizePathname = p.normalizePath; - p.normalizeQuery = function(build) { - if (typeof this._parts.query === 'string') { - if (!this._parts.query.length) { - this._parts.query = null; - } else { - this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace)); - } - - this.build(!build); - } - - return this; - }; - p.normalizeFragment = function(build) { - if (!this._parts.fragment) { - this._parts.fragment = null; - this.build(!build); - } - - return this; - }; - p.normalizeSearch = p.normalizeQuery; - p.normalizeHash = p.normalizeFragment; - - p.iso8859 = function() { - // expect unicode input, iso8859 output - var e = URI.encode; - var d = URI.decode; - - URI.encode = escape; - URI.decode = decodeURIComponent; - try { - this.normalize(); - } finally { - URI.encode = e; - URI.decode = d; - } - return this; - }; - - p.unicode = function() { - // expect iso8859 input, unicode output - var e = URI.encode; - var d = URI.decode; - - URI.encode = strictEncodeURIComponent; - URI.decode = unescape; - try { - this.normalize(); - } finally { - URI.encode = e; - URI.decode = d; - } - return this; - }; - - p.readable = function() { - var uri = this.clone(); - // removing username, password, because they shouldn't be displayed according to RFC 3986 - uri.username('').password('').normalize(); - var t = ''; - if (uri._parts.protocol) { - t += uri._parts.protocol + '://'; - } - - if (uri._parts.hostname) { - if (uri.is('punycode') && punycode) { - t += punycode.toUnicode(uri._parts.hostname); - if (uri._parts.port) { - t += ':' + uri._parts.port; - } - } else { - t += uri.host(); - } - } - - if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') { - t += '/'; - } - - t += uri.path(true); - if (uri._parts.query) { - var q = ''; - for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) { - var kv = (qp[i] || '').split('='); - q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace) - .replace(/&/g, '%26'); - - if (kv[1] !== undefined) { - q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace) - .replace(/&/g, '%26'); - } - } - t += '?' + q.substring(1); - } - - t += URI.decodeQuery(uri.hash(), true); - return t; - }; - - // resolving relative and absolute URLs - p.absoluteTo = function(base) { - var resolved = this.clone(); - var properties = ['protocol', 'username', 'password', 'hostname', 'port']; - var basedir, i, p; - - if (this._parts.urn) { - throw new Error('URNs do not have any generally defined hierarchical components'); - } - - if (!(base instanceof URI)) { - base = new URI(base); - } - - if (!resolved._parts.protocol) { - resolved._parts.protocol = base._parts.protocol; - } - - if (this._parts.hostname) { - return resolved; - } - - for (i = 0; (p = properties[i]); i++) { - resolved._parts[p] = base._parts[p]; - } - - if (!resolved._parts.path) { - resolved._parts.path = base._parts.path; - if (!resolved._parts.query) { - resolved._parts.query = base._parts.query; - } - } else if (resolved._parts.path.substring(-2) === '..') { - resolved._parts.path += '/'; - } - - if (resolved.path().charAt(0) !== '/') { - basedir = base.directory(); - basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : ''; - resolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path; - resolved.normalizePath(); - } - - resolved.build(); - return resolved; - }; - p.relativeTo = function(base) { - var relative = this.clone().normalize(); - var relativeParts, baseParts, common, relativePath, basePath; - - if (relative._parts.urn) { - throw new Error('URNs do not have any generally defined hierarchical components'); - } - - base = new URI(base).normalize(); - relativeParts = relative._parts; - baseParts = base._parts; - relativePath = relative.path(); - basePath = base.path(); - - if (relativePath.charAt(0) !== '/') { - throw new Error('URI is already relative'); - } - - if (basePath.charAt(0) !== '/') { - throw new Error('Cannot calculate a URI relative to another relative URI'); - } - - if (relativeParts.protocol === baseParts.protocol) { - relativeParts.protocol = null; - } - - if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) { - return relative.build(); - } - - if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) { - return relative.build(); - } - - if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) { - relativeParts.hostname = null; - relativeParts.port = null; - } else { - return relative.build(); - } - - if (relativePath === basePath) { - relativeParts.path = ''; - return relative.build(); - } - - // determine common sub path - common = URI.commonPath(relativePath, basePath); - - // If the paths have nothing in common, return a relative URL with the absolute path. - if (!common) { - return relative.build(); - } - - var parents = baseParts.path - .substring(common.length) - .replace(/[^\/]*$/, '') - .replace(/.*?\//g, '../'); - - relativeParts.path = (parents + relativeParts.path.substring(common.length)) || './'; - - return relative.build(); - }; - - // comparing URIs - p.equals = function(uri) { - var one = this.clone(); - var two = new URI(uri); - var one_map = {}; - var two_map = {}; - var checked = {}; - var one_query, two_query, key; - - one.normalize(); - two.normalize(); - - // exact match - if (one.toString() === two.toString()) { - return true; - } - - // extract query string - one_query = one.query(); - two_query = two.query(); - one.query(''); - two.query(''); - - // definitely not equal if not even non-query parts match - if (one.toString() !== two.toString()) { - return false; - } - - // query parameters have the same length, even if they're permuted - if (one_query.length !== two_query.length) { - return false; - } - - one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace); - two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace); - - for (key in one_map) { - if (hasOwn.call(one_map, key)) { - if (!isArray(one_map[key])) { - if (one_map[key] !== two_map[key]) { - return false; - } - } else if (!arraysEqual(one_map[key], two_map[key])) { - return false; - } - - checked[key] = true; - } - } - - for (key in two_map) { - if (hasOwn.call(two_map, key)) { - if (!checked[key]) { - // two contains a parameter not present in one - return false; - } - } - } - - return true; - }; - - // state - p.duplicateQueryParameters = function(v) { - this._parts.duplicateQueryParameters = !!v; - return this; - }; - - p.escapeQuerySpace = function(v) { - this._parts.escapeQuerySpace = !!v; - return this; - }; - - return URI; -})); - -},{"./IPv6":3,"./SecondLevelDomains":6,"./punycode":3}],8:[function(require,module,exports){ -var RSVP = require('rsvp'); -var URI = require('urijs'); -var core = require('./core'); -var Spine = require('./spine'); -var Locations = require('./locations'); -var Parser = require('./parser'); -var Navigation = require('./navigation'); -var Rendition = require('./rendition'); -var Unarchive = require('./unarchive'); -var request = require('./request'); -var EpubCFI = require('./epubcfi'); - -function Book(_url, options){ - - this.settings = core.extend(this.settings || {}, { - requestMethod: this.requestMethod - }); - - core.extend(this.settings, options); - - - // Promises - this.opening = new RSVP.defer(); - this.opened = this.opening.promise; - this.isOpen = false; - - this.url = undefined; - - this.loading = { - manifest: new RSVP.defer(), - spine: new RSVP.defer(), - metadata: new RSVP.defer(), - cover: new RSVP.defer(), - navigation: new RSVP.defer(), - pageList: new RSVP.defer() - }; - - this.loaded = { - manifest: this.loading.manifest.promise, - spine: this.loading.spine.promise, - metadata: this.loading.metadata.promise, - cover: this.loading.cover.promise, - navigation: this.loading.navigation.promise, - pageList: this.loading.pageList.promise - }; - - this.ready = RSVP.hash(this.loaded); - - // Queue for methods used before opening - this.isRendered = false; - // this._q = core.queue(this); - - this.request = this.settings.requestMethod.bind(this); - - this.spine = new Spine(this.request); - this.locations = new Locations(this.spine, this.request); - - if(_url) { - this.open(_url).catch(function (error) { - var err = new Error("Cannot load book at "+ _url ); - console.error(err); - - this.trigger("loadFailed", error); - }.bind(this)); - } -}; - -Book.prototype.open = function(_url, options){ - var uri; - var parse = new Parser(); - var epubPackage; - var epubContainer; - var book = this; - var containerPath = "META-INF/container.xml"; - var location; - var absoluteUri; - var isArrayBuffer = false; - var isBase64 = options && options.base64; - - if(!_url) { - this.opening.resolve(this); - return this.opened; - } - - // Reuse parsed url or create a new uri object - // if(typeof(_url) === "object") { - // uri = _url; - // } else { - // uri = core.uri(_url); - // } - if (_url instanceof ArrayBuffer || isBase64) { - isArrayBuffer = true; - this.url = '/'; - } else { - uri = URI(_url); - } - - if (window && window.location && uri) { - absoluteUri = uri.absoluteTo(window.location.href); - this.url = absoluteUri.toString(); - } else if (window && window.location) { - this.url = window.location.href; - } else { - this.url = _url; - } - - // Find path to the Container - if(uri && uri.suffix() === "opf") { - // Direct link to package, no container - this.packageUrl = _url; - this.containerUrl = ''; - - if(uri.origin()) { - this.baseUrl = uri.origin() + "/" + uri.directory() + "/"; - } else if(absoluteUri){ - this.baseUrl = absoluteUri.origin(); - this.baseUrl += absoluteUri.directory() + "/"; - } else { - this.baseUrl = uri.directory() + "/"; - } - - epubPackage = this.request(this.packageUrl) - .catch(function(error) { - book.opening.reject(error); - }); - - } else if(isArrayBuffer || isBase64 || this.isArchivedUrl(uri)) { - // Book is archived - this.url = '/'; - this.containerUrl = URI(containerPath).absoluteTo(this.url).toString(); - - epubContainer = this.unarchive(_url, isBase64). - then(function() { - return this.request(this.containerUrl); - }.bind(this)) - .catch(function(error) { - book.opening.reject(error); - }); - } - // Find the path to the Package from the container - else if (!uri.suffix()) { - - this.containerUrl = this.url + containerPath; - - epubContainer = this.request(this.containerUrl) - .catch(function(error) { - // handle errors in loading container - book.opening.reject(error); - }); - } - - if (epubContainer) { - epubPackage = epubContainer. - then(function(containerXml){ - return parse.container(containerXml); // Container has path to content - }). - then(function(paths){ - var packageUri = URI(paths.packagePath); - var absPackageUri = packageUri.absoluteTo(book.url); - var absWindowUri; - - book.packageUrl = absPackageUri.toString(); - book.encoding = paths.encoding; - - // Set Url relative to the content - if(absPackageUri.origin()) { - book.baseUrl = absPackageUri.origin() + absPackageUri.directory() + "/"; - } else { - if(packageUri.directory()) { - book.baseUrl = "/" + packageUri.directory() + "/"; - } else { - book.baseUrl = "/" - } - } - - return book.request(book.packageUrl); - }).catch(function(error) { - // handle errors in either of the two requests - book.opening.reject(error); - }); - } - - epubPackage.then(function(packageXml) { - - if (!packageXml) { - return; - } - - // Get package information from epub opf - book.unpack(packageXml); - - // Resolve promises - book.loading.manifest.resolve(book.package.manifest); - book.loading.metadata.resolve(book.package.metadata); - book.loading.spine.resolve(book.spine); - book.loading.cover.resolve(book.cover); - - book.isOpen = true; - - // Clear queue of any waiting book request - - // Resolve book opened promise - book.opening.resolve(book); - - }).catch(function(error) { - // handle errors in parsing the book - // console.error(error.message, error.stack); - book.opening.reject(error); - }); - - return this.opened; -}; - -Book.prototype.unpack = function(packageXml){ - var book = this, - parse = new Parser(); - - book.package = parse.packageContents(packageXml); // Extract info from contents - if(!book.package) { - return; - } - - book.package.baseUrl = book.baseUrl; // Provides a url base for resolving paths - - this.spine.load(book.package); - - book.navigation = new Navigation(book.package, this.request); - book.navigation.load().then(function(toc){ - book.toc = toc; - book.loading.navigation.resolve(book.toc); - }); - - // //-- Set Global Layout setting based on metadata - // MOVE TO RENDER - // book.globalLayoutProperties = book.parseLayoutProperties(book.package.metadata); - - book.cover = URI(book.package.coverPath).absoluteTo(book.baseUrl).toString(); -}; - -// Alias for book.spine.get -Book.prototype.section = function(target) { - return this.spine.get(target); -}; - -// Sugar to render a book -Book.prototype.renderTo = function(element, options) { - // var renderMethod = (options && options.method) ? - // options.method : - // "single"; - - this.rendition = new Rendition(this, options); - this.rendition.attachTo(element); - - return this.rendition; -}; - -Book.prototype.requestMethod = function(_url) { - // Switch request methods - if(this.unarchived) { - return this.unarchived.request(_url); - } else { - return request(_url, null, this.requestCredentials, this.requestHeaders); - } - -}; - -Book.prototype.setRequestCredentials = function(_credentials) { - this.requestCredentials = _credentials; -}; - -Book.prototype.setRequestHeaders = function(_headers) { - this.requestHeaders = _headers; -}; - -Book.prototype.unarchive = function(bookUrl, isBase64){ - this.unarchived = new Unarchive(); - return this.unarchived.open(bookUrl, isBase64); -}; - -//-- Checks if url has a .epub or .zip extension, or is ArrayBuffer (of zip/epub) -Book.prototype.isArchivedUrl = function(bookUrl){ - var uri; - var extension; - - if (bookUrl instanceof ArrayBuffer) { - return true; - } - - // Reuse parsed url or create a new uri object - // if(typeof(bookUrl) === "object") { - // uri = bookUrl; - // } else { - // uri = core.uri(bookUrl); - // } - uri = URI(bookUrl); - extension = uri.suffix(); - - if(extension && (extension == "epub" || extension == "zip")){ - return true; - } - - return false; -}; - -//-- Returns the cover -Book.prototype.coverUrl = function(){ - var retrieved = this.loaded.cover. - then(function(url) { - if(this.unarchived) { - return this.unarchived.createUrl(this.cover); - }else{ - return this.cover; - } - }.bind(this)); - - - - return retrieved; -}; - -Book.prototype.range = function(cfiRange) { - var cfi = new EpubCFI(cfiRange); - var item = this.spine.get(cfi.spinePos); - - return item.load().then(function (contents) { - var range = cfi.toRange(item.document); - return range; - }) -}; - -module.exports = Book; - -//-- Enable binding events to book -RSVP.EventTarget.mixin(Book.prototype); - -//-- Handle RSVP Errors -RSVP.on('error', function(event) { - console.error(event); -}); - -RSVP.configure('instrument', false); //-- true | will logging out all RSVP rejections -// RSVP.on('created', listener); -// RSVP.on('chained', listener); -// RSVP.on('fulfilled', listener); -RSVP.on('rejected', function(event){ - console.error(event.detail.message, event.detail.stack); -}); - -},{"./core":10,"./epubcfi":11,"./locations":14,"./navigation":21,"./parser":22,"./rendition":24,"./request":26,"./spine":28,"./unarchive":29,"rsvp":5,"urijs":7}],9:[function(require,module,exports){ -var RSVP = require('rsvp'); -var core = require('./core'); -var EpubCFI = require('./epubcfi'); -var Mapping = require('./mapping'); - - -function Contents(doc, content, cfiBase) { - // Blank Cfi for Parsing - this.epubcfi = new EpubCFI(); - - this.document = doc; - this.documentElement = this.document.documentElement; - this.content = content || this.document.body; - this.window = this.document.defaultView; - // Dom events to listen for - this.listenedEvents = ["keydown", "keyup", "keypressed", "mouseup", "mousedown", "click", "touchend", "touchstart"]; - - this._size = { - width: 0, - height: 0 - } - - this.cfiBase = cfiBase || ""; - - this.listeners(); -}; - -Contents.prototype.width = function(w) { - // var frame = this.documentElement; - var frame = this.content; - - if (w && core.isNumber(w)) { - w = w + "px"; - } - - if (w) { - frame.style.width = w; - // this.content.style.width = w; - } - - return this.window.getComputedStyle(frame)['width']; - - -}; - -Contents.prototype.height = function(h) { - // var frame = this.documentElement; - var frame = this.content; - - if (h && core.isNumber(h)) { - h = h + "px"; - } - - if (h) { - frame.style.height = h; - // this.content.style.height = h; - } - - return this.window.getComputedStyle(frame)['height']; - -}; - -Contents.prototype.contentWidth = function(w) { - - var content = this.content || this.document.body; - - if (w && core.isNumber(w)) { - w = w + "px"; - } - - if (w) { - content.style.width = w; - } - - return this.window.getComputedStyle(content)['width']; - - -}; - -Contents.prototype.contentHeight = function(h) { - - var content = this.content || this.document.body; - - if (h && core.isNumber(h)) { - h = h + "px"; - } - - if (h) { - content.style.height = h; - } - - return this.window.getComputedStyle(content)['height']; - -}; - -Contents.prototype.textWidth = function() { - var width; - var range = this.document.createRange(); - var content = this.content || this.document.body; - - // Select the contents of frame - range.selectNodeContents(content); - - // get the width of the text content - width = range.getBoundingClientRect().width; - - return width; - -}; - -Contents.prototype.textHeight = function() { - var height; - var range = this.document.createRange(); - var content = this.content || this.document.body; - - range.selectNodeContents(content); - - height = range.getBoundingClientRect().height; - - return height; -}; - -Contents.prototype.scrollWidth = function() { - var width = this.documentElement.scrollWidth; - - return width; -}; - -Contents.prototype.scrollHeight = function() { - var height = this.documentElement.scrollHeight; - - return height; -}; - -Contents.prototype.overflow = function(overflow) { - - if (overflow) { - this.documentElement.style.overflow = overflow; - } - - return this.window.getComputedStyle(this.documentElement)['overflow']; -}; - -Contents.prototype.overflowX = function(overflow) { - - if (overflow) { - this.documentElement.style.overflowX = overflow; - } - - return this.window.getComputedStyle(this.documentElement)['overflowX']; -}; - -Contents.prototype.overflowY = function(overflow) { - - if (overflow) { - this.documentElement.style.overflowY = overflow; - } - - return this.window.getComputedStyle(this.documentElement)['overflowY']; -}; - -Contents.prototype.css = function(property, value) { - var content = this.content || this.document.body; - - if (value) { - content.style[property] = value; - } - - return this.window.getComputedStyle(content)[property]; -}; - -Contents.prototype.viewport = function(options) { - var width, height, scale, scalable; - var $viewport = this.document.querySelector("meta[name='viewport']"); - var newContent = ''; - - /** - * check for the viewport size - * - */ - if($viewport && $viewport.hasAttribute("content")) { - content = $viewport.getAttribute("content"); - contents = content.split(/\s*,\s*/); - if(contents[0]){ - width = contents[0].replace("width=", '').trim(); - } - if(contents[1]){ - height = contents[1].replace("height=", '').trim(); - } - if(contents[2]){ - scale = contents[2].replace("initial-scale=", '').trim(); - } - if(contents[3]){ - scalable = contents[3].replace("user-scalable=", '').trim(); - } - } - - if (options) { - - newContent += "width=" + (options.width || width); - newContent += ", height=" + (options.height || height); - if (options.scale || scale) { - newContent += ", initial-scale=" + (options.scale || scale); - } - if (options.scalable || scalable) { - newContent += ", user-scalable=" + (options.scalable || scalable); - } - - if (!$viewport) { - $viewport = this.document.createElement("meta"); - $viewport.setAttribute("name", "viewport"); - this.document.querySelector('head').appendChild($viewport); - } - - $viewport.setAttribute("content", newContent); - } - - - return { - width: parseInt(width), - height: parseInt(height) - }; -}; - - -// Contents.prototype.layout = function(layoutFunc) { -// -// this.iframe.style.display = "inline-block"; -// -// // Reset Body Styles -// this.content.style.margin = "0"; -// //this.document.body.style.display = "inline-block"; -// //this.document.documentElement.style.width = "auto"; -// -// if(layoutFunc){ -// layoutFunc(this); -// } -// -// this.onLayout(this); -// -// }; -// -// Contents.prototype.onLayout = function(view) { -// // stub -// }; - -Contents.prototype.expand = function() { - this.trigger("expand"); -}; - -Contents.prototype.listeners = function() { - - this.imageLoadListeners(); - - this.mediaQueryListeners(); - - // this.fontLoadListeners(); - - this.addEventListeners(); - - this.addSelectionListeners(); - - this.resizeListeners(); - -}; - -Contents.prototype.removeListeners = function() { - - this.removeEventListeners(); - - this.removeSelectionListeners(); -}; - -Contents.prototype.resizeListeners = function() { - var width, height; - // Test size again - clearTimeout(this.expanding); - - width = this.scrollWidth(); - height = this.scrollHeight(); - - if (width != this._size.width || height != this._size.height) { - - this._size = { - width: width, - height: height - } - - this.trigger("resize", this._size); - } - - this.expanding = setTimeout(this.resizeListeners.bind(this), 350); -}; - -//https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js -Contents.prototype.mediaQueryListeners = function() { - var sheets = this.document.styleSheets; - var mediaChangeHandler = function(m){ - if(m.matches && !this._expanding) { - setTimeout(this.expand.bind(this), 1); - // this.expand(); - } - }.bind(this); - - for (var i = 0; i < sheets.length; i += 1) { - var rules = sheets[i].cssRules; - if(!rules) return; // Stylesheets changed - for (var j = 0; j < rules.length; j += 1) { - //if (rules[j].constructor === CSSMediaRule) { - if(rules[j].media){ - var mql = this.window.matchMedia(rules[j].media.mediaText); - mql.addListener(mediaChangeHandler); - //mql.onchange = mediaChangeHandler; - } - } - } -}; - -Contents.prototype.observe = function(target) { - var renderer = this; - - // create an observer instance - var observer = new MutationObserver(function(mutations) { - if(renderer._expanding) { - renderer.expand(); - } - // mutations.forEach(function(mutation) { - // console.log(mutation); - // }); - }); - - // configuration of the observer: - var config = { attributes: true, childList: true, characterData: true, subtree: true }; - - // pass in the target node, as well as the observer options - observer.observe(target, config); - - return observer; -}; - -Contents.prototype.imageLoadListeners = function(target) { - var images = this.document.querySelectorAll("img"); - var img; - for (var i = 0; i < images.length; i++) { - img = images[i]; - - if (typeof img.naturalWidth !== "undefined" && - img.naturalWidth === 0) { - img.onload = this.expand.bind(this); - } - } -}; - -Contents.prototype.fontLoadListeners = function(target) { - if (!this.document || !this.document.fonts) { - return; - } - - this.document.fonts.ready.then(function () { - this.expand(); - }.bind(this)); - -}; - -Contents.prototype.root = function() { - if(!this.document) return null; - return this.document.documentElement; -}; - -Contents.prototype.locationOf = function(target, ignoreClass) { - var position; - var targetPos = {"left": 0, "top": 0}; - - if(!this.document) return; - - if(this.epubcfi.isCfiString(target)) { - range = new EpubCFI(target).toRange(this.document, ignoreClass); - - if(range) { - if (range.startContainer.nodeType === Node.ELEMENT_NODE) { - position = range.startContainer.getBoundingClientRect(); - targetPos.left = position.left; - targetPos.top = position.top; - } else { - position = range.getBoundingClientRect(); - targetPos.left = position.left; - targetPos.top = position.top; - } - } - - } else if(typeof target === "string" && - target.indexOf("#") > -1) { - - id = target.substring(target.indexOf("#")+1); - el = this.document.getElementById(id); - - if(el) { - position = el.getBoundingClientRect(); - targetPos.left = position.left; - targetPos.top = position.top; - } - } - - return targetPos; -}; - -Contents.prototype.addStylesheet = function(src) { - return new RSVP.Promise(function(resolve, reject){ - var $stylesheet; - var ready = false; - - if(!this.document) { - resolve(false); - return; - } - - $stylesheet = this.document.createElement('link'); - $stylesheet.type = 'text/css'; - $stylesheet.rel = "stylesheet"; - $stylesheet.href = src; - $stylesheet.onload = $stylesheet.onreadystatechange = function() { - if ( !ready && (!this.readyState || this.readyState == 'complete') ) { - ready = true; - // Let apply - setTimeout(function(){ - resolve(true); - }, 1); - } - }; - - this.document.head.appendChild($stylesheet); - - }.bind(this)); -}; - -// https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule -Contents.prototype.addStylesheetRules = function(rules) { - var styleEl; - var styleSheet; - - if(!this.document) return; - - styleEl = this.document.createElement('style'); - - // Append style element to head - this.document.head.appendChild(styleEl); - - // Grab style sheet - styleSheet = styleEl.sheet; - - for (var i = 0, rl = rules.length; i < rl; i++) { - var j = 1, rule = rules[i], selector = rules[i][0], propStr = ''; - // If the second argument of a rule is an array of arrays, correct our variables. - if (Object.prototype.toString.call(rule[1][0]) === '[object Array]') { - rule = rule[1]; - j = 0; - } - - for (var pl = rule.length; j < pl; j++) { - var prop = rule[j]; - propStr += prop[0] + ':' + prop[1] + (prop[2] ? ' !important' : '') + ';\n'; - } - - // Insert CSS Rule - styleSheet.insertRule(selector + '{' + propStr + '}', styleSheet.cssRules.length); - } -}; - -Contents.prototype.addScript = function(src) { - - return new RSVP.Promise(function(resolve, reject){ - var $script; - var ready = false; - - if(!this.document) { - resolve(false); - return; - } - - $script = this.document.createElement('script'); - $script.type = 'text/javascript'; - $script.async = true; - $script.src = src; - $script.onload = $script.onreadystatechange = function() { - if ( !ready && (!this.readyState || this.readyState == 'complete') ) { - ready = true; - setTimeout(function(){ - resolve(true); - }, 1); - } - }; - - this.document.head.appendChild($script); - - }.bind(this)); -}; - -Contents.prototype.addEventListeners = function(){ - if(!this.document) { - return; - } - this.listenedEvents.forEach(function(eventName){ - this.document.addEventListener(eventName, this.triggerEvent.bind(this), false); - }, this); - -}; - -Contents.prototype.removeEventListeners = function(){ - if(!this.document) { - return; - } - this.listenedEvents.forEach(function(eventName){ - this.document.removeEventListener(eventName, this.triggerEvent, false); - }, this); - -}; - -// Pass browser events -Contents.prototype.triggerEvent = function(e){ - this.trigger(e.type, e); -}; - -Contents.prototype.addSelectionListeners = function(){ - if(!this.document) { - return; - } - this.document.addEventListener("selectionchange", this.onSelectionChange.bind(this), false); -}; - -Contents.prototype.removeSelectionListeners = function(){ - if(!this.document) { - return; - } - this.document.removeEventListener("selectionchange", this.onSelectionChange, false); -}; - -Contents.prototype.onSelectionChange = function(e){ - if (this.selectionEndTimeout) { - clearTimeout(this.selectionEndTimeout); - } - this.selectionEndTimeout = setTimeout(function() { - var selection = this.window.getSelection(); - this.triggerSelectedEvent(selection); - }.bind(this), 500); -}; - -Contents.prototype.triggerSelectedEvent = function(selection){ - var range, cfirange; - - if (selection && selection.rangeCount > 0) { - range = selection.getRangeAt(0); - if(!range.collapsed) { - // cfirange = this.section.cfiFromRange(range); - cfirange = new EpubCFI(range, this.cfiBase).toString(); - this.trigger("selected", cfirange); - this.trigger("selectedRange", range); - } - } -}; - -Contents.prototype.range = function(_cfi, ignoreClass){ - var cfi = new EpubCFI(_cfi); - return cfi.toRange(this.document, ignoreClass); -}; - -Contents.prototype.map = function(layout){ - var map = new Mapping(layout); - return map.section(); -}; - -Contents.prototype.size = function(width, height){ - - if (width >= 0) { - this.width(width); - } - - if (height >= 0) { - this.height(height); - } - - this.css("margin", "0"); - this.css("boxSizing", "border-box"); - -}; - -Contents.prototype.columns = function(width, height, columnWidth, gap){ - var COLUMN_AXIS = core.prefixed('columnAxis'); - var COLUMN_GAP = core.prefixed('columnGap'); - var COLUMN_WIDTH = core.prefixed('columnWidth'); - var COLUMN_FILL = core.prefixed('columnFill'); - var textWidth; - - this.width(width); - this.height(height); - - // Deal with Mobile trying to scale to viewport - this.viewport({ width: width, height: height, scale: 1.0 }); - - // this.overflowY("hidden"); - this.css("overflowY", "hidden"); - this.css("margin", "0"); - this.css("boxSizing", "border-box"); - this.css("maxWidth", "inherit"); - - this.css(COLUMN_AXIS, "horizontal"); - this.css(COLUMN_FILL, "auto"); - - this.css(COLUMN_GAP, gap+"px"); - this.css(COLUMN_WIDTH, columnWidth+"px"); -}; - -Contents.prototype.scale = function(scale, offsetX, offsetY){ - var scale = "scale(" + scale + ")"; - var translate = ''; - // this.css("position", "absolute")); - this.css("transformOrigin", "top left"); - - if (offsetX >= 0 || offsetY >= 0) { - translate = " translate(" + (offsetX || 0 )+ "px, " + (offsetY || 0 )+ "px )"; - } - - this.css("transform", scale + translate); -}; - -Contents.prototype.fit = function(width, height){ - var viewport = this.viewport(); - var widthScale = width / viewport.width; - var heightScale = height / viewport.height; - var scale = widthScale < heightScale ? widthScale : heightScale; - - var offsetY = (height - (viewport.height * scale)) / 2; - - this.width(width); - this.height(height); - this.overflow("hidden"); - - // Deal with Mobile trying to scale to viewport - this.viewport({ scale: 1.0 }); - - // Scale to the correct size - this.scale(scale, 0, offsetY); - - this.css("backgroundColor", "transparent"); -}; - -Contents.prototype.mapPage = function(cfiBase, start, end) { - var mapping = new Mapping(); - - return mapping.page(this, cfiBase, start, end); -}; - -Contents.prototype.destroy = function() { - // Stop observing - if(this.observer) { - this.observer.disconnect(); - } - - this.removeListeners(); - -}; - -RSVP.EventTarget.mixin(Contents.prototype); - -module.exports = Contents; - -},{"./core":10,"./epubcfi":11,"./mapping":20,"rsvp":5}],10:[function(require,module,exports){ -var RSVP = require('rsvp'); -var base64 = require('base64-js'); - -var requestAnimationFrame = (typeof window != 'undefined') ? (window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame) : false; -/* -//-- Parse the different parts of a url, returning a object -function uri(url){ - var uri = { - protocol : '', - host : '', - path : '', - origin : '', - directory : '', - base : '', - filename : '', - extension : '', - fragment : '', - href : url - }, - doubleSlash = url.indexOf('://'), - search = url.indexOf('?'), - fragment = url.indexOf("#"), - withoutProtocol, - dot, - firstSlash; - - if(fragment != -1) { - uri.fragment = url.slice(fragment + 1); - url = url.slice(0, fragment); - } - - if(search != -1) { - uri.search = url.slice(search + 1); - url = url.slice(0, search); - href = url; - } - - if(doubleSlash != -1) { - uri.protocol = url.slice(0, doubleSlash); - withoutProtocol = url.slice(doubleSlash+3); - firstSlash = withoutProtocol.indexOf('/'); - - if(firstSlash === -1) { - uri.host = uri.path; - uri.path = ""; - } else { - uri.host = withoutProtocol.slice(0, firstSlash); - uri.path = withoutProtocol.slice(firstSlash); - } - - - uri.origin = uri.protocol + "://" + uri.host; - - uri.directory = folder(uri.path); - - uri.base = uri.origin + uri.directory; - // return origin; - } else { - uri.path = url; - uri.directory = folder(url); - uri.base = uri.directory; - } - - //-- Filename - uri.filename = url.replace(uri.base, ''); - dot = uri.filename.lastIndexOf('.'); - if(dot != -1) { - uri.extension = uri.filename.slice(dot+1); - } - return uri; -}; - -//-- Parse out the folder, will return everything before the last slash -function folder(url){ - - var lastSlash = url.lastIndexOf('/'); - - if(lastSlash == -1) var folder = ''; - - folder = url.slice(0, lastSlash + 1); - - return folder; - -}; -*/ -function isElement(obj) { - return !!(obj && obj.nodeType == 1); -}; - -// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript -function uuid() { - var d = new Date().getTime(); - var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (d + Math.random()*16)%16 | 0; - d = Math.floor(d/16); - return (c=='x' ? r : (r&0x7|0x8)).toString(16); - }); - return uuid; -}; - -// From Lodash -function values(object) { - var index = -1, - props = Object.keys(object), - length = props.length, - result = Array(length); - - while (++index < length) { - result[index] = object[props[index]]; - } - return result; -}; - -function resolveUrl(base, path) { - var url = [], - segments = [], - baseUri = uri(base), - pathUri = uri(path), - baseDirectory = baseUri.directory, - pathDirectory = pathUri.directory, - directories = [], - // folders = base.split("/"), - paths; - - // if(uri.host) { - // return path; - // } - - if(baseDirectory[0] === "/") { - baseDirectory = baseDirectory.substring(1); - } - - if(pathDirectory[pathDirectory.length-1] === "/") { - baseDirectory = baseDirectory.substring(0, baseDirectory.length-1); - } - - if(pathDirectory[0] === "/") { - pathDirectory = pathDirectory.substring(1); - } - - if(pathDirectory[pathDirectory.length-1] === "/") { - pathDirectory = pathDirectory.substring(0, pathDirectory.length-1); - } - - if(baseDirectory) { - directories = baseDirectory.split("/"); - } - - paths = pathDirectory.split("/"); - - paths.reverse().forEach(function(part, index){ - if(part === ".."){ - directories.pop(); - } else if(part === directories[directories.length-1]) { - directories.pop(); - segments.unshift(part); - } else { - segments.unshift(part); - } - }); - - url = [baseUri.origin]; - - if(directories.length) { - url = url.concat(directories); - } - - if(segments) { - url = url.concat(segments); - } - - url = url.concat(pathUri.filename); - - return url.join("/"); -}; - -function documentHeight() { - return Math.max( - document.documentElement.clientHeight, - document.body.scrollHeight, - document.documentElement.scrollHeight, - document.body.offsetHeight, - document.documentElement.offsetHeight - ); -}; - -function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -}; - -function prefixed(unprefixed) { - var vendors = ["Webkit", "Moz", "O", "ms" ], - prefixes = ['-Webkit-', '-moz-', '-o-', '-ms-'], - upper = unprefixed[0].toUpperCase() + unprefixed.slice(1), - length = vendors.length; - - if (typeof(document) === 'undefined' || typeof(document.body.style[unprefixed]) != 'undefined') { - return unprefixed; - } - - for ( var i=0; i < length; i++ ) { - if (typeof(document.body.style[vendors[i] + upper]) != 'undefined') { - return vendors[i] + upper; - } - } - - return unprefixed; -}; - -function defaults(obj) { - for (var i = 1, length = arguments.length; i < length; i++) { - var source = arguments[i]; - for (var prop in source) { - if (obj[prop] === void 0) obj[prop] = source[prop]; - } - } - return obj; -}; - -function extend(target) { - var sources = [].slice.call(arguments, 1); - sources.forEach(function (source) { - if(!source) return; - Object.getOwnPropertyNames(source).forEach(function(propName) { - Object.defineProperty(target, propName, Object.getOwnPropertyDescriptor(source, propName)); - }); - }); - return target; -}; - -// Fast quicksort insert for sorted array -- based on: -// http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers -function insert(item, array, compareFunction) { - var location = locationOf(item, array, compareFunction); - array.splice(location, 0, item); - - return location; -}; -// Returns where something would fit in -function locationOf(item, array, compareFunction, _start, _end) { - var start = _start || 0; - var end = _end || array.length; - var pivot = parseInt(start + (end - start) / 2); - var compared; - if(!compareFunction){ - compareFunction = function(a, b) { - if(a > b) return 1; - if(a < b) return -1; - if(a = b) return 0; - }; - } - if(end-start <= 0) { - return pivot; - } - - compared = compareFunction(array[pivot], item); - if(end-start === 1) { - return compared > 0 ? pivot : pivot + 1; - } - - if(compared === 0) { - return pivot; - } - if(compared === -1) { - return locationOf(item, array, compareFunction, pivot, end); - } else{ - return locationOf(item, array, compareFunction, start, pivot); - } -}; -// Returns -1 of mpt found -function indexOfSorted(item, array, compareFunction, _start, _end) { - var start = _start || 0; - var end = _end || array.length; - var pivot = parseInt(start + (end - start) / 2); - var compared; - if(!compareFunction){ - compareFunction = function(a, b) { - if(a > b) return 1; - if(a < b) return -1; - if(a = b) return 0; - }; - } - if(end-start <= 0) { - return -1; // Not found - } - - compared = compareFunction(array[pivot], item); - if(end-start === 1) { - return compared === 0 ? pivot : -1; - } - if(compared === 0) { - return pivot; // Found - } - if(compared === -1) { - return indexOfSorted(item, array, compareFunction, pivot, end); - } else{ - return indexOfSorted(item, array, compareFunction, start, pivot); - } -}; - -function bounds(el) { - - var style = window.getComputedStyle(el); - var widthProps = ["width", "paddingRight", "paddingLeft", "marginRight", "marginLeft", "borderRightWidth", "borderLeftWidth"]; - var heightProps = ["height", "paddingTop", "paddingBottom", "marginTop", "marginBottom", "borderTopWidth", "borderBottomWidth"]; - - var width = 0; - var height = 0; - - widthProps.forEach(function(prop){ - width += parseFloat(style[prop]) || 0; - }); - - heightProps.forEach(function(prop){ - height += parseFloat(style[prop]) || 0; - }); - - return { - height: height, - width: width - }; - -}; - -function borders(el) { - - var style = window.getComputedStyle(el); - var widthProps = ["paddingRight", "paddingLeft", "marginRight", "marginLeft", "borderRightWidth", "borderLeftWidth"]; - var heightProps = ["paddingTop", "paddingBottom", "marginTop", "marginBottom", "borderTopWidth", "borderBottomWidth"]; - - var width = 0; - var height = 0; - - widthProps.forEach(function(prop){ - width += parseFloat(style[prop]) || 0; - }); - - heightProps.forEach(function(prop){ - height += parseFloat(style[prop]) || 0; - }); - - return { - height: height, - width: width - }; - -}; - -function windowBounds() { - - var width = window.innerWidth; - var height = window.innerHeight; - - return { - top: 0, - left: 0, - right: width, - bottom: height, - width: width, - height: height - }; - -}; - -//https://stackoverflow.com/questions/13482352/xquery-looking-for-text-with-single-quote/13483496#13483496 -function cleanStringForXpath(str) { - var parts = str.match(/[^'"]+|['"]/g); - parts = parts.map(function(part){ - if (part === "'") { - return '\"\'\"'; // output "'" - } - - if (part === '"') { - return "\'\"\'"; // output '"' - } - return "\'" + part + "\'"; - }); - return "concat(\'\'," + parts.join(",") + ")"; -}; - -function indexOfTextNode(textNode){ - var parent = textNode.parentNode; - var children = parent.childNodes; - var sib; - var index = -1; - for (var i = 0; i < children.length; i++) { - sib = children[i]; - if(sib.nodeType === Node.TEXT_NODE){ - index++; - } - if(sib == textNode) break; - } - - return index; -}; - -function isXml(ext) { - return ['xml', 'opf', 'ncx'].indexOf(ext) > -1; -} - -function createBlob(content, mime){ - var blob = new Blob([content], {type : mime }); - - return blob; -}; - -function createBlobUrl(content, mime){ - var _URL = window.URL || window.webkitURL || window.mozURL; - var tempUrl; - var blob = this.createBlob(content, mime); - - tempUrl = _URL.createObjectURL(blob); - - return tempUrl; -}; - -function createBase64Url(content, mime){ - var string; - var data; - var datauri; - - if (typeof(content) !== "string") { - // Only handles strings - return; - } - - data = btoa(content); - - datauri = "data:" + mime + ";base64," + data; - - return datauri; -}; - -function type(obj){ - return Object.prototype.toString.call(obj).slice(8, -1); -} - -function parse(markup, mime) { - var doc; - // console.log("parse", markup); - - if (typeof DOMParser === "undefined") { - DOMParser = require('xmldom').DOMParser; - } - - - doc = new DOMParser().parseFromString(markup, mime); - - return doc; -} - -function qs(el, sel) { - var elements; - - if (typeof el.querySelector != "undefined") { - return el.querySelector(sel); - } else { - elements = el.getElementsByTagName(sel); - if (elements.length) { - return elements[0]; - } - } -} - -function qsa(el, sel) { - - if (typeof el.querySelector != "undefined") { - return el.querySelectorAll(sel); - } else { - return el.getElementsByTagName(sel); - } -} - -function qsp(el, sel, props) { - var q, filtered; - if (typeof el.querySelector != "undefined") { - sel += '['; - for (var prop in props) { - sel += prop + "='" + props[prop] + "'"; - } - sel += ']'; - return el.querySelector(sel); - } else { - q = el.getElementsByTagName(sel); - filtered = Array.prototype.slice.call(q, 0).filter(function(el) { - for (var prop in props) { - if(el.getAttribute(prop) === props[prop]){ - return true; - } - } - return false; - }); - - if (filtered) { - return filtered[0]; - } - } -} - -function blob2base64(blob, cb) { - var reader = new FileReader(); - reader.readAsDataURL(blob); - reader.onloadend = function() { - cb(reader.result); - } -} - -module.exports = { - // 'uri': uri, - // 'folder': folder, - 'isElement': isElement, - 'uuid': uuid, - 'values': values, - 'resolveUrl': resolveUrl, - 'indexOfSorted': indexOfSorted, - 'documentHeight': documentHeight, - 'isNumber': isNumber, - 'prefixed': prefixed, - 'defaults': defaults, - 'extend': extend, - 'insert': insert, - 'locationOf': locationOf, - 'indexOfSorted': indexOfSorted, - 'requestAnimationFrame': requestAnimationFrame, - 'bounds': bounds, - 'borders': borders, - 'windowBounds': windowBounds, - 'cleanStringForXpath': cleanStringForXpath, - 'indexOfTextNode': indexOfTextNode, - 'isXml': isXml, - 'createBlob': createBlob, - 'createBlobUrl': createBlobUrl, - 'type': type, - 'parse' : parse, - 'qs' : qs, - 'qsa' : qsa, - 'qsp' : qsp, - 'blob2base64' : blob2base64, - 'createBase64Url': createBase64Url -}; - -},{"base64-js":2,"rsvp":5,"xmldom":"xmldom"}],11:[function(require,module,exports){ -var URI = require('urijs'); -var core = require('./core'); - -/** - EPUB CFI spec: http://www.idpf.org/epub/linking/cfi/epub-cfi.html - - Implements: - - Character Offset: epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3) - - Simple Ranges : epubcfi(/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4) - - Does Not Implement: - - Temporal Offset (~) - - Spatial Offset (@) - - Temporal-Spatial Offset (~ + @) - - Text Location Assertion ([) -*/ - -function EpubCFI(cfiFrom, base, ignoreClass){ - var type; - - this.str = ''; - - this.base = {}; - this.spinePos = 0; // For compatibility - - this.range = false; // true || false; - - this.path = {}; - this.start = null; - this.end = null; - - // Allow instantiation without the 'new' keyword - if (!(this instanceof EpubCFI)) { - return new EpubCFI(cfiFrom, base, ignoreClass); - } - - if(typeof base === 'string') { - this.base = this.parseComponent(base); - } else if(typeof base === 'object' && base.steps) { - this.base = base; - } - - type = this.checkType(cfiFrom); - - - if(type === 'string') { - this.str = cfiFrom; - return core.extend(this, this.parse(cfiFrom)); - } else if (type === 'range') { - return core.extend(this, this.fromRange(cfiFrom, this.base, ignoreClass)); - } else if (type === 'node') { - return core.extend(this, this.fromNode(cfiFrom, this.base, ignoreClass)); - } else if (type === 'EpubCFI' && cfiFrom.path) { - return cfiFrom; - } else if (!cfiFrom) { - return this; - } else { - throw new TypeError('not a valid argument for EpubCFI'); - } - -}; - -EpubCFI.prototype.checkType = function(cfi) { - - if (this.isCfiString(cfi)) { - return 'string'; - // Is a range object - } else if (typeof cfi === 'object' && core.type(cfi) === "Range"){ - return 'range'; - } else if (typeof cfi === 'object' && typeof(cfi.nodeType) != "undefined" ){ // || typeof cfi === 'function' - return 'node'; - } else if (typeof cfi === 'object' && cfi instanceof EpubCFI){ - return 'EpubCFI'; - } else { - return false; - } -}; - -EpubCFI.prototype.parse = function(cfiStr) { - var cfi = { - spinePos: -1, - range: false, - base: {}, - path: {}, - start: null, - end: null - }; - var baseComponent, pathComponent, range; - - if(typeof cfiStr !== "string") { - return {spinePos: -1}; - } - - if(cfiStr.indexOf("epubcfi(") === 0 && cfiStr[cfiStr.length-1] === ")") { - // Remove intial epubcfi( and ending ) - cfiStr = cfiStr.slice(8, cfiStr.length-1); - } - - baseComponent = this.getChapterComponent(cfiStr); - - // Make sure this is a valid cfi or return - if(!baseComponent) { - return {spinePos: -1}; - } - - cfi.base = this.parseComponent(baseComponent); - - pathComponent = this.getPathComponent(cfiStr); - cfi.path = this.parseComponent(pathComponent); - - range = this.getRange(cfiStr); - - if(range) { - cfi.range = true; - cfi.start = this.parseComponent(range[0]); - cfi.end = this.parseComponent(range[1]); - } - - // Get spine node position - // cfi.spineSegment = cfi.base.steps[1]; - - // Chapter segment is always the second step - cfi.spinePos = cfi.base.steps[1].index; - - return cfi; -}; - -EpubCFI.prototype.parseComponent = function(componentStr){ - var component = { - steps: [], - terminal: { - offset: null, - assertion: null - } - }; - var parts = componentStr.split(':'); - var steps = parts[0].split('/'); - var terminal; - - if(parts.length > 1) { - terminal = parts[1]; - component.terminal = this.parseTerminal(terminal); - } - - if (steps[0] === '') { - steps.shift(); // Ignore the first slash - } - - component.steps = steps.map(function(step){ - return this.parseStep(step); - }.bind(this)); - - return component; -}; - -EpubCFI.prototype.parseStep = function(stepStr){ - var type, num, index, has_brackets, id; - - has_brackets = stepStr.match(/\[(.*)\]/); - if(has_brackets && has_brackets[1]){ - id = has_brackets[1]; - } - - //-- Check if step is a text node or element - num = parseInt(stepStr); - - if(isNaN(num)) { - return; - } - - if(num % 2 === 0) { // Even = is an element - type = "element"; - index = num / 2 - 1; - } else { - type = "text"; - index = (num - 1 ) / 2; - } - - return { - "type" : type, - 'index' : index, - 'id' : id || null - }; -}; - -EpubCFI.prototype.parseTerminal = function(termialStr){ - var characterOffset, textLocationAssertion; - var assertion = termialStr.match(/\[(.*)\]/); - - if(assertion && assertion[1]){ - characterOffset = parseInt(termialStr.split('[')[0]) || null; - textLocationAssertion = assertion[1]; - } else { - characterOffset = parseInt(termialStr) || null; - } - - return { - 'offset': characterOffset, - 'assertion': textLocationAssertion - }; - -}; - -EpubCFI.prototype.getChapterComponent = function(cfiStr) { - - var indirection = cfiStr.split("!"); - - return indirection[0]; -}; - -EpubCFI.prototype.getPathComponent = function(cfiStr) { - - var indirection = cfiStr.split("!"); - - if(indirection[1]) { - ranges = indirection[1].split(','); - return ranges[0]; - } - -}; - -EpubCFI.prototype.getRange = function(cfiStr) { - - var ranges = cfiStr.split(","); - - if(ranges.length === 3){ - return [ - ranges[1], - ranges[2] - ]; - } - - return false; -}; - -EpubCFI.prototype.getCharecterOffsetComponent = function(cfiStr) { - var splitStr = cfiStr.split(":"); - return splitStr[1] || ''; -}; - -EpubCFI.prototype.joinSteps = function(steps) { - if(!steps) { - return ""; - } - - return steps.map(function(part){ - var segment = ''; - - if(part.type === 'element') { - segment += (part.index + 1) * 2; - } - - if(part.type === 'text') { - segment += 1 + (2 * part.index); // TODO: double check that this is odd - } - - if(part.id) { - segment += "[" + part.id + "]"; - } - - return segment; - - }).join('/'); - -}; - -EpubCFI.prototype.segmentString = function(segment) { - var segmentString = '/'; - - segmentString += this.joinSteps(segment.steps); - - if(segment.terminal && segment.terminal.offset != null){ - segmentString += ':' + segment.terminal.offset; - } - - if(segment.terminal && segment.terminal.assertion != null){ - segmentString += '[' + segment.terminal.assertion + ']'; - } - - return segmentString; -}; - -EpubCFI.prototype.toString = function() { - var cfiString = 'epubcfi('; - - cfiString += this.segmentString(this.base); - - cfiString += '!'; - cfiString += this.segmentString(this.path); - - // Add Range, if present - if(this.start) { - cfiString += ','; - cfiString += this.segmentString(this.start); - } - - if(this.end) { - cfiString += ','; - cfiString += this.segmentString(this.end); - } - - cfiString += ")"; - - return cfiString; -}; - -EpubCFI.prototype.compare = function(cfiOne, cfiTwo) { - if(typeof cfiOne === 'string') { - cfiOne = new EpubCFI(cfiOne); - } - if(typeof cfiTwo === 'string') { - cfiTwo = new EpubCFI(cfiTwo); - } - // Compare Spine Positions - if(cfiOne.spinePos > cfiTwo.spinePos) { - return 1; - } - if(cfiOne.spinePos < cfiTwo.spinePos) { - return -1; - } - - - // Compare Each Step in the First item - for (var i = 0; i < cfiOne.path.steps.length; i++) { - if(!cfiTwo.path.steps[i]) { - return 1; - } - if(cfiOne.path.steps[i].index > cfiTwo.path.steps[i].index) { - return 1; - } - if(cfiOne.path.steps[i].index < cfiTwo.path.steps[i].index) { - return -1; - } - // Otherwise continue checking - } - - // All steps in First equal to Second and First is Less Specific - if(cfiOne.path.steps.length < cfiTwo.path.steps.length) { - return 1; - } - - // Compare the charecter offset of the text node - if(cfiOne.path.terminal.offset > cfiTwo.path.terminal.offset) { - return 1; - } - if(cfiOne.path.terminal.offset < cfiTwo.path.terminal.offset) { - return -1; - } - - // TODO: compare ranges - - // CFI's are equal - return 0; -}; - -EpubCFI.prototype.step = function(node) { - var nodeType = (node.nodeType === Node.TEXT_NODE) ? 'text' : 'element'; - - return { - 'id' : node.id, - 'tagName' : node.tagName, - 'type' : nodeType, - 'index' : this.position(node) - }; -}; - -EpubCFI.prototype.filteredStep = function(node, ignoreClass) { - var filteredNode = this.filter(node, ignoreClass); - var nodeType; - - // Node filtered, so ignore - if (!filteredNode) { - return; - } - - // Otherwise add the filter node in - nodeType = (filteredNode.nodeType === Node.TEXT_NODE) ? 'text' : 'element'; - - return { - 'id' : filteredNode.id, - 'tagName' : filteredNode.tagName, - 'type' : nodeType, - 'index' : this.filteredPosition(filteredNode, ignoreClass) +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("xmldom"), (function webpackLoadOptionalExternalModule() { try { return require("JSZip"); } catch(e) {} }())); + else if(typeof define === 'function' && define.amd) + define(["xmldom", "JSZip"], factory); + else if(typeof exports === 'object') + exports["ePub"] = factory(require("xmldom"), (function webpackLoadOptionalExternalModule() { try { return require("JSZip"); } catch(e) {} }())); + else + root["ePub"] = factory(root["xmldom"], root["JSZip"]); +})(this, function(__WEBPACK_EXTERNAL_MODULE_13__, __WEBPACK_EXTERNAL_MODULE_29__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + var Book = __webpack_require__(1); + var EpubCFI = __webpack_require__(15); + var Rendition = __webpack_require__(24); + var Contents = __webpack_require__(30); + var RSVP = __webpack_require__(2); + + function ePub(_url) { + return new Book(_url); }; -}; - -EpubCFI.prototype.pathTo = function(node, offset, ignoreClass) { - var segment = { - steps: [], - terminal: { - offset: null, - assertion: null + + ePub.VERSION = "0.3.0"; + + ePub.CFI = EpubCFI; + ePub.Rendition = Rendition; + ePub.Contents = Contents; + ePub.RSVP = RSVP; + + ePub.ViewManagers = {}; + ePub.Views = {}; + ePub.register = { + manager : function(name, manager){ + return ePub.ViewManagers[name] = manager; + }, + view : function(name, view){ + return ePub.Views[name] = view; } }; - var currentNode = node; - var step; - - while(currentNode && currentNode.parentNode && - currentNode.parentNode.nodeType != Node.DOCUMENT_NODE) { - - if (ignoreClass) { - step = this.filteredStep(currentNode, ignoreClass); - } else { - step = this.step(currentNode); - } - - if (step) { - segment.steps.unshift(step); - } - - currentNode = currentNode.parentNode; - - } - - if (offset != null && offset >= 0) { - - segment.terminal.offset = offset; - - // Make sure we are getting to a textNode if there is an offset - if(segment.steps[segment.steps.length-1].type != "text") { - segment.steps.push({ - 'type' : "text", - 'index' : 0 - }); - } - - } - - - return segment; -} - -EpubCFI.prototype.equalStep = function(stepA, stepB) { - if (!stepA || !stepB) { - return false; - } - - if(stepA.index === stepB.index && - stepA.id === stepB.id && - stepA.type === stepB.type) { - return true; - } - - return false; -}; -EpubCFI.prototype.fromRange = function(range, base, ignoreClass) { - var cfi = { - range: false, - base: {}, - path: {}, - start: null, - end: null - }; - - var start = range.startContainer; - var end = range.endContainer; - - var startOffset = range.startOffset; - var endOffset = range.endOffset; - - var needsIgnoring = false; - - if (ignoreClass) { - // Tell pathTo if / what to ignore - needsIgnoring = (start.ownerDocument.querySelector('.' + ignoreClass) != null); - } - - - if (typeof base === 'string') { - cfi.base = this.parseComponent(base); - cfi.spinePos = cfi.base.steps[1].index; - } else if (typeof base === 'object') { - cfi.base = base; - } - - if (range.collapsed) { - if (needsIgnoring) { - startOffset = this.patchOffset(start, startOffset, ignoreClass); - } - cfi.path = this.pathTo(start, startOffset, ignoreClass); - } else { - cfi.range = true; - - if (needsIgnoring) { - startOffset = this.patchOffset(start, startOffset, ignoreClass); - } - - cfi.start = this.pathTo(start, startOffset, ignoreClass); - - if (needsIgnoring) { - endOffset = this.patchOffset(end, endOffset, ignoreClass); - } - - cfi.end = this.pathTo(end, endOffset, ignoreClass); - - // Create a new empty path - cfi.path = { - steps: [], - terminal: null - }; - - // Push steps that are shared between start and end to the common path - var len = cfi.start.steps.length; - var i; - - for (i = 0; i < len; i++) { - if (this.equalStep(cfi.start.steps[i], cfi.end.steps[i])) { - if(i == len-1) { - // Last step is equal, check terminals - if(cfi.start.terminal === cfi.end.terminal) { - // CFI's are equal - cfi.path.steps.push(cfi.start.steps[i]); - // Not a range - cfi.range = false; - } - } else { - cfi.path.steps.push(cfi.start.steps[i]); - } - - } else { - break; - } - }; - - cfi.start.steps = cfi.start.steps.slice(cfi.path.steps.length); - cfi.end.steps = cfi.end.steps.slice(cfi.path.steps.length); - - // TODO: Add Sanity check to make sure that the end if greater than the start - } - - return cfi; -} - -EpubCFI.prototype.fromNode = function(anchor, base, ignoreClass) { - var cfi = { - range: false, - base: {}, - path: {}, - start: null, - end: null + + // Default Views + ePub.register.view("iframe", __webpack_require__(31)); + + // Default View Managers + ePub.register.manager("single", __webpack_require__(32)); + ePub.register.manager("continuous", __webpack_require__(35)); + + module.exports = ePub; + + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var URI = __webpack_require__(6); + var core = __webpack_require__(11); + var Spine = __webpack_require__(14); + var Locations = __webpack_require__(20); + var Parser = __webpack_require__(22); + var Navigation = __webpack_require__(23); + var Rendition = __webpack_require__(24); + var Unarchive = __webpack_require__(27); + var request = __webpack_require__(18); + var EpubCFI = __webpack_require__(15); + + function Book(_url, options){ + + this.settings = core.extend(this.settings || {}, { + requestMethod: this.requestMethod + }); + + core.extend(this.settings, options); + + + // Promises + this.opening = new RSVP.defer(); + this.opened = this.opening.promise; + this.isOpen = false; + + this.url = undefined; + + this.loading = { + manifest: new RSVP.defer(), + spine: new RSVP.defer(), + metadata: new RSVP.defer(), + cover: new RSVP.defer(), + navigation: new RSVP.defer(), + pageList: new RSVP.defer() }; - - var needsIgnoring = false; - - if (ignoreClass) { - // Tell pathTo if / what to ignore - needsIgnoring = (anchor.ownerDocument.querySelector('.' + ignoreClass) != null); - } - - if (typeof base === 'string') { - cfi.base = this.parseComponent(base); - cfi.spinePos = cfi.base.steps[1].index; - } else if (typeof base === 'object') { - cfi.base = base; - } - - cfi.path = this.pathTo(anchor, null, ignoreClass); - - return cfi; -}; - - -EpubCFI.prototype.filter = function(anchor, ignoreClass) { - var needsIgnoring; - var sibling; // to join with - var parent, prevSibling, nextSibling; - var isText = false; - - if (anchor.nodeType === Node.TEXT_NODE) { - isText = true; - parent = anchor.parentNode; - needsIgnoring = anchor.parentNode.classList.contains(ignoreClass); - } else { - isText = false; - needsIgnoring = anchor.classList.contains(ignoreClass); - } - - if (needsIgnoring && isText) { - previousSibling = parent.previousSibling; - nextSibling = parent.nextSibling; - - // If the sibling is a text node, join the nodes - if (previousSibling && previousSibling.nodeType === Node.TEXT_NODE) { - sibling = previousSibling; - } else if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE) { - sibling = nextSibling; - } - - if (sibling) { - return sibling; - } else { - // Parent will be ignored on next step - return anchor; - } - - } else if (needsIgnoring && !isText) { - // Otherwise just skip the element node - return false; - } else { - // No need to filter - return anchor; - } - -}; - -EpubCFI.prototype.patchOffset = function(anchor, offset, ignoreClass) { - var needsIgnoring; - var sibling; - - if (anchor.nodeType != Node.TEXT_NODE) { - console.error("Anchor must be a text node"); - return; - } - - var curr = anchor; - var totalOffset = offset; - - // If the parent is a ignored node, get offset from it's start - if (anchor.parentNode.classList.contains(ignoreClass)) { - curr = anchor.parentNode; - } - - while (curr.previousSibling) { - if(curr.previousSibling.nodeType === Node.ELEMENT_NODE) { - // Originally a text node, so join - if(curr.previousSibling.classList.contains(ignoreClass)){ - totalOffset += curr.previousSibling.textContent.length; - } else { - break; // Normal node, dont join - } - } else { - // If the previous sibling is a text node, join the nodes - totalOffset += curr.previousSibling.textContent.length; - } - - curr = curr.previousSibling; - } - - return totalOffset; - -}; - -EpubCFI.prototype.normalizedMap = function(children, nodeType, ignoreClass) { - var output = {}; - var prevIndex = -1; - var i, len = children.length; - var currNodeType; - var prevNodeType; - - for (i = 0; i < len; i++) { - - currNodeType = children[i].nodeType; - - // Check if needs ignoring - if (currNodeType === Node.ELEMENT_NODE && - children[i].classList.contains(ignoreClass)) { - currNodeType = Node.TEXT_NODE; - } - - if (i > 0 && - currNodeType === Node.TEXT_NODE && - prevNodeType === Node.TEXT_NODE) { - // join text nodes - output[i] = prevIndex; - } else if (nodeType === currNodeType){ - prevIndex = prevIndex + 1; - output[i] = prevIndex; - } - - prevNodeType = currNodeType; - - } - - return output; -}; - -EpubCFI.prototype.position = function(anchor) { - var children, index, map; - - if (anchor.nodeType === Node.ELEMENT_NODE) { - children = anchor.parentNode.children; - index = Array.prototype.indexOf.call(children, anchor); - } else { - children = this.textNodes(anchor.parentNode); - index = children.indexOf(anchor); - } - - return index; -}; - -EpubCFI.prototype.filteredPosition = function(anchor, ignoreClass) { - var children, index, map; - - if (anchor.nodeType === Node.ELEMENT_NODE) { - children = anchor.parentNode.children; - map = this.normalizedMap(children, Node.ELEMENT_NODE, ignoreClass); - } else { - children = anchor.parentNode.childNodes; - // Inside an ignored node - if(anchor.parentNode.classList.contains(ignoreClass)) { - anchor = anchor.parentNode; - children = anchor.parentNode.childNodes; + + this.loaded = { + manifest: this.loading.manifest.promise, + spine: this.loading.spine.promise, + metadata: this.loading.metadata.promise, + cover: this.loading.cover.promise, + navigation: this.loading.navigation.promise, + pageList: this.loading.pageList.promise + }; + + this.ready = RSVP.hash(this.loaded); + + // Queue for methods used before opening + this.isRendered = false; + // this._q = core.queue(this); + + this.request = this.settings.requestMethod.bind(this); + + this.spine = new Spine(this.request); + this.locations = new Locations(this.spine, this.request); + + if(_url) { + this.open(_url).catch(function (error) { + var err = new Error("Cannot load book at "+ _url ); + console.error(err); + + this.trigger("loadFailed", error); + }.bind(this)); } - map = this.normalizedMap(children, Node.TEXT_NODE, ignoreClass); - } - - - index = Array.prototype.indexOf.call(children, anchor); - - return map[index]; -}; - -EpubCFI.prototype.stepsToXpath = function(steps) { - var xpath = [".", "*"]; - - steps.forEach(function(step){ - var position = step.index + 1; - - if(step.id){ - xpath.push("*[position()=" + position + " and @id='" + step.id + "']"); - } else if(step.type === "text") { - xpath.push("text()[" + position + "]"); - } else { - xpath.push("*[" + position + "]"); + }; + + Book.prototype.open = function(_url, options){ + var uri; + var parse = new Parser(); + var epubPackage; + var epubContainer; + var book = this; + var containerPath = "META-INF/container.xml"; + var location; + var absoluteUri; + var isArrayBuffer = false; + var isBase64 = options && options.base64; + + if(!_url) { + this.opening.resolve(this); + return this.opened; } - }); - - return xpath.join("/"); -}; - - -/* - -To get the last step if needed: - -// Get the terminal step -lastStep = steps[steps.length-1]; -// Get the query string -query = this.stepsToQuery(steps); -// Find the containing element -startContainerParent = doc.querySelector(query); -// Find the text node within that element -if(startContainerParent && lastStep.type == "text") { - container = startContainerParent.childNodes[lastStep.index]; -} -*/ -EpubCFI.prototype.stepsToQuerySelector = function(steps) { - var query = ["html"]; - - steps.forEach(function(step){ - var position = step.index + 1; - - if(step.id){ - query.push("#" + step.id); - } else if(step.type === "text") { - // unsupported in querySelector - // query.push("text()[" + position + "]"); + + // Reuse parsed url or create a new uri object + // if(typeof(_url) === "object") { + // uri = _url; + // } else { + // uri = core.uri(_url); + // } + if (_url instanceof ArrayBuffer || isBase64) { + isArrayBuffer = true; + this.url = '/'; } else { - query.push("*:nth-child(" + position + ")"); + uri = URI(_url); } - }); - - return query.join(">"); - -}; - -EpubCFI.prototype.textNodes = function(container, ignoreClass) { - return Array.prototype.slice.call(container.childNodes). - filter(function (node) { - if (node.nodeType === Node.TEXT_NODE) { - return true; - } else if (ignoreClass && node.classList.contains(ignoreClass)) { - return true; - } - return false; - }); -}; - -EpubCFI.prototype.walkToNode = function(steps, _doc, ignoreClass) { - var doc = _doc || document; - var container = doc.documentElement; - var step; - var len = steps.length; - var i; - - for (i = 0; i < len; i++) { - step = steps[i]; - - if(step.type === "element") { - container = container.children[step.index]; - } else if(step.type === "text"){ - container = this.textNodes(container, ignoreClass)[step.index]; + + if (window && window.location && uri) { + absoluteUri = uri.absoluteTo(window.location.href); + this.url = absoluteUri.toString(); + } else if (window && window.location) { + this.url = window.location.href; + } else { + this.url = _url; } - - }; - - return container; -}; - -EpubCFI.prototype.findNode = function(steps, _doc, ignoreClass) { - var doc = _doc || document; - var container; - var xpath; - - if(!ignoreClass && typeof doc.evaluate != 'undefined') { - xpath = this.stepsToXpath(steps); - container = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - } else if(ignoreClass) { - container = this.walkToNode(steps, doc, ignoreClass); - } else { - container = this.walkToNode(steps, doc); - } - - return container; -}; - -EpubCFI.prototype.fixMiss = function(steps, offset, _doc, ignoreClass) { - var container = this.findNode(steps.slice(0,-1), _doc, ignoreClass); - var children = container.childNodes; - var map = this.normalizedMap(children, Node.TEXT_NODE, ignoreClass); - var i; - var child; - var len; - var childIndex; - var lastStepIndex = steps[steps.length-1].index; - - for (var childIndex in map) { - if (!map.hasOwnProperty(childIndex)) return; - - if(map[childIndex] === lastStepIndex) { - child = children[childIndex]; - len = child.textContent.length; - if(offset > len) { - offset = offset - len; + + // Find path to the Container + if(uri && uri.suffix() === "opf") { + // Direct link to package, no container + this.packageUrl = _url; + this.containerUrl = ''; + + if(uri.origin()) { + this.baseUrl = uri.origin() + "/" + uri.directory() + "/"; + } else if(absoluteUri){ + this.baseUrl = absoluteUri.origin(); + this.baseUrl += absoluteUri.directory() + "/"; } else { - if (child.nodeType === Node.ELEMENT_NODE) { - container = child.childNodes[0]; - } else { - container = child; - } - break; + this.baseUrl = uri.directory() + "/"; } + + epubPackage = this.request(this.packageUrl) + .catch(function(error) { + book.opening.reject(error); + }); + + } else if(isArrayBuffer || isBase64 || this.isArchivedUrl(uri)) { + // Book is archived + this.url = '/'; + this.containerUrl = URI(containerPath).absoluteTo(this.url).toString(); + + epubContainer = this.unarchive(_url, isBase64). + then(function() { + return this.request(this.containerUrl); + }.bind(this)) + .catch(function(error) { + book.opening.reject(error); + }); } - } - - return { - container: container, - offset: offset - }; - -}; - -EpubCFI.prototype.toRange = function(_doc, ignoreClass) { - var doc = _doc || document; - var range = doc.createRange(); - var start, end, startContainer, endContainer; - var cfi = this; - var startSteps, endSteps; - var needsIgnoring = ignoreClass ? (doc.querySelector('.' + ignoreClass) != null) : false; - var missed; - - if (cfi.range) { - start = cfi.start; - startSteps = cfi.path.steps.concat(start.steps); - startContainer = this.findNode(startSteps, doc, needsIgnoring ? ignoreClass : null); - end = cfi.end; - endSteps = cfi.path.steps.concat(end.steps); - endContainer = this.findNode(endSteps, doc, needsIgnoring ? ignoreClass : null); - } else { - start = cfi.path; - startSteps = cfi.path.steps; - startContainer = this.findNode(cfi.path.steps, doc, needsIgnoring ? ignoreClass : null); - } - - if(startContainer) { - try { - - if(start.terminal.offset != null) { - range.setStart(startContainer, start.terminal.offset); - } else { - range.setStart(startContainer, 0); - } - - } catch (e) { - missed = this.fixMiss(startSteps, start.terminal.offset, doc, needsIgnoring ? ignoreClass : null); - range.setStart(missed.container, missed.offset); + // Find the path to the Package from the container + else if (!uri.suffix()) { + + this.containerUrl = this.url + containerPath; + + epubContainer = this.request(this.containerUrl) + .catch(function(error) { + // handle errors in loading container + book.opening.reject(error); + }); } - } else { - // No start found - return null; - } - - if (endContainer) { - try { - - if(end.terminal.offset != null) { - range.setEnd(endContainer, end.terminal.offset); - } else { - range.setEnd(endContainer, 0); - } - - } catch (e) { - missed = this.fixMiss(endSteps, cfi.end.terminal.offset, doc, needsIgnoring ? ignoreClass : null); - range.setEnd(missed.container, missed.offset); + + if (epubContainer) { + epubPackage = epubContainer. + then(function(containerXml){ + return parse.container(containerXml); // Container has path to content + }). + then(function(paths){ + var packageUri = URI(paths.packagePath); + var absPackageUri = packageUri.absoluteTo(book.url); + var absWindowUri; + + book.packageUrl = absPackageUri.toString(); + book.encoding = paths.encoding; + + // Set Url relative to the content + if(absPackageUri.origin()) { + book.baseUrl = absPackageUri.origin() + absPackageUri.directory() + "/"; + } else { + if(packageUri.directory()) { + book.baseUrl = "/" + packageUri.directory() + "/"; + } else { + book.baseUrl = "/" + } + } + + return book.request(book.packageUrl); + }).catch(function(error) { + // handle errors in either of the two requests + book.opening.reject(error); + }); } - } - - - // doc.defaultView.getSelection().addRange(range); - return range; -}; - -// is a cfi string, should be wrapped with "epubcfi()" -EpubCFI.prototype.isCfiString = function(str) { - if(typeof str === 'string' && - str.indexOf("epubcfi(") === 0 && - str[str.length-1] === ")") { - return true; - } - - return false; -}; - -EpubCFI.prototype.generateChapterComponent = function(_spineNodeIndex, _pos, id) { - var pos = parseInt(_pos), - spineNodeIndex = _spineNodeIndex + 1, - cfi = '/'+spineNodeIndex+'/'; - - cfi += (pos + 1) * 2; - - if(id) { - cfi += "[" + id + "]"; - } - - return cfi; -}; - -module.exports = EpubCFI; - -},{"./core":10,"urijs":7}],12:[function(require,module,exports){ -var RSVP = require('rsvp'); - -//-- Hooks allow for injecting functions that must all complete in order before finishing -// They will execute in parallel but all must finish before continuing -// Functions may return a promise if they are asycn. - -// this.content = new EPUBJS.Hook(); -// this.content.register(function(){}); -// this.content.trigger(args).then(function(){}); - -function Hook(context){ - this.context = context || this; - this.hooks = []; -}; - -// Adds a function to be run before a hook completes -Hook.prototype.register = function(){ - for(var i = 0; i < arguments.length; ++i) { - if (typeof arguments[i] === "function") { - this.hooks.push(arguments[i]); - } else { - // unpack array - for(var j = 0; j < arguments[i].length; ++j) { - this.hooks.push(arguments[i][j]); + + epubPackage.then(function(packageXml) { + + if (!packageXml) { + return; } + + // Get package information from epub opf + book.unpack(packageXml); + + // Resolve promises + book.loading.manifest.resolve(book.package.manifest); + book.loading.metadata.resolve(book.package.metadata); + book.loading.spine.resolve(book.spine); + book.loading.cover.resolve(book.cover); + + book.isOpen = true; + + // Clear queue of any waiting book request + + // Resolve book opened promise + book.opening.resolve(book); + + }).catch(function(error) { + // handle errors in parsing the book + // console.error(error.message, error.stack); + book.opening.reject(error); + }); + + return this.opened; + }; + + Book.prototype.unpack = function(packageXml){ + var book = this, + parse = new Parser(); + + book.package = parse.packageContents(packageXml); // Extract info from contents + if(!book.package) { + return; } - } -}; - -// Triggers a hook to run all functions -Hook.prototype.trigger = function(){ - var args = arguments; - var context = this.context; - var promises = []; - - this.hooks.forEach(function(task, i) { - var executing = task.apply(context, args); - - if(executing && typeof executing["then"] === "function") { - // Task is a function that returns a promise - promises.push(executing); + + book.package.baseUrl = book.baseUrl; // Provides a url base for resolving paths + + this.spine.load(book.package); + + book.navigation = new Navigation(book.package, this.request); + book.navigation.load().then(function(toc){ + book.toc = toc; + book.loading.navigation.resolve(book.toc); + }); + + // //-- Set Global Layout setting based on metadata + // MOVE TO RENDER + // book.globalLayoutProperties = book.parseLayoutProperties(book.package.metadata); + + book.cover = URI(book.package.coverPath).absoluteTo(book.baseUrl).toString(); + }; + + // Alias for book.spine.get + Book.prototype.section = function(target) { + return this.spine.get(target); + }; + + // Sugar to render a book + Book.prototype.renderTo = function(element, options) { + // var renderMethod = (options && options.method) ? + // options.method : + // "single"; + + this.rendition = new Rendition(this, options); + this.rendition.attachTo(element); + + return this.rendition; + }; + + Book.prototype.requestMethod = function(_url) { + // Switch request methods + if(this.unarchived) { + return this.unarchived.request(_url); + } else { + return request(_url, null, this.requestCredentials, this.requestHeaders); } - // Otherwise Task resolves immediately, continue - }); - - - return RSVP.all(promises); -}; - -// Adds a function to be run before a hook completes -Hook.prototype.list = function(){ - return this.hooks; -}; - -Hook.prototype.clear = function(){ - return this.hooks = []; -}; - -module.exports = Hook; - -},{"rsvp":5}],13:[function(require,module,exports){ -var core = require('./core'); -var RSVP = require('rsvp'); - -function Layout(settings){ - this.name = settings.layout || "reflowable"; - this._spread = (settings.spread === "none") ? false : true; - this._minSpreadWidth = settings.spread || 800; - this._evenSpreads = settings.evenSpreads || false; - - if (settings.flow === "scrolled-continuous" || - settings.flow === "scrolled-doc") { - this._flow = "scrolled"; - } else { - this._flow = "paginated"; - } - - - this.width = 0; - this.height = 0; - this.spreadWidth = 0; - this.delta = 0; - - this.columnWidth = 0; - this.gap = 0; - this.divisor = 1; -}; - -// paginated | scrolled -Layout.prototype.flow = function(flow) { - this._flow = (flow === "paginated") ? "paginated" : "scrolled"; -} - -// true | false -Layout.prototype.spread = function(spread, min) { - - this._spread = (spread === "none") ? false : true; - - if (min >= 0) { - this._minSpreadWidth = min; - } -} - -Layout.prototype.calculate = function(_width, _height, _gap){ - - var divisor = 1; - var gap = _gap || 0; - - //-- Check the width and create even width columns - var fullWidth = Math.floor(_width); - var width = _width; - - var section = Math.floor(width / 8); - - var colWidth; - var spreadWidth; - var delta; - - if (this._spread && width >= this._minSpreadWidth) { - divisor = 2; - } else { - divisor = 1; - } - - if (this.name === "reflowable" && this._flow === "paginated" && !(_gap >= 0)) { - gap = ((section % 2 === 0) ? section : section - 1); - } - - if (this.name === "pre-paginated" ) { - gap = 0; - } - - //-- Double Page - if(divisor > 1) { - colWidth = Math.floor((width - gap) / divisor); - } else { - colWidth = width; - } - - if (this.name === "pre-paginated" && divisor > 1) { - width = colWidth; - } - - spreadWidth = colWidth * divisor; - - delta = (colWidth + gap) * divisor; - - this.width = width; - this.height = _height; - this.spreadWidth = spreadWidth; - this.delta = delta; - - this.columnWidth = colWidth; - this.gap = gap; - this.divisor = divisor; -}; - -Layout.prototype.format = function(contents){ - var formating; - - if (this.name === "pre-paginated") { - formating = contents.fit(this.columnWidth, this.height); - } else if (this._flow === "paginated") { - formating = contents.columns(this.width, this.height, this.columnWidth, this.gap); - } else { // scrolled - formating = contents.size(this.width, null); - } - - return formating; // might be a promise in some View Managers -}; - -Layout.prototype.count = function(totalWidth) { - // var totalWidth = contents.scrollWidth(); - var spreads = Math.ceil( totalWidth / this.spreadWidth); - - return { - spreads : spreads, - pages : spreads * this.divisor + }; -}; - -module.exports = Layout; - -},{"./core":10,"rsvp":5}],14:[function(require,module,exports){ -var core = require('./core'); -var Queue = require('./queue'); -var EpubCFI = require('./epubcfi'); -var RSVP = require('rsvp'); - -function Locations(spine, request) { - this.spine = spine; - this.request = request; - - this.q = new Queue(this); - this.epubcfi = new EpubCFI(); - - this._locations = []; - this.total = 0; - - this.break = 150; - - this._current = 0; - -}; - -// Load all of sections in the book -Locations.prototype.generate = function(chars) { - - if (chars) { - this.break = chars; - } - - this.q.pause(); - - this.spine.each(function(section) { - - this.q.enqueue(this.process, section); - - }.bind(this)); - - return this.q.run().then(function() { - this.total = this._locations.length-1; - - if (this._currentCfi) { - this.currentLocation = this._currentCfi; + + Book.prototype.setRequestCredentials = function(_credentials) { + this.requestCredentials = _credentials; + }; + + Book.prototype.setRequestHeaders = function(_headers) { + this.requestHeaders = _headers; + }; + + Book.prototype.unarchive = function(bookUrl, isBase64){ + this.unarchived = new Unarchive(); + return this.unarchived.open(bookUrl, isBase64); + }; + + //-- Checks if url has a .epub or .zip extension, or is ArrayBuffer (of zip/epub) + Book.prototype.isArchivedUrl = function(bookUrl){ + var uri; + var extension; + + if (bookUrl instanceof ArrayBuffer) { + return true; } - - return this._locations; - // console.log(this.precentage(this.book.rendition.location.start), this.precentage(this.book.rendition.location.end)); - }.bind(this)); - -}; - -Locations.prototype.process = function(section) { - - return section.load(this.request) - .then(function(contents) { - - var range; - var doc = contents.ownerDocument; - var counter = 0; - - this.sprint(contents, function(node) { - var len = node.length; - var dist; - var pos = 0; - - // Start range - if (counter == 0) { - range = doc.createRange(); - range.setStart(node, 0); - } - - dist = this.break - counter; - - // Node is smaller than a break - if(dist > len){ - counter += len; - pos = len; - } - - while (pos < len) { - counter = this.break; - pos += this.break; - - // Gone over - if(pos >= len){ - // Continue counter for next node - counter = len - (pos - this.break); - - // At End - } else { - // End the previous range - range.setEnd(node, pos); - cfi = section.cfiFromRange(range); - this._locations.push(cfi); - counter = 0; - - // Start new range - pos += 1; - range = doc.createRange(); - range.setStart(node, pos); - } + + // Reuse parsed url or create a new uri object + // if(typeof(bookUrl) === "object") { + // uri = bookUrl; + // } else { + // uri = core.uri(bookUrl); + // } + uri = URI(bookUrl); + extension = uri.suffix(); + + if(extension && (extension == "epub" || extension == "zip")){ + return true; + } + + return false; + }; + + //-- Returns the cover + Book.prototype.coverUrl = function(){ + var retrieved = this.loaded.cover. + then(function(url) { + if(this.unarchived) { + return this.unarchived.createUrl(this.cover); + }else{ + return this.cover; } - - - }.bind(this)); + + + + return retrieved; + }; + + Book.prototype.range = function(cfiRange) { + var cfi = new EpubCFI(cfiRange); + var item = this.spine.get(cfi.spinePos); + + return item.load().then(function (contents) { + var range = cfi.toRange(item.document); + return range; + }) + }; + + module.exports = Book; + + //-- Enable binding events to book + RSVP.EventTarget.mixin(Book.prototype); + + //-- Handle RSVP Errors + RSVP.on('error', function(event) { + console.error(event); + }); + + RSVP.configure('instrument', false); //-- true | will logging out all RSVP rejections + // RSVP.on('created', listener); + // RSVP.on('chained', listener); + // RSVP.on('fulfilled', listener); + RSVP.on('rejected', function(event){ + console.error(event.detail.message, event.detail.stack); + }); - // Close remaining - if (range) { - range.setEnd(prev, prev.length); - cfi = section.cfiFromRange(range); - this._locations.push(cfi) - counter = 0; - } - - }.bind(this)); - -}; - -Locations.prototype.sprint = function(root, func) { - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false); - - while ((node = treeWalker.nextNode())) { - func(node); - } - -}; - -Locations.prototype.locationFromCfi = function(cfi){ - // Check if the location has not been set yet - if(this._locations.length === 0) { - return -1; - } - - return core.locationOf(cfi, this._locations, this.epubcfi.compare); -}; - -Locations.prototype.precentageFromCfi = function(cfi) { - // Find closest cfi - var loc = this.locationFromCfi(cfi); - // Get percentage in total - return this.precentageFromLocation(loc); -}; - -Locations.prototype.percentageFromLocation = function(loc) { - if (!loc || !this.total) { - return 0; - } - return (loc / this.total); -}; - -Locations.prototype.cfiFromLocation = function(loc){ - var cfi = -1; - // check that pg is an int - if(typeof loc != "number"){ - loc = parseInt(pg); - } - - if(loc >= 0 && loc < this._locations.length) { - cfi = this._locations[loc]; - } - - return cfi; -}; - -Locations.prototype.cfiFromPercentage = function(value){ - var percentage = (value > 1) ? value / 100 : value; // Normalize value to 0-1 - var loc = Math.ceil(this.total * percentage); - - return this.cfiFromLocation(loc); -}; - -Locations.prototype.load = function(locations){ - this._locations = JSON.parse(locations); - this.total = this._locations.length-1; - return this._locations; -}; - -Locations.prototype.save = function(json){ - return JSON.stringify(this._locations); -}; - -Locations.prototype.getCurrent = function(json){ - return this._current; -}; - -Locations.prototype.setCurrent = function(curr){ - var loc; - if(typeof curr == "string"){ - this._currentCfi = curr; - } else if (typeof curr == "number") { - this._current = curr; +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + var require;/* WEBPACK VAR INJECTION */(function(process, setImmediate, global) {/*! + * @overview RSVP - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE + * @version 3.3.2 + */ + + (function (global, factory) { + true ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.RSVP = global.RSVP || {}))); + }(this, (function (exports) { 'use strict'; + + function indexOf(callbacks, callback) { + for (var i = 0, l = callbacks.length; i < l; i++) { + if (callbacks[i] === callback) { + return i; + } + } + + return -1; + } + + function callbacksFor(object) { + var callbacks = object._promiseCallbacks; + + if (!callbacks) { + callbacks = object._promiseCallbacks = {}; + } + + return callbacks; + } + + /** + @class RSVP.EventTarget + */ + var EventTarget = { + + /** + `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For + Example: + ```javascript + let object = {}; + RSVP.EventTarget.mixin(object); + object.on('finished', function(event) { + // handle event + }); + object.trigger('finished', { detail: value }); + ``` + `EventTarget.mixin` also works with prototypes: + ```javascript + let Person = function() {}; + RSVP.EventTarget.mixin(Person.prototype); + let yehuda = new Person(); + let tom = new Person(); + yehuda.on('poke', function(event) { + console.log('Yehuda says OW'); + }); + tom.on('poke', function(event) { + console.log('Tom says OW'); + }); + yehuda.trigger('poke'); + tom.trigger('poke'); + ``` + @method mixin + @for RSVP.EventTarget + @private + @param {Object} object object to extend with EventTarget methods + */ + mixin: function mixin(object) { + object['on'] = this['on']; + object['off'] = this['off']; + object['trigger'] = this['trigger']; + object._promiseCallbacks = undefined; + return object; + }, + + /** + Registers a callback to be executed when `eventName` is triggered + ```javascript + object.on('event', function(eventInfo){ + // handle the event + }); + object.trigger('event'); + ``` + @method on + @for RSVP.EventTarget + @private + @param {String} eventName name of the event to listen for + @param {Function} callback function to be called when the event is triggered. + */ + on: function on(eventName, callback) { + if (typeof callback !== 'function') { + throw new TypeError('Callback must be a function'); + } + + var allCallbacks = callbacksFor(this), + callbacks = undefined; + + callbacks = allCallbacks[eventName]; + + if (!callbacks) { + callbacks = allCallbacks[eventName] = []; + } + + if (indexOf(callbacks, callback) === -1) { + callbacks.push(callback); + } + }, + + /** + You can use `off` to stop firing a particular callback for an event: + ```javascript + function doStuff() { // do stuff! } + object.on('stuff', doStuff); + object.trigger('stuff'); // doStuff will be called + // Unregister ONLY the doStuff callback + object.off('stuff', doStuff); + object.trigger('stuff'); // doStuff will NOT be called + ``` + If you don't pass a `callback` argument to `off`, ALL callbacks for the + event will not be executed when the event fires. For example: + ```javascript + let callback1 = function(){}; + let callback2 = function(){}; + object.on('stuff', callback1); + object.on('stuff', callback2); + object.trigger('stuff'); // callback1 and callback2 will be executed. + object.off('stuff'); + object.trigger('stuff'); // callback1 and callback2 will not be executed! + ``` + @method off + @for RSVP.EventTarget + @private + @param {String} eventName event to stop listening to + @param {Function} callback optional argument. If given, only the function + given will be removed from the event's callback queue. If no `callback` + argument is given, all callbacks will be removed from the event's callback + queue. + */ + off: function off(eventName, callback) { + var allCallbacks = callbacksFor(this), + callbacks = undefined, + index = undefined; + + if (!callback) { + allCallbacks[eventName] = []; + return; + } + + callbacks = allCallbacks[eventName]; + + index = indexOf(callbacks, callback); + + if (index !== -1) { + callbacks.splice(index, 1); + } + }, + + /** + Use `trigger` to fire custom events. For example: + ```javascript + object.on('foo', function(){ + console.log('foo event happened!'); + }); + object.trigger('foo'); + // 'foo event happened!' logged to the console + ``` + You can also pass a value as a second argument to `trigger` that will be + passed as an argument to all event listeners for the event: + ```javascript + object.on('foo', function(value){ + console.log(value.name); + }); + object.trigger('foo', { name: 'bar' }); + // 'bar' logged to the console + ``` + @method trigger + @for RSVP.EventTarget + @private + @param {String} eventName name of the event to be triggered + @param {*} options optional value to be passed to any event handlers for + the given `eventName` + */ + trigger: function trigger(eventName, options, label) { + var allCallbacks = callbacksFor(this), + callbacks = undefined, + callback = undefined; + + if (callbacks = allCallbacks[eventName]) { + // Don't cache the callbacks.length since it may grow + for (var i = 0; i < callbacks.length; i++) { + callback = callbacks[i]; + + callback(options, label); + } + } + } + }; + + var config = { + instrument: false + }; + + EventTarget['mixin'](config); + + function configure(name, value) { + if (name === 'onerror') { + // handle for legacy users that expect the actual + // error to be passed to their function added via + // `RSVP.configure('onerror', someFunctionHere);` + config['on']('error', value); + return; + } + + if (arguments.length === 2) { + config[name] = value; + } else { + return config[name]; + } + } + + function objectOrFunction(x) { + return typeof x === 'function' || typeof x === 'object' && x !== null; + } + + function isFunction(x) { + return typeof x === 'function'; + } + + function isMaybeThenable(x) { + return typeof x === 'object' && x !== null; + } + + var _isArray = undefined; + if (!Array.isArray) { + _isArray = function (x) { + return Object.prototype.toString.call(x) === '[object Array]'; + }; } else { - return; + _isArray = Array.isArray; + } + + var isArray = _isArray; + + // Date.now is not available in browsers < IE9 + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility + var now = Date.now || function () { + return new Date().getTime(); + }; + + function F() {} + + var o_create = Object.create || function (o) { + if (arguments.length > 1) { + throw new Error('Second argument not supported'); + } + if (typeof o !== 'object') { + throw new TypeError('Argument must be an object'); + } + F.prototype = o; + return new F(); + }; + + var queue = []; + + function scheduleFlush() { + setTimeout(function () { + for (var i = 0; i < queue.length; i++) { + var entry = queue[i]; + + var payload = entry.payload; + + payload.guid = payload.key + payload.id; + payload.childGuid = payload.key + payload.childId; + if (payload.error) { + payload.stack = payload.error.stack; + } + + config['trigger'](entry.name, entry.payload); + } + queue.length = 0; + }, 50); + } + function instrument(eventName, promise, child) { + if (1 === queue.push({ + name: eventName, + payload: { + key: promise._guidKey, + id: promise._id, + eventName: eventName, + detail: promise._result, + childId: child && child._id, + label: promise._label, + timeStamp: now(), + error: config["instrument-with-stack"] ? new Error(promise._label) : null + } })) { + scheduleFlush(); + } + } + + /** + `RSVP.Promise.resolve` returns a promise that will become resolved with the + passed `value`. It is shorthand for the following: + + ```javascript + let promise = new RSVP.Promise(function(resolve, reject){ + resolve(1); + }); + + promise.then(function(value){ + // value === 1 + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = RSVP.Promise.resolve(1); + + promise.then(function(value){ + // value === 1 + }); + ``` + + @method resolve + @static + @param {*} object value that the returned promise will be resolved with + @param {String} label optional string for identifying the returned promise. + Useful for tooling. + @return {Promise} a promise that will become fulfilled with the given + `value` + */ + function resolve$1(object, label) { + /*jshint validthis:true */ + var Constructor = this; + + if (object && typeof object === 'object' && object.constructor === Constructor) { + return object; + } + + var promise = new Constructor(noop, label); + resolve(promise, object); + return promise; + } + + function withOwnPromise() { + return new TypeError('A promises callback cannot return that same promise.'); + } + + function noop() {} + + var PENDING = void 0; + var FULFILLED = 1; + var REJECTED = 2; + + var GET_THEN_ERROR = new ErrorObject(); + + function getThen(promise) { + try { + return promise.then; + } catch (error) { + GET_THEN_ERROR.error = error; + return GET_THEN_ERROR; + } + } + + function tryThen(then, value, fulfillmentHandler, rejectionHandler) { + try { + then.call(value, fulfillmentHandler, rejectionHandler); + } catch (e) { + return e; + } + } + + function handleForeignThenable(promise, thenable, then) { + config.async(function (promise) { + var sealed = false; + var error = tryThen(then, thenable, function (value) { + if (sealed) { + return; + } + sealed = true; + if (thenable !== value) { + resolve(promise, value, undefined); + } else { + fulfill(promise, value); + } + }, function (reason) { + if (sealed) { + return; + } + sealed = true; + + reject(promise, reason); + }, 'Settle: ' + (promise._label || ' unknown promise')); + + if (!sealed && error) { + sealed = true; + reject(promise, error); + } + }, promise); + } + + function handleOwnThenable(promise, thenable) { + if (thenable._state === FULFILLED) { + fulfill(promise, thenable._result); + } else if (thenable._state === REJECTED) { + thenable._onError = null; + reject(promise, thenable._result); + } else { + subscribe(thenable, undefined, function (value) { + if (thenable !== value) { + resolve(promise, value, undefined); + } else { + fulfill(promise, value); + } + }, function (reason) { + return reject(promise, reason); + }); + } + } + + function handleMaybeThenable(promise, maybeThenable, then$$) { + if (maybeThenable.constructor === promise.constructor && then$$ === then && promise.constructor.resolve === resolve$1) { + handleOwnThenable(promise, maybeThenable); + } else { + if (then$$ === GET_THEN_ERROR) { + reject(promise, GET_THEN_ERROR.error); + } else if (then$$ === undefined) { + fulfill(promise, maybeThenable); + } else if (isFunction(then$$)) { + handleForeignThenable(promise, maybeThenable, then$$); + } else { + fulfill(promise, maybeThenable); + } + } + } + + function resolve(promise, value) { + if (promise === value) { + fulfill(promise, value); + } else if (objectOrFunction(value)) { + handleMaybeThenable(promise, value, getThen(value)); + } else { + fulfill(promise, value); + } + } + + function publishRejection(promise) { + if (promise._onError) { + promise._onError(promise._result); + } + + publish(promise); + } + + function fulfill(promise, value) { + if (promise._state !== PENDING) { + return; + } + + promise._result = value; + promise._state = FULFILLED; + + if (promise._subscribers.length === 0) { + if (config.instrument) { + instrument('fulfilled', promise); + } + } else { + config.async(publish, promise); + } + } + + function reject(promise, reason) { + if (promise._state !== PENDING) { + return; + } + promise._state = REJECTED; + promise._result = reason; + config.async(publishRejection, promise); + } + + function subscribe(parent, child, onFulfillment, onRejection) { + var subscribers = parent._subscribers; + var length = subscribers.length; + + parent._onError = null; + + subscribers[length] = child; + subscribers[length + FULFILLED] = onFulfillment; + subscribers[length + REJECTED] = onRejection; + + if (length === 0 && parent._state) { + config.async(publish, parent); + } + } + + function publish(promise) { + var subscribers = promise._subscribers; + var settled = promise._state; + + if (config.instrument) { + instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise); + } + + if (subscribers.length === 0) { + return; + } + + var child = undefined, + callback = undefined, + detail = promise._result; + + for (var i = 0; i < subscribers.length; i += 3) { + child = subscribers[i]; + callback = subscribers[i + settled]; + + if (child) { + invokeCallback(settled, child, callback, detail); + } else { + callback(detail); + } + } + + promise._subscribers.length = 0; + } + + function ErrorObject() { + this.error = null; + } + + var TRY_CATCH_ERROR = new ErrorObject(); + + function tryCatch(callback, detail) { + try { + return callback(detail); + } catch (e) { + TRY_CATCH_ERROR.error = e; + return TRY_CATCH_ERROR; + } + } + + function invokeCallback(settled, promise, callback, detail) { + var hasCallback = isFunction(callback), + value = undefined, + error = undefined, + succeeded = undefined, + failed = undefined; + + if (hasCallback) { + value = tryCatch(callback, detail); + + if (value === TRY_CATCH_ERROR) { + failed = true; + error = value.error; + value = null; + } else { + succeeded = true; + } + + if (promise === value) { + reject(promise, withOwnPromise()); + return; + } + } else { + value = detail; + succeeded = true; + } + + if (promise._state !== PENDING) { + // noop + } else if (hasCallback && succeeded) { + resolve(promise, value); + } else if (failed) { + reject(promise, error); + } else if (settled === FULFILLED) { + fulfill(promise, value); + } else if (settled === REJECTED) { + reject(promise, value); + } + } + + function initializePromise(promise, resolver) { + var resolved = false; + try { + resolver(function (value) { + if (resolved) { + return; + } + resolved = true; + resolve(promise, value); + }, function (reason) { + if (resolved) { + return; + } + resolved = true; + reject(promise, reason); + }); + } catch (e) { + reject(promise, e); + } + } + + function then(onFulfillment, onRejection, label) { + var _arguments = arguments; + + var parent = this; + var state = parent._state; + + if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) { + config.instrument && instrument('chained', parent, parent); + return parent; + } + + parent._onError = null; + + var child = new parent.constructor(noop, label); + var result = parent._result; + + config.instrument && instrument('chained', parent, child); + + if (state) { + (function () { + var callback = _arguments[state - 1]; + config.async(function () { + return invokeCallback(state, child, callback, result); + }); + })(); + } else { + subscribe(parent, child, onFulfillment, onRejection); + } + + return child; + } + + function makeSettledResult(state, position, value) { + if (state === FULFILLED) { + return { + state: 'fulfilled', + value: value + }; + } else { + return { + state: 'rejected', + reason: value + }; + } + } + + function Enumerator(Constructor, input, abortOnReject, label) { + this._instanceConstructor = Constructor; + this.promise = new Constructor(noop, label); + this._abortOnReject = abortOnReject; + + if (this._validateInput(input)) { + this._input = input; + this.length = input.length; + this._remaining = input.length; + + this._init(); + + if (this.length === 0) { + fulfill(this.promise, this._result); + } else { + this.length = this.length || 0; + this._enumerate(); + if (this._remaining === 0) { + fulfill(this.promise, this._result); + } + } + } else { + reject(this.promise, this._validationError()); + } + } + + Enumerator.prototype._validateInput = function (input) { + return isArray(input); + }; + + Enumerator.prototype._validationError = function () { + return new Error('Array Methods must be provided an Array'); + }; + + Enumerator.prototype._init = function () { + this._result = new Array(this.length); + }; + + Enumerator.prototype._enumerate = function () { + var length = this.length; + var promise = this.promise; + var input = this._input; + + for (var i = 0; promise._state === PENDING && i < length; i++) { + this._eachEntry(input[i], i); + } + }; + + Enumerator.prototype._settleMaybeThenable = function (entry, i) { + var c = this._instanceConstructor; + var resolve = c.resolve; + + if (resolve === resolve$1) { + var then$$ = getThen(entry); + + if (then$$ === then && entry._state !== PENDING) { + entry._onError = null; + this._settledAt(entry._state, i, entry._result); + } else if (typeof then$$ !== 'function') { + this._remaining--; + this._result[i] = this._makeResult(FULFILLED, i, entry); + } else if (c === Promise) { + var promise = new c(noop); + handleMaybeThenable(promise, entry, then$$); + this._willSettleAt(promise, i); + } else { + this._willSettleAt(new c(function (resolve) { + return resolve(entry); + }), i); + } + } else { + this._willSettleAt(resolve(entry), i); + } + }; + + Enumerator.prototype._eachEntry = function (entry, i) { + if (isMaybeThenable(entry)) { + this._settleMaybeThenable(entry, i); + } else { + this._remaining--; + this._result[i] = this._makeResult(FULFILLED, i, entry); + } + }; + + Enumerator.prototype._settledAt = function (state, i, value) { + var promise = this.promise; + + if (promise._state === PENDING) { + this._remaining--; + + if (this._abortOnReject && state === REJECTED) { + reject(promise, value); + } else { + this._result[i] = this._makeResult(state, i, value); + } + } + + if (this._remaining === 0) { + fulfill(promise, this._result); + } + }; + + Enumerator.prototype._makeResult = function (state, i, value) { + return value; + }; + + Enumerator.prototype._willSettleAt = function (promise, i) { + var enumerator = this; + + subscribe(promise, undefined, function (value) { + return enumerator._settledAt(FULFILLED, i, value); + }, function (reason) { + return enumerator._settledAt(REJECTED, i, reason); + }); + }; + + /** + `RSVP.Promise.all` accepts an array of promises, and returns a new promise which + is fulfilled with an array of fulfillment values for the passed promises, or + rejected with the reason of the first passed promise to be rejected. It casts all + elements of the passed iterable to promises as it runs this algorithm. + + Example: + + ```javascript + let promise1 = RSVP.resolve(1); + let promise2 = RSVP.resolve(2); + let promise3 = RSVP.resolve(3); + let promises = [ promise1, promise2, promise3 ]; + + RSVP.Promise.all(promises).then(function(array){ + // The array here would be [ 1, 2, 3 ]; + }); + ``` + + If any of the `promises` given to `RSVP.all` are rejected, the first promise + that is rejected will be given as an argument to the returned promises's + rejection handler. For example: + + Example: + + ```javascript + let promise1 = RSVP.resolve(1); + let promise2 = RSVP.reject(new Error("2")); + let promise3 = RSVP.reject(new Error("3")); + let promises = [ promise1, promise2, promise3 ]; + + RSVP.Promise.all(promises).then(function(array){ + // Code here never runs because there are rejected promises! + }, function(error) { + // error.message === "2" + }); + ``` + + @method all + @static + @param {Array} entries array of promises + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled when all `promises` have been + fulfilled, or rejected if any of them become rejected. + @static + */ + function all(entries, label) { + return new Enumerator(this, entries, true, /* abort on reject */label).promise; + } + + /** + `RSVP.Promise.race` returns a new promise which is settled in the same way as the + first passed promise to settle. + + Example: + + ```javascript + let promise1 = new RSVP.Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new RSVP.Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 2'); + }, 100); + }); + + RSVP.Promise.race([promise1, promise2]).then(function(result){ + // result === 'promise 2' because it was resolved before promise1 + // was resolved. + }); + ``` + + `RSVP.Promise.race` is deterministic in that only the state of the first + settled promise matters. For example, even if other promises given to the + `promises` array argument are resolved, but the first settled promise has + become rejected before the other promises became fulfilled, the returned + promise will become rejected: + + ```javascript + let promise1 = new RSVP.Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new RSVP.Promise(function(resolve, reject){ + setTimeout(function(){ + reject(new Error('promise 2')); + }, 100); + }); + + RSVP.Promise.race([promise1, promise2]).then(function(result){ + // Code here never runs + }, function(reason){ + // reason.message === 'promise 2' because promise 2 became rejected before + // promise 1 became fulfilled + }); + ``` + + An example real-world use case is implementing timeouts: + + ```javascript + RSVP.Promise.race([ajax('foo.json'), timeout(5000)]) + ``` + + @method race + @static + @param {Array} entries array of promises to observe + @param {String} label optional string for describing the promise returned. + Useful for tooling. + @return {Promise} a promise which settles in the same way as the first passed + promise to settle. + */ + function race(entries, label) { + /*jshint validthis:true */ + var Constructor = this; + + var promise = new Constructor(noop, label); + + if (!isArray(entries)) { + reject(promise, new TypeError('You must pass an array to race.')); + return promise; + } + + for (var i = 0; promise._state === PENDING && i < entries.length; i++) { + subscribe(Constructor.resolve(entries[i]), undefined, function (value) { + return resolve(promise, value); + }, function (reason) { + return reject(promise, reason); + }); + } + + return promise; + } + + /** + `RSVP.Promise.reject` returns a promise rejected with the passed `reason`. + It is shorthand for the following: + + ```javascript + let promise = new RSVP.Promise(function(resolve, reject){ + reject(new Error('WHOOPS')); + }); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = RSVP.Promise.reject(new Error('WHOOPS')); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + @method reject + @static + @param {*} reason value that the returned promise will be rejected with. + @param {String} label optional string for identifying the returned promise. + Useful for tooling. + @return {Promise} a promise rejected with the given `reason`. + */ + function reject$1(reason, label) { + /*jshint validthis:true */ + var Constructor = this; + var promise = new Constructor(noop, label); + reject(promise, reason); + return promise; + } + + var guidKey = 'rsvp_' + now() + '-'; + var counter = 0; + + function needsResolver() { + throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); + } + + function needsNew() { + throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); + } + + /** + Promise objects represent the eventual result of an asynchronous operation. The + primary way of interacting with a promise is through its `then` method, which + registers callbacks to receive either a promise’s eventual value or the reason + why the promise cannot be fulfilled. + + Terminology + ----------- + + - `promise` is an object or function with a `then` method whose behavior conforms to this specification. + - `thenable` is an object or function that defines a `then` method. + - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). + - `exception` is a value that is thrown using the throw statement. + - `reason` is a value that indicates why a promise was rejected. + - `settled` the final resting state of a promise, fulfilled or rejected. + + A promise can be in one of three states: pending, fulfilled, or rejected. + + Promises that are fulfilled have a fulfillment value and are in the fulfilled + state. Promises that are rejected have a rejection reason and are in the + rejected state. A fulfillment value is never a thenable. + + Promises can also be said to *resolve* a value. If this value is also a + promise, then the original promise's settled state will match the value's + settled state. So a promise that *resolves* a promise that rejects will + itself reject, and a promise that *resolves* a promise that fulfills will + itself fulfill. + + + Basic Usage: + ------------ + + ```js + let promise = new Promise(function(resolve, reject) { + // on success + resolve(value); + + // on failure + reject(reason); + }); + + promise.then(function(value) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Advanced Usage: + --------------- + + Promises shine when abstracting away asynchronous interactions such as + `XMLHttpRequest`s. + + ```js + function getJSON(url) { + return new Promise(function(resolve, reject){ + let xhr = new XMLHttpRequest(); + + xhr.open('GET', url); + xhr.onreadystatechange = handler; + xhr.responseType = 'json'; + xhr.setRequestHeader('Accept', 'application/json'); + xhr.send(); + + function handler() { + if (this.readyState === this.DONE) { + if (this.status === 200) { + resolve(this.response); + } else { + reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); + } + } + }; + }); + } + + getJSON('/posts.json').then(function(json) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Unlike callbacks, promises are great composable primitives. + + ```js + Promise.all([ + getJSON('/posts'), + getJSON('/comments') + ]).then(function(values){ + values[0] // => postsJSON + values[1] // => commentsJSON + + return values; + }); + ``` + + @class RSVP.Promise + @param {function} resolver + @param {String} label optional string for labeling the promise. + Useful for tooling. + @constructor + */ + function Promise(resolver, label) { + this._id = counter++; + this._label = label; + this._state = undefined; + this._result = undefined; + this._subscribers = []; + + config.instrument && instrument('created', this); + + if (noop !== resolver) { + typeof resolver !== 'function' && needsResolver(); + this instanceof Promise ? initializePromise(this, resolver) : needsNew(); + } + } + + Promise.cast = resolve$1; // deprecated + Promise.all = all; + Promise.race = race; + Promise.resolve = resolve$1; + Promise.reject = reject$1; + + Promise.prototype = { + constructor: Promise, + + _guidKey: guidKey, + + _onError: function _onError(reason) { + var promise = this; + config.after(function () { + if (promise._onError) { + config['trigger']('error', reason, promise._label); + } + }); + }, + + /** + The primary way of interacting with a promise is through its `then` method, + which registers callbacks to receive either a promise's eventual value or the + reason why the promise cannot be fulfilled. + + ```js + findUser().then(function(user){ + // user is available + }, function(reason){ + // user is unavailable, and you are given the reason why + }); + ``` + + Chaining + -------- + + The return value of `then` is itself a promise. This second, 'downstream' + promise is resolved with the return value of the first promise's fulfillment + or rejection handler, or rejected if the handler throws an exception. + + ```js + findUser().then(function (user) { + return user.name; + }, function (reason) { + return 'default name'; + }).then(function (userName) { + // If `findUser` fulfilled, `userName` will be the user's name, otherwise it + // will be `'default name'` + }); + + findUser().then(function (user) { + throw new Error('Found user, but still unhappy'); + }, function (reason) { + throw new Error('`findUser` rejected and we\'re unhappy'); + }).then(function (value) { + // never reached + }, function (reason) { + // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. + // If `findUser` rejected, `reason` will be '`findUser` rejected and we\'re unhappy'. + }); + ``` + If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. + + ```js + findUser().then(function (user) { + throw new PedagogicalException('Upstream error'); + }).then(function (value) { + // never reached + }).then(function (value) { + // never reached + }, function (reason) { + // The `PedgagocialException` is propagated all the way down to here + }); + ``` + + Assimilation + ------------ + + Sometimes the value you want to propagate to a downstream promise can only be + retrieved asynchronously. This can be achieved by returning a promise in the + fulfillment or rejection handler. The downstream promise will then be pending + until the returned promise is settled. This is called *assimilation*. + + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // The user's comments are now available + }); + ``` + + If the assimliated promise rejects, then the downstream promise will also reject. + + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // If `findCommentsByAuthor` fulfills, we'll have the value here + }, function (reason) { + // If `findCommentsByAuthor` rejects, we'll have the reason here + }); + ``` + + Simple Example + -------------- + + Synchronous Example + + ```javascript + let result; + + try { + result = findResult(); + // success + } catch(reason) { + // failure + } + ``` + + Errback Example + + ```js + findResult(function(result, err){ + if (err) { + // failure + } else { + // success + } + }); + ``` + + Promise Example; + + ```javascript + findResult().then(function(result){ + // success + }, function(reason){ + // failure + }); + ``` + + Advanced Example + -------------- + + Synchronous Example + + ```javascript + let author, books; + + try { + author = findAuthor(); + books = findBooksByAuthor(author); + // success + } catch(reason) { + // failure + } + ``` + + Errback Example + + ```js + + function foundBooks(books) { + + } + + function failure(reason) { + + } + + findAuthor(function(author, err){ + if (err) { + failure(err); + // failure + } else { + try { + findBoooksByAuthor(author, function(books, err) { + if (err) { + failure(err); + } else { + try { + foundBooks(books); + } catch(reason) { + failure(reason); + } + } + }); + } catch(error) { + failure(err); + } + // success + } + }); + ``` + + Promise Example; + + ```javascript + findAuthor(). + then(findBooksByAuthor). + then(function(books){ + // found books + }).catch(function(reason){ + // something went wrong + }); + ``` + + @method then + @param {Function} onFulfillment + @param {Function} onRejection + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} + */ + then: then, + + /** + `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same + as the catch block of a try/catch statement. + + ```js + function findAuthor(){ + throw new Error('couldn\'t find that author'); + } + + // synchronous + try { + findAuthor(); + } catch(reason) { + // something went wrong + } + + // async with promises + findAuthor().catch(function(reason){ + // something went wrong + }); + ``` + + @method catch + @param {Function} onRejection + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} + */ + 'catch': function _catch(onRejection, label) { + return this.then(undefined, onRejection, label); + }, + + /** + `finally` will be invoked regardless of the promise's fate just as native + try/catch/finally behaves + + Synchronous example: + + ```js + findAuthor() { + if (Math.random() > 0.5) { + throw new Error(); + } + return new Author(); + } + + try { + return findAuthor(); // succeed or fail + } catch(error) { + return findOtherAuther(); + } finally { + // always runs + // doesn't affect the return value + } + ``` + + Asynchronous example: + + ```js + findAuthor().catch(function(reason){ + return findOtherAuther(); + }).finally(function(){ + // author was either found, or not + }); + ``` + + @method finally + @param {Function} callback + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} + */ + 'finally': function _finally(callback, label) { + var promise = this; + var constructor = promise.constructor; + + return promise.then(function (value) { + return constructor.resolve(callback()).then(function () { + return value; + }); + }, function (reason) { + return constructor.resolve(callback()).then(function () { + throw reason; + }); + }, label); + } + }; + + function Result() { + this.value = undefined; + } + + var ERROR = new Result(); + var GET_THEN_ERROR$1 = new Result(); + + function getThen$1(obj) { + try { + return obj.then; + } catch (error) { + ERROR.value = error; + return ERROR; + } + } + + function tryApply(f, s, a) { + try { + f.apply(s, a); + } catch (error) { + ERROR.value = error; + return ERROR; + } + } + + function makeObject(_, argumentNames) { + var obj = {}; + var length = _.length; + var args = new Array(length); + + for (var x = 0; x < length; x++) { + args[x] = _[x]; + } + + for (var i = 0; i < argumentNames.length; i++) { + var _name = argumentNames[i]; + obj[_name] = args[i + 1]; + } + + return obj; + } + + function arrayResult(_) { + var length = _.length; + var args = new Array(length - 1); + + for (var i = 1; i < length; i++) { + args[i - 1] = _[i]; + } + + return args; + } + + function wrapThenable(_then, promise) { + return { + then: function then(onFulFillment, onRejection) { + return _then.call(promise, onFulFillment, onRejection); + } + }; + } + + /** + `RSVP.denodeify` takes a 'node-style' function and returns a function that + will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the + browser when you'd prefer to use promises over using callbacks. For example, + `denodeify` transforms the following: + + ```javascript + let fs = require('fs'); + + fs.readFile('myfile.txt', function(err, data){ + if (err) return handleError(err); + handleData(data); + }); + ``` + + into: + + ```javascript + let fs = require('fs'); + let readFile = RSVP.denodeify(fs.readFile); + + readFile('myfile.txt').then(handleData, handleError); + ``` + + If the node function has multiple success parameters, then `denodeify` + just returns the first one: + + ```javascript + let request = RSVP.denodeify(require('request')); + + request('http://example.com').then(function(res) { + // ... + }); + ``` + + However, if you need all success parameters, setting `denodeify`'s + second parameter to `true` causes it to return all success parameters + as an array: + + ```javascript + let request = RSVP.denodeify(require('request'), true); + + request('http://example.com').then(function(result) { + // result[0] -> res + // result[1] -> body + }); + ``` + + Or if you pass it an array with names it returns the parameters as a hash: + + ```javascript + let request = RSVP.denodeify(require('request'), ['res', 'body']); + + request('http://example.com').then(function(result) { + // result.res + // result.body + }); + ``` + + Sometimes you need to retain the `this`: + + ```javascript + let app = require('express')(); + let render = RSVP.denodeify(app.render.bind(app)); + ``` + + The denodified function inherits from the original function. It works in all + environments, except IE 10 and below. Consequently all properties of the original + function are available to you. However, any properties you change on the + denodeified function won't be changed on the original function. Example: + + ```javascript + let request = RSVP.denodeify(require('request')), + cookieJar = request.jar(); // <- Inheritance is used here + + request('http://example.com', {jar: cookieJar}).then(function(res) { + // cookieJar.cookies holds now the cookies returned by example.com + }); + ``` + + Using `denodeify` makes it easier to compose asynchronous operations instead + of using callbacks. For example, instead of: + + ```javascript + let fs = require('fs'); + + fs.readFile('myfile.txt', function(err, data){ + if (err) { ... } // Handle error + fs.writeFile('myfile2.txt', data, function(err){ + if (err) { ... } // Handle error + console.log('done') + }); + }); + ``` + + you can chain the operations together using `then` from the returned promise: + + ```javascript + let fs = require('fs'); + let readFile = RSVP.denodeify(fs.readFile); + let writeFile = RSVP.denodeify(fs.writeFile); + + readFile('myfile.txt').then(function(data){ + return writeFile('myfile2.txt', data); + }).then(function(){ + console.log('done') + }).catch(function(error){ + // Handle error + }); + ``` + + @method denodeify + @static + @for RSVP + @param {Function} nodeFunc a 'node-style' function that takes a callback as + its last argument. The callback expects an error to be passed as its first + argument (if an error occurred, otherwise null), and the value from the + operation as its second argument ('function(err, value){ }'). + @param {Boolean|Array} [options] An optional paramter that if set + to `true` causes the promise to fulfill with the callback's success arguments + as an array. This is useful if the node function has multiple success + paramters. If you set this paramter to an array with names, the promise will + fulfill with a hash with these names as keys and the success parameters as + values. + @return {Function} a function that wraps `nodeFunc` to return an + `RSVP.Promise` + @static + */ + function denodeify(nodeFunc, options) { + var fn = function fn() { + var self = this; + var l = arguments.length; + var args = new Array(l + 1); + var promiseInput = false; + + for (var i = 0; i < l; ++i) { + var arg = arguments[i]; + + if (!promiseInput) { + // TODO: clean this up + promiseInput = needsPromiseInput(arg); + if (promiseInput === GET_THEN_ERROR$1) { + var p = new Promise(noop); + reject(p, GET_THEN_ERROR$1.value); + return p; + } else if (promiseInput && promiseInput !== true) { + arg = wrapThenable(promiseInput, arg); + } + } + args[i] = arg; + } + + var promise = new Promise(noop); + + args[l] = function (err, val) { + if (err) reject(promise, err);else if (options === undefined) resolve(promise, val);else if (options === true) resolve(promise, arrayResult(arguments));else if (isArray(options)) resolve(promise, makeObject(arguments, options));else resolve(promise, val); + }; + + if (promiseInput) { + return handlePromiseInput(promise, args, nodeFunc, self); + } else { + return handleValueInput(promise, args, nodeFunc, self); + } + }; + + fn.__proto__ = nodeFunc; + + return fn; + } + + function handleValueInput(promise, args, nodeFunc, self) { + var result = tryApply(nodeFunc, self, args); + if (result === ERROR) { + reject(promise, result.value); + } + return promise; + } + + function handlePromiseInput(promise, args, nodeFunc, self) { + return Promise.all(args).then(function (args) { + var result = tryApply(nodeFunc, self, args); + if (result === ERROR) { + reject(promise, result.value); + } + return promise; + }); + } + + function needsPromiseInput(arg) { + if (arg && typeof arg === 'object') { + if (arg.constructor === Promise) { + return true; + } else { + return getThen$1(arg); + } + } else { + return false; + } + } + + /** + This is a convenient alias for `RSVP.Promise.all`. + + @method all + @static + @for RSVP + @param {Array} array Array of promises. + @param {String} label An optional label. This is useful + for tooling. + */ + function all$1(array, label) { + return Promise.all(array, label); + } + + function AllSettled(Constructor, entries, label) { + this._superConstructor(Constructor, entries, false, /* don't abort on reject */label); + } + + AllSettled.prototype = o_create(Enumerator.prototype); + AllSettled.prototype._superConstructor = Enumerator; + AllSettled.prototype._makeResult = makeSettledResult; + AllSettled.prototype._validationError = function () { + return new Error('allSettled must be called with an array'); + }; + + /** + `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing + a fail-fast method, it waits until all the promises have returned and + shows you all the results. This is useful if you want to handle multiple + promises' failure states together as a set. + + Returns a promise that is fulfilled when all the given promises have been + settled. The return promise is fulfilled with an array of the states of + the promises passed into the `promises` array argument. + + Each state object will either indicate fulfillment or rejection, and + provide the corresponding value or reason. The states will take one of + the following formats: + + ```javascript + { state: 'fulfilled', value: value } + or + { state: 'rejected', reason: reason } + ``` + + Example: + + ```javascript + let promise1 = RSVP.Promise.resolve(1); + let promise2 = RSVP.Promise.reject(new Error('2')); + let promise3 = RSVP.Promise.reject(new Error('3')); + let promises = [ promise1, promise2, promise3 ]; + + RSVP.allSettled(promises).then(function(array){ + // array == [ + // { state: 'fulfilled', value: 1 }, + // { state: 'rejected', reason: Error }, + // { state: 'rejected', reason: Error } + // ] + // Note that for the second item, reason.message will be '2', and for the + // third item, reason.message will be '3'. + }, function(error) { + // Not run. (This block would only be called if allSettled had failed, + // for instance if passed an incorrect argument type.) + }); + ``` + + @method allSettled + @static + @for RSVP + @param {Array} entries + @param {String} label - optional string that describes the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled with an array of the settled + states of the constituent promises. + */ + function allSettled(entries, label) { + return new AllSettled(Promise, entries, label).promise; } - - if(this._locations.length === 0) { - return; + + /** + This is a convenient alias for `RSVP.Promise.race`. + + @method race + @static + @for RSVP + @param {Array} array Array of promises. + @param {String} label An optional label. This is useful + for tooling. + */ + function race$1(array, label) { + return Promise.race(array, label); + } + + function PromiseHash(Constructor, object, label) { + this._superConstructor(Constructor, object, true, label); + } + + PromiseHash.prototype = o_create(Enumerator.prototype); + PromiseHash.prototype._superConstructor = Enumerator; + PromiseHash.prototype._init = function () { + this._result = {}; + }; + + PromiseHash.prototype._validateInput = function (input) { + return input && typeof input === 'object'; + }; + + PromiseHash.prototype._validationError = function () { + return new Error('Promise.hash must be called with an object'); + }; + + PromiseHash.prototype._enumerate = function () { + var enumerator = this; + var promise = enumerator.promise; + var input = enumerator._input; + var results = []; + + for (var key in input) { + if (promise._state === PENDING && Object.prototype.hasOwnProperty.call(input, key)) { + results.push({ + position: key, + entry: input[key] + }); + } + } + + var length = results.length; + enumerator._remaining = length; + var result = undefined; + + for (var i = 0; promise._state === PENDING && i < length; i++) { + result = results[i]; + enumerator._eachEntry(result.entry, result.position); + } + }; + + /** + `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array + for its `promises` argument. + + Returns a promise that is fulfilled when all the given promises have been + fulfilled, or rejected if any of them become rejected. The returned promise + is fulfilled with a hash that has the same key names as the `promises` object + argument. If any of the values in the object are not promises, they will + simply be copied over to the fulfilled object. + + Example: + + ```javascript + let promises = { + myPromise: RSVP.resolve(1), + yourPromise: RSVP.resolve(2), + theirPromise: RSVP.resolve(3), + notAPromise: 4 + }; + + RSVP.hash(promises).then(function(hash){ + // hash here is an object that looks like: + // { + // myPromise: 1, + // yourPromise: 2, + // theirPromise: 3, + // notAPromise: 4 + // } + }); + ```` + + If any of the `promises` given to `RSVP.hash` are rejected, the first promise + that is rejected will be given as the reason to the rejection handler. + + Example: + + ```javascript + let promises = { + myPromise: RSVP.resolve(1), + rejectedPromise: RSVP.reject(new Error('rejectedPromise')), + anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')), + }; + + RSVP.hash(promises).then(function(hash){ + // Code here never runs because there are rejected promises! + }, function(reason) { + // reason.message === 'rejectedPromise' + }); + ``` + + An important note: `RSVP.hash` is intended for plain JavaScript objects that + are just a set of keys and values. `RSVP.hash` will NOT preserve prototype + chains. + + Example: + + ```javascript + function MyConstructor(){ + this.example = RSVP.resolve('Example'); + } + + MyConstructor.prototype = { + protoProperty: RSVP.resolve('Proto Property') + }; + + let myObject = new MyConstructor(); + + RSVP.hash(myObject).then(function(hash){ + // protoProperty will not be present, instead you will just have an + // object that looks like: + // { + // example: 'Example' + // } + // + // hash.hasOwnProperty('protoProperty'); // false + // 'undefined' === typeof hash.protoProperty + }); + ``` + + @method hash + @static + @for RSVP + @param {Object} object + @param {String} label optional string that describes the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled when all properties of `promises` + have been fulfilled, or rejected if any of them become rejected. + */ + function hash(object, label) { + return new PromiseHash(Promise, object, label).promise; + } + + function HashSettled(Constructor, object, label) { + this._superConstructor(Constructor, object, false, label); + } + + HashSettled.prototype = o_create(PromiseHash.prototype); + HashSettled.prototype._superConstructor = Enumerator; + HashSettled.prototype._makeResult = makeSettledResult; + + HashSettled.prototype._validationError = function () { + return new Error('hashSettled must be called with an object'); + }; + + /** + `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object + instead of an array for its `promises` argument. + + Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method, + but like `RSVP.allSettled`, `hashSettled` waits until all the + constituent promises have returned and then shows you all the results + with their states and values/reasons. This is useful if you want to + handle multiple promises' failure states together as a set. + + Returns a promise that is fulfilled when all the given promises have been + settled, or rejected if the passed parameters are invalid. + + The returned promise is fulfilled with a hash that has the same key names as + the `promises` object argument. If any of the values in the object are not + promises, they will be copied over to the fulfilled object and marked with state + 'fulfilled'. + + Example: + + ```javascript + let promises = { + myPromise: RSVP.Promise.resolve(1), + yourPromise: RSVP.Promise.resolve(2), + theirPromise: RSVP.Promise.resolve(3), + notAPromise: 4 + }; + + RSVP.hashSettled(promises).then(function(hash){ + // hash here is an object that looks like: + // { + // myPromise: { state: 'fulfilled', value: 1 }, + // yourPromise: { state: 'fulfilled', value: 2 }, + // theirPromise: { state: 'fulfilled', value: 3 }, + // notAPromise: { state: 'fulfilled', value: 4 } + // } + }); + ``` + + If any of the `promises` given to `RSVP.hash` are rejected, the state will + be set to 'rejected' and the reason for rejection provided. + + Example: + + ```javascript + let promises = { + myPromise: RSVP.Promise.resolve(1), + rejectedPromise: RSVP.Promise.reject(new Error('rejection')), + anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')), + }; + + RSVP.hashSettled(promises).then(function(hash){ + // hash here is an object that looks like: + // { + // myPromise: { state: 'fulfilled', value: 1 }, + // rejectedPromise: { state: 'rejected', reason: Error }, + // anotherRejectedPromise: { state: 'rejected', reason: Error }, + // } + // Note that for rejectedPromise, reason.message == 'rejection', + // and for anotherRejectedPromise, reason.message == 'more rejection'. + }); + ``` + + An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that + are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype + chains. + + Example: + + ```javascript + function MyConstructor(){ + this.example = RSVP.Promise.resolve('Example'); + } + + MyConstructor.prototype = { + protoProperty: RSVP.Promise.resolve('Proto Property') + }; + + let myObject = new MyConstructor(); + + RSVP.hashSettled(myObject).then(function(hash){ + // protoProperty will not be present, instead you will just have an + // object that looks like: + // { + // example: { state: 'fulfilled', value: 'Example' } + // } + // + // hash.hasOwnProperty('protoProperty'); // false + // 'undefined' === typeof hash.protoProperty + }); + ``` + + @method hashSettled + @for RSVP + @param {Object} object + @param {String} label optional string that describes the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled when when all properties of `promises` + have been settled. + @static + */ + function hashSettled(object, label) { + return new HashSettled(Promise, object, label).promise; } - - if(typeof curr == "string"){ - loc = this.locationFromCfi(curr); - this._current = loc; - } else { - loc = curr; + + function rethrow(reason) { + setTimeout(function () { + throw reason; + }); + throw reason; } - - this.trigger("changed", { - percentage: this.precentageFromLocation(loc) - }); -}; - -Object.defineProperty(Locations.prototype, 'currentLocation', { - get: function () { - return this._current; - }, - set: function (curr) { - this.setCurrent(curr); + + /** + `RSVP.defer` returns an object similar to jQuery's `$.Deferred`. + `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s + interface. New code should use the `RSVP.Promise` constructor instead. + + The object returned from `RSVP.defer` is a plain object with three properties: + + * promise - an `RSVP.Promise`. + * reject - a function that causes the `promise` property on this object to + become rejected + * resolve - a function that causes the `promise` property on this object to + become fulfilled. + + Example: + + ```javascript + let deferred = RSVP.defer(); + + deferred.resolve("Success!"); + + deferred.promise.then(function(value){ + // value here is "Success!" + }); + ``` + + @method defer + @static + @for RSVP + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Object} + */ + function defer(label) { + var deferred = { resolve: undefined, reject: undefined }; + + deferred.promise = new Promise(function (resolve, reject) { + deferred.resolve = resolve; + deferred.reject = reject; + }, label); + + return deferred; + } + + /** + `RSVP.map` is similar to JavaScript's native `map` method, except that it + waits for all promises to become fulfilled before running the `mapFn` on + each item in given to `promises`. `RSVP.map` returns a promise that will + become fulfilled with the result of running `mapFn` on the values the promises + become fulfilled with. + + For example: + + ```javascript + + let promise1 = RSVP.resolve(1); + let promise2 = RSVP.resolve(2); + let promise3 = RSVP.resolve(3); + let promises = [ promise1, promise2, promise3 ]; + + let mapFn = function(item){ + return item + 1; + }; + + RSVP.map(promises, mapFn).then(function(result){ + // result is [ 2, 3, 4 ] + }); + ``` + + If any of the `promises` given to `RSVP.map` are rejected, the first promise + that is rejected will be given as an argument to the returned promise's + rejection handler. For example: + + ```javascript + let promise1 = RSVP.resolve(1); + let promise2 = RSVP.reject(new Error('2')); + let promise3 = RSVP.reject(new Error('3')); + let promises = [ promise1, promise2, promise3 ]; + + let mapFn = function(item){ + return item + 1; + }; + + RSVP.map(promises, mapFn).then(function(array){ + // Code here never runs because there are rejected promises! + }, function(reason) { + // reason.message === '2' + }); + ``` + + `RSVP.map` will also wait if a promise is returned from `mapFn`. For example, + say you want to get all comments from a set of blog posts, but you need + the blog posts first because they contain a url to those comments. + + ```javscript + + let mapFn = function(blogPost){ + // getComments does some ajax and returns an RSVP.Promise that is fulfilled + // with some comments data + return getComments(blogPost.comments_url); + }; + + // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled + // with some blog post data + RSVP.map(getBlogPosts(), mapFn).then(function(comments){ + // comments is the result of asking the server for the comments + // of all blog posts returned from getBlogPosts() + }); + ``` + + @method map + @static + @for RSVP + @param {Array} promises + @param {Function} mapFn function to be called on each fulfilled promise. + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled with the result of calling + `mapFn` on each fulfilled promise or value when they become fulfilled. + The promise will be rejected if any of the given `promises` become rejected. + @static + */ + function map(promises, mapFn, label) { + return Promise.all(promises, label).then(function (values) { + if (!isFunction(mapFn)) { + throw new TypeError("You must pass a function as map's second argument."); + } + + var length = values.length; + var results = new Array(length); + + for (var i = 0; i < length; i++) { + results[i] = mapFn(values[i]); + } + + return Promise.all(results, label); + }); + } + + /** + This is a convenient alias for `RSVP.Promise.resolve`. + + @method resolve + @static + @for RSVP + @param {*} value value that the returned promise will be resolved with + @param {String} label optional string for identifying the returned promise. + Useful for tooling. + @return {Promise} a promise that will become fulfilled with the given + `value` + */ + function resolve$2(value, label) { + return Promise.resolve(value, label); } -}); - -RSVP.EventTarget.mixin(Locations.prototype); - -module.exports = Locations; - -},{"./core":10,"./epubcfi":11,"./queue":23,"rsvp":5}],15:[function(require,module,exports){ -var RSVP = require('rsvp'); -var core = require('../../core'); -var DefaultViewManager = require('../default'); - -function ContinuousViewManager(options) { - - DefaultViewManager.apply(this, arguments); // call super constructor. - - this.name = "continuous"; - - this.settings = core.extend(this.settings || {}, { - infinite: true, - overflow: "auto", - axis: "vertical", - offset: 500, - offsetDelta: 250, - width: undefined, - height: undefined - }); - - core.extend(this.settings, options.settings || {}); - - // Gap can be 0, byt defaults doesn't handle that - if (options.settings.gap != "undefined" && options.settings.gap === 0) { - this.settings.gap = options.settings.gap; + + /** + This is a convenient alias for `RSVP.Promise.reject`. + + @method reject + @static + @for RSVP + @param {*} reason value that the returned promise will be rejected with. + @param {String} label optional string for identifying the returned promise. + Useful for tooling. + @return {Promise} a promise rejected with the given `reason`. + */ + function reject$2(reason, label) { + return Promise.reject(reason, label); } - - // this.viewSettings.axis = this.settings.axis; - this.viewSettings = { - ignoreClass: this.settings.ignoreClass, - axis: this.settings.axis, - layout: this.layout, - width: 0, - height: 0 + + /** + `RSVP.filter` is similar to JavaScript's native `filter` method, except that it + waits for all promises to become fulfilled before running the `filterFn` on + each item in given to `promises`. `RSVP.filter` returns a promise that will + become fulfilled with the result of running `filterFn` on the values the + promises become fulfilled with. + + For example: + + ```javascript + + let promise1 = RSVP.resolve(1); + let promise2 = RSVP.resolve(2); + let promise3 = RSVP.resolve(3); + + let promises = [promise1, promise2, promise3]; + + let filterFn = function(item){ + return item > 1; + }; + + RSVP.filter(promises, filterFn).then(function(result){ + // result is [ 2, 3 ] + }); + ``` + + If any of the `promises` given to `RSVP.filter` are rejected, the first promise + that is rejected will be given as an argument to the returned promise's + rejection handler. For example: + + ```javascript + let promise1 = RSVP.resolve(1); + let promise2 = RSVP.reject(new Error('2')); + let promise3 = RSVP.reject(new Error('3')); + let promises = [ promise1, promise2, promise3 ]; + + let filterFn = function(item){ + return item > 1; + }; + + RSVP.filter(promises, filterFn).then(function(array){ + // Code here never runs because there are rejected promises! + }, function(reason) { + // reason.message === '2' + }); + ``` + + `RSVP.filter` will also wait for any promises returned from `filterFn`. + For instance, you may want to fetch a list of users then return a subset + of those users based on some asynchronous operation: + + ```javascript + + let alice = { name: 'alice' }; + let bob = { name: 'bob' }; + let users = [ alice, bob ]; + + let promises = users.map(function(user){ + return RSVP.resolve(user); + }); + + let filterFn = function(user){ + // Here, Alice has permissions to create a blog post, but Bob does not. + return getPrivilegesForUser(user).then(function(privs){ + return privs.can_create_blog_post === true; + }); + }; + RSVP.filter(promises, filterFn).then(function(users){ + // true, because the server told us only Alice can create a blog post. + users.length === 1; + // false, because Alice is the only user present in `users` + users[0] === bob; + }); + ``` + + @method filter + @static + @for RSVP + @param {Array} promises + @param {Function} filterFn - function to be called on each resolved value to + filter the final results. + @param {String} label optional string describing the promise. Useful for + tooling. + @return {Promise} + */ + + function resolveAll(promises, label) { + return Promise.all(promises, label); + } + + function resolveSingle(promise, label) { + return Promise.resolve(promise, label).then(function (promises) { + return resolveAll(promises, label); + }); + } + function filter(promises, filterFn, label) { + var promise = isArray(promises) ? resolveAll(promises, label) : resolveSingle(promises, label); + return promise.then(function (values) { + if (!isFunction(filterFn)) { + throw new TypeError("You must pass a function as filter's second argument."); + } + + var length = values.length; + var filtered = new Array(length); + + for (var i = 0; i < length; i++) { + filtered[i] = filterFn(values[i]); + } + + return resolveAll(filtered, label).then(function (filtered) { + var results = new Array(length); + var newLength = 0; + + for (var i = 0; i < length; i++) { + if (filtered[i]) { + results[newLength] = values[i]; + newLength++; + } + } + + results.length = newLength; + + return results; + }); + }); + } + + var len = 0; + var vertxNext = undefined; + function asap(callback, arg) { + queue$1[len] = callback; + queue$1[len + 1] = arg; + len += 2; + if (len === 2) { + // If len is 1, that means that we need to schedule an async flush. + // If additional callbacks are queued before the queue is flushed, they + // will be processed by this flush that we are scheduling. + scheduleFlush$1(); + } + } + + var browserWindow = typeof window !== 'undefined' ? window : undefined; + var browserGlobal = browserWindow || {}; + var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; + var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]'; + + // test for web worker but not in IE10 + var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; + + // node + function useNextTick() { + var nextTick = process.nextTick; + // node version 0.10.x displays a deprecation warning when nextTick is used recursively + // setImmediate should be used instead instead + var version = process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/); + if (Array.isArray(version) && version[1] === '0' && version[2] === '10') { + nextTick = setImmediate; + } + return function () { + return nextTick(flush); + }; + } + + // vertx + function useVertxTimer() { + return function () { + return vertxNext(flush); + }; + } + + function useMutationObserver() { + var iterations = 0; + var observer = new BrowserMutationObserver(flush); + var node = document.createTextNode(''); + observer.observe(node, { characterData: true }); + + return function () { + return node.data = iterations = ++iterations % 2; + }; + } + + // web worker + function useMessageChannel() { + var channel = new MessageChannel(); + channel.port1.onmessage = flush; + return function () { + return channel.port2.postMessage(0); + }; + } + + function useSetTimeout() { + return function () { + return setTimeout(flush, 1); + }; + } + + var queue$1 = new Array(1000); + + function flush() { + for (var i = 0; i < len; i += 2) { + var callback = queue$1[i]; + var arg = queue$1[i + 1]; + + callback(arg); + + queue$1[i] = undefined; + queue$1[i + 1] = undefined; + } + + len = 0; + } + + function attemptVertex() { + try { + var r = require; + var vertx = __webpack_require__(5); + vertxNext = vertx.runOnLoop || vertx.runOnContext; + return useVertxTimer(); + } catch (e) { + return useSetTimeout(); + } + } + + var scheduleFlush$1 = undefined; + // Decide what async method to use to triggering processing of queued callbacks: + if (isNode) { + scheduleFlush$1 = useNextTick(); + } else if (BrowserMutationObserver) { + scheduleFlush$1 = useMutationObserver(); + } else if (isWorker) { + scheduleFlush$1 = useMessageChannel(); + } else if (browserWindow === undefined && "function" === 'function') { + scheduleFlush$1 = attemptVertex(); + } else { + scheduleFlush$1 = useSetTimeout(); + } + + var platform = undefined; + + /* global self */ + if (typeof self === 'object') { + platform = self; + + /* global global */ + } else if (typeof global === 'object') { + platform = global; + } else { + throw new Error('no global: `self` or `global` found'); + } + + var _async$filter; + + function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + // defaults + + // the default export here is for backwards compat: + // https://github.com/tildeio/rsvp.js/issues/434 + config.async = asap; + config.after = function (cb) { + return setTimeout(cb, 0); }; - - this.scrollTop = 0; - this.scrollLeft = 0; -}; - -// subclass extends superclass -ContinuousViewManager.prototype = Object.create(DefaultViewManager.prototype); -ContinuousViewManager.prototype.constructor = ContinuousViewManager; - -ContinuousViewManager.prototype.display = function(section, target){ - return DefaultViewManager.prototype.display.call(this, section, target) - .then(function () { - return this.fill(); - }.bind(this)); -}; - -ContinuousViewManager.prototype.fill = function(_full){ - var full = _full || new RSVP.defer(); - - this.check().then(function(result) { - if (result) { - this.fill(full); + var cast = resolve$2; + + var async = function async(callback, arg) { + return config.async(callback, arg); + }; + + function on() { + config['on'].apply(config, arguments); + } + + function off() { + config['off'].apply(config, arguments); + } + + // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__` + if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') { + var callbacks = window['__PROMISE_INSTRUMENTATION__']; + configure('instrument', true); + for (var eventName in callbacks) { + if (callbacks.hasOwnProperty(eventName)) { + on(eventName, callbacks[eventName]); + } + } + }var rsvp = (_async$filter = { + cast: cast, + Promise: Promise, + EventTarget: EventTarget, + all: all$1, + allSettled: allSettled, + race: race$1, + hash: hash, + hashSettled: hashSettled, + rethrow: rethrow, + defer: defer, + denodeify: denodeify, + configure: configure, + on: on, + off: off, + resolve: resolve$2, + reject: reject$2, + map: map + }, _defineProperty(_async$filter, 'async', async), _defineProperty(_async$filter, 'filter', // babel seems to error if async isn't a computed prop here... + filter), _async$filter); + + exports['default'] = rsvp; + exports.cast = cast; + exports.Promise = Promise; + exports.EventTarget = EventTarget; + exports.all = all$1; + exports.allSettled = allSettled; + exports.race = race$1; + exports.hash = hash; + exports.hashSettled = hashSettled; + exports.rethrow = rethrow; + exports.defer = defer; + exports.denodeify = denodeify; + exports.configure = configure; + exports.on = on; + exports.off = off; + exports.resolve = resolve$2; + exports.reject = reject$2; + exports.map = map; + exports.async = async; + exports.filter = filter; + + Object.defineProperty(exports, '__esModule', { value: true }); + + }))); + //# sourceMappingURL=rsvp.map + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(4).setImmediate, (function() { return this; }()))) + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + // shim for using process in browser + var process = module.exports = {}; + + // cached from whatever global is present so that test runners that stub it + // don't break things. But we need to wrap it in a try catch in case it is + // wrapped in strict mode code which doesn't define any globals. It's inside a + // function because try/catches deoptimize in certain engines. + + var cachedSetTimeout; + var cachedClearTimeout; + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); + } + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + } ()) + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() {} + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { return '/' }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function() { return 0; }; + + +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(setImmediate, clearImmediate) {var nextTick = __webpack_require__(3).nextTick; + var apply = Function.prototype.apply; + var slice = Array.prototype.slice; + var immediateIds = {}; + var nextImmediateId = 0; + + // DOM APIs, for completeness + + exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); + }; + exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); + }; + exports.clearTimeout = + exports.clearInterval = function(timeout) { timeout.close(); }; + + function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; + } + Timeout.prototype.unref = Timeout.prototype.ref = function() {}; + Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); + }; + + // Does not start the time, just sets up the members needed. + exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; + }; + + exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; + }; + + exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } + }; + + // That's not how node.js implements it but the exposed api is the same. + exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; + }; + + exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; + }; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4).setImmediate, __webpack_require__(4).clearImmediate)) + +/***/ }, +/* 5 */ +/***/ function(module, exports) { + + /* (ignored) */ + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + /*! + * URI.js - Mutating URLs + * + * Version: 1.18.1 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ + (function (root, factory) { + 'use strict'; + // https://github.com/umdjs/umd/blob/master/returnExports.js + if (true) { + // Node + module.exports = factory(__webpack_require__(7), __webpack_require__(9), __webpack_require__(10)); + } else if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['./punycode', './IPv6', './SecondLevelDomains'], factory); + } else { + // Browser globals (root is window) + root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root); + } + }(this, function (punycode, IPv6, SLD, root) { + 'use strict'; + /*global location, escape, unescape */ + // FIXME: v2.0.0 renamce non-camelCase properties to uppercase + /*jshint camelcase: false */ + + // save current URI variable, if any + var _URI = root && root.URI; + + function URI(url, base) { + var _urlSupplied = arguments.length >= 1; + var _baseSupplied = arguments.length >= 2; + + // Allow instantiation without the 'new' keyword + if (!(this instanceof URI)) { + if (_urlSupplied) { + if (_baseSupplied) { + return new URI(url, base); + } + + return new URI(url); + } + + return new URI(); + } + + if (url === undefined) { + if (_urlSupplied) { + throw new TypeError('undefined is not a valid argument for URI'); + } + + if (typeof location !== 'undefined') { + url = location.href + ''; + } else { + url = ''; + } + } + + this.href(url); + + // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor + if (base !== undefined) { + return this.absoluteTo(base); + } + + return this; + } + + URI.version = '1.18.1'; + + var p = URI.prototype; + var hasOwn = Object.prototype.hasOwnProperty; + + function escapeRegEx(string) { + // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963 + return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); + } + + function getType(value) { + // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value + if (value === undefined) { + return 'Undefined'; + } + + return String(Object.prototype.toString.call(value)).slice(8, -1); + } + + function isArray(obj) { + return getType(obj) === 'Array'; + } + + function filterArrayValues(data, value) { + var lookup = {}; + var i, length; + + if (getType(value) === 'RegExp') { + lookup = null; + } else if (isArray(value)) { + for (i = 0, length = value.length; i < length; i++) { + lookup[value[i]] = true; + } + } else { + lookup[value] = true; + } + + for (i = 0, length = data.length; i < length; i++) { + /*jshint laxbreak: true */ + var _match = lookup && lookup[data[i]] !== undefined + || !lookup && value.test(data[i]); + /*jshint laxbreak: false */ + if (_match) { + data.splice(i, 1); + length--; + i--; + } + } + + return data; + } + + function arrayContains(list, value) { + var i, length; + + // value may be string, number, array, regexp + if (isArray(value)) { + // Note: this can be optimized to O(n) (instead of current O(m * n)) + for (i = 0, length = value.length; i < length; i++) { + if (!arrayContains(list, value[i])) { + return false; + } + } + + return true; + } + + var _type = getType(value); + for (i = 0, length = list.length; i < length; i++) { + if (_type === 'RegExp') { + if (typeof list[i] === 'string' && list[i].match(value)) { + return true; + } + } else if (list[i] === value) { + return true; + } + } + + return false; + } + + function arraysEqual(one, two) { + if (!isArray(one) || !isArray(two)) { + return false; + } + + // arrays can't be equal if they have different amount of content + if (one.length !== two.length) { + return false; + } + + one.sort(); + two.sort(); + + for (var i = 0, l = one.length; i < l; i++) { + if (one[i] !== two[i]) { + return false; + } + } + + return true; + } + + function trimSlashes(text) { + var trim_expression = /^\/+|\/+$/g; + return text.replace(trim_expression, ''); + } + + URI._parts = function() { + return { + protocol: null, + username: null, + password: null, + hostname: null, + urn: null, + port: null, + path: null, + query: null, + fragment: null, + // state + duplicateQueryParameters: URI.duplicateQueryParameters, + escapeQuerySpace: URI.escapeQuerySpace + }; + }; + // state: allow duplicate query parameters (a=1&a=1) + URI.duplicateQueryParameters = false; + // state: replaces + with %20 (space in query strings) + URI.escapeQuerySpace = true; + // static properties + URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i; + URI.idn_expression = /[^a-z0-9\.-]/i; + URI.punycode_expression = /(xn--)/i; + // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care? + URI.ip4_expression = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; + // credits to Rich Brown + // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096 + // specification: http://www.ietf.org/rfc/rfc4291.txt + URI.ip6_expression = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/; + // expression used is "gruber revised" (@gruber v2) determined to be the + // best solution in a regex-golf we did a couple of ages ago at + // * http://mathiasbynens.be/demo/url-regex + // * http://rodneyrehm.de/t/url-regex.html + URI.find_uri_expression = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig; + URI.findUri = { + // valid "scheme://" or "www." + start: /\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi, + // everything up to the next whitespace + end: /[\s\r\n]|$/, + // trim trailing punctuation captured by end RegExp + trim: /[`!()\[\]{};:'".,<>?«»“”„‘’]+$/ + }; + // http://www.iana.org/assignments/uri-schemes.html + // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports + URI.defaultPorts = { + http: '80', + https: '443', + ftp: '21', + gopher: '70', + ws: '80', + wss: '443' + }; + // allowed hostname characters according to RFC 3986 + // ALPHA DIGIT "-" "." "_" "~" "!" "$" "&" "'" "(" ")" "*" "+" "," ";" "=" %encoded + // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . - + URI.invalid_hostname_characters = /[^a-zA-Z0-9\.-]/; + // map DOM Elements to their URI attribute + URI.domAttributes = { + 'a': 'href', + 'blockquote': 'cite', + 'link': 'href', + 'base': 'href', + 'script': 'src', + 'form': 'action', + 'img': 'src', + 'area': 'href', + 'iframe': 'src', + 'embed': 'src', + 'source': 'src', + 'track': 'src', + 'input': 'src', // but only if type="image" + 'audio': 'src', + 'video': 'src' + }; + URI.getDomAttribute = function(node) { + if (!node || !node.nodeName) { + return undefined; + } + + var nodeName = node.nodeName.toLowerCase(); + // should only expose src for type="image" + if (nodeName === 'input' && node.type !== 'image') { + return undefined; + } + + return URI.domAttributes[nodeName]; + }; + + function escapeForDumbFirefox36(value) { + // https://github.com/medialize/URI.js/issues/91 + return escape(value); + } + + // encoding / decoding according to RFC3986 + function strictEncodeURIComponent(string) { + // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent + return encodeURIComponent(string) + .replace(/[!'()*]/g, escapeForDumbFirefox36) + .replace(/\*/g, '%2A'); + } + URI.encode = strictEncodeURIComponent; + URI.decode = decodeURIComponent; + URI.iso8859 = function() { + URI.encode = escape; + URI.decode = unescape; + }; + URI.unicode = function() { + URI.encode = strictEncodeURIComponent; + URI.decode = decodeURIComponent; + }; + URI.characters = { + pathname: { + encode: { + // RFC3986 2.1: For consistency, URI producers and normalizers should + // use uppercase hexadecimal digits for all percent-encodings. + expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig, + map: { + // -._~!'()* + '%24': '$', + '%26': '&', + '%2B': '+', + '%2C': ',', + '%3B': ';', + '%3D': '=', + '%3A': ':', + '%40': '@' + } + }, + decode: { + expression: /[\/\?#]/g, + map: { + '/': '%2F', + '?': '%3F', + '#': '%23' + } + } + }, + reserved: { + encode: { + // RFC3986 2.1: For consistency, URI producers and normalizers should + // use uppercase hexadecimal digits for all percent-encodings. + expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig, + map: { + // gen-delims + '%3A': ':', + '%2F': '/', + '%3F': '?', + '%23': '#', + '%5B': '[', + '%5D': ']', + '%40': '@', + // sub-delims + '%21': '!', + '%24': '$', + '%26': '&', + '%27': '\'', + '%28': '(', + '%29': ')', + '%2A': '*', + '%2B': '+', + '%2C': ',', + '%3B': ';', + '%3D': '=' + } + } + }, + urnpath: { + // The characters under `encode` are the characters called out by RFC 2141 as being acceptable + // for usage in a URN. RFC2141 also calls out "-", ".", and "_" as acceptable characters, but + // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also + // note that the colon character is not featured in the encoding map; this is because URI.js + // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it + // should not appear unencoded in a segment itself. + // See also the note above about RFC3986 and capitalalized hex digits. + encode: { + expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig, + map: { + '%21': '!', + '%24': '$', + '%27': '\'', + '%28': '(', + '%29': ')', + '%2A': '*', + '%2B': '+', + '%2C': ',', + '%3B': ';', + '%3D': '=', + '%40': '@' + } + }, + // These characters are the characters called out by RFC2141 as "reserved" characters that + // should never appear in a URN, plus the colon character (see note above). + decode: { + expression: /[\/\?#:]/g, + map: { + '/': '%2F', + '?': '%3F', + '#': '%23', + ':': '%3A' + } + } + } + }; + URI.encodeQuery = function(string, escapeQuerySpace) { + var escaped = URI.encode(string + ''); + if (escapeQuerySpace === undefined) { + escapeQuerySpace = URI.escapeQuerySpace; + } + + return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped; + }; + URI.decodeQuery = function(string, escapeQuerySpace) { + string += ''; + if (escapeQuerySpace === undefined) { + escapeQuerySpace = URI.escapeQuerySpace; + } + + try { + return URI.decode(escapeQuerySpace ? string.replace(/\+/g, '%20') : string); + } catch(e) { + // we're not going to mess with weird encodings, + // give up and return the undecoded original string + // see https://github.com/medialize/URI.js/issues/87 + // see https://github.com/medialize/URI.js/issues/92 + return string; + } + }; + // generate encode/decode path functions + var _parts = {'encode':'encode', 'decode':'decode'}; + var _part; + var generateAccessor = function(_group, _part) { + return function(string) { + try { + return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) { + return URI.characters[_group][_part].map[c]; + }); + } catch (e) { + // we're not going to mess with weird encodings, + // give up and return the undecoded original string + // see https://github.com/medialize/URI.js/issues/87 + // see https://github.com/medialize/URI.js/issues/92 + return string; + } + }; + }; + + for (_part in _parts) { + URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]); + URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]); + } + + var generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) { + return function(string) { + // Why pass in names of functions, rather than the function objects themselves? The + // definitions of some functions (but in particular, URI.decode) will occasionally change due + // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure + // that the functions we use here are "fresh". + var actualCodingFunc; + if (!_innerCodingFuncName) { + actualCodingFunc = URI[_codingFuncName]; + } else { + actualCodingFunc = function(string) { + return URI[_codingFuncName](URI[_innerCodingFuncName](string)); + }; + } + + var segments = (string + '').split(_sep); + + for (var i = 0, length = segments.length; i < length; i++) { + segments[i] = actualCodingFunc(segments[i]); + } + + return segments.join(_sep); + }; + }; + + // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions. + URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment'); + URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment'); + URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode'); + URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode'); + + URI.encodeReserved = generateAccessor('reserved', 'encode'); + + URI.parse = function(string, parts) { + var pos; + if (!parts) { + parts = {}; + } + // [protocol"://"[username[":"password]"@"]hostname[":"port]"/"?][path]["?"querystring]["#"fragment] + + // extract fragment + pos = string.indexOf('#'); + if (pos > -1) { + // escaping? + parts.fragment = string.substring(pos + 1) || null; + string = string.substring(0, pos); + } + + // extract query + pos = string.indexOf('?'); + if (pos > -1) { + // escaping? + parts.query = string.substring(pos + 1) || null; + string = string.substring(0, pos); + } + + // extract protocol + if (string.substring(0, 2) === '//') { + // relative-scheme + parts.protocol = null; + string = string.substring(2); + // extract "user:pass@host:port" + string = URI.parseAuthority(string, parts); + } else { + pos = string.indexOf(':'); + if (pos > -1) { + parts.protocol = string.substring(0, pos) || null; + if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) { + // : may be within the path + parts.protocol = undefined; + } else if (string.substring(pos + 1, pos + 3) === '//') { + string = string.substring(pos + 3); + + // extract "user:pass@host:port" + string = URI.parseAuthority(string, parts); + } else { + string = string.substring(pos + 1); + parts.urn = true; + } + } + } + + // what's left must be the path + parts.path = string; + + // and we're done + return parts; + }; + URI.parseHost = function(string, parts) { + // Copy chrome, IE, opera backslash-handling behavior. + // Back slashes before the query string get converted to forward slashes + // See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124 + // See: https://code.google.com/p/chromium/issues/detail?id=25916 + // https://github.com/medialize/URI.js/pull/233 + string = string.replace(/\\/g, '/'); + + // extract host:port + var pos = string.indexOf('/'); + var bracketPos; + var t; + + if (pos === -1) { + pos = string.length; + } + + if (string.charAt(0) === '[') { + // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6 + // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts + // IPv6+port in the format [2001:db8::1]:80 (for the time being) + bracketPos = string.indexOf(']'); + parts.hostname = string.substring(1, bracketPos) || null; + parts.port = string.substring(bracketPos + 2, pos) || null; + if (parts.port === '/') { + parts.port = null; + } + } else { + var firstColon = string.indexOf(':'); + var firstSlash = string.indexOf('/'); + var nextColon = string.indexOf(':', firstColon + 1); + if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) { + // IPv6 host contains multiple colons - but no port + // this notation is actually not allowed by RFC 3986, but we're a liberal parser + parts.hostname = string.substring(0, pos) || null; + parts.port = null; + } else { + t = string.substring(0, pos).split(':'); + parts.hostname = t[0] || null; + parts.port = t[1] || null; + } + } + + if (parts.hostname && string.substring(pos).charAt(0) !== '/') { + pos++; + string = '/' + string; + } + + return string.substring(pos) || '/'; + }; + URI.parseAuthority = function(string, parts) { + string = URI.parseUserinfo(string, parts); + return URI.parseHost(string, parts); + }; + URI.parseUserinfo = function(string, parts) { + // extract username:password + var firstSlash = string.indexOf('/'); + var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1); + var t; + + // authority@ must come before /path + if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) { + t = string.substring(0, pos).split(':'); + parts.username = t[0] ? URI.decode(t[0]) : null; + t.shift(); + parts.password = t[0] ? URI.decode(t.join(':')) : null; + string = string.substring(pos + 1); + } else { + parts.username = null; + parts.password = null; + } + + return string; + }; + URI.parseQuery = function(string, escapeQuerySpace) { + if (!string) { + return {}; + } + + // throw out the funky business - "?"[name"="value"&"]+ + string = string.replace(/&+/g, '&').replace(/^\?*&*|&+$/g, ''); + + if (!string) { + return {}; + } + + var items = {}; + var splits = string.split('&'); + var length = splits.length; + var v, name, value; + + for (var i = 0; i < length; i++) { + v = splits[i].split('='); + name = URI.decodeQuery(v.shift(), escapeQuerySpace); + // no "=" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters + value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null; + + if (hasOwn.call(items, name)) { + if (typeof items[name] === 'string' || items[name] === null) { + items[name] = [items[name]]; + } + + items[name].push(value); + } else { + items[name] = value; + } + } + + return items; + }; + + URI.build = function(parts) { + var t = ''; + + if (parts.protocol) { + t += parts.protocol + ':'; + } + + if (!parts.urn && (t || parts.hostname)) { + t += '//'; + } + + t += (URI.buildAuthority(parts) || ''); + + if (typeof parts.path === 'string') { + if (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') { + t += '/'; + } + + t += parts.path; + } + + if (typeof parts.query === 'string' && parts.query) { + t += '?' + parts.query; + } + + if (typeof parts.fragment === 'string' && parts.fragment) { + t += '#' + parts.fragment; + } + return t; + }; + URI.buildHost = function(parts) { + var t = ''; + + if (!parts.hostname) { + return ''; + } else if (URI.ip6_expression.test(parts.hostname)) { + t += '[' + parts.hostname + ']'; + } else { + t += parts.hostname; + } + + if (parts.port) { + t += ':' + parts.port; + } + + return t; + }; + URI.buildAuthority = function(parts) { + return URI.buildUserinfo(parts) + URI.buildHost(parts); + }; + URI.buildUserinfo = function(parts) { + var t = ''; + + if (parts.username) { + t += URI.encode(parts.username); + } + + if (parts.password) { + t += ':' + URI.encode(parts.password); + } + + if (t) { + t += '@'; + } + + return t; + }; + URI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) { + // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html + // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed + // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax! + // URI.js treats the query string as being application/x-www-form-urlencoded + // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type + + var t = ''; + var unique, key, i, length; + for (key in data) { + if (hasOwn.call(data, key) && key) { + if (isArray(data[key])) { + unique = {}; + for (i = 0, length = data[key].length; i < length; i++) { + if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) { + t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace); + if (duplicateQueryParameters !== true) { + unique[data[key][i] + ''] = true; + } + } + } + } else if (data[key] !== undefined) { + t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace); + } + } + } + + return t.substring(1); + }; + URI.buildQueryParameter = function(name, value, escapeQuerySpace) { + // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded + // don't append "=" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization + return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : ''); + }; + + URI.addQuery = function(data, name, value) { + if (typeof name === 'object') { + for (var key in name) { + if (hasOwn.call(name, key)) { + URI.addQuery(data, key, name[key]); + } + } + } else if (typeof name === 'string') { + if (data[name] === undefined) { + data[name] = value; + return; + } else if (typeof data[name] === 'string') { + data[name] = [data[name]]; + } + + if (!isArray(value)) { + value = [value]; + } + + data[name] = (data[name] || []).concat(value); + } else { + throw new TypeError('URI.addQuery() accepts an object, string as the name parameter'); + } + }; + URI.removeQuery = function(data, name, value) { + var i, length, key; + + if (isArray(name)) { + for (i = 0, length = name.length; i < length; i++) { + data[name[i]] = undefined; + } + } else if (getType(name) === 'RegExp') { + for (key in data) { + if (name.test(key)) { + data[key] = undefined; + } + } + } else if (typeof name === 'object') { + for (key in name) { + if (hasOwn.call(name, key)) { + URI.removeQuery(data, key, name[key]); + } + } + } else if (typeof name === 'string') { + if (value !== undefined) { + if (getType(value) === 'RegExp') { + if (!isArray(data[name]) && value.test(data[name])) { + data[name] = undefined; + } else { + data[name] = filterArrayValues(data[name], value); + } + } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) { + data[name] = undefined; + } else if (isArray(data[name])) { + data[name] = filterArrayValues(data[name], value); + } + } else { + data[name] = undefined; + } + } else { + throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter'); + } + }; + URI.hasQuery = function(data, name, value, withinArray) { + switch (getType(name)) { + case 'String': + // Nothing to do here + break; + + case 'RegExp': + for (var key in data) { + if (hasOwn.call(data, key)) { + if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) { + return true; + } + } + } + + return false; + + case 'Object': + for (var _key in name) { + if (hasOwn.call(name, _key)) { + if (!URI.hasQuery(data, _key, name[_key])) { + return false; + } + } + } + + return true; + + default: + throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter'); + } + + switch (getType(value)) { + case 'Undefined': + // true if exists (but may be empty) + return name in data; // data[name] !== undefined; + + case 'Boolean': + // true if exists and non-empty + var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]); + return value === _booly; + + case 'Function': + // allow complex comparison + return !!value(data[name], name, data); + + case 'Array': + if (!isArray(data[name])) { + return false; + } + + var op = withinArray ? arrayContains : arraysEqual; + return op(data[name], value); + + case 'RegExp': + if (!isArray(data[name])) { + return Boolean(data[name] && data[name].match(value)); + } + + if (!withinArray) { + return false; + } + + return arrayContains(data[name], value); + + case 'Number': + value = String(value); + /* falls through */ + case 'String': + if (!isArray(data[name])) { + return data[name] === value; + } + + if (!withinArray) { + return false; + } + + return arrayContains(data[name], value); + + default: + throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter'); + } + }; + + + URI.joinPaths = function() { + var input = []; + var segments = []; + var nonEmptySegments = 0; + + for (var i = 0; i < arguments.length; i++) { + var url = new URI(arguments[i]); + input.push(url); + var _segments = url.segment(); + for (var s = 0; s < _segments.length; s++) { + if (typeof _segments[s] === 'string') { + segments.push(_segments[s]); + } + + if (_segments[s]) { + nonEmptySegments++; + } + } + } + + if (!segments.length || !nonEmptySegments) { + return new URI(''); + } + + var uri = new URI('').segment(segments); + + if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') { + uri.path('/' + uri.path()); + } + + return uri.normalize(); + }; + + URI.commonPath = function(one, two) { + var length = Math.min(one.length, two.length); + var pos; + + // find first non-matching character + for (pos = 0; pos < length; pos++) { + if (one.charAt(pos) !== two.charAt(pos)) { + pos--; + break; + } + } + + if (pos < 1) { + return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : ''; + } + + // revert to last / + if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') { + pos = one.substring(0, pos).lastIndexOf('/'); + } + + return one.substring(0, pos + 1); + }; + + URI.withinString = function(string, callback, options) { + options || (options = {}); + var _start = options.start || URI.findUri.start; + var _end = options.end || URI.findUri.end; + var _trim = options.trim || URI.findUri.trim; + var _attributeOpen = /[a-z0-9-]=["']?$/i; + + _start.lastIndex = 0; + while (true) { + var match = _start.exec(string); + if (!match) { + break; + } + + var start = match.index; + if (options.ignoreHtml) { + // attribut(e=["']?$) + var attributeOpen = string.slice(Math.max(start - 3, 0), start); + if (attributeOpen && _attributeOpen.test(attributeOpen)) { + continue; + } + } + + var end = start + string.slice(start).search(_end); + var slice = string.slice(start, end).replace(_trim, ''); + if (options.ignore && options.ignore.test(slice)) { + continue; + } + + end = start + slice.length; + var result = callback(slice, start, end, string); + string = string.slice(0, start) + result + string.slice(end); + _start.lastIndex = start + result.length; + } + + _start.lastIndex = 0; + return string; + }; + + URI.ensureValidHostname = function(v) { + // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986) + // they are not part of DNS and therefore ignored by URI.js + + if (v.match(URI.invalid_hostname_characters)) { + // test punycode + if (!punycode) { + throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-] and Punycode.js is not available'); + } + + if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) { + throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]'); + } + } + }; + + // noConflict + URI.noConflict = function(removeAll) { + if (removeAll) { + var unconflicted = { + URI: this.noConflict() + }; + + if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') { + unconflicted.URITemplate = root.URITemplate.noConflict(); + } + + if (root.IPv6 && typeof root.IPv6.noConflict === 'function') { + unconflicted.IPv6 = root.IPv6.noConflict(); + } + + if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') { + unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict(); + } + + return unconflicted; + } else if (root.URI === this) { + root.URI = _URI; + } + + return this; + }; + + p.build = function(deferBuild) { + if (deferBuild === true) { + this._deferred_build = true; + } else if (deferBuild === undefined || this._deferred_build) { + this._string = URI.build(this._parts); + this._deferred_build = false; + } + + return this; + }; + + p.clone = function() { + return new URI(this); + }; + + p.valueOf = p.toString = function() { + return this.build(false)._string; + }; + + + function generateSimpleAccessor(_part){ + return function(v, build) { + if (v === undefined) { + return this._parts[_part] || ''; + } else { + this._parts[_part] = v || null; + this.build(!build); + return this; + } + }; + } + + function generatePrefixAccessor(_part, _key){ + return function(v, build) { + if (v === undefined) { + return this._parts[_part] || ''; + } else { + if (v !== null) { + v = v + ''; + if (v.charAt(0) === _key) { + v = v.substring(1); + } + } + + this._parts[_part] = v; + this.build(!build); + return this; + } + }; + } + + p.protocol = generateSimpleAccessor('protocol'); + p.username = generateSimpleAccessor('username'); + p.password = generateSimpleAccessor('password'); + p.hostname = generateSimpleAccessor('hostname'); + p.port = generateSimpleAccessor('port'); + p.query = generatePrefixAccessor('query', '?'); + p.fragment = generatePrefixAccessor('fragment', '#'); + + p.search = function(v, build) { + var t = this.query(v, build); + return typeof t === 'string' && t.length ? ('?' + t) : t; + }; + p.hash = function(v, build) { + var t = this.fragment(v, build); + return typeof t === 'string' && t.length ? ('#' + t) : t; + }; + + p.pathname = function(v, build) { + if (v === undefined || v === true) { + var res = this._parts.path || (this._parts.hostname ? '/' : ''); + return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res; + } else { + if (this._parts.urn) { + this._parts.path = v ? URI.recodeUrnPath(v) : ''; + } else { + this._parts.path = v ? URI.recodePath(v) : '/'; + } + this.build(!build); + return this; + } + }; + p.path = p.pathname; + p.href = function(href, build) { + var key; + + if (href === undefined) { + return this.toString(); + } + + this._string = ''; + this._parts = URI._parts(); + + var _URI = href instanceof URI; + var _object = typeof href === 'object' && (href.hostname || href.path || href.pathname); + if (href.nodeName) { + var attribute = URI.getDomAttribute(href); + href = href[attribute] || ''; + _object = false; + } + + // window.location is reported to be an object, but it's not the sort + // of object we're looking for: + // * location.protocol ends with a colon + // * location.query != object.search + // * location.hash != object.fragment + // simply serializing the unknown object should do the trick + // (for location, not for everything...) + if (!_URI && _object && href.pathname !== undefined) { + href = href.toString(); + } + + if (typeof href === 'string' || href instanceof String) { + this._parts = URI.parse(String(href), this._parts); + } else if (_URI || _object) { + var src = _URI ? href._parts : href; + for (key in src) { + if (hasOwn.call(this._parts, key)) { + this._parts[key] = src[key]; + } + } + } else { + throw new TypeError('invalid input'); + } + + this.build(!build); + return this; + }; + + // identification accessors + p.is = function(what) { + var ip = false; + var ip4 = false; + var ip6 = false; + var name = false; + var sld = false; + var idn = false; + var punycode = false; + var relative = !this._parts.urn; + + if (this._parts.hostname) { + relative = false; + ip4 = URI.ip4_expression.test(this._parts.hostname); + ip6 = URI.ip6_expression.test(this._parts.hostname); + ip = ip4 || ip6; + name = !ip; + sld = name && SLD && SLD.has(this._parts.hostname); + idn = name && URI.idn_expression.test(this._parts.hostname); + punycode = name && URI.punycode_expression.test(this._parts.hostname); + } + + switch (what.toLowerCase()) { + case 'relative': + return relative; + + case 'absolute': + return !relative; + + // hostname identification + case 'domain': + case 'name': + return name; + + case 'sld': + return sld; + + case 'ip': + return ip; + + case 'ip4': + case 'ipv4': + case 'inet4': + return ip4; + + case 'ip6': + case 'ipv6': + case 'inet6': + return ip6; + + case 'idn': + return idn; + + case 'url': + return !this._parts.urn; + + case 'urn': + return !!this._parts.urn; + + case 'punycode': + return punycode; + } + + return null; + }; + + // component specific input validation + var _protocol = p.protocol; + var _port = p.port; + var _hostname = p.hostname; + + p.protocol = function(v, build) { + if (v !== undefined) { + if (v) { + // accept trailing :// + v = v.replace(/:(\/\/)?$/, ''); + + if (!v.match(URI.protocol_expression)) { + throw new TypeError('Protocol "' + v + '" contains characters other than [A-Z0-9.+-] or doesn\'t start with [A-Z]'); + } + } + } + return _protocol.call(this, v, build); + }; + p.scheme = p.protocol; + p.port = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (v !== undefined) { + if (v === 0) { + v = null; + } + + if (v) { + v += ''; + if (v.charAt(0) === ':') { + v = v.substring(1); + } + + if (v.match(/[^0-9]/)) { + throw new TypeError('Port "' + v + '" contains characters other than [0-9]'); + } + } + } + return _port.call(this, v, build); + }; + p.hostname = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (v !== undefined) { + var x = {}; + var res = URI.parseHost(v, x); + if (res !== '/') { + throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]'); + } + + v = x.hostname; + } + return _hostname.call(this, v, build); + }; + + // compound accessors + p.origin = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (v === undefined) { + var protocol = this.protocol(); + var authority = this.authority(); + if (!authority) { + return ''; + } + + return (protocol ? protocol + '://' : '') + this.authority(); + } else { + var origin = URI(v); + this + .protocol(origin.protocol()) + .authority(origin.authority()) + .build(!build); + return this; + } + }; + p.host = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (v === undefined) { + return this._parts.hostname ? URI.buildHost(this._parts) : ''; + } else { + var res = URI.parseHost(v, this._parts); + if (res !== '/') { + throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]'); + } + + this.build(!build); + return this; + } + }; + p.authority = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (v === undefined) { + return this._parts.hostname ? URI.buildAuthority(this._parts) : ''; + } else { + var res = URI.parseAuthority(v, this._parts); + if (res !== '/') { + throw new TypeError('Hostname "' + v + '" contains characters other than [A-Z0-9.-]'); + } + + this.build(!build); + return this; + } + }; + p.userinfo = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (v === undefined) { + var t = URI.buildUserinfo(this._parts); + return t ? t.substring(0, t.length -1) : t; + } else { + if (v[v.length-1] !== '@') { + v += '@'; + } + + URI.parseUserinfo(v, this._parts); + this.build(!build); + return this; + } + }; + p.resource = function(v, build) { + var parts; + + if (v === undefined) { + return this.path() + this.search() + this.hash(); + } + + parts = URI.parse(v); + this._parts.path = parts.path; + this._parts.query = parts.query; + this._parts.fragment = parts.fragment; + this.build(!build); + return this; + }; + + // fraction accessors + p.subdomain = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + // convenience, return "www" from "www.example.org" + if (v === undefined) { + if (!this._parts.hostname || this.is('IP')) { + return ''; + } + + // grab domain and add another segment + var end = this._parts.hostname.length - this.domain().length - 1; + return this._parts.hostname.substring(0, end) || ''; + } else { + var e = this._parts.hostname.length - this.domain().length; + var sub = this._parts.hostname.substring(0, e); + var replace = new RegExp('^' + escapeRegEx(sub)); + + if (v && v.charAt(v.length - 1) !== '.') { + v += '.'; + } + + if (v) { + URI.ensureValidHostname(v); + } + + this._parts.hostname = this._parts.hostname.replace(replace, v); + this.build(!build); + return this; + } + }; + p.domain = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (typeof v === 'boolean') { + build = v; + v = undefined; + } + + // convenience, return "example.org" from "www.example.org" + if (v === undefined) { + if (!this._parts.hostname || this.is('IP')) { + return ''; + } + + // if hostname consists of 1 or 2 segments, it must be the domain + var t = this._parts.hostname.match(/\./g); + if (t && t.length < 2) { + return this._parts.hostname; + } + + // grab tld and add another segment + var end = this._parts.hostname.length - this.tld(build).length - 1; + end = this._parts.hostname.lastIndexOf('.', end -1) + 1; + return this._parts.hostname.substring(end) || ''; + } else { + if (!v) { + throw new TypeError('cannot set domain empty'); + } + + URI.ensureValidHostname(v); + + if (!this._parts.hostname || this.is('IP')) { + this._parts.hostname = v; + } else { + var replace = new RegExp(escapeRegEx(this.domain()) + '$'); + this._parts.hostname = this._parts.hostname.replace(replace, v); + } + + this.build(!build); + return this; + } + }; + p.tld = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (typeof v === 'boolean') { + build = v; + v = undefined; + } + + // return "org" from "www.example.org" + if (v === undefined) { + if (!this._parts.hostname || this.is('IP')) { + return ''; + } + + var pos = this._parts.hostname.lastIndexOf('.'); + var tld = this._parts.hostname.substring(pos + 1); + + if (build !== true && SLD && SLD.list[tld.toLowerCase()]) { + return SLD.get(this._parts.hostname) || tld; + } + + return tld; + } else { + var replace; + + if (!v) { + throw new TypeError('cannot set TLD empty'); + } else if (v.match(/[^a-zA-Z0-9-]/)) { + if (SLD && SLD.is(v)) { + replace = new RegExp(escapeRegEx(this.tld()) + '$'); + this._parts.hostname = this._parts.hostname.replace(replace, v); + } else { + throw new TypeError('TLD "' + v + '" contains characters other than [A-Z0-9]'); + } + } else if (!this._parts.hostname || this.is('IP')) { + throw new ReferenceError('cannot set TLD on non-domain host'); + } else { + replace = new RegExp(escapeRegEx(this.tld()) + '$'); + this._parts.hostname = this._parts.hostname.replace(replace, v); + } + + this.build(!build); + return this; + } + }; + p.directory = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (v === undefined || v === true) { + if (!this._parts.path && !this._parts.hostname) { + return ''; + } + + if (this._parts.path === '/') { + return '/'; + } + + var end = this._parts.path.length - this.filename().length - 1; + var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : ''); + + return v ? URI.decodePath(res) : res; + + } else { + var e = this._parts.path.length - this.filename().length; + var directory = this._parts.path.substring(0, e); + var replace = new RegExp('^' + escapeRegEx(directory)); + + // fully qualifier directories begin with a slash + if (!this.is('relative')) { + if (!v) { + v = '/'; + } + + if (v.charAt(0) !== '/') { + v = '/' + v; + } + } + + // directories always end with a slash + if (v && v.charAt(v.length - 1) !== '/') { + v += '/'; + } + + v = URI.recodePath(v); + this._parts.path = this._parts.path.replace(replace, v); + this.build(!build); + return this; + } + }; + p.filename = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (v === undefined || v === true) { + if (!this._parts.path || this._parts.path === '/') { + return ''; + } + + var pos = this._parts.path.lastIndexOf('/'); + var res = this._parts.path.substring(pos+1); + + return v ? URI.decodePathSegment(res) : res; + } else { + var mutatedDirectory = false; + + if (v.charAt(0) === '/') { + v = v.substring(1); + } + + if (v.match(/\.?\//)) { + mutatedDirectory = true; + } + + var replace = new RegExp(escapeRegEx(this.filename()) + '$'); + v = URI.recodePath(v); + this._parts.path = this._parts.path.replace(replace, v); + + if (mutatedDirectory) { + this.normalizePath(build); + } else { + this.build(!build); + } + + return this; + } + }; + p.suffix = function(v, build) { + if (this._parts.urn) { + return v === undefined ? '' : this; + } + + if (v === undefined || v === true) { + if (!this._parts.path || this._parts.path === '/') { + return ''; + } + + var filename = this.filename(); + var pos = filename.lastIndexOf('.'); + var s, res; + + if (pos === -1) { + return ''; + } + + // suffix may only contain alnum characters (yup, I made this up.) + s = filename.substring(pos+1); + res = (/^[a-z0-9%]+$/i).test(s) ? s : ''; + return v ? URI.decodePathSegment(res) : res; + } else { + if (v.charAt(0) === '.') { + v = v.substring(1); + } + + var suffix = this.suffix(); + var replace; + + if (!suffix) { + if (!v) { + return this; + } + + this._parts.path += '.' + URI.recodePath(v); + } else if (!v) { + replace = new RegExp(escapeRegEx('.' + suffix) + '$'); + } else { + replace = new RegExp(escapeRegEx(suffix) + '$'); + } + + if (replace) { + v = URI.recodePath(v); + this._parts.path = this._parts.path.replace(replace, v); + } + + this.build(!build); + return this; + } + }; + p.segment = function(segment, v, build) { + var separator = this._parts.urn ? ':' : '/'; + var path = this.path(); + var absolute = path.substring(0, 1) === '/'; + var segments = path.split(separator); + + if (segment !== undefined && typeof segment !== 'number') { + build = v; + v = segment; + segment = undefined; + } + + if (segment !== undefined && typeof segment !== 'number') { + throw new Error('Bad segment "' + segment + '", must be 0-based integer'); + } + + if (absolute) { + segments.shift(); + } + + if (segment < 0) { + // allow negative indexes to address from the end + segment = Math.max(segments.length + segment, 0); + } + + if (v === undefined) { + /*jshint laxbreak: true */ + return segment === undefined + ? segments + : segments[segment]; + /*jshint laxbreak: false */ + } else if (segment === null || segments[segment] === undefined) { + if (isArray(v)) { + segments = []; + // collapse empty elements within array + for (var i=0, l=v.length; i < l; i++) { + if (!v[i].length && (!segments.length || !segments[segments.length -1].length)) { + continue; + } + + if (segments.length && !segments[segments.length -1].length) { + segments.pop(); + } + + segments.push(trimSlashes(v[i])); + } + } else if (v || typeof v === 'string') { + v = trimSlashes(v); + if (segments[segments.length -1] === '') { + // empty trailing elements have to be overwritten + // to prevent results such as /foo//bar + segments[segments.length -1] = v; + } else { + segments.push(v); + } + } + } else { + if (v) { + segments[segment] = trimSlashes(v); + } else { + segments.splice(segment, 1); + } + } + + if (absolute) { + segments.unshift(''); + } + + return this.path(segments.join(separator), build); + }; + p.segmentCoded = function(segment, v, build) { + var segments, i, l; + + if (typeof segment !== 'number') { + build = v; + v = segment; + segment = undefined; + } + + if (v === undefined) { + segments = this.segment(segment, v, build); + if (!isArray(segments)) { + segments = segments !== undefined ? URI.decode(segments) : undefined; + } else { + for (i = 0, l = segments.length; i < l; i++) { + segments[i] = URI.decode(segments[i]); + } + } + + return segments; + } + + if (!isArray(v)) { + v = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v; + } else { + for (i = 0, l = v.length; i < l; i++) { + v[i] = URI.encode(v[i]); + } + } + + return this.segment(segment, v, build); + }; + + // mutating query string + var q = p.query; + p.query = function(v, build) { + if (v === true) { + return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + } else if (typeof v === 'function') { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + var result = v.call(this, data); + this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + this.build(!build); + return this; + } else if (v !== undefined && typeof v !== 'string') { + this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + this.build(!build); + return this; + } else { + return q.call(this, v, build); + } + }; + p.setQuery = function(name, value, build) { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + + if (typeof name === 'string' || name instanceof String) { + data[name] = value !== undefined ? value : null; + } else if (typeof name === 'object') { + for (var key in name) { + if (hasOwn.call(name, key)) { + data[key] = name[key]; + } + } + } else { + throw new TypeError('URI.addQuery() accepts an object, string as the name parameter'); + } + + this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + if (typeof name !== 'string') { + build = value; + } + + this.build(!build); + return this; + }; + p.addQuery = function(name, value, build) { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + URI.addQuery(data, name, value === undefined ? null : value); + this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + if (typeof name !== 'string') { + build = value; + } + + this.build(!build); + return this; + }; + p.removeQuery = function(name, value, build) { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + URI.removeQuery(data, name, value); + this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace); + if (typeof name !== 'string') { + build = value; + } + + this.build(!build); + return this; + }; + p.hasQuery = function(name, value, withinArray) { + var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace); + return URI.hasQuery(data, name, value, withinArray); + }; + p.setSearch = p.setQuery; + p.addSearch = p.addQuery; + p.removeSearch = p.removeQuery; + p.hasSearch = p.hasQuery; + + // sanitizing URLs + p.normalize = function() { + if (this._parts.urn) { + return this + .normalizeProtocol(false) + .normalizePath(false) + .normalizeQuery(false) + .normalizeFragment(false) + .build(); + } + + return this + .normalizeProtocol(false) + .normalizeHostname(false) + .normalizePort(false) + .normalizePath(false) + .normalizeQuery(false) + .normalizeFragment(false) + .build(); + }; + p.normalizeProtocol = function(build) { + if (typeof this._parts.protocol === 'string') { + this._parts.protocol = this._parts.protocol.toLowerCase(); + this.build(!build); + } + + return this; + }; + p.normalizeHostname = function(build) { + if (this._parts.hostname) { + if (this.is('IDN') && punycode) { + this._parts.hostname = punycode.toASCII(this._parts.hostname); + } else if (this.is('IPv6') && IPv6) { + this._parts.hostname = IPv6.best(this._parts.hostname); + } + + this._parts.hostname = this._parts.hostname.toLowerCase(); + this.build(!build); + } + + return this; + }; + p.normalizePort = function(build) { + // remove port of it's the protocol's default + if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) { + this._parts.port = null; + this.build(!build); + } + + return this; + }; + p.normalizePath = function(build) { + var _path = this._parts.path; + if (!_path) { + return this; + } + + if (this._parts.urn) { + this._parts.path = URI.recodeUrnPath(this._parts.path); + this.build(!build); + return this; + } + + if (this._parts.path === '/') { + return this; + } + + _path = URI.recodePath(_path); + + var _was_relative; + var _leadingParents = ''; + var _parent, _pos; + + // handle relative paths + if (_path.charAt(0) !== '/') { + _was_relative = true; + _path = '/' + _path; + } + + // handle relative files (as opposed to directories) + if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') { + _path += '/'; + } + + // resolve simples + _path = _path + .replace(/(\/(\.\/)+)|(\/\.$)/g, '/') + .replace(/\/{2,}/g, '/'); + + // remember leading parents + if (_was_relative) { + _leadingParents = _path.substring(1).match(/^(\.\.\/)+/) || ''; + if (_leadingParents) { + _leadingParents = _leadingParents[0]; + } + } + + // resolve parents + while (true) { + _parent = _path.search(/\/\.\.(\/|$)/); + if (_parent === -1) { + // no more ../ to resolve + break; + } else if (_parent === 0) { + // top level cannot be relative, skip it + _path = _path.substring(3); + continue; + } + + _pos = _path.substring(0, _parent).lastIndexOf('/'); + if (_pos === -1) { + _pos = _parent; + } + _path = _path.substring(0, _pos) + _path.substring(_parent + 3); + } + + // revert to relative + if (_was_relative && this.is('relative')) { + _path = _leadingParents + _path.substring(1); + } + + this._parts.path = _path; + this.build(!build); + return this; + }; + p.normalizePathname = p.normalizePath; + p.normalizeQuery = function(build) { + if (typeof this._parts.query === 'string') { + if (!this._parts.query.length) { + this._parts.query = null; + } else { + this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace)); + } + + this.build(!build); + } + + return this; + }; + p.normalizeFragment = function(build) { + if (!this._parts.fragment) { + this._parts.fragment = null; + this.build(!build); + } + + return this; + }; + p.normalizeSearch = p.normalizeQuery; + p.normalizeHash = p.normalizeFragment; + + p.iso8859 = function() { + // expect unicode input, iso8859 output + var e = URI.encode; + var d = URI.decode; + + URI.encode = escape; + URI.decode = decodeURIComponent; + try { + this.normalize(); + } finally { + URI.encode = e; + URI.decode = d; + } + return this; + }; + + p.unicode = function() { + // expect iso8859 input, unicode output + var e = URI.encode; + var d = URI.decode; + + URI.encode = strictEncodeURIComponent; + URI.decode = unescape; + try { + this.normalize(); + } finally { + URI.encode = e; + URI.decode = d; + } + return this; + }; + + p.readable = function() { + var uri = this.clone(); + // removing username, password, because they shouldn't be displayed according to RFC 3986 + uri.username('').password('').normalize(); + var t = ''; + if (uri._parts.protocol) { + t += uri._parts.protocol + '://'; + } + + if (uri._parts.hostname) { + if (uri.is('punycode') && punycode) { + t += punycode.toUnicode(uri._parts.hostname); + if (uri._parts.port) { + t += ':' + uri._parts.port; + } + } else { + t += uri.host(); + } + } + + if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') { + t += '/'; + } + + t += uri.path(true); + if (uri._parts.query) { + var q = ''; + for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) { + var kv = (qp[i] || '').split('='); + q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace) + .replace(/&/g, '%26'); + + if (kv[1] !== undefined) { + q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace) + .replace(/&/g, '%26'); + } + } + t += '?' + q.substring(1); + } + + t += URI.decodeQuery(uri.hash(), true); + return t; + }; + + // resolving relative and absolute URLs + p.absoluteTo = function(base) { + var resolved = this.clone(); + var properties = ['protocol', 'username', 'password', 'hostname', 'port']; + var basedir, i, p; + + if (this._parts.urn) { + throw new Error('URNs do not have any generally defined hierarchical components'); + } + + if (!(base instanceof URI)) { + base = new URI(base); + } + + if (!resolved._parts.protocol) { + resolved._parts.protocol = base._parts.protocol; + } + + if (this._parts.hostname) { + return resolved; + } + + for (i = 0; (p = properties[i]); i++) { + resolved._parts[p] = base._parts[p]; + } + + if (!resolved._parts.path) { + resolved._parts.path = base._parts.path; + if (!resolved._parts.query) { + resolved._parts.query = base._parts.query; + } + } else if (resolved._parts.path.substring(-2) === '..') { + resolved._parts.path += '/'; + } + + if (resolved.path().charAt(0) !== '/') { + basedir = base.directory(); + basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : ''; + resolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path; + resolved.normalizePath(); + } + + resolved.build(); + return resolved; + }; + p.relativeTo = function(base) { + var relative = this.clone().normalize(); + var relativeParts, baseParts, common, relativePath, basePath; + + if (relative._parts.urn) { + throw new Error('URNs do not have any generally defined hierarchical components'); + } + + base = new URI(base).normalize(); + relativeParts = relative._parts; + baseParts = base._parts; + relativePath = relative.path(); + basePath = base.path(); + + if (relativePath.charAt(0) !== '/') { + throw new Error('URI is already relative'); + } + + if (basePath.charAt(0) !== '/') { + throw new Error('Cannot calculate a URI relative to another relative URI'); + } + + if (relativeParts.protocol === baseParts.protocol) { + relativeParts.protocol = null; + } + + if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) { + return relative.build(); + } + + if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) { + return relative.build(); + } + + if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) { + relativeParts.hostname = null; + relativeParts.port = null; + } else { + return relative.build(); + } + + if (relativePath === basePath) { + relativeParts.path = ''; + return relative.build(); + } + + // determine common sub path + common = URI.commonPath(relativePath, basePath); + + // If the paths have nothing in common, return a relative URL with the absolute path. + if (!common) { + return relative.build(); + } + + var parents = baseParts.path + .substring(common.length) + .replace(/[^\/]*$/, '') + .replace(/.*?\//g, '../'); + + relativeParts.path = (parents + relativeParts.path.substring(common.length)) || './'; + + return relative.build(); + }; + + // comparing URIs + p.equals = function(uri) { + var one = this.clone(); + var two = new URI(uri); + var one_map = {}; + var two_map = {}; + var checked = {}; + var one_query, two_query, key; + + one.normalize(); + two.normalize(); + + // exact match + if (one.toString() === two.toString()) { + return true; + } + + // extract query string + one_query = one.query(); + two_query = two.query(); + one.query(''); + two.query(''); + + // definitely not equal if not even non-query parts match + if (one.toString() !== two.toString()) { + return false; + } + + // query parameters have the same length, even if they're permuted + if (one_query.length !== two_query.length) { + return false; + } + + one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace); + two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace); + + for (key in one_map) { + if (hasOwn.call(one_map, key)) { + if (!isArray(one_map[key])) { + if (one_map[key] !== two_map[key]) { + return false; + } + } else if (!arraysEqual(one_map[key], two_map[key])) { + return false; + } + + checked[key] = true; + } + } + + for (key in two_map) { + if (hasOwn.call(two_map, key)) { + if (!checked[key]) { + // two contains a parameter not present in one + return false; + } + } + } + + return true; + }; + + // state + p.duplicateQueryParameters = function(v) { + this._parts.duplicateQueryParameters = !!v; + return this; + }; + + p.escapeQuerySpace = function(v) { + this._parts.escapeQuerySpace = !!v; + return this; + }; + + return URI; + })); + + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(module, global) {/*! https://mths.be/punycode v1.4.0 by @mathias */ + ;(function(root) { + + /** Detect free variables */ + var freeExports = typeof exports == 'object' && exports && + !exports.nodeType && exports; + var freeModule = typeof module == 'object' && module && + !module.nodeType && module; + var freeGlobal = typeof global == 'object' && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw new RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.3.2', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + true + ) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { + return punycode; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { + // in Node.js, io.js, or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { + // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } } else { - full.resolve(); + // in Rhino or a web browser + root.punycode = punycode; } - }.bind(this)); - - return full.promise; -} - -ContinuousViewManager.prototype.moveTo = function(offset){ - // var bounds = this.stage.bounds(); - // var dist = Math.floor(offset.top / bounds.height) * bounds.height; - var distX = 0, - distY = 0; - - var offsetX = 0, - offsetY = 0; - - if(this.settings.axis === "vertical") { - distY = offset.top; - offsetY = offset.top+this.settings.offset; - } else { - distX = Math.floor(offset.left / this.layout.delta) * this.layout.delta; - offsetX = distX+this.settings.offset; - } - - return this.check(offsetX, offsetY) - .then(function(){ - this.scrollBy(distX, distY); - }.bind(this)); -}; - -/* -ContinuousViewManager.prototype.afterDisplayed = function(currView){ - var next = currView.section.next(); - var prev = currView.section.prev(); - var index = this.views.indexOf(currView); - var prevView, nextView; - - if(index + 1 === this.views.length && next) { - nextView = this.createView(next); - this.q.enqueue(this.append.bind(this), nextView); - } - - if(index === 0 && prev) { - prevView = this.createView(prev, this.viewSettings); - this.q.enqueue(this.prepend.bind(this), prevView); - } - - // this.removeShownListeners(currView); - // currView.onShown = this.afterDisplayed.bind(this); - this.trigger("added", currView.section); - -}; -*/ - -ContinuousViewManager.prototype.resize = function(width, height){ - - // Clear the queue - this.q.clear(); - - this._stageSize = this.stage.size(width, height); - this._bounds = this.bounds(); - - // Update for new views - this.viewSettings.width = this._stageSize.width; - this.viewSettings.height = this._stageSize.height; - - // Update for existing views - this.views.each(function(view) { - view.size(this._stageSize.width, this._stageSize.height); - }.bind(this)); - - this.updateLayout(); - - // if(this.location) { - // this.rendition.display(this.location.start); - // } - - this.trigger("resized", { - width: this.stage.width, - height: this.stage.height - }); - -}; - -ContinuousViewManager.prototype.onResized = function(e) { - - // this.views.clear(); - - clearTimeout(this.resizeTimeout); - this.resizeTimeout = setTimeout(function(){ - this.resize(); - }.bind(this), 150); -}; - -ContinuousViewManager.prototype.afterResized = function(view){ - this.trigger("resize", view.section); -}; - -// Remove Previous Listeners if present -ContinuousViewManager.prototype.removeShownListeners = function(view){ - - // view.off("shown", this.afterDisplayed); - // view.off("shown", this.afterDisplayedAbove); - view.onDisplayed = function(){}; - -}; - - -// ContinuousViewManager.prototype.append = function(section){ -// return this.q.enqueue(function() { -// -// this._append(section); -// -// -// }.bind(this)); -// }; -// -// ContinuousViewManager.prototype.prepend = function(section){ -// return this.q.enqueue(function() { -// -// this._prepend(section); -// -// }.bind(this)); -// -// }; - -ContinuousViewManager.prototype.append = function(section){ - var view = this.createView(section); - this.views.append(view); - return view; -}; - -ContinuousViewManager.prototype.prepend = function(section){ - var view = this.createView(section); - - view.on("resized", this.counter.bind(this)); - - this.views.prepend(view); - return view; -}; - -ContinuousViewManager.prototype.counter = function(bounds){ - - if(this.settings.axis === "vertical") { - this.scrollBy(0, bounds.heightDelta, true); - } else { - this.scrollBy(bounds.widthDelta, 0, true); - } - -}; - -ContinuousViewManager.prototype.update = function(_offset){ - var container = this.bounds(); - var views = this.views.all(); - var viewsLength = views.length; - var visible = []; - var offset = typeof _offset != "undefined" ? _offset : (this.settings.offset || 0); - var isVisible; - var view; - - var updating = new RSVP.defer(); - var promises = []; - - for (var i = 0; i < viewsLength; i++) { - view = views[i]; - - isVisible = this.isVisible(view, offset, offset, container); - - if(isVisible === true) { - if (!view.displayed) { - promises.push(view.display(this.request).then(function (view) { - view.show(); - })); + + }(this)); + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(8)(module), (function() { return this; }()))) + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + + module.exports = function(module) { + if(!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + module.children = []; + module.webpackPolyfill = 1; + } + return module; + } + + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + /*! + * URI.js - Mutating URLs + * IPv6 Support + * + * Version: 1.18.1 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ + + (function (root, factory) { + 'use strict'; + // https://github.com/umdjs/umd/blob/master/returnExports.js + if (true) { + // Node + module.exports = factory(); + } else if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory); + } else { + // Browser globals (root is window) + root.IPv6 = factory(root); + } + }(this, function (root) { + 'use strict'; + + /* + var _in = "fe80:0000:0000:0000:0204:61ff:fe9d:f156"; + var _out = IPv6.best(_in); + var _expected = "fe80::204:61ff:fe9d:f156"; + + console.log(_in, _out, _expected, _out === _expected); + */ + + // save current IPv6 variable, if any + var _IPv6 = root && root.IPv6; + + function bestPresentation(address) { + // based on: + // Javascript to test an IPv6 address for proper format, and to + // present the "best text representation" according to IETF Draft RFC at + // http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04 + // 8 Feb 2010 Rich Brown, Dartware, LLC + // Please feel free to use this code as long as you provide a link to + // http://www.intermapper.com + // http://intermapper.com/support/tools/IPV6-Validator.aspx + // http://download.dartware.com/thirdparty/ipv6validator.js + + var _address = address.toLowerCase(); + var segments = _address.split(':'); + var length = segments.length; + var total = 8; + + // trim colons (:: or ::a:b:c… or …a:b:c::) + if (segments[0] === '' && segments[1] === '' && segments[2] === '') { + // must have been :: + // remove first two items + segments.shift(); + segments.shift(); + } else if (segments[0] === '' && segments[1] === '') { + // must have been ::xxxx + // remove the first item + segments.shift(); + } else if (segments[length - 1] === '' && segments[length - 2] === '') { + // must have been xxxx:: + segments.pop(); + } + + length = segments.length; + + // adjust total segments for IPv4 trailer + if (segments[length - 1].indexOf('.') !== -1) { + // found a "." which means IPv4 + total = 7; + } + + // fill empty segments them with "0000" + var pos; + for (pos = 0; pos < length; pos++) { + if (segments[pos] === '') { + break; + } + } + + if (pos < total) { + segments.splice(pos, 1, '0000'); + while (segments.length < total) { + segments.splice(pos, 0, '0000'); + } + } + + // strip leading zeros + var _segments; + for (var i = 0; i < total; i++) { + _segments = segments[i].split(''); + for (var j = 0; j < 3 ; j++) { + if (_segments[0] === '0' && _segments.length > 1) { + _segments.splice(0,1); + } else { + break; + } + } + + segments[i] = _segments.join(''); + } + + // find longest sequence of zeroes and coalesce them into one segment + var best = -1; + var _best = 0; + var _current = 0; + var current = -1; + var inzeroes = false; + // i; already declared + + for (i = 0; i < total; i++) { + if (inzeroes) { + if (segments[i] === '0') { + _current += 1; + } else { + inzeroes = false; + if (_current > _best) { + best = current; + _best = _current; + } + } + } else { + if (segments[i] === '0') { + inzeroes = true; + current = i; + _current = 1; + } + } + } + + if (_current > _best) { + best = current; + _best = _current; + } + + if (_best > 1) { + segments.splice(best, _best, ''); + } + + length = segments.length; + + // assemble remaining segments + var result = ''; + if (segments[0] === '') { + result = ':'; + } + + for (i = 0; i < length; i++) { + result += segments[i]; + if (i === length - 1) { + break; + } + + result += ':'; + } + + if (segments[length - 1] === '') { + result += ':'; + } + + return result; + } + + function noConflict() { + /*jshint validthis: true */ + if (root.IPv6 === this) { + root.IPv6 = _IPv6; + } + + return this; + } + + return { + best: bestPresentation, + noConflict: noConflict + }; + })); + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + /*! + * URI.js - Mutating URLs + * Second Level Domain (SLD) Support + * + * Version: 1.18.1 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ + + (function (root, factory) { + 'use strict'; + // https://github.com/umdjs/umd/blob/master/returnExports.js + if (true) { + // Node + module.exports = factory(); + } else if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory); + } else { + // Browser globals (root is window) + root.SecondLevelDomains = factory(root); + } + }(this, function (root) { + 'use strict'; + + // save current SecondLevelDomains variable, if any + var _SecondLevelDomains = root && root.SecondLevelDomains; + + var SLD = { + // list of known Second Level Domains + // converted list of SLDs from https://github.com/gavingmiller/second-level-domains + // ---- + // publicsuffix.org is more current and actually used by a couple of browsers internally. + // downside is it also contains domains like "dyndns.org" - which is fine for the security + // issues browser have to deal with (SOP for cookies, etc) - but is way overboard for URI.js + // ---- + list: { + 'ac':' com gov mil net org ', + 'ae':' ac co gov mil name net org pro sch ', + 'af':' com edu gov net org ', + 'al':' com edu gov mil net org ', + 'ao':' co ed gv it og pb ', + 'ar':' com edu gob gov int mil net org tur ', + 'at':' ac co gv or ', + 'au':' asn com csiro edu gov id net org ', + 'ba':' co com edu gov mil net org rs unbi unmo unsa untz unze ', + 'bb':' biz co com edu gov info net org store tv ', + 'bh':' biz cc com edu gov info net org ', + 'bn':' com edu gov net org ', + 'bo':' com edu gob gov int mil net org tv ', + 'br':' adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ', + 'bs':' com edu gov net org ', + 'bz':' du et om ov rg ', + 'ca':' ab bc mb nb nf nl ns nt nu on pe qc sk yk ', + 'ck':' biz co edu gen gov info net org ', + 'cn':' ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ', + 'co':' com edu gov mil net nom org ', + 'cr':' ac c co ed fi go or sa ', + 'cy':' ac biz com ekloges gov ltd name net org parliament press pro tm ', + 'do':' art com edu gob gov mil net org sld web ', + 'dz':' art asso com edu gov net org pol ', + 'ec':' com edu fin gov info med mil net org pro ', + 'eg':' com edu eun gov mil name net org sci ', + 'er':' com edu gov ind mil net org rochest w ', + 'es':' com edu gob nom org ', + 'et':' biz com edu gov info name net org ', + 'fj':' ac biz com info mil name net org pro ', + 'fk':' ac co gov net nom org ', + 'fr':' asso com f gouv nom prd presse tm ', + 'gg':' co net org ', + 'gh':' com edu gov mil org ', + 'gn':' ac com gov net org ', + 'gr':' com edu gov mil net org ', + 'gt':' com edu gob ind mil net org ', + 'gu':' com edu gov net org ', + 'hk':' com edu gov idv net org ', + 'hu':' 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ', + 'id':' ac co go mil net or sch web ', + 'il':' ac co gov idf k12 muni net org ', + 'in':' ac co edu ernet firm gen gov i ind mil net nic org res ', + 'iq':' com edu gov i mil net org ', + 'ir':' ac co dnssec gov i id net org sch ', + 'it':' edu gov ', + 'je':' co net org ', + 'jo':' com edu gov mil name net org sch ', + 'jp':' ac ad co ed go gr lg ne or ', + 'ke':' ac co go info me mobi ne or sc ', + 'kh':' com edu gov mil net org per ', + 'ki':' biz com de edu gov info mob net org tel ', + 'km':' asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ', + 'kn':' edu gov net org ', + 'kr':' ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ', + 'kw':' com edu gov net org ', + 'ky':' com edu gov net org ', + 'kz':' com edu gov mil net org ', + 'lb':' com edu gov net org ', + 'lk':' assn com edu gov grp hotel int ltd net ngo org sch soc web ', + 'lr':' com edu gov net org ', + 'lv':' asn com conf edu gov id mil net org ', + 'ly':' com edu gov id med net org plc sch ', + 'ma':' ac co gov m net org press ', + 'mc':' asso tm ', + 'me':' ac co edu gov its net org priv ', + 'mg':' com edu gov mil nom org prd tm ', + 'mk':' com edu gov inf name net org pro ', + 'ml':' com edu gov net org presse ', + 'mn':' edu gov org ', + 'mo':' com edu gov net org ', + 'mt':' com edu gov net org ', + 'mv':' aero biz com coop edu gov info int mil museum name net org pro ', + 'mw':' ac co com coop edu gov int museum net org ', + 'mx':' com edu gob net org ', + 'my':' com edu gov mil name net org sch ', + 'nf':' arts com firm info net other per rec store web ', + 'ng':' biz com edu gov mil mobi name net org sch ', + 'ni':' ac co com edu gob mil net nom org ', + 'np':' com edu gov mil net org ', + 'nr':' biz com edu gov info net org ', + 'om':' ac biz co com edu gov med mil museum net org pro sch ', + 'pe':' com edu gob mil net nom org sld ', + 'ph':' com edu gov i mil net ngo org ', + 'pk':' biz com edu fam gob gok gon gop gos gov net org web ', + 'pl':' art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ', + 'pr':' ac biz com edu est gov info isla name net org pro prof ', + 'ps':' com edu gov net org plo sec ', + 'pw':' belau co ed go ne or ', + 'ro':' arts com firm info nom nt org rec store tm www ', + 'rs':' ac co edu gov in org ', + 'sb':' com edu gov net org ', + 'sc':' com edu gov net org ', + 'sh':' co com edu gov net nom org ', + 'sl':' com edu gov net org ', + 'st':' co com consulado edu embaixada gov mil net org principe saotome store ', + 'sv':' com edu gob org red ', + 'sz':' ac co org ', + 'tr':' av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ', + 'tt':' aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ', + 'tw':' club com ebiz edu game gov idv mil net org ', + 'mu':' ac co com gov net or org ', + 'mz':' ac co edu gov org ', + 'na':' co com ', + 'nz':' ac co cri geek gen govt health iwi maori mil net org parliament school ', + 'pa':' abo ac com edu gob ing med net nom org sld ', + 'pt':' com edu gov int net nome org publ ', + 'py':' com edu gov mil net org ', + 'qa':' com edu gov mil net org ', + 're':' asso com nom ', + 'ru':' ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ', + 'rw':' ac co com edu gouv gov int mil net ', + 'sa':' com edu gov med net org pub sch ', + 'sd':' com edu gov info med net org tv ', + 'se':' a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ', + 'sg':' com edu gov idn net org per ', + 'sn':' art com edu gouv org perso univ ', + 'sy':' com edu gov mil net news org ', + 'th':' ac co go in mi net or ', + 'tj':' ac biz co com edu go gov info int mil name net nic org test web ', + 'tn':' agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ', + 'tz':' ac co go ne or ', + 'ua':' biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ', + 'ug':' ac co go ne or org sc ', + 'uk':' ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ', + 'us':' dni fed isa kids nsn ', + 'uy':' com edu gub mil net org ', + 've':' co com edu gob info mil net org web ', + 'vi':' co com k12 net org ', + 'vn':' ac biz com edu gov health info int name net org pro ', + 'ye':' co com gov ltd me net org plc ', + 'yu':' ac co edu gov org ', + 'za':' ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ', + 'zm':' ac co com edu gov net org sch ' + }, + // gorhill 2013-10-25: Using indexOf() instead Regexp(). Significant boost + // in both performance and memory footprint. No initialization required. + // http://jsperf.com/uri-js-sld-regex-vs-binary-search/4 + // Following methods use lastIndexOf() rather than array.split() in order + // to avoid any memory allocations. + has: function(domain) { + var tldOffset = domain.lastIndexOf('.'); + if (tldOffset <= 0 || tldOffset >= (domain.length-1)) { + return false; + } + var sldOffset = domain.lastIndexOf('.', tldOffset-1); + if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) { + return false; + } + var sldList = SLD.list[domain.slice(tldOffset+1)]; + if (!sldList) { + return false; + } + return sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') >= 0; + }, + is: function(domain) { + var tldOffset = domain.lastIndexOf('.'); + if (tldOffset <= 0 || tldOffset >= (domain.length-1)) { + return false; + } + var sldOffset = domain.lastIndexOf('.', tldOffset-1); + if (sldOffset >= 0) { + return false; + } + var sldList = SLD.list[domain.slice(tldOffset+1)]; + if (!sldList) { + return false; + } + return sldList.indexOf(' ' + domain.slice(0, tldOffset) + ' ') >= 0; + }, + get: function(domain) { + var tldOffset = domain.lastIndexOf('.'); + if (tldOffset <= 0 || tldOffset >= (domain.length-1)) { + return null; + } + var sldOffset = domain.lastIndexOf('.', tldOffset-1); + if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) { + return null; + } + var sldList = SLD.list[domain.slice(tldOffset+1)]; + if (!sldList) { + return null; + } + if (sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') < 0) { + return null; + } + return domain.slice(sldOffset+1); + }, + noConflict: function(){ + if (root.SecondLevelDomains === this) { + root.SecondLevelDomains = _SecondLevelDomains; + } + return this; + } + }; + + return SLD; + })); + + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var base64 = __webpack_require__(12); + + var requestAnimationFrame = (typeof window != 'undefined') ? (window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame) : false; + /* + //-- Parse the different parts of a url, returning a object + function uri(url){ + var uri = { + protocol : '', + host : '', + path : '', + origin : '', + directory : '', + base : '', + filename : '', + extension : '', + fragment : '', + href : url + }, + doubleSlash = url.indexOf('://'), + search = url.indexOf('?'), + fragment = url.indexOf("#"), + withoutProtocol, + dot, + firstSlash; + + if(fragment != -1) { + uri.fragment = url.slice(fragment + 1); + url = url.slice(0, fragment); + } + + if(search != -1) { + uri.search = url.slice(search + 1); + url = url.slice(0, search); + href = url; + } + + if(doubleSlash != -1) { + uri.protocol = url.slice(0, doubleSlash); + withoutProtocol = url.slice(doubleSlash+3); + firstSlash = withoutProtocol.indexOf('/'); + + if(firstSlash === -1) { + uri.host = uri.path; + uri.path = ""; + } else { + uri.host = withoutProtocol.slice(0, firstSlash); + uri.path = withoutProtocol.slice(firstSlash); } - visible.push(view); + + + uri.origin = uri.protocol + "://" + uri.host; + + uri.directory = folder(uri.path); + + uri.base = uri.origin + uri.directory; + // return origin; } else { - this.q.enqueue(view.destroy.bind(view)); - - clearTimeout(this.trimTimeout); - this.trimTimeout = setTimeout(function(){ - this.q.enqueue(this.trim.bind(this)); - }.bind(this), 250); + uri.path = url; + uri.directory = folder(url); + uri.base = uri.directory; + } + + //-- Filename + uri.filename = url.replace(uri.base, ''); + dot = uri.filename.lastIndexOf('.'); + if(dot != -1) { + uri.extension = uri.filename.slice(dot+1); + } + return uri; + }; + + //-- Parse out the folder, will return everything before the last slash + function folder(url){ + + var lastSlash = url.lastIndexOf('/'); + + if(lastSlash == -1) var folder = ''; + + folder = url.slice(0, lastSlash + 1); + + return folder; + + }; + */ + function isElement(obj) { + return !!(obj && obj.nodeType == 1); + }; + + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript + function uuid() { + var d = new Date().getTime(); + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = (d + Math.random()*16)%16 | 0; + d = Math.floor(d/16); + return (c=='x' ? r : (r&0x7|0x8)).toString(16); + }); + return uuid; + }; + + // From Lodash + function values(object) { + var index = -1, + props = Object.keys(object), + length = props.length, + result = Array(length); + + while (++index < length) { + result[index] = object[props[index]]; + } + return result; + }; + + function resolveUrl(base, path) { + var url = [], + segments = [], + baseUri = uri(base), + pathUri = uri(path), + baseDirectory = baseUri.directory, + pathDirectory = pathUri.directory, + directories = [], + // folders = base.split("/"), + paths; + + // if(uri.host) { + // return path; + // } + + if(baseDirectory[0] === "/") { + baseDirectory = baseDirectory.substring(1); + } + + if(pathDirectory[pathDirectory.length-1] === "/") { + baseDirectory = baseDirectory.substring(0, baseDirectory.length-1); + } + + if(pathDirectory[0] === "/") { + pathDirectory = pathDirectory.substring(1); + } + + if(pathDirectory[pathDirectory.length-1] === "/") { + pathDirectory = pathDirectory.substring(0, pathDirectory.length-1); + } + + if(baseDirectory) { + directories = baseDirectory.split("/"); + } + + paths = pathDirectory.split("/"); + + paths.reverse().forEach(function(part, index){ + if(part === ".."){ + directories.pop(); + } else if(part === directories[directories.length-1]) { + directories.pop(); + segments.unshift(part); + } else { + segments.unshift(part); + } + }); + + url = [baseUri.origin]; + + if(directories.length) { + url = url.concat(directories); + } + + if(segments) { + url = url.concat(segments); + } + + url = url.concat(pathUri.filename); + + return url.join("/"); + }; + + function documentHeight() { + return Math.max( + document.documentElement.clientHeight, + document.body.scrollHeight, + document.documentElement.scrollHeight, + document.body.offsetHeight, + document.documentElement.offsetHeight + ); + }; + + function isNumber(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + + function prefixed(unprefixed) { + var vendors = ["Webkit", "Moz", "O", "ms" ], + prefixes = ['-Webkit-', '-moz-', '-o-', '-ms-'], + upper = unprefixed[0].toUpperCase() + unprefixed.slice(1), + length = vendors.length; + + if (typeof(document) === 'undefined' || typeof(document.body.style[unprefixed]) != 'undefined') { + return unprefixed; + } + + for ( var i=0; i < length; i++ ) { + if (typeof(document.body.style[vendors[i] + upper]) != 'undefined') { + return vendors[i] + upper; + } + } + + return unprefixed; + }; + + function defaults(obj) { + for (var i = 1, length = arguments.length; i < length; i++) { + var source = arguments[i]; + for (var prop in source) { + if (obj[prop] === void 0) obj[prop] = source[prop]; + } + } + return obj; + }; + + function extend(target) { + var sources = [].slice.call(arguments, 1); + sources.forEach(function (source) { + if(!source) return; + Object.getOwnPropertyNames(source).forEach(function(propName) { + Object.defineProperty(target, propName, Object.getOwnPropertyDescriptor(source, propName)); + }); + }); + return target; + }; + + // Fast quicksort insert for sorted array -- based on: + // http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers + function insert(item, array, compareFunction) { + var location = locationOf(item, array, compareFunction); + array.splice(location, 0, item); + + return location; + }; + // Returns where something would fit in + function locationOf(item, array, compareFunction, _start, _end) { + var start = _start || 0; + var end = _end || array.length; + var pivot = parseInt(start + (end - start) / 2); + var compared; + if(!compareFunction){ + compareFunction = function(a, b) { + if(a > b) return 1; + if(a < b) return -1; + if(a = b) return 0; + }; + } + if(end-start <= 0) { + return pivot; + } + + compared = compareFunction(array[pivot], item); + if(end-start === 1) { + return compared > 0 ? pivot : pivot + 1; + } + + if(compared === 0) { + return pivot; + } + if(compared === -1) { + return locationOf(item, array, compareFunction, pivot, end); + } else{ + return locationOf(item, array, compareFunction, start, pivot); + } + }; + // Returns -1 of mpt found + function indexOfSorted(item, array, compareFunction, _start, _end) { + var start = _start || 0; + var end = _end || array.length; + var pivot = parseInt(start + (end - start) / 2); + var compared; + if(!compareFunction){ + compareFunction = function(a, b) { + if(a > b) return 1; + if(a < b) return -1; + if(a = b) return 0; + }; + } + if(end-start <= 0) { + return -1; // Not found + } + + compared = compareFunction(array[pivot], item); + if(end-start === 1) { + return compared === 0 ? pivot : -1; + } + if(compared === 0) { + return pivot; // Found + } + if(compared === -1) { + return indexOfSorted(item, array, compareFunction, pivot, end); + } else{ + return indexOfSorted(item, array, compareFunction, start, pivot); + } + }; + + function bounds(el) { + + var style = window.getComputedStyle(el); + var widthProps = ["width", "paddingRight", "paddingLeft", "marginRight", "marginLeft", "borderRightWidth", "borderLeftWidth"]; + var heightProps = ["height", "paddingTop", "paddingBottom", "marginTop", "marginBottom", "borderTopWidth", "borderBottomWidth"]; + + var width = 0; + var height = 0; + + widthProps.forEach(function(prop){ + width += parseFloat(style[prop]) || 0; + }); + + heightProps.forEach(function(prop){ + height += parseFloat(style[prop]) || 0; + }); + + return { + height: height, + width: width + }; + + }; + + function borders(el) { + + var style = window.getComputedStyle(el); + var widthProps = ["paddingRight", "paddingLeft", "marginRight", "marginLeft", "borderRightWidth", "borderLeftWidth"]; + var heightProps = ["paddingTop", "paddingBottom", "marginTop", "marginBottom", "borderTopWidth", "borderBottomWidth"]; + + var width = 0; + var height = 0; + + widthProps.forEach(function(prop){ + width += parseFloat(style[prop]) || 0; + }); + + heightProps.forEach(function(prop){ + height += parseFloat(style[prop]) || 0; + }); + + return { + height: height, + width: width + }; + + }; + + function windowBounds() { + + var width = window.innerWidth; + var height = window.innerHeight; + + return { + top: 0, + left: 0, + right: width, + bottom: height, + width: width, + height: height + }; + + }; + + //https://stackoverflow.com/questions/13482352/xquery-looking-for-text-with-single-quote/13483496#13483496 + function cleanStringForXpath(str) { + var parts = str.match(/[^'"]+|['"]/g); + parts = parts.map(function(part){ + if (part === "'") { + return '\"\'\"'; // output "'" + } + + if (part === '"') { + return "\'\"\'"; // output '"' + } + return "\'" + part + "\'"; + }); + return "concat(\'\'," + parts.join(",") + ")"; + }; + + function indexOfTextNode(textNode){ + var parent = textNode.parentNode; + var children = parent.childNodes; + var sib; + var index = -1; + for (var i = 0; i < children.length; i++) { + sib = children[i]; + if(sib.nodeType === Node.TEXT_NODE){ + index++; + } + if(sib == textNode) break; + } + + return index; + }; + + function isXml(ext) { + return ['xml', 'opf', 'ncx'].indexOf(ext) > -1; + } + + function createBlob(content, mime){ + var blob = new Blob([content], {type : mime }); + + return blob; + }; + + function createBlobUrl(content, mime){ + var _URL = window.URL || window.webkitURL || window.mozURL; + var tempUrl; + var blob = this.createBlob(content, mime); + + tempUrl = _URL.createObjectURL(blob); + + return tempUrl; + }; + + function createBase64Url(content, mime){ + var string; + var data; + var datauri; + + if (typeof(content) !== "string") { + // Only handles strings + return; + } + + data = btoa(content); + + datauri = "data:" + mime + ";base64," + data; + + return datauri; + }; + + function type(obj){ + return Object.prototype.toString.call(obj).slice(8, -1); + } + + function parse(markup, mime) { + var doc; + // console.log("parse", markup); + + if (typeof DOMParser === "undefined") { + DOMParser = __webpack_require__(13).DOMParser; + } + + + doc = new DOMParser().parseFromString(markup, mime); + + return doc; + } + + function qs(el, sel) { + var elements; + + if (typeof el.querySelector != "undefined") { + return el.querySelector(sel); + } else { + elements = el.getElementsByTagName(sel); + if (elements.length) { + return elements[0]; + } } - - } - - if(promises.length){ - return RSVP.all(promises); - } else { - updating.resolve(); - return updating.promise; - } - -}; - -ContinuousViewManager.prototype.check = function(_offsetLeft, _offsetTop){ - var last, first, next, prev; - - var checking = new RSVP.defer(); - var newViews = []; - - var horizontal = (this.settings.axis === "horizontal"); - var delta = this.settings.offset || 0; - - if (_offsetLeft && horizontal) { - delta = _offsetLeft; - } - - if (_offsetTop && !horizontal) { - delta = _offsetTop; } - - var bounds = this._bounds; // bounds saved this until resize - - var offset = horizontal ? this.scrollLeft : this.scrollTop; - var visibleLength = horizontal ? bounds.width : bounds.height; - var contentLength = horizontal ? this.container.scrollWidth : this.container.scrollHeight; - - if (offset + visibleLength + delta >= contentLength) { - last = this.views.last(); - next = last && last.section.next(); - if(next) { - newViews.push(this.append(next)); + + function qsa(el, sel) { + + if (typeof el.querySelector != "undefined") { + return el.querySelectorAll(sel); + } else { + return el.getElementsByTagName(sel); } } - - if (offset - delta < 0 ) { - first = this.views.first(); - prev = first && first.section.prev(); - if(prev) { - newViews.push(this.prepend(prev)); + + function qsp(el, sel, props) { + var q, filtered; + if (typeof el.querySelector != "undefined") { + sel += '['; + for (var prop in props) { + sel += prop + "='" + props[prop] + "'"; + } + sel += ']'; + return el.querySelector(sel); + } else { + q = el.getElementsByTagName(sel); + filtered = Array.prototype.slice.call(q, 0).filter(function(el) { + for (var prop in props) { + if(el.getAttribute(prop) === props[prop]){ + return true; + } + } + return false; + }); + + if (filtered) { + return filtered[0]; + } } } - - if(newViews.length){ - // RSVP.all(promises) - // .then(function() { - // Check to see if anything new is on screen after rendering - return this.q.enqueue(function(){ - return this.update(delta); - }.bind(this)); - - - // }.bind(this)); - - } else { - checking.resolve(false); - return checking.promise; - } - - -}; - -ContinuousViewManager.prototype.trim = function(){ - var task = new RSVP.defer(); - var displayed = this.views.displayed(); - var first = displayed[0]; - var last = displayed[displayed.length-1]; - var firstIndex = this.views.indexOf(first); - var lastIndex = this.views.indexOf(last); - var above = this.views.slice(0, firstIndex); - var below = this.views.slice(lastIndex+1); - - // Erase all but last above - for (var i = 0; i < above.length-1; i++) { - this.erase(above[i], above); - } - - // Erase all except first below - for (var j = 1; j < below.length; j++) { - this.erase(below[j]); + + function blob2base64(blob, cb) { + var reader = new FileReader(); + reader.readAsDataURL(blob); + reader.onloadend = function() { + cb(reader.result); + } } + + module.exports = { + // 'uri': uri, + // 'folder': folder, + 'isElement': isElement, + 'uuid': uuid, + 'values': values, + 'resolveUrl': resolveUrl, + 'indexOfSorted': indexOfSorted, + 'documentHeight': documentHeight, + 'isNumber': isNumber, + 'prefixed': prefixed, + 'defaults': defaults, + 'extend': extend, + 'insert': insert, + 'locationOf': locationOf, + 'indexOfSorted': indexOfSorted, + 'requestAnimationFrame': requestAnimationFrame, + 'bounds': bounds, + 'borders': borders, + 'windowBounds': windowBounds, + 'cleanStringForXpath': cleanStringForXpath, + 'indexOfTextNode': indexOfTextNode, + 'isXml': isXml, + 'createBlob': createBlob, + 'createBlobUrl': createBlobUrl, + 'type': type, + 'parse' : parse, + 'qs' : qs, + 'qsa' : qsa, + 'qsp' : qsp, + 'blob2base64' : blob2base64, + 'createBase64Url': createBase64Url + }; - task.resolve(); - return task.promise; -}; - -ContinuousViewManager.prototype.erase = function(view, above){ //Trim - - var prevTop; - var prevLeft; - - if(this.settings.height) { - prevTop = this.container.scrollTop; - prevLeft = this.container.scrollLeft; - } else { - prevTop = window.scrollY; - prevLeft = window.scrollX; - } - var bounds = view.bounds(); +/***/ }, +/* 12 */ +/***/ function(module, exports) { + + 'use strict' + + exports.byteLength = byteLength + exports.toByteArray = toByteArray + exports.fromByteArray = fromByteArray + + var lookup = [] + var revLookup = [] + var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i + } + + revLookup['-'.charCodeAt(0)] = 62 + revLookup['_'.charCodeAt(0)] = 63 + + function placeHoldersCount (b64) { + var len = b64.length + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 + } + + function byteLength (b64) { + // base64 is 4/3 + up to two characters of the original data + return b64.length * 3 / 4 - placeHoldersCount(b64) + } + + function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length + placeHolders = placeHoldersCount(b64) + + arr = new Arr(len * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len + + var L = 0 + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + return arr + } + + function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] + } + + function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') + } + + function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') + } + + +/***/ }, +/* 13 */ +/***/ function(module, exports) { + + module.exports = __WEBPACK_EXTERNAL_MODULE_13__; + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var core = __webpack_require__(11); + var EpubCFI = __webpack_require__(15); + var Hook = __webpack_require__(16); + var Section = __webpack_require__(17); + var replacements = __webpack_require__(19); + + function Spine(_request){ + this.request = _request; + this.spineItems = []; + this.spineByHref = {}; + this.spineById = {}; + + this.hooks = {}; + this.hooks.serialize = new Hook(); + this.hooks.content = new Hook(); + + // Register replacements + this.hooks.content.register(replacements.base); + this.hooks.content.register(replacements.canonical); + + this.epubcfi = new EpubCFI(); + + this.loaded = false; + }; + + Spine.prototype.load = function(_package) { + + this.items = _package.spine; + this.manifest = _package.manifest; + this.spineNodeIndex = _package.spineNodeIndex; + this.baseUrl = _package.baseUrl || ''; + this.length = this.items.length; + + this.items.forEach(function(item, index){ + var href, url; + var manifestItem = this.manifest[item.idref]; + var spineItem; + + item.cfiBase = this.epubcfi.generateChapterComponent(this.spineNodeIndex, item.index, item.idref); + + if(manifestItem) { + item.href = manifestItem.href; + item.url = this.baseUrl + item.href; + + if(manifestItem.properties.length){ + item.properties.push.apply(item.properties, manifestItem.properties); + } + } + + // if(index > 0) { + item.prev = function(){ return this.get(index-1); }.bind(this); + // } + + // if(index+1 < this.items.length) { + item.next = function(){ return this.get(index+1); }.bind(this); + // } + + spineItem = new Section(item, this.hooks); + + this.append(spineItem); + + + }.bind(this)); + + this.loaded = true; + }; + + // book.spine.get(); + // book.spine.get(1); + // book.spine.get("chap1.html"); + // book.spine.get("#id1234"); + Spine.prototype.get = function(target) { + var index = 0; + + if(this.epubcfi.isCfiString(target)) { + cfi = new EpubCFI(target); + index = cfi.spinePos; + } else if(target && (typeof target === "number" || isNaN(target) === false)){ + index = target; + } else if(target && target.indexOf("#") === 0) { + index = this.spineById[target.substring(1)]; + } else if(target) { + // Remove fragments + target = target.split("#")[0]; + index = this.spineByHref[target]; + } + + return this.spineItems[index] || null; + }; + + Spine.prototype.append = function(section) { + var index = this.spineItems.length; + section.index = index; + + this.spineItems.push(section); + + this.spineByHref[section.href] = index; + this.spineById[section.idref] = index; + + return index; + }; + + Spine.prototype.prepend = function(section) { + var index = this.spineItems.unshift(section); + this.spineByHref[section.href] = 0; + this.spineById[section.idref] = 0; + + // Re-index + this.spineItems.forEach(function(item, index){ + item.index = index; + }); + + return 0; + }; + + Spine.prototype.insert = function(section, index) { + + }; + + Spine.prototype.remove = function(section) { + var index = this.spineItems.indexOf(section); + + if(index > -1) { + delete this.spineByHref[section.href]; + delete this.spineById[section.idref]; + + return this.spineItems.splice(index, 1); + } + }; + + Spine.prototype.each = function() { + return this.spineItems.forEach.apply(this.spineItems, arguments); + }; + + module.exports = Spine; - this.views.remove(view); - if(above) { +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { - if(this.settings.axis === "vertical") { - this.scrollTo(0, prevTop - bounds.height, true); + var URI = __webpack_require__(6); + var core = __webpack_require__(11); + + /** + EPUB CFI spec: http://www.idpf.org/epub/linking/cfi/epub-cfi.html + + Implements: + - Character Offset: epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3) + - Simple Ranges : epubcfi(/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4) + + Does Not Implement: + - Temporal Offset (~) + - Spatial Offset (@) + - Temporal-Spatial Offset (~ + @) + - Text Location Assertion ([) + */ + + function EpubCFI(cfiFrom, base, ignoreClass){ + var type; + + this.str = ''; + + this.base = {}; + this.spinePos = 0; // For compatibility + + this.range = false; // true || false; + + this.path = {}; + this.start = null; + this.end = null; + + // Allow instantiation without the 'new' keyword + if (!(this instanceof EpubCFI)) { + return new EpubCFI(cfiFrom, base, ignoreClass); + } + + if(typeof base === 'string') { + this.base = this.parseComponent(base); + } else if(typeof base === 'object' && base.steps) { + this.base = base; + } + + type = this.checkType(cfiFrom); + + + if(type === 'string') { + this.str = cfiFrom; + return core.extend(this, this.parse(cfiFrom)); + } else if (type === 'range') { + return core.extend(this, this.fromRange(cfiFrom, this.base, ignoreClass)); + } else if (type === 'node') { + return core.extend(this, this.fromNode(cfiFrom, this.base, ignoreClass)); + } else if (type === 'EpubCFI' && cfiFrom.path) { + return cfiFrom; + } else if (!cfiFrom) { + return this; } else { - this.scrollTo(prevLeft - bounds.width, 0, true); + throw new TypeError('not a valid argument for EpubCFI'); } + + }; + + EpubCFI.prototype.checkType = function(cfi) { + + if (this.isCfiString(cfi)) { + return 'string'; + // Is a range object + } else if (typeof cfi === 'object' && core.type(cfi) === "Range"){ + return 'range'; + } else if (typeof cfi === 'object' && typeof(cfi.nodeType) != "undefined" ){ // || typeof cfi === 'function' + return 'node'; + } else if (typeof cfi === 'object' && cfi instanceof EpubCFI){ + return 'EpubCFI'; + } else { + return false; + } + }; + + EpubCFI.prototype.parse = function(cfiStr) { + var cfi = { + spinePos: -1, + range: false, + base: {}, + path: {}, + start: null, + end: null + }; + var baseComponent, pathComponent, range; + + if(typeof cfiStr !== "string") { + return {spinePos: -1}; + } + + if(cfiStr.indexOf("epubcfi(") === 0 && cfiStr[cfiStr.length-1] === ")") { + // Remove intial epubcfi( and ending ) + cfiStr = cfiStr.slice(8, cfiStr.length-1); + } + + baseComponent = this.getChapterComponent(cfiStr); + + // Make sure this is a valid cfi or return + if(!baseComponent) { + return {spinePos: -1}; + } + + cfi.base = this.parseComponent(baseComponent); + + pathComponent = this.getPathComponent(cfiStr); + cfi.path = this.parseComponent(pathComponent); + + range = this.getRange(cfiStr); + + if(range) { + cfi.range = true; + cfi.start = this.parseComponent(range[0]); + cfi.end = this.parseComponent(range[1]); + } + + // Get spine node position + // cfi.spineSegment = cfi.base.steps[1]; + + // Chapter segment is always the second step + cfi.spinePos = cfi.base.steps[1].index; + + return cfi; + }; + + EpubCFI.prototype.parseComponent = function(componentStr){ + var component = { + steps: [], + terminal: { + offset: null, + assertion: null + } + }; + var parts = componentStr.split(':'); + var steps = parts[0].split('/'); + var terminal; + + if(parts.length > 1) { + terminal = parts[1]; + component.terminal = this.parseTerminal(terminal); + } + + if (steps[0] === '') { + steps.shift(); // Ignore the first slash + } + + component.steps = steps.map(function(step){ + return this.parseStep(step); + }.bind(this)); + + return component; + }; + + EpubCFI.prototype.parseStep = function(stepStr){ + var type, num, index, has_brackets, id; + + has_brackets = stepStr.match(/\[(.*)\]/); + if(has_brackets && has_brackets[1]){ + id = has_brackets[1]; + } + + //-- Check if step is a text node or element + num = parseInt(stepStr); + + if(isNaN(num)) { + return; + } + + if(num % 2 === 0) { // Even = is an element + type = "element"; + index = num / 2 - 1; + } else { + type = "text"; + index = (num - 1 ) / 2; + } + + return { + "type" : type, + 'index' : index, + 'id' : id || null + }; + }; + + EpubCFI.prototype.parseTerminal = function(termialStr){ + var characterOffset, textLocationAssertion; + var assertion = termialStr.match(/\[(.*)\]/); + + if(assertion && assertion[1]){ + characterOffset = parseInt(termialStr.split('[')[0]) || null; + textLocationAssertion = assertion[1]; + } else { + characterOffset = parseInt(termialStr) || null; + } + + return { + 'offset': characterOffset, + 'assertion': textLocationAssertion + }; + + }; + + EpubCFI.prototype.getChapterComponent = function(cfiStr) { + + var indirection = cfiStr.split("!"); + + return indirection[0]; + }; + + EpubCFI.prototype.getPathComponent = function(cfiStr) { + + var indirection = cfiStr.split("!"); + + if(indirection[1]) { + ranges = indirection[1].split(','); + return ranges[0]; + } + + }; + + EpubCFI.prototype.getRange = function(cfiStr) { + + var ranges = cfiStr.split(","); + + if(ranges.length === 3){ + return [ + ranges[1], + ranges[2] + ]; + } + + return false; + }; + + EpubCFI.prototype.getCharecterOffsetComponent = function(cfiStr) { + var splitStr = cfiStr.split(":"); + return splitStr[1] || ''; + }; + + EpubCFI.prototype.joinSteps = function(steps) { + if(!steps) { + return ""; + } + + return steps.map(function(part){ + var segment = ''; + + if(part.type === 'element') { + segment += (part.index + 1) * 2; + } + + if(part.type === 'text') { + segment += 1 + (2 * part.index); // TODO: double check that this is odd + } + + if(part.id) { + segment += "[" + part.id + "]"; + } + + return segment; + + }).join('/'); + + }; + + EpubCFI.prototype.segmentString = function(segment) { + var segmentString = '/'; + + segmentString += this.joinSteps(segment.steps); + + if(segment.terminal && segment.terminal.offset != null){ + segmentString += ':' + segment.terminal.offset; + } + + if(segment.terminal && segment.terminal.assertion != null){ + segmentString += '[' + segment.terminal.assertion + ']'; + } + + return segmentString; + }; + + EpubCFI.prototype.toString = function() { + var cfiString = 'epubcfi('; + + cfiString += this.segmentString(this.base); + + cfiString += '!'; + cfiString += this.segmentString(this.path); + + // Add Range, if present + if(this.start) { + cfiString += ','; + cfiString += this.segmentString(this.start); + } + + if(this.end) { + cfiString += ','; + cfiString += this.segmentString(this.end); + } + + cfiString += ")"; + + return cfiString; + }; + + EpubCFI.prototype.compare = function(cfiOne, cfiTwo) { + if(typeof cfiOne === 'string') { + cfiOne = new EpubCFI(cfiOne); + } + if(typeof cfiTwo === 'string') { + cfiTwo = new EpubCFI(cfiTwo); + } + // Compare Spine Positions + if(cfiOne.spinePos > cfiTwo.spinePos) { + return 1; + } + if(cfiOne.spinePos < cfiTwo.spinePos) { + return -1; + } + + + // Compare Each Step in the First item + for (var i = 0; i < cfiOne.path.steps.length; i++) { + if(!cfiTwo.path.steps[i]) { + return 1; + } + if(cfiOne.path.steps[i].index > cfiTwo.path.steps[i].index) { + return 1; + } + if(cfiOne.path.steps[i].index < cfiTwo.path.steps[i].index) { + return -1; + } + // Otherwise continue checking + } + + // All steps in First equal to Second and First is Less Specific + if(cfiOne.path.steps.length < cfiTwo.path.steps.length) { + return 1; + } + + // Compare the charecter offset of the text node + if(cfiOne.path.terminal.offset > cfiTwo.path.terminal.offset) { + return 1; + } + if(cfiOne.path.terminal.offset < cfiTwo.path.terminal.offset) { + return -1; + } + + // TODO: compare ranges + + // CFI's are equal + return 0; + }; + + EpubCFI.prototype.step = function(node) { + var nodeType = (node.nodeType === Node.TEXT_NODE) ? 'text' : 'element'; + + return { + 'id' : node.id, + 'tagName' : node.tagName, + 'type' : nodeType, + 'index' : this.position(node) + }; + }; + + EpubCFI.prototype.filteredStep = function(node, ignoreClass) { + var filteredNode = this.filter(node, ignoreClass); + var nodeType; + + // Node filtered, so ignore + if (!filteredNode) { + return; + } + + // Otherwise add the filter node in + nodeType = (filteredNode.nodeType === Node.TEXT_NODE) ? 'text' : 'element'; + + return { + 'id' : filteredNode.id, + 'tagName' : filteredNode.tagName, + 'type' : nodeType, + 'index' : this.filteredPosition(filteredNode, ignoreClass) + }; + }; + + EpubCFI.prototype.pathTo = function(node, offset, ignoreClass) { + var segment = { + steps: [], + terminal: { + offset: null, + assertion: null + } + }; + var currentNode = node; + var step; + + while(currentNode && currentNode.parentNode && + currentNode.parentNode.nodeType != Node.DOCUMENT_NODE) { + + if (ignoreClass) { + step = this.filteredStep(currentNode, ignoreClass); + } else { + step = this.step(currentNode); + } + + if (step) { + segment.steps.unshift(step); + } + + currentNode = currentNode.parentNode; + + } + + if (offset != null && offset >= 0) { + + segment.terminal.offset = offset; + + // Make sure we are getting to a textNode if there is an offset + if(segment.steps[segment.steps.length-1].type != "text") { + segment.steps.push({ + 'type' : "text", + 'index' : 0 + }); + } + + } + + + return segment; } - -}; - -ContinuousViewManager.prototype.addEventListeners = function(stage){ - - window.addEventListener('unload', function(e){ - this.ignore = true; - // this.scrollTo(0,0); - this.destroy(); - }.bind(this)); - - this.addScrollListeners(); -}; - -ContinuousViewManager.prototype.addScrollListeners = function() { - var scroller; - - this.tick = core.requestAnimationFrame; - - if(this.settings.height) { - this.prevScrollTop = this.container.scrollTop; - this.prevScrollLeft = this.container.scrollLeft; - } else { - this.prevScrollTop = window.scrollY; - this.prevScrollLeft = window.scrollX; - } - - this.scrollDeltaVert = 0; - this.scrollDeltaHorz = 0; - - if(this.settings.height) { - scroller = this.container; - this.scrollTop = this.container.scrollTop; - this.scrollLeft = this.container.scrollLeft; - } else { - scroller = window; - this.scrollTop = window.scrollY; - this.scrollLeft = window.scrollX; + + EpubCFI.prototype.equalStep = function(stepA, stepB) { + if (!stepA || !stepB) { + return false; + } + + if(stepA.index === stepB.index && + stepA.id === stepB.id && + stepA.type === stepB.type) { + return true; + } + + return false; + }; + EpubCFI.prototype.fromRange = function(range, base, ignoreClass) { + var cfi = { + range: false, + base: {}, + path: {}, + start: null, + end: null + }; + + var start = range.startContainer; + var end = range.endContainer; + + var startOffset = range.startOffset; + var endOffset = range.endOffset; + + var needsIgnoring = false; + + if (ignoreClass) { + // Tell pathTo if / what to ignore + needsIgnoring = (start.ownerDocument.querySelector('.' + ignoreClass) != null); + } + + + if (typeof base === 'string') { + cfi.base = this.parseComponent(base); + cfi.spinePos = cfi.base.steps[1].index; + } else if (typeof base === 'object') { + cfi.base = base; + } + + if (range.collapsed) { + if (needsIgnoring) { + startOffset = this.patchOffset(start, startOffset, ignoreClass); + } + cfi.path = this.pathTo(start, startOffset, ignoreClass); + } else { + cfi.range = true; + + if (needsIgnoring) { + startOffset = this.patchOffset(start, startOffset, ignoreClass); + } + + cfi.start = this.pathTo(start, startOffset, ignoreClass); + + if (needsIgnoring) { + endOffset = this.patchOffset(end, endOffset, ignoreClass); + } + + cfi.end = this.pathTo(end, endOffset, ignoreClass); + + // Create a new empty path + cfi.path = { + steps: [], + terminal: null + }; + + // Push steps that are shared between start and end to the common path + var len = cfi.start.steps.length; + var i; + + for (i = 0; i < len; i++) { + if (this.equalStep(cfi.start.steps[i], cfi.end.steps[i])) { + if(i == len-1) { + // Last step is equal, check terminals + if(cfi.start.terminal === cfi.end.terminal) { + // CFI's are equal + cfi.path.steps.push(cfi.start.steps[i]); + // Not a range + cfi.range = false; + } + } else { + cfi.path.steps.push(cfi.start.steps[i]); + } + + } else { + break; + } + }; + + cfi.start.steps = cfi.start.steps.slice(cfi.path.steps.length); + cfi.end.steps = cfi.end.steps.slice(cfi.path.steps.length); + + // TODO: Add Sanity check to make sure that the end if greater than the start + } + + return cfi; + } + + EpubCFI.prototype.fromNode = function(anchor, base, ignoreClass) { + var cfi = { + range: false, + base: {}, + path: {}, + start: null, + end: null + }; + + var needsIgnoring = false; + + if (ignoreClass) { + // Tell pathTo if / what to ignore + needsIgnoring = (anchor.ownerDocument.querySelector('.' + ignoreClass) != null); + } + + if (typeof base === 'string') { + cfi.base = this.parseComponent(base); + cfi.spinePos = cfi.base.steps[1].index; + } else if (typeof base === 'object') { + cfi.base = base; + } + + cfi.path = this.pathTo(anchor, null, ignoreClass); + + return cfi; + }; + + + EpubCFI.prototype.filter = function(anchor, ignoreClass) { + var needsIgnoring; + var sibling; // to join with + var parent, prevSibling, nextSibling; + var isText = false; + + if (anchor.nodeType === Node.TEXT_NODE) { + isText = true; + parent = anchor.parentNode; + needsIgnoring = anchor.parentNode.classList.contains(ignoreClass); + } else { + isText = false; + needsIgnoring = anchor.classList.contains(ignoreClass); + } + + if (needsIgnoring && isText) { + previousSibling = parent.previousSibling; + nextSibling = parent.nextSibling; + + // If the sibling is a text node, join the nodes + if (previousSibling && previousSibling.nodeType === Node.TEXT_NODE) { + sibling = previousSibling; + } else if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE) { + sibling = nextSibling; + } + + if (sibling) { + return sibling; + } else { + // Parent will be ignored on next step + return anchor; + } + + } else if (needsIgnoring && !isText) { + // Otherwise just skip the element node + return false; + } else { + // No need to filter + return anchor; + } + + }; + + EpubCFI.prototype.patchOffset = function(anchor, offset, ignoreClass) { + var needsIgnoring; + var sibling; + + if (anchor.nodeType != Node.TEXT_NODE) { + console.error("Anchor must be a text node"); + return; + } + + var curr = anchor; + var totalOffset = offset; + + // If the parent is a ignored node, get offset from it's start + if (anchor.parentNode.classList.contains(ignoreClass)) { + curr = anchor.parentNode; + } + + while (curr.previousSibling) { + if(curr.previousSibling.nodeType === Node.ELEMENT_NODE) { + // Originally a text node, so join + if(curr.previousSibling.classList.contains(ignoreClass)){ + totalOffset += curr.previousSibling.textContent.length; + } else { + break; // Normal node, dont join + } + } else { + // If the previous sibling is a text node, join the nodes + totalOffset += curr.previousSibling.textContent.length; + } + + curr = curr.previousSibling; + } + + return totalOffset; + + }; + + EpubCFI.prototype.normalizedMap = function(children, nodeType, ignoreClass) { + var output = {}; + var prevIndex = -1; + var i, len = children.length; + var currNodeType; + var prevNodeType; + + for (i = 0; i < len; i++) { + + currNodeType = children[i].nodeType; + + // Check if needs ignoring + if (currNodeType === Node.ELEMENT_NODE && + children[i].classList.contains(ignoreClass)) { + currNodeType = Node.TEXT_NODE; + } + + if (i > 0 && + currNodeType === Node.TEXT_NODE && + prevNodeType === Node.TEXT_NODE) { + // join text nodes + output[i] = prevIndex; + } else if (nodeType === currNodeType){ + prevIndex = prevIndex + 1; + output[i] = prevIndex; + } + + prevNodeType = currNodeType; + + } + + return output; + }; + + EpubCFI.prototype.position = function(anchor) { + var children, index, map; + + if (anchor.nodeType === Node.ELEMENT_NODE) { + children = anchor.parentNode.children; + index = Array.prototype.indexOf.call(children, anchor); + } else { + children = this.textNodes(anchor.parentNode); + index = children.indexOf(anchor); + } + + return index; + }; + + EpubCFI.prototype.filteredPosition = function(anchor, ignoreClass) { + var children, index, map; + + if (anchor.nodeType === Node.ELEMENT_NODE) { + children = anchor.parentNode.children; + map = this.normalizedMap(children, Node.ELEMENT_NODE, ignoreClass); + } else { + children = anchor.parentNode.childNodes; + // Inside an ignored node + if(anchor.parentNode.classList.contains(ignoreClass)) { + anchor = anchor.parentNode; + children = anchor.parentNode.childNodes; + } + map = this.normalizedMap(children, Node.TEXT_NODE, ignoreClass); + } + + + index = Array.prototype.indexOf.call(children, anchor); + + return map[index]; + }; + + EpubCFI.prototype.stepsToXpath = function(steps) { + var xpath = [".", "*"]; + + steps.forEach(function(step){ + var position = step.index + 1; + + if(step.id){ + xpath.push("*[position()=" + position + " and @id='" + step.id + "']"); + } else if(step.type === "text") { + xpath.push("text()[" + position + "]"); + } else { + xpath.push("*[" + position + "]"); + } + }); + + return xpath.join("/"); + }; + + + /* + + To get the last step if needed: + + // Get the terminal step + lastStep = steps[steps.length-1]; + // Get the query string + query = this.stepsToQuery(steps); + // Find the containing element + startContainerParent = doc.querySelector(query); + // Find the text node within that element + if(startContainerParent && lastStep.type == "text") { + container = startContainerParent.childNodes[lastStep.index]; } - - scroller.addEventListener("scroll", this.onScroll.bind(this)); - - // this.tick.call(window, this.onScroll.bind(this)); - - this.scrolled = false; - -}; - -ContinuousViewManager.prototype.onScroll = function(){ - - // if(!this.ignore) { - - if(this.settings.height) { - scrollTop = this.container.scrollTop; - scrollLeft = this.container.scrollLeft; + */ + EpubCFI.prototype.stepsToQuerySelector = function(steps) { + var query = ["html"]; + + steps.forEach(function(step){ + var position = step.index + 1; + + if(step.id){ + query.push("#" + step.id); + } else if(step.type === "text") { + // unsupported in querySelector + // query.push("text()[" + position + "]"); + } else { + query.push("*:nth-child(" + position + ")"); + } + }); + + return query.join(">"); + + }; + + EpubCFI.prototype.textNodes = function(container, ignoreClass) { + return Array.prototype.slice.call(container.childNodes). + filter(function (node) { + if (node.nodeType === Node.TEXT_NODE) { + return true; + } else if (ignoreClass && node.classList.contains(ignoreClass)) { + return true; + } + return false; + }); + }; + + EpubCFI.prototype.walkToNode = function(steps, _doc, ignoreClass) { + var doc = _doc || document; + var container = doc.documentElement; + var step; + var len = steps.length; + var i; + + for (i = 0; i < len; i++) { + step = steps[i]; + + if(step.type === "element") { + container = container.children[step.index]; + } else if(step.type === "text"){ + container = this.textNodes(container, ignoreClass)[step.index]; + } + + }; + + return container; + }; + + EpubCFI.prototype.findNode = function(steps, _doc, ignoreClass) { + var doc = _doc || document; + var container; + var xpath; + + if(!ignoreClass && typeof doc.evaluate != 'undefined') { + xpath = this.stepsToXpath(steps); + container = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + } else if(ignoreClass) { + container = this.walkToNode(steps, doc, ignoreClass); } else { - scrollTop = window.scrollY; - scrollLeft = window.scrollX; + container = this.walkToNode(steps, doc); } - - this.scrollTop = scrollTop; - this.scrollLeft = scrollLeft; - - if(!this.ignore) { - - if((this.scrollDeltaVert === 0 && - this.scrollDeltaHorz === 0) || - this.scrollDeltaVert > this.settings.offsetDelta || - this.scrollDeltaHorz > this.settings.offsetDelta) { - - this.q.enqueue(function() { - this.check(); - }.bind(this)); - // this.check(); - - this.scrollDeltaVert = 0; - this.scrollDeltaHorz = 0; - - this.trigger("scroll", { - top: scrollTop, - left: scrollLeft - }); - - clearTimeout(this.afterScrolled); - this.afterScrolled = setTimeout(function () { - this.trigger("scrolled", { - top: this.scrollTop, - left: this.scrollLeft - }); - }.bind(this)); - + + return container; + }; + + EpubCFI.prototype.fixMiss = function(steps, offset, _doc, ignoreClass) { + var container = this.findNode(steps.slice(0,-1), _doc, ignoreClass); + var children = container.childNodes; + var map = this.normalizedMap(children, Node.TEXT_NODE, ignoreClass); + var i; + var child; + var len; + var childIndex; + var lastStepIndex = steps[steps.length-1].index; + + for (var childIndex in map) { + if (!map.hasOwnProperty(childIndex)) return; + + if(map[childIndex] === lastStepIndex) { + child = children[childIndex]; + len = child.textContent.length; + if(offset > len) { + offset = offset - len; + } else { + if (child.nodeType === Node.ELEMENT_NODE) { + container = child.childNodes[0]; + } else { + container = child; + } + break; + } } - - } else { - this.ignore = false; } - - this.scrollDeltaVert += Math.abs(scrollTop-this.prevScrollTop); - this.scrollDeltaHorz += Math.abs(scrollLeft-this.prevScrollLeft); - - this.prevScrollTop = scrollTop; - this.prevScrollLeft = scrollLeft; - - clearTimeout(this.scrollTimeout); - this.scrollTimeout = setTimeout(function(){ - this.scrollDeltaVert = 0; - this.scrollDeltaHorz = 0; - }.bind(this), 150); - - - this.scrolled = false; - // } - - // this.tick.call(window, this.onScroll.bind(this)); - -}; - - -// ContinuousViewManager.prototype.resizeView = function(view) { -// -// if(this.settings.axis === "horizontal") { -// view.lock("height", this.stage.width, this.stage.height); -// } else { -// view.lock("width", this.stage.width, this.stage.height); -// } -// -// }; - -ContinuousViewManager.prototype.currentLocation = function(){ - - if (this.settings.axis === "vertical") { - this.location = this.scrolledLocation(); - } else { - this.location = this.paginatedLocation(); - } - - return this.location; -}; - -ContinuousViewManager.prototype.scrolledLocation = function(){ - - var visible = this.visible(); - var startPage, endPage; - - var container = this.container.getBoundingClientRect(); - - if(visible.length === 1) { - return this.mapping.page(visible[0].contents, visible[0].section.cfiBase); - } - - if(visible.length > 1) { - - startPage = this.mapping.page(visible[0].contents, visible[0].section.cfiBase); - endPage = this.mapping.page(visible[visible.length-1].contents, visible[visible.length-1].section.cfiBase); - - return { - start: startPage.start, - end: endPage.end - }; - } - -}; - -ContinuousViewManager.prototype.paginatedLocation = function(){ - var visible = this.visible(); - var startA, startB, endA, endB; - var pageLeft, pageRight; - var container = this.container.getBoundingClientRect(); - - if(visible.length === 1) { - startA = container.left - visible[0].position().left; - endA = startA + this.layout.spreadWidth; - - return this.mapping.page(visible[0].contents, visible[0].section.cfiBase, startA, endA); - } - - if(visible.length > 1) { - - // Left Col - startA = container.left - visible[0].position().left; - endA = startA + this.layout.columnWidth; - - // Right Col - startB = container.left + this.layout.spreadWidth - visible[visible.length-1].position().left; - endB = startB + this.layout.columnWidth; - - pageLeft = this.mapping.page(visible[0].contents, visible[0].section.cfiBase, startA, endA); - pageRight = this.mapping.page(visible[visible.length-1].contents, visible[visible.length-1].section.cfiBase, startB, endB); - + return { - start: pageLeft.start, - end: pageRight.end + container: container, + offset: offset }; - } -}; - -/* -Continuous.prototype.current = function(what){ - var view, top; - var container = this.container.getBoundingClientRect(); - var length = this.views.length - 1; - - if(this.settings.axis === "horizontal") { - - for (var i = length; i >= 0; i--) { - view = this.views[i]; - left = view.position().left; - - if(left < container.right) { - - if(this._current == view) { - break; + + }; + + EpubCFI.prototype.toRange = function(_doc, ignoreClass) { + var doc = _doc || document; + var range = doc.createRange(); + var start, end, startContainer, endContainer; + var cfi = this; + var startSteps, endSteps; + var needsIgnoring = ignoreClass ? (doc.querySelector('.' + ignoreClass) != null) : false; + var missed; + + if (cfi.range) { + start = cfi.start; + startSteps = cfi.path.steps.concat(start.steps); + startContainer = this.findNode(startSteps, doc, needsIgnoring ? ignoreClass : null); + end = cfi.end; + endSteps = cfi.path.steps.concat(end.steps); + endContainer = this.findNode(endSteps, doc, needsIgnoring ? ignoreClass : null); + } else { + start = cfi.path; + startSteps = cfi.path.steps; + startContainer = this.findNode(cfi.path.steps, doc, needsIgnoring ? ignoreClass : null); + } + + if(startContainer) { + try { + + if(start.terminal.offset != null) { + range.setStart(startContainer, start.terminal.offset); + } else { + range.setStart(startContainer, 0); } - - this._current = view; - break; + + } catch (e) { + missed = this.fixMiss(startSteps, start.terminal.offset, doc, needsIgnoring ? ignoreClass : null); + range.setStart(missed.container, missed.offset); } + } else { + // No start found + return null; } - - } else { - - for (var i = length; i >= 0; i--) { - view = this.views[i]; - top = view.bounds().top; - if(top < container.bottom) { - - if(this._current == view) { - break; + + if (endContainer) { + try { + + if(end.terminal.offset != null) { + range.setEnd(endContainer, end.terminal.offset); + } else { + range.setEnd(endContainer, 0); } - - this._current = view; - - break; + + } catch (e) { + missed = this.fixMiss(endSteps, cfi.end.terminal.offset, doc, needsIgnoring ? ignoreClass : null); + range.setEnd(missed.container, missed.offset); } } - - } - - return this._current; -}; -*/ - -ContinuousViewManager.prototype.updateLayout = function() { - - if (!this.stage) { - return; - } - - if(this.settings.axis === "vertical") { - this.layout.calculate(this._stageSize.width, this._stageSize.height); - } else { - this.layout.calculate( - this._stageSize.width, - this._stageSize.height, - this.settings.gap - ); - - // Set the look ahead offset for what is visible - this.settings.offset = this.layout.delta; - - this.stage.addStyleRules("iframe", [{"margin-right" : this.layout.gap + "px"}]); - - } - - // Set the dimensions for views - this.viewSettings.width = this.layout.width; - this.viewSettings.height = this.layout.height; - - this.setLayout(this.layout); - -}; - -ContinuousViewManager.prototype.next = function(){ - - if(this.settings.axis === "horizontal") { - - this.scrollLeft = this.container.scrollLeft; - - if(this.container.scrollLeft + - this.container.offsetWidth + - this.layout.delta < this.container.scrollWidth) { - this.scrollBy(this.layout.delta, 0); - } else { - this.scrollTo(this.container.scrollWidth - this.layout.delta, 0); + + + // doc.defaultView.getSelection().addRange(range); + return range; + }; + + // is a cfi string, should be wrapped with "epubcfi()" + EpubCFI.prototype.isCfiString = function(str) { + if(typeof str === 'string' && + str.indexOf("epubcfi(") === 0 && + str[str.length-1] === ")") { + return true; } - - } else { - this.scrollBy(0, this.layout.height); - } -}; - -ContinuousViewManager.prototype.prev = function(){ - if(this.settings.axis === "horizontal") { - this.scrollBy(-this.layout.delta, 0); - } else { - this.scrollBy(0, -this.layout.height); - } -}; - -ContinuousViewManager.prototype.updateFlow = function(flow){ - var axis = (flow === "paginated") ? "horizontal" : "vertical"; - - this.settings.axis = axis; - - this.viewSettings.axis = axis; - - this.settings.overflow = (flow === "paginated") ? "hidden" : "auto"; - - // this.views.each(function(view){ - // view.setAxis(axis); - // }); - - if (this.settings.axis === "vertical") { - this.settings.infinite = true; - } else { - this.settings.infinite = false; - } - -}; -module.exports = ContinuousViewManager; - -},{"../../core":10,"../default":16,"rsvp":5}],16:[function(require,module,exports){ -var RSVP = require('rsvp'); -var core = require('../../core'); -var EpubCFI = require('../../epubcfi'); -var Mapping = require('../../mapping'); -var Queue = require('../../queue'); -var Stage = require('../helpers/stage'); -var Views = require('../helpers/views'); - -function DefaultViewManager(options) { - - this.name = "default"; - this.View = options.view; - this.request = options.request; - this.renditionQueue = options.queue; - this.q = new Queue(this); - - this.settings = core.extend(this.settings || {}, { - infinite: true, - hidden: false, - width: undefined, - height: undefined, - // globalLayoutProperties : { layout: 'reflowable', spread: 'auto', orientation: 'auto'}, - // layout: null, - axis: "vertical", - ignoreClass: '' - }); - - core.extend(this.settings, options.settings || {}); - - this.viewSettings = { - ignoreClass: this.settings.ignoreClass, - axis: this.settings.axis, - layout: this.layout, - width: 0, - height: 0 + + return false; }; - -} - -DefaultViewManager.prototype.render = function(element, size){ - - // Save the stage - this.stage = new Stage({ - width: size.width, - height: size.height, - overflow: this.settings.overflow, - hidden: this.settings.hidden, - axis: this.settings.axis - }); - - this.stage.attachTo(element); - - // Get this stage container div - this.container = this.stage.getContainer(); - - // Views array methods - this.views = new Views(this.container); - - // Calculate Stage Size - this._bounds = this.bounds(); - this._stageSize = this.stage.size(); - - // Set the dimensions for views - this.viewSettings.width = this._stageSize.width; - this.viewSettings.height = this._stageSize.height; - - // Function to handle a resize event. - // Will only attach if width and height are both fixed. - this.stage.onResize(this.onResized.bind(this)); - - // Add Event Listeners - this.addEventListeners(); - - // Add Layout method - // this.applyLayoutMethod(); - if (this.layout) { - this.updateLayout(); - } -}; - -DefaultViewManager.prototype.addEventListeners = function(){ - window.addEventListener('unload', function(e){ - this.destroy(); - }.bind(this)); -}; - -DefaultViewManager.prototype.destroy = function(){ - // this.views.each(function(view){ - // view.destroy(); - // }); - - /* - - clearTimeout(this.trimTimeout); - if(this.settings.hidden) { - this.element.removeChild(this.wrapper); - } else { - this.element.removeChild(this.container); + + EpubCFI.prototype.generateChapterComponent = function(_spineNodeIndex, _pos, id) { + var pos = parseInt(_pos), + spineNodeIndex = _spineNodeIndex + 1, + cfi = '/'+spineNodeIndex+'/'; + + cfi += (pos + 1) * 2; + + if(id) { + cfi += "[" + id + "]"; } - */ -}; - -DefaultViewManager.prototype.onResized = function(e) { - clearTimeout(this.resizeTimeout); - this.resizeTimeout = setTimeout(function(){ - this.resize(); - }.bind(this), 150); -}; - -DefaultViewManager.prototype.resize = function(width, height){ - - // Clear the queue - this.q.clear(); - - this._stageSize = this.stage.size(width, height); - this._bounds = this.bounds(); - - // Update for new views - this.viewSettings.width = this._stageSize.width; - this.viewSettings.height = this._stageSize.height; - - // Update for existing views - this.views.each(function(view) { - view.size(this._stageSize.width, this._stageSize.height); - }.bind(this)); - - this.updateLayout(); - - this.trigger("resized", { - width: this.stage.width, - height: this.stage.height - }); - -}; - -DefaultViewManager.prototype.createView = function(section) { - return new this.View(section, this.viewSettings); -}; - -DefaultViewManager.prototype.display = function(section, target){ - - var displaying = new RSVP.defer(); - var displayed = displaying.promise; - - // Check to make sure the section we want isn't already shown - var visible = this.views.find(section); - - // View is already shown, just move to correct location - if(visible && target) { - offset = visible.locationOf(target); - this.moveTo(offset); - displaying.resolve(); - return displayed; - } - - // Hide all current views - this.views.hide(); - - this.views.clear(); - - this.add(section) - .then(function(){ - var next; - if (this.layout.name === "pre-paginated" && - this.layout.divisor > 1) { - next = section.next(); - if (next) { - return this.add(next); + + return cfi; + }; + + module.exports = EpubCFI; + + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + + //-- Hooks allow for injecting functions that must all complete in order before finishing + // They will execute in parallel but all must finish before continuing + // Functions may return a promise if they are asycn. + + // this.content = new EPUBJS.Hook(); + // this.content.register(function(){}); + // this.content.trigger(args).then(function(){}); + + function Hook(context){ + this.context = context || this; + this.hooks = []; + }; + + // Adds a function to be run before a hook completes + Hook.prototype.register = function(){ + for(var i = 0; i < arguments.length; ++i) { + if (typeof arguments[i] === "function") { + this.hooks.push(arguments[i]); + } else { + // unpack array + for(var j = 0; j < arguments[i].length; ++j) { + this.hooks.push(arguments[i][j]); } } - }.bind(this)) - .then(function(view){ - - // Move to correct place within the section, if needed - if(target) { - offset = view.locationOf(target); - this.moveTo(offset); + } + }; + + // Triggers a hook to run all functions + Hook.prototype.trigger = function(){ + var args = arguments; + var context = this.context; + var promises = []; + + this.hooks.forEach(function(task, i) { + var executing = task.apply(context, args); + + if(executing && typeof executing["then"] === "function") { + // Task is a function that returns a promise + promises.push(executing); } - - this.views.show(); - - displaying.resolve(); - - }.bind(this)) - // .then(function(){ - // return this.hooks.display.trigger(view); - // }.bind(this)) - // .then(function(){ - // this.views.show(); - // }.bind(this)); - return displayed; -}; - -DefaultViewManager.prototype.afterDisplayed = function(view){ - this.trigger("added", view); -}; - -DefaultViewManager.prototype.afterResized = function(view){ - this.trigger("resize", view.section); -}; - -// DefaultViewManager.prototype.moveTo = function(offset){ -// this.scrollTo(offset.left, offset.top); -// }; - -DefaultViewManager.prototype.moveTo = function(offset){ - var distX = 0, - distY = 0; - - if(this.settings.axis === "vertical") { - distY = offset.top; - } else { - distX = Math.floor(offset.left / this.layout.delta) * this.layout.delta; - - if (distX + this.layout.delta > this.container.scrollWidth) { - distX = this.container.scrollWidth - this.layout.delta; + // Otherwise Task resolves immediately, continue + }); + + + return RSVP.all(promises); + }; + + // Adds a function to be run before a hook completes + Hook.prototype.list = function(){ + return this.hooks; + }; + + Hook.prototype.clear = function(){ + return this.hooks = []; + }; + + module.exports = Hook; + + +/***/ }, +/* 17 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var URI = __webpack_require__(6); + var core = __webpack_require__(11); + var EpubCFI = __webpack_require__(15); + var Hook = __webpack_require__(16); + + function Section(item, hooks){ + this.idref = item.idref; + this.linear = item.linear; + this.properties = item.properties; + this.index = item.index; + this.href = item.href; + this.url = item.url; + this.next = item.next; + this.prev = item.prev; + + this.cfiBase = item.cfiBase; + + if (hooks) { + this.hooks = hooks; + } else { + this.hooks = {}; + this.hooks.serialize = new Hook(this); + this.hooks.content = new Hook(this); + } + + }; + + + Section.prototype.load = function(_request){ + var request = _request || this.request || __webpack_require__(18); + var loading = new RSVP.defer(); + var loaded = loading.promise; + + if(this.contents) { + loading.resolve(this.contents); + } else { + request(this.url) + .then(function(xml){ + var base; + var directory = URI(this.url).directory(); + + this.document = xml; + this.contents = xml.documentElement; + + return this.hooks.content.trigger(this.document, this); + }.bind(this)) + .then(function(){ + loading.resolve(this.contents); + }.bind(this)) + .catch(function(error){ + loading.reject(error); + }); } - } - - this.scrollTo(distX, distY); -}; - -DefaultViewManager.prototype.add = function(section){ - var view = this.createView(section); - - this.views.append(view); - - // view.on("shown", this.afterDisplayed.bind(this)); - view.onDisplayed = this.afterDisplayed.bind(this); - view.onResize = this.afterResized.bind(this); - - return view.display(this.request); - -}; - -DefaultViewManager.prototype.append = function(section){ - var view = this.createView(section); - this.views.append(view); - return view.display(this.request); -}; - -DefaultViewManager.prototype.prepend = function(section){ - var view = this.createView(section); - - this.views.prepend(view); - return view.display(this.request); -}; -// DefaultViewManager.prototype.resizeView = function(view) { -// -// if(this.settings.globalLayoutProperties.layout === "pre-paginated") { -// view.lock("both", this.bounds.width, this.bounds.height); -// } else { -// view.lock("width", this.bounds.width, this.bounds.height); -// } -// -// }; - -DefaultViewManager.prototype.next = function(){ - var next; - var view; - var left; - - if(!this.views.length) return; - - if(this.settings.axis === "horizontal") { + + return loaded; + }; + + Section.prototype.base = function(_document){ + var task = new RSVP.defer(); + var base = _document.createElement("base"); // TODO: check if exists + var head; + console.log(window.location.origin + "/" +this.url); + + base.setAttribute("href", window.location.origin + "/" +this.url); + + if(_document) { + head = _document.querySelector("head"); + } + if(head) { + head.insertBefore(base, head.firstChild); + task.resolve(); + } else { + task.reject(new Error("No head to insert into")); + } + + + return task.promise; + }; + + Section.prototype.beforeSectionLoad = function(){ + // Stub for a hook - replace me for now + }; + + Section.prototype.render = function(_request){ + var rendering = new RSVP.defer(); + var rendered = rendering.promise; + this.output; // TODO: better way to return this from hooks? + + this.load(_request). + then(function(contents){ + var serializer; + + if (typeof XMLSerializer === "undefined") { + XMLSerializer = __webpack_require__(13).XMLSerializer; + } + serializer = new XMLSerializer(); + this.output = serializer.serializeToString(contents); + return this.output; + }.bind(this)). + then(function(){ + return this.hooks.serialize.trigger(this.output, this); + }.bind(this)). + then(function(){ + rendering.resolve(this.output); + }.bind(this)) + .catch(function(error){ + rendering.reject(error); + }); + + return rendered; + }; + + Section.prototype.find = function(_query){ + + }; + + /** + * Reconciles the current chapters layout properies with + * the global layout properities. + * Takes: global layout settings object, chapter properties string + * Returns: Object with layout properties + */ + Section.prototype.reconcileLayoutSettings = function(global){ + //-- Get the global defaults + var settings = { + layout : global.layout, + spread : global.spread, + orientation : global.orientation + }; + + //-- Get the chapter's display type + this.properties.forEach(function(prop){ + var rendition = prop.replace("rendition:", ''); + var split = rendition.indexOf("-"); + var property, value; + + if(split != -1){ + property = rendition.slice(0, split); + value = rendition.slice(split+1); + + settings[property] = value; + } + }); + return settings; + }; + + Section.prototype.cfiFromRange = function(_range) { + return new EpubCFI(_range, this.cfiBase).toString(); + }; + + Section.prototype.cfiFromElement = function(el) { + return new EpubCFI(el, this.cfiBase).toString(); + }; + + module.exports = Section; + + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var URI = __webpack_require__(6); + var core = __webpack_require__(11); + + function request(url, type, withCredentials, headers) { + var supportsURL = (typeof window != "undefined") ? window.URL : false; // TODO: fallback for url if window isn't defined + var BLOB_RESPONSE = supportsURL ? "blob" : "arraybuffer"; + var uri; + + var deferred = new RSVP.defer(); + + var xhr = new XMLHttpRequest(); + + //-- Check from PDF.js: + // https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js + var xhrPrototype = XMLHttpRequest.prototype; + + var header; + + if (!('overrideMimeType' in xhrPrototype)) { + // IE10 might have response, but not overrideMimeType + Object.defineProperty(xhrPrototype, 'overrideMimeType', { + value: function xmlHttpRequestOverrideMimeType(mimeType) {} + }); + } + if(withCredentials) { + xhr.withCredentials = true; + } + + xhr.onreadystatechange = handler; + xhr.onerror = err; + + xhr.open("GET", url, true); + + for(header in headers) { + xhr.setRequestHeader(header, headers[header]); + } + + if(type == "json") { + xhr.setRequestHeader("Accept", "application/json"); + } + + // If type isn't set, determine it from the file extension + if(!type) { + uri = URI(url); + type = uri.suffix(); + } + + if(type == 'blob'){ + xhr.responseType = BLOB_RESPONSE; + } + + + if(core.isXml(type)) { + // xhr.responseType = "document"; + xhr.overrideMimeType('text/xml'); // for OPF parsing + } + + if(type == 'xhtml') { + // xhr.responseType = "document"; + } + + if(type == 'html' || type == 'htm') { + // xhr.responseType = "document"; + } + + if(type == "binary") { + xhr.responseType = "arraybuffer"; + } + + xhr.send(); + + function err(e) { + console.error(e); + deferred.reject(e); + } + + function handler() { + if (this.readyState === XMLHttpRequest.DONE) { + + if (this.status === 200 || this.responseXML ) { //-- Firefox is reporting 0 for blob urls + var r; + + if (!this.response && !this.responseXML) { + deferred.reject({ + status: this.status, + message : "Empty Response", + stack : new Error().stack + }); + return deferred.promise; + } + + if (this.status === 403) { + deferred.reject({ + status: this.status, + response: this.response, + message : "Forbidden", + stack : new Error().stack + }); + return deferred.promise; + } + + if((this.responseType == '' || this.responseType == 'document') + && this.responseXML){ + r = this.responseXML; + } else + if(core.isXml(type)){ + // xhr.overrideMimeType('text/xml'); // for OPF parsing + // If this.responseXML wasn't set, try to parse using a DOMParser from text + r = core.parse(this.response, "text/xml"); + }else + if(type == 'xhtml'){ + r = core.parse(this.response, "application/xhtml+xml"); + }else + if(type == 'html' || type == 'htm'){ + r = core.parse(this.response, "text/html"); + }else + if(type == 'json'){ + r = JSON.parse(this.response); + }else + if(type == 'blob'){ + + if(supportsURL) { + r = this.response; + } else { + //-- Safari doesn't support responseType blob, so create a blob from arraybuffer + r = new Blob([this.response]); + } + + }else{ + r = this.response; + } + + deferred.resolve(r); + } else { + + deferred.reject({ + status: this.status, + message : this.response, + stack : new Error().stack + }); + + } + } + } + + return deferred.promise; + }; + + module.exports = request; - this.scrollLeft = this.container.scrollLeft; - left = this.container.scrollLeft + this.container.offsetWidth + this.layout.delta; +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { - if(left < this.container.scrollWidth) { - this.scrollBy(this.layout.delta, 0); - } else if (left - this.layout.columnWidth === this.container.scrollWidth) { - this.scrollTo(this.container.scrollWidth - this.layout.delta, 0); + var URI = __webpack_require__(6); + var core = __webpack_require__(11); + + function base(doc, section){ + var base; + var head; + + if(!doc){ + return; + } + + // head = doc.querySelector("head"); + // base = head.querySelector("base"); + head = core.qs(doc, "head"); + base = core.qs(head, "base"); + + if(!base) { + base = doc.createElement("base"); + head.insertBefore(base, head.firstChild); + } + + base.setAttribute("href", section.url); + } + + function canonical(doc, section){ + var head; + var link; + var url = section.url; // window.location.origin + window.location.pathname + "?loc=" + encodeURIComponent(section.url); + + if(!doc){ + return; + } + + head = core.qs(doc, "head"); + link = core.qs(head, "link[rel='canonical']"); + + if (link) { + link.setAttribute("href", url); } else { - next = this.views.last().section.next(); + link = doc.createElement("link"); + link.setAttribute("rel", "canonical"); + link.setAttribute("href", url); + head.appendChild(link); } - - - } else { - - next = this.views.last().section.next(); - } - - if(next) { - this.views.clear(); - - return this.append(next) - .then(function(){ - var right; - if (this.layout.name && this.layout.divisor > 1) { - right = next.next(); - if (right) { - return this.append(right); + + function links(view, renderer) { + + var links = view.document.querySelectorAll("a[href]"); + var replaceLinks = function(link){ + var href = link.getAttribute("href"); + + if(href.indexOf("mailto:") === 0){ + return; + } + + var linkUri = URI(href); + var absolute = linkUri.absoluteTo(view.section.url); + var relative = absolute.relativeTo(this.book.baseUrl).toString(); + + if(linkUri.protocol()){ + + link.setAttribute("target", "_blank"); + + }else{ + /* + if(baseDirectory) { + // We must ensure that the file:// protocol is preserved for + // local file links, as in certain contexts (such as under + // Titanium), file links without the file:// protocol will not + // work + if (baseUri.protocol === "file") { + relative = core.resolveUrl(baseUri.base, href); + } else { + relative = core.resolveUrl(baseDirectory, href); } + } else { + relative = href; } - }.bind(this)) - .then(function(){ - this.views.show(); - }.bind(this)); - } - - -}; - -DefaultViewManager.prototype.prev = function(){ - var prev; - var view; - var left; - - if(!this.views.length) return; - - if(this.settings.axis === "horizontal") { - - this.scrollLeft = this.container.scrollLeft; - - left = this.container.scrollLeft; - - if(left > 0) { - this.scrollBy(-this.layout.delta, 0); - } else { - prev = this.views.first().section.prev(); + */ + + if(linkUri.fragment()) { + // do nothing with fragment yet + } else { + link.onclick = function(){ + renderer.display(relative); + return false; + }; + } + + } + }.bind(this); + + for (var i = 0; i < links.length; i++) { + replaceLinks(links[i]); } - - - } else { - - prev = this.views.first().section.prev(); - + + + }; + + function substitute(content, urls, replacements) { + urls.forEach(function(url, i){ + if (url && replacements[i]) { + content = content.replace(new RegExp(url, 'g'), replacements[i]); + } + }); + return content; } + module.exports = { + 'base': base, + 'canonical' : canonical, + 'links': links, + 'substitute': substitute + }; - if(prev) { - this.views.clear(); - return this.prepend(prev) - .then(function(){ - var left; - if (this.layout.name && this.layout.divisor > 1) { - left = prev.prev(); - if (left) { - return this.prepend(left); +/***/ }, +/* 20 */ +/***/ function(module, exports, __webpack_require__) { + + var core = __webpack_require__(11); + var Queue = __webpack_require__(21); + var EpubCFI = __webpack_require__(15); + var RSVP = __webpack_require__(2); + + function Locations(spine, request) { + this.spine = spine; + this.request = request; + + this.q = new Queue(this); + this.epubcfi = new EpubCFI(); + + this._locations = []; + this.total = 0; + + this.break = 150; + + this._current = 0; + + }; + + // Load all of sections in the book + Locations.prototype.generate = function(chars) { + + if (chars) { + this.break = chars; + } + + this.q.pause(); + + this.spine.each(function(section) { + + this.q.enqueue(this.process, section); + + }.bind(this)); + + return this.q.run().then(function() { + this.total = this._locations.length-1; + + if (this._currentCfi) { + this.currentLocation = this._currentCfi; + } + + return this._locations; + // console.log(this.precentage(this.book.rendition.location.start), this.precentage(this.book.rendition.location.end)); + }.bind(this)); + + }; + + Locations.prototype.process = function(section) { + + return section.load(this.request) + .then(function(contents) { + + var range; + var doc = contents.ownerDocument; + var counter = 0; + + this.sprint(contents, function(node) { + var len = node.length; + var dist; + var pos = 0; + + // Start range + if (counter == 0) { + range = doc.createRange(); + range.setStart(node, 0); } + + dist = this.break - counter; + + // Node is smaller than a break + if(dist > len){ + counter += len; + pos = len; + } + + while (pos < len) { + counter = this.break; + pos += this.break; + + // Gone over + if(pos >= len){ + // Continue counter for next node + counter = len - (pos - this.break); + + // At End + } else { + // End the previous range + range.setEnd(node, pos); + cfi = section.cfiFromRange(range); + this._locations.push(cfi); + counter = 0; + + // Start new range + pos += 1; + range = doc.createRange(); + range.setStart(node, pos); + } + } + + + + }.bind(this)); + + // Close remaining + if (range) { + range.setEnd(prev, prev.length); + cfi = section.cfiFromRange(range); + this._locations.push(cfi) + counter = 0; } - }.bind(this)) - .then(function(){ - if(this.settings.axis === "horizontal") { - this.scrollTo(this.container.scrollWidth - this.layout.delta, 0); - } - this.views.show(); + }.bind(this)); - } -}; - -DefaultViewManager.prototype.current = function(){ - var visible = this.visible(); - if(visible.length){ - // Current is the last visible view - return visible[visible.length-1]; - } - return null; -}; - -DefaultViewManager.prototype.currentLocation = function(){ - var view; - var start, end; - - if(this.views.length) { - view = this.views.first(); - start = container.left - view.position().left; - end = start + this.layout.spread; - - return this.mapping.page(view, view.section.cfiBase); - } - -}; - -DefaultViewManager.prototype.isVisible = function(view, offsetPrev, offsetNext, _container){ - var position = view.position(); - var container = _container || this.bounds(); - - if(this.settings.axis === "horizontal" && - position.right > container.left - offsetPrev && - position.left < container.right + offsetNext) { - - return true; - - } else if(this.settings.axis === "vertical" && - position.bottom > container.top - offsetPrev && - position.top < container.bottom + offsetNext) { - - return true; - } - - return false; - -}; - -DefaultViewManager.prototype.visible = function(){ - // return this.views.displayed(); - var container = this.bounds(); - var views = this.views.displayed(); - var viewsLength = views.length; - var visible = []; - var isVisible; - var view; - - for (var i = 0; i < viewsLength; i++) { - view = views[i]; - isVisible = this.isVisible(view, 0, 0, container); - - if(isVisible === true) { - visible.push(view); + + }; + + Locations.prototype.sprint = function(root, func) { + var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false); + + while ((node = treeWalker.nextNode())) { + func(node); } - - } - return visible; -}; - -DefaultViewManager.prototype.scrollBy = function(x, y, silent){ - if(silent) { - this.ignore = true; - } - - if(this.settings.height) { - - if(x) this.container.scrollLeft += x; - if(y) this.container.scrollTop += y; - - } else { - window.scrollBy(x,y); - } - // console.log("scrollBy", x, y); - this.scrolled = true; - this.onScroll(); -}; - -DefaultViewManager.prototype.scrollTo = function(x, y, silent){ - if(silent) { - this.ignore = true; - } - - if(this.settings.height) { - this.container.scrollLeft = x; - this.container.scrollTop = y; - } else { - window.scrollTo(x,y); - } - // console.log("scrollTo", x, y); - this.scrolled = true; - this.onScroll(); - // if(this.container.scrollLeft != x){ - // setTimeout(function() { - // this.scrollTo(x, y, silent); - // }.bind(this), 10); - // return; - // }; - }; - -DefaultViewManager.prototype.onScroll = function(){ - -}; - -DefaultViewManager.prototype.bounds = function() { - var bounds; - - bounds = this.stage.bounds(); - - return bounds; -}; - -DefaultViewManager.prototype.applyLayout = function(layout) { - - this.layout = layout; - this.updateLayout(); - - this.mapping = new Mapping(this.layout); - // this.manager.layout(this.layout.format); -}; - -DefaultViewManager.prototype.updateLayout = function() { - if (!this.stage) { - return; - } - - this._stageSize = this.stage.size(); - - if(this.settings.axis === "vertical") { - this.layout.calculate(this._stageSize.width, this._stageSize.height); - } else { - this.layout.calculate( - this._stageSize.width, - this._stageSize.height, - this.settings.gap - ); - - // Set the look ahead offset for what is visible - this.settings.offset = this.layout.delta; - - this.stage.addStyleRules("iframe", [{"margin-right" : this.layout.gap + "px"}]); - - } - - // Set the dimensions for views - this.viewSettings.width = this.layout.width; - this.viewSettings.height = this.layout.height; - - this.setLayout(this.layout); - -}; - -DefaultViewManager.prototype.setLayout = function(layout){ - - this.viewSettings.layout = layout; - - if(this.views) { - - this.views.each(function(view){ - view.setLayout(layout); + + }; + + Locations.prototype.locationFromCfi = function(cfi){ + // Check if the location has not been set yet + if(this._locations.length === 0) { + return -1; + } + + return core.locationOf(cfi, this._locations, this.epubcfi.compare); + }; + + Locations.prototype.precentageFromCfi = function(cfi) { + // Find closest cfi + var loc = this.locationFromCfi(cfi); + // Get percentage in total + return this.precentageFromLocation(loc); + }; + + Locations.prototype.percentageFromLocation = function(loc) { + if (!loc || !this.total) { + return 0; + } + return (loc / this.total); + }; + + Locations.prototype.cfiFromLocation = function(loc){ + var cfi = -1; + // check that pg is an int + if(typeof loc != "number"){ + loc = parseInt(pg); + } + + if(loc >= 0 && loc < this._locations.length) { + cfi = this._locations[loc]; + } + + return cfi; + }; + + Locations.prototype.cfiFromPercentage = function(value){ + var percentage = (value > 1) ? value / 100 : value; // Normalize value to 0-1 + var loc = Math.ceil(this.total * percentage); + + return this.cfiFromLocation(loc); + }; + + Locations.prototype.load = function(locations){ + this._locations = JSON.parse(locations); + this.total = this._locations.length-1; + return this._locations; + }; + + Locations.prototype.save = function(json){ + return JSON.stringify(this._locations); + }; + + Locations.prototype.getCurrent = function(json){ + return this._current; + }; + + Locations.prototype.setCurrent = function(curr){ + var loc; + + if(typeof curr == "string"){ + this._currentCfi = curr; + } else if (typeof curr == "number") { + this._current = curr; + } else { + return; + } + + if(this._locations.length === 0) { + return; + } + + if(typeof curr == "string"){ + loc = this.locationFromCfi(curr); + this._current = loc; + } else { + loc = curr; + } + + this.trigger("changed", { + percentage: this.precentageFromLocation(loc) }); - - } - -}; - -DefaultViewManager.prototype.updateFlow = function(flow){ - var axis = (flow === "paginated") ? "horizontal" : "vertical"; - - this.settings.axis = axis; - - this.viewSettings.axis = axis; - - this.settings.overflow = (flow === "paginated") ? "hidden" : "auto"; - // this.views.each(function(view){ - // view.setAxis(axis); - // }); - -}; - - //-- Enable binding events to Manager - RSVP.EventTarget.mixin(DefaultViewManager.prototype); - - module.exports = DefaultViewManager; - -},{"../../core":10,"../../epubcfi":11,"../../mapping":20,"../../queue":23,"../helpers/stage":17,"../helpers/views":18,"rsvp":5}],17:[function(require,module,exports){ -var core = require('../../core'); - -function Stage(_options) { - this.settings = _options || {}; - this.id = "epubjs-container-" + core.uuid(); - - this.container = this.create(this.settings); - - if(this.settings.hidden) { - this.wrapper = this.wrap(this.container); - } - -} - -/** -* Creates an element to render to. -* Resizes to passed width and height or to the elements size -*/ -Stage.prototype.create = function(options){ - var height = options.height;// !== false ? options.height : "100%"; - var width = options.width;// !== false ? options.width : "100%"; - var overflow = options.overflow || false; - var axis = options.axis || "vertical"; - - if(options.height && core.isNumber(options.height)) { - height = options.height + "px"; - } - - if(options.width && core.isNumber(options.width)) { - width = options.width + "px"; - } - - // Create new container element - container = document.createElement("div"); - - container.id = this.id; - container.classList.add("epub-container"); - - // Style Element - // container.style.fontSize = "0"; - container.style.wordSpacing = "0"; - container.style.lineHeight = "0"; - container.style.verticalAlign = "top"; - - if(axis === "horizontal") { - container.style.whiteSpace = "nowrap"; - } - - if(width){ - container.style.width = width; - } - - if(height){ - container.style.height = height; - } - - if (overflow) { - container.style.overflow = overflow; - } - - return container; -}; - -Stage.wrap = function(container) { - var wrapper = document.createElement("div"); - - wrapper.style.visibility = "hidden"; - wrapper.style.overflow = "hidden"; - wrapper.style.width = "0"; - wrapper.style.height = "0"; - - wrapper.appendChild(container); - return wrapper; -}; - - -Stage.prototype.getElement = function(_element){ - var element; - - if(core.isElement(_element)) { - element = _element; - } else if (typeof _element === "string") { - element = document.getElementById(_element); - } - - if(!element){ - console.error("Not an Element"); - return; - } - - return element; -}; - -Stage.prototype.attachTo = function(what){ - - var element = this.getElement(what); - var base; - - if(!element){ - return; - } - - if(this.settings.hidden) { - base = this.wrapper; - } else { - base = this.container; - } - - element.appendChild(base); - - this.element = element; - - return element; - -}; - -Stage.prototype.getContainer = function() { - return this.container; -}; - -Stage.prototype.onResize = function(func){ - // Only listen to window for resize event if width and height are not fixed. - // This applies if it is set to a percent or auto. - if(!core.isNumber(this.settings.width) || - !core.isNumber(this.settings.height) ) { - window.addEventListener("resize", func, false); - } - -}; - -Stage.prototype.size = function(width, height){ - var bounds; - // var width = _width || this.settings.width; - // var height = _height || this.settings.height; - - // If width or height are set to false, inherit them from containing element - if(width === null) { - bounds = this.element.getBoundingClientRect(); - - if(bounds.width) { - width = bounds.width; - this.container.style.width = bounds.width + "px"; + }; + + Object.defineProperty(Locations.prototype, 'currentLocation', { + get: function () { + return this._current; + }, + set: function (curr) { + this.setCurrent(curr); + } + }); + + RSVP.EventTarget.mixin(Locations.prototype); + + module.exports = Locations; + + +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var core = __webpack_require__(11); + + function Queue(_context){ + this._q = []; + this.context = _context; + this.tick = core.requestAnimationFrame; + this.running = false; + this.paused = false; + }; + + // Add an item to the queue + Queue.prototype.enqueue = function() { + var deferred, promise; + var queued; + var task = [].shift.call(arguments); + var args = arguments; + + // Handle single args without context + // if(args && !Array.isArray(args)) { + // args = [args]; + // } + if(!task) { + return console.error("No Task Provided"); + } + + if(typeof task === "function"){ + + deferred = new RSVP.defer(); + promise = deferred.promise; + + queued = { + "task" : task, + "args" : args, + //"context" : context, + "deferred" : deferred, + "promise" : promise + }; + + } else { + // Task is a promise + queued = { + "promise" : task + }; + + } + + this._q.push(queued); + + // Wait to start queue flush + if (this.paused == false && !this.running) { + // setTimeout(this.flush.bind(this), 0); + // this.tick.call(window, this.run.bind(this)); + this.run(); + } + + return queued.promise; + }; + + // Run one item + Queue.prototype.dequeue = function(){ + var inwait, task, result; + + if(this._q.length) { + inwait = this._q.shift(); + task = inwait.task; + if(task){ + // console.log(task) + + result = task.apply(this.context, inwait.args); + + if(result && typeof result["then"] === "function") { + // Task is a function that returns a promise + return result.then(function(){ + inwait.deferred.resolve.apply(this.context, arguments); + }.bind(this)); + } else { + // Task resolves immediately + inwait.deferred.resolve.apply(this.context, result); + return inwait.promise; + } + + + + } else if(inwait.promise) { + // Task is a promise + return inwait.promise; + } + + } else { + inwait = new RSVP.defer(); + inwait.deferred.resolve(); + return inwait.promise; + } + + }; + + // Run All Immediately + Queue.prototype.dump = function(){ + while(this._q.length) { + this.dequeue(); + } + }; + + // Run all sequentially, at convince + + Queue.prototype.run = function(){ + + if(!this.running){ + this.running = true; + this.defered = new RSVP.defer(); + } + + this.tick.call(window, function() { + + if(this._q.length) { + + this.dequeue() + .then(function(){ + this.run(); + }.bind(this)); + + } else { + this.defered.resolve(); + this.running = undefined; + } + + }.bind(this)); + + // Unpause + if(this.paused == true) { + this.paused = false; + } + + return this.defered.promise; + }; + + // Flush all, as quickly as possible + Queue.prototype.flush = function(){ + + if(this.running){ + return this.running; + } + + if(this._q.length) { + this.running = this.dequeue() + .then(function(){ + this.running = undefined; + return this.flush(); + }.bind(this)); + + return this.running; } - } - - if(height === null) { - bounds = bounds || this.element.getBoundingClientRect(); - - if(bounds.height) { - height = bounds.height; - this.container.style.height = bounds.height + "px"; + + }; + + // Clear all items in wait + Queue.prototype.clear = function(){ + this._q = []; + this.running = false; + }; + + Queue.prototype.length = function(){ + return this._q.length; + }; + + Queue.prototype.pause = function(){ + this.paused = true; + }; + + // Create a new task from a callback + function Task(task, args, context){ + + return function(){ + var toApply = arguments || []; + + return new RSVP.Promise(function(resolve, reject) { + var callback = function(value){ + resolve(value); + }; + // Add the callback to the arguments list + toApply.push(callback); + + // Apply all arguments to the functions + task.apply(this, toApply); + + }.bind(this)); + + }; + + }; + + module.exports = Queue; + + +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { + + var URI = __webpack_require__(6); + var core = __webpack_require__(11); + var EpubCFI = __webpack_require__(15); + + + function Parser(){}; + + Parser.prototype.container = function(containerXml){ + //-- + var rootfile, fullpath, folder, encoding; + + if(!containerXml) { + console.error("Container File Not Found"); + return; + } + + rootfile = core.qs(containerXml, "rootfile"); + + if(!rootfile) { + console.error("No RootFile Found"); + return; + } + + fullpath = rootfile.getAttribute('full-path'); + folder = URI(fullpath).directory(); + encoding = containerXml.xmlEncoding; + + //-- Now that we have the path we can parse the contents + return { + 'packagePath' : fullpath, + 'basePath' : folder, + 'encoding' : encoding + }; + }; + + Parser.prototype.identifier = function(packageXml){ + var metadataNode; + + if(!packageXml) { + console.error("Package File Not Found"); + return; } - - } - - if(!core.isNumber(width)) { - bounds = this.container.getBoundingClientRect(); - width = bounds.width; - //height = bounds.height; - } - - if(!core.isNumber(height)) { - bounds = bounds || this.container.getBoundingClientRect(); - //width = bounds.width; - height = bounds.height; - } - - - this.containerStyles = window.getComputedStyle(this.container); - - this.containerPadding = { - left: parseFloat(this.containerStyles["padding-left"]) || 0, - right: parseFloat(this.containerStyles["padding-right"]) || 0, - top: parseFloat(this.containerStyles["padding-top"]) || 0, - bottom: parseFloat(this.containerStyles["padding-bottom"]) || 0 + + metadataNode = core.qs(packageXml, "metadata"); + + if(!metadataNode) { + console.error("No Metadata Found"); + return; + } + + return this.getElementText(metadataNode, "identifier"); }; - - return { - width: width - - this.containerPadding.left - - this.containerPadding.right, - height: height - - this.containerPadding.top - - this.containerPadding.bottom + + Parser.prototype.packageContents = function(packageXml){ + var parse = this; + var metadataNode, manifestNode, spineNode; + var manifest, navPath, ncxPath, coverPath; + var spineNodeIndex; + var spine; + var spineIndexByURL; + var metadata; + + if(!packageXml) { + console.error("Package File Not Found"); + return; + } + + metadataNode = core.qs(packageXml, "metadata"); + if(!metadataNode) { + console.error("No Metadata Found"); + return; + } + + manifestNode = core.qs(packageXml, "manifest"); + if(!manifestNode) { + console.error("No Manifest Found"); + return; + } + + spineNode = core.qs(packageXml, "spine"); + if(!spineNode) { + console.error("No Spine Found"); + return; + } + + manifest = parse.manifest(manifestNode); + navPath = parse.findNavPath(manifestNode); + ncxPath = parse.findNcxPath(manifestNode, spineNode); + coverPath = parse.findCoverPath(packageXml); + + spineNodeIndex = Array.prototype.indexOf.call(spineNode.parentNode.childNodes, spineNode); + + spine = parse.spine(spineNode, manifest); + + metadata = parse.metadata(metadataNode); + + metadata.direction = spineNode.getAttribute("page-progression-direction"); + + return { + 'metadata' : metadata, + 'spine' : spine, + 'manifest' : manifest, + 'navPath' : navPath, + 'ncxPath' : ncxPath, + 'coverPath': coverPath, + 'spineNodeIndex' : spineNodeIndex + }; }; - -}; - -Stage.prototype.bounds = function(){ - - if(!this.container) { - return core.windowBounds(); - } else { - return this.container.getBoundingClientRect(); - } - -} - -Stage.prototype.getSheet = function(){ - var style = document.createElement("style"); - - // WebKit hack --> https://davidwalsh.name/add-rules-stylesheets - style.appendChild(document.createTextNode("")); - - document.head.appendChild(style); - - return style.sheet; -} - -Stage.prototype.addStyleRules = function(selector, rulesArray){ - var scope = "#" + this.id + " "; - var rules = ""; - - if(!this.sheet){ - this.sheet = this.getSheet(); - } - - rulesArray.forEach(function(set) { - for (var prop in set) { - if(set.hasOwnProperty(prop)) { - rules += prop + ":" + set[prop] + ";"; + + //-- Find TOC NAV + Parser.prototype.findNavPath = function(manifestNode){ + // Find item with property 'nav' + // Should catch nav irregardless of order + // var node = manifestNode.querySelector("item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']"); + var node = core.qsp(manifestNode, "item", {"properties":"nav"}); + return node ? node.getAttribute('href') : false; + }; + + //-- Find TOC NCX: media-type="application/x-dtbncx+xml" href="toc.ncx" + Parser.prototype.findNcxPath = function(manifestNode, spineNode){ + // var node = manifestNode.querySelector("item[media-type='application/x-dtbncx+xml']"); + var node = core.qsp(manifestNode, "item", {"media-type":"application/x-dtbncx+xml"}); + var tocId; + + // If we can't find the toc by media-type then try to look for id of the item in the spine attributes as + // according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2, + // "The item that describes the NCX must be referenced by the spine toc attribute." + if (!node) { + tocId = spineNode.getAttribute("toc"); + if(tocId) { + // node = manifestNode.querySelector("item[id='" + tocId + "']"); + node = manifestNode.getElementById(tocId); } } - }) - - this.sheet.insertRule(scope + selector + " {" + rules + "}", 0); -} - - - -module.exports = Stage; - -},{"../../core":10}],18:[function(require,module,exports){ -function Views(container) { - this.container = container; - this._views = []; - this.length = 0; - this.hidden = false; -}; - -Views.prototype.all = function() { - return this._views; -}; - -Views.prototype.first = function() { - return this._views[0]; -}; - -Views.prototype.last = function() { - return this._views[this._views.length-1]; -}; - -Views.prototype.indexOf = function(view) { - return this._views.indexOf(view); -}; - -Views.prototype.slice = function() { - return this._views.slice.apply(this._views, arguments); -}; - -Views.prototype.get = function(i) { - return this._views[i]; -}; - -Views.prototype.append = function(view){ - this._views.push(view); - if(this.container){ - this.container.appendChild(view.element); - } - this.length++; - return view; -}; - -Views.prototype.prepend = function(view){ - this._views.unshift(view); - if(this.container){ - this.container.insertBefore(view.element, this.container.firstChild); - } - this.length++; - return view; -}; - -Views.prototype.insert = function(view, index) { - this._views.splice(index, 0, view); - - if(this.container){ - if(index < this.container.children.length){ - this.container.insertBefore(view.element, this.container.children[index]); + + return node ? node.getAttribute('href') : false; + }; + + //-- Expanded to match Readium web components + Parser.prototype.metadata = function(xml){ + var metadata = {}, + p = this; + + metadata.title = p.getElementText(xml, 'title'); + metadata.creator = p.getElementText(xml, 'creator'); + metadata.description = p.getElementText(xml, 'description'); + + metadata.pubdate = p.getElementText(xml, 'date'); + + metadata.publisher = p.getElementText(xml, 'publisher'); + + metadata.identifier = p.getElementText(xml, "identifier"); + metadata.language = p.getElementText(xml, "language"); + metadata.rights = p.getElementText(xml, "rights"); + + metadata.modified_date = p.getPropertyText(xml, 'dcterms:modified'); + + metadata.layout = p.getPropertyText(xml, "rendition:layout"); + metadata.orientation = p.getPropertyText(xml, 'rendition:orientation'); + metadata.flow = p.getPropertyText(xml, 'rendition:flow'); + metadata.viewport = p.getPropertyText(xml, 'rendition:viewport'); + // metadata.page_prog_dir = packageXml.querySelector("spine").getAttribute("page-progression-direction"); + + return metadata; + }; + + //-- Find Cover: + //-- Fallback for Epub 2.0 + Parser.prototype.findCoverPath = function(packageXml){ + var pkg = core.qs(packageXml, "package"); + var epubVersion = pkg.getAttribute('version'); + + if (epubVersion === '2.0') { + var metaCover = core.qsp(packageXml, 'meta', {'name':'cover'}); + if (metaCover) { + var coverId = metaCover.getAttribute('content'); + // var cover = packageXml.querySelector("item[id='" + coverId + "']"); + var cover = packageXml.getElementById(coverId); + return cover ? cover.getAttribute('href') : false; + } + else { + return false; + } + } + else { + // var node = packageXml.querySelector("item[properties='cover-image']"); + var node = core.qsp(packageXml, 'item', {'properties':'cover-image'}); + return node ? node.getAttribute('href') : false; + } + }; + + Parser.prototype.getElementText = function(xml, tag){ + var found = xml.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", tag), + el; + + if(!found || found.length === 0) return ''; + + el = found[0]; + + if(el.childNodes.length){ + return el.childNodes[0].nodeValue; + } + + return ''; + + }; + + Parser.prototype.getPropertyText = function(xml, property){ + var el = core.qsp(xml, "meta", {"property":property}); + + if(el && el.childNodes.length){ + return el.childNodes[0].nodeValue; + } + + return ''; + }; + + Parser.prototype.querySelectorText = function(xml, q){ + var el = xml.querySelector(q); + + if(el && el.childNodes.length){ + return el.childNodes[0].nodeValue; + } + + return ''; + }; + + Parser.prototype.manifest = function(manifestXml){ + var manifest = {}; + + //-- Turn items into an array + // var selected = manifestXml.querySelectorAll("item"); + var selected = core.qsa(manifestXml, "item"); + var items = Array.prototype.slice.call(selected); + + //-- Create an object with the id as key + items.forEach(function(item){ + var id = item.getAttribute('id'), + href = item.getAttribute('href') || '', + type = item.getAttribute('media-type') || '', + properties = item.getAttribute('properties') || ''; + + manifest[id] = { + 'href' : href, + // 'url' : href, + 'type' : type, + 'properties' : properties.length ? properties.split(' ') : [] + }; + + }); + + return manifest; + + }; + + Parser.prototype.spine = function(spineXml, manifest){ + var spine = []; + + var selected = spineXml.getElementsByTagName("itemref"), + items = Array.prototype.slice.call(selected); + + var epubcfi = new EpubCFI(); + + //-- Add to array to mantain ordering and cross reference with manifest + items.forEach(function(item, index){ + var idref = item.getAttribute('idref'); + // var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id); + var props = item.getAttribute('properties') || ''; + var propArray = props.length ? props.split(' ') : []; + // var manifestProps = manifest[Id].properties; + // var manifestPropArray = manifestProps.length ? manifestProps.split(' ') : []; + + var itemref = { + 'idref' : idref, + 'linear' : item.getAttribute('linear') || '', + 'properties' : propArray, + // 'href' : manifest[Id].href, + // 'url' : manifest[Id].url, + 'index' : index + // 'cfiBase' : cfiBase + }; + spine.push(itemref); + }); + + return spine; + }; + + Parser.prototype.querySelectorByType = function(html, element, type){ + var query; + if (typeof html.querySelector != "undefined") { + query = html.querySelector(element+'[*|type="'+type+'"]'); + } + // Handle IE not supporting namespaced epub:type in querySelector + if(!query || query.length === 0) { + query = core.qsa(html, element); + for (var i = 0; i < query.length; i++) { + if(query[i].getAttributeNS("http://www.idpf.org/2007/ops", "type") === type) { + return query[i]; + } + } } else { - this.container.appendChild(view.element); + return query; } - } - - this.length++; - return view; -}; - -Views.prototype.remove = function(view) { - var index = this._views.indexOf(view); - - if(index > -1) { - this._views.splice(index, 1); - } - - - this.destroy(view); - - this.length--; -}; - -Views.prototype.destroy = function(view) { - view.off("resized"); - - if(view.displayed){ - view.destroy(); - } - - if(this.container){ - this.container.removeChild(view.element); - } - view = null; -}; - -// Iterators - -Views.prototype.each = function() { - return this._views.forEach.apply(this._views, arguments); -}; - -Views.prototype.clear = function(){ - // Remove all views - var view; - var len = this.length; - - if(!this.length) return; - - for (var i = 0; i < len; i++) { - view = this._views[i]; - this.destroy(view); - } - - this._views = []; - this.length = 0; -}; - -Views.prototype.find = function(section){ - - var view; - var len = this.length; - - for (var i = 0; i < len; i++) { - view = this._views[i]; - if(view.displayed && view.section.index == section.index) { - return view; + }; + + Parser.prototype.nav = function(navHtml, spineIndexByURL, bookSpine){ + var navElement = this.querySelectorByType(navHtml, "nav", "toc"); + // var navItems = navElement ? navElement.querySelectorAll("ol li") : []; + var navItems = navElement ? core.qsa(navElement, "li") : []; + var length = navItems.length; + var i; + var toc = {}; + var list = []; + var item, parent; + + if(!navItems || length === 0) return list; + + for (i = 0; i < length; ++i) { + item = this.navItem(navItems[i], spineIndexByURL, bookSpine); + toc[item.id] = item; + if(!item.parent) { + list.push(item); + } else { + parent = toc[item.parent]; + parent.subitems.push(item); + } } - } - -}; - -Views.prototype.displayed = function(){ - var displayed = []; - var view; - var len = this.length; - - for (var i = 0; i < len; i++) { - view = this._views[i]; - if(view.displayed){ - displayed.push(view); + + return list; + }; + + Parser.prototype.navItem = function(item, spineIndexByURL, bookSpine){ + var id = item.getAttribute('id') || false, + // content = item.querySelector("a, span"), + content = core.qs(item, "a"), + src = content.getAttribute('href') || '', + text = content.textContent || "", + // split = src.split("#"), + // baseUrl = split[0], + // spinePos = spineIndexByURL[baseUrl], + // spineItem = bookSpine[spinePos], + subitems = [], + parentNode = item.parentNode, + parent; + // cfi = spineItem ? spineItem.cfi : ''; + + if(parentNode && parentNode.nodeName === "navPoint") { + parent = parentNode.getAttribute('id'); } - } - return displayed; -}; - -Views.prototype.show = function(){ - var view; - var len = this.length; - - for (var i = 0; i < len; i++) { - view = this._views[i]; - if(view.displayed){ - view.show(); + + /* + if(!id) { + if(spinePos) { + spineItem = bookSpine[spinePos]; + id = spineItem.id; + cfi = spineItem.cfi; + } else { + id = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid(); + item.setAttribute('id', id); + } } - } - this.hidden = false; -}; - -Views.prototype.hide = function(){ - var view; - var len = this.length; - - for (var i = 0; i < len; i++) { - view = this._views[i]; - if(view.displayed){ - view.hide(); + */ + + return { + "id": id, + "href": src, + "label": text, + "subitems" : subitems, + "parent" : parent + }; + }; + + Parser.prototype.ncx = function(tocXml, spineIndexByURL, bookSpine){ + // var navPoints = tocXml.querySelectorAll("navMap navPoint"); + var navPoints = core.qsa(tocXml, "navPoint"); + var length = navPoints.length; + var i; + var toc = {}; + var list = []; + var item, parent; + + if(!navPoints || length === 0) return list; + + for (i = 0; i < length; ++i) { + item = this.ncxItem(navPoints[i], spineIndexByURL, bookSpine); + toc[item.id] = item; + if(!item.parent) { + list.push(item); + } else { + parent = toc[item.parent]; + parent.subitems.push(item); + } } - } - this.hidden = true; -}; - -module.exports = Views; - -},{}],19:[function(require,module,exports){ -var RSVP = require('rsvp'); -var core = require('../../core'); -var EpubCFI = require('../../epubcfi'); -var Contents = require('../../contents'); - -function IframeView(section, options) { - this.settings = core.extend({ - ignoreClass : '', - axis: 'vertical', - width: 0, - height: 0, - layout: undefined, - globalLayoutProperties: {}, - }, options || {}); - - this.id = "epubjs-view-" + core.uuid(); - this.section = section; - this.index = section.index; - - this.element = this.container(this.settings.axis); - - this.added = false; - this.displayed = false; - this.rendered = false; - - this.width = this.settings.width; - this.height = this.settings.height; - - this.fixedWidth = 0; - this.fixedHeight = 0; - - // Blank Cfi for Parsing - this.epubcfi = new EpubCFI(); - - this.layout = this.settings.layout; - // Dom events to listen for - // this.listenedEvents = ["keydown", "keyup", "keypressed", "mouseup", "mousedown", "click", "touchend", "touchstart"]; -}; - -IframeView.prototype.container = function(axis) { - var element = document.createElement('div'); - - element.classList.add("epub-view"); - - // this.element.style.minHeight = "100px"; - element.style.height = "0px"; - element.style.width = "0px"; - element.style.overflow = "hidden"; - - if(axis && axis == "horizontal"){ - element.style.display = "inline-block"; - } else { - element.style.display = "block"; - } - - return element; -}; - -IframeView.prototype.create = function() { - - if(this.iframe) { - return this.iframe; - } - - if(!this.element) { - this.element = this.createContainer(); - } - - this.iframe = document.createElement('iframe'); - this.iframe.id = this.id; - this.iframe.scrolling = "no"; // Might need to be removed: breaks ios width calculations - this.iframe.style.overflow = "hidden"; - this.iframe.seamless = "seamless"; - // Back up if seamless isn't supported - this.iframe.style.border = "none"; - - this.resizing = true; - - // this.iframe.style.display = "none"; - this.element.style.visibility = "hidden"; - this.iframe.style.visibility = "hidden"; - - this.iframe.style.width = "0"; - this.iframe.style.height = "0"; - this._width = 0; - this._height = 0; - - this.element.appendChild(this.iframe); - this.added = true; - - this.elementBounds = core.bounds(this.element); - - // if(width || height){ - // this.resize(width, height); - // } else if(this.width && this.height){ - // this.resize(this.width, this.height); - // } else { - // this.iframeBounds = core.bounds(this.iframe); - // } - - // Firefox has trouble with baseURI and srcdoc - // TODO: Disable for now in firefox - - if(!!("srcdoc" in this.iframe)) { - this.supportsSrcdoc = true; - } else { - this.supportsSrcdoc = false; - } - - return this.iframe; -}; - -IframeView.prototype.render = function(request, show) { - - // view.onLayout = this.layout.format.bind(this.layout); - this.create(); - - // Fit to size of the container, apply padding - this.size(); - - if(!this.sectionRender) { - this.sectionRender = this.section.render(request); - } - - // Render Chain - return this.sectionRender - .then(function(contents){ - return this.load(contents); - }.bind(this)) - // .then(function(doc){ - // return this.hooks.content.trigger(view, this); - // }.bind(this)) - .then(function(){ - // this.settings.layout.format(view.contents); - // return this.hooks.layout.trigger(view, this); - }.bind(this)) - // .then(function(){ - // return this.display(); - // }.bind(this)) - // .then(function(){ - // return this.hooks.render.trigger(view, this); - // }.bind(this)) - .then(function(){ - - // apply the layout function to the contents - this.settings.layout.format(this.contents); - - // Expand the iframe to the full size of the content - this.expand(); - - // Listen for events that require an expansion of the iframe - this.addListeners(); - - if(show !== false) { - //this.q.enqueue(function(view){ - // this.show(); - //}, view); - } - // this.map = new Map(view, this.layout); - //this.hooks.show.trigger(view, this); - this.trigger("rendered", this.section); - - }.bind(this)) - .catch(function(e){ - this.trigger("loaderror", e); - }.bind(this)); - -}; - -// Determine locks base on settings -IframeView.prototype.size = function(_width, _height) { - var width = _width || this.settings.width; - var height = _height || this.settings.height; - - if(this.layout.name === "pre-paginated") { - this.lock("both", width, height); - } else if(this.settings.axis === "horizontal") { - this.lock("height", width, height); - } else { - this.lock("width", width, height); - } - -}; - -// Lock an axis to element dimensions, taking borders into account -IframeView.prototype.lock = function(what, width, height) { - var elBorders = core.borders(this.element); - var iframeBorders; - - if(this.iframe) { - iframeBorders = core.borders(this.iframe); - } else { - iframeBorders = {width: 0, height: 0}; - } - - if(what == "width" && core.isNumber(width)){ - this.lockedWidth = width - elBorders.width - iframeBorders.width; - this.resize(this.lockedWidth, width); // width keeps ratio correct - } - - if(what == "height" && core.isNumber(height)){ - this.lockedHeight = height - elBorders.height - iframeBorders.height; - this.resize(width, this.lockedHeight); - } - - if(what === "both" && - core.isNumber(width) && - core.isNumber(height)){ - - this.lockedWidth = width - elBorders.width - iframeBorders.width; - this.lockedHeight = height - elBorders.height - iframeBorders.height; - - this.resize(this.lockedWidth, this.lockedHeight); - } - - if(this.displayed && this.iframe) { - - // this.contents.layout(); - this.expand(); - - } - - - -}; - -// Resize a single axis based on content dimensions -IframeView.prototype.expand = function(force) { - var width = this.lockedWidth; - var height = this.lockedHeight; - var columns; - - var textWidth, textHeight; - - if(!this.iframe || this._expanding) return; - - this._expanding = true; - - // Expand Horizontally - // if(height && !width) { - if(this.settings.axis === "horizontal") { - // Get the width of the text - textWidth = this.contents.textWidth(); - // Check if the textWidth has changed - if(textWidth != this._textWidth){ - // Get the contentWidth by resizing the iframe - // Check with a min reset of the textWidth - width = this.contentWidth(textWidth); - - columns = Math.ceil(width / (this.settings.layout.columnWidth + this.settings.layout.gap)); - - if ( this.settings.layout.divisor > 1 && - this.settings.layout.name === "reflowable" && - (columns % 2 > 0)) { - // add a blank page - width += this.settings.layout.gap + this.settings.layout.columnWidth; + + return list; + }; + + Parser.prototype.ncxItem = function(item, spineIndexByURL, bookSpine){ + var id = item.getAttribute('id') || false, + // content = item.querySelector("content"), + content = core.qs(item, "content"), + src = content.getAttribute('src'), + // navLabel = item.querySelector("navLabel"), + navLabel = core.qs(item, "navLabel"), + text = navLabel.textContent ? navLabel.textContent : "", + // split = src.split("#"), + // baseUrl = split[0], + // spinePos = spineIndexByURL[baseUrl], + // spineItem = bookSpine[spinePos], + subitems = [], + parentNode = item.parentNode, + parent; + // cfi = spineItem ? spineItem.cfi : ''; + + if(parentNode && parentNode.nodeName === "navPoint") { + parent = parentNode.getAttribute('id'); + } + + /* + if(!id) { + if(spinePos) { + spineItem = bookSpine[spinePos]; + id = spineItem.id; + cfi = spineItem.cfi; + } else { + id = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid(); + item.setAttribute('id', id); } - - // Save the textWdith - this._textWidth = textWidth; - // Save the contentWidth - this._contentWidth = width; + } + */ + + return { + "id": id, + "href": src, + "label": text, + "subitems" : subitems, + "parent" : parent + }; + }; + + Parser.prototype.pageList = function(navHtml, spineIndexByURL, bookSpine){ + var navElement = this.querySelectorByType(navHtml, "nav", "page-list"); + // var navItems = navElement ? navElement.querySelectorAll("ol li") : []; + var navItems = navElement ? core.qsa(navElement, "li") : []; + var length = navItems.length; + var i; + var toc = {}; + var list = []; + var item; + + if(!navItems || length === 0) return list; + + for (i = 0; i < length; ++i) { + item = this.pageListItem(navItems[i], spineIndexByURL, bookSpine); + list.push(item); + } + + return list; + }; + + Parser.prototype.pageListItem = function(item, spineIndexByURL, bookSpine){ + var id = item.getAttribute('id') || false, + // content = item.querySelector("a"), + content = core.qs(item, "a"), + href = content.getAttribute('href') || '', + text = content.textContent || "", + page = parseInt(text), + isCfi = href.indexOf("epubcfi"), + split, + packageUrl, + cfi; + + if(isCfi != -1) { + split = href.split("#"); + packageUrl = split[0]; + cfi = split.length > 1 ? split[1] : false; + return { + "cfi" : cfi, + "href" : href, + "packageUrl" : packageUrl, + "page" : page + }; } else { - // Otherwise assume content height hasn't changed - width = this._contentWidth; - } - } // Expand Vertically - else if(this.settings.axis === "vertical") { - textHeight = this.contents.textHeight(); - if(textHeight != this._textHeight){ - height = this.contentHeight(textHeight); - this._textHeight = textHeight; - this._contentHeight = height; + return { + "href" : href, + "page" : page + }; + } + }; + + module.exports = Parser; + + +/***/ }, +/* 23 */ +/***/ function(module, exports, __webpack_require__) { + + var core = __webpack_require__(11); + var Parser = __webpack_require__(22); + var RSVP = __webpack_require__(2); + var URI = __webpack_require__(6); + + function Navigation(_package, _request){ + var navigation = this; + var parse = new Parser(); + var request = _request || __webpack_require__(18); + + this.package = _package; + this.toc = []; + this.tocByHref = {}; + this.tocById = {}; + + if(_package.navPath) { + this.navUrl = URI(_package.navPath).absoluteTo(_package.baseUrl).toString(); + this.nav = {}; + + this.nav.load = function(_request){ + var loading = new RSVP.defer(); + var loaded = loading.promise; + + request(navigation.navUrl, 'xml').then(function(xml){ + navigation.toc = parse.nav(xml); + navigation.loaded(navigation.toc); + loading.resolve(navigation.toc); + }); + + return loaded; + }; + + } + + if(_package.ncxPath) { + this.ncxUrl = URI(_package.ncxPath).absoluteTo(_package.baseUrl).toString(); + this.ncx = {}; + + this.ncx.load = function(_request){ + var loading = new RSVP.defer(); + var loaded = loading.promise; + + request(navigation.ncxUrl, 'xml').then(function(xml){ + navigation.toc = parse.toc(xml); + navigation.loaded(navigation.toc); + loading.resolve(navigation.toc); + }); + + return loaded; + }; + + } + }; + + // Load the navigation + Navigation.prototype.load = function(_request) { + var request = _request || __webpack_require__(18); + var loading, loaded; + + if(this.nav) { + loading = this.nav.load(); + } else if(this.ncx) { + loading = this.ncx.load(); } else { - height = this._contentHeight; + loaded = new RSVP.defer(); + loaded.resolve([]); + loading = loaded.promise; } - - } - - // Only Resize if dimensions have changed or - // if Frame is still hidden, so needs reframing - if(this._needsReframe || width != this._width || height != this._height){ - this.resize(width, height); - } - - this._expanding = false; -}; - -IframeView.prototype.contentWidth = function(min) { - var prev; - var width; - - // Save previous width - prev = this.iframe.style.width; - // Set the iframe size to min, width will only ever be greater - // Will preserve the aspect ratio - this.iframe.style.width = (min || 0) + "px"; - // Get the scroll overflow width - width = this.contents.scrollWidth(); - // Reset iframe size back - this.iframe.style.width = prev; - return width; -}; - -IframeView.prototype.contentHeight = function(min) { - var prev; - var height; - - prev = this.iframe.style.height; - this.iframe.style.height = (min || 0) + "px"; - height = this.contents.scrollHeight(); - - this.iframe.style.height = prev; - return height; -}; - - -IframeView.prototype.resize = function(width, height) { - - if(!this.iframe) return; - - if(core.isNumber(width)){ - this.iframe.style.width = width + "px"; - this._width = width; - } - - if(core.isNumber(height)){ - this.iframe.style.height = height + "px"; - this._height = height; - } - - this.iframeBounds = core.bounds(this.iframe); - - this.reframe(this.iframeBounds.width, this.iframeBounds.height); - -}; - -IframeView.prototype.reframe = function(width, height) { - var size; - - // if(!this.displayed) { - // this._needsReframe = true; - // return; - // } - if(core.isNumber(width)){ - this.element.style.width = width + "px"; - } - - if(core.isNumber(height)){ - this.element.style.height = height + "px"; - } - - this.prevBounds = this.elementBounds; - - this.elementBounds = core.bounds(this.element); - - size = { - width: this.elementBounds.width, - height: this.elementBounds.height, - widthDelta: this.elementBounds.width - this.prevBounds.width, - heightDelta: this.elementBounds.height - this.prevBounds.height, + + return loading; + }; - - this.onResize(this, size); - - this.trigger("resized", size); - -}; - - -IframeView.prototype.load = function(contents) { - var loading = new RSVP.defer(); - var loaded = loading.promise; - - if(!this.iframe) { - loading.reject(new Error("No Iframe Available")); - return loaded; - } - - this.iframe.onload = function(event) { - - this.onLoad(event, loading); - - }.bind(this); - - if(this.supportsSrcdoc){ - this.iframe.srcdoc = contents; - } else { - - this.document = this.iframe.contentDocument; - - if(!this.document) { - loading.reject(new Error("No Document Available")); - return loaded; + + Navigation.prototype.loaded = function(toc) { + var item; + + for (var i = 0; i < toc.length; i++) { + item = toc[i]; + this.tocByHref[item.href] = i; + this.tocById[item.id] = i; } - - this.iframe.contentDocument.open(); - this.iframe.contentDocument.write(contents); - this.iframe.contentDocument.close(); - - } - - return loaded; -}; - -IframeView.prototype.onLoad = function(event, promise) { - - this.window = this.iframe.contentWindow; - this.document = this.iframe.contentDocument; - - this.contents = new Contents(this.document, this.document.body, this.section.cfiBase); - - this.rendering = false; - - var link = this.document.querySelector("link[rel='canonical']"); - if (link) { - link.setAttribute("href", this.section.url); + + }; + + // Get an item from the navigation + Navigation.prototype.get = function(target) { + var index; + + if(!target) { + return this.toc; + } + + if(target.indexOf("#") === 0) { + index = this.tocById[target.substring(1)]; + } else if(target in this.tocByHref){ + index = this.tocByHref[target]; + } + + return this.toc[index]; + }; + + module.exports = Navigation; + + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var URI = __webpack_require__(6); + var core = __webpack_require__(11); + var replace = __webpack_require__(19); + var Hook = __webpack_require__(16); + var EpubCFI = __webpack_require__(15); + var Queue = __webpack_require__(21); + var Layout = __webpack_require__(25); + var Mapping = __webpack_require__(26); + + function Rendition(book, options) { + + this.settings = core.extend(this.settings || {}, { + width: null, + height: null, + ignoreClass: '', + manager: "single", + view: "iframe", + flow: null, + layout: null, + spread: null, + minSpreadWidth: 800, //-- overridden by spread: none (never) / both (always), + useBase64: true + }); + + core.extend(this.settings, options); + + this.viewSettings = { + ignoreClass: this.settings.ignoreClass + }; + + this.book = book; + + this.views = null; + + //-- Adds Hook methods to the Rendition prototype + this.hooks = {}; + this.hooks.display = new Hook(this); + this.hooks.serialize = new Hook(this); + this.hooks.content = new Hook(this); + this.hooks.layout = new Hook(this); + this.hooks.render = new Hook(this); + this.hooks.show = new Hook(this); + + this.hooks.content.register(replace.links.bind(this)); + this.hooks.content.register(this.passViewEvents.bind(this)); + + // this.hooks.display.register(this.afterDisplay.bind(this)); + + this.epubcfi = new EpubCFI(); + + this.q = new Queue(this); + + this.q.enqueue(this.book.opened); + + // Block the queue until rendering is started + // this.starting = new RSVP.defer(); + // this.started = this.starting.promise; + this.q.enqueue(this.start); + + if(this.book.unarchived) { + this.q.enqueue(this.replacements.bind(this)); + } + + }; + + Rendition.prototype.setManager = function(manager) { + this.manager = manager; + }; + + Rendition.prototype.requireManager = function(manager) { + var viewManager; + + // If manager is a string, try to load from register managers, + // or require included managers directly + if (typeof manager === "string") { + // Use global or require + viewManager = typeof ePub != "undefined" ? ePub.ViewManagers[manager] : undefined; //require('./managers/'+manager); } else { - link = this.document.createElement("link"); - link.setAttribute("rel", "canonical"); - link.setAttribute("href", this.section.url); - this.document.querySelector("head").appendChild(link); + // otherwise, assume we were passed a function + viewManager = manager } - - this.contents.on("expand", function () { - if(this.displayed && this.iframe) { - this.expand(); - } + + return viewManager; + }; + + Rendition.prototype.requireView = function(view) { + var View; + + if (typeof view == "string") { + View = typeof ePub != "undefined" ? ePub.Views[view] : undefined; //require('./views/'+view); + } else { + // otherwise, assume we were passed a function + View = view + } + + return View; + }; + + Rendition.prototype.start = function(){ + + if(!this.manager) { + this.ViewManager = this.requireManager(this.settings.manager); + this.View = this.requireView(this.settings.view); + + this.manager = new this.ViewManager({ + view: this.View, + queue: this.q, + request: this.book.request, + settings: this.settings + }); + } + + // Parse metadata to get layout props + this.settings.globalLayoutProperties = this.determineLayoutProperties(this.book.package.metadata); + + this.flow(this.settings.globalLayoutProperties.flow); + + this.layout(this.settings.globalLayoutProperties); + + // Listen for displayed views + this.manager.on("added", this.afterDisplayed.bind(this)); + + // Listen for resizing + this.manager.on("resized", this.onResized.bind(this)); + + // Listen for scroll changes + this.manager.on("scroll", this.reportLocation.bind(this)); + + + this.on('displayed', this.reportLocation.bind(this)); + + // Trigger that rendering has started + this.trigger("started"); + + // Start processing queue + // this.starting.resolve(); + }; + + // Call to attach the container to an element in the dom + // Container must be attached before rendering can begin + Rendition.prototype.attachTo = function(element){ + + return this.q.enqueue(function () { + + // Start rendering + this.manager.render(element, { + "width" : this.settings.width, + "height" : this.settings.height + }); + + // Trigger Attached + this.trigger("attached"); + + }.bind(this)); + + }; + + Rendition.prototype.display = function(target){ + + // if (!this.book.spine.spineItems.length > 0) { + // Book isn't open yet + // return this.q.enqueue(this.display, target); + // } + + return this.q.enqueue(this._display, target); + + }; + + Rendition.prototype._display = function(target){ + var isCfiString = this.epubcfi.isCfiString(target); + var displaying = new RSVP.defer(); + var displayed = displaying.promise; + var section; + var moveTo; + + section = this.book.spine.get(target); + + if(!section){ + displaying.reject(new Error("No Section Found")); + return displayed; + } + + // Trim the target fragment + // removing the chapter + if(!isCfiString && typeof target === "string" && + target.indexOf("#") > -1) { + moveTo = target.substring(target.indexOf("#")+1); + } + + if (isCfiString) { + moveTo = target; + } + + return this.manager.display(section, moveTo) + .then(function(){ + this.trigger("displayed", section); + }.bind(this)); + + }; + + /* + Rendition.prototype.render = function(view, show) { + + // view.onLayout = this.layout.format.bind(this.layout); + view.create(); + + // Fit to size of the container, apply padding + this.manager.resizeView(view); + + // Render Chain + return view.section.render(this.book.request) + .then(function(contents){ + return view.load(contents); + }.bind(this)) + .then(function(doc){ + return this.hooks.content.trigger(view, this); + }.bind(this)) + .then(function(){ + this.layout.format(view.contents); + return this.hooks.layout.trigger(view, this); + }.bind(this)) + .then(function(){ + return view.display(); + }.bind(this)) + .then(function(){ + return this.hooks.render.trigger(view, this); + }.bind(this)) + .then(function(){ + if(show !== false) { + this.q.enqueue(function(view){ + view.show(); + }, view); + } + // this.map = new Map(view, this.layout); + this.hooks.show.trigger(view, this); + this.trigger("rendered", view.section); + + }.bind(this)) + .catch(function(e){ + this.trigger("loaderror", e); + }.bind(this)); + + }; + */ + + Rendition.prototype.afterDisplayed = function(view){ + this.hooks.content.trigger(view, this); + this.trigger("rendered", view.section); + this.reportLocation(); + }; + + Rendition.prototype.onResized = function(size){ + + if(this.location) { + this.display(this.location.start); + } + + this.trigger("resized", { + width: size.width, + height: size.height }); - - promise.resolve(this.contents); -}; - - - -// IframeView.prototype.layout = function(layoutFunc) { -// -// this.iframe.style.display = "inline-block"; -// -// // Reset Body Styles -// // this.document.body.style.margin = "0"; -// //this.document.body.style.display = "inline-block"; -// //this.document.documentElement.style.width = "auto"; -// -// if(layoutFunc){ -// this.layoutFunc = layoutFunc; -// } -// -// this.contents.layout(this.layoutFunc); -// -// }; -// -// IframeView.prototype.onLayout = function(view) { -// // stub -// }; - -IframeView.prototype.setLayout = function(layout) { - this.layout = layout; -}; - -IframeView.prototype.setAxis = function(axis) { - this.settings.axis = axis; -}; - -IframeView.prototype.resizeListenters = function() { - // Test size again - clearTimeout(this.expanding); - this.expanding = setTimeout(this.expand.bind(this), 350); -}; - -IframeView.prototype.addListeners = function() { - //TODO: Add content listeners for expanding -}; - -IframeView.prototype.removeListeners = function(layoutFunc) { - //TODO: remove content listeners for expanding -}; - -IframeView.prototype.display = function(request) { - var displayed = new RSVP.defer(); - - if (!this.displayed) { - - this.render(request).then(function () { - - this.trigger("displayed", this); - this.onDisplayed(this); - - this.displayed = true; - displayed.resolve(this); - + + }; + + Rendition.prototype.moveTo = function(offset){ + this.manager.moveTo(offset); + }; + + Rendition.prototype.next = function(){ + return this.q.enqueue(this.manager.next.bind(this.manager)) + .then(this.reportLocation.bind(this)); + }; + + Rendition.prototype.prev = function(){ + return this.q.enqueue(this.manager.prev.bind(this.manager)) + .then(this.reportLocation.bind(this)); + }; + + //-- http://www.idpf.org/epub/301/spec/epub-publications.html#meta-properties-rendering + Rendition.prototype.determineLayoutProperties = function(metadata){ + var settings; + var layout = this.settings.layout || metadata.layout || "reflowable"; + var spread = this.settings.spread || metadata.spread || "auto"; + var orientation = this.settings.orientation || metadata.orientation || "auto"; + var flow = this.settings.flow || metadata.flow || "auto"; + var viewport = metadata.viewport || ""; + var minSpreadWidth = this.settings.minSpreadWidth || metadata.minSpreadWidth || 800; + + if (this.settings.width >= 0 && this.settings.height >= 0) { + viewport = "width="+this.settings.width+", height="+this.settings.height+""; + } + + settings = { + layout : layout, + spread : spread, + orientation : orientation, + flow : flow, + viewport : viewport, + minSpreadWidth : minSpreadWidth + }; + + return settings; + }; + + // Rendition.prototype.applyLayoutProperties = function(){ + // var settings = this.determineLayoutProperties(this.book.package.metadata); + // + // this.flow(settings.flow); + // + // this.layout(settings); + // }; + + // paginated | scrolled + // (scrolled-continuous vs scrolled-doc are handled by different view managers) + Rendition.prototype.flow = function(_flow){ + var flow; + if (_flow === "scrolled-doc" || _flow === "scrolled-continuous") { + flow = "scrolled"; + } + + if (_flow === "auto" || _flow === "paginated") { + flow = "paginated"; + } + + if (this._layout) { + this._layout.flow(flow); + } + + if (this.manager) { + this.manager.updateFlow(flow); + } + }; + + // reflowable | pre-paginated + Rendition.prototype.layout = function(settings){ + if (settings) { + this._layout = new Layout(settings); + this._layout.spread(settings.spread, this.settings.minSpreadWidth); + + this.mapping = new Mapping(this._layout); + } + + if (this.manager && this._layout) { + this.manager.applyLayout(this._layout); + } + + return this._layout; + }; + + // none | auto (TODO: implement landscape, portrait, both) + Rendition.prototype.spread = function(spread, min){ + + this._layout.spread(spread, min); + + if (this.manager.isRendered()) { + this.manager.updateLayout(); + } + }; + + + Rendition.prototype.reportLocation = function(){ + return this.q.enqueue(function(){ + var location = this.manager.currentLocation(); + if (location && location.then && typeof location.then === 'function') { + location.then(function(result) { + this.location = result; + this.trigger("locationChanged", this.location); + }.bind(this)); + } else if (location) { + this.location = location; + this.trigger("locationChanged", this.location); + } + }.bind(this)); - - } else { - displayed.resolve(this); - } - - - return displayed.promise; -}; - -IframeView.prototype.show = function() { - - this.element.style.visibility = "visible"; - - if(this.iframe){ - this.iframe.style.visibility = "visible"; - } - - this.trigger("shown", this); -}; - -IframeView.prototype.hide = function() { - // this.iframe.style.display = "none"; - this.element.style.visibility = "hidden"; - this.iframe.style.visibility = "hidden"; - - this.stopExpanding = true; - this.trigger("hidden", this); -}; - -IframeView.prototype.position = function() { - return this.element.getBoundingClientRect(); -}; - -IframeView.prototype.locationOf = function(target) { - var parentPos = this.iframe.getBoundingClientRect(); - var targetPos = this.contents.locationOf(target, this.settings.ignoreClass); - - return { - "left": window.scrollX + parentPos.left + targetPos.left, - "top": window.scrollY + parentPos.top + targetPos.top }; -}; - -IframeView.prototype.onDisplayed = function(view) { - // Stub, override with a custom functions -}; - -IframeView.prototype.onResize = function(view, e) { - // Stub, override with a custom functions -}; - -IframeView.prototype.bounds = function() { - if(!this.elementBounds) { - this.elementBounds = core.bounds(this.element); - } - return this.elementBounds; -}; - -IframeView.prototype.destroy = function() { - - if(this.displayed){ - this.displayed = false; - - this.removeListeners(); - - this.stopExpanding = true; - this.element.removeChild(this.iframe); - this.displayed = false; - this.iframe = null; - - this._textWidth = null; - this._textHeight = null; - this._width = null; - this._height = null; - } - // this.element.style.height = "0px"; - // this.element.style.width = "0px"; -}; - -RSVP.EventTarget.mixin(IframeView.prototype); - -module.exports = IframeView; - -},{"../../contents":9,"../../core":10,"../../epubcfi":11,"rsvp":5}],20:[function(require,module,exports){ -var EpubCFI = require('./epubcfi'); - -function Mapping(layout){ - this.layout = layout; -}; - -Mapping.prototype.section = function(view) { - var ranges = this.findRanges(view); - var map = this.rangeListToCfiList(view.section.cfiBase, ranges); - - return map; -}; - -Mapping.prototype.page = function(contents, cfiBase, start, end) { - var root = contents && contents.document ? contents.document.body : false; - - if (!root) { - return; - } - - return this.rangePairToCfiPair(cfiBase, { - start: this.findStart(root, start, end), - end: this.findEnd(root, start, end) - }); -}; - -Mapping.prototype.walk = function(root, func) { - //var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT, null, false); - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { - acceptNode: function (node) { - if ( node.data.trim().length > 0 ) { - return NodeFilter.FILTER_ACCEPT; - } else { - return NodeFilter.FILTER_REJECT; + + + Rendition.prototype.destroy = function(){ + // Clear the queue + this.q.clear(); + + this.manager.destroy(); + }; + + Rendition.prototype.passViewEvents = function(view){ + view.contents.listenedEvents.forEach(function(e){ + view.on(e, this.triggerViewEvent.bind(this)); + }.bind(this)); + + view.on("selected", this.triggerSelectedEvent.bind(this)); + }; + + Rendition.prototype.triggerViewEvent = function(e){ + this.trigger(e.type, e); + }; + + Rendition.prototype.triggerSelectedEvent = function(cfirange){ + this.trigger("selected", cfirange); + }; + + Rendition.prototype.replacements = function(){ + // Wait for loading + // return this.q.enqueue(function () { + // Get thes books manifest + var manifest = this.book.package.manifest; + var manifestArray = Object.keys(manifest). + map(function (key){ + return manifest[key]; + }); + + // Exclude HTML + var items = manifestArray. + filter(function (item){ + if (item.type != "application/xhtml+xml" && + item.type != "text/html") { + return true; } - } - }, false); - var node; - var result; - while ((node = treeWalker.nextNode())) { - result = func(node); - if(result) break; - } - - return result; -}; - -Mapping.prototype.findRanges = function(view){ - var columns = []; - var scrollWidth = view.contents.scrollWidth(); - var count = this.layout.count(scrollWidth); - var column = this.layout.column; - var gap = this.layout.gap; - var start, end; - - for (var i = 0; i < count.pages; i++) { - start = (column + gap) * i; - end = (column * (i+1)) + (gap * i); - columns.push({ - start: this.findStart(view.document.body, start, end), - end: this.findEnd(view.document.body, start, end) + }); + + // Only CSS + var css = items. + filter(function (item){ + if (item.type === "text/css") { + return true; + } + }); + + // Css Urls + var cssUrls = css.map(function(item) { + return item.href; + }); + + // All Assets Urls + var urls = items. + map(function(item) { + return item.href; + }.bind(this)); + + // Create blob urls for all the assets + var processing = urls. + map(function(url) { + var absolute = URI(url).absoluteTo(this.book.baseUrl).toString(); + // Full url from archive base + return this.book.unarchived.createUrl(absolute, {"base64": this.settings.useBase64}); + }.bind(this)); + + var replacementUrls; + + // After all the urls are created + return RSVP.all(processing) + .then(function(_replacementUrls) { + var replaced = []; + + replacementUrls = _replacementUrls; + + // Replace Asset Urls in the text of all css files + cssUrls.forEach(function(href) { + replaced.push(this.replaceCss(href, urls, replacementUrls)); + }.bind(this)); + + return RSVP.all(replaced); + + }.bind(this)) + .then(function () { + // Replace Asset Urls in chapters + // by registering a hook after the sections contents has been serialized + this.book.spine.hooks.serialize.register(function(output, section) { + + this.replaceAssets(section, urls, replacementUrls); + + }.bind(this)); + + }.bind(this)) + .catch(function(reason){ + console.error(reason); + }); + // }.bind(this)); + }; + + Rendition.prototype.replaceCss = function(href, urls, replacementUrls){ + var newUrl; + var indexInUrls; + + // Find the absolute url of the css file + var fileUri = URI(href); + var absolute = fileUri.absoluteTo(this.book.baseUrl).toString(); + // Get the text of the css file from the archive + var textResponse = this.book.unarchived.getText(absolute); + // Get asset links relative to css file + var relUrls = urls. + map(function(assetHref) { + var assetUri = URI(assetHref).absoluteTo(this.book.baseUrl); + var relative = assetUri.relativeTo(absolute).toString(); + return relative; + }.bind(this)); + + return textResponse.then(function (text) { + // Replacements in the css text + text = replace.substitute(text, relUrls, replacementUrls); + + // Get the new url + if (this.settings.useBase64) { + newUrl = core.createBase64Url(text, 'text/css'); + } else { + newUrl = core.createBlobUrl(text, 'text/css'); + } + + // switch the url in the replacementUrls + indexInUrls = urls.indexOf(href); + if (indexInUrls > -1) { + replacementUrls[indexInUrls] = newUrl; + } + + return new RSVP.Promise(function(resolve, reject){ + resolve(urls, replacementUrls); + }); + + }.bind(this)); + + }; + + Rendition.prototype.replaceAssets = function(section, urls, replacementUrls){ + var fileUri = URI(section.url); + // Get Urls relative to current sections + var relUrls = urls. + map(function(href) { + var assetUri = URI(href).absoluteTo(this.book.baseUrl); + var relative = assetUri.relativeTo(fileUri).toString(); + return relative; + }.bind(this)); + + + section.output = replace.substitute(section.output, relUrls, replacementUrls); + }; + + Rendition.prototype.range = function(_cfi, ignoreClass){ + var cfi = new EpubCFI(_cfi); + var found = this.visible().filter(function (view) { + if(cfi.spinePos === view.index) return true; }); - } - - return columns; -}; - -Mapping.prototype.findStart = function(root, start, end){ - var stack = [root]; - var $el; - var found; - var $prev = root; - while (stack.length) { - - $el = stack.shift(); - - found = this.walk($el, function(node){ - var left, right; - var elPos; - var elRange; - - - if(node.nodeType == Node.TEXT_NODE){ - elRange = document.createRange(); - elRange.selectNodeContents(node); - elPos = elRange.getBoundingClientRect(); - } else { - elPos = node.getBoundingClientRect(); - } - - left = elPos.left; - right = elPos.right; - - if( left >= start && left <= end ) { - return node; - } else if (right > start) { - return node; - } else { - $prev = node; - stack.push(node); - } - + + // Should only every return 1 item + if (found.length) { + return found[0].range(cfi, ignoreClass); + } + }; + + Rendition.prototype.adjustImages = function(view) { + + view.addStylesheetRules([ + ["img", + ["max-width", (view.layout.spreadWidth) + "px"], + ["max-height", (view.layout.height) + "px"] + ] + ]); + return new RSVP.Promise(function(resolve, reject){ + // Wait to apply + setTimeout(function() { + resolve(); + }, 1); }); - - if(found) { - return this.findTextStartRange(found, start, end); + }; + + //-- Enable binding events to Renderer + RSVP.EventTarget.mixin(Rendition.prototype); + + module.exports = Rendition; + + +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { + + var core = __webpack_require__(11); + var RSVP = __webpack_require__(2); + + function Layout(settings){ + this.name = settings.layout || "reflowable"; + this._spread = (settings.spread === "none") ? false : true; + this._minSpreadWidth = settings.spread || 800; + this._evenSpreads = settings.evenSpreads || false; + + if (settings.flow === "scrolled-continuous" || + settings.flow === "scrolled-doc") { + this._flow = "scrolled"; + } else { + this._flow = "paginated"; + } + + + this.width = 0; + this.height = 0; + this.spreadWidth = 0; + this.delta = 0; + + this.columnWidth = 0; + this.gap = 0; + this.divisor = 1; + }; + + // paginated | scrolled + Layout.prototype.flow = function(flow) { + this._flow = (flow === "paginated") ? "paginated" : "scrolled"; + } + + // true | false + Layout.prototype.spread = function(spread, min) { + + this._spread = (spread === "none") ? false : true; + + if (min >= 0) { + this._minSpreadWidth = min; } - } + + Layout.prototype.calculate = function(_width, _height, _gap){ + + var divisor = 1; + var gap = _gap || 0; + + //-- Check the width and create even width columns + var fullWidth = Math.floor(_width); + var width = _width; + + var section = Math.floor(width / 8); + + var colWidth; + var spreadWidth; + var delta; + + if (this._spread && width >= this._minSpreadWidth) { + divisor = 2; + } else { + divisor = 1; + } + + if (this.name === "reflowable" && this._flow === "paginated" && !(_gap >= 0)) { + gap = ((section % 2 === 0) ? section : section - 1); + } + + if (this.name === "pre-paginated" ) { + gap = 0; + } + + //-- Double Page + if(divisor > 1) { + colWidth = Math.floor((width - gap) / divisor); + } else { + colWidth = width; + } + + if (this.name === "pre-paginated" && divisor > 1) { + width = colWidth; + } + + spreadWidth = colWidth * divisor; + + delta = (colWidth + gap) * divisor; + + this.width = width; + this.height = _height; + this.spreadWidth = spreadWidth; + this.delta = delta; + + this.columnWidth = colWidth; + this.gap = gap; + this.divisor = divisor; + }; + + Layout.prototype.format = function(contents){ + var formating; + + if (this.name === "pre-paginated") { + formating = contents.fit(this.columnWidth, this.height); + } else if (this._flow === "paginated") { + formating = contents.columns(this.width, this.height, this.columnWidth, this.gap); + } else { // scrolled + formating = contents.size(this.width, null); + } + + return formating; // might be a promise in some View Managers + }; + + Layout.prototype.count = function(totalWidth) { + // var totalWidth = contents.scrollWidth(); + var spreads = Math.ceil( totalWidth / this.spreadWidth); + + return { + spreads : spreads, + pages : spreads * this.divisor + }; + }; + + module.exports = Layout; - // Return last element - return this.findTextStartRange($prev, start, end); -}; - -Mapping.prototype.findEnd = function(root, start, end){ - var stack = [root]; - var $el; - var $prev = root; - var found; - - while (stack.length) { - - $el = stack.shift(); - - found = this.walk($el, function(node){ - - var left, right; - var elPos; - var elRange; - - - if(node.nodeType == Node.TEXT_NODE){ - elRange = document.createRange(); - elRange.selectNodeContents(node); - elPos = elRange.getBoundingClientRect(); - } else { - elPos = node.getBoundingClientRect(); - } - - left = elPos.left; - right = elPos.right; - if(left > end && $prev) { - return $prev; - } else if(right > end) { - return node; - } else { - $prev = node; - stack.push(node); - } +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + var EpubCFI = __webpack_require__(15); + + function Mapping(layout){ + this.layout = layout; + }; + + Mapping.prototype.section = function(view) { + var ranges = this.findRanges(view); + var map = this.rangeListToCfiList(view.section.cfiBase, ranges); + + return map; + }; + + Mapping.prototype.page = function(contents, cfiBase, start, end) { + var root = contents && contents.document ? contents.document.body : false; + + if (!root) { + return; + } + + return this.rangePairToCfiPair(cfiBase, { + start: this.findStart(root, start, end), + end: this.findEnd(root, start, end) }); - - - if(found){ - return this.findTextEndRange(found, start, end); + }; + + Mapping.prototype.walk = function(root, func) { + //var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT, null, false); + var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { + acceptNode: function (node) { + if ( node.data.trim().length > 0 ) { + return NodeFilter.FILTER_ACCEPT; + } else { + return NodeFilter.FILTER_REJECT; + } + } + }, false); + var node; + var result; + while ((node = treeWalker.nextNode())) { + result = func(node); + if(result) break; } - - } - - // end of chapter - return this.findTextEndRange($prev, start, end); -}; - - -Mapping.prototype.findTextStartRange = function(node, start, end){ - var ranges = this.splitTextNodeIntoRanges(node); - var prev; - var range; - var pos; - - for (var i = 0; i < ranges.length; i++) { - range = ranges[i]; - - pos = range.getBoundingClientRect(); - - if( pos.left >= start ) { - return range; + + return result; + }; + + Mapping.prototype.findRanges = function(view){ + var columns = []; + var scrollWidth = view.contents.scrollWidth(); + var count = this.layout.count(scrollWidth); + var column = this.layout.column; + var gap = this.layout.gap; + var start, end; + + for (var i = 0; i < count.pages; i++) { + start = (column + gap) * i; + end = (column * (i+1)) + (gap * i); + columns.push({ + start: this.findStart(view.document.body, start, end), + end: this.findEnd(view.document.body, start, end) + }); } - - prev = range; - - } - - return ranges[0]; -}; - -Mapping.prototype.findTextEndRange = function(node, start, end){ - var ranges = this.splitTextNodeIntoRanges(node); - var prev; - var range; - var pos; - - for (var i = 0; i < ranges.length; i++) { - range = ranges[i]; - - pos = range.getBoundingClientRect(); - - if(pos.left > end && prev) { - return prev; - } else if(pos.right > end) { - return range; + + return columns; + }; + + Mapping.prototype.findStart = function(root, start, end){ + var stack = [root]; + var $el; + var found; + var $prev = root; + while (stack.length) { + + $el = stack.shift(); + + found = this.walk($el, function(node){ + var left, right; + var elPos; + var elRange; + + + if(node.nodeType == Node.TEXT_NODE){ + elRange = document.createRange(); + elRange.selectNodeContents(node); + elPos = elRange.getBoundingClientRect(); + } else { + elPos = node.getBoundingClientRect(); + } + + left = elPos.left; + right = elPos.right; + + if( left >= start && left <= end ) { + return node; + } else if (right > start) { + return node; + } else { + $prev = node; + stack.push(node); + } + + }); + + if(found) { + return this.findTextStartRange(found, start, end); + } + } - - prev = range; - - } - - // Ends before limit - return ranges[ranges.length-1]; - -}; - -Mapping.prototype.splitTextNodeIntoRanges = function(node, _splitter){ - var ranges = []; - var textContent = node.textContent || ""; - var text = textContent.trim(); - var range; - var rect; - var list; - var doc = node.ownerDocument; - var splitter = _splitter || " "; - - pos = text.indexOf(splitter); - - if(pos === -1 || node.nodeType != Node.TEXT_NODE) { - range = doc.createRange(); - range.selectNodeContents(node); - return [range]; - } - - range = doc.createRange(); - range.setStart(node, 0); - range.setEnd(node, pos); - ranges.push(range); - range = false; - - while ( pos != -1 ) { - - pos = text.indexOf(splitter, pos + 1); - if(pos > 0) { - - if(range) { - range.setEnd(node, pos); - ranges.push(range); + + // Return last element + return this.findTextStartRange($prev, start, end); + }; + + Mapping.prototype.findEnd = function(root, start, end){ + var stack = [root]; + var $el; + var $prev = root; + var found; + + while (stack.length) { + + $el = stack.shift(); + + found = this.walk($el, function(node){ + + var left, right; + var elPos; + var elRange; + + + if(node.nodeType == Node.TEXT_NODE){ + elRange = document.createRange(); + elRange.selectNodeContents(node); + elPos = elRange.getBoundingClientRect(); + } else { + elPos = node.getBoundingClientRect(); + } + + left = elPos.left; + right = elPos.right; + + if(left > end && $prev) { + return $prev; + } else if(right > end) { + return node; + } else { + $prev = node; + stack.push(node); + } + + }); + + + if(found){ + return this.findTextEndRange(found, start, end); } - + + } + + // end of chapter + return this.findTextEndRange($prev, start, end); + }; + + + Mapping.prototype.findTextStartRange = function(node, start, end){ + var ranges = this.splitTextNodeIntoRanges(node); + var prev; + var range; + var pos; + + for (var i = 0; i < ranges.length; i++) { + range = ranges[i]; + + pos = range.getBoundingClientRect(); + + if( pos.left >= start ) { + return range; + } + + prev = range; + + } + + return ranges[0]; + }; + + Mapping.prototype.findTextEndRange = function(node, start, end){ + var ranges = this.splitTextNodeIntoRanges(node); + var prev; + var range; + var pos; + + for (var i = 0; i < ranges.length; i++) { + range = ranges[i]; + + pos = range.getBoundingClientRect(); + + if(pos.left > end && prev) { + return prev; + } else if(pos.right > end) { + return range; + } + + prev = range; + + } + + // Ends before limit + return ranges[ranges.length-1]; + + }; + + Mapping.prototype.splitTextNodeIntoRanges = function(node, _splitter){ + var ranges = []; + var textContent = node.textContent || ""; + var text = textContent.trim(); + var range; + var rect; + var list; + var doc = node.ownerDocument; + var splitter = _splitter || " "; + + pos = text.indexOf(splitter); + + if(pos === -1 || node.nodeType != Node.TEXT_NODE) { range = doc.createRange(); - range.setStart(node, pos+1); + range.selectNodeContents(node); + return [range]; } - } - - if(range) { - range.setEnd(node, text.length); + + range = doc.createRange(); + range.setStart(node, 0); + range.setEnd(node, pos); ranges.push(range); - } - - return ranges; -}; - - - -Mapping.prototype.rangePairToCfiPair = function(cfiBase, rangePair){ - - var startRange = rangePair.start; - var endRange = rangePair.end; - - startRange.collapse(true); - endRange.collapse(true); - - // startCfi = section.cfiFromRange(startRange); - // endCfi = section.cfiFromRange(endRange); - startCfi = new EpubCFI(startRange, cfiBase).toString(); - endCfi = new EpubCFI(endRange, cfiBase).toString(); - - return { - start: startCfi, - end: endCfi + range = false; + + while ( pos != -1 ) { + + pos = text.indexOf(splitter, pos + 1); + if(pos > 0) { + + if(range) { + range.setEnd(node, pos); + ranges.push(range); + } + + range = doc.createRange(); + range.setStart(node, pos+1); + } + } + + if(range) { + range.setEnd(node, text.length); + ranges.push(range); + } + + return ranges; }; - -}; - -Mapping.prototype.rangeListToCfiList = function(cfiBase, columns){ - var map = []; - var rangePair, cifPair; - - for (var i = 0; i < columns.length; i++) { - cifPair = this.rangePairToCfiPair(cfiBase, columns[i]); - - map.push(cifPair); - - } - - return map; -}; - -module.exports = Mapping; - -},{"./epubcfi":11}],21:[function(require,module,exports){ -var core = require('./core'); -var Parser = require('./parser'); -var RSVP = require('rsvp'); -var URI = require('urijs'); - -function Navigation(_package, _request){ - var navigation = this; - var parse = new Parser(); - var request = _request || require('./request'); - - this.package = _package; - this.toc = []; - this.tocByHref = {}; - this.tocById = {}; - - if(_package.navPath) { - this.navUrl = URI(_package.navPath).absoluteTo(_package.baseUrl).toString(); - this.nav = {}; - - this.nav.load = function(_request){ - var loading = new RSVP.defer(); - var loaded = loading.promise; - - request(navigation.navUrl, 'xml').then(function(xml){ - navigation.toc = parse.nav(xml); - navigation.loaded(navigation.toc); - loading.resolve(navigation.toc); - }); - - return loaded; + + + + Mapping.prototype.rangePairToCfiPair = function(cfiBase, rangePair){ + + var startRange = rangePair.start; + var endRange = rangePair.end; + + startRange.collapse(true); + endRange.collapse(true); + + // startCfi = section.cfiFromRange(startRange); + // endCfi = section.cfiFromRange(endRange); + startCfi = new EpubCFI(startRange, cfiBase).toString(); + endCfi = new EpubCFI(endRange, cfiBase).toString(); + + return { + start: startCfi, + end: endCfi }; - - } - - if(_package.ncxPath) { - this.ncxUrl = URI(_package.ncxPath).absoluteTo(_package.baseUrl).toString(); - this.ncx = {}; - - this.ncx.load = function(_request){ - var loading = new RSVP.defer(); - var loaded = loading.promise; - - request(navigation.ncxUrl, 'xml').then(function(xml){ - navigation.toc = parse.toc(xml); - navigation.loaded(navigation.toc); - loading.resolve(navigation.toc); + + }; + + Mapping.prototype.rangeListToCfiList = function(cfiBase, columns){ + var map = []; + var rangePair, cifPair; + + for (var i = 0; i < columns.length; i++) { + cifPair = this.rangePairToCfiPair(cfiBase, columns[i]); + + map.push(cifPair); + + } + + return map; + }; + + module.exports = Mapping; + + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var URI = __webpack_require__(6); + var core = __webpack_require__(11); + var request = __webpack_require__(18); + var mime = __webpack_require__(28); + + function Unarchive() { + + this.checkRequirements(); + this.urlCache = {}; + + } + + Unarchive.prototype.checkRequirements = function(callback){ + try { + if (typeof JSZip !== 'undefined') { + this.zip = new JSZip(); + } else { + JSZip = __webpack_require__(29); + this.zip = new JSZip(); + } + } catch (e) { + console.error("JSZip lib not loaded"); + } + }; + + Unarchive.prototype.open = function(zipUrl, isBase64){ + if (zipUrl instanceof ArrayBuffer || isBase64) { + return this.zip.loadAsync(zipUrl, {"base64": isBase64}); + } else { + return request(zipUrl, "binary") + .then(function(data){ + return this.zip.loadAsync(data); + }.bind(this)); + } + }; + + Unarchive.prototype.request = function(url, type){ + var deferred = new RSVP.defer(); + var response; + var r; + + // If type isn't set, determine it from the file extension + if(!type) { + uri = URI(url); + type = uri.suffix(); + } + + if(type == 'blob'){ + response = this.getBlob(url); + } else { + response = this.getText(url); + } + + if (response) { + response.then(function (r) { + result = this.handleResponse(r, type); + deferred.resolve(result); + }.bind(this)); + } else { + deferred.reject({ + message : "File not found in the epub: " + url, + stack : new Error().stack }); + } + return deferred.promise; + }; + + Unarchive.prototype.handleResponse = function(response, type){ + var r; + + if(type == "json") { + r = JSON.parse(response); + } + else + if(core.isXml(type)) { + r = core.parse(response, "text/xml"); + } + else + if(type == 'xhtml') { + r = core.parse(response, "application/xhtml+xml"); + } + else + if(type == 'html' || type == 'htm') { + r = core.parse(response, "text/html"); + } else { + r = response; + } + + return r; + }; + + Unarchive.prototype.getBlob = function(url, _mimeType){ + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash + var entry = this.zip.file(decodededUrl); + var mimeType; + + if(entry) { + mimeType = _mimeType || mime.lookup(entry.name); + return entry.async("uint8array").then(function(uint8array) { + return new Blob([uint8array], {type : mimeType}); + }); + } + }; + + Unarchive.prototype.getText = function(url, encoding){ + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash + var entry = this.zip.file(decodededUrl); + + if(entry) { + return entry.async("string").then(function(text) { + return text; + }); + } + }; + + Unarchive.prototype.getBase64 = function(url, _mimeType){ + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash + var entry = this.zip.file(decodededUrl); + var mimeType; + + if(entry) { + mimeType = _mimeType || mime.lookup(entry.name); + return entry.async("base64").then(function(data) { + return "data:" + mimeType + ";base64," + data; + }); + } + }; + + Unarchive.prototype.createUrl = function(url, options){ + var deferred = new RSVP.defer(); + var _URL = window.URL || window.webkitURL || window.mozURL; + var tempUrl; + var blob; + var response; + var useBase64 = options && options.base64; + + if(url in this.urlCache) { + deferred.resolve(this.urlCache[url]); + return deferred.promise; + } + + if (useBase64) { + response = this.getBase64(url); + + if (response) { + response.then(function(tempUrl) { + + this.urlCache[url] = tempUrl; + deferred.resolve(tempUrl); + + }.bind(this)); + + } + + } else { + + response = this.getBlob(url); + + if (response) { + response.then(function(blob) { + + tempUrl = _URL.createObjectURL(blob); + this.urlCache[url] = tempUrl; + deferred.resolve(tempUrl); + + }.bind(this)); + + } + } + + + if (!response) { + deferred.reject({ + message : "File not found in the epub: " + url, + stack : new Error().stack + }); + } + + return deferred.promise; + }; + + Unarchive.prototype.revokeUrl = function(url){ + var _URL = window.URL || window.webkitURL || window.mozURL; + var fromCache = this.urlCache[url]; + if(fromCache) _URL.revokeObjectURL(fromCache); + }; + + module.exports = Unarchive; - return loaded; - }; - - } -}; - -// Load the navigation -Navigation.prototype.load = function(_request) { - var request = _request || require('./request'); - var loading, loaded; - - if(this.nav) { - loading = this.nav.load(); - } else if(this.ncx) { - loading = this.ncx.load(); - } else { - loaded = new RSVP.defer(); - loaded.resolve([]); - loading = loaded.promise; - } - - return loading; - -}; - -Navigation.prototype.loaded = function(toc) { - var item; - - for (var i = 0; i < toc.length; i++) { - item = toc[i]; - this.tocByHref[item.href] = i; - this.tocById[item.id] = i; - } - -}; - -// Get an item from the navigation -Navigation.prototype.get = function(target) { - var index; - - if(!target) { - return this.toc; - } - - if(target.indexOf("#") === 0) { - index = this.tocById[target.substring(1)]; - } else if(target in this.tocByHref){ - index = this.tocByHref[target]; - } - - return this.toc[index]; -}; - -module.exports = Navigation; - -},{"./core":10,"./parser":22,"./request":26,"rsvp":5,"urijs":7}],22:[function(require,module,exports){ -var URI = require('urijs'); -var core = require('./core'); -var EpubCFI = require('./epubcfi'); - - -function Parser(){}; -Parser.prototype.container = function(containerXml){ - //-- - var rootfile, fullpath, folder, encoding; +/***/ }, +/* 28 */ +/***/ function(module, exports) { - if(!containerXml) { - console.error("Container File Not Found"); + /* + From Zip.js, by Gildas Lormeau + edited down + */ + + var table = { + "application" : { + "ecmascript" : [ "es", "ecma" ], + "javascript" : "js", + "ogg" : "ogx", + "pdf" : "pdf", + "postscript" : [ "ps", "ai", "eps", "epsi", "epsf", "eps2", "eps3" ], + "rdf+xml" : "rdf", + "smil" : [ "smi", "smil" ], + "xhtml+xml" : [ "xhtml", "xht" ], + "xml" : [ "xml", "xsl", "xsd", "opf", "ncx" ], + "zip" : "zip", + "x-httpd-eruby" : "rhtml", + "x-latex" : "latex", + "x-maker" : [ "frm", "maker", "frame", "fm", "fb", "book", "fbdoc" ], + "x-object" : "o", + "x-shockwave-flash" : [ "swf", "swfl" ], + "x-silverlight" : "scr", + "epub+zip" : "epub", + "font-tdpfr" : "pfr", + "inkml+xml" : [ "ink", "inkml" ], + "json" : "json", + "jsonml+json" : "jsonml", + "mathml+xml" : "mathml", + "metalink+xml" : "metalink", + "mp4" : "mp4s", + // "oebps-package+xml" : "opf", + "omdoc+xml" : "omdoc", + "oxps" : "oxps", + "vnd.amazon.ebook" : "azw", + "widget" : "wgt", + // "x-dtbncx+xml" : "ncx", + "x-dtbook+xml" : "dtb", + "x-dtbresource+xml" : "res", + "x-font-bdf" : "bdf", + "x-font-ghostscript" : "gsf", + "x-font-linux-psf" : "psf", + "x-font-otf" : "otf", + "x-font-pcf" : "pcf", + "x-font-snf" : "snf", + "x-font-ttf" : [ "ttf", "ttc" ], + "x-font-type1" : [ "pfa", "pfb", "pfm", "afm" ], + "x-font-woff" : "woff", + "x-mobipocket-ebook" : [ "prc", "mobi" ], + "x-mspublisher" : "pub", + "x-nzb" : "nzb", + "x-tgif" : "obj", + "xaml+xml" : "xaml", + "xml-dtd" : "dtd", + "xproc+xml" : "xpl", + "xslt+xml" : "xslt", + "internet-property-stream" : "acx", + "x-compress" : "z", + "x-compressed" : "tgz", + "x-gzip" : "gz", + }, + "audio" : { + "flac" : "flac", + "midi" : [ "mid", "midi", "kar", "rmi" ], + "mpeg" : [ "mpga", "mpega", "mp2", "mp3", "m4a", "mp2a", "m2a", "m3a" ], + "mpegurl" : "m3u", + "ogg" : [ "oga", "ogg", "spx" ], + "x-aiff" : [ "aif", "aiff", "aifc" ], + "x-ms-wma" : "wma", + "x-wav" : "wav", + "adpcm" : "adp", + "mp4" : "mp4a", + "webm" : "weba", + "x-aac" : "aac", + "x-caf" : "caf", + "x-matroska" : "mka", + "x-pn-realaudio-plugin" : "rmp", + "xm" : "xm", + "mid" : [ "mid", "rmi" ] + }, + "image" : { + "gif" : "gif", + "ief" : "ief", + "jpeg" : [ "jpeg", "jpg", "jpe" ], + "pcx" : "pcx", + "png" : "png", + "svg+xml" : [ "svg", "svgz" ], + "tiff" : [ "tiff", "tif" ], + "x-icon" : "ico", + "bmp" : "bmp", + "webp" : "webp", + "x-pict" : [ "pic", "pct" ], + "x-tga" : "tga", + "cis-cod" : "cod" + }, + "text" : { + "cache-manifest" : [ "manifest", "appcache" ], + "css" : "css", + "csv" : "csv", + "html" : [ "html", "htm", "shtml", "stm" ], + "mathml" : "mml", + "plain" : [ "txt", "text", "brf", "conf", "def", "list", "log", "in", "bas" ], + "richtext" : "rtx", + "tab-separated-values" : "tsv", + "x-bibtex" : "bib" + }, + "video" : { + "mpeg" : [ "mpeg", "mpg", "mpe", "m1v", "m2v", "mp2", "mpa", "mpv2" ], + "mp4" : [ "mp4", "mp4v", "mpg4" ], + "quicktime" : [ "qt", "mov" ], + "ogg" : "ogv", + "vnd.mpegurl" : [ "mxu", "m4u" ], + "x-flv" : "flv", + "x-la-asf" : [ "lsf", "lsx" ], + "x-mng" : "mng", + "x-ms-asf" : [ "asf", "asx", "asr" ], + "x-ms-wm" : "wm", + "x-ms-wmv" : "wmv", + "x-ms-wmx" : "wmx", + "x-ms-wvx" : "wvx", + "x-msvideo" : "avi", + "x-sgi-movie" : "movie", + "x-matroska" : [ "mpv", "mkv", "mk3d", "mks" ], + "3gpp2" : "3g2", + "h261" : "h261", + "h263" : "h263", + "h264" : "h264", + "jpeg" : "jpgv", + "jpm" : [ "jpm", "jpgm" ], + "mj2" : [ "mj2", "mjp2" ], + "vnd.ms-playready.media.pyv" : "pyv", + "vnd.uvvu.mp4" : [ "uvu", "uvvu" ], + "vnd.vivo" : "viv", + "webm" : "webm", + "x-f4v" : "f4v", + "x-m4v" : "m4v", + "x-ms-vob" : "vob", + "x-smv" : "smv" + } + }; + + var mimeTypes = (function() { + var type, subtype, val, index, mimeTypes = {}; + for (type in table) { + if (table.hasOwnProperty(type)) { + for (subtype in table[type]) { + if (table[type].hasOwnProperty(subtype)) { + val = table[type][subtype]; + if (typeof val == "string") { + mimeTypes[val] = type + "/" + subtype; + } else { + for (index = 0; index < val.length; index++) { + mimeTypes[val[index]] = type + "/" + subtype; + } + } + } + } + } + } + return mimeTypes; + })(); + + var defaultValue = "text/plain";//"application/octet-stream"; + + function lookup(filename) { + return filename && mimeTypes[filename.split(".").pop().toLowerCase()] || defaultValue; + }; + + module.exports = { + 'lookup': lookup + } + + +/***/ }, +/* 29 */ +/***/ function(module, exports) { + + if(typeof __WEBPACK_EXTERNAL_MODULE_29__ === 'undefined') {var e = new Error("Cannot find module \"JSZip\""); e.code = 'MODULE_NOT_FOUND'; throw e;} + module.exports = __WEBPACK_EXTERNAL_MODULE_29__; + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var core = __webpack_require__(11); + var EpubCFI = __webpack_require__(15); + var Mapping = __webpack_require__(26); + + + function Contents(doc, content, cfiBase) { + // Blank Cfi for Parsing + this.epubcfi = new EpubCFI(); + + this.document = doc; + this.documentElement = this.document.documentElement; + this.content = content || this.document.body; + this.window = this.document.defaultView; + // Dom events to listen for + this.listenedEvents = ["keydown", "keyup", "keypressed", "mouseup", "mousedown", "click", "touchend", "touchstart"]; + + this._size = { + width: 0, + height: 0 + } + + this.cfiBase = cfiBase || ""; + + this.listeners(); + }; + + Contents.prototype.width = function(w) { + // var frame = this.documentElement; + var frame = this.content; + + if (w && core.isNumber(w)) { + w = w + "px"; + } + + if (w) { + frame.style.width = w; + // this.content.style.width = w; + } + + return this.window.getComputedStyle(frame)['width']; + + + }; + + Contents.prototype.height = function(h) { + // var frame = this.documentElement; + var frame = this.content; + + if (h && core.isNumber(h)) { + h = h + "px"; + } + + if (h) { + frame.style.height = h; + // this.content.style.height = h; + } + + return this.window.getComputedStyle(frame)['height']; + + }; + + Contents.prototype.contentWidth = function(w) { + + var content = this.content || this.document.body; + + if (w && core.isNumber(w)) { + w = w + "px"; + } + + if (w) { + content.style.width = w; + } + + return this.window.getComputedStyle(content)['width']; + + + }; + + Contents.prototype.contentHeight = function(h) { + + var content = this.content || this.document.body; + + if (h && core.isNumber(h)) { + h = h + "px"; + } + + if (h) { + content.style.height = h; + } + + return this.window.getComputedStyle(content)['height']; + + }; + + Contents.prototype.textWidth = function() { + var width; + var range = this.document.createRange(); + var content = this.content || this.document.body; + + // Select the contents of frame + range.selectNodeContents(content); + + // get the width of the text content + width = range.getBoundingClientRect().width; + + return width; + + }; + + Contents.prototype.textHeight = function() { + var height; + var range = this.document.createRange(); + var content = this.content || this.document.body; + + range.selectNodeContents(content); + + height = range.getBoundingClientRect().height; + + return height; + }; + + Contents.prototype.scrollWidth = function() { + var width = this.documentElement.scrollWidth; + + return width; + }; + + Contents.prototype.scrollHeight = function() { + var height = this.documentElement.scrollHeight; + + return height; + }; + + Contents.prototype.overflow = function(overflow) { + + if (overflow) { + this.documentElement.style.overflow = overflow; + } + + return this.window.getComputedStyle(this.documentElement)['overflow']; + }; + + Contents.prototype.overflowX = function(overflow) { + + if (overflow) { + this.documentElement.style.overflowX = overflow; + } + + return this.window.getComputedStyle(this.documentElement)['overflowX']; + }; + + Contents.prototype.overflowY = function(overflow) { + + if (overflow) { + this.documentElement.style.overflowY = overflow; + } + + return this.window.getComputedStyle(this.documentElement)['overflowY']; + }; + + Contents.prototype.css = function(property, value) { + var content = this.content || this.document.body; + + if (value) { + content.style[property] = value; + } + + return this.window.getComputedStyle(content)[property]; + }; + + Contents.prototype.viewport = function(options) { + var width, height, scale, scalable; + var $viewport = this.document.querySelector("meta[name='viewport']"); + var newContent = ''; + + /** + * check for the viewport size + * + */ + if($viewport && $viewport.hasAttribute("content")) { + content = $viewport.getAttribute("content"); + contents = content.split(/\s*,\s*/); + if(contents[0]){ + width = contents[0].replace("width=", '').trim(); + } + if(contents[1]){ + height = contents[1].replace("height=", '').trim(); + } + if(contents[2]){ + scale = contents[2].replace("initial-scale=", '').trim(); + } + if(contents[3]){ + scalable = contents[3].replace("user-scalable=", '').trim(); + } + } + + if (options) { + + newContent += "width=" + (options.width || width); + newContent += ", height=" + (options.height || height); + if (options.scale || scale) { + newContent += ", initial-scale=" + (options.scale || scale); + } + if (options.scalable || scalable) { + newContent += ", user-scalable=" + (options.scalable || scalable); + } + + if (!$viewport) { + $viewport = this.document.createElement("meta"); + $viewport.setAttribute("name", "viewport"); + this.document.querySelector('head').appendChild($viewport); + } + + $viewport.setAttribute("content", newContent); + } + + + return { + width: parseInt(width), + height: parseInt(height) + }; + }; + + + // Contents.prototype.layout = function(layoutFunc) { + // + // this.iframe.style.display = "inline-block"; + // + // // Reset Body Styles + // this.content.style.margin = "0"; + // //this.document.body.style.display = "inline-block"; + // //this.document.documentElement.style.width = "auto"; + // + // if(layoutFunc){ + // layoutFunc(this); + // } + // + // this.onLayout(this); + // + // }; + // + // Contents.prototype.onLayout = function(view) { + // // stub + // }; + + Contents.prototype.expand = function() { + this.trigger("expand"); + }; + + Contents.prototype.listeners = function() { + + this.imageLoadListeners(); + + this.mediaQueryListeners(); + + // this.fontLoadListeners(); + + this.addEventListeners(); + + this.addSelectionListeners(); + + this.resizeListeners(); + + }; + + Contents.prototype.removeListeners = function() { + + this.removeEventListeners(); + + this.removeSelectionListeners(); + }; + + Contents.prototype.resizeListeners = function() { + var width, height; + // Test size again + clearTimeout(this.expanding); + + width = this.scrollWidth(); + height = this.scrollHeight(); + + if (width != this._size.width || height != this._size.height) { + + this._size = { + width: width, + height: height + } + + this.trigger("resize", this._size); + } + + this.expanding = setTimeout(this.resizeListeners.bind(this), 350); + }; + + //https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js + Contents.prototype.mediaQueryListeners = function() { + var sheets = this.document.styleSheets; + var mediaChangeHandler = function(m){ + if(m.matches && !this._expanding) { + setTimeout(this.expand.bind(this), 1); + // this.expand(); + } + }.bind(this); + + for (var i = 0; i < sheets.length; i += 1) { + var rules = sheets[i].cssRules; + if(!rules) return; // Stylesheets changed + for (var j = 0; j < rules.length; j += 1) { + //if (rules[j].constructor === CSSMediaRule) { + if(rules[j].media){ + var mql = this.window.matchMedia(rules[j].media.mediaText); + mql.addListener(mediaChangeHandler); + //mql.onchange = mediaChangeHandler; + } + } + } + }; + + Contents.prototype.observe = function(target) { + var renderer = this; + + // create an observer instance + var observer = new MutationObserver(function(mutations) { + if(renderer._expanding) { + renderer.expand(); + } + // mutations.forEach(function(mutation) { + // console.log(mutation); + // }); + }); + + // configuration of the observer: + var config = { attributes: true, childList: true, characterData: true, subtree: true }; + + // pass in the target node, as well as the observer options + observer.observe(target, config); + + return observer; + }; + + Contents.prototype.imageLoadListeners = function(target) { + var images = this.document.querySelectorAll("img"); + var img; + for (var i = 0; i < images.length; i++) { + img = images[i]; + + if (typeof img.naturalWidth !== "undefined" && + img.naturalWidth === 0) { + img.onload = this.expand.bind(this); + } + } + }; + + Contents.prototype.fontLoadListeners = function(target) { + if (!this.document || !this.document.fonts) { + return; + } + + this.document.fonts.ready.then(function () { + this.expand(); + }.bind(this)); + + }; + + Contents.prototype.root = function() { + if(!this.document) return null; + return this.document.documentElement; + }; + + Contents.prototype.locationOf = function(target, ignoreClass) { + var position; + var targetPos = {"left": 0, "top": 0}; + + if(!this.document) return; + + if(this.epubcfi.isCfiString(target)) { + range = new EpubCFI(target).toRange(this.document, ignoreClass); + + if(range) { + if (range.startContainer.nodeType === Node.ELEMENT_NODE) { + position = range.startContainer.getBoundingClientRect(); + targetPos.left = position.left; + targetPos.top = position.top; + } else { + position = range.getBoundingClientRect(); + targetPos.left = position.left; + targetPos.top = position.top; + } + } + + } else if(typeof target === "string" && + target.indexOf("#") > -1) { + + id = target.substring(target.indexOf("#")+1); + el = this.document.getElementById(id); + + if(el) { + position = el.getBoundingClientRect(); + targetPos.left = position.left; + targetPos.top = position.top; + } + } + + return targetPos; + }; + + Contents.prototype.addStylesheet = function(src) { + return new RSVP.Promise(function(resolve, reject){ + var $stylesheet; + var ready = false; + + if(!this.document) { + resolve(false); + return; + } + + $stylesheet = this.document.createElement('link'); + $stylesheet.type = 'text/css'; + $stylesheet.rel = "stylesheet"; + $stylesheet.href = src; + $stylesheet.onload = $stylesheet.onreadystatechange = function() { + if ( !ready && (!this.readyState || this.readyState == 'complete') ) { + ready = true; + // Let apply + setTimeout(function(){ + resolve(true); + }, 1); + } + }; + + this.document.head.appendChild($stylesheet); + + }.bind(this)); + }; + + // https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule + Contents.prototype.addStylesheetRules = function(rules) { + var styleEl; + var styleSheet; + + if(!this.document) return; + + styleEl = this.document.createElement('style'); + + // Append style element to head + this.document.head.appendChild(styleEl); + + // Grab style sheet + styleSheet = styleEl.sheet; + + for (var i = 0, rl = rules.length; i < rl; i++) { + var j = 1, rule = rules[i], selector = rules[i][0], propStr = ''; + // If the second argument of a rule is an array of arrays, correct our variables. + if (Object.prototype.toString.call(rule[1][0]) === '[object Array]') { + rule = rule[1]; + j = 0; + } + + for (var pl = rule.length; j < pl; j++) { + var prop = rule[j]; + propStr += prop[0] + ':' + prop[1] + (prop[2] ? ' !important' : '') + ';\n'; + } + + // Insert CSS Rule + styleSheet.insertRule(selector + '{' + propStr + '}', styleSheet.cssRules.length); + } + }; + + Contents.prototype.addScript = function(src) { + + return new RSVP.Promise(function(resolve, reject){ + var $script; + var ready = false; + + if(!this.document) { + resolve(false); + return; + } + + $script = this.document.createElement('script'); + $script.type = 'text/javascript'; + $script.async = true; + $script.src = src; + $script.onload = $script.onreadystatechange = function() { + if ( !ready && (!this.readyState || this.readyState == 'complete') ) { + ready = true; + setTimeout(function(){ + resolve(true); + }, 1); + } + }; + + this.document.head.appendChild($script); + + }.bind(this)); + }; + + Contents.prototype.addEventListeners = function(){ + if(!this.document) { return; } - - rootfile = core.qs(containerXml, "rootfile"); - - if(!rootfile) { - console.error("No RootFile Found"); + this.listenedEvents.forEach(function(eventName){ + this.document.addEventListener(eventName, this.triggerEvent.bind(this), false); + }, this); + + }; + + Contents.prototype.removeEventListeners = function(){ + if(!this.document) { return; } - - fullpath = rootfile.getAttribute('full-path'); - folder = URI(fullpath).directory(); - encoding = containerXml.xmlEncoding; - - //-- Now that we have the path we can parse the contents - return { - 'packagePath' : fullpath, - 'basePath' : folder, - 'encoding' : encoding - }; -}; - -Parser.prototype.identifier = function(packageXml){ - var metadataNode; - - if(!packageXml) { - console.error("Package File Not Found"); - return; - } - - metadataNode = core.qs(packageXml, "metadata"); - - if(!metadataNode) { - console.error("No Metadata Found"); - return; - } - - return this.getElementText(metadataNode, "identifier"); -}; - -Parser.prototype.packageContents = function(packageXml){ - var parse = this; - var metadataNode, manifestNode, spineNode; - var manifest, navPath, ncxPath, coverPath; - var spineNodeIndex; - var spine; - var spineIndexByURL; - var metadata; - - if(!packageXml) { - console.error("Package File Not Found"); - return; - } - - metadataNode = core.qs(packageXml, "metadata"); - if(!metadataNode) { - console.error("No Metadata Found"); - return; - } - - manifestNode = core.qs(packageXml, "manifest"); - if(!manifestNode) { - console.error("No Manifest Found"); - return; - } - - spineNode = core.qs(packageXml, "spine"); - if(!spineNode) { - console.error("No Spine Found"); - return; - } - - manifest = parse.manifest(manifestNode); - navPath = parse.findNavPath(manifestNode); - ncxPath = parse.findNcxPath(manifestNode, spineNode); - coverPath = parse.findCoverPath(packageXml); - - spineNodeIndex = Array.prototype.indexOf.call(spineNode.parentNode.childNodes, spineNode); - - spine = parse.spine(spineNode, manifest); - - metadata = parse.metadata(metadataNode); - - metadata.direction = spineNode.getAttribute("page-progression-direction"); - - return { - 'metadata' : metadata, - 'spine' : spine, - 'manifest' : manifest, - 'navPath' : navPath, - 'ncxPath' : ncxPath, - 'coverPath': coverPath, - 'spineNodeIndex' : spineNodeIndex - }; -}; - -//-- Find TOC NAV -Parser.prototype.findNavPath = function(manifestNode){ - // Find item with property 'nav' - // Should catch nav irregardless of order - // var node = manifestNode.querySelector("item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']"); - var node = core.qsp(manifestNode, "item", {"properties":"nav"}); - return node ? node.getAttribute('href') : false; -}; - -//-- Find TOC NCX: media-type="application/x-dtbncx+xml" href="toc.ncx" -Parser.prototype.findNcxPath = function(manifestNode, spineNode){ - // var node = manifestNode.querySelector("item[media-type='application/x-dtbncx+xml']"); - var node = core.qsp(manifestNode, "item", {"media-type":"application/x-dtbncx+xml"}); - var tocId; - - // If we can't find the toc by media-type then try to look for id of the item in the spine attributes as - // according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2, - // "The item that describes the NCX must be referenced by the spine toc attribute." - if (!node) { - tocId = spineNode.getAttribute("toc"); - if(tocId) { - // node = manifestNode.querySelector("item[id='" + tocId + "']"); - node = manifestNode.getElementById(tocId); + this.listenedEvents.forEach(function(eventName){ + this.document.removeEventListener(eventName, this.triggerEvent, false); + }, this); + + }; + + // Pass browser events + Contents.prototype.triggerEvent = function(e){ + this.trigger(e.type, e); + }; + + Contents.prototype.addSelectionListeners = function(){ + if(!this.document) { + return; } - } - - return node ? node.getAttribute('href') : false; -}; - -//-- Expanded to match Readium web components -Parser.prototype.metadata = function(xml){ - var metadata = {}, - p = this; - - metadata.title = p.getElementText(xml, 'title'); - metadata.creator = p.getElementText(xml, 'creator'); - metadata.description = p.getElementText(xml, 'description'); - - metadata.pubdate = p.getElementText(xml, 'date'); - - metadata.publisher = p.getElementText(xml, 'publisher'); - - metadata.identifier = p.getElementText(xml, "identifier"); - metadata.language = p.getElementText(xml, "language"); - metadata.rights = p.getElementText(xml, "rights"); - - metadata.modified_date = p.getPropertyText(xml, 'dcterms:modified'); - - metadata.layout = p.getPropertyText(xml, "rendition:layout"); - metadata.orientation = p.getPropertyText(xml, 'rendition:orientation'); - metadata.flow = p.getPropertyText(xml, 'rendition:flow'); - metadata.viewport = p.getPropertyText(xml, 'rendition:viewport'); - // metadata.page_prog_dir = packageXml.querySelector("spine").getAttribute("page-progression-direction"); - - return metadata; -}; - -//-- Find Cover: -//-- Fallback for Epub 2.0 -Parser.prototype.findCoverPath = function(packageXml){ - var pkg = core.qs(packageXml, "package"); - var epubVersion = pkg.getAttribute('version'); - - if (epubVersion === '2.0') { - var metaCover = core.qsp(packageXml, 'meta', {'name':'cover'}); - if (metaCover) { - var coverId = metaCover.getAttribute('content'); - // var cover = packageXml.querySelector("item[id='" + coverId + "']"); - var cover = packageXml.getElementById(coverId); - return cover ? cover.getAttribute('href') : false; + this.document.addEventListener("selectionchange", this.onSelectionChange.bind(this), false); + }; + + Contents.prototype.removeSelectionListeners = function(){ + if(!this.document) { + return; } - else { - return false; + this.document.removeEventListener("selectionchange", this.onSelectionChange, false); + }; + + Contents.prototype.onSelectionChange = function(e){ + if (this.selectionEndTimeout) { + clearTimeout(this.selectionEndTimeout); } - } - else { - // var node = packageXml.querySelector("item[properties='cover-image']"); - var node = core.qsp(packageXml, 'item', {'properties':'cover-image'}); - return node ? node.getAttribute('href') : false; - } -}; - -Parser.prototype.getElementText = function(xml, tag){ - var found = xml.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", tag), - el; - - if(!found || found.length === 0) return ''; - - el = found[0]; - - if(el.childNodes.length){ - return el.childNodes[0].nodeValue; - } - - return ''; - -}; - -Parser.prototype.getPropertyText = function(xml, property){ - var el = core.qsp(xml, "meta", {"property":property}); - - if(el && el.childNodes.length){ - return el.childNodes[0].nodeValue; - } - - return ''; -}; - -Parser.prototype.querySelectorText = function(xml, q){ - var el = xml.querySelector(q); - - if(el && el.childNodes.length){ - return el.childNodes[0].nodeValue; - } - - return ''; -}; - -Parser.prototype.manifest = function(manifestXml){ - var manifest = {}; - - //-- Turn items into an array - // var selected = manifestXml.querySelectorAll("item"); - var selected = core.qsa(manifestXml, "item"); - var items = Array.prototype.slice.call(selected); - - //-- Create an object with the id as key - items.forEach(function(item){ - var id = item.getAttribute('id'), - href = item.getAttribute('href') || '', - type = item.getAttribute('media-type') || '', - properties = item.getAttribute('properties') || ''; - - manifest[id] = { - 'href' : href, - // 'url' : href, - 'type' : type, - 'properties' : properties.length ? properties.split(' ') : [] - }; - - }); - - return manifest; - -}; - -Parser.prototype.spine = function(spineXml, manifest){ - var spine = []; - - var selected = spineXml.getElementsByTagName("itemref"), - items = Array.prototype.slice.call(selected); - - var epubcfi = new EpubCFI(); - - //-- Add to array to mantain ordering and cross reference with manifest - items.forEach(function(item, index){ - var idref = item.getAttribute('idref'); - // var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id); - var props = item.getAttribute('properties') || ''; - var propArray = props.length ? props.split(' ') : []; - // var manifestProps = manifest[Id].properties; - // var manifestPropArray = manifestProps.length ? manifestProps.split(' ') : []; - - var itemref = { - 'idref' : idref, - 'linear' : item.getAttribute('linear') || '', - 'properties' : propArray, - // 'href' : manifest[Id].href, - // 'url' : manifest[Id].url, - 'index' : index - // 'cfiBase' : cfiBase - }; - spine.push(itemref); - }); - - return spine; -}; - -Parser.prototype.querySelectorByType = function(html, element, type){ - var query; - if (typeof html.querySelector != "undefined") { - query = html.querySelector(element+'[*|type="'+type+'"]'); - } - // Handle IE not supporting namespaced epub:type in querySelector - if(!query || query.length === 0) { - query = core.qsa(html, element); - for (var i = 0; i < query.length; i++) { - if(query[i].getAttributeNS("http://www.idpf.org/2007/ops", "type") === type) { - return query[i]; + this.selectionEndTimeout = setTimeout(function() { + var selection = this.window.getSelection(); + this.triggerSelectedEvent(selection); + }.bind(this), 500); + }; + + Contents.prototype.triggerSelectedEvent = function(selection){ + var range, cfirange; + + if (selection && selection.rangeCount > 0) { + range = selection.getRangeAt(0); + if(!range.collapsed) { + // cfirange = this.section.cfiFromRange(range); + cfirange = new EpubCFI(range, this.cfiBase).toString(); + this.trigger("selected", cfirange); + this.trigger("selectedRange", range); } } - } else { - return query; - } -}; - -Parser.prototype.nav = function(navHtml, spineIndexByURL, bookSpine){ - var navElement = this.querySelectorByType(navHtml, "nav", "toc"); - // var navItems = navElement ? navElement.querySelectorAll("ol li") : []; - var navItems = navElement ? core.qsa(navElement, "li") : []; - var length = navItems.length; - var i; - var toc = {}; - var list = []; - var item, parent; - - if(!navItems || length === 0) return list; - - for (i = 0; i < length; ++i) { - item = this.navItem(navItems[i], spineIndexByURL, bookSpine); - toc[item.id] = item; - if(!item.parent) { - list.push(item); + }; + + Contents.prototype.range = function(_cfi, ignoreClass){ + var cfi = new EpubCFI(_cfi); + return cfi.toRange(this.document, ignoreClass); + }; + + Contents.prototype.map = function(layout){ + var map = new Mapping(layout); + return map.section(); + }; + + Contents.prototype.size = function(width, height){ + + if (width >= 0) { + this.width(width); + } + + if (height >= 0) { + this.height(height); + } + + this.css("margin", "0"); + this.css("boxSizing", "border-box"); + + }; + + Contents.prototype.columns = function(width, height, columnWidth, gap){ + var COLUMN_AXIS = core.prefixed('columnAxis'); + var COLUMN_GAP = core.prefixed('columnGap'); + var COLUMN_WIDTH = core.prefixed('columnWidth'); + var COLUMN_FILL = core.prefixed('columnFill'); + var textWidth; + + this.width(width); + this.height(height); + + // Deal with Mobile trying to scale to viewport + this.viewport({ width: width, height: height, scale: 1.0 }); + + // this.overflowY("hidden"); + this.css("overflowY", "hidden"); + this.css("margin", "0"); + this.css("boxSizing", "border-box"); + this.css("maxWidth", "inherit"); + + this.css(COLUMN_AXIS, "horizontal"); + this.css(COLUMN_FILL, "auto"); + + this.css(COLUMN_GAP, gap+"px"); + this.css(COLUMN_WIDTH, columnWidth+"px"); + }; + + Contents.prototype.scale = function(scale, offsetX, offsetY){ + var scale = "scale(" + scale + ")"; + var translate = ''; + // this.css("position", "absolute")); + this.css("transformOrigin", "top left"); + + if (offsetX >= 0 || offsetY >= 0) { + translate = " translate(" + (offsetX || 0 )+ "px, " + (offsetY || 0 )+ "px )"; + } + + this.css("transform", scale + translate); + }; + + Contents.prototype.fit = function(width, height){ + var viewport = this.viewport(); + var widthScale = width / viewport.width; + var heightScale = height / viewport.height; + var scale = widthScale < heightScale ? widthScale : heightScale; + + var offsetY = (height - (viewport.height * scale)) / 2; + + this.width(width); + this.height(height); + this.overflow("hidden"); + + // Deal with Mobile trying to scale to viewport + this.viewport({ scale: 1.0 }); + + // Scale to the correct size + this.scale(scale, 0, offsetY); + + this.css("backgroundColor", "transparent"); + }; + + Contents.prototype.mapPage = function(cfiBase, start, end) { + var mapping = new Mapping(); + + return mapping.page(this, cfiBase, start, end); + }; + + Contents.prototype.destroy = function() { + // Stop observing + if(this.observer) { + this.observer.disconnect(); + } + + this.removeListeners(); + + }; + + RSVP.EventTarget.mixin(Contents.prototype); + + module.exports = Contents; + + +/***/ }, +/* 31 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var core = __webpack_require__(11); + var EpubCFI = __webpack_require__(15); + var Contents = __webpack_require__(30); + + function IframeView(section, options) { + this.settings = core.extend({ + ignoreClass : '', + axis: 'vertical', + width: 0, + height: 0, + layout: undefined, + globalLayoutProperties: {}, + }, options || {}); + + this.id = "epubjs-view-" + core.uuid(); + this.section = section; + this.index = section.index; + + this.element = this.container(this.settings.axis); + + this.added = false; + this.displayed = false; + this.rendered = false; + + this.width = this.settings.width; + this.height = this.settings.height; + + this.fixedWidth = 0; + this.fixedHeight = 0; + + // Blank Cfi for Parsing + this.epubcfi = new EpubCFI(); + + this.layout = this.settings.layout; + // Dom events to listen for + // this.listenedEvents = ["keydown", "keyup", "keypressed", "mouseup", "mousedown", "click", "touchend", "touchstart"]; + }; + + IframeView.prototype.container = function(axis) { + var element = document.createElement('div'); + + element.classList.add("epub-view"); + + // this.element.style.minHeight = "100px"; + element.style.height = "0px"; + element.style.width = "0px"; + element.style.overflow = "hidden"; + + if(axis && axis == "horizontal"){ + element.style.display = "inline-block"; } else { - parent = toc[item.parent]; - parent.subitems.push(item); + element.style.display = "block"; } - } - - return list; -}; - -Parser.prototype.navItem = function(item, spineIndexByURL, bookSpine){ - var id = item.getAttribute('id') || false, - // content = item.querySelector("a, span"), - content = core.qs(item, "a"), - src = content.getAttribute('href') || '', - text = content.textContent || "", - // split = src.split("#"), - // baseUrl = split[0], - // spinePos = spineIndexByURL[baseUrl], - // spineItem = bookSpine[spinePos], - subitems = [], - parentNode = item.parentNode, - parent; - // cfi = spineItem ? spineItem.cfi : ''; - - if(parentNode && parentNode.nodeName === "navPoint") { - parent = parentNode.getAttribute('id'); - } - - /* - if(!id) { - if(spinePos) { - spineItem = bookSpine[spinePos]; - id = spineItem.id; - cfi = spineItem.cfi; + + return element; + }; + + IframeView.prototype.create = function() { + + if(this.iframe) { + return this.iframe; + } + + if(!this.element) { + this.element = this.createContainer(); + } + + this.iframe = document.createElement('iframe'); + this.iframe.id = this.id; + this.iframe.scrolling = "no"; // Might need to be removed: breaks ios width calculations + this.iframe.style.overflow = "hidden"; + this.iframe.seamless = "seamless"; + // Back up if seamless isn't supported + this.iframe.style.border = "none"; + + this.resizing = true; + + // this.iframe.style.display = "none"; + this.element.style.visibility = "hidden"; + this.iframe.style.visibility = "hidden"; + + this.iframe.style.width = "0"; + this.iframe.style.height = "0"; + this._width = 0; + this._height = 0; + + this.element.appendChild(this.iframe); + this.added = true; + + this.elementBounds = core.bounds(this.element); + + // if(width || height){ + // this.resize(width, height); + // } else if(this.width && this.height){ + // this.resize(this.width, this.height); + // } else { + // this.iframeBounds = core.bounds(this.iframe); + // } + + // Firefox has trouble with baseURI and srcdoc + // TODO: Disable for now in firefox + + if(!!("srcdoc" in this.iframe)) { + this.supportsSrcdoc = true; } else { - id = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid(); - item.setAttribute('id', id); + this.supportsSrcdoc = false; } - } - */ - - return { - "id": id, - "href": src, - "label": text, - "subitems" : subitems, - "parent" : parent - }; -}; - -Parser.prototype.ncx = function(tocXml, spineIndexByURL, bookSpine){ - // var navPoints = tocXml.querySelectorAll("navMap navPoint"); - var navPoints = core.qsa(tocXml, "navPoint"); - var length = navPoints.length; - var i; - var toc = {}; - var list = []; - var item, parent; - - if(!navPoints || length === 0) return list; - - for (i = 0; i < length; ++i) { - item = this.ncxItem(navPoints[i], spineIndexByURL, bookSpine); - toc[item.id] = item; - if(!item.parent) { - list.push(item); + + return this.iframe; + }; + + IframeView.prototype.render = function(request, show) { + + // view.onLayout = this.layout.format.bind(this.layout); + this.create(); + + // Fit to size of the container, apply padding + this.size(); + + if(!this.sectionRender) { + this.sectionRender = this.section.render(request); + } + + // Render Chain + return this.sectionRender + .then(function(contents){ + return this.load(contents); + }.bind(this)) + // .then(function(doc){ + // return this.hooks.content.trigger(view, this); + // }.bind(this)) + .then(function(){ + // this.settings.layout.format(view.contents); + // return this.hooks.layout.trigger(view, this); + }.bind(this)) + // .then(function(){ + // return this.display(); + // }.bind(this)) + // .then(function(){ + // return this.hooks.render.trigger(view, this); + // }.bind(this)) + .then(function(){ + + // apply the layout function to the contents + this.settings.layout.format(this.contents); + + // Expand the iframe to the full size of the content + this.expand(); + + // Listen for events that require an expansion of the iframe + this.addListeners(); + + if(show !== false) { + //this.q.enqueue(function(view){ + // this.show(); + //}, view); + } + // this.map = new Map(view, this.layout); + //this.hooks.show.trigger(view, this); + this.trigger("rendered", this.section); + + }.bind(this)) + .catch(function(e){ + this.trigger("loaderror", e); + }.bind(this)); + + }; + + // Determine locks base on settings + IframeView.prototype.size = function(_width, _height) { + var width = _width || this.settings.width; + var height = _height || this.settings.height; + + if(this.layout.name === "pre-paginated") { + this.lock("both", width, height); + } else if(this.settings.axis === "horizontal") { + this.lock("height", width, height); } else { - parent = toc[item.parent]; - parent.subitems.push(item); + this.lock("width", width, height); } - } - - return list; -}; - -Parser.prototype.ncxItem = function(item, spineIndexByURL, bookSpine){ - var id = item.getAttribute('id') || false, - // content = item.querySelector("content"), - content = core.qs(item, "content"), - src = content.getAttribute('src'), - // navLabel = item.querySelector("navLabel"), - navLabel = core.qs(item, "navLabel"), - text = navLabel.textContent ? navLabel.textContent : "", - // split = src.split("#"), - // baseUrl = split[0], - // spinePos = spineIndexByURL[baseUrl], - // spineItem = bookSpine[spinePos], - subitems = [], - parentNode = item.parentNode, - parent; - // cfi = spineItem ? spineItem.cfi : ''; - - if(parentNode && parentNode.nodeName === "navPoint") { - parent = parentNode.getAttribute('id'); - } - - /* - if(!id) { - if(spinePos) { - spineItem = bookSpine[spinePos]; - id = spineItem.id; - cfi = spineItem.cfi; + + }; + + // Lock an axis to element dimensions, taking borders into account + IframeView.prototype.lock = function(what, width, height) { + var elBorders = core.borders(this.element); + var iframeBorders; + + if(this.iframe) { + iframeBorders = core.borders(this.iframe); } else { - id = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid(); - item.setAttribute('id', id); + iframeBorders = {width: 0, height: 0}; } - } - */ - - return { - "id": id, - "href": src, - "label": text, - "subitems" : subitems, - "parent" : parent - }; -}; - -Parser.prototype.pageList = function(navHtml, spineIndexByURL, bookSpine){ - var navElement = this.querySelectorByType(navHtml, "nav", "page-list"); - // var navItems = navElement ? navElement.querySelectorAll("ol li") : []; - var navItems = navElement ? core.qsa(navElement, "li") : []; - var length = navItems.length; - var i; - var toc = {}; - var list = []; - var item; - - if(!navItems || length === 0) return list; - - for (i = 0; i < length; ++i) { - item = this.pageListItem(navItems[i], spineIndexByURL, bookSpine); - list.push(item); - } - - return list; -}; - -Parser.prototype.pageListItem = function(item, spineIndexByURL, bookSpine){ - var id = item.getAttribute('id') || false, - // content = item.querySelector("a"), - content = core.qs(item, "a"), - href = content.getAttribute('href') || '', - text = content.textContent || "", - page = parseInt(text), - isCfi = href.indexOf("epubcfi"), - split, - packageUrl, - cfi; - - if(isCfi != -1) { - split = href.split("#"); - packageUrl = split[0]; - cfi = split.length > 1 ? split[1] : false; - return { - "cfi" : cfi, - "href" : href, - "packageUrl" : packageUrl, - "page" : page - }; - } else { - return { - "href" : href, - "page" : page - }; - } -}; - -module.exports = Parser; - -},{"./core":10,"./epubcfi":11,"urijs":7}],23:[function(require,module,exports){ -var RSVP = require('rsvp'); -var core = require('./core'); - -function Queue(_context){ - this._q = []; - this.context = _context; - this.tick = core.requestAnimationFrame; - this.running = false; - this.paused = false; -}; - -// Add an item to the queue -Queue.prototype.enqueue = function() { - var deferred, promise; - var queued; - var task = [].shift.call(arguments); - var args = arguments; - - // Handle single args without context - // if(args && !Array.isArray(args)) { - // args = [args]; - // } - if(!task) { - return console.error("No Task Provided"); - } - - if(typeof task === "function"){ - - deferred = new RSVP.defer(); - promise = deferred.promise; - - queued = { - "task" : task, - "args" : args, - //"context" : context, - "deferred" : deferred, - "promise" : promise - }; - - } else { - // Task is a promise - queued = { - "promise" : task - }; - - } - - this._q.push(queued); - - // Wait to start queue flush - if (this.paused == false && !this.running) { - // setTimeout(this.flush.bind(this), 0); - // this.tick.call(window, this.run.bind(this)); - this.run(); - } - - return queued.promise; -}; - -// Run one item -Queue.prototype.dequeue = function(){ - var inwait, task, result; - - if(this._q.length) { - inwait = this._q.shift(); - task = inwait.task; - if(task){ - // console.log(task) - - result = task.apply(this.context, inwait.args); - - if(result && typeof result["then"] === "function") { - // Task is a function that returns a promise - return result.then(function(){ - inwait.deferred.resolve.apply(this.context, arguments); - }.bind(this)); + + if(what == "width" && core.isNumber(width)){ + this.lockedWidth = width - elBorders.width - iframeBorders.width; + this.resize(this.lockedWidth, width); // width keeps ratio correct + } + + if(what == "height" && core.isNumber(height)){ + this.lockedHeight = height - elBorders.height - iframeBorders.height; + this.resize(width, this.lockedHeight); + } + + if(what === "both" && + core.isNumber(width) && + core.isNumber(height)){ + + this.lockedWidth = width - elBorders.width - iframeBorders.width; + this.lockedHeight = height - elBorders.height - iframeBorders.height; + + this.resize(this.lockedWidth, this.lockedHeight); + } + + if(this.displayed && this.iframe) { + + // this.contents.layout(); + this.expand(); + + } + + + + }; + + // Resize a single axis based on content dimensions + IframeView.prototype.expand = function(force) { + var width = this.lockedWidth; + var height = this.lockedHeight; + var columns; + + var textWidth, textHeight; + + if(!this.iframe || this._expanding) return; + + this._expanding = true; + + // Expand Horizontally + // if(height && !width) { + if(this.settings.axis === "horizontal") { + // Get the width of the text + textWidth = this.contents.textWidth(); + // Check if the textWidth has changed + if(textWidth != this._textWidth){ + // Get the contentWidth by resizing the iframe + // Check with a min reset of the textWidth + width = this.contentWidth(textWidth); + + columns = Math.ceil(width / (this.settings.layout.columnWidth + this.settings.layout.gap)); + + if ( this.settings.layout.divisor > 1 && + this.settings.layout.name === "reflowable" && + (columns % 2 > 0)) { + // add a blank page + width += this.settings.layout.gap + this.settings.layout.columnWidth; + } + + // Save the textWdith + this._textWidth = textWidth; + // Save the contentWidth + this._contentWidth = width; } else { - // Task resolves immediately - inwait.deferred.resolve.apply(this.context, result); - return inwait.promise; + // Otherwise assume content height hasn't changed + width = this._contentWidth; } - - - - } else if(inwait.promise) { - // Task is a promise - return inwait.promise; - } - - } else { - inwait = new RSVP.defer(); - inwait.deferred.resolve(); - return inwait.promise; - } - -}; - -// Run All Immediately -Queue.prototype.dump = function(){ - while(this._q.length) { - this.dequeue(); - } -}; - -// Run all sequentially, at convince - -Queue.prototype.run = function(){ - - if(!this.running){ - this.running = true; - this.defered = new RSVP.defer(); - } - - this.tick.call(window, function() { - - if(this._q.length) { - - this.dequeue() - .then(function(){ - this.run(); - }.bind(this)); - + } // Expand Vertically + else if(this.settings.axis === "vertical") { + textHeight = this.contents.textHeight(); + if(textHeight != this._textHeight){ + height = this.contentHeight(textHeight); + this._textHeight = textHeight; + this._contentHeight = height; + } else { + height = this._contentHeight; + } + + } + + // Only Resize if dimensions have changed or + // if Frame is still hidden, so needs reframing + if(this._needsReframe || width != this._width || height != this._height){ + this.resize(width, height); + } + + this._expanding = false; + }; + + IframeView.prototype.contentWidth = function(min) { + var prev; + var width; + + // Save previous width + prev = this.iframe.style.width; + // Set the iframe size to min, width will only ever be greater + // Will preserve the aspect ratio + this.iframe.style.width = (min || 0) + "px"; + // Get the scroll overflow width + width = this.contents.scrollWidth(); + // Reset iframe size back + this.iframe.style.width = prev; + return width; + }; + + IframeView.prototype.contentHeight = function(min) { + var prev; + var height; + + prev = this.iframe.style.height; + this.iframe.style.height = (min || 0) + "px"; + height = this.contents.scrollHeight(); + + this.iframe.style.height = prev; + return height; + }; + + + IframeView.prototype.resize = function(width, height) { + + if(!this.iframe) return; + + if(core.isNumber(width)){ + this.iframe.style.width = width + "px"; + this._width = width; + } + + if(core.isNumber(height)){ + this.iframe.style.height = height + "px"; + this._height = height; + } + + this.iframeBounds = core.bounds(this.iframe); + + this.reframe(this.iframeBounds.width, this.iframeBounds.height); + + }; + + IframeView.prototype.reframe = function(width, height) { + var size; + + // if(!this.displayed) { + // this._needsReframe = true; + // return; + // } + if(core.isNumber(width)){ + this.element.style.width = width + "px"; + } + + if(core.isNumber(height)){ + this.element.style.height = height + "px"; + } + + this.prevBounds = this.elementBounds; + + this.elementBounds = core.bounds(this.element); + + size = { + width: this.elementBounds.width, + height: this.elementBounds.height, + widthDelta: this.elementBounds.width - this.prevBounds.width, + heightDelta: this.elementBounds.height - this.prevBounds.height, + }; + + this.onResize(this, size); + + this.trigger("resized", size); + + }; + + + IframeView.prototype.load = function(contents) { + var loading = new RSVP.defer(); + var loaded = loading.promise; + + if(!this.iframe) { + loading.reject(new Error("No Iframe Available")); + return loaded; + } + + this.iframe.onload = function(event) { + + this.onLoad(event, loading); + + }.bind(this); + + if(this.supportsSrcdoc){ + this.iframe.srcdoc = contents; } else { - this.defered.resolve(); - this.running = undefined; + + this.document = this.iframe.contentDocument; + + if(!this.document) { + loading.reject(new Error("No Document Available")); + return loaded; + } + + this.iframe.contentDocument.open(); + this.iframe.contentDocument.write(contents); + this.iframe.contentDocument.close(); + } - - }.bind(this)); - - // Unpause - if(this.paused == true) { - this.paused = false; - } - - return this.defered.promise; -}; - -// Flush all, as quickly as possible -Queue.prototype.flush = function(){ - - if(this.running){ - return this.running; - } - - if(this._q.length) { - this.running = this.dequeue() - .then(function(){ - this.running = undefined; - return this.flush(); + + return loaded; + }; + + IframeView.prototype.onLoad = function(event, promise) { + + this.window = this.iframe.contentWindow; + this.document = this.iframe.contentDocument; + + this.contents = new Contents(this.document, this.document.body, this.section.cfiBase); + + this.rendering = false; + + var link = this.document.querySelector("link[rel='canonical']"); + if (link) { + link.setAttribute("href", this.section.url); + } else { + link = this.document.createElement("link"); + link.setAttribute("rel", "canonical"); + link.setAttribute("href", this.section.url); + this.document.querySelector("head").appendChild(link); + } + + this.contents.on("expand", function () { + if(this.displayed && this.iframe) { + this.expand(); + } + }); + + promise.resolve(this.contents); + }; + + + + // IframeView.prototype.layout = function(layoutFunc) { + // + // this.iframe.style.display = "inline-block"; + // + // // Reset Body Styles + // // this.document.body.style.margin = "0"; + // //this.document.body.style.display = "inline-block"; + // //this.document.documentElement.style.width = "auto"; + // + // if(layoutFunc){ + // this.layoutFunc = layoutFunc; + // } + // + // this.contents.layout(this.layoutFunc); + // + // }; + // + // IframeView.prototype.onLayout = function(view) { + // // stub + // }; + + IframeView.prototype.setLayout = function(layout) { + this.layout = layout; + }; + + IframeView.prototype.setAxis = function(axis) { + this.settings.axis = axis; + }; + + IframeView.prototype.resizeListenters = function() { + // Test size again + clearTimeout(this.expanding); + this.expanding = setTimeout(this.expand.bind(this), 350); + }; + + IframeView.prototype.addListeners = function() { + //TODO: Add content listeners for expanding + }; + + IframeView.prototype.removeListeners = function(layoutFunc) { + //TODO: remove content listeners for expanding + }; + + IframeView.prototype.display = function(request) { + var displayed = new RSVP.defer(); + + if (!this.displayed) { + + this.render(request).then(function () { + + this.trigger("displayed", this); + this.onDisplayed(this); + + this.displayed = true; + displayed.resolve(this); + }.bind(this)); - - return this.running; - } - -}; - -// Clear all items in wait -Queue.prototype.clear = function(){ - this._q = []; - this.running = false; -}; - -Queue.prototype.length = function(){ - return this._q.length; -}; - -Queue.prototype.pause = function(){ - this.paused = true; -}; - -// Create a new task from a callback -function Task(task, args, context){ - - return function(){ - var toApply = arguments || []; - - return new RSVP.Promise(function(resolve, reject) { - var callback = function(value){ - resolve(value); - }; - // Add the callback to the arguments list - toApply.push(callback); - - // Apply all arguments to the functions - task.apply(this, toApply); - - }.bind(this)); - + + } else { + displayed.resolve(this); + } + + + return displayed.promise; }; - -}; - -module.exports = Queue; - -},{"./core":10,"rsvp":5}],24:[function(require,module,exports){ -var RSVP = require('rsvp'); -var URI = require('urijs'); -var core = require('./core'); -var replace = require('./replacements'); -var Hook = require('./hook'); -var EpubCFI = require('./epubcfi'); -var Queue = require('./queue'); -var Layout = require('./layout'); -var Mapping = require('./mapping'); - -function Rendition(book, options) { - - this.settings = core.extend(this.settings || {}, { - width: null, - height: null, - ignoreClass: '', - manager: "single", - view: "iframe", - flow: null, - layout: null, - spread: null, - minSpreadWidth: 800, //-- overridden by spread: none (never) / both (always), - useBase64: true - }); - - core.extend(this.settings, options); - - this.viewSettings = { - ignoreClass: this.settings.ignoreClass + + IframeView.prototype.show = function() { + + this.element.style.visibility = "visible"; + + if(this.iframe){ + this.iframe.style.visibility = "visible"; + } + + this.trigger("shown", this); }; - - this.book = book; - - this.views = null; - - //-- Adds Hook methods to the Rendition prototype - this.hooks = {}; - this.hooks.display = new Hook(this); - this.hooks.serialize = new Hook(this); - this.hooks.content = new Hook(this); - this.hooks.layout = new Hook(this); - this.hooks.render = new Hook(this); - this.hooks.show = new Hook(this); - - this.hooks.content.register(replace.links.bind(this)); - this.hooks.content.register(this.passViewEvents.bind(this)); - - // this.hooks.display.register(this.afterDisplay.bind(this)); - - this.epubcfi = new EpubCFI(); - - this.q = new Queue(this); - - this.q.enqueue(this.book.opened); - - // Block the queue until rendering is started - // this.starting = new RSVP.defer(); - // this.started = this.starting.promise; - this.q.enqueue(this.start); - - if(this.book.unarchived) { - this.q.enqueue(this.replacements.bind(this)); - } - -}; - -Rendition.prototype.setManager = function(manager) { - this.manager = manager; -}; - -Rendition.prototype.requireManager = function(manager) { - var viewManager; - - // If manager is a string, try to load from register managers, - // or require included managers directly - if (typeof manager === "string") { - // Use global or require - viewManager = typeof ePub != "undefined" ? ePub.ViewManagers[manager] : undefined; //require('./managers/'+manager); - } else { - // otherwise, assume we were passed a function - viewManager = manager - } - - return viewManager; -}; - -Rendition.prototype.requireView = function(view) { - var View; - - if (typeof view == "string") { - View = typeof ePub != "undefined" ? ePub.Views[view] : undefined; //require('./views/'+view); - } else { - // otherwise, assume we were passed a function - View = view - } - - return View; -}; - -Rendition.prototype.start = function(){ - - if(!this.manager) { - this.ViewManager = this.requireManager(this.settings.manager); - this.View = this.requireView(this.settings.view); - - this.manager = new this.ViewManager({ - view: this.View, - queue: this.q, - request: this.book.request, - settings: this.settings + + IframeView.prototype.hide = function() { + // this.iframe.style.display = "none"; + this.element.style.visibility = "hidden"; + this.iframe.style.visibility = "hidden"; + + this.stopExpanding = true; + this.trigger("hidden", this); + }; + + IframeView.prototype.position = function() { + return this.element.getBoundingClientRect(); + }; + + IframeView.prototype.locationOf = function(target) { + var parentPos = this.iframe.getBoundingClientRect(); + var targetPos = this.contents.locationOf(target, this.settings.ignoreClass); + + return { + "left": window.scrollX + parentPos.left + targetPos.left, + "top": window.scrollY + parentPos.top + targetPos.top + }; + }; + + IframeView.prototype.onDisplayed = function(view) { + // Stub, override with a custom functions + }; + + IframeView.prototype.onResize = function(view, e) { + // Stub, override with a custom functions + }; + + IframeView.prototype.bounds = function() { + if(!this.elementBounds) { + this.elementBounds = core.bounds(this.element); + } + return this.elementBounds; + }; + + IframeView.prototype.destroy = function() { + + if(this.displayed){ + this.displayed = false; + + this.removeListeners(); + + this.stopExpanding = true; + this.element.removeChild(this.iframe); + this.displayed = false; + this.iframe = null; + + this._textWidth = null; + this._textHeight = null; + this._width = null; + this._height = null; + } + // this.element.style.height = "0px"; + // this.element.style.width = "0px"; + }; + + RSVP.EventTarget.mixin(IframeView.prototype); + + module.exports = IframeView; + + +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var core = __webpack_require__(11); + var EpubCFI = __webpack_require__(15); + var Mapping = __webpack_require__(26); + var Queue = __webpack_require__(21); + var Stage = __webpack_require__(33); + var Views = __webpack_require__(34); + + function DefaultViewManager(options) { + + this.name = "default"; + this.View = options.view; + this.request = options.request; + this.renditionQueue = options.queue; + this.q = new Queue(this); + + this.settings = core.extend(this.settings || {}, { + infinite: true, + hidden: false, + width: undefined, + height: undefined, + // globalLayoutProperties : { layout: 'reflowable', spread: 'auto', orientation: 'auto'}, + // layout: null, + axis: "vertical", + ignoreClass: '' }); - } - - // Parse metadata to get layout props - this.settings.globalLayoutProperties = this.determineLayoutProperties(this.book.package.metadata); - - this.flow(this.settings.globalLayoutProperties.flow); - - this.layout(this.settings.globalLayoutProperties); - - // Listen for displayed views - this.manager.on("added", this.afterDisplayed.bind(this)); - - // Listen for resizing - this.manager.on("resized", this.onResized.bind(this)); - - // Listen for scroll changes - this.manager.on("scroll", this.reportLocation.bind(this)); - - - this.on('displayed', this.reportLocation.bind(this)); - - // Trigger that rendering has started - this.trigger("started"); - - // Start processing queue - // this.starting.resolve(); -}; - -// Call to attach the container to an element in the dom -// Container must be attached before rendering can begin -Rendition.prototype.attachTo = function(element){ - - return this.q.enqueue(function () { - - // Start rendering - this.manager.render(element, { - "width" : this.settings.width, - "height" : this.settings.height + + core.extend(this.settings, options.settings || {}); + + this.viewSettings = { + ignoreClass: this.settings.ignoreClass, + axis: this.settings.axis, + layout: this.layout, + width: 0, + height: 0 + }; + + } + + DefaultViewManager.prototype.render = function(element, size){ + + // Save the stage + this.stage = new Stage({ + width: size.width, + height: size.height, + overflow: this.settings.overflow, + hidden: this.settings.hidden, + axis: this.settings.axis }); - - // Trigger Attached - this.trigger("attached"); - - }.bind(this)); - -}; - -Rendition.prototype.display = function(target){ - - // if (!this.book.spine.spineItems.length > 0) { - // Book isn't open yet - // return this.q.enqueue(this.display, target); - // } - - return this.q.enqueue(this._display, target); - -}; - -Rendition.prototype._display = function(target){ - var isCfiString = this.epubcfi.isCfiString(target); - var displaying = new RSVP.defer(); - var displayed = displaying.promise; - var section; - var moveTo; - - section = this.book.spine.get(target); - - if(!section){ - displaying.reject(new Error("No Section Found")); - return displayed; - } - - // Trim the target fragment - // removing the chapter - if(!isCfiString && typeof target === "string" && - target.indexOf("#") > -1) { - moveTo = target.substring(target.indexOf("#")+1); - } - - if (isCfiString) { - moveTo = target; - } - - return this.manager.display(section, moveTo) - .then(function(){ - this.trigger("displayed", section); + + this.stage.attachTo(element); + + // Get this stage container div + this.container = this.stage.getContainer(); + + // Views array methods + this.views = new Views(this.container); + + // Calculate Stage Size + this._bounds = this.bounds(); + this._stageSize = this.stage.size(); + + // Set the dimensions for views + this.viewSettings.width = this._stageSize.width; + this.viewSettings.height = this._stageSize.height; + + // Function to handle a resize event. + // Will only attach if width and height are both fixed. + this.stage.onResize(this.onResized.bind(this)); + + // Add Event Listeners + this.addEventListeners(); + + // Add Layout method + // this.applyLayoutMethod(); + if (this.layout) { + this.updateLayout(); + } + }; + + DefaultViewManager.prototype.addEventListeners = function(){ + window.addEventListener('unload', function(e){ + this.destroy(); }.bind(this)); - -}; - -/* -Rendition.prototype.render = function(view, show) { - - // view.onLayout = this.layout.format.bind(this.layout); - view.create(); - - // Fit to size of the container, apply padding - this.manager.resizeView(view); - - // Render Chain - return view.section.render(this.book.request) - .then(function(contents){ - return view.load(contents); - }.bind(this)) - .then(function(doc){ - return this.hooks.content.trigger(view, this); - }.bind(this)) - .then(function(){ - this.layout.format(view.contents); - return this.hooks.layout.trigger(view, this); - }.bind(this)) - .then(function(){ - return view.display(); - }.bind(this)) - .then(function(){ - return this.hooks.render.trigger(view, this); - }.bind(this)) - .then(function(){ - if(show !== false) { - this.q.enqueue(function(view){ - view.show(); - }, view); - } - // this.map = new Map(view, this.layout); - this.hooks.show.trigger(view, this); - this.trigger("rendered", view.section); - - }.bind(this)) - .catch(function(e){ - this.trigger("loaderror", e); + }; + + DefaultViewManager.prototype.destroy = function(){ + // this.views.each(function(view){ + // view.destroy(); + // }); + + /* + + clearTimeout(this.trimTimeout); + if(this.settings.hidden) { + this.element.removeChild(this.wrapper); + } else { + this.element.removeChild(this.container); + } + */ + }; + + DefaultViewManager.prototype.onResized = function(e) { + clearTimeout(this.resizeTimeout); + this.resizeTimeout = setTimeout(function(){ + this.resize(); + }.bind(this), 150); + }; + + DefaultViewManager.prototype.resize = function(width, height){ + + // Clear the queue + this.q.clear(); + + this._stageSize = this.stage.size(width, height); + this._bounds = this.bounds(); + + // Update for new views + this.viewSettings.width = this._stageSize.width; + this.viewSettings.height = this._stageSize.height; + + // Update for existing views + this.views.each(function(view) { + view.size(this._stageSize.width, this._stageSize.height); }.bind(this)); - -}; -*/ - -Rendition.prototype.afterDisplayed = function(view){ - this.hooks.content.trigger(view, this); - this.trigger("rendered", view.section); - this.reportLocation(); -}; - -Rendition.prototype.onResized = function(size){ - - if(this.location) { - this.display(this.location.start); - } - - this.trigger("resized", { - width: size.width, - height: size.height - }); - -}; - -Rendition.prototype.moveTo = function(offset){ - this.manager.moveTo(offset); -}; - -Rendition.prototype.next = function(){ - return this.q.enqueue(this.manager.next.bind(this.manager)) - .then(this.reportLocation.bind(this)); -}; - -Rendition.prototype.prev = function(){ - return this.q.enqueue(this.manager.prev.bind(this.manager)) - .then(this.reportLocation.bind(this)); -}; - -//-- http://www.idpf.org/epub/301/spec/epub-publications.html#meta-properties-rendering -Rendition.prototype.determineLayoutProperties = function(metadata){ - var settings; - var layout = this.settings.layout || metadata.layout || "reflowable"; - var spread = this.settings.spread || metadata.spread || "auto"; - var orientation = this.settings.orientation || metadata.orientation || "auto"; - var flow = this.settings.flow || metadata.flow || "auto"; - var viewport = metadata.viewport || ""; - var minSpreadWidth = this.settings.minSpreadWidth || metadata.minSpreadWidth || 800; - - if (this.settings.width >= 0 && this.settings.height >= 0) { - viewport = "width="+this.settings.width+", height="+this.settings.height+""; - } - - settings = { - layout : layout, - spread : spread, - orientation : orientation, - flow : flow, - viewport : viewport, - minSpreadWidth : minSpreadWidth + + this.updateLayout(); + + this.trigger("resized", { + width: this.stage.width, + height: this.stage.height + }); + }; - - return settings; -}; - -// Rendition.prototype.applyLayoutProperties = function(){ -// var settings = this.determineLayoutProperties(this.book.package.metadata); -// -// this.flow(settings.flow); -// -// this.layout(settings); -// }; - -// paginated | scrolled -// (scrolled-continuous vs scrolled-doc are handled by different view managers) -Rendition.prototype.flow = function(_flow){ - var flow; - if (_flow === "scrolled-doc" || _flow === "scrolled-continuous") { - flow = "scrolled"; - } - - if (_flow === "auto" || _flow === "paginated") { - flow = "paginated"; - } - - if (this._layout) { - this._layout.flow(flow); - } - - if (this.manager) { - this.manager.updateFlow(flow); - } -}; - -// reflowable | pre-paginated -Rendition.prototype.layout = function(settings){ - if (settings) { - this._layout = new Layout(settings); - this._layout.spread(settings.spread, this.settings.minSpreadWidth); - - this.mapping = new Mapping(this._layout); - } - - if (this.manager && this._layout) { - this.manager.applyLayout(this._layout); - } - - return this._layout; -}; - -// none | auto (TODO: implement landscape, portrait, both) -Rendition.prototype.spread = function(spread, min){ - - this._layout.spread(spread, min); - - if (this.manager.isRendered()) { - this.manager.updateLayout(); - } -}; - - -Rendition.prototype.reportLocation = function(){ - return this.q.enqueue(function(){ - var location = this.manager.currentLocation(); - if (location && location.then && typeof location.then === 'function') { - location.then(function(result) { - this.location = result; - this.trigger("locationChanged", this.location); - }.bind(this)); - } else if (location) { - this.location = location; - this.trigger("locationChanged", this.location); + + DefaultViewManager.prototype.createView = function(section) { + return new this.View(section, this.viewSettings); + }; + + DefaultViewManager.prototype.display = function(section, target){ + + var displaying = new RSVP.defer(); + var displayed = displaying.promise; + + // Check to make sure the section we want isn't already shown + var visible = this.views.find(section); + + // View is already shown, just move to correct location + if(visible && target) { + offset = visible.locationOf(target); + this.moveTo(offset); + displaying.resolve(); + return displayed; } - - }.bind(this)); -}; - - -Rendition.prototype.destroy = function(){ - // Clear the queue - this.q.clear(); - - this.manager.destroy(); -}; - -Rendition.prototype.passViewEvents = function(view){ - view.contents.listenedEvents.forEach(function(e){ - view.on(e, this.triggerViewEvent.bind(this)); - }.bind(this)); - - view.on("selected", this.triggerSelectedEvent.bind(this)); -}; - -Rendition.prototype.triggerViewEvent = function(e){ - this.trigger(e.type, e); -}; - -Rendition.prototype.triggerSelectedEvent = function(cfirange){ - this.trigger("selected", cfirange); -}; - -Rendition.prototype.replacements = function(){ - // Wait for loading - // return this.q.enqueue(function () { - // Get thes books manifest - var manifest = this.book.package.manifest; - var manifestArray = Object.keys(manifest). - map(function (key){ - return manifest[key]; - }); - - // Exclude HTML - var items = manifestArray. - filter(function (item){ - if (item.type != "application/xhtml+xml" && - item.type != "text/html") { - return true; + + // Hide all current views + this.views.hide(); + + this.views.clear(); + + this.add(section) + .then(function(){ + var next; + if (this.layout.name === "pre-paginated" && + this.layout.divisor > 1) { + next = section.next(); + if (next) { + return this.add(next); + } } - }); - - // Only CSS - var css = items. - filter(function (item){ - if (item.type === "text/css") { - return true; + }.bind(this)) + .then(function(view){ + + // Move to correct place within the section, if needed + if(target) { + offset = view.locationOf(target); + this.moveTo(offset); } - }); - - // Css Urls - var cssUrls = css.map(function(item) { - return item.href; - }); - - // All Assets Urls - var urls = items. - map(function(item) { - return item.href; - }.bind(this)); - - // Create blob urls for all the assets - var processing = urls. - map(function(url) { - var absolute = URI(url).absoluteTo(this.book.baseUrl).toString(); - // Full url from archive base - return this.book.unarchived.createUrl(absolute, {"base64": this.settings.useBase64}); - }.bind(this)); - - var replacementUrls; - - // After all the urls are created - return RSVP.all(processing) - .then(function(_replacementUrls) { - var replaced = []; - - replacementUrls = _replacementUrls; - - // Replace Asset Urls in the text of all css files - cssUrls.forEach(function(href) { - replaced.push(this.replaceCss(href, urls, replacementUrls)); - }.bind(this)); - - return RSVP.all(replaced); - + + this.views.show(); + + displaying.resolve(); + }.bind(this)) - .then(function () { - // Replace Asset Urls in chapters - // by registering a hook after the sections contents has been serialized - this.book.spine.hooks.serialize.register(function(output, section) { - - this.replaceAssets(section, urls, replacementUrls); - + // .then(function(){ + // return this.hooks.display.trigger(view); + // }.bind(this)) + // .then(function(){ + // this.views.show(); + // }.bind(this)); + return displayed; + }; + + DefaultViewManager.prototype.afterDisplayed = function(view){ + this.trigger("added", view); + }; + + DefaultViewManager.prototype.afterResized = function(view){ + this.trigger("resize", view.section); + }; + + // DefaultViewManager.prototype.moveTo = function(offset){ + // this.scrollTo(offset.left, offset.top); + // }; + + DefaultViewManager.prototype.moveTo = function(offset){ + var distX = 0, + distY = 0; + + if(this.settings.axis === "vertical") { + distY = offset.top; + } else { + distX = Math.floor(offset.left / this.layout.delta) * this.layout.delta; + + if (distX + this.layout.delta > this.container.scrollWidth) { + distX = this.container.scrollWidth - this.layout.delta; + } + } + + this.scrollTo(distX, distY); + }; + + DefaultViewManager.prototype.add = function(section){ + var view = this.createView(section); + + this.views.append(view); + + // view.on("shown", this.afterDisplayed.bind(this)); + view.onDisplayed = this.afterDisplayed.bind(this); + view.onResize = this.afterResized.bind(this); + + return view.display(this.request); + + }; + + DefaultViewManager.prototype.append = function(section){ + var view = this.createView(section); + this.views.append(view); + return view.display(this.request); + }; + + DefaultViewManager.prototype.prepend = function(section){ + var view = this.createView(section); + + this.views.prepend(view); + return view.display(this.request); + }; + // DefaultViewManager.prototype.resizeView = function(view) { + // + // if(this.settings.globalLayoutProperties.layout === "pre-paginated") { + // view.lock("both", this.bounds.width, this.bounds.height); + // } else { + // view.lock("width", this.bounds.width, this.bounds.height); + // } + // + // }; + + DefaultViewManager.prototype.next = function(){ + var next; + var view; + var left; + + if(!this.views.length) return; + + if(this.settings.axis === "horizontal") { + + this.scrollLeft = this.container.scrollLeft; + + left = this.container.scrollLeft + this.container.offsetWidth + this.layout.delta; + + if(left < this.container.scrollWidth) { + this.scrollBy(this.layout.delta, 0); + } else if (left - this.layout.columnWidth === this.container.scrollWidth) { + this.scrollTo(this.container.scrollWidth - this.layout.delta, 0); + } else { + next = this.views.last().section.next(); + } + + + } else { + + next = this.views.last().section.next(); + + } + + if(next) { + this.views.clear(); + + return this.append(next) + .then(function(){ + var right; + if (this.layout.name && this.layout.divisor > 1) { + right = next.next(); + if (right) { + return this.append(right); + } + } + }.bind(this)) + .then(function(){ + this.views.show(); }.bind(this)); - - }.bind(this)) - .catch(function(reason){ - console.error(reason); - }); - // }.bind(this)); -}; - -Rendition.prototype.replaceCss = function(href, urls, replacementUrls){ - var newUrl; - var indexInUrls; - - // Find the absolute url of the css file - var fileUri = URI(href); - var absolute = fileUri.absoluteTo(this.book.baseUrl).toString(); - // Get the text of the css file from the archive - var textResponse = this.book.unarchived.getText(absolute); - // Get asset links relative to css file - var relUrls = urls. - map(function(assetHref) { - var assetUri = URI(assetHref).absoluteTo(this.book.baseUrl); - var relative = assetUri.relativeTo(absolute).toString(); - return relative; - }.bind(this)); - - return textResponse.then(function (text) { - // Replacements in the css text - text = replace.substitute(text, relUrls, replacementUrls); - - // Get the new url - if (this.settings.useBase64) { - newUrl = core.createBase64Url(text, 'text/css'); + } + + + }; + + DefaultViewManager.prototype.prev = function(){ + var prev; + var view; + var left; + + if(!this.views.length) return; + + if(this.settings.axis === "horizontal") { + + this.scrollLeft = this.container.scrollLeft; + + left = this.container.scrollLeft; + + if(left > 0) { + this.scrollBy(-this.layout.delta, 0); } else { - newUrl = core.createBlobUrl(text, 'text/css'); + prev = this.views.first().section.prev(); } - - // switch the url in the replacementUrls - indexInUrls = urls.indexOf(href); - if (indexInUrls > -1) { - replacementUrls[indexInUrls] = newUrl; + + + } else { + + prev = this.views.first().section.prev(); + + } + + if(prev) { + this.views.clear(); + + return this.prepend(prev) + .then(function(){ + var left; + if (this.layout.name && this.layout.divisor > 1) { + left = prev.prev(); + if (left) { + return this.prepend(left); + } + } + }.bind(this)) + .then(function(){ + if(this.settings.axis === "horizontal") { + this.scrollTo(this.container.scrollWidth - this.layout.delta, 0); + } + this.views.show(); + }.bind(this)); + } + }; + + DefaultViewManager.prototype.current = function(){ + var visible = this.visible(); + if(visible.length){ + // Current is the last visible view + return visible[visible.length-1]; + } + return null; + }; + + DefaultViewManager.prototype.currentLocation = function(){ + var view; + var start, end; + + if(this.views.length) { + view = this.views.first(); + start = container.left - view.position().left; + end = start + this.layout.spread; + + return this.mapping.page(view, view.section.cfiBase); + } + + }; + + DefaultViewManager.prototype.isVisible = function(view, offsetPrev, offsetNext, _container){ + var position = view.position(); + var container = _container || this.bounds(); + + if(this.settings.axis === "horizontal" && + position.right > container.left - offsetPrev && + position.left < container.right + offsetNext) { + + return true; + + } else if(this.settings.axis === "vertical" && + position.bottom > container.top - offsetPrev && + position.top < container.bottom + offsetNext) { + + return true; + } + + return false; + + }; + + DefaultViewManager.prototype.visible = function(){ + // return this.views.displayed(); + var container = this.bounds(); + var views = this.views.displayed(); + var viewsLength = views.length; + var visible = []; + var isVisible; + var view; + + for (var i = 0; i < viewsLength; i++) { + view = views[i]; + isVisible = this.isVisible(view, 0, 0, container); + + if(isVisible === true) { + visible.push(view); } - - return new RSVP.Promise(function(resolve, reject){ - resolve(urls, replacementUrls); + + } + return visible; + }; + + DefaultViewManager.prototype.scrollBy = function(x, y, silent){ + if(silent) { + this.ignore = true; + } + + if(this.settings.height) { + + if(x) this.container.scrollLeft += x; + if(y) this.container.scrollTop += y; + + } else { + window.scrollBy(x,y); + } + // console.log("scrollBy", x, y); + this.scrolled = true; + this.onScroll(); + }; + + DefaultViewManager.prototype.scrollTo = function(x, y, silent){ + if(silent) { + this.ignore = true; + } + + if(this.settings.height) { + this.container.scrollLeft = x; + this.container.scrollTop = y; + } else { + window.scrollTo(x,y); + } + // console.log("scrollTo", x, y); + this.scrolled = true; + this.onScroll(); + // if(this.container.scrollLeft != x){ + // setTimeout(function() { + // this.scrollTo(x, y, silent); + // }.bind(this), 10); + // return; + // }; + }; + + DefaultViewManager.prototype.onScroll = function(){ + + }; + + DefaultViewManager.prototype.bounds = function() { + var bounds; + + bounds = this.stage.bounds(); + + return bounds; + }; + + DefaultViewManager.prototype.applyLayout = function(layout) { + + this.layout = layout; + this.updateLayout(); + + this.mapping = new Mapping(this.layout); + // this.manager.layout(this.layout.format); + }; + + DefaultViewManager.prototype.updateLayout = function() { + if (!this.stage) { + return; + } + + this._stageSize = this.stage.size(); + + if(this.settings.axis === "vertical") { + this.layout.calculate(this._stageSize.width, this._stageSize.height); + } else { + this.layout.calculate( + this._stageSize.width, + this._stageSize.height, + this.settings.gap + ); + + // Set the look ahead offset for what is visible + this.settings.offset = this.layout.delta; + + this.stage.addStyleRules("iframe", [{"margin-right" : this.layout.gap + "px"}]); + + } + + // Set the dimensions for views + this.viewSettings.width = this.layout.width; + this.viewSettings.height = this.layout.height; + + this.setLayout(this.layout); + + }; + + DefaultViewManager.prototype.setLayout = function(layout){ + + this.viewSettings.layout = layout; + + if(this.views) { + + this.views.each(function(view){ + view.setLayout(layout); }); - - }.bind(this)); - -}; - -Rendition.prototype.replaceAssets = function(section, urls, replacementUrls){ - var fileUri = URI(section.url); - // Get Urls relative to current sections - var relUrls = urls. - map(function(href) { - var assetUri = URI(href).absoluteTo(this.book.baseUrl); - var relative = assetUri.relativeTo(fileUri).toString(); - return relative; - }.bind(this)); - - - section.output = replace.substitute(section.output, relUrls, replacementUrls); -}; - -Rendition.prototype.range = function(_cfi, ignoreClass){ - var cfi = new EpubCFI(_cfi); - var found = this.visible().filter(function (view) { - if(cfi.spinePos === view.index) return true; - }); - - // Should only every return 1 item - if (found.length) { - return found[0].range(cfi, ignoreClass); - } -}; - -Rendition.prototype.adjustImages = function(view) { - - view.addStylesheetRules([ - ["img", - ["max-width", (view.layout.spreadWidth) + "px"], - ["max-height", (view.layout.height) + "px"] - ] - ]); - return new RSVP.Promise(function(resolve, reject){ - // Wait to apply - setTimeout(function() { - resolve(); - }, 1); - }); -}; - -//-- Enable binding events to Renderer -RSVP.EventTarget.mixin(Rendition.prototype); - -module.exports = Rendition; - -},{"./core":10,"./epubcfi":11,"./hook":12,"./layout":13,"./mapping":20,"./queue":23,"./replacements":25,"rsvp":5,"urijs":7}],25:[function(require,module,exports){ -var URI = require('urijs'); -var core = require('./core'); - -function base(doc, section){ - var base; - var head; - - if(!doc){ - return; - } - - // head = doc.querySelector("head"); - // base = head.querySelector("base"); - head = core.qs(doc, "head"); - base = core.qs(head, "base"); - - if(!base) { - base = doc.createElement("base"); - head.insertBefore(base, head.firstChild); - } - - base.setAttribute("href", section.url); -} - -function canonical(doc, section){ - var head; - var link; - var url = section.url; // window.location.origin + window.location.pathname + "?loc=" + encodeURIComponent(section.url); - - if(!doc){ - return; - } - - head = core.qs(doc, "head"); - link = core.qs(head, "link[rel='canonical']"); - - if (link) { - link.setAttribute("href", url); - } else { - link = doc.createElement("link"); - link.setAttribute("rel", "canonical"); - link.setAttribute("href", url); - head.appendChild(link); + + } + + }; + + DefaultViewManager.prototype.updateFlow = function(flow){ + var axis = (flow === "paginated") ? "horizontal" : "vertical"; + + this.settings.axis = axis; + + this.viewSettings.axis = axis; + + this.settings.overflow = (flow === "paginated") ? "hidden" : "auto"; + // this.views.each(function(view){ + // view.setAxis(axis); + // }); + + }; + + //-- Enable binding events to Manager + RSVP.EventTarget.mixin(DefaultViewManager.prototype); + + module.exports = DefaultViewManager; + + +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { + + var core = __webpack_require__(11); + + function Stage(_options) { + this.settings = _options || {}; + this.id = "epubjs-container-" + core.uuid(); + + this.container = this.create(this.settings); + + if(this.settings.hidden) { + this.wrapper = this.wrap(this.container); + } + } -} - -function links(view, renderer) { - - var links = view.document.querySelectorAll("a[href]"); - var replaceLinks = function(link){ - var href = link.getAttribute("href"); - - if(href.indexOf("mailto:") === 0){ + + /** + * Creates an element to render to. + * Resizes to passed width and height or to the elements size + */ + Stage.prototype.create = function(options){ + var height = options.height;// !== false ? options.height : "100%"; + var width = options.width;// !== false ? options.width : "100%"; + var overflow = options.overflow || false; + var axis = options.axis || "vertical"; + + if(options.height && core.isNumber(options.height)) { + height = options.height + "px"; + } + + if(options.width && core.isNumber(options.width)) { + width = options.width + "px"; + } + + // Create new container element + container = document.createElement("div"); + + container.id = this.id; + container.classList.add("epub-container"); + + // Style Element + // container.style.fontSize = "0"; + container.style.wordSpacing = "0"; + container.style.lineHeight = "0"; + container.style.verticalAlign = "top"; + + if(axis === "horizontal") { + container.style.whiteSpace = "nowrap"; + } + + if(width){ + container.style.width = width; + } + + if(height){ + container.style.height = height; + } + + if (overflow) { + container.style.overflow = overflow; + } + + return container; + }; + + Stage.wrap = function(container) { + var wrapper = document.createElement("div"); + + wrapper.style.visibility = "hidden"; + wrapper.style.overflow = "hidden"; + wrapper.style.width = "0"; + wrapper.style.height = "0"; + + wrapper.appendChild(container); + return wrapper; + }; + + + Stage.prototype.getElement = function(_element){ + var element; + + if(core.isElement(_element)) { + element = _element; + } else if (typeof _element === "string") { + element = document.getElementById(_element); + } + + if(!element){ + console.error("Not an Element"); return; } + + return element; + }; + + Stage.prototype.attachTo = function(what){ + + var element = this.getElement(what); + var base; + + if(!element){ + return; + } + + if(this.settings.hidden) { + base = this.wrapper; + } else { + base = this.container; + } + + element.appendChild(base); + + this.element = element; + + return element; + + }; + + Stage.prototype.getContainer = function() { + return this.container; + }; + + Stage.prototype.onResize = function(func){ + // Only listen to window for resize event if width and height are not fixed. + // This applies if it is set to a percent or auto. + if(!core.isNumber(this.settings.width) || + !core.isNumber(this.settings.height) ) { + window.addEventListener("resize", func, false); + } + + }; + + Stage.prototype.size = function(width, height){ + var bounds; + // var width = _width || this.settings.width; + // var height = _height || this.settings.height; + + // If width or height are set to false, inherit them from containing element + if(width === null) { + bounds = this.element.getBoundingClientRect(); + + if(bounds.width) { + width = bounds.width; + this.container.style.width = bounds.width + "px"; + } + } + + if(height === null) { + bounds = bounds || this.element.getBoundingClientRect(); + + if(bounds.height) { + height = bounds.height; + this.container.style.height = bounds.height + "px"; + } + + } + + if(!core.isNumber(width)) { + bounds = this.container.getBoundingClientRect(); + width = bounds.width; + //height = bounds.height; + } + + if(!core.isNumber(height)) { + bounds = bounds || this.container.getBoundingClientRect(); + //width = bounds.width; + height = bounds.height; + } + + + this.containerStyles = window.getComputedStyle(this.container); + + this.containerPadding = { + left: parseFloat(this.containerStyles["padding-left"]) || 0, + right: parseFloat(this.containerStyles["padding-right"]) || 0, + top: parseFloat(this.containerStyles["padding-top"]) || 0, + bottom: parseFloat(this.containerStyles["padding-bottom"]) || 0 + }; + + return { + width: width - + this.containerPadding.left - + this.containerPadding.right, + height: height - + this.containerPadding.top - + this.containerPadding.bottom + }; + + }; + + Stage.prototype.bounds = function(){ + + if(!this.container) { + return core.windowBounds(); + } else { + return this.container.getBoundingClientRect(); + } + + } + + Stage.prototype.getSheet = function(){ + var style = document.createElement("style"); + + // WebKit hack --> https://davidwalsh.name/add-rules-stylesheets + style.appendChild(document.createTextNode("")); + + document.head.appendChild(style); + + return style.sheet; + } + + Stage.prototype.addStyleRules = function(selector, rulesArray){ + var scope = "#" + this.id + " "; + var rules = ""; + + if(!this.sheet){ + this.sheet = this.getSheet(); + } + + rulesArray.forEach(function(set) { + for (var prop in set) { + if(set.hasOwnProperty(prop)) { + rules += prop + ":" + set[prop] + ";"; + } + } + }) + + this.sheet.insertRule(scope + selector + " {" + rules + "}", 0); + } + + + + module.exports = Stage; - var linkUri = URI(href); - var absolute = linkUri.absoluteTo(view.section.url); - var relative = absolute.relativeTo(this.book.baseUrl).toString(); - - if(linkUri.protocol()){ - link.setAttribute("target", "_blank"); +/***/ }, +/* 34 */ +/***/ function(module, exports) { - }else{ - /* - if(baseDirectory) { - // We must ensure that the file:// protocol is preserved for - // local file links, as in certain contexts (such as under - // Titanium), file links without the file:// protocol will not - // work - if (baseUri.protocol === "file") { - relative = core.resolveUrl(baseUri.base, href); - } else { - relative = core.resolveUrl(baseDirectory, href); - } + function Views(container) { + this.container = container; + this._views = []; + this.length = 0; + this.hidden = false; + }; + + Views.prototype.all = function() { + return this._views; + }; + + Views.prototype.first = function() { + return this._views[0]; + }; + + Views.prototype.last = function() { + return this._views[this._views.length-1]; + }; + + Views.prototype.indexOf = function(view) { + return this._views.indexOf(view); + }; + + Views.prototype.slice = function() { + return this._views.slice.apply(this._views, arguments); + }; + + Views.prototype.get = function(i) { + return this._views[i]; + }; + + Views.prototype.append = function(view){ + this._views.push(view); + if(this.container){ + this.container.appendChild(view.element); + } + this.length++; + return view; + }; + + Views.prototype.prepend = function(view){ + this._views.unshift(view); + if(this.container){ + this.container.insertBefore(view.element, this.container.firstChild); + } + this.length++; + return view; + }; + + Views.prototype.insert = function(view, index) { + this._views.splice(index, 0, view); + + if(this.container){ + if(index < this.container.children.length){ + this.container.insertBefore(view.element, this.container.children[index]); } else { - relative = href; + this.container.appendChild(view.element); } - */ - - if(linkUri.fragment()) { - // do nothing with fragment yet + } + + this.length++; + return view; + }; + + Views.prototype.remove = function(view) { + var index = this._views.indexOf(view); + + if(index > -1) { + this._views.splice(index, 1); + } + + + this.destroy(view); + + this.length--; + }; + + Views.prototype.destroy = function(view) { + view.off("resized"); + + if(view.displayed){ + view.destroy(); + } + + if(this.container){ + this.container.removeChild(view.element); + } + view = null; + }; + + // Iterators + + Views.prototype.each = function() { + return this._views.forEach.apply(this._views, arguments); + }; + + Views.prototype.clear = function(){ + // Remove all views + var view; + var len = this.length; + + if(!this.length) return; + + for (var i = 0; i < len; i++) { + view = this._views[i]; + this.destroy(view); + } + + this._views = []; + this.length = 0; + }; + + Views.prototype.find = function(section){ + + var view; + var len = this.length; + + for (var i = 0; i < len; i++) { + view = this._views[i]; + if(view.displayed && view.section.index == section.index) { + return view; + } + } + + }; + + Views.prototype.displayed = function(){ + var displayed = []; + var view; + var len = this.length; + + for (var i = 0; i < len; i++) { + view = this._views[i]; + if(view.displayed){ + displayed.push(view); + } + } + return displayed; + }; + + Views.prototype.show = function(){ + var view; + var len = this.length; + + for (var i = 0; i < len; i++) { + view = this._views[i]; + if(view.displayed){ + view.show(); + } + } + this.hidden = false; + }; + + Views.prototype.hide = function(){ + var view; + var len = this.length; + + for (var i = 0; i < len; i++) { + view = this._views[i]; + if(view.displayed){ + view.hide(); + } + } + this.hidden = true; + }; + + module.exports = Views; + + +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { + + var RSVP = __webpack_require__(2); + var core = __webpack_require__(11); + var DefaultViewManager = __webpack_require__(32); + + function ContinuousViewManager(options) { + + DefaultViewManager.apply(this, arguments); // call super constructor. + + this.name = "continuous"; + + this.settings = core.extend(this.settings || {}, { + infinite: true, + overflow: "auto", + axis: "vertical", + offset: 500, + offsetDelta: 250, + width: undefined, + height: undefined + }); + + core.extend(this.settings, options.settings || {}); + + // Gap can be 0, byt defaults doesn't handle that + if (options.settings.gap != "undefined" && options.settings.gap === 0) { + this.settings.gap = options.settings.gap; + } + + // this.viewSettings.axis = this.settings.axis; + this.viewSettings = { + ignoreClass: this.settings.ignoreClass, + axis: this.settings.axis, + layout: this.layout, + width: 0, + height: 0 + }; + + this.scrollTop = 0; + this.scrollLeft = 0; + }; + + // subclass extends superclass + ContinuousViewManager.prototype = Object.create(DefaultViewManager.prototype); + ContinuousViewManager.prototype.constructor = ContinuousViewManager; + + ContinuousViewManager.prototype.display = function(section, target){ + return DefaultViewManager.prototype.display.call(this, section, target) + .then(function () { + return this.fill(); + }.bind(this)); + }; + + ContinuousViewManager.prototype.fill = function(_full){ + var full = _full || new RSVP.defer(); + + this.check().then(function(result) { + if (result) { + this.fill(full); } else { - link.onclick = function(){ - renderer.display(relative); - return false; - }; + full.resolve(); } - + }.bind(this)); + + return full.promise; + } + + ContinuousViewManager.prototype.moveTo = function(offset){ + // var bounds = this.stage.bounds(); + // var dist = Math.floor(offset.top / bounds.height) * bounds.height; + var distX = 0, + distY = 0; + + var offsetX = 0, + offsetY = 0; + + if(this.settings.axis === "vertical") { + distY = offset.top; + offsetY = offset.top+this.settings.offset; + } else { + distX = Math.floor(offset.left / this.layout.delta) * this.layout.delta; + offsetX = distX+this.settings.offset; } - }.bind(this); - - for (var i = 0; i < links.length; i++) { - replaceLinks(links[i]); - } - - -}; - -function substitute(content, urls, replacements) { - urls.forEach(function(url, i){ - if (url && replacements[i]) { - content = content.replace(new RegExp(url, 'g'), replacements[i]); + + return this.check(offsetX, offsetY) + .then(function(){ + this.scrollBy(distX, distY); + }.bind(this)); + }; + + /* + ContinuousViewManager.prototype.afterDisplayed = function(currView){ + var next = currView.section.next(); + var prev = currView.section.prev(); + var index = this.views.indexOf(currView); + var prevView, nextView; + + if(index + 1 === this.views.length && next) { + nextView = this.createView(next); + this.q.enqueue(this.append.bind(this), nextView); } - }); - return content; -} -module.exports = { - 'base': base, - 'canonical' : canonical, - 'links': links, - 'substitute': substitute -}; - -},{"./core":10,"urijs":7}],26:[function(require,module,exports){ -var RSVP = require('rsvp'); -var URI = require('urijs'); -var core = require('./core'); - -function request(url, type, withCredentials, headers) { - var supportsURL = (typeof window != "undefined") ? window.URL : false; // TODO: fallback for url if window isn't defined - var BLOB_RESPONSE = supportsURL ? "blob" : "arraybuffer"; - var uri; - - var deferred = new RSVP.defer(); - - var xhr = new XMLHttpRequest(); - - //-- Check from PDF.js: - // https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js - var xhrPrototype = XMLHttpRequest.prototype; - - var header; - - if (!('overrideMimeType' in xhrPrototype)) { - // IE10 might have response, but not overrideMimeType - Object.defineProperty(xhrPrototype, 'overrideMimeType', { - value: function xmlHttpRequestOverrideMimeType(mimeType) {} + + if(index === 0 && prev) { + prevView = this.createView(prev, this.viewSettings); + this.q.enqueue(this.prepend.bind(this), prevView); + } + + // this.removeShownListeners(currView); + // currView.onShown = this.afterDisplayed.bind(this); + this.trigger("added", currView.section); + + }; + */ + + ContinuousViewManager.prototype.resize = function(width, height){ + + // Clear the queue + this.q.clear(); + + this._stageSize = this.stage.size(width, height); + this._bounds = this.bounds(); + + // Update for new views + this.viewSettings.width = this._stageSize.width; + this.viewSettings.height = this._stageSize.height; + + // Update for existing views + this.views.each(function(view) { + view.size(this._stageSize.width, this._stageSize.height); + }.bind(this)); + + this.updateLayout(); + + // if(this.location) { + // this.rendition.display(this.location.start); + // } + + this.trigger("resized", { + width: this.stage.width, + height: this.stage.height }); - } - if(withCredentials) { - xhr.withCredentials = true; - } - - xhr.onreadystatechange = handler; - xhr.onerror = err; - - xhr.open("GET", url, true); - - for(header in headers) { - xhr.setRequestHeader(header, headers[header]); - } - - if(type == "json") { - xhr.setRequestHeader("Accept", "application/json"); - } - - // If type isn't set, determine it from the file extension - if(!type) { - uri = URI(url); - type = uri.suffix(); - } - - if(type == 'blob'){ - xhr.responseType = BLOB_RESPONSE; - } - - - if(core.isXml(type)) { - // xhr.responseType = "document"; - xhr.overrideMimeType('text/xml'); // for OPF parsing - } - - if(type == 'xhtml') { - // xhr.responseType = "document"; - } - - if(type == 'html' || type == 'htm') { - // xhr.responseType = "document"; - } - - if(type == "binary") { - xhr.responseType = "arraybuffer"; - } - - xhr.send(); - - function err(e) { - console.error(e); - deferred.reject(e); - } - - function handler() { - if (this.readyState === XMLHttpRequest.DONE) { - - if (this.status === 200 || this.responseXML ) { //-- Firefox is reporting 0 for blob urls - var r; - - if (!this.response && !this.responseXML) { - deferred.reject({ - status: this.status, - message : "Empty Response", - stack : new Error().stack - }); - return deferred.promise; - } - - if (this.status === 403) { - deferred.reject({ - status: this.status, - response: this.response, - message : "Forbidden", - stack : new Error().stack - }); - return deferred.promise; - } - - if((this.responseType == '' || this.responseType == 'document') - && this.responseXML){ - r = this.responseXML; - } else - if(core.isXml(type)){ - // xhr.overrideMimeType('text/xml'); // for OPF parsing - // If this.responseXML wasn't set, try to parse using a DOMParser from text - r = core.parse(this.response, "text/xml"); - }else - if(type == 'xhtml'){ - r = core.parse(this.response, "application/xhtml+xml"); - }else - if(type == 'html' || type == 'htm'){ - r = core.parse(this.response, "text/html"); - }else - if(type == 'json'){ - r = JSON.parse(this.response); - }else - if(type == 'blob'){ - - if(supportsURL) { - r = this.response; - } else { - //-- Safari doesn't support responseType blob, so create a blob from arraybuffer - r = new Blob([this.response]); - } - - }else{ - r = this.response; + + }; + + ContinuousViewManager.prototype.onResized = function(e) { + + // this.views.clear(); + + clearTimeout(this.resizeTimeout); + this.resizeTimeout = setTimeout(function(){ + this.resize(); + }.bind(this), 150); + }; + + ContinuousViewManager.prototype.afterResized = function(view){ + this.trigger("resize", view.section); + }; + + // Remove Previous Listeners if present + ContinuousViewManager.prototype.removeShownListeners = function(view){ + + // view.off("shown", this.afterDisplayed); + // view.off("shown", this.afterDisplayedAbove); + view.onDisplayed = function(){}; + + }; + + + // ContinuousViewManager.prototype.append = function(section){ + // return this.q.enqueue(function() { + // + // this._append(section); + // + // + // }.bind(this)); + // }; + // + // ContinuousViewManager.prototype.prepend = function(section){ + // return this.q.enqueue(function() { + // + // this._prepend(section); + // + // }.bind(this)); + // + // }; + + ContinuousViewManager.prototype.append = function(section){ + var view = this.createView(section); + this.views.append(view); + return view; + }; + + ContinuousViewManager.prototype.prepend = function(section){ + var view = this.createView(section); + + view.on("resized", this.counter.bind(this)); + + this.views.prepend(view); + return view; + }; + + ContinuousViewManager.prototype.counter = function(bounds){ + + if(this.settings.axis === "vertical") { + this.scrollBy(0, bounds.heightDelta, true); + } else { + this.scrollBy(bounds.widthDelta, 0, true); + } + + }; + + ContinuousViewManager.prototype.update = function(_offset){ + var container = this.bounds(); + var views = this.views.all(); + var viewsLength = views.length; + var visible = []; + var offset = typeof _offset != "undefined" ? _offset : (this.settings.offset || 0); + var isVisible; + var view; + + var updating = new RSVP.defer(); + var promises = []; + + for (var i = 0; i < viewsLength; i++) { + view = views[i]; + + isVisible = this.isVisible(view, offset, offset, container); + + if(isVisible === true) { + if (!view.displayed) { + promises.push(view.display(this.request).then(function (view) { + view.show(); + })); } - - deferred.resolve(r); + visible.push(view); } else { - - deferred.reject({ - status: this.status, - message : this.response, - stack : new Error().stack - }); - + this.q.enqueue(view.destroy.bind(view)); + + clearTimeout(this.trimTimeout); + this.trimTimeout = setTimeout(function(){ + this.q.enqueue(this.trim.bind(this)); + }.bind(this), 250); } + } - } - - return deferred.promise; -}; - -module.exports = request; - -},{"./core":10,"rsvp":5,"urijs":7}],27:[function(require,module,exports){ -var RSVP = require('rsvp'); -var URI = require('urijs'); -var core = require('./core'); -var EpubCFI = require('./epubcfi'); -var Hook = require('./hook'); - -function Section(item, hooks){ - this.idref = item.idref; - this.linear = item.linear; - this.properties = item.properties; - this.index = item.index; - this.href = item.href; - this.url = item.url; - this.next = item.next; - this.prev = item.prev; - - this.cfiBase = item.cfiBase; - - if (hooks) { - this.hooks = hooks; + + if(promises.length){ + return RSVP.all(promises); } else { - this.hooks = {}; - this.hooks.serialize = new Hook(this); - this.hooks.content = new Hook(this); + updating.resolve(); + return updating.promise; } - -}; - - -Section.prototype.load = function(_request){ - var request = _request || this.request || require('./request'); - var loading = new RSVP.defer(); - var loaded = loading.promise; - - if(this.contents) { - loading.resolve(this.contents); - } else { - request(this.url) - .then(function(xml){ - var base; - var directory = URI(this.url).directory(); - - this.document = xml; - this.contents = xml.documentElement; - - return this.hooks.content.trigger(this.document, this); - }.bind(this)) - .then(function(){ - loading.resolve(this.contents); - }.bind(this)) - .catch(function(error){ - loading.reject(error); - }); - } - - return loaded; -}; - -Section.prototype.base = function(_document){ - var task = new RSVP.defer(); - var base = _document.createElement("base"); // TODO: check if exists - var head; - console.log(window.location.origin + "/" +this.url); - - base.setAttribute("href", window.location.origin + "/" +this.url); - - if(_document) { - head = _document.querySelector("head"); + + }; + + ContinuousViewManager.prototype.check = function(_offsetLeft, _offsetTop){ + var last, first, next, prev; + + var checking = new RSVP.defer(); + var newViews = []; + + var horizontal = (this.settings.axis === "horizontal"); + var delta = this.settings.offset || 0; + + if (_offsetLeft && horizontal) { + delta = _offsetLeft; } - if(head) { - head.insertBefore(base, head.firstChild); - task.resolve(); + + if (_offsetTop && !horizontal) { + delta = _offsetTop; + } + + var bounds = this._bounds; // bounds saved this until resize + + var offset = horizontal ? this.scrollLeft : this.scrollTop; + var visibleLength = horizontal ? bounds.width : bounds.height; + var contentLength = horizontal ? this.container.scrollWidth : this.container.scrollHeight; + + if (offset + visibleLength + delta >= contentLength) { + last = this.views.last(); + next = last && last.section.next(); + if(next) { + newViews.push(this.append(next)); + } + } + + if (offset - delta < 0 ) { + first = this.views.first(); + prev = first && first.section.prev(); + if(prev) { + newViews.push(this.prepend(prev)); + } + } + + if(newViews.length){ + // RSVP.all(promises) + // .then(function() { + // Check to see if anything new is on screen after rendering + return this.q.enqueue(function(){ + return this.update(delta); + }.bind(this)); + + + // }.bind(this)); + } else { - task.reject(new Error("No head to insert into")); + checking.resolve(false); + return checking.promise; } - - + + + }; + + ContinuousViewManager.prototype.trim = function(){ + var task = new RSVP.defer(); + var displayed = this.views.displayed(); + var first = displayed[0]; + var last = displayed[displayed.length-1]; + var firstIndex = this.views.indexOf(first); + var lastIndex = this.views.indexOf(last); + var above = this.views.slice(0, firstIndex); + var below = this.views.slice(lastIndex+1); + + // Erase all but last above + for (var i = 0; i < above.length-1; i++) { + this.erase(above[i], above); + } + + // Erase all except first below + for (var j = 1; j < below.length; j++) { + this.erase(below[j]); + } + + task.resolve(); return task.promise; -}; - -Section.prototype.beforeSectionLoad = function(){ - // Stub for a hook - replace me for now -}; - -Section.prototype.render = function(_request){ - var rendering = new RSVP.defer(); - var rendered = rendering.promise; - this.output; // TODO: better way to return this from hooks? - - this.load(_request). - then(function(contents){ - var serializer; - - if (typeof XMLSerializer === "undefined") { - XMLSerializer = require('xmldom').XMLSerializer; - } - serializer = new XMLSerializer(); - this.output = serializer.serializeToString(contents); - return this.output; - }.bind(this)). - then(function(){ - return this.hooks.serialize.trigger(this.output, this); - }.bind(this)). - then(function(){ - rendering.resolve(this.output); - }.bind(this)) - .catch(function(error){ - rendering.reject(error); - }); - - return rendered; -}; - -Section.prototype.find = function(_query){ - -}; - -/** -* Reconciles the current chapters layout properies with -* the global layout properities. -* Takes: global layout settings object, chapter properties string -* Returns: Object with layout properties -*/ -Section.prototype.reconcileLayoutSettings = function(global){ - //-- Get the global defaults - var settings = { - layout : global.layout, - spread : global.spread, - orientation : global.orientation }; - - //-- Get the chapter's display type - this.properties.forEach(function(prop){ - var rendition = prop.replace("rendition:", ''); - var split = rendition.indexOf("-"); - var property, value; - - if(split != -1){ - property = rendition.slice(0, split); - value = rendition.slice(split+1); - - settings[property] = value; + + ContinuousViewManager.prototype.erase = function(view, above){ //Trim + + var prevTop; + var prevLeft; + + if(this.settings.height) { + prevTop = this.container.scrollTop; + prevLeft = this.container.scrollLeft; + } else { + prevTop = window.scrollY; + prevLeft = window.scrollX; } - }); - return settings; -}; - -Section.prototype.cfiFromRange = function(_range) { - return new EpubCFI(_range, this.cfiBase).toString(); -}; - -Section.prototype.cfiFromElement = function(el) { - return new EpubCFI(el, this.cfiBase).toString(); -}; - -module.exports = Section; - -},{"./core":10,"./epubcfi":11,"./hook":12,"./request":26,"rsvp":5,"urijs":7,"xmldom":"xmldom"}],28:[function(require,module,exports){ -var RSVP = require('rsvp'); -var core = require('./core'); -var EpubCFI = require('./epubcfi'); -var Hook = require('./hook'); -var Section = require('./section'); -var replacements = require('./replacements'); - -function Spine(_request){ - this.request = _request; - this.spineItems = []; - this.spineByHref = {}; - this.spineById = {}; - - this.hooks = {}; - this.hooks.serialize = new Hook(); - this.hooks.content = new Hook(); - - // Register replacements - this.hooks.content.register(replacements.base); - this.hooks.content.register(replacements.canonical); - - this.epubcfi = new EpubCFI(); - - this.loaded = false; -}; - -Spine.prototype.load = function(_package) { - - this.items = _package.spine; - this.manifest = _package.manifest; - this.spineNodeIndex = _package.spineNodeIndex; - this.baseUrl = _package.baseUrl || ''; - this.length = this.items.length; - - this.items.forEach(function(item, index){ - var href, url; - var manifestItem = this.manifest[item.idref]; - var spineItem; - - item.cfiBase = this.epubcfi.generateChapterComponent(this.spineNodeIndex, item.index, item.idref); - - if(manifestItem) { - item.href = manifestItem.href; - item.url = this.baseUrl + item.href; - - if(manifestItem.properties.length){ - item.properties.push.apply(item.properties, manifestItem.properties); + + var bounds = view.bounds(); + + this.views.remove(view); + + if(above) { + + if(this.settings.axis === "vertical") { + this.scrollTo(0, prevTop - bounds.height, true); + } else { + this.scrollTo(prevLeft - bounds.width, 0, true); } } - - // if(index > 0) { - item.prev = function(){ return this.get(index-1); }.bind(this); - // } - - // if(index+1 < this.items.length) { - item.next = function(){ return this.get(index+1); }.bind(this); + + }; + + ContinuousViewManager.prototype.addEventListeners = function(stage){ + + window.addEventListener('unload', function(e){ + this.ignore = true; + // this.scrollTo(0,0); + this.destroy(); + }.bind(this)); + + this.addScrollListeners(); + }; + + ContinuousViewManager.prototype.addScrollListeners = function() { + var scroller; + + this.tick = core.requestAnimationFrame; + + if(this.settings.height) { + this.prevScrollTop = this.container.scrollTop; + this.prevScrollLeft = this.container.scrollLeft; + } else { + this.prevScrollTop = window.scrollY; + this.prevScrollLeft = window.scrollX; + } + + this.scrollDeltaVert = 0; + this.scrollDeltaHorz = 0; + + if(this.settings.height) { + scroller = this.container; + this.scrollTop = this.container.scrollTop; + this.scrollLeft = this.container.scrollLeft; + } else { + scroller = window; + this.scrollTop = window.scrollY; + this.scrollLeft = window.scrollX; + } + + scroller.addEventListener("scroll", this.onScroll.bind(this)); + + // this.tick.call(window, this.onScroll.bind(this)); + + this.scrolled = false; + + }; + + ContinuousViewManager.prototype.onScroll = function(){ + + // if(!this.ignore) { + + if(this.settings.height) { + scrollTop = this.container.scrollTop; + scrollLeft = this.container.scrollLeft; + } else { + scrollTop = window.scrollY; + scrollLeft = window.scrollX; + } + + this.scrollTop = scrollTop; + this.scrollLeft = scrollLeft; + + if(!this.ignore) { + + if((this.scrollDeltaVert === 0 && + this.scrollDeltaHorz === 0) || + this.scrollDeltaVert > this.settings.offsetDelta || + this.scrollDeltaHorz > this.settings.offsetDelta) { + + this.q.enqueue(function() { + this.check(); + }.bind(this)); + // this.check(); + + this.scrollDeltaVert = 0; + this.scrollDeltaHorz = 0; + + this.trigger("scroll", { + top: scrollTop, + left: scrollLeft + }); + + clearTimeout(this.afterScrolled); + this.afterScrolled = setTimeout(function () { + this.trigger("scrolled", { + top: this.scrollTop, + left: this.scrollLeft + }); + }.bind(this)); + + } + + } else { + this.ignore = false; + } + + this.scrollDeltaVert += Math.abs(scrollTop-this.prevScrollTop); + this.scrollDeltaHorz += Math.abs(scrollLeft-this.prevScrollLeft); + + this.prevScrollTop = scrollTop; + this.prevScrollLeft = scrollLeft; + + clearTimeout(this.scrollTimeout); + this.scrollTimeout = setTimeout(function(){ + this.scrollDeltaVert = 0; + this.scrollDeltaHorz = 0; + }.bind(this), 150); + + + this.scrolled = false; // } - - spineItem = new Section(item, this.hooks); - - this.append(spineItem); - - - }.bind(this)); - - this.loaded = true; -}; - -// book.spine.get(); -// book.spine.get(1); -// book.spine.get("chap1.html"); -// book.spine.get("#id1234"); -Spine.prototype.get = function(target) { - var index = 0; - - if(this.epubcfi.isCfiString(target)) { - cfi = new EpubCFI(target); - index = cfi.spinePos; - } else if(target && (typeof target === "number" || isNaN(target) === false)){ - index = target; - } else if(target && target.indexOf("#") === 0) { - index = this.spineById[target.substring(1)]; - } else if(target) { - // Remove fragments - target = target.split("#")[0]; - index = this.spineByHref[target]; - } - - return this.spineItems[index] || null; -}; - -Spine.prototype.append = function(section) { - var index = this.spineItems.length; - section.index = index; - - this.spineItems.push(section); - - this.spineByHref[section.href] = index; - this.spineById[section.idref] = index; - - return index; -}; - -Spine.prototype.prepend = function(section) { - var index = this.spineItems.unshift(section); - this.spineByHref[section.href] = 0; - this.spineById[section.idref] = 0; - - // Re-index - this.spineItems.forEach(function(item, index){ - item.index = index; - }); - - return 0; -}; - -Spine.prototype.insert = function(section, index) { - -}; - -Spine.prototype.remove = function(section) { - var index = this.spineItems.indexOf(section); - - if(index > -1) { - delete this.spineByHref[section.href]; - delete this.spineById[section.idref]; - - return this.spineItems.splice(index, 1); - } -}; - -Spine.prototype.each = function() { - return this.spineItems.forEach.apply(this.spineItems, arguments); -}; - -module.exports = Spine; - -},{"./core":10,"./epubcfi":11,"./hook":12,"./replacements":25,"./section":27,"rsvp":5}],29:[function(require,module,exports){ -var RSVP = require('rsvp'); -var URI = require('urijs'); -var core = require('./core'); -var request = require('./request'); -var mime = require('../libs/mime/mime'); - -function Unarchive() { - - this.checkRequirements(); - this.urlCache = {}; - -} - -Unarchive.prototype.checkRequirements = function(callback){ - try { - if (typeof JSZip !== 'undefined') { - this.zip = new JSZip(); + + // this.tick.call(window, this.onScroll.bind(this)); + + }; + + + // ContinuousViewManager.prototype.resizeView = function(view) { + // + // if(this.settings.axis === "horizontal") { + // view.lock("height", this.stage.width, this.stage.height); + // } else { + // view.lock("width", this.stage.width, this.stage.height); + // } + // + // }; + + ContinuousViewManager.prototype.currentLocation = function(){ + + if (this.settings.axis === "vertical") { + this.location = this.scrolledLocation(); } else { - JSZip = require('jszip'); - this.zip = new JSZip(); + this.location = this.paginatedLocation(); } - } catch (e) { - console.error("JSZip lib not loaded"); - } -}; - -Unarchive.prototype.open = function(zipUrl, isBase64){ - if (zipUrl instanceof ArrayBuffer || isBase64) { - return this.zip.loadAsync(zipUrl, {"base64": isBase64}); - } else { - return request(zipUrl, "binary") - .then(function(data){ - return this.zip.loadAsync(data); - }.bind(this)); - } -}; - -Unarchive.prototype.request = function(url, type){ - var deferred = new RSVP.defer(); - var response; - var r; - - // If type isn't set, determine it from the file extension - if(!type) { - uri = URI(url); - type = uri.suffix(); - } - - if(type == 'blob'){ - response = this.getBlob(url); - } else { - response = this.getText(url); - } - - if (response) { - response.then(function (r) { - result = this.handleResponse(r, type); - deferred.resolve(result); - }.bind(this)); - } else { - deferred.reject({ - message : "File not found in the epub: " + url, - stack : new Error().stack - }); - } - return deferred.promise; -}; - -Unarchive.prototype.handleResponse = function(response, type){ - var r; - - if(type == "json") { - r = JSON.parse(response); - } - else - if(core.isXml(type)) { - r = core.parse(response, "text/xml"); - } - else - if(type == 'xhtml') { - r = core.parse(response, "application/xhtml+xml"); - } - else - if(type == 'html' || type == 'htm') { - r = core.parse(response, "text/html"); - } else { - r = response; - } - - return r; -}; - -Unarchive.prototype.getBlob = function(url, _mimeType){ - var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash - var entry = this.zip.file(decodededUrl); - var mimeType; - - if(entry) { - mimeType = _mimeType || mime.lookup(entry.name); - return entry.async("uint8array").then(function(uint8array) { - return new Blob([uint8array], {type : mimeType}); - }); - } -}; - -Unarchive.prototype.getText = function(url, encoding){ - var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash - var entry = this.zip.file(decodededUrl); - - if(entry) { - return entry.async("string").then(function(text) { - return text; - }); - } -}; - -Unarchive.prototype.getBase64 = function(url, _mimeType){ - var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash - var entry = this.zip.file(decodededUrl); - var mimeType; - - if(entry) { - mimeType = _mimeType || mime.lookup(entry.name); - return entry.async("base64").then(function(data) { - return "data:" + mimeType + ";base64," + data; - }); - } -}; - -Unarchive.prototype.createUrl = function(url, options){ - var deferred = new RSVP.defer(); - var _URL = window.URL || window.webkitURL || window.mozURL; - var tempUrl; - var blob; - var response; - var useBase64 = options && options.base64; - - if(url in this.urlCache) { - deferred.resolve(this.urlCache[url]); - return deferred.promise; - } - - if (useBase64) { - response = this.getBase64(url); - - if (response) { - response.then(function(tempUrl) { - - this.urlCache[url] = tempUrl; - deferred.resolve(tempUrl); - - }.bind(this)); - + + return this.location; + }; + + ContinuousViewManager.prototype.scrolledLocation = function(){ + + var visible = this.visible(); + var startPage, endPage; + + var container = this.container.getBoundingClientRect(); + + if(visible.length === 1) { + return this.mapping.page(visible[0].contents, visible[0].section.cfiBase); } - - } else { - - response = this.getBlob(url); - - if (response) { - response.then(function(blob) { - - tempUrl = _URL.createObjectURL(blob); - this.urlCache[url] = tempUrl; - deferred.resolve(tempUrl); - - }.bind(this)); - + + if(visible.length > 1) { + + startPage = this.mapping.page(visible[0].contents, visible[0].section.cfiBase); + endPage = this.mapping.page(visible[visible.length-1].contents, visible[visible.length-1].section.cfiBase); + + return { + start: startPage.start, + end: endPage.end + }; } - } - - - if (!response) { - deferred.reject({ - message : "File not found in the epub: " + url, - stack : new Error().stack - }); - } - - return deferred.promise; -}; - -Unarchive.prototype.revokeUrl = function(url){ - var _URL = window.URL || window.webkitURL || window.mozURL; - var fromCache = this.urlCache[url]; - if(fromCache) _URL.revokeObjectURL(fromCache); -}; - -module.exports = Unarchive; - -},{"../libs/mime/mime":1,"./core":10,"./request":26,"jszip":"jszip","rsvp":5,"urijs":7}],"epub":[function(require,module,exports){ -var Book = require('./book'); -var EpubCFI = require('./epubcfi'); -var Rendition = require('./rendition'); -var Contents = require('./contents'); -var RSVP = require('rsvp'); - -function ePub(_url) { - return new Book(_url); -}; - -ePub.VERSION = "0.3.0"; - -ePub.CFI = EpubCFI; -ePub.Rendition = Rendition; -ePub.Contents = Contents; -ePub.RSVP = RSVP; - -ePub.ViewManagers = {}; -ePub.Views = {}; -ePub.register = { - manager : function(name, manager){ - return ePub.ViewManagers[name] = manager; - }, - view : function(name, view){ - return ePub.Views[name] = view; - } -}; - -// Default Views -ePub.register.view("iframe", require('./managers/views/iframe')); -// ePub.register.view("inline", require('./managers/views/inline')); - -// Default View Managers -ePub.register.manager("single", require('./managers/default')); -ePub.register.manager("continuous", require('./managers/continuous')); + + }; + + ContinuousViewManager.prototype.paginatedLocation = function(){ + var visible = this.visible(); + var startA, startB, endA, endB; + var pageLeft, pageRight; + var container = this.container.getBoundingClientRect(); + + if(visible.length === 1) { + startA = container.left - visible[0].position().left; + endA = startA + this.layout.spreadWidth; + + return this.mapping.page(visible[0].contents, visible[0].section.cfiBase, startA, endA); + } + + if(visible.length > 1) { + + // Left Col + startA = container.left - visible[0].position().left; + endA = startA + this.layout.columnWidth; + + // Right Col + startB = container.left + this.layout.spreadWidth - visible[visible.length-1].position().left; + endB = startB + this.layout.columnWidth; + + pageLeft = this.mapping.page(visible[0].contents, visible[0].section.cfiBase, startA, endA); + pageRight = this.mapping.page(visible[visible.length-1].contents, visible[visible.length-1].section.cfiBase, startB, endB); + + return { + start: pageLeft.start, + end: pageRight.end + }; + } + }; + + /* + Continuous.prototype.current = function(what){ + var view, top; + var container = this.container.getBoundingClientRect(); + var length = this.views.length - 1; + + if(this.settings.axis === "horizontal") { + + for (var i = length; i >= 0; i--) { + view = this.views[i]; + left = view.position().left; + + if(left < container.right) { + + if(this._current == view) { + break; + } + + this._current = view; + break; + } + } + + } else { + + for (var i = length; i >= 0; i--) { + view = this.views[i]; + top = view.bounds().top; + if(top < container.bottom) { + + if(this._current == view) { + break; + } + + this._current = view; + + break; + } + } + + } + + return this._current; + }; + */ + + ContinuousViewManager.prototype.updateLayout = function() { + + if (!this.stage) { + return; + } + + if(this.settings.axis === "vertical") { + this.layout.calculate(this._stageSize.width, this._stageSize.height); + } else { + this.layout.calculate( + this._stageSize.width, + this._stageSize.height, + this.settings.gap + ); + + // Set the look ahead offset for what is visible + this.settings.offset = this.layout.delta; + + this.stage.addStyleRules("iframe", [{"margin-right" : this.layout.gap + "px"}]); + + } + + // Set the dimensions for views + this.viewSettings.width = this.layout.width; + this.viewSettings.height = this.layout.height; + + this.setLayout(this.layout); + + }; + + ContinuousViewManager.prototype.next = function(){ + + if(this.settings.axis === "horizontal") { + + this.scrollLeft = this.container.scrollLeft; + + if(this.container.scrollLeft + + this.container.offsetWidth + + this.layout.delta < this.container.scrollWidth) { + this.scrollBy(this.layout.delta, 0); + } else { + this.scrollTo(this.container.scrollWidth - this.layout.delta, 0); + } + + } else { + this.scrollBy(0, this.layout.height); + } + }; + + ContinuousViewManager.prototype.prev = function(){ + if(this.settings.axis === "horizontal") { + this.scrollBy(-this.layout.delta, 0); + } else { + this.scrollBy(0, -this.layout.height); + } + }; + + ContinuousViewManager.prototype.updateFlow = function(flow){ + var axis = (flow === "paginated") ? "horizontal" : "vertical"; + + this.settings.axis = axis; + + this.viewSettings.axis = axis; + + this.settings.overflow = (flow === "paginated") ? "hidden" : "auto"; + + // this.views.each(function(view){ + // view.setAxis(axis); + // }); + + if (this.settings.axis === "vertical") { + this.settings.infinite = true; + } else { + this.settings.infinite = false; + } + + }; + module.exports = ContinuousViewManager; -module.exports = ePub; -},{"./book":8,"./contents":9,"./epubcfi":11,"./managers/continuous":15,"./managers/default":16,"./managers/views/iframe":19,"./rendition":24,"rsvp":5}]},{},["epub"])("epub") +/***/ } +/******/ ]) }); - - -//# sourceMappingURL=epub.js.map +; +//# sourceMappingURL=epub.js.map \ No newline at end of file diff --git a/dist/epub.js.map b/dist/epub.js.map index d809a1e29..5f3623b0f 100644 --- a/dist/epub.js.map +++ b/dist/epub.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/browser-pack/_prelude.js","libs/mime/mime.js","node_modules/base64-js/index.js","node_modules/browserify/lib/_empty.js","node_modules/process/browser.js","node_modules/rsvp/dist/rsvp.js","node_modules/urijs/src/SecondLevelDomains.js","node_modules/urijs/src/URI.js","src/book.js","src/contents.js","src/core.js","src/epubcfi.js","src/hook.js","src/layout.js","src/locations.js","src/managers/continuous/index.js","src/managers/default/index.js","src/managers/helpers/stage.js","src/managers/helpers/views.js","src/managers/views/iframe.js","src/mapping.js","src/navigation.js","src/parser.js","src/queue.js","src/rendition.js","src/replacements.js","src/request.js","src/section.js","src/spine.js","src/unarchive.js","src/epub.js"],"names":[],"mappings":"AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClHA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACh8EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClqEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5hBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC16BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/hBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9jBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3eA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"epub.js","sourceRoot":"/source/","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // the number of equal signs (place holders)\n // if there are two placeholders, than the two characters before it\n // represent one byte\n // if there is only one, then the three characters before it represent 2 bytes\n // this is just a cheap hack to not do indexOf twice\n return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0\n}\n\nfunction byteLength (b64) {\n // base64 is 4/3 + up to two characters of the original data\n return b64.length * 3 / 4 - placeHoldersCount(b64)\n}\n\nfunction toByteArray (b64) {\n var i, j, l, tmp, placeHolders, arr\n var len = b64.length\n placeHolders = placeHoldersCount(b64)\n\n arr = new Arr(len * 3 / 4 - placeHolders)\n\n // if there are placeholders, only get up to the last complete 4 chars\n l = placeHolders > 0 ? len - 4 : len\n\n var L = 0\n\n for (i = 0, j = 0; i < l; i += 4, j += 3) {\n tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]\n arr[L++] = (tmp >> 16) & 0xFF\n arr[L++] = (tmp >> 8) & 0xFF\n arr[L++] = tmp & 0xFF\n }\n\n if (placeHolders === 2) {\n tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[L++] = tmp & 0xFF\n } else if (placeHolders === 1) {\n tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[L++] = (tmp >> 8) & 0xFF\n arr[L++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var output = ''\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n output += lookup[tmp >> 2]\n output += lookup[(tmp << 4) & 0x3F]\n output += '=='\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + (uint8[len - 1])\n output += lookup[tmp >> 10]\n output += lookup[(tmp >> 4) & 0x3F]\n output += lookup[(tmp << 2) & 0x3F]\n output += '='\n }\n\n parts.push(output)\n\n return parts.join('')\n}\n","","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/*!\n * @overview RSVP - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE\n * @version 3.3.2\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (factory((global.RSVP = global.RSVP || {})));\n}(this, (function (exports) { 'use strict';\n\nfunction indexOf(callbacks, callback) {\n for (var i = 0, l = callbacks.length; i < l; i++) {\n if (callbacks[i] === callback) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction callbacksFor(object) {\n var callbacks = object._promiseCallbacks;\n\n if (!callbacks) {\n callbacks = object._promiseCallbacks = {};\n }\n\n return callbacks;\n}\n\n/**\n @class RSVP.EventTarget\n*/\nvar EventTarget = {\n\n /**\n `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For\n Example:\n ```javascript\n let object = {};\n RSVP.EventTarget.mixin(object);\n object.on('finished', function(event) {\n // handle event\n });\n object.trigger('finished', { detail: value });\n ```\n `EventTarget.mixin` also works with prototypes:\n ```javascript\n let Person = function() {};\n RSVP.EventTarget.mixin(Person.prototype);\n let yehuda = new Person();\n let tom = new Person();\n yehuda.on('poke', function(event) {\n console.log('Yehuda says OW');\n });\n tom.on('poke', function(event) {\n console.log('Tom says OW');\n });\n yehuda.trigger('poke');\n tom.trigger('poke');\n ```\n @method mixin\n @for RSVP.EventTarget\n @private\n @param {Object} object object to extend with EventTarget methods\n */\n mixin: function mixin(object) {\n object['on'] = this['on'];\n object['off'] = this['off'];\n object['trigger'] = this['trigger'];\n object._promiseCallbacks = undefined;\n return object;\n },\n\n /**\n Registers a callback to be executed when `eventName` is triggered\n ```javascript\n object.on('event', function(eventInfo){\n // handle the event\n });\n object.trigger('event');\n ```\n @method on\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to listen for\n @param {Function} callback function to be called when the event is triggered.\n */\n on: function on(eventName, callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n var allCallbacks = callbacksFor(this),\n callbacks = undefined;\n\n callbacks = allCallbacks[eventName];\n\n if (!callbacks) {\n callbacks = allCallbacks[eventName] = [];\n }\n\n if (indexOf(callbacks, callback) === -1) {\n callbacks.push(callback);\n }\n },\n\n /**\n You can use `off` to stop firing a particular callback for an event:\n ```javascript\n function doStuff() { // do stuff! }\n object.on('stuff', doStuff);\n object.trigger('stuff'); // doStuff will be called\n // Unregister ONLY the doStuff callback\n object.off('stuff', doStuff);\n object.trigger('stuff'); // doStuff will NOT be called\n ```\n If you don't pass a `callback` argument to `off`, ALL callbacks for the\n event will not be executed when the event fires. For example:\n ```javascript\n let callback1 = function(){};\n let callback2 = function(){};\n object.on('stuff', callback1);\n object.on('stuff', callback2);\n object.trigger('stuff'); // callback1 and callback2 will be executed.\n object.off('stuff');\n object.trigger('stuff'); // callback1 and callback2 will not be executed!\n ```\n @method off\n @for RSVP.EventTarget\n @private\n @param {String} eventName event to stop listening to\n @param {Function} callback optional argument. If given, only the function\n given will be removed from the event's callback queue. If no `callback`\n argument is given, all callbacks will be removed from the event's callback\n queue.\n */\n off: function off(eventName, callback) {\n var allCallbacks = callbacksFor(this),\n callbacks = undefined,\n index = undefined;\n\n if (!callback) {\n allCallbacks[eventName] = [];\n return;\n }\n\n callbacks = allCallbacks[eventName];\n\n index = indexOf(callbacks, callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n },\n\n /**\n Use `trigger` to fire custom events. For example:\n ```javascript\n object.on('foo', function(){\n console.log('foo event happened!');\n });\n object.trigger('foo');\n // 'foo event happened!' logged to the console\n ```\n You can also pass a value as a second argument to `trigger` that will be\n passed as an argument to all event listeners for the event:\n ```javascript\n object.on('foo', function(value){\n console.log(value.name);\n });\n object.trigger('foo', { name: 'bar' });\n // 'bar' logged to the console\n ```\n @method trigger\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to be triggered\n @param {*} options optional value to be passed to any event handlers for\n the given `eventName`\n */\n trigger: function trigger(eventName, options, label) {\n var allCallbacks = callbacksFor(this),\n callbacks = undefined,\n callback = undefined;\n\n if (callbacks = allCallbacks[eventName]) {\n // Don't cache the callbacks.length since it may grow\n for (var i = 0; i < callbacks.length; i++) {\n callback = callbacks[i];\n\n callback(options, label);\n }\n }\n }\n};\n\nvar config = {\n instrument: false\n};\n\nEventTarget['mixin'](config);\n\nfunction configure(name, value) {\n if (name === 'onerror') {\n // handle for legacy users that expect the actual\n // error to be passed to their function added via\n // `RSVP.configure('onerror', someFunctionHere);`\n config['on']('error', value);\n return;\n }\n\n if (arguments.length === 2) {\n config[name] = value;\n } else {\n return config[name];\n }\n}\n\nfunction objectOrFunction(x) {\n return typeof x === 'function' || typeof x === 'object' && x !== null;\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\nfunction isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n}\n\nvar _isArray = undefined;\nif (!Array.isArray) {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n} else {\n _isArray = Array.isArray;\n}\n\nvar isArray = _isArray;\n\n// Date.now is not available in browsers < IE9\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility\nvar now = Date.now || function () {\n return new Date().getTime();\n};\n\nfunction F() {}\n\nvar o_create = Object.create || function (o) {\n if (arguments.length > 1) {\n throw new Error('Second argument not supported');\n }\n if (typeof o !== 'object') {\n throw new TypeError('Argument must be an object');\n }\n F.prototype = o;\n return new F();\n};\n\nvar queue = [];\n\nfunction scheduleFlush() {\n setTimeout(function () {\n for (var i = 0; i < queue.length; i++) {\n var entry = queue[i];\n\n var payload = entry.payload;\n\n payload.guid = payload.key + payload.id;\n payload.childGuid = payload.key + payload.childId;\n if (payload.error) {\n payload.stack = payload.error.stack;\n }\n\n config['trigger'](entry.name, entry.payload);\n }\n queue.length = 0;\n }, 50);\n}\nfunction instrument(eventName, promise, child) {\n if (1 === queue.push({\n name: eventName,\n payload: {\n key: promise._guidKey,\n id: promise._id,\n eventName: eventName,\n detail: promise._result,\n childId: child && child._id,\n label: promise._label,\n timeStamp: now(),\n error: config[\"instrument-with-stack\"] ? new Error(promise._label) : null\n } })) {\n scheduleFlush();\n }\n}\n\n/**\n `RSVP.Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = RSVP.Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {*} object value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop, label);\n resolve(promise, object);\n return promise;\n}\n\nfunction withOwnPromise() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n try {\n then.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n config.async(function (promise) {\n var sealed = false;\n var error = tryThen(then, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value, undefined);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n thenable._onError = null;\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n if (thenable !== value) {\n resolve(promise, value, undefined);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$) {\n if (maybeThenable.constructor === promise.constructor && then$$ === then && promise.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$ === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n } else if (then$$ === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$)) {\n handleForeignThenable(promise, maybeThenable, then$$);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n fulfill(promise, value);\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onError) {\n promise._onError(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length === 0) {\n if (config.instrument) {\n instrument('fulfilled', promise);\n }\n } else {\n config.async(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n config.async(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var subscribers = parent._subscribers;\n var length = subscribers.length;\n\n parent._onError = null;\n\n subscribers[length] = child;\n subscribers[length + FULFILLED] = onFulfillment;\n subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n config.async(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (config.instrument) {\n instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);\n }\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = undefined,\n callback = undefined,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = undefined,\n error = undefined,\n succeeded = undefined,\n failed = undefined;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, withOwnPromise());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n var resolved = false;\n try {\n resolver(function (value) {\n if (resolved) {\n return;\n }\n resolved = true;\n resolve(promise, value);\n }, function (reason) {\n if (resolved) {\n return;\n }\n resolved = true;\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nfunction then(onFulfillment, onRejection, label) {\n var _arguments = arguments;\n\n var parent = this;\n var state = parent._state;\n\n if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) {\n config.instrument && instrument('chained', parent, parent);\n return parent;\n }\n\n parent._onError = null;\n\n var child = new parent.constructor(noop, label);\n var result = parent._result;\n\n config.instrument && instrument('chained', parent, child);\n\n if (state) {\n (function () {\n var callback = _arguments[state - 1];\n config.async(function () {\n return invokeCallback(state, child, callback, result);\n });\n })();\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\nfunction makeSettledResult(state, position, value) {\n if (state === FULFILLED) {\n return {\n state: 'fulfilled',\n value: value\n };\n } else {\n return {\n state: 'rejected',\n reason: value\n };\n }\n}\n\nfunction Enumerator(Constructor, input, abortOnReject, label) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop, label);\n this._abortOnReject = abortOnReject;\n\n if (this._validateInput(input)) {\n this._input = input;\n this.length = input.length;\n this._remaining = input.length;\n\n this._init();\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate();\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, this._validationError());\n }\n}\n\nEnumerator.prototype._validateInput = function (input) {\n return isArray(input);\n};\n\nEnumerator.prototype._validationError = function () {\n return new Error('Array Methods must be provided an Array');\n};\n\nEnumerator.prototype._init = function () {\n this._result = new Array(this.length);\n};\n\nEnumerator.prototype._enumerate = function () {\n var length = this.length;\n var promise = this.promise;\n var input = this._input;\n\n for (var i = 0; promise._state === PENDING && i < length; i++) {\n this._eachEntry(input[i], i);\n }\n};\n\nEnumerator.prototype._settleMaybeThenable = function (entry, i) {\n var c = this._instanceConstructor;\n var resolve = c.resolve;\n\n if (resolve === resolve$1) {\n var then$$ = getThen(entry);\n\n if (then$$ === then && entry._state !== PENDING) {\n entry._onError = null;\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof then$$ !== 'function') {\n this._remaining--;\n this._result[i] = this._makeResult(FULFILLED, i, entry);\n } else if (c === Promise) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, then$$);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve) {\n return resolve(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve(entry), i);\n }\n};\n\nEnumerator.prototype._eachEntry = function (entry, i) {\n if (isMaybeThenable(entry)) {\n this._settleMaybeThenable(entry, i);\n } else {\n this._remaining--;\n this._result[i] = this._makeResult(FULFILLED, i, entry);\n }\n};\n\nEnumerator.prototype._settledAt = function (state, i, value) {\n var promise = this.promise;\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (this._abortOnReject && state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = this._makeResult(state, i, value);\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n};\n\nEnumerator.prototype._makeResult = function (state, i, value) {\n return value;\n};\n\nEnumerator.prototype._willSettleAt = function (promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n};\n\n/**\n `RSVP.Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n RSVP.Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `RSVP.all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error(\"2\"));\n let promise3 = RSVP.reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n RSVP.Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries, label) {\n return new Enumerator(this, entries, true, /* abort on reject */label).promise;\n}\n\n/**\n `RSVP.Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `RSVP.Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n RSVP.Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} entries array of promises to observe\n @param {String} label optional string for describing the promise returned.\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(noop, label);\n\n if (!isArray(entries)) {\n reject(promise, new TypeError('You must pass an array to race.'));\n return promise;\n }\n\n for (var i = 0; promise._state === PENDING && i < entries.length; i++) {\n subscribe(Constructor.resolve(entries[i]), undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n\n return promise;\n}\n\n/**\n `RSVP.Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = RSVP.Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason, label) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop, label);\n reject(promise, reason);\n return promise;\n}\n\nvar guidKey = 'rsvp_' + now() + '-';\nvar counter = 0;\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class RSVP.Promise\n @param {function} resolver\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @constructor\n*/\nfunction Promise(resolver, label) {\n this._id = counter++;\n this._label = label;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n config.instrument && instrument('created', this);\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n}\n\nPromise.cast = resolve$1; // deprecated\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = resolve$1;\nPromise.reject = reject$1;\n\nPromise.prototype = {\n constructor: Promise,\n\n _guidKey: guidKey,\n\n _onError: function _onError(reason) {\n var promise = this;\n config.after(function () {\n if (promise._onError) {\n config['trigger']('error', reason, promise._label);\n }\n });\n },\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n \n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n \n Chaining\n --------\n \n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n \n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n \n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we\\'re unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we\\'re unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n \n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n \n Assimilation\n ------------\n \n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n \n If the assimliated promise rejects, then the downstream promise will also reject.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n \n Simple Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let result;\n \n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n \n Advanced Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let author, books;\n \n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n \n function foundBooks(books) {\n \n }\n \n function failure(reason) {\n \n }\n \n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n \n @method then\n @param {Function} onFulfillment\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n then: then,\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n \n ```js\n function findAuthor(){\n throw new Error('couldn\\'t find that author');\n }\n \n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n \n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n \n @method catch\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function _catch(onRejection, label) {\n return this.then(undefined, onRejection, label);\n },\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'finally': function _finally(callback, label) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n }, label);\n }\n};\n\nfunction Result() {\n this.value = undefined;\n}\n\nvar ERROR = new Result();\nvar GET_THEN_ERROR$1 = new Result();\n\nfunction getThen$1(obj) {\n try {\n return obj.then;\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n}\n\nfunction tryApply(f, s, a) {\n try {\n f.apply(s, a);\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n}\n\nfunction makeObject(_, argumentNames) {\n var obj = {};\n var length = _.length;\n var args = new Array(length);\n\n for (var x = 0; x < length; x++) {\n args[x] = _[x];\n }\n\n for (var i = 0; i < argumentNames.length; i++) {\n var _name = argumentNames[i];\n obj[_name] = args[i + 1];\n }\n\n return obj;\n}\n\nfunction arrayResult(_) {\n var length = _.length;\n var args = new Array(length - 1);\n\n for (var i = 1; i < length; i++) {\n args[i - 1] = _[i];\n }\n\n return args;\n}\n\nfunction wrapThenable(_then, promise) {\n return {\n then: function then(onFulFillment, onRejection) {\n return _then.call(promise, onFulFillment, onRejection);\n }\n };\n}\n\n/**\n `RSVP.denodeify` takes a 'node-style' function and returns a function that\n will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the\n browser when you'd prefer to use promises over using callbacks. For example,\n `denodeify` transforms the following:\n\n ```javascript\n let fs = require('fs');\n\n fs.readFile('myfile.txt', function(err, data){\n if (err) return handleError(err);\n handleData(data);\n });\n ```\n\n into:\n\n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n\n readFile('myfile.txt').then(handleData, handleError);\n ```\n\n If the node function has multiple success parameters, then `denodeify`\n just returns the first one:\n\n ```javascript\n let request = RSVP.denodeify(require('request'));\n\n request('http://example.com').then(function(res) {\n // ...\n });\n ```\n\n However, if you need all success parameters, setting `denodeify`'s\n second parameter to `true` causes it to return all success parameters\n as an array:\n\n ```javascript\n let request = RSVP.denodeify(require('request'), true);\n\n request('http://example.com').then(function(result) {\n // result[0] -> res\n // result[1] -> body\n });\n ```\n\n Or if you pass it an array with names it returns the parameters as a hash:\n\n ```javascript\n let request = RSVP.denodeify(require('request'), ['res', 'body']);\n\n request('http://example.com').then(function(result) {\n // result.res\n // result.body\n });\n ```\n\n Sometimes you need to retain the `this`:\n\n ```javascript\n let app = require('express')();\n let render = RSVP.denodeify(app.render.bind(app));\n ```\n\n The denodified function inherits from the original function. It works in all\n environments, except IE 10 and below. Consequently all properties of the original\n function are available to you. However, any properties you change on the\n denodeified function won't be changed on the original function. Example:\n\n ```javascript\n let request = RSVP.denodeify(require('request')),\n cookieJar = request.jar(); // <- Inheritance is used here\n\n request('http://example.com', {jar: cookieJar}).then(function(res) {\n // cookieJar.cookies holds now the cookies returned by example.com\n });\n ```\n\n Using `denodeify` makes it easier to compose asynchronous operations instead\n of using callbacks. For example, instead of:\n\n ```javascript\n let fs = require('fs');\n\n fs.readFile('myfile.txt', function(err, data){\n if (err) { ... } // Handle error\n fs.writeFile('myfile2.txt', data, function(err){\n if (err) { ... } // Handle error\n console.log('done')\n });\n });\n ```\n\n you can chain the operations together using `then` from the returned promise:\n\n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n let writeFile = RSVP.denodeify(fs.writeFile);\n\n readFile('myfile.txt').then(function(data){\n return writeFile('myfile2.txt', data);\n }).then(function(){\n console.log('done')\n }).catch(function(error){\n // Handle error\n });\n ```\n\n @method denodeify\n @static\n @for RSVP\n @param {Function} nodeFunc a 'node-style' function that takes a callback as\n its last argument. The callback expects an error to be passed as its first\n argument (if an error occurred, otherwise null), and the value from the\n operation as its second argument ('function(err, value){ }').\n @param {Boolean|Array} [options] An optional paramter that if set\n to `true` causes the promise to fulfill with the callback's success arguments\n as an array. This is useful if the node function has multiple success\n paramters. If you set this paramter to an array with names, the promise will\n fulfill with a hash with these names as keys and the success parameters as\n values.\n @return {Function} a function that wraps `nodeFunc` to return an\n `RSVP.Promise`\n @static\n*/\nfunction denodeify(nodeFunc, options) {\n var fn = function fn() {\n var self = this;\n var l = arguments.length;\n var args = new Array(l + 1);\n var promiseInput = false;\n\n for (var i = 0; i < l; ++i) {\n var arg = arguments[i];\n\n if (!promiseInput) {\n // TODO: clean this up\n promiseInput = needsPromiseInput(arg);\n if (promiseInput === GET_THEN_ERROR$1) {\n var p = new Promise(noop);\n reject(p, GET_THEN_ERROR$1.value);\n return p;\n } else if (promiseInput && promiseInput !== true) {\n arg = wrapThenable(promiseInput, arg);\n }\n }\n args[i] = arg;\n }\n\n var promise = new Promise(noop);\n\n args[l] = function (err, val) {\n if (err) reject(promise, err);else if (options === undefined) resolve(promise, val);else if (options === true) resolve(promise, arrayResult(arguments));else if (isArray(options)) resolve(promise, makeObject(arguments, options));else resolve(promise, val);\n };\n\n if (promiseInput) {\n return handlePromiseInput(promise, args, nodeFunc, self);\n } else {\n return handleValueInput(promise, args, nodeFunc, self);\n }\n };\n\n fn.__proto__ = nodeFunc;\n\n return fn;\n}\n\nfunction handleValueInput(promise, args, nodeFunc, self) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n reject(promise, result.value);\n }\n return promise;\n}\n\nfunction handlePromiseInput(promise, args, nodeFunc, self) {\n return Promise.all(args).then(function (args) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n reject(promise, result.value);\n }\n return promise;\n });\n}\n\nfunction needsPromiseInput(arg) {\n if (arg && typeof arg === 'object') {\n if (arg.constructor === Promise) {\n return true;\n } else {\n return getThen$1(arg);\n }\n } else {\n return false;\n }\n}\n\n/**\n This is a convenient alias for `RSVP.Promise.all`.\n\n @method all\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n*/\nfunction all$1(array, label) {\n return Promise.all(array, label);\n}\n\nfunction AllSettled(Constructor, entries, label) {\n this._superConstructor(Constructor, entries, false, /* don't abort on reject */label);\n}\n\nAllSettled.prototype = o_create(Enumerator.prototype);\nAllSettled.prototype._superConstructor = Enumerator;\nAllSettled.prototype._makeResult = makeSettledResult;\nAllSettled.prototype._validationError = function () {\n return new Error('allSettled must be called with an array');\n};\n\n/**\n `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing\n a fail-fast method, it waits until all the promises have returned and\n shows you all the results. This is useful if you want to handle multiple\n promises' failure states together as a set.\n\n Returns a promise that is fulfilled when all the given promises have been\n settled. The return promise is fulfilled with an array of the states of\n the promises passed into the `promises` array argument.\n\n Each state object will either indicate fulfillment or rejection, and\n provide the corresponding value or reason. The states will take one of\n the following formats:\n\n ```javascript\n { state: 'fulfilled', value: value }\n or\n { state: 'rejected', reason: reason }\n ```\n\n Example:\n\n ```javascript\n let promise1 = RSVP.Promise.resolve(1);\n let promise2 = RSVP.Promise.reject(new Error('2'));\n let promise3 = RSVP.Promise.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n\n RSVP.allSettled(promises).then(function(array){\n // array == [\n // { state: 'fulfilled', value: 1 },\n // { state: 'rejected', reason: Error },\n // { state: 'rejected', reason: Error }\n // ]\n // Note that for the second item, reason.message will be '2', and for the\n // third item, reason.message will be '3'.\n }, function(error) {\n // Not run. (This block would only be called if allSettled had failed,\n // for instance if passed an incorrect argument type.)\n });\n ```\n\n @method allSettled\n @static\n @for RSVP\n @param {Array} entries\n @param {String} label - optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with an array of the settled\n states of the constituent promises.\n*/\nfunction allSettled(entries, label) {\n return new AllSettled(Promise, entries, label).promise;\n}\n\n/**\n This is a convenient alias for `RSVP.Promise.race`.\n\n @method race\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n */\nfunction race$1(array, label) {\n return Promise.race(array, label);\n}\n\nfunction PromiseHash(Constructor, object, label) {\n this._superConstructor(Constructor, object, true, label);\n}\n\nPromiseHash.prototype = o_create(Enumerator.prototype);\nPromiseHash.prototype._superConstructor = Enumerator;\nPromiseHash.prototype._init = function () {\n this._result = {};\n};\n\nPromiseHash.prototype._validateInput = function (input) {\n return input && typeof input === 'object';\n};\n\nPromiseHash.prototype._validationError = function () {\n return new Error('Promise.hash must be called with an object');\n};\n\nPromiseHash.prototype._enumerate = function () {\n var enumerator = this;\n var promise = enumerator.promise;\n var input = enumerator._input;\n var results = [];\n\n for (var key in input) {\n if (promise._state === PENDING && Object.prototype.hasOwnProperty.call(input, key)) {\n results.push({\n position: key,\n entry: input[key]\n });\n }\n }\n\n var length = results.length;\n enumerator._remaining = length;\n var result = undefined;\n\n for (var i = 0; promise._state === PENDING && i < length; i++) {\n result = results[i];\n enumerator._eachEntry(result.entry, result.position);\n }\n};\n\n/**\n `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array\n for its `promises` argument.\n\n Returns a promise that is fulfilled when all the given promises have been\n fulfilled, or rejected if any of them become rejected. The returned promise\n is fulfilled with a hash that has the same key names as the `promises` object\n argument. If any of the values in the object are not promises, they will\n simply be copied over to the fulfilled object.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n yourPromise: RSVP.resolve(2),\n theirPromise: RSVP.resolve(3),\n notAPromise: 4\n };\n\n RSVP.hash(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: 1,\n // yourPromise: 2,\n // theirPromise: 3,\n // notAPromise: 4\n // }\n });\n ````\n\n If any of the `promises` given to `RSVP.hash` are rejected, the first promise\n that is rejected will be given as the reason to the rejection handler.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n rejectedPromise: RSVP.reject(new Error('rejectedPromise')),\n anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')),\n };\n\n RSVP.hash(promises).then(function(hash){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === 'rejectedPromise'\n });\n ```\n\n An important note: `RSVP.hash` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hash` will NOT preserve prototype\n chains.\n\n Example:\n\n ```javascript\n function MyConstructor(){\n this.example = RSVP.resolve('Example');\n }\n\n MyConstructor.prototype = {\n protoProperty: RSVP.resolve('Proto Property')\n };\n\n let myObject = new MyConstructor();\n\n RSVP.hash(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: 'Example'\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n\n @method hash\n @static\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all properties of `promises`\n have been fulfilled, or rejected if any of them become rejected.\n*/\nfunction hash(object, label) {\n return new PromiseHash(Promise, object, label).promise;\n}\n\nfunction HashSettled(Constructor, object, label) {\n this._superConstructor(Constructor, object, false, label);\n}\n\nHashSettled.prototype = o_create(PromiseHash.prototype);\nHashSettled.prototype._superConstructor = Enumerator;\nHashSettled.prototype._makeResult = makeSettledResult;\n\nHashSettled.prototype._validationError = function () {\n return new Error('hashSettled must be called with an object');\n};\n\n/**\n `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object\n instead of an array for its `promises` argument.\n\n Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method,\n but like `RSVP.allSettled`, `hashSettled` waits until all the\n constituent promises have returned and then shows you all the results\n with their states and values/reasons. This is useful if you want to\n handle multiple promises' failure states together as a set.\n\n Returns a promise that is fulfilled when all the given promises have been\n settled, or rejected if the passed parameters are invalid.\n\n The returned promise is fulfilled with a hash that has the same key names as\n the `promises` object argument. If any of the values in the object are not\n promises, they will be copied over to the fulfilled object and marked with state\n 'fulfilled'.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n yourPromise: RSVP.Promise.resolve(2),\n theirPromise: RSVP.Promise.resolve(3),\n notAPromise: 4\n };\n\n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // yourPromise: { state: 'fulfilled', value: 2 },\n // theirPromise: { state: 'fulfilled', value: 3 },\n // notAPromise: { state: 'fulfilled', value: 4 }\n // }\n });\n ```\n\n If any of the `promises` given to `RSVP.hash` are rejected, the state will\n be set to 'rejected' and the reason for rejection provided.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n rejectedPromise: RSVP.Promise.reject(new Error('rejection')),\n anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')),\n };\n\n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // rejectedPromise: { state: 'rejected', reason: Error },\n // anotherRejectedPromise: { state: 'rejected', reason: Error },\n // }\n // Note that for rejectedPromise, reason.message == 'rejection',\n // and for anotherRejectedPromise, reason.message == 'more rejection'.\n });\n ```\n\n An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype\n chains.\n\n Example:\n\n ```javascript\n function MyConstructor(){\n this.example = RSVP.Promise.resolve('Example');\n }\n\n MyConstructor.prototype = {\n protoProperty: RSVP.Promise.resolve('Proto Property')\n };\n\n let myObject = new MyConstructor();\n\n RSVP.hashSettled(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: { state: 'fulfilled', value: 'Example' }\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n\n @method hashSettled\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when when all properties of `promises`\n have been settled.\n @static\n*/\nfunction hashSettled(object, label) {\n return new HashSettled(Promise, object, label).promise;\n}\n\nfunction rethrow(reason) {\n setTimeout(function () {\n throw reason;\n });\n throw reason;\n}\n\n/**\n `RSVP.defer` returns an object similar to jQuery's `$.Deferred`.\n `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s\n interface. New code should use the `RSVP.Promise` constructor instead.\n\n The object returned from `RSVP.defer` is a plain object with three properties:\n\n * promise - an `RSVP.Promise`.\n * reject - a function that causes the `promise` property on this object to\n become rejected\n * resolve - a function that causes the `promise` property on this object to\n become fulfilled.\n\n Example:\n\n ```javascript\n let deferred = RSVP.defer();\n\n deferred.resolve(\"Success!\");\n\n deferred.promise.then(function(value){\n // value here is \"Success!\"\n });\n ```\n\n @method defer\n @static\n @for RSVP\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Object}\n */\nfunction defer(label) {\n var deferred = { resolve: undefined, reject: undefined };\n\n deferred.promise = new Promise(function (resolve, reject) {\n deferred.resolve = resolve;\n deferred.reject = reject;\n }, label);\n\n return deferred;\n}\n\n/**\n `RSVP.map` is similar to JavaScript's native `map` method, except that it\n waits for all promises to become fulfilled before running the `mapFn` on\n each item in given to `promises`. `RSVP.map` returns a promise that will\n become fulfilled with the result of running `mapFn` on the values the promises\n become fulfilled with.\n\n For example:\n\n ```javascript\n\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n let mapFn = function(item){\n return item + 1;\n };\n\n RSVP.map(promises, mapFn).then(function(result){\n // result is [ 2, 3, 4 ]\n });\n ```\n\n If any of the `promises` given to `RSVP.map` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n\n let mapFn = function(item){\n return item + 1;\n };\n\n RSVP.map(promises, mapFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n\n `RSVP.map` will also wait if a promise is returned from `mapFn`. For example,\n say you want to get all comments from a set of blog posts, but you need\n the blog posts first because they contain a url to those comments.\n\n ```javscript\n\n let mapFn = function(blogPost){\n // getComments does some ajax and returns an RSVP.Promise that is fulfilled\n // with some comments data\n return getComments(blogPost.comments_url);\n };\n\n // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled\n // with some blog post data\n RSVP.map(getBlogPosts(), mapFn).then(function(comments){\n // comments is the result of asking the server for the comments\n // of all blog posts returned from getBlogPosts()\n });\n ```\n\n @method map\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} mapFn function to be called on each fulfilled promise.\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with the result of calling\n `mapFn` on each fulfilled promise or value when they become fulfilled.\n The promise will be rejected if any of the given `promises` become rejected.\n @static\n*/\nfunction map(promises, mapFn, label) {\n return Promise.all(promises, label).then(function (values) {\n if (!isFunction(mapFn)) {\n throw new TypeError(\"You must pass a function as map's second argument.\");\n }\n\n var length = values.length;\n var results = new Array(length);\n\n for (var i = 0; i < length; i++) {\n results[i] = mapFn(values[i]);\n }\n\n return Promise.all(results, label);\n });\n}\n\n/**\n This is a convenient alias for `RSVP.Promise.resolve`.\n\n @method resolve\n @static\n @for RSVP\n @param {*} value value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$2(value, label) {\n return Promise.resolve(value, label);\n}\n\n/**\n This is a convenient alias for `RSVP.Promise.reject`.\n\n @method reject\n @static\n @for RSVP\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$2(reason, label) {\n return Promise.reject(reason, label);\n}\n\n/**\n `RSVP.filter` is similar to JavaScript's native `filter` method, except that it\n waits for all promises to become fulfilled before running the `filterFn` on\n each item in given to `promises`. `RSVP.filter` returns a promise that will\n become fulfilled with the result of running `filterFn` on the values the\n promises become fulfilled with.\n\n For example:\n\n ```javascript\n\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n\n let promises = [promise1, promise2, promise3];\n\n let filterFn = function(item){\n return item > 1;\n };\n\n RSVP.filter(promises, filterFn).then(function(result){\n // result is [ 2, 3 ]\n });\n ```\n\n If any of the `promises` given to `RSVP.filter` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n\n let filterFn = function(item){\n return item > 1;\n };\n\n RSVP.filter(promises, filterFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n\n `RSVP.filter` will also wait for any promises returned from `filterFn`.\n For instance, you may want to fetch a list of users then return a subset\n of those users based on some asynchronous operation:\n\n ```javascript\n\n let alice = { name: 'alice' };\n let bob = { name: 'bob' };\n let users = [ alice, bob ];\n\n let promises = users.map(function(user){\n return RSVP.resolve(user);\n });\n\n let filterFn = function(user){\n // Here, Alice has permissions to create a blog post, but Bob does not.\n return getPrivilegesForUser(user).then(function(privs){\n return privs.can_create_blog_post === true;\n });\n };\n RSVP.filter(promises, filterFn).then(function(users){\n // true, because the server told us only Alice can create a blog post.\n users.length === 1;\n // false, because Alice is the only user present in `users`\n users[0] === bob;\n });\n ```\n\n @method filter\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} filterFn - function to be called on each resolved value to\n filter the final results.\n @param {String} label optional string describing the promise. Useful for\n tooling.\n @return {Promise}\n*/\n\nfunction resolveAll(promises, label) {\n return Promise.all(promises, label);\n}\n\nfunction resolveSingle(promise, label) {\n return Promise.resolve(promise, label).then(function (promises) {\n return resolveAll(promises, label);\n });\n}\nfunction filter(promises, filterFn, label) {\n var promise = isArray(promises) ? resolveAll(promises, label) : resolveSingle(promises, label);\n return promise.then(function (values) {\n if (!isFunction(filterFn)) {\n throw new TypeError(\"You must pass a function as filter's second argument.\");\n }\n\n var length = values.length;\n var filtered = new Array(length);\n\n for (var i = 0; i < length; i++) {\n filtered[i] = filterFn(values[i]);\n }\n\n return resolveAll(filtered, label).then(function (filtered) {\n var results = new Array(length);\n var newLength = 0;\n\n for (var i = 0; i < length; i++) {\n if (filtered[i]) {\n results[newLength] = values[i];\n newLength++;\n }\n }\n\n results.length = newLength;\n\n return results;\n });\n });\n}\n\nvar len = 0;\nvar vertxNext = undefined;\nfunction asap(callback, arg) {\n queue$1[len] = callback;\n queue$1[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 1, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n scheduleFlush$1();\n }\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n var nextTick = process.nextTick;\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // setImmediate should be used instead instead\n var version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n nextTick = setImmediate;\n }\n return function () {\n return nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n return function () {\n return vertxNext(flush);\n };\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n return node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n return function () {\n return setTimeout(flush, 1);\n };\n}\n\nvar queue$1 = new Array(1000);\n\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue$1[i];\n var arg = queue$1[i + 1];\n\n callback(arg);\n\n queue$1[i] = undefined;\n queue$1[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush$1 = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush$1 = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush$1 = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush$1 = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush$1 = attemptVertex();\n} else {\n scheduleFlush$1 = useSetTimeout();\n}\n\nvar platform = undefined;\n\n/* global self */\nif (typeof self === 'object') {\n platform = self;\n\n /* global global */\n} else if (typeof global === 'object') {\n platform = global;\n } else {\n throw new Error('no global: `self` or `global` found');\n }\n\nvar _async$filter;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// defaults\n\n// the default export here is for backwards compat:\n// https://github.com/tildeio/rsvp.js/issues/434\nconfig.async = asap;\nconfig.after = function (cb) {\n return setTimeout(cb, 0);\n};\nvar cast = resolve$2;\n\nvar async = function async(callback, arg) {\n return config.async(callback, arg);\n};\n\nfunction on() {\n config['on'].apply(config, arguments);\n}\n\nfunction off() {\n config['off'].apply(config, arguments);\n}\n\n// Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`\nif (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {\n var callbacks = window['__PROMISE_INSTRUMENTATION__'];\n configure('instrument', true);\n for (var eventName in callbacks) {\n if (callbacks.hasOwnProperty(eventName)) {\n on(eventName, callbacks[eventName]);\n }\n }\n}var rsvp = (_async$filter = {\n cast: cast,\n Promise: Promise,\n EventTarget: EventTarget,\n all: all$1,\n allSettled: allSettled,\n race: race$1,\n hash: hash,\n hashSettled: hashSettled,\n rethrow: rethrow,\n defer: defer,\n denodeify: denodeify,\n configure: configure,\n on: on,\n off: off,\n resolve: resolve$2,\n reject: reject$2,\n map: map\n}, _defineProperty(_async$filter, 'async', async), _defineProperty(_async$filter, 'filter', // babel seems to error if async isn't a computed prop here...\nfilter), _async$filter);\n\nexports['default'] = rsvp;\nexports.cast = cast;\nexports.Promise = Promise;\nexports.EventTarget = EventTarget;\nexports.all = all$1;\nexports.allSettled = allSettled;\nexports.race = race$1;\nexports.hash = hash;\nexports.hashSettled = hashSettled;\nexports.rethrow = rethrow;\nexports.defer = defer;\nexports.denodeify = denodeify;\nexports.configure = configure;\nexports.on = on;\nexports.off = off;\nexports.resolve = resolve$2;\nexports.reject = reject$2;\nexports.map = map;\nexports.async = async;\nexports.filter = filter;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=rsvp.map","/*!\n * URI.js - Mutating URLs\n * Second Level Domain (SLD) Support\n *\n * Version: 1.18.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n\n(function (root, factory) {\n 'use strict';\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n if (typeof exports === 'object') {\n // Node\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory);\n } else {\n // Browser globals (root is window)\n root.SecondLevelDomains = factory(root);\n }\n}(this, function (root) {\n 'use strict';\n\n // save current SecondLevelDomains variable, if any\n var _SecondLevelDomains = root && root.SecondLevelDomains;\n\n var SLD = {\n // list of known Second Level Domains\n // converted list of SLDs from https://github.com/gavingmiller/second-level-domains\n // ----\n // publicsuffix.org is more current and actually used by a couple of browsers internally.\n // downside is it also contains domains like \"dyndns.org\" - which is fine for the security\n // issues browser have to deal with (SOP for cookies, etc) - but is way overboard for URI.js\n // ----\n list: {\n 'ac':' com gov mil net org ',\n 'ae':' ac co gov mil name net org pro sch ',\n 'af':' com edu gov net org ',\n 'al':' com edu gov mil net org ',\n 'ao':' co ed gv it og pb ',\n 'ar':' com edu gob gov int mil net org tur ',\n 'at':' ac co gv or ',\n 'au':' asn com csiro edu gov id net org ',\n 'ba':' co com edu gov mil net org rs unbi unmo unsa untz unze ',\n 'bb':' biz co com edu gov info net org store tv ',\n 'bh':' biz cc com edu gov info net org ',\n 'bn':' com edu gov net org ',\n 'bo':' com edu gob gov int mil net org tv ',\n 'br':' adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ',\n 'bs':' com edu gov net org ',\n 'bz':' du et om ov rg ',\n 'ca':' ab bc mb nb nf nl ns nt nu on pe qc sk yk ',\n 'ck':' biz co edu gen gov info net org ',\n 'cn':' ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ',\n 'co':' com edu gov mil net nom org ',\n 'cr':' ac c co ed fi go or sa ',\n 'cy':' ac biz com ekloges gov ltd name net org parliament press pro tm ',\n 'do':' art com edu gob gov mil net org sld web ',\n 'dz':' art asso com edu gov net org pol ',\n 'ec':' com edu fin gov info med mil net org pro ',\n 'eg':' com edu eun gov mil name net org sci ',\n 'er':' com edu gov ind mil net org rochest w ',\n 'es':' com edu gob nom org ',\n 'et':' biz com edu gov info name net org ',\n 'fj':' ac biz com info mil name net org pro ',\n 'fk':' ac co gov net nom org ',\n 'fr':' asso com f gouv nom prd presse tm ',\n 'gg':' co net org ',\n 'gh':' com edu gov mil org ',\n 'gn':' ac com gov net org ',\n 'gr':' com edu gov mil net org ',\n 'gt':' com edu gob ind mil net org ',\n 'gu':' com edu gov net org ',\n 'hk':' com edu gov idv net org ',\n 'hu':' 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ',\n 'id':' ac co go mil net or sch web ',\n 'il':' ac co gov idf k12 muni net org ',\n 'in':' ac co edu ernet firm gen gov i ind mil net nic org res ',\n 'iq':' com edu gov i mil net org ',\n 'ir':' ac co dnssec gov i id net org sch ',\n 'it':' edu gov ',\n 'je':' co net org ',\n 'jo':' com edu gov mil name net org sch ',\n 'jp':' ac ad co ed go gr lg ne or ',\n 'ke':' ac co go info me mobi ne or sc ',\n 'kh':' com edu gov mil net org per ',\n 'ki':' biz com de edu gov info mob net org tel ',\n 'km':' asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ',\n 'kn':' edu gov net org ',\n 'kr':' ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ',\n 'kw':' com edu gov net org ',\n 'ky':' com edu gov net org ',\n 'kz':' com edu gov mil net org ',\n 'lb':' com edu gov net org ',\n 'lk':' assn com edu gov grp hotel int ltd net ngo org sch soc web ',\n 'lr':' com edu gov net org ',\n 'lv':' asn com conf edu gov id mil net org ',\n 'ly':' com edu gov id med net org plc sch ',\n 'ma':' ac co gov m net org press ',\n 'mc':' asso tm ',\n 'me':' ac co edu gov its net org priv ',\n 'mg':' com edu gov mil nom org prd tm ',\n 'mk':' com edu gov inf name net org pro ',\n 'ml':' com edu gov net org presse ',\n 'mn':' edu gov org ',\n 'mo':' com edu gov net org ',\n 'mt':' com edu gov net org ',\n 'mv':' aero biz com coop edu gov info int mil museum name net org pro ',\n 'mw':' ac co com coop edu gov int museum net org ',\n 'mx':' com edu gob net org ',\n 'my':' com edu gov mil name net org sch ',\n 'nf':' arts com firm info net other per rec store web ',\n 'ng':' biz com edu gov mil mobi name net org sch ',\n 'ni':' ac co com edu gob mil net nom org ',\n 'np':' com edu gov mil net org ',\n 'nr':' biz com edu gov info net org ',\n 'om':' ac biz co com edu gov med mil museum net org pro sch ',\n 'pe':' com edu gob mil net nom org sld ',\n 'ph':' com edu gov i mil net ngo org ',\n 'pk':' biz com edu fam gob gok gon gop gos gov net org web ',\n 'pl':' art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ',\n 'pr':' ac biz com edu est gov info isla name net org pro prof ',\n 'ps':' com edu gov net org plo sec ',\n 'pw':' belau co ed go ne or ',\n 'ro':' arts com firm info nom nt org rec store tm www ',\n 'rs':' ac co edu gov in org ',\n 'sb':' com edu gov net org ',\n 'sc':' com edu gov net org ',\n 'sh':' co com edu gov net nom org ',\n 'sl':' com edu gov net org ',\n 'st':' co com consulado edu embaixada gov mil net org principe saotome store ',\n 'sv':' com edu gob org red ',\n 'sz':' ac co org ',\n 'tr':' av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ',\n 'tt':' aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ',\n 'tw':' club com ebiz edu game gov idv mil net org ',\n 'mu':' ac co com gov net or org ',\n 'mz':' ac co edu gov org ',\n 'na':' co com ',\n 'nz':' ac co cri geek gen govt health iwi maori mil net org parliament school ',\n 'pa':' abo ac com edu gob ing med net nom org sld ',\n 'pt':' com edu gov int net nome org publ ',\n 'py':' com edu gov mil net org ',\n 'qa':' com edu gov mil net org ',\n 're':' asso com nom ',\n 'ru':' ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ',\n 'rw':' ac co com edu gouv gov int mil net ',\n 'sa':' com edu gov med net org pub sch ',\n 'sd':' com edu gov info med net org tv ',\n 'se':' a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ',\n 'sg':' com edu gov idn net org per ',\n 'sn':' art com edu gouv org perso univ ',\n 'sy':' com edu gov mil net news org ',\n 'th':' ac co go in mi net or ',\n 'tj':' ac biz co com edu go gov info int mil name net nic org test web ',\n 'tn':' agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ',\n 'tz':' ac co go ne or ',\n 'ua':' biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ',\n 'ug':' ac co go ne or org sc ',\n 'uk':' ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ',\n 'us':' dni fed isa kids nsn ',\n 'uy':' com edu gub mil net org ',\n 've':' co com edu gob info mil net org web ',\n 'vi':' co com k12 net org ',\n 'vn':' ac biz com edu gov health info int name net org pro ',\n 'ye':' co com gov ltd me net org plc ',\n 'yu':' ac co edu gov org ',\n 'za':' ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ',\n 'zm':' ac co com edu gov net org sch '\n },\n // gorhill 2013-10-25: Using indexOf() instead Regexp(). Significant boost\n // in both performance and memory footprint. No initialization required.\n // http://jsperf.com/uri-js-sld-regex-vs-binary-search/4\n // Following methods use lastIndexOf() rather than array.split() in order\n // to avoid any memory allocations.\n has: function(domain) {\n var tldOffset = domain.lastIndexOf('.');\n if (tldOffset <= 0 || tldOffset >= (domain.length-1)) {\n return false;\n }\n var sldOffset = domain.lastIndexOf('.', tldOffset-1);\n if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) {\n return false;\n }\n var sldList = SLD.list[domain.slice(tldOffset+1)];\n if (!sldList) {\n return false;\n }\n return sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') >= 0;\n },\n is: function(domain) {\n var tldOffset = domain.lastIndexOf('.');\n if (tldOffset <= 0 || tldOffset >= (domain.length-1)) {\n return false;\n }\n var sldOffset = domain.lastIndexOf('.', tldOffset-1);\n if (sldOffset >= 0) {\n return false;\n }\n var sldList = SLD.list[domain.slice(tldOffset+1)];\n if (!sldList) {\n return false;\n }\n return sldList.indexOf(' ' + domain.slice(0, tldOffset) + ' ') >= 0;\n },\n get: function(domain) {\n var tldOffset = domain.lastIndexOf('.');\n if (tldOffset <= 0 || tldOffset >= (domain.length-1)) {\n return null;\n }\n var sldOffset = domain.lastIndexOf('.', tldOffset-1);\n if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) {\n return null;\n }\n var sldList = SLD.list[domain.slice(tldOffset+1)];\n if (!sldList) {\n return null;\n }\n if (sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') < 0) {\n return null;\n }\n return domain.slice(sldOffset+1);\n },\n noConflict: function(){\n if (root.SecondLevelDomains === this) {\n root.SecondLevelDomains = _SecondLevelDomains;\n }\n return this;\n }\n };\n\n return SLD;\n}));\n","/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.18.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n(function (root, factory) {\n 'use strict';\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n if (typeof exports === 'object') {\n // Node\n module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n } else {\n // Browser globals (root is window)\n root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n }\n}(this, function (punycode, IPv6, SLD, root) {\n 'use strict';\n /*global location, escape, unescape */\n // FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n /*jshint camelcase: false */\n\n // save current URI variable, if any\n var _URI = root && root.URI;\n\n function URI(url, base) {\n var _urlSupplied = arguments.length >= 1;\n var _baseSupplied = arguments.length >= 2;\n\n // Allow instantiation without the 'new' keyword\n if (!(this instanceof URI)) {\n if (_urlSupplied) {\n if (_baseSupplied) {\n return new URI(url, base);\n }\n\n return new URI(url);\n }\n\n return new URI();\n }\n\n if (url === undefined) {\n if (_urlSupplied) {\n throw new TypeError('undefined is not a valid argument for URI');\n }\n\n if (typeof location !== 'undefined') {\n url = location.href + '';\n } else {\n url = '';\n }\n }\n\n this.href(url);\n\n // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n if (base !== undefined) {\n return this.absoluteTo(base);\n }\n\n return this;\n }\n\n URI.version = '1.18.1';\n\n var p = URI.prototype;\n var hasOwn = Object.prototype.hasOwnProperty;\n\n function escapeRegEx(string) {\n // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n return string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n }\n\n function getType(value) {\n // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n if (value === undefined) {\n return 'Undefined';\n }\n\n return String(Object.prototype.toString.call(value)).slice(8, -1);\n }\n\n function isArray(obj) {\n return getType(obj) === 'Array';\n }\n\n function filterArrayValues(data, value) {\n var lookup = {};\n var i, length;\n\n if (getType(value) === 'RegExp') {\n lookup = null;\n } else if (isArray(value)) {\n for (i = 0, length = value.length; i < length; i++) {\n lookup[value[i]] = true;\n }\n } else {\n lookup[value] = true;\n }\n\n for (i = 0, length = data.length; i < length; i++) {\n /*jshint laxbreak: true */\n var _match = lookup && lookup[data[i]] !== undefined\n || !lookup && value.test(data[i]);\n /*jshint laxbreak: false */\n if (_match) {\n data.splice(i, 1);\n length--;\n i--;\n }\n }\n\n return data;\n }\n\n function arrayContains(list, value) {\n var i, length;\n\n // value may be string, number, array, regexp\n if (isArray(value)) {\n // Note: this can be optimized to O(n) (instead of current O(m * n))\n for (i = 0, length = value.length; i < length; i++) {\n if (!arrayContains(list, value[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n var _type = getType(value);\n for (i = 0, length = list.length; i < length; i++) {\n if (_type === 'RegExp') {\n if (typeof list[i] === 'string' && list[i].match(value)) {\n return true;\n }\n } else if (list[i] === value) {\n return true;\n }\n }\n\n return false;\n }\n\n function arraysEqual(one, two) {\n if (!isArray(one) || !isArray(two)) {\n return false;\n }\n\n // arrays can't be equal if they have different amount of content\n if (one.length !== two.length) {\n return false;\n }\n\n one.sort();\n two.sort();\n\n for (var i = 0, l = one.length; i < l; i++) {\n if (one[i] !== two[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n function trimSlashes(text) {\n var trim_expression = /^\\/+|\\/+$/g;\n return text.replace(trim_expression, '');\n }\n\n URI._parts = function() {\n return {\n protocol: null,\n username: null,\n password: null,\n hostname: null,\n urn: null,\n port: null,\n path: null,\n query: null,\n fragment: null,\n // state\n duplicateQueryParameters: URI.duplicateQueryParameters,\n escapeQuerySpace: URI.escapeQuerySpace\n };\n };\n // state: allow duplicate query parameters (a=1&a=1)\n URI.duplicateQueryParameters = false;\n // state: replaces + with %20 (space in query strings)\n URI.escapeQuerySpace = true;\n // static properties\n URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n URI.idn_expression = /[^a-z0-9\\.-]/i;\n URI.punycode_expression = /(xn--)/i;\n // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n URI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n // credits to Rich Brown\n // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n // specification: http://www.ietf.org/rfc/rfc4291.txt\n URI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n // expression used is \"gruber revised\" (@gruber v2) determined to be the\n // best solution in a regex-golf we did a couple of ages ago at\n // * http://mathiasbynens.be/demo/url-regex\n // * http://rodneyrehm.de/t/url-regex.html\n URI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/ig;\n URI.findUri = {\n // valid \"scheme://\" or \"www.\"\n start: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n // everything up to the next whitespace\n end: /[\\s\\r\\n]|$/,\n // trim trailing punctuation captured by end RegExp\n trim: /[`!()\\[\\]{};:'\".,<>?«»“”„‘’]+$/\n };\n // http://www.iana.org/assignments/uri-schemes.html\n // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n URI.defaultPorts = {\n http: '80',\n https: '443',\n ftp: '21',\n gopher: '70',\n ws: '80',\n wss: '443'\n };\n // allowed hostname characters according to RFC 3986\n // ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . -\n URI.invalid_hostname_characters = /[^a-zA-Z0-9\\.-]/;\n // map DOM Elements to their URI attribute\n URI.domAttributes = {\n 'a': 'href',\n 'blockquote': 'cite',\n 'link': 'href',\n 'base': 'href',\n 'script': 'src',\n 'form': 'action',\n 'img': 'src',\n 'area': 'href',\n 'iframe': 'src',\n 'embed': 'src',\n 'source': 'src',\n 'track': 'src',\n 'input': 'src', // but only if type=\"image\"\n 'audio': 'src',\n 'video': 'src'\n };\n URI.getDomAttribute = function(node) {\n if (!node || !node.nodeName) {\n return undefined;\n }\n\n var nodeName = node.nodeName.toLowerCase();\n // should only expose src for type=\"image\"\n if (nodeName === 'input' && node.type !== 'image') {\n return undefined;\n }\n\n return URI.domAttributes[nodeName];\n };\n\n function escapeForDumbFirefox36(value) {\n // https://github.com/medialize/URI.js/issues/91\n return escape(value);\n }\n\n // encoding / decoding according to RFC3986\n function strictEncodeURIComponent(string) {\n // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(string)\n .replace(/[!'()*]/g, escapeForDumbFirefox36)\n .replace(/\\*/g, '%2A');\n }\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n URI.iso8859 = function() {\n URI.encode = escape;\n URI.decode = unescape;\n };\n URI.unicode = function() {\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n };\n URI.characters = {\n pathname: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n map: {\n // -._~!'()*\n '%24': '$',\n '%26': '&',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%3A': ':',\n '%40': '@'\n }\n },\n decode: {\n expression: /[\\/\\?#]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23'\n }\n }\n },\n reserved: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n map: {\n // gen-delims\n '%3A': ':',\n '%2F': '/',\n '%3F': '?',\n '%23': '#',\n '%5B': '[',\n '%5D': ']',\n '%40': '@',\n // sub-delims\n '%21': '!',\n '%24': '$',\n '%26': '&',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '='\n }\n }\n },\n urnpath: {\n // The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n // for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n // note that the colon character is not featured in the encoding map; this is because URI.js\n // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n // should not appear unencoded in a segment itself.\n // See also the note above about RFC3986 and capitalalized hex digits.\n encode: {\n expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n map: {\n '%21': '!',\n '%24': '$',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%40': '@'\n }\n },\n // These characters are the characters called out by RFC2141 as \"reserved\" characters that\n // should never appear in a URN, plus the colon character (see note above).\n decode: {\n expression: /[\\/\\?#:]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23',\n ':': '%3A'\n }\n }\n }\n };\n URI.encodeQuery = function(string, escapeQuerySpace) {\n var escaped = URI.encode(string + '');\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n };\n URI.decodeQuery = function(string, escapeQuerySpace) {\n string += '';\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n try {\n return URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n } catch(e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n // generate encode/decode path functions\n var _parts = {'encode':'encode', 'decode':'decode'};\n var _part;\n var generateAccessor = function(_group, _part) {\n return function(string) {\n try {\n return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) {\n return URI.characters[_group][_part].map[c];\n });\n } catch (e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n };\n\n for (_part in _parts) {\n URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n }\n\n var generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) {\n return function(string) {\n // Why pass in names of functions, rather than the function objects themselves? The\n // definitions of some functions (but in particular, URI.decode) will occasionally change due\n // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n // that the functions we use here are \"fresh\".\n var actualCodingFunc;\n if (!_innerCodingFuncName) {\n actualCodingFunc = URI[_codingFuncName];\n } else {\n actualCodingFunc = function(string) {\n return URI[_codingFuncName](URI[_innerCodingFuncName](string));\n };\n }\n\n var segments = (string + '').split(_sep);\n\n for (var i = 0, length = segments.length; i < length; i++) {\n segments[i] = actualCodingFunc(segments[i]);\n }\n\n return segments.join(_sep);\n };\n };\n\n // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n\n URI.encodeReserved = generateAccessor('reserved', 'encode');\n\n URI.parse = function(string, parts) {\n var pos;\n if (!parts) {\n parts = {};\n }\n // [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n // extract fragment\n pos = string.indexOf('#');\n if (pos > -1) {\n // escaping?\n parts.fragment = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract query\n pos = string.indexOf('?');\n if (pos > -1) {\n // escaping?\n parts.query = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract protocol\n if (string.substring(0, 2) === '//') {\n // relative-scheme\n parts.protocol = null;\n string = string.substring(2);\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n pos = string.indexOf(':');\n if (pos > -1) {\n parts.protocol = string.substring(0, pos) || null;\n if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n // : may be within the path\n parts.protocol = undefined;\n } else if (string.substring(pos + 1, pos + 3) === '//') {\n string = string.substring(pos + 3);\n\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n string = string.substring(pos + 1);\n parts.urn = true;\n }\n }\n }\n\n // what's left must be the path\n parts.path = string;\n\n // and we're done\n return parts;\n };\n URI.parseHost = function(string, parts) {\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n // https://github.com/medialize/URI.js/pull/233\n string = string.replace(/\\\\/g, '/');\n\n // extract host:port\n var pos = string.indexOf('/');\n var bracketPos;\n var t;\n\n if (pos === -1) {\n pos = string.length;\n }\n\n if (string.charAt(0) === '[') {\n // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n // IPv6+port in the format [2001:db8::1]:80 (for the time being)\n bracketPos = string.indexOf(']');\n parts.hostname = string.substring(1, bracketPos) || null;\n parts.port = string.substring(bracketPos + 2, pos) || null;\n if (parts.port === '/') {\n parts.port = null;\n }\n } else {\n var firstColon = string.indexOf(':');\n var firstSlash = string.indexOf('/');\n var nextColon = string.indexOf(':', firstColon + 1);\n if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n // IPv6 host contains multiple colons - but no port\n // this notation is actually not allowed by RFC 3986, but we're a liberal parser\n parts.hostname = string.substring(0, pos) || null;\n parts.port = null;\n } else {\n t = string.substring(0, pos).split(':');\n parts.hostname = t[0] || null;\n parts.port = t[1] || null;\n }\n }\n\n if (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n pos++;\n string = '/' + string;\n }\n\n return string.substring(pos) || '/';\n };\n URI.parseAuthority = function(string, parts) {\n string = URI.parseUserinfo(string, parts);\n return URI.parseHost(string, parts);\n };\n URI.parseUserinfo = function(string, parts) {\n // extract username:password\n var firstSlash = string.indexOf('/');\n var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n var t;\n\n // authority@ must come before /path\n if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n t = string.substring(0, pos).split(':');\n parts.username = t[0] ? URI.decode(t[0]) : null;\n t.shift();\n parts.password = t[0] ? URI.decode(t.join(':')) : null;\n string = string.substring(pos + 1);\n } else {\n parts.username = null;\n parts.password = null;\n }\n\n return string;\n };\n URI.parseQuery = function(string, escapeQuerySpace) {\n if (!string) {\n return {};\n }\n\n // throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n string = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n\n if (!string) {\n return {};\n }\n\n var items = {};\n var splits = string.split('&');\n var length = splits.length;\n var v, name, value;\n\n for (var i = 0; i < length; i++) {\n v = splits[i].split('=');\n name = URI.decodeQuery(v.shift(), escapeQuerySpace);\n // no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n\n if (hasOwn.call(items, name)) {\n if (typeof items[name] === 'string' || items[name] === null) {\n items[name] = [items[name]];\n }\n\n items[name].push(value);\n } else {\n items[name] = value;\n }\n }\n\n return items;\n };\n\n URI.build = function(parts) {\n var t = '';\n\n if (parts.protocol) {\n t += parts.protocol + ':';\n }\n\n if (!parts.urn && (t || parts.hostname)) {\n t += '//';\n }\n\n t += (URI.buildAuthority(parts) || '');\n\n if (typeof parts.path === 'string') {\n if (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') {\n t += '/';\n }\n\n t += parts.path;\n }\n\n if (typeof parts.query === 'string' && parts.query) {\n t += '?' + parts.query;\n }\n\n if (typeof parts.fragment === 'string' && parts.fragment) {\n t += '#' + parts.fragment;\n }\n return t;\n };\n URI.buildHost = function(parts) {\n var t = '';\n\n if (!parts.hostname) {\n return '';\n } else if (URI.ip6_expression.test(parts.hostname)) {\n t += '[' + parts.hostname + ']';\n } else {\n t += parts.hostname;\n }\n\n if (parts.port) {\n t += ':' + parts.port;\n }\n\n return t;\n };\n URI.buildAuthority = function(parts) {\n return URI.buildUserinfo(parts) + URI.buildHost(parts);\n };\n URI.buildUserinfo = function(parts) {\n var t = '';\n\n if (parts.username) {\n t += URI.encode(parts.username);\n }\n\n if (parts.password) {\n t += ':' + URI.encode(parts.password);\n }\n\n if (t) {\n t += '@';\n }\n\n return t;\n };\n URI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) {\n // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed\n // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n // URI.js treats the query string as being application/x-www-form-urlencoded\n // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n var t = '';\n var unique, key, i, length;\n for (key in data) {\n if (hasOwn.call(data, key) && key) {\n if (isArray(data[key])) {\n unique = {};\n for (i = 0, length = data[key].length; i < length; i++) {\n if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n if (duplicateQueryParameters !== true) {\n unique[data[key][i] + ''] = true;\n }\n }\n }\n } else if (data[key] !== undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n }\n }\n }\n\n return t.substring(1);\n };\n URI.buildQueryParameter = function(name, value, escapeQuerySpace) {\n // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n // don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n };\n\n URI.addQuery = function(data, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.addQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (data[name] === undefined) {\n data[name] = value;\n return;\n } else if (typeof data[name] === 'string') {\n data[name] = [data[name]];\n }\n\n if (!isArray(value)) {\n value = [value];\n }\n\n data[name] = (data[name] || []).concat(value);\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n };\n URI.removeQuery = function(data, name, value) {\n var i, length, key;\n\n if (isArray(name)) {\n for (i = 0, length = name.length; i < length; i++) {\n data[name[i]] = undefined;\n }\n } else if (getType(name) === 'RegExp') {\n for (key in data) {\n if (name.test(key)) {\n data[key] = undefined;\n }\n }\n } else if (typeof name === 'object') {\n for (key in name) {\n if (hasOwn.call(name, key)) {\n URI.removeQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (value !== undefined) {\n if (getType(value) === 'RegExp') {\n if (!isArray(data[name]) && value.test(data[name])) {\n data[name] = undefined;\n } else {\n data[name] = filterArrayValues(data[name], value);\n }\n } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n data[name] = undefined;\n } else if (isArray(data[name])) {\n data[name] = filterArrayValues(data[name], value);\n }\n } else {\n data[name] = undefined;\n }\n } else {\n throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n }\n };\n URI.hasQuery = function(data, name, value, withinArray) {\n switch (getType(name)) {\n case 'String':\n // Nothing to do here\n break;\n\n case 'RegExp':\n for (var key in data) {\n if (hasOwn.call(data, key)) {\n if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) {\n return true;\n }\n }\n }\n\n return false;\n\n case 'Object':\n for (var _key in name) {\n if (hasOwn.call(name, _key)) {\n if (!URI.hasQuery(data, _key, name[_key])) {\n return false;\n }\n }\n }\n\n return true;\n\n default:\n throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter');\n }\n\n switch (getType(value)) {\n case 'Undefined':\n // true if exists (but may be empty)\n return name in data; // data[name] !== undefined;\n\n case 'Boolean':\n // true if exists and non-empty\n var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n return value === _booly;\n\n case 'Function':\n // allow complex comparison\n return !!value(data[name], name, data);\n\n case 'Array':\n if (!isArray(data[name])) {\n return false;\n }\n\n var op = withinArray ? arrayContains : arraysEqual;\n return op(data[name], value);\n\n case 'RegExp':\n if (!isArray(data[name])) {\n return Boolean(data[name] && data[name].match(value));\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n case 'Number':\n value = String(value);\n /* falls through */\n case 'String':\n if (!isArray(data[name])) {\n return data[name] === value;\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n default:\n throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n }\n };\n\n\n URI.joinPaths = function() {\n var input = [];\n var segments = [];\n var nonEmptySegments = 0;\n\n for (var i = 0; i < arguments.length; i++) {\n var url = new URI(arguments[i]);\n input.push(url);\n var _segments = url.segment();\n for (var s = 0; s < _segments.length; s++) {\n if (typeof _segments[s] === 'string') {\n segments.push(_segments[s]);\n }\n\n if (_segments[s]) {\n nonEmptySegments++;\n }\n }\n }\n\n if (!segments.length || !nonEmptySegments) {\n return new URI('');\n }\n\n var uri = new URI('').segment(segments);\n\n if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') {\n uri.path('/' + uri.path());\n }\n\n return uri.normalize();\n };\n\n URI.commonPath = function(one, two) {\n var length = Math.min(one.length, two.length);\n var pos;\n\n // find first non-matching character\n for (pos = 0; pos < length; pos++) {\n if (one.charAt(pos) !== two.charAt(pos)) {\n pos--;\n break;\n }\n }\n\n if (pos < 1) {\n return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n }\n\n // revert to last /\n if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n pos = one.substring(0, pos).lastIndexOf('/');\n }\n\n return one.substring(0, pos + 1);\n };\n\n URI.withinString = function(string, callback, options) {\n options || (options = {});\n var _start = options.start || URI.findUri.start;\n var _end = options.end || URI.findUri.end;\n var _trim = options.trim || URI.findUri.trim;\n var _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n\n _start.lastIndex = 0;\n while (true) {\n var match = _start.exec(string);\n if (!match) {\n break;\n }\n\n var start = match.index;\n if (options.ignoreHtml) {\n // attribut(e=[\"']?$)\n var attributeOpen = string.slice(Math.max(start - 3, 0), start);\n if (attributeOpen && _attributeOpen.test(attributeOpen)) {\n continue;\n }\n }\n\n var end = start + string.slice(start).search(_end);\n var slice = string.slice(start, end).replace(_trim, '');\n if (options.ignore && options.ignore.test(slice)) {\n continue;\n }\n\n end = start + slice.length;\n var result = callback(slice, start, end, string);\n string = string.slice(0, start) + result + string.slice(end);\n _start.lastIndex = start + result.length;\n }\n\n _start.lastIndex = 0;\n return string;\n };\n\n URI.ensureValidHostname = function(v) {\n // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n // they are not part of DNS and therefore ignored by URI.js\n\n if (v.match(URI.invalid_hostname_characters)) {\n // test punycode\n if (!punycode) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-] and Punycode.js is not available');\n }\n\n if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n }\n };\n\n // noConflict\n URI.noConflict = function(removeAll) {\n if (removeAll) {\n var unconflicted = {\n URI: this.noConflict()\n };\n\n if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n unconflicted.URITemplate = root.URITemplate.noConflict();\n }\n\n if (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n unconflicted.IPv6 = root.IPv6.noConflict();\n }\n\n if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n }\n\n return unconflicted;\n } else if (root.URI === this) {\n root.URI = _URI;\n }\n\n return this;\n };\n\n p.build = function(deferBuild) {\n if (deferBuild === true) {\n this._deferred_build = true;\n } else if (deferBuild === undefined || this._deferred_build) {\n this._string = URI.build(this._parts);\n this._deferred_build = false;\n }\n\n return this;\n };\n\n p.clone = function() {\n return new URI(this);\n };\n\n p.valueOf = p.toString = function() {\n return this.build(false)._string;\n };\n\n\n function generateSimpleAccessor(_part){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n this._parts[_part] = v || null;\n this.build(!build);\n return this;\n }\n };\n }\n\n function generatePrefixAccessor(_part, _key){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n if (v !== null) {\n v = v + '';\n if (v.charAt(0) === _key) {\n v = v.substring(1);\n }\n }\n\n this._parts[_part] = v;\n this.build(!build);\n return this;\n }\n };\n }\n\n p.protocol = generateSimpleAccessor('protocol');\n p.username = generateSimpleAccessor('username');\n p.password = generateSimpleAccessor('password');\n p.hostname = generateSimpleAccessor('hostname');\n p.port = generateSimpleAccessor('port');\n p.query = generatePrefixAccessor('query', '?');\n p.fragment = generatePrefixAccessor('fragment', '#');\n\n p.search = function(v, build) {\n var t = this.query(v, build);\n return typeof t === 'string' && t.length ? ('?' + t) : t;\n };\n p.hash = function(v, build) {\n var t = this.fragment(v, build);\n return typeof t === 'string' && t.length ? ('#' + t) : t;\n };\n\n p.pathname = function(v, build) {\n if (v === undefined || v === true) {\n var res = this._parts.path || (this._parts.hostname ? '/' : '');\n return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n } else {\n if (this._parts.urn) {\n this._parts.path = v ? URI.recodeUrnPath(v) : '';\n } else {\n this._parts.path = v ? URI.recodePath(v) : '/';\n }\n this.build(!build);\n return this;\n }\n };\n p.path = p.pathname;\n p.href = function(href, build) {\n var key;\n\n if (href === undefined) {\n return this.toString();\n }\n\n this._string = '';\n this._parts = URI._parts();\n\n var _URI = href instanceof URI;\n var _object = typeof href === 'object' && (href.hostname || href.path || href.pathname);\n if (href.nodeName) {\n var attribute = URI.getDomAttribute(href);\n href = href[attribute] || '';\n _object = false;\n }\n\n // window.location is reported to be an object, but it's not the sort\n // of object we're looking for:\n // * location.protocol ends with a colon\n // * location.query != object.search\n // * location.hash != object.fragment\n // simply serializing the unknown object should do the trick\n // (for location, not for everything...)\n if (!_URI && _object && href.pathname !== undefined) {\n href = href.toString();\n }\n\n if (typeof href === 'string' || href instanceof String) {\n this._parts = URI.parse(String(href), this._parts);\n } else if (_URI || _object) {\n var src = _URI ? href._parts : href;\n for (key in src) {\n if (hasOwn.call(this._parts, key)) {\n this._parts[key] = src[key];\n }\n }\n } else {\n throw new TypeError('invalid input');\n }\n\n this.build(!build);\n return this;\n };\n\n // identification accessors\n p.is = function(what) {\n var ip = false;\n var ip4 = false;\n var ip6 = false;\n var name = false;\n var sld = false;\n var idn = false;\n var punycode = false;\n var relative = !this._parts.urn;\n\n if (this._parts.hostname) {\n relative = false;\n ip4 = URI.ip4_expression.test(this._parts.hostname);\n ip6 = URI.ip6_expression.test(this._parts.hostname);\n ip = ip4 || ip6;\n name = !ip;\n sld = name && SLD && SLD.has(this._parts.hostname);\n idn = name && URI.idn_expression.test(this._parts.hostname);\n punycode = name && URI.punycode_expression.test(this._parts.hostname);\n }\n\n switch (what.toLowerCase()) {\n case 'relative':\n return relative;\n\n case 'absolute':\n return !relative;\n\n // hostname identification\n case 'domain':\n case 'name':\n return name;\n\n case 'sld':\n return sld;\n\n case 'ip':\n return ip;\n\n case 'ip4':\n case 'ipv4':\n case 'inet4':\n return ip4;\n\n case 'ip6':\n case 'ipv6':\n case 'inet6':\n return ip6;\n\n case 'idn':\n return idn;\n\n case 'url':\n return !this._parts.urn;\n\n case 'urn':\n return !!this._parts.urn;\n\n case 'punycode':\n return punycode;\n }\n\n return null;\n };\n\n // component specific input validation\n var _protocol = p.protocol;\n var _port = p.port;\n var _hostname = p.hostname;\n\n p.protocol = function(v, build) {\n if (v !== undefined) {\n if (v) {\n // accept trailing ://\n v = v.replace(/:(\\/\\/)?$/, '');\n\n if (!v.match(URI.protocol_expression)) {\n throw new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n }\n }\n }\n return _protocol.call(this, v, build);\n };\n p.scheme = p.protocol;\n p.port = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n if (v === 0) {\n v = null;\n }\n\n if (v) {\n v += '';\n if (v.charAt(0) === ':') {\n v = v.substring(1);\n }\n\n if (v.match(/[^0-9]/)) {\n throw new TypeError('Port \"' + v + '\" contains characters other than [0-9]');\n }\n }\n }\n return _port.call(this, v, build);\n };\n p.hostname = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n var x = {};\n var res = URI.parseHost(v, x);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n v = x.hostname;\n }\n return _hostname.call(this, v, build);\n };\n\n // compound accessors\n p.origin = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var protocol = this.protocol();\n var authority = this.authority();\n if (!authority) {\n return '';\n }\n\n return (protocol ? protocol + '://' : '') + this.authority();\n } else {\n var origin = URI(v);\n this\n .protocol(origin.protocol())\n .authority(origin.authority())\n .build(!build);\n return this;\n }\n };\n p.host = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildHost(this._parts) : '';\n } else {\n var res = URI.parseHost(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.authority = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n } else {\n var res = URI.parseAuthority(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.userinfo = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var t = URI.buildUserinfo(this._parts);\n return t ? t.substring(0, t.length -1) : t;\n } else {\n if (v[v.length-1] !== '@') {\n v += '@';\n }\n\n URI.parseUserinfo(v, this._parts);\n this.build(!build);\n return this;\n }\n };\n p.resource = function(v, build) {\n var parts;\n\n if (v === undefined) {\n return this.path() + this.search() + this.hash();\n }\n\n parts = URI.parse(v);\n this._parts.path = parts.path;\n this._parts.query = parts.query;\n this._parts.fragment = parts.fragment;\n this.build(!build);\n return this;\n };\n\n // fraction accessors\n p.subdomain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n // convenience, return \"www\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // grab domain and add another segment\n var end = this._parts.hostname.length - this.domain().length - 1;\n return this._parts.hostname.substring(0, end) || '';\n } else {\n var e = this._parts.hostname.length - this.domain().length;\n var sub = this._parts.hostname.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(sub));\n\n if (v && v.charAt(v.length - 1) !== '.') {\n v += '.';\n }\n\n if (v) {\n URI.ensureValidHostname(v);\n }\n\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.domain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // convenience, return \"example.org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // if hostname consists of 1 or 2 segments, it must be the domain\n var t = this._parts.hostname.match(/\\./g);\n if (t && t.length < 2) {\n return this._parts.hostname;\n }\n\n // grab tld and add another segment\n var end = this._parts.hostname.length - this.tld(build).length - 1;\n end = this._parts.hostname.lastIndexOf('.', end -1) + 1;\n return this._parts.hostname.substring(end) || '';\n } else {\n if (!v) {\n throw new TypeError('cannot set domain empty');\n }\n\n URI.ensureValidHostname(v);\n\n if (!this._parts.hostname || this.is('IP')) {\n this._parts.hostname = v;\n } else {\n var replace = new RegExp(escapeRegEx(this.domain()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.tld = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // return \"org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n var pos = this._parts.hostname.lastIndexOf('.');\n var tld = this._parts.hostname.substring(pos + 1);\n\n if (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n return SLD.get(this._parts.hostname) || tld;\n }\n\n return tld;\n } else {\n var replace;\n\n if (!v) {\n throw new TypeError('cannot set TLD empty');\n } else if (v.match(/[^a-zA-Z0-9-]/)) {\n if (SLD && SLD.is(v)) {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n } else {\n throw new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n }\n } else if (!this._parts.hostname || this.is('IP')) {\n throw new ReferenceError('cannot set TLD on non-domain host');\n } else {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.directory = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path && !this._parts.hostname) {\n return '';\n }\n\n if (this._parts.path === '/') {\n return '/';\n }\n\n var end = this._parts.path.length - this.filename().length - 1;\n var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n\n return v ? URI.decodePath(res) : res;\n\n } else {\n var e = this._parts.path.length - this.filename().length;\n var directory = this._parts.path.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(directory));\n\n // fully qualifier directories begin with a slash\n if (!this.is('relative')) {\n if (!v) {\n v = '/';\n }\n\n if (v.charAt(0) !== '/') {\n v = '/' + v;\n }\n }\n\n // directories always end with a slash\n if (v && v.charAt(v.length - 1) !== '/') {\n v += '/';\n }\n\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.filename = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var pos = this._parts.path.lastIndexOf('/');\n var res = this._parts.path.substring(pos+1);\n\n return v ? URI.decodePathSegment(res) : res;\n } else {\n var mutatedDirectory = false;\n\n if (v.charAt(0) === '/') {\n v = v.substring(1);\n }\n\n if (v.match(/\\.?\\//)) {\n mutatedDirectory = true;\n }\n\n var replace = new RegExp(escapeRegEx(this.filename()) + '$');\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n\n if (mutatedDirectory) {\n this.normalizePath(build);\n } else {\n this.build(!build);\n }\n\n return this;\n }\n };\n p.suffix = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var filename = this.filename();\n var pos = filename.lastIndexOf('.');\n var s, res;\n\n if (pos === -1) {\n return '';\n }\n\n // suffix may only contain alnum characters (yup, I made this up.)\n s = filename.substring(pos+1);\n res = (/^[a-z0-9%]+$/i).test(s) ? s : '';\n return v ? URI.decodePathSegment(res) : res;\n } else {\n if (v.charAt(0) === '.') {\n v = v.substring(1);\n }\n\n var suffix = this.suffix();\n var replace;\n\n if (!suffix) {\n if (!v) {\n return this;\n }\n\n this._parts.path += '.' + URI.recodePath(v);\n } else if (!v) {\n replace = new RegExp(escapeRegEx('.' + suffix) + '$');\n } else {\n replace = new RegExp(escapeRegEx(suffix) + '$');\n }\n\n if (replace) {\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.segment = function(segment, v, build) {\n var separator = this._parts.urn ? ':' : '/';\n var path = this.path();\n var absolute = path.substring(0, 1) === '/';\n var segments = path.split(separator);\n\n if (segment !== undefined && typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (segment !== undefined && typeof segment !== 'number') {\n throw new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n }\n\n if (absolute) {\n segments.shift();\n }\n\n if (segment < 0) {\n // allow negative indexes to address from the end\n segment = Math.max(segments.length + segment, 0);\n }\n\n if (v === undefined) {\n /*jshint laxbreak: true */\n return segment === undefined\n ? segments\n : segments[segment];\n /*jshint laxbreak: false */\n } else if (segment === null || segments[segment] === undefined) {\n if (isArray(v)) {\n segments = [];\n // collapse empty elements within array\n for (var i=0, l=v.length; i < l; i++) {\n if (!v[i].length && (!segments.length || !segments[segments.length -1].length)) {\n continue;\n }\n\n if (segments.length && !segments[segments.length -1].length) {\n segments.pop();\n }\n\n segments.push(trimSlashes(v[i]));\n }\n } else if (v || typeof v === 'string') {\n v = trimSlashes(v);\n if (segments[segments.length -1] === '') {\n // empty trailing elements have to be overwritten\n // to prevent results such as /foo//bar\n segments[segments.length -1] = v;\n } else {\n segments.push(v);\n }\n }\n } else {\n if (v) {\n segments[segment] = trimSlashes(v);\n } else {\n segments.splice(segment, 1);\n }\n }\n\n if (absolute) {\n segments.unshift('');\n }\n\n return this.path(segments.join(separator), build);\n };\n p.segmentCoded = function(segment, v, build) {\n var segments, i, l;\n\n if (typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (v === undefined) {\n segments = this.segment(segment, v, build);\n if (!isArray(segments)) {\n segments = segments !== undefined ? URI.decode(segments) : undefined;\n } else {\n for (i = 0, l = segments.length; i < l; i++) {\n segments[i] = URI.decode(segments[i]);\n }\n }\n\n return segments;\n }\n\n if (!isArray(v)) {\n v = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v;\n } else {\n for (i = 0, l = v.length; i < l; i++) {\n v[i] = URI.encode(v[i]);\n }\n }\n\n return this.segment(segment, v, build);\n };\n\n // mutating query string\n var q = p.query;\n p.query = function(v, build) {\n if (v === true) {\n return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n } else if (typeof v === 'function') {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n var result = v.call(this, data);\n this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else if (v !== undefined && typeof v !== 'string') {\n this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else {\n return q.call(this, v, build);\n }\n };\n p.setQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\n if (typeof name === 'string' || name instanceof String) {\n data[name] = value !== undefined ? value : null;\n } else if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n data[key] = name[key];\n }\n }\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.addQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.addQuery(data, name, value === undefined ? null : value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.removeQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.removeQuery(data, name, value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.hasQuery = function(name, value, withinArray) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n return URI.hasQuery(data, name, value, withinArray);\n };\n p.setSearch = p.setQuery;\n p.addSearch = p.addQuery;\n p.removeSearch = p.removeQuery;\n p.hasSearch = p.hasQuery;\n\n // sanitizing URLs\n p.normalize = function() {\n if (this._parts.urn) {\n return this\n .normalizeProtocol(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n }\n\n return this\n .normalizeProtocol(false)\n .normalizeHostname(false)\n .normalizePort(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n };\n p.normalizeProtocol = function(build) {\n if (typeof this._parts.protocol === 'string') {\n this._parts.protocol = this._parts.protocol.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeHostname = function(build) {\n if (this._parts.hostname) {\n if (this.is('IDN') && punycode) {\n this._parts.hostname = punycode.toASCII(this._parts.hostname);\n } else if (this.is('IPv6') && IPv6) {\n this._parts.hostname = IPv6.best(this._parts.hostname);\n }\n\n this._parts.hostname = this._parts.hostname.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePort = function(build) {\n // remove port of it's the protocol's default\n if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n this._parts.port = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePath = function(build) {\n var _path = this._parts.path;\n if (!_path) {\n return this;\n }\n\n if (this._parts.urn) {\n this._parts.path = URI.recodeUrnPath(this._parts.path);\n this.build(!build);\n return this;\n }\n\n if (this._parts.path === '/') {\n return this;\n }\n\n _path = URI.recodePath(_path);\n\n var _was_relative;\n var _leadingParents = '';\n var _parent, _pos;\n\n // handle relative paths\n if (_path.charAt(0) !== '/') {\n _was_relative = true;\n _path = '/' + _path;\n }\n\n // handle relative files (as opposed to directories)\n if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n _path += '/';\n }\n\n // resolve simples\n _path = _path\n .replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/')\n .replace(/\\/{2,}/g, '/');\n\n // remember leading parents\n if (_was_relative) {\n _leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n if (_leadingParents) {\n _leadingParents = _leadingParents[0];\n }\n }\n\n // resolve parents\n while (true) {\n _parent = _path.search(/\\/\\.\\.(\\/|$)/);\n if (_parent === -1) {\n // no more ../ to resolve\n break;\n } else if (_parent === 0) {\n // top level cannot be relative, skip it\n _path = _path.substring(3);\n continue;\n }\n\n _pos = _path.substring(0, _parent).lastIndexOf('/');\n if (_pos === -1) {\n _pos = _parent;\n }\n _path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n }\n\n // revert to relative\n if (_was_relative && this.is('relative')) {\n _path = _leadingParents + _path.substring(1);\n }\n\n this._parts.path = _path;\n this.build(!build);\n return this;\n };\n p.normalizePathname = p.normalizePath;\n p.normalizeQuery = function(build) {\n if (typeof this._parts.query === 'string') {\n if (!this._parts.query.length) {\n this._parts.query = null;\n } else {\n this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n }\n\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeFragment = function(build) {\n if (!this._parts.fragment) {\n this._parts.fragment = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeSearch = p.normalizeQuery;\n p.normalizeHash = p.normalizeFragment;\n\n p.iso8859 = function() {\n // expect unicode input, iso8859 output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = escape;\n URI.decode = decodeURIComponent;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.unicode = function() {\n // expect iso8859 input, unicode output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = strictEncodeURIComponent;\n URI.decode = unescape;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.readable = function() {\n var uri = this.clone();\n // removing username, password, because they shouldn't be displayed according to RFC 3986\n uri.username('').password('').normalize();\n var t = '';\n if (uri._parts.protocol) {\n t += uri._parts.protocol + '://';\n }\n\n if (uri._parts.hostname) {\n if (uri.is('punycode') && punycode) {\n t += punycode.toUnicode(uri._parts.hostname);\n if (uri._parts.port) {\n t += ':' + uri._parts.port;\n }\n } else {\n t += uri.host();\n }\n }\n\n if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n t += '/';\n }\n\n t += uri.path(true);\n if (uri._parts.query) {\n var q = '';\n for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n var kv = (qp[i] || '').split('=');\n q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n\n if (kv[1] !== undefined) {\n q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n }\n }\n t += '?' + q.substring(1);\n }\n\n t += URI.decodeQuery(uri.hash(), true);\n return t;\n };\n\n // resolving relative and absolute URLs\n p.absoluteTo = function(base) {\n var resolved = this.clone();\n var properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n var basedir, i, p;\n\n if (this._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n if (!(base instanceof URI)) {\n base = new URI(base);\n }\n\n if (!resolved._parts.protocol) {\n resolved._parts.protocol = base._parts.protocol;\n }\n\n if (this._parts.hostname) {\n return resolved;\n }\n\n for (i = 0; (p = properties[i]); i++) {\n resolved._parts[p] = base._parts[p];\n }\n\n if (!resolved._parts.path) {\n resolved._parts.path = base._parts.path;\n if (!resolved._parts.query) {\n resolved._parts.query = base._parts.query;\n }\n } else if (resolved._parts.path.substring(-2) === '..') {\n resolved._parts.path += '/';\n }\n\n if (resolved.path().charAt(0) !== '/') {\n basedir = base.directory();\n basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n resolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path;\n resolved.normalizePath();\n }\n\n resolved.build();\n return resolved;\n };\n p.relativeTo = function(base) {\n var relative = this.clone().normalize();\n var relativeParts, baseParts, common, relativePath, basePath;\n\n if (relative._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n base = new URI(base).normalize();\n relativeParts = relative._parts;\n baseParts = base._parts;\n relativePath = relative.path();\n basePath = base.path();\n\n if (relativePath.charAt(0) !== '/') {\n throw new Error('URI is already relative');\n }\n\n if (basePath.charAt(0) !== '/') {\n throw new Error('Cannot calculate a URI relative to another relative URI');\n }\n\n if (relativeParts.protocol === baseParts.protocol) {\n relativeParts.protocol = null;\n }\n\n if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n return relative.build();\n }\n\n if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n return relative.build();\n }\n\n if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n relativeParts.hostname = null;\n relativeParts.port = null;\n } else {\n return relative.build();\n }\n\n if (relativePath === basePath) {\n relativeParts.path = '';\n return relative.build();\n }\n\n // determine common sub path\n common = URI.commonPath(relativePath, basePath);\n\n // If the paths have nothing in common, return a relative URL with the absolute path.\n if (!common) {\n return relative.build();\n }\n\n var parents = baseParts.path\n .substring(common.length)\n .replace(/[^\\/]*$/, '')\n .replace(/.*?\\//g, '../');\n\n relativeParts.path = (parents + relativeParts.path.substring(common.length)) || './';\n\n return relative.build();\n };\n\n // comparing URIs\n p.equals = function(uri) {\n var one = this.clone();\n var two = new URI(uri);\n var one_map = {};\n var two_map = {};\n var checked = {};\n var one_query, two_query, key;\n\n one.normalize();\n two.normalize();\n\n // exact match\n if (one.toString() === two.toString()) {\n return true;\n }\n\n // extract query string\n one_query = one.query();\n two_query = two.query();\n one.query('');\n two.query('');\n\n // definitely not equal if not even non-query parts match\n if (one.toString() !== two.toString()) {\n return false;\n }\n\n // query parameters have the same length, even if they're permuted\n if (one_query.length !== two_query.length) {\n return false;\n }\n\n one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n\n for (key in one_map) {\n if (hasOwn.call(one_map, key)) {\n if (!isArray(one_map[key])) {\n if (one_map[key] !== two_map[key]) {\n return false;\n }\n } else if (!arraysEqual(one_map[key], two_map[key])) {\n return false;\n }\n\n checked[key] = true;\n }\n }\n\n for (key in two_map) {\n if (hasOwn.call(two_map, key)) {\n if (!checked[key]) {\n // two contains a parameter not present in one\n return false;\n }\n }\n }\n\n return true;\n };\n\n // state\n p.duplicateQueryParameters = function(v) {\n this._parts.duplicateQueryParameters = !!v;\n return this;\n };\n\n p.escapeQuerySpace = function(v) {\n this._parts.escapeQuerySpace = !!v;\n return this;\n };\n\n return URI;\n}));\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar Spine = require('./spine');\nvar Locations = require('./locations');\nvar Parser = require('./parser');\nvar Navigation = require('./navigation');\nvar Rendition = require('./rendition');\nvar Unarchive = require('./unarchive');\nvar request = require('./request');\nvar EpubCFI = require('./epubcfi');\n\nfunction Book(_url, options){\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\trequestMethod: this.requestMethod\n\t});\n\n\tcore.extend(this.settings, options);\n\n\n\t// Promises\n\tthis.opening = new RSVP.defer();\n\tthis.opened = this.opening.promise;\n\tthis.isOpen = false;\n\n\tthis.url = undefined;\n\n\tthis.loading = {\n\t\tmanifest: new RSVP.defer(),\n\t\tspine: new RSVP.defer(),\n\t\tmetadata: new RSVP.defer(),\n\t\tcover: new RSVP.defer(),\n\t\tnavigation: new RSVP.defer(),\n\t\tpageList: new RSVP.defer()\n\t};\n\n\tthis.loaded = {\n\t\tmanifest: this.loading.manifest.promise,\n\t\tspine: this.loading.spine.promise,\n\t\tmetadata: this.loading.metadata.promise,\n\t\tcover: this.loading.cover.promise,\n\t\tnavigation: this.loading.navigation.promise,\n\t\tpageList: this.loading.pageList.promise\n\t};\n\n\tthis.ready = RSVP.hash(this.loaded);\n\n\t// Queue for methods used before opening\n\tthis.isRendered = false;\n\t// this._q = core.queue(this);\n\n\tthis.request = this.settings.requestMethod.bind(this);\n\n\tthis.spine = new Spine(this.request);\n\tthis.locations = new Locations(this.spine, this.request);\n\n\tif(_url) {\n\t\tthis.open(_url).catch(function (error) {\n\t\t\tvar err = new Error(\"Cannot load book at \"+ _url );\n\t\t\tconsole.error(err);\n\n\t\t\tthis.trigger(\"loadFailed\", error);\n\t\t}.bind(this));\n\t}\n};\n\nBook.prototype.open = function(_url, options){\n\tvar uri;\n\tvar parse = new Parser();\n\tvar epubPackage;\n\tvar epubContainer;\n\tvar book = this;\n\tvar containerPath = \"META-INF/container.xml\";\n\tvar location;\n\tvar absoluteUri;\n\tvar isArrayBuffer = false;\n\tvar isBase64 = options && options.base64;\n\n\tif(!_url) {\n\t\tthis.opening.resolve(this);\n\t\treturn this.opened;\n\t}\n\n\t// Reuse parsed url or create a new uri object\n\t// if(typeof(_url) === \"object\") {\n\t// uri = _url;\n\t// } else {\n\t// uri = core.uri(_url);\n\t// }\n\tif (_url instanceof ArrayBuffer || isBase64) {\n\t\tisArrayBuffer = true;\n\t\tthis.url = '/';\n\t} else {\n\t\turi = URI(_url);\n\t}\n\n\tif (window && window.location && uri) {\n\t\tabsoluteUri = uri.absoluteTo(window.location.href);\n\t\tthis.url = absoluteUri.toString();\n\t} else if (window && window.location) {\n\t\tthis.url = window.location.href;\n\t} else {\n\t\tthis.url = _url;\n\t}\n\n\t// Find path to the Container\n\tif(uri && uri.suffix() === \"opf\") {\n\t\t// Direct link to package, no container\n\t\tthis.packageUrl = _url;\n\t\tthis.containerUrl = '';\n\n\t\tif(uri.origin()) {\n\t\t\tthis.baseUrl = uri.origin() + \"/\" + uri.directory() + \"/\";\n\t\t} else if(absoluteUri){\n\t\t\tthis.baseUrl = absoluteUri.origin();\n\t\t\tthis.baseUrl += absoluteUri.directory() + \"/\";\n\t\t} else {\n\t\t\tthis.baseUrl = uri.directory() + \"/\";\n\t\t}\n\n\t\tepubPackage = this.request(this.packageUrl)\n\t\t\t.catch(function(error) {\n\t\t\t\tbook.opening.reject(error);\n\t\t\t});\n\n\t} else if(isArrayBuffer || isBase64 || this.isArchivedUrl(uri)) {\n\t\t// Book is archived\n\t\tthis.url = '/';\n\t\tthis.containerUrl = URI(containerPath).absoluteTo(this.url).toString();\n\n\t\tepubContainer = this.unarchive(_url, isBase64).\n\t\t\tthen(function() {\n\t\t\t\treturn this.request(this.containerUrl);\n\t\t\t}.bind(this))\n\t\t\t.catch(function(error) {\n\t\t\t\tbook.opening.reject(error);\n\t\t\t});\n\t}\n\t// Find the path to the Package from the container\n\telse if (!uri.suffix()) {\n\n\t\tthis.containerUrl = this.url + containerPath;\n\n\t\tepubContainer = this.request(this.containerUrl)\n\t\t\t.catch(function(error) {\n\t\t\t\t// handle errors in loading container\n\t\t\t\tbook.opening.reject(error);\n\t\t\t});\n\t}\n\n\tif (epubContainer) {\n\t\tepubPackage = epubContainer.\n\t\t\tthen(function(containerXml){\n\t\t\t\treturn parse.container(containerXml); // Container has path to content\n\t\t\t}).\n\t\t\tthen(function(paths){\n\t\t\t\tvar packageUri = URI(paths.packagePath);\n\t\t\t\tvar absPackageUri = packageUri.absoluteTo(book.url);\n\t\t\t\tvar absWindowUri;\n\n\t\t\t\tbook.packageUrl = absPackageUri.toString();\n\t\t\t\tbook.encoding = paths.encoding;\n\n\t\t\t\t// Set Url relative to the content\n\t\t\t\tif(absPackageUri.origin()) {\n\t\t\t\t\tbook.baseUrl = absPackageUri.origin() + absPackageUri.directory() + \"/\";\n\t\t\t\t} else {\n\t\t\t\t\tif(packageUri.directory()) {\n\t\t\t\t\t\tbook.baseUrl = \"/\" + packageUri.directory() + \"/\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbook.baseUrl = \"/\"\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn book.request(book.packageUrl);\n\t\t\t}).catch(function(error) {\n\t\t\t\t// handle errors in either of the two requests\n\t\t\t\tbook.opening.reject(error);\n\t\t\t});\n\t}\n\n\tepubPackage.then(function(packageXml) {\n\n\t\tif (!packageXml) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get package information from epub opf\n\t\tbook.unpack(packageXml);\n\n\t\t// Resolve promises\n\t\tbook.loading.manifest.resolve(book.package.manifest);\n\t\tbook.loading.metadata.resolve(book.package.metadata);\n\t\tbook.loading.spine.resolve(book.spine);\n\t\tbook.loading.cover.resolve(book.cover);\n\n\t\tbook.isOpen = true;\n\n\t\t// Clear queue of any waiting book request\n\n\t\t// Resolve book opened promise\n\t\tbook.opening.resolve(book);\n\n\t}).catch(function(error) {\n\t\t// handle errors in parsing the book\n\t\t// console.error(error.message, error.stack);\n\t\tbook.opening.reject(error);\n\t});\n\n\treturn this.opened;\n};\n\nBook.prototype.unpack = function(packageXml){\n\tvar book = this,\n\t\t\tparse = new Parser();\n\n\tbook.package = parse.packageContents(packageXml); // Extract info from contents\n\tif(!book.package) {\n\t\treturn;\n\t}\n\n\tbook.package.baseUrl = book.baseUrl; // Provides a url base for resolving paths\n\n\tthis.spine.load(book.package);\n\n\tbook.navigation = new Navigation(book.package, this.request);\n\tbook.navigation.load().then(function(toc){\n\t\tbook.toc = toc;\n\t\tbook.loading.navigation.resolve(book.toc);\n\t});\n\n\t// //-- Set Global Layout setting based on metadata\n\t// MOVE TO RENDER\n\t// book.globalLayoutProperties = book.parseLayoutProperties(book.package.metadata);\n\n\tbook.cover = URI(book.package.coverPath).absoluteTo(book.baseUrl).toString();\n};\n\n// Alias for book.spine.get\nBook.prototype.section = function(target) {\n\treturn this.spine.get(target);\n};\n\n// Sugar to render a book\nBook.prototype.renderTo = function(element, options) {\n\t// var renderMethod = (options && options.method) ?\n\t// options.method :\n\t// \"single\";\n\n\tthis.rendition = new Rendition(this, options);\n\tthis.rendition.attachTo(element);\n\n\treturn this.rendition;\n};\n\nBook.prototype.requestMethod = function(_url) {\n\t// Switch request methods\n\tif(this.unarchived) {\n\t\treturn this.unarchived.request(_url);\n\t} else {\n\t\treturn request(_url, null, this.requestCredentials, this.requestHeaders);\n\t}\n\n};\n\nBook.prototype.setRequestCredentials = function(_credentials) {\n\tthis.requestCredentials = _credentials;\n};\n\nBook.prototype.setRequestHeaders = function(_headers) {\n\tthis.requestHeaders = _headers;\n};\n\nBook.prototype.unarchive = function(bookUrl, isBase64){\n\tthis.unarchived = new Unarchive();\n\treturn this.unarchived.open(bookUrl, isBase64);\n};\n\n//-- Checks if url has a .epub or .zip extension, or is ArrayBuffer (of zip/epub)\nBook.prototype.isArchivedUrl = function(bookUrl){\n\tvar uri;\n\tvar extension;\n\n\tif (bookUrl instanceof ArrayBuffer) {\n\t\treturn true;\n\t}\n\n\t// Reuse parsed url or create a new uri object\n\t// if(typeof(bookUrl) === \"object\") {\n\t// uri = bookUrl;\n\t// } else {\n\t// uri = core.uri(bookUrl);\n\t// }\n\turi = URI(bookUrl);\n\textension = uri.suffix();\n\n\tif(extension && (extension == \"epub\" || extension == \"zip\")){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n//-- Returns the cover\nBook.prototype.coverUrl = function(){\n\tvar retrieved = this.loaded.cover.\n\t\tthen(function(url) {\n\t\t\tif(this.unarchived) {\n\t\t\t\treturn this.unarchived.createUrl(this.cover);\n\t\t\t}else{\n\t\t\t\treturn this.cover;\n\t\t\t}\n\t\t}.bind(this));\n\n\n\n\treturn retrieved;\n};\n\nBook.prototype.range = function(cfiRange) {\n\tvar cfi = new EpubCFI(cfiRange);\n\tvar item = this.spine.get(cfi.spinePos);\n\n\treturn item.load().then(function (contents) {\n\t\tvar range = cfi.toRange(item.document);\n\t\treturn range;\n\t})\n};\n\nmodule.exports = Book;\n\n//-- Enable binding events to book\nRSVP.EventTarget.mixin(Book.prototype);\n\n//-- Handle RSVP Errors\nRSVP.on('error', function(event) {\n\tconsole.error(event);\n});\n\nRSVP.configure('instrument', false); //-- true | will logging out all RSVP rejections\n// RSVP.on('created', listener);\n// RSVP.on('chained', listener);\n// RSVP.on('fulfilled', listener);\nRSVP.on('rejected', function(event){\n\tconsole.error(event.detail.message, event.detail.stack);\n});\n","var RSVP = require('rsvp');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Mapping = require('./mapping');\n\n\nfunction Contents(doc, content, cfiBase) {\n\t// Blank Cfi for Parsing\n\tthis.epubcfi = new EpubCFI();\n\n\tthis.document = doc;\n\tthis.documentElement = this.document.documentElement;\n\tthis.content = content || this.document.body;\n\tthis.window = this.document.defaultView;\n\t// Dom events to listen for\n\tthis.listenedEvents = [\"keydown\", \"keyup\", \"keypressed\", \"mouseup\", \"mousedown\", \"click\", \"touchend\", \"touchstart\"];\n\n\tthis._size = {\n\t\twidth: 0,\n\t\theight: 0\n\t}\n\n\tthis.cfiBase = cfiBase || \"\";\n\n\tthis.listeners();\n};\n\nContents.prototype.width = function(w) {\n\t// var frame = this.documentElement;\n\tvar frame = this.content;\n\n\tif (w && core.isNumber(w)) {\n\t\tw = w + \"px\";\n\t}\n\n\tif (w) {\n\t\tframe.style.width = w;\n\t\t// this.content.style.width = w;\n\t}\n\n\treturn this.window.getComputedStyle(frame)['width'];\n\n\n};\n\nContents.prototype.height = function(h) {\n\t// var frame = this.documentElement;\n\tvar frame = this.content;\n\n\tif (h && core.isNumber(h)) {\n\t\th = h + \"px\";\n\t}\n\n\tif (h) {\n\t\tframe.style.height = h;\n\t\t// this.content.style.height = h;\n\t}\n\n\treturn this.window.getComputedStyle(frame)['height'];\n\n};\n\nContents.prototype.contentWidth = function(w) {\n\n\tvar content = this.content || this.document.body;\n\n\tif (w && core.isNumber(w)) {\n\t\tw = w + \"px\";\n\t}\n\n\tif (w) {\n\t\tcontent.style.width = w;\n\t}\n\n\treturn this.window.getComputedStyle(content)['width'];\n\n\n};\n\nContents.prototype.contentHeight = function(h) {\n\n\tvar content = this.content || this.document.body;\n\n\tif (h && core.isNumber(h)) {\n\t\th = h + \"px\";\n\t}\n\n\tif (h) {\n\t\tcontent.style.height = h;\n\t}\n\n\treturn this.window.getComputedStyle(content)['height'];\n\n};\n\nContents.prototype.textWidth = function() {\n\tvar width;\n\tvar range = this.document.createRange();\n\tvar content = this.content || this.document.body;\n\n\t// Select the contents of frame\n\trange.selectNodeContents(content);\n\n\t// get the width of the text content\n\twidth = range.getBoundingClientRect().width;\n\n\treturn width;\n\n};\n\nContents.prototype.textHeight = function() {\n\tvar height;\n\tvar range = this.document.createRange();\n\tvar content = this.content || this.document.body;\n\n\trange.selectNodeContents(content);\n\n\theight = range.getBoundingClientRect().height;\n\n\treturn height;\n};\n\nContents.prototype.scrollWidth = function() {\n\tvar width = this.documentElement.scrollWidth;\n\n\treturn width;\n};\n\nContents.prototype.scrollHeight = function() {\n\tvar height = this.documentElement.scrollHeight;\n\n\treturn height;\n};\n\nContents.prototype.overflow = function(overflow) {\n\n\tif (overflow) {\n\t\tthis.documentElement.style.overflow = overflow;\n\t}\n\n\treturn this.window.getComputedStyle(this.documentElement)['overflow'];\n};\n\nContents.prototype.overflowX = function(overflow) {\n\n\tif (overflow) {\n\t\tthis.documentElement.style.overflowX = overflow;\n\t}\n\n\treturn this.window.getComputedStyle(this.documentElement)['overflowX'];\n};\n\nContents.prototype.overflowY = function(overflow) {\n\n\tif (overflow) {\n\t\tthis.documentElement.style.overflowY = overflow;\n\t}\n\n\treturn this.window.getComputedStyle(this.documentElement)['overflowY'];\n};\n\nContents.prototype.css = function(property, value) {\n\tvar content = this.content || this.document.body;\n\n\tif (value) {\n\t\tcontent.style[property] = value;\n\t}\n\n\treturn this.window.getComputedStyle(content)[property];\n};\n\nContents.prototype.viewport = function(options) {\n\tvar width, height, scale, scalable;\n\tvar $viewport = this.document.querySelector(\"meta[name='viewport']\");\n\tvar newContent = '';\n\n\t/**\n\t* check for the viewport size\n\t* \n\t*/\n\tif($viewport && $viewport.hasAttribute(\"content\")) {\n\t\tcontent = $viewport.getAttribute(\"content\");\n\t\tcontents = content.split(/\\s*,\\s*/);\n\t\tif(contents[0]){\n\t\t\twidth = contents[0].replace(\"width=\", '').trim();\n\t\t}\n\t\tif(contents[1]){\n\t\t\theight = contents[1].replace(\"height=\", '').trim();\n\t\t}\n\t\tif(contents[2]){\n\t\t\tscale = contents[2].replace(\"initial-scale=\", '').trim();\n\t\t}\n\t\tif(contents[3]){\n\t\t\tscalable = contents[3].replace(\"user-scalable=\", '').trim();\n\t\t}\n\t}\n\n\tif (options) {\n\n\t\tnewContent += \"width=\" + (options.width || width);\n\t\tnewContent += \", height=\" + (options.height || height);\n\t\tif (options.scale || scale) {\n\t\t\tnewContent += \", initial-scale=\" + (options.scale || scale);\n\t\t}\n\t\tif (options.scalable || scalable) {\n\t\t\tnewContent += \", user-scalable=\" + (options.scalable || scalable);\n\t\t}\n\n\t\tif (!$viewport) {\n\t\t\t$viewport = this.document.createElement(\"meta\");\n\t\t\t$viewport.setAttribute(\"name\", \"viewport\");\n\t\t\tthis.document.querySelector('head').appendChild($viewport);\n\t\t}\n\n\t\t$viewport.setAttribute(\"content\", newContent);\n\t}\n\n\n\treturn {\n\t\twidth: parseInt(width),\n\t\theight: parseInt(height)\n\t};\n};\n\n\n// Contents.prototype.layout = function(layoutFunc) {\n//\n// this.iframe.style.display = \"inline-block\";\n//\n// // Reset Body Styles\n// this.content.style.margin = \"0\";\n// //this.document.body.style.display = \"inline-block\";\n// //this.document.documentElement.style.width = \"auto\";\n//\n// if(layoutFunc){\n// layoutFunc(this);\n// }\n//\n// this.onLayout(this);\n//\n// };\n//\n// Contents.prototype.onLayout = function(view) {\n// // stub\n// };\n\nContents.prototype.expand = function() {\n\tthis.trigger(\"expand\");\n};\n\nContents.prototype.listeners = function() {\n\n\tthis.imageLoadListeners();\n\n\tthis.mediaQueryListeners();\n\n\t// this.fontLoadListeners();\n\n\tthis.addEventListeners();\n\n\tthis.addSelectionListeners();\n\n\tthis.resizeListeners();\n\n};\n\nContents.prototype.removeListeners = function() {\n\n\tthis.removeEventListeners();\n\n\tthis.removeSelectionListeners();\n};\n\nContents.prototype.resizeListeners = function() {\n\tvar width, height;\n\t// Test size again\n\tclearTimeout(this.expanding);\n\n\twidth = this.scrollWidth();\n\theight = this.scrollHeight();\n\n\tif (width != this._size.width || height != this._size.height) {\n\n\t\tthis._size = {\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t}\n\n\t\tthis.trigger(\"resize\", this._size);\n\t}\n\n\tthis.expanding = setTimeout(this.resizeListeners.bind(this), 350);\n};\n\n//https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js\nContents.prototype.mediaQueryListeners = function() {\n\t\tvar sheets = this.document.styleSheets;\n\t\tvar mediaChangeHandler = function(m){\n\t\t\tif(m.matches && !this._expanding) {\n\t\t\t\tsetTimeout(this.expand.bind(this), 1);\n\t\t\t\t// this.expand();\n\t\t\t}\n\t\t}.bind(this);\n\n\t\tfor (var i = 0; i < sheets.length; i += 1) {\n\t\t\t\tvar rules = sheets[i].cssRules;\n\t\t\t\tif(!rules) return; // Stylesheets changed\n\t\t\t\tfor (var j = 0; j < rules.length; j += 1) {\n\t\t\t\t\t\t//if (rules[j].constructor === CSSMediaRule) {\n\t\t\t\t\t\tif(rules[j].media){\n\t\t\t\t\t\t\t\tvar mql = this.window.matchMedia(rules[j].media.mediaText);\n\t\t\t\t\t\t\t\tmql.addListener(mediaChangeHandler);\n\t\t\t\t\t\t\t\t//mql.onchange = mediaChangeHandler;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n};\n\nContents.prototype.observe = function(target) {\n\tvar renderer = this;\n\n\t// create an observer instance\n\tvar observer = new MutationObserver(function(mutations) {\n\t\tif(renderer._expanding) {\n\t\t\trenderer.expand();\n\t\t}\n\t\t// mutations.forEach(function(mutation) {\n\t\t// console.log(mutation);\n\t\t// });\n\t});\n\n\t// configuration of the observer:\n\tvar config = { attributes: true, childList: true, characterData: true, subtree: true };\n\n\t// pass in the target node, as well as the observer options\n\tobserver.observe(target, config);\n\n\treturn observer;\n};\n\nContents.prototype.imageLoadListeners = function(target) {\n\tvar images = this.document.querySelectorAll(\"img\");\n\tvar img;\n\tfor (var i = 0; i < images.length; i++) {\n\t\timg = images[i];\n\n\t\tif (typeof img.naturalWidth !== \"undefined\" &&\n\t\t\t\timg.naturalWidth === 0) {\n\t\t\timg.onload = this.expand.bind(this);\n\t\t}\n\t}\n};\n\nContents.prototype.fontLoadListeners = function(target) {\n\tif (!this.document || !this.document.fonts) {\n\t\treturn;\n\t}\n\n\tthis.document.fonts.ready.then(function () {\n\t\tthis.expand();\n\t}.bind(this));\n\n};\n\nContents.prototype.root = function() {\n\tif(!this.document) return null;\n\treturn this.document.documentElement;\n};\n\nContents.prototype.locationOf = function(target, ignoreClass) {\n\tvar position;\n\tvar targetPos = {\"left\": 0, \"top\": 0};\n\n\tif(!this.document) return;\n\n\tif(this.epubcfi.isCfiString(target)) {\n\t\trange = new EpubCFI(target).toRange(this.document, ignoreClass);\n\n\t\tif(range) {\n\t\t\tif (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tposition = range.startContainer.getBoundingClientRect();\n\t\t\t\ttargetPos.left = position.left;\n\t\t\t\ttargetPos.top = position.top;\n\t\t\t} else {\n\t\t\t\tposition = range.getBoundingClientRect();\n\t\t\t\ttargetPos.left = position.left;\n\t\t\t\ttargetPos.top = position.top;\n\t\t\t}\n\t\t}\n\n\t} else if(typeof target === \"string\" &&\n\t\ttarget.indexOf(\"#\") > -1) {\n\n\t\tid = target.substring(target.indexOf(\"#\")+1);\n\t\tel = this.document.getElementById(id);\n\n\t\tif(el) {\n\t\t\tposition = el.getBoundingClientRect();\n\t\t\ttargetPos.left = position.left;\n\t\t\ttargetPos.top = position.top;\n\t\t}\n\t}\n\n\treturn targetPos;\n};\n\nContents.prototype.addStylesheet = function(src) {\n\treturn new RSVP.Promise(function(resolve, reject){\n\t\tvar $stylesheet;\n\t\tvar ready = false;\n\n\t\tif(!this.document) {\n\t\t\tresolve(false);\n\t\t\treturn;\n\t\t}\n\n\t\t$stylesheet = this.document.createElement('link');\n\t\t$stylesheet.type = 'text/css';\n\t\t$stylesheet.rel = \"stylesheet\";\n\t\t$stylesheet.href = src;\n\t\t$stylesheet.onload = $stylesheet.onreadystatechange = function() {\n\t\t\tif ( !ready && (!this.readyState || this.readyState == 'complete') ) {\n\t\t\t\tready = true;\n\t\t\t\t// Let apply\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\tresolve(true);\n\t\t\t\t}, 1);\n\t\t\t}\n\t\t};\n\n\t\tthis.document.head.appendChild($stylesheet);\n\n\t}.bind(this));\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule\nContents.prototype.addStylesheetRules = function(rules) {\n\tvar styleEl;\n\tvar styleSheet;\n\n\tif(!this.document) return;\n\n\tstyleEl = this.document.createElement('style');\n\n\t// Append style element to head\n\tthis.document.head.appendChild(styleEl);\n\n\t// Grab style sheet\n\tstyleSheet = styleEl.sheet;\n\n\tfor (var i = 0, rl = rules.length; i < rl; i++) {\n\t\tvar j = 1, rule = rules[i], selector = rules[i][0], propStr = '';\n\t\t// If the second argument of a rule is an array of arrays, correct our variables.\n\t\tif (Object.prototype.toString.call(rule[1][0]) === '[object Array]') {\n\t\t\trule = rule[1];\n\t\t\tj = 0;\n\t\t}\n\n\t\tfor (var pl = rule.length; j < pl; j++) {\n\t\t\tvar prop = rule[j];\n\t\t\tpropStr += prop[0] + ':' + prop[1] + (prop[2] ? ' !important' : '') + ';\\n';\n\t\t}\n\n\t\t// Insert CSS Rule\n\t\tstyleSheet.insertRule(selector + '{' + propStr + '}', styleSheet.cssRules.length);\n\t}\n};\n\nContents.prototype.addScript = function(src) {\n\n\treturn new RSVP.Promise(function(resolve, reject){\n\t\tvar $script;\n\t\tvar ready = false;\n\n\t\tif(!this.document) {\n\t\t\tresolve(false);\n\t\t\treturn;\n\t\t}\n\n\t\t$script = this.document.createElement('script');\n\t\t$script.type = 'text/javascript';\n\t\t$script.async = true;\n\t\t$script.src = src;\n\t\t$script.onload = $script.onreadystatechange = function() {\n\t\t\tif ( !ready && (!this.readyState || this.readyState == 'complete') ) {\n\t\t\t\tready = true;\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\tresolve(true);\n\t\t\t\t}, 1);\n\t\t\t}\n\t\t};\n\n\t\tthis.document.head.appendChild($script);\n\n\t}.bind(this));\n};\n\nContents.prototype.addEventListeners = function(){\n\tif(!this.document) {\n\t\treturn;\n\t}\n\tthis.listenedEvents.forEach(function(eventName){\n\t\tthis.document.addEventListener(eventName, this.triggerEvent.bind(this), false);\n\t}, this);\n\n};\n\nContents.prototype.removeEventListeners = function(){\n\tif(!this.document) {\n\t\treturn;\n\t}\n\tthis.listenedEvents.forEach(function(eventName){\n\t\tthis.document.removeEventListener(eventName, this.triggerEvent, false);\n\t}, this);\n\n};\n\n// Pass browser events\nContents.prototype.triggerEvent = function(e){\n\tthis.trigger(e.type, e);\n};\n\nContents.prototype.addSelectionListeners = function(){\n\tif(!this.document) {\n\t\treturn;\n\t}\n\tthis.document.addEventListener(\"selectionchange\", this.onSelectionChange.bind(this), false);\n};\n\nContents.prototype.removeSelectionListeners = function(){\n\tif(!this.document) {\n\t\treturn;\n\t}\n\tthis.document.removeEventListener(\"selectionchange\", this.onSelectionChange, false);\n};\n\nContents.prototype.onSelectionChange = function(e){\n\tif (this.selectionEndTimeout) {\n\t\tclearTimeout(this.selectionEndTimeout);\n\t}\n\tthis.selectionEndTimeout = setTimeout(function() {\n\t\tvar selection = this.window.getSelection();\n\t\tthis.triggerSelectedEvent(selection);\n\t}.bind(this), 500);\n};\n\nContents.prototype.triggerSelectedEvent = function(selection){\n\tvar range, cfirange;\n\n\tif (selection && selection.rangeCount > 0) {\n\t\trange = selection.getRangeAt(0);\n\t\tif(!range.collapsed) {\n\t\t\t// cfirange = this.section.cfiFromRange(range);\n\t\t\tcfirange = new EpubCFI(range, this.cfiBase).toString();\n\t\t\tthis.trigger(\"selected\", cfirange);\n\t\t\tthis.trigger(\"selectedRange\", range);\n\t\t}\n\t}\n};\n\nContents.prototype.range = function(_cfi, ignoreClass){\n\tvar cfi = new EpubCFI(_cfi);\n\treturn cfi.toRange(this.document, ignoreClass);\n};\n\nContents.prototype.map = function(layout){\n\tvar map = new Mapping(layout);\n\treturn map.section();\n};\n\nContents.prototype.size = function(width, height){\n\n\tif (width >= 0) {\n\t\tthis.width(width);\n\t}\n\n\tif (height >= 0) {\n\t\tthis.height(height);\n\t}\n\n\tthis.css(\"margin\", \"0\");\n\tthis.css(\"boxSizing\", \"border-box\");\n\n};\n\nContents.prototype.columns = function(width, height, columnWidth, gap){\n\tvar COLUMN_AXIS = core.prefixed('columnAxis');\n\tvar COLUMN_GAP = core.prefixed('columnGap');\n\tvar COLUMN_WIDTH = core.prefixed('columnWidth');\n\tvar COLUMN_FILL = core.prefixed('columnFill');\n\tvar textWidth;\n\n\tthis.width(width);\n\tthis.height(height);\n\n\t// Deal with Mobile trying to scale to viewport\n\tthis.viewport({ width: width, height: height, scale: 1.0 });\n\n\t// this.overflowY(\"hidden\");\n\tthis.css(\"overflowY\", \"hidden\");\n\tthis.css(\"margin\", \"0\");\n\tthis.css(\"boxSizing\", \"border-box\");\n\tthis.css(\"maxWidth\", \"inherit\");\n\n\tthis.css(COLUMN_AXIS, \"horizontal\");\n\tthis.css(COLUMN_FILL, \"auto\");\n\n\tthis.css(COLUMN_GAP, gap+\"px\");\n\tthis.css(COLUMN_WIDTH, columnWidth+\"px\");\n};\n\nContents.prototype.scale = function(scale, offsetX, offsetY){\n\tvar scale = \"scale(\" + scale + \")\";\n\tvar translate = '';\n\t// this.css(\"position\", \"absolute\"));\n\tthis.css(\"transformOrigin\", \"top left\");\n\n\tif (offsetX >= 0 || offsetY >= 0) {\n\t\ttranslate = \" translate(\" + (offsetX || 0 )+ \"px, \" + (offsetY || 0 )+ \"px )\";\n\t}\n\n\tthis.css(\"transform\", scale + translate);\n};\n\nContents.prototype.fit = function(width, height){\n\tvar viewport = this.viewport();\n\tvar widthScale = width / viewport.width;\n\tvar heightScale = height / viewport.height;\n\tvar scale = widthScale < heightScale ? widthScale : heightScale;\n\n\tvar offsetY = (height - (viewport.height * scale)) / 2;\n\n\tthis.width(width);\n\tthis.height(height);\n\tthis.overflow(\"hidden\");\n\n\t// Deal with Mobile trying to scale to viewport\n\tthis.viewport({ scale: 1.0 });\n\n\t// Scale to the correct size\n\tthis.scale(scale, 0, offsetY);\n\n\tthis.css(\"backgroundColor\", \"transparent\");\n};\n\nContents.prototype.mapPage = function(cfiBase, start, end) {\n\tvar mapping = new Mapping();\n\n\treturn mapping.page(this, cfiBase, start, end);\n};\n\nContents.prototype.destroy = function() {\n\t// Stop observing\n\tif(this.observer) {\n\t\tthis.observer.disconnect();\n\t}\n\n\tthis.removeListeners();\n\n};\n\nRSVP.EventTarget.mixin(Contents.prototype);\n\nmodule.exports = Contents;\n","var RSVP = require('rsvp');\nvar base64 = require('base64-js');\n\nvar requestAnimationFrame = (typeof window != 'undefined') ? (window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame) : false;\n/*\n//-- Parse the different parts of a url, returning a object\nfunction uri(url){\n\tvar uri = {\n\t\t\t\tprotocol : '',\n\t\t\t\thost : '',\n\t\t\t\tpath : '',\n\t\t\t\torigin : '',\n\t\t\t\tdirectory : '',\n\t\t\t\tbase : '',\n\t\t\t\tfilename : '',\n\t\t\t\textension : '',\n\t\t\t\tfragment : '',\n\t\t\t\thref : url\n\t\t\t},\n\t\t\tdoubleSlash = url.indexOf('://'),\n\t\t\tsearch = url.indexOf('?'),\n\t\t\tfragment = url.indexOf(\"#\"),\n\t\t\twithoutProtocol,\n\t\t\tdot,\n\t\t\tfirstSlash;\n\n\tif(fragment != -1) {\n\t\turi.fragment = url.slice(fragment + 1);\n\t\turl = url.slice(0, fragment);\n\t}\n\n\tif(search != -1) {\n\t\turi.search = url.slice(search + 1);\n\t\turl = url.slice(0, search);\n\t\thref = url;\n\t}\n\n\tif(doubleSlash != -1) {\n\t\turi.protocol = url.slice(0, doubleSlash);\n\t\twithoutProtocol = url.slice(doubleSlash+3);\n\t\tfirstSlash = withoutProtocol.indexOf('/');\n\n\t\tif(firstSlash === -1) {\n\t\t\turi.host = uri.path;\n\t\t\turi.path = \"\";\n\t\t} else {\n\t\t\turi.host = withoutProtocol.slice(0, firstSlash);\n\t\t\turi.path = withoutProtocol.slice(firstSlash);\n\t\t}\n\n\n\t\turi.origin = uri.protocol + \"://\" + uri.host;\n\n\t\turi.directory = folder(uri.path);\n\n\t\turi.base = uri.origin + uri.directory;\n\t\t// return origin;\n\t} else {\n\t\turi.path = url;\n\t\turi.directory = folder(url);\n\t\turi.base = uri.directory;\n\t}\n\n\t//-- Filename\n\turi.filename = url.replace(uri.base, '');\n\tdot = uri.filename.lastIndexOf('.');\n\tif(dot != -1) {\n\t\turi.extension = uri.filename.slice(dot+1);\n\t}\n\treturn uri;\n};\n\n//-- Parse out the folder, will return everything before the last slash\nfunction folder(url){\n\n\tvar lastSlash = url.lastIndexOf('/');\n\n\tif(lastSlash == -1) var folder = '';\n\n\tfolder = url.slice(0, lastSlash + 1);\n\n\treturn folder;\n\n};\n*/\nfunction isElement(obj) {\n\t\treturn !!(obj && obj.nodeType == 1);\n};\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript\nfunction uuid() {\n\tvar d = new Date().getTime();\n\tvar uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n\t\t\tvar r = (d + Math.random()*16)%16 | 0;\n\t\t\td = Math.floor(d/16);\n\t\t\treturn (c=='x' ? r : (r&0x7|0x8)).toString(16);\n\t});\n\treturn uuid;\n};\n\n// From Lodash\nfunction values(object) {\n\tvar index = -1,\n\t\t\tprops = Object.keys(object),\n\t\t\tlength = props.length,\n\t\t\tresult = Array(length);\n\n\twhile (++index < length) {\n\t\tresult[index] = object[props[index]];\n\t}\n\treturn result;\n};\n\nfunction resolveUrl(base, path) {\n\tvar url = [],\n\t\tsegments = [],\n\t\tbaseUri = uri(base),\n\t\tpathUri = uri(path),\n\t\tbaseDirectory = baseUri.directory,\n\t\tpathDirectory = pathUri.directory,\n\t\tdirectories = [],\n\t\t// folders = base.split(\"/\"),\n\t\tpaths;\n\n\t// if(uri.host) {\n\t// return path;\n\t// }\n\n\tif(baseDirectory[0] === \"/\") {\n\t\tbaseDirectory = baseDirectory.substring(1);\n\t}\n\n\tif(pathDirectory[pathDirectory.length-1] === \"/\") {\n\t\tbaseDirectory = baseDirectory.substring(0, baseDirectory.length-1);\n\t}\n\n\tif(pathDirectory[0] === \"/\") {\n\t\tpathDirectory = pathDirectory.substring(1);\n\t}\n\n\tif(pathDirectory[pathDirectory.length-1] === \"/\") {\n\t\tpathDirectory = pathDirectory.substring(0, pathDirectory.length-1);\n\t}\n\n\tif(baseDirectory) {\n\t\tdirectories = baseDirectory.split(\"/\");\n\t}\n\n\tpaths = pathDirectory.split(\"/\");\n\n\tpaths.reverse().forEach(function(part, index){\n\t\tif(part === \"..\"){\n\t\t\tdirectories.pop();\n\t\t} else if(part === directories[directories.length-1]) {\n\t\t\tdirectories.pop();\n\t\t\tsegments.unshift(part);\n\t\t} else {\n\t\t\tsegments.unshift(part);\n\t\t}\n\t});\n\n\turl = [baseUri.origin];\n\n\tif(directories.length) {\n\t\turl = url.concat(directories);\n\t}\n\n\tif(segments) {\n\t\turl = url.concat(segments);\n\t}\n\n\turl = url.concat(pathUri.filename);\n\n\treturn url.join(\"/\");\n};\n\nfunction documentHeight() {\n\treturn Math.max(\n\t\t\tdocument.documentElement.clientHeight,\n\t\t\tdocument.body.scrollHeight,\n\t\t\tdocument.documentElement.scrollHeight,\n\t\t\tdocument.body.offsetHeight,\n\t\t\tdocument.documentElement.offsetHeight\n\t);\n};\n\nfunction isNumber(n) {\n\treturn !isNaN(parseFloat(n)) && isFinite(n);\n};\n\nfunction prefixed(unprefixed) {\n\tvar vendors = [\"Webkit\", \"Moz\", \"O\", \"ms\" ],\n\t\tprefixes = ['-Webkit-', '-moz-', '-o-', '-ms-'],\n\t\tupper = unprefixed[0].toUpperCase() + unprefixed.slice(1),\n\t\tlength = vendors.length;\n\n\tif (typeof(document) === 'undefined' || typeof(document.body.style[unprefixed]) != 'undefined') {\n\t\treturn unprefixed;\n\t}\n\n\tfor ( var i=0; i < length; i++ ) {\n\t\tif (typeof(document.body.style[vendors[i] + upper]) != 'undefined') {\n\t\t\treturn vendors[i] + upper;\n\t\t}\n\t}\n\n\treturn unprefixed;\n};\n\nfunction defaults(obj) {\n\tfor (var i = 1, length = arguments.length; i < length; i++) {\n\t\tvar source = arguments[i];\n\t\tfor (var prop in source) {\n\t\t\tif (obj[prop] === void 0) obj[prop] = source[prop];\n\t\t}\n\t}\n\treturn obj;\n};\n\nfunction extend(target) {\n\t\tvar sources = [].slice.call(arguments, 1);\n\t\tsources.forEach(function (source) {\n\t\t\tif(!source) return;\n\t\t\tObject.getOwnPropertyNames(source).forEach(function(propName) {\n\t\t\t\tObject.defineProperty(target, propName, Object.getOwnPropertyDescriptor(source, propName));\n\t\t\t});\n\t\t});\n\t\treturn target;\n};\n\n// Fast quicksort insert for sorted array -- based on:\n// http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers\nfunction insert(item, array, compareFunction) {\n\tvar location = locationOf(item, array, compareFunction);\n\tarray.splice(location, 0, item);\n\n\treturn location;\n};\n// Returns where something would fit in\nfunction locationOf(item, array, compareFunction, _start, _end) {\n\tvar start = _start || 0;\n\tvar end = _end || array.length;\n\tvar pivot = parseInt(start + (end - start) / 2);\n\tvar compared;\n\tif(!compareFunction){\n\t\tcompareFunction = function(a, b) {\n\t\t\tif(a > b) return 1;\n\t\t\tif(a < b) return -1;\n\t\t\tif(a = b) return 0;\n\t\t};\n\t}\n\tif(end-start <= 0) {\n\t\treturn pivot;\n\t}\n\n\tcompared = compareFunction(array[pivot], item);\n\tif(end-start === 1) {\n\t\treturn compared > 0 ? pivot : pivot + 1;\n\t}\n\n\tif(compared === 0) {\n\t\treturn pivot;\n\t}\n\tif(compared === -1) {\n\t\treturn locationOf(item, array, compareFunction, pivot, end);\n\t} else{\n\t\treturn locationOf(item, array, compareFunction, start, pivot);\n\t}\n};\n// Returns -1 of mpt found\nfunction indexOfSorted(item, array, compareFunction, _start, _end) {\n\tvar start = _start || 0;\n\tvar end = _end || array.length;\n\tvar pivot = parseInt(start + (end - start) / 2);\n\tvar compared;\n\tif(!compareFunction){\n\t\tcompareFunction = function(a, b) {\n\t\t\tif(a > b) return 1;\n\t\t\tif(a < b) return -1;\n\t\t\tif(a = b) return 0;\n\t\t};\n\t}\n\tif(end-start <= 0) {\n\t\treturn -1; // Not found\n\t}\n\n\tcompared = compareFunction(array[pivot], item);\n\tif(end-start === 1) {\n\t\treturn compared === 0 ? pivot : -1;\n\t}\n\tif(compared === 0) {\n\t\treturn pivot; // Found\n\t}\n\tif(compared === -1) {\n\t\treturn indexOfSorted(item, array, compareFunction, pivot, end);\n\t} else{\n\t\treturn indexOfSorted(item, array, compareFunction, start, pivot);\n\t}\n};\n\nfunction bounds(el) {\n\n\tvar style = window.getComputedStyle(el);\n\tvar widthProps = [\"width\", \"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n\tvar heightProps = [\"height\", \"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n\tvar width = 0;\n\tvar height = 0;\n\n\twidthProps.forEach(function(prop){\n\t\twidth += parseFloat(style[prop]) || 0;\n\t});\n\n\theightProps.forEach(function(prop){\n\t\theight += parseFloat(style[prop]) || 0;\n\t});\n\n\treturn {\n\t\theight: height,\n\t\twidth: width\n\t};\n\n};\n\nfunction borders(el) {\n\n\tvar style = window.getComputedStyle(el);\n\tvar widthProps = [\"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n\tvar heightProps = [\"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n\tvar width = 0;\n\tvar height = 0;\n\n\twidthProps.forEach(function(prop){\n\t\twidth += parseFloat(style[prop]) || 0;\n\t});\n\n\theightProps.forEach(function(prop){\n\t\theight += parseFloat(style[prop]) || 0;\n\t});\n\n\treturn {\n\t\theight: height,\n\t\twidth: width\n\t};\n\n};\n\nfunction windowBounds() {\n\n\tvar width = window.innerWidth;\n\tvar height = window.innerHeight;\n\n\treturn {\n\t\ttop: 0,\n\t\tleft: 0,\n\t\tright: width,\n\t\tbottom: height,\n\t\twidth: width,\n\t\theight: height\n\t};\n\n};\n\n//https://stackoverflow.com/questions/13482352/xquery-looking-for-text-with-single-quote/13483496#13483496\nfunction cleanStringForXpath(str) {\n\t\tvar parts = str.match(/[^'\"]+|['\"]/g);\n\t\tparts = parts.map(function(part){\n\t\t\t\tif (part === \"'\") {\n\t\t\t\t\t\treturn '\\\"\\'\\\"'; // output \"'\"\n\t\t\t\t}\n\n\t\t\t\tif (part === '\"') {\n\t\t\t\t\t\treturn \"\\'\\\"\\'\"; // output '\"'\n\t\t\t\t}\n\t\t\t\treturn \"\\'\" + part + \"\\'\";\n\t\t});\n\t\treturn \"concat(\\'\\',\" + parts.join(\",\") + \")\";\n};\n\nfunction indexOfTextNode(textNode){\n\tvar parent = textNode.parentNode;\n\tvar children = parent.childNodes;\n\tvar sib;\n\tvar index = -1;\n\tfor (var i = 0; i < children.length; i++) {\n\t\tsib = children[i];\n\t\tif(sib.nodeType === Node.TEXT_NODE){\n\t\t\tindex++;\n\t\t}\n\t\tif(sib == textNode) break;\n\t}\n\n\treturn index;\n};\n\nfunction isXml(ext) {\n\treturn ['xml', 'opf', 'ncx'].indexOf(ext) > -1;\n}\n\nfunction createBlob(content, mime){\n\tvar blob = new Blob([content], {type : mime });\n\n\treturn blob;\n};\n\nfunction createBlobUrl(content, mime){\n\tvar _URL = window.URL || window.webkitURL || window.mozURL;\n\tvar tempUrl;\n\tvar blob = this.createBlob(content, mime);\n\n\ttempUrl = _URL.createObjectURL(blob);\n\n\treturn tempUrl;\n};\n\nfunction createBase64Url(content, mime){\n\tvar string;\n\tvar data;\n\tvar datauri;\n\n\tif (typeof(content) !== \"string\") {\n\t\t// Only handles strings\n\t\treturn;\n\t}\n\n\tdata = btoa(content);\n\n\tdatauri = \"data:\" + mime + \";base64,\" + data;\n\n\treturn datauri;\n};\n\nfunction type(obj){\n\treturn Object.prototype.toString.call(obj).slice(8, -1);\n}\n\nfunction parse(markup, mime) {\n\tvar doc;\n\t// console.log(\"parse\", markup);\n\n\tif (typeof DOMParser === \"undefined\") {\n\t\tDOMParser = require('xmldom').DOMParser;\n\t}\n\n\n\tdoc = new DOMParser().parseFromString(markup, mime);\n\n\treturn doc;\n}\n\nfunction qs(el, sel) {\n\tvar elements;\n\n\tif (typeof el.querySelector != \"undefined\") {\n\t\treturn el.querySelector(sel);\n\t} else {\n\t\telements = el.getElementsByTagName(sel);\n\t\tif (elements.length) {\n\t\t\treturn elements[0];\n\t\t}\n\t}\n}\n\nfunction qsa(el, sel) {\n\n\tif (typeof el.querySelector != \"undefined\") {\n\t\treturn el.querySelectorAll(sel);\n\t} else {\n\t\treturn el.getElementsByTagName(sel);\n\t}\n}\n\nfunction qsp(el, sel, props) {\n\tvar q, filtered;\n\tif (typeof el.querySelector != \"undefined\") {\n\t\tsel += '[';\n\t\tfor (var prop in props) {\n\t\t\tsel += prop + \"='\" + props[prop] + \"'\";\n\t\t}\n\t\tsel += ']';\n\t\treturn el.querySelector(sel);\n\t} else {\n\t\tq = el.getElementsByTagName(sel);\n\t\tfiltered = Array.prototype.slice.call(q, 0).filter(function(el) {\n\t\t\tfor (var prop in props) {\n\t\t\t\tif(el.getAttribute(prop) === props[prop]){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (filtered) {\n\t\t\treturn filtered[0];\n\t\t}\n\t}\n}\n\nfunction blob2base64(blob, cb) {\n\tvar reader = new FileReader();\n\treader.readAsDataURL(blob);\n\treader.onloadend = function() {\n\t\tcb(reader.result);\n\t}\n}\n\nmodule.exports = {\n\t// 'uri': uri,\n\t// 'folder': folder,\n\t'isElement': isElement,\n\t'uuid': uuid,\n\t'values': values,\n\t'resolveUrl': resolveUrl,\n\t'indexOfSorted': indexOfSorted,\n\t'documentHeight': documentHeight,\n\t'isNumber': isNumber,\n\t'prefixed': prefixed,\n\t'defaults': defaults,\n\t'extend': extend,\n\t'insert': insert,\n\t'locationOf': locationOf,\n\t'indexOfSorted': indexOfSorted,\n\t'requestAnimationFrame': requestAnimationFrame,\n\t'bounds': bounds,\n\t'borders': borders,\n\t'windowBounds': windowBounds,\n\t'cleanStringForXpath': cleanStringForXpath,\n\t'indexOfTextNode': indexOfTextNode,\n\t'isXml': isXml,\n\t'createBlob': createBlob,\n\t'createBlobUrl': createBlobUrl,\n\t'type': type,\n\t'parse' : parse,\n\t'qs' : qs,\n\t'qsa' : qsa,\n\t'qsp' : qsp,\n\t'blob2base64' : blob2base64,\n\t'createBase64Url': createBase64Url\n};\n","var URI = require('urijs');\nvar core = require('./core');\n\n/**\n\tEPUB CFI spec: http://www.idpf.org/epub/linking/cfi/epub-cfi.html\n\n\tImplements:\n\t- Character Offset: epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3)\n\t- Simple Ranges : epubcfi(/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4)\n\n\tDoes Not Implement:\n\t- Temporal Offset (~)\n\t- Spatial Offset (@)\n\t- Temporal-Spatial Offset (~ + @)\n\t- Text Location Assertion ([)\n*/\n\nfunction EpubCFI(cfiFrom, base, ignoreClass){\n\tvar type;\n\n\tthis.str = '';\n\n\tthis.base = {};\n\tthis.spinePos = 0; // For compatibility\n\n\tthis.range = false; // true || false;\n\n\tthis.path = {};\n\tthis.start = null;\n\tthis.end = null;\n\n\t// Allow instantiation without the 'new' keyword\n\tif (!(this instanceof EpubCFI)) {\n\t\treturn new EpubCFI(cfiFrom, base, ignoreClass);\n\t}\n\n\tif(typeof base === 'string') {\n\t\tthis.base = this.parseComponent(base);\n\t} else if(typeof base === 'object' && base.steps) {\n\t\tthis.base = base;\n\t}\n\n\ttype = this.checkType(cfiFrom);\n\n\n\tif(type === 'string') {\n\t\tthis.str = cfiFrom;\n\t\treturn core.extend(this, this.parse(cfiFrom));\n\t} else if (type === 'range') {\n\t\treturn core.extend(this, this.fromRange(cfiFrom, this.base, ignoreClass));\n\t} else if (type === 'node') {\n\t\treturn core.extend(this, this.fromNode(cfiFrom, this.base, ignoreClass));\n\t} else if (type === 'EpubCFI' && cfiFrom.path) {\n\t\treturn cfiFrom;\n\t} else if (!cfiFrom) {\n\t\treturn this;\n\t} else {\n\t\tthrow new TypeError('not a valid argument for EpubCFI');\n\t}\n\n};\n\nEpubCFI.prototype.checkType = function(cfi) {\n\n\tif (this.isCfiString(cfi)) {\n\t\treturn 'string';\n\t// Is a range object\n\t} else if (typeof cfi === 'object' && core.type(cfi) === \"Range\"){\n\t\treturn 'range';\n\t} else if (typeof cfi === 'object' && typeof(cfi.nodeType) != \"undefined\" ){ // || typeof cfi === 'function'\n\t\treturn 'node';\n\t} else if (typeof cfi === 'object' && cfi instanceof EpubCFI){\n\t\treturn 'EpubCFI';\n\t} else {\n\t\treturn false;\n\t}\n};\n\nEpubCFI.prototype.parse = function(cfiStr) {\n\tvar cfi = {\n\t\t\tspinePos: -1,\n\t\t\trange: false,\n\t\t\tbase: {},\n\t\t\tpath: {},\n\t\t\tstart: null,\n\t\t\tend: null\n\t\t};\n\tvar baseComponent, pathComponent, range;\n\n\tif(typeof cfiStr !== \"string\") {\n\t\treturn {spinePos: -1};\n\t}\n\n\tif(cfiStr.indexOf(\"epubcfi(\") === 0 && cfiStr[cfiStr.length-1] === \")\") {\n\t\t// Remove intial epubcfi( and ending )\n\t\tcfiStr = cfiStr.slice(8, cfiStr.length-1);\n\t}\n\n\tbaseComponent = this.getChapterComponent(cfiStr);\n\n\t// Make sure this is a valid cfi or return\n\tif(!baseComponent) {\n\t\treturn {spinePos: -1};\n\t}\n\n\tcfi.base = this.parseComponent(baseComponent);\n\n\tpathComponent = this.getPathComponent(cfiStr);\n\tcfi.path = this.parseComponent(pathComponent);\n\n\trange = this.getRange(cfiStr);\n\n\tif(range) {\n\t\tcfi.range = true;\n\t\tcfi.start = this.parseComponent(range[0]);\n\t\tcfi.end = this.parseComponent(range[1]);\n\t}\n\n\t// Get spine node position\n\t// cfi.spineSegment = cfi.base.steps[1];\n\n\t// Chapter segment is always the second step\n\tcfi.spinePos = cfi.base.steps[1].index;\n\n\treturn cfi;\n};\n\nEpubCFI.prototype.parseComponent = function(componentStr){\n\tvar component = {\n\t\tsteps: [],\n\t\tterminal: {\n\t\t\toffset: null,\n\t\t\tassertion: null\n\t\t}\n\t};\n\tvar parts = componentStr.split(':');\n\tvar steps = parts[0].split('/');\n\tvar terminal;\n\n\tif(parts.length > 1) {\n\t\tterminal = parts[1];\n\t\tcomponent.terminal = this.parseTerminal(terminal);\n\t}\n\n\tif (steps[0] === '') {\n\t\tsteps.shift(); // Ignore the first slash\n\t}\n\n\tcomponent.steps = steps.map(function(step){\n\t\treturn this.parseStep(step);\n\t}.bind(this));\n\n\treturn component;\n};\n\nEpubCFI.prototype.parseStep = function(stepStr){\n\tvar type, num, index, has_brackets, id;\n\n\thas_brackets = stepStr.match(/\\[(.*)\\]/);\n\tif(has_brackets && has_brackets[1]){\n\t\tid = has_brackets[1];\n\t}\n\n\t//-- Check if step is a text node or element\n\tnum = parseInt(stepStr);\n\n\tif(isNaN(num)) {\n\t\treturn;\n\t}\n\n\tif(num % 2 === 0) { // Even = is an element\n\t\ttype = \"element\";\n\t\tindex = num / 2 - 1;\n\t} else {\n\t\ttype = \"text\";\n\t\tindex = (num - 1 ) / 2;\n\t}\n\n\treturn {\n\t\t\"type\" : type,\n\t\t'index' : index,\n\t\t'id' : id || null\n\t};\n};\n\nEpubCFI.prototype.parseTerminal = function(termialStr){\n\tvar characterOffset, textLocationAssertion;\n\tvar assertion = termialStr.match(/\\[(.*)\\]/);\n\n\tif(assertion && assertion[1]){\n\t\tcharacterOffset = parseInt(termialStr.split('[')[0]) || null;\n\t\ttextLocationAssertion = assertion[1];\n\t} else {\n\t\tcharacterOffset = parseInt(termialStr) || null;\n\t}\n\n\treturn {\n\t\t'offset': characterOffset,\n\t\t'assertion': textLocationAssertion\n\t};\n\n};\n\nEpubCFI.prototype.getChapterComponent = function(cfiStr) {\n\n\tvar indirection = cfiStr.split(\"!\");\n\n\treturn indirection[0];\n};\n\nEpubCFI.prototype.getPathComponent = function(cfiStr) {\n\n\tvar indirection = cfiStr.split(\"!\");\n\n\tif(indirection[1]) {\n\t\tranges = indirection[1].split(',');\n\t\treturn ranges[0];\n\t}\n\n};\n\nEpubCFI.prototype.getRange = function(cfiStr) {\n\n\tvar ranges = cfiStr.split(\",\");\n\n\tif(ranges.length === 3){\n\t\treturn [\n\t\t\tranges[1],\n\t\t\tranges[2]\n\t\t];\n\t}\n\n\treturn false;\n};\n\nEpubCFI.prototype.getCharecterOffsetComponent = function(cfiStr) {\n\tvar splitStr = cfiStr.split(\":\");\n\treturn splitStr[1] || '';\n};\n\nEpubCFI.prototype.joinSteps = function(steps) {\n\tif(!steps) {\n\t\treturn \"\";\n\t}\n\n\treturn steps.map(function(part){\n\t\tvar segment = '';\n\n\t\tif(part.type === 'element') {\n\t\t\tsegment += (part.index + 1) * 2;\n\t\t}\n\n\t\tif(part.type === 'text') {\n\t\t\tsegment += 1 + (2 * part.index); // TODO: double check that this is odd\n\t\t}\n\n\t\tif(part.id) {\n\t\t\tsegment += \"[\" + part.id + \"]\";\n\t\t}\n\n\t\treturn segment;\n\n\t}).join('/');\n\n};\n\nEpubCFI.prototype.segmentString = function(segment) {\n\tvar segmentString = '/';\n\n\tsegmentString += this.joinSteps(segment.steps);\n\n\tif(segment.terminal && segment.terminal.offset != null){\n\t\tsegmentString += ':' + segment.terminal.offset;\n\t}\n\n\tif(segment.terminal && segment.terminal.assertion != null){\n\t\tsegmentString += '[' + segment.terminal.assertion + ']';\n\t}\n\n\treturn segmentString;\n};\n\nEpubCFI.prototype.toString = function() {\n\tvar cfiString = 'epubcfi(';\n\n\tcfiString += this.segmentString(this.base);\n\n\tcfiString += '!';\n\tcfiString += this.segmentString(this.path);\n\n\t// Add Range, if present\n\tif(this.start) {\n\t\tcfiString += ',';\n\t\tcfiString += this.segmentString(this.start);\n\t}\n\n\tif(this.end) {\n\t\tcfiString += ',';\n\t\tcfiString += this.segmentString(this.end);\n\t}\n\n\tcfiString += \")\";\n\n\treturn cfiString;\n};\n\nEpubCFI.prototype.compare = function(cfiOne, cfiTwo) {\n\tif(typeof cfiOne === 'string') {\n\t\tcfiOne = new EpubCFI(cfiOne);\n\t}\n\tif(typeof cfiTwo === 'string') {\n\t\tcfiTwo = new EpubCFI(cfiTwo);\n\t}\n\t// Compare Spine Positions\n\tif(cfiOne.spinePos > cfiTwo.spinePos) {\n\t\treturn 1;\n\t}\n\tif(cfiOne.spinePos < cfiTwo.spinePos) {\n\t\treturn -1;\n\t}\n\n\n\t// Compare Each Step in the First item\n\tfor (var i = 0; i < cfiOne.path.steps.length; i++) {\n\t\tif(!cfiTwo.path.steps[i]) {\n\t\t\treturn 1;\n\t\t}\n\t\tif(cfiOne.path.steps[i].index > cfiTwo.path.steps[i].index) {\n\t\t\treturn 1;\n\t\t}\n\t\tif(cfiOne.path.steps[i].index < cfiTwo.path.steps[i].index) {\n\t\t\treturn -1;\n\t\t}\n\t\t// Otherwise continue checking\n\t}\n\n\t// All steps in First equal to Second and First is Less Specific\n\tif(cfiOne.path.steps.length < cfiTwo.path.steps.length) {\n\t\treturn 1;\n\t}\n\n\t// Compare the charecter offset of the text node\n\tif(cfiOne.path.terminal.offset > cfiTwo.path.terminal.offset) {\n\t\treturn 1;\n\t}\n\tif(cfiOne.path.terminal.offset < cfiTwo.path.terminal.offset) {\n\t\treturn -1;\n\t}\n\n\t// TODO: compare ranges\n\n\t// CFI's are equal\n\treturn 0;\n};\n\nEpubCFI.prototype.step = function(node) {\n\tvar nodeType = (node.nodeType === Node.TEXT_NODE) ? 'text' : 'element';\n\n\treturn {\n\t\t'id' : node.id,\n\t\t'tagName' : node.tagName,\n\t\t'type' : nodeType,\n\t\t'index' : this.position(node)\n\t};\n};\n\nEpubCFI.prototype.filteredStep = function(node, ignoreClass) {\n\tvar filteredNode = this.filter(node, ignoreClass);\n\tvar nodeType;\n\n\t// Node filtered, so ignore\n\tif (!filteredNode) {\n\t\treturn;\n\t}\n\n\t// Otherwise add the filter node in\n\tnodeType = (filteredNode.nodeType === Node.TEXT_NODE) ? 'text' : 'element';\n\n\treturn {\n\t\t'id' : filteredNode.id,\n\t\t'tagName' : filteredNode.tagName,\n\t\t'type' : nodeType,\n\t\t'index' : this.filteredPosition(filteredNode, ignoreClass)\n\t};\n};\n\nEpubCFI.prototype.pathTo = function(node, offset, ignoreClass) {\n\tvar segment = {\n\t\tsteps: [],\n\t\tterminal: {\n\t\t\toffset: null,\n\t\t\tassertion: null\n\t\t}\n\t};\n\tvar currentNode = node;\n\tvar step;\n\n\twhile(currentNode && currentNode.parentNode &&\n\t\t\t\tcurrentNode.parentNode.nodeType != Node.DOCUMENT_NODE) {\n\n\t\tif (ignoreClass) {\n\t\t\tstep = this.filteredStep(currentNode, ignoreClass);\n\t\t} else {\n\t\t\tstep = this.step(currentNode);\n\t\t}\n\n\t\tif (step) {\n\t\t\tsegment.steps.unshift(step);\n\t\t}\n\n\t\tcurrentNode = currentNode.parentNode;\n\n\t}\n\n\tif (offset != null && offset >= 0) {\n\n\t\tsegment.terminal.offset = offset;\n\n\t\t// Make sure we are getting to a textNode if there is an offset\n\t\tif(segment.steps[segment.steps.length-1].type != \"text\") {\n\t\t\tsegment.steps.push({\n\t\t\t\t'type' : \"text\",\n\t\t\t\t'index' : 0\n\t\t\t});\n\t\t}\n\n\t}\n\n\n\treturn segment;\n}\n\nEpubCFI.prototype.equalStep = function(stepA, stepB) {\n\tif (!stepA || !stepB) {\n\t\treturn false;\n\t}\n\n\tif(stepA.index === stepB.index &&\n\t\t stepA.id === stepB.id &&\n\t\t stepA.type === stepB.type) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\nEpubCFI.prototype.fromRange = function(range, base, ignoreClass) {\n\tvar cfi = {\n\t\t\trange: false,\n\t\t\tbase: {},\n\t\t\tpath: {},\n\t\t\tstart: null,\n\t\t\tend: null\n\t\t};\n\n\tvar start = range.startContainer;\n\tvar end = range.endContainer;\n\n\tvar startOffset = range.startOffset;\n\tvar endOffset = range.endOffset;\n\n\tvar needsIgnoring = false;\n\n\tif (ignoreClass) {\n\t\t// Tell pathTo if / what to ignore\n\t\tneedsIgnoring = (start.ownerDocument.querySelector('.' + ignoreClass) != null);\n\t}\n\n\n\tif (typeof base === 'string') {\n\t\tcfi.base = this.parseComponent(base);\n\t\tcfi.spinePos = cfi.base.steps[1].index;\n\t} else if (typeof base === 'object') {\n\t\tcfi.base = base;\n\t}\n\n\tif (range.collapsed) {\n\t\tif (needsIgnoring) {\n\t\t\tstartOffset = this.patchOffset(start, startOffset, ignoreClass);\n\t\t}\n\t\tcfi.path = this.pathTo(start, startOffset, ignoreClass);\n\t} else {\n\t\tcfi.range = true;\n\n\t\tif (needsIgnoring) {\n\t\t\tstartOffset = this.patchOffset(start, startOffset, ignoreClass);\n\t\t}\n\n\t\tcfi.start = this.pathTo(start, startOffset, ignoreClass);\n\n\t\tif (needsIgnoring) {\n\t\t\tendOffset = this.patchOffset(end, endOffset, ignoreClass);\n\t\t}\n\n\t\tcfi.end = this.pathTo(end, endOffset, ignoreClass);\n\n\t\t// Create a new empty path\n\t\tcfi.path = {\n\t\t\tsteps: [],\n\t\t\tterminal: null\n\t\t};\n\n\t\t// Push steps that are shared between start and end to the common path\n\t\tvar len = cfi.start.steps.length;\n\t\tvar i;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (this.equalStep(cfi.start.steps[i], cfi.end.steps[i])) {\n\t\t\t\tif(i == len-1) {\n\t\t\t\t\t// Last step is equal, check terminals\n\t\t\t\t\tif(cfi.start.terminal === cfi.end.terminal) {\n\t\t\t\t\t\t// CFI's are equal\n\t\t\t\t\t\tcfi.path.steps.push(cfi.start.steps[i]);\n\t\t\t\t\t\t// Not a range\n\t\t\t\t\t\tcfi.range = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcfi.path.steps.push(cfi.start.steps[i]);\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\n\t\tcfi.start.steps = cfi.start.steps.slice(cfi.path.steps.length);\n\t\tcfi.end.steps = cfi.end.steps.slice(cfi.path.steps.length);\n\n\t\t// TODO: Add Sanity check to make sure that the end if greater than the start\n\t}\n\n\treturn cfi;\n}\n\nEpubCFI.prototype.fromNode = function(anchor, base, ignoreClass) {\n\tvar cfi = {\n\t\t\trange: false,\n\t\t\tbase: {},\n\t\t\tpath: {},\n\t\t\tstart: null,\n\t\t\tend: null\n\t\t};\n\n\tvar needsIgnoring = false;\n\n\tif (ignoreClass) {\n\t\t// Tell pathTo if / what to ignore\n\t\tneedsIgnoring = (anchor.ownerDocument.querySelector('.' + ignoreClass) != null);\n\t}\n\n\tif (typeof base === 'string') {\n\t\tcfi.base = this.parseComponent(base);\n\t\tcfi.spinePos = cfi.base.steps[1].index;\n\t} else if (typeof base === 'object') {\n\t\tcfi.base = base;\n\t}\n\n\tcfi.path = this.pathTo(anchor, null, ignoreClass);\n\n\treturn cfi;\n};\n\n\nEpubCFI.prototype.filter = function(anchor, ignoreClass) {\n\tvar needsIgnoring;\n\tvar sibling; // to join with\n\tvar parent, prevSibling, nextSibling;\n\tvar isText = false;\n\n\tif (anchor.nodeType === Node.TEXT_NODE) {\n\t\tisText = true;\n\t\tparent = anchor.parentNode;\n\t\tneedsIgnoring = anchor.parentNode.classList.contains(ignoreClass);\n\t} else {\n\t\tisText = false;\n\t\tneedsIgnoring = anchor.classList.contains(ignoreClass);\n\t}\n\n\tif (needsIgnoring && isText) {\n\t\tpreviousSibling = parent.previousSibling;\n\t\tnextSibling = parent.nextSibling;\n\n\t\t// If the sibling is a text node, join the nodes\n\t\tif (previousSibling && previousSibling.nodeType === Node.TEXT_NODE) {\n\t\t\tsibling = previousSibling;\n\t\t} else if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE) {\n\t\t\tsibling = nextSibling;\n\t\t}\n\n\t\tif (sibling) {\n\t\t\treturn sibling;\n\t\t} else {\n\t\t\t// Parent will be ignored on next step\n\t\t\treturn anchor;\n\t\t}\n\n\t} else if (needsIgnoring && !isText) {\n\t\t// Otherwise just skip the element node\n\t\treturn false;\n\t} else {\n\t\t// No need to filter\n\t\treturn anchor;\n\t}\n\n};\n\nEpubCFI.prototype.patchOffset = function(anchor, offset, ignoreClass) {\n\tvar needsIgnoring;\n\tvar sibling;\n\n\tif (anchor.nodeType != Node.TEXT_NODE) {\n\t\tconsole.error(\"Anchor must be a text node\");\n\t\treturn;\n\t}\n\n\tvar curr = anchor;\n\tvar totalOffset = offset;\n\n\t// If the parent is a ignored node, get offset from it's start\n\tif (anchor.parentNode.classList.contains(ignoreClass)) {\n\t\tcurr = anchor.parentNode;\n\t}\n\n\twhile (curr.previousSibling) {\n\t\tif(curr.previousSibling.nodeType === Node.ELEMENT_NODE) {\n\t\t\t// Originally a text node, so join\n\t\t\tif(curr.previousSibling.classList.contains(ignoreClass)){\n\t\t\t\ttotalOffset += curr.previousSibling.textContent.length;\n\t\t\t} else {\n\t\t\t\tbreak; // Normal node, dont join\n\t\t\t}\n\t\t} else {\n\t\t\t// If the previous sibling is a text node, join the nodes\n\t\t\ttotalOffset += curr.previousSibling.textContent.length;\n\t\t}\n\n\t\tcurr = curr.previousSibling;\n\t}\n\n\treturn totalOffset;\n\n};\n\nEpubCFI.prototype.normalizedMap = function(children, nodeType, ignoreClass) {\n\tvar output = {};\n\tvar prevIndex = -1;\n\tvar i, len = children.length;\n\tvar currNodeType;\n\tvar prevNodeType;\n\n\tfor (i = 0; i < len; i++) {\n\n\t\tcurrNodeType = children[i].nodeType;\n\n\t\t// Check if needs ignoring\n\t\tif (currNodeType === Node.ELEMENT_NODE &&\n\t\t\t\tchildren[i].classList.contains(ignoreClass)) {\n\t\t\tcurrNodeType = Node.TEXT_NODE;\n\t\t}\n\n\t\tif (i > 0 &&\n\t\t\t\tcurrNodeType === Node.TEXT_NODE &&\n\t\t\t\tprevNodeType === Node.TEXT_NODE) {\n\t\t\t// join text nodes\n\t\t\toutput[i] = prevIndex;\n\t\t} else if (nodeType === currNodeType){\n\t\t\tprevIndex = prevIndex + 1;\n\t\t\toutput[i] = prevIndex;\n\t\t}\n\n\t\tprevNodeType = currNodeType;\n\n\t}\n\n\treturn output;\n};\n\nEpubCFI.prototype.position = function(anchor) {\n\tvar children, index, map;\n\n\tif (anchor.nodeType === Node.ELEMENT_NODE) {\n\t\tchildren = anchor.parentNode.children;\n\t\tindex = Array.prototype.indexOf.call(children, anchor);\n\t} else {\n\t\tchildren = this.textNodes(anchor.parentNode);\n\t\tindex = children.indexOf(anchor);\n\t}\n\n\treturn index;\n};\n\nEpubCFI.prototype.filteredPosition = function(anchor, ignoreClass) {\n\tvar children, index, map;\n\n\tif (anchor.nodeType === Node.ELEMENT_NODE) {\n\t\tchildren = anchor.parentNode.children;\n\t\tmap = this.normalizedMap(children, Node.ELEMENT_NODE, ignoreClass);\n\t} else {\n\t\tchildren = anchor.parentNode.childNodes;\n\t\t// Inside an ignored node\n\t\tif(anchor.parentNode.classList.contains(ignoreClass)) {\n\t\t\tanchor = anchor.parentNode;\n\t\t\tchildren = anchor.parentNode.childNodes;\n\t\t}\n\t\tmap = this.normalizedMap(children, Node.TEXT_NODE, ignoreClass);\n\t}\n\n\n\tindex = Array.prototype.indexOf.call(children, anchor);\n\n\treturn map[index];\n};\n\nEpubCFI.prototype.stepsToXpath = function(steps) {\n\tvar xpath = [\".\", \"*\"];\n\n\tsteps.forEach(function(step){\n\t\tvar position = step.index + 1;\n\n\t\tif(step.id){\n\t\t\txpath.push(\"*[position()=\" + position + \" and @id='\" + step.id + \"']\");\n\t\t} else if(step.type === \"text\") {\n\t\t\txpath.push(\"text()[\" + position + \"]\");\n\t\t} else {\n\t\t\txpath.push(\"*[\" + position + \"]\");\n\t\t}\n\t});\n\n\treturn xpath.join(\"/\");\n};\n\n\n/*\n\nTo get the last step if needed:\n\n// Get the terminal step\nlastStep = steps[steps.length-1];\n// Get the query string\nquery = this.stepsToQuery(steps);\n// Find the containing element\nstartContainerParent = doc.querySelector(query);\n// Find the text node within that element\nif(startContainerParent && lastStep.type == \"text\") {\n\tcontainer = startContainerParent.childNodes[lastStep.index];\n}\n*/\nEpubCFI.prototype.stepsToQuerySelector = function(steps) {\n\tvar query = [\"html\"];\n\n\tsteps.forEach(function(step){\n\t\tvar position = step.index + 1;\n\n\t\tif(step.id){\n\t\t\tquery.push(\"#\" + step.id);\n\t\t} else if(step.type === \"text\") {\n\t\t\t// unsupported in querySelector\n\t\t\t// query.push(\"text()[\" + position + \"]\");\n\t\t} else {\n\t\t\tquery.push(\"*:nth-child(\" + position + \")\");\n\t\t}\n\t});\n\n\treturn query.join(\">\");\n\n};\n\nEpubCFI.prototype.textNodes = function(container, ignoreClass) {\n\treturn Array.prototype.slice.call(container.childNodes).\n\t\tfilter(function (node) {\n\t\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\t\treturn true;\n\t\t\t} else if (ignoreClass && node.classList.contains(ignoreClass)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n};\n\nEpubCFI.prototype.walkToNode = function(steps, _doc, ignoreClass) {\n\tvar doc = _doc || document;\n\tvar container = doc.documentElement;\n\tvar step;\n\tvar len = steps.length;\n\tvar i;\n\n\tfor (i = 0; i < len; i++) {\n\t\tstep = steps[i];\n\n\t\tif(step.type === \"element\") {\n\t\t\tcontainer = container.children[step.index];\n\t\t} else if(step.type === \"text\"){\n\t\t\tcontainer = this.textNodes(container, ignoreClass)[step.index];\n\t\t}\n\n\t};\n\n\treturn container;\n};\n\nEpubCFI.prototype.findNode = function(steps, _doc, ignoreClass) {\n\tvar doc = _doc || document;\n\tvar container;\n\tvar xpath;\n\n\tif(!ignoreClass && typeof doc.evaluate != 'undefined') {\n\t\txpath = this.stepsToXpath(steps);\n\t\tcontainer = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n\t} else if(ignoreClass) {\n\t\tcontainer = this.walkToNode(steps, doc, ignoreClass);\n\t} else {\n\t\tcontainer = this.walkToNode(steps, doc);\n\t}\n\n\treturn container;\n};\n\nEpubCFI.prototype.fixMiss = function(steps, offset, _doc, ignoreClass) {\n\tvar container = this.findNode(steps.slice(0,-1), _doc, ignoreClass);\n\tvar children = container.childNodes;\n\tvar map = this.normalizedMap(children, Node.TEXT_NODE, ignoreClass);\n\tvar i;\n\tvar child;\n\tvar len;\n\tvar childIndex;\n\tvar lastStepIndex = steps[steps.length-1].index;\n\n\tfor (var childIndex in map) {\n\t\tif (!map.hasOwnProperty(childIndex)) return;\n\n\t\tif(map[childIndex] === lastStepIndex) {\n\t\t\tchild = children[childIndex];\n\t\t\tlen = child.textContent.length;\n\t\t\tif(offset > len) {\n\t\t\t\toffset = offset - len;\n\t\t\t} else {\n\t\t\t\tif (child.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\tcontainer = child.childNodes[0];\n\t\t\t\t} else {\n\t\t\t\t\tcontainer = child;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tcontainer: container,\n\t\toffset: offset\n\t};\n\n};\n\nEpubCFI.prototype.toRange = function(_doc, ignoreClass) {\n\tvar doc = _doc || document;\n\tvar range = doc.createRange();\n\tvar start, end, startContainer, endContainer;\n\tvar cfi = this;\n\tvar startSteps, endSteps;\n\tvar needsIgnoring = ignoreClass ? (doc.querySelector('.' + ignoreClass) != null) : false;\n\tvar missed;\n\n\tif (cfi.range) {\n\t\tstart = cfi.start;\n\t\tstartSteps = cfi.path.steps.concat(start.steps);\n\t\tstartContainer = this.findNode(startSteps, doc, needsIgnoring ? ignoreClass : null);\n\t\tend = cfi.end;\n\t\tendSteps = cfi.path.steps.concat(end.steps);\n\t\tendContainer = this.findNode(endSteps, doc, needsIgnoring ? ignoreClass : null);\n\t} else {\n\t\tstart = cfi.path;\n\t\tstartSteps = cfi.path.steps;\n\t\tstartContainer = this.findNode(cfi.path.steps, doc, needsIgnoring ? ignoreClass : null);\n\t}\n\n\tif(startContainer) {\n\t\ttry {\n\n\t\t\tif(start.terminal.offset != null) {\n\t\t\t\trange.setStart(startContainer, start.terminal.offset);\n\t\t\t} else {\n\t\t\t\trange.setStart(startContainer, 0);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tmissed = this.fixMiss(startSteps, start.terminal.offset, doc, needsIgnoring ? ignoreClass : null);\n\t\t\trange.setStart(missed.container, missed.offset);\n\t\t}\n\t} else {\n\t\t// No start found\n\t\treturn null;\n\t}\n\n\tif (endContainer) {\n\t\ttry {\n\n\t\t\tif(end.terminal.offset != null) {\n\t\t\t\trange.setEnd(endContainer, end.terminal.offset);\n\t\t\t} else {\n\t\t\t\trange.setEnd(endContainer, 0);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tmissed = this.fixMiss(endSteps, cfi.end.terminal.offset, doc, needsIgnoring ? ignoreClass : null);\n\t\t\trange.setEnd(missed.container, missed.offset);\n\t\t}\n\t}\n\n\n\t// doc.defaultView.getSelection().addRange(range);\n\treturn range;\n};\n\n// is a cfi string, should be wrapped with \"epubcfi()\"\nEpubCFI.prototype.isCfiString = function(str) {\n\tif(typeof str === 'string' &&\n\t\t\tstr.indexOf(\"epubcfi(\") === 0 &&\n\t\t\tstr[str.length-1] === \")\") {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nEpubCFI.prototype.generateChapterComponent = function(_spineNodeIndex, _pos, id) {\n\tvar pos = parseInt(_pos),\n\t\tspineNodeIndex = _spineNodeIndex + 1,\n\t\tcfi = '/'+spineNodeIndex+'/';\n\n\tcfi += (pos + 1) * 2;\n\n\tif(id) {\n\t\tcfi += \"[\" + id + \"]\";\n\t}\n\n\treturn cfi;\n};\n\nmodule.exports = EpubCFI;\n","var RSVP = require('rsvp');\n\n//-- Hooks allow for injecting functions that must all complete in order before finishing\n// They will execute in parallel but all must finish before continuing\n// Functions may return a promise if they are asycn.\n\n// this.content = new EPUBJS.Hook();\n// this.content.register(function(){});\n// this.content.trigger(args).then(function(){});\n\nfunction Hook(context){\n\tthis.context = context || this;\n\tthis.hooks = [];\n};\n\n// Adds a function to be run before a hook completes\nHook.prototype.register = function(){\n\tfor(var i = 0; i < arguments.length; ++i) {\n\t\tif (typeof arguments[i] === \"function\") {\n\t\t\tthis.hooks.push(arguments[i]);\n\t\t} else {\n\t\t\t// unpack array\n\t\t\tfor(var j = 0; j < arguments[i].length; ++j) {\n\t\t\t\tthis.hooks.push(arguments[i][j]);\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Triggers a hook to run all functions\nHook.prototype.trigger = function(){\n\tvar args = arguments;\n\tvar context = this.context;\n\tvar promises = [];\n\n\tthis.hooks.forEach(function(task, i) {\n\t\tvar executing = task.apply(context, args);\n\n\t\tif(executing && typeof executing[\"then\"] === \"function\") {\n\t\t\t// Task is a function that returns a promise\n\t\t\tpromises.push(executing);\n\t\t}\n\t\t// Otherwise Task resolves immediately, continue\n\t});\n\n\n\treturn RSVP.all(promises);\n};\n\n// Adds a function to be run before a hook completes\nHook.prototype.list = function(){\n\treturn this.hooks;\n};\n\nHook.prototype.clear = function(){\n\treturn this.hooks = [];\n};\n\nmodule.exports = Hook;\n","var core = require('./core');\nvar RSVP = require('rsvp');\n\nfunction Layout(settings){\n\tthis.name = settings.layout || \"reflowable\";\n\tthis._spread = (settings.spread === \"none\") ? false : true;\n\tthis._minSpreadWidth = settings.spread || 800;\n\tthis._evenSpreads = settings.evenSpreads || false;\n\n\tif (settings.flow === \"scrolled-continuous\" ||\n\t\t\tsettings.flow === \"scrolled-doc\") {\n\t\tthis._flow = \"scrolled\";\n\t} else {\n\t\tthis._flow = \"paginated\";\n\t}\n\n\n\tthis.width = 0;\n\tthis.height = 0;\n\tthis.spreadWidth = 0;\n\tthis.delta = 0;\n\n\tthis.columnWidth = 0;\n\tthis.gap = 0;\n\tthis.divisor = 1;\n};\n\n// paginated | scrolled\nLayout.prototype.flow = function(flow) {\n\tthis._flow = (flow === \"paginated\") ? \"paginated\" : \"scrolled\";\n}\n\n// true | false\nLayout.prototype.spread = function(spread, min) {\n\n\tthis._spread = (spread === \"none\") ? false : true;\n\n\tif (min >= 0) {\n\t\tthis._minSpreadWidth = min;\n\t}\n}\n\nLayout.prototype.calculate = function(_width, _height, _gap){\n\n\tvar divisor = 1;\n\tvar gap = _gap || 0;\n\n\t//-- Check the width and create even width columns\n\tvar fullWidth = Math.floor(_width);\n\tvar width = _width;\n\n\tvar section = Math.floor(width / 8);\n\n\tvar colWidth;\n\tvar spreadWidth;\n\tvar delta;\n\n\tif (this._spread && width >= this._minSpreadWidth) {\n\t\tdivisor = 2;\n\t} else {\n\t\tdivisor = 1;\n\t}\n\n\tif (this.name === \"reflowable\" && this._flow === \"paginated\" && !(_gap >= 0)) {\n\t\tgap = ((section % 2 === 0) ? section : section - 1);\n\t}\n\n\tif (this.name === \"pre-paginated\" ) {\n\t\tgap = 0;\n\t}\n\n\t//-- Double Page\n\tif(divisor > 1) {\n\t\tcolWidth = Math.floor((width - gap) / divisor);\n\t} else {\n\t\tcolWidth = width;\n\t}\n\n\tif (this.name === \"pre-paginated\" && divisor > 1) {\n\t\twidth = colWidth;\n\t}\n\n\tspreadWidth = colWidth * divisor;\n\n\tdelta = (colWidth + gap) * divisor;\n\n\tthis.width = width;\n\tthis.height = _height;\n\tthis.spreadWidth = spreadWidth;\n\tthis.delta = delta;\n\n\tthis.columnWidth = colWidth;\n\tthis.gap = gap;\n\tthis.divisor = divisor;\n};\n\nLayout.prototype.format = function(contents){\n\tvar formating;\n\n\tif (this.name === \"pre-paginated\") {\n\t\tformating = contents.fit(this.columnWidth, this.height);\n\t} else if (this._flow === \"paginated\") {\n\t\tformating = contents.columns(this.width, this.height, this.columnWidth, this.gap);\n\t} else { // scrolled\n\t\tformating = contents.size(this.width, null);\n\t}\n\n\treturn formating; // might be a promise in some View Managers\n};\n\nLayout.prototype.count = function(totalWidth) {\n\t// var totalWidth = contents.scrollWidth();\n\tvar spreads = Math.ceil( totalWidth / this.spreadWidth);\n\n\treturn {\n\t\tspreads : spreads,\n\t\tpages : spreads * this.divisor\n\t};\n};\n\nmodule.exports = Layout;\n","var core = require('./core');\nvar Queue = require('./queue');\nvar EpubCFI = require('./epubcfi');\nvar RSVP = require('rsvp');\n\nfunction Locations(spine, request) {\n\tthis.spine = spine;\n\tthis.request = request;\n\n\tthis.q = new Queue(this);\n\tthis.epubcfi = new EpubCFI();\n\n\tthis._locations = [];\n\tthis.total = 0;\n\n\tthis.break = 150;\n\n\tthis._current = 0;\n\n};\n\n// Load all of sections in the book\nLocations.prototype.generate = function(chars) {\n\n\tif (chars) {\n\t\tthis.break = chars;\n\t}\n\n\tthis.q.pause();\n\n\tthis.spine.each(function(section) {\n\n\t\tthis.q.enqueue(this.process, section);\n\n\t}.bind(this));\n\n\treturn this.q.run().then(function() {\n\t\tthis.total = this._locations.length-1;\n\n\t\tif (this._currentCfi) {\n\t\t\tthis.currentLocation = this._currentCfi;\n\t\t}\n\n\t\treturn this._locations;\n\t\t// console.log(this.precentage(this.book.rendition.location.start), this.precentage(this.book.rendition.location.end));\n\t}.bind(this));\n\n};\n\nLocations.prototype.process = function(section) {\n\n\treturn section.load(this.request)\n\t\t.then(function(contents) {\n\n\t\t\tvar range;\n\t\t\tvar doc = contents.ownerDocument;\n\t\t\tvar counter = 0;\n\n\t\t\tthis.sprint(contents, function(node) {\n\t\t\t\tvar len = node.length;\n\t\t\t\tvar dist;\n\t\t\t\tvar pos = 0;\n\n\t\t\t\t// Start range\n\t\t\t\tif (counter == 0) {\n\t\t\t\t\trange = doc.createRange();\n\t\t\t\t\trange.setStart(node, 0);\n\t\t\t\t}\n\n\t\t\t\tdist = this.break - counter;\n\n\t\t\t\t// Node is smaller than a break\n\t\t\t\tif(dist > len){\n\t\t\t\t\tcounter += len;\n\t\t\t\t\tpos = len;\n\t\t\t\t}\n\n\t\t\t\twhile (pos < len) {\n\t\t\t\t\tcounter = this.break;\n\t\t\t\t\tpos += this.break;\n\n\t\t\t\t\t// Gone over\n\t\t\t\t\tif(pos >= len){\n\t\t\t\t\t\t// Continue counter for next node\n\t\t\t\t\t\tcounter = len - (pos - this.break);\n\n\t\t\t\t\t// At End\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// End the previous range\n\t\t\t\t\t\trange.setEnd(node, pos);\n\t\t\t\t\t\tcfi = section.cfiFromRange(range);\n\t\t\t\t\t\tthis._locations.push(cfi);\n\t\t\t\t\t\tcounter = 0;\n\n\t\t\t\t\t\t// Start new range\n\t\t\t\t\t\tpos += 1;\n\t\t\t\t\t\trange = doc.createRange();\n\t\t\t\t\t\trange.setStart(node, pos);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\n\t\t\t}.bind(this));\n\n\t\t\t// Close remaining\n\t\t\tif (range) {\n\t\t\t\trange.setEnd(prev, prev.length);\n\t\t\t\tcfi = section.cfiFromRange(range);\n\t\t\t\tthis._locations.push(cfi)\n\t\t\t\tcounter = 0;\n\t\t\t}\n\n\t\t}.bind(this));\n\n};\n\nLocations.prototype.sprint = function(root, func) {\n\tvar treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false);\n\n\twhile ((node = treeWalker.nextNode())) {\n\t\tfunc(node);\n\t}\n\n};\n\nLocations.prototype.locationFromCfi = function(cfi){\n\t// Check if the location has not been set yet\n\tif(this._locations.length === 0) {\n\t\treturn -1;\n\t}\n\n\treturn core.locationOf(cfi, this._locations, this.epubcfi.compare);\n};\n\nLocations.prototype.precentageFromCfi = function(cfi) {\n\t// Find closest cfi\n\tvar loc = this.locationFromCfi(cfi);\n\t// Get percentage in total\n\treturn this.precentageFromLocation(loc);\n};\n\nLocations.prototype.percentageFromLocation = function(loc) {\n\tif (!loc || !this.total) {\n\t\treturn 0;\n\t}\n\treturn (loc / this.total);\n};\n\nLocations.prototype.cfiFromLocation = function(loc){\n\tvar cfi = -1;\n\t// check that pg is an int\n\tif(typeof loc != \"number\"){\n\t\tloc = parseInt(pg);\n\t}\n\n\tif(loc >= 0 && loc < this._locations.length) {\n\t\tcfi = this._locations[loc];\n\t}\n\n\treturn cfi;\n};\n\nLocations.prototype.cfiFromPercentage = function(value){\n\tvar percentage = (value > 1) ? value / 100 : value; // Normalize value to 0-1\n\tvar loc = Math.ceil(this.total * percentage);\n\n\treturn this.cfiFromLocation(loc);\n};\n\nLocations.prototype.load = function(locations){\n\tthis._locations = JSON.parse(locations);\n\tthis.total = this._locations.length-1;\n\treturn this._locations;\n};\n\nLocations.prototype.save = function(json){\n\treturn JSON.stringify(this._locations);\n};\n\nLocations.prototype.getCurrent = function(json){\n\treturn this._current;\n};\n\nLocations.prototype.setCurrent = function(curr){\n\tvar loc;\n\n\tif(typeof curr == \"string\"){\n\t\tthis._currentCfi = curr;\n\t} else if (typeof curr == \"number\") {\n\t\tthis._current = curr;\n\t} else {\n\t\treturn;\n\t}\n\n\tif(this._locations.length === 0) {\n\t\treturn;\n\t}\n\n\tif(typeof curr == \"string\"){\n\t\tloc = this.locationFromCfi(curr);\n\t\tthis._current = loc;\n\t} else {\n\t\tloc = curr;\n\t}\n\n\tthis.trigger(\"changed\", {\n\t\tpercentage: this.precentageFromLocation(loc)\n\t});\n};\n\nObject.defineProperty(Locations.prototype, 'currentLocation', {\n\tget: function () {\n\t\treturn this._current;\n\t},\n\tset: function (curr) {\n\t\tthis.setCurrent(curr);\n\t}\n});\n\nRSVP.EventTarget.mixin(Locations.prototype);\n\nmodule.exports = Locations;\n","var RSVP = require('rsvp');\nvar core = require('../../core');\nvar DefaultViewManager = require('../default');\n\nfunction ContinuousViewManager(options) {\n\n\tDefaultViewManager.apply(this, arguments); // call super constructor.\n\n\tthis.name = \"continuous\";\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\tinfinite: true,\n\t\toverflow: \"auto\",\n\t\taxis: \"vertical\",\n\t\toffset: 500,\n\t\toffsetDelta: 250,\n\t\twidth: undefined,\n\t\theight: undefined\n\t});\n\n\tcore.extend(this.settings, options.settings || {});\n\n\t// Gap can be 0, byt defaults doesn't handle that\n\tif (options.settings.gap != \"undefined\" && options.settings.gap === 0) {\n\t\tthis.settings.gap = options.settings.gap;\n\t}\n\n\t// this.viewSettings.axis = this.settings.axis;\n\tthis.viewSettings = {\n\t\tignoreClass: this.settings.ignoreClass,\n\t\taxis: this.settings.axis,\n\t\tlayout: this.layout,\n\t\twidth: 0,\n\t\theight: 0\n\t};\n\n\tthis.scrollTop = 0;\n\tthis.scrollLeft = 0;\n};\n\n// subclass extends superclass\nContinuousViewManager.prototype = Object.create(DefaultViewManager.prototype);\nContinuousViewManager.prototype.constructor = ContinuousViewManager;\n\nContinuousViewManager.prototype.display = function(section, target){\n\treturn DefaultViewManager.prototype.display.call(this, section, target)\n\t\t.then(function () {\n\t\t\treturn this.fill();\n\t\t}.bind(this));\n};\n\nContinuousViewManager.prototype.fill = function(_full){\n\tvar full = _full || new RSVP.defer();\n\n\tthis.check().then(function(result) {\n\t\tif (result) {\n\t\t\tthis.fill(full);\n\t\t} else {\n\t\t\tfull.resolve();\n\t\t}\n\t}.bind(this));\n\n\treturn full.promise;\n}\n\nContinuousViewManager.prototype.moveTo = function(offset){\n\t// var bounds = this.stage.bounds();\n\t// var dist = Math.floor(offset.top / bounds.height) * bounds.height;\n\tvar distX = 0,\n\t\t\tdistY = 0;\n\n\tvar offsetX = 0,\n\t\t\toffsetY = 0;\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tdistY = offset.top;\n\t\toffsetY = offset.top+this.settings.offset;\n\t} else {\n\t\tdistX = Math.floor(offset.left / this.layout.delta) * this.layout.delta;\n\t\toffsetX = distX+this.settings.offset;\n\t}\n\n\treturn this.check(offsetX, offsetY)\n\t\t.then(function(){\n\t\t\tthis.scrollBy(distX, distY);\n\t\t}.bind(this));\n};\n\n/*\nContinuousViewManager.prototype.afterDisplayed = function(currView){\n\tvar next = currView.section.next();\n\tvar prev = currView.section.prev();\n\tvar index = this.views.indexOf(currView);\n\tvar prevView, nextView;\n\n\tif(index + 1 === this.views.length && next) {\n\t\tnextView = this.createView(next);\n\t\tthis.q.enqueue(this.append.bind(this), nextView);\n\t}\n\n\tif(index === 0 && prev) {\n\t\tprevView = this.createView(prev, this.viewSettings);\n\t\tthis.q.enqueue(this.prepend.bind(this), prevView);\n\t}\n\n\t// this.removeShownListeners(currView);\n\t// currView.onShown = this.afterDisplayed.bind(this);\n\tthis.trigger(\"added\", currView.section);\n\n};\n*/\n\nContinuousViewManager.prototype.resize = function(width, height){\n\n\t// Clear the queue\n\tthis.q.clear();\n\n\tthis._stageSize = this.stage.size(width, height);\n\tthis._bounds = this.bounds();\n\n\t// Update for new views\n\tthis.viewSettings.width = this._stageSize.width;\n\tthis.viewSettings.height = this._stageSize.height;\n\n\t// Update for existing views\n\tthis.views.each(function(view) {\n\t\tview.size(this._stageSize.width, this._stageSize.height);\n\t}.bind(this));\n\n\tthis.updateLayout();\n\n\t// if(this.location) {\n\t// this.rendition.display(this.location.start);\n\t// }\n\n\tthis.trigger(\"resized\", {\n\t\twidth: this.stage.width,\n\t\theight: this.stage.height\n\t});\n\n};\n\nContinuousViewManager.prototype.onResized = function(e) {\n\n\t// this.views.clear();\n\n\tclearTimeout(this.resizeTimeout);\n\tthis.resizeTimeout = setTimeout(function(){\n\t\tthis.resize();\n\t}.bind(this), 150);\n};\n\nContinuousViewManager.prototype.afterResized = function(view){\n\tthis.trigger(\"resize\", view.section);\n};\n\n// Remove Previous Listeners if present\nContinuousViewManager.prototype.removeShownListeners = function(view){\n\n\t// view.off(\"shown\", this.afterDisplayed);\n\t// view.off(\"shown\", this.afterDisplayedAbove);\n\tview.onDisplayed = function(){};\n\n};\n\n\n// ContinuousViewManager.prototype.append = function(section){\n// \treturn this.q.enqueue(function() {\n//\n// \t\tthis._append(section);\n//\n//\n// \t}.bind(this));\n// };\n//\n// ContinuousViewManager.prototype.prepend = function(section){\n// \treturn this.q.enqueue(function() {\n//\n// \t\tthis._prepend(section);\n//\n// \t}.bind(this));\n//\n// };\n\nContinuousViewManager.prototype.append = function(section){\n\tvar view = this.createView(section);\n\tthis.views.append(view);\n\treturn view;\n};\n\nContinuousViewManager.prototype.prepend = function(section){\n\tvar view = this.createView(section);\n\n\tview.on(\"resized\", this.counter.bind(this));\n\n\tthis.views.prepend(view);\n\treturn view;\n};\n\nContinuousViewManager.prototype.counter = function(bounds){\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tthis.scrollBy(0, bounds.heightDelta, true);\n\t} else {\n\t\tthis.scrollBy(bounds.widthDelta, 0, true);\n\t}\n\n};\n\nContinuousViewManager.prototype.update = function(_offset){\n\tvar container = this.bounds();\n\tvar views = this.views.all();\n\tvar viewsLength = views.length;\n\tvar visible = [];\n\tvar offset = typeof _offset != \"undefined\" ? _offset : (this.settings.offset || 0);\n\tvar isVisible;\n\tvar view;\n\n\tvar updating = new RSVP.defer();\n\tvar promises = [];\n\n\tfor (var i = 0; i < viewsLength; i++) {\n\t\tview = views[i];\n\n\t\tisVisible = this.isVisible(view, offset, offset, container);\n\n\t\tif(isVisible === true) {\n\t\t\tif (!view.displayed) {\n\t\t\t\tpromises.push(view.display(this.request).then(function (view) {\n\t\t\t\t\tview.show();\n\t\t\t\t}));\n\t\t\t}\n\t\t\tvisible.push(view);\n\t\t} else {\n\t\t\tthis.q.enqueue(view.destroy.bind(view));\n\n\t\t\tclearTimeout(this.trimTimeout);\n\t\t\tthis.trimTimeout = setTimeout(function(){\n\t\t\t\tthis.q.enqueue(this.trim.bind(this));\n\t\t\t}.bind(this), 250);\n\t\t}\n\n\t}\n\n\tif(promises.length){\n\t\treturn RSVP.all(promises);\n\t} else {\n\t\tupdating.resolve();\n\t\treturn updating.promise;\n\t}\n\n};\n\nContinuousViewManager.prototype.check = function(_offsetLeft, _offsetTop){\n\tvar last, first, next, prev;\n\n\tvar checking = new RSVP.defer();\n\tvar newViews = [];\n\n\tvar horizontal = (this.settings.axis === \"horizontal\");\n\tvar delta = this.settings.offset || 0;\n\n\tif (_offsetLeft && horizontal) {\n\t\tdelta = _offsetLeft;\n\t}\n\n\tif (_offsetTop && !horizontal) {\n\t\tdelta = _offsetTop;\n\t}\n\n\tvar bounds = this._bounds; // bounds saved this until resize\n\n\tvar offset = horizontal ? this.scrollLeft : this.scrollTop;\n\tvar visibleLength = horizontal ? bounds.width : bounds.height;\n\tvar contentLength = horizontal ? this.container.scrollWidth : this.container.scrollHeight;\n\n\tif (offset + visibleLength + delta >= contentLength) {\n\t\tlast = this.views.last();\n\t\tnext = last && last.section.next();\n\t\tif(next) {\n\t\t\tnewViews.push(this.append(next));\n\t\t}\n\t}\n\n\tif (offset - delta < 0 ) {\n\t\tfirst = this.views.first();\n\t\tprev = first && first.section.prev();\n\t\tif(prev) {\n\t\t\tnewViews.push(this.prepend(prev));\n\t\t}\n\t}\n\n\tif(newViews.length){\n\t\t// RSVP.all(promises)\n\t\t\t// .then(function() {\n\t\t\t\t// Check to see if anything new is on screen after rendering\n\t\t\t\treturn this.q.enqueue(function(){\n\t\t\t\t\treturn this.update(delta);\n\t\t\t\t}.bind(this));\n\n\n\t\t\t// }.bind(this));\n\n\t} else {\n\t\tchecking.resolve(false);\n\t\treturn checking.promise;\n\t}\n\n\n};\n\nContinuousViewManager.prototype.trim = function(){\n\tvar task = new RSVP.defer();\n\tvar displayed = this.views.displayed();\n\tvar first = displayed[0];\n\tvar last = displayed[displayed.length-1];\n\tvar firstIndex = this.views.indexOf(first);\n\tvar lastIndex = this.views.indexOf(last);\n\tvar above = this.views.slice(0, firstIndex);\n\tvar below = this.views.slice(lastIndex+1);\n\n\t// Erase all but last above\n\tfor (var i = 0; i < above.length-1; i++) {\n\t\tthis.erase(above[i], above);\n\t}\n\n\t// Erase all except first below\n\tfor (var j = 1; j < below.length; j++) {\n\t\tthis.erase(below[j]);\n\t}\n\n\ttask.resolve();\n\treturn task.promise;\n};\n\nContinuousViewManager.prototype.erase = function(view, above){ //Trim\n\n\tvar prevTop;\n\tvar prevLeft;\n\n\tif(this.settings.height) {\n\t\tprevTop = this.container.scrollTop;\n\t\tprevLeft = this.container.scrollLeft;\n\t} else {\n\t\tprevTop = window.scrollY;\n\t\tprevLeft = window.scrollX;\n\t}\n\n\tvar bounds = view.bounds();\n\n\tthis.views.remove(view);\n\n\tif(above) {\n\n\t\tif(this.settings.axis === \"vertical\") {\n\t\t\tthis.scrollTo(0, prevTop - bounds.height, true);\n\t\t} else {\n\t\t\tthis.scrollTo(prevLeft - bounds.width, 0, true);\n\t\t}\n\t}\n\n};\n\nContinuousViewManager.prototype.addEventListeners = function(stage){\n\n\twindow.addEventListener('unload', function(e){\n\t\tthis.ignore = true;\n\t\t// this.scrollTo(0,0);\n\t\tthis.destroy();\n\t}.bind(this));\n\n\tthis.addScrollListeners();\n};\n\nContinuousViewManager.prototype.addScrollListeners = function() {\n\tvar scroller;\n\n\tthis.tick = core.requestAnimationFrame;\n\n\tif(this.settings.height) {\n\t\tthis.prevScrollTop = this.container.scrollTop;\n\t\tthis.prevScrollLeft = this.container.scrollLeft;\n\t} else {\n\t\tthis.prevScrollTop = window.scrollY;\n\t\tthis.prevScrollLeft = window.scrollX;\n\t}\n\n\tthis.scrollDeltaVert = 0;\n\tthis.scrollDeltaHorz = 0;\n\n\tif(this.settings.height) {\n\t\tscroller = this.container;\n\t\tthis.scrollTop = this.container.scrollTop;\n\t\tthis.scrollLeft = this.container.scrollLeft;\n\t} else {\n\t\tscroller = window;\n\t\tthis.scrollTop = window.scrollY;\n\t\tthis.scrollLeft = window.scrollX;\n\t}\n\n\tscroller.addEventListener(\"scroll\", this.onScroll.bind(this));\n\n\t// this.tick.call(window, this.onScroll.bind(this));\n\n\tthis.scrolled = false;\n\n};\n\nContinuousViewManager.prototype.onScroll = function(){\n\n\t// if(!this.ignore) {\n\n\t\tif(this.settings.height) {\n\t\t\tscrollTop = this.container.scrollTop;\n\t\t\tscrollLeft = this.container.scrollLeft;\n\t\t} else {\n\t\t\tscrollTop = window.scrollY;\n\t\t\tscrollLeft = window.scrollX;\n\t\t}\n\n\t\tthis.scrollTop = scrollTop;\n\t\tthis.scrollLeft = scrollLeft;\n\n\t\tif(!this.ignore) {\n\n\t\t\tif((this.scrollDeltaVert === 0 &&\n\t\t\t\t this.scrollDeltaHorz === 0) ||\n\t\t\t\t this.scrollDeltaVert > this.settings.offsetDelta ||\n\t\t\t\t this.scrollDeltaHorz > this.settings.offsetDelta) {\n\n\t\t\t\tthis.q.enqueue(function() {\n\t\t\t\t\tthis.check();\n\t\t\t\t}.bind(this));\n\t\t\t\t// this.check();\n\n\t\t\t\tthis.scrollDeltaVert = 0;\n\t\t\t\tthis.scrollDeltaHorz = 0;\n\n\t\t\t\tthis.trigger(\"scroll\", {\n\t\t\t\t\ttop: scrollTop,\n\t\t\t\t\tleft: scrollLeft\n\t\t\t\t});\n\n\t\t\t\tclearTimeout(this.afterScrolled);\n\t\t\t\tthis.afterScrolled = setTimeout(function () {\n\t\t\t\t\tthis.trigger(\"scrolled\", {\n\t\t\t\t\t\ttop: this.scrollTop,\n\t\t\t\t\t\tleft: this.scrollLeft\n\t\t\t\t\t});\n\t\t\t\t}.bind(this));\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tthis.ignore = false;\n\t\t}\n\n\t\tthis.scrollDeltaVert += Math.abs(scrollTop-this.prevScrollTop);\n\t\tthis.scrollDeltaHorz += Math.abs(scrollLeft-this.prevScrollLeft);\n\n\t\tthis.prevScrollTop = scrollTop;\n\t\tthis.prevScrollLeft = scrollLeft;\n\n\t\tclearTimeout(this.scrollTimeout);\n\t\tthis.scrollTimeout = setTimeout(function(){\n\t\t\tthis.scrollDeltaVert = 0;\n\t\t\tthis.scrollDeltaHorz = 0;\n\t\t}.bind(this), 150);\n\n\n\t\tthis.scrolled = false;\n\t// }\n\n\t// this.tick.call(window, this.onScroll.bind(this));\n\n};\n\n\n// ContinuousViewManager.prototype.resizeView = function(view) {\n//\n// \tif(this.settings.axis === \"horizontal\") {\n// \t\tview.lock(\"height\", this.stage.width, this.stage.height);\n// \t} else {\n// \t\tview.lock(\"width\", this.stage.width, this.stage.height);\n// \t}\n//\n// };\n\nContinuousViewManager.prototype.currentLocation = function(){\n\n\tif (this.settings.axis === \"vertical\") {\n\t\tthis.location = this.scrolledLocation();\n\t} else {\n\t\tthis.location = this.paginatedLocation();\n\t}\n\n\treturn this.location;\n};\n\nContinuousViewManager.prototype.scrolledLocation = function(){\n\n\tvar visible = this.visible();\n\tvar startPage, endPage;\n\n\tvar container = this.container.getBoundingClientRect();\n\n\tif(visible.length === 1) {\n\t\treturn this.mapping.page(visible[0].contents, visible[0].section.cfiBase);\n\t}\n\n\tif(visible.length > 1) {\n\n\t\tstartPage = this.mapping.page(visible[0].contents, visible[0].section.cfiBase);\n\t\tendPage = this.mapping.page(visible[visible.length-1].contents, visible[visible.length-1].section.cfiBase);\n\n\t\treturn {\n\t\t\tstart: startPage.start,\n\t\t\tend: endPage.end\n\t\t};\n\t}\n\n};\n\nContinuousViewManager.prototype.paginatedLocation = function(){\n\tvar visible = this.visible();\n\tvar startA, startB, endA, endB;\n\tvar pageLeft, pageRight;\n\tvar container = this.container.getBoundingClientRect();\n\n\tif(visible.length === 1) {\n\t\tstartA = container.left - visible[0].position().left;\n\t\tendA = startA + this.layout.spreadWidth;\n\n\t\treturn this.mapping.page(visible[0].contents, visible[0].section.cfiBase, startA, endA);\n\t}\n\n\tif(visible.length > 1) {\n\n\t\t// Left Col\n\t\tstartA = container.left - visible[0].position().left;\n\t\tendA = startA + this.layout.columnWidth;\n\n\t\t// Right Col\n\t\tstartB = container.left + this.layout.spreadWidth - visible[visible.length-1].position().left;\n\t\tendB = startB + this.layout.columnWidth;\n\n\t\tpageLeft = this.mapping.page(visible[0].contents, visible[0].section.cfiBase, startA, endA);\n\t\tpageRight = this.mapping.page(visible[visible.length-1].contents, visible[visible.length-1].section.cfiBase, startB, endB);\n\n\t\treturn {\n\t\t\tstart: pageLeft.start,\n\t\t\tend: pageRight.end\n\t\t};\n\t}\n};\n\n/*\nContinuous.prototype.current = function(what){\n\tvar view, top;\n\tvar container = this.container.getBoundingClientRect();\n\tvar length = this.views.length - 1;\n\n\tif(this.settings.axis === \"horizontal\") {\n\n\t\tfor (var i = length; i >= 0; i--) {\n\t\t\tview = this.views[i];\n\t\t\tleft = view.position().left;\n\n\t\t\tif(left < container.right) {\n\n\t\t\t\tif(this._current == view) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._current = view;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t} else {\n\n\t\tfor (var i = length; i >= 0; i--) {\n\t\t\tview = this.views[i];\n\t\t\ttop = view.bounds().top;\n\t\t\tif(top < container.bottom) {\n\n\t\t\t\tif(this._current == view) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._current = view;\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t}\n\n\treturn this._current;\n};\n*/\n\nContinuousViewManager.prototype.updateLayout = function() {\n\n\tif (!this.stage) {\n\t\treturn;\n\t}\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tthis.layout.calculate(this._stageSize.width, this._stageSize.height);\n\t} else {\n\t\tthis.layout.calculate(\n\t\t\tthis._stageSize.width,\n\t\t\tthis._stageSize.height,\n\t\t\tthis.settings.gap\n\t\t);\n\n\t\t// Set the look ahead offset for what is visible\n\t\tthis.settings.offset = this.layout.delta;\n\n\t\tthis.stage.addStyleRules(\"iframe\", [{\"margin-right\" : this.layout.gap + \"px\"}]);\n\n\t}\n\n\t// Set the dimensions for views\n\tthis.viewSettings.width = this.layout.width;\n\tthis.viewSettings.height = this.layout.height;\n\n\tthis.setLayout(this.layout);\n\n};\n\nContinuousViewManager.prototype.next = function(){\n\n\tif(this.settings.axis === \"horizontal\") {\n\n\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\tif(this.container.scrollLeft +\n\t\t\t this.container.offsetWidth +\n\t\t\t this.layout.delta < this.container.scrollWidth) {\n\t\t\tthis.scrollBy(this.layout.delta, 0);\n\t\t} else {\n\t\t\tthis.scrollTo(this.container.scrollWidth - this.layout.delta, 0);\n\t\t}\n\n\t} else {\n\t\tthis.scrollBy(0, this.layout.height);\n\t}\n};\n\nContinuousViewManager.prototype.prev = function(){\n\tif(this.settings.axis === \"horizontal\") {\n\t\tthis.scrollBy(-this.layout.delta, 0);\n\t} else {\n\t\tthis.scrollBy(0, -this.layout.height);\n\t}\n};\n\nContinuousViewManager.prototype.updateFlow = function(flow){\n\tvar axis = (flow === \"paginated\") ? \"horizontal\" : \"vertical\";\n\n\tthis.settings.axis = axis;\n\n\tthis.viewSettings.axis = axis;\n\n\tthis.settings.overflow = (flow === \"paginated\") ? \"hidden\" : \"auto\";\n\n\t// this.views.each(function(view){\n\t// \tview.setAxis(axis);\n\t// });\n\n\tif (this.settings.axis === \"vertical\") {\n\t\tthis.settings.infinite = true;\n\t} else {\n\t\tthis.settings.infinite = false;\n\t}\n\n};\nmodule.exports = ContinuousViewManager;\n","var RSVP = require('rsvp');\nvar core = require('../../core');\nvar EpubCFI = require('../../epubcfi');\nvar Mapping = require('../../mapping');\nvar Queue = require('../../queue');\nvar Stage = require('../helpers/stage');\nvar Views = require('../helpers/views');\n\nfunction DefaultViewManager(options) {\n\n\tthis.name = \"default\";\n\tthis.View = options.view;\n\tthis.request = options.request;\n\tthis.renditionQueue = options.queue;\n\tthis.q = new Queue(this);\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\tinfinite: true,\n\t\thidden: false,\n\t\twidth: undefined,\n\t\theight: undefined,\n\t\t// globalLayoutProperties : { layout: 'reflowable', spread: 'auto', orientation: 'auto'},\n\t\t// layout: null,\n\t\taxis: \"vertical\",\n\t\tignoreClass: ''\n\t});\n\n\tcore.extend(this.settings, options.settings || {});\n\n\tthis.viewSettings = {\n\t\tignoreClass: this.settings.ignoreClass,\n\t\taxis: this.settings.axis,\n\t\tlayout: this.layout,\n\t\twidth: 0,\n\t\theight: 0\n\t};\n\n}\n\nDefaultViewManager.prototype.render = function(element, size){\n\n\t// Save the stage\n\tthis.stage = new Stage({\n\t\twidth: size.width,\n\t\theight: size.height,\n\t\toverflow: this.settings.overflow,\n\t\thidden: this.settings.hidden,\n\t\taxis: this.settings.axis\n\t});\n\n\tthis.stage.attachTo(element);\n\n\t// Get this stage container div\n\tthis.container = this.stage.getContainer();\n\n\t// Views array methods\n\tthis.views = new Views(this.container);\n\n\t// Calculate Stage Size\n\tthis._bounds = this.bounds();\n\tthis._stageSize = this.stage.size();\n\n\t// Set the dimensions for views\n\tthis.viewSettings.width = this._stageSize.width;\n\tthis.viewSettings.height = this._stageSize.height;\n\n\t// Function to handle a resize event.\n\t// Will only attach if width and height are both fixed.\n\tthis.stage.onResize(this.onResized.bind(this));\n\n\t// Add Event Listeners\n\tthis.addEventListeners();\n\n\t// Add Layout method\n\t// this.applyLayoutMethod();\n\tif (this.layout) {\n\t\tthis.updateLayout();\n\t}\n};\n\nDefaultViewManager.prototype.addEventListeners = function(){\n\twindow.addEventListener('unload', function(e){\n\t\tthis.destroy();\n\t}.bind(this));\n};\n\nDefaultViewManager.prototype.destroy = function(){\n\t// this.views.each(function(view){\n\t// \tview.destroy();\n\t// });\n\n\t/*\n\n\t\tclearTimeout(this.trimTimeout);\n\t\tif(this.settings.hidden) {\n\t\t\tthis.element.removeChild(this.wrapper);\n\t\t} else {\n\t\t\tthis.element.removeChild(this.container);\n\t\t}\n\t*/\n};\n\nDefaultViewManager.prototype.onResized = function(e) {\n\tclearTimeout(this.resizeTimeout);\n\tthis.resizeTimeout = setTimeout(function(){\n\t\tthis.resize();\n\t}.bind(this), 150);\n};\n\nDefaultViewManager.prototype.resize = function(width, height){\n\n\t// Clear the queue\n\tthis.q.clear();\n\n\tthis._stageSize = this.stage.size(width, height);\n\tthis._bounds = this.bounds();\n\n\t// Update for new views\n\tthis.viewSettings.width = this._stageSize.width;\n\tthis.viewSettings.height = this._stageSize.height;\n\n\t// Update for existing views\n\tthis.views.each(function(view) {\n\t\tview.size(this._stageSize.width, this._stageSize.height);\n\t}.bind(this));\n\n\tthis.updateLayout();\n\n\tthis.trigger(\"resized\", {\n\t\twidth: this.stage.width,\n\t\theight: this.stage.height\n\t});\n\n};\n\nDefaultViewManager.prototype.createView = function(section) {\n\treturn new this.View(section, this.viewSettings);\n};\n\nDefaultViewManager.prototype.display = function(section, target){\n\n\tvar displaying = new RSVP.defer();\n\tvar displayed = displaying.promise;\n\n\t// Check to make sure the section we want isn't already shown\n\tvar visible = this.views.find(section);\n\n\t// View is already shown, just move to correct location\n\tif(visible && target) {\n\t\toffset = visible.locationOf(target);\n\t\tthis.moveTo(offset);\n\t\tdisplaying.resolve();\n\t\treturn displayed;\n\t}\n\n\t// Hide all current views\n\tthis.views.hide();\n\n\tthis.views.clear();\n\n\tthis.add(section)\n\t\t.then(function(){\n\t\t\tvar next;\n\t\t\tif (this.layout.name === \"pre-paginated\" &&\n\t\t\t\t\tthis.layout.divisor > 1) {\n\t\t\t\tnext = section.next();\n\t\t\t\tif (next) {\n\t\t\t\t\treturn this.add(next);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this))\n\t\t.then(function(view){\n\n\t\t\t// Move to correct place within the section, if needed\n\t\t\tif(target) {\n\t\t\t\toffset = view.locationOf(target);\n\t\t\t\tthis.moveTo(offset);\n\t\t\t}\n\n\t\t\tthis.views.show();\n\n\t\t\tdisplaying.resolve();\n\n\t\t}.bind(this))\n\t\t// .then(function(){\n\t\t// \treturn this.hooks.display.trigger(view);\n\t\t// }.bind(this))\n\t\t// .then(function(){\n\t\t// \tthis.views.show();\n\t\t// }.bind(this));\n\t\treturn displayed;\n};\n\nDefaultViewManager.prototype.afterDisplayed = function(view){\n\tthis.trigger(\"added\", view);\n};\n\nDefaultViewManager.prototype.afterResized = function(view){\n\tthis.trigger(\"resize\", view.section);\n};\n\n// DefaultViewManager.prototype.moveTo = function(offset){\n// \tthis.scrollTo(offset.left, offset.top);\n// };\n\nDefaultViewManager.prototype.moveTo = function(offset){\n\tvar distX = 0,\n\t\t\tdistY = 0;\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tdistY = offset.top;\n\t} else {\n\t\tdistX = Math.floor(offset.left / this.layout.delta) * this.layout.delta;\n\n\t\tif (distX + this.layout.delta > this.container.scrollWidth) {\n\t\t\tdistX = this.container.scrollWidth - this.layout.delta;\n\t\t}\n\t}\n\n\tthis.scrollTo(distX, distY);\n};\n\nDefaultViewManager.prototype.add = function(section){\n\tvar view = this.createView(section);\n\n\tthis.views.append(view);\n\n\t// view.on(\"shown\", this.afterDisplayed.bind(this));\n\tview.onDisplayed = this.afterDisplayed.bind(this);\n\tview.onResize = this.afterResized.bind(this);\n\n\treturn view.display(this.request);\n\n};\n\nDefaultViewManager.prototype.append = function(section){\n\tvar view = this.createView(section);\n\tthis.views.append(view);\n\treturn view.display(this.request);\n};\n\nDefaultViewManager.prototype.prepend = function(section){\n\tvar view = this.createView(section);\n\n\tthis.views.prepend(view);\n\treturn view.display(this.request);\n};\n// DefaultViewManager.prototype.resizeView = function(view) {\n//\n// \tif(this.settings.globalLayoutProperties.layout === \"pre-paginated\") {\n// \t\tview.lock(\"both\", this.bounds.width, this.bounds.height);\n// \t} else {\n// \t\tview.lock(\"width\", this.bounds.width, this.bounds.height);\n// \t}\n//\n// };\n\nDefaultViewManager.prototype.next = function(){\n\tvar next;\n\tvar view;\n\tvar left;\n\n\tif(!this.views.length) return;\n\n\tif(this.settings.axis === \"horizontal\") {\n\n\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\tleft = this.container.scrollLeft + this.container.offsetWidth + this.layout.delta;\n\n\t\tif(left < this.container.scrollWidth) {\n\t\t\tthis.scrollBy(this.layout.delta, 0);\n\t\t} else if (left - this.layout.columnWidth === this.container.scrollWidth) {\n\t\t\tthis.scrollTo(this.container.scrollWidth - this.layout.delta, 0);\n\t\t} else {\n\t\t\tnext = this.views.last().section.next();\n\t\t}\n\n\n\t} else {\n\n\t\tnext = this.views.last().section.next();\n\n\t}\n\n\tif(next) {\n\t\tthis.views.clear();\n\n\t\treturn this.append(next)\n\t\t\t.then(function(){\n\t\t\t\tvar right;\n\t\t\t\tif (this.layout.name && this.layout.divisor > 1) {\n\t\t\t\t\tright = next.next();\n\t\t\t\t\tif (right) {\n\t\t\t\t\t\treturn this.append(right);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tthis.views.show();\n\t\t\t}.bind(this));\n\t}\n\n\n};\n\nDefaultViewManager.prototype.prev = function(){\n\tvar prev;\n\tvar view;\n\tvar left;\n\n\tif(!this.views.length) return;\n\n\tif(this.settings.axis === \"horizontal\") {\n\n\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\tleft = this.container.scrollLeft;\n\n\t\tif(left > 0) {\n\t\t\tthis.scrollBy(-this.layout.delta, 0);\n\t\t} else {\n\t\t\tprev = this.views.first().section.prev();\n\t\t}\n\n\n\t} else {\n\n\t\tprev = this.views.first().section.prev();\n\n\t}\n\n\tif(prev) {\n\t\tthis.views.clear();\n\n\t\treturn this.prepend(prev)\n\t\t\t.then(function(){\n\t\t\t\tvar left;\n\t\t\t\tif (this.layout.name && this.layout.divisor > 1) {\n\t\t\t\t\tleft = prev.prev();\n\t\t\t\t\tif (left) {\n\t\t\t\t\t\treturn this.prepend(left);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tif(this.settings.axis === \"horizontal\") {\n\t\t\t\t\tthis.scrollTo(this.container.scrollWidth - this.layout.delta, 0);\n\t\t\t\t}\n\t\t\t\tthis.views.show();\n\t\t\t}.bind(this));\n\t}\n};\n\nDefaultViewManager.prototype.current = function(){\n\tvar visible = this.visible();\n\tif(visible.length){\n\t\t// Current is the last visible view\n\t\treturn visible[visible.length-1];\n\t}\n\treturn null;\n};\n\nDefaultViewManager.prototype.currentLocation = function(){\n\tvar view;\n\tvar start, end;\n\n\tif(this.views.length) {\n\t\tview = this.views.first();\n\t\tstart = container.left - view.position().left;\n\t\tend = start + this.layout.spread;\n\n\t\treturn this.mapping.page(view, view.section.cfiBase);\n\t}\n\n};\n\nDefaultViewManager.prototype.isVisible = function(view, offsetPrev, offsetNext, _container){\n\tvar position = view.position();\n\tvar container = _container || this.bounds();\n\n\tif(this.settings.axis === \"horizontal\" &&\n\t\tposition.right > container.left - offsetPrev &&\n\t\tposition.left < container.right + offsetNext) {\n\n\t\treturn true;\n\n\t} else if(this.settings.axis === \"vertical\" &&\n\t\tposition.bottom > container.top - offsetPrev &&\n\t\tposition.top < container.bottom + offsetNext) {\n\n\t\treturn true;\n\t}\n\n\treturn false;\n\n};\n\nDefaultViewManager.prototype.visible = function(){\n\t// return this.views.displayed();\n\tvar container = this.bounds();\n\tvar views = this.views.displayed();\n\tvar viewsLength = views.length;\n\tvar visible = [];\n\tvar isVisible;\n\tvar view;\n\n\tfor (var i = 0; i < viewsLength; i++) {\n\t\tview = views[i];\n\t\tisVisible = this.isVisible(view, 0, 0, container);\n\n\t\tif(isVisible === true) {\n\t\t\tvisible.push(view);\n\t\t}\n\n\t}\n\treturn visible;\n};\n\nDefaultViewManager.prototype.scrollBy = function(x, y, silent){\n\tif(silent) {\n\t\tthis.ignore = true;\n\t}\n\n\tif(this.settings.height) {\n\n\t\tif(x) this.container.scrollLeft += x;\n\t\tif(y) this.container.scrollTop += y;\n\n\t} else {\n\t\twindow.scrollBy(x,y);\n\t}\n\t// console.log(\"scrollBy\", x, y);\n\tthis.scrolled = true;\n\tthis.onScroll();\n};\n\nDefaultViewManager.prototype.scrollTo = function(x, y, silent){\n\tif(silent) {\n\t\tthis.ignore = true;\n\t}\n\n\tif(this.settings.height) {\n\t\tthis.container.scrollLeft = x;\n\t\tthis.container.scrollTop = y;\n\t} else {\n\t\twindow.scrollTo(x,y);\n\t}\n\t// console.log(\"scrollTo\", x, y);\n\tthis.scrolled = true;\n\tthis.onScroll();\n\t// if(this.container.scrollLeft != x){\n\t// setTimeout(function() {\n\t// this.scrollTo(x, y, silent);\n\t// }.bind(this), 10);\n\t// return;\n\t// };\n };\n\nDefaultViewManager.prototype.onScroll = function(){\n\n};\n\nDefaultViewManager.prototype.bounds = function() {\n\tvar bounds;\n\n\tbounds = this.stage.bounds();\n\n\treturn bounds;\n};\n\nDefaultViewManager.prototype.applyLayout = function(layout) {\n\n\tthis.layout = layout;\n\tthis.updateLayout();\n\n\tthis.mapping = new Mapping(this.layout);\n\t // this.manager.layout(this.layout.format);\n};\n\nDefaultViewManager.prototype.updateLayout = function() {\n\tif (!this.stage) {\n\t\treturn;\n\t}\n\n\tthis._stageSize = this.stage.size();\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tthis.layout.calculate(this._stageSize.width, this._stageSize.height);\n\t} else {\n\t\tthis.layout.calculate(\n\t\t\tthis._stageSize.width,\n\t\t\tthis._stageSize.height,\n\t\t\tthis.settings.gap\n\t\t);\n\n\t\t// Set the look ahead offset for what is visible\n\t\tthis.settings.offset = this.layout.delta;\n\n\t\tthis.stage.addStyleRules(\"iframe\", [{\"margin-right\" : this.layout.gap + \"px\"}]);\n\n\t}\n\n\t// Set the dimensions for views\n\tthis.viewSettings.width = this.layout.width;\n\tthis.viewSettings.height = this.layout.height;\n\n\tthis.setLayout(this.layout);\n\n};\n\nDefaultViewManager.prototype.setLayout = function(layout){\n\n\tthis.viewSettings.layout = layout;\n\n\tif(this.views) {\n\n\t\tthis.views.each(function(view){\n\t\t\tview.setLayout(layout);\n\t\t});\n\n\t}\n\n};\n\nDefaultViewManager.prototype.updateFlow = function(flow){\n\tvar axis = (flow === \"paginated\") ? \"horizontal\" : \"vertical\";\n\n\tthis.settings.axis = axis;\n\n\tthis.viewSettings.axis = axis;\n\n\tthis.settings.overflow = (flow === \"paginated\") ? \"hidden\" : \"auto\";\n\t// this.views.each(function(view){\n\t// \tview.setAxis(axis);\n\t// });\n\n};\n\n //-- Enable binding events to Manager\n RSVP.EventTarget.mixin(DefaultViewManager.prototype);\n\n module.exports = DefaultViewManager;\n","var core = require('../../core');\n\nfunction Stage(_options) {\n\tthis.settings = _options || {};\n\tthis.id = \"epubjs-container-\" + core.uuid();\n\n\tthis.container = this.create(this.settings);\n\n\tif(this.settings.hidden) {\n\t\tthis.wrapper = this.wrap(this.container);\n\t}\n\n}\n\n/**\n* Creates an element to render to.\n* Resizes to passed width and height or to the elements size\n*/\nStage.prototype.create = function(options){\n\tvar height = options.height;// !== false ? options.height : \"100%\";\n\tvar width = options.width;// !== false ? options.width : \"100%\";\n\tvar overflow = options.overflow || false;\n\tvar axis = options.axis || \"vertical\";\n\n\tif(options.height && core.isNumber(options.height)) {\n\t\theight = options.height + \"px\";\n\t}\n\n\tif(options.width && core.isNumber(options.width)) {\n\t\twidth = options.width + \"px\";\n\t}\n\n\t// Create new container element\n\tcontainer = document.createElement(\"div\");\n\n\tcontainer.id = this.id;\n\tcontainer.classList.add(\"epub-container\");\n\n\t// Style Element\n\t// container.style.fontSize = \"0\";\n\tcontainer.style.wordSpacing = \"0\";\n\tcontainer.style.lineHeight = \"0\";\n\tcontainer.style.verticalAlign = \"top\";\n\n\tif(axis === \"horizontal\") {\n\t\tcontainer.style.whiteSpace = \"nowrap\";\n\t}\n\n\tif(width){\n\t\tcontainer.style.width = width;\n\t}\n\n\tif(height){\n\t\tcontainer.style.height = height;\n\t}\n\n\tif (overflow) {\n\t\tcontainer.style.overflow = overflow;\n\t}\n\n\treturn container;\n};\n\nStage.wrap = function(container) {\n\tvar wrapper = document.createElement(\"div\");\n\n\twrapper.style.visibility = \"hidden\";\n\twrapper.style.overflow = \"hidden\";\n\twrapper.style.width = \"0\";\n\twrapper.style.height = \"0\";\n\n\twrapper.appendChild(container);\n\treturn wrapper;\n};\n\n\nStage.prototype.getElement = function(_element){\n\tvar element;\n\n\tif(core.isElement(_element)) {\n\t\telement = _element;\n\t} else if (typeof _element === \"string\") {\n\t\telement = document.getElementById(_element);\n\t}\n\n\tif(!element){\n\t\tconsole.error(\"Not an Element\");\n\t\treturn;\n\t}\n\n\treturn element;\n};\n\nStage.prototype.attachTo = function(what){\n\n\tvar element = this.getElement(what);\n\tvar base;\n\n\tif(!element){\n\t\treturn;\n\t}\n\n\tif(this.settings.hidden) {\n\t\tbase = this.wrapper;\n\t} else {\n\t\tbase = this.container;\n\t}\n\n\telement.appendChild(base);\n\n\tthis.element = element;\n\n\treturn element;\n\n};\n\nStage.prototype.getContainer = function() {\n\treturn this.container;\n};\n\nStage.prototype.onResize = function(func){\n\t// Only listen to window for resize event if width and height are not fixed.\n\t// This applies if it is set to a percent or auto.\n\tif(!core.isNumber(this.settings.width) ||\n\t\t !core.isNumber(this.settings.height) ) {\n\t\twindow.addEventListener(\"resize\", func, false);\n\t}\n\n};\n\nStage.prototype.size = function(width, height){\n\tvar bounds;\n\t// var width = _width || this.settings.width;\n\t// var height = _height || this.settings.height;\n\n\t// If width or height are set to false, inherit them from containing element\n\tif(width === null) {\n\t\tbounds = this.element.getBoundingClientRect();\n\n\t\tif(bounds.width) {\n\t\t\twidth = bounds.width;\n\t\t\tthis.container.style.width = bounds.width + \"px\";\n\t\t}\n\t}\n\n\tif(height === null) {\n\t\tbounds = bounds || this.element.getBoundingClientRect();\n\n\t\tif(bounds.height) {\n\t\t\theight = bounds.height;\n\t\t\tthis.container.style.height = bounds.height + \"px\";\n\t\t}\n\n\t}\n\n\tif(!core.isNumber(width)) {\n\t\tbounds = this.container.getBoundingClientRect();\n\t\twidth = bounds.width;\n\t\t//height = bounds.height;\n\t}\n\n\tif(!core.isNumber(height)) {\n\t\tbounds = bounds || this.container.getBoundingClientRect();\n\t\t//width = bounds.width;\n\t\theight = bounds.height;\n\t}\n\n\n\tthis.containerStyles = window.getComputedStyle(this.container);\n\n\tthis.containerPadding = {\n\t\tleft: parseFloat(this.containerStyles[\"padding-left\"]) || 0,\n\t\tright: parseFloat(this.containerStyles[\"padding-right\"]) || 0,\n\t\ttop: parseFloat(this.containerStyles[\"padding-top\"]) || 0,\n\t\tbottom: parseFloat(this.containerStyles[\"padding-bottom\"]) || 0\n\t};\n\n\treturn {\n\t\twidth: width -\n\t\t\t\t\t\tthis.containerPadding.left -\n\t\t\t\t\t\tthis.containerPadding.right,\n\t\theight: height -\n\t\t\t\t\t\tthis.containerPadding.top -\n\t\t\t\t\t\tthis.containerPadding.bottom\n\t};\n\n};\n\nStage.prototype.bounds = function(){\n\n\tif(!this.container) {\n\t\treturn core.windowBounds();\n\t} else {\n\t\treturn this.container.getBoundingClientRect();\n\t}\n\n}\n\nStage.prototype.getSheet = function(){\n\tvar style = document.createElement(\"style\");\n\n\t// WebKit hack --> https://davidwalsh.name/add-rules-stylesheets\n\tstyle.appendChild(document.createTextNode(\"\"));\n\n\tdocument.head.appendChild(style);\n\n\treturn style.sheet;\n}\n\nStage.prototype.addStyleRules = function(selector, rulesArray){\n\tvar scope = \"#\" + this.id + \" \";\n\tvar rules = \"\";\n\n\tif(!this.sheet){\n\t\tthis.sheet = this.getSheet();\n\t}\n\n\trulesArray.forEach(function(set) {\n\t\tfor (var prop in set) {\n\t\t\tif(set.hasOwnProperty(prop)) {\n\t\t\t\trules += prop + \":\" + set[prop] + \";\";\n\t\t\t}\n\t\t}\n\t})\n\n\tthis.sheet.insertRule(scope + selector + \" {\" + rules + \"}\", 0);\n}\n\n\n\nmodule.exports = Stage;\n","function Views(container) {\n\tthis.container = container;\n\tthis._views = [];\n\tthis.length = 0;\n\tthis.hidden = false;\n};\n\nViews.prototype.all = function() {\n\treturn this._views;\n};\n\nViews.prototype.first = function() {\n\treturn this._views[0];\n};\n\nViews.prototype.last = function() {\n\treturn this._views[this._views.length-1];\n};\n\nViews.prototype.indexOf = function(view) {\n\treturn this._views.indexOf(view);\n};\n\nViews.prototype.slice = function() {\n\treturn this._views.slice.apply(this._views, arguments);\n};\n\nViews.prototype.get = function(i) {\n\treturn this._views[i];\n};\n\nViews.prototype.append = function(view){\n\tthis._views.push(view);\n\tif(this.container){\n\t\tthis.container.appendChild(view.element);\n\t}\n\tthis.length++;\n\treturn view;\n};\n\nViews.prototype.prepend = function(view){\n\tthis._views.unshift(view);\n\tif(this.container){\n\t\tthis.container.insertBefore(view.element, this.container.firstChild);\n\t}\n\tthis.length++;\n\treturn view;\n};\n\nViews.prototype.insert = function(view, index) {\n\tthis._views.splice(index, 0, view);\n\n\tif(this.container){\n\t\tif(index < this.container.children.length){\n\t\t\tthis.container.insertBefore(view.element, this.container.children[index]);\n\t\t} else {\n\t\t\tthis.container.appendChild(view.element);\n\t\t}\n\t}\n\n\tthis.length++;\n\treturn view;\n};\n\nViews.prototype.remove = function(view) {\n\tvar index = this._views.indexOf(view);\n\n\tif(index > -1) {\n\t\tthis._views.splice(index, 1);\n\t}\n\n\n\tthis.destroy(view);\n\n\tthis.length--;\n};\n\nViews.prototype.destroy = function(view) {\n\tview.off(\"resized\");\n\n\tif(view.displayed){\n\t\tview.destroy();\n\t}\n\n\tif(this.container){\n\t\t this.container.removeChild(view.element);\n\t}\n\tview = null;\n};\n\n// Iterators\n\nViews.prototype.each = function() {\n\treturn this._views.forEach.apply(this._views, arguments);\n};\n\nViews.prototype.clear = function(){\n\t// Remove all views\n\tvar view;\n\tvar len = this.length;\n\n\tif(!this.length) return;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tthis.destroy(view);\n\t}\n\n\tthis._views = [];\n\tthis.length = 0;\n};\n\nViews.prototype.find = function(section){\n\n\tvar view;\n\tvar len = this.length;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tif(view.displayed && view.section.index == section.index) {\n\t\t\treturn view;\n\t\t}\n\t}\n\n};\n\nViews.prototype.displayed = function(){\n\tvar displayed = [];\n\tvar view;\n\tvar len = this.length;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tif(view.displayed){\n\t\t\tdisplayed.push(view);\n\t\t}\n\t}\n\treturn displayed;\n};\n\nViews.prototype.show = function(){\n\tvar view;\n\tvar len = this.length;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tif(view.displayed){\n\t\t\tview.show();\n\t\t}\n\t}\n\tthis.hidden = false;\n};\n\nViews.prototype.hide = function(){\n\tvar view;\n\tvar len = this.length;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tif(view.displayed){\n\t\t\tview.hide();\n\t\t}\n\t}\n\tthis.hidden = true;\n};\n\nmodule.exports = Views;\n","var RSVP = require('rsvp');\nvar core = require('../../core');\nvar EpubCFI = require('../../epubcfi');\nvar Contents = require('../../contents');\n\nfunction IframeView(section, options) {\n\tthis.settings = core.extend({\n\t\tignoreClass : '',\n\t\taxis: 'vertical',\n\t\twidth: 0,\n\t\theight: 0,\n\t\tlayout: undefined,\n\t\tglobalLayoutProperties: {},\n\t}, options || {});\n\n\tthis.id = \"epubjs-view-\" + core.uuid();\n\tthis.section = section;\n\tthis.index = section.index;\n\n\tthis.element = this.container(this.settings.axis);\n\n\tthis.added = false;\n\tthis.displayed = false;\n\tthis.rendered = false;\n\n\tthis.width = this.settings.width;\n\tthis.height = this.settings.height;\n\n\tthis.fixedWidth = 0;\n\tthis.fixedHeight = 0;\n\n\t// Blank Cfi for Parsing\n\tthis.epubcfi = new EpubCFI();\n\n\tthis.layout = this.settings.layout;\n\t// Dom events to listen for\n\t// this.listenedEvents = [\"keydown\", \"keyup\", \"keypressed\", \"mouseup\", \"mousedown\", \"click\", \"touchend\", \"touchstart\"];\n};\n\nIframeView.prototype.container = function(axis) {\n\tvar element = document.createElement('div');\n\n\telement.classList.add(\"epub-view\");\n\n\t// this.element.style.minHeight = \"100px\";\n\telement.style.height = \"0px\";\n\telement.style.width = \"0px\";\n\telement.style.overflow = \"hidden\";\n\n\tif(axis && axis == \"horizontal\"){\n\t\telement.style.display = \"inline-block\";\n\t} else {\n\t\telement.style.display = \"block\";\n\t}\n\n\treturn element;\n};\n\nIframeView.prototype.create = function() {\n\n\tif(this.iframe) {\n\t\treturn this.iframe;\n\t}\n\n\tif(!this.element) {\n\t\tthis.element = this.createContainer();\n\t}\n\n\tthis.iframe = document.createElement('iframe');\n\tthis.iframe.id = this.id;\n\tthis.iframe.scrolling = \"no\"; // Might need to be removed: breaks ios width calculations\n\tthis.iframe.style.overflow = \"hidden\";\n\tthis.iframe.seamless = \"seamless\";\n\t// Back up if seamless isn't supported\n\tthis.iframe.style.border = \"none\";\n\n\tthis.resizing = true;\n\n\t// this.iframe.style.display = \"none\";\n\tthis.element.style.visibility = \"hidden\";\n\tthis.iframe.style.visibility = \"hidden\";\n\n\tthis.iframe.style.width = \"0\";\n\tthis.iframe.style.height = \"0\";\n\tthis._width = 0;\n\tthis._height = 0;\n\n\tthis.element.appendChild(this.iframe);\n\tthis.added = true;\n\n\tthis.elementBounds = core.bounds(this.element);\n\n\t// if(width || height){\n\t// this.resize(width, height);\n\t// } else if(this.width && this.height){\n\t// this.resize(this.width, this.height);\n\t// } else {\n\t// this.iframeBounds = core.bounds(this.iframe);\n\t// }\n\n\t// Firefox has trouble with baseURI and srcdoc\n\t// TODO: Disable for now in firefox\n\n\tif(!!(\"srcdoc\" in this.iframe)) {\n\t\tthis.supportsSrcdoc = true;\n\t} else {\n\t\tthis.supportsSrcdoc = false;\n\t}\n\n\treturn this.iframe;\n};\n\nIframeView.prototype.render = function(request, show) {\n\n\t// view.onLayout = this.layout.format.bind(this.layout);\n\tthis.create();\n\n\t// Fit to size of the container, apply padding\n\tthis.size();\n\n\tif(!this.sectionRender) {\n\t\tthis.sectionRender = this.section.render(request);\n\t}\n\n\t// Render Chain\n\treturn this.sectionRender\n\t\t.then(function(contents){\n\t\t\treturn this.load(contents);\n\t\t}.bind(this))\n\t\t// .then(function(doc){\n\t\t// \treturn this.hooks.content.trigger(view, this);\n\t\t// }.bind(this))\n\t\t.then(function(){\n\t\t\t// this.settings.layout.format(view.contents);\n\t\t\t// return this.hooks.layout.trigger(view, this);\n\t\t}.bind(this))\n\t\t// .then(function(){\n\t\t// \treturn this.display();\n\t\t// }.bind(this))\n\t\t// .then(function(){\n\t\t// \treturn this.hooks.render.trigger(view, this);\n\t\t// }.bind(this))\n\t\t.then(function(){\n\n\t\t\t// apply the layout function to the contents\n\t\t\tthis.settings.layout.format(this.contents);\n\n\t\t\t// Expand the iframe to the full size of the content\n\t\t\tthis.expand();\n\n\t\t\t// Listen for events that require an expansion of the iframe\n\t\t\tthis.addListeners();\n\n\t\t\tif(show !== false) {\n\t\t\t\t//this.q.enqueue(function(view){\n\t\t\t\t\t// this.show();\n\t\t\t\t//}, view);\n\t\t\t}\n\t\t\t// this.map = new Map(view, this.layout);\n\t\t\t//this.hooks.show.trigger(view, this);\n\t\t\tthis.trigger(\"rendered\", this.section);\n\n\t\t}.bind(this))\n\t\t.catch(function(e){\n\t\t\tthis.trigger(\"loaderror\", e);\n\t\t}.bind(this));\n\n};\n\n// Determine locks base on settings\nIframeView.prototype.size = function(_width, _height) {\n\tvar width = _width || this.settings.width;\n\tvar height = _height || this.settings.height;\n\n\tif(this.layout.name === \"pre-paginated\") {\n\t\tthis.lock(\"both\", width, height);\n\t} else if(this.settings.axis === \"horizontal\") {\n\t\tthis.lock(\"height\", width, height);\n\t} else {\n\t\tthis.lock(\"width\", width, height);\n\t}\n\n};\n\n// Lock an axis to element dimensions, taking borders into account\nIframeView.prototype.lock = function(what, width, height) {\n\tvar elBorders = core.borders(this.element);\n\tvar iframeBorders;\n\n\tif(this.iframe) {\n\t\tiframeBorders = core.borders(this.iframe);\n\t} else {\n\t\tiframeBorders = {width: 0, height: 0};\n\t}\n\n\tif(what == \"width\" && core.isNumber(width)){\n\t\tthis.lockedWidth = width - elBorders.width - iframeBorders.width;\n\t\tthis.resize(this.lockedWidth, width); // width keeps ratio correct\n\t}\n\n\tif(what == \"height\" && core.isNumber(height)){\n\t\tthis.lockedHeight = height - elBorders.height - iframeBorders.height;\n\t\tthis.resize(width, this.lockedHeight);\n\t}\n\n\tif(what === \"both\" &&\n\t\t core.isNumber(width) &&\n\t\t core.isNumber(height)){\n\n\t\tthis.lockedWidth = width - elBorders.width - iframeBorders.width;\n\t\tthis.lockedHeight = height - elBorders.height - iframeBorders.height;\n\n\t\tthis.resize(this.lockedWidth, this.lockedHeight);\n\t}\n\n\tif(this.displayed && this.iframe) {\n\n\t\t\t// this.contents.layout();\n\t\t\tthis.expand();\n\n\t}\n\n\n\n};\n\n// Resize a single axis based on content dimensions\nIframeView.prototype.expand = function(force) {\n\tvar width = this.lockedWidth;\n\tvar height = this.lockedHeight;\n\tvar columns;\n\n\tvar textWidth, textHeight;\n\n\tif(!this.iframe || this._expanding) return;\n\n\tthis._expanding = true;\n\n\t// Expand Horizontally\n\t// if(height && !width) {\n\tif(this.settings.axis === \"horizontal\") {\n\t\t// Get the width of the text\n\t\ttextWidth = this.contents.textWidth();\n\t\t// Check if the textWidth has changed\n\t\tif(textWidth != this._textWidth){\n\t\t\t// Get the contentWidth by resizing the iframe\n\t\t\t// Check with a min reset of the textWidth\n\t\t\twidth = this.contentWidth(textWidth);\n\n\t\t\tcolumns = Math.ceil(width / (this.settings.layout.columnWidth + this.settings.layout.gap));\n\n\t\t\tif ( this.settings.layout.divisor > 1 &&\n\t\t\t\t\t this.settings.layout.name === \"reflowable\" &&\n\t\t\t\t\t(columns % 2 > 0)) {\n\t\t\t\t\t// add a blank page\n\t\t\t\t\twidth += this.settings.layout.gap + this.settings.layout.columnWidth;\n\t\t\t}\n\n\t\t\t// Save the textWdith\n\t\t\tthis._textWidth = textWidth;\n\t\t\t// Save the contentWidth\n\t\t\tthis._contentWidth = width;\n\t\t} else {\n\t\t\t// Otherwise assume content height hasn't changed\n\t\t\twidth = this._contentWidth;\n\t\t}\n\t} // Expand Vertically\n\telse if(this.settings.axis === \"vertical\") {\n\t\ttextHeight = this.contents.textHeight();\n\t\tif(textHeight != this._textHeight){\n\t\t\theight = this.contentHeight(textHeight);\n\t\t\tthis._textHeight = textHeight;\n\t\t\tthis._contentHeight = height;\n\t\t} else {\n\t\t\theight = this._contentHeight;\n\t\t}\n\n\t}\n\n\t// Only Resize if dimensions have changed or\n\t// if Frame is still hidden, so needs reframing\n\tif(this._needsReframe || width != this._width || height != this._height){\n\t\tthis.resize(width, height);\n\t}\n\n\tthis._expanding = false;\n};\n\nIframeView.prototype.contentWidth = function(min) {\n\tvar prev;\n\tvar width;\n\n\t// Save previous width\n\tprev = this.iframe.style.width;\n\t// Set the iframe size to min, width will only ever be greater\n\t// Will preserve the aspect ratio\n\tthis.iframe.style.width = (min || 0) + \"px\";\n\t// Get the scroll overflow width\n\twidth = this.contents.scrollWidth();\n\t// Reset iframe size back\n\tthis.iframe.style.width = prev;\n\treturn width;\n};\n\nIframeView.prototype.contentHeight = function(min) {\n\tvar prev;\n\tvar height;\n\n\tprev = this.iframe.style.height;\n\tthis.iframe.style.height = (min || 0) + \"px\";\n\theight = this.contents.scrollHeight();\n\n\tthis.iframe.style.height = prev;\n\treturn height;\n};\n\n\nIframeView.prototype.resize = function(width, height) {\n\n\tif(!this.iframe) return;\n\n\tif(core.isNumber(width)){\n\t\tthis.iframe.style.width = width + \"px\";\n\t\tthis._width = width;\n\t}\n\n\tif(core.isNumber(height)){\n\t\tthis.iframe.style.height = height + \"px\";\n\t\tthis._height = height;\n\t}\n\n\tthis.iframeBounds = core.bounds(this.iframe);\n\n\tthis.reframe(this.iframeBounds.width, this.iframeBounds.height);\n\n};\n\nIframeView.prototype.reframe = function(width, height) {\n\tvar size;\n\n\t// if(!this.displayed) {\n\t// this._needsReframe = true;\n\t// return;\n\t// }\n\tif(core.isNumber(width)){\n\t\tthis.element.style.width = width + \"px\";\n\t}\n\n\tif(core.isNumber(height)){\n\t\tthis.element.style.height = height + \"px\";\n\t}\n\n\tthis.prevBounds = this.elementBounds;\n\n\tthis.elementBounds = core.bounds(this.element);\n\n\tsize = {\n\t\twidth: this.elementBounds.width,\n\t\theight: this.elementBounds.height,\n\t\twidthDelta: this.elementBounds.width - this.prevBounds.width,\n\t\theightDelta: this.elementBounds.height - this.prevBounds.height,\n\t};\n\n\tthis.onResize(this, size);\n\n\tthis.trigger(\"resized\", size);\n\n};\n\n\nIframeView.prototype.load = function(contents) {\n\tvar loading = new RSVP.defer();\n\tvar loaded = loading.promise;\n\n\tif(!this.iframe) {\n\t\tloading.reject(new Error(\"No Iframe Available\"));\n\t\treturn loaded;\n\t}\n\n\tthis.iframe.onload = function(event) {\n\n\t\tthis.onLoad(event, loading);\n\n\t}.bind(this);\n\n\tif(this.supportsSrcdoc){\n\t\tthis.iframe.srcdoc = contents;\n\t} else {\n\n\t\tthis.document = this.iframe.contentDocument;\n\n\t\tif(!this.document) {\n\t\t\tloading.reject(new Error(\"No Document Available\"));\n\t\t\treturn loaded;\n\t\t}\n\n\t\tthis.iframe.contentDocument.open();\n\t\tthis.iframe.contentDocument.write(contents);\n\t\tthis.iframe.contentDocument.close();\n\n\t}\n\n\treturn loaded;\n};\n\nIframeView.prototype.onLoad = function(event, promise) {\n\n\t\tthis.window = this.iframe.contentWindow;\n\t\tthis.document = this.iframe.contentDocument;\n\n\t\tthis.contents = new Contents(this.document, this.document.body, this.section.cfiBase);\n\n\t\tthis.rendering = false;\n\n\t\tvar link = this.document.querySelector(\"link[rel='canonical']\");\n\t\tif (link) {\n\t\t\tlink.setAttribute(\"href\", this.section.url);\n\t\t} else {\n\t\t\tlink = this.document.createElement(\"link\");\n\t\t\tlink.setAttribute(\"rel\", \"canonical\");\n\t\t\tlink.setAttribute(\"href\", this.section.url);\n\t\t\tthis.document.querySelector(\"head\").appendChild(link);\n\t\t}\n\n\t\tthis.contents.on(\"expand\", function () {\n\t\t\tif(this.displayed && this.iframe) {\n\t\t\t\t\tthis.expand();\n\t\t\t}\n\t\t});\n\n\t\tpromise.resolve(this.contents);\n};\n\n\n\n// IframeView.prototype.layout = function(layoutFunc) {\n//\n// this.iframe.style.display = \"inline-block\";\n//\n// // Reset Body Styles\n// // this.document.body.style.margin = \"0\";\n// //this.document.body.style.display = \"inline-block\";\n// //this.document.documentElement.style.width = \"auto\";\n//\n// if(layoutFunc){\n// this.layoutFunc = layoutFunc;\n// }\n//\n// this.contents.layout(this.layoutFunc);\n//\n// };\n//\n// IframeView.prototype.onLayout = function(view) {\n// // stub\n// };\n\nIframeView.prototype.setLayout = function(layout) {\n\tthis.layout = layout;\n};\n\nIframeView.prototype.setAxis = function(axis) {\n\tthis.settings.axis = axis;\n};\n\nIframeView.prototype.resizeListenters = function() {\n\t// Test size again\n\tclearTimeout(this.expanding);\n\tthis.expanding = setTimeout(this.expand.bind(this), 350);\n};\n\nIframeView.prototype.addListeners = function() {\n\t//TODO: Add content listeners for expanding\n};\n\nIframeView.prototype.removeListeners = function(layoutFunc) {\n\t//TODO: remove content listeners for expanding\n};\n\nIframeView.prototype.display = function(request) {\n\tvar displayed = new RSVP.defer();\n\n\tif (!this.displayed) {\n\n\t\tthis.render(request).then(function () {\n\n\t\t\tthis.trigger(\"displayed\", this);\n\t\t\tthis.onDisplayed(this);\n\n\t\t\tthis.displayed = true;\n\t\t\tdisplayed.resolve(this);\n\n\t\t}.bind(this));\n\n\t} else {\n\t\tdisplayed.resolve(this);\n\t}\n\n\n\treturn displayed.promise;\n};\n\nIframeView.prototype.show = function() {\n\n\tthis.element.style.visibility = \"visible\";\n\n\tif(this.iframe){\n\t\tthis.iframe.style.visibility = \"visible\";\n\t}\n\n\tthis.trigger(\"shown\", this);\n};\n\nIframeView.prototype.hide = function() {\n\t// this.iframe.style.display = \"none\";\n\tthis.element.style.visibility = \"hidden\";\n\tthis.iframe.style.visibility = \"hidden\";\n\n\tthis.stopExpanding = true;\n\tthis.trigger(\"hidden\", this);\n};\n\nIframeView.prototype.position = function() {\n\treturn this.element.getBoundingClientRect();\n};\n\nIframeView.prototype.locationOf = function(target) {\n\tvar parentPos = this.iframe.getBoundingClientRect();\n\tvar targetPos = this.contents.locationOf(target, this.settings.ignoreClass);\n\n\treturn {\n\t\t\"left\": window.scrollX + parentPos.left + targetPos.left,\n\t\t\"top\": window.scrollY + parentPos.top + targetPos.top\n\t};\n};\n\nIframeView.prototype.onDisplayed = function(view) {\n\t// Stub, override with a custom functions\n};\n\nIframeView.prototype.onResize = function(view, e) {\n\t// Stub, override with a custom functions\n};\n\nIframeView.prototype.bounds = function() {\n\tif(!this.elementBounds) {\n\t\tthis.elementBounds = core.bounds(this.element);\n\t}\n\treturn this.elementBounds;\n};\n\nIframeView.prototype.destroy = function() {\n\n\tif(this.displayed){\n\t\tthis.displayed = false;\n\n\t\tthis.removeListeners();\n\n\t\tthis.stopExpanding = true;\n\t\tthis.element.removeChild(this.iframe);\n\t\tthis.displayed = false;\n\t\tthis.iframe = null;\n\n\t\tthis._textWidth = null;\n\t\tthis._textHeight = null;\n\t\tthis._width = null;\n\t\tthis._height = null;\n\t}\n\t// this.element.style.height = \"0px\";\n\t// this.element.style.width = \"0px\";\n};\n\nRSVP.EventTarget.mixin(IframeView.prototype);\n\nmodule.exports = IframeView;\n","var EpubCFI = require('./epubcfi');\n\nfunction Mapping(layout){\n\tthis.layout = layout;\n};\n\nMapping.prototype.section = function(view) {\n\tvar ranges = this.findRanges(view);\n\tvar map = this.rangeListToCfiList(view.section.cfiBase, ranges);\n\n\treturn map;\n};\n\nMapping.prototype.page = function(contents, cfiBase, start, end) {\n\tvar root = contents && contents.document ? contents.document.body : false;\n\n\tif (!root) {\n\t\treturn;\n\t}\n\n\treturn this.rangePairToCfiPair(cfiBase, {\n\t\tstart: this.findStart(root, start, end),\n\t\tend: this.findEnd(root, start, end)\n\t});\n};\n\nMapping.prototype.walk = function(root, func) {\n\t//var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT, null, false);\n\tvar treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n\t\t\tacceptNode: function (node) {\n\t\t\t\t\tif ( node.data.trim().length > 0 ) {\n\t\t\t\t\t\treturn NodeFilter.FILTER_ACCEPT;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn NodeFilter.FILTER_REJECT;\n\t\t\t\t\t}\n\t\t\t}\n\t}, false);\n\tvar node;\n\tvar result;\n\twhile ((node = treeWalker.nextNode())) {\n\t\tresult = func(node);\n\t\tif(result) break;\n\t}\n\n\treturn result;\n};\n\nMapping.prototype.findRanges = function(view){\n\tvar columns = [];\n\tvar scrollWidth = view.contents.scrollWidth();\n\tvar count = this.layout.count(scrollWidth);\n\tvar column = this.layout.column;\n\tvar gap = this.layout.gap;\n\tvar start, end;\n\n\tfor (var i = 0; i < count.pages; i++) {\n\t\tstart = (column + gap) * i;\n\t\tend = (column * (i+1)) + (gap * i);\n\t\tcolumns.push({\n\t\t\tstart: this.findStart(view.document.body, start, end),\n\t\t\tend: this.findEnd(view.document.body, start, end)\n\t\t});\n\t}\n\n\treturn columns;\n};\n\nMapping.prototype.findStart = function(root, start, end){\n\tvar stack = [root];\n\tvar $el;\n\tvar found;\n\tvar $prev = root;\n\twhile (stack.length) {\n\n\t\t$el = stack.shift();\n\n\t\tfound = this.walk($el, function(node){\n\t\t\tvar left, right;\n\t\t\tvar elPos;\n\t\t\tvar elRange;\n\n\n\t\t\tif(node.nodeType == Node.TEXT_NODE){\n\t\t\t\telRange = document.createRange();\n\t\t\t\telRange.selectNodeContents(node);\n\t\t\t\telPos = elRange.getBoundingClientRect();\n\t\t\t} else {\n\t\t\t\telPos = node.getBoundingClientRect();\n\t\t\t}\n\n\t\t\tleft = elPos.left;\n\t\t\tright = elPos.right;\n\n\t\t\tif( left >= start && left <= end ) {\n\t\t\t\treturn node;\n\t\t\t} else if (right > start) {\n\t\t\t\treturn node;\n\t\t\t} else {\n\t\t\t\t$prev = node;\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t});\n\n\t\tif(found) {\n\t\t\treturn this.findTextStartRange(found, start, end);\n\t\t}\n\n\t}\n\n\t// Return last element\n\treturn this.findTextStartRange($prev, start, end);\n};\n\nMapping.prototype.findEnd = function(root, start, end){\n\tvar stack = [root];\n\tvar $el;\n\tvar $prev = root;\n\tvar found;\n\n\twhile (stack.length) {\n\n\t\t$el = stack.shift();\n\n\t\tfound = this.walk($el, function(node){\n\n\t\t\tvar left, right;\n\t\t\tvar elPos;\n\t\t\tvar elRange;\n\n\n\t\t\tif(node.nodeType == Node.TEXT_NODE){\n\t\t\t\telRange = document.createRange();\n\t\t\t\telRange.selectNodeContents(node);\n\t\t\t\telPos = elRange.getBoundingClientRect();\n\t\t\t} else {\n\t\t\t\telPos = node.getBoundingClientRect();\n\t\t\t}\n\n\t\t\tleft = elPos.left;\n\t\t\tright = elPos.right;\n\n\t\t\tif(left > end && $prev) {\n\t\t\t\treturn $prev;\n\t\t\t} else if(right > end) {\n\t\t\t\treturn node;\n\t\t\t} else {\n\t\t\t\t$prev = node;\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t});\n\n\n\t\tif(found){\n\t\t\treturn this.findTextEndRange(found, start, end);\n\t\t}\n\n\t}\n\n\t// end of chapter\n\treturn this.findTextEndRange($prev, start, end);\n};\n\n\nMapping.prototype.findTextStartRange = function(node, start, end){\n\tvar ranges = this.splitTextNodeIntoRanges(node);\n\tvar prev;\n\tvar range;\n\tvar pos;\n\n\tfor (var i = 0; i < ranges.length; i++) {\n\t\trange = ranges[i];\n\n\t\tpos = range.getBoundingClientRect();\n\n\t\tif( pos.left >= start ) {\n\t\t\treturn range;\n\t\t}\n\n\t\tprev = range;\n\n\t}\n\n\treturn ranges[0];\n};\n\nMapping.prototype.findTextEndRange = function(node, start, end){\n\tvar ranges = this.splitTextNodeIntoRanges(node);\n\tvar prev;\n\tvar range;\n\tvar pos;\n\n\tfor (var i = 0; i < ranges.length; i++) {\n\t\trange = ranges[i];\n\n\t\tpos = range.getBoundingClientRect();\n\n\t\tif(pos.left > end && prev) {\n\t\t\treturn prev;\n\t\t} else if(pos.right > end) {\n\t\t\treturn range;\n\t\t}\n\n\t\tprev = range;\n\n\t}\n\n\t// Ends before limit\n\treturn ranges[ranges.length-1];\n\n};\n\nMapping.prototype.splitTextNodeIntoRanges = function(node, _splitter){\n\tvar ranges = [];\n\tvar textContent = node.textContent || \"\";\n\tvar text = textContent.trim();\n\tvar range;\n\tvar rect;\n\tvar list;\n\tvar doc = node.ownerDocument;\n\tvar splitter = _splitter || \" \";\n\n\tpos = text.indexOf(splitter);\n\n\tif(pos === -1 || node.nodeType != Node.TEXT_NODE) {\n\t\trange = doc.createRange();\n\t\trange.selectNodeContents(node);\n\t\treturn [range];\n\t}\n\n\trange = doc.createRange();\n\trange.setStart(node, 0);\n\trange.setEnd(node, pos);\n\tranges.push(range);\n\trange = false;\n\n\twhile ( pos != -1 ) {\n\n\t\tpos = text.indexOf(splitter, pos + 1);\n\t\tif(pos > 0) {\n\n\t\t\tif(range) {\n\t\t\t\trange.setEnd(node, pos);\n\t\t\t\tranges.push(range);\n\t\t\t}\n\n\t\t\trange = doc.createRange();\n\t\t\trange.setStart(node, pos+1);\n\t\t}\n\t}\n\n\tif(range) {\n\t\trange.setEnd(node, text.length);\n\t\tranges.push(range);\n\t}\n\n\treturn ranges;\n};\n\n\n\nMapping.prototype.rangePairToCfiPair = function(cfiBase, rangePair){\n\n\tvar startRange = rangePair.start;\n\tvar endRange = rangePair.end;\n\n\tstartRange.collapse(true);\n\tendRange.collapse(true);\n\n\t// startCfi = section.cfiFromRange(startRange);\n\t// endCfi = section.cfiFromRange(endRange);\n\tstartCfi = new EpubCFI(startRange, cfiBase).toString();\n\tendCfi = new EpubCFI(endRange, cfiBase).toString();\n\n\treturn {\n\t\tstart: startCfi,\n\t\tend: endCfi\n\t};\n\n};\n\nMapping.prototype.rangeListToCfiList = function(cfiBase, columns){\n\tvar map = [];\n\tvar rangePair, cifPair;\n\n\tfor (var i = 0; i < columns.length; i++) {\n\t\tcifPair = this.rangePairToCfiPair(cfiBase, columns[i]);\n\n\t\tmap.push(cifPair);\n\n\t}\n\n\treturn map;\n};\n\nmodule.exports = Mapping;\n","var core = require('./core');\nvar Parser = require('./parser');\nvar RSVP = require('rsvp');\nvar URI = require('urijs');\n\nfunction Navigation(_package, _request){\n\tvar navigation = this;\n\tvar parse = new Parser();\n\tvar request = _request || require('./request');\n\n\tthis.package = _package;\n\tthis.toc = [];\n\tthis.tocByHref = {};\n\tthis.tocById = {};\n\n\tif(_package.navPath) {\n\t\tthis.navUrl = URI(_package.navPath).absoluteTo(_package.baseUrl).toString();\n\t\tthis.nav = {};\n\n\t\tthis.nav.load = function(_request){\n\t\t\tvar loading = new RSVP.defer();\n\t\t\tvar loaded = loading.promise;\n\n\t\t\trequest(navigation.navUrl, 'xml').then(function(xml){\n\t\t\t\tnavigation.toc = parse.nav(xml);\n\t\t\t\tnavigation.loaded(navigation.toc);\n\t\t\t\tloading.resolve(navigation.toc);\n\t\t\t});\n\n\t\t\treturn loaded;\n\t\t};\n\n\t}\n\n\tif(_package.ncxPath) {\n\t\tthis.ncxUrl = URI(_package.ncxPath).absoluteTo(_package.baseUrl).toString();\n\t\tthis.ncx = {};\n\n\t\tthis.ncx.load = function(_request){\n\t\t\tvar loading = new RSVP.defer();\n\t\t\tvar loaded = loading.promise;\n\n\t\t\trequest(navigation.ncxUrl, 'xml').then(function(xml){\n\t\t\t\tnavigation.toc = parse.toc(xml);\n\t\t\t\tnavigation.loaded(navigation.toc);\n\t\t\t\tloading.resolve(navigation.toc);\n\t\t\t});\n\n\t\t\treturn loaded;\n\t\t};\n\n\t}\n};\n\n// Load the navigation\nNavigation.prototype.load = function(_request) {\n\tvar request = _request || require('./request');\n\tvar loading, loaded;\n\n\tif(this.nav) {\n\t\tloading = this.nav.load();\n\t} else if(this.ncx) {\n\t\tloading = this.ncx.load();\n\t} else {\n\t\tloaded = new RSVP.defer();\n\t\tloaded.resolve([]);\n\t\tloading = loaded.promise;\n\t}\n\n\treturn loading;\n\n};\n\nNavigation.prototype.loaded = function(toc) {\n\tvar item;\n\n\tfor (var i = 0; i < toc.length; i++) {\n\t\titem = toc[i];\n\t\tthis.tocByHref[item.href] = i;\n\t\tthis.tocById[item.id] = i;\n\t}\n\n};\n\n// Get an item from the navigation\nNavigation.prototype.get = function(target) {\n\tvar index;\n\n\tif(!target) {\n\t\treturn this.toc;\n\t}\n\n\tif(target.indexOf(\"#\") === 0) {\n\t\tindex = this.tocById[target.substring(1)];\n\t} else if(target in this.tocByHref){\n\t\tindex = this.tocByHref[target];\n\t}\n\n\treturn this.toc[index];\n};\n\nmodule.exports = Navigation;\n","var URI = require('urijs');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\n\n\nfunction Parser(){};\n\nParser.prototype.container = function(containerXml){\n\t\t//-- \n\t\tvar rootfile, fullpath, folder, encoding;\n\n\t\tif(!containerXml) {\n\t\t\tconsole.error(\"Container File Not Found\");\n\t\t\treturn;\n\t\t}\n\n\t\trootfile = core.qs(containerXml, \"rootfile\");\n\n\t\tif(!rootfile) {\n\t\t\tconsole.error(\"No RootFile Found\");\n\t\t\treturn;\n\t\t}\n\n\t\tfullpath = rootfile.getAttribute('full-path');\n\t\tfolder = URI(fullpath).directory();\n\t\tencoding = containerXml.xmlEncoding;\n\n\t\t//-- Now that we have the path we can parse the contents\n\t\treturn {\n\t\t\t'packagePath' : fullpath,\n\t\t\t'basePath' : folder,\n\t\t\t'encoding' : encoding\n\t\t};\n};\n\nParser.prototype.identifier = function(packageXml){\n\tvar metadataNode;\n\n\tif(!packageXml) {\n\t\tconsole.error(\"Package File Not Found\");\n\t\treturn;\n\t}\n\n\tmetadataNode = core.qs(packageXml, \"metadata\");\n\n\tif(!metadataNode) {\n\t\tconsole.error(\"No Metadata Found\");\n\t\treturn;\n\t}\n\n\treturn this.getElementText(metadataNode, \"identifier\");\n};\n\nParser.prototype.packageContents = function(packageXml){\n\tvar parse = this;\n\tvar metadataNode, manifestNode, spineNode;\n\tvar manifest, navPath, ncxPath, coverPath;\n\tvar spineNodeIndex;\n\tvar spine;\n\tvar spineIndexByURL;\n\tvar metadata;\n\n\tif(!packageXml) {\n\t\tconsole.error(\"Package File Not Found\");\n\t\treturn;\n\t}\n\n\tmetadataNode = core.qs(packageXml, \"metadata\");\n\tif(!metadataNode) {\n\t\tconsole.error(\"No Metadata Found\");\n\t\treturn;\n\t}\n\n\tmanifestNode = core.qs(packageXml, \"manifest\");\n\tif(!manifestNode) {\n\t\tconsole.error(\"No Manifest Found\");\n\t\treturn;\n\t}\n\n\tspineNode = core.qs(packageXml, \"spine\");\n\tif(!spineNode) {\n\t\tconsole.error(\"No Spine Found\");\n\t\treturn;\n\t}\n\n\tmanifest = parse.manifest(manifestNode);\n\tnavPath = parse.findNavPath(manifestNode);\n\tncxPath = parse.findNcxPath(manifestNode, spineNode);\n\tcoverPath = parse.findCoverPath(packageXml);\n\n\tspineNodeIndex = Array.prototype.indexOf.call(spineNode.parentNode.childNodes, spineNode);\n\n\tspine = parse.spine(spineNode, manifest);\n\n\tmetadata = parse.metadata(metadataNode);\n\n\tmetadata.direction = spineNode.getAttribute(\"page-progression-direction\");\n\n\treturn {\n\t\t'metadata' : metadata,\n\t\t'spine' : spine,\n\t\t'manifest' : manifest,\n\t\t'navPath' : navPath,\n\t\t'ncxPath' : ncxPath,\n\t\t'coverPath': coverPath,\n\t\t'spineNodeIndex' : spineNodeIndex\n\t};\n};\n\n//-- Find TOC NAV\nParser.prototype.findNavPath = function(manifestNode){\n\t// Find item with property 'nav'\n\t// Should catch nav irregardless of order\n\t// var node = manifestNode.querySelector(\"item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']\");\n\tvar node = core.qsp(manifestNode, \"item\", {\"properties\":\"nav\"});\n\treturn node ? node.getAttribute('href') : false;\n};\n\n//-- Find TOC NCX: media-type=\"application/x-dtbncx+xml\" href=\"toc.ncx\"\nParser.prototype.findNcxPath = function(manifestNode, spineNode){\n\t// var node = manifestNode.querySelector(\"item[media-type='application/x-dtbncx+xml']\");\n\tvar node = core.qsp(manifestNode, \"item\", {\"media-type\":\"application/x-dtbncx+xml\"});\n\tvar tocId;\n\n\t// If we can't find the toc by media-type then try to look for id of the item in the spine attributes as\n\t// according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2,\n\t// \"The item that describes the NCX must be referenced by the spine toc attribute.\"\n\tif (!node) {\n\t\ttocId = spineNode.getAttribute(\"toc\");\n\t\tif(tocId) {\n\t\t\t// node = manifestNode.querySelector(\"item[id='\" + tocId + \"']\");\n\t\t\tnode = manifestNode.getElementById(tocId);\n\t\t}\n\t}\n\n\treturn node ? node.getAttribute('href') : false;\n};\n\n//-- Expanded to match Readium web components\nParser.prototype.metadata = function(xml){\n\tvar metadata = {},\n\t\t\tp = this;\n\n\tmetadata.title = p.getElementText(xml, 'title');\n\tmetadata.creator = p.getElementText(xml, 'creator');\n\tmetadata.description = p.getElementText(xml, 'description');\n\n\tmetadata.pubdate = p.getElementText(xml, 'date');\n\n\tmetadata.publisher = p.getElementText(xml, 'publisher');\n\n\tmetadata.identifier = p.getElementText(xml, \"identifier\");\n\tmetadata.language = p.getElementText(xml, \"language\");\n\tmetadata.rights = p.getElementText(xml, \"rights\");\n\n\tmetadata.modified_date = p.getPropertyText(xml, 'dcterms:modified');\n\n\tmetadata.layout = p.getPropertyText(xml, \"rendition:layout\");\n\tmetadata.orientation = p.getPropertyText(xml, 'rendition:orientation');\n\tmetadata.flow = p.getPropertyText(xml, 'rendition:flow');\n\tmetadata.viewport = p.getPropertyText(xml, 'rendition:viewport');\n\t// metadata.page_prog_dir = packageXml.querySelector(\"spine\").getAttribute(\"page-progression-direction\");\n\n\treturn metadata;\n};\n\n//-- Find Cover: \n//-- Fallback for Epub 2.0\nParser.prototype.findCoverPath = function(packageXml){\n\tvar pkg = core.qs(packageXml, \"package\");\n\tvar epubVersion = pkg.getAttribute('version');\n\n\tif (epubVersion === '2.0') {\n\t\tvar metaCover = core.qsp(packageXml, 'meta', {'name':'cover'});\n\t\tif (metaCover) {\n\t\t\tvar coverId = metaCover.getAttribute('content');\n\t\t\t// var cover = packageXml.querySelector(\"item[id='\" + coverId + \"']\");\n\t\t\tvar cover = packageXml.getElementById(coverId);\n\t\t\treturn cover ? cover.getAttribute('href') : false;\n\t\t}\n\t\telse {\n\t\t\treturn false;\n\t\t}\n\t}\n\telse {\n\t\t// var node = packageXml.querySelector(\"item[properties='cover-image']\");\n\t\tvar node = core.qsp(packageXml, 'item', {'properties':'cover-image'});\n\t\treturn node ? node.getAttribute('href') : false;\n\t}\n};\n\nParser.prototype.getElementText = function(xml, tag){\n\tvar found = xml.getElementsByTagNameNS(\"http://purl.org/dc/elements/1.1/\", tag),\n\t\tel;\n\n\tif(!found || found.length === 0) return '';\n\n\tel = found[0];\n\n\tif(el.childNodes.length){\n\t\treturn el.childNodes[0].nodeValue;\n\t}\n\n\treturn '';\n\n};\n\nParser.prototype.getPropertyText = function(xml, property){\n\tvar el = core.qsp(xml, \"meta\", {\"property\":property});\n\n\tif(el && el.childNodes.length){\n\t\treturn el.childNodes[0].nodeValue;\n\t}\n\n\treturn '';\n};\n\nParser.prototype.querySelectorText = function(xml, q){\n\tvar el = xml.querySelector(q);\n\n\tif(el && el.childNodes.length){\n\t\treturn el.childNodes[0].nodeValue;\n\t}\n\n\treturn '';\n};\n\nParser.prototype.manifest = function(manifestXml){\n\tvar manifest = {};\n\n\t//-- Turn items into an array\n\t// var selected = manifestXml.querySelectorAll(\"item\");\n\tvar selected = core.qsa(manifestXml, \"item\");\n\tvar items = Array.prototype.slice.call(selected);\n\n\t//-- Create an object with the id as key\n\titems.forEach(function(item){\n\t\tvar id = item.getAttribute('id'),\n\t\t\t\thref = item.getAttribute('href') || '',\n\t\t\t\ttype = item.getAttribute('media-type') || '',\n\t\t\t\tproperties = item.getAttribute('properties') || '';\n\n\t\tmanifest[id] = {\n\t\t\t'href' : href,\n\t\t\t// 'url' : href,\n\t\t\t'type' : type,\n\t\t\t'properties' : properties.length ? properties.split(' ') : []\n\t\t};\n\n\t});\n\n\treturn manifest;\n\n};\n\nParser.prototype.spine = function(spineXml, manifest){\n\tvar spine = [];\n\n\tvar selected = spineXml.getElementsByTagName(\"itemref\"),\n\t\t\titems = Array.prototype.slice.call(selected);\n\n\tvar epubcfi = new EpubCFI();\n\n\t//-- Add to array to mantain ordering and cross reference with manifest\n\titems.forEach(function(item, index){\n\t\tvar idref = item.getAttribute('idref');\n\t\t// var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id);\n\t\tvar props = item.getAttribute('properties') || '';\n\t\tvar propArray = props.length ? props.split(' ') : [];\n\t\t// var manifestProps = manifest[Id].properties;\n\t\t// var manifestPropArray = manifestProps.length ? manifestProps.split(' ') : [];\n\n\t\tvar itemref = {\n\t\t\t'idref' : idref,\n\t\t\t'linear' : item.getAttribute('linear') || '',\n\t\t\t'properties' : propArray,\n\t\t\t// 'href' : manifest[Id].href,\n\t\t\t// 'url' : manifest[Id].url,\n\t\t\t'index' : index\n\t\t\t// 'cfiBase' : cfiBase\n\t\t};\n\t\tspine.push(itemref);\n\t});\n\n\treturn spine;\n};\n\nParser.prototype.querySelectorByType = function(html, element, type){\n\tvar query;\n\tif (typeof html.querySelector != \"undefined\") {\n\t\tquery = html.querySelector(element+'[*|type=\"'+type+'\"]');\n\t}\n\t// Handle IE not supporting namespaced epub:type in querySelector\n\tif(!query || query.length === 0) {\n\t\tquery = core.qsa(html, element);\n\t\tfor (var i = 0; i < query.length; i++) {\n\t\t\tif(query[i].getAttributeNS(\"http://www.idpf.org/2007/ops\", \"type\") === type) {\n\t\t\t\treturn query[i];\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn query;\n\t}\n};\n\nParser.prototype.nav = function(navHtml, spineIndexByURL, bookSpine){\n\tvar navElement = this.querySelectorByType(navHtml, \"nav\", \"toc\");\n\t// var navItems = navElement ? navElement.querySelectorAll(\"ol li\") : [];\n\tvar navItems = navElement ? core.qsa(navElement, \"li\") : [];\n\tvar length = navItems.length;\n\tvar i;\n\tvar toc = {};\n\tvar list = [];\n\tvar item, parent;\n\n\tif(!navItems || length === 0) return list;\n\n\tfor (i = 0; i < length; ++i) {\n\t\titem = this.navItem(navItems[i], spineIndexByURL, bookSpine);\n\t\ttoc[item.id] = item;\n\t\tif(!item.parent) {\n\t\t\tlist.push(item);\n\t\t} else {\n\t\t\tparent = toc[item.parent];\n\t\t\tparent.subitems.push(item);\n\t\t}\n\t}\n\n\treturn list;\n};\n\nParser.prototype.navItem = function(item, spineIndexByURL, bookSpine){\n\tvar id = item.getAttribute('id') || false,\n\t\t\t// content = item.querySelector(\"a, span\"),\n\t\t\tcontent = core.qs(item, \"a\"),\n\t\t\tsrc = content.getAttribute('href') || '',\n\t\t\ttext = content.textContent || \"\",\n\t\t\t// split = src.split(\"#\"),\n\t\t\t// baseUrl = split[0],\n\t\t\t// spinePos = spineIndexByURL[baseUrl],\n\t\t\t// spineItem = bookSpine[spinePos],\n\t\t\tsubitems = [],\n\t\t\tparentNode = item.parentNode,\n\t\t\tparent;\n\t\t\t// cfi = spineItem ? spineItem.cfi : '';\n\n\tif(parentNode && parentNode.nodeName === \"navPoint\") {\n\t\tparent = parentNode.getAttribute('id');\n\t}\n\n\t/*\n\tif(!id) {\n\t\tif(spinePos) {\n\t\t\tspineItem = bookSpine[spinePos];\n\t\t\tid = spineItem.id;\n\t\t\tcfi = spineItem.cfi;\n\t\t} else {\n\t\t\tid = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid();\n\t\t\titem.setAttribute('id', id);\n\t\t}\n\t}\n\t*/\n\n\treturn {\n\t\t\"id\": id,\n\t\t\"href\": src,\n\t\t\"label\": text,\n\t\t\"subitems\" : subitems,\n\t\t\"parent\" : parent\n\t};\n};\n\nParser.prototype.ncx = function(tocXml, spineIndexByURL, bookSpine){\n\t// var navPoints = tocXml.querySelectorAll(\"navMap navPoint\");\n\tvar navPoints = core.qsa(tocXml, \"navPoint\");\n\tvar length = navPoints.length;\n\tvar i;\n\tvar toc = {};\n\tvar list = [];\n\tvar item, parent;\n\n\tif(!navPoints || length === 0) return list;\n\n\tfor (i = 0; i < length; ++i) {\n\t\titem = this.ncxItem(navPoints[i], spineIndexByURL, bookSpine);\n\t\ttoc[item.id] = item;\n\t\tif(!item.parent) {\n\t\t\tlist.push(item);\n\t\t} else {\n\t\t\tparent = toc[item.parent];\n\t\t\tparent.subitems.push(item);\n\t\t}\n\t}\n\n\treturn list;\n};\n\nParser.prototype.ncxItem = function(item, spineIndexByURL, bookSpine){\n\tvar id = item.getAttribute('id') || false,\n\t\t\t// content = item.querySelector(\"content\"),\n\t\t\tcontent = core.qs(item, \"content\"),\n\t\t\tsrc = content.getAttribute('src'),\n\t\t\t// navLabel = item.querySelector(\"navLabel\"),\n\t\t\tnavLabel = core.qs(item, \"navLabel\"),\n\t\t\ttext = navLabel.textContent ? navLabel.textContent : \"\",\n\t\t\t// split = src.split(\"#\"),\n\t\t\t// baseUrl = split[0],\n\t\t\t// spinePos = spineIndexByURL[baseUrl],\n\t\t\t// spineItem = bookSpine[spinePos],\n\t\t\tsubitems = [],\n\t\t\tparentNode = item.parentNode,\n\t\t\tparent;\n\t\t\t// cfi = spineItem ? spineItem.cfi : '';\n\n\tif(parentNode && parentNode.nodeName === \"navPoint\") {\n\t\tparent = parentNode.getAttribute('id');\n\t}\n\n\t/*\n\tif(!id) {\n\t\tif(spinePos) {\n\t\t\tspineItem = bookSpine[spinePos];\n\t\t\tid = spineItem.id;\n\t\t\tcfi = spineItem.cfi;\n\t\t} else {\n\t\t\tid = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid();\n\t\t\titem.setAttribute('id', id);\n\t\t}\n\t}\n\t*/\n\n\treturn {\n\t\t\"id\": id,\n\t\t\"href\": src,\n\t\t\"label\": text,\n\t\t\"subitems\" : subitems,\n\t\t\"parent\" : parent\n\t};\n};\n\nParser.prototype.pageList = function(navHtml, spineIndexByURL, bookSpine){\n\tvar navElement = this.querySelectorByType(navHtml, \"nav\", \"page-list\");\n\t// var navItems = navElement ? navElement.querySelectorAll(\"ol li\") : [];\n\tvar navItems = navElement ? core.qsa(navElement, \"li\") : [];\n\tvar length = navItems.length;\n\tvar i;\n\tvar toc = {};\n\tvar list = [];\n\tvar item;\n\n\tif(!navItems || length === 0) return list;\n\n\tfor (i = 0; i < length; ++i) {\n\t\titem = this.pageListItem(navItems[i], spineIndexByURL, bookSpine);\n\t\tlist.push(item);\n\t}\n\n\treturn list;\n};\n\nParser.prototype.pageListItem = function(item, spineIndexByURL, bookSpine){\n\tvar id = item.getAttribute('id') || false,\n\t\t// content = item.querySelector(\"a\"),\n\t\tcontent = core.qs(item, \"a\"),\n\t\thref = content.getAttribute('href') || '',\n\t\ttext = content.textContent || \"\",\n\t\tpage = parseInt(text),\n\t\tisCfi = href.indexOf(\"epubcfi\"),\n\t\tsplit,\n\t\tpackageUrl,\n\t\tcfi;\n\n\tif(isCfi != -1) {\n\t\tsplit = href.split(\"#\");\n\t\tpackageUrl = split[0];\n\t\tcfi = split.length > 1 ? split[1] : false;\n\t\treturn {\n\t\t\t\"cfi\" : cfi,\n\t\t\t\"href\" : href,\n\t\t\t\"packageUrl\" : packageUrl,\n\t\t\t\"page\" : page\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\t\"href\" : href,\n\t\t\t\"page\" : page\n\t\t};\n\t}\n};\n\nmodule.exports = Parser;\n","var RSVP = require('rsvp');\nvar core = require('./core');\n\nfunction Queue(_context){\n\tthis._q = [];\n\tthis.context = _context;\n\tthis.tick = core.requestAnimationFrame;\n\tthis.running = false;\n\tthis.paused = false;\n};\n\n// Add an item to the queue\nQueue.prototype.enqueue = function() {\n\tvar deferred, promise;\n\tvar queued;\n\tvar task = [].shift.call(arguments);\n\tvar args = arguments;\n\n\t// Handle single args without context\n\t// if(args && !Array.isArray(args)) {\n\t// args = [args];\n\t// }\n\tif(!task) {\n\t\treturn console.error(\"No Task Provided\");\n\t}\n\n\tif(typeof task === \"function\"){\n\n\t\tdeferred = new RSVP.defer();\n\t\tpromise = deferred.promise;\n\n\t\tqueued = {\n\t\t\t\"task\" : task,\n\t\t\t\"args\" : args,\n\t\t\t//\"context\" : context,\n\t\t\t\"deferred\" : deferred,\n\t\t\t\"promise\" : promise\n\t\t};\n\n\t} else {\n\t\t// Task is a promise\n\t\tqueued = {\n\t\t\t\"promise\" : task\n\t\t};\n\n\t}\n\n\tthis._q.push(queued);\n\n\t// Wait to start queue flush\n\tif (this.paused == false && !this.running) {\n\t\t// setTimeout(this.flush.bind(this), 0);\n\t\t// this.tick.call(window, this.run.bind(this));\n\t\tthis.run();\n\t}\n\n\treturn queued.promise;\n};\n\n// Run one item\nQueue.prototype.dequeue = function(){\n\tvar inwait, task, result;\n\n\tif(this._q.length) {\n\t\tinwait = this._q.shift();\n\t\ttask = inwait.task;\n\t\tif(task){\n\t\t\t// console.log(task)\n\n\t\t\tresult = task.apply(this.context, inwait.args);\n\n\t\t\tif(result && typeof result[\"then\"] === \"function\") {\n\t\t\t\t// Task is a function that returns a promise\n\t\t\t\treturn result.then(function(){\n\t\t\t\t\tinwait.deferred.resolve.apply(this.context, arguments);\n\t\t\t\t}.bind(this));\n\t\t\t} else {\n\t\t\t\t// Task resolves immediately\n\t\t\t\tinwait.deferred.resolve.apply(this.context, result);\n\t\t\t\treturn inwait.promise;\n\t\t\t}\n\n\n\n\t\t} else if(inwait.promise) {\n\t\t\t// Task is a promise\n\t\t\treturn inwait.promise;\n\t\t}\n\n\t} else {\n\t\tinwait = new RSVP.defer();\n\t\tinwait.deferred.resolve();\n\t\treturn inwait.promise;\n\t}\n\n};\n\n// Run All Immediately\nQueue.prototype.dump = function(){\n\twhile(this._q.length) {\n\t\tthis.dequeue();\n\t}\n};\n\n// Run all sequentially, at convince\n\nQueue.prototype.run = function(){\n\n\tif(!this.running){\n\t\tthis.running = true;\n\t\tthis.defered = new RSVP.defer();\n\t}\n\n\tthis.tick.call(window, function() {\n\n\t\tif(this._q.length) {\n\n\t\t\tthis.dequeue()\n\t\t\t\t.then(function(){\n\t\t\t\t\tthis.run();\n\t\t\t\t}.bind(this));\n\n\t\t} else {\n\t\t\tthis.defered.resolve();\n\t\t\tthis.running = undefined;\n\t\t}\n\n\t}.bind(this));\n\n\t// Unpause\n\tif(this.paused == true) {\n\t\tthis.paused = false;\n\t}\n\n\treturn this.defered.promise;\n};\n\n// Flush all, as quickly as possible\nQueue.prototype.flush = function(){\n\n\tif(this.running){\n\t\treturn this.running;\n\t}\n\n\tif(this._q.length) {\n\t\tthis.running = this.dequeue()\n\t\t\t.then(function(){\n\t\t\t\tthis.running = undefined;\n\t\t\t\treturn this.flush();\n\t\t\t}.bind(this));\n\n\t\treturn this.running;\n\t}\n\n};\n\n// Clear all items in wait\nQueue.prototype.clear = function(){\n\tthis._q = [];\n\tthis.running = false;\n};\n\nQueue.prototype.length = function(){\n\treturn this._q.length;\n};\n\nQueue.prototype.pause = function(){\n\tthis.paused = true;\n};\n\n// Create a new task from a callback\nfunction Task(task, args, context){\n\n\treturn function(){\n\t\tvar toApply = arguments || [];\n\n\t\treturn new RSVP.Promise(function(resolve, reject) {\n\t\t\tvar callback = function(value){\n\t\t\t\tresolve(value);\n\t\t\t};\n\t\t\t// Add the callback to the arguments list\n\t\t\ttoApply.push(callback);\n\n\t\t\t// Apply all arguments to the functions\n\t\t\ttask.apply(this, toApply);\n\n\t}.bind(this));\n\n\t};\n\n};\n\nmodule.exports = Queue;\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar replace = require('./replacements');\nvar Hook = require('./hook');\nvar EpubCFI = require('./epubcfi');\nvar Queue = require('./queue');\nvar Layout = require('./layout');\nvar Mapping = require('./mapping');\n\nfunction Rendition(book, options) {\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\twidth: null,\n\t\theight: null,\n\t\tignoreClass: '',\n\t\tmanager: \"single\",\n\t\tview: \"iframe\",\n\t\tflow: null,\n\t\tlayout: null,\n\t\tspread: null,\n\t\tminSpreadWidth: 800, //-- overridden by spread: none (never) / both (always),\n\t\tuseBase64: true\n\t});\n\n\tcore.extend(this.settings, options);\n\n\tthis.viewSettings = {\n\t\tignoreClass: this.settings.ignoreClass\n\t};\n\n\tthis.book = book;\n\n\tthis.views = null;\n\n\t//-- Adds Hook methods to the Rendition prototype\n\tthis.hooks = {};\n\tthis.hooks.display = new Hook(this);\n\tthis.hooks.serialize = new Hook(this);\n\tthis.hooks.content = new Hook(this);\n\tthis.hooks.layout = new Hook(this);\n\tthis.hooks.render = new Hook(this);\n\tthis.hooks.show = new Hook(this);\n\n\tthis.hooks.content.register(replace.links.bind(this));\n\tthis.hooks.content.register(this.passViewEvents.bind(this));\n\n\t// this.hooks.display.register(this.afterDisplay.bind(this));\n\n\tthis.epubcfi = new EpubCFI();\n\n\tthis.q = new Queue(this);\n\n\tthis.q.enqueue(this.book.opened);\n\n\t// Block the queue until rendering is started\n\t// this.starting = new RSVP.defer();\n\t// this.started = this.starting.promise;\n\tthis.q.enqueue(this.start);\n\n\tif(this.book.unarchived) {\n\t\tthis.q.enqueue(this.replacements.bind(this));\n\t}\n\n};\n\nRendition.prototype.setManager = function(manager) {\n\tthis.manager = manager;\n};\n\nRendition.prototype.requireManager = function(manager) {\n\tvar viewManager;\n\n\t// If manager is a string, try to load from register managers,\n\t// or require included managers directly\n\tif (typeof manager === \"string\") {\n\t\t// Use global or require\n\t\tviewManager = typeof ePub != \"undefined\" ? ePub.ViewManagers[manager] : undefined; //require('./managers/'+manager);\n\t} else {\n\t\t// otherwise, assume we were passed a function\n\t\tviewManager = manager\n\t}\n\n\treturn viewManager;\n};\n\nRendition.prototype.requireView = function(view) {\n\tvar View;\n\n\tif (typeof view == \"string\") {\n\t\tView = typeof ePub != \"undefined\" ? ePub.Views[view] : undefined; //require('./views/'+view);\n\t} else {\n\t\t// otherwise, assume we were passed a function\n\t\tView = view\n\t}\n\n\treturn View;\n};\n\nRendition.prototype.start = function(){\n\n\tif(!this.manager) {\n\t\tthis.ViewManager = this.requireManager(this.settings.manager);\n\t\tthis.View = this.requireView(this.settings.view);\n\n\t\tthis.manager = new this.ViewManager({\n\t\t\tview: this.View,\n\t\t\tqueue: this.q,\n\t\t\trequest: this.book.request,\n\t\t\tsettings: this.settings\n\t\t});\n\t}\n\n\t// Parse metadata to get layout props\n\tthis.settings.globalLayoutProperties = this.determineLayoutProperties(this.book.package.metadata);\n\n\tthis.flow(this.settings.globalLayoutProperties.flow);\n\n\tthis.layout(this.settings.globalLayoutProperties);\n\n\t// Listen for displayed views\n\tthis.manager.on(\"added\", this.afterDisplayed.bind(this));\n\n\t// Listen for resizing\n\tthis.manager.on(\"resized\", this.onResized.bind(this));\n\n\t// Listen for scroll changes\n\tthis.manager.on(\"scroll\", this.reportLocation.bind(this));\n\n\n\tthis.on('displayed', this.reportLocation.bind(this));\n\n\t// Trigger that rendering has started\n\tthis.trigger(\"started\");\n\n\t// Start processing queue\n\t// this.starting.resolve();\n};\n\n// Call to attach the container to an element in the dom\n// Container must be attached before rendering can begin\nRendition.prototype.attachTo = function(element){\n\n\treturn this.q.enqueue(function () {\n\n\t\t// Start rendering\n\t\tthis.manager.render(element, {\n\t\t\t\"width\" : this.settings.width,\n\t\t\t\"height\" : this.settings.height\n\t\t});\n\n\t\t// Trigger Attached\n\t\tthis.trigger(\"attached\");\n\n\t}.bind(this));\n\n};\n\nRendition.prototype.display = function(target){\n\n\t// if (!this.book.spine.spineItems.length > 0) {\n\t\t// Book isn't open yet\n\t\t// return this.q.enqueue(this.display, target);\n\t// }\n\n\treturn this.q.enqueue(this._display, target);\n\n};\n\nRendition.prototype._display = function(target){\n\tvar isCfiString = this.epubcfi.isCfiString(target);\n\tvar displaying = new RSVP.defer();\n\tvar displayed = displaying.promise;\n\tvar section;\n\tvar moveTo;\n\n\tsection = this.book.spine.get(target);\n\n\tif(!section){\n\t\tdisplaying.reject(new Error(\"No Section Found\"));\n\t\treturn displayed;\n\t}\n\n\t// Trim the target fragment\n\t// removing the chapter\n\tif(!isCfiString && typeof target === \"string\" &&\n\t\ttarget.indexOf(\"#\") > -1) {\n\t\t\tmoveTo = target.substring(target.indexOf(\"#\")+1);\n\t}\n\n\tif (isCfiString) {\n\t\tmoveTo = target;\n\t}\n\n\treturn this.manager.display(section, moveTo)\n\t\t.then(function(){\n\t\t\tthis.trigger(\"displayed\", section);\n\t\t}.bind(this));\n\n};\n\n/*\nRendition.prototype.render = function(view, show) {\n\n\t// view.onLayout = this.layout.format.bind(this.layout);\n\tview.create();\n\n\t// Fit to size of the container, apply padding\n\tthis.manager.resizeView(view);\n\n\t// Render Chain\n\treturn view.section.render(this.book.request)\n\t\t.then(function(contents){\n\t\t\treturn view.load(contents);\n\t\t}.bind(this))\n\t\t.then(function(doc){\n\t\t\treturn this.hooks.content.trigger(view, this);\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\tthis.layout.format(view.contents);\n\t\t\treturn this.hooks.layout.trigger(view, this);\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\treturn view.display();\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\treturn this.hooks.render.trigger(view, this);\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\tif(show !== false) {\n\t\t\t\tthis.q.enqueue(function(view){\n\t\t\t\t\tview.show();\n\t\t\t\t}, view);\n\t\t\t}\n\t\t\t// this.map = new Map(view, this.layout);\n\t\t\tthis.hooks.show.trigger(view, this);\n\t\t\tthis.trigger(\"rendered\", view.section);\n\n\t\t}.bind(this))\n\t\t.catch(function(e){\n\t\t\tthis.trigger(\"loaderror\", e);\n\t\t}.bind(this));\n\n};\n*/\n\nRendition.prototype.afterDisplayed = function(view){\n\tthis.hooks.content.trigger(view, this);\n\tthis.trigger(\"rendered\", view.section);\n\tthis.reportLocation();\n};\n\nRendition.prototype.onResized = function(size){\n\n\tif(this.location) {\n\t\tthis.display(this.location.start);\n\t}\n\n\tthis.trigger(\"resized\", {\n\t\twidth: size.width,\n\t\theight: size.height\n\t});\n\n};\n\nRendition.prototype.moveTo = function(offset){\n\tthis.manager.moveTo(offset);\n};\n\nRendition.prototype.next = function(){\n\treturn this.q.enqueue(this.manager.next.bind(this.manager))\n\t\t.then(this.reportLocation.bind(this));\n};\n\nRendition.prototype.prev = function(){\n\treturn this.q.enqueue(this.manager.prev.bind(this.manager))\n\t\t.then(this.reportLocation.bind(this));\n};\n\n//-- http://www.idpf.org/epub/301/spec/epub-publications.html#meta-properties-rendering\nRendition.prototype.determineLayoutProperties = function(metadata){\n\tvar settings;\n\tvar layout = this.settings.layout || metadata.layout || \"reflowable\";\n\tvar spread = this.settings.spread || metadata.spread || \"auto\";\n\tvar orientation = this.settings.orientation || metadata.orientation || \"auto\";\n\tvar flow = this.settings.flow || metadata.flow || \"auto\";\n\tvar viewport = metadata.viewport || \"\";\n\tvar minSpreadWidth = this.settings.minSpreadWidth || metadata.minSpreadWidth || 800;\n\n\tif (this.settings.width >= 0 && this.settings.height >= 0) {\n\t\tviewport = \"width=\"+this.settings.width+\", height=\"+this.settings.height+\"\";\n\t}\n\n\tsettings = {\n\t\tlayout : layout,\n\t\tspread : spread,\n\t\torientation : orientation,\n\t\tflow : flow,\n\t\tviewport : viewport,\n\t\tminSpreadWidth : minSpreadWidth\n\t};\n\n\treturn settings;\n};\n\n// Rendition.prototype.applyLayoutProperties = function(){\n// \tvar settings = this.determineLayoutProperties(this.book.package.metadata);\n//\n// \tthis.flow(settings.flow);\n//\n// \tthis.layout(settings);\n// };\n\n// paginated | scrolled\n// (scrolled-continuous vs scrolled-doc are handled by different view managers)\nRendition.prototype.flow = function(_flow){\n\tvar flow;\n\tif (_flow === \"scrolled-doc\" || _flow === \"scrolled-continuous\") {\n\t\tflow = \"scrolled\";\n\t}\n\n\tif (_flow === \"auto\" || _flow === \"paginated\") {\n\t\tflow = \"paginated\";\n\t}\n\n\tif (this._layout) {\n\t\tthis._layout.flow(flow);\n\t}\n\n\tif (this.manager) {\n\t\tthis.manager.updateFlow(flow);\n\t}\n};\n\n// reflowable | pre-paginated\nRendition.prototype.layout = function(settings){\n\tif (settings) {\n\t\tthis._layout = new Layout(settings);\n\t\tthis._layout.spread(settings.spread, this.settings.minSpreadWidth);\n\n\t\tthis.mapping = new Mapping(this._layout);\n\t}\n\n\tif (this.manager && this._layout) {\n\t\tthis.manager.applyLayout(this._layout);\n\t}\n\n\treturn this._layout;\n};\n\n// none | auto (TODO: implement landscape, portrait, both)\nRendition.prototype.spread = function(spread, min){\n\n\tthis._layout.spread(spread, min);\n\n\tif (this.manager.isRendered()) {\n\t\tthis.manager.updateLayout();\n\t}\n};\n\n\nRendition.prototype.reportLocation = function(){\n\treturn this.q.enqueue(function(){\n\t\tvar location = this.manager.currentLocation();\n\t\tif (location && location.then && typeof location.then === 'function') {\n\t\t\tlocation.then(function(result) {\n\t\t\t\tthis.location = result;\n\t\t\t\tthis.trigger(\"locationChanged\", this.location);\n\t\t\t}.bind(this));\n\t\t} else if (location) {\n\t\t\tthis.location = location;\n\t\t\tthis.trigger(\"locationChanged\", this.location);\n\t\t}\n\n\t}.bind(this));\n};\n\n\nRendition.prototype.destroy = function(){\n\t// Clear the queue\n\tthis.q.clear();\n\n\tthis.manager.destroy();\n};\n\nRendition.prototype.passViewEvents = function(view){\n\tview.contents.listenedEvents.forEach(function(e){\n\t\tview.on(e, this.triggerViewEvent.bind(this));\n\t}.bind(this));\n\n\tview.on(\"selected\", this.triggerSelectedEvent.bind(this));\n};\n\nRendition.prototype.triggerViewEvent = function(e){\n\tthis.trigger(e.type, e);\n};\n\nRendition.prototype.triggerSelectedEvent = function(cfirange){\n\tthis.trigger(\"selected\", cfirange);\n};\n\nRendition.prototype.replacements = function(){\n\t// Wait for loading\n\t// return this.q.enqueue(function () {\n\t\t// Get thes books manifest\n\t\tvar manifest = this.book.package.manifest;\n\t\tvar manifestArray = Object.keys(manifest).\n\t\t\tmap(function (key){\n\t\t\t\treturn manifest[key];\n\t\t\t});\n\n\t\t// Exclude HTML\n\t\tvar items = manifestArray.\n\t\t\tfilter(function (item){\n\t\t\t\tif (item.type != \"application/xhtml+xml\" &&\n\t\t\t\t\t\titem.type != \"text/html\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Only CSS\n\t\tvar css = items.\n\t\t\tfilter(function (item){\n\t\t\t\tif (item.type === \"text/css\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Css Urls\n\t\tvar cssUrls = css.map(function(item) {\n\t\t\treturn item.href;\n\t\t});\n\n\t\t// All Assets Urls\n\t\tvar urls = items.\n\t\t\tmap(function(item) {\n\t\t\t\treturn item.href;\n\t\t\t}.bind(this));\n\n\t\t// Create blob urls for all the assets\n\t\tvar processing = urls.\n\t\t\tmap(function(url) {\n\t\t\t\tvar absolute = URI(url).absoluteTo(this.book.baseUrl).toString();\n\t\t\t\t// Full url from archive base\n\t\t\t\treturn this.book.unarchived.createUrl(absolute, {\"base64\": this.settings.useBase64});\n\t\t\t}.bind(this));\n\n\t\tvar replacementUrls;\n\n\t\t// After all the urls are created\n\t\treturn RSVP.all(processing)\n\t\t\t.then(function(_replacementUrls) {\n\t\t\t\tvar replaced = [];\n\n\t\t\t\treplacementUrls = _replacementUrls;\n\n\t\t\t\t// Replace Asset Urls in the text of all css files\n\t\t\t\tcssUrls.forEach(function(href) {\n\t\t\t\t\treplaced.push(this.replaceCss(href, urls, replacementUrls));\n\t\t\t\t}.bind(this));\n\n\t\t\t\treturn RSVP.all(replaced);\n\n\t\t\t}.bind(this))\n\t\t\t.then(function () {\n\t\t\t\t// Replace Asset Urls in chapters\n\t\t\t\t// by registering a hook after the sections contents has been serialized\n\t\t\t\tthis.book.spine.hooks.serialize.register(function(output, section) {\n\n\t\t\t\t\tthis.replaceAssets(section, urls, replacementUrls);\n\n\t\t\t\t}.bind(this));\n\n\t\t\t}.bind(this))\n\t\t\t.catch(function(reason){\n\t\t\t\tconsole.error(reason);\n\t\t\t});\n\t// }.bind(this));\n};\n\nRendition.prototype.replaceCss = function(href, urls, replacementUrls){\n\t\tvar newUrl;\n\t\tvar indexInUrls;\n\n\t\t// Find the absolute url of the css file\n\t\tvar fileUri = URI(href);\n\t\tvar absolute = fileUri.absoluteTo(this.book.baseUrl).toString();\n\t\t// Get the text of the css file from the archive\n\t\tvar textResponse = this.book.unarchived.getText(absolute);\n\t\t// Get asset links relative to css file\n\t\tvar relUrls = urls.\n\t\t\tmap(function(assetHref) {\n\t\t\t\tvar assetUri = URI(assetHref).absoluteTo(this.book.baseUrl);\n\t\t\t\tvar relative = assetUri.relativeTo(absolute).toString();\n\t\t\t\treturn relative;\n\t\t\t}.bind(this));\n\n\t\treturn textResponse.then(function (text) {\n\t\t\t// Replacements in the css text\n\t\t\ttext = replace.substitute(text, relUrls, replacementUrls);\n\n\t\t\t// Get the new url\n\t\t\tif (this.settings.useBase64) {\n\t\t\t\tnewUrl = core.createBase64Url(text, 'text/css');\n\t\t\t} else {\n\t\t\t\tnewUrl = core.createBlobUrl(text, 'text/css');\n\t\t\t}\n\n\t\t\t// switch the url in the replacementUrls\n\t\t\tindexInUrls = urls.indexOf(href);\n\t\t\tif (indexInUrls > -1) {\n\t\t\t\treplacementUrls[indexInUrls] = newUrl;\n\t\t\t}\n\n\t\t\treturn new RSVP.Promise(function(resolve, reject){\n\t\t\t\tresolve(urls, replacementUrls);\n\t\t\t});\n\n\t\t}.bind(this));\n\n};\n\nRendition.prototype.replaceAssets = function(section, urls, replacementUrls){\n\tvar fileUri = URI(section.url);\n\t// Get Urls relative to current sections\n\tvar relUrls = urls.\n\t\tmap(function(href) {\n\t\t\tvar assetUri = URI(href).absoluteTo(this.book.baseUrl);\n\t\t\tvar relative = assetUri.relativeTo(fileUri).toString();\n\t\t\treturn relative;\n\t\t}.bind(this));\n\n\n\tsection.output = replace.substitute(section.output, relUrls, replacementUrls);\n};\n\nRendition.prototype.range = function(_cfi, ignoreClass){\n\tvar cfi = new EpubCFI(_cfi);\n\tvar found = this.visible().filter(function (view) {\n\t\tif(cfi.spinePos === view.index) return true;\n\t});\n\n\t// Should only every return 1 item\n\tif (found.length) {\n\t\treturn found[0].range(cfi, ignoreClass);\n\t}\n};\n\nRendition.prototype.adjustImages = function(view) {\n\n\tview.addStylesheetRules([\n\t\t\t[\"img\",\n\t\t\t\t[\"max-width\", (view.layout.spreadWidth) + \"px\"],\n\t\t\t\t[\"max-height\", (view.layout.height) + \"px\"]\n\t\t\t]\n\t]);\n\treturn new RSVP.Promise(function(resolve, reject){\n\t\t// Wait to apply\n\t\tsetTimeout(function() {\n\t\t\tresolve();\n\t\t}, 1);\n\t});\n};\n\n//-- Enable binding events to Renderer\nRSVP.EventTarget.mixin(Rendition.prototype);\n\nmodule.exports = Rendition;\n","var URI = require('urijs');\nvar core = require('./core');\n\nfunction base(doc, section){\n\tvar base;\n\tvar head;\n\n\tif(!doc){\n\t\treturn;\n\t}\n\n\t// head = doc.querySelector(\"head\");\n\t// base = head.querySelector(\"base\");\n\thead = core.qs(doc, \"head\");\n\tbase = core.qs(head, \"base\");\n\n\tif(!base) {\n\t\tbase = doc.createElement(\"base\");\n\t\thead.insertBefore(base, head.firstChild);\n\t}\n\n\tbase.setAttribute(\"href\", section.url);\n}\n\nfunction canonical(doc, section){\n\tvar head;\n\tvar link;\n\tvar url = section.url; // window.location.origin + window.location.pathname + \"?loc=\" + encodeURIComponent(section.url);\n\n\tif(!doc){\n\t\treturn;\n\t}\n\n\thead = core.qs(doc, \"head\");\n\tlink = core.qs(head, \"link[rel='canonical']\");\n\n\tif (link) {\n\t\tlink.setAttribute(\"href\", url);\n\t} else {\n\t\tlink = doc.createElement(\"link\");\n\t\tlink.setAttribute(\"rel\", \"canonical\");\n\t\tlink.setAttribute(\"href\", url);\n\t\thead.appendChild(link);\n\t}\n}\n\nfunction links(view, renderer) {\n\n\tvar links = view.document.querySelectorAll(\"a[href]\");\n\tvar replaceLinks = function(link){\n\t\tvar href = link.getAttribute(\"href\");\n\n\t\tif(href.indexOf(\"mailto:\") === 0){\n\t\t\treturn;\n\t\t}\n\n\t\tvar linkUri = URI(href);\n\t\tvar absolute = linkUri.absoluteTo(view.section.url);\n\t\tvar relative = absolute.relativeTo(this.book.baseUrl).toString();\n\n\t\tif(linkUri.protocol()){\n\n\t\t\tlink.setAttribute(\"target\", \"_blank\");\n\n\t\t}else{\n\t\t\t/*\n\t\t\tif(baseDirectory) {\n\t\t\t\t// We must ensure that the file:// protocol is preserved for\n\t\t\t\t// local file links, as in certain contexts (such as under\n\t\t\t\t// Titanium), file links without the file:// protocol will not\n\t\t\t\t// work\n\t\t\t\tif (baseUri.protocol === \"file\") {\n\t\t\t\t\trelative = core.resolveUrl(baseUri.base, href);\n\t\t\t\t} else {\n\t\t\t\t\trelative = core.resolveUrl(baseDirectory, href);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trelative = href;\n\t\t\t}\n\t\t\t*/\n\n\t\t\tif(linkUri.fragment()) {\n\t\t\t\t// do nothing with fragment yet\n\t\t\t} else {\n\t\t\t\tlink.onclick = function(){\n\t\t\t\t\trenderer.display(relative);\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t}\n\n\t\t}\n\t}.bind(this);\n\n\tfor (var i = 0; i < links.length; i++) {\n\t\treplaceLinks(links[i]);\n\t}\n\n\n};\n\nfunction substitute(content, urls, replacements) {\n\turls.forEach(function(url, i){\n\t\tif (url && replacements[i]) {\n\t\t\tcontent = content.replace(new RegExp(url, 'g'), replacements[i]);\n\t\t}\n\t});\n\treturn content;\n}\nmodule.exports = {\n\t'base': base,\n\t'canonical' : canonical,\n\t'links': links,\n\t'substitute': substitute\n};\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\n\nfunction request(url, type, withCredentials, headers) {\n\tvar supportsURL = (typeof window != \"undefined\") ? window.URL : false; // TODO: fallback for url if window isn't defined\n\tvar BLOB_RESPONSE = supportsURL ? \"blob\" : \"arraybuffer\";\n\tvar uri;\n\n\tvar deferred = new RSVP.defer();\n\n\tvar xhr = new XMLHttpRequest();\n\n\t//-- Check from PDF.js:\n\t// https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js\n\tvar xhrPrototype = XMLHttpRequest.prototype;\n\n\tvar header;\n\n\tif (!('overrideMimeType' in xhrPrototype)) {\n\t\t// IE10 might have response, but not overrideMimeType\n\t\tObject.defineProperty(xhrPrototype, 'overrideMimeType', {\n\t\t\tvalue: function xmlHttpRequestOverrideMimeType(mimeType) {}\n\t\t});\n\t}\n\tif(withCredentials) {\n\t\txhr.withCredentials = true;\n\t}\n\n\txhr.onreadystatechange = handler;\n\txhr.onerror = err;\n\n\txhr.open(\"GET\", url, true);\n\n\tfor(header in headers) {\n\t\txhr.setRequestHeader(header, headers[header]);\n\t}\n\n\tif(type == \"json\") {\n\t\txhr.setRequestHeader(\"Accept\", \"application/json\");\n\t}\n\n\t// If type isn't set, determine it from the file extension\n\tif(!type) {\n\t\turi = URI(url);\n\t\ttype = uri.suffix();\n\t}\n\n\tif(type == 'blob'){\n\t\txhr.responseType = BLOB_RESPONSE;\n\t}\n\n\n\tif(core.isXml(type)) {\n\t\t// xhr.responseType = \"document\";\n\t\txhr.overrideMimeType('text/xml'); // for OPF parsing\n\t}\n\n\tif(type == 'xhtml') {\n\t\t// xhr.responseType = \"document\";\n\t}\n\n\tif(type == 'html' || type == 'htm') {\n\t\t// xhr.responseType = \"document\";\n\t }\n\n\tif(type == \"binary\") {\n\t\txhr.responseType = \"arraybuffer\";\n\t}\n\n\txhr.send();\n\n\tfunction err(e) {\n\t\tconsole.error(e);\n\t\tdeferred.reject(e);\n\t}\n\n\tfunction handler() {\n\t\tif (this.readyState === XMLHttpRequest.DONE) {\n\n\t\t\tif (this.status === 200 || this.responseXML ) { //-- Firefox is reporting 0 for blob urls\n\t\t\t\tvar r;\n\n\t\t\t\tif (!this.response && !this.responseXML) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: this.status,\n\t\t\t\t\t\tmessage : \"Empty Response\",\n\t\t\t\t\t\tstack : new Error().stack\n\t\t\t\t\t});\n\t\t\t\t\treturn deferred.promise;\n\t\t\t\t}\n\n\t\t\t\tif (this.status === 403) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: this.status,\n\t\t\t\t\t\tresponse: this.response,\n\t\t\t\t\t\tmessage : \"Forbidden\",\n\t\t\t\t\t\tstack : new Error().stack\n\t\t\t\t\t});\n\t\t\t\t\treturn deferred.promise;\n\t\t\t\t}\n\n\t\t\t\tif((this.responseType == '' || this.responseType == 'document')\n\t\t\t\t\t\t&& this.responseXML){\n\t\t\t\t\tr = this.responseXML;\n\t\t\t\t} else\n\t\t\t\tif(core.isXml(type)){\n\t\t\t\t\t// xhr.overrideMimeType('text/xml'); // for OPF parsing\n\t\t\t\t\t// If this.responseXML wasn't set, try to parse using a DOMParser from text\n\t\t\t\t\tr = core.parse(this.response, \"text/xml\");\n\t\t\t\t}else\n\t\t\t\tif(type == 'xhtml'){\n\t\t\t\t\tr = core.parse(this.response, \"application/xhtml+xml\");\n\t\t\t\t}else\n\t\t\t\tif(type == 'html' || type == 'htm'){\n\t\t\t\t\tr = core.parse(this.response, \"text/html\");\n\t\t\t\t}else\n\t\t\t\tif(type == 'json'){\n\t\t\t\t\tr = JSON.parse(this.response);\n\t\t\t\t}else\n\t\t\t\tif(type == 'blob'){\n\n\t\t\t\t\tif(supportsURL) {\n\t\t\t\t\t\tr = this.response;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//-- Safari doesn't support responseType blob, so create a blob from arraybuffer\n\t\t\t\t\t\tr = new Blob([this.response]);\n\t\t\t\t\t}\n\n\t\t\t\t}else{\n\t\t\t\t\tr = this.response;\n\t\t\t\t}\n\n\t\t\t\tdeferred.resolve(r);\n\t\t\t} else {\n\n\t\t\t\tdeferred.reject({\n\t\t\t\t\tstatus: this.status,\n\t\t\t\t\tmessage : this.response,\n\t\t\t\t\tstack : new Error().stack\n\t\t\t\t});\n\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deferred.promise;\n};\n\nmodule.exports = request;\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Hook = require('./hook');\n\nfunction Section(item, hooks){\n\t\tthis.idref = item.idref;\n\t\tthis.linear = item.linear;\n\t\tthis.properties = item.properties;\n\t\tthis.index = item.index;\n\t\tthis.href = item.href;\n\t\tthis.url = item.url;\n\t\tthis.next = item.next;\n\t\tthis.prev = item.prev;\n\n\t\tthis.cfiBase = item.cfiBase;\n\n\t\tif (hooks) {\n\t\t\tthis.hooks = hooks;\n\t\t} else {\n\t\t\tthis.hooks = {};\n\t\t\tthis.hooks.serialize = new Hook(this);\n\t\t\tthis.hooks.content = new Hook(this);\n\t\t}\n\n};\n\n\nSection.prototype.load = function(_request){\n\tvar request = _request || this.request || require('./request');\n\tvar loading = new RSVP.defer();\n\tvar loaded = loading.promise;\n\n\tif(this.contents) {\n\t\tloading.resolve(this.contents);\n\t} else {\n\t\trequest(this.url)\n\t\t\t.then(function(xml){\n\t\t\t\tvar base;\n\t\t\t\tvar directory = URI(this.url).directory();\n\n\t\t\t\tthis.document = xml;\n\t\t\t\tthis.contents = xml.documentElement;\n\n\t\t\t\treturn this.hooks.content.trigger(this.document, this);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tloading.resolve(this.contents);\n\t\t\t}.bind(this))\n\t\t\t.catch(function(error){\n\t\t\t\tloading.reject(error);\n\t\t\t});\n\t}\n\n\treturn loaded;\n};\n\nSection.prototype.base = function(_document){\n\t\tvar task = new RSVP.defer();\n\t\tvar base = _document.createElement(\"base\"); // TODO: check if exists\n\t\tvar head;\n\t\tconsole.log(window.location.origin + \"/\" +this.url);\n\n\t\tbase.setAttribute(\"href\", window.location.origin + \"/\" +this.url);\n\n\t\tif(_document) {\n\t\t\thead = _document.querySelector(\"head\");\n\t\t}\n\t\tif(head) {\n\t\t\thead.insertBefore(base, head.firstChild);\n\t\t\ttask.resolve();\n\t\t} else {\n\t\t\ttask.reject(new Error(\"No head to insert into\"));\n\t\t}\n\n\n\t\treturn task.promise;\n};\n\nSection.prototype.beforeSectionLoad = function(){\n\t// Stub for a hook - replace me for now\n};\n\nSection.prototype.render = function(_request){\n\tvar rendering = new RSVP.defer();\n\tvar rendered = rendering.promise;\n\tthis.output; // TODO: better way to return this from hooks?\n\n\tthis.load(_request).\n\t\tthen(function(contents){\n\t\t\tvar serializer;\n\n\t\t\tif (typeof XMLSerializer === \"undefined\") {\n\t\t\t\tXMLSerializer = require('xmldom').XMLSerializer;\n\t\t\t}\n\t\t\tserializer = new XMLSerializer();\n\t\t\tthis.output = serializer.serializeToString(contents);\n\t\t\treturn this.output;\n\t\t}.bind(this)).\n\t\tthen(function(){\n\t\t\treturn this.hooks.serialize.trigger(this.output, this);\n\t\t}.bind(this)).\n\t\tthen(function(){\n\t\t\trendering.resolve(this.output);\n\t\t}.bind(this))\n\t\t.catch(function(error){\n\t\t\trendering.reject(error);\n\t\t});\n\n\treturn rendered;\n};\n\nSection.prototype.find = function(_query){\n\n};\n\n/**\n* Reconciles the current chapters layout properies with\n* the global layout properities.\n* Takes: global layout settings object, chapter properties string\n* Returns: Object with layout properties\n*/\nSection.prototype.reconcileLayoutSettings = function(global){\n\t//-- Get the global defaults\n\tvar settings = {\n\t\tlayout : global.layout,\n\t\tspread : global.spread,\n\t\torientation : global.orientation\n\t};\n\n\t//-- Get the chapter's display type\n\tthis.properties.forEach(function(prop){\n\t\tvar rendition = prop.replace(\"rendition:\", '');\n\t\tvar split = rendition.indexOf(\"-\");\n\t\tvar property, value;\n\n\t\tif(split != -1){\n\t\t\tproperty = rendition.slice(0, split);\n\t\t\tvalue = rendition.slice(split+1);\n\n\t\t\tsettings[property] = value;\n\t\t}\n\t});\n return settings;\n};\n\nSection.prototype.cfiFromRange = function(_range) {\n\treturn new EpubCFI(_range, this.cfiBase).toString();\n};\n\nSection.prototype.cfiFromElement = function(el) {\n\treturn new EpubCFI(el, this.cfiBase).toString();\n};\n\nmodule.exports = Section;\n","var RSVP = require('rsvp');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Hook = require('./hook');\nvar Section = require('./section');\nvar replacements = require('./replacements');\n\nfunction Spine(_request){\n\tthis.request = _request;\n\tthis.spineItems = [];\n\tthis.spineByHref = {};\n\tthis.spineById = {};\n\n\tthis.hooks = {};\n\tthis.hooks.serialize = new Hook();\n\tthis.hooks.content = new Hook();\n\n\t// Register replacements\n\tthis.hooks.content.register(replacements.base);\n\tthis.hooks.content.register(replacements.canonical);\n\n\tthis.epubcfi = new EpubCFI();\n\n\tthis.loaded = false;\n};\n\nSpine.prototype.load = function(_package) {\n\n\tthis.items = _package.spine;\n\tthis.manifest = _package.manifest;\n\tthis.spineNodeIndex = _package.spineNodeIndex;\n\tthis.baseUrl = _package.baseUrl || '';\n\tthis.length = this.items.length;\n\n\tthis.items.forEach(function(item, index){\n\t\tvar href, url;\n\t\tvar manifestItem = this.manifest[item.idref];\n\t\tvar spineItem;\n\n\t\titem.cfiBase = this.epubcfi.generateChapterComponent(this.spineNodeIndex, item.index, item.idref);\n\n\t\tif(manifestItem) {\n\t\t\titem.href = manifestItem.href;\n\t\t\titem.url = this.baseUrl + item.href;\n\n\t\t\tif(manifestItem.properties.length){\n\t\t\t\titem.properties.push.apply(item.properties, manifestItem.properties);\n\t\t\t}\n\t\t}\n\n\t\t// if(index > 0) {\n\t\t\titem.prev = function(){ return this.get(index-1); }.bind(this);\n\t\t// }\n\n\t\t// if(index+1 < this.items.length) {\n\t\t\titem.next = function(){ return this.get(index+1); }.bind(this);\n\t\t// }\n\n\t\tspineItem = new Section(item, this.hooks);\n\n\t\tthis.append(spineItem);\n\n\n\t}.bind(this));\n\n\tthis.loaded = true;\n};\n\n// book.spine.get();\n// book.spine.get(1);\n// book.spine.get(\"chap1.html\");\n// book.spine.get(\"#id1234\");\nSpine.prototype.get = function(target) {\n\tvar index = 0;\n\n\tif(this.epubcfi.isCfiString(target)) {\n\t\tcfi = new EpubCFI(target);\n\t\tindex = cfi.spinePos;\n\t} else if(target && (typeof target === \"number\" || isNaN(target) === false)){\n\t\tindex = target;\n\t} else if(target && target.indexOf(\"#\") === 0) {\n\t\tindex = this.spineById[target.substring(1)];\n\t} else if(target) {\n\t\t// Remove fragments\n\t\ttarget = target.split(\"#\")[0];\n\t\tindex = this.spineByHref[target];\n\t}\n\n\treturn this.spineItems[index] || null;\n};\n\nSpine.prototype.append = function(section) {\n\tvar index = this.spineItems.length;\n\tsection.index = index;\n\n\tthis.spineItems.push(section);\n\n\tthis.spineByHref[section.href] = index;\n\tthis.spineById[section.idref] = index;\n\n\treturn index;\n};\n\nSpine.prototype.prepend = function(section) {\n\tvar index = this.spineItems.unshift(section);\n\tthis.spineByHref[section.href] = 0;\n\tthis.spineById[section.idref] = 0;\n\n\t// Re-index\n\tthis.spineItems.forEach(function(item, index){\n\t\titem.index = index;\n\t});\n\n\treturn 0;\n};\n\nSpine.prototype.insert = function(section, index) {\n\n};\n\nSpine.prototype.remove = function(section) {\n\tvar index = this.spineItems.indexOf(section);\n\n\tif(index > -1) {\n\t\tdelete this.spineByHref[section.href];\n\t\tdelete this.spineById[section.idref];\n\n\t\treturn this.spineItems.splice(index, 1);\n\t}\n};\n\nSpine.prototype.each = function() {\n\treturn this.spineItems.forEach.apply(this.spineItems, arguments);\n};\n\nmodule.exports = Spine;\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar request = require('./request');\nvar mime = require('../libs/mime/mime');\n\nfunction Unarchive() {\n\n\tthis.checkRequirements();\n\tthis.urlCache = {};\n\n}\n\nUnarchive.prototype.checkRequirements = function(callback){\n\ttry {\n\t\tif (typeof JSZip !== 'undefined') {\n\t\t\tthis.zip = new JSZip();\n\t\t} else {\n\t\t\tJSZip = require('jszip');\n\t\t\tthis.zip = new JSZip();\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(\"JSZip lib not loaded\");\n\t}\n};\n\nUnarchive.prototype.open = function(zipUrl, isBase64){\n\tif (zipUrl instanceof ArrayBuffer || isBase64) {\n\t\treturn this.zip.loadAsync(zipUrl, {\"base64\": isBase64});\n\t} else {\n\t\treturn request(zipUrl, \"binary\")\n\t\t\t.then(function(data){\n\t\t\t\treturn this.zip.loadAsync(data);\n\t\t\t}.bind(this));\n\t}\n};\n\nUnarchive.prototype.request = function(url, type){\n\tvar deferred = new RSVP.defer();\n\tvar response;\n\tvar r;\n\n\t// If type isn't set, determine it from the file extension\n\tif(!type) {\n\t\turi = URI(url);\n\t\ttype = uri.suffix();\n\t}\n\n\tif(type == 'blob'){\n\t\tresponse = this.getBlob(url);\n\t} else {\n\t\tresponse = this.getText(url);\n\t}\n\n\tif (response) {\n\t\tresponse.then(function (r) {\n\t\t\tresult = this.handleResponse(r, type);\n\t\t\tdeferred.resolve(result);\n\t\t}.bind(this));\n\t} else {\n\t\tdeferred.reject({\n\t\t\tmessage : \"File not found in the epub: \" + url,\n\t\t\tstack : new Error().stack\n\t\t});\n\t}\n\treturn deferred.promise;\n};\n\nUnarchive.prototype.handleResponse = function(response, type){\n\tvar r;\n\n\tif(type == \"json\") {\n\t\tr = JSON.parse(response);\n\t}\n\telse\n\tif(core.isXml(type)) {\n\t\tr = core.parse(response, \"text/xml\");\n\t}\n\telse\n\tif(type == 'xhtml') {\n\t\tr = core.parse(response, \"application/xhtml+xml\");\n\t}\n\telse\n\tif(type == 'html' || type == 'htm') {\n\t\tr = core.parse(response, \"text/html\");\n\t } else {\n\t\t r = response;\n\t }\n\n\treturn r;\n};\n\nUnarchive.prototype.getBlob = function(url, _mimeType){\n\tvar decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\tvar entry = this.zip.file(decodededUrl);\n\tvar mimeType;\n\n\tif(entry) {\n\t\tmimeType = _mimeType || mime.lookup(entry.name);\n\t\treturn entry.async(\"uint8array\").then(function(uint8array) {\n\t\t\treturn new Blob([uint8array], {type : mimeType});\n\t\t});\n\t}\n};\n\nUnarchive.prototype.getText = function(url, encoding){\n\tvar decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\tvar entry = this.zip.file(decodededUrl);\n\n\tif(entry) {\n\t\treturn entry.async(\"string\").then(function(text) {\n\t\t\treturn text;\n\t\t});\n\t}\n};\n\nUnarchive.prototype.getBase64 = function(url, _mimeType){\n\tvar decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\tvar entry = this.zip.file(decodededUrl);\n\tvar mimeType;\n\n\tif(entry) {\n\t\tmimeType = _mimeType || mime.lookup(entry.name);\n\t\treturn entry.async(\"base64\").then(function(data) {\n\t\t\treturn \"data:\" + mimeType + \";base64,\" + data;\n\t\t});\n\t}\n};\n\nUnarchive.prototype.createUrl = function(url, options){\n\tvar deferred = new RSVP.defer();\n\tvar _URL = window.URL || window.webkitURL || window.mozURL;\n\tvar tempUrl;\n\tvar blob;\n\tvar response;\n\tvar useBase64 = options && options.base64;\n\n\tif(url in this.urlCache) {\n\t\tdeferred.resolve(this.urlCache[url]);\n\t\treturn deferred.promise;\n\t}\n\n\tif (useBase64) {\n\t\tresponse = this.getBase64(url);\n\n\t\tif (response) {\n\t\t\tresponse.then(function(tempUrl) {\n\n\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t}.bind(this));\n\n\t\t}\n\n\t} else {\n\n\t\tresponse = this.getBlob(url);\n\n\t\tif (response) {\n\t\t\tresponse.then(function(blob) {\n\n\t\t\t\ttempUrl = _URL.createObjectURL(blob);\n\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t}.bind(this));\n\n\t\t}\n\t}\n\n\n\tif (!response) {\n\t\tdeferred.reject({\n\t\t\tmessage : \"File not found in the epub: \" + url,\n\t\t\tstack : new Error().stack\n\t\t});\n\t}\n\n\treturn deferred.promise;\n};\n\nUnarchive.prototype.revokeUrl = function(url){\n\tvar _URL = window.URL || window.webkitURL || window.mozURL;\n\tvar fromCache = this.urlCache[url];\n\tif(fromCache) _URL.revokeObjectURL(fromCache);\n};\n\nmodule.exports = Unarchive;\n","var Book = require('./book');\nvar EpubCFI = require('./epubcfi');\nvar Rendition = require('./rendition');\nvar Contents = require('./contents');\nvar RSVP = require('rsvp');\n\nfunction ePub(_url) {\n\treturn new Book(_url);\n};\n\nePub.VERSION = \"0.3.0\";\n\nePub.CFI = EpubCFI;\nePub.Rendition = Rendition;\nePub.Contents = Contents;\nePub.RSVP = RSVP;\n\nePub.ViewManagers = {};\nePub.Views = {};\nePub.register = {\n\tmanager : function(name, manager){\n\t\treturn ePub.ViewManagers[name] = manager;\n\t},\n\tview : function(name, view){\n\t\treturn ePub.Views[name] = view;\n\t}\n};\n\n// Default Views\nePub.register.view(\"iframe\", require('./managers/views/iframe'));\n// ePub.register.view(\"inline\", require('./managers/views/inline'));\n\n// Default View Managers\nePub.register.manager(\"single\", require('./managers/default'));\nePub.register.manager(\"continuous\", require('./managers/continuous'));\n\nmodule.exports = ePub;\n"]} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 357e8a8caf94859fd255","webpack:///./src/epub.js","webpack:///./src/book.js","webpack:///./~/rsvp/dist/rsvp.js","webpack:///./~/process/browser.js","webpack:///./~/timers-browserify/main.js","webpack:///vertx (ignored)","webpack:///./~/urijs/src/URI.js","webpack:///./~/urijs/src/punycode.js","webpack:///(webpack)/buildin/module.js","webpack:///./~/urijs/src/IPv6.js","webpack:///./~/urijs/src/SecondLevelDomains.js","webpack:///./src/core.js","webpack:///./~/base64-js/index.js","webpack:///external \"xmldom\"","webpack:///./src/spine.js","webpack:///./src/epubcfi.js","webpack:///./src/hook.js","webpack:///./src/section.js","webpack:///./src/request.js","webpack:///./src/replacements.js","webpack:///./src/locations.js","webpack:///./src/queue.js","webpack:///./src/parser.js","webpack:///./src/navigation.js","webpack:///./src/rendition.js","webpack:///./src/layout.js","webpack:///./src/mapping.js","webpack:///./src/unarchive.js","webpack:///./libs/mime/mime.js","webpack:///external \"JSZip\"","webpack:///./src/contents.js","webpack:///./src/managers/views/iframe.js","webpack:///./src/managers/default/index.js","webpack:///./src/managers/helpers/stage.js","webpack:///./src/managers/helpers/views.js","webpack:///./src/managers/continuous/index.js"],"names":[],"mappings":"AAAA;AACA;AACA,6FAA6F,MAAM,yBAAyB,EAAE,YAAY,EAAE;AAC5I;AACA;AACA;AACA,8FAA8F,MAAM,yBAAyB,EAAE,YAAY,EAAE;AAC7I;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,iDAAgD;AAChD;AACA,GAAE;;AAEF;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,KAAI;;AAEJ,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,KAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;AACA;AACA;AACA,0CAAyC;AACzC,KAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,OAAM;AACN;AACA;AACA;;AAEA;AACA,KAAI;AACJ;AACA;AACA,KAAI;AACJ;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,GAAE;AACF;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;;AAEA,mDAAkD;AAClD;AACA;AACA;;AAEA,sCAAqC;;AAErC;;AAEA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,IAAG;;;;AAIH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED,qCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;;;aC1VD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4CAA2C;AAC3C,EAAC,4BAA4B;;AAE7B;AACA,wCAAuC,OAAO;AAC9C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,kCAAiC,gBAAgB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,yBAAwB;AACxB;AACA,8BAA6B;AAC7B;AACA;AACA,6BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA,6BAA4B;AAC5B;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,6BAA4B,cAAc;AAC1C;AACA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,EAAE;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAqB,sBAAsB;AAC3C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,qDAAoD;AACpD;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,oBAAmB,kBAAkB;AACrC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK,EAAE;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;AACH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA,WAAU,EAAE;AACZ,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,kBAAiB,wBAAwB;AACzC;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAiB,0CAA0C;AAC3D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;AACA,WAAU,MAAM;AAChB,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAU,MAAM;AAChB,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAiB,kDAAkD;AACnE;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;AACA,WAAU,EAAE;AACZ,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;;AAEA;AACA,WAAU,SAAS;AACnB,WAAU,OAAO;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,0BAAyB;AACzB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA,MAAK;;AAEL;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;;AAEA;AACA,aAAY,SAAS;AACrB,aAAY,SAAS;AACrB,aAAY,OAAO;AACnB;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,aAAY,SAAS;AACrB,aAAY,OAAO;AACnB;AACA,cAAa;AACb;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA0B;AAC1B,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;;AAEA;AACA,aAAY,SAAS;AACrB,aAAY,OAAO;AACnB;AACA,cAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;AACA;AACA,QAAO;AACP,MAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAiB,YAAY;AAC7B;AACA;;AAEA,kBAAiB,0BAA0B;AAC3C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kBAAiB,YAAY;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,iCAAgC;;AAEhC,kCAAiC,eAAe;AAChD;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,eAAc,MAAM;AACpB;AACA,iBAAgB,MAAM;AACtB;AACA,MAAK;AACL,IAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,WAAU,SAAS;AACnB;AACA;AACA,2DAA0D,EAAE;AAC5D,WAAU,cAAc;AACxB;AACA;AACA;AACA;AACA;AACA,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAmB,OAAO;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,qCAAoC,sDAAsD,oEAAoE,4EAA4E;AAC1O;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAU,MAAM;AAChB,WAAU,OAAO;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAU,+BAA+B;AACzC,WAAU,mCAAmC;AAC7C,WAAU;AACV;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,WAAU,MAAM;AAChB,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAU,MAAM;AAChB,WAAU,OAAO;AACjB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA,kBAAiB,0CAA0C;AAC3D;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA4C;AAC5C;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,WAAU,OAAO;AACjB,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,+BAA+B;AACpD,wBAAuB,+BAA+B;AACtD,yBAAwB,+BAA+B;AACvD,wBAAuB;AACvB;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mCAAkC,+BAA+B;AACjE,mCAAkC,mCAAmC;AACrE,mCAAkC,mCAAmC;AACrE;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB;AACnB;AACA;AACA,6CAA4C;AAC5C;AACA,IAAG;AACH;;AAEA;AACA;AACA,WAAU,OAAO;AACjB,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,KAAI;AACJ;;AAEA;AACA;AACA;AACA,WAAU,OAAO;AACjB;AACA,YAAW;AACX;AACA;AACA,mBAAkB;;AAElB;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,WAAU,MAAM;AAChB,WAAU,SAAS;AACnB,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB,YAAY;AAC/B;AACA;;AAEA;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAU,EAAE;AACZ,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,WAAU,EAAE;AACZ,WAAU,OAAO;AACjB;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;;AAEA,gBAAe;AACf,gBAAe;AACf;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,WAAU,MAAM;AAChB,WAAU,SAAS;AACnB;AACA,WAAU,OAAO;AACjB;AACA,YAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB,YAAY;AAC/B;AACA;;AAEA;AACA;AACA;;AAEA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,MAAK;AACL,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kFAAiF;;AAEjF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,2BAA0B,sBAAsB;;AAEhD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kBAAiB,SAAS;AAC1B;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA,EAAC;AACD;AACA,EAAC;AACD;AACA,EAAC;AACD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,EAAC;AACD;AACA,IAAG;AACH;AACA;;AAEA;;AAEA,4CAA2C,kBAAkB,kCAAkC,qEAAqE,EAAE,EAAE,OAAO,kBAAkB,EAAE,YAAY;;AAE/M;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAA8C,cAAc;;AAE5D,EAAC;AACD,8B;;;;;;;ACh8EA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;AACL;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA2B;AAC3B;AACA;AACA;AACA,6BAA4B,UAAU;;;;;;;ACnLtC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA2C,iBAAiB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA,G;;;;;;;AC3EA,gB;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,yCAAwC;AACxC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL,yCAAwC,YAAY;AACpD;AACA;AACA,MAAK;AACL;AACA;;AAEA,sCAAqC,YAAY;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,yCAAwC,YAAY;AACpD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sCAAqC,YAAY;AACjD;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oCAAmC,OAAO;AAC1C;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AAC3D;AACA;AACA;AACA,4CAA2C,IAAI,GAAG,EAAE,aAAa,IAAI,mBAAmB,IAAI,GAAG,EAAE,cAAc,IAAI,yEAAyE,EAAE,oBAAoB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,2EAA2E,EAAE,oBAAoB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,iBAAiB,IAAI,2EAA2E,EAAE,qBAAqB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,iBAAiB,IAAI,EAAE,IAAI,yEAAyE,EAAE,qBAAqB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,iBAAiB,IAAI,EAAE,IAAI,yEAAyE,EAAE,qBAAqB,IAAI,GAAG,EAAE,gBAAgB,IAAI,EAAE,IAAI,iBAAiB,IAAI,EAAE,IAAI,yEAAyE,EAAE,yBAAyB,IAAI,EAAE,IAAI,iBAAiB,IAAI,EAAE,IAAI,yEAAyE,EAAE;AAC9jC;AACA;AACA;AACA;AACA,sDAAqD,IAAI,kBAAkB,IAAI,yBAAyB,IAAI,0GAA0G;AACtN;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wEAAuE;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB;AACnB;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB;AACnB;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,4EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB;AACnB;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA,gDAA+C,YAAY;AAC3D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,oBAAmB,YAAY;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA4B;AAC5B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAgD,YAAY;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA,wCAAuC,YAAY;AACnD;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,6BAA4B;;AAE5B;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA,oBAAmB,sBAAsB;AACzC;AACA;AACA;AACA,sBAAqB,sBAAsB;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kBAAiB,cAAc;AAC/B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,6BAA4B;AAC5B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAK;AACL;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,MAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,kCAAiC,OAAO;AACxC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP,yCAAwC,OAAO;AAC/C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL,gCAA+B,OAAO;AACtC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAmB,GAAG;;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,uEAAsE,OAAO;AAC7E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAe,qBAAqB;AACpC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;mCCjqED;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,aAAY,OAAO;AACnB,eAAc,MAAM;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY,MAAM;AAClB,aAAY,SAAS;AACrB;AACA,eAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,SAAS;AACrB;AACA,eAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,eAAc,MAAM;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAqC;AACrC;AACA,MAAK;AACL,6BAA4B;AAC5B;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAY,MAAM;AAClB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,eAAc,OAAO;AACrB;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAA+B,mCAAmC;AAClE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,cAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,yBAAwB;;AAExB,0CAAyC,qBAAqB;;AAE9D;AACA;AACA;AACA;AACA;AACA,mCAAkC,oBAAoB;;AAEtD;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAa,iBAAiB;AAC9B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,2BAA0B,iBAAiB;AAC3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,eAAc,iBAAiB;AAC/B;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA8B,oBAAoB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAEA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA,EAAC;;;;;;;;ACphBD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,EAAC;AACD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAiB,cAAc;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB,WAAW;AAC9B;AACA,sBAAqB,QAAQ;AAC7B;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;;AAET,gBAAe,WAAW;AAC1B;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,gBAAe,YAAY;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;;;;;;ACxLD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,EAAC;AACD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAC;;;;;;;AC/OD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAe,YAAY;AAC3B;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,4CAA2C,YAAY;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAsB;AACtB;;AAEA;AACA,uBAAsB;AACtB;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB,qBAAqB;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kCAAiC,aAAa;;AAE9C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,+BAA8B;;AAE9B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC3hBA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,mCAAkC,SAAS;AAC3C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA,qBAAoB,OAAO;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAqB,SAAS;AAC9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2CAA0C,UAAU;AACpD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;;;;ACjHA,iD;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,2BAA0B,0BAA0B,EAAE;AACtD;;AAEA;AACA,2BAA0B,0BAA0B,EAAE;AACtD;;AAEA;;AAEA;;;AAGA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;ACvIA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,oBAAmB;;AAEnB,qBAAoB;;AAEpB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;;;AAGA;AACA;AACA;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA,GAAE,2EAA2E;AAC7E;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX,YAAW;AACX;AACA;AACA;AACA;;AAEA;AACA,WAAU;AACV;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAU;AACV;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAgB;AAChB;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,qBAAoB;AACpB;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,oCAAmC;AACnC;;AAEA;AACA;AACA;;AAEA;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA,iBAAgB,8BAA8B;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,YAAW;AACX;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,cAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA,KAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX,YAAW;AACX;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;;AAEA;AACA;;;AAGA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ,WAAU;AACV;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAY,SAAS;;AAErB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;AACA,GAAE;;AAEF;AACA;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAY,SAAS;AACrB;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAI;AACJ;AACA;;AAEA,IAAG;AACH;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAI;AACJ;AACA;;AAEA,IAAG;AACH;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;ACz6BA;;AAEA;AACA;AACA;;AAEA;AACA,sCAAqC;AACrC,gDAA+C;;AAE/C;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe,sBAAsB;AACrC;AACA;AACA,IAAG;AACH;AACA,kBAAiB,yBAAyB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;;;AAGF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;AC1DA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,KAAI;AACJ;AACA;AACA,KAAI;AACJ;AACA;AACA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA,8CAA6C;AAC7C;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;;;;;AC3JA;AACA;AACA;;AAEA;AACA,wEAAuE;AACvE;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA,oCAAmC;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,mDAAkD;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA,0CAAyC;AACzC;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA,OAAM;AACN;AACA;AACA;;AAEA,MAAK;AACL;AACA;;AAEA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;ACrJA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,wBAAuB;;AAEvB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,KAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF,iBAAgB,kBAAkB;AAClC;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACjHA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,OAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;AAIA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,qDAAoD;AACpD;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA,EAAC;;AAED;;AAEA;;;;;;;AC9NA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAE;AACF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,KAAI;AACJ;AACA;AACA;AACA;;;;AAIA,IAAG;AACH;AACA;AACA;;AAEA,GAAE;AACF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL,IAAG;AACH;AACA;AACA;;AAEA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;;;;;;;AChMA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6CAA4C,mBAAmB;AAC/D;AACA;;AAEA;AACA;AACA;AACA,6CAA4C,wCAAwC;AACpF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,mBAAkB;AAClB;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,iDAAgD,eAAe;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA2C,2BAA2B;AACtE;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,kCAAiC,oBAAoB;;AAErD;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,aAAY,YAAY;AACxB;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,aAAY,YAAY;AACxB;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,aAAY,YAAY;AACxB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;AC1eA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,gBAAgB;AAChC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;;AAEA;;;;;;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,iDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,qFAAoF;AACpF,GAAE;AACF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,oEAAmE;AACnE,GAAE;AACF;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,IAAG;AACH;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ,IAAG;AACH;AACA;AACA;;AAEA,GAAE;AACF;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA,sDAAqD,kCAAkC;AACvF,KAAI;;AAEJ;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA,KAAI;AACJ;AACA;AACA;AACA;;AAEA;;AAEA,MAAK;;AAEL,KAAI;AACJ;AACA;AACA,KAAI;AACJ,MAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAI;;AAEJ,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;AAGH;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;;AAEA;AACA;;AAEA;;;;;;;ACvjBA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA,GAAE,OAAO;AACT;AACA;;AAEA,mBAAkB;AAClB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACxHA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAI;AACJ;AACA,KAAI;AACJ;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAI;AACJ;AACA,KAAI;AACJ;AACA;AACA;;AAEA,IAAG;;;AAGH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA,iBAAgB,mBAAmB;AACnC;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iBAAgB,mBAAmB;AACnC;;AAEA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;AAIA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,iBAAgB,oBAAoB;AACpC;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;;;;;;ACxSA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA,sCAAqC,mBAAmB;AACxD,GAAE;AACF;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA,8DAA6D;AAC7D;AACA;;AAEA;AACA;AACA;AACA,mCAAkC,gBAAgB;AAClD,IAAG;AACH;AACA;;AAEA;AACA,8DAA6D;AAC7D;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA,8DAA6D;AAC7D;AACA;;AAEA;AACA;AACA;AACA,kCAAiC;AACjC,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,KAAI;;AAEJ;;AAEA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,KAAI;;AAEJ;AACA;;;AAGA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;AC5LA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN,sBAAqB,oBAAoB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED,iCAAgC;;AAEhC;AACA;AACA;;AAEA;AACA;AACA;;;;;;;AC1KA,4DAA2D,kDAAkD,6BAA6B;AAC1I,iD;;;;;;ACDA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH,kBAAiB,mBAAmB;AACpC;AACA,uBAAsB;AACtB,oBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN,GAAE;;AAEF;AACA,gBAAe;;AAEf;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAgB,mBAAmB;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,mBAAkB;;AAElB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA,GAAE;AACF;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA,GAAE;AACF;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,oCAAmC,QAAQ;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA,6BAA4B,QAAQ;AACpC;AACA,4EAA2E;AAC3E;;AAEA;AACA,sCAAqC,gBAAgB;AACrD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA,GAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,iBAAgB,2CAA2C;;AAE3D;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAgB,aAAa;;AAE7B;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;;;;;;ACvpBA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B;AAC5B,GAAE,eAAe;;AAEjB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,+BAA8B;AAC9B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,OAAM;AACN;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,OAAM;AACN;AACA;AACA,OAAM;AACN;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA,IAAG;AACH;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF,oBAAmB;AACnB;;AAEA;AACA;AACA,wCAAuC;AACvC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA,IAAG;;AAEH,GAAE;AACF;AACA;;;AAGA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;;;;;;AC7jBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iDAAgD;AAChD;AACA;AACA;AACA;AACA,gCAA+B,2DAA2D;AAC1F;AACA;AACA;AACA,GAAE;;AAEF,mDAAkD;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,IAAG;AACH;AACA;AACA,OAAM;AACN;AACA;AACA,OAAM;AACN;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;;;AAGA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,KAAI;AACJ;;;AAGA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;;AAGA,GAAE;;AAEF;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,GAAE;AACF;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iBAAgB,iBAAiB;AACjC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wCAAuC,wCAAwC;;AAE/E;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;;AAEA;AACA;;AAEA;;;;;;;AC9hBA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,+BAA8B;AAC9B,8BAA6B;AAC7B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,yCAAwC;AACxC;AACA;AACA,GAAE;;AAEF,8CAA6C,cAAc;AAC3D;;;;AAIA;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,iBAAgB,SAAS;AACzB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,iBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACtKA;AACA;AACA;;AAEA;;AAEA,4CAA2C;;AAE3C;;AAEA,iDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF,mDAAkD;;AAElD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAgB,iBAAiB;AACjC;;AAEA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA2B;;AAE3B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;;AAGL,QAAO;;AAEP,GAAE;AACF;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAgB,oBAAoB;AACpC;AACA;;AAEA;AACA,iBAAgB,kBAAkB;AAClC;AACA;;AAEA;AACA;AACA;;AAEA,+DAA8D;;AAE9D;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,OAAM;AACN,MAAK;;AAEL;;AAEA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;;AAGH;AACA;;AAEA;;AAEA;;;AAGA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uBAAsB,QAAQ;AAC9B;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,GAAE;;AAEF,uBAAsB,QAAQ;AAC9B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wCAAuC,wCAAwC;;AAE/E;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA","file":"epub.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"xmldom\"), (function webpackLoadOptionalExternalModule() { try { return require(\"JSZip\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"xmldom\", \"JSZip\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ePub\"] = factory(require(\"xmldom\"), (function webpackLoadOptionalExternalModule() { try { return require(\"JSZip\"); } catch(e) {} }()));\n\telse\n\t\troot[\"ePub\"] = factory(root[\"xmldom\"], root[\"JSZip\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_13__, __WEBPACK_EXTERNAL_MODULE_29__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 357e8a8caf94859fd255\n **/","var Book = require('./book');\nvar EpubCFI = require('./epubcfi');\nvar Rendition = require('./rendition');\nvar Contents = require('./contents');\nvar RSVP = require('rsvp');\n\nfunction ePub(_url) {\n\treturn new Book(_url);\n};\n\nePub.VERSION = \"0.3.0\";\n\nePub.CFI = EpubCFI;\nePub.Rendition = Rendition;\nePub.Contents = Contents;\nePub.RSVP = RSVP;\n\nePub.ViewManagers = {};\nePub.Views = {};\nePub.register = {\n\tmanager : function(name, manager){\n\t\treturn ePub.ViewManagers[name] = manager;\n\t},\n\tview : function(name, view){\n\t\treturn ePub.Views[name] = view;\n\t}\n};\n\n// Default Views\nePub.register.view(\"iframe\", require('./managers/views/iframe'));\n\n// Default View Managers\nePub.register.manager(\"single\", require('./managers/default'));\nePub.register.manager(\"continuous\", require('./managers/continuous'));\n\nmodule.exports = ePub;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/epub.js\n ** module id = 0\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar Spine = require('./spine');\nvar Locations = require('./locations');\nvar Parser = require('./parser');\nvar Navigation = require('./navigation');\nvar Rendition = require('./rendition');\nvar Unarchive = require('./unarchive');\nvar request = require('./request');\nvar EpubCFI = require('./epubcfi');\n\nfunction Book(_url, options){\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\trequestMethod: this.requestMethod\n\t});\n\n\tcore.extend(this.settings, options);\n\n\n\t// Promises\n\tthis.opening = new RSVP.defer();\n\tthis.opened = this.opening.promise;\n\tthis.isOpen = false;\n\n\tthis.url = undefined;\n\n\tthis.loading = {\n\t\tmanifest: new RSVP.defer(),\n\t\tspine: new RSVP.defer(),\n\t\tmetadata: new RSVP.defer(),\n\t\tcover: new RSVP.defer(),\n\t\tnavigation: new RSVP.defer(),\n\t\tpageList: new RSVP.defer()\n\t};\n\n\tthis.loaded = {\n\t\tmanifest: this.loading.manifest.promise,\n\t\tspine: this.loading.spine.promise,\n\t\tmetadata: this.loading.metadata.promise,\n\t\tcover: this.loading.cover.promise,\n\t\tnavigation: this.loading.navigation.promise,\n\t\tpageList: this.loading.pageList.promise\n\t};\n\n\tthis.ready = RSVP.hash(this.loaded);\n\n\t// Queue for methods used before opening\n\tthis.isRendered = false;\n\t// this._q = core.queue(this);\n\n\tthis.request = this.settings.requestMethod.bind(this);\n\n\tthis.spine = new Spine(this.request);\n\tthis.locations = new Locations(this.spine, this.request);\n\n\tif(_url) {\n\t\tthis.open(_url).catch(function (error) {\n\t\t\tvar err = new Error(\"Cannot load book at \"+ _url );\n\t\t\tconsole.error(err);\n\n\t\t\tthis.trigger(\"loadFailed\", error);\n\t\t}.bind(this));\n\t}\n};\n\nBook.prototype.open = function(_url, options){\n\tvar uri;\n\tvar parse = new Parser();\n\tvar epubPackage;\n\tvar epubContainer;\n\tvar book = this;\n\tvar containerPath = \"META-INF/container.xml\";\n\tvar location;\n\tvar absoluteUri;\n\tvar isArrayBuffer = false;\n\tvar isBase64 = options && options.base64;\n\n\tif(!_url) {\n\t\tthis.opening.resolve(this);\n\t\treturn this.opened;\n\t}\n\n\t// Reuse parsed url or create a new uri object\n\t// if(typeof(_url) === \"object\") {\n\t// uri = _url;\n\t// } else {\n\t// uri = core.uri(_url);\n\t// }\n\tif (_url instanceof ArrayBuffer || isBase64) {\n\t\tisArrayBuffer = true;\n\t\tthis.url = '/';\n\t} else {\n\t\turi = URI(_url);\n\t}\n\n\tif (window && window.location && uri) {\n\t\tabsoluteUri = uri.absoluteTo(window.location.href);\n\t\tthis.url = absoluteUri.toString();\n\t} else if (window && window.location) {\n\t\tthis.url = window.location.href;\n\t} else {\n\t\tthis.url = _url;\n\t}\n\n\t// Find path to the Container\n\tif(uri && uri.suffix() === \"opf\") {\n\t\t// Direct link to package, no container\n\t\tthis.packageUrl = _url;\n\t\tthis.containerUrl = '';\n\n\t\tif(uri.origin()) {\n\t\t\tthis.baseUrl = uri.origin() + \"/\" + uri.directory() + \"/\";\n\t\t} else if(absoluteUri){\n\t\t\tthis.baseUrl = absoluteUri.origin();\n\t\t\tthis.baseUrl += absoluteUri.directory() + \"/\";\n\t\t} else {\n\t\t\tthis.baseUrl = uri.directory() + \"/\";\n\t\t}\n\n\t\tepubPackage = this.request(this.packageUrl)\n\t\t\t.catch(function(error) {\n\t\t\t\tbook.opening.reject(error);\n\t\t\t});\n\n\t} else if(isArrayBuffer || isBase64 || this.isArchivedUrl(uri)) {\n\t\t// Book is archived\n\t\tthis.url = '/';\n\t\tthis.containerUrl = URI(containerPath).absoluteTo(this.url).toString();\n\n\t\tepubContainer = this.unarchive(_url, isBase64).\n\t\t\tthen(function() {\n\t\t\t\treturn this.request(this.containerUrl);\n\t\t\t}.bind(this))\n\t\t\t.catch(function(error) {\n\t\t\t\tbook.opening.reject(error);\n\t\t\t});\n\t}\n\t// Find the path to the Package from the container\n\telse if (!uri.suffix()) {\n\n\t\tthis.containerUrl = this.url + containerPath;\n\n\t\tepubContainer = this.request(this.containerUrl)\n\t\t\t.catch(function(error) {\n\t\t\t\t// handle errors in loading container\n\t\t\t\tbook.opening.reject(error);\n\t\t\t});\n\t}\n\n\tif (epubContainer) {\n\t\tepubPackage = epubContainer.\n\t\t\tthen(function(containerXml){\n\t\t\t\treturn parse.container(containerXml); // Container has path to content\n\t\t\t}).\n\t\t\tthen(function(paths){\n\t\t\t\tvar packageUri = URI(paths.packagePath);\n\t\t\t\tvar absPackageUri = packageUri.absoluteTo(book.url);\n\t\t\t\tvar absWindowUri;\n\n\t\t\t\tbook.packageUrl = absPackageUri.toString();\n\t\t\t\tbook.encoding = paths.encoding;\n\n\t\t\t\t// Set Url relative to the content\n\t\t\t\tif(absPackageUri.origin()) {\n\t\t\t\t\tbook.baseUrl = absPackageUri.origin() + absPackageUri.directory() + \"/\";\n\t\t\t\t} else {\n\t\t\t\t\tif(packageUri.directory()) {\n\t\t\t\t\t\tbook.baseUrl = \"/\" + packageUri.directory() + \"/\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbook.baseUrl = \"/\"\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn book.request(book.packageUrl);\n\t\t\t}).catch(function(error) {\n\t\t\t\t// handle errors in either of the two requests\n\t\t\t\tbook.opening.reject(error);\n\t\t\t});\n\t}\n\n\tepubPackage.then(function(packageXml) {\n\n\t\tif (!packageXml) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get package information from epub opf\n\t\tbook.unpack(packageXml);\n\n\t\t// Resolve promises\n\t\tbook.loading.manifest.resolve(book.package.manifest);\n\t\tbook.loading.metadata.resolve(book.package.metadata);\n\t\tbook.loading.spine.resolve(book.spine);\n\t\tbook.loading.cover.resolve(book.cover);\n\n\t\tbook.isOpen = true;\n\n\t\t// Clear queue of any waiting book request\n\n\t\t// Resolve book opened promise\n\t\tbook.opening.resolve(book);\n\n\t}).catch(function(error) {\n\t\t// handle errors in parsing the book\n\t\t// console.error(error.message, error.stack);\n\t\tbook.opening.reject(error);\n\t});\n\n\treturn this.opened;\n};\n\nBook.prototype.unpack = function(packageXml){\n\tvar book = this,\n\t\t\tparse = new Parser();\n\n\tbook.package = parse.packageContents(packageXml); // Extract info from contents\n\tif(!book.package) {\n\t\treturn;\n\t}\n\n\tbook.package.baseUrl = book.baseUrl; // Provides a url base for resolving paths\n\n\tthis.spine.load(book.package);\n\n\tbook.navigation = new Navigation(book.package, this.request);\n\tbook.navigation.load().then(function(toc){\n\t\tbook.toc = toc;\n\t\tbook.loading.navigation.resolve(book.toc);\n\t});\n\n\t// //-- Set Global Layout setting based on metadata\n\t// MOVE TO RENDER\n\t// book.globalLayoutProperties = book.parseLayoutProperties(book.package.metadata);\n\n\tbook.cover = URI(book.package.coverPath).absoluteTo(book.baseUrl).toString();\n};\n\n// Alias for book.spine.get\nBook.prototype.section = function(target) {\n\treturn this.spine.get(target);\n};\n\n// Sugar to render a book\nBook.prototype.renderTo = function(element, options) {\n\t// var renderMethod = (options && options.method) ?\n\t// options.method :\n\t// \"single\";\n\n\tthis.rendition = new Rendition(this, options);\n\tthis.rendition.attachTo(element);\n\n\treturn this.rendition;\n};\n\nBook.prototype.requestMethod = function(_url) {\n\t// Switch request methods\n\tif(this.unarchived) {\n\t\treturn this.unarchived.request(_url);\n\t} else {\n\t\treturn request(_url, null, this.requestCredentials, this.requestHeaders);\n\t}\n\n};\n\nBook.prototype.setRequestCredentials = function(_credentials) {\n\tthis.requestCredentials = _credentials;\n};\n\nBook.prototype.setRequestHeaders = function(_headers) {\n\tthis.requestHeaders = _headers;\n};\n\nBook.prototype.unarchive = function(bookUrl, isBase64){\n\tthis.unarchived = new Unarchive();\n\treturn this.unarchived.open(bookUrl, isBase64);\n};\n\n//-- Checks if url has a .epub or .zip extension, or is ArrayBuffer (of zip/epub)\nBook.prototype.isArchivedUrl = function(bookUrl){\n\tvar uri;\n\tvar extension;\n\n\tif (bookUrl instanceof ArrayBuffer) {\n\t\treturn true;\n\t}\n\n\t// Reuse parsed url or create a new uri object\n\t// if(typeof(bookUrl) === \"object\") {\n\t// uri = bookUrl;\n\t// } else {\n\t// uri = core.uri(bookUrl);\n\t// }\n\turi = URI(bookUrl);\n\textension = uri.suffix();\n\n\tif(extension && (extension == \"epub\" || extension == \"zip\")){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n//-- Returns the cover\nBook.prototype.coverUrl = function(){\n\tvar retrieved = this.loaded.cover.\n\t\tthen(function(url) {\n\t\t\tif(this.unarchived) {\n\t\t\t\treturn this.unarchived.createUrl(this.cover);\n\t\t\t}else{\n\t\t\t\treturn this.cover;\n\t\t\t}\n\t\t}.bind(this));\n\n\n\n\treturn retrieved;\n};\n\nBook.prototype.range = function(cfiRange) {\n\tvar cfi = new EpubCFI(cfiRange);\n\tvar item = this.spine.get(cfi.spinePos);\n\n\treturn item.load().then(function (contents) {\n\t\tvar range = cfi.toRange(item.document);\n\t\treturn range;\n\t})\n};\n\nmodule.exports = Book;\n\n//-- Enable binding events to book\nRSVP.EventTarget.mixin(Book.prototype);\n\n//-- Handle RSVP Errors\nRSVP.on('error', function(event) {\n\tconsole.error(event);\n});\n\nRSVP.configure('instrument', false); //-- true | will logging out all RSVP rejections\n// RSVP.on('created', listener);\n// RSVP.on('chained', listener);\n// RSVP.on('fulfilled', listener);\nRSVP.on('rejected', function(event){\n\tconsole.error(event.detail.message, event.detail.stack);\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/book.js\n ** module id = 1\n ** module chunks = 0\n **/","/*!\n * @overview RSVP - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE\n * @version 3.3.2\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (factory((global.RSVP = global.RSVP || {})));\n}(this, (function (exports) { 'use strict';\n\nfunction indexOf(callbacks, callback) {\n for (var i = 0, l = callbacks.length; i < l; i++) {\n if (callbacks[i] === callback) {\n return i;\n }\n }\n\n return -1;\n}\n\nfunction callbacksFor(object) {\n var callbacks = object._promiseCallbacks;\n\n if (!callbacks) {\n callbacks = object._promiseCallbacks = {};\n }\n\n return callbacks;\n}\n\n/**\n @class RSVP.EventTarget\n*/\nvar EventTarget = {\n\n /**\n `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For\n Example:\n ```javascript\n let object = {};\n RSVP.EventTarget.mixin(object);\n object.on('finished', function(event) {\n // handle event\n });\n object.trigger('finished', { detail: value });\n ```\n `EventTarget.mixin` also works with prototypes:\n ```javascript\n let Person = function() {};\n RSVP.EventTarget.mixin(Person.prototype);\n let yehuda = new Person();\n let tom = new Person();\n yehuda.on('poke', function(event) {\n console.log('Yehuda says OW');\n });\n tom.on('poke', function(event) {\n console.log('Tom says OW');\n });\n yehuda.trigger('poke');\n tom.trigger('poke');\n ```\n @method mixin\n @for RSVP.EventTarget\n @private\n @param {Object} object object to extend with EventTarget methods\n */\n mixin: function mixin(object) {\n object['on'] = this['on'];\n object['off'] = this['off'];\n object['trigger'] = this['trigger'];\n object._promiseCallbacks = undefined;\n return object;\n },\n\n /**\n Registers a callback to be executed when `eventName` is triggered\n ```javascript\n object.on('event', function(eventInfo){\n // handle the event\n });\n object.trigger('event');\n ```\n @method on\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to listen for\n @param {Function} callback function to be called when the event is triggered.\n */\n on: function on(eventName, callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n var allCallbacks = callbacksFor(this),\n callbacks = undefined;\n\n callbacks = allCallbacks[eventName];\n\n if (!callbacks) {\n callbacks = allCallbacks[eventName] = [];\n }\n\n if (indexOf(callbacks, callback) === -1) {\n callbacks.push(callback);\n }\n },\n\n /**\n You can use `off` to stop firing a particular callback for an event:\n ```javascript\n function doStuff() { // do stuff! }\n object.on('stuff', doStuff);\n object.trigger('stuff'); // doStuff will be called\n // Unregister ONLY the doStuff callback\n object.off('stuff', doStuff);\n object.trigger('stuff'); // doStuff will NOT be called\n ```\n If you don't pass a `callback` argument to `off`, ALL callbacks for the\n event will not be executed when the event fires. For example:\n ```javascript\n let callback1 = function(){};\n let callback2 = function(){};\n object.on('stuff', callback1);\n object.on('stuff', callback2);\n object.trigger('stuff'); // callback1 and callback2 will be executed.\n object.off('stuff');\n object.trigger('stuff'); // callback1 and callback2 will not be executed!\n ```\n @method off\n @for RSVP.EventTarget\n @private\n @param {String} eventName event to stop listening to\n @param {Function} callback optional argument. If given, only the function\n given will be removed from the event's callback queue. If no `callback`\n argument is given, all callbacks will be removed from the event's callback\n queue.\n */\n off: function off(eventName, callback) {\n var allCallbacks = callbacksFor(this),\n callbacks = undefined,\n index = undefined;\n\n if (!callback) {\n allCallbacks[eventName] = [];\n return;\n }\n\n callbacks = allCallbacks[eventName];\n\n index = indexOf(callbacks, callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n },\n\n /**\n Use `trigger` to fire custom events. For example:\n ```javascript\n object.on('foo', function(){\n console.log('foo event happened!');\n });\n object.trigger('foo');\n // 'foo event happened!' logged to the console\n ```\n You can also pass a value as a second argument to `trigger` that will be\n passed as an argument to all event listeners for the event:\n ```javascript\n object.on('foo', function(value){\n console.log(value.name);\n });\n object.trigger('foo', { name: 'bar' });\n // 'bar' logged to the console\n ```\n @method trigger\n @for RSVP.EventTarget\n @private\n @param {String} eventName name of the event to be triggered\n @param {*} options optional value to be passed to any event handlers for\n the given `eventName`\n */\n trigger: function trigger(eventName, options, label) {\n var allCallbacks = callbacksFor(this),\n callbacks = undefined,\n callback = undefined;\n\n if (callbacks = allCallbacks[eventName]) {\n // Don't cache the callbacks.length since it may grow\n for (var i = 0; i < callbacks.length; i++) {\n callback = callbacks[i];\n\n callback(options, label);\n }\n }\n }\n};\n\nvar config = {\n instrument: false\n};\n\nEventTarget['mixin'](config);\n\nfunction configure(name, value) {\n if (name === 'onerror') {\n // handle for legacy users that expect the actual\n // error to be passed to their function added via\n // `RSVP.configure('onerror', someFunctionHere);`\n config['on']('error', value);\n return;\n }\n\n if (arguments.length === 2) {\n config[name] = value;\n } else {\n return config[name];\n }\n}\n\nfunction objectOrFunction(x) {\n return typeof x === 'function' || typeof x === 'object' && x !== null;\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\nfunction isMaybeThenable(x) {\n return typeof x === 'object' && x !== null;\n}\n\nvar _isArray = undefined;\nif (!Array.isArray) {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n} else {\n _isArray = Array.isArray;\n}\n\nvar isArray = _isArray;\n\n// Date.now is not available in browsers < IE9\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility\nvar now = Date.now || function () {\n return new Date().getTime();\n};\n\nfunction F() {}\n\nvar o_create = Object.create || function (o) {\n if (arguments.length > 1) {\n throw new Error('Second argument not supported');\n }\n if (typeof o !== 'object') {\n throw new TypeError('Argument must be an object');\n }\n F.prototype = o;\n return new F();\n};\n\nvar queue = [];\n\nfunction scheduleFlush() {\n setTimeout(function () {\n for (var i = 0; i < queue.length; i++) {\n var entry = queue[i];\n\n var payload = entry.payload;\n\n payload.guid = payload.key + payload.id;\n payload.childGuid = payload.key + payload.childId;\n if (payload.error) {\n payload.stack = payload.error.stack;\n }\n\n config['trigger'](entry.name, entry.payload);\n }\n queue.length = 0;\n }, 50);\n}\nfunction instrument(eventName, promise, child) {\n if (1 === queue.push({\n name: eventName,\n payload: {\n key: promise._guidKey,\n id: promise._id,\n eventName: eventName,\n detail: promise._result,\n childId: child && child._id,\n label: promise._label,\n timeStamp: now(),\n error: config[\"instrument-with-stack\"] ? new Error(promise._label) : null\n } })) {\n scheduleFlush();\n }\n}\n\n/**\n `RSVP.Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = RSVP.Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {*} object value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop, label);\n resolve(promise, object);\n return promise;\n}\n\nfunction withOwnPromise() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n try {\n then.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n config.async(function (promise) {\n var sealed = false;\n var error = tryThen(then, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value, undefined);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n thenable._onError = null;\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n if (thenable !== value) {\n resolve(promise, value, undefined);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$) {\n if (maybeThenable.constructor === promise.constructor && then$$ === then && promise.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$ === GET_THEN_ERROR) {\n reject(promise, GET_THEN_ERROR.error);\n } else if (then$$ === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$)) {\n handleForeignThenable(promise, maybeThenable, then$$);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n fulfill(promise, value);\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onError) {\n promise._onError(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length === 0) {\n if (config.instrument) {\n instrument('fulfilled', promise);\n }\n } else {\n config.async(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n config.async(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var subscribers = parent._subscribers;\n var length = subscribers.length;\n\n parent._onError = null;\n\n subscribers[length] = child;\n subscribers[length + FULFILLED] = onFulfillment;\n subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n config.async(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (config.instrument) {\n instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);\n }\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = undefined,\n callback = undefined,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = undefined,\n error = undefined,\n succeeded = undefined,\n failed = undefined;\n\n if (hasCallback) {\n value = tryCatch(callback, detail);\n\n if (value === TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n reject(promise, withOwnPromise());\n return;\n }\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (failed) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n var resolved = false;\n try {\n resolver(function (value) {\n if (resolved) {\n return;\n }\n resolved = true;\n resolve(promise, value);\n }, function (reason) {\n if (resolved) {\n return;\n }\n resolved = true;\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nfunction then(onFulfillment, onRejection, label) {\n var _arguments = arguments;\n\n var parent = this;\n var state = parent._state;\n\n if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) {\n config.instrument && instrument('chained', parent, parent);\n return parent;\n }\n\n parent._onError = null;\n\n var child = new parent.constructor(noop, label);\n var result = parent._result;\n\n config.instrument && instrument('chained', parent, child);\n\n if (state) {\n (function () {\n var callback = _arguments[state - 1];\n config.async(function () {\n return invokeCallback(state, child, callback, result);\n });\n })();\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\nfunction makeSettledResult(state, position, value) {\n if (state === FULFILLED) {\n return {\n state: 'fulfilled',\n value: value\n };\n } else {\n return {\n state: 'rejected',\n reason: value\n };\n }\n}\n\nfunction Enumerator(Constructor, input, abortOnReject, label) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop, label);\n this._abortOnReject = abortOnReject;\n\n if (this._validateInput(input)) {\n this._input = input;\n this.length = input.length;\n this._remaining = input.length;\n\n this._init();\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate();\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, this._validationError());\n }\n}\n\nEnumerator.prototype._validateInput = function (input) {\n return isArray(input);\n};\n\nEnumerator.prototype._validationError = function () {\n return new Error('Array Methods must be provided an Array');\n};\n\nEnumerator.prototype._init = function () {\n this._result = new Array(this.length);\n};\n\nEnumerator.prototype._enumerate = function () {\n var length = this.length;\n var promise = this.promise;\n var input = this._input;\n\n for (var i = 0; promise._state === PENDING && i < length; i++) {\n this._eachEntry(input[i], i);\n }\n};\n\nEnumerator.prototype._settleMaybeThenable = function (entry, i) {\n var c = this._instanceConstructor;\n var resolve = c.resolve;\n\n if (resolve === resolve$1) {\n var then$$ = getThen(entry);\n\n if (then$$ === then && entry._state !== PENDING) {\n entry._onError = null;\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof then$$ !== 'function') {\n this._remaining--;\n this._result[i] = this._makeResult(FULFILLED, i, entry);\n } else if (c === Promise) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, then$$);\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve) {\n return resolve(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve(entry), i);\n }\n};\n\nEnumerator.prototype._eachEntry = function (entry, i) {\n if (isMaybeThenable(entry)) {\n this._settleMaybeThenable(entry, i);\n } else {\n this._remaining--;\n this._result[i] = this._makeResult(FULFILLED, i, entry);\n }\n};\n\nEnumerator.prototype._settledAt = function (state, i, value) {\n var promise = this.promise;\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (this._abortOnReject && state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = this._makeResult(state, i, value);\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n};\n\nEnumerator.prototype._makeResult = function (state, i, value) {\n return value;\n};\n\nEnumerator.prototype._willSettleAt = function (promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n};\n\n/**\n `RSVP.Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n RSVP.Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `RSVP.all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error(\"2\"));\n let promise3 = RSVP.reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n RSVP.Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries, label) {\n return new Enumerator(this, entries, true, /* abort on reject */label).promise;\n}\n\n/**\n `RSVP.Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `RSVP.Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n RSVP.Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} entries array of promises to observe\n @param {String} label optional string for describing the promise returned.\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(noop, label);\n\n if (!isArray(entries)) {\n reject(promise, new TypeError('You must pass an array to race.'));\n return promise;\n }\n\n for (var i = 0; promise._state === PENDING && i < entries.length; i++) {\n subscribe(Constructor.resolve(entries[i]), undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n\n return promise;\n}\n\n/**\n `RSVP.Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = RSVP.Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason, label) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop, label);\n reject(promise, reason);\n return promise;\n}\n\nvar guidKey = 'rsvp_' + now() + '-';\nvar counter = 0;\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class RSVP.Promise\n @param {function} resolver\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @constructor\n*/\nfunction Promise(resolver, label) {\n this._id = counter++;\n this._label = label;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n config.instrument && instrument('created', this);\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n}\n\nPromise.cast = resolve$1; // deprecated\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = resolve$1;\nPromise.reject = reject$1;\n\nPromise.prototype = {\n constructor: Promise,\n\n _guidKey: guidKey,\n\n _onError: function _onError(reason) {\n var promise = this;\n config.after(function () {\n if (promise._onError) {\n config['trigger']('error', reason, promise._label);\n }\n });\n },\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n \n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n \n Chaining\n --------\n \n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n \n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n \n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we\\'re unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we\\'re unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n \n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n \n Assimilation\n ------------\n \n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n \n If the assimliated promise rejects, then the downstream promise will also reject.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n \n Simple Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let result;\n \n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n \n Advanced Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let author, books;\n \n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n \n function foundBooks(books) {\n \n }\n \n function failure(reason) {\n \n }\n \n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n \n @method then\n @param {Function} onFulfillment\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n then: then,\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n \n ```js\n function findAuthor(){\n throw new Error('couldn\\'t find that author');\n }\n \n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n \n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n \n @method catch\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function _catch(onRejection, label) {\n return this.then(undefined, onRejection, label);\n },\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'finally': function _finally(callback, label) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n }, label);\n }\n};\n\nfunction Result() {\n this.value = undefined;\n}\n\nvar ERROR = new Result();\nvar GET_THEN_ERROR$1 = new Result();\n\nfunction getThen$1(obj) {\n try {\n return obj.then;\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n}\n\nfunction tryApply(f, s, a) {\n try {\n f.apply(s, a);\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n}\n\nfunction makeObject(_, argumentNames) {\n var obj = {};\n var length = _.length;\n var args = new Array(length);\n\n for (var x = 0; x < length; x++) {\n args[x] = _[x];\n }\n\n for (var i = 0; i < argumentNames.length; i++) {\n var _name = argumentNames[i];\n obj[_name] = args[i + 1];\n }\n\n return obj;\n}\n\nfunction arrayResult(_) {\n var length = _.length;\n var args = new Array(length - 1);\n\n for (var i = 1; i < length; i++) {\n args[i - 1] = _[i];\n }\n\n return args;\n}\n\nfunction wrapThenable(_then, promise) {\n return {\n then: function then(onFulFillment, onRejection) {\n return _then.call(promise, onFulFillment, onRejection);\n }\n };\n}\n\n/**\n `RSVP.denodeify` takes a 'node-style' function and returns a function that\n will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the\n browser when you'd prefer to use promises over using callbacks. For example,\n `denodeify` transforms the following:\n\n ```javascript\n let fs = require('fs');\n\n fs.readFile('myfile.txt', function(err, data){\n if (err) return handleError(err);\n handleData(data);\n });\n ```\n\n into:\n\n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n\n readFile('myfile.txt').then(handleData, handleError);\n ```\n\n If the node function has multiple success parameters, then `denodeify`\n just returns the first one:\n\n ```javascript\n let request = RSVP.denodeify(require('request'));\n\n request('http://example.com').then(function(res) {\n // ...\n });\n ```\n\n However, if you need all success parameters, setting `denodeify`'s\n second parameter to `true` causes it to return all success parameters\n as an array:\n\n ```javascript\n let request = RSVP.denodeify(require('request'), true);\n\n request('http://example.com').then(function(result) {\n // result[0] -> res\n // result[1] -> body\n });\n ```\n\n Or if you pass it an array with names it returns the parameters as a hash:\n\n ```javascript\n let request = RSVP.denodeify(require('request'), ['res', 'body']);\n\n request('http://example.com').then(function(result) {\n // result.res\n // result.body\n });\n ```\n\n Sometimes you need to retain the `this`:\n\n ```javascript\n let app = require('express')();\n let render = RSVP.denodeify(app.render.bind(app));\n ```\n\n The denodified function inherits from the original function. It works in all\n environments, except IE 10 and below. Consequently all properties of the original\n function are available to you. However, any properties you change on the\n denodeified function won't be changed on the original function. Example:\n\n ```javascript\n let request = RSVP.denodeify(require('request')),\n cookieJar = request.jar(); // <- Inheritance is used here\n\n request('http://example.com', {jar: cookieJar}).then(function(res) {\n // cookieJar.cookies holds now the cookies returned by example.com\n });\n ```\n\n Using `denodeify` makes it easier to compose asynchronous operations instead\n of using callbacks. For example, instead of:\n\n ```javascript\n let fs = require('fs');\n\n fs.readFile('myfile.txt', function(err, data){\n if (err) { ... } // Handle error\n fs.writeFile('myfile2.txt', data, function(err){\n if (err) { ... } // Handle error\n console.log('done')\n });\n });\n ```\n\n you can chain the operations together using `then` from the returned promise:\n\n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n let writeFile = RSVP.denodeify(fs.writeFile);\n\n readFile('myfile.txt').then(function(data){\n return writeFile('myfile2.txt', data);\n }).then(function(){\n console.log('done')\n }).catch(function(error){\n // Handle error\n });\n ```\n\n @method denodeify\n @static\n @for RSVP\n @param {Function} nodeFunc a 'node-style' function that takes a callback as\n its last argument. The callback expects an error to be passed as its first\n argument (if an error occurred, otherwise null), and the value from the\n operation as its second argument ('function(err, value){ }').\n @param {Boolean|Array} [options] An optional paramter that if set\n to `true` causes the promise to fulfill with the callback's success arguments\n as an array. This is useful if the node function has multiple success\n paramters. If you set this paramter to an array with names, the promise will\n fulfill with a hash with these names as keys and the success parameters as\n values.\n @return {Function} a function that wraps `nodeFunc` to return an\n `RSVP.Promise`\n @static\n*/\nfunction denodeify(nodeFunc, options) {\n var fn = function fn() {\n var self = this;\n var l = arguments.length;\n var args = new Array(l + 1);\n var promiseInput = false;\n\n for (var i = 0; i < l; ++i) {\n var arg = arguments[i];\n\n if (!promiseInput) {\n // TODO: clean this up\n promiseInput = needsPromiseInput(arg);\n if (promiseInput === GET_THEN_ERROR$1) {\n var p = new Promise(noop);\n reject(p, GET_THEN_ERROR$1.value);\n return p;\n } else if (promiseInput && promiseInput !== true) {\n arg = wrapThenable(promiseInput, arg);\n }\n }\n args[i] = arg;\n }\n\n var promise = new Promise(noop);\n\n args[l] = function (err, val) {\n if (err) reject(promise, err);else if (options === undefined) resolve(promise, val);else if (options === true) resolve(promise, arrayResult(arguments));else if (isArray(options)) resolve(promise, makeObject(arguments, options));else resolve(promise, val);\n };\n\n if (promiseInput) {\n return handlePromiseInput(promise, args, nodeFunc, self);\n } else {\n return handleValueInput(promise, args, nodeFunc, self);\n }\n };\n\n fn.__proto__ = nodeFunc;\n\n return fn;\n}\n\nfunction handleValueInput(promise, args, nodeFunc, self) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n reject(promise, result.value);\n }\n return promise;\n}\n\nfunction handlePromiseInput(promise, args, nodeFunc, self) {\n return Promise.all(args).then(function (args) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n reject(promise, result.value);\n }\n return promise;\n });\n}\n\nfunction needsPromiseInput(arg) {\n if (arg && typeof arg === 'object') {\n if (arg.constructor === Promise) {\n return true;\n } else {\n return getThen$1(arg);\n }\n } else {\n return false;\n }\n}\n\n/**\n This is a convenient alias for `RSVP.Promise.all`.\n\n @method all\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n*/\nfunction all$1(array, label) {\n return Promise.all(array, label);\n}\n\nfunction AllSettled(Constructor, entries, label) {\n this._superConstructor(Constructor, entries, false, /* don't abort on reject */label);\n}\n\nAllSettled.prototype = o_create(Enumerator.prototype);\nAllSettled.prototype._superConstructor = Enumerator;\nAllSettled.prototype._makeResult = makeSettledResult;\nAllSettled.prototype._validationError = function () {\n return new Error('allSettled must be called with an array');\n};\n\n/**\n `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing\n a fail-fast method, it waits until all the promises have returned and\n shows you all the results. This is useful if you want to handle multiple\n promises' failure states together as a set.\n\n Returns a promise that is fulfilled when all the given promises have been\n settled. The return promise is fulfilled with an array of the states of\n the promises passed into the `promises` array argument.\n\n Each state object will either indicate fulfillment or rejection, and\n provide the corresponding value or reason. The states will take one of\n the following formats:\n\n ```javascript\n { state: 'fulfilled', value: value }\n or\n { state: 'rejected', reason: reason }\n ```\n\n Example:\n\n ```javascript\n let promise1 = RSVP.Promise.resolve(1);\n let promise2 = RSVP.Promise.reject(new Error('2'));\n let promise3 = RSVP.Promise.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n\n RSVP.allSettled(promises).then(function(array){\n // array == [\n // { state: 'fulfilled', value: 1 },\n // { state: 'rejected', reason: Error },\n // { state: 'rejected', reason: Error }\n // ]\n // Note that for the second item, reason.message will be '2', and for the\n // third item, reason.message will be '3'.\n }, function(error) {\n // Not run. (This block would only be called if allSettled had failed,\n // for instance if passed an incorrect argument type.)\n });\n ```\n\n @method allSettled\n @static\n @for RSVP\n @param {Array} entries\n @param {String} label - optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with an array of the settled\n states of the constituent promises.\n*/\nfunction allSettled(entries, label) {\n return new AllSettled(Promise, entries, label).promise;\n}\n\n/**\n This is a convenient alias for `RSVP.Promise.race`.\n\n @method race\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n */\nfunction race$1(array, label) {\n return Promise.race(array, label);\n}\n\nfunction PromiseHash(Constructor, object, label) {\n this._superConstructor(Constructor, object, true, label);\n}\n\nPromiseHash.prototype = o_create(Enumerator.prototype);\nPromiseHash.prototype._superConstructor = Enumerator;\nPromiseHash.prototype._init = function () {\n this._result = {};\n};\n\nPromiseHash.prototype._validateInput = function (input) {\n return input && typeof input === 'object';\n};\n\nPromiseHash.prototype._validationError = function () {\n return new Error('Promise.hash must be called with an object');\n};\n\nPromiseHash.prototype._enumerate = function () {\n var enumerator = this;\n var promise = enumerator.promise;\n var input = enumerator._input;\n var results = [];\n\n for (var key in input) {\n if (promise._state === PENDING && Object.prototype.hasOwnProperty.call(input, key)) {\n results.push({\n position: key,\n entry: input[key]\n });\n }\n }\n\n var length = results.length;\n enumerator._remaining = length;\n var result = undefined;\n\n for (var i = 0; promise._state === PENDING && i < length; i++) {\n result = results[i];\n enumerator._eachEntry(result.entry, result.position);\n }\n};\n\n/**\n `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array\n for its `promises` argument.\n\n Returns a promise that is fulfilled when all the given promises have been\n fulfilled, or rejected if any of them become rejected. The returned promise\n is fulfilled with a hash that has the same key names as the `promises` object\n argument. If any of the values in the object are not promises, they will\n simply be copied over to the fulfilled object.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n yourPromise: RSVP.resolve(2),\n theirPromise: RSVP.resolve(3),\n notAPromise: 4\n };\n\n RSVP.hash(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: 1,\n // yourPromise: 2,\n // theirPromise: 3,\n // notAPromise: 4\n // }\n });\n ````\n\n If any of the `promises` given to `RSVP.hash` are rejected, the first promise\n that is rejected will be given as the reason to the rejection handler.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n rejectedPromise: RSVP.reject(new Error('rejectedPromise')),\n anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')),\n };\n\n RSVP.hash(promises).then(function(hash){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === 'rejectedPromise'\n });\n ```\n\n An important note: `RSVP.hash` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hash` will NOT preserve prototype\n chains.\n\n Example:\n\n ```javascript\n function MyConstructor(){\n this.example = RSVP.resolve('Example');\n }\n\n MyConstructor.prototype = {\n protoProperty: RSVP.resolve('Proto Property')\n };\n\n let myObject = new MyConstructor();\n\n RSVP.hash(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: 'Example'\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n\n @method hash\n @static\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all properties of `promises`\n have been fulfilled, or rejected if any of them become rejected.\n*/\nfunction hash(object, label) {\n return new PromiseHash(Promise, object, label).promise;\n}\n\nfunction HashSettled(Constructor, object, label) {\n this._superConstructor(Constructor, object, false, label);\n}\n\nHashSettled.prototype = o_create(PromiseHash.prototype);\nHashSettled.prototype._superConstructor = Enumerator;\nHashSettled.prototype._makeResult = makeSettledResult;\n\nHashSettled.prototype._validationError = function () {\n return new Error('hashSettled must be called with an object');\n};\n\n/**\n `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object\n instead of an array for its `promises` argument.\n\n Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method,\n but like `RSVP.allSettled`, `hashSettled` waits until all the\n constituent promises have returned and then shows you all the results\n with their states and values/reasons. This is useful if you want to\n handle multiple promises' failure states together as a set.\n\n Returns a promise that is fulfilled when all the given promises have been\n settled, or rejected if the passed parameters are invalid.\n\n The returned promise is fulfilled with a hash that has the same key names as\n the `promises` object argument. If any of the values in the object are not\n promises, they will be copied over to the fulfilled object and marked with state\n 'fulfilled'.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n yourPromise: RSVP.Promise.resolve(2),\n theirPromise: RSVP.Promise.resolve(3),\n notAPromise: 4\n };\n\n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // yourPromise: { state: 'fulfilled', value: 2 },\n // theirPromise: { state: 'fulfilled', value: 3 },\n // notAPromise: { state: 'fulfilled', value: 4 }\n // }\n });\n ```\n\n If any of the `promises` given to `RSVP.hash` are rejected, the state will\n be set to 'rejected' and the reason for rejection provided.\n\n Example:\n\n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n rejectedPromise: RSVP.Promise.reject(new Error('rejection')),\n anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')),\n };\n\n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // rejectedPromise: { state: 'rejected', reason: Error },\n // anotherRejectedPromise: { state: 'rejected', reason: Error },\n // }\n // Note that for rejectedPromise, reason.message == 'rejection',\n // and for anotherRejectedPromise, reason.message == 'more rejection'.\n });\n ```\n\n An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype\n chains.\n\n Example:\n\n ```javascript\n function MyConstructor(){\n this.example = RSVP.Promise.resolve('Example');\n }\n\n MyConstructor.prototype = {\n protoProperty: RSVP.Promise.resolve('Proto Property')\n };\n\n let myObject = new MyConstructor();\n\n RSVP.hashSettled(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: { state: 'fulfilled', value: 'Example' }\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n\n @method hashSettled\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when when all properties of `promises`\n have been settled.\n @static\n*/\nfunction hashSettled(object, label) {\n return new HashSettled(Promise, object, label).promise;\n}\n\nfunction rethrow(reason) {\n setTimeout(function () {\n throw reason;\n });\n throw reason;\n}\n\n/**\n `RSVP.defer` returns an object similar to jQuery's `$.Deferred`.\n `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s\n interface. New code should use the `RSVP.Promise` constructor instead.\n\n The object returned from `RSVP.defer` is a plain object with three properties:\n\n * promise - an `RSVP.Promise`.\n * reject - a function that causes the `promise` property on this object to\n become rejected\n * resolve - a function that causes the `promise` property on this object to\n become fulfilled.\n\n Example:\n\n ```javascript\n let deferred = RSVP.defer();\n\n deferred.resolve(\"Success!\");\n\n deferred.promise.then(function(value){\n // value here is \"Success!\"\n });\n ```\n\n @method defer\n @static\n @for RSVP\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Object}\n */\nfunction defer(label) {\n var deferred = { resolve: undefined, reject: undefined };\n\n deferred.promise = new Promise(function (resolve, reject) {\n deferred.resolve = resolve;\n deferred.reject = reject;\n }, label);\n\n return deferred;\n}\n\n/**\n `RSVP.map` is similar to JavaScript's native `map` method, except that it\n waits for all promises to become fulfilled before running the `mapFn` on\n each item in given to `promises`. `RSVP.map` returns a promise that will\n become fulfilled with the result of running `mapFn` on the values the promises\n become fulfilled with.\n\n For example:\n\n ```javascript\n\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n let mapFn = function(item){\n return item + 1;\n };\n\n RSVP.map(promises, mapFn).then(function(result){\n // result is [ 2, 3, 4 ]\n });\n ```\n\n If any of the `promises` given to `RSVP.map` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n\n let mapFn = function(item){\n return item + 1;\n };\n\n RSVP.map(promises, mapFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n\n `RSVP.map` will also wait if a promise is returned from `mapFn`. For example,\n say you want to get all comments from a set of blog posts, but you need\n the blog posts first because they contain a url to those comments.\n\n ```javscript\n\n let mapFn = function(blogPost){\n // getComments does some ajax and returns an RSVP.Promise that is fulfilled\n // with some comments data\n return getComments(blogPost.comments_url);\n };\n\n // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled\n // with some blog post data\n RSVP.map(getBlogPosts(), mapFn).then(function(comments){\n // comments is the result of asking the server for the comments\n // of all blog posts returned from getBlogPosts()\n });\n ```\n\n @method map\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} mapFn function to be called on each fulfilled promise.\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with the result of calling\n `mapFn` on each fulfilled promise or value when they become fulfilled.\n The promise will be rejected if any of the given `promises` become rejected.\n @static\n*/\nfunction map(promises, mapFn, label) {\n return Promise.all(promises, label).then(function (values) {\n if (!isFunction(mapFn)) {\n throw new TypeError(\"You must pass a function as map's second argument.\");\n }\n\n var length = values.length;\n var results = new Array(length);\n\n for (var i = 0; i < length; i++) {\n results[i] = mapFn(values[i]);\n }\n\n return Promise.all(results, label);\n });\n}\n\n/**\n This is a convenient alias for `RSVP.Promise.resolve`.\n\n @method resolve\n @static\n @for RSVP\n @param {*} value value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$2(value, label) {\n return Promise.resolve(value, label);\n}\n\n/**\n This is a convenient alias for `RSVP.Promise.reject`.\n\n @method reject\n @static\n @for RSVP\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$2(reason, label) {\n return Promise.reject(reason, label);\n}\n\n/**\n `RSVP.filter` is similar to JavaScript's native `filter` method, except that it\n waits for all promises to become fulfilled before running the `filterFn` on\n each item in given to `promises`. `RSVP.filter` returns a promise that will\n become fulfilled with the result of running `filterFn` on the values the\n promises become fulfilled with.\n\n For example:\n\n ```javascript\n\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n\n let promises = [promise1, promise2, promise3];\n\n let filterFn = function(item){\n return item > 1;\n };\n\n RSVP.filter(promises, filterFn).then(function(result){\n // result is [ 2, 3 ]\n });\n ```\n\n If any of the `promises` given to `RSVP.filter` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n\n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n\n let filterFn = function(item){\n return item > 1;\n };\n\n RSVP.filter(promises, filterFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n\n `RSVP.filter` will also wait for any promises returned from `filterFn`.\n For instance, you may want to fetch a list of users then return a subset\n of those users based on some asynchronous operation:\n\n ```javascript\n\n let alice = { name: 'alice' };\n let bob = { name: 'bob' };\n let users = [ alice, bob ];\n\n let promises = users.map(function(user){\n return RSVP.resolve(user);\n });\n\n let filterFn = function(user){\n // Here, Alice has permissions to create a blog post, but Bob does not.\n return getPrivilegesForUser(user).then(function(privs){\n return privs.can_create_blog_post === true;\n });\n };\n RSVP.filter(promises, filterFn).then(function(users){\n // true, because the server told us only Alice can create a blog post.\n users.length === 1;\n // false, because Alice is the only user present in `users`\n users[0] === bob;\n });\n ```\n\n @method filter\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} filterFn - function to be called on each resolved value to\n filter the final results.\n @param {String} label optional string describing the promise. Useful for\n tooling.\n @return {Promise}\n*/\n\nfunction resolveAll(promises, label) {\n return Promise.all(promises, label);\n}\n\nfunction resolveSingle(promise, label) {\n return Promise.resolve(promise, label).then(function (promises) {\n return resolveAll(promises, label);\n });\n}\nfunction filter(promises, filterFn, label) {\n var promise = isArray(promises) ? resolveAll(promises, label) : resolveSingle(promises, label);\n return promise.then(function (values) {\n if (!isFunction(filterFn)) {\n throw new TypeError(\"You must pass a function as filter's second argument.\");\n }\n\n var length = values.length;\n var filtered = new Array(length);\n\n for (var i = 0; i < length; i++) {\n filtered[i] = filterFn(values[i]);\n }\n\n return resolveAll(filtered, label).then(function (filtered) {\n var results = new Array(length);\n var newLength = 0;\n\n for (var i = 0; i < length; i++) {\n if (filtered[i]) {\n results[newLength] = values[i];\n newLength++;\n }\n }\n\n results.length = newLength;\n\n return results;\n });\n });\n}\n\nvar len = 0;\nvar vertxNext = undefined;\nfunction asap(callback, arg) {\n queue$1[len] = callback;\n queue$1[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 1, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n scheduleFlush$1();\n }\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n var nextTick = process.nextTick;\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // setImmediate should be used instead instead\n var version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n nextTick = setImmediate;\n }\n return function () {\n return nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n return function () {\n return vertxNext(flush);\n };\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n return node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n return function () {\n return setTimeout(flush, 1);\n };\n}\n\nvar queue$1 = new Array(1000);\n\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue$1[i];\n var arg = queue$1[i + 1];\n\n callback(arg);\n\n queue$1[i] = undefined;\n queue$1[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertex() {\n try {\n var r = require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush$1 = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush$1 = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush$1 = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush$1 = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush$1 = attemptVertex();\n} else {\n scheduleFlush$1 = useSetTimeout();\n}\n\nvar platform = undefined;\n\n/* global self */\nif (typeof self === 'object') {\n platform = self;\n\n /* global global */\n} else if (typeof global === 'object') {\n platform = global;\n } else {\n throw new Error('no global: `self` or `global` found');\n }\n\nvar _async$filter;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// defaults\n\n// the default export here is for backwards compat:\n// https://github.com/tildeio/rsvp.js/issues/434\nconfig.async = asap;\nconfig.after = function (cb) {\n return setTimeout(cb, 0);\n};\nvar cast = resolve$2;\n\nvar async = function async(callback, arg) {\n return config.async(callback, arg);\n};\n\nfunction on() {\n config['on'].apply(config, arguments);\n}\n\nfunction off() {\n config['off'].apply(config, arguments);\n}\n\n// Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`\nif (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {\n var callbacks = window['__PROMISE_INSTRUMENTATION__'];\n configure('instrument', true);\n for (var eventName in callbacks) {\n if (callbacks.hasOwnProperty(eventName)) {\n on(eventName, callbacks[eventName]);\n }\n }\n}var rsvp = (_async$filter = {\n cast: cast,\n Promise: Promise,\n EventTarget: EventTarget,\n all: all$1,\n allSettled: allSettled,\n race: race$1,\n hash: hash,\n hashSettled: hashSettled,\n rethrow: rethrow,\n defer: defer,\n denodeify: denodeify,\n configure: configure,\n on: on,\n off: off,\n resolve: resolve$2,\n reject: reject$2,\n map: map\n}, _defineProperty(_async$filter, 'async', async), _defineProperty(_async$filter, 'filter', // babel seems to error if async isn't a computed prop here...\nfilter), _async$filter);\n\nexports['default'] = rsvp;\nexports.cast = cast;\nexports.Promise = Promise;\nexports.EventTarget = EventTarget;\nexports.all = all$1;\nexports.allSettled = allSettled;\nexports.race = race$1;\nexports.hash = hash;\nexports.hashSettled = hashSettled;\nexports.rethrow = rethrow;\nexports.defer = defer;\nexports.denodeify = denodeify;\nexports.configure = configure;\nexports.on = on;\nexports.off = off;\nexports.resolve = resolve$2;\nexports.reject = reject$2;\nexports.map = map;\nexports.async = async;\nexports.filter = filter;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=rsvp.map\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/rsvp/dist/rsvp.js\n ** module id = 2\n ** module chunks = 0\n **/","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/process/browser.js\n ** module id = 3\n ** module chunks = 0\n **/","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/timers-browserify/main.js\n ** module id = 4\n ** module chunks = 0\n **/","/* (ignored) */\n\n\n/*****************\n ** WEBPACK FOOTER\n ** vertx (ignored)\n ** module id = 5\n ** module chunks = 0\n **/","/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.18.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n(function (root, factory) {\n 'use strict';\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n if (typeof exports === 'object') {\n // Node\n module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n } else {\n // Browser globals (root is window)\n root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n }\n}(this, function (punycode, IPv6, SLD, root) {\n 'use strict';\n /*global location, escape, unescape */\n // FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n /*jshint camelcase: false */\n\n // save current URI variable, if any\n var _URI = root && root.URI;\n\n function URI(url, base) {\n var _urlSupplied = arguments.length >= 1;\n var _baseSupplied = arguments.length >= 2;\n\n // Allow instantiation without the 'new' keyword\n if (!(this instanceof URI)) {\n if (_urlSupplied) {\n if (_baseSupplied) {\n return new URI(url, base);\n }\n\n return new URI(url);\n }\n\n return new URI();\n }\n\n if (url === undefined) {\n if (_urlSupplied) {\n throw new TypeError('undefined is not a valid argument for URI');\n }\n\n if (typeof location !== 'undefined') {\n url = location.href + '';\n } else {\n url = '';\n }\n }\n\n this.href(url);\n\n // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n if (base !== undefined) {\n return this.absoluteTo(base);\n }\n\n return this;\n }\n\n URI.version = '1.18.1';\n\n var p = URI.prototype;\n var hasOwn = Object.prototype.hasOwnProperty;\n\n function escapeRegEx(string) {\n // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n return string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n }\n\n function getType(value) {\n // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n if (value === undefined) {\n return 'Undefined';\n }\n\n return String(Object.prototype.toString.call(value)).slice(8, -1);\n }\n\n function isArray(obj) {\n return getType(obj) === 'Array';\n }\n\n function filterArrayValues(data, value) {\n var lookup = {};\n var i, length;\n\n if (getType(value) === 'RegExp') {\n lookup = null;\n } else if (isArray(value)) {\n for (i = 0, length = value.length; i < length; i++) {\n lookup[value[i]] = true;\n }\n } else {\n lookup[value] = true;\n }\n\n for (i = 0, length = data.length; i < length; i++) {\n /*jshint laxbreak: true */\n var _match = lookup && lookup[data[i]] !== undefined\n || !lookup && value.test(data[i]);\n /*jshint laxbreak: false */\n if (_match) {\n data.splice(i, 1);\n length--;\n i--;\n }\n }\n\n return data;\n }\n\n function arrayContains(list, value) {\n var i, length;\n\n // value may be string, number, array, regexp\n if (isArray(value)) {\n // Note: this can be optimized to O(n) (instead of current O(m * n))\n for (i = 0, length = value.length; i < length; i++) {\n if (!arrayContains(list, value[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n var _type = getType(value);\n for (i = 0, length = list.length; i < length; i++) {\n if (_type === 'RegExp') {\n if (typeof list[i] === 'string' && list[i].match(value)) {\n return true;\n }\n } else if (list[i] === value) {\n return true;\n }\n }\n\n return false;\n }\n\n function arraysEqual(one, two) {\n if (!isArray(one) || !isArray(two)) {\n return false;\n }\n\n // arrays can't be equal if they have different amount of content\n if (one.length !== two.length) {\n return false;\n }\n\n one.sort();\n two.sort();\n\n for (var i = 0, l = one.length; i < l; i++) {\n if (one[i] !== two[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n function trimSlashes(text) {\n var trim_expression = /^\\/+|\\/+$/g;\n return text.replace(trim_expression, '');\n }\n\n URI._parts = function() {\n return {\n protocol: null,\n username: null,\n password: null,\n hostname: null,\n urn: null,\n port: null,\n path: null,\n query: null,\n fragment: null,\n // state\n duplicateQueryParameters: URI.duplicateQueryParameters,\n escapeQuerySpace: URI.escapeQuerySpace\n };\n };\n // state: allow duplicate query parameters (a=1&a=1)\n URI.duplicateQueryParameters = false;\n // state: replaces + with %20 (space in query strings)\n URI.escapeQuerySpace = true;\n // static properties\n URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n URI.idn_expression = /[^a-z0-9\\.-]/i;\n URI.punycode_expression = /(xn--)/i;\n // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n URI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n // credits to Rich Brown\n // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n // specification: http://www.ietf.org/rfc/rfc4291.txt\n URI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n // expression used is \"gruber revised\" (@gruber v2) determined to be the\n // best solution in a regex-golf we did a couple of ages ago at\n // * http://mathiasbynens.be/demo/url-regex\n // * http://rodneyrehm.de/t/url-regex.html\n URI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/ig;\n URI.findUri = {\n // valid \"scheme://\" or \"www.\"\n start: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n // everything up to the next whitespace\n end: /[\\s\\r\\n]|$/,\n // trim trailing punctuation captured by end RegExp\n trim: /[`!()\\[\\]{};:'\".,<>?«»“”„‘’]+$/\n };\n // http://www.iana.org/assignments/uri-schemes.html\n // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n URI.defaultPorts = {\n http: '80',\n https: '443',\n ftp: '21',\n gopher: '70',\n ws: '80',\n wss: '443'\n };\n // allowed hostname characters according to RFC 3986\n // ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . -\n URI.invalid_hostname_characters = /[^a-zA-Z0-9\\.-]/;\n // map DOM Elements to their URI attribute\n URI.domAttributes = {\n 'a': 'href',\n 'blockquote': 'cite',\n 'link': 'href',\n 'base': 'href',\n 'script': 'src',\n 'form': 'action',\n 'img': 'src',\n 'area': 'href',\n 'iframe': 'src',\n 'embed': 'src',\n 'source': 'src',\n 'track': 'src',\n 'input': 'src', // but only if type=\"image\"\n 'audio': 'src',\n 'video': 'src'\n };\n URI.getDomAttribute = function(node) {\n if (!node || !node.nodeName) {\n return undefined;\n }\n\n var nodeName = node.nodeName.toLowerCase();\n // should only expose src for type=\"image\"\n if (nodeName === 'input' && node.type !== 'image') {\n return undefined;\n }\n\n return URI.domAttributes[nodeName];\n };\n\n function escapeForDumbFirefox36(value) {\n // https://github.com/medialize/URI.js/issues/91\n return escape(value);\n }\n\n // encoding / decoding according to RFC3986\n function strictEncodeURIComponent(string) {\n // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(string)\n .replace(/[!'()*]/g, escapeForDumbFirefox36)\n .replace(/\\*/g, '%2A');\n }\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n URI.iso8859 = function() {\n URI.encode = escape;\n URI.decode = unescape;\n };\n URI.unicode = function() {\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n };\n URI.characters = {\n pathname: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n map: {\n // -._~!'()*\n '%24': '$',\n '%26': '&',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%3A': ':',\n '%40': '@'\n }\n },\n decode: {\n expression: /[\\/\\?#]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23'\n }\n }\n },\n reserved: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n map: {\n // gen-delims\n '%3A': ':',\n '%2F': '/',\n '%3F': '?',\n '%23': '#',\n '%5B': '[',\n '%5D': ']',\n '%40': '@',\n // sub-delims\n '%21': '!',\n '%24': '$',\n '%26': '&',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '='\n }\n }\n },\n urnpath: {\n // The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n // for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n // note that the colon character is not featured in the encoding map; this is because URI.js\n // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n // should not appear unencoded in a segment itself.\n // See also the note above about RFC3986 and capitalalized hex digits.\n encode: {\n expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n map: {\n '%21': '!',\n '%24': '$',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%40': '@'\n }\n },\n // These characters are the characters called out by RFC2141 as \"reserved\" characters that\n // should never appear in a URN, plus the colon character (see note above).\n decode: {\n expression: /[\\/\\?#:]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23',\n ':': '%3A'\n }\n }\n }\n };\n URI.encodeQuery = function(string, escapeQuerySpace) {\n var escaped = URI.encode(string + '');\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n };\n URI.decodeQuery = function(string, escapeQuerySpace) {\n string += '';\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n try {\n return URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n } catch(e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n // generate encode/decode path functions\n var _parts = {'encode':'encode', 'decode':'decode'};\n var _part;\n var generateAccessor = function(_group, _part) {\n return function(string) {\n try {\n return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) {\n return URI.characters[_group][_part].map[c];\n });\n } catch (e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n };\n\n for (_part in _parts) {\n URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n }\n\n var generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) {\n return function(string) {\n // Why pass in names of functions, rather than the function objects themselves? The\n // definitions of some functions (but in particular, URI.decode) will occasionally change due\n // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n // that the functions we use here are \"fresh\".\n var actualCodingFunc;\n if (!_innerCodingFuncName) {\n actualCodingFunc = URI[_codingFuncName];\n } else {\n actualCodingFunc = function(string) {\n return URI[_codingFuncName](URI[_innerCodingFuncName](string));\n };\n }\n\n var segments = (string + '').split(_sep);\n\n for (var i = 0, length = segments.length; i < length; i++) {\n segments[i] = actualCodingFunc(segments[i]);\n }\n\n return segments.join(_sep);\n };\n };\n\n // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n\n URI.encodeReserved = generateAccessor('reserved', 'encode');\n\n URI.parse = function(string, parts) {\n var pos;\n if (!parts) {\n parts = {};\n }\n // [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n // extract fragment\n pos = string.indexOf('#');\n if (pos > -1) {\n // escaping?\n parts.fragment = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract query\n pos = string.indexOf('?');\n if (pos > -1) {\n // escaping?\n parts.query = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract protocol\n if (string.substring(0, 2) === '//') {\n // relative-scheme\n parts.protocol = null;\n string = string.substring(2);\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n pos = string.indexOf(':');\n if (pos > -1) {\n parts.protocol = string.substring(0, pos) || null;\n if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n // : may be within the path\n parts.protocol = undefined;\n } else if (string.substring(pos + 1, pos + 3) === '//') {\n string = string.substring(pos + 3);\n\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n string = string.substring(pos + 1);\n parts.urn = true;\n }\n }\n }\n\n // what's left must be the path\n parts.path = string;\n\n // and we're done\n return parts;\n };\n URI.parseHost = function(string, parts) {\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n // https://github.com/medialize/URI.js/pull/233\n string = string.replace(/\\\\/g, '/');\n\n // extract host:port\n var pos = string.indexOf('/');\n var bracketPos;\n var t;\n\n if (pos === -1) {\n pos = string.length;\n }\n\n if (string.charAt(0) === '[') {\n // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n // IPv6+port in the format [2001:db8::1]:80 (for the time being)\n bracketPos = string.indexOf(']');\n parts.hostname = string.substring(1, bracketPos) || null;\n parts.port = string.substring(bracketPos + 2, pos) || null;\n if (parts.port === '/') {\n parts.port = null;\n }\n } else {\n var firstColon = string.indexOf(':');\n var firstSlash = string.indexOf('/');\n var nextColon = string.indexOf(':', firstColon + 1);\n if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n // IPv6 host contains multiple colons - but no port\n // this notation is actually not allowed by RFC 3986, but we're a liberal parser\n parts.hostname = string.substring(0, pos) || null;\n parts.port = null;\n } else {\n t = string.substring(0, pos).split(':');\n parts.hostname = t[0] || null;\n parts.port = t[1] || null;\n }\n }\n\n if (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n pos++;\n string = '/' + string;\n }\n\n return string.substring(pos) || '/';\n };\n URI.parseAuthority = function(string, parts) {\n string = URI.parseUserinfo(string, parts);\n return URI.parseHost(string, parts);\n };\n URI.parseUserinfo = function(string, parts) {\n // extract username:password\n var firstSlash = string.indexOf('/');\n var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n var t;\n\n // authority@ must come before /path\n if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n t = string.substring(0, pos).split(':');\n parts.username = t[0] ? URI.decode(t[0]) : null;\n t.shift();\n parts.password = t[0] ? URI.decode(t.join(':')) : null;\n string = string.substring(pos + 1);\n } else {\n parts.username = null;\n parts.password = null;\n }\n\n return string;\n };\n URI.parseQuery = function(string, escapeQuerySpace) {\n if (!string) {\n return {};\n }\n\n // throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n string = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n\n if (!string) {\n return {};\n }\n\n var items = {};\n var splits = string.split('&');\n var length = splits.length;\n var v, name, value;\n\n for (var i = 0; i < length; i++) {\n v = splits[i].split('=');\n name = URI.decodeQuery(v.shift(), escapeQuerySpace);\n // no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n\n if (hasOwn.call(items, name)) {\n if (typeof items[name] === 'string' || items[name] === null) {\n items[name] = [items[name]];\n }\n\n items[name].push(value);\n } else {\n items[name] = value;\n }\n }\n\n return items;\n };\n\n URI.build = function(parts) {\n var t = '';\n\n if (parts.protocol) {\n t += parts.protocol + ':';\n }\n\n if (!parts.urn && (t || parts.hostname)) {\n t += '//';\n }\n\n t += (URI.buildAuthority(parts) || '');\n\n if (typeof parts.path === 'string') {\n if (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') {\n t += '/';\n }\n\n t += parts.path;\n }\n\n if (typeof parts.query === 'string' && parts.query) {\n t += '?' + parts.query;\n }\n\n if (typeof parts.fragment === 'string' && parts.fragment) {\n t += '#' + parts.fragment;\n }\n return t;\n };\n URI.buildHost = function(parts) {\n var t = '';\n\n if (!parts.hostname) {\n return '';\n } else if (URI.ip6_expression.test(parts.hostname)) {\n t += '[' + parts.hostname + ']';\n } else {\n t += parts.hostname;\n }\n\n if (parts.port) {\n t += ':' + parts.port;\n }\n\n return t;\n };\n URI.buildAuthority = function(parts) {\n return URI.buildUserinfo(parts) + URI.buildHost(parts);\n };\n URI.buildUserinfo = function(parts) {\n var t = '';\n\n if (parts.username) {\n t += URI.encode(parts.username);\n }\n\n if (parts.password) {\n t += ':' + URI.encode(parts.password);\n }\n\n if (t) {\n t += '@';\n }\n\n return t;\n };\n URI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) {\n // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed\n // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n // URI.js treats the query string as being application/x-www-form-urlencoded\n // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n var t = '';\n var unique, key, i, length;\n for (key in data) {\n if (hasOwn.call(data, key) && key) {\n if (isArray(data[key])) {\n unique = {};\n for (i = 0, length = data[key].length; i < length; i++) {\n if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n if (duplicateQueryParameters !== true) {\n unique[data[key][i] + ''] = true;\n }\n }\n }\n } else if (data[key] !== undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n }\n }\n }\n\n return t.substring(1);\n };\n URI.buildQueryParameter = function(name, value, escapeQuerySpace) {\n // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n // don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n };\n\n URI.addQuery = function(data, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.addQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (data[name] === undefined) {\n data[name] = value;\n return;\n } else if (typeof data[name] === 'string') {\n data[name] = [data[name]];\n }\n\n if (!isArray(value)) {\n value = [value];\n }\n\n data[name] = (data[name] || []).concat(value);\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n };\n URI.removeQuery = function(data, name, value) {\n var i, length, key;\n\n if (isArray(name)) {\n for (i = 0, length = name.length; i < length; i++) {\n data[name[i]] = undefined;\n }\n } else if (getType(name) === 'RegExp') {\n for (key in data) {\n if (name.test(key)) {\n data[key] = undefined;\n }\n }\n } else if (typeof name === 'object') {\n for (key in name) {\n if (hasOwn.call(name, key)) {\n URI.removeQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (value !== undefined) {\n if (getType(value) === 'RegExp') {\n if (!isArray(data[name]) && value.test(data[name])) {\n data[name] = undefined;\n } else {\n data[name] = filterArrayValues(data[name], value);\n }\n } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n data[name] = undefined;\n } else if (isArray(data[name])) {\n data[name] = filterArrayValues(data[name], value);\n }\n } else {\n data[name] = undefined;\n }\n } else {\n throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n }\n };\n URI.hasQuery = function(data, name, value, withinArray) {\n switch (getType(name)) {\n case 'String':\n // Nothing to do here\n break;\n\n case 'RegExp':\n for (var key in data) {\n if (hasOwn.call(data, key)) {\n if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) {\n return true;\n }\n }\n }\n\n return false;\n\n case 'Object':\n for (var _key in name) {\n if (hasOwn.call(name, _key)) {\n if (!URI.hasQuery(data, _key, name[_key])) {\n return false;\n }\n }\n }\n\n return true;\n\n default:\n throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter');\n }\n\n switch (getType(value)) {\n case 'Undefined':\n // true if exists (but may be empty)\n return name in data; // data[name] !== undefined;\n\n case 'Boolean':\n // true if exists and non-empty\n var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n return value === _booly;\n\n case 'Function':\n // allow complex comparison\n return !!value(data[name], name, data);\n\n case 'Array':\n if (!isArray(data[name])) {\n return false;\n }\n\n var op = withinArray ? arrayContains : arraysEqual;\n return op(data[name], value);\n\n case 'RegExp':\n if (!isArray(data[name])) {\n return Boolean(data[name] && data[name].match(value));\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n case 'Number':\n value = String(value);\n /* falls through */\n case 'String':\n if (!isArray(data[name])) {\n return data[name] === value;\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n default:\n throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n }\n };\n\n\n URI.joinPaths = function() {\n var input = [];\n var segments = [];\n var nonEmptySegments = 0;\n\n for (var i = 0; i < arguments.length; i++) {\n var url = new URI(arguments[i]);\n input.push(url);\n var _segments = url.segment();\n for (var s = 0; s < _segments.length; s++) {\n if (typeof _segments[s] === 'string') {\n segments.push(_segments[s]);\n }\n\n if (_segments[s]) {\n nonEmptySegments++;\n }\n }\n }\n\n if (!segments.length || !nonEmptySegments) {\n return new URI('');\n }\n\n var uri = new URI('').segment(segments);\n\n if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') {\n uri.path('/' + uri.path());\n }\n\n return uri.normalize();\n };\n\n URI.commonPath = function(one, two) {\n var length = Math.min(one.length, two.length);\n var pos;\n\n // find first non-matching character\n for (pos = 0; pos < length; pos++) {\n if (one.charAt(pos) !== two.charAt(pos)) {\n pos--;\n break;\n }\n }\n\n if (pos < 1) {\n return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n }\n\n // revert to last /\n if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n pos = one.substring(0, pos).lastIndexOf('/');\n }\n\n return one.substring(0, pos + 1);\n };\n\n URI.withinString = function(string, callback, options) {\n options || (options = {});\n var _start = options.start || URI.findUri.start;\n var _end = options.end || URI.findUri.end;\n var _trim = options.trim || URI.findUri.trim;\n var _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n\n _start.lastIndex = 0;\n while (true) {\n var match = _start.exec(string);\n if (!match) {\n break;\n }\n\n var start = match.index;\n if (options.ignoreHtml) {\n // attribut(e=[\"']?$)\n var attributeOpen = string.slice(Math.max(start - 3, 0), start);\n if (attributeOpen && _attributeOpen.test(attributeOpen)) {\n continue;\n }\n }\n\n var end = start + string.slice(start).search(_end);\n var slice = string.slice(start, end).replace(_trim, '');\n if (options.ignore && options.ignore.test(slice)) {\n continue;\n }\n\n end = start + slice.length;\n var result = callback(slice, start, end, string);\n string = string.slice(0, start) + result + string.slice(end);\n _start.lastIndex = start + result.length;\n }\n\n _start.lastIndex = 0;\n return string;\n };\n\n URI.ensureValidHostname = function(v) {\n // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n // they are not part of DNS and therefore ignored by URI.js\n\n if (v.match(URI.invalid_hostname_characters)) {\n // test punycode\n if (!punycode) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-] and Punycode.js is not available');\n }\n\n if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n }\n };\n\n // noConflict\n URI.noConflict = function(removeAll) {\n if (removeAll) {\n var unconflicted = {\n URI: this.noConflict()\n };\n\n if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n unconflicted.URITemplate = root.URITemplate.noConflict();\n }\n\n if (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n unconflicted.IPv6 = root.IPv6.noConflict();\n }\n\n if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n }\n\n return unconflicted;\n } else if (root.URI === this) {\n root.URI = _URI;\n }\n\n return this;\n };\n\n p.build = function(deferBuild) {\n if (deferBuild === true) {\n this._deferred_build = true;\n } else if (deferBuild === undefined || this._deferred_build) {\n this._string = URI.build(this._parts);\n this._deferred_build = false;\n }\n\n return this;\n };\n\n p.clone = function() {\n return new URI(this);\n };\n\n p.valueOf = p.toString = function() {\n return this.build(false)._string;\n };\n\n\n function generateSimpleAccessor(_part){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n this._parts[_part] = v || null;\n this.build(!build);\n return this;\n }\n };\n }\n\n function generatePrefixAccessor(_part, _key){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n if (v !== null) {\n v = v + '';\n if (v.charAt(0) === _key) {\n v = v.substring(1);\n }\n }\n\n this._parts[_part] = v;\n this.build(!build);\n return this;\n }\n };\n }\n\n p.protocol = generateSimpleAccessor('protocol');\n p.username = generateSimpleAccessor('username');\n p.password = generateSimpleAccessor('password');\n p.hostname = generateSimpleAccessor('hostname');\n p.port = generateSimpleAccessor('port');\n p.query = generatePrefixAccessor('query', '?');\n p.fragment = generatePrefixAccessor('fragment', '#');\n\n p.search = function(v, build) {\n var t = this.query(v, build);\n return typeof t === 'string' && t.length ? ('?' + t) : t;\n };\n p.hash = function(v, build) {\n var t = this.fragment(v, build);\n return typeof t === 'string' && t.length ? ('#' + t) : t;\n };\n\n p.pathname = function(v, build) {\n if (v === undefined || v === true) {\n var res = this._parts.path || (this._parts.hostname ? '/' : '');\n return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n } else {\n if (this._parts.urn) {\n this._parts.path = v ? URI.recodeUrnPath(v) : '';\n } else {\n this._parts.path = v ? URI.recodePath(v) : '/';\n }\n this.build(!build);\n return this;\n }\n };\n p.path = p.pathname;\n p.href = function(href, build) {\n var key;\n\n if (href === undefined) {\n return this.toString();\n }\n\n this._string = '';\n this._parts = URI._parts();\n\n var _URI = href instanceof URI;\n var _object = typeof href === 'object' && (href.hostname || href.path || href.pathname);\n if (href.nodeName) {\n var attribute = URI.getDomAttribute(href);\n href = href[attribute] || '';\n _object = false;\n }\n\n // window.location is reported to be an object, but it's not the sort\n // of object we're looking for:\n // * location.protocol ends with a colon\n // * location.query != object.search\n // * location.hash != object.fragment\n // simply serializing the unknown object should do the trick\n // (for location, not for everything...)\n if (!_URI && _object && href.pathname !== undefined) {\n href = href.toString();\n }\n\n if (typeof href === 'string' || href instanceof String) {\n this._parts = URI.parse(String(href), this._parts);\n } else if (_URI || _object) {\n var src = _URI ? href._parts : href;\n for (key in src) {\n if (hasOwn.call(this._parts, key)) {\n this._parts[key] = src[key];\n }\n }\n } else {\n throw new TypeError('invalid input');\n }\n\n this.build(!build);\n return this;\n };\n\n // identification accessors\n p.is = function(what) {\n var ip = false;\n var ip4 = false;\n var ip6 = false;\n var name = false;\n var sld = false;\n var idn = false;\n var punycode = false;\n var relative = !this._parts.urn;\n\n if (this._parts.hostname) {\n relative = false;\n ip4 = URI.ip4_expression.test(this._parts.hostname);\n ip6 = URI.ip6_expression.test(this._parts.hostname);\n ip = ip4 || ip6;\n name = !ip;\n sld = name && SLD && SLD.has(this._parts.hostname);\n idn = name && URI.idn_expression.test(this._parts.hostname);\n punycode = name && URI.punycode_expression.test(this._parts.hostname);\n }\n\n switch (what.toLowerCase()) {\n case 'relative':\n return relative;\n\n case 'absolute':\n return !relative;\n\n // hostname identification\n case 'domain':\n case 'name':\n return name;\n\n case 'sld':\n return sld;\n\n case 'ip':\n return ip;\n\n case 'ip4':\n case 'ipv4':\n case 'inet4':\n return ip4;\n\n case 'ip6':\n case 'ipv6':\n case 'inet6':\n return ip6;\n\n case 'idn':\n return idn;\n\n case 'url':\n return !this._parts.urn;\n\n case 'urn':\n return !!this._parts.urn;\n\n case 'punycode':\n return punycode;\n }\n\n return null;\n };\n\n // component specific input validation\n var _protocol = p.protocol;\n var _port = p.port;\n var _hostname = p.hostname;\n\n p.protocol = function(v, build) {\n if (v !== undefined) {\n if (v) {\n // accept trailing ://\n v = v.replace(/:(\\/\\/)?$/, '');\n\n if (!v.match(URI.protocol_expression)) {\n throw new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n }\n }\n }\n return _protocol.call(this, v, build);\n };\n p.scheme = p.protocol;\n p.port = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n if (v === 0) {\n v = null;\n }\n\n if (v) {\n v += '';\n if (v.charAt(0) === ':') {\n v = v.substring(1);\n }\n\n if (v.match(/[^0-9]/)) {\n throw new TypeError('Port \"' + v + '\" contains characters other than [0-9]');\n }\n }\n }\n return _port.call(this, v, build);\n };\n p.hostname = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n var x = {};\n var res = URI.parseHost(v, x);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n v = x.hostname;\n }\n return _hostname.call(this, v, build);\n };\n\n // compound accessors\n p.origin = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var protocol = this.protocol();\n var authority = this.authority();\n if (!authority) {\n return '';\n }\n\n return (protocol ? protocol + '://' : '') + this.authority();\n } else {\n var origin = URI(v);\n this\n .protocol(origin.protocol())\n .authority(origin.authority())\n .build(!build);\n return this;\n }\n };\n p.host = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildHost(this._parts) : '';\n } else {\n var res = URI.parseHost(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.authority = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n } else {\n var res = URI.parseAuthority(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.userinfo = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var t = URI.buildUserinfo(this._parts);\n return t ? t.substring(0, t.length -1) : t;\n } else {\n if (v[v.length-1] !== '@') {\n v += '@';\n }\n\n URI.parseUserinfo(v, this._parts);\n this.build(!build);\n return this;\n }\n };\n p.resource = function(v, build) {\n var parts;\n\n if (v === undefined) {\n return this.path() + this.search() + this.hash();\n }\n\n parts = URI.parse(v);\n this._parts.path = parts.path;\n this._parts.query = parts.query;\n this._parts.fragment = parts.fragment;\n this.build(!build);\n return this;\n };\n\n // fraction accessors\n p.subdomain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n // convenience, return \"www\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // grab domain and add another segment\n var end = this._parts.hostname.length - this.domain().length - 1;\n return this._parts.hostname.substring(0, end) || '';\n } else {\n var e = this._parts.hostname.length - this.domain().length;\n var sub = this._parts.hostname.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(sub));\n\n if (v && v.charAt(v.length - 1) !== '.') {\n v += '.';\n }\n\n if (v) {\n URI.ensureValidHostname(v);\n }\n\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.domain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // convenience, return \"example.org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // if hostname consists of 1 or 2 segments, it must be the domain\n var t = this._parts.hostname.match(/\\./g);\n if (t && t.length < 2) {\n return this._parts.hostname;\n }\n\n // grab tld and add another segment\n var end = this._parts.hostname.length - this.tld(build).length - 1;\n end = this._parts.hostname.lastIndexOf('.', end -1) + 1;\n return this._parts.hostname.substring(end) || '';\n } else {\n if (!v) {\n throw new TypeError('cannot set domain empty');\n }\n\n URI.ensureValidHostname(v);\n\n if (!this._parts.hostname || this.is('IP')) {\n this._parts.hostname = v;\n } else {\n var replace = new RegExp(escapeRegEx(this.domain()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.tld = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // return \"org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n var pos = this._parts.hostname.lastIndexOf('.');\n var tld = this._parts.hostname.substring(pos + 1);\n\n if (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n return SLD.get(this._parts.hostname) || tld;\n }\n\n return tld;\n } else {\n var replace;\n\n if (!v) {\n throw new TypeError('cannot set TLD empty');\n } else if (v.match(/[^a-zA-Z0-9-]/)) {\n if (SLD && SLD.is(v)) {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n } else {\n throw new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n }\n } else if (!this._parts.hostname || this.is('IP')) {\n throw new ReferenceError('cannot set TLD on non-domain host');\n } else {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.directory = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path && !this._parts.hostname) {\n return '';\n }\n\n if (this._parts.path === '/') {\n return '/';\n }\n\n var end = this._parts.path.length - this.filename().length - 1;\n var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n\n return v ? URI.decodePath(res) : res;\n\n } else {\n var e = this._parts.path.length - this.filename().length;\n var directory = this._parts.path.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(directory));\n\n // fully qualifier directories begin with a slash\n if (!this.is('relative')) {\n if (!v) {\n v = '/';\n }\n\n if (v.charAt(0) !== '/') {\n v = '/' + v;\n }\n }\n\n // directories always end with a slash\n if (v && v.charAt(v.length - 1) !== '/') {\n v += '/';\n }\n\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.filename = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var pos = this._parts.path.lastIndexOf('/');\n var res = this._parts.path.substring(pos+1);\n\n return v ? URI.decodePathSegment(res) : res;\n } else {\n var mutatedDirectory = false;\n\n if (v.charAt(0) === '/') {\n v = v.substring(1);\n }\n\n if (v.match(/\\.?\\//)) {\n mutatedDirectory = true;\n }\n\n var replace = new RegExp(escapeRegEx(this.filename()) + '$');\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n\n if (mutatedDirectory) {\n this.normalizePath(build);\n } else {\n this.build(!build);\n }\n\n return this;\n }\n };\n p.suffix = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var filename = this.filename();\n var pos = filename.lastIndexOf('.');\n var s, res;\n\n if (pos === -1) {\n return '';\n }\n\n // suffix may only contain alnum characters (yup, I made this up.)\n s = filename.substring(pos+1);\n res = (/^[a-z0-9%]+$/i).test(s) ? s : '';\n return v ? URI.decodePathSegment(res) : res;\n } else {\n if (v.charAt(0) === '.') {\n v = v.substring(1);\n }\n\n var suffix = this.suffix();\n var replace;\n\n if (!suffix) {\n if (!v) {\n return this;\n }\n\n this._parts.path += '.' + URI.recodePath(v);\n } else if (!v) {\n replace = new RegExp(escapeRegEx('.' + suffix) + '$');\n } else {\n replace = new RegExp(escapeRegEx(suffix) + '$');\n }\n\n if (replace) {\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.segment = function(segment, v, build) {\n var separator = this._parts.urn ? ':' : '/';\n var path = this.path();\n var absolute = path.substring(0, 1) === '/';\n var segments = path.split(separator);\n\n if (segment !== undefined && typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (segment !== undefined && typeof segment !== 'number') {\n throw new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n }\n\n if (absolute) {\n segments.shift();\n }\n\n if (segment < 0) {\n // allow negative indexes to address from the end\n segment = Math.max(segments.length + segment, 0);\n }\n\n if (v === undefined) {\n /*jshint laxbreak: true */\n return segment === undefined\n ? segments\n : segments[segment];\n /*jshint laxbreak: false */\n } else if (segment === null || segments[segment] === undefined) {\n if (isArray(v)) {\n segments = [];\n // collapse empty elements within array\n for (var i=0, l=v.length; i < l; i++) {\n if (!v[i].length && (!segments.length || !segments[segments.length -1].length)) {\n continue;\n }\n\n if (segments.length && !segments[segments.length -1].length) {\n segments.pop();\n }\n\n segments.push(trimSlashes(v[i]));\n }\n } else if (v || typeof v === 'string') {\n v = trimSlashes(v);\n if (segments[segments.length -1] === '') {\n // empty trailing elements have to be overwritten\n // to prevent results such as /foo//bar\n segments[segments.length -1] = v;\n } else {\n segments.push(v);\n }\n }\n } else {\n if (v) {\n segments[segment] = trimSlashes(v);\n } else {\n segments.splice(segment, 1);\n }\n }\n\n if (absolute) {\n segments.unshift('');\n }\n\n return this.path(segments.join(separator), build);\n };\n p.segmentCoded = function(segment, v, build) {\n var segments, i, l;\n\n if (typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (v === undefined) {\n segments = this.segment(segment, v, build);\n if (!isArray(segments)) {\n segments = segments !== undefined ? URI.decode(segments) : undefined;\n } else {\n for (i = 0, l = segments.length; i < l; i++) {\n segments[i] = URI.decode(segments[i]);\n }\n }\n\n return segments;\n }\n\n if (!isArray(v)) {\n v = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v;\n } else {\n for (i = 0, l = v.length; i < l; i++) {\n v[i] = URI.encode(v[i]);\n }\n }\n\n return this.segment(segment, v, build);\n };\n\n // mutating query string\n var q = p.query;\n p.query = function(v, build) {\n if (v === true) {\n return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n } else if (typeof v === 'function') {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n var result = v.call(this, data);\n this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else if (v !== undefined && typeof v !== 'string') {\n this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else {\n return q.call(this, v, build);\n }\n };\n p.setQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\n if (typeof name === 'string' || name instanceof String) {\n data[name] = value !== undefined ? value : null;\n } else if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n data[key] = name[key];\n }\n }\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.addQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.addQuery(data, name, value === undefined ? null : value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.removeQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.removeQuery(data, name, value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.hasQuery = function(name, value, withinArray) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n return URI.hasQuery(data, name, value, withinArray);\n };\n p.setSearch = p.setQuery;\n p.addSearch = p.addQuery;\n p.removeSearch = p.removeQuery;\n p.hasSearch = p.hasQuery;\n\n // sanitizing URLs\n p.normalize = function() {\n if (this._parts.urn) {\n return this\n .normalizeProtocol(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n }\n\n return this\n .normalizeProtocol(false)\n .normalizeHostname(false)\n .normalizePort(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n };\n p.normalizeProtocol = function(build) {\n if (typeof this._parts.protocol === 'string') {\n this._parts.protocol = this._parts.protocol.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeHostname = function(build) {\n if (this._parts.hostname) {\n if (this.is('IDN') && punycode) {\n this._parts.hostname = punycode.toASCII(this._parts.hostname);\n } else if (this.is('IPv6') && IPv6) {\n this._parts.hostname = IPv6.best(this._parts.hostname);\n }\n\n this._parts.hostname = this._parts.hostname.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePort = function(build) {\n // remove port of it's the protocol's default\n if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n this._parts.port = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePath = function(build) {\n var _path = this._parts.path;\n if (!_path) {\n return this;\n }\n\n if (this._parts.urn) {\n this._parts.path = URI.recodeUrnPath(this._parts.path);\n this.build(!build);\n return this;\n }\n\n if (this._parts.path === '/') {\n return this;\n }\n\n _path = URI.recodePath(_path);\n\n var _was_relative;\n var _leadingParents = '';\n var _parent, _pos;\n\n // handle relative paths\n if (_path.charAt(0) !== '/') {\n _was_relative = true;\n _path = '/' + _path;\n }\n\n // handle relative files (as opposed to directories)\n if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n _path += '/';\n }\n\n // resolve simples\n _path = _path\n .replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/')\n .replace(/\\/{2,}/g, '/');\n\n // remember leading parents\n if (_was_relative) {\n _leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n if (_leadingParents) {\n _leadingParents = _leadingParents[0];\n }\n }\n\n // resolve parents\n while (true) {\n _parent = _path.search(/\\/\\.\\.(\\/|$)/);\n if (_parent === -1) {\n // no more ../ to resolve\n break;\n } else if (_parent === 0) {\n // top level cannot be relative, skip it\n _path = _path.substring(3);\n continue;\n }\n\n _pos = _path.substring(0, _parent).lastIndexOf('/');\n if (_pos === -1) {\n _pos = _parent;\n }\n _path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n }\n\n // revert to relative\n if (_was_relative && this.is('relative')) {\n _path = _leadingParents + _path.substring(1);\n }\n\n this._parts.path = _path;\n this.build(!build);\n return this;\n };\n p.normalizePathname = p.normalizePath;\n p.normalizeQuery = function(build) {\n if (typeof this._parts.query === 'string') {\n if (!this._parts.query.length) {\n this._parts.query = null;\n } else {\n this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n }\n\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeFragment = function(build) {\n if (!this._parts.fragment) {\n this._parts.fragment = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeSearch = p.normalizeQuery;\n p.normalizeHash = p.normalizeFragment;\n\n p.iso8859 = function() {\n // expect unicode input, iso8859 output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = escape;\n URI.decode = decodeURIComponent;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.unicode = function() {\n // expect iso8859 input, unicode output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = strictEncodeURIComponent;\n URI.decode = unescape;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.readable = function() {\n var uri = this.clone();\n // removing username, password, because they shouldn't be displayed according to RFC 3986\n uri.username('').password('').normalize();\n var t = '';\n if (uri._parts.protocol) {\n t += uri._parts.protocol + '://';\n }\n\n if (uri._parts.hostname) {\n if (uri.is('punycode') && punycode) {\n t += punycode.toUnicode(uri._parts.hostname);\n if (uri._parts.port) {\n t += ':' + uri._parts.port;\n }\n } else {\n t += uri.host();\n }\n }\n\n if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n t += '/';\n }\n\n t += uri.path(true);\n if (uri._parts.query) {\n var q = '';\n for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n var kv = (qp[i] || '').split('=');\n q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n\n if (kv[1] !== undefined) {\n q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n }\n }\n t += '?' + q.substring(1);\n }\n\n t += URI.decodeQuery(uri.hash(), true);\n return t;\n };\n\n // resolving relative and absolute URLs\n p.absoluteTo = function(base) {\n var resolved = this.clone();\n var properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n var basedir, i, p;\n\n if (this._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n if (!(base instanceof URI)) {\n base = new URI(base);\n }\n\n if (!resolved._parts.protocol) {\n resolved._parts.protocol = base._parts.protocol;\n }\n\n if (this._parts.hostname) {\n return resolved;\n }\n\n for (i = 0; (p = properties[i]); i++) {\n resolved._parts[p] = base._parts[p];\n }\n\n if (!resolved._parts.path) {\n resolved._parts.path = base._parts.path;\n if (!resolved._parts.query) {\n resolved._parts.query = base._parts.query;\n }\n } else if (resolved._parts.path.substring(-2) === '..') {\n resolved._parts.path += '/';\n }\n\n if (resolved.path().charAt(0) !== '/') {\n basedir = base.directory();\n basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n resolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path;\n resolved.normalizePath();\n }\n\n resolved.build();\n return resolved;\n };\n p.relativeTo = function(base) {\n var relative = this.clone().normalize();\n var relativeParts, baseParts, common, relativePath, basePath;\n\n if (relative._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n base = new URI(base).normalize();\n relativeParts = relative._parts;\n baseParts = base._parts;\n relativePath = relative.path();\n basePath = base.path();\n\n if (relativePath.charAt(0) !== '/') {\n throw new Error('URI is already relative');\n }\n\n if (basePath.charAt(0) !== '/') {\n throw new Error('Cannot calculate a URI relative to another relative URI');\n }\n\n if (relativeParts.protocol === baseParts.protocol) {\n relativeParts.protocol = null;\n }\n\n if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n return relative.build();\n }\n\n if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n return relative.build();\n }\n\n if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n relativeParts.hostname = null;\n relativeParts.port = null;\n } else {\n return relative.build();\n }\n\n if (relativePath === basePath) {\n relativeParts.path = '';\n return relative.build();\n }\n\n // determine common sub path\n common = URI.commonPath(relativePath, basePath);\n\n // If the paths have nothing in common, return a relative URL with the absolute path.\n if (!common) {\n return relative.build();\n }\n\n var parents = baseParts.path\n .substring(common.length)\n .replace(/[^\\/]*$/, '')\n .replace(/.*?\\//g, '../');\n\n relativeParts.path = (parents + relativeParts.path.substring(common.length)) || './';\n\n return relative.build();\n };\n\n // comparing URIs\n p.equals = function(uri) {\n var one = this.clone();\n var two = new URI(uri);\n var one_map = {};\n var two_map = {};\n var checked = {};\n var one_query, two_query, key;\n\n one.normalize();\n two.normalize();\n\n // exact match\n if (one.toString() === two.toString()) {\n return true;\n }\n\n // extract query string\n one_query = one.query();\n two_query = two.query();\n one.query('');\n two.query('');\n\n // definitely not equal if not even non-query parts match\n if (one.toString() !== two.toString()) {\n return false;\n }\n\n // query parameters have the same length, even if they're permuted\n if (one_query.length !== two_query.length) {\n return false;\n }\n\n one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n\n for (key in one_map) {\n if (hasOwn.call(one_map, key)) {\n if (!isArray(one_map[key])) {\n if (one_map[key] !== two_map[key]) {\n return false;\n }\n } else if (!arraysEqual(one_map[key], two_map[key])) {\n return false;\n }\n\n checked[key] = true;\n }\n }\n\n for (key in two_map) {\n if (hasOwn.call(two_map, key)) {\n if (!checked[key]) {\n // two contains a parameter not present in one\n return false;\n }\n }\n }\n\n return true;\n };\n\n // state\n p.duplicateQueryParameters = function(v) {\n this._parts.duplicateQueryParameters = !!v;\n return this;\n };\n\n p.escapeQuerySpace = function(v) {\n this._parts.escapeQuerySpace = !!v;\n return this;\n };\n\n return URI;\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/urijs/src/URI.js\n ** module id = 6\n ** module chunks = 0\n **/","/*! https://mths.be/punycode v1.4.0 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see \n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's state to ,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.3.2',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see \n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/urijs/src/punycode.js\n ** module id = 7\n ** module chunks = 0\n **/","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tmodule.children = [];\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/buildin/module.js\n ** module id = 8\n ** module chunks = 0\n **/","/*!\n * URI.js - Mutating URLs\n * IPv6 Support\n *\n * Version: 1.18.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n\n(function (root, factory) {\n 'use strict';\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n if (typeof exports === 'object') {\n // Node\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory);\n } else {\n // Browser globals (root is window)\n root.IPv6 = factory(root);\n }\n}(this, function (root) {\n 'use strict';\n\n /*\n var _in = \"fe80:0000:0000:0000:0204:61ff:fe9d:f156\";\n var _out = IPv6.best(_in);\n var _expected = \"fe80::204:61ff:fe9d:f156\";\n\n console.log(_in, _out, _expected, _out === _expected);\n */\n\n // save current IPv6 variable, if any\n var _IPv6 = root && root.IPv6;\n\n function bestPresentation(address) {\n // based on:\n // Javascript to test an IPv6 address for proper format, and to\n // present the \"best text representation\" according to IETF Draft RFC at\n // http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04\n // 8 Feb 2010 Rich Brown, Dartware, LLC\n // Please feel free to use this code as long as you provide a link to\n // http://www.intermapper.com\n // http://intermapper.com/support/tools/IPV6-Validator.aspx\n // http://download.dartware.com/thirdparty/ipv6validator.js\n\n var _address = address.toLowerCase();\n var segments = _address.split(':');\n var length = segments.length;\n var total = 8;\n\n // trim colons (:: or ::a:b:c… or …a:b:c::)\n if (segments[0] === '' && segments[1] === '' && segments[2] === '') {\n // must have been ::\n // remove first two items\n segments.shift();\n segments.shift();\n } else if (segments[0] === '' && segments[1] === '') {\n // must have been ::xxxx\n // remove the first item\n segments.shift();\n } else if (segments[length - 1] === '' && segments[length - 2] === '') {\n // must have been xxxx::\n segments.pop();\n }\n\n length = segments.length;\n\n // adjust total segments for IPv4 trailer\n if (segments[length - 1].indexOf('.') !== -1) {\n // found a \".\" which means IPv4\n total = 7;\n }\n\n // fill empty segments them with \"0000\"\n var pos;\n for (pos = 0; pos < length; pos++) {\n if (segments[pos] === '') {\n break;\n }\n }\n\n if (pos < total) {\n segments.splice(pos, 1, '0000');\n while (segments.length < total) {\n segments.splice(pos, 0, '0000');\n }\n }\n\n // strip leading zeros\n var _segments;\n for (var i = 0; i < total; i++) {\n _segments = segments[i].split('');\n for (var j = 0; j < 3 ; j++) {\n if (_segments[0] === '0' && _segments.length > 1) {\n _segments.splice(0,1);\n } else {\n break;\n }\n }\n\n segments[i] = _segments.join('');\n }\n\n // find longest sequence of zeroes and coalesce them into one segment\n var best = -1;\n var _best = 0;\n var _current = 0;\n var current = -1;\n var inzeroes = false;\n // i; already declared\n\n for (i = 0; i < total; i++) {\n if (inzeroes) {\n if (segments[i] === '0') {\n _current += 1;\n } else {\n inzeroes = false;\n if (_current > _best) {\n best = current;\n _best = _current;\n }\n }\n } else {\n if (segments[i] === '0') {\n inzeroes = true;\n current = i;\n _current = 1;\n }\n }\n }\n\n if (_current > _best) {\n best = current;\n _best = _current;\n }\n\n if (_best > 1) {\n segments.splice(best, _best, '');\n }\n\n length = segments.length;\n\n // assemble remaining segments\n var result = '';\n if (segments[0] === '') {\n result = ':';\n }\n\n for (i = 0; i < length; i++) {\n result += segments[i];\n if (i === length - 1) {\n break;\n }\n\n result += ':';\n }\n\n if (segments[length - 1] === '') {\n result += ':';\n }\n\n return result;\n }\n\n function noConflict() {\n /*jshint validthis: true */\n if (root.IPv6 === this) {\n root.IPv6 = _IPv6;\n }\n \n return this;\n }\n\n return {\n best: bestPresentation,\n noConflict: noConflict\n };\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/urijs/src/IPv6.js\n ** module id = 9\n ** module chunks = 0\n **/","/*!\n * URI.js - Mutating URLs\n * Second Level Domain (SLD) Support\n *\n * Version: 1.18.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n\n(function (root, factory) {\n 'use strict';\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n if (typeof exports === 'object') {\n // Node\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory);\n } else {\n // Browser globals (root is window)\n root.SecondLevelDomains = factory(root);\n }\n}(this, function (root) {\n 'use strict';\n\n // save current SecondLevelDomains variable, if any\n var _SecondLevelDomains = root && root.SecondLevelDomains;\n\n var SLD = {\n // list of known Second Level Domains\n // converted list of SLDs from https://github.com/gavingmiller/second-level-domains\n // ----\n // publicsuffix.org is more current and actually used by a couple of browsers internally.\n // downside is it also contains domains like \"dyndns.org\" - which is fine for the security\n // issues browser have to deal with (SOP for cookies, etc) - but is way overboard for URI.js\n // ----\n list: {\n 'ac':' com gov mil net org ',\n 'ae':' ac co gov mil name net org pro sch ',\n 'af':' com edu gov net org ',\n 'al':' com edu gov mil net org ',\n 'ao':' co ed gv it og pb ',\n 'ar':' com edu gob gov int mil net org tur ',\n 'at':' ac co gv or ',\n 'au':' asn com csiro edu gov id net org ',\n 'ba':' co com edu gov mil net org rs unbi unmo unsa untz unze ',\n 'bb':' biz co com edu gov info net org store tv ',\n 'bh':' biz cc com edu gov info net org ',\n 'bn':' com edu gov net org ',\n 'bo':' com edu gob gov int mil net org tv ',\n 'br':' adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ',\n 'bs':' com edu gov net org ',\n 'bz':' du et om ov rg ',\n 'ca':' ab bc mb nb nf nl ns nt nu on pe qc sk yk ',\n 'ck':' biz co edu gen gov info net org ',\n 'cn':' ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ',\n 'co':' com edu gov mil net nom org ',\n 'cr':' ac c co ed fi go or sa ',\n 'cy':' ac biz com ekloges gov ltd name net org parliament press pro tm ',\n 'do':' art com edu gob gov mil net org sld web ',\n 'dz':' art asso com edu gov net org pol ',\n 'ec':' com edu fin gov info med mil net org pro ',\n 'eg':' com edu eun gov mil name net org sci ',\n 'er':' com edu gov ind mil net org rochest w ',\n 'es':' com edu gob nom org ',\n 'et':' biz com edu gov info name net org ',\n 'fj':' ac biz com info mil name net org pro ',\n 'fk':' ac co gov net nom org ',\n 'fr':' asso com f gouv nom prd presse tm ',\n 'gg':' co net org ',\n 'gh':' com edu gov mil org ',\n 'gn':' ac com gov net org ',\n 'gr':' com edu gov mil net org ',\n 'gt':' com edu gob ind mil net org ',\n 'gu':' com edu gov net org ',\n 'hk':' com edu gov idv net org ',\n 'hu':' 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ',\n 'id':' ac co go mil net or sch web ',\n 'il':' ac co gov idf k12 muni net org ',\n 'in':' ac co edu ernet firm gen gov i ind mil net nic org res ',\n 'iq':' com edu gov i mil net org ',\n 'ir':' ac co dnssec gov i id net org sch ',\n 'it':' edu gov ',\n 'je':' co net org ',\n 'jo':' com edu gov mil name net org sch ',\n 'jp':' ac ad co ed go gr lg ne or ',\n 'ke':' ac co go info me mobi ne or sc ',\n 'kh':' com edu gov mil net org per ',\n 'ki':' biz com de edu gov info mob net org tel ',\n 'km':' asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ',\n 'kn':' edu gov net org ',\n 'kr':' ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ',\n 'kw':' com edu gov net org ',\n 'ky':' com edu gov net org ',\n 'kz':' com edu gov mil net org ',\n 'lb':' com edu gov net org ',\n 'lk':' assn com edu gov grp hotel int ltd net ngo org sch soc web ',\n 'lr':' com edu gov net org ',\n 'lv':' asn com conf edu gov id mil net org ',\n 'ly':' com edu gov id med net org plc sch ',\n 'ma':' ac co gov m net org press ',\n 'mc':' asso tm ',\n 'me':' ac co edu gov its net org priv ',\n 'mg':' com edu gov mil nom org prd tm ',\n 'mk':' com edu gov inf name net org pro ',\n 'ml':' com edu gov net org presse ',\n 'mn':' edu gov org ',\n 'mo':' com edu gov net org ',\n 'mt':' com edu gov net org ',\n 'mv':' aero biz com coop edu gov info int mil museum name net org pro ',\n 'mw':' ac co com coop edu gov int museum net org ',\n 'mx':' com edu gob net org ',\n 'my':' com edu gov mil name net org sch ',\n 'nf':' arts com firm info net other per rec store web ',\n 'ng':' biz com edu gov mil mobi name net org sch ',\n 'ni':' ac co com edu gob mil net nom org ',\n 'np':' com edu gov mil net org ',\n 'nr':' biz com edu gov info net org ',\n 'om':' ac biz co com edu gov med mil museum net org pro sch ',\n 'pe':' com edu gob mil net nom org sld ',\n 'ph':' com edu gov i mil net ngo org ',\n 'pk':' biz com edu fam gob gok gon gop gos gov net org web ',\n 'pl':' art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ',\n 'pr':' ac biz com edu est gov info isla name net org pro prof ',\n 'ps':' com edu gov net org plo sec ',\n 'pw':' belau co ed go ne or ',\n 'ro':' arts com firm info nom nt org rec store tm www ',\n 'rs':' ac co edu gov in org ',\n 'sb':' com edu gov net org ',\n 'sc':' com edu gov net org ',\n 'sh':' co com edu gov net nom org ',\n 'sl':' com edu gov net org ',\n 'st':' co com consulado edu embaixada gov mil net org principe saotome store ',\n 'sv':' com edu gob org red ',\n 'sz':' ac co org ',\n 'tr':' av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ',\n 'tt':' aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ',\n 'tw':' club com ebiz edu game gov idv mil net org ',\n 'mu':' ac co com gov net or org ',\n 'mz':' ac co edu gov org ',\n 'na':' co com ',\n 'nz':' ac co cri geek gen govt health iwi maori mil net org parliament school ',\n 'pa':' abo ac com edu gob ing med net nom org sld ',\n 'pt':' com edu gov int net nome org publ ',\n 'py':' com edu gov mil net org ',\n 'qa':' com edu gov mil net org ',\n 're':' asso com nom ',\n 'ru':' ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ',\n 'rw':' ac co com edu gouv gov int mil net ',\n 'sa':' com edu gov med net org pub sch ',\n 'sd':' com edu gov info med net org tv ',\n 'se':' a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ',\n 'sg':' com edu gov idn net org per ',\n 'sn':' art com edu gouv org perso univ ',\n 'sy':' com edu gov mil net news org ',\n 'th':' ac co go in mi net or ',\n 'tj':' ac biz co com edu go gov info int mil name net nic org test web ',\n 'tn':' agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ',\n 'tz':' ac co go ne or ',\n 'ua':' biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ',\n 'ug':' ac co go ne or org sc ',\n 'uk':' ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ',\n 'us':' dni fed isa kids nsn ',\n 'uy':' com edu gub mil net org ',\n 've':' co com edu gob info mil net org web ',\n 'vi':' co com k12 net org ',\n 'vn':' ac biz com edu gov health info int name net org pro ',\n 'ye':' co com gov ltd me net org plc ',\n 'yu':' ac co edu gov org ',\n 'za':' ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ',\n 'zm':' ac co com edu gov net org sch '\n },\n // gorhill 2013-10-25: Using indexOf() instead Regexp(). Significant boost\n // in both performance and memory footprint. No initialization required.\n // http://jsperf.com/uri-js-sld-regex-vs-binary-search/4\n // Following methods use lastIndexOf() rather than array.split() in order\n // to avoid any memory allocations.\n has: function(domain) {\n var tldOffset = domain.lastIndexOf('.');\n if (tldOffset <= 0 || tldOffset >= (domain.length-1)) {\n return false;\n }\n var sldOffset = domain.lastIndexOf('.', tldOffset-1);\n if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) {\n return false;\n }\n var sldList = SLD.list[domain.slice(tldOffset+1)];\n if (!sldList) {\n return false;\n }\n return sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') >= 0;\n },\n is: function(domain) {\n var tldOffset = domain.lastIndexOf('.');\n if (tldOffset <= 0 || tldOffset >= (domain.length-1)) {\n return false;\n }\n var sldOffset = domain.lastIndexOf('.', tldOffset-1);\n if (sldOffset >= 0) {\n return false;\n }\n var sldList = SLD.list[domain.slice(tldOffset+1)];\n if (!sldList) {\n return false;\n }\n return sldList.indexOf(' ' + domain.slice(0, tldOffset) + ' ') >= 0;\n },\n get: function(domain) {\n var tldOffset = domain.lastIndexOf('.');\n if (tldOffset <= 0 || tldOffset >= (domain.length-1)) {\n return null;\n }\n var sldOffset = domain.lastIndexOf('.', tldOffset-1);\n if (sldOffset <= 0 || sldOffset >= (tldOffset-1)) {\n return null;\n }\n var sldList = SLD.list[domain.slice(tldOffset+1)];\n if (!sldList) {\n return null;\n }\n if (sldList.indexOf(' ' + domain.slice(sldOffset+1, tldOffset) + ' ') < 0) {\n return null;\n }\n return domain.slice(sldOffset+1);\n },\n noConflict: function(){\n if (root.SecondLevelDomains === this) {\n root.SecondLevelDomains = _SecondLevelDomains;\n }\n return this;\n }\n };\n\n return SLD;\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/urijs/src/SecondLevelDomains.js\n ** module id = 10\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar base64 = require('base64-js');\n\nvar requestAnimationFrame = (typeof window != 'undefined') ? (window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame) : false;\n/*\n//-- Parse the different parts of a url, returning a object\nfunction uri(url){\n\tvar uri = {\n\t\t\t\tprotocol : '',\n\t\t\t\thost : '',\n\t\t\t\tpath : '',\n\t\t\t\torigin : '',\n\t\t\t\tdirectory : '',\n\t\t\t\tbase : '',\n\t\t\t\tfilename : '',\n\t\t\t\textension : '',\n\t\t\t\tfragment : '',\n\t\t\t\thref : url\n\t\t\t},\n\t\t\tdoubleSlash = url.indexOf('://'),\n\t\t\tsearch = url.indexOf('?'),\n\t\t\tfragment = url.indexOf(\"#\"),\n\t\t\twithoutProtocol,\n\t\t\tdot,\n\t\t\tfirstSlash;\n\n\tif(fragment != -1) {\n\t\turi.fragment = url.slice(fragment + 1);\n\t\turl = url.slice(0, fragment);\n\t}\n\n\tif(search != -1) {\n\t\turi.search = url.slice(search + 1);\n\t\turl = url.slice(0, search);\n\t\thref = url;\n\t}\n\n\tif(doubleSlash != -1) {\n\t\turi.protocol = url.slice(0, doubleSlash);\n\t\twithoutProtocol = url.slice(doubleSlash+3);\n\t\tfirstSlash = withoutProtocol.indexOf('/');\n\n\t\tif(firstSlash === -1) {\n\t\t\turi.host = uri.path;\n\t\t\turi.path = \"\";\n\t\t} else {\n\t\t\turi.host = withoutProtocol.slice(0, firstSlash);\n\t\t\turi.path = withoutProtocol.slice(firstSlash);\n\t\t}\n\n\n\t\turi.origin = uri.protocol + \"://\" + uri.host;\n\n\t\turi.directory = folder(uri.path);\n\n\t\turi.base = uri.origin + uri.directory;\n\t\t// return origin;\n\t} else {\n\t\turi.path = url;\n\t\turi.directory = folder(url);\n\t\turi.base = uri.directory;\n\t}\n\n\t//-- Filename\n\turi.filename = url.replace(uri.base, '');\n\tdot = uri.filename.lastIndexOf('.');\n\tif(dot != -1) {\n\t\turi.extension = uri.filename.slice(dot+1);\n\t}\n\treturn uri;\n};\n\n//-- Parse out the folder, will return everything before the last slash\nfunction folder(url){\n\n\tvar lastSlash = url.lastIndexOf('/');\n\n\tif(lastSlash == -1) var folder = '';\n\n\tfolder = url.slice(0, lastSlash + 1);\n\n\treturn folder;\n\n};\n*/\nfunction isElement(obj) {\n\t\treturn !!(obj && obj.nodeType == 1);\n};\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript\nfunction uuid() {\n\tvar d = new Date().getTime();\n\tvar uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n\t\t\tvar r = (d + Math.random()*16)%16 | 0;\n\t\t\td = Math.floor(d/16);\n\t\t\treturn (c=='x' ? r : (r&0x7|0x8)).toString(16);\n\t});\n\treturn uuid;\n};\n\n// From Lodash\nfunction values(object) {\n\tvar index = -1,\n\t\t\tprops = Object.keys(object),\n\t\t\tlength = props.length,\n\t\t\tresult = Array(length);\n\n\twhile (++index < length) {\n\t\tresult[index] = object[props[index]];\n\t}\n\treturn result;\n};\n\nfunction resolveUrl(base, path) {\n\tvar url = [],\n\t\tsegments = [],\n\t\tbaseUri = uri(base),\n\t\tpathUri = uri(path),\n\t\tbaseDirectory = baseUri.directory,\n\t\tpathDirectory = pathUri.directory,\n\t\tdirectories = [],\n\t\t// folders = base.split(\"/\"),\n\t\tpaths;\n\n\t// if(uri.host) {\n\t// return path;\n\t// }\n\n\tif(baseDirectory[0] === \"/\") {\n\t\tbaseDirectory = baseDirectory.substring(1);\n\t}\n\n\tif(pathDirectory[pathDirectory.length-1] === \"/\") {\n\t\tbaseDirectory = baseDirectory.substring(0, baseDirectory.length-1);\n\t}\n\n\tif(pathDirectory[0] === \"/\") {\n\t\tpathDirectory = pathDirectory.substring(1);\n\t}\n\n\tif(pathDirectory[pathDirectory.length-1] === \"/\") {\n\t\tpathDirectory = pathDirectory.substring(0, pathDirectory.length-1);\n\t}\n\n\tif(baseDirectory) {\n\t\tdirectories = baseDirectory.split(\"/\");\n\t}\n\n\tpaths = pathDirectory.split(\"/\");\n\n\tpaths.reverse().forEach(function(part, index){\n\t\tif(part === \"..\"){\n\t\t\tdirectories.pop();\n\t\t} else if(part === directories[directories.length-1]) {\n\t\t\tdirectories.pop();\n\t\t\tsegments.unshift(part);\n\t\t} else {\n\t\t\tsegments.unshift(part);\n\t\t}\n\t});\n\n\turl = [baseUri.origin];\n\n\tif(directories.length) {\n\t\turl = url.concat(directories);\n\t}\n\n\tif(segments) {\n\t\turl = url.concat(segments);\n\t}\n\n\turl = url.concat(pathUri.filename);\n\n\treturn url.join(\"/\");\n};\n\nfunction documentHeight() {\n\treturn Math.max(\n\t\t\tdocument.documentElement.clientHeight,\n\t\t\tdocument.body.scrollHeight,\n\t\t\tdocument.documentElement.scrollHeight,\n\t\t\tdocument.body.offsetHeight,\n\t\t\tdocument.documentElement.offsetHeight\n\t);\n};\n\nfunction isNumber(n) {\n\treturn !isNaN(parseFloat(n)) && isFinite(n);\n};\n\nfunction prefixed(unprefixed) {\n\tvar vendors = [\"Webkit\", \"Moz\", \"O\", \"ms\" ],\n\t\tprefixes = ['-Webkit-', '-moz-', '-o-', '-ms-'],\n\t\tupper = unprefixed[0].toUpperCase() + unprefixed.slice(1),\n\t\tlength = vendors.length;\n\n\tif (typeof(document) === 'undefined' || typeof(document.body.style[unprefixed]) != 'undefined') {\n\t\treturn unprefixed;\n\t}\n\n\tfor ( var i=0; i < length; i++ ) {\n\t\tif (typeof(document.body.style[vendors[i] + upper]) != 'undefined') {\n\t\t\treturn vendors[i] + upper;\n\t\t}\n\t}\n\n\treturn unprefixed;\n};\n\nfunction defaults(obj) {\n\tfor (var i = 1, length = arguments.length; i < length; i++) {\n\t\tvar source = arguments[i];\n\t\tfor (var prop in source) {\n\t\t\tif (obj[prop] === void 0) obj[prop] = source[prop];\n\t\t}\n\t}\n\treturn obj;\n};\n\nfunction extend(target) {\n\t\tvar sources = [].slice.call(arguments, 1);\n\t\tsources.forEach(function (source) {\n\t\t\tif(!source) return;\n\t\t\tObject.getOwnPropertyNames(source).forEach(function(propName) {\n\t\t\t\tObject.defineProperty(target, propName, Object.getOwnPropertyDescriptor(source, propName));\n\t\t\t});\n\t\t});\n\t\treturn target;\n};\n\n// Fast quicksort insert for sorted array -- based on:\n// http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers\nfunction insert(item, array, compareFunction) {\n\tvar location = locationOf(item, array, compareFunction);\n\tarray.splice(location, 0, item);\n\n\treturn location;\n};\n// Returns where something would fit in\nfunction locationOf(item, array, compareFunction, _start, _end) {\n\tvar start = _start || 0;\n\tvar end = _end || array.length;\n\tvar pivot = parseInt(start + (end - start) / 2);\n\tvar compared;\n\tif(!compareFunction){\n\t\tcompareFunction = function(a, b) {\n\t\t\tif(a > b) return 1;\n\t\t\tif(a < b) return -1;\n\t\t\tif(a = b) return 0;\n\t\t};\n\t}\n\tif(end-start <= 0) {\n\t\treturn pivot;\n\t}\n\n\tcompared = compareFunction(array[pivot], item);\n\tif(end-start === 1) {\n\t\treturn compared > 0 ? pivot : pivot + 1;\n\t}\n\n\tif(compared === 0) {\n\t\treturn pivot;\n\t}\n\tif(compared === -1) {\n\t\treturn locationOf(item, array, compareFunction, pivot, end);\n\t} else{\n\t\treturn locationOf(item, array, compareFunction, start, pivot);\n\t}\n};\n// Returns -1 of mpt found\nfunction indexOfSorted(item, array, compareFunction, _start, _end) {\n\tvar start = _start || 0;\n\tvar end = _end || array.length;\n\tvar pivot = parseInt(start + (end - start) / 2);\n\tvar compared;\n\tif(!compareFunction){\n\t\tcompareFunction = function(a, b) {\n\t\t\tif(a > b) return 1;\n\t\t\tif(a < b) return -1;\n\t\t\tif(a = b) return 0;\n\t\t};\n\t}\n\tif(end-start <= 0) {\n\t\treturn -1; // Not found\n\t}\n\n\tcompared = compareFunction(array[pivot], item);\n\tif(end-start === 1) {\n\t\treturn compared === 0 ? pivot : -1;\n\t}\n\tif(compared === 0) {\n\t\treturn pivot; // Found\n\t}\n\tif(compared === -1) {\n\t\treturn indexOfSorted(item, array, compareFunction, pivot, end);\n\t} else{\n\t\treturn indexOfSorted(item, array, compareFunction, start, pivot);\n\t}\n};\n\nfunction bounds(el) {\n\n\tvar style = window.getComputedStyle(el);\n\tvar widthProps = [\"width\", \"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n\tvar heightProps = [\"height\", \"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n\tvar width = 0;\n\tvar height = 0;\n\n\twidthProps.forEach(function(prop){\n\t\twidth += parseFloat(style[prop]) || 0;\n\t});\n\n\theightProps.forEach(function(prop){\n\t\theight += parseFloat(style[prop]) || 0;\n\t});\n\n\treturn {\n\t\theight: height,\n\t\twidth: width\n\t};\n\n};\n\nfunction borders(el) {\n\n\tvar style = window.getComputedStyle(el);\n\tvar widthProps = [\"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n\tvar heightProps = [\"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n\tvar width = 0;\n\tvar height = 0;\n\n\twidthProps.forEach(function(prop){\n\t\twidth += parseFloat(style[prop]) || 0;\n\t});\n\n\theightProps.forEach(function(prop){\n\t\theight += parseFloat(style[prop]) || 0;\n\t});\n\n\treturn {\n\t\theight: height,\n\t\twidth: width\n\t};\n\n};\n\nfunction windowBounds() {\n\n\tvar width = window.innerWidth;\n\tvar height = window.innerHeight;\n\n\treturn {\n\t\ttop: 0,\n\t\tleft: 0,\n\t\tright: width,\n\t\tbottom: height,\n\t\twidth: width,\n\t\theight: height\n\t};\n\n};\n\n//https://stackoverflow.com/questions/13482352/xquery-looking-for-text-with-single-quote/13483496#13483496\nfunction cleanStringForXpath(str) {\n\t\tvar parts = str.match(/[^'\"]+|['\"]/g);\n\t\tparts = parts.map(function(part){\n\t\t\t\tif (part === \"'\") {\n\t\t\t\t\t\treturn '\\\"\\'\\\"'; // output \"'\"\n\t\t\t\t}\n\n\t\t\t\tif (part === '\"') {\n\t\t\t\t\t\treturn \"\\'\\\"\\'\"; // output '\"'\n\t\t\t\t}\n\t\t\t\treturn \"\\'\" + part + \"\\'\";\n\t\t});\n\t\treturn \"concat(\\'\\',\" + parts.join(\",\") + \")\";\n};\n\nfunction indexOfTextNode(textNode){\n\tvar parent = textNode.parentNode;\n\tvar children = parent.childNodes;\n\tvar sib;\n\tvar index = -1;\n\tfor (var i = 0; i < children.length; i++) {\n\t\tsib = children[i];\n\t\tif(sib.nodeType === Node.TEXT_NODE){\n\t\t\tindex++;\n\t\t}\n\t\tif(sib == textNode) break;\n\t}\n\n\treturn index;\n};\n\nfunction isXml(ext) {\n\treturn ['xml', 'opf', 'ncx'].indexOf(ext) > -1;\n}\n\nfunction createBlob(content, mime){\n\tvar blob = new Blob([content], {type : mime });\n\n\treturn blob;\n};\n\nfunction createBlobUrl(content, mime){\n\tvar _URL = window.URL || window.webkitURL || window.mozURL;\n\tvar tempUrl;\n\tvar blob = this.createBlob(content, mime);\n\n\ttempUrl = _URL.createObjectURL(blob);\n\n\treturn tempUrl;\n};\n\nfunction createBase64Url(content, mime){\n\tvar string;\n\tvar data;\n\tvar datauri;\n\n\tif (typeof(content) !== \"string\") {\n\t\t// Only handles strings\n\t\treturn;\n\t}\n\n\tdata = btoa(content);\n\n\tdatauri = \"data:\" + mime + \";base64,\" + data;\n\n\treturn datauri;\n};\n\nfunction type(obj){\n\treturn Object.prototype.toString.call(obj).slice(8, -1);\n}\n\nfunction parse(markup, mime) {\n\tvar doc;\n\t// console.log(\"parse\", markup);\n\n\tif (typeof DOMParser === \"undefined\") {\n\t\tDOMParser = require('xmldom').DOMParser;\n\t}\n\n\n\tdoc = new DOMParser().parseFromString(markup, mime);\n\n\treturn doc;\n}\n\nfunction qs(el, sel) {\n\tvar elements;\n\n\tif (typeof el.querySelector != \"undefined\") {\n\t\treturn el.querySelector(sel);\n\t} else {\n\t\telements = el.getElementsByTagName(sel);\n\t\tif (elements.length) {\n\t\t\treturn elements[0];\n\t\t}\n\t}\n}\n\nfunction qsa(el, sel) {\n\n\tif (typeof el.querySelector != \"undefined\") {\n\t\treturn el.querySelectorAll(sel);\n\t} else {\n\t\treturn el.getElementsByTagName(sel);\n\t}\n}\n\nfunction qsp(el, sel, props) {\n\tvar q, filtered;\n\tif (typeof el.querySelector != \"undefined\") {\n\t\tsel += '[';\n\t\tfor (var prop in props) {\n\t\t\tsel += prop + \"='\" + props[prop] + \"'\";\n\t\t}\n\t\tsel += ']';\n\t\treturn el.querySelector(sel);\n\t} else {\n\t\tq = el.getElementsByTagName(sel);\n\t\tfiltered = Array.prototype.slice.call(q, 0).filter(function(el) {\n\t\t\tfor (var prop in props) {\n\t\t\t\tif(el.getAttribute(prop) === props[prop]){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (filtered) {\n\t\t\treturn filtered[0];\n\t\t}\n\t}\n}\n\nfunction blob2base64(blob, cb) {\n\tvar reader = new FileReader();\n\treader.readAsDataURL(blob);\n\treader.onloadend = function() {\n\t\tcb(reader.result);\n\t}\n}\n\nmodule.exports = {\n\t// 'uri': uri,\n\t// 'folder': folder,\n\t'isElement': isElement,\n\t'uuid': uuid,\n\t'values': values,\n\t'resolveUrl': resolveUrl,\n\t'indexOfSorted': indexOfSorted,\n\t'documentHeight': documentHeight,\n\t'isNumber': isNumber,\n\t'prefixed': prefixed,\n\t'defaults': defaults,\n\t'extend': extend,\n\t'insert': insert,\n\t'locationOf': locationOf,\n\t'indexOfSorted': indexOfSorted,\n\t'requestAnimationFrame': requestAnimationFrame,\n\t'bounds': bounds,\n\t'borders': borders,\n\t'windowBounds': windowBounds,\n\t'cleanStringForXpath': cleanStringForXpath,\n\t'indexOfTextNode': indexOfTextNode,\n\t'isXml': isXml,\n\t'createBlob': createBlob,\n\t'createBlobUrl': createBlobUrl,\n\t'type': type,\n\t'parse' : parse,\n\t'qs' : qs,\n\t'qsa' : qsa,\n\t'qsp' : qsp,\n\t'blob2base64' : blob2base64,\n\t'createBase64Url': createBase64Url\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/core.js\n ** module id = 11\n ** module chunks = 0\n **/","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction placeHoldersCount (b64) {\n var len = b64.length\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // the number of equal signs (place holders)\n // if there are two placeholders, than the two characters before it\n // represent one byte\n // if there is only one, then the three characters before it represent 2 bytes\n // this is just a cheap hack to not do indexOf twice\n return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0\n}\n\nfunction byteLength (b64) {\n // base64 is 4/3 + up to two characters of the original data\n return b64.length * 3 / 4 - placeHoldersCount(b64)\n}\n\nfunction toByteArray (b64) {\n var i, j, l, tmp, placeHolders, arr\n var len = b64.length\n placeHolders = placeHoldersCount(b64)\n\n arr = new Arr(len * 3 / 4 - placeHolders)\n\n // if there are placeholders, only get up to the last complete 4 chars\n l = placeHolders > 0 ? len - 4 : len\n\n var L = 0\n\n for (i = 0, j = 0; i < l; i += 4, j += 3) {\n tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]\n arr[L++] = (tmp >> 16) & 0xFF\n arr[L++] = (tmp >> 8) & 0xFF\n arr[L++] = tmp & 0xFF\n }\n\n if (placeHolders === 2) {\n tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[L++] = tmp & 0xFF\n } else if (placeHolders === 1) {\n tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[L++] = (tmp >> 8) & 0xFF\n arr[L++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var output = ''\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n output += lookup[tmp >> 2]\n output += lookup[(tmp << 4) & 0x3F]\n output += '=='\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + (uint8[len - 1])\n output += lookup[tmp >> 10]\n output += lookup[(tmp >> 4) & 0x3F]\n output += lookup[(tmp << 2) & 0x3F]\n output += '='\n }\n\n parts.push(output)\n\n return parts.join('')\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/base64-js/index.js\n ** module id = 12\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_13__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"xmldom\"\n ** module id = 13\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Hook = require('./hook');\nvar Section = require('./section');\nvar replacements = require('./replacements');\n\nfunction Spine(_request){\n\tthis.request = _request;\n\tthis.spineItems = [];\n\tthis.spineByHref = {};\n\tthis.spineById = {};\n\n\tthis.hooks = {};\n\tthis.hooks.serialize = new Hook();\n\tthis.hooks.content = new Hook();\n\n\t// Register replacements\n\tthis.hooks.content.register(replacements.base);\n\tthis.hooks.content.register(replacements.canonical);\n\n\tthis.epubcfi = new EpubCFI();\n\n\tthis.loaded = false;\n};\n\nSpine.prototype.load = function(_package) {\n\n\tthis.items = _package.spine;\n\tthis.manifest = _package.manifest;\n\tthis.spineNodeIndex = _package.spineNodeIndex;\n\tthis.baseUrl = _package.baseUrl || '';\n\tthis.length = this.items.length;\n\n\tthis.items.forEach(function(item, index){\n\t\tvar href, url;\n\t\tvar manifestItem = this.manifest[item.idref];\n\t\tvar spineItem;\n\n\t\titem.cfiBase = this.epubcfi.generateChapterComponent(this.spineNodeIndex, item.index, item.idref);\n\n\t\tif(manifestItem) {\n\t\t\titem.href = manifestItem.href;\n\t\t\titem.url = this.baseUrl + item.href;\n\n\t\t\tif(manifestItem.properties.length){\n\t\t\t\titem.properties.push.apply(item.properties, manifestItem.properties);\n\t\t\t}\n\t\t}\n\n\t\t// if(index > 0) {\n\t\t\titem.prev = function(){ return this.get(index-1); }.bind(this);\n\t\t// }\n\n\t\t// if(index+1 < this.items.length) {\n\t\t\titem.next = function(){ return this.get(index+1); }.bind(this);\n\t\t// }\n\n\t\tspineItem = new Section(item, this.hooks);\n\n\t\tthis.append(spineItem);\n\n\n\t}.bind(this));\n\n\tthis.loaded = true;\n};\n\n// book.spine.get();\n// book.spine.get(1);\n// book.spine.get(\"chap1.html\");\n// book.spine.get(\"#id1234\");\nSpine.prototype.get = function(target) {\n\tvar index = 0;\n\n\tif(this.epubcfi.isCfiString(target)) {\n\t\tcfi = new EpubCFI(target);\n\t\tindex = cfi.spinePos;\n\t} else if(target && (typeof target === \"number\" || isNaN(target) === false)){\n\t\tindex = target;\n\t} else if(target && target.indexOf(\"#\") === 0) {\n\t\tindex = this.spineById[target.substring(1)];\n\t} else if(target) {\n\t\t// Remove fragments\n\t\ttarget = target.split(\"#\")[0];\n\t\tindex = this.spineByHref[target];\n\t}\n\n\treturn this.spineItems[index] || null;\n};\n\nSpine.prototype.append = function(section) {\n\tvar index = this.spineItems.length;\n\tsection.index = index;\n\n\tthis.spineItems.push(section);\n\n\tthis.spineByHref[section.href] = index;\n\tthis.spineById[section.idref] = index;\n\n\treturn index;\n};\n\nSpine.prototype.prepend = function(section) {\n\tvar index = this.spineItems.unshift(section);\n\tthis.spineByHref[section.href] = 0;\n\tthis.spineById[section.idref] = 0;\n\n\t// Re-index\n\tthis.spineItems.forEach(function(item, index){\n\t\titem.index = index;\n\t});\n\n\treturn 0;\n};\n\nSpine.prototype.insert = function(section, index) {\n\n};\n\nSpine.prototype.remove = function(section) {\n\tvar index = this.spineItems.indexOf(section);\n\n\tif(index > -1) {\n\t\tdelete this.spineByHref[section.href];\n\t\tdelete this.spineById[section.idref];\n\n\t\treturn this.spineItems.splice(index, 1);\n\t}\n};\n\nSpine.prototype.each = function() {\n\treturn this.spineItems.forEach.apply(this.spineItems, arguments);\n};\n\nmodule.exports = Spine;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/spine.js\n ** module id = 14\n ** module chunks = 0\n **/","var URI = require('urijs');\nvar core = require('./core');\n\n/**\n\tEPUB CFI spec: http://www.idpf.org/epub/linking/cfi/epub-cfi.html\n\n\tImplements:\n\t- Character Offset: epubcfi(/6/4[chap01ref]!/4[body01]/10[para05]/2/1:3)\n\t- Simple Ranges : epubcfi(/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4)\n\n\tDoes Not Implement:\n\t- Temporal Offset (~)\n\t- Spatial Offset (@)\n\t- Temporal-Spatial Offset (~ + @)\n\t- Text Location Assertion ([)\n*/\n\nfunction EpubCFI(cfiFrom, base, ignoreClass){\n\tvar type;\n\n\tthis.str = '';\n\n\tthis.base = {};\n\tthis.spinePos = 0; // For compatibility\n\n\tthis.range = false; // true || false;\n\n\tthis.path = {};\n\tthis.start = null;\n\tthis.end = null;\n\n\t// Allow instantiation without the 'new' keyword\n\tif (!(this instanceof EpubCFI)) {\n\t\treturn new EpubCFI(cfiFrom, base, ignoreClass);\n\t}\n\n\tif(typeof base === 'string') {\n\t\tthis.base = this.parseComponent(base);\n\t} else if(typeof base === 'object' && base.steps) {\n\t\tthis.base = base;\n\t}\n\n\ttype = this.checkType(cfiFrom);\n\n\n\tif(type === 'string') {\n\t\tthis.str = cfiFrom;\n\t\treturn core.extend(this, this.parse(cfiFrom));\n\t} else if (type === 'range') {\n\t\treturn core.extend(this, this.fromRange(cfiFrom, this.base, ignoreClass));\n\t} else if (type === 'node') {\n\t\treturn core.extend(this, this.fromNode(cfiFrom, this.base, ignoreClass));\n\t} else if (type === 'EpubCFI' && cfiFrom.path) {\n\t\treturn cfiFrom;\n\t} else if (!cfiFrom) {\n\t\treturn this;\n\t} else {\n\t\tthrow new TypeError('not a valid argument for EpubCFI');\n\t}\n\n};\n\nEpubCFI.prototype.checkType = function(cfi) {\n\n\tif (this.isCfiString(cfi)) {\n\t\treturn 'string';\n\t// Is a range object\n\t} else if (typeof cfi === 'object' && core.type(cfi) === \"Range\"){\n\t\treturn 'range';\n\t} else if (typeof cfi === 'object' && typeof(cfi.nodeType) != \"undefined\" ){ // || typeof cfi === 'function'\n\t\treturn 'node';\n\t} else if (typeof cfi === 'object' && cfi instanceof EpubCFI){\n\t\treturn 'EpubCFI';\n\t} else {\n\t\treturn false;\n\t}\n};\n\nEpubCFI.prototype.parse = function(cfiStr) {\n\tvar cfi = {\n\t\t\tspinePos: -1,\n\t\t\trange: false,\n\t\t\tbase: {},\n\t\t\tpath: {},\n\t\t\tstart: null,\n\t\t\tend: null\n\t\t};\n\tvar baseComponent, pathComponent, range;\n\n\tif(typeof cfiStr !== \"string\") {\n\t\treturn {spinePos: -1};\n\t}\n\n\tif(cfiStr.indexOf(\"epubcfi(\") === 0 && cfiStr[cfiStr.length-1] === \")\") {\n\t\t// Remove intial epubcfi( and ending )\n\t\tcfiStr = cfiStr.slice(8, cfiStr.length-1);\n\t}\n\n\tbaseComponent = this.getChapterComponent(cfiStr);\n\n\t// Make sure this is a valid cfi or return\n\tif(!baseComponent) {\n\t\treturn {spinePos: -1};\n\t}\n\n\tcfi.base = this.parseComponent(baseComponent);\n\n\tpathComponent = this.getPathComponent(cfiStr);\n\tcfi.path = this.parseComponent(pathComponent);\n\n\trange = this.getRange(cfiStr);\n\n\tif(range) {\n\t\tcfi.range = true;\n\t\tcfi.start = this.parseComponent(range[0]);\n\t\tcfi.end = this.parseComponent(range[1]);\n\t}\n\n\t// Get spine node position\n\t// cfi.spineSegment = cfi.base.steps[1];\n\n\t// Chapter segment is always the second step\n\tcfi.spinePos = cfi.base.steps[1].index;\n\n\treturn cfi;\n};\n\nEpubCFI.prototype.parseComponent = function(componentStr){\n\tvar component = {\n\t\tsteps: [],\n\t\tterminal: {\n\t\t\toffset: null,\n\t\t\tassertion: null\n\t\t}\n\t};\n\tvar parts = componentStr.split(':');\n\tvar steps = parts[0].split('/');\n\tvar terminal;\n\n\tif(parts.length > 1) {\n\t\tterminal = parts[1];\n\t\tcomponent.terminal = this.parseTerminal(terminal);\n\t}\n\n\tif (steps[0] === '') {\n\t\tsteps.shift(); // Ignore the first slash\n\t}\n\n\tcomponent.steps = steps.map(function(step){\n\t\treturn this.parseStep(step);\n\t}.bind(this));\n\n\treturn component;\n};\n\nEpubCFI.prototype.parseStep = function(stepStr){\n\tvar type, num, index, has_brackets, id;\n\n\thas_brackets = stepStr.match(/\\[(.*)\\]/);\n\tif(has_brackets && has_brackets[1]){\n\t\tid = has_brackets[1];\n\t}\n\n\t//-- Check if step is a text node or element\n\tnum = parseInt(stepStr);\n\n\tif(isNaN(num)) {\n\t\treturn;\n\t}\n\n\tif(num % 2 === 0) { // Even = is an element\n\t\ttype = \"element\";\n\t\tindex = num / 2 - 1;\n\t} else {\n\t\ttype = \"text\";\n\t\tindex = (num - 1 ) / 2;\n\t}\n\n\treturn {\n\t\t\"type\" : type,\n\t\t'index' : index,\n\t\t'id' : id || null\n\t};\n};\n\nEpubCFI.prototype.parseTerminal = function(termialStr){\n\tvar characterOffset, textLocationAssertion;\n\tvar assertion = termialStr.match(/\\[(.*)\\]/);\n\n\tif(assertion && assertion[1]){\n\t\tcharacterOffset = parseInt(termialStr.split('[')[0]) || null;\n\t\ttextLocationAssertion = assertion[1];\n\t} else {\n\t\tcharacterOffset = parseInt(termialStr) || null;\n\t}\n\n\treturn {\n\t\t'offset': characterOffset,\n\t\t'assertion': textLocationAssertion\n\t};\n\n};\n\nEpubCFI.prototype.getChapterComponent = function(cfiStr) {\n\n\tvar indirection = cfiStr.split(\"!\");\n\n\treturn indirection[0];\n};\n\nEpubCFI.prototype.getPathComponent = function(cfiStr) {\n\n\tvar indirection = cfiStr.split(\"!\");\n\n\tif(indirection[1]) {\n\t\tranges = indirection[1].split(',');\n\t\treturn ranges[0];\n\t}\n\n};\n\nEpubCFI.prototype.getRange = function(cfiStr) {\n\n\tvar ranges = cfiStr.split(\",\");\n\n\tif(ranges.length === 3){\n\t\treturn [\n\t\t\tranges[1],\n\t\t\tranges[2]\n\t\t];\n\t}\n\n\treturn false;\n};\n\nEpubCFI.prototype.getCharecterOffsetComponent = function(cfiStr) {\n\tvar splitStr = cfiStr.split(\":\");\n\treturn splitStr[1] || '';\n};\n\nEpubCFI.prototype.joinSteps = function(steps) {\n\tif(!steps) {\n\t\treturn \"\";\n\t}\n\n\treturn steps.map(function(part){\n\t\tvar segment = '';\n\n\t\tif(part.type === 'element') {\n\t\t\tsegment += (part.index + 1) * 2;\n\t\t}\n\n\t\tif(part.type === 'text') {\n\t\t\tsegment += 1 + (2 * part.index); // TODO: double check that this is odd\n\t\t}\n\n\t\tif(part.id) {\n\t\t\tsegment += \"[\" + part.id + \"]\";\n\t\t}\n\n\t\treturn segment;\n\n\t}).join('/');\n\n};\n\nEpubCFI.prototype.segmentString = function(segment) {\n\tvar segmentString = '/';\n\n\tsegmentString += this.joinSteps(segment.steps);\n\n\tif(segment.terminal && segment.terminal.offset != null){\n\t\tsegmentString += ':' + segment.terminal.offset;\n\t}\n\n\tif(segment.terminal && segment.terminal.assertion != null){\n\t\tsegmentString += '[' + segment.terminal.assertion + ']';\n\t}\n\n\treturn segmentString;\n};\n\nEpubCFI.prototype.toString = function() {\n\tvar cfiString = 'epubcfi(';\n\n\tcfiString += this.segmentString(this.base);\n\n\tcfiString += '!';\n\tcfiString += this.segmentString(this.path);\n\n\t// Add Range, if present\n\tif(this.start) {\n\t\tcfiString += ',';\n\t\tcfiString += this.segmentString(this.start);\n\t}\n\n\tif(this.end) {\n\t\tcfiString += ',';\n\t\tcfiString += this.segmentString(this.end);\n\t}\n\n\tcfiString += \")\";\n\n\treturn cfiString;\n};\n\nEpubCFI.prototype.compare = function(cfiOne, cfiTwo) {\n\tif(typeof cfiOne === 'string') {\n\t\tcfiOne = new EpubCFI(cfiOne);\n\t}\n\tif(typeof cfiTwo === 'string') {\n\t\tcfiTwo = new EpubCFI(cfiTwo);\n\t}\n\t// Compare Spine Positions\n\tif(cfiOne.spinePos > cfiTwo.spinePos) {\n\t\treturn 1;\n\t}\n\tif(cfiOne.spinePos < cfiTwo.spinePos) {\n\t\treturn -1;\n\t}\n\n\n\t// Compare Each Step in the First item\n\tfor (var i = 0; i < cfiOne.path.steps.length; i++) {\n\t\tif(!cfiTwo.path.steps[i]) {\n\t\t\treturn 1;\n\t\t}\n\t\tif(cfiOne.path.steps[i].index > cfiTwo.path.steps[i].index) {\n\t\t\treturn 1;\n\t\t}\n\t\tif(cfiOne.path.steps[i].index < cfiTwo.path.steps[i].index) {\n\t\t\treturn -1;\n\t\t}\n\t\t// Otherwise continue checking\n\t}\n\n\t// All steps in First equal to Second and First is Less Specific\n\tif(cfiOne.path.steps.length < cfiTwo.path.steps.length) {\n\t\treturn 1;\n\t}\n\n\t// Compare the charecter offset of the text node\n\tif(cfiOne.path.terminal.offset > cfiTwo.path.terminal.offset) {\n\t\treturn 1;\n\t}\n\tif(cfiOne.path.terminal.offset < cfiTwo.path.terminal.offset) {\n\t\treturn -1;\n\t}\n\n\t// TODO: compare ranges\n\n\t// CFI's are equal\n\treturn 0;\n};\n\nEpubCFI.prototype.step = function(node) {\n\tvar nodeType = (node.nodeType === Node.TEXT_NODE) ? 'text' : 'element';\n\n\treturn {\n\t\t'id' : node.id,\n\t\t'tagName' : node.tagName,\n\t\t'type' : nodeType,\n\t\t'index' : this.position(node)\n\t};\n};\n\nEpubCFI.prototype.filteredStep = function(node, ignoreClass) {\n\tvar filteredNode = this.filter(node, ignoreClass);\n\tvar nodeType;\n\n\t// Node filtered, so ignore\n\tif (!filteredNode) {\n\t\treturn;\n\t}\n\n\t// Otherwise add the filter node in\n\tnodeType = (filteredNode.nodeType === Node.TEXT_NODE) ? 'text' : 'element';\n\n\treturn {\n\t\t'id' : filteredNode.id,\n\t\t'tagName' : filteredNode.tagName,\n\t\t'type' : nodeType,\n\t\t'index' : this.filteredPosition(filteredNode, ignoreClass)\n\t};\n};\n\nEpubCFI.prototype.pathTo = function(node, offset, ignoreClass) {\n\tvar segment = {\n\t\tsteps: [],\n\t\tterminal: {\n\t\t\toffset: null,\n\t\t\tassertion: null\n\t\t}\n\t};\n\tvar currentNode = node;\n\tvar step;\n\n\twhile(currentNode && currentNode.parentNode &&\n\t\t\t\tcurrentNode.parentNode.nodeType != Node.DOCUMENT_NODE) {\n\n\t\tif (ignoreClass) {\n\t\t\tstep = this.filteredStep(currentNode, ignoreClass);\n\t\t} else {\n\t\t\tstep = this.step(currentNode);\n\t\t}\n\n\t\tif (step) {\n\t\t\tsegment.steps.unshift(step);\n\t\t}\n\n\t\tcurrentNode = currentNode.parentNode;\n\n\t}\n\n\tif (offset != null && offset >= 0) {\n\n\t\tsegment.terminal.offset = offset;\n\n\t\t// Make sure we are getting to a textNode if there is an offset\n\t\tif(segment.steps[segment.steps.length-1].type != \"text\") {\n\t\t\tsegment.steps.push({\n\t\t\t\t'type' : \"text\",\n\t\t\t\t'index' : 0\n\t\t\t});\n\t\t}\n\n\t}\n\n\n\treturn segment;\n}\n\nEpubCFI.prototype.equalStep = function(stepA, stepB) {\n\tif (!stepA || !stepB) {\n\t\treturn false;\n\t}\n\n\tif(stepA.index === stepB.index &&\n\t\t stepA.id === stepB.id &&\n\t\t stepA.type === stepB.type) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\nEpubCFI.prototype.fromRange = function(range, base, ignoreClass) {\n\tvar cfi = {\n\t\t\trange: false,\n\t\t\tbase: {},\n\t\t\tpath: {},\n\t\t\tstart: null,\n\t\t\tend: null\n\t\t};\n\n\tvar start = range.startContainer;\n\tvar end = range.endContainer;\n\n\tvar startOffset = range.startOffset;\n\tvar endOffset = range.endOffset;\n\n\tvar needsIgnoring = false;\n\n\tif (ignoreClass) {\n\t\t// Tell pathTo if / what to ignore\n\t\tneedsIgnoring = (start.ownerDocument.querySelector('.' + ignoreClass) != null);\n\t}\n\n\n\tif (typeof base === 'string') {\n\t\tcfi.base = this.parseComponent(base);\n\t\tcfi.spinePos = cfi.base.steps[1].index;\n\t} else if (typeof base === 'object') {\n\t\tcfi.base = base;\n\t}\n\n\tif (range.collapsed) {\n\t\tif (needsIgnoring) {\n\t\t\tstartOffset = this.patchOffset(start, startOffset, ignoreClass);\n\t\t}\n\t\tcfi.path = this.pathTo(start, startOffset, ignoreClass);\n\t} else {\n\t\tcfi.range = true;\n\n\t\tif (needsIgnoring) {\n\t\t\tstartOffset = this.patchOffset(start, startOffset, ignoreClass);\n\t\t}\n\n\t\tcfi.start = this.pathTo(start, startOffset, ignoreClass);\n\n\t\tif (needsIgnoring) {\n\t\t\tendOffset = this.patchOffset(end, endOffset, ignoreClass);\n\t\t}\n\n\t\tcfi.end = this.pathTo(end, endOffset, ignoreClass);\n\n\t\t// Create a new empty path\n\t\tcfi.path = {\n\t\t\tsteps: [],\n\t\t\tterminal: null\n\t\t};\n\n\t\t// Push steps that are shared between start and end to the common path\n\t\tvar len = cfi.start.steps.length;\n\t\tvar i;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (this.equalStep(cfi.start.steps[i], cfi.end.steps[i])) {\n\t\t\t\tif(i == len-1) {\n\t\t\t\t\t// Last step is equal, check terminals\n\t\t\t\t\tif(cfi.start.terminal === cfi.end.terminal) {\n\t\t\t\t\t\t// CFI's are equal\n\t\t\t\t\t\tcfi.path.steps.push(cfi.start.steps[i]);\n\t\t\t\t\t\t// Not a range\n\t\t\t\t\t\tcfi.range = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcfi.path.steps.push(cfi.start.steps[i]);\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\n\t\tcfi.start.steps = cfi.start.steps.slice(cfi.path.steps.length);\n\t\tcfi.end.steps = cfi.end.steps.slice(cfi.path.steps.length);\n\n\t\t// TODO: Add Sanity check to make sure that the end if greater than the start\n\t}\n\n\treturn cfi;\n}\n\nEpubCFI.prototype.fromNode = function(anchor, base, ignoreClass) {\n\tvar cfi = {\n\t\t\trange: false,\n\t\t\tbase: {},\n\t\t\tpath: {},\n\t\t\tstart: null,\n\t\t\tend: null\n\t\t};\n\n\tvar needsIgnoring = false;\n\n\tif (ignoreClass) {\n\t\t// Tell pathTo if / what to ignore\n\t\tneedsIgnoring = (anchor.ownerDocument.querySelector('.' + ignoreClass) != null);\n\t}\n\n\tif (typeof base === 'string') {\n\t\tcfi.base = this.parseComponent(base);\n\t\tcfi.spinePos = cfi.base.steps[1].index;\n\t} else if (typeof base === 'object') {\n\t\tcfi.base = base;\n\t}\n\n\tcfi.path = this.pathTo(anchor, null, ignoreClass);\n\n\treturn cfi;\n};\n\n\nEpubCFI.prototype.filter = function(anchor, ignoreClass) {\n\tvar needsIgnoring;\n\tvar sibling; // to join with\n\tvar parent, prevSibling, nextSibling;\n\tvar isText = false;\n\n\tif (anchor.nodeType === Node.TEXT_NODE) {\n\t\tisText = true;\n\t\tparent = anchor.parentNode;\n\t\tneedsIgnoring = anchor.parentNode.classList.contains(ignoreClass);\n\t} else {\n\t\tisText = false;\n\t\tneedsIgnoring = anchor.classList.contains(ignoreClass);\n\t}\n\n\tif (needsIgnoring && isText) {\n\t\tpreviousSibling = parent.previousSibling;\n\t\tnextSibling = parent.nextSibling;\n\n\t\t// If the sibling is a text node, join the nodes\n\t\tif (previousSibling && previousSibling.nodeType === Node.TEXT_NODE) {\n\t\t\tsibling = previousSibling;\n\t\t} else if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE) {\n\t\t\tsibling = nextSibling;\n\t\t}\n\n\t\tif (sibling) {\n\t\t\treturn sibling;\n\t\t} else {\n\t\t\t// Parent will be ignored on next step\n\t\t\treturn anchor;\n\t\t}\n\n\t} else if (needsIgnoring && !isText) {\n\t\t// Otherwise just skip the element node\n\t\treturn false;\n\t} else {\n\t\t// No need to filter\n\t\treturn anchor;\n\t}\n\n};\n\nEpubCFI.prototype.patchOffset = function(anchor, offset, ignoreClass) {\n\tvar needsIgnoring;\n\tvar sibling;\n\n\tif (anchor.nodeType != Node.TEXT_NODE) {\n\t\tconsole.error(\"Anchor must be a text node\");\n\t\treturn;\n\t}\n\n\tvar curr = anchor;\n\tvar totalOffset = offset;\n\n\t// If the parent is a ignored node, get offset from it's start\n\tif (anchor.parentNode.classList.contains(ignoreClass)) {\n\t\tcurr = anchor.parentNode;\n\t}\n\n\twhile (curr.previousSibling) {\n\t\tif(curr.previousSibling.nodeType === Node.ELEMENT_NODE) {\n\t\t\t// Originally a text node, so join\n\t\t\tif(curr.previousSibling.classList.contains(ignoreClass)){\n\t\t\t\ttotalOffset += curr.previousSibling.textContent.length;\n\t\t\t} else {\n\t\t\t\tbreak; // Normal node, dont join\n\t\t\t}\n\t\t} else {\n\t\t\t// If the previous sibling is a text node, join the nodes\n\t\t\ttotalOffset += curr.previousSibling.textContent.length;\n\t\t}\n\n\t\tcurr = curr.previousSibling;\n\t}\n\n\treturn totalOffset;\n\n};\n\nEpubCFI.prototype.normalizedMap = function(children, nodeType, ignoreClass) {\n\tvar output = {};\n\tvar prevIndex = -1;\n\tvar i, len = children.length;\n\tvar currNodeType;\n\tvar prevNodeType;\n\n\tfor (i = 0; i < len; i++) {\n\n\t\tcurrNodeType = children[i].nodeType;\n\n\t\t// Check if needs ignoring\n\t\tif (currNodeType === Node.ELEMENT_NODE &&\n\t\t\t\tchildren[i].classList.contains(ignoreClass)) {\n\t\t\tcurrNodeType = Node.TEXT_NODE;\n\t\t}\n\n\t\tif (i > 0 &&\n\t\t\t\tcurrNodeType === Node.TEXT_NODE &&\n\t\t\t\tprevNodeType === Node.TEXT_NODE) {\n\t\t\t// join text nodes\n\t\t\toutput[i] = prevIndex;\n\t\t} else if (nodeType === currNodeType){\n\t\t\tprevIndex = prevIndex + 1;\n\t\t\toutput[i] = prevIndex;\n\t\t}\n\n\t\tprevNodeType = currNodeType;\n\n\t}\n\n\treturn output;\n};\n\nEpubCFI.prototype.position = function(anchor) {\n\tvar children, index, map;\n\n\tif (anchor.nodeType === Node.ELEMENT_NODE) {\n\t\tchildren = anchor.parentNode.children;\n\t\tindex = Array.prototype.indexOf.call(children, anchor);\n\t} else {\n\t\tchildren = this.textNodes(anchor.parentNode);\n\t\tindex = children.indexOf(anchor);\n\t}\n\n\treturn index;\n};\n\nEpubCFI.prototype.filteredPosition = function(anchor, ignoreClass) {\n\tvar children, index, map;\n\n\tif (anchor.nodeType === Node.ELEMENT_NODE) {\n\t\tchildren = anchor.parentNode.children;\n\t\tmap = this.normalizedMap(children, Node.ELEMENT_NODE, ignoreClass);\n\t} else {\n\t\tchildren = anchor.parentNode.childNodes;\n\t\t// Inside an ignored node\n\t\tif(anchor.parentNode.classList.contains(ignoreClass)) {\n\t\t\tanchor = anchor.parentNode;\n\t\t\tchildren = anchor.parentNode.childNodes;\n\t\t}\n\t\tmap = this.normalizedMap(children, Node.TEXT_NODE, ignoreClass);\n\t}\n\n\n\tindex = Array.prototype.indexOf.call(children, anchor);\n\n\treturn map[index];\n};\n\nEpubCFI.prototype.stepsToXpath = function(steps) {\n\tvar xpath = [\".\", \"*\"];\n\n\tsteps.forEach(function(step){\n\t\tvar position = step.index + 1;\n\n\t\tif(step.id){\n\t\t\txpath.push(\"*[position()=\" + position + \" and @id='\" + step.id + \"']\");\n\t\t} else if(step.type === \"text\") {\n\t\t\txpath.push(\"text()[\" + position + \"]\");\n\t\t} else {\n\t\t\txpath.push(\"*[\" + position + \"]\");\n\t\t}\n\t});\n\n\treturn xpath.join(\"/\");\n};\n\n\n/*\n\nTo get the last step if needed:\n\n// Get the terminal step\nlastStep = steps[steps.length-1];\n// Get the query string\nquery = this.stepsToQuery(steps);\n// Find the containing element\nstartContainerParent = doc.querySelector(query);\n// Find the text node within that element\nif(startContainerParent && lastStep.type == \"text\") {\n\tcontainer = startContainerParent.childNodes[lastStep.index];\n}\n*/\nEpubCFI.prototype.stepsToQuerySelector = function(steps) {\n\tvar query = [\"html\"];\n\n\tsteps.forEach(function(step){\n\t\tvar position = step.index + 1;\n\n\t\tif(step.id){\n\t\t\tquery.push(\"#\" + step.id);\n\t\t} else if(step.type === \"text\") {\n\t\t\t// unsupported in querySelector\n\t\t\t// query.push(\"text()[\" + position + \"]\");\n\t\t} else {\n\t\t\tquery.push(\"*:nth-child(\" + position + \")\");\n\t\t}\n\t});\n\n\treturn query.join(\">\");\n\n};\n\nEpubCFI.prototype.textNodes = function(container, ignoreClass) {\n\treturn Array.prototype.slice.call(container.childNodes).\n\t\tfilter(function (node) {\n\t\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\t\treturn true;\n\t\t\t} else if (ignoreClass && node.classList.contains(ignoreClass)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n};\n\nEpubCFI.prototype.walkToNode = function(steps, _doc, ignoreClass) {\n\tvar doc = _doc || document;\n\tvar container = doc.documentElement;\n\tvar step;\n\tvar len = steps.length;\n\tvar i;\n\n\tfor (i = 0; i < len; i++) {\n\t\tstep = steps[i];\n\n\t\tif(step.type === \"element\") {\n\t\t\tcontainer = container.children[step.index];\n\t\t} else if(step.type === \"text\"){\n\t\t\tcontainer = this.textNodes(container, ignoreClass)[step.index];\n\t\t}\n\n\t};\n\n\treturn container;\n};\n\nEpubCFI.prototype.findNode = function(steps, _doc, ignoreClass) {\n\tvar doc = _doc || document;\n\tvar container;\n\tvar xpath;\n\n\tif(!ignoreClass && typeof doc.evaluate != 'undefined') {\n\t\txpath = this.stepsToXpath(steps);\n\t\tcontainer = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n\t} else if(ignoreClass) {\n\t\tcontainer = this.walkToNode(steps, doc, ignoreClass);\n\t} else {\n\t\tcontainer = this.walkToNode(steps, doc);\n\t}\n\n\treturn container;\n};\n\nEpubCFI.prototype.fixMiss = function(steps, offset, _doc, ignoreClass) {\n\tvar container = this.findNode(steps.slice(0,-1), _doc, ignoreClass);\n\tvar children = container.childNodes;\n\tvar map = this.normalizedMap(children, Node.TEXT_NODE, ignoreClass);\n\tvar i;\n\tvar child;\n\tvar len;\n\tvar childIndex;\n\tvar lastStepIndex = steps[steps.length-1].index;\n\n\tfor (var childIndex in map) {\n\t\tif (!map.hasOwnProperty(childIndex)) return;\n\n\t\tif(map[childIndex] === lastStepIndex) {\n\t\t\tchild = children[childIndex];\n\t\t\tlen = child.textContent.length;\n\t\t\tif(offset > len) {\n\t\t\t\toffset = offset - len;\n\t\t\t} else {\n\t\t\t\tif (child.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\tcontainer = child.childNodes[0];\n\t\t\t\t} else {\n\t\t\t\t\tcontainer = child;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tcontainer: container,\n\t\toffset: offset\n\t};\n\n};\n\nEpubCFI.prototype.toRange = function(_doc, ignoreClass) {\n\tvar doc = _doc || document;\n\tvar range = doc.createRange();\n\tvar start, end, startContainer, endContainer;\n\tvar cfi = this;\n\tvar startSteps, endSteps;\n\tvar needsIgnoring = ignoreClass ? (doc.querySelector('.' + ignoreClass) != null) : false;\n\tvar missed;\n\n\tif (cfi.range) {\n\t\tstart = cfi.start;\n\t\tstartSteps = cfi.path.steps.concat(start.steps);\n\t\tstartContainer = this.findNode(startSteps, doc, needsIgnoring ? ignoreClass : null);\n\t\tend = cfi.end;\n\t\tendSteps = cfi.path.steps.concat(end.steps);\n\t\tendContainer = this.findNode(endSteps, doc, needsIgnoring ? ignoreClass : null);\n\t} else {\n\t\tstart = cfi.path;\n\t\tstartSteps = cfi.path.steps;\n\t\tstartContainer = this.findNode(cfi.path.steps, doc, needsIgnoring ? ignoreClass : null);\n\t}\n\n\tif(startContainer) {\n\t\ttry {\n\n\t\t\tif(start.terminal.offset != null) {\n\t\t\t\trange.setStart(startContainer, start.terminal.offset);\n\t\t\t} else {\n\t\t\t\trange.setStart(startContainer, 0);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tmissed = this.fixMiss(startSteps, start.terminal.offset, doc, needsIgnoring ? ignoreClass : null);\n\t\t\trange.setStart(missed.container, missed.offset);\n\t\t}\n\t} else {\n\t\t// No start found\n\t\treturn null;\n\t}\n\n\tif (endContainer) {\n\t\ttry {\n\n\t\t\tif(end.terminal.offset != null) {\n\t\t\t\trange.setEnd(endContainer, end.terminal.offset);\n\t\t\t} else {\n\t\t\t\trange.setEnd(endContainer, 0);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tmissed = this.fixMiss(endSteps, cfi.end.terminal.offset, doc, needsIgnoring ? ignoreClass : null);\n\t\t\trange.setEnd(missed.container, missed.offset);\n\t\t}\n\t}\n\n\n\t// doc.defaultView.getSelection().addRange(range);\n\treturn range;\n};\n\n// is a cfi string, should be wrapped with \"epubcfi()\"\nEpubCFI.prototype.isCfiString = function(str) {\n\tif(typeof str === 'string' &&\n\t\t\tstr.indexOf(\"epubcfi(\") === 0 &&\n\t\t\tstr[str.length-1] === \")\") {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nEpubCFI.prototype.generateChapterComponent = function(_spineNodeIndex, _pos, id) {\n\tvar pos = parseInt(_pos),\n\t\tspineNodeIndex = _spineNodeIndex + 1,\n\t\tcfi = '/'+spineNodeIndex+'/';\n\n\tcfi += (pos + 1) * 2;\n\n\tif(id) {\n\t\tcfi += \"[\" + id + \"]\";\n\t}\n\n\treturn cfi;\n};\n\nmodule.exports = EpubCFI;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/epubcfi.js\n ** module id = 15\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\n\n//-- Hooks allow for injecting functions that must all complete in order before finishing\n// They will execute in parallel but all must finish before continuing\n// Functions may return a promise if they are asycn.\n\n// this.content = new EPUBJS.Hook();\n// this.content.register(function(){});\n// this.content.trigger(args).then(function(){});\n\nfunction Hook(context){\n\tthis.context = context || this;\n\tthis.hooks = [];\n};\n\n// Adds a function to be run before a hook completes\nHook.prototype.register = function(){\n\tfor(var i = 0; i < arguments.length; ++i) {\n\t\tif (typeof arguments[i] === \"function\") {\n\t\t\tthis.hooks.push(arguments[i]);\n\t\t} else {\n\t\t\t// unpack array\n\t\t\tfor(var j = 0; j < arguments[i].length; ++j) {\n\t\t\t\tthis.hooks.push(arguments[i][j]);\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Triggers a hook to run all functions\nHook.prototype.trigger = function(){\n\tvar args = arguments;\n\tvar context = this.context;\n\tvar promises = [];\n\n\tthis.hooks.forEach(function(task, i) {\n\t\tvar executing = task.apply(context, args);\n\n\t\tif(executing && typeof executing[\"then\"] === \"function\") {\n\t\t\t// Task is a function that returns a promise\n\t\t\tpromises.push(executing);\n\t\t}\n\t\t// Otherwise Task resolves immediately, continue\n\t});\n\n\n\treturn RSVP.all(promises);\n};\n\n// Adds a function to be run before a hook completes\nHook.prototype.list = function(){\n\treturn this.hooks;\n};\n\nHook.prototype.clear = function(){\n\treturn this.hooks = [];\n};\n\nmodule.exports = Hook;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/hook.js\n ** module id = 16\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Hook = require('./hook');\n\nfunction Section(item, hooks){\n\t\tthis.idref = item.idref;\n\t\tthis.linear = item.linear;\n\t\tthis.properties = item.properties;\n\t\tthis.index = item.index;\n\t\tthis.href = item.href;\n\t\tthis.url = item.url;\n\t\tthis.next = item.next;\n\t\tthis.prev = item.prev;\n\n\t\tthis.cfiBase = item.cfiBase;\n\n\t\tif (hooks) {\n\t\t\tthis.hooks = hooks;\n\t\t} else {\n\t\t\tthis.hooks = {};\n\t\t\tthis.hooks.serialize = new Hook(this);\n\t\t\tthis.hooks.content = new Hook(this);\n\t\t}\n\n};\n\n\nSection.prototype.load = function(_request){\n\tvar request = _request || this.request || require('./request');\n\tvar loading = new RSVP.defer();\n\tvar loaded = loading.promise;\n\n\tif(this.contents) {\n\t\tloading.resolve(this.contents);\n\t} else {\n\t\trequest(this.url)\n\t\t\t.then(function(xml){\n\t\t\t\tvar base;\n\t\t\t\tvar directory = URI(this.url).directory();\n\n\t\t\t\tthis.document = xml;\n\t\t\t\tthis.contents = xml.documentElement;\n\n\t\t\t\treturn this.hooks.content.trigger(this.document, this);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tloading.resolve(this.contents);\n\t\t\t}.bind(this))\n\t\t\t.catch(function(error){\n\t\t\t\tloading.reject(error);\n\t\t\t});\n\t}\n\n\treturn loaded;\n};\n\nSection.prototype.base = function(_document){\n\t\tvar task = new RSVP.defer();\n\t\tvar base = _document.createElement(\"base\"); // TODO: check if exists\n\t\tvar head;\n\t\tconsole.log(window.location.origin + \"/\" +this.url);\n\n\t\tbase.setAttribute(\"href\", window.location.origin + \"/\" +this.url);\n\n\t\tif(_document) {\n\t\t\thead = _document.querySelector(\"head\");\n\t\t}\n\t\tif(head) {\n\t\t\thead.insertBefore(base, head.firstChild);\n\t\t\ttask.resolve();\n\t\t} else {\n\t\t\ttask.reject(new Error(\"No head to insert into\"));\n\t\t}\n\n\n\t\treturn task.promise;\n};\n\nSection.prototype.beforeSectionLoad = function(){\n\t// Stub for a hook - replace me for now\n};\n\nSection.prototype.render = function(_request){\n\tvar rendering = new RSVP.defer();\n\tvar rendered = rendering.promise;\n\tthis.output; // TODO: better way to return this from hooks?\n\n\tthis.load(_request).\n\t\tthen(function(contents){\n\t\t\tvar serializer;\n\n\t\t\tif (typeof XMLSerializer === \"undefined\") {\n\t\t\t\tXMLSerializer = require('xmldom').XMLSerializer;\n\t\t\t}\n\t\t\tserializer = new XMLSerializer();\n\t\t\tthis.output = serializer.serializeToString(contents);\n\t\t\treturn this.output;\n\t\t}.bind(this)).\n\t\tthen(function(){\n\t\t\treturn this.hooks.serialize.trigger(this.output, this);\n\t\t}.bind(this)).\n\t\tthen(function(){\n\t\t\trendering.resolve(this.output);\n\t\t}.bind(this))\n\t\t.catch(function(error){\n\t\t\trendering.reject(error);\n\t\t});\n\n\treturn rendered;\n};\n\nSection.prototype.find = function(_query){\n\n};\n\n/**\n* Reconciles the current chapters layout properies with\n* the global layout properities.\n* Takes: global layout settings object, chapter properties string\n* Returns: Object with layout properties\n*/\nSection.prototype.reconcileLayoutSettings = function(global){\n\t//-- Get the global defaults\n\tvar settings = {\n\t\tlayout : global.layout,\n\t\tspread : global.spread,\n\t\torientation : global.orientation\n\t};\n\n\t//-- Get the chapter's display type\n\tthis.properties.forEach(function(prop){\n\t\tvar rendition = prop.replace(\"rendition:\", '');\n\t\tvar split = rendition.indexOf(\"-\");\n\t\tvar property, value;\n\n\t\tif(split != -1){\n\t\t\tproperty = rendition.slice(0, split);\n\t\t\tvalue = rendition.slice(split+1);\n\n\t\t\tsettings[property] = value;\n\t\t}\n\t});\n return settings;\n};\n\nSection.prototype.cfiFromRange = function(_range) {\n\treturn new EpubCFI(_range, this.cfiBase).toString();\n};\n\nSection.prototype.cfiFromElement = function(el) {\n\treturn new EpubCFI(el, this.cfiBase).toString();\n};\n\nmodule.exports = Section;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/section.js\n ** module id = 17\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\n\nfunction request(url, type, withCredentials, headers) {\n\tvar supportsURL = (typeof window != \"undefined\") ? window.URL : false; // TODO: fallback for url if window isn't defined\n\tvar BLOB_RESPONSE = supportsURL ? \"blob\" : \"arraybuffer\";\n\tvar uri;\n\n\tvar deferred = new RSVP.defer();\n\n\tvar xhr = new XMLHttpRequest();\n\n\t//-- Check from PDF.js:\n\t// https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js\n\tvar xhrPrototype = XMLHttpRequest.prototype;\n\n\tvar header;\n\n\tif (!('overrideMimeType' in xhrPrototype)) {\n\t\t// IE10 might have response, but not overrideMimeType\n\t\tObject.defineProperty(xhrPrototype, 'overrideMimeType', {\n\t\t\tvalue: function xmlHttpRequestOverrideMimeType(mimeType) {}\n\t\t});\n\t}\n\tif(withCredentials) {\n\t\txhr.withCredentials = true;\n\t}\n\n\txhr.onreadystatechange = handler;\n\txhr.onerror = err;\n\n\txhr.open(\"GET\", url, true);\n\n\tfor(header in headers) {\n\t\txhr.setRequestHeader(header, headers[header]);\n\t}\n\n\tif(type == \"json\") {\n\t\txhr.setRequestHeader(\"Accept\", \"application/json\");\n\t}\n\n\t// If type isn't set, determine it from the file extension\n\tif(!type) {\n\t\turi = URI(url);\n\t\ttype = uri.suffix();\n\t}\n\n\tif(type == 'blob'){\n\t\txhr.responseType = BLOB_RESPONSE;\n\t}\n\n\n\tif(core.isXml(type)) {\n\t\t// xhr.responseType = \"document\";\n\t\txhr.overrideMimeType('text/xml'); // for OPF parsing\n\t}\n\n\tif(type == 'xhtml') {\n\t\t// xhr.responseType = \"document\";\n\t}\n\n\tif(type == 'html' || type == 'htm') {\n\t\t// xhr.responseType = \"document\";\n\t }\n\n\tif(type == \"binary\") {\n\t\txhr.responseType = \"arraybuffer\";\n\t}\n\n\txhr.send();\n\n\tfunction err(e) {\n\t\tconsole.error(e);\n\t\tdeferred.reject(e);\n\t}\n\n\tfunction handler() {\n\t\tif (this.readyState === XMLHttpRequest.DONE) {\n\n\t\t\tif (this.status === 200 || this.responseXML ) { //-- Firefox is reporting 0 for blob urls\n\t\t\t\tvar r;\n\n\t\t\t\tif (!this.response && !this.responseXML) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: this.status,\n\t\t\t\t\t\tmessage : \"Empty Response\",\n\t\t\t\t\t\tstack : new Error().stack\n\t\t\t\t\t});\n\t\t\t\t\treturn deferred.promise;\n\t\t\t\t}\n\n\t\t\t\tif (this.status === 403) {\n\t\t\t\t\tdeferred.reject({\n\t\t\t\t\t\tstatus: this.status,\n\t\t\t\t\t\tresponse: this.response,\n\t\t\t\t\t\tmessage : \"Forbidden\",\n\t\t\t\t\t\tstack : new Error().stack\n\t\t\t\t\t});\n\t\t\t\t\treturn deferred.promise;\n\t\t\t\t}\n\n\t\t\t\tif((this.responseType == '' || this.responseType == 'document')\n\t\t\t\t\t\t&& this.responseXML){\n\t\t\t\t\tr = this.responseXML;\n\t\t\t\t} else\n\t\t\t\tif(core.isXml(type)){\n\t\t\t\t\t// xhr.overrideMimeType('text/xml'); // for OPF parsing\n\t\t\t\t\t// If this.responseXML wasn't set, try to parse using a DOMParser from text\n\t\t\t\t\tr = core.parse(this.response, \"text/xml\");\n\t\t\t\t}else\n\t\t\t\tif(type == 'xhtml'){\n\t\t\t\t\tr = core.parse(this.response, \"application/xhtml+xml\");\n\t\t\t\t}else\n\t\t\t\tif(type == 'html' || type == 'htm'){\n\t\t\t\t\tr = core.parse(this.response, \"text/html\");\n\t\t\t\t}else\n\t\t\t\tif(type == 'json'){\n\t\t\t\t\tr = JSON.parse(this.response);\n\t\t\t\t}else\n\t\t\t\tif(type == 'blob'){\n\n\t\t\t\t\tif(supportsURL) {\n\t\t\t\t\t\tr = this.response;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//-- Safari doesn't support responseType blob, so create a blob from arraybuffer\n\t\t\t\t\t\tr = new Blob([this.response]);\n\t\t\t\t\t}\n\n\t\t\t\t}else{\n\t\t\t\t\tr = this.response;\n\t\t\t\t}\n\n\t\t\t\tdeferred.resolve(r);\n\t\t\t} else {\n\n\t\t\t\tdeferred.reject({\n\t\t\t\t\tstatus: this.status,\n\t\t\t\t\tmessage : this.response,\n\t\t\t\t\tstack : new Error().stack\n\t\t\t\t});\n\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deferred.promise;\n};\n\nmodule.exports = request;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/request.js\n ** module id = 18\n ** module chunks = 0\n **/","var URI = require('urijs');\nvar core = require('./core');\n\nfunction base(doc, section){\n\tvar base;\n\tvar head;\n\n\tif(!doc){\n\t\treturn;\n\t}\n\n\t// head = doc.querySelector(\"head\");\n\t// base = head.querySelector(\"base\");\n\thead = core.qs(doc, \"head\");\n\tbase = core.qs(head, \"base\");\n\n\tif(!base) {\n\t\tbase = doc.createElement(\"base\");\n\t\thead.insertBefore(base, head.firstChild);\n\t}\n\n\tbase.setAttribute(\"href\", section.url);\n}\n\nfunction canonical(doc, section){\n\tvar head;\n\tvar link;\n\tvar url = section.url; // window.location.origin + window.location.pathname + \"?loc=\" + encodeURIComponent(section.url);\n\n\tif(!doc){\n\t\treturn;\n\t}\n\n\thead = core.qs(doc, \"head\");\n\tlink = core.qs(head, \"link[rel='canonical']\");\n\n\tif (link) {\n\t\tlink.setAttribute(\"href\", url);\n\t} else {\n\t\tlink = doc.createElement(\"link\");\n\t\tlink.setAttribute(\"rel\", \"canonical\");\n\t\tlink.setAttribute(\"href\", url);\n\t\thead.appendChild(link);\n\t}\n}\n\nfunction links(view, renderer) {\n\n\tvar links = view.document.querySelectorAll(\"a[href]\");\n\tvar replaceLinks = function(link){\n\t\tvar href = link.getAttribute(\"href\");\n\n\t\tif(href.indexOf(\"mailto:\") === 0){\n\t\t\treturn;\n\t\t}\n\n\t\tvar linkUri = URI(href);\n\t\tvar absolute = linkUri.absoluteTo(view.section.url);\n\t\tvar relative = absolute.relativeTo(this.book.baseUrl).toString();\n\n\t\tif(linkUri.protocol()){\n\n\t\t\tlink.setAttribute(\"target\", \"_blank\");\n\n\t\t}else{\n\t\t\t/*\n\t\t\tif(baseDirectory) {\n\t\t\t\t// We must ensure that the file:// protocol is preserved for\n\t\t\t\t// local file links, as in certain contexts (such as under\n\t\t\t\t// Titanium), file links without the file:// protocol will not\n\t\t\t\t// work\n\t\t\t\tif (baseUri.protocol === \"file\") {\n\t\t\t\t\trelative = core.resolveUrl(baseUri.base, href);\n\t\t\t\t} else {\n\t\t\t\t\trelative = core.resolveUrl(baseDirectory, href);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trelative = href;\n\t\t\t}\n\t\t\t*/\n\n\t\t\tif(linkUri.fragment()) {\n\t\t\t\t// do nothing with fragment yet\n\t\t\t} else {\n\t\t\t\tlink.onclick = function(){\n\t\t\t\t\trenderer.display(relative);\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t}\n\n\t\t}\n\t}.bind(this);\n\n\tfor (var i = 0; i < links.length; i++) {\n\t\treplaceLinks(links[i]);\n\t}\n\n\n};\n\nfunction substitute(content, urls, replacements) {\n\turls.forEach(function(url, i){\n\t\tif (url && replacements[i]) {\n\t\t\tcontent = content.replace(new RegExp(url, 'g'), replacements[i]);\n\t\t}\n\t});\n\treturn content;\n}\nmodule.exports = {\n\t'base': base,\n\t'canonical' : canonical,\n\t'links': links,\n\t'substitute': substitute\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/replacements.js\n ** module id = 19\n ** module chunks = 0\n **/","var core = require('./core');\nvar Queue = require('./queue');\nvar EpubCFI = require('./epubcfi');\nvar RSVP = require('rsvp');\n\nfunction Locations(spine, request) {\n\tthis.spine = spine;\n\tthis.request = request;\n\n\tthis.q = new Queue(this);\n\tthis.epubcfi = new EpubCFI();\n\n\tthis._locations = [];\n\tthis.total = 0;\n\n\tthis.break = 150;\n\n\tthis._current = 0;\n\n};\n\n// Load all of sections in the book\nLocations.prototype.generate = function(chars) {\n\n\tif (chars) {\n\t\tthis.break = chars;\n\t}\n\n\tthis.q.pause();\n\n\tthis.spine.each(function(section) {\n\n\t\tthis.q.enqueue(this.process, section);\n\n\t}.bind(this));\n\n\treturn this.q.run().then(function() {\n\t\tthis.total = this._locations.length-1;\n\n\t\tif (this._currentCfi) {\n\t\t\tthis.currentLocation = this._currentCfi;\n\t\t}\n\n\t\treturn this._locations;\n\t\t// console.log(this.precentage(this.book.rendition.location.start), this.precentage(this.book.rendition.location.end));\n\t}.bind(this));\n\n};\n\nLocations.prototype.process = function(section) {\n\n\treturn section.load(this.request)\n\t\t.then(function(contents) {\n\n\t\t\tvar range;\n\t\t\tvar doc = contents.ownerDocument;\n\t\t\tvar counter = 0;\n\n\t\t\tthis.sprint(contents, function(node) {\n\t\t\t\tvar len = node.length;\n\t\t\t\tvar dist;\n\t\t\t\tvar pos = 0;\n\n\t\t\t\t// Start range\n\t\t\t\tif (counter == 0) {\n\t\t\t\t\trange = doc.createRange();\n\t\t\t\t\trange.setStart(node, 0);\n\t\t\t\t}\n\n\t\t\t\tdist = this.break - counter;\n\n\t\t\t\t// Node is smaller than a break\n\t\t\t\tif(dist > len){\n\t\t\t\t\tcounter += len;\n\t\t\t\t\tpos = len;\n\t\t\t\t}\n\n\t\t\t\twhile (pos < len) {\n\t\t\t\t\tcounter = this.break;\n\t\t\t\t\tpos += this.break;\n\n\t\t\t\t\t// Gone over\n\t\t\t\t\tif(pos >= len){\n\t\t\t\t\t\t// Continue counter for next node\n\t\t\t\t\t\tcounter = len - (pos - this.break);\n\n\t\t\t\t\t// At End\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// End the previous range\n\t\t\t\t\t\trange.setEnd(node, pos);\n\t\t\t\t\t\tcfi = section.cfiFromRange(range);\n\t\t\t\t\t\tthis._locations.push(cfi);\n\t\t\t\t\t\tcounter = 0;\n\n\t\t\t\t\t\t// Start new range\n\t\t\t\t\t\tpos += 1;\n\t\t\t\t\t\trange = doc.createRange();\n\t\t\t\t\t\trange.setStart(node, pos);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\n\t\t\t}.bind(this));\n\n\t\t\t// Close remaining\n\t\t\tif (range) {\n\t\t\t\trange.setEnd(prev, prev.length);\n\t\t\t\tcfi = section.cfiFromRange(range);\n\t\t\t\tthis._locations.push(cfi)\n\t\t\t\tcounter = 0;\n\t\t\t}\n\n\t\t}.bind(this));\n\n};\n\nLocations.prototype.sprint = function(root, func) {\n\tvar treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false);\n\n\twhile ((node = treeWalker.nextNode())) {\n\t\tfunc(node);\n\t}\n\n};\n\nLocations.prototype.locationFromCfi = function(cfi){\n\t// Check if the location has not been set yet\n\tif(this._locations.length === 0) {\n\t\treturn -1;\n\t}\n\n\treturn core.locationOf(cfi, this._locations, this.epubcfi.compare);\n};\n\nLocations.prototype.precentageFromCfi = function(cfi) {\n\t// Find closest cfi\n\tvar loc = this.locationFromCfi(cfi);\n\t// Get percentage in total\n\treturn this.precentageFromLocation(loc);\n};\n\nLocations.prototype.percentageFromLocation = function(loc) {\n\tif (!loc || !this.total) {\n\t\treturn 0;\n\t}\n\treturn (loc / this.total);\n};\n\nLocations.prototype.cfiFromLocation = function(loc){\n\tvar cfi = -1;\n\t// check that pg is an int\n\tif(typeof loc != \"number\"){\n\t\tloc = parseInt(pg);\n\t}\n\n\tif(loc >= 0 && loc < this._locations.length) {\n\t\tcfi = this._locations[loc];\n\t}\n\n\treturn cfi;\n};\n\nLocations.prototype.cfiFromPercentage = function(value){\n\tvar percentage = (value > 1) ? value / 100 : value; // Normalize value to 0-1\n\tvar loc = Math.ceil(this.total * percentage);\n\n\treturn this.cfiFromLocation(loc);\n};\n\nLocations.prototype.load = function(locations){\n\tthis._locations = JSON.parse(locations);\n\tthis.total = this._locations.length-1;\n\treturn this._locations;\n};\n\nLocations.prototype.save = function(json){\n\treturn JSON.stringify(this._locations);\n};\n\nLocations.prototype.getCurrent = function(json){\n\treturn this._current;\n};\n\nLocations.prototype.setCurrent = function(curr){\n\tvar loc;\n\n\tif(typeof curr == \"string\"){\n\t\tthis._currentCfi = curr;\n\t} else if (typeof curr == \"number\") {\n\t\tthis._current = curr;\n\t} else {\n\t\treturn;\n\t}\n\n\tif(this._locations.length === 0) {\n\t\treturn;\n\t}\n\n\tif(typeof curr == \"string\"){\n\t\tloc = this.locationFromCfi(curr);\n\t\tthis._current = loc;\n\t} else {\n\t\tloc = curr;\n\t}\n\n\tthis.trigger(\"changed\", {\n\t\tpercentage: this.precentageFromLocation(loc)\n\t});\n};\n\nObject.defineProperty(Locations.prototype, 'currentLocation', {\n\tget: function () {\n\t\treturn this._current;\n\t},\n\tset: function (curr) {\n\t\tthis.setCurrent(curr);\n\t}\n});\n\nRSVP.EventTarget.mixin(Locations.prototype);\n\nmodule.exports = Locations;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/locations.js\n ** module id = 20\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar core = require('./core');\n\nfunction Queue(_context){\n\tthis._q = [];\n\tthis.context = _context;\n\tthis.tick = core.requestAnimationFrame;\n\tthis.running = false;\n\tthis.paused = false;\n};\n\n// Add an item to the queue\nQueue.prototype.enqueue = function() {\n\tvar deferred, promise;\n\tvar queued;\n\tvar task = [].shift.call(arguments);\n\tvar args = arguments;\n\n\t// Handle single args without context\n\t// if(args && !Array.isArray(args)) {\n\t// args = [args];\n\t// }\n\tif(!task) {\n\t\treturn console.error(\"No Task Provided\");\n\t}\n\n\tif(typeof task === \"function\"){\n\n\t\tdeferred = new RSVP.defer();\n\t\tpromise = deferred.promise;\n\n\t\tqueued = {\n\t\t\t\"task\" : task,\n\t\t\t\"args\" : args,\n\t\t\t//\"context\" : context,\n\t\t\t\"deferred\" : deferred,\n\t\t\t\"promise\" : promise\n\t\t};\n\n\t} else {\n\t\t// Task is a promise\n\t\tqueued = {\n\t\t\t\"promise\" : task\n\t\t};\n\n\t}\n\n\tthis._q.push(queued);\n\n\t// Wait to start queue flush\n\tif (this.paused == false && !this.running) {\n\t\t// setTimeout(this.flush.bind(this), 0);\n\t\t// this.tick.call(window, this.run.bind(this));\n\t\tthis.run();\n\t}\n\n\treturn queued.promise;\n};\n\n// Run one item\nQueue.prototype.dequeue = function(){\n\tvar inwait, task, result;\n\n\tif(this._q.length) {\n\t\tinwait = this._q.shift();\n\t\ttask = inwait.task;\n\t\tif(task){\n\t\t\t// console.log(task)\n\n\t\t\tresult = task.apply(this.context, inwait.args);\n\n\t\t\tif(result && typeof result[\"then\"] === \"function\") {\n\t\t\t\t// Task is a function that returns a promise\n\t\t\t\treturn result.then(function(){\n\t\t\t\t\tinwait.deferred.resolve.apply(this.context, arguments);\n\t\t\t\t}.bind(this));\n\t\t\t} else {\n\t\t\t\t// Task resolves immediately\n\t\t\t\tinwait.deferred.resolve.apply(this.context, result);\n\t\t\t\treturn inwait.promise;\n\t\t\t}\n\n\n\n\t\t} else if(inwait.promise) {\n\t\t\t// Task is a promise\n\t\t\treturn inwait.promise;\n\t\t}\n\n\t} else {\n\t\tinwait = new RSVP.defer();\n\t\tinwait.deferred.resolve();\n\t\treturn inwait.promise;\n\t}\n\n};\n\n// Run All Immediately\nQueue.prototype.dump = function(){\n\twhile(this._q.length) {\n\t\tthis.dequeue();\n\t}\n};\n\n// Run all sequentially, at convince\n\nQueue.prototype.run = function(){\n\n\tif(!this.running){\n\t\tthis.running = true;\n\t\tthis.defered = new RSVP.defer();\n\t}\n\n\tthis.tick.call(window, function() {\n\n\t\tif(this._q.length) {\n\n\t\t\tthis.dequeue()\n\t\t\t\t.then(function(){\n\t\t\t\t\tthis.run();\n\t\t\t\t}.bind(this));\n\n\t\t} else {\n\t\t\tthis.defered.resolve();\n\t\t\tthis.running = undefined;\n\t\t}\n\n\t}.bind(this));\n\n\t// Unpause\n\tif(this.paused == true) {\n\t\tthis.paused = false;\n\t}\n\n\treturn this.defered.promise;\n};\n\n// Flush all, as quickly as possible\nQueue.prototype.flush = function(){\n\n\tif(this.running){\n\t\treturn this.running;\n\t}\n\n\tif(this._q.length) {\n\t\tthis.running = this.dequeue()\n\t\t\t.then(function(){\n\t\t\t\tthis.running = undefined;\n\t\t\t\treturn this.flush();\n\t\t\t}.bind(this));\n\n\t\treturn this.running;\n\t}\n\n};\n\n// Clear all items in wait\nQueue.prototype.clear = function(){\n\tthis._q = [];\n\tthis.running = false;\n};\n\nQueue.prototype.length = function(){\n\treturn this._q.length;\n};\n\nQueue.prototype.pause = function(){\n\tthis.paused = true;\n};\n\n// Create a new task from a callback\nfunction Task(task, args, context){\n\n\treturn function(){\n\t\tvar toApply = arguments || [];\n\n\t\treturn new RSVP.Promise(function(resolve, reject) {\n\t\t\tvar callback = function(value){\n\t\t\t\tresolve(value);\n\t\t\t};\n\t\t\t// Add the callback to the arguments list\n\t\t\ttoApply.push(callback);\n\n\t\t\t// Apply all arguments to the functions\n\t\t\ttask.apply(this, toApply);\n\n\t}.bind(this));\n\n\t};\n\n};\n\nmodule.exports = Queue;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/queue.js\n ** module id = 21\n ** module chunks = 0\n **/","var URI = require('urijs');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\n\n\nfunction Parser(){};\n\nParser.prototype.container = function(containerXml){\n\t\t//-- \n\t\tvar rootfile, fullpath, folder, encoding;\n\n\t\tif(!containerXml) {\n\t\t\tconsole.error(\"Container File Not Found\");\n\t\t\treturn;\n\t\t}\n\n\t\trootfile = core.qs(containerXml, \"rootfile\");\n\n\t\tif(!rootfile) {\n\t\t\tconsole.error(\"No RootFile Found\");\n\t\t\treturn;\n\t\t}\n\n\t\tfullpath = rootfile.getAttribute('full-path');\n\t\tfolder = URI(fullpath).directory();\n\t\tencoding = containerXml.xmlEncoding;\n\n\t\t//-- Now that we have the path we can parse the contents\n\t\treturn {\n\t\t\t'packagePath' : fullpath,\n\t\t\t'basePath' : folder,\n\t\t\t'encoding' : encoding\n\t\t};\n};\n\nParser.prototype.identifier = function(packageXml){\n\tvar metadataNode;\n\n\tif(!packageXml) {\n\t\tconsole.error(\"Package File Not Found\");\n\t\treturn;\n\t}\n\n\tmetadataNode = core.qs(packageXml, \"metadata\");\n\n\tif(!metadataNode) {\n\t\tconsole.error(\"No Metadata Found\");\n\t\treturn;\n\t}\n\n\treturn this.getElementText(metadataNode, \"identifier\");\n};\n\nParser.prototype.packageContents = function(packageXml){\n\tvar parse = this;\n\tvar metadataNode, manifestNode, spineNode;\n\tvar manifest, navPath, ncxPath, coverPath;\n\tvar spineNodeIndex;\n\tvar spine;\n\tvar spineIndexByURL;\n\tvar metadata;\n\n\tif(!packageXml) {\n\t\tconsole.error(\"Package File Not Found\");\n\t\treturn;\n\t}\n\n\tmetadataNode = core.qs(packageXml, \"metadata\");\n\tif(!metadataNode) {\n\t\tconsole.error(\"No Metadata Found\");\n\t\treturn;\n\t}\n\n\tmanifestNode = core.qs(packageXml, \"manifest\");\n\tif(!manifestNode) {\n\t\tconsole.error(\"No Manifest Found\");\n\t\treturn;\n\t}\n\n\tspineNode = core.qs(packageXml, \"spine\");\n\tif(!spineNode) {\n\t\tconsole.error(\"No Spine Found\");\n\t\treturn;\n\t}\n\n\tmanifest = parse.manifest(manifestNode);\n\tnavPath = parse.findNavPath(manifestNode);\n\tncxPath = parse.findNcxPath(manifestNode, spineNode);\n\tcoverPath = parse.findCoverPath(packageXml);\n\n\tspineNodeIndex = Array.prototype.indexOf.call(spineNode.parentNode.childNodes, spineNode);\n\n\tspine = parse.spine(spineNode, manifest);\n\n\tmetadata = parse.metadata(metadataNode);\n\n\tmetadata.direction = spineNode.getAttribute(\"page-progression-direction\");\n\n\treturn {\n\t\t'metadata' : metadata,\n\t\t'spine' : spine,\n\t\t'manifest' : manifest,\n\t\t'navPath' : navPath,\n\t\t'ncxPath' : ncxPath,\n\t\t'coverPath': coverPath,\n\t\t'spineNodeIndex' : spineNodeIndex\n\t};\n};\n\n//-- Find TOC NAV\nParser.prototype.findNavPath = function(manifestNode){\n\t// Find item with property 'nav'\n\t// Should catch nav irregardless of order\n\t// var node = manifestNode.querySelector(\"item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']\");\n\tvar node = core.qsp(manifestNode, \"item\", {\"properties\":\"nav\"});\n\treturn node ? node.getAttribute('href') : false;\n};\n\n//-- Find TOC NCX: media-type=\"application/x-dtbncx+xml\" href=\"toc.ncx\"\nParser.prototype.findNcxPath = function(manifestNode, spineNode){\n\t// var node = manifestNode.querySelector(\"item[media-type='application/x-dtbncx+xml']\");\n\tvar node = core.qsp(manifestNode, \"item\", {\"media-type\":\"application/x-dtbncx+xml\"});\n\tvar tocId;\n\n\t// If we can't find the toc by media-type then try to look for id of the item in the spine attributes as\n\t// according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2,\n\t// \"The item that describes the NCX must be referenced by the spine toc attribute.\"\n\tif (!node) {\n\t\ttocId = spineNode.getAttribute(\"toc\");\n\t\tif(tocId) {\n\t\t\t// node = manifestNode.querySelector(\"item[id='\" + tocId + \"']\");\n\t\t\tnode = manifestNode.getElementById(tocId);\n\t\t}\n\t}\n\n\treturn node ? node.getAttribute('href') : false;\n};\n\n//-- Expanded to match Readium web components\nParser.prototype.metadata = function(xml){\n\tvar metadata = {},\n\t\t\tp = this;\n\n\tmetadata.title = p.getElementText(xml, 'title');\n\tmetadata.creator = p.getElementText(xml, 'creator');\n\tmetadata.description = p.getElementText(xml, 'description');\n\n\tmetadata.pubdate = p.getElementText(xml, 'date');\n\n\tmetadata.publisher = p.getElementText(xml, 'publisher');\n\n\tmetadata.identifier = p.getElementText(xml, \"identifier\");\n\tmetadata.language = p.getElementText(xml, \"language\");\n\tmetadata.rights = p.getElementText(xml, \"rights\");\n\n\tmetadata.modified_date = p.getPropertyText(xml, 'dcterms:modified');\n\n\tmetadata.layout = p.getPropertyText(xml, \"rendition:layout\");\n\tmetadata.orientation = p.getPropertyText(xml, 'rendition:orientation');\n\tmetadata.flow = p.getPropertyText(xml, 'rendition:flow');\n\tmetadata.viewport = p.getPropertyText(xml, 'rendition:viewport');\n\t// metadata.page_prog_dir = packageXml.querySelector(\"spine\").getAttribute(\"page-progression-direction\");\n\n\treturn metadata;\n};\n\n//-- Find Cover: \n//-- Fallback for Epub 2.0\nParser.prototype.findCoverPath = function(packageXml){\n\tvar pkg = core.qs(packageXml, \"package\");\n\tvar epubVersion = pkg.getAttribute('version');\n\n\tif (epubVersion === '2.0') {\n\t\tvar metaCover = core.qsp(packageXml, 'meta', {'name':'cover'});\n\t\tif (metaCover) {\n\t\t\tvar coverId = metaCover.getAttribute('content');\n\t\t\t// var cover = packageXml.querySelector(\"item[id='\" + coverId + \"']\");\n\t\t\tvar cover = packageXml.getElementById(coverId);\n\t\t\treturn cover ? cover.getAttribute('href') : false;\n\t\t}\n\t\telse {\n\t\t\treturn false;\n\t\t}\n\t}\n\telse {\n\t\t// var node = packageXml.querySelector(\"item[properties='cover-image']\");\n\t\tvar node = core.qsp(packageXml, 'item', {'properties':'cover-image'});\n\t\treturn node ? node.getAttribute('href') : false;\n\t}\n};\n\nParser.prototype.getElementText = function(xml, tag){\n\tvar found = xml.getElementsByTagNameNS(\"http://purl.org/dc/elements/1.1/\", tag),\n\t\tel;\n\n\tif(!found || found.length === 0) return '';\n\n\tel = found[0];\n\n\tif(el.childNodes.length){\n\t\treturn el.childNodes[0].nodeValue;\n\t}\n\n\treturn '';\n\n};\n\nParser.prototype.getPropertyText = function(xml, property){\n\tvar el = core.qsp(xml, \"meta\", {\"property\":property});\n\n\tif(el && el.childNodes.length){\n\t\treturn el.childNodes[0].nodeValue;\n\t}\n\n\treturn '';\n};\n\nParser.prototype.querySelectorText = function(xml, q){\n\tvar el = xml.querySelector(q);\n\n\tif(el && el.childNodes.length){\n\t\treturn el.childNodes[0].nodeValue;\n\t}\n\n\treturn '';\n};\n\nParser.prototype.manifest = function(manifestXml){\n\tvar manifest = {};\n\n\t//-- Turn items into an array\n\t// var selected = manifestXml.querySelectorAll(\"item\");\n\tvar selected = core.qsa(manifestXml, \"item\");\n\tvar items = Array.prototype.slice.call(selected);\n\n\t//-- Create an object with the id as key\n\titems.forEach(function(item){\n\t\tvar id = item.getAttribute('id'),\n\t\t\t\thref = item.getAttribute('href') || '',\n\t\t\t\ttype = item.getAttribute('media-type') || '',\n\t\t\t\tproperties = item.getAttribute('properties') || '';\n\n\t\tmanifest[id] = {\n\t\t\t'href' : href,\n\t\t\t// 'url' : href,\n\t\t\t'type' : type,\n\t\t\t'properties' : properties.length ? properties.split(' ') : []\n\t\t};\n\n\t});\n\n\treturn manifest;\n\n};\n\nParser.prototype.spine = function(spineXml, manifest){\n\tvar spine = [];\n\n\tvar selected = spineXml.getElementsByTagName(\"itemref\"),\n\t\t\titems = Array.prototype.slice.call(selected);\n\n\tvar epubcfi = new EpubCFI();\n\n\t//-- Add to array to mantain ordering and cross reference with manifest\n\titems.forEach(function(item, index){\n\t\tvar idref = item.getAttribute('idref');\n\t\t// var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id);\n\t\tvar props = item.getAttribute('properties') || '';\n\t\tvar propArray = props.length ? props.split(' ') : [];\n\t\t// var manifestProps = manifest[Id].properties;\n\t\t// var manifestPropArray = manifestProps.length ? manifestProps.split(' ') : [];\n\n\t\tvar itemref = {\n\t\t\t'idref' : idref,\n\t\t\t'linear' : item.getAttribute('linear') || '',\n\t\t\t'properties' : propArray,\n\t\t\t// 'href' : manifest[Id].href,\n\t\t\t// 'url' : manifest[Id].url,\n\t\t\t'index' : index\n\t\t\t// 'cfiBase' : cfiBase\n\t\t};\n\t\tspine.push(itemref);\n\t});\n\n\treturn spine;\n};\n\nParser.prototype.querySelectorByType = function(html, element, type){\n\tvar query;\n\tif (typeof html.querySelector != \"undefined\") {\n\t\tquery = html.querySelector(element+'[*|type=\"'+type+'\"]');\n\t}\n\t// Handle IE not supporting namespaced epub:type in querySelector\n\tif(!query || query.length === 0) {\n\t\tquery = core.qsa(html, element);\n\t\tfor (var i = 0; i < query.length; i++) {\n\t\t\tif(query[i].getAttributeNS(\"http://www.idpf.org/2007/ops\", \"type\") === type) {\n\t\t\t\treturn query[i];\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn query;\n\t}\n};\n\nParser.prototype.nav = function(navHtml, spineIndexByURL, bookSpine){\n\tvar navElement = this.querySelectorByType(navHtml, \"nav\", \"toc\");\n\t// var navItems = navElement ? navElement.querySelectorAll(\"ol li\") : [];\n\tvar navItems = navElement ? core.qsa(navElement, \"li\") : [];\n\tvar length = navItems.length;\n\tvar i;\n\tvar toc = {};\n\tvar list = [];\n\tvar item, parent;\n\n\tif(!navItems || length === 0) return list;\n\n\tfor (i = 0; i < length; ++i) {\n\t\titem = this.navItem(navItems[i], spineIndexByURL, bookSpine);\n\t\ttoc[item.id] = item;\n\t\tif(!item.parent) {\n\t\t\tlist.push(item);\n\t\t} else {\n\t\t\tparent = toc[item.parent];\n\t\t\tparent.subitems.push(item);\n\t\t}\n\t}\n\n\treturn list;\n};\n\nParser.prototype.navItem = function(item, spineIndexByURL, bookSpine){\n\tvar id = item.getAttribute('id') || false,\n\t\t\t// content = item.querySelector(\"a, span\"),\n\t\t\tcontent = core.qs(item, \"a\"),\n\t\t\tsrc = content.getAttribute('href') || '',\n\t\t\ttext = content.textContent || \"\",\n\t\t\t// split = src.split(\"#\"),\n\t\t\t// baseUrl = split[0],\n\t\t\t// spinePos = spineIndexByURL[baseUrl],\n\t\t\t// spineItem = bookSpine[spinePos],\n\t\t\tsubitems = [],\n\t\t\tparentNode = item.parentNode,\n\t\t\tparent;\n\t\t\t// cfi = spineItem ? spineItem.cfi : '';\n\n\tif(parentNode && parentNode.nodeName === \"navPoint\") {\n\t\tparent = parentNode.getAttribute('id');\n\t}\n\n\t/*\n\tif(!id) {\n\t\tif(spinePos) {\n\t\t\tspineItem = bookSpine[spinePos];\n\t\t\tid = spineItem.id;\n\t\t\tcfi = spineItem.cfi;\n\t\t} else {\n\t\t\tid = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid();\n\t\t\titem.setAttribute('id', id);\n\t\t}\n\t}\n\t*/\n\n\treturn {\n\t\t\"id\": id,\n\t\t\"href\": src,\n\t\t\"label\": text,\n\t\t\"subitems\" : subitems,\n\t\t\"parent\" : parent\n\t};\n};\n\nParser.prototype.ncx = function(tocXml, spineIndexByURL, bookSpine){\n\t// var navPoints = tocXml.querySelectorAll(\"navMap navPoint\");\n\tvar navPoints = core.qsa(tocXml, \"navPoint\");\n\tvar length = navPoints.length;\n\tvar i;\n\tvar toc = {};\n\tvar list = [];\n\tvar item, parent;\n\n\tif(!navPoints || length === 0) return list;\n\n\tfor (i = 0; i < length; ++i) {\n\t\titem = this.ncxItem(navPoints[i], spineIndexByURL, bookSpine);\n\t\ttoc[item.id] = item;\n\t\tif(!item.parent) {\n\t\t\tlist.push(item);\n\t\t} else {\n\t\t\tparent = toc[item.parent];\n\t\t\tparent.subitems.push(item);\n\t\t}\n\t}\n\n\treturn list;\n};\n\nParser.prototype.ncxItem = function(item, spineIndexByURL, bookSpine){\n\tvar id = item.getAttribute('id') || false,\n\t\t\t// content = item.querySelector(\"content\"),\n\t\t\tcontent = core.qs(item, \"content\"),\n\t\t\tsrc = content.getAttribute('src'),\n\t\t\t// navLabel = item.querySelector(\"navLabel\"),\n\t\t\tnavLabel = core.qs(item, \"navLabel\"),\n\t\t\ttext = navLabel.textContent ? navLabel.textContent : \"\",\n\t\t\t// split = src.split(\"#\"),\n\t\t\t// baseUrl = split[0],\n\t\t\t// spinePos = spineIndexByURL[baseUrl],\n\t\t\t// spineItem = bookSpine[spinePos],\n\t\t\tsubitems = [],\n\t\t\tparentNode = item.parentNode,\n\t\t\tparent;\n\t\t\t// cfi = spineItem ? spineItem.cfi : '';\n\n\tif(parentNode && parentNode.nodeName === \"navPoint\") {\n\t\tparent = parentNode.getAttribute('id');\n\t}\n\n\t/*\n\tif(!id) {\n\t\tif(spinePos) {\n\t\t\tspineItem = bookSpine[spinePos];\n\t\t\tid = spineItem.id;\n\t\t\tcfi = spineItem.cfi;\n\t\t} else {\n\t\t\tid = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid();\n\t\t\titem.setAttribute('id', id);\n\t\t}\n\t}\n\t*/\n\n\treturn {\n\t\t\"id\": id,\n\t\t\"href\": src,\n\t\t\"label\": text,\n\t\t\"subitems\" : subitems,\n\t\t\"parent\" : parent\n\t};\n};\n\nParser.prototype.pageList = function(navHtml, spineIndexByURL, bookSpine){\n\tvar navElement = this.querySelectorByType(navHtml, \"nav\", \"page-list\");\n\t// var navItems = navElement ? navElement.querySelectorAll(\"ol li\") : [];\n\tvar navItems = navElement ? core.qsa(navElement, \"li\") : [];\n\tvar length = navItems.length;\n\tvar i;\n\tvar toc = {};\n\tvar list = [];\n\tvar item;\n\n\tif(!navItems || length === 0) return list;\n\n\tfor (i = 0; i < length; ++i) {\n\t\titem = this.pageListItem(navItems[i], spineIndexByURL, bookSpine);\n\t\tlist.push(item);\n\t}\n\n\treturn list;\n};\n\nParser.prototype.pageListItem = function(item, spineIndexByURL, bookSpine){\n\tvar id = item.getAttribute('id') || false,\n\t\t// content = item.querySelector(\"a\"),\n\t\tcontent = core.qs(item, \"a\"),\n\t\thref = content.getAttribute('href') || '',\n\t\ttext = content.textContent || \"\",\n\t\tpage = parseInt(text),\n\t\tisCfi = href.indexOf(\"epubcfi\"),\n\t\tsplit,\n\t\tpackageUrl,\n\t\tcfi;\n\n\tif(isCfi != -1) {\n\t\tsplit = href.split(\"#\");\n\t\tpackageUrl = split[0];\n\t\tcfi = split.length > 1 ? split[1] : false;\n\t\treturn {\n\t\t\t\"cfi\" : cfi,\n\t\t\t\"href\" : href,\n\t\t\t\"packageUrl\" : packageUrl,\n\t\t\t\"page\" : page\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\t\"href\" : href,\n\t\t\t\"page\" : page\n\t\t};\n\t}\n};\n\nmodule.exports = Parser;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/parser.js\n ** module id = 22\n ** module chunks = 0\n **/","var core = require('./core');\nvar Parser = require('./parser');\nvar RSVP = require('rsvp');\nvar URI = require('urijs');\n\nfunction Navigation(_package, _request){\n\tvar navigation = this;\n\tvar parse = new Parser();\n\tvar request = _request || require('./request');\n\n\tthis.package = _package;\n\tthis.toc = [];\n\tthis.tocByHref = {};\n\tthis.tocById = {};\n\n\tif(_package.navPath) {\n\t\tthis.navUrl = URI(_package.navPath).absoluteTo(_package.baseUrl).toString();\n\t\tthis.nav = {};\n\n\t\tthis.nav.load = function(_request){\n\t\t\tvar loading = new RSVP.defer();\n\t\t\tvar loaded = loading.promise;\n\n\t\t\trequest(navigation.navUrl, 'xml').then(function(xml){\n\t\t\t\tnavigation.toc = parse.nav(xml);\n\t\t\t\tnavigation.loaded(navigation.toc);\n\t\t\t\tloading.resolve(navigation.toc);\n\t\t\t});\n\n\t\t\treturn loaded;\n\t\t};\n\n\t}\n\n\tif(_package.ncxPath) {\n\t\tthis.ncxUrl = URI(_package.ncxPath).absoluteTo(_package.baseUrl).toString();\n\t\tthis.ncx = {};\n\n\t\tthis.ncx.load = function(_request){\n\t\t\tvar loading = new RSVP.defer();\n\t\t\tvar loaded = loading.promise;\n\n\t\t\trequest(navigation.ncxUrl, 'xml').then(function(xml){\n\t\t\t\tnavigation.toc = parse.toc(xml);\n\t\t\t\tnavigation.loaded(navigation.toc);\n\t\t\t\tloading.resolve(navigation.toc);\n\t\t\t});\n\n\t\t\treturn loaded;\n\t\t};\n\n\t}\n};\n\n// Load the navigation\nNavigation.prototype.load = function(_request) {\n\tvar request = _request || require('./request');\n\tvar loading, loaded;\n\n\tif(this.nav) {\n\t\tloading = this.nav.load();\n\t} else if(this.ncx) {\n\t\tloading = this.ncx.load();\n\t} else {\n\t\tloaded = new RSVP.defer();\n\t\tloaded.resolve([]);\n\t\tloading = loaded.promise;\n\t}\n\n\treturn loading;\n\n};\n\nNavigation.prototype.loaded = function(toc) {\n\tvar item;\n\n\tfor (var i = 0; i < toc.length; i++) {\n\t\titem = toc[i];\n\t\tthis.tocByHref[item.href] = i;\n\t\tthis.tocById[item.id] = i;\n\t}\n\n};\n\n// Get an item from the navigation\nNavigation.prototype.get = function(target) {\n\tvar index;\n\n\tif(!target) {\n\t\treturn this.toc;\n\t}\n\n\tif(target.indexOf(\"#\") === 0) {\n\t\tindex = this.tocById[target.substring(1)];\n\t} else if(target in this.tocByHref){\n\t\tindex = this.tocByHref[target];\n\t}\n\n\treturn this.toc[index];\n};\n\nmodule.exports = Navigation;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/navigation.js\n ** module id = 23\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar replace = require('./replacements');\nvar Hook = require('./hook');\nvar EpubCFI = require('./epubcfi');\nvar Queue = require('./queue');\nvar Layout = require('./layout');\nvar Mapping = require('./mapping');\n\nfunction Rendition(book, options) {\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\twidth: null,\n\t\theight: null,\n\t\tignoreClass: '',\n\t\tmanager: \"single\",\n\t\tview: \"iframe\",\n\t\tflow: null,\n\t\tlayout: null,\n\t\tspread: null,\n\t\tminSpreadWidth: 800, //-- overridden by spread: none (never) / both (always),\n\t\tuseBase64: true\n\t});\n\n\tcore.extend(this.settings, options);\n\n\tthis.viewSettings = {\n\t\tignoreClass: this.settings.ignoreClass\n\t};\n\n\tthis.book = book;\n\n\tthis.views = null;\n\n\t//-- Adds Hook methods to the Rendition prototype\n\tthis.hooks = {};\n\tthis.hooks.display = new Hook(this);\n\tthis.hooks.serialize = new Hook(this);\n\tthis.hooks.content = new Hook(this);\n\tthis.hooks.layout = new Hook(this);\n\tthis.hooks.render = new Hook(this);\n\tthis.hooks.show = new Hook(this);\n\n\tthis.hooks.content.register(replace.links.bind(this));\n\tthis.hooks.content.register(this.passViewEvents.bind(this));\n\n\t// this.hooks.display.register(this.afterDisplay.bind(this));\n\n\tthis.epubcfi = new EpubCFI();\n\n\tthis.q = new Queue(this);\n\n\tthis.q.enqueue(this.book.opened);\n\n\t// Block the queue until rendering is started\n\t// this.starting = new RSVP.defer();\n\t// this.started = this.starting.promise;\n\tthis.q.enqueue(this.start);\n\n\tif(this.book.unarchived) {\n\t\tthis.q.enqueue(this.replacements.bind(this));\n\t}\n\n};\n\nRendition.prototype.setManager = function(manager) {\n\tthis.manager = manager;\n};\n\nRendition.prototype.requireManager = function(manager) {\n\tvar viewManager;\n\n\t// If manager is a string, try to load from register managers,\n\t// or require included managers directly\n\tif (typeof manager === \"string\") {\n\t\t// Use global or require\n\t\tviewManager = typeof ePub != \"undefined\" ? ePub.ViewManagers[manager] : undefined; //require('./managers/'+manager);\n\t} else {\n\t\t// otherwise, assume we were passed a function\n\t\tviewManager = manager\n\t}\n\n\treturn viewManager;\n};\n\nRendition.prototype.requireView = function(view) {\n\tvar View;\n\n\tif (typeof view == \"string\") {\n\t\tView = typeof ePub != \"undefined\" ? ePub.Views[view] : undefined; //require('./views/'+view);\n\t} else {\n\t\t// otherwise, assume we were passed a function\n\t\tView = view\n\t}\n\n\treturn View;\n};\n\nRendition.prototype.start = function(){\n\n\tif(!this.manager) {\n\t\tthis.ViewManager = this.requireManager(this.settings.manager);\n\t\tthis.View = this.requireView(this.settings.view);\n\n\t\tthis.manager = new this.ViewManager({\n\t\t\tview: this.View,\n\t\t\tqueue: this.q,\n\t\t\trequest: this.book.request,\n\t\t\tsettings: this.settings\n\t\t});\n\t}\n\n\t// Parse metadata to get layout props\n\tthis.settings.globalLayoutProperties = this.determineLayoutProperties(this.book.package.metadata);\n\n\tthis.flow(this.settings.globalLayoutProperties.flow);\n\n\tthis.layout(this.settings.globalLayoutProperties);\n\n\t// Listen for displayed views\n\tthis.manager.on(\"added\", this.afterDisplayed.bind(this));\n\n\t// Listen for resizing\n\tthis.manager.on(\"resized\", this.onResized.bind(this));\n\n\t// Listen for scroll changes\n\tthis.manager.on(\"scroll\", this.reportLocation.bind(this));\n\n\n\tthis.on('displayed', this.reportLocation.bind(this));\n\n\t// Trigger that rendering has started\n\tthis.trigger(\"started\");\n\n\t// Start processing queue\n\t// this.starting.resolve();\n};\n\n// Call to attach the container to an element in the dom\n// Container must be attached before rendering can begin\nRendition.prototype.attachTo = function(element){\n\n\treturn this.q.enqueue(function () {\n\n\t\t// Start rendering\n\t\tthis.manager.render(element, {\n\t\t\t\"width\" : this.settings.width,\n\t\t\t\"height\" : this.settings.height\n\t\t});\n\n\t\t// Trigger Attached\n\t\tthis.trigger(\"attached\");\n\n\t}.bind(this));\n\n};\n\nRendition.prototype.display = function(target){\n\n\t// if (!this.book.spine.spineItems.length > 0) {\n\t\t// Book isn't open yet\n\t\t// return this.q.enqueue(this.display, target);\n\t// }\n\n\treturn this.q.enqueue(this._display, target);\n\n};\n\nRendition.prototype._display = function(target){\n\tvar isCfiString = this.epubcfi.isCfiString(target);\n\tvar displaying = new RSVP.defer();\n\tvar displayed = displaying.promise;\n\tvar section;\n\tvar moveTo;\n\n\tsection = this.book.spine.get(target);\n\n\tif(!section){\n\t\tdisplaying.reject(new Error(\"No Section Found\"));\n\t\treturn displayed;\n\t}\n\n\t// Trim the target fragment\n\t// removing the chapter\n\tif(!isCfiString && typeof target === \"string\" &&\n\t\ttarget.indexOf(\"#\") > -1) {\n\t\t\tmoveTo = target.substring(target.indexOf(\"#\")+1);\n\t}\n\n\tif (isCfiString) {\n\t\tmoveTo = target;\n\t}\n\n\treturn this.manager.display(section, moveTo)\n\t\t.then(function(){\n\t\t\tthis.trigger(\"displayed\", section);\n\t\t}.bind(this));\n\n};\n\n/*\nRendition.prototype.render = function(view, show) {\n\n\t// view.onLayout = this.layout.format.bind(this.layout);\n\tview.create();\n\n\t// Fit to size of the container, apply padding\n\tthis.manager.resizeView(view);\n\n\t// Render Chain\n\treturn view.section.render(this.book.request)\n\t\t.then(function(contents){\n\t\t\treturn view.load(contents);\n\t\t}.bind(this))\n\t\t.then(function(doc){\n\t\t\treturn this.hooks.content.trigger(view, this);\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\tthis.layout.format(view.contents);\n\t\t\treturn this.hooks.layout.trigger(view, this);\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\treturn view.display();\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\treturn this.hooks.render.trigger(view, this);\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\tif(show !== false) {\n\t\t\t\tthis.q.enqueue(function(view){\n\t\t\t\t\tview.show();\n\t\t\t\t}, view);\n\t\t\t}\n\t\t\t// this.map = new Map(view, this.layout);\n\t\t\tthis.hooks.show.trigger(view, this);\n\t\t\tthis.trigger(\"rendered\", view.section);\n\n\t\t}.bind(this))\n\t\t.catch(function(e){\n\t\t\tthis.trigger(\"loaderror\", e);\n\t\t}.bind(this));\n\n};\n*/\n\nRendition.prototype.afterDisplayed = function(view){\n\tthis.hooks.content.trigger(view, this);\n\tthis.trigger(\"rendered\", view.section);\n\tthis.reportLocation();\n};\n\nRendition.prototype.onResized = function(size){\n\n\tif(this.location) {\n\t\tthis.display(this.location.start);\n\t}\n\n\tthis.trigger(\"resized\", {\n\t\twidth: size.width,\n\t\theight: size.height\n\t});\n\n};\n\nRendition.prototype.moveTo = function(offset){\n\tthis.manager.moveTo(offset);\n};\n\nRendition.prototype.next = function(){\n\treturn this.q.enqueue(this.manager.next.bind(this.manager))\n\t\t.then(this.reportLocation.bind(this));\n};\n\nRendition.prototype.prev = function(){\n\treturn this.q.enqueue(this.manager.prev.bind(this.manager))\n\t\t.then(this.reportLocation.bind(this));\n};\n\n//-- http://www.idpf.org/epub/301/spec/epub-publications.html#meta-properties-rendering\nRendition.prototype.determineLayoutProperties = function(metadata){\n\tvar settings;\n\tvar layout = this.settings.layout || metadata.layout || \"reflowable\";\n\tvar spread = this.settings.spread || metadata.spread || \"auto\";\n\tvar orientation = this.settings.orientation || metadata.orientation || \"auto\";\n\tvar flow = this.settings.flow || metadata.flow || \"auto\";\n\tvar viewport = metadata.viewport || \"\";\n\tvar minSpreadWidth = this.settings.minSpreadWidth || metadata.minSpreadWidth || 800;\n\n\tif (this.settings.width >= 0 && this.settings.height >= 0) {\n\t\tviewport = \"width=\"+this.settings.width+\", height=\"+this.settings.height+\"\";\n\t}\n\n\tsettings = {\n\t\tlayout : layout,\n\t\tspread : spread,\n\t\torientation : orientation,\n\t\tflow : flow,\n\t\tviewport : viewport,\n\t\tminSpreadWidth : minSpreadWidth\n\t};\n\n\treturn settings;\n};\n\n// Rendition.prototype.applyLayoutProperties = function(){\n// \tvar settings = this.determineLayoutProperties(this.book.package.metadata);\n//\n// \tthis.flow(settings.flow);\n//\n// \tthis.layout(settings);\n// };\n\n// paginated | scrolled\n// (scrolled-continuous vs scrolled-doc are handled by different view managers)\nRendition.prototype.flow = function(_flow){\n\tvar flow;\n\tif (_flow === \"scrolled-doc\" || _flow === \"scrolled-continuous\") {\n\t\tflow = \"scrolled\";\n\t}\n\n\tif (_flow === \"auto\" || _flow === \"paginated\") {\n\t\tflow = \"paginated\";\n\t}\n\n\tif (this._layout) {\n\t\tthis._layout.flow(flow);\n\t}\n\n\tif (this.manager) {\n\t\tthis.manager.updateFlow(flow);\n\t}\n};\n\n// reflowable | pre-paginated\nRendition.prototype.layout = function(settings){\n\tif (settings) {\n\t\tthis._layout = new Layout(settings);\n\t\tthis._layout.spread(settings.spread, this.settings.minSpreadWidth);\n\n\t\tthis.mapping = new Mapping(this._layout);\n\t}\n\n\tif (this.manager && this._layout) {\n\t\tthis.manager.applyLayout(this._layout);\n\t}\n\n\treturn this._layout;\n};\n\n// none | auto (TODO: implement landscape, portrait, both)\nRendition.prototype.spread = function(spread, min){\n\n\tthis._layout.spread(spread, min);\n\n\tif (this.manager.isRendered()) {\n\t\tthis.manager.updateLayout();\n\t}\n};\n\n\nRendition.prototype.reportLocation = function(){\n\treturn this.q.enqueue(function(){\n\t\tvar location = this.manager.currentLocation();\n\t\tif (location && location.then && typeof location.then === 'function') {\n\t\t\tlocation.then(function(result) {\n\t\t\t\tthis.location = result;\n\t\t\t\tthis.trigger(\"locationChanged\", this.location);\n\t\t\t}.bind(this));\n\t\t} else if (location) {\n\t\t\tthis.location = location;\n\t\t\tthis.trigger(\"locationChanged\", this.location);\n\t\t}\n\n\t}.bind(this));\n};\n\n\nRendition.prototype.destroy = function(){\n\t// Clear the queue\n\tthis.q.clear();\n\n\tthis.manager.destroy();\n};\n\nRendition.prototype.passViewEvents = function(view){\n\tview.contents.listenedEvents.forEach(function(e){\n\t\tview.on(e, this.triggerViewEvent.bind(this));\n\t}.bind(this));\n\n\tview.on(\"selected\", this.triggerSelectedEvent.bind(this));\n};\n\nRendition.prototype.triggerViewEvent = function(e){\n\tthis.trigger(e.type, e);\n};\n\nRendition.prototype.triggerSelectedEvent = function(cfirange){\n\tthis.trigger(\"selected\", cfirange);\n};\n\nRendition.prototype.replacements = function(){\n\t// Wait for loading\n\t// return this.q.enqueue(function () {\n\t\t// Get thes books manifest\n\t\tvar manifest = this.book.package.manifest;\n\t\tvar manifestArray = Object.keys(manifest).\n\t\t\tmap(function (key){\n\t\t\t\treturn manifest[key];\n\t\t\t});\n\n\t\t// Exclude HTML\n\t\tvar items = manifestArray.\n\t\t\tfilter(function (item){\n\t\t\t\tif (item.type != \"application/xhtml+xml\" &&\n\t\t\t\t\t\titem.type != \"text/html\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Only CSS\n\t\tvar css = items.\n\t\t\tfilter(function (item){\n\t\t\t\tif (item.type === \"text/css\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t// Css Urls\n\t\tvar cssUrls = css.map(function(item) {\n\t\t\treturn item.href;\n\t\t});\n\n\t\t// All Assets Urls\n\t\tvar urls = items.\n\t\t\tmap(function(item) {\n\t\t\t\treturn item.href;\n\t\t\t}.bind(this));\n\n\t\t// Create blob urls for all the assets\n\t\tvar processing = urls.\n\t\t\tmap(function(url) {\n\t\t\t\tvar absolute = URI(url).absoluteTo(this.book.baseUrl).toString();\n\t\t\t\t// Full url from archive base\n\t\t\t\treturn this.book.unarchived.createUrl(absolute, {\"base64\": this.settings.useBase64});\n\t\t\t}.bind(this));\n\n\t\tvar replacementUrls;\n\n\t\t// After all the urls are created\n\t\treturn RSVP.all(processing)\n\t\t\t.then(function(_replacementUrls) {\n\t\t\t\tvar replaced = [];\n\n\t\t\t\treplacementUrls = _replacementUrls;\n\n\t\t\t\t// Replace Asset Urls in the text of all css files\n\t\t\t\tcssUrls.forEach(function(href) {\n\t\t\t\t\treplaced.push(this.replaceCss(href, urls, replacementUrls));\n\t\t\t\t}.bind(this));\n\n\t\t\t\treturn RSVP.all(replaced);\n\n\t\t\t}.bind(this))\n\t\t\t.then(function () {\n\t\t\t\t// Replace Asset Urls in chapters\n\t\t\t\t// by registering a hook after the sections contents has been serialized\n\t\t\t\tthis.book.spine.hooks.serialize.register(function(output, section) {\n\n\t\t\t\t\tthis.replaceAssets(section, urls, replacementUrls);\n\n\t\t\t\t}.bind(this));\n\n\t\t\t}.bind(this))\n\t\t\t.catch(function(reason){\n\t\t\t\tconsole.error(reason);\n\t\t\t});\n\t// }.bind(this));\n};\n\nRendition.prototype.replaceCss = function(href, urls, replacementUrls){\n\t\tvar newUrl;\n\t\tvar indexInUrls;\n\n\t\t// Find the absolute url of the css file\n\t\tvar fileUri = URI(href);\n\t\tvar absolute = fileUri.absoluteTo(this.book.baseUrl).toString();\n\t\t// Get the text of the css file from the archive\n\t\tvar textResponse = this.book.unarchived.getText(absolute);\n\t\t// Get asset links relative to css file\n\t\tvar relUrls = urls.\n\t\t\tmap(function(assetHref) {\n\t\t\t\tvar assetUri = URI(assetHref).absoluteTo(this.book.baseUrl);\n\t\t\t\tvar relative = assetUri.relativeTo(absolute).toString();\n\t\t\t\treturn relative;\n\t\t\t}.bind(this));\n\n\t\treturn textResponse.then(function (text) {\n\t\t\t// Replacements in the css text\n\t\t\ttext = replace.substitute(text, relUrls, replacementUrls);\n\n\t\t\t// Get the new url\n\t\t\tif (this.settings.useBase64) {\n\t\t\t\tnewUrl = core.createBase64Url(text, 'text/css');\n\t\t\t} else {\n\t\t\t\tnewUrl = core.createBlobUrl(text, 'text/css');\n\t\t\t}\n\n\t\t\t// switch the url in the replacementUrls\n\t\t\tindexInUrls = urls.indexOf(href);\n\t\t\tif (indexInUrls > -1) {\n\t\t\t\treplacementUrls[indexInUrls] = newUrl;\n\t\t\t}\n\n\t\t\treturn new RSVP.Promise(function(resolve, reject){\n\t\t\t\tresolve(urls, replacementUrls);\n\t\t\t});\n\n\t\t}.bind(this));\n\n};\n\nRendition.prototype.replaceAssets = function(section, urls, replacementUrls){\n\tvar fileUri = URI(section.url);\n\t// Get Urls relative to current sections\n\tvar relUrls = urls.\n\t\tmap(function(href) {\n\t\t\tvar assetUri = URI(href).absoluteTo(this.book.baseUrl);\n\t\t\tvar relative = assetUri.relativeTo(fileUri).toString();\n\t\t\treturn relative;\n\t\t}.bind(this));\n\n\n\tsection.output = replace.substitute(section.output, relUrls, replacementUrls);\n};\n\nRendition.prototype.range = function(_cfi, ignoreClass){\n\tvar cfi = new EpubCFI(_cfi);\n\tvar found = this.visible().filter(function (view) {\n\t\tif(cfi.spinePos === view.index) return true;\n\t});\n\n\t// Should only every return 1 item\n\tif (found.length) {\n\t\treturn found[0].range(cfi, ignoreClass);\n\t}\n};\n\nRendition.prototype.adjustImages = function(view) {\n\n\tview.addStylesheetRules([\n\t\t\t[\"img\",\n\t\t\t\t[\"max-width\", (view.layout.spreadWidth) + \"px\"],\n\t\t\t\t[\"max-height\", (view.layout.height) + \"px\"]\n\t\t\t]\n\t]);\n\treturn new RSVP.Promise(function(resolve, reject){\n\t\t// Wait to apply\n\t\tsetTimeout(function() {\n\t\t\tresolve();\n\t\t}, 1);\n\t});\n};\n\n//-- Enable binding events to Renderer\nRSVP.EventTarget.mixin(Rendition.prototype);\n\nmodule.exports = Rendition;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/rendition.js\n ** module id = 24\n ** module chunks = 0\n **/","var core = require('./core');\nvar RSVP = require('rsvp');\n\nfunction Layout(settings){\n\tthis.name = settings.layout || \"reflowable\";\n\tthis._spread = (settings.spread === \"none\") ? false : true;\n\tthis._minSpreadWidth = settings.spread || 800;\n\tthis._evenSpreads = settings.evenSpreads || false;\n\n\tif (settings.flow === \"scrolled-continuous\" ||\n\t\t\tsettings.flow === \"scrolled-doc\") {\n\t\tthis._flow = \"scrolled\";\n\t} else {\n\t\tthis._flow = \"paginated\";\n\t}\n\n\n\tthis.width = 0;\n\tthis.height = 0;\n\tthis.spreadWidth = 0;\n\tthis.delta = 0;\n\n\tthis.columnWidth = 0;\n\tthis.gap = 0;\n\tthis.divisor = 1;\n};\n\n// paginated | scrolled\nLayout.prototype.flow = function(flow) {\n\tthis._flow = (flow === \"paginated\") ? \"paginated\" : \"scrolled\";\n}\n\n// true | false\nLayout.prototype.spread = function(spread, min) {\n\n\tthis._spread = (spread === \"none\") ? false : true;\n\n\tif (min >= 0) {\n\t\tthis._minSpreadWidth = min;\n\t}\n}\n\nLayout.prototype.calculate = function(_width, _height, _gap){\n\n\tvar divisor = 1;\n\tvar gap = _gap || 0;\n\n\t//-- Check the width and create even width columns\n\tvar fullWidth = Math.floor(_width);\n\tvar width = _width;\n\n\tvar section = Math.floor(width / 8);\n\n\tvar colWidth;\n\tvar spreadWidth;\n\tvar delta;\n\n\tif (this._spread && width >= this._minSpreadWidth) {\n\t\tdivisor = 2;\n\t} else {\n\t\tdivisor = 1;\n\t}\n\n\tif (this.name === \"reflowable\" && this._flow === \"paginated\" && !(_gap >= 0)) {\n\t\tgap = ((section % 2 === 0) ? section : section - 1);\n\t}\n\n\tif (this.name === \"pre-paginated\" ) {\n\t\tgap = 0;\n\t}\n\n\t//-- Double Page\n\tif(divisor > 1) {\n\t\tcolWidth = Math.floor((width - gap) / divisor);\n\t} else {\n\t\tcolWidth = width;\n\t}\n\n\tif (this.name === \"pre-paginated\" && divisor > 1) {\n\t\twidth = colWidth;\n\t}\n\n\tspreadWidth = colWidth * divisor;\n\n\tdelta = (colWidth + gap) * divisor;\n\n\tthis.width = width;\n\tthis.height = _height;\n\tthis.spreadWidth = spreadWidth;\n\tthis.delta = delta;\n\n\tthis.columnWidth = colWidth;\n\tthis.gap = gap;\n\tthis.divisor = divisor;\n};\n\nLayout.prototype.format = function(contents){\n\tvar formating;\n\n\tif (this.name === \"pre-paginated\") {\n\t\tformating = contents.fit(this.columnWidth, this.height);\n\t} else if (this._flow === \"paginated\") {\n\t\tformating = contents.columns(this.width, this.height, this.columnWidth, this.gap);\n\t} else { // scrolled\n\t\tformating = contents.size(this.width, null);\n\t}\n\n\treturn formating; // might be a promise in some View Managers\n};\n\nLayout.prototype.count = function(totalWidth) {\n\t// var totalWidth = contents.scrollWidth();\n\tvar spreads = Math.ceil( totalWidth / this.spreadWidth);\n\n\treturn {\n\t\tspreads : spreads,\n\t\tpages : spreads * this.divisor\n\t};\n};\n\nmodule.exports = Layout;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/layout.js\n ** module id = 25\n ** module chunks = 0\n **/","var EpubCFI = require('./epubcfi');\n\nfunction Mapping(layout){\n\tthis.layout = layout;\n};\n\nMapping.prototype.section = function(view) {\n\tvar ranges = this.findRanges(view);\n\tvar map = this.rangeListToCfiList(view.section.cfiBase, ranges);\n\n\treturn map;\n};\n\nMapping.prototype.page = function(contents, cfiBase, start, end) {\n\tvar root = contents && contents.document ? contents.document.body : false;\n\n\tif (!root) {\n\t\treturn;\n\t}\n\n\treturn this.rangePairToCfiPair(cfiBase, {\n\t\tstart: this.findStart(root, start, end),\n\t\tend: this.findEnd(root, start, end)\n\t});\n};\n\nMapping.prototype.walk = function(root, func) {\n\t//var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT, null, false);\n\tvar treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n\t\t\tacceptNode: function (node) {\n\t\t\t\t\tif ( node.data.trim().length > 0 ) {\n\t\t\t\t\t\treturn NodeFilter.FILTER_ACCEPT;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn NodeFilter.FILTER_REJECT;\n\t\t\t\t\t}\n\t\t\t}\n\t}, false);\n\tvar node;\n\tvar result;\n\twhile ((node = treeWalker.nextNode())) {\n\t\tresult = func(node);\n\t\tif(result) break;\n\t}\n\n\treturn result;\n};\n\nMapping.prototype.findRanges = function(view){\n\tvar columns = [];\n\tvar scrollWidth = view.contents.scrollWidth();\n\tvar count = this.layout.count(scrollWidth);\n\tvar column = this.layout.column;\n\tvar gap = this.layout.gap;\n\tvar start, end;\n\n\tfor (var i = 0; i < count.pages; i++) {\n\t\tstart = (column + gap) * i;\n\t\tend = (column * (i+1)) + (gap * i);\n\t\tcolumns.push({\n\t\t\tstart: this.findStart(view.document.body, start, end),\n\t\t\tend: this.findEnd(view.document.body, start, end)\n\t\t});\n\t}\n\n\treturn columns;\n};\n\nMapping.prototype.findStart = function(root, start, end){\n\tvar stack = [root];\n\tvar $el;\n\tvar found;\n\tvar $prev = root;\n\twhile (stack.length) {\n\n\t\t$el = stack.shift();\n\n\t\tfound = this.walk($el, function(node){\n\t\t\tvar left, right;\n\t\t\tvar elPos;\n\t\t\tvar elRange;\n\n\n\t\t\tif(node.nodeType == Node.TEXT_NODE){\n\t\t\t\telRange = document.createRange();\n\t\t\t\telRange.selectNodeContents(node);\n\t\t\t\telPos = elRange.getBoundingClientRect();\n\t\t\t} else {\n\t\t\t\telPos = node.getBoundingClientRect();\n\t\t\t}\n\n\t\t\tleft = elPos.left;\n\t\t\tright = elPos.right;\n\n\t\t\tif( left >= start && left <= end ) {\n\t\t\t\treturn node;\n\t\t\t} else if (right > start) {\n\t\t\t\treturn node;\n\t\t\t} else {\n\t\t\t\t$prev = node;\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t});\n\n\t\tif(found) {\n\t\t\treturn this.findTextStartRange(found, start, end);\n\t\t}\n\n\t}\n\n\t// Return last element\n\treturn this.findTextStartRange($prev, start, end);\n};\n\nMapping.prototype.findEnd = function(root, start, end){\n\tvar stack = [root];\n\tvar $el;\n\tvar $prev = root;\n\tvar found;\n\n\twhile (stack.length) {\n\n\t\t$el = stack.shift();\n\n\t\tfound = this.walk($el, function(node){\n\n\t\t\tvar left, right;\n\t\t\tvar elPos;\n\t\t\tvar elRange;\n\n\n\t\t\tif(node.nodeType == Node.TEXT_NODE){\n\t\t\t\telRange = document.createRange();\n\t\t\t\telRange.selectNodeContents(node);\n\t\t\t\telPos = elRange.getBoundingClientRect();\n\t\t\t} else {\n\t\t\t\telPos = node.getBoundingClientRect();\n\t\t\t}\n\n\t\t\tleft = elPos.left;\n\t\t\tright = elPos.right;\n\n\t\t\tif(left > end && $prev) {\n\t\t\t\treturn $prev;\n\t\t\t} else if(right > end) {\n\t\t\t\treturn node;\n\t\t\t} else {\n\t\t\t\t$prev = node;\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t});\n\n\n\t\tif(found){\n\t\t\treturn this.findTextEndRange(found, start, end);\n\t\t}\n\n\t}\n\n\t// end of chapter\n\treturn this.findTextEndRange($prev, start, end);\n};\n\n\nMapping.prototype.findTextStartRange = function(node, start, end){\n\tvar ranges = this.splitTextNodeIntoRanges(node);\n\tvar prev;\n\tvar range;\n\tvar pos;\n\n\tfor (var i = 0; i < ranges.length; i++) {\n\t\trange = ranges[i];\n\n\t\tpos = range.getBoundingClientRect();\n\n\t\tif( pos.left >= start ) {\n\t\t\treturn range;\n\t\t}\n\n\t\tprev = range;\n\n\t}\n\n\treturn ranges[0];\n};\n\nMapping.prototype.findTextEndRange = function(node, start, end){\n\tvar ranges = this.splitTextNodeIntoRanges(node);\n\tvar prev;\n\tvar range;\n\tvar pos;\n\n\tfor (var i = 0; i < ranges.length; i++) {\n\t\trange = ranges[i];\n\n\t\tpos = range.getBoundingClientRect();\n\n\t\tif(pos.left > end && prev) {\n\t\t\treturn prev;\n\t\t} else if(pos.right > end) {\n\t\t\treturn range;\n\t\t}\n\n\t\tprev = range;\n\n\t}\n\n\t// Ends before limit\n\treturn ranges[ranges.length-1];\n\n};\n\nMapping.prototype.splitTextNodeIntoRanges = function(node, _splitter){\n\tvar ranges = [];\n\tvar textContent = node.textContent || \"\";\n\tvar text = textContent.trim();\n\tvar range;\n\tvar rect;\n\tvar list;\n\tvar doc = node.ownerDocument;\n\tvar splitter = _splitter || \" \";\n\n\tpos = text.indexOf(splitter);\n\n\tif(pos === -1 || node.nodeType != Node.TEXT_NODE) {\n\t\trange = doc.createRange();\n\t\trange.selectNodeContents(node);\n\t\treturn [range];\n\t}\n\n\trange = doc.createRange();\n\trange.setStart(node, 0);\n\trange.setEnd(node, pos);\n\tranges.push(range);\n\trange = false;\n\n\twhile ( pos != -1 ) {\n\n\t\tpos = text.indexOf(splitter, pos + 1);\n\t\tif(pos > 0) {\n\n\t\t\tif(range) {\n\t\t\t\trange.setEnd(node, pos);\n\t\t\t\tranges.push(range);\n\t\t\t}\n\n\t\t\trange = doc.createRange();\n\t\t\trange.setStart(node, pos+1);\n\t\t}\n\t}\n\n\tif(range) {\n\t\trange.setEnd(node, text.length);\n\t\tranges.push(range);\n\t}\n\n\treturn ranges;\n};\n\n\n\nMapping.prototype.rangePairToCfiPair = function(cfiBase, rangePair){\n\n\tvar startRange = rangePair.start;\n\tvar endRange = rangePair.end;\n\n\tstartRange.collapse(true);\n\tendRange.collapse(true);\n\n\t// startCfi = section.cfiFromRange(startRange);\n\t// endCfi = section.cfiFromRange(endRange);\n\tstartCfi = new EpubCFI(startRange, cfiBase).toString();\n\tendCfi = new EpubCFI(endRange, cfiBase).toString();\n\n\treturn {\n\t\tstart: startCfi,\n\t\tend: endCfi\n\t};\n\n};\n\nMapping.prototype.rangeListToCfiList = function(cfiBase, columns){\n\tvar map = [];\n\tvar rangePair, cifPair;\n\n\tfor (var i = 0; i < columns.length; i++) {\n\t\tcifPair = this.rangePairToCfiPair(cfiBase, columns[i]);\n\n\t\tmap.push(cifPair);\n\n\t}\n\n\treturn map;\n};\n\nmodule.exports = Mapping;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/mapping.js\n ** module id = 26\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar request = require('./request');\nvar mime = require('../libs/mime/mime');\n\nfunction Unarchive() {\n\n\tthis.checkRequirements();\n\tthis.urlCache = {};\n\n}\n\nUnarchive.prototype.checkRequirements = function(callback){\n\ttry {\n\t\tif (typeof JSZip !== 'undefined') {\n\t\t\tthis.zip = new JSZip();\n\t\t} else {\n\t\t\tJSZip = require('jszip');\n\t\t\tthis.zip = new JSZip();\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(\"JSZip lib not loaded\");\n\t}\n};\n\nUnarchive.prototype.open = function(zipUrl, isBase64){\n\tif (zipUrl instanceof ArrayBuffer || isBase64) {\n\t\treturn this.zip.loadAsync(zipUrl, {\"base64\": isBase64});\n\t} else {\n\t\treturn request(zipUrl, \"binary\")\n\t\t\t.then(function(data){\n\t\t\t\treturn this.zip.loadAsync(data);\n\t\t\t}.bind(this));\n\t}\n};\n\nUnarchive.prototype.request = function(url, type){\n\tvar deferred = new RSVP.defer();\n\tvar response;\n\tvar r;\n\n\t// If type isn't set, determine it from the file extension\n\tif(!type) {\n\t\turi = URI(url);\n\t\ttype = uri.suffix();\n\t}\n\n\tif(type == 'blob'){\n\t\tresponse = this.getBlob(url);\n\t} else {\n\t\tresponse = this.getText(url);\n\t}\n\n\tif (response) {\n\t\tresponse.then(function (r) {\n\t\t\tresult = this.handleResponse(r, type);\n\t\t\tdeferred.resolve(result);\n\t\t}.bind(this));\n\t} else {\n\t\tdeferred.reject({\n\t\t\tmessage : \"File not found in the epub: \" + url,\n\t\t\tstack : new Error().stack\n\t\t});\n\t}\n\treturn deferred.promise;\n};\n\nUnarchive.prototype.handleResponse = function(response, type){\n\tvar r;\n\n\tif(type == \"json\") {\n\t\tr = JSON.parse(response);\n\t}\n\telse\n\tif(core.isXml(type)) {\n\t\tr = core.parse(response, \"text/xml\");\n\t}\n\telse\n\tif(type == 'xhtml') {\n\t\tr = core.parse(response, \"application/xhtml+xml\");\n\t}\n\telse\n\tif(type == 'html' || type == 'htm') {\n\t\tr = core.parse(response, \"text/html\");\n\t } else {\n\t\t r = response;\n\t }\n\n\treturn r;\n};\n\nUnarchive.prototype.getBlob = function(url, _mimeType){\n\tvar decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\tvar entry = this.zip.file(decodededUrl);\n\tvar mimeType;\n\n\tif(entry) {\n\t\tmimeType = _mimeType || mime.lookup(entry.name);\n\t\treturn entry.async(\"uint8array\").then(function(uint8array) {\n\t\t\treturn new Blob([uint8array], {type : mimeType});\n\t\t});\n\t}\n};\n\nUnarchive.prototype.getText = function(url, encoding){\n\tvar decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\tvar entry = this.zip.file(decodededUrl);\n\n\tif(entry) {\n\t\treturn entry.async(\"string\").then(function(text) {\n\t\t\treturn text;\n\t\t});\n\t}\n};\n\nUnarchive.prototype.getBase64 = function(url, _mimeType){\n\tvar decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\tvar entry = this.zip.file(decodededUrl);\n\tvar mimeType;\n\n\tif(entry) {\n\t\tmimeType = _mimeType || mime.lookup(entry.name);\n\t\treturn entry.async(\"base64\").then(function(data) {\n\t\t\treturn \"data:\" + mimeType + \";base64,\" + data;\n\t\t});\n\t}\n};\n\nUnarchive.prototype.createUrl = function(url, options){\n\tvar deferred = new RSVP.defer();\n\tvar _URL = window.URL || window.webkitURL || window.mozURL;\n\tvar tempUrl;\n\tvar blob;\n\tvar response;\n\tvar useBase64 = options && options.base64;\n\n\tif(url in this.urlCache) {\n\t\tdeferred.resolve(this.urlCache[url]);\n\t\treturn deferred.promise;\n\t}\n\n\tif (useBase64) {\n\t\tresponse = this.getBase64(url);\n\n\t\tif (response) {\n\t\t\tresponse.then(function(tempUrl) {\n\n\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t}.bind(this));\n\n\t\t}\n\n\t} else {\n\n\t\tresponse = this.getBlob(url);\n\n\t\tif (response) {\n\t\t\tresponse.then(function(blob) {\n\n\t\t\t\ttempUrl = _URL.createObjectURL(blob);\n\t\t\t\tthis.urlCache[url] = tempUrl;\n\t\t\t\tdeferred.resolve(tempUrl);\n\n\t\t\t}.bind(this));\n\n\t\t}\n\t}\n\n\n\tif (!response) {\n\t\tdeferred.reject({\n\t\t\tmessage : \"File not found in the epub: \" + url,\n\t\t\tstack : new Error().stack\n\t\t});\n\t}\n\n\treturn deferred.promise;\n};\n\nUnarchive.prototype.revokeUrl = function(url){\n\tvar _URL = window.URL || window.webkitURL || window.mozURL;\n\tvar fromCache = this.urlCache[url];\n\tif(fromCache) _URL.revokeObjectURL(fromCache);\n};\n\nmodule.exports = Unarchive;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/unarchive.js\n ** module id = 27\n ** module chunks = 0\n **/","/*\n From Zip.js, by Gildas Lormeau\nedited down\n */\n\nvar table = {\n\t\"application\" : {\n\t\t\"ecmascript\" : [ \"es\", \"ecma\" ],\n\t\t\"javascript\" : \"js\",\n\t\t\"ogg\" : \"ogx\",\n\t\t\"pdf\" : \"pdf\",\n\t\t\"postscript\" : [ \"ps\", \"ai\", \"eps\", \"epsi\", \"epsf\", \"eps2\", \"eps3\" ],\n\t\t\"rdf+xml\" : \"rdf\",\n\t\t\"smil\" : [ \"smi\", \"smil\" ],\n\t\t\"xhtml+xml\" : [ \"xhtml\", \"xht\" ],\n\t\t\"xml\" : [ \"xml\", \"xsl\", \"xsd\", \"opf\", \"ncx\" ],\n\t\t\"zip\" : \"zip\",\n\t\t\"x-httpd-eruby\" : \"rhtml\",\n\t\t\"x-latex\" : \"latex\",\n\t\t\"x-maker\" : [ \"frm\", \"maker\", \"frame\", \"fm\", \"fb\", \"book\", \"fbdoc\" ],\n\t\t\"x-object\" : \"o\",\n\t\t\"x-shockwave-flash\" : [ \"swf\", \"swfl\" ],\n\t\t\"x-silverlight\" : \"scr\",\n\t\t\"epub+zip\" : \"epub\",\n\t\t\"font-tdpfr\" : \"pfr\",\n\t\t\"inkml+xml\" : [ \"ink\", \"inkml\" ],\n\t\t\"json\" : \"json\",\n\t\t\"jsonml+json\" : \"jsonml\",\n\t\t\"mathml+xml\" : \"mathml\",\n\t\t\"metalink+xml\" : \"metalink\",\n\t\t\"mp4\" : \"mp4s\",\n\t\t// \"oebps-package+xml\" : \"opf\",\n\t\t\"omdoc+xml\" : \"omdoc\",\n\t\t\"oxps\" : \"oxps\",\n\t\t\"vnd.amazon.ebook\" : \"azw\",\n\t\t\"widget\" : \"wgt\",\n\t\t// \"x-dtbncx+xml\" : \"ncx\",\n\t\t\"x-dtbook+xml\" : \"dtb\",\n\t\t\"x-dtbresource+xml\" : \"res\",\n\t\t\"x-font-bdf\" : \"bdf\",\n\t\t\"x-font-ghostscript\" : \"gsf\",\n\t\t\"x-font-linux-psf\" : \"psf\",\n\t\t\"x-font-otf\" : \"otf\",\n\t\t\"x-font-pcf\" : \"pcf\",\n\t\t\"x-font-snf\" : \"snf\",\n\t\t\"x-font-ttf\" : [ \"ttf\", \"ttc\" ],\n\t\t\"x-font-type1\" : [ \"pfa\", \"pfb\", \"pfm\", \"afm\" ],\n\t\t\"x-font-woff\" : \"woff\",\n\t\t\"x-mobipocket-ebook\" : [ \"prc\", \"mobi\" ],\n\t\t\"x-mspublisher\" : \"pub\",\n\t\t\"x-nzb\" : \"nzb\",\n\t\t\"x-tgif\" : \"obj\",\n\t\t\"xaml+xml\" : \"xaml\",\n\t\t\"xml-dtd\" : \"dtd\",\n\t\t\"xproc+xml\" : \"xpl\",\n\t\t\"xslt+xml\" : \"xslt\",\n\t\t\"internet-property-stream\" : \"acx\",\n\t\t\"x-compress\" : \"z\",\n\t\t\"x-compressed\" : \"tgz\",\n\t\t\"x-gzip\" : \"gz\",\n\t},\n\t\"audio\" : {\n\t\t\"flac\" : \"flac\",\n\t\t\"midi\" : [ \"mid\", \"midi\", \"kar\", \"rmi\" ],\n\t\t\"mpeg\" : [ \"mpga\", \"mpega\", \"mp2\", \"mp3\", \"m4a\", \"mp2a\", \"m2a\", \"m3a\" ],\n\t\t\"mpegurl\" : \"m3u\",\n\t\t\"ogg\" : [ \"oga\", \"ogg\", \"spx\" ],\n\t\t\"x-aiff\" : [ \"aif\", \"aiff\", \"aifc\" ],\n\t\t\"x-ms-wma\" : \"wma\",\n\t\t\"x-wav\" : \"wav\",\n\t\t\"adpcm\" : \"adp\",\n\t\t\"mp4\" : \"mp4a\",\n\t\t\"webm\" : \"weba\",\n\t\t\"x-aac\" : \"aac\",\n\t\t\"x-caf\" : \"caf\",\n\t\t\"x-matroska\" : \"mka\",\n\t\t\"x-pn-realaudio-plugin\" : \"rmp\",\n\t\t\"xm\" : \"xm\",\n\t\t\"mid\" : [ \"mid\", \"rmi\" ]\n\t},\n\t\"image\" : {\n\t\t\"gif\" : \"gif\",\n\t\t\"ief\" : \"ief\",\n\t\t\"jpeg\" : [ \"jpeg\", \"jpg\", \"jpe\" ],\n\t\t\"pcx\" : \"pcx\",\n\t\t\"png\" : \"png\",\n\t\t\"svg+xml\" : [ \"svg\", \"svgz\" ],\n\t\t\"tiff\" : [ \"tiff\", \"tif\" ],\n\t\t\"x-icon\" : \"ico\",\n\t\t\"bmp\" : \"bmp\",\n\t\t\"webp\" : \"webp\",\n\t\t\"x-pict\" : [ \"pic\", \"pct\" ],\n\t\t\"x-tga\" : \"tga\",\n\t\t\"cis-cod\" : \"cod\"\n\t},\n\t\"text\" : {\n\t\t\"cache-manifest\" : [ \"manifest\", \"appcache\" ],\n\t\t\"css\" : \"css\",\n\t\t\"csv\" : \"csv\",\n\t\t\"html\" : [ \"html\", \"htm\", \"shtml\", \"stm\" ],\n\t\t\"mathml\" : \"mml\",\n\t\t\"plain\" : [ \"txt\", \"text\", \"brf\", \"conf\", \"def\", \"list\", \"log\", \"in\", \"bas\" ],\n\t\t\"richtext\" : \"rtx\",\n\t\t\"tab-separated-values\" : \"tsv\",\n\t\t\"x-bibtex\" : \"bib\"\n\t},\n\t\"video\" : {\n\t\t\"mpeg\" : [ \"mpeg\", \"mpg\", \"mpe\", \"m1v\", \"m2v\", \"mp2\", \"mpa\", \"mpv2\" ],\n\t\t\"mp4\" : [ \"mp4\", \"mp4v\", \"mpg4\" ],\n\t\t\"quicktime\" : [ \"qt\", \"mov\" ],\n\t\t\"ogg\" : \"ogv\",\n\t\t\"vnd.mpegurl\" : [ \"mxu\", \"m4u\" ],\n\t\t\"x-flv\" : \"flv\",\n\t\t\"x-la-asf\" : [ \"lsf\", \"lsx\" ],\n\t\t\"x-mng\" : \"mng\",\n\t\t\"x-ms-asf\" : [ \"asf\", \"asx\", \"asr\" ],\n\t\t\"x-ms-wm\" : \"wm\",\n\t\t\"x-ms-wmv\" : \"wmv\",\n\t\t\"x-ms-wmx\" : \"wmx\",\n\t\t\"x-ms-wvx\" : \"wvx\",\n\t\t\"x-msvideo\" : \"avi\",\n\t\t\"x-sgi-movie\" : \"movie\",\n\t\t\"x-matroska\" : [ \"mpv\", \"mkv\", \"mk3d\", \"mks\" ],\n\t\t\"3gpp2\" : \"3g2\",\n\t\t\"h261\" : \"h261\",\n\t\t\"h263\" : \"h263\",\n\t\t\"h264\" : \"h264\",\n\t\t\"jpeg\" : \"jpgv\",\n\t\t\"jpm\" : [ \"jpm\", \"jpgm\" ],\n\t\t\"mj2\" : [ \"mj2\", \"mjp2\" ],\n\t\t\"vnd.ms-playready.media.pyv\" : \"pyv\",\n\t\t\"vnd.uvvu.mp4\" : [ \"uvu\", \"uvvu\" ],\n\t\t\"vnd.vivo\" : \"viv\",\n\t\t\"webm\" : \"webm\",\n\t\t\"x-f4v\" : \"f4v\",\n\t\t\"x-m4v\" : \"m4v\",\n\t\t\"x-ms-vob\" : \"vob\",\n\t\t\"x-smv\" : \"smv\"\n\t}\n};\n\nvar mimeTypes = (function() {\n\tvar type, subtype, val, index, mimeTypes = {};\n\tfor (type in table) {\n\t\tif (table.hasOwnProperty(type)) {\n\t\t\tfor (subtype in table[type]) {\n\t\t\t\tif (table[type].hasOwnProperty(subtype)) {\n\t\t\t\t\tval = table[type][subtype];\n\t\t\t\t\tif (typeof val == \"string\") {\n\t\t\t\t\t\tmimeTypes[val] = type + \"/\" + subtype;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (index = 0; index < val.length; index++) {\n\t\t\t\t\t\t\tmimeTypes[val[index]] = type + \"/\" + subtype;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn mimeTypes;\n})();\n\nvar defaultValue = \"text/plain\";//\"application/octet-stream\";\n\nfunction lookup(filename) {\n\treturn filename && mimeTypes[filename.split(\".\").pop().toLowerCase()] || defaultValue;\n};\n\nmodule.exports = {\n\t'lookup': lookup\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./libs/mime/mime.js\n ** module id = 28\n ** module chunks = 0\n **/","if(typeof __WEBPACK_EXTERNAL_MODULE_29__ === 'undefined') {var e = new Error(\"Cannot find module \\\"JSZip\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e;}\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_29__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"JSZip\"\n ** module id = 29\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Mapping = require('./mapping');\n\n\nfunction Contents(doc, content, cfiBase) {\n\t// Blank Cfi for Parsing\n\tthis.epubcfi = new EpubCFI();\n\n\tthis.document = doc;\n\tthis.documentElement = this.document.documentElement;\n\tthis.content = content || this.document.body;\n\tthis.window = this.document.defaultView;\n\t// Dom events to listen for\n\tthis.listenedEvents = [\"keydown\", \"keyup\", \"keypressed\", \"mouseup\", \"mousedown\", \"click\", \"touchend\", \"touchstart\"];\n\n\tthis._size = {\n\t\twidth: 0,\n\t\theight: 0\n\t}\n\n\tthis.cfiBase = cfiBase || \"\";\n\n\tthis.listeners();\n};\n\nContents.prototype.width = function(w) {\n\t// var frame = this.documentElement;\n\tvar frame = this.content;\n\n\tif (w && core.isNumber(w)) {\n\t\tw = w + \"px\";\n\t}\n\n\tif (w) {\n\t\tframe.style.width = w;\n\t\t// this.content.style.width = w;\n\t}\n\n\treturn this.window.getComputedStyle(frame)['width'];\n\n\n};\n\nContents.prototype.height = function(h) {\n\t// var frame = this.documentElement;\n\tvar frame = this.content;\n\n\tif (h && core.isNumber(h)) {\n\t\th = h + \"px\";\n\t}\n\n\tif (h) {\n\t\tframe.style.height = h;\n\t\t// this.content.style.height = h;\n\t}\n\n\treturn this.window.getComputedStyle(frame)['height'];\n\n};\n\nContents.prototype.contentWidth = function(w) {\n\n\tvar content = this.content || this.document.body;\n\n\tif (w && core.isNumber(w)) {\n\t\tw = w + \"px\";\n\t}\n\n\tif (w) {\n\t\tcontent.style.width = w;\n\t}\n\n\treturn this.window.getComputedStyle(content)['width'];\n\n\n};\n\nContents.prototype.contentHeight = function(h) {\n\n\tvar content = this.content || this.document.body;\n\n\tif (h && core.isNumber(h)) {\n\t\th = h + \"px\";\n\t}\n\n\tif (h) {\n\t\tcontent.style.height = h;\n\t}\n\n\treturn this.window.getComputedStyle(content)['height'];\n\n};\n\nContents.prototype.textWidth = function() {\n\tvar width;\n\tvar range = this.document.createRange();\n\tvar content = this.content || this.document.body;\n\n\t// Select the contents of frame\n\trange.selectNodeContents(content);\n\n\t// get the width of the text content\n\twidth = range.getBoundingClientRect().width;\n\n\treturn width;\n\n};\n\nContents.prototype.textHeight = function() {\n\tvar height;\n\tvar range = this.document.createRange();\n\tvar content = this.content || this.document.body;\n\n\trange.selectNodeContents(content);\n\n\theight = range.getBoundingClientRect().height;\n\n\treturn height;\n};\n\nContents.prototype.scrollWidth = function() {\n\tvar width = this.documentElement.scrollWidth;\n\n\treturn width;\n};\n\nContents.prototype.scrollHeight = function() {\n\tvar height = this.documentElement.scrollHeight;\n\n\treturn height;\n};\n\nContents.prototype.overflow = function(overflow) {\n\n\tif (overflow) {\n\t\tthis.documentElement.style.overflow = overflow;\n\t}\n\n\treturn this.window.getComputedStyle(this.documentElement)['overflow'];\n};\n\nContents.prototype.overflowX = function(overflow) {\n\n\tif (overflow) {\n\t\tthis.documentElement.style.overflowX = overflow;\n\t}\n\n\treturn this.window.getComputedStyle(this.documentElement)['overflowX'];\n};\n\nContents.prototype.overflowY = function(overflow) {\n\n\tif (overflow) {\n\t\tthis.documentElement.style.overflowY = overflow;\n\t}\n\n\treturn this.window.getComputedStyle(this.documentElement)['overflowY'];\n};\n\nContents.prototype.css = function(property, value) {\n\tvar content = this.content || this.document.body;\n\n\tif (value) {\n\t\tcontent.style[property] = value;\n\t}\n\n\treturn this.window.getComputedStyle(content)[property];\n};\n\nContents.prototype.viewport = function(options) {\n\tvar width, height, scale, scalable;\n\tvar $viewport = this.document.querySelector(\"meta[name='viewport']\");\n\tvar newContent = '';\n\n\t/**\n\t* check for the viewport size\n\t* \n\t*/\n\tif($viewport && $viewport.hasAttribute(\"content\")) {\n\t\tcontent = $viewport.getAttribute(\"content\");\n\t\tcontents = content.split(/\\s*,\\s*/);\n\t\tif(contents[0]){\n\t\t\twidth = contents[0].replace(\"width=\", '').trim();\n\t\t}\n\t\tif(contents[1]){\n\t\t\theight = contents[1].replace(\"height=\", '').trim();\n\t\t}\n\t\tif(contents[2]){\n\t\t\tscale = contents[2].replace(\"initial-scale=\", '').trim();\n\t\t}\n\t\tif(contents[3]){\n\t\t\tscalable = contents[3].replace(\"user-scalable=\", '').trim();\n\t\t}\n\t}\n\n\tif (options) {\n\n\t\tnewContent += \"width=\" + (options.width || width);\n\t\tnewContent += \", height=\" + (options.height || height);\n\t\tif (options.scale || scale) {\n\t\t\tnewContent += \", initial-scale=\" + (options.scale || scale);\n\t\t}\n\t\tif (options.scalable || scalable) {\n\t\t\tnewContent += \", user-scalable=\" + (options.scalable || scalable);\n\t\t}\n\n\t\tif (!$viewport) {\n\t\t\t$viewport = this.document.createElement(\"meta\");\n\t\t\t$viewport.setAttribute(\"name\", \"viewport\");\n\t\t\tthis.document.querySelector('head').appendChild($viewport);\n\t\t}\n\n\t\t$viewport.setAttribute(\"content\", newContent);\n\t}\n\n\n\treturn {\n\t\twidth: parseInt(width),\n\t\theight: parseInt(height)\n\t};\n};\n\n\n// Contents.prototype.layout = function(layoutFunc) {\n//\n// this.iframe.style.display = \"inline-block\";\n//\n// // Reset Body Styles\n// this.content.style.margin = \"0\";\n// //this.document.body.style.display = \"inline-block\";\n// //this.document.documentElement.style.width = \"auto\";\n//\n// if(layoutFunc){\n// layoutFunc(this);\n// }\n//\n// this.onLayout(this);\n//\n// };\n//\n// Contents.prototype.onLayout = function(view) {\n// // stub\n// };\n\nContents.prototype.expand = function() {\n\tthis.trigger(\"expand\");\n};\n\nContents.prototype.listeners = function() {\n\n\tthis.imageLoadListeners();\n\n\tthis.mediaQueryListeners();\n\n\t// this.fontLoadListeners();\n\n\tthis.addEventListeners();\n\n\tthis.addSelectionListeners();\n\n\tthis.resizeListeners();\n\n};\n\nContents.prototype.removeListeners = function() {\n\n\tthis.removeEventListeners();\n\n\tthis.removeSelectionListeners();\n};\n\nContents.prototype.resizeListeners = function() {\n\tvar width, height;\n\t// Test size again\n\tclearTimeout(this.expanding);\n\n\twidth = this.scrollWidth();\n\theight = this.scrollHeight();\n\n\tif (width != this._size.width || height != this._size.height) {\n\n\t\tthis._size = {\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t}\n\n\t\tthis.trigger(\"resize\", this._size);\n\t}\n\n\tthis.expanding = setTimeout(this.resizeListeners.bind(this), 350);\n};\n\n//https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js\nContents.prototype.mediaQueryListeners = function() {\n\t\tvar sheets = this.document.styleSheets;\n\t\tvar mediaChangeHandler = function(m){\n\t\t\tif(m.matches && !this._expanding) {\n\t\t\t\tsetTimeout(this.expand.bind(this), 1);\n\t\t\t\t// this.expand();\n\t\t\t}\n\t\t}.bind(this);\n\n\t\tfor (var i = 0; i < sheets.length; i += 1) {\n\t\t\t\tvar rules = sheets[i].cssRules;\n\t\t\t\tif(!rules) return; // Stylesheets changed\n\t\t\t\tfor (var j = 0; j < rules.length; j += 1) {\n\t\t\t\t\t\t//if (rules[j].constructor === CSSMediaRule) {\n\t\t\t\t\t\tif(rules[j].media){\n\t\t\t\t\t\t\t\tvar mql = this.window.matchMedia(rules[j].media.mediaText);\n\t\t\t\t\t\t\t\tmql.addListener(mediaChangeHandler);\n\t\t\t\t\t\t\t\t//mql.onchange = mediaChangeHandler;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n};\n\nContents.prototype.observe = function(target) {\n\tvar renderer = this;\n\n\t// create an observer instance\n\tvar observer = new MutationObserver(function(mutations) {\n\t\tif(renderer._expanding) {\n\t\t\trenderer.expand();\n\t\t}\n\t\t// mutations.forEach(function(mutation) {\n\t\t// console.log(mutation);\n\t\t// });\n\t});\n\n\t// configuration of the observer:\n\tvar config = { attributes: true, childList: true, characterData: true, subtree: true };\n\n\t// pass in the target node, as well as the observer options\n\tobserver.observe(target, config);\n\n\treturn observer;\n};\n\nContents.prototype.imageLoadListeners = function(target) {\n\tvar images = this.document.querySelectorAll(\"img\");\n\tvar img;\n\tfor (var i = 0; i < images.length; i++) {\n\t\timg = images[i];\n\n\t\tif (typeof img.naturalWidth !== \"undefined\" &&\n\t\t\t\timg.naturalWidth === 0) {\n\t\t\timg.onload = this.expand.bind(this);\n\t\t}\n\t}\n};\n\nContents.prototype.fontLoadListeners = function(target) {\n\tif (!this.document || !this.document.fonts) {\n\t\treturn;\n\t}\n\n\tthis.document.fonts.ready.then(function () {\n\t\tthis.expand();\n\t}.bind(this));\n\n};\n\nContents.prototype.root = function() {\n\tif(!this.document) return null;\n\treturn this.document.documentElement;\n};\n\nContents.prototype.locationOf = function(target, ignoreClass) {\n\tvar position;\n\tvar targetPos = {\"left\": 0, \"top\": 0};\n\n\tif(!this.document) return;\n\n\tif(this.epubcfi.isCfiString(target)) {\n\t\trange = new EpubCFI(target).toRange(this.document, ignoreClass);\n\n\t\tif(range) {\n\t\t\tif (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tposition = range.startContainer.getBoundingClientRect();\n\t\t\t\ttargetPos.left = position.left;\n\t\t\t\ttargetPos.top = position.top;\n\t\t\t} else {\n\t\t\t\tposition = range.getBoundingClientRect();\n\t\t\t\ttargetPos.left = position.left;\n\t\t\t\ttargetPos.top = position.top;\n\t\t\t}\n\t\t}\n\n\t} else if(typeof target === \"string\" &&\n\t\ttarget.indexOf(\"#\") > -1) {\n\n\t\tid = target.substring(target.indexOf(\"#\")+1);\n\t\tel = this.document.getElementById(id);\n\n\t\tif(el) {\n\t\t\tposition = el.getBoundingClientRect();\n\t\t\ttargetPos.left = position.left;\n\t\t\ttargetPos.top = position.top;\n\t\t}\n\t}\n\n\treturn targetPos;\n};\n\nContents.prototype.addStylesheet = function(src) {\n\treturn new RSVP.Promise(function(resolve, reject){\n\t\tvar $stylesheet;\n\t\tvar ready = false;\n\n\t\tif(!this.document) {\n\t\t\tresolve(false);\n\t\t\treturn;\n\t\t}\n\n\t\t$stylesheet = this.document.createElement('link');\n\t\t$stylesheet.type = 'text/css';\n\t\t$stylesheet.rel = \"stylesheet\";\n\t\t$stylesheet.href = src;\n\t\t$stylesheet.onload = $stylesheet.onreadystatechange = function() {\n\t\t\tif ( !ready && (!this.readyState || this.readyState == 'complete') ) {\n\t\t\t\tready = true;\n\t\t\t\t// Let apply\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\tresolve(true);\n\t\t\t\t}, 1);\n\t\t\t}\n\t\t};\n\n\t\tthis.document.head.appendChild($stylesheet);\n\n\t}.bind(this));\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule\nContents.prototype.addStylesheetRules = function(rules) {\n\tvar styleEl;\n\tvar styleSheet;\n\n\tif(!this.document) return;\n\n\tstyleEl = this.document.createElement('style');\n\n\t// Append style element to head\n\tthis.document.head.appendChild(styleEl);\n\n\t// Grab style sheet\n\tstyleSheet = styleEl.sheet;\n\n\tfor (var i = 0, rl = rules.length; i < rl; i++) {\n\t\tvar j = 1, rule = rules[i], selector = rules[i][0], propStr = '';\n\t\t// If the second argument of a rule is an array of arrays, correct our variables.\n\t\tif (Object.prototype.toString.call(rule[1][0]) === '[object Array]') {\n\t\t\trule = rule[1];\n\t\t\tj = 0;\n\t\t}\n\n\t\tfor (var pl = rule.length; j < pl; j++) {\n\t\t\tvar prop = rule[j];\n\t\t\tpropStr += prop[0] + ':' + prop[1] + (prop[2] ? ' !important' : '') + ';\\n';\n\t\t}\n\n\t\t// Insert CSS Rule\n\t\tstyleSheet.insertRule(selector + '{' + propStr + '}', styleSheet.cssRules.length);\n\t}\n};\n\nContents.prototype.addScript = function(src) {\n\n\treturn new RSVP.Promise(function(resolve, reject){\n\t\tvar $script;\n\t\tvar ready = false;\n\n\t\tif(!this.document) {\n\t\t\tresolve(false);\n\t\t\treturn;\n\t\t}\n\n\t\t$script = this.document.createElement('script');\n\t\t$script.type = 'text/javascript';\n\t\t$script.async = true;\n\t\t$script.src = src;\n\t\t$script.onload = $script.onreadystatechange = function() {\n\t\t\tif ( !ready && (!this.readyState || this.readyState == 'complete') ) {\n\t\t\t\tready = true;\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\tresolve(true);\n\t\t\t\t}, 1);\n\t\t\t}\n\t\t};\n\n\t\tthis.document.head.appendChild($script);\n\n\t}.bind(this));\n};\n\nContents.prototype.addEventListeners = function(){\n\tif(!this.document) {\n\t\treturn;\n\t}\n\tthis.listenedEvents.forEach(function(eventName){\n\t\tthis.document.addEventListener(eventName, this.triggerEvent.bind(this), false);\n\t}, this);\n\n};\n\nContents.prototype.removeEventListeners = function(){\n\tif(!this.document) {\n\t\treturn;\n\t}\n\tthis.listenedEvents.forEach(function(eventName){\n\t\tthis.document.removeEventListener(eventName, this.triggerEvent, false);\n\t}, this);\n\n};\n\n// Pass browser events\nContents.prototype.triggerEvent = function(e){\n\tthis.trigger(e.type, e);\n};\n\nContents.prototype.addSelectionListeners = function(){\n\tif(!this.document) {\n\t\treturn;\n\t}\n\tthis.document.addEventListener(\"selectionchange\", this.onSelectionChange.bind(this), false);\n};\n\nContents.prototype.removeSelectionListeners = function(){\n\tif(!this.document) {\n\t\treturn;\n\t}\n\tthis.document.removeEventListener(\"selectionchange\", this.onSelectionChange, false);\n};\n\nContents.prototype.onSelectionChange = function(e){\n\tif (this.selectionEndTimeout) {\n\t\tclearTimeout(this.selectionEndTimeout);\n\t}\n\tthis.selectionEndTimeout = setTimeout(function() {\n\t\tvar selection = this.window.getSelection();\n\t\tthis.triggerSelectedEvent(selection);\n\t}.bind(this), 500);\n};\n\nContents.prototype.triggerSelectedEvent = function(selection){\n\tvar range, cfirange;\n\n\tif (selection && selection.rangeCount > 0) {\n\t\trange = selection.getRangeAt(0);\n\t\tif(!range.collapsed) {\n\t\t\t// cfirange = this.section.cfiFromRange(range);\n\t\t\tcfirange = new EpubCFI(range, this.cfiBase).toString();\n\t\t\tthis.trigger(\"selected\", cfirange);\n\t\t\tthis.trigger(\"selectedRange\", range);\n\t\t}\n\t}\n};\n\nContents.prototype.range = function(_cfi, ignoreClass){\n\tvar cfi = new EpubCFI(_cfi);\n\treturn cfi.toRange(this.document, ignoreClass);\n};\n\nContents.prototype.map = function(layout){\n\tvar map = new Mapping(layout);\n\treturn map.section();\n};\n\nContents.prototype.size = function(width, height){\n\n\tif (width >= 0) {\n\t\tthis.width(width);\n\t}\n\n\tif (height >= 0) {\n\t\tthis.height(height);\n\t}\n\n\tthis.css(\"margin\", \"0\");\n\tthis.css(\"boxSizing\", \"border-box\");\n\n};\n\nContents.prototype.columns = function(width, height, columnWidth, gap){\n\tvar COLUMN_AXIS = core.prefixed('columnAxis');\n\tvar COLUMN_GAP = core.prefixed('columnGap');\n\tvar COLUMN_WIDTH = core.prefixed('columnWidth');\n\tvar COLUMN_FILL = core.prefixed('columnFill');\n\tvar textWidth;\n\n\tthis.width(width);\n\tthis.height(height);\n\n\t// Deal with Mobile trying to scale to viewport\n\tthis.viewport({ width: width, height: height, scale: 1.0 });\n\n\t// this.overflowY(\"hidden\");\n\tthis.css(\"overflowY\", \"hidden\");\n\tthis.css(\"margin\", \"0\");\n\tthis.css(\"boxSizing\", \"border-box\");\n\tthis.css(\"maxWidth\", \"inherit\");\n\n\tthis.css(COLUMN_AXIS, \"horizontal\");\n\tthis.css(COLUMN_FILL, \"auto\");\n\n\tthis.css(COLUMN_GAP, gap+\"px\");\n\tthis.css(COLUMN_WIDTH, columnWidth+\"px\");\n};\n\nContents.prototype.scale = function(scale, offsetX, offsetY){\n\tvar scale = \"scale(\" + scale + \")\";\n\tvar translate = '';\n\t// this.css(\"position\", \"absolute\"));\n\tthis.css(\"transformOrigin\", \"top left\");\n\n\tif (offsetX >= 0 || offsetY >= 0) {\n\t\ttranslate = \" translate(\" + (offsetX || 0 )+ \"px, \" + (offsetY || 0 )+ \"px )\";\n\t}\n\n\tthis.css(\"transform\", scale + translate);\n};\n\nContents.prototype.fit = function(width, height){\n\tvar viewport = this.viewport();\n\tvar widthScale = width / viewport.width;\n\tvar heightScale = height / viewport.height;\n\tvar scale = widthScale < heightScale ? widthScale : heightScale;\n\n\tvar offsetY = (height - (viewport.height * scale)) / 2;\n\n\tthis.width(width);\n\tthis.height(height);\n\tthis.overflow(\"hidden\");\n\n\t// Deal with Mobile trying to scale to viewport\n\tthis.viewport({ scale: 1.0 });\n\n\t// Scale to the correct size\n\tthis.scale(scale, 0, offsetY);\n\n\tthis.css(\"backgroundColor\", \"transparent\");\n};\n\nContents.prototype.mapPage = function(cfiBase, start, end) {\n\tvar mapping = new Mapping();\n\n\treturn mapping.page(this, cfiBase, start, end);\n};\n\nContents.prototype.destroy = function() {\n\t// Stop observing\n\tif(this.observer) {\n\t\tthis.observer.disconnect();\n\t}\n\n\tthis.removeListeners();\n\n};\n\nRSVP.EventTarget.mixin(Contents.prototype);\n\nmodule.exports = Contents;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/contents.js\n ** module id = 30\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar core = require('../../core');\nvar EpubCFI = require('../../epubcfi');\nvar Contents = require('../../contents');\n\nfunction IframeView(section, options) {\n\tthis.settings = core.extend({\n\t\tignoreClass : '',\n\t\taxis: 'vertical',\n\t\twidth: 0,\n\t\theight: 0,\n\t\tlayout: undefined,\n\t\tglobalLayoutProperties: {},\n\t}, options || {});\n\n\tthis.id = \"epubjs-view-\" + core.uuid();\n\tthis.section = section;\n\tthis.index = section.index;\n\n\tthis.element = this.container(this.settings.axis);\n\n\tthis.added = false;\n\tthis.displayed = false;\n\tthis.rendered = false;\n\n\tthis.width = this.settings.width;\n\tthis.height = this.settings.height;\n\n\tthis.fixedWidth = 0;\n\tthis.fixedHeight = 0;\n\n\t// Blank Cfi for Parsing\n\tthis.epubcfi = new EpubCFI();\n\n\tthis.layout = this.settings.layout;\n\t// Dom events to listen for\n\t// this.listenedEvents = [\"keydown\", \"keyup\", \"keypressed\", \"mouseup\", \"mousedown\", \"click\", \"touchend\", \"touchstart\"];\n};\n\nIframeView.prototype.container = function(axis) {\n\tvar element = document.createElement('div');\n\n\telement.classList.add(\"epub-view\");\n\n\t// this.element.style.minHeight = \"100px\";\n\telement.style.height = \"0px\";\n\telement.style.width = \"0px\";\n\telement.style.overflow = \"hidden\";\n\n\tif(axis && axis == \"horizontal\"){\n\t\telement.style.display = \"inline-block\";\n\t} else {\n\t\telement.style.display = \"block\";\n\t}\n\n\treturn element;\n};\n\nIframeView.prototype.create = function() {\n\n\tif(this.iframe) {\n\t\treturn this.iframe;\n\t}\n\n\tif(!this.element) {\n\t\tthis.element = this.createContainer();\n\t}\n\n\tthis.iframe = document.createElement('iframe');\n\tthis.iframe.id = this.id;\n\tthis.iframe.scrolling = \"no\"; // Might need to be removed: breaks ios width calculations\n\tthis.iframe.style.overflow = \"hidden\";\n\tthis.iframe.seamless = \"seamless\";\n\t// Back up if seamless isn't supported\n\tthis.iframe.style.border = \"none\";\n\n\tthis.resizing = true;\n\n\t// this.iframe.style.display = \"none\";\n\tthis.element.style.visibility = \"hidden\";\n\tthis.iframe.style.visibility = \"hidden\";\n\n\tthis.iframe.style.width = \"0\";\n\tthis.iframe.style.height = \"0\";\n\tthis._width = 0;\n\tthis._height = 0;\n\n\tthis.element.appendChild(this.iframe);\n\tthis.added = true;\n\n\tthis.elementBounds = core.bounds(this.element);\n\n\t// if(width || height){\n\t// this.resize(width, height);\n\t// } else if(this.width && this.height){\n\t// this.resize(this.width, this.height);\n\t// } else {\n\t// this.iframeBounds = core.bounds(this.iframe);\n\t// }\n\n\t// Firefox has trouble with baseURI and srcdoc\n\t// TODO: Disable for now in firefox\n\n\tif(!!(\"srcdoc\" in this.iframe)) {\n\t\tthis.supportsSrcdoc = true;\n\t} else {\n\t\tthis.supportsSrcdoc = false;\n\t}\n\n\treturn this.iframe;\n};\n\nIframeView.prototype.render = function(request, show) {\n\n\t// view.onLayout = this.layout.format.bind(this.layout);\n\tthis.create();\n\n\t// Fit to size of the container, apply padding\n\tthis.size();\n\n\tif(!this.sectionRender) {\n\t\tthis.sectionRender = this.section.render(request);\n\t}\n\n\t// Render Chain\n\treturn this.sectionRender\n\t\t.then(function(contents){\n\t\t\treturn this.load(contents);\n\t\t}.bind(this))\n\t\t// .then(function(doc){\n\t\t// \treturn this.hooks.content.trigger(view, this);\n\t\t// }.bind(this))\n\t\t.then(function(){\n\t\t\t// this.settings.layout.format(view.contents);\n\t\t\t// return this.hooks.layout.trigger(view, this);\n\t\t}.bind(this))\n\t\t// .then(function(){\n\t\t// \treturn this.display();\n\t\t// }.bind(this))\n\t\t// .then(function(){\n\t\t// \treturn this.hooks.render.trigger(view, this);\n\t\t// }.bind(this))\n\t\t.then(function(){\n\n\t\t\t// apply the layout function to the contents\n\t\t\tthis.settings.layout.format(this.contents);\n\n\t\t\t// Expand the iframe to the full size of the content\n\t\t\tthis.expand();\n\n\t\t\t// Listen for events that require an expansion of the iframe\n\t\t\tthis.addListeners();\n\n\t\t\tif(show !== false) {\n\t\t\t\t//this.q.enqueue(function(view){\n\t\t\t\t\t// this.show();\n\t\t\t\t//}, view);\n\t\t\t}\n\t\t\t// this.map = new Map(view, this.layout);\n\t\t\t//this.hooks.show.trigger(view, this);\n\t\t\tthis.trigger(\"rendered\", this.section);\n\n\t\t}.bind(this))\n\t\t.catch(function(e){\n\t\t\tthis.trigger(\"loaderror\", e);\n\t\t}.bind(this));\n\n};\n\n// Determine locks base on settings\nIframeView.prototype.size = function(_width, _height) {\n\tvar width = _width || this.settings.width;\n\tvar height = _height || this.settings.height;\n\n\tif(this.layout.name === \"pre-paginated\") {\n\t\tthis.lock(\"both\", width, height);\n\t} else if(this.settings.axis === \"horizontal\") {\n\t\tthis.lock(\"height\", width, height);\n\t} else {\n\t\tthis.lock(\"width\", width, height);\n\t}\n\n};\n\n// Lock an axis to element dimensions, taking borders into account\nIframeView.prototype.lock = function(what, width, height) {\n\tvar elBorders = core.borders(this.element);\n\tvar iframeBorders;\n\n\tif(this.iframe) {\n\t\tiframeBorders = core.borders(this.iframe);\n\t} else {\n\t\tiframeBorders = {width: 0, height: 0};\n\t}\n\n\tif(what == \"width\" && core.isNumber(width)){\n\t\tthis.lockedWidth = width - elBorders.width - iframeBorders.width;\n\t\tthis.resize(this.lockedWidth, width); // width keeps ratio correct\n\t}\n\n\tif(what == \"height\" && core.isNumber(height)){\n\t\tthis.lockedHeight = height - elBorders.height - iframeBorders.height;\n\t\tthis.resize(width, this.lockedHeight);\n\t}\n\n\tif(what === \"both\" &&\n\t\t core.isNumber(width) &&\n\t\t core.isNumber(height)){\n\n\t\tthis.lockedWidth = width - elBorders.width - iframeBorders.width;\n\t\tthis.lockedHeight = height - elBorders.height - iframeBorders.height;\n\n\t\tthis.resize(this.lockedWidth, this.lockedHeight);\n\t}\n\n\tif(this.displayed && this.iframe) {\n\n\t\t\t// this.contents.layout();\n\t\t\tthis.expand();\n\n\t}\n\n\n\n};\n\n// Resize a single axis based on content dimensions\nIframeView.prototype.expand = function(force) {\n\tvar width = this.lockedWidth;\n\tvar height = this.lockedHeight;\n\tvar columns;\n\n\tvar textWidth, textHeight;\n\n\tif(!this.iframe || this._expanding) return;\n\n\tthis._expanding = true;\n\n\t// Expand Horizontally\n\t// if(height && !width) {\n\tif(this.settings.axis === \"horizontal\") {\n\t\t// Get the width of the text\n\t\ttextWidth = this.contents.textWidth();\n\t\t// Check if the textWidth has changed\n\t\tif(textWidth != this._textWidth){\n\t\t\t// Get the contentWidth by resizing the iframe\n\t\t\t// Check with a min reset of the textWidth\n\t\t\twidth = this.contentWidth(textWidth);\n\n\t\t\tcolumns = Math.ceil(width / (this.settings.layout.columnWidth + this.settings.layout.gap));\n\n\t\t\tif ( this.settings.layout.divisor > 1 &&\n\t\t\t\t\t this.settings.layout.name === \"reflowable\" &&\n\t\t\t\t\t(columns % 2 > 0)) {\n\t\t\t\t\t// add a blank page\n\t\t\t\t\twidth += this.settings.layout.gap + this.settings.layout.columnWidth;\n\t\t\t}\n\n\t\t\t// Save the textWdith\n\t\t\tthis._textWidth = textWidth;\n\t\t\t// Save the contentWidth\n\t\t\tthis._contentWidth = width;\n\t\t} else {\n\t\t\t// Otherwise assume content height hasn't changed\n\t\t\twidth = this._contentWidth;\n\t\t}\n\t} // Expand Vertically\n\telse if(this.settings.axis === \"vertical\") {\n\t\ttextHeight = this.contents.textHeight();\n\t\tif(textHeight != this._textHeight){\n\t\t\theight = this.contentHeight(textHeight);\n\t\t\tthis._textHeight = textHeight;\n\t\t\tthis._contentHeight = height;\n\t\t} else {\n\t\t\theight = this._contentHeight;\n\t\t}\n\n\t}\n\n\t// Only Resize if dimensions have changed or\n\t// if Frame is still hidden, so needs reframing\n\tif(this._needsReframe || width != this._width || height != this._height){\n\t\tthis.resize(width, height);\n\t}\n\n\tthis._expanding = false;\n};\n\nIframeView.prototype.contentWidth = function(min) {\n\tvar prev;\n\tvar width;\n\n\t// Save previous width\n\tprev = this.iframe.style.width;\n\t// Set the iframe size to min, width will only ever be greater\n\t// Will preserve the aspect ratio\n\tthis.iframe.style.width = (min || 0) + \"px\";\n\t// Get the scroll overflow width\n\twidth = this.contents.scrollWidth();\n\t// Reset iframe size back\n\tthis.iframe.style.width = prev;\n\treturn width;\n};\n\nIframeView.prototype.contentHeight = function(min) {\n\tvar prev;\n\tvar height;\n\n\tprev = this.iframe.style.height;\n\tthis.iframe.style.height = (min || 0) + \"px\";\n\theight = this.contents.scrollHeight();\n\n\tthis.iframe.style.height = prev;\n\treturn height;\n};\n\n\nIframeView.prototype.resize = function(width, height) {\n\n\tif(!this.iframe) return;\n\n\tif(core.isNumber(width)){\n\t\tthis.iframe.style.width = width + \"px\";\n\t\tthis._width = width;\n\t}\n\n\tif(core.isNumber(height)){\n\t\tthis.iframe.style.height = height + \"px\";\n\t\tthis._height = height;\n\t}\n\n\tthis.iframeBounds = core.bounds(this.iframe);\n\n\tthis.reframe(this.iframeBounds.width, this.iframeBounds.height);\n\n};\n\nIframeView.prototype.reframe = function(width, height) {\n\tvar size;\n\n\t// if(!this.displayed) {\n\t// this._needsReframe = true;\n\t// return;\n\t// }\n\tif(core.isNumber(width)){\n\t\tthis.element.style.width = width + \"px\";\n\t}\n\n\tif(core.isNumber(height)){\n\t\tthis.element.style.height = height + \"px\";\n\t}\n\n\tthis.prevBounds = this.elementBounds;\n\n\tthis.elementBounds = core.bounds(this.element);\n\n\tsize = {\n\t\twidth: this.elementBounds.width,\n\t\theight: this.elementBounds.height,\n\t\twidthDelta: this.elementBounds.width - this.prevBounds.width,\n\t\theightDelta: this.elementBounds.height - this.prevBounds.height,\n\t};\n\n\tthis.onResize(this, size);\n\n\tthis.trigger(\"resized\", size);\n\n};\n\n\nIframeView.prototype.load = function(contents) {\n\tvar loading = new RSVP.defer();\n\tvar loaded = loading.promise;\n\n\tif(!this.iframe) {\n\t\tloading.reject(new Error(\"No Iframe Available\"));\n\t\treturn loaded;\n\t}\n\n\tthis.iframe.onload = function(event) {\n\n\t\tthis.onLoad(event, loading);\n\n\t}.bind(this);\n\n\tif(this.supportsSrcdoc){\n\t\tthis.iframe.srcdoc = contents;\n\t} else {\n\n\t\tthis.document = this.iframe.contentDocument;\n\n\t\tif(!this.document) {\n\t\t\tloading.reject(new Error(\"No Document Available\"));\n\t\t\treturn loaded;\n\t\t}\n\n\t\tthis.iframe.contentDocument.open();\n\t\tthis.iframe.contentDocument.write(contents);\n\t\tthis.iframe.contentDocument.close();\n\n\t}\n\n\treturn loaded;\n};\n\nIframeView.prototype.onLoad = function(event, promise) {\n\n\t\tthis.window = this.iframe.contentWindow;\n\t\tthis.document = this.iframe.contentDocument;\n\n\t\tthis.contents = new Contents(this.document, this.document.body, this.section.cfiBase);\n\n\t\tthis.rendering = false;\n\n\t\tvar link = this.document.querySelector(\"link[rel='canonical']\");\n\t\tif (link) {\n\t\t\tlink.setAttribute(\"href\", this.section.url);\n\t\t} else {\n\t\t\tlink = this.document.createElement(\"link\");\n\t\t\tlink.setAttribute(\"rel\", \"canonical\");\n\t\t\tlink.setAttribute(\"href\", this.section.url);\n\t\t\tthis.document.querySelector(\"head\").appendChild(link);\n\t\t}\n\n\t\tthis.contents.on(\"expand\", function () {\n\t\t\tif(this.displayed && this.iframe) {\n\t\t\t\t\tthis.expand();\n\t\t\t}\n\t\t});\n\n\t\tpromise.resolve(this.contents);\n};\n\n\n\n// IframeView.prototype.layout = function(layoutFunc) {\n//\n// this.iframe.style.display = \"inline-block\";\n//\n// // Reset Body Styles\n// // this.document.body.style.margin = \"0\";\n// //this.document.body.style.display = \"inline-block\";\n// //this.document.documentElement.style.width = \"auto\";\n//\n// if(layoutFunc){\n// this.layoutFunc = layoutFunc;\n// }\n//\n// this.contents.layout(this.layoutFunc);\n//\n// };\n//\n// IframeView.prototype.onLayout = function(view) {\n// // stub\n// };\n\nIframeView.prototype.setLayout = function(layout) {\n\tthis.layout = layout;\n};\n\nIframeView.prototype.setAxis = function(axis) {\n\tthis.settings.axis = axis;\n};\n\nIframeView.prototype.resizeListenters = function() {\n\t// Test size again\n\tclearTimeout(this.expanding);\n\tthis.expanding = setTimeout(this.expand.bind(this), 350);\n};\n\nIframeView.prototype.addListeners = function() {\n\t//TODO: Add content listeners for expanding\n};\n\nIframeView.prototype.removeListeners = function(layoutFunc) {\n\t//TODO: remove content listeners for expanding\n};\n\nIframeView.prototype.display = function(request) {\n\tvar displayed = new RSVP.defer();\n\n\tif (!this.displayed) {\n\n\t\tthis.render(request).then(function () {\n\n\t\t\tthis.trigger(\"displayed\", this);\n\t\t\tthis.onDisplayed(this);\n\n\t\t\tthis.displayed = true;\n\t\t\tdisplayed.resolve(this);\n\n\t\t}.bind(this));\n\n\t} else {\n\t\tdisplayed.resolve(this);\n\t}\n\n\n\treturn displayed.promise;\n};\n\nIframeView.prototype.show = function() {\n\n\tthis.element.style.visibility = \"visible\";\n\n\tif(this.iframe){\n\t\tthis.iframe.style.visibility = \"visible\";\n\t}\n\n\tthis.trigger(\"shown\", this);\n};\n\nIframeView.prototype.hide = function() {\n\t// this.iframe.style.display = \"none\";\n\tthis.element.style.visibility = \"hidden\";\n\tthis.iframe.style.visibility = \"hidden\";\n\n\tthis.stopExpanding = true;\n\tthis.trigger(\"hidden\", this);\n};\n\nIframeView.prototype.position = function() {\n\treturn this.element.getBoundingClientRect();\n};\n\nIframeView.prototype.locationOf = function(target) {\n\tvar parentPos = this.iframe.getBoundingClientRect();\n\tvar targetPos = this.contents.locationOf(target, this.settings.ignoreClass);\n\n\treturn {\n\t\t\"left\": window.scrollX + parentPos.left + targetPos.left,\n\t\t\"top\": window.scrollY + parentPos.top + targetPos.top\n\t};\n};\n\nIframeView.prototype.onDisplayed = function(view) {\n\t// Stub, override with a custom functions\n};\n\nIframeView.prototype.onResize = function(view, e) {\n\t// Stub, override with a custom functions\n};\n\nIframeView.prototype.bounds = function() {\n\tif(!this.elementBounds) {\n\t\tthis.elementBounds = core.bounds(this.element);\n\t}\n\treturn this.elementBounds;\n};\n\nIframeView.prototype.destroy = function() {\n\n\tif(this.displayed){\n\t\tthis.displayed = false;\n\n\t\tthis.removeListeners();\n\n\t\tthis.stopExpanding = true;\n\t\tthis.element.removeChild(this.iframe);\n\t\tthis.displayed = false;\n\t\tthis.iframe = null;\n\n\t\tthis._textWidth = null;\n\t\tthis._textHeight = null;\n\t\tthis._width = null;\n\t\tthis._height = null;\n\t}\n\t// this.element.style.height = \"0px\";\n\t// this.element.style.width = \"0px\";\n};\n\nRSVP.EventTarget.mixin(IframeView.prototype);\n\nmodule.exports = IframeView;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/managers/views/iframe.js\n ** module id = 31\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar core = require('../../core');\nvar EpubCFI = require('../../epubcfi');\nvar Mapping = require('../../mapping');\nvar Queue = require('../../queue');\nvar Stage = require('../helpers/stage');\nvar Views = require('../helpers/views');\n\nfunction DefaultViewManager(options) {\n\n\tthis.name = \"default\";\n\tthis.View = options.view;\n\tthis.request = options.request;\n\tthis.renditionQueue = options.queue;\n\tthis.q = new Queue(this);\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\tinfinite: true,\n\t\thidden: false,\n\t\twidth: undefined,\n\t\theight: undefined,\n\t\t// globalLayoutProperties : { layout: 'reflowable', spread: 'auto', orientation: 'auto'},\n\t\t// layout: null,\n\t\taxis: \"vertical\",\n\t\tignoreClass: ''\n\t});\n\n\tcore.extend(this.settings, options.settings || {});\n\n\tthis.viewSettings = {\n\t\tignoreClass: this.settings.ignoreClass,\n\t\taxis: this.settings.axis,\n\t\tlayout: this.layout,\n\t\twidth: 0,\n\t\theight: 0\n\t};\n\n}\n\nDefaultViewManager.prototype.render = function(element, size){\n\n\t// Save the stage\n\tthis.stage = new Stage({\n\t\twidth: size.width,\n\t\theight: size.height,\n\t\toverflow: this.settings.overflow,\n\t\thidden: this.settings.hidden,\n\t\taxis: this.settings.axis\n\t});\n\n\tthis.stage.attachTo(element);\n\n\t// Get this stage container div\n\tthis.container = this.stage.getContainer();\n\n\t// Views array methods\n\tthis.views = new Views(this.container);\n\n\t// Calculate Stage Size\n\tthis._bounds = this.bounds();\n\tthis._stageSize = this.stage.size();\n\n\t// Set the dimensions for views\n\tthis.viewSettings.width = this._stageSize.width;\n\tthis.viewSettings.height = this._stageSize.height;\n\n\t// Function to handle a resize event.\n\t// Will only attach if width and height are both fixed.\n\tthis.stage.onResize(this.onResized.bind(this));\n\n\t// Add Event Listeners\n\tthis.addEventListeners();\n\n\t// Add Layout method\n\t// this.applyLayoutMethod();\n\tif (this.layout) {\n\t\tthis.updateLayout();\n\t}\n};\n\nDefaultViewManager.prototype.addEventListeners = function(){\n\twindow.addEventListener('unload', function(e){\n\t\tthis.destroy();\n\t}.bind(this));\n};\n\nDefaultViewManager.prototype.destroy = function(){\n\t// this.views.each(function(view){\n\t// \tview.destroy();\n\t// });\n\n\t/*\n\n\t\tclearTimeout(this.trimTimeout);\n\t\tif(this.settings.hidden) {\n\t\t\tthis.element.removeChild(this.wrapper);\n\t\t} else {\n\t\t\tthis.element.removeChild(this.container);\n\t\t}\n\t*/\n};\n\nDefaultViewManager.prototype.onResized = function(e) {\n\tclearTimeout(this.resizeTimeout);\n\tthis.resizeTimeout = setTimeout(function(){\n\t\tthis.resize();\n\t}.bind(this), 150);\n};\n\nDefaultViewManager.prototype.resize = function(width, height){\n\n\t// Clear the queue\n\tthis.q.clear();\n\n\tthis._stageSize = this.stage.size(width, height);\n\tthis._bounds = this.bounds();\n\n\t// Update for new views\n\tthis.viewSettings.width = this._stageSize.width;\n\tthis.viewSettings.height = this._stageSize.height;\n\n\t// Update for existing views\n\tthis.views.each(function(view) {\n\t\tview.size(this._stageSize.width, this._stageSize.height);\n\t}.bind(this));\n\n\tthis.updateLayout();\n\n\tthis.trigger(\"resized\", {\n\t\twidth: this.stage.width,\n\t\theight: this.stage.height\n\t});\n\n};\n\nDefaultViewManager.prototype.createView = function(section) {\n\treturn new this.View(section, this.viewSettings);\n};\n\nDefaultViewManager.prototype.display = function(section, target){\n\n\tvar displaying = new RSVP.defer();\n\tvar displayed = displaying.promise;\n\n\t// Check to make sure the section we want isn't already shown\n\tvar visible = this.views.find(section);\n\n\t// View is already shown, just move to correct location\n\tif(visible && target) {\n\t\toffset = visible.locationOf(target);\n\t\tthis.moveTo(offset);\n\t\tdisplaying.resolve();\n\t\treturn displayed;\n\t}\n\n\t// Hide all current views\n\tthis.views.hide();\n\n\tthis.views.clear();\n\n\tthis.add(section)\n\t\t.then(function(){\n\t\t\tvar next;\n\t\t\tif (this.layout.name === \"pre-paginated\" &&\n\t\t\t\t\tthis.layout.divisor > 1) {\n\t\t\t\tnext = section.next();\n\t\t\t\tif (next) {\n\t\t\t\t\treturn this.add(next);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this))\n\t\t.then(function(view){\n\n\t\t\t// Move to correct place within the section, if needed\n\t\t\tif(target) {\n\t\t\t\toffset = view.locationOf(target);\n\t\t\t\tthis.moveTo(offset);\n\t\t\t}\n\n\t\t\tthis.views.show();\n\n\t\t\tdisplaying.resolve();\n\n\t\t}.bind(this))\n\t\t// .then(function(){\n\t\t// \treturn this.hooks.display.trigger(view);\n\t\t// }.bind(this))\n\t\t// .then(function(){\n\t\t// \tthis.views.show();\n\t\t// }.bind(this));\n\t\treturn displayed;\n};\n\nDefaultViewManager.prototype.afterDisplayed = function(view){\n\tthis.trigger(\"added\", view);\n};\n\nDefaultViewManager.prototype.afterResized = function(view){\n\tthis.trigger(\"resize\", view.section);\n};\n\n// DefaultViewManager.prototype.moveTo = function(offset){\n// \tthis.scrollTo(offset.left, offset.top);\n// };\n\nDefaultViewManager.prototype.moveTo = function(offset){\n\tvar distX = 0,\n\t\t\tdistY = 0;\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tdistY = offset.top;\n\t} else {\n\t\tdistX = Math.floor(offset.left / this.layout.delta) * this.layout.delta;\n\n\t\tif (distX + this.layout.delta > this.container.scrollWidth) {\n\t\t\tdistX = this.container.scrollWidth - this.layout.delta;\n\t\t}\n\t}\n\n\tthis.scrollTo(distX, distY);\n};\n\nDefaultViewManager.prototype.add = function(section){\n\tvar view = this.createView(section);\n\n\tthis.views.append(view);\n\n\t// view.on(\"shown\", this.afterDisplayed.bind(this));\n\tview.onDisplayed = this.afterDisplayed.bind(this);\n\tview.onResize = this.afterResized.bind(this);\n\n\treturn view.display(this.request);\n\n};\n\nDefaultViewManager.prototype.append = function(section){\n\tvar view = this.createView(section);\n\tthis.views.append(view);\n\treturn view.display(this.request);\n};\n\nDefaultViewManager.prototype.prepend = function(section){\n\tvar view = this.createView(section);\n\n\tthis.views.prepend(view);\n\treturn view.display(this.request);\n};\n// DefaultViewManager.prototype.resizeView = function(view) {\n//\n// \tif(this.settings.globalLayoutProperties.layout === \"pre-paginated\") {\n// \t\tview.lock(\"both\", this.bounds.width, this.bounds.height);\n// \t} else {\n// \t\tview.lock(\"width\", this.bounds.width, this.bounds.height);\n// \t}\n//\n// };\n\nDefaultViewManager.prototype.next = function(){\n\tvar next;\n\tvar view;\n\tvar left;\n\n\tif(!this.views.length) return;\n\n\tif(this.settings.axis === \"horizontal\") {\n\n\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\tleft = this.container.scrollLeft + this.container.offsetWidth + this.layout.delta;\n\n\t\tif(left < this.container.scrollWidth) {\n\t\t\tthis.scrollBy(this.layout.delta, 0);\n\t\t} else if (left - this.layout.columnWidth === this.container.scrollWidth) {\n\t\t\tthis.scrollTo(this.container.scrollWidth - this.layout.delta, 0);\n\t\t} else {\n\t\t\tnext = this.views.last().section.next();\n\t\t}\n\n\n\t} else {\n\n\t\tnext = this.views.last().section.next();\n\n\t}\n\n\tif(next) {\n\t\tthis.views.clear();\n\n\t\treturn this.append(next)\n\t\t\t.then(function(){\n\t\t\t\tvar right;\n\t\t\t\tif (this.layout.name && this.layout.divisor > 1) {\n\t\t\t\t\tright = next.next();\n\t\t\t\t\tif (right) {\n\t\t\t\t\t\treturn this.append(right);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tthis.views.show();\n\t\t\t}.bind(this));\n\t}\n\n\n};\n\nDefaultViewManager.prototype.prev = function(){\n\tvar prev;\n\tvar view;\n\tvar left;\n\n\tif(!this.views.length) return;\n\n\tif(this.settings.axis === \"horizontal\") {\n\n\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\tleft = this.container.scrollLeft;\n\n\t\tif(left > 0) {\n\t\t\tthis.scrollBy(-this.layout.delta, 0);\n\t\t} else {\n\t\t\tprev = this.views.first().section.prev();\n\t\t}\n\n\n\t} else {\n\n\t\tprev = this.views.first().section.prev();\n\n\t}\n\n\tif(prev) {\n\t\tthis.views.clear();\n\n\t\treturn this.prepend(prev)\n\t\t\t.then(function(){\n\t\t\t\tvar left;\n\t\t\t\tif (this.layout.name && this.layout.divisor > 1) {\n\t\t\t\t\tleft = prev.prev();\n\t\t\t\t\tif (left) {\n\t\t\t\t\t\treturn this.prepend(left);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tif(this.settings.axis === \"horizontal\") {\n\t\t\t\t\tthis.scrollTo(this.container.scrollWidth - this.layout.delta, 0);\n\t\t\t\t}\n\t\t\t\tthis.views.show();\n\t\t\t}.bind(this));\n\t}\n};\n\nDefaultViewManager.prototype.current = function(){\n\tvar visible = this.visible();\n\tif(visible.length){\n\t\t// Current is the last visible view\n\t\treturn visible[visible.length-1];\n\t}\n\treturn null;\n};\n\nDefaultViewManager.prototype.currentLocation = function(){\n\tvar view;\n\tvar start, end;\n\n\tif(this.views.length) {\n\t\tview = this.views.first();\n\t\tstart = container.left - view.position().left;\n\t\tend = start + this.layout.spread;\n\n\t\treturn this.mapping.page(view, view.section.cfiBase);\n\t}\n\n};\n\nDefaultViewManager.prototype.isVisible = function(view, offsetPrev, offsetNext, _container){\n\tvar position = view.position();\n\tvar container = _container || this.bounds();\n\n\tif(this.settings.axis === \"horizontal\" &&\n\t\tposition.right > container.left - offsetPrev &&\n\t\tposition.left < container.right + offsetNext) {\n\n\t\treturn true;\n\n\t} else if(this.settings.axis === \"vertical\" &&\n\t\tposition.bottom > container.top - offsetPrev &&\n\t\tposition.top < container.bottom + offsetNext) {\n\n\t\treturn true;\n\t}\n\n\treturn false;\n\n};\n\nDefaultViewManager.prototype.visible = function(){\n\t// return this.views.displayed();\n\tvar container = this.bounds();\n\tvar views = this.views.displayed();\n\tvar viewsLength = views.length;\n\tvar visible = [];\n\tvar isVisible;\n\tvar view;\n\n\tfor (var i = 0; i < viewsLength; i++) {\n\t\tview = views[i];\n\t\tisVisible = this.isVisible(view, 0, 0, container);\n\n\t\tif(isVisible === true) {\n\t\t\tvisible.push(view);\n\t\t}\n\n\t}\n\treturn visible;\n};\n\nDefaultViewManager.prototype.scrollBy = function(x, y, silent){\n\tif(silent) {\n\t\tthis.ignore = true;\n\t}\n\n\tif(this.settings.height) {\n\n\t\tif(x) this.container.scrollLeft += x;\n\t\tif(y) this.container.scrollTop += y;\n\n\t} else {\n\t\twindow.scrollBy(x,y);\n\t}\n\t// console.log(\"scrollBy\", x, y);\n\tthis.scrolled = true;\n\tthis.onScroll();\n};\n\nDefaultViewManager.prototype.scrollTo = function(x, y, silent){\n\tif(silent) {\n\t\tthis.ignore = true;\n\t}\n\n\tif(this.settings.height) {\n\t\tthis.container.scrollLeft = x;\n\t\tthis.container.scrollTop = y;\n\t} else {\n\t\twindow.scrollTo(x,y);\n\t}\n\t// console.log(\"scrollTo\", x, y);\n\tthis.scrolled = true;\n\tthis.onScroll();\n\t// if(this.container.scrollLeft != x){\n\t// setTimeout(function() {\n\t// this.scrollTo(x, y, silent);\n\t// }.bind(this), 10);\n\t// return;\n\t// };\n };\n\nDefaultViewManager.prototype.onScroll = function(){\n\n};\n\nDefaultViewManager.prototype.bounds = function() {\n\tvar bounds;\n\n\tbounds = this.stage.bounds();\n\n\treturn bounds;\n};\n\nDefaultViewManager.prototype.applyLayout = function(layout) {\n\n\tthis.layout = layout;\n\tthis.updateLayout();\n\n\tthis.mapping = new Mapping(this.layout);\n\t // this.manager.layout(this.layout.format);\n};\n\nDefaultViewManager.prototype.updateLayout = function() {\n\tif (!this.stage) {\n\t\treturn;\n\t}\n\n\tthis._stageSize = this.stage.size();\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tthis.layout.calculate(this._stageSize.width, this._stageSize.height);\n\t} else {\n\t\tthis.layout.calculate(\n\t\t\tthis._stageSize.width,\n\t\t\tthis._stageSize.height,\n\t\t\tthis.settings.gap\n\t\t);\n\n\t\t// Set the look ahead offset for what is visible\n\t\tthis.settings.offset = this.layout.delta;\n\n\t\tthis.stage.addStyleRules(\"iframe\", [{\"margin-right\" : this.layout.gap + \"px\"}]);\n\n\t}\n\n\t// Set the dimensions for views\n\tthis.viewSettings.width = this.layout.width;\n\tthis.viewSettings.height = this.layout.height;\n\n\tthis.setLayout(this.layout);\n\n};\n\nDefaultViewManager.prototype.setLayout = function(layout){\n\n\tthis.viewSettings.layout = layout;\n\n\tif(this.views) {\n\n\t\tthis.views.each(function(view){\n\t\t\tview.setLayout(layout);\n\t\t});\n\n\t}\n\n};\n\nDefaultViewManager.prototype.updateFlow = function(flow){\n\tvar axis = (flow === \"paginated\") ? \"horizontal\" : \"vertical\";\n\n\tthis.settings.axis = axis;\n\n\tthis.viewSettings.axis = axis;\n\n\tthis.settings.overflow = (flow === \"paginated\") ? \"hidden\" : \"auto\";\n\t// this.views.each(function(view){\n\t// \tview.setAxis(axis);\n\t// });\n\n};\n\n //-- Enable binding events to Manager\n RSVP.EventTarget.mixin(DefaultViewManager.prototype);\n\n module.exports = DefaultViewManager;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/managers/default/index.js\n ** module id = 32\n ** module chunks = 0\n **/","var core = require('../../core');\n\nfunction Stage(_options) {\n\tthis.settings = _options || {};\n\tthis.id = \"epubjs-container-\" + core.uuid();\n\n\tthis.container = this.create(this.settings);\n\n\tif(this.settings.hidden) {\n\t\tthis.wrapper = this.wrap(this.container);\n\t}\n\n}\n\n/**\n* Creates an element to render to.\n* Resizes to passed width and height or to the elements size\n*/\nStage.prototype.create = function(options){\n\tvar height = options.height;// !== false ? options.height : \"100%\";\n\tvar width = options.width;// !== false ? options.width : \"100%\";\n\tvar overflow = options.overflow || false;\n\tvar axis = options.axis || \"vertical\";\n\n\tif(options.height && core.isNumber(options.height)) {\n\t\theight = options.height + \"px\";\n\t}\n\n\tif(options.width && core.isNumber(options.width)) {\n\t\twidth = options.width + \"px\";\n\t}\n\n\t// Create new container element\n\tcontainer = document.createElement(\"div\");\n\n\tcontainer.id = this.id;\n\tcontainer.classList.add(\"epub-container\");\n\n\t// Style Element\n\t// container.style.fontSize = \"0\";\n\tcontainer.style.wordSpacing = \"0\";\n\tcontainer.style.lineHeight = \"0\";\n\tcontainer.style.verticalAlign = \"top\";\n\n\tif(axis === \"horizontal\") {\n\t\tcontainer.style.whiteSpace = \"nowrap\";\n\t}\n\n\tif(width){\n\t\tcontainer.style.width = width;\n\t}\n\n\tif(height){\n\t\tcontainer.style.height = height;\n\t}\n\n\tif (overflow) {\n\t\tcontainer.style.overflow = overflow;\n\t}\n\n\treturn container;\n};\n\nStage.wrap = function(container) {\n\tvar wrapper = document.createElement(\"div\");\n\n\twrapper.style.visibility = \"hidden\";\n\twrapper.style.overflow = \"hidden\";\n\twrapper.style.width = \"0\";\n\twrapper.style.height = \"0\";\n\n\twrapper.appendChild(container);\n\treturn wrapper;\n};\n\n\nStage.prototype.getElement = function(_element){\n\tvar element;\n\n\tif(core.isElement(_element)) {\n\t\telement = _element;\n\t} else if (typeof _element === \"string\") {\n\t\telement = document.getElementById(_element);\n\t}\n\n\tif(!element){\n\t\tconsole.error(\"Not an Element\");\n\t\treturn;\n\t}\n\n\treturn element;\n};\n\nStage.prototype.attachTo = function(what){\n\n\tvar element = this.getElement(what);\n\tvar base;\n\n\tif(!element){\n\t\treturn;\n\t}\n\n\tif(this.settings.hidden) {\n\t\tbase = this.wrapper;\n\t} else {\n\t\tbase = this.container;\n\t}\n\n\telement.appendChild(base);\n\n\tthis.element = element;\n\n\treturn element;\n\n};\n\nStage.prototype.getContainer = function() {\n\treturn this.container;\n};\n\nStage.prototype.onResize = function(func){\n\t// Only listen to window for resize event if width and height are not fixed.\n\t// This applies if it is set to a percent or auto.\n\tif(!core.isNumber(this.settings.width) ||\n\t\t !core.isNumber(this.settings.height) ) {\n\t\twindow.addEventListener(\"resize\", func, false);\n\t}\n\n};\n\nStage.prototype.size = function(width, height){\n\tvar bounds;\n\t// var width = _width || this.settings.width;\n\t// var height = _height || this.settings.height;\n\n\t// If width or height are set to false, inherit them from containing element\n\tif(width === null) {\n\t\tbounds = this.element.getBoundingClientRect();\n\n\t\tif(bounds.width) {\n\t\t\twidth = bounds.width;\n\t\t\tthis.container.style.width = bounds.width + \"px\";\n\t\t}\n\t}\n\n\tif(height === null) {\n\t\tbounds = bounds || this.element.getBoundingClientRect();\n\n\t\tif(bounds.height) {\n\t\t\theight = bounds.height;\n\t\t\tthis.container.style.height = bounds.height + \"px\";\n\t\t}\n\n\t}\n\n\tif(!core.isNumber(width)) {\n\t\tbounds = this.container.getBoundingClientRect();\n\t\twidth = bounds.width;\n\t\t//height = bounds.height;\n\t}\n\n\tif(!core.isNumber(height)) {\n\t\tbounds = bounds || this.container.getBoundingClientRect();\n\t\t//width = bounds.width;\n\t\theight = bounds.height;\n\t}\n\n\n\tthis.containerStyles = window.getComputedStyle(this.container);\n\n\tthis.containerPadding = {\n\t\tleft: parseFloat(this.containerStyles[\"padding-left\"]) || 0,\n\t\tright: parseFloat(this.containerStyles[\"padding-right\"]) || 0,\n\t\ttop: parseFloat(this.containerStyles[\"padding-top\"]) || 0,\n\t\tbottom: parseFloat(this.containerStyles[\"padding-bottom\"]) || 0\n\t};\n\n\treturn {\n\t\twidth: width -\n\t\t\t\t\t\tthis.containerPadding.left -\n\t\t\t\t\t\tthis.containerPadding.right,\n\t\theight: height -\n\t\t\t\t\t\tthis.containerPadding.top -\n\t\t\t\t\t\tthis.containerPadding.bottom\n\t};\n\n};\n\nStage.prototype.bounds = function(){\n\n\tif(!this.container) {\n\t\treturn core.windowBounds();\n\t} else {\n\t\treturn this.container.getBoundingClientRect();\n\t}\n\n}\n\nStage.prototype.getSheet = function(){\n\tvar style = document.createElement(\"style\");\n\n\t// WebKit hack --> https://davidwalsh.name/add-rules-stylesheets\n\tstyle.appendChild(document.createTextNode(\"\"));\n\n\tdocument.head.appendChild(style);\n\n\treturn style.sheet;\n}\n\nStage.prototype.addStyleRules = function(selector, rulesArray){\n\tvar scope = \"#\" + this.id + \" \";\n\tvar rules = \"\";\n\n\tif(!this.sheet){\n\t\tthis.sheet = this.getSheet();\n\t}\n\n\trulesArray.forEach(function(set) {\n\t\tfor (var prop in set) {\n\t\t\tif(set.hasOwnProperty(prop)) {\n\t\t\t\trules += prop + \":\" + set[prop] + \";\";\n\t\t\t}\n\t\t}\n\t})\n\n\tthis.sheet.insertRule(scope + selector + \" {\" + rules + \"}\", 0);\n}\n\n\n\nmodule.exports = Stage;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/managers/helpers/stage.js\n ** module id = 33\n ** module chunks = 0\n **/","function Views(container) {\n\tthis.container = container;\n\tthis._views = [];\n\tthis.length = 0;\n\tthis.hidden = false;\n};\n\nViews.prototype.all = function() {\n\treturn this._views;\n};\n\nViews.prototype.first = function() {\n\treturn this._views[0];\n};\n\nViews.prototype.last = function() {\n\treturn this._views[this._views.length-1];\n};\n\nViews.prototype.indexOf = function(view) {\n\treturn this._views.indexOf(view);\n};\n\nViews.prototype.slice = function() {\n\treturn this._views.slice.apply(this._views, arguments);\n};\n\nViews.prototype.get = function(i) {\n\treturn this._views[i];\n};\n\nViews.prototype.append = function(view){\n\tthis._views.push(view);\n\tif(this.container){\n\t\tthis.container.appendChild(view.element);\n\t}\n\tthis.length++;\n\treturn view;\n};\n\nViews.prototype.prepend = function(view){\n\tthis._views.unshift(view);\n\tif(this.container){\n\t\tthis.container.insertBefore(view.element, this.container.firstChild);\n\t}\n\tthis.length++;\n\treturn view;\n};\n\nViews.prototype.insert = function(view, index) {\n\tthis._views.splice(index, 0, view);\n\n\tif(this.container){\n\t\tif(index < this.container.children.length){\n\t\t\tthis.container.insertBefore(view.element, this.container.children[index]);\n\t\t} else {\n\t\t\tthis.container.appendChild(view.element);\n\t\t}\n\t}\n\n\tthis.length++;\n\treturn view;\n};\n\nViews.prototype.remove = function(view) {\n\tvar index = this._views.indexOf(view);\n\n\tif(index > -1) {\n\t\tthis._views.splice(index, 1);\n\t}\n\n\n\tthis.destroy(view);\n\n\tthis.length--;\n};\n\nViews.prototype.destroy = function(view) {\n\tview.off(\"resized\");\n\n\tif(view.displayed){\n\t\tview.destroy();\n\t}\n\n\tif(this.container){\n\t\t this.container.removeChild(view.element);\n\t}\n\tview = null;\n};\n\n// Iterators\n\nViews.prototype.each = function() {\n\treturn this._views.forEach.apply(this._views, arguments);\n};\n\nViews.prototype.clear = function(){\n\t// Remove all views\n\tvar view;\n\tvar len = this.length;\n\n\tif(!this.length) return;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tthis.destroy(view);\n\t}\n\n\tthis._views = [];\n\tthis.length = 0;\n};\n\nViews.prototype.find = function(section){\n\n\tvar view;\n\tvar len = this.length;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tif(view.displayed && view.section.index == section.index) {\n\t\t\treturn view;\n\t\t}\n\t}\n\n};\n\nViews.prototype.displayed = function(){\n\tvar displayed = [];\n\tvar view;\n\tvar len = this.length;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tif(view.displayed){\n\t\t\tdisplayed.push(view);\n\t\t}\n\t}\n\treturn displayed;\n};\n\nViews.prototype.show = function(){\n\tvar view;\n\tvar len = this.length;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tif(view.displayed){\n\t\t\tview.show();\n\t\t}\n\t}\n\tthis.hidden = false;\n};\n\nViews.prototype.hide = function(){\n\tvar view;\n\tvar len = this.length;\n\n\tfor (var i = 0; i < len; i++) {\n\t\tview = this._views[i];\n\t\tif(view.displayed){\n\t\t\tview.hide();\n\t\t}\n\t}\n\tthis.hidden = true;\n};\n\nmodule.exports = Views;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/managers/helpers/views.js\n ** module id = 34\n ** module chunks = 0\n **/","var RSVP = require('rsvp');\nvar core = require('../../core');\nvar DefaultViewManager = require('../default');\n\nfunction ContinuousViewManager(options) {\n\n\tDefaultViewManager.apply(this, arguments); // call super constructor.\n\n\tthis.name = \"continuous\";\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\tinfinite: true,\n\t\toverflow: \"auto\",\n\t\taxis: \"vertical\",\n\t\toffset: 500,\n\t\toffsetDelta: 250,\n\t\twidth: undefined,\n\t\theight: undefined\n\t});\n\n\tcore.extend(this.settings, options.settings || {});\n\n\t// Gap can be 0, byt defaults doesn't handle that\n\tif (options.settings.gap != \"undefined\" && options.settings.gap === 0) {\n\t\tthis.settings.gap = options.settings.gap;\n\t}\n\n\t// this.viewSettings.axis = this.settings.axis;\n\tthis.viewSettings = {\n\t\tignoreClass: this.settings.ignoreClass,\n\t\taxis: this.settings.axis,\n\t\tlayout: this.layout,\n\t\twidth: 0,\n\t\theight: 0\n\t};\n\n\tthis.scrollTop = 0;\n\tthis.scrollLeft = 0;\n};\n\n// subclass extends superclass\nContinuousViewManager.prototype = Object.create(DefaultViewManager.prototype);\nContinuousViewManager.prototype.constructor = ContinuousViewManager;\n\nContinuousViewManager.prototype.display = function(section, target){\n\treturn DefaultViewManager.prototype.display.call(this, section, target)\n\t\t.then(function () {\n\t\t\treturn this.fill();\n\t\t}.bind(this));\n};\n\nContinuousViewManager.prototype.fill = function(_full){\n\tvar full = _full || new RSVP.defer();\n\n\tthis.check().then(function(result) {\n\t\tif (result) {\n\t\t\tthis.fill(full);\n\t\t} else {\n\t\t\tfull.resolve();\n\t\t}\n\t}.bind(this));\n\n\treturn full.promise;\n}\n\nContinuousViewManager.prototype.moveTo = function(offset){\n\t// var bounds = this.stage.bounds();\n\t// var dist = Math.floor(offset.top / bounds.height) * bounds.height;\n\tvar distX = 0,\n\t\t\tdistY = 0;\n\n\tvar offsetX = 0,\n\t\t\toffsetY = 0;\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tdistY = offset.top;\n\t\toffsetY = offset.top+this.settings.offset;\n\t} else {\n\t\tdistX = Math.floor(offset.left / this.layout.delta) * this.layout.delta;\n\t\toffsetX = distX+this.settings.offset;\n\t}\n\n\treturn this.check(offsetX, offsetY)\n\t\t.then(function(){\n\t\t\tthis.scrollBy(distX, distY);\n\t\t}.bind(this));\n};\n\n/*\nContinuousViewManager.prototype.afterDisplayed = function(currView){\n\tvar next = currView.section.next();\n\tvar prev = currView.section.prev();\n\tvar index = this.views.indexOf(currView);\n\tvar prevView, nextView;\n\n\tif(index + 1 === this.views.length && next) {\n\t\tnextView = this.createView(next);\n\t\tthis.q.enqueue(this.append.bind(this), nextView);\n\t}\n\n\tif(index === 0 && prev) {\n\t\tprevView = this.createView(prev, this.viewSettings);\n\t\tthis.q.enqueue(this.prepend.bind(this), prevView);\n\t}\n\n\t// this.removeShownListeners(currView);\n\t// currView.onShown = this.afterDisplayed.bind(this);\n\tthis.trigger(\"added\", currView.section);\n\n};\n*/\n\nContinuousViewManager.prototype.resize = function(width, height){\n\n\t// Clear the queue\n\tthis.q.clear();\n\n\tthis._stageSize = this.stage.size(width, height);\n\tthis._bounds = this.bounds();\n\n\t// Update for new views\n\tthis.viewSettings.width = this._stageSize.width;\n\tthis.viewSettings.height = this._stageSize.height;\n\n\t// Update for existing views\n\tthis.views.each(function(view) {\n\t\tview.size(this._stageSize.width, this._stageSize.height);\n\t}.bind(this));\n\n\tthis.updateLayout();\n\n\t// if(this.location) {\n\t// this.rendition.display(this.location.start);\n\t// }\n\n\tthis.trigger(\"resized\", {\n\t\twidth: this.stage.width,\n\t\theight: this.stage.height\n\t});\n\n};\n\nContinuousViewManager.prototype.onResized = function(e) {\n\n\t// this.views.clear();\n\n\tclearTimeout(this.resizeTimeout);\n\tthis.resizeTimeout = setTimeout(function(){\n\t\tthis.resize();\n\t}.bind(this), 150);\n};\n\nContinuousViewManager.prototype.afterResized = function(view){\n\tthis.trigger(\"resize\", view.section);\n};\n\n// Remove Previous Listeners if present\nContinuousViewManager.prototype.removeShownListeners = function(view){\n\n\t// view.off(\"shown\", this.afterDisplayed);\n\t// view.off(\"shown\", this.afterDisplayedAbove);\n\tview.onDisplayed = function(){};\n\n};\n\n\n// ContinuousViewManager.prototype.append = function(section){\n// \treturn this.q.enqueue(function() {\n//\n// \t\tthis._append(section);\n//\n//\n// \t}.bind(this));\n// };\n//\n// ContinuousViewManager.prototype.prepend = function(section){\n// \treturn this.q.enqueue(function() {\n//\n// \t\tthis._prepend(section);\n//\n// \t}.bind(this));\n//\n// };\n\nContinuousViewManager.prototype.append = function(section){\n\tvar view = this.createView(section);\n\tthis.views.append(view);\n\treturn view;\n};\n\nContinuousViewManager.prototype.prepend = function(section){\n\tvar view = this.createView(section);\n\n\tview.on(\"resized\", this.counter.bind(this));\n\n\tthis.views.prepend(view);\n\treturn view;\n};\n\nContinuousViewManager.prototype.counter = function(bounds){\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tthis.scrollBy(0, bounds.heightDelta, true);\n\t} else {\n\t\tthis.scrollBy(bounds.widthDelta, 0, true);\n\t}\n\n};\n\nContinuousViewManager.prototype.update = function(_offset){\n\tvar container = this.bounds();\n\tvar views = this.views.all();\n\tvar viewsLength = views.length;\n\tvar visible = [];\n\tvar offset = typeof _offset != \"undefined\" ? _offset : (this.settings.offset || 0);\n\tvar isVisible;\n\tvar view;\n\n\tvar updating = new RSVP.defer();\n\tvar promises = [];\n\n\tfor (var i = 0; i < viewsLength; i++) {\n\t\tview = views[i];\n\n\t\tisVisible = this.isVisible(view, offset, offset, container);\n\n\t\tif(isVisible === true) {\n\t\t\tif (!view.displayed) {\n\t\t\t\tpromises.push(view.display(this.request).then(function (view) {\n\t\t\t\t\tview.show();\n\t\t\t\t}));\n\t\t\t}\n\t\t\tvisible.push(view);\n\t\t} else {\n\t\t\tthis.q.enqueue(view.destroy.bind(view));\n\n\t\t\tclearTimeout(this.trimTimeout);\n\t\t\tthis.trimTimeout = setTimeout(function(){\n\t\t\t\tthis.q.enqueue(this.trim.bind(this));\n\t\t\t}.bind(this), 250);\n\t\t}\n\n\t}\n\n\tif(promises.length){\n\t\treturn RSVP.all(promises);\n\t} else {\n\t\tupdating.resolve();\n\t\treturn updating.promise;\n\t}\n\n};\n\nContinuousViewManager.prototype.check = function(_offsetLeft, _offsetTop){\n\tvar last, first, next, prev;\n\n\tvar checking = new RSVP.defer();\n\tvar newViews = [];\n\n\tvar horizontal = (this.settings.axis === \"horizontal\");\n\tvar delta = this.settings.offset || 0;\n\n\tif (_offsetLeft && horizontal) {\n\t\tdelta = _offsetLeft;\n\t}\n\n\tif (_offsetTop && !horizontal) {\n\t\tdelta = _offsetTop;\n\t}\n\n\tvar bounds = this._bounds; // bounds saved this until resize\n\n\tvar offset = horizontal ? this.scrollLeft : this.scrollTop;\n\tvar visibleLength = horizontal ? bounds.width : bounds.height;\n\tvar contentLength = horizontal ? this.container.scrollWidth : this.container.scrollHeight;\n\n\tif (offset + visibleLength + delta >= contentLength) {\n\t\tlast = this.views.last();\n\t\tnext = last && last.section.next();\n\t\tif(next) {\n\t\t\tnewViews.push(this.append(next));\n\t\t}\n\t}\n\n\tif (offset - delta < 0 ) {\n\t\tfirst = this.views.first();\n\t\tprev = first && first.section.prev();\n\t\tif(prev) {\n\t\t\tnewViews.push(this.prepend(prev));\n\t\t}\n\t}\n\n\tif(newViews.length){\n\t\t// RSVP.all(promises)\n\t\t\t// .then(function() {\n\t\t\t\t// Check to see if anything new is on screen after rendering\n\t\t\t\treturn this.q.enqueue(function(){\n\t\t\t\t\treturn this.update(delta);\n\t\t\t\t}.bind(this));\n\n\n\t\t\t// }.bind(this));\n\n\t} else {\n\t\tchecking.resolve(false);\n\t\treturn checking.promise;\n\t}\n\n\n};\n\nContinuousViewManager.prototype.trim = function(){\n\tvar task = new RSVP.defer();\n\tvar displayed = this.views.displayed();\n\tvar first = displayed[0];\n\tvar last = displayed[displayed.length-1];\n\tvar firstIndex = this.views.indexOf(first);\n\tvar lastIndex = this.views.indexOf(last);\n\tvar above = this.views.slice(0, firstIndex);\n\tvar below = this.views.slice(lastIndex+1);\n\n\t// Erase all but last above\n\tfor (var i = 0; i < above.length-1; i++) {\n\t\tthis.erase(above[i], above);\n\t}\n\n\t// Erase all except first below\n\tfor (var j = 1; j < below.length; j++) {\n\t\tthis.erase(below[j]);\n\t}\n\n\ttask.resolve();\n\treturn task.promise;\n};\n\nContinuousViewManager.prototype.erase = function(view, above){ //Trim\n\n\tvar prevTop;\n\tvar prevLeft;\n\n\tif(this.settings.height) {\n\t\tprevTop = this.container.scrollTop;\n\t\tprevLeft = this.container.scrollLeft;\n\t} else {\n\t\tprevTop = window.scrollY;\n\t\tprevLeft = window.scrollX;\n\t}\n\n\tvar bounds = view.bounds();\n\n\tthis.views.remove(view);\n\n\tif(above) {\n\n\t\tif(this.settings.axis === \"vertical\") {\n\t\t\tthis.scrollTo(0, prevTop - bounds.height, true);\n\t\t} else {\n\t\t\tthis.scrollTo(prevLeft - bounds.width, 0, true);\n\t\t}\n\t}\n\n};\n\nContinuousViewManager.prototype.addEventListeners = function(stage){\n\n\twindow.addEventListener('unload', function(e){\n\t\tthis.ignore = true;\n\t\t// this.scrollTo(0,0);\n\t\tthis.destroy();\n\t}.bind(this));\n\n\tthis.addScrollListeners();\n};\n\nContinuousViewManager.prototype.addScrollListeners = function() {\n\tvar scroller;\n\n\tthis.tick = core.requestAnimationFrame;\n\n\tif(this.settings.height) {\n\t\tthis.prevScrollTop = this.container.scrollTop;\n\t\tthis.prevScrollLeft = this.container.scrollLeft;\n\t} else {\n\t\tthis.prevScrollTop = window.scrollY;\n\t\tthis.prevScrollLeft = window.scrollX;\n\t}\n\n\tthis.scrollDeltaVert = 0;\n\tthis.scrollDeltaHorz = 0;\n\n\tif(this.settings.height) {\n\t\tscroller = this.container;\n\t\tthis.scrollTop = this.container.scrollTop;\n\t\tthis.scrollLeft = this.container.scrollLeft;\n\t} else {\n\t\tscroller = window;\n\t\tthis.scrollTop = window.scrollY;\n\t\tthis.scrollLeft = window.scrollX;\n\t}\n\n\tscroller.addEventListener(\"scroll\", this.onScroll.bind(this));\n\n\t// this.tick.call(window, this.onScroll.bind(this));\n\n\tthis.scrolled = false;\n\n};\n\nContinuousViewManager.prototype.onScroll = function(){\n\n\t// if(!this.ignore) {\n\n\t\tif(this.settings.height) {\n\t\t\tscrollTop = this.container.scrollTop;\n\t\t\tscrollLeft = this.container.scrollLeft;\n\t\t} else {\n\t\t\tscrollTop = window.scrollY;\n\t\t\tscrollLeft = window.scrollX;\n\t\t}\n\n\t\tthis.scrollTop = scrollTop;\n\t\tthis.scrollLeft = scrollLeft;\n\n\t\tif(!this.ignore) {\n\n\t\t\tif((this.scrollDeltaVert === 0 &&\n\t\t\t\t this.scrollDeltaHorz === 0) ||\n\t\t\t\t this.scrollDeltaVert > this.settings.offsetDelta ||\n\t\t\t\t this.scrollDeltaHorz > this.settings.offsetDelta) {\n\n\t\t\t\tthis.q.enqueue(function() {\n\t\t\t\t\tthis.check();\n\t\t\t\t}.bind(this));\n\t\t\t\t// this.check();\n\n\t\t\t\tthis.scrollDeltaVert = 0;\n\t\t\t\tthis.scrollDeltaHorz = 0;\n\n\t\t\t\tthis.trigger(\"scroll\", {\n\t\t\t\t\ttop: scrollTop,\n\t\t\t\t\tleft: scrollLeft\n\t\t\t\t});\n\n\t\t\t\tclearTimeout(this.afterScrolled);\n\t\t\t\tthis.afterScrolled = setTimeout(function () {\n\t\t\t\t\tthis.trigger(\"scrolled\", {\n\t\t\t\t\t\ttop: this.scrollTop,\n\t\t\t\t\t\tleft: this.scrollLeft\n\t\t\t\t\t});\n\t\t\t\t}.bind(this));\n\n\t\t\t}\n\n\t\t} else {\n\t\t\tthis.ignore = false;\n\t\t}\n\n\t\tthis.scrollDeltaVert += Math.abs(scrollTop-this.prevScrollTop);\n\t\tthis.scrollDeltaHorz += Math.abs(scrollLeft-this.prevScrollLeft);\n\n\t\tthis.prevScrollTop = scrollTop;\n\t\tthis.prevScrollLeft = scrollLeft;\n\n\t\tclearTimeout(this.scrollTimeout);\n\t\tthis.scrollTimeout = setTimeout(function(){\n\t\t\tthis.scrollDeltaVert = 0;\n\t\t\tthis.scrollDeltaHorz = 0;\n\t\t}.bind(this), 150);\n\n\n\t\tthis.scrolled = false;\n\t// }\n\n\t// this.tick.call(window, this.onScroll.bind(this));\n\n};\n\n\n// ContinuousViewManager.prototype.resizeView = function(view) {\n//\n// \tif(this.settings.axis === \"horizontal\") {\n// \t\tview.lock(\"height\", this.stage.width, this.stage.height);\n// \t} else {\n// \t\tview.lock(\"width\", this.stage.width, this.stage.height);\n// \t}\n//\n// };\n\nContinuousViewManager.prototype.currentLocation = function(){\n\n\tif (this.settings.axis === \"vertical\") {\n\t\tthis.location = this.scrolledLocation();\n\t} else {\n\t\tthis.location = this.paginatedLocation();\n\t}\n\n\treturn this.location;\n};\n\nContinuousViewManager.prototype.scrolledLocation = function(){\n\n\tvar visible = this.visible();\n\tvar startPage, endPage;\n\n\tvar container = this.container.getBoundingClientRect();\n\n\tif(visible.length === 1) {\n\t\treturn this.mapping.page(visible[0].contents, visible[0].section.cfiBase);\n\t}\n\n\tif(visible.length > 1) {\n\n\t\tstartPage = this.mapping.page(visible[0].contents, visible[0].section.cfiBase);\n\t\tendPage = this.mapping.page(visible[visible.length-1].contents, visible[visible.length-1].section.cfiBase);\n\n\t\treturn {\n\t\t\tstart: startPage.start,\n\t\t\tend: endPage.end\n\t\t};\n\t}\n\n};\n\nContinuousViewManager.prototype.paginatedLocation = function(){\n\tvar visible = this.visible();\n\tvar startA, startB, endA, endB;\n\tvar pageLeft, pageRight;\n\tvar container = this.container.getBoundingClientRect();\n\n\tif(visible.length === 1) {\n\t\tstartA = container.left - visible[0].position().left;\n\t\tendA = startA + this.layout.spreadWidth;\n\n\t\treturn this.mapping.page(visible[0].contents, visible[0].section.cfiBase, startA, endA);\n\t}\n\n\tif(visible.length > 1) {\n\n\t\t// Left Col\n\t\tstartA = container.left - visible[0].position().left;\n\t\tendA = startA + this.layout.columnWidth;\n\n\t\t// Right Col\n\t\tstartB = container.left + this.layout.spreadWidth - visible[visible.length-1].position().left;\n\t\tendB = startB + this.layout.columnWidth;\n\n\t\tpageLeft = this.mapping.page(visible[0].contents, visible[0].section.cfiBase, startA, endA);\n\t\tpageRight = this.mapping.page(visible[visible.length-1].contents, visible[visible.length-1].section.cfiBase, startB, endB);\n\n\t\treturn {\n\t\t\tstart: pageLeft.start,\n\t\t\tend: pageRight.end\n\t\t};\n\t}\n};\n\n/*\nContinuous.prototype.current = function(what){\n\tvar view, top;\n\tvar container = this.container.getBoundingClientRect();\n\tvar length = this.views.length - 1;\n\n\tif(this.settings.axis === \"horizontal\") {\n\n\t\tfor (var i = length; i >= 0; i--) {\n\t\t\tview = this.views[i];\n\t\t\tleft = view.position().left;\n\n\t\t\tif(left < container.right) {\n\n\t\t\t\tif(this._current == view) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._current = view;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t} else {\n\n\t\tfor (var i = length; i >= 0; i--) {\n\t\t\tview = this.views[i];\n\t\t\ttop = view.bounds().top;\n\t\t\tif(top < container.bottom) {\n\n\t\t\t\tif(this._current == view) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._current = view;\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t}\n\n\treturn this._current;\n};\n*/\n\nContinuousViewManager.prototype.updateLayout = function() {\n\n\tif (!this.stage) {\n\t\treturn;\n\t}\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tthis.layout.calculate(this._stageSize.width, this._stageSize.height);\n\t} else {\n\t\tthis.layout.calculate(\n\t\t\tthis._stageSize.width,\n\t\t\tthis._stageSize.height,\n\t\t\tthis.settings.gap\n\t\t);\n\n\t\t// Set the look ahead offset for what is visible\n\t\tthis.settings.offset = this.layout.delta;\n\n\t\tthis.stage.addStyleRules(\"iframe\", [{\"margin-right\" : this.layout.gap + \"px\"}]);\n\n\t}\n\n\t// Set the dimensions for views\n\tthis.viewSettings.width = this.layout.width;\n\tthis.viewSettings.height = this.layout.height;\n\n\tthis.setLayout(this.layout);\n\n};\n\nContinuousViewManager.prototype.next = function(){\n\n\tif(this.settings.axis === \"horizontal\") {\n\n\t\tthis.scrollLeft = this.container.scrollLeft;\n\n\t\tif(this.container.scrollLeft +\n\t\t\t this.container.offsetWidth +\n\t\t\t this.layout.delta < this.container.scrollWidth) {\n\t\t\tthis.scrollBy(this.layout.delta, 0);\n\t\t} else {\n\t\t\tthis.scrollTo(this.container.scrollWidth - this.layout.delta, 0);\n\t\t}\n\n\t} else {\n\t\tthis.scrollBy(0, this.layout.height);\n\t}\n};\n\nContinuousViewManager.prototype.prev = function(){\n\tif(this.settings.axis === \"horizontal\") {\n\t\tthis.scrollBy(-this.layout.delta, 0);\n\t} else {\n\t\tthis.scrollBy(0, -this.layout.height);\n\t}\n};\n\nContinuousViewManager.prototype.updateFlow = function(flow){\n\tvar axis = (flow === \"paginated\") ? \"horizontal\" : \"vertical\";\n\n\tthis.settings.axis = axis;\n\n\tthis.viewSettings.axis = axis;\n\n\tthis.settings.overflow = (flow === \"paginated\") ? \"hidden\" : \"auto\";\n\n\t// this.views.each(function(view){\n\t// \tview.setAxis(axis);\n\t// });\n\n\tif (this.settings.axis === \"vertical\") {\n\t\tthis.settings.infinite = true;\n\t} else {\n\t\tthis.settings.infinite = false;\n\t}\n\n};\nmodule.exports = ContinuousViewManager;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/managers/continuous/index.js\n ** module id = 35\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/epub.min.js b/dist/epub.min.js index 2a6896924..5dc9a01e0 100644 --- a/dist/epub.min.js +++ b/dist/epub.min.js @@ -1,5 +1,48 @@ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.ePub=t()}}(function(){var t;return function e(t,i,r){function n(s,a){if(!i[s]){if(!t[s]){var h="function"==typeof require&&require;if(!a&&h)return h(s,!0);if(o)return o(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var c=i[s]={exports:{}};t[s][0].call(c.exports,function(e){var i=t[s][1][e];return n(i?i:e)},c,c.exports,e,t,i,r)}return i[s].exports}for(var o="function"==typeof require&&require,s=0;s1)for(var i=1;ii;i++)if(t[i]===e)return i;return-1}function n(t){var e=t._promiseCallbacks;return e||(e=t._promiseCallbacks={}),e}function o(t,e){return"onerror"===t?(K.on("error",e),void 0):2!==arguments.length?K[t]:(K[t]=e,void 0)}function s(t){return"function"==typeof t||"object"==typeof t&&null!==t}function a(t){return"function"==typeof t}function h(t){return"object"==typeof t&&null!==t}function u(){}function c(){}function p(t){try{return t.then}catch(e){return he.error=e,he}}function l(t,e,i,r){try{t.call(e,i,r)}catch(n){return n}}function d(t,e,i){K.async(function(t){var r=!1,n=l(i,e,function(i){r||(r=!0,e!==i?g(t,i):v(t,i))},function(e){r||(r=!0,b(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&n&&(r=!0,b(t,n))},t)}function f(t,e){e._state===se?v(t,e._result):t._state===ae?b(t,e._result):w(e,void 0,function(i){e!==i?g(t,i):v(t,i)},function(e){b(t,e)})}function m(t,e){if(e.constructor===t.constructor)f(t,e);else{var i=p(e);i===he?b(t,he.error):void 0===i?v(t,e):a(i)?d(t,e,i):v(t,e)}}function g(t,e){t===e?v(t,e):s(e)?m(t,e):v(t,e)}function y(t){t._onerror&&t._onerror(t._result),x(t)}function v(t,e){t._state===oe&&(t._result=e,t._state=se,0===t._subscribers.length?K.instrument&&ne("fulfilled",t):K.async(x,t))}function b(t,e){t._state===oe&&(t._state=ae,t._result=e,K.async(y,t))}function w(t,e,i,r){var n=t._subscribers,o=n.length;t._onerror=null,n[o]=e,n[o+se]=i,n[o+ae]=r,0===o&&t._state&&K.async(x,t)}function x(t){var e=t._subscribers,i=t._state;if(K.instrument&&ne(i===se?"fulfilled":"rejected",t),0!==e.length){for(var r,n,o=t._result,s=0;sa;a++)s[a]=t[a];for(r=0;rr;r++)i[r-1]=t[r];return i}function z(t,e){return{then:function(i,r){return t.call(e,i,r)}}}function F(t,e,i,r){var n=N(i,r,e);return n===ve&&b(t,n.value),t}function I(t,e,i,r){return ye.all(e).then(function(e){var n=N(i,r,e);return n===ve&&b(t,n.value),t})}function j(t){return t&&"object"==typeof t?t.constructor===ye?!0:L(t):!1}function U(t,e,i){this._superConstructor(t,e,!1,i)}function Q(t,e,i){this._superConstructor(t,e,!0,i)}function D(t,e,i){this._superConstructor(t,e,!1,i)}function H(){return function(){e.nextTick(X)}}function M(){var t=0,e=new Fe(X),i=document.createTextNode("");return e.observe(i,{characterData:!0}),function(){i.data=t=++t%2}}function W(){var t=new MessageChannel;return t.port1.onmessage=X,function(){t.port2.postMessage(0)}}function V(){return function(){setTimeout(X,1)}}function X(){for(var t=0;Oe>t;t+=2){var e=je[t],i=je[t+1];e(i),je[t]=void 0,je[t+1]=void 0}Oe=0}function $(t,e){K.async(t,e)}function J(){K.on.apply(K,arguments)}function Z(){K.off.apply(K,arguments)}var Y={mixin:function(t){return t.on=this.on,t.off=this.off,t.trigger=this.trigger,t._promiseCallbacks=void 0,t},on:function(t,e){var i,o=n(this);i=o[t],i||(i=o[t]=[]),-1===r(i,e)&&i.push(e)},off:function(t,e){var i,o,s=n(this);return e?(i=s[t],o=r(i,e),-1!==o&&i.splice(o,1),void 0):(s[t]=[],void 0)},trigger:function(t,e){var i,r,o=n(this);if(i=o[t])for(var s=0;s1)throw new Error("Second argument not supported");if("object"!=typeof t)throw new TypeError("Argument must be an object");return u.prototype=t,new u},re=[],ne=function(t,e,i){1===re.push({name:t,payload:{guid:e._guidKey+e._id,eventName:t,detail:e._result,childGuid:i&&e._guidKey+i._id,label:e._label,timeStamp:ee(),stack:new Error(e._label).stack}})&&setTimeout(function(){for(var t,e=0;er;r++)this._eachEntry(i[r],r)},C.prototype._eachEntry=function(t,e){var i=this._instanceConstructor;h(t)?t.constructor===i&&t._state!==oe?(t._onerror=null,this._settledAt(t._state,e,t._result)):this._willSettleAt(i.resolve(t),e):(this._remaining--,this._result[e]=this._makeResult(se,e,t))},C.prototype._settledAt=function(t,e,i){var r=this.promise;r._state===oe&&(this._remaining--,this._abortOnReject&&t===ae?b(r,i):this._result[e]=this._makeResult(t,e,i)),0===this._remaining&&v(r,this._result)},C.prototype._makeResult=function(t,e,i){return i},C.prototype._willSettleAt=function(t,e){var i=this;w(t,void 0,function(t){i._settledAt(se,e,t)},function(t){i._settledAt(ae,e,t)})};var pe=function(t,e){return new ce(this,t,!0,e).promise},le=function(t,e){function i(t){g(o,t)}function r(t){b(o,t)}var n=this,o=new n(c,e);if(!te(t))return b(o,new TypeError("You must pass an array to race.")),o;for(var s=t.length,a=0;o._state===oe&&s>a;a++)w(n.resolve(t[a]),void 0,i,r);return o},de=function(t,e){var i=this;if(t&&"object"==typeof t&&t.constructor===i)return t;var r=new i(c,e);return g(r,t),r},fe=function(t,e){var i=this,r=new i(c,e);return b(r,t),r},me="rsvp_"+ee()+"-",ge=0,ye=P;P.cast=de,P.all=pe,P.race=le,P.resolve=de,P.reject=fe,P.prototype={constructor:P,_guidKey:me,_onerror:function(t){K.trigger("error",t)},then:function(t,e,i){var r=this,n=r._state;if(n===se&&!t||n===ae&&!e)return K.instrument&&ne("chained",this,this),this;r._onerror=null;var o=new this.constructor(c,i),s=r._result;if(K.instrument&&ne("chained",r,o),n){var a=arguments[n-1];K.async(function(){T(n,o,a,s)})}else w(r,o,t,e);return o},"catch":function(t,e){return this.then(null,t,e)},"finally":function(t,e){var i=this.constructor;return this.then(function(e){return i.resolve(t()).then(function(){return e})},function(e){return i.resolve(t()).then(function(){throw e})},e)}};var ve=new R,be=new R,we=function(t,e){var i=function(){for(var i,r=this,n=arguments.length,o=new Array(n+1),s=!1,a=0;n>a;++a){if(i=arguments[a],!s){if(s=j(i),s===be){var h=new ye(c);return b(h,be.value),h}s&&s!==!0&&(i=z(s,i))}o[a]=i}var u=new ye(c);return o[n]=function(t,i){t?b(u,t):void 0===e?g(u,i):e===!0?g(u,B(arguments)):te(e)?g(u,O(arguments,e)):g(u,i)},s?I(u,o,t,r):F(u,o,t,r)};return i.__proto__=t,i},xe=function(t,e){return ye.all(t,e)};U.prototype=ie(ce.prototype),U.prototype._superConstructor=ce,U.prototype._makeResult=k,U.prototype._validationError=function(){return new Error("allSettled must be called with an array")};var _e=function(t,e){return new U(ye,t,e).promise},Se=function(t,e){return ye.race(t,e)},Te=Q;Q.prototype=ie(ce.prototype),Q.prototype._superConstructor=ce,Q.prototype._init=function(){this._result={}},Q.prototype._validateInput=function(t){return t&&"object"==typeof t},Q.prototype._validationError=function(){return new Error("Promise.hash must be called with an object")},Q.prototype._enumerate=function(){var t=this.promise,e=this._input,i=[];for(var r in e)t._state===oe&&e.hasOwnProperty(r)&&i.push({position:r,entry:e[r]});var n=i.length;this._remaining=n;for(var o,s=0;t._state===oe&&n>s;s++)o=i[s],this._eachEntry(o.entry,o.position)};var Ee=function(t,e){return new Te(ye,t,e).promise};D.prototype=ie(Te.prototype),D.prototype._superConstructor=ce,D.prototype._makeResult=k,D.prototype._validationError=function(){return new Error("hashSettled must be called with an object")};var ke,Ce=function(t,e){return new D(ye,t,e).promise},qe=function(t){throw setTimeout(function(){throw t}),t},Ae=function(t){var e={};return e.promise=new ye(function(t,i){e.resolve=t,e.reject=i},t),e},Pe=function(t,e,i){return ye.all(t,i).then(function(t){if(!a(e))throw new TypeError("You must pass a function as map's second argument.");for(var r=t.length,n=new Array(r),o=0;r>o;o++)n[o]=e(t[o]);return ye.all(n,i)})},Re=function(t,e){return ye.resolve(t,e)},Le=function(t,e){return ye.reject(t,e)},Ne=function(t,e,i){return ye.all(t,i).then(function(t){if(!a(e))throw new TypeError("You must pass a function as filter's second argument.");for(var r=t.length,n=new Array(r),o=0;r>o;o++)n[o]=e(t[o]);return ye.all(n,i).then(function(e){for(var i=new Array(r),n=0,o=0;r>o;o++)e[o]&&(i[n]=t[o],n++);return i.length=n,i})})},Oe=0,Be=function(t,e){je[Oe]=t,je[Oe+1]=e,Oe+=2,2===Oe&&ke()},ze="undefined"!=typeof window?window:{},Fe=ze.MutationObserver||ze.WebKitMutationObserver,Ie="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,je=new Array(1e3);ke="undefined"!=typeof e&&"[object process]"==={}.toString.call(e)?H():Fe?M():Ie?W():V(),K.async=Be;if("undefined"!=typeof window&&"object"==typeof window.__PROMISE_INSTRUMENTATION__){var Ue=window.__PROMISE_INSTRUMENTATION__;o("instrument",!0);for(var Qe in Ue)Ue.hasOwnProperty(Qe)&&J(Qe,Ue[Qe])}var De={race:Se,Promise:ye,allSettled:_e,hash:Ee,hashSettled:Ce,denodeify:we,on:J,off:Z,map:Pe,filter:Ne,resolve:Re,reject:Le,all:xe,rethrow:qe,defer:Ae,EventTarget:Y,configure:o,async:$};"function"==typeof t&&t.amd?t(function(){return De}):"undefined"!=typeof i&&i.exports?i.exports=De:"undefined"!=typeof this&&(this.RSVP=De)}).call(this)}).call(this,e("_process"))},{_process:3}],5:[function(e,i,r){!function(n,o){"use strict";"object"==typeof r?i.exports=o(e("./punycode"),e("./IPv6"),e("./SecondLevelDomains")):"function"==typeof t&&t.amd?t(["./punycode","./IPv6","./SecondLevelDomains"],o):n.URI=o(n.punycode,n.IPv6,n.SecondLevelDomains,n)}(this,function(t,e,i,r){"use strict";function n(t,e){var i=arguments.length>=1,r=arguments.length>=2;if(!(this instanceof n))return i?r?new n(t,e):new n(t):new n;if(void 0===t){if(i)throw new TypeError("undefined is not a valid argument for URI");t="undefined"!=typeof location?location.href+"":""}return this.href(t),void 0!==e?this.absoluteTo(e):this}function o(t){return t.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function s(t){return void 0===t?"Undefined":String(Object.prototype.toString.call(t)).slice(8,-1)}function a(t){return"Array"===s(t)}function h(t,e){var i,r,n={};if("RegExp"===s(e))n=null;else if(a(e))for(i=0,r=e.length;r>i;i++)n[e[i]]=!0;else n[e]=!0;for(i=0,r=t.length;r>i;i++){var o=n&&void 0!==n[t[i]]||!n&&e.test(t[i]);o&&(t.splice(i,1),r--,i--)}return t}function u(t,e){var i,r;if(a(e)){for(i=0,r=e.length;r>i;i++)if(!u(t,e[i]))return!1;return!0}var n=s(e);for(i=0,r=t.length;r>i;i++)if("RegExp"===n){if("string"==typeof t[i]&&t[i].match(e))return!0}else if(t[i]===e)return!0;return!1}function c(t,e){if(!a(t)||!a(e))return!1;if(t.length!==e.length)return!1;t.sort(),e.sort();for(var i=0,r=t.length;r>i;i++)if(t[i]!==e[i])return!1;return!0}function p(t){var e=/^\/+|\/+$/g;return t.replace(e,"")}function l(t){return escape(t)}function d(t){return encodeURIComponent(t).replace(/[!'()*]/g,l).replace(/\*/g,"%2A")}function f(t){return function(e,i){return void 0===e?this._parts[t]||"":(this._parts[t]=e||null,this.build(!i),this)}}function m(t,e){return function(i,r){return void 0===i?this._parts[t]||"":(null!==i&&(i+="",i.charAt(0)===e&&(i=i.substring(1))),this._parts[t]=i,this.build(!r),this)}}var g=r&&r.URI;n.version="1.17.0";var y=n.prototype,v=Object.prototype.hasOwnProperty;n._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,port:null,path:null,query:null,fragment:null,duplicateQueryParameters:n.duplicateQueryParameters,escapeQuerySpace:n.escapeQuerySpace}},n.duplicateQueryParameters=!1,n.escapeQuerySpace=!0,n.protocol_expression=/^[a-z][a-z0-9.+-]*$/i,n.idn_expression=/[^a-z0-9\.-]/i,n.punycode_expression=/(xn--)/i,n.ip4_expression=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,n.ip6_expression=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/,n.find_uri_expression=/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi,n.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?«»“”„‘’]+$/},n.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"},n.invalid_hostname_characters=/[^a-zA-Z0-9\.-]/,n.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"},n.getDomAttribute=function(t){if(!t||!t.nodeName)return void 0;var e=t.nodeName.toLowerCase();return"input"===e&&"image"!==t.type?void 0:n.domAttributes[e]},n.encode=d,n.decode=decodeURIComponent,n.iso8859=function(){n.encode=escape,n.decode=unescape},n.unicode=function(){n.encode=d,n.decode=decodeURIComponent},n.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/gi,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/gi,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/gi,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}},n.encodeQuery=function(t,e){var i=n.encode(t+"");return void 0===e&&(e=n.escapeQuerySpace),e?i.replace(/%20/g,"+"):i},n.decodeQuery=function(t,e){t+="",void 0===e&&(e=n.escapeQuerySpace);try{return n.decode(e?t.replace(/\+/g,"%20"):t)}catch(i){return t}};var b,w={encode:"encode",decode:"decode"},x=function(t,e){return function(i){try{return n[e](i+"").replace(n.characters[t][e].expression,function(i){return n.characters[t][e].map[i]})}catch(r){return i}}};for(b in w)n[b+"PathSegment"]=x("pathname",w[b]),n[b+"UrnPathSegment"]=x("urnpath",w[b]);var _=function(t,e,i){return function(r){var o;o=i?function(t){return n[e](n[i](t))}:n[e];for(var s=(r+"").split(t),a=0,h=s.length;h>a;a++)s[a]=o(s[a]);return s.join(t)}};n.decodePath=_("/","decodePathSegment"),n.decodeUrnPath=_(":","decodeUrnPathSegment"),n.recodePath=_("/","encodePathSegment","decode"),n.recodeUrnPath=_(":","encodeUrnPathSegment","decode"),n.encodeReserved=x("reserved","encode"),n.parse=function(t,e){var i;return e||(e={}),i=t.indexOf("#"),i>-1&&(e.fragment=t.substring(i+1)||null,t=t.substring(0,i)),i=t.indexOf("?"),i>-1&&(e.query=t.substring(i+1)||null,t=t.substring(0,i)),"//"===t.substring(0,2)?(e.protocol=null,t=t.substring(2),t=n.parseAuthority(t,e)):(i=t.indexOf(":"),i>-1&&(e.protocol=t.substring(0,i)||null,e.protocol&&!e.protocol.match(n.protocol_expression)?e.protocol=void 0:"//"===t.substring(i+1,i+3)?(t=t.substring(i+3),t=n.parseAuthority(t,e)):(t=t.substring(i+1),e.urn=!0))),e.path=t,e},n.parseHost=function(t,e){t=t.replace(/\\/g,"/");var i,r,n=t.indexOf("/");if(-1===n&&(n=t.length),"["===t.charAt(0))i=t.indexOf("]"),e.hostname=t.substring(1,i)||null,e.port=t.substring(i+2,n)||null,"/"===e.port&&(e.port=null);else{var o=t.indexOf(":"),s=t.indexOf("/"),a=t.indexOf(":",o+1);-1!==a&&(-1===s||s>a)?(e.hostname=t.substring(0,n)||null,e.port=null):(r=t.substring(0,n).split(":"),e.hostname=r[0]||null,e.port=r[1]||null)}return e.hostname&&"/"!==t.substring(n).charAt(0)&&(n++,t="/"+t),t.substring(n)||"/"},n.parseAuthority=function(t,e){return t=n.parseUserinfo(t,e),n.parseHost(t,e)},n.parseUserinfo=function(t,e){var i,r=t.indexOf("/"),o=t.lastIndexOf("@",r>-1?r:t.length-1);return o>-1&&(-1===r||r>o)?(i=t.substring(0,o).split(":"),e.username=i[0]?n.decode(i[0]):null,i.shift(),e.password=i[0]?n.decode(i.join(":")):null,t=t.substring(o+1)):(e.username=null,e.password=null),t},n.parseQuery=function(t,e){if(!t)return{};if(t=t.replace(/&+/g,"&").replace(/^\?*&*|&+$/g,""),!t)return{};for(var i,r,o,s={},a=t.split("&"),h=a.length,u=0;h>u;u++)i=a[u].split("="),r=n.decodeQuery(i.shift(),e),o=i.length?n.decodeQuery(i.join("="),e):null,v.call(s,r)?(("string"==typeof s[r]||null===s[r])&&(s[r]=[s[r]]),s[r].push(o)):s[r]=o;return s},n.build=function(t){var e="";return t.protocol&&(e+=t.protocol+":"),t.urn||!e&&!t.hostname||(e+="//"),e+=n.buildAuthority(t)||"","string"==typeof t.path&&("/"!==t.path.charAt(0)&&"string"==typeof t.hostname&&(e+="/"),e+=t.path),"string"==typeof t.query&&t.query&&(e+="?"+t.query),"string"==typeof t.fragment&&t.fragment&&(e+="#"+t.fragment),e},n.buildHost=function(t){var e="";return t.hostname?(e+=n.ip6_expression.test(t.hostname)?"["+t.hostname+"]":t.hostname,t.port&&(e+=":"+t.port),e):""},n.buildAuthority=function(t){return n.buildUserinfo(t)+n.buildHost(t)},n.buildUserinfo=function(t){var e="";return t.username&&(e+=n.encode(t.username),t.password&&(e+=":"+n.encode(t.password)),e+="@"),e},n.buildQuery=function(t,e,i){var r,o,s,h,u="";for(o in t)if(v.call(t,o)&&o)if(a(t[o]))for(r={},s=0,h=t[o].length;h>s;s++)void 0!==t[o][s]&&void 0===r[t[o][s]+""]&&(u+="&"+n.buildQueryParameter(o,t[o][s],i),e!==!0&&(r[t[o][s]+""]=!0));else void 0!==t[o]&&(u+="&"+n.buildQueryParameter(o,t[o],i));return u.substring(1)},n.buildQueryParameter=function(t,e,i){return n.encodeQuery(t,i)+(null!==e?"="+n.encodeQuery(e,i):"")},n.addQuery=function(t,e,i){if("object"==typeof e)for(var r in e)v.call(e,r)&&n.addQuery(t,r,e[r]);else{if("string"!=typeof e)throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");if(void 0===t[e])return t[e]=i,void 0;"string"==typeof t[e]&&(t[e]=[t[e]]),a(i)||(i=[i]),t[e]=(t[e]||[]).concat(i)}},n.removeQuery=function(t,e,i){var r,o,u;if(a(e))for(r=0,o=e.length;o>r;r++)t[e[r]]=void 0;else if("RegExp"===s(e))for(u in t)e.test(u)&&(t[u]=void 0);else if("object"==typeof e)for(u in e)v.call(e,u)&&n.removeQuery(t,u,e[u]);else{if("string"!=typeof e)throw new TypeError("URI.removeQuery() accepts an object, string, RegExp as the first parameter");void 0!==i?"RegExp"===s(i)?t[e]=!a(t[e])&&i.test(t[e])?void 0:h(t[e],i):t[e]!==String(i)||a(i)&&1!==i.length?a(t[e])&&(t[e]=h(t[e],i)):t[e]=void 0:t[e]=void 0}},n.hasQuery=function(t,e,i,r){if("object"==typeof e){for(var o in e)if(v.call(e,o)&&!n.hasQuery(t,o,e[o]))return!1;return!0}if("string"!=typeof e)throw new TypeError("URI.hasQuery() accepts an object, string as the name parameter");switch(s(i)){case"Undefined":return e in t;case"Boolean":var h=Boolean(a(t[e])?t[e].length:t[e]);return i===h;case"Function":return!!i(t[e],e,t);case"Array":if(!a(t[e]))return!1;var p=r?u:c;return p(t[e],i);case"RegExp":return a(t[e])?r?u(t[e],i):!1:Boolean(t[e]&&t[e].match(i));case"Number":i=String(i);case"String":return a(t[e])?r?u(t[e],i):!1:t[e]===i;default:throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter")}},n.commonPath=function(t,e){var i,r=Math.min(t.length,e.length);for(i=0;r>i;i++)if(t.charAt(i)!==e.charAt(i)){i--;break}return 1>i?t.charAt(0)===e.charAt(0)&&"/"===t.charAt(0)?"/":"":(("/"!==t.charAt(i)||"/"!==e.charAt(i))&&(i=t.substring(0,i).lastIndexOf("/")),t.substring(0,i+1))},n.withinString=function(t,e,i){i||(i={});var r=i.start||n.findUri.start,o=i.end||n.findUri.end,s=i.trim||n.findUri.trim,a=/[a-z0-9-]=["']?$/i;for(r.lastIndex=0;;){var h=r.exec(t);if(!h)break;var u=h.index;if(i.ignoreHtml){var c=t.slice(Math.max(u-3,0),u);if(c&&a.test(c))continue}var p=u+t.slice(u).search(o),l=t.slice(u,p).replace(s,"");if(!i.ignore||!i.ignore.test(l)){p=u+l.length;var d=e(l,u,p,t);t=t.slice(0,u)+d+t.slice(p),r.lastIndex=u+d.length}}return r.lastIndex=0,t},n.ensureValidHostname=function(e){if(e.match(n.invalid_hostname_characters)){if(!t)throw new TypeError('Hostname "'+e+'" contains characters other than [A-Z0-9.-] and Punycode.js is not available');if(t.toASCII(e).match(n.invalid_hostname_characters))throw new TypeError('Hostname "'+e+'" contains characters other than [A-Z0-9.-]')}},n.noConflict=function(t){if(t){var e={URI:this.noConflict()};return r.URITemplate&&"function"==typeof r.URITemplate.noConflict&&(e.URITemplate=r.URITemplate.noConflict()),r.IPv6&&"function"==typeof r.IPv6.noConflict&&(e.IPv6=r.IPv6.noConflict()),r.SecondLevelDomains&&"function"==typeof r.SecondLevelDomains.noConflict&&(e.SecondLevelDomains=r.SecondLevelDomains.noConflict()),e}return r.URI===this&&(r.URI=g),this},y.build=function(t){return t===!0?this._deferred_build=!0:(void 0===t||this._deferred_build)&&(this._string=n.build(this._parts),this._deferred_build=!1),this},y.clone=function(){return new n(this)},y.valueOf=y.toString=function(){return this.build(!1)._string},y.protocol=f("protocol"),y.username=f("username"),y.password=f("password"),y.hostname=f("hostname"),y.port=f("port"),y.query=m("query","?"),y.fragment=m("fragment","#"),y.search=function(t,e){var i=this.query(t,e);return"string"==typeof i&&i.length?"?"+i:i},y.hash=function(t,e){var i=this.fragment(t,e);return"string"==typeof i&&i.length?"#"+i:i},y.pathname=function(t,e){if(void 0===t||t===!0){var i=this._parts.path||(this._parts.hostname?"/":"");return t?(this._parts.urn?n.decodeUrnPath:n.decodePath)(i):i}return this._parts.path=this._parts.urn?t?n.recodeUrnPath(t):"":t?n.recodePath(t):"/",this.build(!e),this},y.path=y.pathname,y.href=function(t,e){var i;if(void 0===t)return this.toString();this._string="",this._parts=n._parts();var r=t instanceof n,o="object"==typeof t&&(t.hostname||t.path||t.pathname);if(t.nodeName){var s=n.getDomAttribute(t);t=t[s]||"",o=!1}if(!r&&o&&void 0!==t.pathname&&(t=t.toString()),"string"==typeof t||t instanceof String)this._parts=n.parse(String(t),this._parts);else{if(!r&&!o)throw new TypeError("invalid input");var a=r?t._parts:t;for(i in a)v.call(this._parts,i)&&(this._parts[i]=a[i])}return this.build(!e),this},y.is=function(t){var e=!1,r=!1,o=!1,s=!1,a=!1,h=!1,u=!1,c=!this._parts.urn;switch(this._parts.hostname&&(c=!1,r=n.ip4_expression.test(this._parts.hostname),o=n.ip6_expression.test(this._parts.hostname),e=r||o,s=!e,a=s&&i&&i.has(this._parts.hostname),h=s&&n.idn_expression.test(this._parts.hostname),u=s&&n.punycode_expression.test(this._parts.hostname)),t.toLowerCase()){case"relative":return c;case"absolute":return!c;case"domain":case"name":return s;case"sld":return a;case"ip":return e;case"ip4":case"ipv4":case"inet4":return r;case"ip6":case"ipv6":case"inet6":return o;case"idn":return h;case"url":return!this._parts.urn;case"urn":return!!this._parts.urn;case"punycode":return u}return null};var S=y.protocol,T=y.port,E=y.hostname;y.protocol=function(t,e){if(void 0!==t&&t&&(t=t.replace(/:(\/\/)?$/,""),!t.match(n.protocol_expression)))throw new TypeError('Protocol "'+t+"\" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]");return S.call(this,t,e)},y.scheme=y.protocol,y.port=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0!==t&&(0===t&&(t=null),t&&(t+="",":"===t.charAt(0)&&(t=t.substring(1)),t.match(/[^0-9]/))))throw new TypeError('Port "'+t+'" contains characters other than [0-9]');return T.call(this,t,e)},y.hostname=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0!==t){var i={},r=n.parseHost(t,i);if("/"!==r)throw new TypeError('Hostname "'+t+'" contains characters other than [A-Z0-9.-]');t=i.hostname}return E.call(this,t,e)},y.origin=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t){var i=this.protocol(),r=this.authority();return r?(i?i+"://":"")+this.authority():""}var o=n(t);return this.protocol(o.protocol()).authority(o.authority()).build(!e),this},y.host=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t)return this._parts.hostname?n.buildHost(this._parts):"";var i=n.parseHost(t,this._parts);if("/"!==i)throw new TypeError('Hostname "'+t+'" contains characters other than [A-Z0-9.-]');return this.build(!e),this},y.authority=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t)return this._parts.hostname?n.buildAuthority(this._parts):"";var i=n.parseAuthority(t,this._parts);if("/"!==i)throw new TypeError('Hostname "'+t+'" contains characters other than [A-Z0-9.-]');return this.build(!e),this},y.userinfo=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t){if(!this._parts.username)return"";var i=n.buildUserinfo(this._parts);return i.substring(0,i.length-1)}return"@"!==t[t.length-1]&&(t+="@"),n.parseUserinfo(t,this._parts),this.build(!e),this},y.resource=function(t,e){var i;return void 0===t?this.path()+this.search()+this.hash():(i=n.parse(t),this._parts.path=i.path,this._parts.query=i.query,this._parts.fragment=i.fragment,this.build(!e),this) -},y.subdomain=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t){if(!this._parts.hostname||this.is("IP"))return"";var i=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,i)||""}var r=this._parts.hostname.length-this.domain().length,s=this._parts.hostname.substring(0,r),a=new RegExp("^"+o(s));return t&&"."!==t.charAt(t.length-1)&&(t+="."),t&&n.ensureValidHostname(t),this._parts.hostname=this._parts.hostname.replace(a,t),this.build(!e),this},y.domain=function(t,e){if(this._parts.urn)return void 0===t?"":this;if("boolean"==typeof t&&(e=t,t=void 0),void 0===t){if(!this._parts.hostname||this.is("IP"))return"";var i=this._parts.hostname.match(/\./g);if(i&&i.length<2)return this._parts.hostname;var r=this._parts.hostname.length-this.tld(e).length-1;return r=this._parts.hostname.lastIndexOf(".",r-1)+1,this._parts.hostname.substring(r)||""}if(!t)throw new TypeError("cannot set domain empty");if(n.ensureValidHostname(t),!this._parts.hostname||this.is("IP"))this._parts.hostname=t;else{var s=new RegExp(o(this.domain())+"$");this._parts.hostname=this._parts.hostname.replace(s,t)}return this.build(!e),this},y.tld=function(t,e){if(this._parts.urn)return void 0===t?"":this;if("boolean"==typeof t&&(e=t,t=void 0),void 0===t){if(!this._parts.hostname||this.is("IP"))return"";var r=this._parts.hostname.lastIndexOf("."),n=this._parts.hostname.substring(r+1);return e!==!0&&i&&i.list[n.toLowerCase()]?i.get(this._parts.hostname)||n:n}var s;if(!t)throw new TypeError("cannot set TLD empty");if(t.match(/[^a-zA-Z0-9-]/)){if(!i||!i.is(t))throw new TypeError('TLD "'+t+'" contains characters other than [A-Z0-9]');s=new RegExp(o(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(s,t)}else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");s=new RegExp(o(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(s,t)}return this.build(!e),this},y.directory=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t||t===!0){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var i=this._parts.path.length-this.filename().length-1,r=this._parts.path.substring(0,i)||(this._parts.hostname?"/":"");return t?n.decodePath(r):r}var s=this._parts.path.length-this.filename().length,a=this._parts.path.substring(0,s),h=new RegExp("^"+o(a));return this.is("relative")||(t||(t="/"),"/"!==t.charAt(0)&&(t="/"+t)),t&&"/"!==t.charAt(t.length-1)&&(t+="/"),t=n.recodePath(t),this._parts.path=this._parts.path.replace(h,t),this.build(!e),this},y.filename=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t||t===!0){if(!this._parts.path||"/"===this._parts.path)return"";var i=this._parts.path.lastIndexOf("/"),r=this._parts.path.substring(i+1);return t?n.decodePathSegment(r):r}var s=!1;"/"===t.charAt(0)&&(t=t.substring(1)),t.match(/\.?\//)&&(s=!0);var a=new RegExp(o(this.filename())+"$");return t=n.recodePath(t),this._parts.path=this._parts.path.replace(a,t),s?this.normalizePath(e):this.build(!e),this},y.suffix=function(t,e){if(this._parts.urn)return void 0===t?"":this;if(void 0===t||t===!0){if(!this._parts.path||"/"===this._parts.path)return"";var i,r,s=this.filename(),a=s.lastIndexOf(".");return-1===a?"":(i=s.substring(a+1),r=/^[a-z0-9%]+$/i.test(i)?i:"",t?n.decodePathSegment(r):r)}"."===t.charAt(0)&&(t=t.substring(1));var h,u=this.suffix();if(u)h=t?new RegExp(o(u)+"$"):new RegExp(o("."+u)+"$");else{if(!t)return this;this._parts.path+="."+n.recodePath(t)}return h&&(t=n.recodePath(t),this._parts.path=this._parts.path.replace(h,t)),this.build(!e),this},y.segment=function(t,e,i){var r=this._parts.urn?":":"/",n=this.path(),o="/"===n.substring(0,1),s=n.split(r);if(void 0!==t&&"number"!=typeof t&&(i=e,e=t,t=void 0),void 0!==t&&"number"!=typeof t)throw new Error('Bad segment "'+t+'", must be 0-based integer');if(o&&s.shift(),0>t&&(t=Math.max(s.length+t,0)),void 0===e)return void 0===t?s:s[t];if(null===t||void 0===s[t])if(a(e)){s=[];for(var h=0,u=e.length;u>h;h++)(e[h].length||s.length&&s[s.length-1].length)&&(s.length&&!s[s.length-1].length&&s.pop(),s.push(p(e[h])))}else(e||"string"==typeof e)&&(e=p(e),""===s[s.length-1]?s[s.length-1]=e:s.push(e));else e?s[t]=p(e):s.splice(t,1);return o&&s.unshift(""),this.path(s.join(r),i)},y.segmentCoded=function(t,e,i){var r,o,s;if("number"!=typeof t&&(i=e,e=t,t=void 0),void 0===e){if(r=this.segment(t,e,i),a(r))for(o=0,s=r.length;s>o;o++)r[o]=n.decode(r[o]);else r=void 0!==r?n.decode(r):void 0;return r}if(a(e))for(o=0,s=e.length;s>o;o++)e[o]=n.encode(e[o]);else e="string"==typeof e||e instanceof String?n.encode(e):e;return this.segment(t,e,i)};var k=y.query;return y.query=function(t,e){if(t===!0)return n.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("function"==typeof t){var i=n.parseQuery(this._parts.query,this._parts.escapeQuerySpace),r=t.call(this,i);return this._parts.query=n.buildQuery(r||i,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!e),this}return void 0!==t&&"string"!=typeof t?(this._parts.query=n.buildQuery(t,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!e),this):k.call(this,t,e)},y.setQuery=function(t,e,i){var r=n.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if("string"==typeof t||t instanceof String)r[t]=void 0!==e?e:null;else{if("object"!=typeof t)throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");for(var o in t)v.call(t,o)&&(r[o]=t[o])}return this._parts.query=n.buildQuery(r,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof t&&(i=e),this.build(!i),this},y.addQuery=function(t,e,i){var r=n.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return n.addQuery(r,t,void 0===e?null:e),this._parts.query=n.buildQuery(r,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof t&&(i=e),this.build(!i),this},y.removeQuery=function(t,e,i){var r=n.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return n.removeQuery(r,t,e),this._parts.query=n.buildQuery(r,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),"string"!=typeof t&&(i=e),this.build(!i),this},y.hasQuery=function(t,e,i){var r=n.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return n.hasQuery(r,t,e,i)},y.setSearch=y.setQuery,y.addSearch=y.addQuery,y.removeSearch=y.removeQuery,y.hasSearch=y.hasQuery,y.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build():this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()},y.normalizeProtocol=function(t){return"string"==typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),this.build(!t)),this},y.normalizeHostname=function(i){return this._parts.hostname&&(this.is("IDN")&&t?this._parts.hostname=t.toASCII(this._parts.hostname):this.is("IPv6")&&e&&(this._parts.hostname=e.best(this._parts.hostname)),this._parts.hostname=this._parts.hostname.toLowerCase(),this.build(!i)),this},y.normalizePort=function(t){return"string"==typeof this._parts.protocol&&this._parts.port===n.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!t)),this},y.normalizePath=function(t){var e=this._parts.path;if(!e)return this;if(this._parts.urn)return this._parts.path=n.recodeUrnPath(this._parts.path),this.build(!t),this;if("/"===this._parts.path)return this;var i,r,o,s="";for("/"!==e.charAt(0)&&(i=!0,e="/"+e),("/.."===e.slice(-3)||"/."===e.slice(-2))&&(e+="/"),e=e.replace(/(\/(\.\/)+)|(\/\.$)/g,"/").replace(/\/{2,}/g,"/"),i&&(s=e.substring(1).match(/^(\.\.\/)+/)||"",s&&(s=s[0]));;){if(r=e.indexOf("/.."),-1===r)break;0!==r?(o=e.substring(0,r).lastIndexOf("/"),-1===o&&(o=r),e=e.substring(0,o)+e.substring(r+3)):e=e.substring(3)}return i&&this.is("relative")&&(e=s+e.substring(1)),e=n.recodePath(e),this._parts.path=e,this.build(!t),this},y.normalizePathname=y.normalizePath,y.normalizeQuery=function(t){return"string"==typeof this._parts.query&&(this._parts.query.length?this.query(n.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=null,this.build(!t)),this},y.normalizeFragment=function(t){return this._parts.fragment||(this._parts.fragment=null,this.build(!t)),this},y.normalizeSearch=y.normalizeQuery,y.normalizeHash=y.normalizeFragment,y.iso8859=function(){var t=n.encode,e=n.decode;n.encode=escape,n.decode=decodeURIComponent;try{this.normalize()}finally{n.encode=t,n.decode=e}return this},y.unicode=function(){var t=n.encode,e=n.decode;n.encode=d,n.decode=unescape;try{this.normalize()}finally{n.encode=t,n.decode=e}return this},y.readable=function(){var e=this.clone();e.username("").password("").normalize();var i="";if(e._parts.protocol&&(i+=e._parts.protocol+"://"),e._parts.hostname&&(e.is("punycode")&&t?(i+=t.toUnicode(e._parts.hostname),e._parts.port&&(i+=":"+e._parts.port)):i+=e.host()),e._parts.hostname&&e._parts.path&&"/"!==e._parts.path.charAt(0)&&(i+="/"),i+=e.path(!0),e._parts.query){for(var r="",o=0,s=e._parts.query.split("&"),a=s.length;a>o;o++){var h=(s[o]||"").split("=");r+="&"+n.decodeQuery(h[0],this._parts.escapeQuerySpace).replace(/&/g,"%26"),void 0!==h[1]&&(r+="="+n.decodeQuery(h[1],this._parts.escapeQuerySpace).replace(/&/g,"%26"))}i+="?"+r.substring(1)}return i+=n.decodeQuery(e.hash(),!0)},y.absoluteTo=function(t){var e,i,r,o=this.clone(),s=["protocol","username","password","hostname","port"];if(this._parts.urn)throw new Error("URNs do not have any generally defined hierarchical components");if(t instanceof n||(t=new n(t)),o._parts.protocol||(o._parts.protocol=t._parts.protocol),this._parts.hostname)return o;for(i=0;r=s[i];i++)o._parts[r]=t._parts[r];return o._parts.path?".."===o._parts.path.substring(-2)&&(o._parts.path+="/"):(o._parts.path=t._parts.path,o._parts.query||(o._parts.query=t._parts.query)),"/"!==o.path().charAt(0)&&(e=t.directory(),e=e?e:0===t.path().indexOf("/")?"/":"",o._parts.path=(e?e+"/":"")+o._parts.path,o.normalizePath()),o.build(),o},y.relativeTo=function(t){var e,i,r,o,s,a=this.clone().normalize();if(a._parts.urn)throw new Error("URNs do not have any generally defined hierarchical components");if(t=new n(t).normalize(),e=a._parts,i=t._parts,o=a.path(),s=t.path(),"/"!==o.charAt(0))throw new Error("URI is already relative");if("/"!==s.charAt(0))throw new Error("Cannot calculate a URI relative to another relative URI");if(e.protocol===i.protocol&&(e.protocol=null),e.username!==i.username||e.password!==i.password)return a.build();if(null!==e.protocol||null!==e.username||null!==e.password)return a.build();if(e.hostname!==i.hostname||e.port!==i.port)return a.build();if(e.hostname=null,e.port=null,o===s)return e.path="",a.build();if(r=n.commonPath(o,s),!r)return a.build();var h=i.path.substring(r.length).replace(/[^\/]*$/,"").replace(/.*?\//g,"../");return e.path=h+e.path.substring(r.length)||"./",a.build()},y.equals=function(t){var e,i,r,o=this.clone(),s=new n(t),h={},u={},p={};if(o.normalize(),s.normalize(),o.toString()===s.toString())return!0;if(e=o.query(),i=s.query(),o.query(""),s.query(""),o.toString()!==s.toString())return!1;if(e.length!==i.length)return!1;h=n.parseQuery(e,this._parts.escapeQuerySpace),u=n.parseQuery(i,this._parts.escapeQuerySpace);for(r in h)if(v.call(h,r)){if(a(h[r])){if(!c(h[r],u[r]))return!1}else if(h[r]!==u[r])return!1;p[r]=!0}for(r in u)if(v.call(u,r)&&!p[r])return!1;return!0},y.duplicateQueryParameters=function(t){return this._parts.duplicateQueryParameters=!!t,this},y.escapeQuerySpace=function(t){return this._parts.escapeQuerySpace=!!t,this},n})},{"./IPv6":2,"./SecondLevelDomains":2,"./punycode":2}],6:[function(t,e){function i(t){this.opening=new r.defer,this.opened=this.opening.promise,this.isOpen=!1,this.url=void 0,this.loading={manifest:new r.defer,spine:new r.defer,metadata:new r.defer,cover:new r.defer,navigation:new r.defer,pageList:new r.defer},this.loaded={manifest:this.loading.manifest.promise,spine:this.loading.spine.promise,metadata:this.loading.metadata.promise,cover:this.loading.cover.promise,navigation:this.loading.navigation.promise,pageList:this.loading.pageList.promise},this.ready=r.hash(this.loaded),this.isRendered=!1,this.request=this.requestMethod.bind(this),this.spine=new o(this.request),this.locations=new s(this.spine,this.request),t&&this.open(t)}var r=t("rsvp"),n=t("urijs"),o=(t("./core"),t("./spine")),s=t("./locations"),a=t("./parser"),h=t("./navigation"),u=(t("./rendition"),t("./continuous"),t("./paginate"),t("./unarchive")),c=t("./request");i.prototype.open=function(t){var e,i,r,o=new a,s=this,h="META-INF/container.xml";return t?(e=n(t),this.url=t,"opf"===e.suffix()?(this.packageUrl=t,this.containerUrl="",this.baseUrl=e.origin()?e.origin()+"/"+e.directory()+"/":window?e.absoluteTo(window.location.href).directory()+"/":e.directory()+"/",i=this.request(this.packageUrl)):this.isArchivedUrl(e)?(this.url="/",this.containerUrl=n(h).absoluteTo(this.url).toString(),r=this.unarchive(t).then(function(){return this.request(this.containerUrl)}.bind(this))):e.suffix()||(this.containerUrl=this.url+h,r=this.request(this.containerUrl)),r&&(i=r.then(function(t){return o.container(t)}).then(function(t){var i=n(t.packagePath);return s.packageUrl=i.absoluteTo(s.url).toString(),s.encoding=t.encoding,s.baseUrl=i.origin()?i.origin()+"/"+i.directory()+"/":window&&!s.isArchivedUrl(e)?i.absoluteTo(window.location.href).directory()+"/":"/"+i.directory()+"/",s.request(s.packageUrl)}).catch(function(t){console.error("Could not load book at: "+(this.packageUrl||this.containerPath)),s.trigger("book:loadFailed",this.packageUrl||this.containerPath),s.opening.reject(t)})),i.then(function(t){s.unpack(t),s.loading.manifest.resolve(s.package.manifest),s.loading.metadata.resolve(s.package.metadata),s.loading.spine.resolve(s.spine),s.loading.cover.resolve(s.cover),s.isOpen=!0,s.opening.resolve(s)}).catch(function(t){console.error(t.message,t.stack),s.opening.reject(t)}),this.opened):(this.opening.resolve(this),this.opened)},i.prototype.unpack=function(t){var e=this,i=new a;e.package=i.packageContents(t),e.package.baseUrl=e.baseUrl,this.spine.load(e.package),e.navigation=new h(e.package,this.request),e.navigation.load().then(function(t){e.toc=t,e.loading.navigation.resolve(e.toc)}),e.cover=n(e.package.coverPath).absoluteTo(e.baseUrl).toString()},i.prototype.section=function(t){return this.spine.get(t)},i.prototype.renderTo=function(e,i){var r=i&&i.method?i.method:"rendition",n=t("./"+r);return this.rendition=new n(this,i),this.rendition.attachTo(e),this.rendition},i.prototype.requestMethod=function(t){return this.archive?this.archive.request(t):c(t,null,this.requestCredentials,this.requestHeaders)},i.prototype.setRequestCredentials=function(t){this.requestCredentials=t},i.prototype.setRequestHeaders=function(t){this.requestHeaders=t},i.prototype.unarchive=function(t){return this.archive=new u,this.archive.open(t)},i.prototype.isArchivedUrl=function(t){var e,i;return t instanceof ArrayBuffer?!0:(e=n(t),i=e.suffix(),!i||"epub"!=i&&"zip"!=i?!1:!0)},i.prototype.coverUrl=function(){var t=this.loaded.cover.then(function(){return this.archive?this.archive.createUrl(this.cover):this.cover}.bind(this));return t},e.exports=i,r.EventTarget.mixin(i.prototype),r.on("error",function(t){console.error(t)}),r.configure("instrument",!0),r.on("rejected",function(t){console.error(t.detail.message,t.detail.stack)})},{"./continuous":7,"./core":8,"./locations":12,"./navigation":14,"./paginate":15,"./parser":16,"./rendition":18,"./request":20,"./spine":22,"./unarchive":23,rsvp:4,urijs:5}],7:[function(t,e){function i(t,e){o.apply(this,arguments),this.settings=n.extend(this.settings||{},{infinite:!0,overflow:"auto",axis:"vertical",offset:500,offsetDelta:250}),n.extend(this.settings,e),this.settings.hidden&&(this.wrapper=this.wrap(this.container))}{var r=t("rsvp"),n=t("./core"),o=t("./rendition");t("./view")}i.prototype=Object.create(o.prototype),i.prototype.constructor=i,i.prototype.attachListeners=function(){n.isNumber(this.settings.width)&&n.isNumber(this.settings.height)||window.addEventListener("resize",this.onResized.bind(this),!1),this.settings.infinite&&this.start()},i.prototype.parseTarget=function(t){this.epubcfi.isCfiString(t)?(cfi=this.epubcfi.parse(t),spinePos=cfi.spinePos,section=this.book.spine.get(spinePos)):section=this.book.spine.get(t)},i.prototype.moveTo=function(t){return this.check(t.left+this.settings.offset,t.top+this.settings.offset).then(function(){"vertical"===this.settings.axis?this.scrollBy(0,t.top):this.scrollBy(t.left,0)}.bind(this))},i.prototype.afterDisplayed=function(t){var e,i,r=t.section.next(),n=t.section.prev(),o=this.views.indexOf(t);o+1===this.views.length&&r&&(i=this.createView(r),this.q.enqueue(this.append,i)),0===o&&n&&(e=this.createView(n,this.viewSettings),this.q.enqueue(this.prepend,e)),this.trigger("added",t.section)},i.prototype.removeShownListeners=function(t){t.onDisplayed=function(){}},i.prototype.append=function(t){return t.onDisplayed=this.afterDisplayed.bind(this),this.views.append(t),this.check()},i.prototype.prepend=function(t){return t.onDisplayed=this.afterDisplayed.bind(this),t.on("resized",this.counter.bind(this)),this.views.prepend(t),this.check()},i.prototype.counter=function(t){"vertical"===this.settings.axis?this.scrollBy(0,t.heightDelta,!0):this.scrollBy(t.widthDelta,0,!0)},i.prototype.check=function(t){var e=new r.defer,i=this.bounds(),n=[],o=t||this.settings.offset;return this.views.each(function(t){var e=this.isVisible(t,o,o,i);e?t.displayed||t.rendering||n.push(this.render(t)):t.displayed&&(this.q.enqueue(t.destroy.bind(t)),clearTimeout(this.trimTimeout),this.trimTimeout=setTimeout(function(){this.q.enqueue(this.trim)}.bind(this),250))}.bind(this)),n.length?r.all(n).then(function(){this.q.enqueue(this.check)}.bind(this)):(e.resolve(),e.promise)},i.prototype.trim=function(){for(var t=new r.defer,e=this.views.displayed(),i=e[0],n=e[e.length-1],o=this.views.indexOf(i),s=this.views.indexOf(n),a=this.views.slice(0,o),h=this.views.slice(s+1),u=0;uthis.settings.offsetDelta||this.scrollDeltaHorz>this.settings.offsetDelta)&&(this.q.enqueue(this.check),this.scrollDeltaVert=0,this.scrollDeltaHorz=0,this.trigger("scroll",{top:scrollTop,left:scrollLeft})),this.scrollDeltaVert+=Math.abs(scrollTop-this.prevScrollTop),this.scrollDeltaHorz+=Math.abs(scrollLeft-this.prevScrollLeft),this.prevScrollTop=scrollTop,this.prevScrollLeft=scrollLeft,clearTimeout(this.scrollTimeout),this.scrollTimeout=setTimeout(function(){this.scrollDeltaVert=0,this.scrollDeltaHorz=0}.bind(this),150),this.scrolled=!1),this.tick.call(window,this.onScroll.bind(this))},i.prototype.resizeView=function(t){"horizontal"===this.settings.axis?t.lock("height",this.stage.width,this.stage.height):t.lock("width",this.stage.width,this.stage.height)},i.prototype.currentLocation=function(){{var t,e,i=this.visible();this.container.getBoundingClientRect()}return 1===i.length?this.map.page(i[0]):i.length>1?(t=this.map.page(i[0]),e=this.map.page(i[i.length-1]),{start:t.start,end:e.end}):void 0},e.exports=i},{"./core":8,"./rendition":18,"./view":24,rsvp:4}],8:[function(t,e){function i(t){return!(!t||1!=t.nodeType)}function r(){var t=(new Date).getTime(),e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var i=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"==e?i:7&i|8).toString(16)});return e}function n(t){for(var e=-1,i=Object.keys(t),r=i.length,n=Array(r);++en;n++)if("undefined"!=typeof document.body.style[e[n]+i])return e[n]+i;return t}function u(t){for(var e=1,i=arguments.length;i>e;e++){var r=arguments[e];for(var n in r)void 0===t[n]&&(t[n]=r[n])}return t}function c(t){var e=[].slice.call(arguments,1);return e.forEach(function(e){e&&Object.getOwnPropertyNames(e).forEach(function(i){Object.defineProperty(t,i,Object.getOwnPropertyDescriptor(e,i))})}),t}function p(t,e,i){var r=l(t,e,i);return e.splice(r,0,t),r}function l(t,e,i,r,n){var o,s=r||0,a=n||e.length,h=parseInt(s+(a-s)/2);return i||(i=function(t,e){return t>e?1:e>t?-1:(t=e)?0:void 0}),0>=a-s?h:(o=i(e[h],t),a-s===1?o>0?h:h+1:0===o?h:-1===o?l(t,e,i,h,a):l(t,e,i,s,h))}function d(t,e,i,r,n){var o,s=r||0,a=n||e.length,h=parseInt(s+(a-s)/2);return i||(i=function(t,e){return t>e?1:e>t?-1:(t=e)?0:void 0}),0>=a-s?-1:(o=i(e[h],t),a-s===1?0===o?h:-1:0===o?h:-1===o?d(t,e,i,h,a):d(t,e,i,s,h))}function f(t){var e=window.getComputedStyle(t),i=["width","paddingRight","paddingLeft","marginRight","marginLeft","borderRightWidth","borderLeftWidth"],r=["height","paddingTop","paddingBottom","marginTop","marginBottom","borderTopWidth","borderBottomWidth"],n=0,o=0;return i.forEach(function(t){n+=parseFloat(e[t])||0}),r.forEach(function(t){o+=parseFloat(e[t])||0}),{height:o,width:n}}function m(t){var e=window.getComputedStyle(t),i=["paddingRight","paddingLeft","marginRight","marginLeft","borderRightWidth","borderLeftWidth"],r=["paddingTop","paddingBottom","marginTop","marginBottom","borderTopWidth","borderBottomWidth"],n=0,o=0;return i.forEach(function(t){n+=parseFloat(e[t])||0}),r.forEach(function(t){o+=parseFloat(e[t])||0}),{height:o,width:n}}function g(){var t=window.innerWidth,e=window.innerHeight;return{top:0,left:0,right:t,bottom:e,width:t,height:e}}function y(t){var e=t.match(/[^'"]+|['"]/g);return e=e.map(function(t){return"'"===t?'"\'"':'"'===t?"'\"'":"'"+t+"'"}),"concat('',"+e.join(",")+")"}function v(t){for(var e,i=t.parentNode,r=i.childNodes,n=-1,o=0;o-1}function w(t,e){var i,r=window.URL||window.webkitURL||window.mozURL,n=new Blob([t],{type:e});return i=r.createObjectURL(n)}var x=(t("rsvp"),window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame);e.exports={isElement:i,uuid:r,values:n,resolveUrl:o,indexOfSorted:d,documentHeight:s,isNumber:a,prefixed:h,defaults:u,extend:c,insert:p,locationOf:l,indexOfSorted:d,requestAnimationFrame:x,bounds:f,borders:m,windowBounds:g,cleanStringForXpath:y,indexOfTextNode:v,isXml:b,createBlobUrl:w}},{rsvp:4}],9:[function(t,e){function i(t){return t?this.parse(t):void 0}var r=t("urijs"),n=t("./core");i.prototype.generateChapterComponent=function(t,e,i){var r=parseInt(e),n=t+1,o="/"+n+"/";return o+=2*(r+1),i&&(o+="["+i+"]"),o},i.prototype.generatePathComponent=function(t){var e=[];return t.forEach(function(t){var i="";i+=2*(t.index+1),t.id&&(i+="["+t.id+"]"),e.push(i)}),e.join("/")},i.prototype.generateCfiFromElement=function(t,e){var i=this.pathTo(t),r=this.generatePathComponent(i);return r.length?"epubcfi("+e+"!"+r+"/1:0)":"epubcfi("+e+"!/4/)"},i.prototype.pathTo=function(t){for(var e,i=[];t&&null!==t.parentNode&&9!=t.parentNode.nodeType;)e=t.parentNode.children,i.unshift({id:t.id,tagName:t.tagName,index:e?Array.prototype.indexOf.call(e,t):0}),t=t.parentNode;return i},i.prototype.getChapterComponent=function(t){var e=t.split("!");return e[0]},i.prototype.getPathComponent=function(t){var e=t.split("!"),i=e[1]?e[1].split(":"):"";return i[0]},i.prototype.getCharecterOffsetComponent=function(t){var e=t.split(":");return e[1]||""},i.prototype.parse=function(t){var e,i,r,n,o,s,a,h,u,c={},p=function(t){var e,i,r,n;return e="element",i=parseInt(t)/2-1,r=t.match(/\[(.*)\]/),r&&r[1]&&(n=r[1]),{type:e,index:i,id:n||!1}};return"string"!=typeof t?{spinePos:-1}:(c.str=t,0===t.indexOf("epubcfi(")&&")"===t[t.length-1]&&(t=t.slice(8,t.length-1)),i=this.getChapterComponent(t),r=this.getPathComponent(t)||"",n=this.getCharecterOffsetComponent(t),i?(e=i.split("/")[2]||"")?(c.spinePos=parseInt(e)/2-1||0,s=e.match(/\[(.*)\]/),c.spineId=s?s[1]:!1,-1!=r.indexOf(",")&&console.warn("CFI Ranges are not supported"),a=r.split("/"),h=a.pop(),c.steps=[],a.forEach(function(t){var e;t&&(e=p(t),c.steps.push(e))}),u=parseInt(h),isNaN(u)||(u%2===0?c.steps.push(p(h)):c.steps.push({type:"text",index:(u-1)/2})),o=n.match(/\[(.*)\]/),o&&o[1]?(c.characterOffset=parseInt(n.split("[")[0]),c.textLocationAssertion=o[1]):c.characterOffset=parseInt(n),c):{spinePos:-1}:{spinePos:-1})},i.prototype.addMarker=function(t,e,i){var r,n,o,s,a=e||document,h=i||this.createMarker(a);return"string"==typeof t&&(t=this.parse(t)),n=t.steps[t.steps.length-1],-1===t.spinePos?!1:(r=this.findParent(t,a))?(n&&"text"===n.type?(o=r.childNodes[n.index],t.characterOffset?(s=o.splitText(t.characterOffset),h.classList.add("EPUBJS-CFI-SPLIT"),r.insertBefore(h,s)):r.insertBefore(h,o)):r.insertBefore(h,r.firstChild),h):!1},i.prototype.createMarker=function(t){var e=t||document,i=e.createElement("span");return i.id="EPUBJS-CFI-MARKER:"+n.uuid(),i.classList.add("EPUBJS-CFI-MARKER"),i},i.prototype.removeMarker=function(t,e){t.classList.contains("EPUBJS-CFI-SPLIT")?(nextSib=t.nextSibling,prevSib=t.previousSibling,nextSib&&prevSib&&3===nextSib.nodeType&&3===prevSib.nodeType&&(prevSib.textContent+=nextSib.textContent,t.parentNode.removeChild(nextSib)),t.parentNode.removeChild(t)):t.classList.contains("EPUBJS-CFI-MARKER")&&t.parentNode.removeChild(t)},i.prototype.findParent=function(t,e){var i,r,n,o=e||document,s=o.getElementsByTagName("html")[0],a=Array.prototype.slice.call(s.children);if("string"==typeof t&&(t=this.parse(t)),r=t.steps.slice(0),!r.length)return o.getElementsByTagName("body")[0];for(;r&&r.length>0;){if(i=r.shift(),"text"===i.type?(n=s.childNodes[i.index],s=n.parentNode||s):s=i.id?o.getElementById(i.id):a[i.index],"undefined"==typeof s)return console.error("No Element For",i,t.str),!1;a=Array.prototype.slice.call(s.children)}return s},i.prototype.compare=function(t,e){if("string"==typeof t&&(t=new i(t)),"string"==typeof e&&(e=new i(e)),t.spinePos>e.spinePos)return 1;if(t.spinePose.steps[r].index)return 1;if(t.steps[r].indexe.characterOffset?1:t.characterOffset")},i.prototype.generateRangeFromCfi=function(t,e){var i,r,n,o,s,a,h=e||document,u=h.createRange();return"string"==typeof t&&(t=this.parse(t)),-1===t.spinePos?!1:(i=t.steps[t.steps.length-1],"undefined"!=typeof document.evaluate?(r=this.generateXpathFromSteps(t.steps),n=h.evaluate(r,h,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue):(s=this.generateQueryFromSteps(t.steps),a=h.querySelector(s),a&&"text"==i.type&&(n=a.childNodes[i.index])),n?(n&&t.characterOffset>=0?(o=n.length,t.characterOffset=0?i:p%2===0?p:p-1;n=h>1?Math.floor((c-l)/h):c,s=n*h,a=(n+l)*h,this.columnAxis=o.prefixed("columnAxis"),this.columnGap=o.prefixed("columnGap"),this.columnWidth=o.prefixed("columnWidth"),this.columnFill=o.prefixed("columnFill"),this.width=c,this.height=e,this.spread=s,this.delta=a,this.column=n,this.gap=l,this.divisor=h},i.prototype.format=function(t){var e=t.document.documentElement,i=t.document.body;e.style.overflow="hidden",e.style.width=this.width+"px",i.style.height=this.height+"px",i.style[this.columnAxis]="horizontal",i.style[this.columnFill]="auto",i.style[this.columnGap]=this.gap+"px",i.style[this.columnWidth]=this.column+"px",t.iframe.style.marginRight=this.gap+"px" -},i.prototype.count=function(t){var e=t.root().scrollWidth,i=Math.ceil(e/this.spread);return{spreads:i,pages:i*this.divisor}},r.prototype.calculate=function(){},r.prototype.format=function(t){var e,i,r=t.document.documentElement,n=documentElement.querySelector("[name=viewport");n&&n.hasAttribute("content")&&(content=n.getAttribute("content"),contents=content.split(","),contents[0]&&(e=contents[0].replace("width=","")),contents[1]&&(i=contents[1].replace("height=",""))),t.resize(e,i),r.style.overflow="auto"},r.prototype.count=function(){return{spreads:1,pages:1}},n.prototype.calculate=function(t){this.spread=t,this.column=t,this.gap=0},n.prototype.format=function(t){var e=t.document.documentElement;e.style.width="auto",e.style.height="auto"},n.prototype.count=function(){return{spreads:1,pages:1}},e.exports={Reflowable:i,Fixed:r,Scroll:n}},{"./core":8}],12:[function(t,e){function i(t,e){this.spine=t,this.request=e,this.q=new n(this),this.epubcfi=new o,this._locations=[],this.total=0,this.break=150,this._current=0}var r=t("./core"),n=t("./queue"),o=t("./epubcfi"),s=t("rsvp");i.prototype.generate=function(t){return t&&(this.break=t),this.q.pause(),this.spine.each(function(t){this.q.enqueue(this.process,t)}.bind(this)),this.q.run().then(function(){return this.total=this._locations.length-1,this._currentCfi&&(this.currentLocation=this._currentCfi),this._locations}.bind(this))},i.prototype.process=function(t){return t.load(this.request).then(function(e){var i,r=e.ownerDocument,n=0;this.sprint(e,function(e){var o,s=e.length,a=0;for(0==n&&(i=r.createRange(),i.setStart(e,0)),o=this.break-n,o>s&&(n+=s,a=s);s>a;)n=this.break,a+=this.break,a>=s?n=s-(a-this.break):(i.setEnd(e,a),cfi=t.cfiFromRange(i),this._locations.push(cfi),n=0,a+=1,i=r.createRange(),i.setStart(e,a))}.bind(this)),i&&(i.setEnd(prev,prev.length),cfi=t.cfiFromRange(i),this._locations.push(cfi),n=0)}.bind(this))},i.prototype.sprint=function(t,e){for(var i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,null,!1);node=i.nextNode();)e(node)},i.prototype.locationFromCfi=function(t){return 0===this._locations.length?-1:r.locationOf(t,this._locations,this.epubcfi.compare)},i.prototype.precentageFromCfi=function(t){var e=this.locationFromCfi(t);return this.precentageFromLocation(e)},i.prototype.percentageFromLocation=function(t){return t&&this.total?t/this.total:0},i.prototype.cfiFromLocation=function(t){var e=-1;return"number"!=typeof t&&(t=parseInt(pg)),t>=0&&t1?t/100:t,i=Math.ceil(this.total*e);return this.cfiFromLocation(i)},i.prototype.load=function(t){return this._locations=JSON.parse(t),this.total=this._locations.length-1,this._locations},i.prototype.save=function(){return JSON.stringify(this._locations)},i.prototype.getCurrent=function(){return this._current},i.prototype.setCurrent=function(t){var e;if("string"==typeof t)this._currentCfi=t;else{if("number"!=typeof t)return;this._current=t}0!==this._locations.length&&("string"==typeof t?(e=this.locationFromCfi(t),this._current=e):e=t,this.trigger("changed",{percentage:this.precentageFromLocation(e)}))},Object.defineProperty(i.prototype,"currentLocation",{get:function(){return this._current},set:function(t){this.setCurrent(t)}}),s.EventTarget.mixin(i.prototype),e.exports=i},{"./core":8,"./epubcfi":9,"./queue":17,rsvp:4}],13:[function(t,e){function i(t){this.layout=t}i.prototype.section=function(t){var e=this.findRanges(t),i=this.rangeListToCfiList(t,e);return i},i.prototype.page=function(t,e,i){var r=t.document.body;return this.rangePairToCfiPair(t.section,{start:this.findStart(r,e,i),end:this.findEnd(r,e,i)})},i.prototype.walk=function(t,e){for(var i,r,n=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode:function(t){return t.data.trim().length>0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}},!1);(i=n.nextNode())&&!(r=e(i)););return r},i.prototype.findRanges=function(t){for(var e,i,r=[],n=this.layout.count(t),o=this.layout.column,s=this.layout.gap,a=0;a=e&&i>=r?t:n>e?t:(s=t,o.push(t),void 0)}))return this.findTextStartRange(n,e,i);return this.findTextStartRange(s,e,i)},i.prototype.findEnd=function(t,e,i){for(var r,n,o=[t],s=t;o.length;)if(r=o.shift(),n=this.walk(r,function(t){var e,r,n,a;return t.nodeType==Node.TEXT_NODE?(a=document.createRange(),a.selectNodeContents(t),n=a.getBoundingClientRect()):n=t.getBoundingClientRect(),e=n.left,r=n.right,e>i&&s?s:r>i?t:(s=t,o.push(t),void 0)}))return this.findTextEndRange(n,e,i);return this.findTextEndRange(s,e,i)},i.prototype.findTextStartRange=function(t,e){for(var i,r,n,o=this.splitTextNodeIntoRanges(t),s=0;s=e)return r;i=r}return o[0]},i.prototype.findTextEndRange=function(t,e,i){for(var r,n,o,s=this.splitTextNodeIntoRanges(t),a=0;ai&&r)return r;if(o.right>i)return n;r=n}return s[s.length-1]},i.prototype.splitTextNodeIntoRanges=function(t,e){var i,r=[],n=t.textContent||"",o=n.trim(),s=t.ownerDocument,a=e||" ";if(pos=o.indexOf(a),-1===pos||t.nodeType!=Node.TEXT_NODE)return i=s.createRange(),i.selectNodeContents(t),[i];for(i=s.createRange(),i.setStart(t,0),i.setEnd(t,pos),r.push(i),i=!1;-1!=pos;)pos=o.indexOf(a,pos+1),pos>0&&(i&&(i.setEnd(t,pos),r.push(i)),i=s.createRange(),i.setStart(t,pos+1));return i&&(i.setEnd(t,o.length),r.push(i)),r},i.prototype.rangePairToCfiPair=function(t,e){var i=e.start,r=e.end;return i.collapse(!0),r.collapse(!0),startCfi=t.cfiFromRange(i),endCfi=t.cfiFromRange(r),{start:startCfi,end:endCfi}},i.prototype.rangeListToCfiList=function(t,e){for(var i,r=[],n=0;n1?(t=a.left-s[0].position().left,i=t+this.layout.column,e=a.left+this.layout.spread-s[s.length-1].position().left,r=e+this.layout.column,n=this.map.page(s[0],t,i),o=this.map.page(s[s.length-1],e,r),{start:n.start,end:o.end}):void 0},i.prototype.resize=function(t,e){this.q.clear(),this.stageSize(t,e),this.updateLayout(),this.location&&this.display(this.location.start),this.trigger("resized",{width:this.stage.width,height:this.stage.height})},i.prototype.onResized=function(){this.views.clear(),clearTimeout(this.resizeTimeout),this.resizeTimeout=setTimeout(function(){this.resize()}.bind(this),150)},i.prototype.adjustImages=function(t){return t.addStylesheetRules([["img",["max-width",this.layout.spread+"px"],["max-height",this.layout.height+"px"]]]),new r.Promise(function(t){setTimeout(function(){t()},1)})},e.exports=i},{"./continuous":7,"./core":8,"./layout":11,"./map":13,rsvp:4}],16:[function(t,e){function i(){}var r=t("urijs"),n=(t("./core"),t("./epubcfi"));i.prototype.container=function(t){var e,i,n,o;return t?(e=t.querySelector("rootfile"))?(i=e.getAttribute("full-path"),n=r(i).directory(),o=t.xmlEncoding,{packagePath:i,basePath:n,encoding:o}):(console.error("No RootFile Found"),void 0):(console.error("Container File Not Found"),void 0)},i.prototype.identifier=function(t){var e;return t?(e=t.querySelector("metadata"),e?this.getElementText(e,"identifier"):(console.error("No Metadata Found"),void 0)):(console.error("Package File Not Found"),void 0)},i.prototype.packageContents=function(t){var e,i,r,n,o,s,a,h,u,c,p=this;return t?(e=t.querySelector("metadata"))?(i=t.querySelector("manifest"))?(r=t.querySelector("spine"))?(n=p.manifest(i),o=p.findNavPath(i),s=p.findNcxPath(i,r),a=p.findCoverPath(t),h=Array.prototype.indexOf.call(r.parentNode.childNodes,r),u=p.spine(r,n),c=p.metadata(e),c.direction=r.getAttribute("page-progression-direction"),{metadata:c,spine:u,manifest:n,navPath:o,ncxPath:s,coverPath:a,spineNodeIndex:h}):(console.error("No Spine Found"),void 0):(console.error("No Manifest Found"),void 0):(console.error("No Metadata Found"),void 0):(console.error("Package File Not Found"),void 0)},i.prototype.findNavPath=function(t){var e=t.querySelector("item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']");return e?e.getAttribute("href"):!1},i.prototype.findNcxPath=function(t,e){var i,r=t.querySelector("item[media-type='application/x-dtbncx+xml']");return r||(i=e.getAttribute("toc"),i&&(r=t.querySelector("item[id='"+i+"']"))),r?r.getAttribute("href"):!1},i.prototype.metadata=function(t){var e={},i=this;return e.title=i.getElementText(t,"title"),e.creator=i.getElementText(t,"creator"),e.description=i.getElementText(t,"description"),e.pubdate=i.getElementText(t,"date"),e.publisher=i.getElementText(t,"publisher"),e.identifier=i.getElementText(t,"identifier"),e.language=i.getElementText(t,"language"),e.rights=i.getElementText(t,"rights"),e.modified_date=i.querySelectorText(t,"meta[property='dcterms:modified']"),e.layout=i.querySelectorText(t,"meta[property='rendition:layout']"),e.orientation=i.querySelectorText(t,"meta[property='rendition:orientation']"),e.spread=i.querySelectorText(t,"meta[property='rendition:spread']"),e},i.prototype.findCoverPath=function(t){var e=t.querySelector("package").getAttribute("version");if("2.0"===e){var i=t.querySelector('meta[name="cover"]');if(i){var r=i.getAttribute("content"),n=t.querySelector("item[id='"+r+"']");return n?n.getAttribute("href"):!1}return!1}var o=t.querySelector("item[properties='cover-image']");return o?o.getAttribute("href"):!1},i.prototype.getElementText=function(t,e){var i,r=t.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/",e);return r&&0!==r.length?(i=r[0],i.childNodes.length?i.childNodes[0].nodeValue:""):""},i.prototype.querySelectorText=function(t,e){var i=t.querySelector(e);return i&&i.childNodes.length?i.childNodes[0].nodeValue:""},i.prototype.manifest=function(t){var e={},i=t.querySelectorAll("item"),r=Array.prototype.slice.call(i);return r.forEach(function(t){var i=t.getAttribute("id"),r=t.getAttribute("href")||"",n=t.getAttribute("media-type")||"",o=t.getAttribute("properties")||"";e[i]={href:r,type:n,properties:o.length?o.split(" "):[]}}),e},i.prototype.spine=function(t){{var e=[],i=t.getElementsByTagName("itemref"),r=Array.prototype.slice.call(i);new n}return r.forEach(function(t,i){var r=t.getAttribute("idref"),n=t.getAttribute("properties")||"",o=n.length?n.split(" "):[],s={idref:r,linear:t.getAttribute("linear")||"",properties:o,index:i};e.push(s)}),e},i.prototype.querySelectorByType=function(t,e,i){var r=t.querySelector(e+'[*|type="'+i+'"]');if(null!==r&&0!==r.length)return r;r=t.querySelectorAll(e);for(var n=0;nr;++r)n=this.navItem(a[r],e,i),u[n.id]=n,n.parent?(o=u[n.parent],o.subitems.push(n)):c.push(n);return c},i.prototype.navItem=function(t){var e,i=t.getAttribute("id")||!1,r=t.querySelector("a, span"),n=r.getAttribute("href")||"",o=r.textContent||"",s=[],a=t.parentNode;return a&&"navPoint"===a.nodeName&&(e=a.getAttribute("id")),{id:i,href:n,label:o,subitems:s,parent:e}},i.prototype.toc=function(t,e,i){var r,n,o,s=t.querySelectorAll("navMap navPoint"),a=s.length,h={},u=[];if(!s||0===a)return u;for(r=0;a>r;++r)n=this.tocItem(s[r],e,i),h[n.id]=n,n.parent?(o=h[n.parent],o.subitems.push(n)):u.push(n);return u},i.prototype.tocItem=function(t){var e,i=t.getAttribute("id")||!1,r=t.querySelector("content"),n=r.getAttribute("src"),o=t.querySelector("navLabel"),s=o.textContent?o.textContent:"",a=[],h=t.parentNode;return h&&"navPoint"===h.nodeName&&(e=h.getAttribute("id")),{id:i,href:n,label:s,subitems:a,parent:e}},i.prototype.pageList=function(t,e,i){var r,n,o=this.querySelectorByType(t,"nav","page-list"),s=o?o.querySelectorAll("ol li"):[],a=s.length,h=[];if(!s||0===a)return h;for(r=0;a>r;++r)n=this.pageListItem(s[r],e,i),h.push(n);return h},i.prototype.pageListItem=function(t){var e,i,r,n=(t.getAttribute("id")||!1,t.querySelector("a")),o=n.getAttribute("href")||"",s=n.textContent||"",a=parseInt(s),h=o.indexOf("epubcfi");return-1!=h?(e=o.split("#"),i=e[0],r=e.length>1?e[1]:!1,{cfi:r,href:o,packageUrl:i,page:a}):{href:o,page:a}},e.exports=i},{"./core":8,"./epubcfi":9,urijs:5}],17:[function(t,e){function i(t){this._q=[],this.context=t,this.tick=n.requestAnimationFrame,this.running=!1,this.paused=!1}var r=t("rsvp"),n=t("./core");i.prototype.enqueue=function(){var t,e,i,n=[].shift.call(arguments),o=arguments;return n?("function"==typeof n?(t=new r.defer,e=t.promise,i={task:n,args:o,deferred:t,promise:e}):i={promise:n},this._q.push(i),0!=this.paused||this.running||this.run(),i.promise):console.error("No Task Provided")},i.prototype.dequeue=function(){var t,e,i;return this._q.length?(t=this._q.shift(),(e=t.task)?(i=e.apply(this.context,t.args),i&&"function"==typeof i.then?i.then(function(){t.deferred.resolve.apply(this.context,arguments)}.bind(this)):(t.deferred.resolve.apply(this.context,i),t.promise)):t.promise?t.promise:void 0):(t=new r.defer,t.deferred.resolve(),t.promise)},i.prototype.dump=function(){for(;this._q.length;)this.dequeue()},i.prototype.run=function(){return this.running||(this.running=!0,this.defered=new r.defer),this.tick.call(window,function(){this._q.length?this.dequeue().then(function(){this.run()}.bind(this)):(this.defered.resolve(),this.running=void 0)}.bind(this)),1==this.paused&&(this.paused=!1),this.defered.promise},i.prototype.flush=function(){return this.running?this.running:this._q.length?(this.running=this.dequeue().then(function(){return this.running=void 0,this.flush()}.bind(this)),this.running):void 0},i.prototype.clear=function(){this._q=[],this.running=!1},i.prototype.length=function(){return this._q.length},i.prototype.pause=function(){this.paused=!0},e.exports=i},{"./core":8,rsvp:4}],18:[function(t,e){function i(t,e){this.settings=o.extend(this.settings||{},{infinite:!0,hidden:!1,width:!1,height:null,layoutOveride:null,axis:"vertical"}),o.extend(this.settings,e),this.viewSettings={},this.book=t,this.views=null,this.hooks={},this.hooks.display=new a(this),this.hooks.serialize=new a(this),this.hooks.content=new a(this),this.hooks.layout=new a(this),this.hooks.render=new a(this),this.hooks.show=new a(this),this.hooks.content.register(s.links.bind(this)),this.hooks.content.register(this.passViewEvents.bind(this)),this.epubcfi=new h,this.q=new u(this),this.q.enqueue(this.book.opened),this.q.enqueue(this.parseLayoutProperties),this.book.archive&&this.replacements()}var r=t("rsvp"),n=t("urijs"),o=t("./core"),s=t("./replacements"),a=t("./hook"),h=t("./epubcfi"),u=t("./queue"),c=t("./view"),p=t("./views"),l=t("./layout"),d=t("./map");i.prototype.initialize=function(t){{var e,i=t||{},r=i.height,n=i.width;i.hidden||!1}return i.height&&o.isNumber(i.height)&&(r=i.height+"px"),i.width&&o.isNumber(i.width)&&(n=i.width+"px"),e=document.createElement("div"),e.id="epubjs-container:"+o.uuid(),e.classList.add("epub-container"),e.style.fontSize="0",e.style.wordSpacing="0",e.style.lineHeight="0",e.style.verticalAlign="top","horizontal"===this.settings.axis&&(e.style.whiteSpace="nowrap"),n&&(e.style.width=n),r&&(e.style.height=r),e.style.overflow=this.settings.overflow,e},i.wrap=function(t){var e=document.createElement("div");return e.style.visibility="hidden",e.style.overflow="hidden",e.style.width="0",e.style.height="0",e.appendChild(t),e},i.prototype.attachTo=function(t){return this.container=this.initialize({width:this.settings.width,height:this.settings.height}),o.isElement(t)?this.element=t:"string"==typeof t&&(this.element=document.getElementById(t)),this.element?(this.settings.hidden?(this.wrapper=this.wrap(this.container),this.element.appendChild(this.wrapper)):this.element.appendChild(this.container),this.views=new p(this.container),this.attachListeners(),this.stageSize(),this.applyLayoutMethod(),this.trigger("attached"),void 0):(console.error("Not an Element"),void 0)},i.prototype.attachListeners=function(){o.isNumber(this.settings.width)&&o.isNumber(this.settings.height)||window.addEventListener("resize",this.onResized.bind(this),!1)},i.prototype.bounds=function(){return this.container.getBoundingClientRect()},i.prototype.display=function(t){return this.q.enqueue(this._display,t)},i.prototype._display=function(t){var e,i,n,o,s,a=new r.defer,h=a.promise,u=this.epubcfi.isCfiString(t);return(e=this.book.spine.get(t))?(s=this.views.find(e),s?(n=i.locationOf(t),h=this.moveTo(n).then(function(){return this.check()})):(this.views.hide(),i=this.createView(e),h=this.fill(i).then(function(){return"string"==typeof t&&t.indexOf("#")>-1&&(o=t.substring(t.indexOf("#")+1)),u||o?(n=i.locationOf(t),this.moveTo(n)):"function"==typeof this.check?this.check():void 0}.bind(this)).then(function(){return this.hooks.display.trigger(i)}.bind(this)).then(function(){this.views.show()}.bind(this))),h.then(function(){this.trigger("displayed",e)}.bind(this)),h):(a.reject(new Error("No Section Found")),h)},i.prototype.moveTo=function(t){this.scrollBy(t.left,t.top)},i.prototype.render=function(t,e){return t.create(),t.onLayout=this.layout.format.bind(this.layout),this.resizeView(t),t.render(this.book.request).then(function(){return this.hooks.content.trigger(t,this)}.bind(this)).then(function(){return this.hooks.layout.trigger(t,this)}.bind(this)).then(function(){return t.display()}.bind(this)).then(function(){return this.hooks.render.trigger(t,this)}.bind(this)).then(function(){e!==!1&&this.views.hidden===!1&&this.q.enqueue(function(t){t.show()},t),this.hooks.show.trigger(t,this),this.trigger("rendered",t.section)}.bind(this)).catch(function(t){this.trigger("loaderror",t)}.bind(this))},i.prototype.afterDisplayed=function(t){this.trigger("added",t.section)},i.prototype.fill=function(t){return this.views.clear(),this.views.append(t),t.onDisplayed=this.afterDisplayed.bind(this),this.render(t)},i.prototype.resizeView=function(t){"pre-paginated"===this.globalLayoutProperties.layout?t.lock("both",this.stage.width,this.stage.height):t.lock("width",this.stage.width,this.stage.height)},i.prototype.stageSize=function(t,e){var i,r=t||this.settings.width,n=e||this.settings.height;return r===!1&&(i=this.element.getBoundingClientRect(),i.width&&(r=i.width,this.container.style.width=i.width+"px")),n===!1&&(i=i||this.element.getBoundingClientRect(),i.height&&(n=i.height,this.container.style.height=i.height+"px")),r&&!o.isNumber(r)&&(i=this.container.getBoundingClientRect(),r=i.width),n&&!o.isNumber(n)&&(i=i||this.container.getBoundingClientRect(),n=i.height),this.containerStyles=window.getComputedStyle(this.container),this.containerPadding={left:parseFloat(this.containerStyles["padding-left"])||0,right:parseFloat(this.containerStyles["padding-right"])||0,top:parseFloat(this.containerStyles["padding-top"])||0,bottom:parseFloat(this.containerStyles["padding-bottom"])||0},this.stage={width:r-this.containerPadding.left-this.containerPadding.right,height:n-this.containerPadding.top-this.containerPadding.bottom},this.stage},i.prototype.applyLayoutMethod=function(){this.layout=new l.Scroll,this.updateLayout(),this.map=new d(this.layout)},i.prototype.updateLayout=function(){this.layout.calculate(this.stage.width,this.stage.height)},i.prototype.resize=function(t,e){this.stageSize(t,e),this.updateLayout(),this.views.each(this.resizeView.bind(this)),this.trigger("resized",{width:this.stage.width,height:this.stage.height})},i.prototype.onResized=function(){this.resize()},i.prototype.createView=function(t){return t.hooks.serialize.register(this.hooks.serialize.list()),new c(t,this.viewSettings)},i.prototype.next=function(){return this.q.enqueue(function(){var t,e;return this.views.length?(t=this.views.last().section.next(),t?(e=this.createView(t),this.fill(e)):void 0):void 0})},i.prototype.prev=function(){return this.q.enqueue(function(){var t,e;return this.views.length?(t=this.views.first().section.prev(),t?(e=this.createView(t),this.fill(e)):void 0):void 0})},i.prototype.parseLayoutProperties=function(t){var e=t||this.book.package.metadata,i=this.layoutOveride&&this.layoutOveride.layout||e.layout||"reflowable",r=this.layoutOveride&&this.layoutOveride.spread||e.spread||"auto",n=this.layoutOveride&&this.layoutOveride.orientation||e.orientation||"auto";return this.globalLayoutProperties={layout:i,spread:r,orientation:n},this.globalLayoutProperties},i.prototype.current=function(){var t=this.visible();return t.length?t[t.length-1]:null},i.prototype.isVisible=function(t,e,i,r){var n=t.position(),o=r||this.container.getBoundingClientRect();return"horizontal"===this.settings.axis&&n.right>o.left-e&&n.lefto.top-e&&n.top-1&&(i[a]=r)},i.prototype.replaceAssets=function(t,e,i){var r=n(t.url),o=e.map(function(t){var e=n(t).absoluteTo(this.book.baseUrl),i=e.relativeTo(r).toString();return i}.bind(this));t.output=s.substitute(t.output,o,i)},r.EventTarget.mixin(i.prototype),e.exports=i},{"./core":8,"./epubcfi":9,"./hook":10,"./layout":11,"./map":13,"./queue":17,"./replacements":19,"./view":24,"./views":25,rsvp:4,urijs:5}],19:[function(t,e){function i(t,e){var i,r;t&&(r=t.querySelector("head"),i=r.querySelector("base"),i||(i=t.createElement("base")),i.setAttribute("href",e.url),r.insertBefore(i,r.firstChild))}function r(t,e){for(var i=t.document.querySelectorAll("a[href]"),r=function(i){var r=i.getAttribute("href"),n=o(r),s=n.absoluteTo(t.section.url),a=s.relativeTo(this.book.baseUrl).toString();n.protocol()?i.setAttribute("target","_blank"):n.fragment()||(i.onclick=function(){return e.display(a),!1})},n=0;n-1?(delete this.spineByHref[t.href],delete this.spineById[t.idref],this.spineItems.splice(e,1)):void 0},i.prototype.each=function(){return this.spineItems.forEach.apply(this.spineItems,arguments)},e.exports=i},{"./core":8,"./epubcfi":9,"./section":21,rsvp:4}],23:[function(t,e){function i(){this.checkRequirements(),this.urlCache={}}var r=t("rsvp"),n=t("urijs"),o=t("./core"),s=t("./request"),a=t("../libs/mime/mime");i.prototype.checkRequirements=function(){try{"undefined"!=typeof JSZip?this.zip=new JSZip:(JSZip=t("jszip"),this.zip=new JSZip)}catch(e){console.error("JSZip lib not loaded")}},i.prototype.open=function(t){return t instanceof ArrayBuffer?new r.Promise(function(e){this.zip=new JSZip(t),e(this.zip)}):s(t,"binary").then(function(t){return this.zip=new JSZip(t),this.zip}.bind(this))},i.prototype.request=function(t,e){var i,o,s=new r.defer;return e||(uri=n(t),e=uri.suffix()),i="blob"==e?this.getBlob(t):this.getText(t),i?(o=this.handleResponse(i,e),s.resolve(o)):s.reject({message:"File not found in the epub: "+t,stack:(new Error).stack}),s.promise},i.prototype.handleResponse=function(t,e){var i;return i="json"==e?JSON.parse(t):o.isXml(e)?(new DOMParser).parseFromString(t,"text/xml"):"xhtml"==e?(new DOMParser).parseFromString(t,"application/xhtml+xml"):"html"==e||"htm"==e?(new DOMParser).parseFromString(t,"text/html"):t},i.prototype.getBlob=function(t,e){var i,r=window.decodeURIComponent(t.substr(1)),n=this.zip.file(r);return n?(i=e||a.lookup(n.name),new Blob([n.asUint8Array()],{type:i})):void 0},i.prototype.getText=function(t){var e=window.decodeURIComponent(t.substr(1)),i=this.zip.file(e);return i?i.asText():void 0},i.prototype.createUrl=function(t){var e,i,n=new r.defer,o=window.URL||window.webkitURL||window.mozURL;return t in this.urlCache?(n.resolve(this.urlCache[t]),n.promise):(i=this.getBlob(t),i?(e=o.createObjectURL(i),n.resolve(e),this.urlCache[t]=e):n.reject({message:"File not found in the epub: "+t,stack:(new Error).stack}),n.promise)},i.prototype.revokeUrl=function(t){var e=window.URL||window.webkitURL||window.mozURL,i=this.urlCache[t];i&&e.revokeObjectURL(i)},e.exports=i},{"../libs/mime/mime":1,"./core":8,"./request":20,jszip:"jszip",rsvp:4,urijs:5}],24:[function(t,e){function i(t,e){this.settings=e||{},this.id="epubjs-view:"+n.uuid(),this.section=t,this.index=t.index,this.element=document.createElement("div"),this.element.classList.add("epub-view"),this.element.style.height="0px",this.element.style.width="0px",this.element.style.overflow="hidden",this.added=!1,this.displayed=!1,this.rendered=!1,this.epubcfi=new o,this.element.style.display=this.settings.axis&&"horizontal"==this.settings.axis?"inline-block":"block",this.listenedEvents=["keydown","keyup","keypressed","mouseup","mousedown","click","touchend","touchstart"]}var r=t("rsvp"),n=t("./core"),o=t("./epubcfi");i.prototype.create=function(){return this.iframe?this.iframe:(this.iframe=document.createElement("iframe"),this.iframe.id=this.id,this.iframe.scrolling="no",this.iframe.style.overflow="hidden",this.iframe.seamless="seamless",this.iframe.style.border="none",this.resizing=!0,this.element.style.visibility="hidden",this.iframe.style.visibility="hidden",this.iframe.style.width="0",this.iframe.style.height="0",this._width=0,this._height=0,this.element.appendChild(this.iframe),this.added=!0,this.elementBounds=n.bounds(this.element),this.supportsSrcdoc=!1,this.iframe)},i.prototype.lock=function(t,e,i){var r,o=n.borders(this.element);r=this.iframe?n.borders(this.iframe):{width:0,height:0},"width"==t&&n.isNumber(e)&&(this.lockedWidth=e-o.width-r.width,this.resize(this.lockedWidth,e)),"height"==t&&n.isNumber(i)&&(this.lockedHeight=i-o.height-r.height,this.resize(e,this.lockedHeight)),"both"===t&&n.isNumber(e)&&n.isNumber(i)&&(this.lockedWidth=e-o.width-r.width,this.lockedHeight=i-o.height-r.height,this.resize(this.lockedWidth,this.lockedHeight)),this.displayed&&this.iframe&&(this.layout(),this.expand())},i.prototype.expand=function(){var t,e,i=this.lockedWidth,r=this.lockedHeight;this.iframe&&!this._expanding&&(this._expanding=!0,r&&!i&&(t=this.textWidth(),t!=this._textWidth?(i=this.contentWidth(t),this._textWidth=t,this._contentWidth=i):i=this._contentWidth),i&&!r&&(e=this.textHeight(),e!=this._textHeight?(r=this.contentHeight(e),this._textHeight=e,this._contentHeight=r):r=this._contentHeight),(this._needsReframe||i!=this._width||r!=this._height)&&this.resize(i,r),this._expanding=!1)},i.prototype.contentWidth=function(t){var e,i;return e=this.iframe.style.width,this.iframe.style.width=(t||0)+"px",i=this.document.body.scrollWidth,this.iframe.style.width=e,i},i.prototype.contentHeight=function(t){var e,i;return e=this.iframe.style.height,this.iframe.style.height=(t||0)+"px",i=this.document.body.scrollHeight,this.iframe.style.height=e,i},i.prototype.textWidth=function(){var t,e=this.document.createRange();return e.selectNodeContents(this.document.body),t=e.getBoundingClientRect().width},i.prototype.textHeight=function(){var t,e=this.document.createRange();return e.selectNodeContents(this.document.body),t=e.getBoundingClientRect().height},i.prototype.resize=function(t,e){this.iframe&&(n.isNumber(t)&&(this.iframe.style.width=t+"px",this._width=t),n.isNumber(e)&&(this.iframe.style.height=e+"px",this._height=e),this.iframeBounds=n.bounds(this.iframe),this.reframe(this.iframeBounds.width,this.iframeBounds.height))},i.prototype.reframe=function(t,e){return this.displayed?(n.isNumber(t)&&(this.element.style.width=t+"px"),n.isNumber(e)&&(this.element.style.height=e+"px"),this.prevBounds=this.elementBounds,this.elementBounds=n.bounds(this.element),this.trigger("resized",{width:this.elementBounds.width,height:this.elementBounds.height,widthDelta:this.elementBounds.width-this.prevBounds.width,heightDelta:this.elementBounds.height-this.prevBounds.height}),void 0):(this._needsReframe=!0,void 0)},i.prototype.resized=function(){},i.prototype.render=function(t){return this.rendering=!0,this.section.render(t).then(function(t){return this.load(t)}.bind(this))},i.prototype.load=function(t){var e=new r.defer,i=e.promise;if(!this.iframe)return e.reject(new Error("No Iframe Available")),i;if(this.iframe.onload=function(){this.window=this.iframe.contentWindow,this.document=this.iframe.contentDocument,this.rendering=!1,e.resolve(this)}.bind(this),this.supportsSrcdoc)this.iframe.srcdoc=t;else{if(this.document=this.iframe.contentDocument,!this.document)return e.reject(new Error("No Document Available")),i;this.document.open(),this.document.write(t),this.document.close()}return i},i.prototype.layout=function(t){this.iframe.style.display="inline-block",this.document.body.style.margin="0",t&&t(this),this.onLayout(this)},i.prototype.onLayout=function(){},i.prototype.listeners=function(){this.document.fonts&&"loading"===this.document.fonts.status&&(this.document.fonts.onloadingdone=function(){this.expand()}.bind(this)),this.section.properties.indexOf("scripted")>-1&&(this.observer=this.observe(this.document.body)),this.imageLoadListeners(),this.mediaQueryListeners(),this.addEventListeners(),this.addSelectionListeners()},i.prototype.removeListeners=function(){this.removeEventListeners(),this.removeSelectionListeners()},i.prototype.resizeListenters=function(){clearTimeout(this.expanding),this.expanding=setTimeout(this.expand.bind(this),350)},i.prototype.mediaQueryListeners=function(){for(var t=this.document.styleSheets,e=function(t){t.matches&&!this._expanding&&setTimeout(this.expand.bind(this),1)}.bind(this),i=0;i-1&&(id=t.substring(t.indexOf("#")+1),el=this.document.getElementById(id),el&&(i=el.getBoundingClientRect())),{left:window.scrollX+e.left+i.left,top:window.scrollY+e.top+i.top}):void 0},i.prototype.addCss=function(t){return new r.Promise(function(e){var i,r=!1;return this.document?(i=this.document.createElement("link"),i.type="text/css",i.rel="stylesheet",i.href=t,i.onload=i.onreadystatechange=function(){r||this.readyState&&"complete"!=this.readyState||(r=!0,setTimeout(function(){e(!0)},1))},this.document.head.appendChild(i),void 0):(e(!1),void 0)}.bind(this))},i.prototype.addStylesheetRules=function(t){var e,i;if(this.document){e=this.document.createElement("style"),this.document.head.appendChild(e),i=e.sheet;for(var r=0,n=t.length;n>r;r++){var o=1,s=t[r],a=t[r][0],h="";"[object Array]"===Object.prototype.toString.call(s[1][0])&&(s=s[1],o=0);for(var u=s.length;u>o;o++){var c=s[o];h+=c[0]+":"+c[1]+(c[2]?" !important":"")+";\n"}i.insertRule(a+"{"+h+"}",i.cssRules.length)}}},i.prototype.addScript=function(t){return new r.Promise(function(e){var i,r=!1;return this.document?(i=this.document.createElement("script"),i.type="text/javascript",i.async=!0,i.src=t,i.onload=i.onreadystatechange=function(){r||this.readyState&&"complete"!=this.readyState||(r=!0,setTimeout(function(){e(!0)},1))},this.document.head.appendChild(i),void 0):(e(!1),void 0)}.bind(this))},i.prototype.addEventListeners=function(){this.document&&this.listenedEvents.forEach(function(t){this.document.addEventListener(t,this.triggerEvent.bind(this),!1)},this)},i.prototype.removeEventListeners=function(){this.document&&this.listenedEvents.forEach(function(t){this.document.removeEventListener(t,this.triggerEvent,!1)},this)},i.prototype.triggerEvent=function(t){this.trigger(t.type,t)},i.prototype.addSelectionListeners=function(){this.document&&this.document.addEventListener("selectionchange",this.onSelectionChange.bind(this),!1)},i.prototype.removeSelectionListeners=function(){this.document&&this.document.removeEventListener("selectionchange",this.onSelectionChange,!1)},i.prototype.onSelectionChange=function(){this.selectionEndTimeout&&clearTimeout(this.selectionEndTimeout),this.selectionEndTimeout=setTimeout(function(){this.selectedRange=this.window.getSelection(),this.trigger("selected",this.selectedRange)}.bind(this),500)},r.EventTarget.mixin(i.prototype),e.exports=i},{"./core":8,"./epubcfi":9,rsvp:4}],25:[function(t,e){function i(t){this.container=t,this._views=[],this.length=0,this.hidden=!1}i.prototype.first=function(){return this._views[0]},i.prototype.last=function(){return this._views[this._views.length-1]},i.prototype.each=function(){return this._views.forEach.apply(this._views,arguments)},i.prototype.indexOf=function(t){return this._views.indexOf(t)},i.prototype.slice=function(){return this._views.slice.apply(this._views,arguments)},i.prototype.get=function(t){return this._views[t]},i.prototype.append=function(t){return this._views.push(t),this.container.appendChild(t.element),this.length++,t},i.prototype.prepend=function(t){return this._views.unshift(t),this.container.insertBefore(t.element,this.container.firstChild),this.length++,t},i.prototype.insert=function(t,e){return this._views.splice(e,0,t),e-1&&this._views.splice(e,1),this.destroy(t),this.length--},i.prototype.destroy=function(t){t.off("resized"),t.displayed&&t.destroy(),this.container.removeChild(t.element),t=null},i.prototype.clear=function(){var t,e=this.length;if(this.length){for(var i=0;e>i;i++)t=this._views[i],this.destroy(t);this._views=[],this.length=0}},i.prototype.find=function(t){for(var e,i=this.length,r=0;i>r;r++)if(e=this._views[r],e.displayed&&e.section.index==t.index)return e},i.prototype.displayed=function(){for(var t,e=[],i=this.length,r=0;i>r;r++)t=this._views[r],t.displayed&&e.push(t);return e},i.prototype.show=function(){for(var t,e=this.length,i=0;e>i;i++)t=this._views[i],t.displayed&&t.show();this.hidden=!1},i.prototype.hide=function(){for(var t,e=this.length,i=0;e>i;i++)t=this._views[i],t.displayed&&t.hide();this.hidden=!0},e.exports=i},{}],epub:[function(t,e){(function(i){function r(t){return new n(t)}"undefined"==typeof EPUBJS&&(("undefined"!=typeof window?window:i).EPUBJS={}),EPUBJS.VERSION="0.3.0";var n=t("./book");e.exports=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./book":6}]},{},["epub"])("epub")}); -//# sourceMappingURL=epub.min.js.map +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("xmldom"),function(){try{return require("JSZip")}catch(t){}}()):"function"==typeof define&&define.amd?define(["xmldom","JSZip"],e):"object"==typeof exports?exports.ePub=e(require("xmldom"),function(){try{return require("JSZip")}catch(t){}}()):t.ePub=e(t.xmldom,t.JSZip)}(this,function(t,e){return function(t){function e(n){if(i[n])return i[n].exports;var r=i[n]={exports:{},id:n,loaded:!1};return t[n].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){function n(t){return new r(t)}var r=i(1),o=i(15),s=i(24),a=i(30),h=i(2);n.VERSION="0.3.0",n.CFI=o,n.Rendition=s,n.Contents=a,n.RSVP=h,n.ViewManagers={},n.Views={},n.register={manager:function(t,e){return n.ViewManagers[t]=e},view:function(t,e){return n.Views[t]=e}},n.register.view("iframe",i(31)),n.register.manager("single",i(32)),n.register.manager("continuous",i(35)),t.exports=n},function(t,e,i){function n(t,e){this.settings=s.extend(this.settings||{},{requestMethod:this.requestMethod}),s.extend(this.settings,e),this.opening=new r.defer,this.opened=this.opening.promise,this.isOpen=!1,this.url=void 0,this.loading={manifest:new r.defer,spine:new r.defer,metadata:new r.defer,cover:new r.defer,navigation:new r.defer,pageList:new r.defer},this.loaded={manifest:this.loading.manifest.promise,spine:this.loading.spine.promise,metadata:this.loading.metadata.promise,cover:this.loading.cover.promise,navigation:this.loading.navigation.promise,pageList:this.loading.pageList.promise},this.ready=r.hash(this.loaded),this.isRendered=!1,this.request=this.settings.requestMethod.bind(this),this.spine=new a(this.request),this.locations=new h(this.spine,this.request),t&&this.open(t)["catch"](function(e){var i=new Error("Cannot load book at "+t);console.error(i),this.trigger("loadFailed",e)}.bind(this))}var r=i(2),o=i(6),s=i(11),a=i(14),h=i(20),u=i(22),c=i(23),l=i(24),p=i(27),d=i(18),f=i(15);n.prototype.open=function(t,e){var i,n,r,s,a=new u,h=this,c="META-INF/container.xml",l=!1,p=e&&e.base64;return t?(t instanceof ArrayBuffer||p?(l=!0,this.url="/"):i=o(t),window&&window.location&&i?(s=i.absoluteTo(window.location.href),this.url=s.toString()):window&&window.location?this.url=window.location.href:this.url=t,i&&"opf"===i.suffix()?(this.packageUrl=t,this.containerUrl="",i.origin()?this.baseUrl=i.origin()+"/"+i.directory()+"/":s?(this.baseUrl=s.origin(),this.baseUrl+=s.directory()+"/"):this.baseUrl=i.directory()+"/",n=this.request(this.packageUrl)["catch"](function(t){h.opening.reject(t)})):l||p||this.isArchivedUrl(i)?(this.url="/",this.containerUrl=o(c).absoluteTo(this.url).toString(),r=this.unarchive(t,p).then(function(){return this.request(this.containerUrl)}.bind(this))["catch"](function(t){h.opening.reject(t)})):i.suffix()||(this.containerUrl=this.url+c,r=this.request(this.containerUrl)["catch"](function(t){h.opening.reject(t)})),r&&(n=r.then(function(t){return a.container(t)}).then(function(t){var e=o(t.packagePath),i=e.absoluteTo(h.url);return h.packageUrl=i.toString(),h.encoding=t.encoding,i.origin()?h.baseUrl=i.origin()+i.directory()+"/":e.directory()?h.baseUrl="/"+e.directory()+"/":h.baseUrl="/",h.request(h.packageUrl)})["catch"](function(t){h.opening.reject(t)})),n.then(function(t){t&&(h.unpack(t),h.loading.manifest.resolve(h["package"].manifest),h.loading.metadata.resolve(h["package"].metadata),h.loading.spine.resolve(h.spine),h.loading.cover.resolve(h.cover),h.isOpen=!0,h.opening.resolve(h))})["catch"](function(t){h.opening.reject(t)}),this.opened):(this.opening.resolve(this),this.opened)},n.prototype.unpack=function(t){var e=this,i=new u;e["package"]=i.packageContents(t),e["package"]&&(e["package"].baseUrl=e.baseUrl,this.spine.load(e["package"]),e.navigation=new c(e["package"],this.request),e.navigation.load().then(function(t){e.toc=t,e.loading.navigation.resolve(e.toc)}),e.cover=o(e["package"].coverPath).absoluteTo(e.baseUrl).toString())},n.prototype.section=function(t){return this.spine.get(t)},n.prototype.renderTo=function(t,e){return this.rendition=new l(this,e),this.rendition.attachTo(t),this.rendition},n.prototype.requestMethod=function(t){return this.unarchived?this.unarchived.request(t):d(t,null,this.requestCredentials,this.requestHeaders)},n.prototype.setRequestCredentials=function(t){this.requestCredentials=t},n.prototype.setRequestHeaders=function(t){this.requestHeaders=t},n.prototype.unarchive=function(t,e){return this.unarchived=new p,this.unarchived.open(t,e)},n.prototype.isArchivedUrl=function(t){var e,i;return t instanceof ArrayBuffer||(e=o(t),i=e.suffix(),!(!i||"epub"!=i&&"zip"!=i))},n.prototype.coverUrl=function(){var t=this.loaded.cover.then(function(t){return this.unarchived?this.unarchived.createUrl(this.cover):this.cover}.bind(this));return t},n.prototype.range=function(t){var e=new f(t),i=this.spine.get(e.spinePos);return i.load().then(function(t){var n=e.toRange(i.document);return n})},t.exports=n,r.EventTarget.mixin(n.prototype),r.on("error",function(t){console.error(t)}),r.configure("instrument",!1),r.on("rejected",function(t){console.error(t.detail.message,t.detail.stack)})},function(t,e,i){(function(t,n,r){/*! + * @overview RSVP - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE + * @version 3.3.2 + */ +!function(t,i){i(e)}(this,function(e){"use strict";function o(t,e){for(var i=0,n=t.length;i1)throw new Error("Second argument not supported");if("object"!=typeof t)throw new TypeError("Argument must be an object");return l.prototype=t,new l},qt=[],Nt=void 0,Lt=1,Rt=2,Pt=new C,jt=new C;P.prototype._validateInput=function(t){return zt(t)},P.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},P.prototype._init=function(){this._result=new Array(this.length)},P.prototype._enumerate=function(){for(var t=this.length,e=this.promise,i=this._input,n=0;e._state===Nt&&n1)for(var i=1;i=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},e.setImmediate="function"==typeof t?t:function(t){var i=u++,n=!(arguments.length<2)&&a.call(arguments,1);return h[i]=!0,o(function(){h[i]&&(n?t.apply(null,n):t.call(null),e.clearImmediate(i))}),i},e.clearImmediate="function"==typeof n?n:function(t){delete h[t]}}).call(e,i(4).setImmediate,i(4).clearImmediate)},function(t,e){},function(t,e,i){/*! + * URI.js - Mutating URLs + * + * Version: 1.18.1 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ +!function(e,n){"use strict";t.exports=n(i(7),i(9),i(10))}(this,function(t,e,i,n){"use strict";function r(t,e){var i=arguments.length>=1,n=arguments.length>=2;if(!(this instanceof r))return i?n?new r(t,e):new r(t):new r;if(void 0===t){if(i)throw new TypeError("undefined is not a valid argument for URI");t="undefined"!=typeof location?location.href+"":""}return this.href(t),void 0!==e?this.absoluteTo(e):this}function o(t){return t.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function s(t){return void 0===t?"Undefined":String(Object.prototype.toString.call(t)).slice(8,-1)}function a(t){return"Array"===s(t)}function h(t,e){var i,n,r={};if("RegExp"===s(e))r=null;else if(a(e))for(i=0,n=e.length;i]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi,r.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?«»“”„‘’]+$/},r.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"},r.invalid_hostname_characters=/[^a-zA-Z0-9\.-]/,r.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"},r.getDomAttribute=function(t){if(t&&t.nodeName){var e=t.nodeName.toLowerCase();if("input"!==e||"image"===t.type)return r.domAttributes[e]}},r.encode=d,r.decode=decodeURIComponent,r.iso8859=function(){r.encode=escape,r.decode=unescape},r.unicode=function(){r.encode=d,r.decode=decodeURIComponent},r.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/gi,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/gi,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/gi,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}},r.encodeQuery=function(t,e){var i=r.encode(t+"");return void 0===e&&(e=r.escapeQuerySpace),e?i.replace(/%20/g,"+"):i},r.decodeQuery=function(t,e){t+="",void 0===e&&(e=r.escapeQuerySpace);try{return r.decode(e?t.replace(/\+/g,"%20"):t)}catch(i){return t}};var b,w={encode:"encode",decode:"decode"},x=function(t,e){return function(i){try{return r[e](i+"").replace(r.characters[t][e].expression,function(i){return r.characters[t][e].map[i]})}catch(n){return i}}};for(b in w)r[b+"PathSegment"]=x("pathname",w[b]),r[b+"UrnPathSegment"]=x("urnpath",w[b]);var _=function(t,e,i){return function(n){var o;o=i?function(t){return r[e](r[i](t))}:r[e];for(var s=(n+"").split(t),a=0,h=s.length;a-1&&(e.fragment=t.substring(i+1)||null,t=t.substring(0,i)),i=t.indexOf("?"),i>-1&&(e.query=t.substring(i+1)||null,t=t.substring(0,i)),"//"===t.substring(0,2)?(e.protocol=null,t=t.substring(2),t=r.parseAuthority(t,e)):(i=t.indexOf(":"),i>-1&&(e.protocol=t.substring(0,i)||null,e.protocol&&!e.protocol.match(r.protocol_expression)?e.protocol=void 0:"//"===t.substring(i+1,i+3)?(t=t.substring(i+3),t=r.parseAuthority(t,e)):(t=t.substring(i+1),e.urn=!0))),e.path=t,e},r.parseHost=function(t,e){t=t.replace(/\\/g,"/");var i,n,r=t.indexOf("/");if(r===-1&&(r=t.length),"["===t.charAt(0))i=t.indexOf("]"),e.hostname=t.substring(1,i)||null,e.port=t.substring(i+2,r)||null,"/"===e.port&&(e.port=null);else{var o=t.indexOf(":"),s=t.indexOf("/"),a=t.indexOf(":",o+1);a!==-1&&(s===-1||a-1?n:t.length-1);return o>-1&&(n===-1||o1&&(n=i[0]+"@",t=i[1]),t=t.replace(N,".");var r=t.split("."),o=a(r,e).join(".");return n+o}function u(t){for(var e,i,n=[],r=0,o=t.length;r=55296&&e<=56319&&r65535&&(t-=65536,e+=j(t>>>10&1023|55296),t=56320|1023&t),e+=j(t)}).join("")}function l(t){return t-48<10?t-22:t-65<26?t-65:t-97<26?t-97:x}function p(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function d(t,e,i){var n=0;for(t=i?P(t/S):t>>1,t+=P(t/e);t>R*T>>1;n+=x)t=P(t/R);return P(n+(R+1)*t/(t+k))}function f(t){var e,i,n,r,o,a,h,u,p,f,g=[],m=t.length,v=0,y=z,b=E;for(i=t.lastIndexOf(C),i<0&&(i=0),n=0;n=128&&s("not-basic"),g.push(t.charCodeAt(n));for(r=i>0?i+1:0;r=m&&s("invalid-input"),u=l(t.charCodeAt(r++)),(u>=x||u>P((w-v)/a))&&s("overflow"),v+=u*a,p=h<=b?_:h>=b+T?T:h-b,!(uP(w/f)&&s("overflow"),a*=f;e=g.length+1,b=d(v-o,e,0==o),P(v/e)>w-y&&s("overflow"),y+=P(v/e),v%=e,g.splice(v++,0,y)}return c(g)}function g(t){var e,i,n,r,o,a,h,c,l,f,g,m,v,y,b,k=[];for(t=u(t),m=t.length,e=z,i=0,o=E,a=0;a=e&&gP((w-i)/v)&&s("overflow"),i+=(h-e)*v,e=h,a=0;aw&&s("overflow"),g==e){for(c=i,l=x;f=l<=o?_:l>=o+T?T:l-o,!(c= 0x80 (not a basic code point)","invalid-input":"Invalid input"},R=x-_,P=Math.floor,j=String.fromCharCode;b={version:"1.3.2",ucs2:{decode:u,encode:c},decode:f,encode:g,toASCII:v,toUnicode:m},n=function(){return b}.call(e,i,e,t),!(void 0!==n&&(t.exports=n))}(this)}).call(e,i(8)(t),function(){return this}())},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}},function(t,e,i){/*! + * URI.js - Mutating URLs + * IPv6 Support + * + * Version: 1.18.1 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + */ +!function(e,i){"use strict";t.exports=i()}(this,function(t){"use strict";function e(t){var e=t.toLowerCase(),i=e.split(":"),n=i.length,r=8;""===i[0]&&""===i[1]&&""===i[2]?(i.shift(),i.shift()):""===i[0]&&""===i[1]?i.shift():""===i[n-1]&&""===i[n-2]&&i.pop(),n=i.length,i[n-1].indexOf(".")!==-1&&(r=7);var o;for(o=0;o1);h++)s.splice(0,1);i[a]=s.join("")}var u=-1,c=0,l=0,p=-1,d=!1;for(a=0;ac&&(u=p,c=l)):"0"===i[a]&&(d=!0,p=a,l=1);l>c&&(u=p,c=l),c>1&&i.splice(u,c,""),n=i.length;var f="";for(""===i[0]&&(f=":"),a=0;a=t.length-1)return!1;var n=t.lastIndexOf(".",e-1);if(n<=0||n>=e-1)return!1;var r=i.list[t.slice(e+1)];return!!r&&r.indexOf(" "+t.slice(n+1,e)+" ")>=0},is:function(t){var e=t.lastIndexOf(".");if(e<=0||e>=t.length-1)return!1;var n=t.lastIndexOf(".",e-1);if(n>=0)return!1;var r=i.list[t.slice(e+1)];return!!r&&r.indexOf(" "+t.slice(0,e)+" ")>=0},get:function(t){var e=t.lastIndexOf(".");if(e<=0||e>=t.length-1)return null;var n=t.lastIndexOf(".",e-1);if(n<=0||n>=e-1)return null;var r=i.list[t.slice(e+1)];return r?r.indexOf(" "+t.slice(n+1,e)+" ")<0?null:t.slice(n+1):null},noConflict:function(){return t.SecondLevelDomains===this&&(t.SecondLevelDomains=e),this}};return i})},function(t,e,i){function n(t){return!(!t||1!=t.nodeType)}function r(){var t=(new Date).getTime(),e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var i=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"==e?i:7&i|8).toString(16)});return e}function o(t){for(var e=-1,i=Object.keys(t),n=i.length,r=Array(n);++ee?1:t0?h:h+1:0===o?h:o===-1?d(t,e,i,h,a):d(t,e,i,s,h))}function f(t,e,i,n,r){var o,s=n||0,a=r||e.length,h=parseInt(s+(a-s)/2);return i||(i=function(t,e){return t>e?1:t-1}function x(t,e){var i=new Blob([t],{type:e});return i}function _(t,e){var i,n=window.URL||window.webkitURL||window.mozURL,r=this.createBlob(t,e);return i=n.createObjectURL(r)}function T(t,e){var i,n;if("string"==typeof t)return i=btoa(t),n="data:"+e+";base64,"+i}function k(t){return Object.prototype.toString.call(t).slice(8,-1)}function S(t,e){var n;return"undefined"==typeof DOMParser&&(DOMParser=i(13).DOMParser),n=(new DOMParser).parseFromString(t,e)}function E(t,e){var i;return"undefined"!=typeof t.querySelector?t.querySelector(e):(i=t.getElementsByTagName(e),i.length?i[0]:void 0)}function z(t,e){return"undefined"!=typeof t.querySelector?t.querySelectorAll(e):t.getElementsByTagName(e)}function C(t,e,i){var n,r;if("undefined"!=typeof t.querySelector){e+="[";for(var o in i)e+=o+"='"+i[o]+"'";return e+="]",t.querySelector(e)}if(n=t.getElementsByTagName(e),r=Array.prototype.slice.call(n,0).filter(function(t){for(var e in i)if(t.getAttribute(e)===i[e])return!0;return!1}))return r[0]}function A(t,e){var i=new FileReader;i.readAsDataURL(t),i.onloadend=function(){e(i.result)}}var q=(i(2),i(12),"undefined"!=typeof window&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame));t.exports={isElement:n,uuid:r,values:o,resolveUrl:s,indexOfSorted:f,documentHeight:a,isNumber:h,prefixed:u,defaults:c,extend:l,insert:p,locationOf:d,indexOfSorted:f,requestAnimationFrame:q,bounds:g,borders:m,windowBounds:v,cleanStringForXpath:y,indexOfTextNode:b,isXml:w,createBlob:x,createBlobUrl:_,type:k,parse:S,qs:E,qsa:z,qsp:C,blob2base64:A,createBase64Url:T}},function(t,e){"use strict";function i(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===t[e-2]?2:"="===t[e-1]?1:0}function n(t){return 3*t.length/4-i(t)}function r(t){var e,n,r,o,s,a,h=t.length;s=i(t),a=new c(3*h/4-s),r=s>0?h-4:h;var l=0;for(e=0,n=0;e>16&255,a[l++]=o>>8&255,a[l++]=255&o;return 2===s?(o=u[t.charCodeAt(e)]<<2|u[t.charCodeAt(e+1)]>>4,a[l++]=255&o):1===s&&(o=u[t.charCodeAt(e)]<<10|u[t.charCodeAt(e+1)]<<4|u[t.charCodeAt(e+2)]>>2,a[l++]=o>>8&255,a[l++]=255&o),a}function o(t){return h[t>>18&63]+h[t>>12&63]+h[t>>6&63]+h[63&t]}function s(t,e,i){for(var n,r=[],s=e;sc?c:u+a));return 1===n?(e=t[i-1],r+=h[e>>2],r+=h[e<<4&63],r+="=="):2===n&&(e=(t[i-2]<<8)+t[i-1],r+=h[e>>10],r+=h[e>>4&63],r+=h[e<<2&63],r+="="),o.push(r),o.join("")}e.byteLength=n,e.toByteArray=r,e.fromByteArray=a;for(var h=[],u=[],c="undefined"!=typeof Uint8Array?Uint8Array:Array,l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p=0,d=l.length;p-1)return delete this.spineByHref[t.href],delete this.spineById[t.idref],this.spineItems.splice(e,1)},n.prototype.each=function(){return this.spineItems.forEach.apply(this.spineItems,arguments)},t.exports=n},function(t,e,i){function n(t,e,i){var o;if(this.str="",this.base={},this.spinePos=0,this.range=!1,this.path={},this.start=null,this.end=null,!(this instanceof n))return new n(t,e,i);if("string"==typeof e?this.base=this.parseComponent(e):"object"==typeof e&&e.steps&&(this.base=e),o=this.checkType(t),"string"===o)return this.str=t,r.extend(this,this.parse(t));if("range"===o)return r.extend(this,this.fromRange(t,this.base,i));if("node"===o)return r.extend(this,this.fromNode(t,this.base,i));if("EpubCFI"===o&&t.path)return t;if(t)throw new TypeError("not a valid argument for EpubCFI");return this}var r=(i(6),i(11));n.prototype.checkType=function(t){return this.isCfiString(t)?"string":"object"==typeof t&&"Range"===r.type(t)?"range":"object"==typeof t&&"undefined"!=typeof t.nodeType?"node":"object"==typeof t&&t instanceof n&&"EpubCFI"},n.prototype.parse=function(t){var e,i,n,r={spinePos:-1,range:!1,base:{},path:{},start:null,end:null};return"string"!=typeof t?{spinePos:-1}:(0===t.indexOf("epubcfi(")&&")"===t[t.length-1]&&(t=t.slice(8,t.length-1)),(e=this.getChapterComponent(t))?(r.base=this.parseComponent(e),i=this.getPathComponent(t),r.path=this.parseComponent(i),n=this.getRange(t),n&&(r.range=!0,r.start=this.parseComponent(n[0]),r.end=this.parseComponent(n[1])),r.spinePos=r.base.steps[1].index,r):{spinePos:-1})},n.prototype.parseComponent=function(t){var e,i={steps:[],terminal:{offset:null,assertion:null}},n=t.split(":"),r=n[0].split("/");return n.length>1&&(e=n[1],i.terminal=this.parseTerminal(e)),""===r[0]&&r.shift(),i.steps=r.map(function(t){return this.parseStep(t)}.bind(this)),i},n.prototype.parseStep=function(t){var e,i,n,r,o;if(r=t.match(/\[(.*)\]/),r&&r[1]&&(o=r[1]),i=parseInt(t),!isNaN(i))return i%2===0?(e="element",n=i/2-1):(e="text",n=(i-1)/2),{type:e,index:n,id:o||null}},n.prototype.parseTerminal=function(t){var e,i,n=t.match(/\[(.*)\]/);return n&&n[1]?(e=parseInt(t.split("[")[0])||null,i=n[1]):e=parseInt(t)||null,{offset:e,assertion:i}},n.prototype.getChapterComponent=function(t){var e=t.split("!");return e[0]},n.prototype.getPathComponent=function(t){var e=t.split("!");if(e[1])return ranges=e[1].split(","),ranges[0]},n.prototype.getRange=function(t){var e=t.split(",");return 3===e.length&&[e[1],e[2]]},n.prototype.getCharecterOffsetComponent=function(t){var e=t.split(":");return e[1]||""},n.prototype.joinSteps=function(t){return t?t.map(function(t){var e="";return"element"===t.type&&(e+=2*(t.index+1)),"text"===t.type&&(e+=1+2*t.index),t.id&&(e+="["+t.id+"]"),e}).join("/"):""},n.prototype.segmentString=function(t){var e="/";return e+=this.joinSteps(t.steps),t.terminal&&null!=t.terminal.offset&&(e+=":"+t.terminal.offset),t.terminal&&null!=t.terminal.assertion&&(e+="["+t.terminal.assertion+"]"),e},n.prototype.toString=function(){var t="epubcfi(";return t+=this.segmentString(this.base),t+="!",t+=this.segmentString(this.path),this.start&&(t+=",",t+=this.segmentString(this.start)),this.end&&(t+=",",t+=this.segmentString(this.end)),t+=")"},n.prototype.compare=function(t,e){if("string"==typeof t&&(t=new n(t)),"string"==typeof e&&(e=new n(e)),t.spinePos>e.spinePos)return 1;if(t.spinePose.path.steps[i].index)return 1;if(t.path.steps[i].indexe.path.terminal.offset?1:t.path.terminal.offset=0&&(r.terminal.offset=e,"text"!=r.steps[r.steps.length-1].type&&r.steps.push({type:"text",index:0})),r},n.prototype.equalStep=function(t,e){return!(!t||!e)&&(t.index===e.index&&t.id===e.id&&t.type===e.type)},n.prototype.fromRange=function(t,e,i){var n={range:!1,base:{},path:{},start:null,end:null},r=t.startContainer,o=t.endContainer,s=t.startOffset,a=t.endOffset,h=!1;if(i&&(h=null!=r.ownerDocument.querySelector("."+i)),"string"==typeof e?(n.base=this.parseComponent(e),n.spinePos=n.base.steps[1].index):"object"==typeof e&&(n.base=e),t.collapsed)h&&(s=this.patchOffset(r,s,i)),n.path=this.pathTo(r,s,i);else{n.range=!0,h&&(s=this.patchOffset(r,s,i)),n.start=this.pathTo(r,s,i),h&&(a=this.patchOffset(o,a,i)),n.end=this.pathTo(o,a,i),n.path={steps:[],terminal:null};var u,c=n.start.steps.length;for(u=0;u0&&r===Node.TEXT_NODE&&o===Node.TEXT_NODE?s[n]=a:e===r&&(a+=1,s[n]=a),o=r;return s},n.prototype.position=function(t){var e,i;return t.nodeType===Node.ELEMENT_NODE?(e=t.parentNode.children,i=Array.prototype.indexOf.call(e,t)):(e=this.textNodes(t.parentNode),i=e.indexOf(t)),i},n.prototype.filteredPosition=function(t,e){var i,n,r;return t.nodeType===Node.ELEMENT_NODE?(i=t.parentNode.children,r=this.normalizedMap(i,Node.ELEMENT_NODE,e)):(i=t.parentNode.childNodes,t.parentNode.classList.contains(e)&&(t=t.parentNode,i=t.parentNode.childNodes),r=this.normalizedMap(i,Node.TEXT_NODE,e)),n=Array.prototype.indexOf.call(i,t),r[n]},n.prototype.stepsToXpath=function(t){var e=[".","*"];return t.forEach(function(t){var i=t.index+1;t.id?e.push("*[position()="+i+" and @id='"+t.id+"']"):"text"===t.type?e.push("text()["+i+"]"):e.push("*["+i+"]")}),e.join("/")},n.prototype.stepsToQuerySelector=function(t){var e=["html"];return t.forEach(function(t){var i=t.index+1;t.id?e.push("#"+t.id):"text"===t.type||e.push("*:nth-child("+i+")")}),e.join(">")},n.prototype.textNodes=function(t,e){return Array.prototype.slice.call(t.childNodes).filter(function(t){return t.nodeType===Node.TEXT_NODE||!(!e||!t.classList.contains(e))})},n.prototype.walkToNode=function(t,e,i){var n,r,o=e||document,s=o.documentElement,a=t.length;for(r=0;ro)){a=r.nodeType===Node.ELEMENT_NODE?r.childNodes[0]:r;break}e-=o}}return{container:a,offset:e}},n.prototype.toRange=function(t,e){var i,n,r,o,s,a,h,u=t||document,c=u.createRange(),l=this,p=!!e&&null!=u.querySelector("."+e);if(l.range?(i=l.start,s=l.path.steps.concat(i.steps),r=this.findNode(s,u,p?e:null),n=l.end,a=l.path.steps.concat(n.steps),o=this.findNode(a,u,p?e:null)):(i=l.path,s=l.path.steps,r=this.findNode(l.path.steps,u,p?e:null)),!r)return null;try{null!=i.terminal.offset?c.setStart(r,i.terminal.offset):c.setStart(r,0)}catch(d){h=this.fixMiss(s,i.terminal.offset,u,p?e:null),c.setStart(h.container,h.offset)}if(o)try{null!=n.terminal.offset?c.setEnd(o,n.terminal.offset):c.setEnd(o,0)}catch(d){h=this.fixMiss(a,l.end.terminal.offset,u,p?e:null),c.setEnd(h.container,h.offset)}return c},n.prototype.isCfiString=function(t){return"string"==typeof t&&0===t.indexOf("epubcfi(")&&")"===t[t.length-1]},n.prototype.generateChapterComponent=function(t,e,i){var n=parseInt(e),r=t+1,o="/"+r+"/";return o+=2*(n+1),i&&(o+="["+i+"]"),o},t.exports=n},function(t,e,i){function n(t){this.context=t||this,this.hooks=[]}var r=i(2);n.prototype.register=function(){for(var t=0;ts&&(r+=s,a=s);a=s?r=s-(a-this["break"]):(i.setEnd(e,a),cfi=t.cfiFromRange(i),this._locations.push(cfi),r=0,a+=1,i=n.createRange(),i.setStart(e,a))}.bind(this)),i&&(i.setEnd(prev,prev.length),cfi=t.cfiFromRange(i),this._locations.push(cfi),r=0)}.bind(this))},n.prototype.sprint=function(t,e){for(var i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,null,!1);node=i.nextNode();)e(node); +},n.prototype.locationFromCfi=function(t){return 0===this._locations.length?-1:r.locationOf(t,this._locations,this.epubcfi.compare)},n.prototype.precentageFromCfi=function(t){var e=this.locationFromCfi(t);return this.precentageFromLocation(e)},n.prototype.percentageFromLocation=function(t){return t&&this.total?t/this.total:0},n.prototype.cfiFromLocation=function(t){var e=-1;return"number"!=typeof t&&(t=parseInt(pg)),t>=0&&t1?t/100:t,i=Math.ceil(this.total*e);return this.cfiFromLocation(i)},n.prototype.load=function(t){return this._locations=JSON.parse(t),this.total=this._locations.length-1,this._locations},n.prototype.save=function(t){return JSON.stringify(this._locations)},n.prototype.getCurrent=function(t){return this._current},n.prototype.setCurrent=function(t){var e;if("string"==typeof t)this._currentCfi=t;else{if("number"!=typeof t)return;this._current=t}0!==this._locations.length&&("string"==typeof t?(e=this.locationFromCfi(t),this._current=e):e=t,this.trigger("changed",{percentage:this.precentageFromLocation(e)}))},Object.defineProperty(n.prototype,"currentLocation",{get:function(){return this._current},set:function(t){this.setCurrent(t)}}),a.EventTarget.mixin(n.prototype),t.exports=n},function(t,e,i){function n(t){this._q=[],this.context=t,this.tick=o.requestAnimationFrame,this.running=!1,this.paused=!1}var r=i(2),o=i(11);n.prototype.enqueue=function(){var t,e,i,n=[].shift.call(arguments),o=arguments;return n?("function"==typeof n?(t=new r.defer,e=t.promise,i={task:n,args:o,deferred:t,promise:e}):i={promise:n},this._q.push(i),0!=this.paused||this.running||this.run(),i.promise):console.error("No Task Provided")},n.prototype.dequeue=function(){var t,e,i;return this._q.length?(t=this._q.shift(),(e=t.task)?(i=e.apply(this.context,t.args),i&&"function"==typeof i.then?i.then(function(){t.deferred.resolve.apply(this.context,arguments)}.bind(this)):(t.deferred.resolve.apply(this.context,i),t.promise)):t.promise?t.promise:void 0):(t=new r.defer,t.deferred.resolve(),t.promise)},n.prototype.dump=function(){for(;this._q.length;)this.dequeue()},n.prototype.run=function(){return this.running||(this.running=!0,this.defered=new r.defer),this.tick.call(window,function(){this._q.length?this.dequeue().then(function(){this.run()}.bind(this)):(this.defered.resolve(),this.running=void 0)}.bind(this)),1==this.paused&&(this.paused=!1),this.defered.promise},n.prototype.flush=function(){return this.running?this.running:this._q.length?(this.running=this.dequeue().then(function(){return this.running=void 0,this.flush()}.bind(this)),this.running):void 0},n.prototype.clear=function(){this._q=[],this.running=!1},n.prototype.length=function(){return this._q.length},n.prototype.pause=function(){this.paused=!0},t.exports=n},function(t,e,i){function n(){}var r=i(6),o=i(11),s=i(15);n.prototype.container=function(t){var e,i,n,s;return t?(e=o.qs(t,"rootfile"))?(i=e.getAttribute("full-path"),n=r(i).directory(),s=t.xmlEncoding,{packagePath:i,basePath:n,encoding:s}):void console.error("No RootFile Found"):void console.error("Container File Not Found")},n.prototype.identifier=function(t){var e;return t?(e=o.qs(t,"metadata"),e?this.getElementText(e,"identifier"):void console.error("No Metadata Found")):void console.error("Package File Not Found")},n.prototype.packageContents=function(t){var e,i,n,r,s,a,h,u,c,l,p=this;return t?(e=o.qs(t,"metadata"))?(i=o.qs(t,"manifest"))?(n=o.qs(t,"spine"))?(r=p.manifest(i),s=p.findNavPath(i),a=p.findNcxPath(i,n),h=p.findCoverPath(t),u=Array.prototype.indexOf.call(n.parentNode.childNodes,n),c=p.spine(n,r),l=p.metadata(e),l.direction=n.getAttribute("page-progression-direction"),{metadata:l,spine:c,manifest:r,navPath:s,ncxPath:a,coverPath:h,spineNodeIndex:u}):void console.error("No Spine Found"):void console.error("No Manifest Found"):void console.error("No Metadata Found"):void console.error("Package File Not Found")},n.prototype.findNavPath=function(t){var e=o.qsp(t,"item",{properties:"nav"});return!!e&&e.getAttribute("href")},n.prototype.findNcxPath=function(t,e){var i,n=o.qsp(t,"item",{"media-type":"application/x-dtbncx+xml"});return n||(i=e.getAttribute("toc"),i&&(n=t.getElementById(i))),!!n&&n.getAttribute("href")},n.prototype.metadata=function(t){var e={},i=this;return e.title=i.getElementText(t,"title"),e.creator=i.getElementText(t,"creator"),e.description=i.getElementText(t,"description"),e.pubdate=i.getElementText(t,"date"),e.publisher=i.getElementText(t,"publisher"),e.identifier=i.getElementText(t,"identifier"),e.language=i.getElementText(t,"language"),e.rights=i.getElementText(t,"rights"),e.modified_date=i.getPropertyText(t,"dcterms:modified"),e.layout=i.getPropertyText(t,"rendition:layout"),e.orientation=i.getPropertyText(t,"rendition:orientation"),e.flow=i.getPropertyText(t,"rendition:flow"),e.viewport=i.getPropertyText(t,"rendition:viewport"),e},n.prototype.findCoverPath=function(t){var e=o.qs(t,"package"),i=e.getAttribute("version");if("2.0"===i){var n=o.qsp(t,"meta",{name:"cover"});if(n){var r=n.getAttribute("content"),s=t.getElementById(r);return!!s&&s.getAttribute("href")}return!1}var a=o.qsp(t,"item",{properties:"cover-image"});return!!a&&a.getAttribute("href")},n.prototype.getElementText=function(t,e){var i,n=t.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/",e);return n&&0!==n.length?(i=n[0],i.childNodes.length?i.childNodes[0].nodeValue:""):""},n.prototype.getPropertyText=function(t,e){var i=o.qsp(t,"meta",{property:e});return i&&i.childNodes.length?i.childNodes[0].nodeValue:""},n.prototype.querySelectorText=function(t,e){var i=t.querySelector(e);return i&&i.childNodes.length?i.childNodes[0].nodeValue:""},n.prototype.manifest=function(t){var e={},i=o.qsa(t,"item"),n=Array.prototype.slice.call(i);return n.forEach(function(t){var i=t.getAttribute("id"),n=t.getAttribute("href")||"",r=t.getAttribute("media-type")||"",o=t.getAttribute("properties")||"";e[i]={href:n,type:r,properties:o.length?o.split(" "):[]}}),e},n.prototype.spine=function(t,e){var i=[],n=t.getElementsByTagName("itemref"),r=Array.prototype.slice.call(n);new s;return r.forEach(function(t,e){var n=t.getAttribute("idref"),r=t.getAttribute("properties")||"",o=r.length?r.split(" "):[],s={idref:n,linear:t.getAttribute("linear")||"",properties:o,index:e};i.push(s)}),i},n.prototype.querySelectorByType=function(t,e,i){var n;if("undefined"!=typeof t.querySelector&&(n=t.querySelector(e+'[*|type="'+i+'"]')),n&&0!==n.length)return n;n=o.qsa(t,e);for(var r=0;r1&&n[1],{cfi:s,href:h,packageUrl:r,page:c}):{href:h,page:c}},t.exports=n},function(t,e,i){function n(t,e){var n=this,a=new r,h=e||i(18);this["package"]=t,this.toc=[],this.tocByHref={},this.tocById={},t.navPath&&(this.navUrl=s(t.navPath).absoluteTo(t.baseUrl).toString(),this.nav={},this.nav.load=function(t){var e=new o.defer,i=e.promise;return h(n.navUrl,"xml").then(function(t){n.toc=a.nav(t),n.loaded(n.toc),e.resolve(n.toc)}),i}),t.ncxPath&&(this.ncxUrl=s(t.ncxPath).absoluteTo(t.baseUrl).toString(),this.ncx={},this.ncx.load=function(t){var e=new o.defer,i=e.promise;return h(n.ncxUrl,"xml").then(function(t){n.toc=a.toc(t),n.loaded(n.toc),e.resolve(n.toc)}),i})}var r=(i(11),i(22)),o=i(2),s=i(6);n.prototype.load=function(t){var e,n;t||i(18);return this.nav?e=this.nav.load():this.ncx?e=this.ncx.load():(n=new o.defer,n.resolve([]),e=n.promise),e},n.prototype.loaded=function(t){for(var e,i=0;i-1&&(i=t.substring(t.indexOf("#")+1)),n&&(i=t),this.manager.display(e,i).then(function(){this.trigger("displayed",e)}.bind(this))):(o.reject(new Error("No Section Found")),s)},n.prototype.afterDisplayed=function(t){this.hooks.content.trigger(t,this),this.trigger("rendered",t.section),this.reportLocation()},n.prototype.onResized=function(t){this.location&&this.display(this.location.start),this.trigger("resized",{width:t.width,height:t.height})},n.prototype.moveTo=function(t){this.manager.moveTo(t)},n.prototype.next=function(){return this.q.enqueue(this.manager.next.bind(this.manager)).then(this.reportLocation.bind(this))},n.prototype.prev=function(){return this.q.enqueue(this.manager.prev.bind(this.manager)).then(this.reportLocation.bind(this))},n.prototype.determineLayoutProperties=function(t){var e,i=this.settings.layout||t.layout||"reflowable",n=this.settings.spread||t.spread||"auto",r=this.settings.orientation||t.orientation||"auto",o=this.settings.flow||t.flow||"auto",s=t.viewport||"",a=this.settings.minSpreadWidth||t.minSpreadWidth||800;return this.settings.width>=0&&this.settings.height>=0&&(s="width="+this.settings.width+", height="+this.settings.height),e={layout:i,spread:n,orientation:r,flow:o,viewport:s,minSpreadWidth:a}},n.prototype.flow=function(t){var e;"scrolled-doc"!==t&&"scrolled-continuous"!==t||(e="scrolled"),"auto"!==t&&"paginated"!==t||(e="paginated"),this._layout&&this._layout.flow(e),this.manager&&this.manager.updateFlow(e)},n.prototype.layout=function(t){return t&&(this._layout=new l(t),this._layout.spread(t.spread,this.settings.minSpreadWidth),this.mapping=new p(this._layout)),this.manager&&this._layout&&this.manager.applyLayout(this._layout),this._layout},n.prototype.spread=function(t,e){this._layout.spread(t,e),this.manager.isRendered()&&this.manager.updateLayout()},n.prototype.reportLocation=function(){return this.q.enqueue(function(){var t=this.manager.currentLocation();t&&t.then&&"function"==typeof t.then?t.then(function(t){this.location=t,this.trigger("locationChanged",this.location)}.bind(this)):t&&(this.location=t,this.trigger("locationChanged",this.location))}.bind(this))},n.prototype.destroy=function(){this.q.clear(),this.manager.destroy()},n.prototype.passViewEvents=function(t){t.contents.listenedEvents.forEach(function(e){t.on(e,this.triggerViewEvent.bind(this))}.bind(this)),t.on("selected",this.triggerSelectedEvent.bind(this))},n.prototype.triggerViewEvent=function(t){this.trigger(t.type,t)},n.prototype.triggerSelectedEvent=function(t){this.trigger("selected",t)},n.prototype.replacements=function(){var t,e=this.book["package"].manifest,i=Object.keys(e).map(function(t){return e[t]}),n=i.filter(function(t){if("application/xhtml+xml"!=t.type&&"text/html"!=t.type)return!0}),s=n.filter(function(t){if("text/css"===t.type)return!0}),a=s.map(function(t){return t.href}),h=n.map(function(t){return t.href}.bind(this)),u=h.map(function(t){var e=o(t).absoluteTo(this.book.baseUrl).toString();return this.book.unarchived.createUrl(e,{base64:this.settings.useBase64})}.bind(this));return r.all(u).then(function(e){var i=[];return t=e,a.forEach(function(e){i.push(this.replaceCss(e,h,t))}.bind(this)),r.all(i)}.bind(this)).then(function(){this.book.spine.hooks.serialize.register(function(e,i){this.replaceAssets(i,h,t)}.bind(this))}.bind(this))["catch"](function(t){console.error(t)})},n.prototype.replaceCss=function(t,e,i){var n,h,u=o(t),c=u.absoluteTo(this.book.baseUrl).toString(),l=this.book.unarchived.getText(c),p=e.map(function(t){var e=o(t).absoluteTo(this.book.baseUrl),i=e.relativeTo(c).toString();return i}.bind(this));return l.then(function(o){return o=a.substitute(o,p,i),n=this.settings.useBase64?s.createBase64Url(o,"text/css"):s.createBlobUrl(o,"text/css"),h=e.indexOf(t),h>-1&&(i[h]=n),new r.Promise(function(t,n){t(e,i)})}.bind(this))},n.prototype.replaceAssets=function(t,e,i){var n=o(t.url),r=e.map(function(t){var e=o(t).absoluteTo(this.book.baseUrl),i=e.relativeTo(n).toString();return i}.bind(this));t.output=a.substitute(t.output,r,i)},n.prototype.range=function(t,e){var i=new u(t),n=this.visible().filter(function(t){if(i.spinePos===t.index)return!0});if(n.length)return n[0].range(i,e)},n.prototype.adjustImages=function(t){return t.addStylesheetRules([["img",["max-width",t.layout.spreadWidth+"px"],["max-height",t.layout.height+"px"]]]),new r.Promise(function(t,e){setTimeout(function(){t()},1)})},r.EventTarget.mixin(n.prototype),t.exports=n},function(t,e,i){function n(t){this.name=t.layout||"reflowable",this._spread="none"!==t.spread,this._minSpreadWidth=t.spread||800,this._evenSpreads=t.evenSpreads||!1,"scrolled-continuous"===t.flow||"scrolled-doc"===t.flow?this._flow="scrolled":this._flow="paginated",this.width=0,this.height=0,this.spreadWidth=0,this.delta=0,this.columnWidth=0,this.gap=0,this.divisor=1}i(11),i(2);n.prototype.flow=function(t){this._flow="paginated"===t?"paginated":"scrolled"},n.prototype.spread=function(t,e){this._spread="none"!==t,e>=0&&(this._minSpreadWidth=e)},n.prototype.calculate=function(t,e,i){var n,r,o,s=1,a=i||0,h=(Math.floor(t),t),u=Math.floor(h/8);s=this._spread&&h>=this._minSpreadWidth?2:1,"reflowable"!==this.name||"paginated"!==this._flow||i>=0||(a=u%2===0?u:u-1),"pre-paginated"===this.name&&(a=0),n=s>1?Math.floor((h-a)/s):h,"pre-paginated"===this.name&&s>1&&(h=n),r=n*s,o=(n+a)*s,this.width=h,this.height=e,this.spreadWidth=r,this.delta=o,this.columnWidth=n,this.gap=a,this.divisor=s},n.prototype.format=function(t){var e;return e="pre-paginated"===this.name?t.fit(this.columnWidth,this.height):"paginated"===this._flow?t.columns(this.width,this.height,this.columnWidth,this.gap):t.size(this.width,null)},n.prototype.count=function(t){var e=Math.ceil(t/this.spreadWidth);return{spreads:e,pages:e*this.divisor}},t.exports=n},function(t,e,i){function n(t){this.layout=t}var r=i(15);n.prototype.section=function(t){var e=this.findRanges(t),i=this.rangeListToCfiList(t.section.cfiBase,e);return i},n.prototype.page=function(t,e,i,n){var r=!(!t||!t.document)&&t.document.body;if(r)return this.rangePairToCfiPair(e,{start:this.findStart(r,i,n),end:this.findEnd(r,i,n)})},n.prototype.walk=function(t,e){for(var i,n,r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode:function(t){return t.data.trim().length>0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}},!1);(i=r.nextNode())&&!(n=e(i)););return n},n.prototype.findRanges=function(t){for(var e,i,n=[],r=t.contents.scrollWidth(),o=this.layout.count(r),s=this.layout.column,a=this.layout.gap,h=0;h=e&&n<=i?t:r>e?t:(s=t,void o.push(t))}))return this.findTextStartRange(r,e,i);return this.findTextStartRange(s,e,i)},n.prototype.findEnd=function(t,e,i){for(var n,r,o=[t],s=t;o.length;)if(n=o.shift(),r=this.walk(n,function(t){var e,n,r,a;return t.nodeType==Node.TEXT_NODE?(a=document.createRange(),a.selectNodeContents(t),r=a.getBoundingClientRect()):r=t.getBoundingClientRect(),e=r.left,n=r.right,e>i&&s?s:n>i?t:(s=t,void o.push(t))}))return this.findTextEndRange(r,e,i);return this.findTextEndRange(s,e,i)},n.prototype.findTextStartRange=function(t,e,i){for(var n,r,o,s=this.splitTextNodeIntoRanges(t),a=0;a=e)return r;n=r}return s[0]},n.prototype.findTextEndRange=function(t,e,i){for(var n,r,o,s=this.splitTextNodeIntoRanges(t),a=0;ai&&n)return n;if(o.right>i)return r;n=r}return s[s.length-1]},n.prototype.splitTextNodeIntoRanges=function(t,e){var i,n=[],r=t.textContent||"",o=r.trim(),s=t.ownerDocument,a=e||" ";if(pos=o.indexOf(a),pos===-1||t.nodeType!=Node.TEXT_NODE)return i=s.createRange(),i.selectNodeContents(t),[i];for(i=s.createRange(),i.setStart(t,0),i.setEnd(t,pos),n.push(i),i=!1;pos!=-1;)pos=o.indexOf(a,pos+1),pos>0&&(i&&(i.setEnd(t,pos),n.push(i)),i=s.createRange(),i.setStart(t,pos+1));return i&&(i.setEnd(t,o.length),n.push(i)),n},n.prototype.rangePairToCfiPair=function(t,e){var i=e.start,n=e.end;return i.collapse(!0),n.collapse(!0),startCfi=new r(i,t).toString(),endCfi=new r(n,t).toString(),{start:startCfi,end:endCfi}},n.prototype.rangeListToCfiList=function(t,e){for(var i,n=[],r=0;r-1&&(id=t.substring(t.indexOf("#")+1),el=this.document.getElementById(id),el&&(i=el.getBoundingClientRect(),n.left=i.left,n.top=i.top)),n},n.prototype.addStylesheet=function(t){return new r.Promise(function(e,i){var n,r=!1;return this.document?(n=this.document.createElement("link"),n.type="text/css",n.rel="stylesheet",n.href=t,n.onload=n.onreadystatechange=function(){r||this.readyState&&"complete"!=this.readyState||(r=!0,setTimeout(function(){e(!0)},1))},void this.document.head.appendChild(n)):void e(!1)}.bind(this))},n.prototype.addStylesheetRules=function(t){var e,i;if(this.document){e=this.document.createElement("style"),this.document.head.appendChild(e),i=e.sheet;for(var n=0,r=t.length;n0&&(e=t.getRangeAt(0),e.collapsed||(i=new s(e,this.cfiBase).toString(),this.trigger("selected",i),this.trigger("selectedRange",e)))},n.prototype.range=function(t,e){var i=new s(t);return i.toRange(this.document,e)},n.prototype.map=function(t){var e=new a(t);return e.section()},n.prototype.size=function(t,e){t>=0&&this.width(t),e>=0&&this.height(e),this.css("margin","0"),this.css("boxSizing","border-box")},n.prototype.columns=function(t,e,i,n){var r=o.prefixed("columnAxis"),s=o.prefixed("columnGap"),a=o.prefixed("columnWidth"),h=o.prefixed("columnFill");this.width(t),this.height(e),this.viewport({width:t,height:e,scale:1}),this.css("overflowY","hidden"),this.css("margin","0"),this.css("boxSizing","border-box"),this.css("maxWidth","inherit"),this.css(r,"horizontal"),this.css(h,"auto"),this.css(s,n+"px"),this.css(a,i+"px")},n.prototype.scale=function(t,e,i){var t="scale("+t+")",n="";this.css("transformOrigin","top left"),(e>=0||i>=0)&&(n=" translate("+(e||0)+"px, "+(i||0)+"px )"),this.css("transform",t+n)},n.prototype.fit=function(t,e){var i=this.viewport(),n=t/i.width,r=e/i.height,o=n1&&"reflowable"===this.settings.layout.name&&e%2>0&&(r+=this.settings.layout.gap+this.settings.layout.columnWidth),this._textWidth=i,this._contentWidth=r):r=this._contentWidth):"vertical"===this.settings.axis&&(n=this.contents.textHeight(),n!=this._textHeight?(o=this.contentHeight(n),this._textHeight=n,this._contentHeight=o):o=this._contentHeight),(this._needsReframe||r!=this._width||o!=this._height)&&this.resize(r,o),this._expanding=!1)},n.prototype.contentWidth=function(t){var e,i;return e=this.iframe.style.width,this.iframe.style.width=(t||0)+"px",i=this.contents.scrollWidth(),this.iframe.style.width=e,i},n.prototype.contentHeight=function(t){var e,i;return e=this.iframe.style.height,this.iframe.style.height=(t||0)+"px",i=this.contents.scrollHeight(),this.iframe.style.height=e,i},n.prototype.resize=function(t,e){this.iframe&&(o.isNumber(t)&&(this.iframe.style.width=t+"px",this._width=t),o.isNumber(e)&&(this.iframe.style.height=e+"px",this._height=e),this.iframeBounds=o.bounds(this.iframe),this.reframe(this.iframeBounds.width,this.iframeBounds.height))},n.prototype.reframe=function(t,e){var i;o.isNumber(t)&&(this.element.style.width=t+"px"),o.isNumber(e)&&(this.element.style.height=e+"px"),this.prevBounds=this.elementBounds,this.elementBounds=o.bounds(this.element),i={width:this.elementBounds.width,height:this.elementBounds.height,widthDelta:this.elementBounds.width-this.prevBounds.width,heightDelta:this.elementBounds.height-this.prevBounds.height},this.onResize(this,i),this.trigger("resized",i)},n.prototype.load=function(t){var e=new r.defer,i=e.promise;if(!this.iframe)return e.reject(new Error("No Iframe Available")),i;if(this.iframe.onload=function(t){this.onLoad(t,e)}.bind(this),this.supportsSrcdoc)this.iframe.srcdoc=t;else{if(this.document=this.iframe.contentDocument,!this.document)return e.reject(new Error("No Document Available")),i;this.iframe.contentDocument.open(),this.iframe.contentDocument.write(t),this.iframe.contentDocument.close()}return i},n.prototype.onLoad=function(t,e){this.window=this.iframe.contentWindow,this.document=this.iframe.contentDocument,this.contents=new a(this.document,this.document.body,this.section.cfiBase),this.rendering=!1;var i=this.document.querySelector("link[rel='canonical']");i?i.setAttribute("href",this.section.url):(i=this.document.createElement("link"),i.setAttribute("rel","canonical"),i.setAttribute("href",this.section.url),this.document.querySelector("head").appendChild(i)),this.contents.on("expand",function(){this.displayed&&this.iframe&&this.expand()}),e.resolve(this.contents)},n.prototype.setLayout=function(t){this.layout=t},n.prototype.setAxis=function(t){this.settings.axis=t},n.prototype.resizeListenters=function(){clearTimeout(this.expanding),this.expanding=setTimeout(this.expand.bind(this),350)},n.prototype.addListeners=function(){},n.prototype.removeListeners=function(t){},n.prototype.display=function(t){var e=new r.defer;return this.displayed?e.resolve(this):this.render(t).then(function(){this.trigger("displayed",this),this.onDisplayed(this),this.displayed=!0,e.resolve(this)}.bind(this)),e.promise},n.prototype.show=function(){this.element.style.visibility="visible",this.iframe&&(this.iframe.style.visibility="visible"),this.trigger("shown",this)},n.prototype.hide=function(){this.element.style.visibility="hidden",this.iframe.style.visibility="hidden",this.stopExpanding=!0,this.trigger("hidden",this)},n.prototype.position=function(){return this.element.getBoundingClientRect()},n.prototype.locationOf=function(t){var e=this.iframe.getBoundingClientRect(),i=this.contents.locationOf(t,this.settings.ignoreClass);return{left:window.scrollX+e.left+i.left,top:window.scrollY+e.top+i.top}},n.prototype.onDisplayed=function(t){},n.prototype.onResize=function(t,e){},n.prototype.bounds=function(){return this.elementBounds||(this.elementBounds=o.bounds(this.element)),this.elementBounds},n.prototype.destroy=function(){this.displayed&&(this.displayed=!1,this.removeListeners(),this.stopExpanding=!0,this.element.removeChild(this.iframe),this.displayed=!1,this.iframe=null,this._textWidth=null,this._textHeight=null,this._width=null,this._height=null)},r.EventTarget.mixin(n.prototype),t.exports=n},function(t,e,i){function n(t){this.name="default",this.View=t.view,this.request=t.request,this.renditionQueue=t.queue,this.q=new a(this),this.settings=o.extend(this.settings||{},{infinite:!0,hidden:!1,width:void 0,height:void 0,axis:"vertical",ignoreClass:""}),o.extend(this.settings,t.settings||{}),this.viewSettings={ignoreClass:this.settings.ignoreClass,axis:this.settings.axis,layout:this.layout,width:0,height:0}}var r=i(2),o=i(11),s=(i(15),i(26)),a=i(21),h=i(33),u=i(34);n.prototype.render=function(t,e){this.stage=new h({width:e.width,height:e.height,overflow:this.settings.overflow,hidden:this.settings.hidden,axis:this.settings.axis}),this.stage.attachTo(t),this.container=this.stage.getContainer(),this.views=new u(this.container),this._bounds=this.bounds(),this._stageSize=this.stage.size(),this.viewSettings.width=this._stageSize.width,this.viewSettings.height=this._stageSize.height,this.stage.onResize(this.onResized.bind(this)),this.addEventListeners(),this.layout&&this.updateLayout()},n.prototype.addEventListeners=function(){window.addEventListener("unload",function(t){this.destroy()}.bind(this))},n.prototype.destroy=function(){},n.prototype.onResized=function(t){clearTimeout(this.resizeTimeout),this.resizeTimeout=setTimeout(function(){this.resize()}.bind(this),150)},n.prototype.resize=function(t,e){this.q.clear(),this._stageSize=this.stage.size(t,e),this._bounds=this.bounds(),this.viewSettings.width=this._stageSize.width,this.viewSettings.height=this._stageSize.height,this.views.each(function(t){t.size(this._stageSize.width,this._stageSize.height)}.bind(this)),this.updateLayout(),this.trigger("resized",{width:this.stage.width,height:this.stage.height})},n.prototype.createView=function(t){return new this.View(t,this.viewSettings)},n.prototype.display=function(t,e){var i=new r.defer,n=i.promise,o=this.views.find(t);return o&&e?(offset=o.locationOf(e),this.moveTo(offset),i.resolve(),n):(this.views.hide(),this.views.clear(),this.add(t).then(function(){var e;if("pre-paginated"===this.layout.name&&this.layout.divisor>1&&(e=t.next()))return this.add(e)}.bind(this)).then(function(t){e&&(offset=t.locationOf(e),this.moveTo(offset)),this.views.show(),i.resolve()}.bind(this)),n)},n.prototype.afterDisplayed=function(t){this.trigger("added",t)},n.prototype.afterResized=function(t){this.trigger("resize",t.section)},n.prototype.moveTo=function(t){var e=0,i=0;"vertical"===this.settings.axis?i=t.top:(e=Math.floor(t.left/this.layout.delta)*this.layout.delta,e+this.layout.delta>this.container.scrollWidth&&(e=this.container.scrollWidth-this.layout.delta)),this.scrollTo(e,i)},n.prototype.add=function(t){var e=this.createView(t);return this.views.append(e),e.onDisplayed=this.afterDisplayed.bind(this),e.onResize=this.afterResized.bind(this),e.display(this.request)},n.prototype.append=function(t){var e=this.createView(t);return this.views.append(e),e.display(this.request)},n.prototype.prepend=function(t){var e=this.createView(t);return this.views.prepend(e),e.display(this.request)},n.prototype.next=function(){var t,e;if(this.views.length)return"horizontal"===this.settings.axis?(this.scrollLeft=this.container.scrollLeft,e=this.container.scrollLeft+this.container.offsetWidth+this.layout.delta,e1&&(e=t.next()))return this.append(e)}.bind(this)).then(function(){this.views.show()}.bind(this))):void 0},n.prototype.prev=function(){var t,e;if(this.views.length)return"horizontal"===this.settings.axis?(this.scrollLeft=this.container.scrollLeft,e=this.container.scrollLeft,e>0?this.scrollBy(-this.layout.delta,0):t=this.views.first().section.prev()):t=this.views.first().section.prev(),t?(this.views.clear(),this.prepend(t).then(function(){var e;if(this.layout.name&&this.layout.divisor>1&&(e=t.prev()))return this.prepend(e)}.bind(this)).then(function(){"horizontal"===this.settings.axis&&this.scrollTo(this.container.scrollWidth-this.layout.delta,0),this.views.show()}.bind(this))):void 0},n.prototype.current=function(){var t=this.visible();return t.length?t[t.length-1]:null},n.prototype.currentLocation=function(){var t,e,i;if(this.views.length)return t=this.views.first(),e=container.left-t.position().left,i=e+this.layout.spread,this.mapping.page(t,t.section.cfiBase)},n.prototype.isVisible=function(t,e,i,n){var r=t.position(),o=n||this.bounds();return"horizontal"===this.settings.axis&&r.right>o.left-e&&r.lefto.top-e&&r.top-1&&this._views.splice(e,1),this.destroy(t),this.length--},i.prototype.destroy=function(t){t.off("resized"),t.displayed&&t.destroy(),this.container&&this.container.removeChild(t.element),t=null},i.prototype.each=function(){return this._views.forEach.apply(this._views,arguments)},i.prototype.clear=function(){var t,e=this.length;if(this.length){for(var i=0;i=f&&(i=this.views.last(),o=i&&i.section.next(),o&&h.push(this.append(o))),p-c<0&&(n=this.views.first(),s=n&&n.section.prev(),s&&h.push(this.prepend(s))),h.length?this.q.enqueue(function(){return this.update(c)}.bind(this)):(a.resolve(!1),a.promise)},n.prototype.trim=function(){for(var t=new r.defer,e=this.views.displayed(),i=e[0],n=e[e.length-1],o=this.views.indexOf(i),s=this.views.indexOf(n),a=this.views.slice(0,o),h=this.views.slice(s+1),u=0;uthis.settings.offsetDelta||this.scrollDeltaHorz>this.settings.offsetDelta)&&(this.q.enqueue(function(){this.check()}.bind(this)),this.scrollDeltaVert=0,this.scrollDeltaHorz=0,this.trigger("scroll",{top:scrollTop,left:scrollLeft}),clearTimeout(this.afterScrolled),this.afterScrolled=setTimeout(function(){this.trigger("scrolled",{top:this.scrollTop,left:this.scrollLeft})}.bind(this))),this.scrollDeltaVert+=Math.abs(scrollTop-this.prevScrollTop),this.scrollDeltaHorz+=Math.abs(scrollLeft-this.prevScrollLeft),this.prevScrollTop=scrollTop,this.prevScrollLeft=scrollLeft,clearTimeout(this.scrollTimeout),this.scrollTimeout=setTimeout(function(){this.scrollDeltaVert=0,this.scrollDeltaHorz=0}.bind(this),150),this.scrolled=!1},n.prototype.currentLocation=function(){return"vertical"===this.settings.axis?this.location=this.scrolledLocation():this.location=this.paginatedLocation(),this.location},n.prototype.scrolledLocation=function(){var t,e,i=this.visible();this.container.getBoundingClientRect();return 1===i.length?this.mapping.page(i[0].contents,i[0].section.cfiBase):i.length>1?(t=this.mapping.page(i[0].contents,i[0].section.cfiBase),e=this.mapping.page(i[i.length-1].contents,i[i.length-1].section.cfiBase),{start:t.start,end:e.end}):void 0},n.prototype.paginatedLocation=function(){var t,e,i,n,r,o,s=this.visible(),a=this.container.getBoundingClientRect();return 1===s.length?(t=a.left-s[0].position().left,i=t+this.layout.spreadWidth,this.mapping.page(s[0].contents,s[0].section.cfiBase,t,i)):s.length>1?(t=a.left-s[0].position().left,i=t+this.layout.columnWidth,e=a.left+this.layout.spreadWidth-s[s.length-1].position().left,n=e+this.layout.columnWidth,r=this.mapping.page(s[0].contents,s[0].section.cfiBase,t,i),o=this.mapping.page(s[s.length-1].contents,s[s.length-1].section.cfiBase,e,n),{start:r.start,end:o.end}):void 0},n.prototype.updateLayout=function(){this.stage&&("vertical"===this.settings.axis?this.layout.calculate(this._stageSize.width,this._stageSize.height):(this.layout.calculate(this._stageSize.width,this._stageSize.height,this.settings.gap),this.settings.offset=this.layout.delta,this.stage.addStyleRules("iframe",[{"margin-right":this.layout.gap+"px"}])),this.viewSettings.width=this.layout.width,this.viewSettings.height=this.layout.height,this.setLayout(this.layout))},n.prototype.next=function(){"horizontal"===this.settings.axis?(this.scrollLeft=this.container.scrollLeft,this.container.scrollLeft+this.container.offsetWidth+this.layout.delta 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/*!\n * @overview RSVP - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE\n * @version 3.0.14\n */\n\n(function() {\n \"use strict\";\n\n function $$rsvp$events$$indexOf(callbacks, callback) {\n for (var i=0, l=callbacks.length; i 1) {\n throw new Error('Second argument not supported');\n }\n if (typeof o !== 'object') {\n throw new TypeError('Argument must be an object');\n }\n $$utils$$F.prototype = o;\n return new $$utils$$F();\n });\n\n var $$instrument$$queue = [];\n\n var $$instrument$$default = function instrument(eventName, promise, child) {\n if (1 === $$instrument$$queue.push({\n name: eventName,\n payload: {\n guid: promise._guidKey + promise._id,\n eventName: eventName,\n detail: promise._result,\n childGuid: child && promise._guidKey + child._id,\n label: promise._label,\n timeStamp: $$utils$$now(),\n stack: new Error(promise._label).stack\n }})) {\n\n setTimeout(function() {\n var entry;\n for (var i = 0; i < $$instrument$$queue.length; i++) {\n entry = $$instrument$$queue[i];\n $$rsvp$config$$config.trigger(entry.name, entry.payload);\n }\n $$instrument$$queue.length = 0;\n }, 50);\n }\n };\n\n function $$$internal$$noop() {}\n var $$$internal$$PENDING = void 0;\n var $$$internal$$FULFILLED = 1;\n var $$$internal$$REJECTED = 2;\n var $$$internal$$GET_THEN_ERROR = new $$$internal$$ErrorObject();\n\n function $$$internal$$getThen(promise) {\n try {\n return promise.then;\n } catch(error) {\n $$$internal$$GET_THEN_ERROR.error = error;\n return $$$internal$$GET_THEN_ERROR;\n }\n }\n\n function $$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n try {\n then.call(value, fulfillmentHandler, rejectionHandler);\n } catch(e) {\n return e;\n }\n }\n\n function $$$internal$$handleForeignThenable(promise, thenable, then) {\n $$rsvp$config$$config.async(function(promise) {\n var sealed = false;\n var error = $$$internal$$tryThen(then, thenable, function(value) {\n if (sealed) { return; }\n sealed = true;\n if (thenable !== value) {\n $$$internal$$resolve(promise, value);\n } else {\n $$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n if (sealed) { return; }\n sealed = true;\n\n $$$internal$$reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n $$$internal$$reject(promise, error);\n }\n }, promise);\n }\n\n function $$$internal$$handleOwnThenable(promise, thenable) {\n if (thenable._state === $$$internal$$FULFILLED) {\n $$$internal$$fulfill(promise, thenable._result);\n } else if (promise._state === $$$internal$$REJECTED) {\n $$$internal$$reject(promise, thenable._result);\n } else {\n $$$internal$$subscribe(thenable, undefined, function(value) {\n if (thenable !== value) {\n $$$internal$$resolve(promise, value);\n } else {\n $$$internal$$fulfill(promise, value);\n }\n }, function(reason) {\n $$$internal$$reject(promise, reason);\n });\n }\n }\n\n function $$$internal$$handleMaybeThenable(promise, maybeThenable) {\n if (maybeThenable.constructor === promise.constructor) {\n $$$internal$$handleOwnThenable(promise, maybeThenable);\n } else {\n var then = $$$internal$$getThen(maybeThenable);\n\n if (then === $$$internal$$GET_THEN_ERROR) {\n $$$internal$$reject(promise, $$$internal$$GET_THEN_ERROR.error);\n } else if (then === undefined) {\n $$$internal$$fulfill(promise, maybeThenable);\n } else if ($$utils$$isFunction(then)) {\n $$$internal$$handleForeignThenable(promise, maybeThenable, then);\n } else {\n $$$internal$$fulfill(promise, maybeThenable);\n }\n }\n }\n\n function $$$internal$$resolve(promise, value) {\n if (promise === value) {\n $$$internal$$fulfill(promise, value);\n } else if ($$utils$$objectOrFunction(value)) {\n $$$internal$$handleMaybeThenable(promise, value);\n } else {\n $$$internal$$fulfill(promise, value);\n }\n }\n\n function $$$internal$$publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n $$$internal$$publish(promise);\n }\n\n function $$$internal$$fulfill(promise, value) {\n if (promise._state !== $$$internal$$PENDING) { return; }\n\n promise._result = value;\n promise._state = $$$internal$$FULFILLED;\n\n if (promise._subscribers.length === 0) {\n if ($$rsvp$config$$config.instrument) {\n $$instrument$$default('fulfilled', promise);\n }\n } else {\n $$rsvp$config$$config.async($$$internal$$publish, promise);\n }\n }\n\n function $$$internal$$reject(promise, reason) {\n if (promise._state !== $$$internal$$PENDING) { return; }\n promise._state = $$$internal$$REJECTED;\n promise._result = reason;\n\n $$rsvp$config$$config.async($$$internal$$publishRejection, promise);\n }\n\n function $$$internal$$subscribe(parent, child, onFulfillment, onRejection) {\n var subscribers = parent._subscribers;\n var length = subscribers.length;\n\n parent._onerror = null;\n\n subscribers[length] = child;\n subscribers[length + $$$internal$$FULFILLED] = onFulfillment;\n subscribers[length + $$$internal$$REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n $$rsvp$config$$config.async($$$internal$$publish, parent);\n }\n }\n\n function $$$internal$$publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if ($$rsvp$config$$config.instrument) {\n $$instrument$$default(settled === $$$internal$$FULFILLED ? 'fulfilled' : 'rejected', promise);\n }\n\n if (subscribers.length === 0) { return; }\n\n var child, callback, detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n $$$internal$$invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function $$$internal$$ErrorObject() {\n this.error = null;\n }\n\n var $$$internal$$TRY_CATCH_ERROR = new $$$internal$$ErrorObject();\n\n function $$$internal$$tryCatch(callback, detail) {\n try {\n return callback(detail);\n } catch(e) {\n $$$internal$$TRY_CATCH_ERROR.error = e;\n return $$$internal$$TRY_CATCH_ERROR;\n }\n }\n\n function $$$internal$$invokeCallback(settled, promise, callback, detail) {\n var hasCallback = $$utils$$isFunction(callback),\n value, error, succeeded, failed;\n\n if (hasCallback) {\n value = $$$internal$$tryCatch(callback, detail);\n\n if (value === $$$internal$$TRY_CATCH_ERROR) {\n failed = true;\n error = value.error;\n value = null;\n } else {\n succeeded = true;\n }\n\n if (promise === value) {\n $$$internal$$reject(promise, new TypeError('A promises callback cannot return that same promise.'));\n return;\n }\n\n } else {\n value = detail;\n succeeded = true;\n }\n\n if (promise._state !== $$$internal$$PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n $$$internal$$resolve(promise, value);\n } else if (failed) {\n $$$internal$$reject(promise, error);\n } else if (settled === $$$internal$$FULFILLED) {\n $$$internal$$fulfill(promise, value);\n } else if (settled === $$$internal$$REJECTED) {\n $$$internal$$reject(promise, value);\n }\n }\n\n function $$$internal$$initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value){\n $$$internal$$resolve(promise, value);\n }, function rejectPromise(reason) {\n $$$internal$$reject(promise, reason);\n });\n } catch(e) {\n $$$internal$$reject(promise, e);\n }\n }\n\n function $$enumerator$$makeSettledResult(state, position, value) {\n if (state === $$$internal$$FULFILLED) {\n return {\n state: 'fulfilled',\n value: value\n };\n } else {\n return {\n state: 'rejected',\n reason: value\n };\n }\n }\n\n function $$enumerator$$Enumerator(Constructor, input, abortOnReject, label) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor($$$internal$$noop, label);\n this._abortOnReject = abortOnReject;\n\n if (this._validateInput(input)) {\n this._input = input;\n this.length = input.length;\n this._remaining = input.length;\n\n this._init();\n\n if (this.length === 0) {\n $$$internal$$fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate();\n if (this._remaining === 0) {\n $$$internal$$fulfill(this.promise, this._result);\n }\n }\n } else {\n $$$internal$$reject(this.promise, this._validationError());\n }\n }\n\n $$enumerator$$Enumerator.prototype._validateInput = function(input) {\n return $$utils$$isArray(input);\n };\n\n $$enumerator$$Enumerator.prototype._validationError = function() {\n return new Error('Array Methods must be provided an Array');\n };\n\n $$enumerator$$Enumerator.prototype._init = function() {\n this._result = new Array(this.length);\n };\n\n var $$enumerator$$default = $$enumerator$$Enumerator;\n\n $$enumerator$$Enumerator.prototype._enumerate = function() {\n var length = this.length;\n var promise = this.promise;\n var input = this._input;\n\n for (var i = 0; promise._state === $$$internal$$PENDING && i < length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n $$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n var c = this._instanceConstructor;\n if ($$utils$$isMaybeThenable(entry)) {\n if (entry.constructor === c && entry._state !== $$$internal$$PENDING) {\n entry._onerror = null;\n this._settledAt(entry._state, i, entry._result);\n } else {\n this._willSettleAt(c.resolve(entry), i);\n }\n } else {\n this._remaining--;\n this._result[i] = this._makeResult($$$internal$$FULFILLED, i, entry);\n }\n };\n\n $$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n var promise = this.promise;\n\n if (promise._state === $$$internal$$PENDING) {\n this._remaining--;\n\n if (this._abortOnReject && state === $$$internal$$REJECTED) {\n $$$internal$$reject(promise, value);\n } else {\n this._result[i] = this._makeResult(state, i, value);\n }\n }\n\n if (this._remaining === 0) {\n $$$internal$$fulfill(promise, this._result);\n }\n };\n\n $$enumerator$$Enumerator.prototype._makeResult = function(state, i, value) {\n return value;\n };\n\n $$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n var enumerator = this;\n\n $$$internal$$subscribe(promise, undefined, function(value) {\n enumerator._settledAt($$$internal$$FULFILLED, i, value);\n }, function(reason) {\n enumerator._settledAt($$$internal$$REJECTED, i, reason);\n });\n };\n\n var $$promise$all$$default = function all(entries, label) {\n return new $$enumerator$$default(this, entries, true /* abort on reject */, label).promise;\n };\n\n var $$promise$race$$default = function race(entries, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor($$$internal$$noop, label);\n\n if (!$$utils$$isArray(entries)) {\n $$$internal$$reject(promise, new TypeError('You must pass an array to race.'));\n return promise;\n }\n\n var length = entries.length;\n\n function onFulfillment(value) {\n $$$internal$$resolve(promise, value);\n }\n\n function onRejection(reason) {\n $$$internal$$reject(promise, reason);\n }\n\n for (var i = 0; promise._state === $$$internal$$PENDING && i < length; i++) {\n $$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n }\n\n return promise;\n };\n\n var $$promise$resolve$$default = function resolve(object, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor($$$internal$$noop, label);\n $$$internal$$resolve(promise, object);\n return promise;\n };\n\n var $$promise$reject$$default = function reject(reason, label) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor($$$internal$$noop, label);\n $$$internal$$reject(promise, reason);\n return promise;\n };\n\n var $$rsvp$promise$$guidKey = 'rsvp_' + $$utils$$now() + '-';\n var $$rsvp$promise$$counter = 0;\n\n function $$rsvp$promise$$needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n }\n\n function $$rsvp$promise$$needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n }\n\n var $$rsvp$promise$$default = $$rsvp$promise$$Promise;\n\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n var promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n var xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class RSVP.Promise\n @param {function} resolver\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @constructor\n */\n function $$rsvp$promise$$Promise(resolver, label) {\n this._id = $$rsvp$promise$$counter++;\n this._label = label;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n if ($$rsvp$config$$config.instrument) {\n $$instrument$$default('created', this);\n }\n\n if ($$$internal$$noop !== resolver) {\n if (!$$utils$$isFunction(resolver)) {\n $$rsvp$promise$$needsResolver();\n }\n\n if (!(this instanceof $$rsvp$promise$$Promise)) {\n $$rsvp$promise$$needsNew();\n }\n\n $$$internal$$initializePromise(this, resolver);\n }\n }\n\n // deprecated\n $$rsvp$promise$$Promise.cast = $$promise$resolve$$default;\n\n $$rsvp$promise$$Promise.all = $$promise$all$$default;\n $$rsvp$promise$$Promise.race = $$promise$race$$default;\n $$rsvp$promise$$Promise.resolve = $$promise$resolve$$default;\n $$rsvp$promise$$Promise.reject = $$promise$reject$$default;\n\n $$rsvp$promise$$Promise.prototype = {\n constructor: $$rsvp$promise$$Promise,\n\n _guidKey: $$rsvp$promise$$guidKey,\n\n _onerror: function (reason) {\n $$rsvp$config$$config.trigger('error', reason);\n },\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n\n Chaining\n --------\n\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n\n Assimilation\n ------------\n\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n\n If the assimliated promise rejects, then the downstream promise will also reject.\n\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n\n Simple Example\n --------------\n\n Synchronous Example\n\n ```javascript\n var result;\n\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n\n Advanced Example\n --------------\n\n Synchronous Example\n\n ```javascript\n var author, books;\n\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n\n Errback Example\n\n ```js\n\n function foundBooks(books) {\n\n }\n\n function failure(reason) {\n\n }\n\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n\n Promise Example;\n\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n then: function(onFulfillment, onRejection, label) {\n var parent = this;\n var state = parent._state;\n\n if (state === $$$internal$$FULFILLED && !onFulfillment || state === $$$internal$$REJECTED && !onRejection) {\n if ($$rsvp$config$$config.instrument) {\n $$instrument$$default('chained', this, this);\n }\n return this;\n }\n\n parent._onerror = null;\n\n var child = new this.constructor($$$internal$$noop, label);\n var result = parent._result;\n\n if ($$rsvp$config$$config.instrument) {\n $$instrument$$default('chained', parent, child);\n }\n\n if (state) {\n var callback = arguments[state - 1];\n $$rsvp$config$$config.async(function(){\n $$$internal$$invokeCallback(state, child, callback, result);\n });\n } else {\n $$$internal$$subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n },\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n\n @method catch\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'catch': function(onRejection, label) {\n return this.then(null, onRejection, label);\n },\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n\n Synchronous example:\n\n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n\n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n\n Asynchronous example:\n\n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n\n @method finally\n @param {Function} callback\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n 'finally': function(callback, label) {\n var constructor = this.constructor;\n\n return this.then(function(value) {\n return constructor.resolve(callback()).then(function(){\n return value;\n });\n }, function(reason) {\n return constructor.resolve(callback()).then(function(){\n throw reason;\n });\n }, label);\n }\n };\n\n function $$rsvp$node$$Result() {\n this.value = undefined;\n }\n\n var $$rsvp$node$$ERROR = new $$rsvp$node$$Result();\n var $$rsvp$node$$GET_THEN_ERROR = new $$rsvp$node$$Result();\n\n function $$rsvp$node$$getThen(obj) {\n try {\n return obj.then;\n } catch(error) {\n $$rsvp$node$$ERROR.value= error;\n return $$rsvp$node$$ERROR;\n }\n }\n\n function $$rsvp$node$$tryApply(f, s, a) {\n try {\n f.apply(s, a);\n } catch(error) {\n $$rsvp$node$$ERROR.value = error;\n return $$rsvp$node$$ERROR;\n }\n }\n\n function $$rsvp$node$$makeObject(_, argumentNames) {\n var obj = {};\n var name;\n var i;\n var length = _.length;\n var args = new Array(length);\n\n for (var x = 0; x < length; x++) {\n args[x] = _[x];\n }\n\n for (i = 0; i < argumentNames.length; i++) {\n name = argumentNames[i];\n obj[name] = args[i + 1];\n }\n\n return obj;\n }\n\n function $$rsvp$node$$arrayResult(_) {\n var length = _.length;\n var args = new Array(length - 1);\n\n for (var i = 1; i < length; i++) {\n args[i - 1] = _[i];\n }\n\n return args;\n }\n\n function $$rsvp$node$$wrapThenable(then, promise) {\n return {\n then: function(onFulFillment, onRejection) {\n return then.call(promise, onFulFillment, onRejection);\n }\n };\n }\n\n var $$rsvp$node$$default = function denodeify(nodeFunc, options) {\n var fn = function() {\n var self = this;\n var l = arguments.length;\n var args = new Array(l + 1);\n var arg;\n var promiseInput = false;\n\n for (var i = 0; i < l; ++i) {\n arg = arguments[i];\n\n if (!promiseInput) {\n // TODO: clean this up\n promiseInput = $$rsvp$node$$needsPromiseInput(arg);\n if (promiseInput === $$rsvp$node$$GET_THEN_ERROR) {\n var p = new $$rsvp$promise$$default($$$internal$$noop);\n $$$internal$$reject(p, $$rsvp$node$$GET_THEN_ERROR.value);\n return p;\n } else if (promiseInput && promiseInput !== true) {\n arg = $$rsvp$node$$wrapThenable(promiseInput, arg);\n }\n }\n args[i] = arg;\n }\n\n var promise = new $$rsvp$promise$$default($$$internal$$noop);\n\n args[l] = function(err, val) {\n if (err)\n $$$internal$$reject(promise, err);\n else if (options === undefined)\n $$$internal$$resolve(promise, val);\n else if (options === true)\n $$$internal$$resolve(promise, $$rsvp$node$$arrayResult(arguments));\n else if ($$utils$$isArray(options))\n $$$internal$$resolve(promise, $$rsvp$node$$makeObject(arguments, options));\n else\n $$$internal$$resolve(promise, val);\n };\n\n if (promiseInput) {\n return $$rsvp$node$$handlePromiseInput(promise, args, nodeFunc, self);\n } else {\n return $$rsvp$node$$handleValueInput(promise, args, nodeFunc, self);\n }\n };\n\n fn.__proto__ = nodeFunc;\n\n return fn;\n };\n\n function $$rsvp$node$$handleValueInput(promise, args, nodeFunc, self) {\n var result = $$rsvp$node$$tryApply(nodeFunc, self, args);\n if (result === $$rsvp$node$$ERROR) {\n $$$internal$$reject(promise, result.value);\n }\n return promise;\n }\n\n function $$rsvp$node$$handlePromiseInput(promise, args, nodeFunc, self){\n return $$rsvp$promise$$default.all(args).then(function(args){\n var result = $$rsvp$node$$tryApply(nodeFunc, self, args);\n if (result === $$rsvp$node$$ERROR) {\n $$$internal$$reject(promise, result.value);\n }\n return promise;\n });\n }\n\n function $$rsvp$node$$needsPromiseInput(arg) {\n if (arg && typeof arg === 'object') {\n if (arg.constructor === $$rsvp$promise$$default) {\n return true;\n } else {\n return $$rsvp$node$$getThen(arg);\n }\n } else {\n return false;\n }\n }\n\n var $$rsvp$all$$default = function all(array, label) {\n return $$rsvp$promise$$default.all(array, label);\n };\n\n function $$rsvp$all$settled$$AllSettled(Constructor, entries, label) {\n this._superConstructor(Constructor, entries, false /* don't abort on reject */, label);\n }\n\n $$rsvp$all$settled$$AllSettled.prototype = $$utils$$o_create($$enumerator$$default.prototype);\n $$rsvp$all$settled$$AllSettled.prototype._superConstructor = $$enumerator$$default;\n $$rsvp$all$settled$$AllSettled.prototype._makeResult = $$enumerator$$makeSettledResult;\n\n $$rsvp$all$settled$$AllSettled.prototype._validationError = function() {\n return new Error('allSettled must be called with an array');\n };\n\n var $$rsvp$all$settled$$default = function allSettled(entries, label) {\n return new $$rsvp$all$settled$$AllSettled($$rsvp$promise$$default, entries, label).promise;\n };\n\n var $$rsvp$race$$default = function race(array, label) {\n return $$rsvp$promise$$default.race(array, label);\n };\n\n function $$promise$hash$$PromiseHash(Constructor, object, label) {\n this._superConstructor(Constructor, object, true, label);\n }\n\n var $$promise$hash$$default = $$promise$hash$$PromiseHash;\n $$promise$hash$$PromiseHash.prototype = $$utils$$o_create($$enumerator$$default.prototype);\n $$promise$hash$$PromiseHash.prototype._superConstructor = $$enumerator$$default;\n\n $$promise$hash$$PromiseHash.prototype._init = function() {\n this._result = {};\n };\n\n $$promise$hash$$PromiseHash.prototype._validateInput = function(input) {\n return input && typeof input === 'object';\n };\n\n $$promise$hash$$PromiseHash.prototype._validationError = function() {\n return new Error('Promise.hash must be called with an object');\n };\n\n $$promise$hash$$PromiseHash.prototype._enumerate = function() {\n var promise = this.promise;\n var input = this._input;\n var results = [];\n\n for (var key in input) {\n if (promise._state === $$$internal$$PENDING && input.hasOwnProperty(key)) {\n results.push({\n position: key,\n entry: input[key]\n });\n }\n }\n\n var length = results.length;\n this._remaining = length;\n var result;\n\n for (var i = 0; promise._state === $$$internal$$PENDING && i < length; i++) {\n result = results[i];\n this._eachEntry(result.entry, result.position);\n }\n };\n\n var $$rsvp$hash$$default = function hash(object, label) {\n return new $$promise$hash$$default($$rsvp$promise$$default, object, label).promise;\n };\n\n function $$rsvp$hash$settled$$HashSettled(Constructor, object, label) {\n this._superConstructor(Constructor, object, false, label);\n }\n\n $$rsvp$hash$settled$$HashSettled.prototype = $$utils$$o_create($$promise$hash$$default.prototype);\n $$rsvp$hash$settled$$HashSettled.prototype._superConstructor = $$enumerator$$default;\n $$rsvp$hash$settled$$HashSettled.prototype._makeResult = $$enumerator$$makeSettledResult;\n\n $$rsvp$hash$settled$$HashSettled.prototype._validationError = function() {\n return new Error('hashSettled must be called with an object');\n };\n\n var $$rsvp$hash$settled$$default = function hashSettled(object, label) {\n return new $$rsvp$hash$settled$$HashSettled($$rsvp$promise$$default, object, label).promise;\n };\n\n var $$rsvp$rethrow$$default = function rethrow(reason) {\n setTimeout(function() {\n throw reason;\n });\n throw reason;\n };\n\n var $$rsvp$defer$$default = function defer(label) {\n var deferred = { };\n\n deferred.promise = new $$rsvp$promise$$default(function(resolve, reject) {\n deferred.resolve = resolve;\n deferred.reject = reject;\n }, label);\n\n return deferred;\n };\n\n var $$rsvp$map$$default = function map(promises, mapFn, label) {\n return $$rsvp$promise$$default.all(promises, label).then(function(values) {\n if (!$$utils$$isFunction(mapFn)) {\n throw new TypeError(\"You must pass a function as map's second argument.\");\n }\n\n var length = values.length;\n var results = new Array(length);\n\n for (var i = 0; i < length; i++) {\n results[i] = mapFn(values[i]);\n }\n\n return $$rsvp$promise$$default.all(results, label);\n });\n };\n\n var $$rsvp$resolve$$default = function resolve(value, label) {\n return $$rsvp$promise$$default.resolve(value, label);\n };\n\n var $$rsvp$reject$$default = function reject(reason, label) {\n return $$rsvp$promise$$default.reject(reason, label);\n };\n\n var $$rsvp$filter$$default = function filter(promises, filterFn, label) {\n return $$rsvp$promise$$default.all(promises, label).then(function(values) {\n if (!$$utils$$isFunction(filterFn)) {\n throw new TypeError(\"You must pass a function as filter's second argument.\");\n }\n\n var length = values.length;\n var filtered = new Array(length);\n\n for (var i = 0; i < length; i++) {\n filtered[i] = filterFn(values[i]);\n }\n\n return $$rsvp$promise$$default.all(filtered, label).then(function(filtered) {\n var results = new Array(length);\n var newLength = 0;\n\n for (var i = 0; i < length; i++) {\n if (filtered[i]) {\n results[newLength] = values[i];\n newLength++;\n }\n }\n\n results.length = newLength;\n\n return results;\n });\n });\n };\n\n var $$rsvp$asap$$len = 0;\n\n var $$rsvp$asap$$default = function asap(callback, arg) {\n $$rsvp$asap$$queue[$$rsvp$asap$$len] = callback;\n $$rsvp$asap$$queue[$$rsvp$asap$$len + 1] = arg;\n $$rsvp$asap$$len += 2;\n if ($$rsvp$asap$$len === 2) {\n // If len is 1, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n $$rsvp$asap$$scheduleFlush();\n }\n };\n\n var $$rsvp$asap$$browserGlobal = (typeof window !== 'undefined') ? window : {};\n var $$rsvp$asap$$BrowserMutationObserver = $$rsvp$asap$$browserGlobal.MutationObserver || $$rsvp$asap$$browserGlobal.WebKitMutationObserver;\n\n // test for web worker but not in IE10\n var $$rsvp$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n typeof importScripts !== 'undefined' &&\n typeof MessageChannel !== 'undefined';\n\n // node\n function $$rsvp$asap$$useNextTick() {\n return function() {\n process.nextTick($$rsvp$asap$$flush);\n };\n }\n\n function $$rsvp$asap$$useMutationObserver() {\n var iterations = 0;\n var observer = new $$rsvp$asap$$BrowserMutationObserver($$rsvp$asap$$flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function() {\n node.data = (iterations = ++iterations % 2);\n };\n }\n\n // web worker\n function $$rsvp$asap$$useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = $$rsvp$asap$$flush;\n return function () {\n channel.port2.postMessage(0);\n };\n }\n\n function $$rsvp$asap$$useSetTimeout() {\n return function() {\n setTimeout($$rsvp$asap$$flush, 1);\n };\n }\n\n var $$rsvp$asap$$queue = new Array(1000);\n\n function $$rsvp$asap$$flush() {\n for (var i = 0; i < $$rsvp$asap$$len; i+=2) {\n var callback = $$rsvp$asap$$queue[i];\n var arg = $$rsvp$asap$$queue[i+1];\n\n callback(arg);\n\n $$rsvp$asap$$queue[i] = undefined;\n $$rsvp$asap$$queue[i+1] = undefined;\n }\n\n $$rsvp$asap$$len = 0;\n }\n\n var $$rsvp$asap$$scheduleFlush;\n\n // Decide what async method to use to triggering processing of queued callbacks:\n if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n $$rsvp$asap$$scheduleFlush = $$rsvp$asap$$useNextTick();\n } else if ($$rsvp$asap$$BrowserMutationObserver) {\n $$rsvp$asap$$scheduleFlush = $$rsvp$asap$$useMutationObserver();\n } else if ($$rsvp$asap$$isWorker) {\n $$rsvp$asap$$scheduleFlush = $$rsvp$asap$$useMessageChannel();\n } else {\n $$rsvp$asap$$scheduleFlush = $$rsvp$asap$$useSetTimeout();\n }\n\n // default async is asap;\n $$rsvp$config$$config.async = $$rsvp$asap$$default;\n\n var $$rsvp$$cast = $$rsvp$resolve$$default;\n\n function $$rsvp$$async(callback, arg) {\n $$rsvp$config$$config.async(callback, arg);\n }\n\n function $$rsvp$$on() {\n $$rsvp$config$$config.on.apply($$rsvp$config$$config, arguments);\n }\n\n function $$rsvp$$off() {\n $$rsvp$config$$config.off.apply($$rsvp$config$$config, arguments);\n }\n\n // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`\n if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {\n var $$rsvp$$callbacks = window['__PROMISE_INSTRUMENTATION__'];\n $$rsvp$config$$configure('instrument', true);\n for (var $$rsvp$$eventName in $$rsvp$$callbacks) {\n if ($$rsvp$$callbacks.hasOwnProperty($$rsvp$$eventName)) {\n $$rsvp$$on($$rsvp$$eventName, $$rsvp$$callbacks[$$rsvp$$eventName]);\n }\n }\n }\n\n var rsvp$umd$$RSVP = {\n 'race': $$rsvp$race$$default,\n 'Promise': $$rsvp$promise$$default,\n 'allSettled': $$rsvp$all$settled$$default,\n 'hash': $$rsvp$hash$$default,\n 'hashSettled': $$rsvp$hash$settled$$default,\n 'denodeify': $$rsvp$node$$default,\n 'on': $$rsvp$$on,\n 'off': $$rsvp$$off,\n 'map': $$rsvp$map$$default,\n 'filter': $$rsvp$filter$$default,\n 'resolve': $$rsvp$resolve$$default,\n 'reject': $$rsvp$reject$$default,\n 'all': $$rsvp$all$$default,\n 'rethrow': $$rsvp$rethrow$$default,\n 'defer': $$rsvp$defer$$default,\n 'EventTarget': $$rsvp$events$$default,\n 'configure': $$rsvp$config$$configure,\n 'async': $$rsvp$$async\n };\n\n /* global define:true module:true window: true */\n if (typeof define === 'function' && define.amd) {\n define(function() { return rsvp$umd$$RSVP; });\n } else if (typeof module !== 'undefined' && module.exports) {\n module.exports = rsvp$umd$$RSVP;\n } else if (typeof this !== 'undefined') {\n this['RSVP'] = rsvp$umd$$RSVP;\n }\n}).call(this);","/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.17.0\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n * GPL v3 http://opensource.org/licenses/GPL-3.0\n *\n */\n(function (root, factory) {\n 'use strict';\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n if (typeof exports === 'object') {\n // Node\n module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n } else {\n // Browser globals (root is window)\n root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n }\n}(this, function (punycode, IPv6, SLD, root) {\n 'use strict';\n /*global location, escape, unescape */\n // FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n /*jshint camelcase: false */\n\n // save current URI variable, if any\n var _URI = root && root.URI;\n\n function URI(url, base) {\n var _urlSupplied = arguments.length >= 1;\n var _baseSupplied = arguments.length >= 2;\n\n // Allow instantiation without the 'new' keyword\n if (!(this instanceof URI)) {\n if (_urlSupplied) {\n if (_baseSupplied) {\n return new URI(url, base);\n }\n\n return new URI(url);\n }\n\n return new URI();\n }\n\n if (url === undefined) {\n if (_urlSupplied) {\n throw new TypeError('undefined is not a valid argument for URI');\n }\n\n if (typeof location !== 'undefined') {\n url = location.href + '';\n } else {\n url = '';\n }\n }\n\n this.href(url);\n\n // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n if (base !== undefined) {\n return this.absoluteTo(base);\n }\n\n return this;\n }\n\n URI.version = '1.17.0';\n\n var p = URI.prototype;\n var hasOwn = Object.prototype.hasOwnProperty;\n\n function escapeRegEx(string) {\n // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n return string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n }\n\n function getType(value) {\n // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n if (value === undefined) {\n return 'Undefined';\n }\n\n return String(Object.prototype.toString.call(value)).slice(8, -1);\n }\n\n function isArray(obj) {\n return getType(obj) === 'Array';\n }\n\n function filterArrayValues(data, value) {\n var lookup = {};\n var i, length;\n\n if (getType(value) === 'RegExp') {\n lookup = null;\n } else if (isArray(value)) {\n for (i = 0, length = value.length; i < length; i++) {\n lookup[value[i]] = true;\n }\n } else {\n lookup[value] = true;\n }\n\n for (i = 0, length = data.length; i < length; i++) {\n /*jshint laxbreak: true */\n var _match = lookup && lookup[data[i]] !== undefined\n || !lookup && value.test(data[i]);\n /*jshint laxbreak: false */\n if (_match) {\n data.splice(i, 1);\n length--;\n i--;\n }\n }\n\n return data;\n }\n\n function arrayContains(list, value) {\n var i, length;\n\n // value may be string, number, array, regexp\n if (isArray(value)) {\n // Note: this can be optimized to O(n) (instead of current O(m * n))\n for (i = 0, length = value.length; i < length; i++) {\n if (!arrayContains(list, value[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n var _type = getType(value);\n for (i = 0, length = list.length; i < length; i++) {\n if (_type === 'RegExp') {\n if (typeof list[i] === 'string' && list[i].match(value)) {\n return true;\n }\n } else if (list[i] === value) {\n return true;\n }\n }\n\n return false;\n }\n\n function arraysEqual(one, two) {\n if (!isArray(one) || !isArray(two)) {\n return false;\n }\n\n // arrays can't be equal if they have different amount of content\n if (one.length !== two.length) {\n return false;\n }\n\n one.sort();\n two.sort();\n\n for (var i = 0, l = one.length; i < l; i++) {\n if (one[i] !== two[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n function trimSlashes(text) {\n var trim_expression = /^\\/+|\\/+$/g;\n return text.replace(trim_expression, '');\n }\n\n URI._parts = function() {\n return {\n protocol: null,\n username: null,\n password: null,\n hostname: null,\n urn: null,\n port: null,\n path: null,\n query: null,\n fragment: null,\n // state\n duplicateQueryParameters: URI.duplicateQueryParameters,\n escapeQuerySpace: URI.escapeQuerySpace\n };\n };\n // state: allow duplicate query parameters (a=1&a=1)\n URI.duplicateQueryParameters = false;\n // state: replaces + with %20 (space in query strings)\n URI.escapeQuerySpace = true;\n // static properties\n URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n URI.idn_expression = /[^a-z0-9\\.-]/i;\n URI.punycode_expression = /(xn--)/i;\n // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n URI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n // credits to Rich Brown\n // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n // specification: http://www.ietf.org/rfc/rfc4291.txt\n URI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n // expression used is \"gruber revised\" (@gruber v2) determined to be the\n // best solution in a regex-golf we did a couple of ages ago at\n // * http://mathiasbynens.be/demo/url-regex\n // * http://rodneyrehm.de/t/url-regex.html\n URI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/ig;\n URI.findUri = {\n // valid \"scheme://\" or \"www.\"\n start: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n // everything up to the next whitespace\n end: /[\\s\\r\\n]|$/,\n // trim trailing punctuation captured by end RegExp\n trim: /[`!()\\[\\]{};:'\".,<>?«»“”„‘’]+$/\n };\n // http://www.iana.org/assignments/uri-schemes.html\n // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n URI.defaultPorts = {\n http: '80',\n https: '443',\n ftp: '21',\n gopher: '70',\n ws: '80',\n wss: '443'\n };\n // allowed hostname characters according to RFC 3986\n // ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . -\n URI.invalid_hostname_characters = /[^a-zA-Z0-9\\.-]/;\n // map DOM Elements to their URI attribute\n URI.domAttributes = {\n 'a': 'href',\n 'blockquote': 'cite',\n 'link': 'href',\n 'base': 'href',\n 'script': 'src',\n 'form': 'action',\n 'img': 'src',\n 'area': 'href',\n 'iframe': 'src',\n 'embed': 'src',\n 'source': 'src',\n 'track': 'src',\n 'input': 'src', // but only if type=\"image\"\n 'audio': 'src',\n 'video': 'src'\n };\n URI.getDomAttribute = function(node) {\n if (!node || !node.nodeName) {\n return undefined;\n }\n\n var nodeName = node.nodeName.toLowerCase();\n // should only expose src for type=\"image\"\n if (nodeName === 'input' && node.type !== 'image') {\n return undefined;\n }\n\n return URI.domAttributes[nodeName];\n };\n\n function escapeForDumbFirefox36(value) {\n // https://github.com/medialize/URI.js/issues/91\n return escape(value);\n }\n\n // encoding / decoding according to RFC3986\n function strictEncodeURIComponent(string) {\n // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(string)\n .replace(/[!'()*]/g, escapeForDumbFirefox36)\n .replace(/\\*/g, '%2A');\n }\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n URI.iso8859 = function() {\n URI.encode = escape;\n URI.decode = unescape;\n };\n URI.unicode = function() {\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n };\n URI.characters = {\n pathname: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n map: {\n // -._~!'()*\n '%24': '$',\n '%26': '&',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%3A': ':',\n '%40': '@'\n }\n },\n decode: {\n expression: /[\\/\\?#]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23'\n }\n }\n },\n reserved: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n map: {\n // gen-delims\n '%3A': ':',\n '%2F': '/',\n '%3F': '?',\n '%23': '#',\n '%5B': '[',\n '%5D': ']',\n '%40': '@',\n // sub-delims\n '%21': '!',\n '%24': '$',\n '%26': '&',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '='\n }\n }\n },\n urnpath: {\n // The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n // for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n // note that the colon character is not featured in the encoding map; this is because URI.js\n // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n // should not appear unencoded in a segment itself.\n // See also the note above about RFC3986 and capitalalized hex digits.\n encode: {\n expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n map: {\n '%21': '!',\n '%24': '$',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%40': '@'\n }\n },\n // These characters are the characters called out by RFC2141 as \"reserved\" characters that\n // should never appear in a URN, plus the colon character (see note above).\n decode: {\n expression: /[\\/\\?#:]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23',\n ':': '%3A'\n }\n }\n }\n };\n URI.encodeQuery = function(string, escapeQuerySpace) {\n var escaped = URI.encode(string + '');\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n };\n URI.decodeQuery = function(string, escapeQuerySpace) {\n string += '';\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n try {\n return URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n } catch(e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n // generate encode/decode path functions\n var _parts = {'encode':'encode', 'decode':'decode'};\n var _part;\n var generateAccessor = function(_group, _part) {\n return function(string) {\n try {\n return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) {\n return URI.characters[_group][_part].map[c];\n });\n } catch (e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n };\n\n for (_part in _parts) {\n URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n }\n\n var generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) {\n return function(string) {\n // Why pass in names of functions, rather than the function objects themselves? The\n // definitions of some functions (but in particular, URI.decode) will occasionally change due\n // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n // that the functions we use here are \"fresh\".\n var actualCodingFunc;\n if (!_innerCodingFuncName) {\n actualCodingFunc = URI[_codingFuncName];\n } else {\n actualCodingFunc = function(string) {\n return URI[_codingFuncName](URI[_innerCodingFuncName](string));\n };\n }\n\n var segments = (string + '').split(_sep);\n\n for (var i = 0, length = segments.length; i < length; i++) {\n segments[i] = actualCodingFunc(segments[i]);\n }\n\n return segments.join(_sep);\n };\n };\n\n // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n\n URI.encodeReserved = generateAccessor('reserved', 'encode');\n\n URI.parse = function(string, parts) {\n var pos;\n if (!parts) {\n parts = {};\n }\n // [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n // extract fragment\n pos = string.indexOf('#');\n if (pos > -1) {\n // escaping?\n parts.fragment = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract query\n pos = string.indexOf('?');\n if (pos > -1) {\n // escaping?\n parts.query = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract protocol\n if (string.substring(0, 2) === '//') {\n // relative-scheme\n parts.protocol = null;\n string = string.substring(2);\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n pos = string.indexOf(':');\n if (pos > -1) {\n parts.protocol = string.substring(0, pos) || null;\n if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n // : may be within the path\n parts.protocol = undefined;\n } else if (string.substring(pos + 1, pos + 3) === '//') {\n string = string.substring(pos + 3);\n\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n string = string.substring(pos + 1);\n parts.urn = true;\n }\n }\n }\n\n // what's left must be the path\n parts.path = string;\n\n // and we're done\n return parts;\n };\n URI.parseHost = function(string, parts) {\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n // https://github.com/medialize/URI.js/pull/233\n string = string.replace(/\\\\/g, '/');\n\n // extract host:port\n var pos = string.indexOf('/');\n var bracketPos;\n var t;\n\n if (pos === -1) {\n pos = string.length;\n }\n\n if (string.charAt(0) === '[') {\n // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n // IPv6+port in the format [2001:db8::1]:80 (for the time being)\n bracketPos = string.indexOf(']');\n parts.hostname = string.substring(1, bracketPos) || null;\n parts.port = string.substring(bracketPos + 2, pos) || null;\n if (parts.port === '/') {\n parts.port = null;\n }\n } else {\n var firstColon = string.indexOf(':');\n var firstSlash = string.indexOf('/');\n var nextColon = string.indexOf(':', firstColon + 1);\n if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n // IPv6 host contains multiple colons - but no port\n // this notation is actually not allowed by RFC 3986, but we're a liberal parser\n parts.hostname = string.substring(0, pos) || null;\n parts.port = null;\n } else {\n t = string.substring(0, pos).split(':');\n parts.hostname = t[0] || null;\n parts.port = t[1] || null;\n }\n }\n\n if (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n pos++;\n string = '/' + string;\n }\n\n return string.substring(pos) || '/';\n };\n URI.parseAuthority = function(string, parts) {\n string = URI.parseUserinfo(string, parts);\n return URI.parseHost(string, parts);\n };\n URI.parseUserinfo = function(string, parts) {\n // extract username:password\n var firstSlash = string.indexOf('/');\n var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n var t;\n\n // authority@ must come before /path\n if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n t = string.substring(0, pos).split(':');\n parts.username = t[0] ? URI.decode(t[0]) : null;\n t.shift();\n parts.password = t[0] ? URI.decode(t.join(':')) : null;\n string = string.substring(pos + 1);\n } else {\n parts.username = null;\n parts.password = null;\n }\n\n return string;\n };\n URI.parseQuery = function(string, escapeQuerySpace) {\n if (!string) {\n return {};\n }\n\n // throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n string = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n\n if (!string) {\n return {};\n }\n\n var items = {};\n var splits = string.split('&');\n var length = splits.length;\n var v, name, value;\n\n for (var i = 0; i < length; i++) {\n v = splits[i].split('=');\n name = URI.decodeQuery(v.shift(), escapeQuerySpace);\n // no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n\n if (hasOwn.call(items, name)) {\n if (typeof items[name] === 'string' || items[name] === null) {\n items[name] = [items[name]];\n }\n\n items[name].push(value);\n } else {\n items[name] = value;\n }\n }\n\n return items;\n };\n\n URI.build = function(parts) {\n var t = '';\n\n if (parts.protocol) {\n t += parts.protocol + ':';\n }\n\n if (!parts.urn && (t || parts.hostname)) {\n t += '//';\n }\n\n t += (URI.buildAuthority(parts) || '');\n\n if (typeof parts.path === 'string') {\n if (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') {\n t += '/';\n }\n\n t += parts.path;\n }\n\n if (typeof parts.query === 'string' && parts.query) {\n t += '?' + parts.query;\n }\n\n if (typeof parts.fragment === 'string' && parts.fragment) {\n t += '#' + parts.fragment;\n }\n return t;\n };\n URI.buildHost = function(parts) {\n var t = '';\n\n if (!parts.hostname) {\n return '';\n } else if (URI.ip6_expression.test(parts.hostname)) {\n t += '[' + parts.hostname + ']';\n } else {\n t += parts.hostname;\n }\n\n if (parts.port) {\n t += ':' + parts.port;\n }\n\n return t;\n };\n URI.buildAuthority = function(parts) {\n return URI.buildUserinfo(parts) + URI.buildHost(parts);\n };\n URI.buildUserinfo = function(parts) {\n var t = '';\n\n if (parts.username) {\n t += URI.encode(parts.username);\n\n if (parts.password) {\n t += ':' + URI.encode(parts.password);\n }\n\n t += '@';\n }\n\n return t;\n };\n URI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) {\n // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed\n // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n // URI.js treats the query string as being application/x-www-form-urlencoded\n // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n var t = '';\n var unique, key, i, length;\n for (key in data) {\n if (hasOwn.call(data, key) && key) {\n if (isArray(data[key])) {\n unique = {};\n for (i = 0, length = data[key].length; i < length; i++) {\n if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n if (duplicateQueryParameters !== true) {\n unique[data[key][i] + ''] = true;\n }\n }\n }\n } else if (data[key] !== undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n }\n }\n }\n\n return t.substring(1);\n };\n URI.buildQueryParameter = function(name, value, escapeQuerySpace) {\n // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n // don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n };\n\n URI.addQuery = function(data, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.addQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (data[name] === undefined) {\n data[name] = value;\n return;\n } else if (typeof data[name] === 'string') {\n data[name] = [data[name]];\n }\n\n if (!isArray(value)) {\n value = [value];\n }\n\n data[name] = (data[name] || []).concat(value);\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n };\n URI.removeQuery = function(data, name, value) {\n var i, length, key;\n\n if (isArray(name)) {\n for (i = 0, length = name.length; i < length; i++) {\n data[name[i]] = undefined;\n }\n } else if (getType(name) === 'RegExp') {\n for (key in data) {\n if (name.test(key)) {\n data[key] = undefined;\n }\n }\n } else if (typeof name === 'object') {\n for (key in name) {\n if (hasOwn.call(name, key)) {\n URI.removeQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (value !== undefined) {\n if (getType(value) === 'RegExp') {\n if (!isArray(data[name]) && value.test(data[name])) {\n data[name] = undefined;\n } else {\n data[name] = filterArrayValues(data[name], value);\n }\n } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n data[name] = undefined;\n } else if (isArray(data[name])) {\n data[name] = filterArrayValues(data[name], value);\n }\n } else {\n data[name] = undefined;\n }\n } else {\n throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n }\n };\n URI.hasQuery = function(data, name, value, withinArray) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n if (!URI.hasQuery(data, key, name[key])) {\n return false;\n }\n }\n }\n\n return true;\n } else if (typeof name !== 'string') {\n throw new TypeError('URI.hasQuery() accepts an object, string as the name parameter');\n }\n\n switch (getType(value)) {\n case 'Undefined':\n // true if exists (but may be empty)\n return name in data; // data[name] !== undefined;\n\n case 'Boolean':\n // true if exists and non-empty\n var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n return value === _booly;\n\n case 'Function':\n // allow complex comparison\n return !!value(data[name], name, data);\n\n case 'Array':\n if (!isArray(data[name])) {\n return false;\n }\n\n var op = withinArray ? arrayContains : arraysEqual;\n return op(data[name], value);\n\n case 'RegExp':\n if (!isArray(data[name])) {\n return Boolean(data[name] && data[name].match(value));\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n case 'Number':\n value = String(value);\n /* falls through */\n case 'String':\n if (!isArray(data[name])) {\n return data[name] === value;\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n default:\n throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n }\n };\n\n\n URI.commonPath = function(one, two) {\n var length = Math.min(one.length, two.length);\n var pos;\n\n // find first non-matching character\n for (pos = 0; pos < length; pos++) {\n if (one.charAt(pos) !== two.charAt(pos)) {\n pos--;\n break;\n }\n }\n\n if (pos < 1) {\n return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n }\n\n // revert to last /\n if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n pos = one.substring(0, pos).lastIndexOf('/');\n }\n\n return one.substring(0, pos + 1);\n };\n\n URI.withinString = function(string, callback, options) {\n options || (options = {});\n var _start = options.start || URI.findUri.start;\n var _end = options.end || URI.findUri.end;\n var _trim = options.trim || URI.findUri.trim;\n var _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n\n _start.lastIndex = 0;\n while (true) {\n var match = _start.exec(string);\n if (!match) {\n break;\n }\n\n var start = match.index;\n if (options.ignoreHtml) {\n // attribut(e=[\"']?$)\n var attributeOpen = string.slice(Math.max(start - 3, 0), start);\n if (attributeOpen && _attributeOpen.test(attributeOpen)) {\n continue;\n }\n }\n\n var end = start + string.slice(start).search(_end);\n var slice = string.slice(start, end).replace(_trim, '');\n if (options.ignore && options.ignore.test(slice)) {\n continue;\n }\n\n end = start + slice.length;\n var result = callback(slice, start, end, string);\n string = string.slice(0, start) + result + string.slice(end);\n _start.lastIndex = start + result.length;\n }\n\n _start.lastIndex = 0;\n return string;\n };\n\n URI.ensureValidHostname = function(v) {\n // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n // they are not part of DNS and therefore ignored by URI.js\n\n if (v.match(URI.invalid_hostname_characters)) {\n // test punycode\n if (!punycode) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-] and Punycode.js is not available');\n }\n\n if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n }\n };\n\n // noConflict\n URI.noConflict = function(removeAll) {\n if (removeAll) {\n var unconflicted = {\n URI: this.noConflict()\n };\n\n if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n unconflicted.URITemplate = root.URITemplate.noConflict();\n }\n\n if (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n unconflicted.IPv6 = root.IPv6.noConflict();\n }\n\n if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n }\n\n return unconflicted;\n } else if (root.URI === this) {\n root.URI = _URI;\n }\n\n return this;\n };\n\n p.build = function(deferBuild) {\n if (deferBuild === true) {\n this._deferred_build = true;\n } else if (deferBuild === undefined || this._deferred_build) {\n this._string = URI.build(this._parts);\n this._deferred_build = false;\n }\n\n return this;\n };\n\n p.clone = function() {\n return new URI(this);\n };\n\n p.valueOf = p.toString = function() {\n return this.build(false)._string;\n };\n\n\n function generateSimpleAccessor(_part){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n this._parts[_part] = v || null;\n this.build(!build);\n return this;\n }\n };\n }\n\n function generatePrefixAccessor(_part, _key){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n if (v !== null) {\n v = v + '';\n if (v.charAt(0) === _key) {\n v = v.substring(1);\n }\n }\n\n this._parts[_part] = v;\n this.build(!build);\n return this;\n }\n };\n }\n\n p.protocol = generateSimpleAccessor('protocol');\n p.username = generateSimpleAccessor('username');\n p.password = generateSimpleAccessor('password');\n p.hostname = generateSimpleAccessor('hostname');\n p.port = generateSimpleAccessor('port');\n p.query = generatePrefixAccessor('query', '?');\n p.fragment = generatePrefixAccessor('fragment', '#');\n\n p.search = function(v, build) {\n var t = this.query(v, build);\n return typeof t === 'string' && t.length ? ('?' + t) : t;\n };\n p.hash = function(v, build) {\n var t = this.fragment(v, build);\n return typeof t === 'string' && t.length ? ('#' + t) : t;\n };\n\n p.pathname = function(v, build) {\n if (v === undefined || v === true) {\n var res = this._parts.path || (this._parts.hostname ? '/' : '');\n return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n } else {\n if (this._parts.urn) {\n this._parts.path = v ? URI.recodeUrnPath(v) : '';\n } else {\n this._parts.path = v ? URI.recodePath(v) : '/';\n }\n this.build(!build);\n return this;\n }\n };\n p.path = p.pathname;\n p.href = function(href, build) {\n var key;\n\n if (href === undefined) {\n return this.toString();\n }\n\n this._string = '';\n this._parts = URI._parts();\n\n var _URI = href instanceof URI;\n var _object = typeof href === 'object' && (href.hostname || href.path || href.pathname);\n if (href.nodeName) {\n var attribute = URI.getDomAttribute(href);\n href = href[attribute] || '';\n _object = false;\n }\n\n // window.location is reported to be an object, but it's not the sort\n // of object we're looking for:\n // * location.protocol ends with a colon\n // * location.query != object.search\n // * location.hash != object.fragment\n // simply serializing the unknown object should do the trick\n // (for location, not for everything...)\n if (!_URI && _object && href.pathname !== undefined) {\n href = href.toString();\n }\n\n if (typeof href === 'string' || href instanceof String) {\n this._parts = URI.parse(String(href), this._parts);\n } else if (_URI || _object) {\n var src = _URI ? href._parts : href;\n for (key in src) {\n if (hasOwn.call(this._parts, key)) {\n this._parts[key] = src[key];\n }\n }\n } else {\n throw new TypeError('invalid input');\n }\n\n this.build(!build);\n return this;\n };\n\n // identification accessors\n p.is = function(what) {\n var ip = false;\n var ip4 = false;\n var ip6 = false;\n var name = false;\n var sld = false;\n var idn = false;\n var punycode = false;\n var relative = !this._parts.urn;\n\n if (this._parts.hostname) {\n relative = false;\n ip4 = URI.ip4_expression.test(this._parts.hostname);\n ip6 = URI.ip6_expression.test(this._parts.hostname);\n ip = ip4 || ip6;\n name = !ip;\n sld = name && SLD && SLD.has(this._parts.hostname);\n idn = name && URI.idn_expression.test(this._parts.hostname);\n punycode = name && URI.punycode_expression.test(this._parts.hostname);\n }\n\n switch (what.toLowerCase()) {\n case 'relative':\n return relative;\n\n case 'absolute':\n return !relative;\n\n // hostname identification\n case 'domain':\n case 'name':\n return name;\n\n case 'sld':\n return sld;\n\n case 'ip':\n return ip;\n\n case 'ip4':\n case 'ipv4':\n case 'inet4':\n return ip4;\n\n case 'ip6':\n case 'ipv6':\n case 'inet6':\n return ip6;\n\n case 'idn':\n return idn;\n\n case 'url':\n return !this._parts.urn;\n\n case 'urn':\n return !!this._parts.urn;\n\n case 'punycode':\n return punycode;\n }\n\n return null;\n };\n\n // component specific input validation\n var _protocol = p.protocol;\n var _port = p.port;\n var _hostname = p.hostname;\n\n p.protocol = function(v, build) {\n if (v !== undefined) {\n if (v) {\n // accept trailing ://\n v = v.replace(/:(\\/\\/)?$/, '');\n\n if (!v.match(URI.protocol_expression)) {\n throw new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n }\n }\n }\n return _protocol.call(this, v, build);\n };\n p.scheme = p.protocol;\n p.port = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n if (v === 0) {\n v = null;\n }\n\n if (v) {\n v += '';\n if (v.charAt(0) === ':') {\n v = v.substring(1);\n }\n\n if (v.match(/[^0-9]/)) {\n throw new TypeError('Port \"' + v + '\" contains characters other than [0-9]');\n }\n }\n }\n return _port.call(this, v, build);\n };\n p.hostname = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n var x = {};\n var res = URI.parseHost(v, x);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n v = x.hostname;\n }\n return _hostname.call(this, v, build);\n };\n\n // compound accessors\n p.origin = function(v, build) {\n var parts;\n\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var protocol = this.protocol();\n var authority = this.authority();\n if (!authority) return '';\n return (protocol ? protocol + '://' : '') + this.authority();\n } else {\n var origin = URI(v);\n this\n .protocol(origin.protocol())\n .authority(origin.authority())\n .build(!build);\n return this;\n }\n };\n p.host = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildHost(this._parts) : '';\n } else {\n var res = URI.parseHost(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.authority = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n } else {\n var res = URI.parseAuthority(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.userinfo = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n if (!this._parts.username) {\n return '';\n }\n\n var t = URI.buildUserinfo(this._parts);\n return t.substring(0, t.length -1);\n } else {\n if (v[v.length-1] !== '@') {\n v += '@';\n }\n\n URI.parseUserinfo(v, this._parts);\n this.build(!build);\n return this;\n }\n };\n p.resource = function(v, build) {\n var parts;\n\n if (v === undefined) {\n return this.path() + this.search() + this.hash();\n }\n\n parts = URI.parse(v);\n this._parts.path = parts.path;\n this._parts.query = parts.query;\n this._parts.fragment = parts.fragment;\n this.build(!build);\n return this;\n };\n\n // fraction accessors\n p.subdomain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n // convenience, return \"www\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // grab domain and add another segment\n var end = this._parts.hostname.length - this.domain().length - 1;\n return this._parts.hostname.substring(0, end) || '';\n } else {\n var e = this._parts.hostname.length - this.domain().length;\n var sub = this._parts.hostname.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(sub));\n\n if (v && v.charAt(v.length - 1) !== '.') {\n v += '.';\n }\n\n if (v) {\n URI.ensureValidHostname(v);\n }\n\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.domain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // convenience, return \"example.org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // if hostname consists of 1 or 2 segments, it must be the domain\n var t = this._parts.hostname.match(/\\./g);\n if (t && t.length < 2) {\n return this._parts.hostname;\n }\n\n // grab tld and add another segment\n var end = this._parts.hostname.length - this.tld(build).length - 1;\n end = this._parts.hostname.lastIndexOf('.', end -1) + 1;\n return this._parts.hostname.substring(end) || '';\n } else {\n if (!v) {\n throw new TypeError('cannot set domain empty');\n }\n\n URI.ensureValidHostname(v);\n\n if (!this._parts.hostname || this.is('IP')) {\n this._parts.hostname = v;\n } else {\n var replace = new RegExp(escapeRegEx(this.domain()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.tld = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // return \"org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n var pos = this._parts.hostname.lastIndexOf('.');\n var tld = this._parts.hostname.substring(pos + 1);\n\n if (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n return SLD.get(this._parts.hostname) || tld;\n }\n\n return tld;\n } else {\n var replace;\n\n if (!v) {\n throw new TypeError('cannot set TLD empty');\n } else if (v.match(/[^a-zA-Z0-9-]/)) {\n if (SLD && SLD.is(v)) {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n } else {\n throw new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n }\n } else if (!this._parts.hostname || this.is('IP')) {\n throw new ReferenceError('cannot set TLD on non-domain host');\n } else {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.directory = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path && !this._parts.hostname) {\n return '';\n }\n\n if (this._parts.path === '/') {\n return '/';\n }\n\n var end = this._parts.path.length - this.filename().length - 1;\n var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n\n return v ? URI.decodePath(res) : res;\n\n } else {\n var e = this._parts.path.length - this.filename().length;\n var directory = this._parts.path.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(directory));\n\n // fully qualifier directories begin with a slash\n if (!this.is('relative')) {\n if (!v) {\n v = '/';\n }\n\n if (v.charAt(0) !== '/') {\n v = '/' + v;\n }\n }\n\n // directories always end with a slash\n if (v && v.charAt(v.length - 1) !== '/') {\n v += '/';\n }\n\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.filename = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var pos = this._parts.path.lastIndexOf('/');\n var res = this._parts.path.substring(pos+1);\n\n return v ? URI.decodePathSegment(res) : res;\n } else {\n var mutatedDirectory = false;\n\n if (v.charAt(0) === '/') {\n v = v.substring(1);\n }\n\n if (v.match(/\\.?\\//)) {\n mutatedDirectory = true;\n }\n\n var replace = new RegExp(escapeRegEx(this.filename()) + '$');\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n\n if (mutatedDirectory) {\n this.normalizePath(build);\n } else {\n this.build(!build);\n }\n\n return this;\n }\n };\n p.suffix = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var filename = this.filename();\n var pos = filename.lastIndexOf('.');\n var s, res;\n\n if (pos === -1) {\n return '';\n }\n\n // suffix may only contain alnum characters (yup, I made this up.)\n s = filename.substring(pos+1);\n res = (/^[a-z0-9%]+$/i).test(s) ? s : '';\n return v ? URI.decodePathSegment(res) : res;\n } else {\n if (v.charAt(0) === '.') {\n v = v.substring(1);\n }\n\n var suffix = this.suffix();\n var replace;\n\n if (!suffix) {\n if (!v) {\n return this;\n }\n\n this._parts.path += '.' + URI.recodePath(v);\n } else if (!v) {\n replace = new RegExp(escapeRegEx('.' + suffix) + '$');\n } else {\n replace = new RegExp(escapeRegEx(suffix) + '$');\n }\n\n if (replace) {\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.segment = function(segment, v, build) {\n var separator = this._parts.urn ? ':' : '/';\n var path = this.path();\n var absolute = path.substring(0, 1) === '/';\n var segments = path.split(separator);\n\n if (segment !== undefined && typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (segment !== undefined && typeof segment !== 'number') {\n throw new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n }\n\n if (absolute) {\n segments.shift();\n }\n\n if (segment < 0) {\n // allow negative indexes to address from the end\n segment = Math.max(segments.length + segment, 0);\n }\n\n if (v === undefined) {\n /*jshint laxbreak: true */\n return segment === undefined\n ? segments\n : segments[segment];\n /*jshint laxbreak: false */\n } else if (segment === null || segments[segment] === undefined) {\n if (isArray(v)) {\n segments = [];\n // collapse empty elements within array\n for (var i=0, l=v.length; i < l; i++) {\n if (!v[i].length && (!segments.length || !segments[segments.length -1].length)) {\n continue;\n }\n\n if (segments.length && !segments[segments.length -1].length) {\n segments.pop();\n }\n\n segments.push(trimSlashes(v[i]));\n }\n } else if (v || typeof v === 'string') {\n v = trimSlashes(v);\n if (segments[segments.length -1] === '') {\n // empty trailing elements have to be overwritten\n // to prevent results such as /foo//bar\n segments[segments.length -1] = v;\n } else {\n segments.push(v);\n }\n }\n } else {\n if (v) {\n segments[segment] = trimSlashes(v);\n } else {\n segments.splice(segment, 1);\n }\n }\n\n if (absolute) {\n segments.unshift('');\n }\n\n return this.path(segments.join(separator), build);\n };\n p.segmentCoded = function(segment, v, build) {\n var segments, i, l;\n\n if (typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (v === undefined) {\n segments = this.segment(segment, v, build);\n if (!isArray(segments)) {\n segments = segments !== undefined ? URI.decode(segments) : undefined;\n } else {\n for (i = 0, l = segments.length; i < l; i++) {\n segments[i] = URI.decode(segments[i]);\n }\n }\n\n return segments;\n }\n\n if (!isArray(v)) {\n v = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v;\n } else {\n for (i = 0, l = v.length; i < l; i++) {\n v[i] = URI.encode(v[i]);\n }\n }\n\n return this.segment(segment, v, build);\n };\n\n // mutating query string\n var q = p.query;\n p.query = function(v, build) {\n if (v === true) {\n return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n } else if (typeof v === 'function') {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n var result = v.call(this, data);\n this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else if (v !== undefined && typeof v !== 'string') {\n this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else {\n return q.call(this, v, build);\n }\n };\n p.setQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\n if (typeof name === 'string' || name instanceof String) {\n data[name] = value !== undefined ? value : null;\n } else if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n data[key] = name[key];\n }\n }\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.addQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.addQuery(data, name, value === undefined ? null : value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.removeQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.removeQuery(data, name, value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.hasQuery = function(name, value, withinArray) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n return URI.hasQuery(data, name, value, withinArray);\n };\n p.setSearch = p.setQuery;\n p.addSearch = p.addQuery;\n p.removeSearch = p.removeQuery;\n p.hasSearch = p.hasQuery;\n\n // sanitizing URLs\n p.normalize = function() {\n if (this._parts.urn) {\n return this\n .normalizeProtocol(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n }\n\n return this\n .normalizeProtocol(false)\n .normalizeHostname(false)\n .normalizePort(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n };\n p.normalizeProtocol = function(build) {\n if (typeof this._parts.protocol === 'string') {\n this._parts.protocol = this._parts.protocol.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeHostname = function(build) {\n if (this._parts.hostname) {\n if (this.is('IDN') && punycode) {\n this._parts.hostname = punycode.toASCII(this._parts.hostname);\n } else if (this.is('IPv6') && IPv6) {\n this._parts.hostname = IPv6.best(this._parts.hostname);\n }\n\n this._parts.hostname = this._parts.hostname.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePort = function(build) {\n // remove port of it's the protocol's default\n if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n this._parts.port = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePath = function(build) {\n var _path = this._parts.path;\n if (!_path) {\n return this;\n }\n\n if (this._parts.urn) {\n this._parts.path = URI.recodeUrnPath(this._parts.path);\n this.build(!build);\n return this;\n }\n\n if (this._parts.path === '/') {\n return this;\n }\n\n var _was_relative;\n var _leadingParents = '';\n var _parent, _pos;\n\n // handle relative paths\n if (_path.charAt(0) !== '/') {\n _was_relative = true;\n _path = '/' + _path;\n }\n\n // handle relative files (as opposed to directories)\n if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n _path += '/';\n }\n\n // resolve simples\n _path = _path\n .replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/')\n .replace(/\\/{2,}/g, '/');\n\n // remember leading parents\n if (_was_relative) {\n _leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n if (_leadingParents) {\n _leadingParents = _leadingParents[0];\n }\n }\n\n // resolve parents\n while (true) {\n _parent = _path.indexOf('/..');\n if (_parent === -1) {\n // no more ../ to resolve\n break;\n } else if (_parent === 0) {\n // top level cannot be relative, skip it\n _path = _path.substring(3);\n continue;\n }\n\n _pos = _path.substring(0, _parent).lastIndexOf('/');\n if (_pos === -1) {\n _pos = _parent;\n }\n _path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n }\n\n // revert to relative\n if (_was_relative && this.is('relative')) {\n _path = _leadingParents + _path.substring(1);\n }\n\n _path = URI.recodePath(_path);\n this._parts.path = _path;\n this.build(!build);\n return this;\n };\n p.normalizePathname = p.normalizePath;\n p.normalizeQuery = function(build) {\n if (typeof this._parts.query === 'string') {\n if (!this._parts.query.length) {\n this._parts.query = null;\n } else {\n this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n }\n\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeFragment = function(build) {\n if (!this._parts.fragment) {\n this._parts.fragment = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeSearch = p.normalizeQuery;\n p.normalizeHash = p.normalizeFragment;\n\n p.iso8859 = function() {\n // expect unicode input, iso8859 output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = escape;\n URI.decode = decodeURIComponent;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.unicode = function() {\n // expect iso8859 input, unicode output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = strictEncodeURIComponent;\n URI.decode = unescape;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.readable = function() {\n var uri = this.clone();\n // removing username, password, because they shouldn't be displayed according to RFC 3986\n uri.username('').password('').normalize();\n var t = '';\n if (uri._parts.protocol) {\n t += uri._parts.protocol + '://';\n }\n\n if (uri._parts.hostname) {\n if (uri.is('punycode') && punycode) {\n t += punycode.toUnicode(uri._parts.hostname);\n if (uri._parts.port) {\n t += ':' + uri._parts.port;\n }\n } else {\n t += uri.host();\n }\n }\n\n if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n t += '/';\n }\n\n t += uri.path(true);\n if (uri._parts.query) {\n var q = '';\n for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n var kv = (qp[i] || '').split('=');\n q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n\n if (kv[1] !== undefined) {\n q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n }\n }\n t += '?' + q.substring(1);\n }\n\n t += URI.decodeQuery(uri.hash(), true);\n return t;\n };\n\n // resolving relative and absolute URLs\n p.absoluteTo = function(base) {\n var resolved = this.clone();\n var properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n var basedir, i, p;\n\n if (this._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n if (!(base instanceof URI)) {\n base = new URI(base);\n }\n\n if (!resolved._parts.protocol) {\n resolved._parts.protocol = base._parts.protocol;\n }\n\n if (this._parts.hostname) {\n return resolved;\n }\n\n for (i = 0; (p = properties[i]); i++) {\n resolved._parts[p] = base._parts[p];\n }\n\n if (!resolved._parts.path) {\n resolved._parts.path = base._parts.path;\n if (!resolved._parts.query) {\n resolved._parts.query = base._parts.query;\n }\n } else if (resolved._parts.path.substring(-2) === '..') {\n resolved._parts.path += '/';\n }\n\n if (resolved.path().charAt(0) !== '/') {\n basedir = base.directory();\n basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n resolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path;\n resolved.normalizePath();\n }\n\n resolved.build();\n return resolved;\n };\n p.relativeTo = function(base) {\n var relative = this.clone().normalize();\n var relativeParts, baseParts, common, relativePath, basePath;\n\n if (relative._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n base = new URI(base).normalize();\n relativeParts = relative._parts;\n baseParts = base._parts;\n relativePath = relative.path();\n basePath = base.path();\n\n if (relativePath.charAt(0) !== '/') {\n throw new Error('URI is already relative');\n }\n\n if (basePath.charAt(0) !== '/') {\n throw new Error('Cannot calculate a URI relative to another relative URI');\n }\n\n if (relativeParts.protocol === baseParts.protocol) {\n relativeParts.protocol = null;\n }\n\n if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n return relative.build();\n }\n\n if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n return relative.build();\n }\n\n if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n relativeParts.hostname = null;\n relativeParts.port = null;\n } else {\n return relative.build();\n }\n\n if (relativePath === basePath) {\n relativeParts.path = '';\n return relative.build();\n }\n\n // determine common sub path\n common = URI.commonPath(relativePath, basePath);\n\n // If the paths have nothing in common, return a relative URL with the absolute path.\n if (!common) {\n return relative.build();\n }\n\n var parents = baseParts.path\n .substring(common.length)\n .replace(/[^\\/]*$/, '')\n .replace(/.*?\\//g, '../');\n\n relativeParts.path = (parents + relativeParts.path.substring(common.length)) || './';\n\n return relative.build();\n };\n\n // comparing URIs\n p.equals = function(uri) {\n var one = this.clone();\n var two = new URI(uri);\n var one_map = {};\n var two_map = {};\n var checked = {};\n var one_query, two_query, key;\n\n one.normalize();\n two.normalize();\n\n // exact match\n if (one.toString() === two.toString()) {\n return true;\n }\n\n // extract query string\n one_query = one.query();\n two_query = two.query();\n one.query('');\n two.query('');\n\n // definitely not equal if not even non-query parts match\n if (one.toString() !== two.toString()) {\n return false;\n }\n\n // query parameters have the same length, even if they're permuted\n if (one_query.length !== two_query.length) {\n return false;\n }\n\n one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n\n for (key in one_map) {\n if (hasOwn.call(one_map, key)) {\n if (!isArray(one_map[key])) {\n if (one_map[key] !== two_map[key]) {\n return false;\n }\n } else if (!arraysEqual(one_map[key], two_map[key])) {\n return false;\n }\n\n checked[key] = true;\n }\n }\n\n for (key in two_map) {\n if (hasOwn.call(two_map, key)) {\n if (!checked[key]) {\n // two contains a parameter not present in one\n return false;\n }\n }\n }\n\n return true;\n };\n\n // state\n p.duplicateQueryParameters = function(v) {\n this._parts.duplicateQueryParameters = !!v;\n return this;\n };\n\n p.escapeQuerySpace = function(v) {\n this._parts.escapeQuerySpace = !!v;\n return this;\n };\n\n return URI;\n}));\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar Spine = require('./spine');\nvar Locations = require('./locations');\nvar Parser = require('./parser');\nvar Navigation = require('./navigation');\nvar Rendition = require('./rendition');\nvar Continuous = require('./continuous');\nvar Paginate = require('./paginate');\nvar Unarchive = require('./unarchive');\nvar request = require('./request');\n\nfunction Book(_url, options){\n // Promises\n this.opening = new RSVP.defer();\n this.opened = this.opening.promise;\n this.isOpen = false;\n\n this.url = undefined;\n\n this.loading = {\n manifest: new RSVP.defer(),\n spine: new RSVP.defer(),\n metadata: new RSVP.defer(),\n cover: new RSVP.defer(),\n navigation: new RSVP.defer(),\n pageList: new RSVP.defer()\n };\n\n this.loaded = {\n manifest: this.loading.manifest.promise,\n spine: this.loading.spine.promise,\n metadata: this.loading.metadata.promise,\n cover: this.loading.cover.promise,\n navigation: this.loading.navigation.promise,\n pageList: this.loading.pageList.promise\n };\n\n this.ready = RSVP.hash(this.loaded);\n\n // Queue for methods used before opening\n this.isRendered = false;\n // this._q = core.queue(this);\n\n this.request = this.requestMethod.bind(this);\n\n this.spine = new Spine(this.request);\n this.locations = new Locations(this.spine, this.request);\n\n if(_url) {\n this.open(_url);\n }\n};\n\nBook.prototype.open = function(_url){\n var uri;\n var parse = new Parser();\n var epubPackage;\n var epubContainer;\n var book = this;\n var containerPath = \"META-INF/container.xml\";\n var location;\n\n if(!_url) {\n this.opening.resolve(this);\n return this.opened;\n }\n\n // Reuse parsed url or create a new uri object\n // if(typeof(_url) === \"object\") {\n // uri = _url;\n // } else {\n // uri = core.uri(_url);\n // }\n uri = URI(_url);\n this.url = _url;\n\n // Find path to the Container\n if(uri.suffix() === \"opf\") {\n // Direct link to package, no container\n this.packageUrl = _url;\n this.containerUrl = '';\n\n if(uri.origin()) {\n this.baseUrl = uri.origin() + \"/\" + uri.directory() + \"/\";\n } else if(window){\n this.baseUrl = uri.absoluteTo(window.location.href).directory() + \"/\";\n } else {\n this.baseUrl = uri.directory() + \"/\";\n }\n\n epubPackage = this.request(this.packageUrl);\n\n } else if(this.isArchivedUrl(uri)) {\n // Book is archived\n this.url = '/';\n this.containerUrl = URI(containerPath).absoluteTo(this.url).toString();\n\n epubContainer = this.unarchive(_url).\n then(function() {\n return this.request(this.containerUrl);\n }.bind(this));\n\n }\n // Find the path to the Package from the container\n else if (!uri.suffix()) {\n\n this.containerUrl = this.url + containerPath;\n\n epubContainer = this.request(this.containerUrl);\n }\n\n if (epubContainer) {\n epubPackage = epubContainer.\n then(function(containerXml){\n return parse.container(containerXml); // Container has path to content\n }).\n then(function(paths){\n var packageUri = URI(paths.packagePath);\n book.packageUrl = packageUri.absoluteTo(book.url).toString();\n book.encoding = paths.encoding;\n\n // Set Url relative to the content\n if(packageUri.origin()) {\n book.baseUrl = packageUri.origin() + \"/\" + packageUri.directory() + \"/\";\n } else if(window && !book.isArchivedUrl(uri)){\n book.baseUrl = packageUri.absoluteTo(window.location.href).directory() + \"/\";\n } else {\n book.baseUrl = \"/\" + packageUri.directory() + \"/\";\n }\n\n return book.request(book.packageUrl);\n }).catch(function(error) {\n // handle errors in either of the two requests\n console.error(\"Could not load book at: \" + (this.packageUrl || this.containerPath));\n book.trigger(\"book:loadFailed\", (this.packageUrl || this.containerPath));\n book.opening.reject(error);\n });\n }\n\n\n epubPackage.then(function(packageXml) {\n // Get package information from epub opf\n book.unpack(packageXml);\n\n // Resolve promises\n book.loading.manifest.resolve(book.package.manifest);\n book.loading.metadata.resolve(book.package.metadata);\n book.loading.spine.resolve(book.spine);\n book.loading.cover.resolve(book.cover);\n\n book.isOpen = true;\n\n // Clear queue of any waiting book request\n\n // Resolve book opened promise\n book.opening.resolve(book);\n\n }).catch(function(error) {\n // handle errors in parsing the book\n console.error(error.message, error.stack);\n book.opening.reject(error);\n });\n\n return this.opened;\n};\n\nBook.prototype.unpack = function(packageXml){\n var book = this,\n parse = new Parser();\n\n book.package = parse.packageContents(packageXml); // Extract info from contents\n book.package.baseUrl = book.baseUrl; // Provides a url base for resolving paths\n\n this.spine.load(book.package);\n\n book.navigation = new Navigation(book.package, this.request);\n book.navigation.load().then(function(toc){\n book.toc = toc;\n book.loading.navigation.resolve(book.toc);\n });\n\n // //-- Set Global Layout setting based on metadata\n // MOVE TO RENDER\n // book.globalLayoutProperties = book.parseLayoutProperties(book.package.metadata);\n\n book.cover = URI(book.package.coverPath).absoluteTo(book.baseUrl).toString();\n};\n\n// Alias for book.spine.get\nBook.prototype.section = function(target) {\n return this.spine.get(target);\n};\n\n// Sugar to render a book\nBook.prototype.renderTo = function(element, options) {\n var renderMethod = (options && options.method) ?\n options.method :\n \"rendition\";\n var Renderer = require('./'+renderMethod);\n\n this.rendition = new Renderer(this, options);\n this.rendition.attachTo(element);\n\n return this.rendition;\n};\n\nBook.prototype.requestMethod = function(_url) {\n // Switch request methods\n if(this.archive) {\n return this.archive.request(_url);\n } else {\n return request(_url, null, this.requestCredentials, this.requestHeaders);\n }\n\n};\n\nBook.prototype.setRequestCredentials = function(_credentials) {\n this.requestCredentials = _credentials;\n};\n\nBook.prototype.setRequestHeaders = function(_headers) {\n this.requestHeaders = _headers;\n};\n\nBook.prototype.unarchive = function(bookUrl){\n\tthis.archive = new Unarchive();\n\treturn this.archive.open(bookUrl);\n};\n\n//-- Checks if url has a .epub or .zip extension, or is ArrayBuffer (of zip/epub)\nBook.prototype.isArchivedUrl = function(bookUrl){\n var uri;\n var extension;\n\n if (bookUrl instanceof ArrayBuffer) {\n\t\treturn true;\n\t}\n\n // Reuse parsed url or create a new uri object\n // if(typeof(bookUrl) === \"object\") {\n // uri = bookUrl;\n // } else {\n // uri = core.uri(bookUrl);\n // }\n uri = URI(bookUrl);\n extension = uri.suffix();\n\n\tif(extension && (extension == \"epub\" || extension == \"zip\")){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n//-- Returns the cover\nBook.prototype.coverUrl = function(){\n\tvar retrieved = this.loaded.cover.\n\t\tthen(function(url) {\n\t\t\tif(this.archive) {\n\t\t\t\treturn this.archive.createUrl(this.cover);\n\t\t\t}else{\n\t\t\t\treturn this.cover;\n\t\t\t}\n\t\t}.bind(this));\n\n\n\n\treturn retrieved;\n};\n\nmodule.exports = Book;\n\n//-- Enable binding events to book\nRSVP.EventTarget.mixin(Book.prototype);\n\n//-- Handle RSVP Errors\nRSVP.on('error', function(event) {\n console.error(event);\n});\n\nRSVP.configure('instrument', true); //-- true | will logging out all RSVP rejections\n// RSVP.on('created', listener);\n// RSVP.on('chained', listener);\n// RSVP.on('fulfilled', listener);\nRSVP.on('rejected', function(event){\n console.error(event.detail.message, event.detail.stack);\n});\n","var RSVP = require('rsvp');\nvar core = require('./core');\nvar Rendition = require('./rendition');\nvar View = require('./view');\n\nfunction Continuous(book, options) {\n\n\tRendition.apply(this, arguments); // call super constructor.\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\tinfinite: true,\n\t\toverflow: \"auto\",\n\t\taxis: \"vertical\",\n\t\toffset: 500,\n\t\toffsetDelta: 250\n\t});\n\n\tcore.extend(this.settings, options);\n\n\tif(this.settings.hidden) {\n\t\tthis.wrapper = this.wrap(this.container);\n\t}\n\n\n};\n\n// subclass extends superclass\nContinuous.prototype = Object.create(Rendition.prototype);\nContinuous.prototype.constructor = Continuous;\n\nContinuous.prototype.attachListeners = function(){\n\n\t// Listen to window for resize event if width or height is set to a percent\n\tif(!core.isNumber(this.settings.width) ||\n\t\t !core.isNumber(this.settings.height) ) {\n\t\twindow.addEventListener(\"resize\", this.onResized.bind(this), false);\n\t}\n\n\n\tif(this.settings.infinite) {\n\t\tthis.start();\n\t}\n\n\n};\n\nContinuous.prototype.parseTarget = function(target){\n\tif(this.epubcfi.isCfiString(target)) {\n cfi = this.epubcfi.parse(target);\n spinePos = cfi.spinePos;\n section = this.book.spine.get(spinePos);\n } else {\n section = this.book.spine.get(target);\n }\n};\n\nContinuous.prototype.moveTo = function(offset){\n // var bounds = this.bounds();\n // var dist = Math.floor(offset.top / bounds.height) * bounds.height;\n return this.check(\n\t\toffset.left+this.settings.offset,\n\t\toffset.top+this.settings.offset)\n\t\t.then(function(){\n\n\t if(this.settings.axis === \"vertical\") {\n\t this.scrollBy(0, offset.top);\n\t } else {\n\t this.scrollBy(offset.left, 0);\n\t }\n\n\t }.bind(this));\n};\n\nContinuous.prototype.afterDisplayed = function(currView){\n\tvar next = currView.section.next();\n\tvar prev = currView.section.prev();\n\tvar index = this.views.indexOf(currView);\n\tvar prevView, nextView;\n\n\tif(index + 1 === this.views.length && next) {\n\t\tnextView = this.createView(next);\n\t\tthis.q.enqueue(this.append, nextView);\n\t}\n\n\tif(index === 0 && prev) {\n\t\tprevView = this.createView(prev, this.viewSettings);\n\t\tthis.q.enqueue(this.prepend, prevView);\n\t}\n\n\t// this.removeShownListeners(currView);\n\t// currView.onShown = this.afterDisplayed.bind(this);\n\tthis.trigger(\"added\", currView.section);\n\n};\n\n\n// Remove Previous Listeners if present\nContinuous.prototype.removeShownListeners = function(view){\n\n\t// view.off(\"shown\", this.afterDisplayed);\n\t// view.off(\"shown\", this.afterDisplayedAbove);\n\tview.onDisplayed = function(){};\n\n};\n\nContinuous.prototype.append = function(view){\n\n\t// view.on(\"shown\", this.afterDisplayed.bind(this));\n\tview.onDisplayed = this.afterDisplayed.bind(this);\n\n\tthis.views.append(view);\n\n //this.q.enqueue(this.check);\n return this.check();\n};\n\nContinuous.prototype.prepend = function(view){\n\t// view.on(\"shown\", this.afterDisplayedAbove.bind(this));\n\tview.onDisplayed = this.afterDisplayed.bind(this);\n\n\tview.on(\"resized\", this.counter.bind(this));\n\n\tthis.views.prepend(view);\n\n // this.q.enqueue(this.check);\n return this.check();\n};\n\nContinuous.prototype.counter = function(bounds){\n\n\tif(this.settings.axis === \"vertical\") {\n\t\tthis.scrollBy(0, bounds.heightDelta, true);\n\t} else {\n\t\tthis.scrollBy(bounds.widthDelta, 0, true);\n\t}\n\n};\n\nContinuous.prototype.check = function(_offset){\n\tvar checking = new RSVP.defer();\n\tvar container = this.bounds();\n var promises = [];\n var offset = _offset || this.settings.offset;\n\n\tthis.views.each(function(view){\n\t\tvar visible = this.isVisible(view, offset, offset, container);\n\n\t\tif(visible) {\n\n\t\t\tif(!view.displayed && !view.rendering) {\n // console.log(\"render\",view.section.index)\n\t\t\t\t\tpromises.push(this.render(view));\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif(view.displayed) {\n // console.log(\"destroy\", view.section.index)\n this.q.enqueue(view.destroy.bind(view));\n // view.destroy();\n // this.q.enqueue(this.trim);\n clearTimeout(this.trimTimeout);\n this.trimTimeout = setTimeout(function(){\n this.q.enqueue(this.trim);\n }.bind(this), 250);\n\t\t\t}\n\n\t\t}\n\n\t}.bind(this));\n\n\n if(promises.length){\n\n return RSVP.all(promises)\n .then(function(posts) {\n // Check to see if anything new is on screen after rendering\n this.q.enqueue(this.check);\n\n }.bind(this));\n\n } else {\n checking.resolve();\n\n return checking.promise;\n }\n\n};\n\nContinuous.prototype.trim = function(){\n var task = new RSVP.defer();\n var displayed = this.views.displayed();\n var first = displayed[0];\n var last = displayed[displayed.length-1];\n var firstIndex = this.views.indexOf(first);\n var lastIndex = this.views.indexOf(last);\n var above = this.views.slice(0, firstIndex);\n var below = this.views.slice(lastIndex+1);\n\n // Erase all but last above\n for (var i = 0; i < above.length-1; i++) {\n this.erase(above[i], above);\n }\n\n // Erase all except first below\n for (var j = 1; j < below.length; j++) {\n this.erase(below[j]);\n }\n\n task.resolve();\n return task.promise;\n};\n\nContinuous.prototype.erase = function(view, above){ //Trim\n\n\tvar prevTop;\n\tvar prevLeft;\n\n\tif(this.settings.height) {\n \tprevTop = this.container.scrollTop;\n\t\tprevLeft = this.container.scrollLeft;\n } else {\n \tprevTop = window.scrollY;\n\t\tprevLeft = window.scrollX;\n }\n\n\tvar bounds = view.bounds();\n\n\tthis.views.remove(view);\n\n\tif(above) {\n\n\t\tif(this.settings.axis === \"vertical\") {\n\t\t\tthis.scrollTo(0, prevTop - bounds.height, true);\n\t\t} else {\n\t\t\tthis.scrollTo(prevLeft - bounds.width, 0, true);\n\t\t}\n\t}\n\n};\n\nContinuous.prototype.start = function() {\n var scroller;\n\n this.tick = core.requestAnimationFrame;\n\n if(this.settings.height) {\n \tthis.prevScrollTop = this.container.scrollTop;\n \tthis.prevScrollLeft = this.container.scrollLeft;\n } else {\n \tthis.prevScrollTop = window.scrollY;\n\t\tthis.prevScrollLeft = window.scrollX;\n }\n\n this.scrollDeltaVert = 0;\n this.scrollDeltaHorz = 0;\n\n if(this.settings.height) {\n \tscroller = this.container;\n } else {\n \tscroller = window;\n }\n\n window.addEventListener(\"scroll\", function(e){\n if(!this.ignore) {\n this.scrolled = true;\n } else {\n this.ignore = false;\n }\n }.bind(this));\n\n window.addEventListener('unload', function(e){\n this.ignore = true;\n this.destroy();\n }.bind(this));\n\n this.tick.call(window, this.onScroll.bind(this));\n\n this.scrolled = false;\n\n};\n\nContinuous.prototype.onScroll = function(){\n\n if(this.scrolled) {\n\n if(this.settings.height) {\n\t \tscrollTop = this.container.scrollTop;\n\t \tscrollLeft = this.container.scrollLeft;\n\t } else {\n\t \tscrollTop = window.scrollY;\n\t\t\tscrollLeft = window.scrollX;\n\t }\n\n if(!this.ignore) {\n\n\t if((this.scrollDeltaVert === 0 &&\n\t \t this.scrollDeltaHorz === 0) ||\n\t \t this.scrollDeltaVert > this.settings.offsetDelta ||\n\t \t this.scrollDeltaHorz > this.settings.offsetDelta) {\n\n\t\t\t\tthis.q.enqueue(this.check);\n\n\t\t\t\tthis.scrollDeltaVert = 0;\n\t \tthis.scrollDeltaHorz = 0;\n\n\t\t\t\tthis.trigger(\"scroll\", {\n\t\t top: scrollTop,\n\t\t left: scrollLeft\n\t\t });\n\n\t\t\t}\n\n\t\t} else {\n\t this.ignore = false;\n\t\t}\n\n this.scrollDeltaVert += Math.abs(scrollTop-this.prevScrollTop);\n this.scrollDeltaHorz += Math.abs(scrollLeft-this.prevScrollLeft);\n\n\t\tthis.prevScrollTop = scrollTop;\n\t\tthis.prevScrollLeft = scrollLeft;\n\n \tclearTimeout(this.scrollTimeout);\n\t\tthis.scrollTimeout = setTimeout(function(){\n\t\t\tthis.scrollDeltaVert = 0;\n\t this.scrollDeltaHorz = 0;\n\t\t}.bind(this), 150);\n\n\n this.scrolled = false;\n }\n\n this.tick.call(window, this.onScroll.bind(this));\n\n};\n\n\n Continuous.prototype.resizeView = function(view) {\n\n\tif(this.settings.axis === \"horizontal\") {\n\t\tview.lock(\"height\", this.stage.width, this.stage.height);\n\t} else {\n\t\tview.lock(\"width\", this.stage.width, this.stage.height);\n\t}\n\n};\n\nContinuous.prototype.currentLocation = function(){\n var visible = this.visible();\n var startPage, endPage;\n\n var container = this.container.getBoundingClientRect();\n\n if(visible.length === 1) {\n return this.map.page(visible[0]);\n }\n\n if(visible.length > 1) {\n\n startPage = this.map.page(visible[0]);\n endPage = this.map.page(visible[visible.length-1]);\n\n return {\n start: startPage.start,\n end: endPage.end\n };\n }\n\n};\n\n/*\nContinuous.prototype.current = function(what){\n var view, top;\n var container = this.container.getBoundingClientRect();\n var length = this.views.length - 1;\n\n if(this.settings.axis === \"horizontal\") {\n\n for (var i = length; i >= 0; i--) {\n view = this.views[i];\n left = view.position().left;\n\n if(left < container.right) {\n\n if(this._current == view) {\n break;\n }\n\n this._current = view;\n break;\n }\n }\n\n } else {\n\n for (var i = length; i >= 0; i--) {\n view = this.views[i];\n top = view.bounds().top;\n if(top < container.bottom) {\n\n if(this._current == view) {\n break;\n }\n\n this._current = view;\n\n break;\n }\n }\n\n }\n\n return this._current;\n};\n*/\n\nmodule.exports = Continuous;\n","var RSVP = require('rsvp');\n\nvar requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;\n/*\n//-- Parse the different parts of a url, returning a object\nfunction uri(url){\n var uri = {\n protocol : '',\n host : '',\n path : '',\n origin : '',\n directory : '',\n base : '',\n filename : '',\n extension : '',\n fragment : '',\n href : url\n },\n doubleSlash = url.indexOf('://'),\n search = url.indexOf('?'),\n fragment = url.indexOf(\"#\"),\n withoutProtocol,\n dot,\n firstSlash;\n\n if(fragment != -1) {\n uri.fragment = url.slice(fragment + 1);\n url = url.slice(0, fragment);\n }\n\n if(search != -1) {\n uri.search = url.slice(search + 1);\n url = url.slice(0, search);\n href = url;\n }\n\n if(doubleSlash != -1) {\n uri.protocol = url.slice(0, doubleSlash);\n withoutProtocol = url.slice(doubleSlash+3);\n firstSlash = withoutProtocol.indexOf('/');\n\n if(firstSlash === -1) {\n uri.host = uri.path;\n uri.path = \"\";\n } else {\n uri.host = withoutProtocol.slice(0, firstSlash);\n uri.path = withoutProtocol.slice(firstSlash);\n }\n\n\n uri.origin = uri.protocol + \"://\" + uri.host;\n\n uri.directory = folder(uri.path);\n\n uri.base = uri.origin + uri.directory;\n // return origin;\n } else {\n uri.path = url;\n uri.directory = folder(url);\n uri.base = uri.directory;\n }\n\n //-- Filename\n uri.filename = url.replace(uri.base, '');\n dot = uri.filename.lastIndexOf('.');\n if(dot != -1) {\n uri.extension = uri.filename.slice(dot+1);\n }\n return uri;\n};\n\n//-- Parse out the folder, will return everything before the last slash\nfunction folder(url){\n\n var lastSlash = url.lastIndexOf('/');\n\n if(lastSlash == -1) var folder = '';\n\n folder = url.slice(0, lastSlash + 1);\n\n return folder;\n\n};\n*/\nfunction isElement(obj) {\n return !!(obj && obj.nodeType == 1);\n};\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript\nfunction uuid() {\n var d = new Date().getTime();\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x7|0x8)).toString(16);\n });\n return uuid;\n};\n\n// From Lodash\nfunction values(object) {\n var index = -1,\n props = Object.keys(object),\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = object[props[index]];\n }\n return result;\n};\n\nfunction resolveUrl(base, path) {\n var url = [],\n segments = [],\n baseUri = uri(base),\n pathUri = uri(path),\n baseDirectory = baseUri.directory,\n pathDirectory = pathUri.directory,\n directories = [],\n // folders = base.split(\"/\"),\n paths;\n\n // if(uri.host) {\n // return path;\n // }\n\n if(baseDirectory[0] === \"/\") {\n baseDirectory = baseDirectory.substring(1);\n }\n\n if(pathDirectory[pathDirectory.length-1] === \"/\") {\n baseDirectory = baseDirectory.substring(0, baseDirectory.length-1);\n }\n\n if(pathDirectory[0] === \"/\") {\n pathDirectory = pathDirectory.substring(1);\n }\n\n if(pathDirectory[pathDirectory.length-1] === \"/\") {\n pathDirectory = pathDirectory.substring(0, pathDirectory.length-1);\n }\n\n if(baseDirectory) {\n directories = baseDirectory.split(\"/\");\n }\n\n paths = pathDirectory.split(\"/\");\n\n paths.reverse().forEach(function(part, index){\n if(part === \"..\"){\n directories.pop();\n } else if(part === directories[directories.length-1]) {\n directories.pop();\n segments.unshift(part);\n } else {\n segments.unshift(part);\n }\n });\n\n url = [baseUri.origin];\n\n if(directories.length) {\n url = url.concat(directories);\n }\n\n if(segments) {\n url = url.concat(segments);\n }\n\n url = url.concat(pathUri.filename);\n\n return url.join(\"/\");\n};\n\nfunction documentHeight() {\n return Math.max(\n document.documentElement.clientHeight,\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight\n );\n};\n\nfunction isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\nfunction prefixed(unprefixed) {\n var vendors = [\"Webkit\", \"Moz\", \"O\", \"ms\" ],\n prefixes = ['-Webkit-', '-moz-', '-o-', '-ms-'],\n upper = unprefixed[0].toUpperCase() + unprefixed.slice(1),\n length = vendors.length;\n\n if (typeof(document.body.style[unprefixed]) != 'undefined') {\n return unprefixed;\n }\n\n for ( var i=0; i < length; i++ ) {\n if (typeof(document.body.style[vendors[i] + upper]) != 'undefined') {\n return vendors[i] + upper;\n }\n }\n\n return unprefixed;\n};\n\nfunction defaults(obj) {\n for (var i = 1, length = arguments.length; i < length; i++) {\n var source = arguments[i];\n for (var prop in source) {\n if (obj[prop] === void 0) obj[prop] = source[prop];\n }\n }\n return obj;\n};\n\nfunction extend(target) {\n var sources = [].slice.call(arguments, 1);\n sources.forEach(function (source) {\n if(!source) return;\n Object.getOwnPropertyNames(source).forEach(function(propName) {\n Object.defineProperty(target, propName, Object.getOwnPropertyDescriptor(source, propName));\n });\n });\n return target;\n};\n\n// Fast quicksort insert for sorted array -- based on:\n// http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers\nfunction insert(item, array, compareFunction) {\n var location = locationOf(item, array, compareFunction);\n array.splice(location, 0, item);\n\n return location;\n};\n// Returns where something would fit in\nfunction locationOf(item, array, compareFunction, _start, _end) {\n var start = _start || 0;\n var end = _end || array.length;\n var pivot = parseInt(start + (end - start) / 2);\n var compared;\n if(!compareFunction){\n compareFunction = function(a, b) {\n if(a > b) return 1;\n if(a < b) return -1;\n if(a = b) return 0;\n };\n }\n if(end-start <= 0) {\n return pivot;\n }\n\n compared = compareFunction(array[pivot], item);\n if(end-start === 1) {\n return compared > 0 ? pivot : pivot + 1;\n }\n\n if(compared === 0) {\n return pivot;\n }\n if(compared === -1) {\n return locationOf(item, array, compareFunction, pivot, end);\n } else{\n return locationOf(item, array, compareFunction, start, pivot);\n }\n};\n// Returns -1 of mpt found\nfunction indexOfSorted(item, array, compareFunction, _start, _end) {\n var start = _start || 0;\n var end = _end || array.length;\n var pivot = parseInt(start + (end - start) / 2);\n var compared;\n if(!compareFunction){\n compareFunction = function(a, b) {\n if(a > b) return 1;\n if(a < b) return -1;\n if(a = b) return 0;\n };\n }\n if(end-start <= 0) {\n return -1; // Not found\n }\n\n compared = compareFunction(array[pivot], item);\n if(end-start === 1) {\n return compared === 0 ? pivot : -1;\n }\n if(compared === 0) {\n return pivot; // Found\n }\n if(compared === -1) {\n return indexOfSorted(item, array, compareFunction, pivot, end);\n } else{\n return indexOfSorted(item, array, compareFunction, start, pivot);\n }\n};\n\nfunction bounds(el) {\n\n var style = window.getComputedStyle(el);\n var widthProps = [\"width\", \"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n var heightProps = [\"height\", \"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n var width = 0;\n var height = 0;\n\n widthProps.forEach(function(prop){\n width += parseFloat(style[prop]) || 0;\n });\n\n heightProps.forEach(function(prop){\n height += parseFloat(style[prop]) || 0;\n });\n\n return {\n height: height,\n width: width\n };\n\n};\n\nfunction borders(el) {\n\n var style = window.getComputedStyle(el);\n var widthProps = [\"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n var heightProps = [\"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n var width = 0;\n var height = 0;\n\n widthProps.forEach(function(prop){\n width += parseFloat(style[prop]) || 0;\n });\n\n heightProps.forEach(function(prop){\n height += parseFloat(style[prop]) || 0;\n });\n\n return {\n height: height,\n width: width\n };\n\n};\n\nfunction windowBounds() {\n\n var width = window.innerWidth;\n var height = window.innerHeight;\n\n return {\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n width: width,\n height: height\n };\n\n};\n\n//https://stackoverflow.com/questions/13482352/xquery-looking-for-text-with-single-quote/13483496#13483496\nfunction cleanStringForXpath(str) {\n var parts = str.match(/[^'\"]+|['\"]/g);\n parts = parts.map(function(part){\n if (part === \"'\") {\n return '\\\"\\'\\\"'; // output \"'\"\n }\n\n if (part === '\"') {\n return \"\\'\\\"\\'\"; // output '\"'\n }\n return \"\\'\" + part + \"\\'\";\n });\n return \"concat(\\'\\',\" + parts.join(\",\") + \")\";\n};\n\nfunction indexOfTextNode(textNode){\n var parent = textNode.parentNode;\n var children = parent.childNodes;\n var sib;\n var index = -1;\n for (var i = 0; i < children.length; i++) {\n sib = children[i];\n if(sib.nodeType === Node.TEXT_NODE){\n index++;\n }\n if(sib == textNode) break;\n }\n\n return index;\n};\n\nfunction isXml(ext) {\n return ['xml', 'opf', 'ncx'].indexOf(ext) > -1;\n}\n\nfunction createBlobUrl(content, mime){\n\tvar _URL = window.URL || window.webkitURL || window.mozURL;\n\tvar tempUrl;\n\tvar blob = new Blob([content], {type : mime });\n\n tempUrl = _URL.createObjectURL(blob);\n\n return tempUrl;\n};\n\nmodule.exports = {\n // 'uri': uri,\n // 'folder': folder,\n 'isElement': isElement,\n 'uuid': uuid,\n 'values': values,\n 'resolveUrl': resolveUrl,\n 'indexOfSorted': indexOfSorted,\n 'documentHeight': documentHeight,\n 'isNumber': isNumber,\n 'prefixed': prefixed,\n 'defaults': defaults,\n 'extend': extend,\n 'insert': insert,\n 'locationOf': locationOf,\n 'indexOfSorted': indexOfSorted,\n 'requestAnimationFrame': requestAnimationFrame,\n 'bounds': bounds,\n 'borders': borders,\n 'windowBounds': windowBounds,\n 'cleanStringForXpath': cleanStringForXpath,\n 'indexOfTextNode': indexOfTextNode,\n 'isXml': isXml,\n 'createBlobUrl': createBlobUrl\n};\n","var URI = require('urijs');\nvar core = require('./core');\n\nfunction EpubCFI(cfiStr){\n if(cfiStr) return this.parse(cfiStr);\n};\n\nEpubCFI.prototype.generateChapterComponent = function(_spineNodeIndex, _pos, id) {\n var pos = parseInt(_pos),\n spineNodeIndex = _spineNodeIndex + 1,\n cfi = '/'+spineNodeIndex+'/';\n\n cfi += (pos + 1) * 2;\n\n if(id) cfi += \"[\" + id + \"]\";\n\n //cfi += \"!\";\n\n return cfi;\n};\n\nEpubCFI.prototype.generatePathComponent = function(steps) {\n var parts = [];\n\n steps.forEach(function(part){\n var segment = '';\n segment += (part.index + 1) * 2;\n\n if(part.id) {\n segment += \"[\" + part.id + \"]\";\n }\n\n parts.push(segment);\n });\n\n return parts.join('/');\n};\n\nEpubCFI.prototype.generateCfiFromElement = function(element, chapter) {\n var steps = this.pathTo(element);\n var path = this.generatePathComponent(steps);\n if(!path.length) {\n // Start of Chapter\n return \"epubcfi(\" + chapter + \"!/4/)\";\n } else {\n // First Text Node\n return \"epubcfi(\" + chapter + \"!\" + path + \"/1:0)\";\n }\n};\n\nEpubCFI.prototype.pathTo = function(node) {\n var stack = [],\n children;\n\n while(node && node.parentNode !== null && node.parentNode.nodeType != 9) {\n children = node.parentNode.children;\n\n stack.unshift({\n 'id' : node.id,\n // 'classList' : node.classList,\n 'tagName' : node.tagName,\n 'index' : children ? Array.prototype.indexOf.call(children, node) : 0\n });\n\n node = node.parentNode;\n }\n\n return stack;\n};\n\nEpubCFI.prototype.getChapterComponent = function(cfiStr) {\n\n var splitStr = cfiStr.split(\"!\");\n\n return splitStr[0];\n};\n\nEpubCFI.prototype.getPathComponent = function(cfiStr) {\n\n var splitStr = cfiStr.split(\"!\");\n var pathComponent = splitStr[1] ? splitStr[1].split(\":\") : '';\n\n return pathComponent[0];\n};\n\nEpubCFI.prototype.getCharecterOffsetComponent = function(cfiStr) {\n var splitStr = cfiStr.split(\":\");\n return splitStr[1] || '';\n};\n\n\nEpubCFI.prototype.parse = function(cfiStr) {\n var cfi = {},\n chapSegment,\n chapterComponent,\n pathComponent,\n charecterOffsetComponent,\n assertion,\n chapId,\n path,\n end,\n endInt,\n text,\n parseStep = function(part){\n var type, index, has_brackets, id;\n\n type = \"element\";\n index = parseInt(part) / 2 - 1;\n has_brackets = part.match(/\\[(.*)\\]/);\n if(has_brackets && has_brackets[1]){\n id = has_brackets[1];\n }\n\n return {\n \"type\" : type,\n 'index' : index,\n 'id' : id || false\n };\n };\n\n if(typeof cfiStr !== \"string\") {\n return {spinePos: -1};\n }\n\n cfi.str = cfiStr;\n\n if(cfiStr.indexOf(\"epubcfi(\") === 0 && cfiStr[cfiStr.length-1] === \")\") {\n // Remove intial epubcfi( and ending )\n cfiStr = cfiStr.slice(8, cfiStr.length-1);\n }\n\n chapterComponent = this.getChapterComponent(cfiStr);\n pathComponent = this.getPathComponent(cfiStr) || '';\n charecterOffsetComponent = this.getCharecterOffsetComponent(cfiStr);\n // Make sure this is a valid cfi or return\n if(!chapterComponent) {\n return {spinePos: -1};\n }\n\n // Chapter segment is always the second one\n chapSegment = chapterComponent.split(\"/\")[2] || '';\n if(!chapSegment) return {spinePos:-1};\n\n cfi.spinePos = (parseInt(chapSegment) / 2 - 1 ) || 0;\n\n chapId = chapSegment.match(/\\[(.*)\\]/);\n\n cfi.spineId = chapId ? chapId[1] : false;\n\n if(pathComponent.indexOf(',') != -1) {\n // Handle ranges -- not supported yet\n console.warn(\"CFI Ranges are not supported\");\n }\n\n path = pathComponent.split('/');\n end = path.pop();\n\n cfi.steps = [];\n\n path.forEach(function(part){\n var step;\n\n if(part) {\n step = parseStep(part);\n cfi.steps.push(step);\n }\n });\n\n //-- Check if END is a text node or element\n endInt = parseInt(end);\n if(!isNaN(endInt)) {\n\n if(endInt % 2 === 0) { // Even = is an element\n cfi.steps.push(parseStep(end));\n } else {\n cfi.steps.push({\n \"type\" : \"text\",\n 'index' : (endInt - 1 ) / 2\n });\n }\n\n }\n\n assertion = charecterOffsetComponent.match(/\\[(.*)\\]/);\n if(assertion && assertion[1]){\n cfi.characterOffset = parseInt(charecterOffsetComponent.split('[')[0]);\n // We arent handling these assertions yet\n cfi.textLocationAssertion = assertion[1];\n } else {\n cfi.characterOffset = parseInt(charecterOffsetComponent);\n }\n\n return cfi;\n};\n\nEpubCFI.prototype.addMarker = function(cfi, _doc, _marker) {\n var doc = _doc || document;\n var marker = _marker || this.createMarker(doc);\n var parent;\n var lastStep;\n var text;\n var split;\n\n if(typeof cfi === 'string') {\n cfi = this.parse(cfi);\n }\n // Get the terminal step\n lastStep = cfi.steps[cfi.steps.length-1];\n\n // check spinePos\n if(cfi.spinePos === -1) {\n // Not a valid CFI\n return false;\n }\n\n // Find the CFI elements parent\n parent = this.findParent(cfi, doc);\n\n if(!parent) {\n // CFI didn't return an element\n // Maybe it isnt in the current chapter?\n return false;\n }\n\n if(lastStep && lastStep.type === \"text\") {\n text = parent.childNodes[lastStep.index];\n if(cfi.characterOffset){\n split = text.splitText(cfi.characterOffset);\n marker.classList.add(\"EPUBJS-CFI-SPLIT\");\n parent.insertBefore(marker, split);\n } else {\n parent.insertBefore(marker, text);\n }\n } else {\n parent.insertBefore(marker, parent.firstChild);\n }\n\n return marker;\n};\n\nEpubCFI.prototype.createMarker = function(_doc) {\n var doc = _doc || document;\n var element = doc.createElement('span');\n element.id = \"EPUBJS-CFI-MARKER:\"+ core.uuid();\n element.classList.add(\"EPUBJS-CFI-MARKER\");\n\n return element;\n};\n\nEpubCFI.prototype.removeMarker = function(marker, _doc) {\n var doc = _doc || document;\n // var id = marker.id;\n\n // Cleanup textnodes if they were split\n if(marker.classList.contains(\"EPUBJS-CFI-SPLIT\")){\n nextSib = marker.nextSibling;\n prevSib = marker.previousSibling;\n if(nextSib &&\n prevSib &&\n nextSib.nodeType === 3 &&\n prevSib.nodeType === 3){\n\n prevSib.textContent += nextSib.textContent;\n marker.parentNode.removeChild(nextSib);\n }\n marker.parentNode.removeChild(marker);\n } else if(marker.classList.contains(\"EPUBJS-CFI-MARKER\")) {\n // Remove only elements added as markers\n marker.parentNode.removeChild(marker);\n }\n\n};\n\nEpubCFI.prototype.findParent = function(cfi, _doc) {\n var doc = _doc || document,\n element = doc.getElementsByTagName('html')[0],\n children = Array.prototype.slice.call(element.children),\n num, index, part, sections,\n text, textBegin, textEnd;\n\n if(typeof cfi === 'string') {\n cfi = this.parse(cfi);\n }\n\n sections = cfi.steps.slice(0); // Clone steps array\n if(!sections.length) {\n return doc.getElementsByTagName('body')[0];\n }\n\n while(sections && sections.length > 0) {\n part = sections.shift();\n // Find textNodes Parent\n if(part.type === \"text\") {\n text = element.childNodes[part.index];\n element = text.parentNode || element;\n // Find element by id if present\n } else if(part.id){\n element = doc.getElementById(part.id);\n // Find element in parent\n }else{\n element = children[part.index];\n }\n // Element can't be found\n if(typeof element === \"undefined\") {\n console.error(\"No Element For\", part, cfi.str);\n return false;\n }\n // Get current element children and continue through steps\n children = Array.prototype.slice.call(element.children);\n }\n\n return element;\n};\n\nEpubCFI.prototype.compare = function(cfiOne, cfiTwo) {\n if(typeof cfiOne === 'string') {\n cfiOne = new EpubCFI(cfiOne);\n }\n if(typeof cfiTwo === 'string') {\n cfiTwo = new EpubCFI(cfiTwo);\n }\n // Compare Spine Positions\n if(cfiOne.spinePos > cfiTwo.spinePos) {\n return 1;\n }\n if(cfiOne.spinePos < cfiTwo.spinePos) {\n return -1;\n }\n\n\n // Compare Each Step in the First item\n for (var i = 0; i < cfiOne.steps.length; i++) {\n if(!cfiTwo.steps[i]) {\n return 1;\n }\n if(cfiOne.steps[i].index > cfiTwo.steps[i].index) {\n return 1;\n }\n if(cfiOne.steps[i].index < cfiTwo.steps[i].index) {\n return -1;\n }\n // Otherwise continue checking\n }\n\n // All steps in First present in Second\n if(cfiOne.steps.length < cfiTwo.steps.length) {\n return -1;\n }\n\n // Compare the charecter offset of the text node\n if(cfiOne.characterOffset > cfiTwo.characterOffset) {\n return 1;\n }\n if(cfiOne.characterOffset < cfiTwo.characterOffset) {\n return -1;\n }\n\n // CFI's are equal\n return 0;\n};\n\nEpubCFI.prototype.generateCfiFromHref = function(href, book) {\n var uri = URI(href);\n var path = uri.path();\n var fragment = uri.fragment();\n var spinePos = book.spineIndexByURL[path];\n var loaded;\n var deferred = new RSVP.defer();\n var epubcfi = new EpubCFI();\n var spineItem;\n\n if(typeof spinePos !== \"undefined\"){\n spineItem = book.spine[spinePos];\n loaded = book.loadXml(spineItem.url);\n loaded.then(function(doc){\n var element = doc.getElementById(fragment);\n var cfi;\n cfi = epubcfi.generateCfiFromElement(element, spineItem.cfiBase);\n deferred.resolve(cfi);\n });\n }\n\n return deferred.promise;\n};\n\nEpubCFI.prototype.generateCfiFromTextNode = function(anchor, offset, base) {\n var parent = anchor.parentNode;\n var steps = this.pathTo(parent);\n var path = this.generatePathComponent(steps);\n var index = 1 + (2 * Array.prototype.indexOf.call(parent.childNodes, anchor));\n return \"epubcfi(\" + base + \"!\" + path + \"/\"+index+\":\"+(offset || 0)+\")\";\n};\n\nEpubCFI.prototype.generateCfiFromRangeAnchor = function(range, base) {\n var anchor = range.anchorNode;\n var offset = range.anchorOffset;\n return this.generateCfiFromTextNode(anchor, offset, base);\n};\n\nEpubCFI.prototype.generateCfiFromRange = function(range, base) {\n var start, startElement, startSteps, startPath, startOffset, startIndex;\n var end, endElement, endSteps, endPath, endOffset, endIndex;\n\n start = range.startContainer;\n\n if(start.nodeType === 3) { // text node\n startElement = start.parentNode;\n //startIndex = 1 + (2 * Array.prototype.indexOf.call(startElement.childNodes, start));\n startIndex = 1 + (2 * core.indexOfTextNode(start));\n startSteps = this.pathTo(startElement);\n } else if(range.collapsed) {\n return this.generateCfiFromElement(start, base); // single element\n } else {\n startSteps = this.pathTo(start);\n }\n\n startPath = this.generatePathComponent(startSteps);\n startOffset = range.startOffset;\n\n if(!range.collapsed) {\n end = range.endContainer;\n\n if(end.nodeType === 3) { // text node\n endElement = end.parentNode;\n // endIndex = 1 + (2 * Array.prototype.indexOf.call(endElement.childNodes, end));\n endIndex = 1 + (2 * core.indexOfTextNode(end));\n\n endSteps = this.pathTo(endElement);\n } else {\n endSteps = this.pathTo(end);\n }\n\n endPath = this.generatePathComponent(endSteps);\n endOffset = range.endOffset;\n\n // Remove steps present in startPath\n endPath = endPath.replace(startPath, '');\n\n if (endPath.length) {\n endPath = endPath + \"/\";\n }\n\n return \"epubcfi(\" + base + \"!\" + startPath + \"/\" + startIndex + \":\" + startOffset + \",\" + endPath + endIndex + \":\" + endOffset + \")\";\n\n } else {\n return \"epubcfi(\" + base + \"!\" + startPath + \"/\"+ startIndex +\":\"+ startOffset +\")\";\n }\n};\n\nEpubCFI.prototype.generateXpathFromSteps = function(steps) {\n var xpath = [\".\", \"*\"];\n\n steps.forEach(function(step){\n var position = step.index + 1;\n\n if(step.id){\n xpath.push(\"*[position()=\" + position + \" and @id='\" + step.id + \"']\");\n } else if(step.type === \"text\") {\n xpath.push(\"text()[\" + position + \"]\");\n } else {\n xpath.push(\"*[\" + position + \"]\");\n }\n });\n\n return xpath.join(\"/\");\n};\n\nEpubCFI.prototype.generateQueryFromSteps = function(steps) {\n var query = [\"html\"];\n\n steps.forEach(function(step){\n var position = step.index + 1;\n\n if(step.id){\n query.push(\"#\" + step.id);\n } else if(step.type === \"text\") {\n // unsupported in querySelector\n // query.push(\"text()[\" + position + \"]\");\n } else {\n query.push(\"*:nth-child(\" + position + \")\");\n }\n });\n\n return query.join(\">\");\n};\n\n\nEpubCFI.prototype.generateRangeFromCfi = function(cfi, _doc) {\n var doc = _doc || document;\n var range = doc.createRange();\n var lastStep;\n var xpath;\n var startContainer;\n var textLength;\n var query;\n var startContainerParent;\n\n if(typeof cfi === 'string') {\n cfi = this.parse(cfi);\n }\n\n // check spinePos\n if(cfi.spinePos === -1) {\n // Not a valid CFI\n return false;\n }\n\n // Get the terminal step\n lastStep = cfi.steps[cfi.steps.length-1];\n\n if(typeof document.evaluate != 'undefined') {\n xpath = this.generateXpathFromSteps(cfi.steps);\n startContainer = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n } else {\n // Get the query string\n query = this.generateQueryFromSteps(cfi.steps);\n // Find the containing element\n startContainerParent = doc.querySelector(query);\n // Find the text node within that element\n if(startContainerParent && lastStep.type == \"text\") {\n startContainer = startContainerParent.childNodes[lastStep.index];\n }\n }\n\n if(!startContainer) {\n return null;\n }\n\n if(startContainer && cfi.characterOffset >= 0) {\n textLength = startContainer.length;\n\n if(cfi.characterOffset < textLength) {\n range.setStart(startContainer, cfi.characterOffset);\n range.setEnd(startContainer, textLength );\n } else {\n console.debug(\"offset greater than length:\", cfi.characterOffset, textLength);\n range.setStart(startContainer, textLength - 1 );\n range.setEnd(startContainer, textLength );\n }\n } else if(startContainer) {\n range.selectNode(startContainer);\n }\n // doc.defaultView.getSelection().addRange(range);\n return range;\n};\n\nEpubCFI.prototype.isCfiString = function(target) {\n if(typeof target === \"string\" &&\n target.indexOf(\"epubcfi(\") === 0) {\n return true;\n }\n\n return false;\n};\n\nmodule.exports = EpubCFI;\n","var RSVP = require('rsvp');\n\n//-- Hooks allow for injecting functions that must all complete in order before finishing\n// They will execute in parallel but all must finish before continuing\n// Functions may return a promise if they are asycn.\n\n// this.content = new EPUBJS.Hook();\n// this.content.register(function(){});\n// this.content.trigger(args).then(function(){});\n\nfunction Hook(context){\n this.context = context || this;\n this.hooks = [];\n};\n\n// Adds a function to be run before a hook completes\nHook.prototype.register = function(){\n for(var i = 0; i < arguments.length; ++i) {\n if (typeof arguments[i] === \"function\") {\n this.hooks.push(arguments[i]);\n } else {\n // unpack array\n for(var j = 0; j < arguments[i].length; ++j) {\n this.hooks.push(arguments[i][j]);\n }\n }\n }\n};\n\n// Triggers a hook to run all functions\nHook.prototype.trigger = function(){\n var args = arguments;\n var context = this.context;\n var promises = [];\n\n this.hooks.forEach(function(task, i) {\n var executing = task.apply(context, args);\n\n if(executing && typeof executing[\"then\"] === \"function\") {\n // Task is a function that returns a promise\n promises.push(executing);\n }\n // Otherwise Task resolves immediately, continue\n });\n\n\n return RSVP.all(promises);\n};\n\n// Adds a function to be run before a hook completes\nHook.prototype.list = function(){\n return this.hooks;\n};\n\nmodule.exports = Hook;\n","var core = require('./core');\n\nfunction Reflowable(){\n\n};\n\nReflowable.prototype.calculate = function(_width, _height, _gap, _devisor){\n\n var divisor = _devisor || 1;\n\n //-- Check the width and create even width columns\n var fullWidth = Math.floor(_width);\n var width = (fullWidth % 2 === 0) ? fullWidth : fullWidth - 1;\n\n var section = Math.floor(width / 8);\n var gap = (_gap >= 0) ? _gap : ((section % 2 === 0) ? section : section - 1);\n\n var colWidth;\n var spreadWidth;\n var delta;\n\n //-- Double Page\n if(divisor > 1) {\n colWidth = Math.floor((width - gap) / divisor);\n } else {\n colWidth = width;\n }\n\n spreadWidth = colWidth * divisor;\n\n delta = (colWidth + gap) * divisor;\n\n\n\n this.columnAxis = core.prefixed('columnAxis');\n this.columnGap = core.prefixed('columnGap');\n this.columnWidth = core.prefixed('columnWidth');\n this.columnFill = core.prefixed('columnFill');\n\n this.width = width;\n this.height = _height;\n this.spread = spreadWidth;\n this.delta = delta;\n\n this.column = colWidth;\n this.gap = gap;\n this.divisor = divisor;\n\n};\n\nReflowable.prototype.format = function(view){\n\n var $doc = view.document.documentElement;\n var $body = view.document.body;//view.document.querySelector(\"body\");\n\n $doc.style.overflow = \"hidden\";\n\n // Must be set to the new calculated width or the columns will be off\n // $body.style.width = this.width + \"px\";\n $doc.style.width = this.width + \"px\";\n\n //-- Adjust height\n $body.style.height = this.height + \"px\";\n\n //-- Add columns\n $body.style[this.columnAxis] = \"horizontal\";\n $body.style[this.columnFill] = \"auto\";\n $body.style[this.columnGap] = this.gap+\"px\";\n $body.style[this.columnWidth] = this.column+\"px\";\n\n // Add extra padding for the gap between this and the next view\n view.iframe.style.marginRight = this.gap+\"px\";\n};\n\nReflowable.prototype.count = function(view) {\n var totalWidth = view.root().scrollWidth;\n var spreads = Math.ceil(totalWidth / this.spread);\n\n return {\n spreads : spreads,\n pages : spreads * this.divisor\n };\n};\n\nfunction Fixed(_width, _height){\n\n};\n\nFixed.prototype.calculate = function(_width, _height){\n\n};\n\nFixed.prototype.format = function(view){\n var width, height;\n\n var $doc = view.document.documentElement;\n var $viewport = documentElement.querySelector(\"[name=viewport\");\n\n /**\n * check for the viewport size\n * \n */\n if($viewport && $viewport.hasAttribute(\"content\")) {\n content = $viewport.getAttribute(\"content\");\n contents = content.split(',');\n if(contents[0]){\n width = contents[0].replace(\"width=\", '');\n }\n if(contents[1]){\n height = contents[1].replace(\"height=\", '');\n }\n }\n\n //-- Adjust width and height\n // $doc.style.width = width + \"px\" || \"auto\";\n // $doc.style.height = height + \"px\" || \"auto\";\n view.resize(width, height);\n\n //-- Scroll\n $doc.style.overflow = \"auto\";\n\n};\n\nFixed.prototype.count = function(){\n return {\n spreads : 1,\n pages : 1\n };\n};\n\nfunction Scroll(){\n\n};\n\nScroll.prototype.calculate = function(_width, _height){\n this.spread = _width;\n this.column = _width;\n this.gap = 0;\n};\n\nScroll.prototype.format = function(view){\n\n var $doc = view.document.documentElement;\n\n $doc.style.width = \"auto\";\n $doc.style.height = \"auto\";\n\n};\n\nScroll.prototype.count = function(){\n return {\n spreads : 1,\n pages : 1\n };\n};\n\nmodule.exports = {\n 'Reflowable': Reflowable,\n 'Fixed': Fixed,\n 'Scroll': Scroll\n};\n","var core = require('./core');\nvar Queue = require('./queue');\nvar EpubCFI = require('./epubcfi');\nvar RSVP = require('rsvp');\n\nfunction Locations(spine, request) {\n this.spine = spine;\n this.request = request;\n\n this.q = new Queue(this);\n this.epubcfi = new EpubCFI();\n\n this._locations = [];\n this.total = 0;\n\n this.break = 150;\n\n this._current = 0;\n\n};\n\n// Load all of sections in the book\nLocations.prototype.generate = function(chars) {\n\n if (chars) {\n this.break = chars;\n }\n\n this.q.pause();\n\n this.spine.each(function(section) {\n\n this.q.enqueue(this.process, section);\n\n }.bind(this));\n\n return this.q.run().then(function() {\n this.total = this._locations.length-1;\n\n if (this._currentCfi) {\n this.currentLocation = this._currentCfi;\n }\n\n return this._locations;\n // console.log(this.precentage(this.book.rendition.location.start), this.precentage(this.book.rendition.location.end));\n }.bind(this));\n\n};\n\nLocations.prototype.process = function(section) {\n\n return section.load(this.request)\n .then(function(contents) {\n\n var range;\n var doc = contents.ownerDocument;\n var counter = 0;\n\n this.sprint(contents, function(node) {\n var len = node.length;\n var dist;\n var pos = 0;\n\n // Start range\n if (counter == 0) {\n range = doc.createRange();\n range.setStart(node, 0);\n }\n\n dist = this.break - counter;\n\n // Node is smaller than a break\n if(dist > len){\n counter += len;\n pos = len;\n }\n\n while (pos < len) {\n counter = this.break;\n pos += this.break;\n\n // Gone over\n if(pos >= len){\n // Continue counter for next node\n counter = len - (pos - this.break);\n\n // At End\n } else {\n // End the previous range\n range.setEnd(node, pos);\n cfi = section.cfiFromRange(range);\n this._locations.push(cfi);\n counter = 0;\n\n // Start new range\n pos += 1;\n range = doc.createRange();\n range.setStart(node, pos);\n }\n }\n\n\n\n }.bind(this));\n\n // Close remaining\n if (range) {\n range.setEnd(prev, prev.length);\n cfi = section.cfiFromRange(range);\n this._locations.push(cfi)\n counter = 0;\n }\n\n }.bind(this));\n\n};\n\nLocations.prototype.sprint = function(root, func) {\n\tvar treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false);\n\n\twhile ((node = treeWalker.nextNode())) {\n\t\tfunc(node);\n\t}\n\n};\n\nLocations.prototype.locationFromCfi = function(cfi){\n // Check if the location has not been set yet\n\tif(this._locations.length === 0) {\n\t\treturn -1;\n\t}\n\n return core.locationOf(cfi, this._locations, this.epubcfi.compare);\n};\n\nLocations.prototype.precentageFromCfi = function(cfi) {\n // Find closest cfi\n var loc = this.locationFromCfi(cfi);\n // Get percentage in total\n return this.precentageFromLocation(loc);\n};\n\nLocations.prototype.percentageFromLocation = function(loc) {\n if (!loc || !this.total) {\n return 0;\n }\n return (loc / this.total);\n};\n\nLocations.prototype.cfiFromLocation = function(loc){\n\tvar cfi = -1;\n\t// check that pg is an int\n\tif(typeof loc != \"number\"){\n\t\tloc = parseInt(pg);\n\t}\n\n\tif(loc >= 0 && loc < this._locations.length) {\n\t\tcfi = this._locations[loc];\n\t}\n\n\treturn cfi;\n};\n\nLocations.prototype.cfiFromPercentage = function(value){\n var percentage = (value > 1) ? value / 100 : value; // Normalize value to 0-1\n\tvar loc = Math.ceil(this.total * percentage);\n\n\treturn this.cfiFromLocation(loc);\n};\n\nLocations.prototype.load = function(locations){\n\tthis._locations = JSON.parse(locations);\n this.total = this._locations.length-1;\n return this._locations;\n};\n\nLocations.prototype.save = function(json){\n\treturn JSON.stringify(this._locations);\n};\n\nLocations.prototype.getCurrent = function(json){\n\treturn this._current;\n};\n\nLocations.prototype.setCurrent = function(curr){\n var loc;\n\n if(typeof curr == \"string\"){\n this._currentCfi = curr;\n } else if (typeof curr == \"number\") {\n this._current = curr;\n } else {\n return;\n }\n\n if(this._locations.length === 0) {\n return;\n\t}\n\n if(typeof curr == \"string\"){\n loc = this.locationFromCfi(curr);\n this._current = loc;\n } else {\n loc = curr;\n }\n\n this.trigger(\"changed\", {\n percentage: this.precentageFromLocation(loc)\n });\n};\n\nObject.defineProperty(Locations.prototype, 'currentLocation', {\n get: function () {\n return this._current;\n },\n set: function (curr) {\n this.setCurrent(curr);\n }\n});\n\nRSVP.EventTarget.mixin(Locations.prototype);\n\nmodule.exports = Locations;\n","function Map(layout){\n this.layout = layout;\n};\n\nMap.prototype.section = function(view) {\n var ranges = this.findRanges(view);\n var map = this.rangeListToCfiList(view, ranges);\n\n return map;\n};\n\nMap.prototype.page = function(view, start, end) {\n var root = view.document.body;\n return this.rangePairToCfiPair(view.section, {\n start: this.findStart(root, start, end),\n end: this.findEnd(root, start, end)\n });\n};\n\nMap.prototype.walk = function(root, func) {\n //var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT, null, false);\n var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode: function (node) {\n if ( node.data.trim().length > 0 ) {\n return NodeFilter.FILTER_ACCEPT;\n } else {\n return NodeFilter.FILTER_REJECT;\n }\n }\n }, false);\n var node;\n var result;\n while ((node = treeWalker.nextNode())) {\n result = func(node);\n if(result) break;\n }\n\n return result;\n};\n\nMap.prototype.findRanges = function(view){\n var columns = [];\n var count = this.layout.count(view);\n var column = this.layout.column;\n var gap = this.layout.gap;\n var start, end;\n\n for (var i = 0; i < count.pages; i++) {\n start = (column + gap) * i;\n end = (column * (i+1)) + (gap * i);\n columns.push({\n start: this.findStart(view.document.body, start, end),\n end: this.findEnd(view.document.body, start, end)\n });\n }\n\n return columns;\n};\n\nMap.prototype.findStart = function(root, start, end){\n var stack = [root];\n var $el;\n var found;\n var $prev = root;\n while (stack.length) {\n\n $el = stack.shift();\n\n found = this.walk($el, function(node){\n var left, right;\n var elPos;\n var elRange;\n\n\n if(node.nodeType == Node.TEXT_NODE){\n elRange = document.createRange();\n elRange.selectNodeContents(node);\n elPos = elRange.getBoundingClientRect();\n } else {\n elPos = node.getBoundingClientRect();\n }\n\n left = elPos.left;\n right = elPos.right;\n\n if( left >= start && left <= end ) {\n return node;\n } else if (right > start) {\n return node;\n } else {\n $prev = node;\n stack.push(node);\n }\n\n });\n\n if(found) {\n return this.findTextStartRange(found, start, end);\n }\n\n }\n\n // Return last element\n return this.findTextStartRange($prev, start, end);\n};\n\nMap.prototype.findEnd = function(root, start, end){\n var stack = [root];\n var $el;\n var $prev = root;\n var found;\n\n while (stack.length) {\n\n $el = stack.shift();\n\n found = this.walk($el, function(node){\n\n var left, right;\n var elPos;\n var elRange;\n\n\n if(node.nodeType == Node.TEXT_NODE){\n elRange = document.createRange();\n elRange.selectNodeContents(node);\n elPos = elRange.getBoundingClientRect();\n } else {\n elPos = node.getBoundingClientRect();\n }\n\n left = elPos.left;\n right = elPos.right;\n\n if(left > end && $prev) {\n return $prev;\n } else if(right > end) {\n return node;\n } else {\n $prev = node;\n stack.push(node);\n }\n\n });\n\n\n if(found){\n return this.findTextEndRange(found, start, end);\n }\n\n }\n\n // end of chapter\n return this.findTextEndRange($prev, start, end);\n};\n\n\nMap.prototype.findTextStartRange = function(node, start, end){\n var ranges = this.splitTextNodeIntoRanges(node);\n var prev;\n var range;\n var pos;\n\n for (var i = 0; i < ranges.length; i++) {\n range = ranges[i];\n\n pos = range.getBoundingClientRect();\n\n if( pos.left >= start ) {\n return range;\n }\n\n prev = range;\n\n }\n\n return ranges[0];\n};\n\nMap.prototype.findTextEndRange = function(node, start, end){\n var ranges = this.splitTextNodeIntoRanges(node);\n var prev;\n var range;\n var pos;\n\n for (var i = 0; i < ranges.length; i++) {\n range = ranges[i];\n\n pos = range.getBoundingClientRect();\n\n if(pos.left > end && prev) {\n return prev;\n } else if(pos.right > end) {\n return range;\n }\n\n prev = range;\n\n }\n\n // Ends before limit\n return ranges[ranges.length-1];\n\n};\n\nMap.prototype.splitTextNodeIntoRanges = function(node, _splitter){\n var ranges = [];\n var textContent = node.textContent || \"\";\n var text = textContent.trim();\n var range;\n var rect;\n var list;\n var doc = node.ownerDocument;\n var splitter = _splitter || \" \";\n\n pos = text.indexOf(splitter);\n\n if(pos === -1 || node.nodeType != Node.TEXT_NODE) {\n range = doc.createRange();\n range.selectNodeContents(node);\n return [range];\n }\n\n range = doc.createRange();\n range.setStart(node, 0);\n range.setEnd(node, pos);\n ranges.push(range);\n range = false;\n\n while ( pos != -1 ) {\n\n pos = text.indexOf(splitter, pos + 1);\n if(pos > 0) {\n\n if(range) {\n range.setEnd(node, pos);\n ranges.push(range);\n }\n\n range = doc.createRange();\n range.setStart(node, pos+1);\n }\n }\n\n if(range) {\n range.setEnd(node, text.length);\n ranges.push(range);\n }\n\n return ranges;\n};\n\n\n\nMap.prototype.rangePairToCfiPair = function(section, rangePair){\n\n var startRange = rangePair.start;\n var endRange = rangePair.end;\n\n startRange.collapse(true);\n endRange.collapse(true);\n\n startCfi = section.cfiFromRange(startRange);\n endCfi = section.cfiFromRange(endRange);\n\n return {\n start: startCfi,\n end: endCfi\n };\n\n};\n\nMap.prototype.rangeListToCfiList = function(view, columns){\n var map = [];\n var rangePair, cifPair;\n\n for (var i = 0; i < columns.length; i++) {\n cifPair = this.rangePairToCfiPair(view.section, columns[i]);\n\n map.push(cifPair);\n\n }\n\n return map;\n};\n\nmodule.exports = Map;\n","var core = require('./core');\nvar Parser = require('./parser');\nvar RSVP = require('rsvp');\nvar URI = require('urijs');\n\nfunction Navigation(_package, _request){\n var navigation = this;\n var parse = new Parser();\n var request = _request || require('./request');\n\n this.package = _package;\n this.toc = [];\n this.tocByHref = {};\n this.tocById = {};\n\n if(_package.navPath) {\n this.navUrl = URI(_package.navPath).absoluteTo(_package.baseUrl).toString();\n this.nav = {};\n\n this.nav.load = function(_request){\n var loading = new RSVP.defer();\n var loaded = loading.promise;\n\n request(navigation.navUrl, 'xml').then(function(xml){\n navigation.toc = parse.nav(xml);\n navigation.loaded(navigation.toc);\n loading.resolve(navigation.toc);\n });\n\n return loaded;\n };\n\n }\n\n if(_package.ncxPath) {\n this.ncxUrl = URI(_package.ncxPath).absoluteTo(_package.baseUrl).toString();\n this.ncx = {};\n\n this.ncx.load = function(_request){\n var loading = new RSVP.defer();\n var loaded = loading.promise;\n\n request(navigation.ncxUrl, 'xml').then(function(xml){\n navigation.toc = parse.ncx(xml);\n navigation.loaded(navigation.toc);\n loading.resolve(navigation.toc);\n });\n\n return loaded;\n };\n\n }\n};\n\n// Load the navigation\nNavigation.prototype.load = function(_request) {\n var request = _request || require('./request');\n var loading, loaded;\n\n if(this.nav) {\n loading = this.nav.load();\n } else if(this.ncx) {\n loading = this.ncx.load();\n } else {\n loaded = new RSVP.defer();\n loaded.resolve([]);\n loading = loaded.promise;\n }\n\n return loading;\n\n};\n\nNavigation.prototype.loaded = function(toc) {\n var item;\n\n for (var i = 0; i < toc.length; i++) {\n item = toc[i];\n this.tocByHref[item.href] = i;\n this.tocById[item.id] = i;\n }\n\n};\n\n// Get an item from the navigation\nNavigation.prototype.get = function(target) {\n var index;\n\n if(!target) {\n return this.toc;\n }\n\n if(target.indexOf(\"#\") === 0) {\n index = this.tocById[target.substring(1)];\n } else if(target in this.tocByHref){\n index = this.tocByHref[target];\n }\n\n return this.toc[index];\n};\n\nmodule.exports = Navigation;\n","var RSVP = require('rsvp');\nvar core = require('./core');\nvar Continuous = require('./continuous');\nvar Map = require('./map');\nvar Layout = require('./layout');\n\nfunction Paginate(book, options) {\n\n Continuous.apply(this, arguments);\n\n this.settings = core.extend(this.settings || {}, {\n width: 600,\n height: 400,\n axis: \"horizontal\",\n forceSingle: false,\n minSpreadWidth: 800, //-- overridden by spread: none (never) / both (always)\n gap: \"auto\", //-- \"auto\" or int\n overflow: \"hidden\",\n infinite: false\n });\n\n core.extend(this.settings, options);\n\n this.isForcedSingle = this.settings.forceSingle;\n\n this.viewSettings = {\n axis: this.settings.axis\n };\n\n this.start();\n};\n\nPaginate.prototype = Object.create(Continuous.prototype);\nPaginate.prototype.constructor = Paginate;\n\n\nPaginate.prototype.determineSpreads = function(cutoff){\n if(this.isForcedSingle || !cutoff || this.bounds().width < cutoff) {\n return 1; //-- Single Page\n }else{\n return 2; //-- Double Page\n }\n};\n\nPaginate.prototype.forceSingle = function(bool){\n if(bool === false) {\n this.isForcedSingle = false;\n // this.spreads = false;\n } else {\n this.isForcedSingle = true;\n // this.spreads = this.determineSpreads(this.minSpreadWidth);\n }\n this.applyLayoutMethod();\n};\n\n/**\n* Uses the settings to determine which Layout Method is needed\n* Triggers events based on the method choosen\n* Takes: Layout settings object\n* Returns: String of appropriate for EPUBJS.Layout function\n*/\n// Paginate.prototype.determineLayout = function(settings){\n// // Default is layout: reflowable & spread: auto\n// var spreads = this.determineSpreads(this.settings.minSpreadWidth);\n// console.log(\"spreads\", spreads, this.settings.minSpreadWidth)\n// var layoutMethod = spreads ? \"ReflowableSpreads\" : \"Reflowable\";\n// var scroll = false;\n//\n// if(settings.layout === \"pre-paginated\") {\n// layoutMethod = \"Fixed\";\n// scroll = true;\n// spreads = false;\n// }\n//\n// if(settings.layout === \"reflowable\" && settings.spread === \"none\") {\n// layoutMethod = \"Reflowable\";\n// scroll = false;\n// spreads = false;\n// }\n//\n// if(settings.layout === \"reflowable\" && settings.spread === \"both\") {\n// layoutMethod = \"ReflowableSpreads\";\n// scroll = false;\n// spreads = true;\n// }\n//\n// this.spreads = spreads;\n//\n// return layoutMethod;\n// };\n\nPaginate.prototype.start = function(){\n // On display\n // this.layoutSettings = this.reconcileLayoutSettings(globalLayout, chapter.properties);\n // this.layoutMethod = this.determineLayout(this.layoutSettings);\n // this.layout = new EPUBJS.Layout[this.layoutMethod]();\n //this.hooks.display.register(this.registerLayoutMethod.bind(this));\n // this.hooks.display.register(this.reportLocation);\n this.on('displayed', this.reportLocation.bind(this));\n\n // this.hooks.content.register(this.adjustImages.bind(this));\n\n this.currentPage = 0;\n\n window.addEventListener('unload', function(e){\n this.ignore = true;\n this.destroy();\n }.bind(this));\n\n};\n\n// EPUBJS.Rendition.prototype.createView = function(section) {\n// var view = new EPUBJS.View(section, this.viewSettings);\n\n\n// return view;\n// };\n\nPaginate.prototype.applyLayoutMethod = function() {\n //var task = new RSVP.defer();\n\n // this.spreads = this.determineSpreads(this.settings.minSpreadWidth);\n\n this.layout = new Layout.Reflowable();\n\n this.updateLayout();\n\n // Set the look ahead offset for what is visible\n\n this.map = new Map(this.layout);\n\n // this.hooks.layout.register(this.layout.format.bind(this));\n\n //task.resolve();\n //return task.promise;\n // return layout;\n};\n\nPaginate.prototype.updateLayout = function() {\n\n this.spreads = this.determineSpreads(this.settings.minSpreadWidth);\n\n this.layout.calculate(\n this.stage.width,\n this.stage.height,\n this.settings.gap,\n this.spreads\n );\n\n this.settings.offset = this.layout.delta;\n\n};\n\nPaginate.prototype.moveTo = function(offset){\n var dist = Math.floor(offset.left / this.layout.delta) * this.layout.delta;\n return this.check(0, dist+this.settings.offset).then(function(){\n this.scrollBy(dist, 0);\n }.bind(this));\n};\n\nPaginate.prototype.page = function(pg){\n\n // this.currentPage = pg;\n // this.renderer.infinite.scrollTo(this.currentPage * this.formated.pageWidth, 0);\n //-- Return false if page is greater than the total\n // return false;\n};\n\nPaginate.prototype.next = function(){\n\n return this.q.enqueue(function(){\n // console.log(this.container.scrollWidth, this.container.scrollLeft + this.container.offsetWidth + this.layout.delta)\n if(this.container.scrollLeft +\n this.container.offsetWidth +\n this.layout.delta < this.container.scrollWidth) {\n this.scrollBy(this.layout.delta, 0);\n } else {\n this.scrollTo(this.container.scrollWidth - this.layout.delta, 0);\n }\n this.reportLocation();\n return this.check();\n });\n\n // return this.page(this.currentPage + 1);\n};\n\nPaginate.prototype.prev = function(){\n\n return this.q.enqueue(function(){\n this.scrollBy(-this.layout.delta, 0);\n this.reportLocation();\n return this.check();\n });\n // return this.page(this.currentPage - 1);\n};\n\n// Paginate.prototype.reportLocation = function(){\n// return this.q.enqueue(function(){\n// this.location = this.currentLocation();\n// this.trigger(\"locationChanged\", this.location);\n// }.bind(this));\n// };\n\nPaginate.prototype.currentLocation = function(){\n var visible = this.visible();\n var startA, startB, endA, endB;\n var pageLeft, pageRight;\n var container = this.container.getBoundingClientRect();\n\n if(visible.length === 1) {\n startA = container.left - visible[0].position().left;\n endA = startA + this.layout.spread;\n\n return this.map.page(visible[0], startA, endA);\n }\n\n if(visible.length > 1) {\n\n // Left Col\n startA = container.left - visible[0].position().left;\n endA = startA + this.layout.column;\n\n // Right Col\n startB = container.left + this.layout.spread - visible[visible.length-1].position().left;\n endB = startB + this.layout.column;\n\n pageLeft = this.map.page(visible[0], startA, endA);\n pageRight = this.map.page(visible[visible.length-1], startB, endB);\n\n return {\n start: pageLeft.start,\n end: pageRight.end\n };\n }\n};\n\nPaginate.prototype.resize = function(width, height){\n // Clear the queue\n this.q.clear();\n\n this.stageSize(width, height);\n\n this.updateLayout();\n\n if(this.location) {\n this.display(this.location.start);\n }\n\n this.trigger(\"resized\", {\n width: this.stage.width,\n height: this.stage.height\n });\n\n};\n\nPaginate.prototype.onResized = function(e) {\n\n this.views.clear();\n\n clearTimeout(this.resizeTimeout);\n this.resizeTimeout = setTimeout(function(){\n this.resize();\n }.bind(this), 150);\n};\n\nPaginate.prototype.adjustImages = function(view) {\n\n view.addStylesheetRules([\n [\"img\",\n [\"max-width\", (this.layout.spread) + \"px\"],\n [\"max-height\", (this.layout.height) + \"px\"]\n ]\n ]);\n return new RSVP.Promise(function(resolve, reject){\n // Wait to apply\n setTimeout(function() {\n resolve();\n }, 1);\n });\n};\n\n// Paginate.prototype.display = function(what){\n// return this.display(what);\n// };\n\nmodule.exports = Paginate;\n","var URI = require('urijs');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\n\nfunction Parser(){};\n\nParser.prototype.container = function(containerXml){\n //-- \n var rootfile, fullpath, folder, encoding;\n\n if(!containerXml) {\n console.error(\"Container File Not Found\");\n return;\n }\n\n rootfile = containerXml.querySelector(\"rootfile\");\n\n if(!rootfile) {\n console.error(\"No RootFile Found\");\n return;\n }\n\n fullpath = rootfile.getAttribute('full-path');\n folder = URI(fullpath).directory();\n encoding = containerXml.xmlEncoding;\n\n //-- Now that we have the path we can parse the contents\n return {\n 'packagePath' : fullpath,\n 'basePath' : folder,\n 'encoding' : encoding\n };\n};\n\nParser.prototype.identifier = function(packageXml){\n var metadataNode;\n\n if(!packageXml) {\n console.error(\"Package File Not Found\");\n return;\n }\n\n metadataNode = packageXml.querySelector(\"metadata\");\n\n if(!metadataNode) {\n console.error(\"No Metadata Found\");\n return;\n }\n\n return this.getElementText(metadataNode, \"identifier\");\n};\n\nParser.prototype.packageContents = function(packageXml){\n var parse = this;\n var metadataNode, manifestNode, spineNode;\n var manifest, navPath, ncxPath, coverPath;\n var spineNodeIndex;\n var spine;\n var spineIndexByURL;\n var metadata;\n\n if(!packageXml) {\n console.error(\"Package File Not Found\");\n return;\n }\n\n metadataNode = packageXml.querySelector(\"metadata\");\n if(!metadataNode) {\n console.error(\"No Metadata Found\");\n return;\n }\n\n manifestNode = packageXml.querySelector(\"manifest\");\n if(!manifestNode) {\n console.error(\"No Manifest Found\");\n return;\n }\n\n spineNode = packageXml.querySelector(\"spine\");\n if(!spineNode) {\n console.error(\"No Spine Found\");\n return;\n }\n\n manifest = parse.manifest(manifestNode);\n navPath = parse.findNavPath(manifestNode);\n ncxPath = parse.findNcxPath(manifestNode, spineNode);\n coverPath = parse.findCoverPath(packageXml);\n\n spineNodeIndex = Array.prototype.indexOf.call(spineNode.parentNode.childNodes, spineNode);\n\n spine = parse.spine(spineNode, manifest);\n\n metadata = parse.metadata(metadataNode);\n\n\tmetadata.direction = spineNode.getAttribute(\"page-progression-direction\");\n\n return {\n 'metadata' : metadata,\n 'spine' : spine,\n 'manifest' : manifest,\n 'navPath' : navPath,\n 'ncxPath' : ncxPath,\n 'coverPath': coverPath,\n 'spineNodeIndex' : spineNodeIndex\n };\n};\n\n//-- Find TOC NAV\nParser.prototype.findNavPath = function(manifestNode){\n\t// Find item with property 'nav'\n\t// Should catch nav irregardless of order\n var node = manifestNode.querySelector(\"item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']\");\n return node ? node.getAttribute('href') : false;\n};\n\n//-- Find TOC NCX: media-type=\"application/x-dtbncx+xml\" href=\"toc.ncx\"\nParser.prototype.findNcxPath = function(manifestNode, spineNode){\n\tvar node = manifestNode.querySelector(\"item[media-type='application/x-dtbncx+xml']\");\n\tvar tocId;\n\n\t// If we can't find the toc by media-type then try to look for id of the item in the spine attributes as\n\t// according to http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.4.1.2,\n\t// \"The item that describes the NCX must be referenced by the spine toc attribute.\"\n\tif (!node) {\n\t\ttocId = spineNode.getAttribute(\"toc\");\n\t\tif(tocId) {\n\t\t\tnode = manifestNode.querySelector(\"item[id='\" + tocId + \"']\");\n\t\t}\n\t}\n\n\treturn node ? node.getAttribute('href') : false;\n};\n\n//-- Expanded to match Readium web components\nParser.prototype.metadata = function(xml){\n var metadata = {},\n p = this;\n\n metadata.title = p.getElementText(xml, 'title');\n metadata.creator = p.getElementText(xml, 'creator');\n metadata.description = p.getElementText(xml, 'description');\n\n metadata.pubdate = p.getElementText(xml, 'date');\n\n metadata.publisher = p.getElementText(xml, 'publisher');\n\n metadata.identifier = p.getElementText(xml, \"identifier\");\n metadata.language = p.getElementText(xml, \"language\");\n metadata.rights = p.getElementText(xml, \"rights\");\n\n metadata.modified_date = p.querySelectorText(xml, \"meta[property='dcterms:modified']\");\n metadata.layout = p.querySelectorText(xml, \"meta[property='rendition:layout']\");\n metadata.orientation = p.querySelectorText(xml, \"meta[property='rendition:orientation']\");\n metadata.spread = p.querySelectorText(xml, \"meta[property='rendition:spread']\");\n // metadata.page_prog_dir = packageXml.querySelector(\"spine\").getAttribute(\"page-progression-direction\");\n\n return metadata;\n};\n\n//-- Find Cover: \n//-- Fallback for Epub 2.0\nParser.prototype.findCoverPath = function(packageXml){\n\n\tvar epubVersion = packageXml.querySelector('package').getAttribute('version');\n\n\tif (epubVersion === '2.0') {\n\t\tvar metaCover = packageXml.querySelector('meta[name=\"cover\"]');\n\t\tif (metaCover) {\n\t\t\tvar coverId = metaCover.getAttribute('content');\n\t\t\tvar cover = packageXml.querySelector(\"item[id='\" + coverId + \"']\");\n\t\t\treturn cover ? cover.getAttribute('href') : false;\n\t\t}\n\t\telse {\n\t\t\treturn false;\n\t\t}\n\t}\n\telse {\n\t\tvar node = packageXml.querySelector(\"item[properties='cover-image']\");\n\t\treturn node ? node.getAttribute('href') : false;\n\t}\n};\n\nParser.prototype.getElementText = function(xml, tag){\n var found = xml.getElementsByTagNameNS(\"http://purl.org/dc/elements/1.1/\", tag),\n el;\n\n if(!found || found.length === 0) return '';\n\n el = found[0];\n\n if(el.childNodes.length){\n return el.childNodes[0].nodeValue;\n }\n\n return '';\n\n};\n\nParser.prototype.querySelectorText = function(xml, q){\n var el = xml.querySelector(q);\n\n if(el && el.childNodes.length){\n return el.childNodes[0].nodeValue;\n }\n\n return '';\n};\n\nParser.prototype.manifest = function(manifestXml){\n var manifest = {};\n\n //-- Turn items into an array\n var selected = manifestXml.querySelectorAll(\"item\"),\n items = Array.prototype.slice.call(selected);\n\n //-- Create an object with the id as key\n items.forEach(function(item){\n var id = item.getAttribute('id'),\n href = item.getAttribute('href') || '',\n type = item.getAttribute('media-type') || '',\n properties = item.getAttribute('properties') || '';\n\n manifest[id] = {\n 'href' : href,\n // 'url' : href,\n 'type' : type,\n 'properties' : properties.length ? properties.split(' ') : []\n };\n\n });\n\n return manifest;\n\n};\n\nParser.prototype.spine = function(spineXml, manifest){\n var spine = [];\n\n var selected = spineXml.getElementsByTagName(\"itemref\"),\n items = Array.prototype.slice.call(selected);\n\n var epubcfi = new EpubCFI();\n\n //-- Add to array to mantain ordering and cross reference with manifest\n items.forEach(function(item, index){\n var idref = item.getAttribute('idref');\n // var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id);\n var props = item.getAttribute('properties') || '';\n var propArray = props.length ? props.split(' ') : [];\n // var manifestProps = manifest[Id].properties;\n // var manifestPropArray = manifestProps.length ? manifestProps.split(' ') : [];\n\n var itemref = {\n 'idref' : idref,\n 'linear' : item.getAttribute('linear') || '',\n 'properties' : propArray,\n // 'href' : manifest[Id].href,\n // 'url' : manifest[Id].url,\n 'index' : index\n // 'cfiBase' : cfiBase\n };\n spine.push(itemref);\n });\n\n return spine;\n};\n\nParser.prototype.querySelectorByType = function(html, element, type){\n\tvar query = html.querySelector(element+'[*|type=\"'+type+'\"]');\n\t// Handle IE not supporting namespaced epub:type in querySelector\n\tif(query === null || query.length === 0) {\n\t\tquery = html.querySelectorAll(element);\n\t\tfor (var i = 0; i < query.length; i++) {\n\t\t\tif(query[i].getAttributeNS(\"http://www.idpf.org/2007/ops\", \"type\") === type) {\n\t\t\t\treturn query[i];\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn query;\n\t}\n};\n\nParser.prototype.nav = function(navHtml, spineIndexByURL, bookSpine){\n\tvar navElement = this.querySelectorByType(navHtml, \"nav\", \"toc\");\n\tvar navItems = navElement ? navElement.querySelectorAll(\"ol li\") : [];\n\tvar length = navItems.length;\n\tvar i;\n\tvar toc = {};\n\tvar list = [];\n\tvar item, parent;\n\n\tif(!navItems || length === 0) return list;\n\n\tfor (i = 0; i < length; ++i) {\n\t\titem = this.navItem(navItems[i], spineIndexByURL, bookSpine);\n\t\ttoc[item.id] = item;\n\t\tif(!item.parent) {\n\t\t\tlist.push(item);\n\t\t} else {\n\t\t\tparent = toc[item.parent];\n\t\t\tparent.subitems.push(item);\n\t\t}\n\t}\n\n\treturn list;\n};\n\nParser.prototype.navItem = function(item, spineIndexByURL, bookSpine){\n\tvar id = item.getAttribute('id') || false,\n\t\t\tcontent = item.querySelector(\"a, span\"),\n\t\t\tsrc = content.getAttribute('href') || '',\n\t\t\ttext = content.textContent || \"\",\n\t\t\t// split = src.split(\"#\"),\n\t\t\t// baseUrl = split[0],\n\t\t\t// spinePos = spineIndexByURL[baseUrl],\n\t\t\t// spineItem = bookSpine[spinePos],\n\t\t\tsubitems = [],\n\t\t\tparentNode = item.parentNode,\n\t\t\tparent;\n\t\t\t// cfi = spineItem ? spineItem.cfi : '';\n\n\tif(parentNode && parentNode.nodeName === \"navPoint\") {\n\t\tparent = parentNode.getAttribute('id');\n\t}\n\n /*\n\tif(!id) {\n\t\tif(spinePos) {\n\t\t\tspineItem = bookSpine[spinePos];\n\t\t\tid = spineItem.id;\n\t\t\tcfi = spineItem.cfi;\n\t\t} else {\n\t\t\tid = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid();\n\t\t\titem.setAttribute('id', id);\n\t\t}\n\t}\n */\n\n\treturn {\n\t\t\"id\": id,\n\t\t\"href\": src,\n\t\t\"label\": text,\n\t\t\"subitems\" : subitems,\n\t\t\"parent\" : parent\n\t};\n};\n\nParser.prototype.toc = function(tocXml, spineIndexByURL, bookSpine){\n\tvar navPoints = tocXml.querySelectorAll(\"navMap navPoint\");\n\tvar length = navPoints.length;\n\tvar i;\n\tvar toc = {};\n\tvar list = [];\n\tvar item, parent;\n\n\tif(!navPoints || length === 0) return list;\n\n\tfor (i = 0; i < length; ++i) {\n\t\titem = this.tocItem(navPoints[i], spineIndexByURL, bookSpine);\n\t\ttoc[item.id] = item;\n\t\tif(!item.parent) {\n\t\t\tlist.push(item);\n\t\t} else {\n\t\t\tparent = toc[item.parent];\n\t\t\tparent.subitems.push(item);\n\t\t}\n\t}\n\n\treturn list;\n};\n\nParser.prototype.tocItem = function(item, spineIndexByURL, bookSpine){\n\tvar id = item.getAttribute('id') || false,\n\t\t\tcontent = item.querySelector(\"content\"),\n\t\t\tsrc = content.getAttribute('src'),\n\t\t\tnavLabel = item.querySelector(\"navLabel\"),\n\t\t\ttext = navLabel.textContent ? navLabel.textContent : \"\",\n\t\t\t// split = src.split(\"#\"),\n\t\t\t// baseUrl = split[0],\n\t\t\t// spinePos = spineIndexByURL[baseUrl],\n\t\t\t// spineItem = bookSpine[spinePos],\n\t\t\tsubitems = [],\n\t\t\tparentNode = item.parentNode,\n\t\t\tparent;\n\t\t\t// cfi = spineItem ? spineItem.cfi : '';\n\n\tif(parentNode && parentNode.nodeName === \"navPoint\") {\n\t\tparent = parentNode.getAttribute('id');\n\t}\n\n /*\n\tif(!id) {\n\t\tif(spinePos) {\n\t\t\tspineItem = bookSpine[spinePos];\n\t\t\tid = spineItem.id;\n\t\t\tcfi = spineItem.cfi;\n\t\t} else {\n\t\t\tid = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid();\n\t\t\titem.setAttribute('id', id);\n\t\t}\n\t}\n */\n\n\treturn {\n\t\t\"id\": id,\n\t\t\"href\": src,\n\t\t\"label\": text,\n\t\t\"subitems\" : subitems,\n\t\t\"parent\" : parent\n\t};\n};\n\nParser.prototype.pageList = function(navHtml, spineIndexByURL, bookSpine){\n\tvar navElement = this.querySelectorByType(navHtml, \"nav\", \"page-list\");\n\tvar navItems = navElement ? navElement.querySelectorAll(\"ol li\") : [];\n\tvar length = navItems.length;\n\tvar i;\n\tvar toc = {};\n\tvar list = [];\n\tvar item;\n\n\tif(!navItems || length === 0) return list;\n\n\tfor (i = 0; i < length; ++i) {\n\t\titem = this.pageListItem(navItems[i], spineIndexByURL, bookSpine);\n\t\tlist.push(item);\n\t}\n\n\treturn list;\n};\n\nParser.prototype.pageListItem = function(item, spineIndexByURL, bookSpine){\n\tvar id = item.getAttribute('id') || false,\n\t\tcontent = item.querySelector(\"a\"),\n\t\thref = content.getAttribute('href') || '',\n\t\ttext = content.textContent || \"\",\n\t\tpage = parseInt(text),\n\t\tisCfi = href.indexOf(\"epubcfi\"),\n\t\tsplit,\n\t\tpackageUrl,\n\t\tcfi;\n\n\tif(isCfi != -1) {\n\t\tsplit = href.split(\"#\");\n\t\tpackageUrl = split[0];\n\t\tcfi = split.length > 1 ? split[1] : false;\n\t\treturn {\n\t\t\t\"cfi\" : cfi,\n\t\t\t\"href\" : href,\n\t\t\t\"packageUrl\" : packageUrl,\n\t\t\t\"page\" : page\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\t\"href\" : href,\n\t\t\t\"page\" : page\n\t\t};\n\t}\n};\n\nmodule.exports = Parser;\n","var RSVP = require('rsvp');\nvar core = require('./core');\n\nfunction Queue(_context){\n this._q = [];\n this.context = _context;\n this.tick = core.requestAnimationFrame;\n this.running = false;\n this.paused = false;\n};\n\n// Add an item to the queue\nQueue.prototype.enqueue = function() {\n var deferred, promise;\n var queued;\n var task = [].shift.call(arguments);\n var args = arguments;\n\n // Handle single args without context\n // if(args && !Array.isArray(args)) {\n // args = [args];\n // }\n if(!task) {\n return console.error(\"No Task Provided\");\n }\n\n if(typeof task === \"function\"){\n\n deferred = new RSVP.defer();\n promise = deferred.promise;\n\n queued = {\n \"task\" : task,\n \"args\" : args,\n //\"context\" : context,\n \"deferred\" : deferred,\n \"promise\" : promise\n };\n\n } else {\n // Task is a promise\n queued = {\n \"promise\" : task\n };\n\n }\n\n this._q.push(queued);\n\n // Wait to start queue flush\n if (this.paused == false && !this.running) {\n // setTimeout(this.flush.bind(this), 0);\n // this.tick.call(window, this.run.bind(this));\n this.run();\n }\n\n return queued.promise;\n};\n\n// Run one item\nQueue.prototype.dequeue = function(){\n var inwait, task, result;\n\n if(this._q.length) {\n inwait = this._q.shift();\n task = inwait.task;\n if(task){\n // console.log(task)\n\n result = task.apply(this.context, inwait.args);\n\n if(result && typeof result[\"then\"] === \"function\") {\n // Task is a function that returns a promise\n return result.then(function(){\n inwait.deferred.resolve.apply(this.context, arguments);\n }.bind(this));\n } else {\n // Task resolves immediately\n inwait.deferred.resolve.apply(this.context, result);\n return inwait.promise;\n }\n\n\n\n } else if(inwait.promise) {\n // Task is a promise\n return inwait.promise;\n }\n\n } else {\n inwait = new RSVP.defer();\n inwait.deferred.resolve();\n return inwait.promise;\n }\n\n};\n\n// Run All Immediately\nQueue.prototype.dump = function(){\n while(this._q.length) {\n this.dequeue();\n }\n};\n\n// Run all sequentially, at convince\n\nQueue.prototype.run = function(){\n\n if(!this.running){\n this.running = true;\n this.defered = new RSVP.defer();\n }\n\n this.tick.call(window, function() {\n\n if(this._q.length) {\n\n this.dequeue()\n .then(function(){\n this.run();\n }.bind(this));\n\n } else {\n this.defered.resolve();\n this.running = undefined;\n }\n\n }.bind(this));\n\n // Unpause\n if(this.paused == true) {\n this.paused = false;\n }\n\n return this.defered.promise;\n};\n\n// Flush all, as quickly as possible\nQueue.prototype.flush = function(){\n\n if(this.running){\n return this.running;\n }\n\n if(this._q.length) {\n this.running = this.dequeue()\n .then(function(){\n this.running = undefined;\n return this.flush();\n }.bind(this));\n\n return this.running;\n }\n\n};\n\n// Clear all items in wait\nQueue.prototype.clear = function(){\n this._q = [];\n this.running = false;\n};\n\nQueue.prototype.length = function(){\n return this._q.length;\n};\n\nQueue.prototype.pause = function(){\n this.paused = true;\n};\n\n// Create a new task from a callback\nfunction Task(task, args, context){\n\n return function(){\n var toApply = arguments || [];\n\n return new RSVP.Promise(function(resolve, reject) {\n var callback = function(value){\n resolve(value);\n };\n // Add the callback to the arguments list\n toApply.push(callback);\n\n // Apply all arguments to the functions\n task.apply(this, toApply);\n\n }.bind(this));\n\n };\n\n};\n\nmodule.exports = Queue;\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar replace = require('./replacements');\nvar Hook = require('./hook');\nvar EpubCFI = require('./epubcfi');\nvar Queue = require('./queue');\nvar View = require('./view');\nvar Views = require('./views');\nvar Layout = require('./layout');\nvar Map = require('./map');\n\nfunction Rendition(book, options) {\n\n\tthis.settings = core.extend(this.settings || {}, {\n\t\tinfinite: true,\n\t\thidden: false,\n\t\twidth: false,\n\t\theight: null,\n\t\tlayoutOveride : null, // Default: { spread: 'reflowable', layout: 'auto', orientation: 'auto'},\n\t\taxis: \"vertical\"\n\t});\n\n\tcore.extend(this.settings, options);\n\n\tthis.viewSettings = {};\n\n\tthis.book = book;\n\n\tthis.views = null;\n\n\t//-- Adds Hook methods to the Rendition prototype\n\tthis.hooks = {};\n\tthis.hooks.display = new Hook(this);\n\tthis.hooks.serialize = new Hook(this);\n\tthis.hooks.content = new Hook(this);\n\tthis.hooks.layout = new Hook(this);\n\tthis.hooks.render = new Hook(this);\n\tthis.hooks.show = new Hook(this);\n\n\tthis.hooks.content.register(replace.links.bind(this));\n\tthis.hooks.content.register(this.passViewEvents.bind(this));\n\n\t// this.hooks.display.register(this.afterDisplay.bind(this));\n\n this.epubcfi = new EpubCFI();\n\n\tthis.q = new Queue(this);\n\n\tthis.q.enqueue(this.book.opened);\n\n\tthis.q.enqueue(this.parseLayoutProperties);\n\n\tif(this.book.archive) {\n\t\tthis.replacements();\n\t}\n};\n\n/**\n* Creates an element to render to.\n* Resizes to passed width and height or to the elements size\n*/\nRendition.prototype.initialize = function(_options){\n\tvar options = _options || {};\n\tvar height = options.height;// !== false ? options.height : \"100%\";\n\tvar width = options.width;// !== false ? options.width : \"100%\";\n\tvar hidden = options.hidden || false;\n\tvar container;\n\tvar wrapper;\n\n\tif(options.height && core.isNumber(options.height)) {\n\t\theight = options.height + \"px\";\n\t}\n\n\tif(options.width && core.isNumber(options.width)) {\n\t\twidth = options.width + \"px\";\n\t}\n\n\t// Create new container element\n\tcontainer = document.createElement(\"div\");\n\n\tcontainer.id = \"epubjs-container:\" + core.uuid();\n\tcontainer.classList.add(\"epub-container\");\n\n\t// Style Element\n\tcontainer.style.fontSize = \"0\";\n\tcontainer.style.wordSpacing = \"0\";\n\tcontainer.style.lineHeight = \"0\";\n\tcontainer.style.verticalAlign = \"top\";\n\n\tif(this.settings.axis === \"horizontal\") {\n\t\tcontainer.style.whiteSpace = \"nowrap\";\n\t}\n\n\tif(width){\n\t\tcontainer.style.width = width;\n\t}\n\n\tif(height){\n\t\tcontainer.style.height = height;\n\t}\n\n\tcontainer.style.overflow = this.settings.overflow;\n\n\treturn container;\n};\n\nRendition.wrap = function(container) {\n\tvar wrapper = document.createElement(\"div\");\n\n\twrapper.style.visibility = \"hidden\";\n\twrapper.style.overflow = \"hidden\";\n\twrapper.style.width = \"0\";\n\twrapper.style.height = \"0\";\n\n\twrapper.appendChild(container);\n\treturn wrapper;\n};\n\n// Call to attach the container to an element in the dom\n// Container must be attached before rendering can begin\nRendition.prototype.attachTo = function(_element){\n\tvar bounds;\n\n\tthis.container = this.initialize({\n\t\t\"width\" : this.settings.width,\n\t\t\"height\" : this.settings.height\n\t});\n\n\tif(core.isElement(_element)) {\n\t\tthis.element = _element;\n\t} else if (typeof _element === \"string\") {\n\t\tthis.element = document.getElementById(_element);\n\t}\n\n\tif(!this.element){\n\t\tconsole.error(\"Not an Element\");\n\t\treturn;\n\t}\n\n\tif(this.settings.hidden) {\n\t\tthis.wrapper = this.wrap(this.container);\n\t\tthis.element.appendChild(this.wrapper);\n\t} else {\n\t\tthis.element.appendChild(this.container);\n\t}\n\n\tthis.views = new Views(this.container);\n\n\t// Attach Listeners\n\tthis.attachListeners();\n\n\t// Calculate Stage Size\n\tthis.stageSize();\n\n\t// Add Layout method\n\tthis.applyLayoutMethod();\n\n\t// Trigger Attached\n\tthis.trigger(\"attached\");\n\n\t// Start processing queue\n\t// this.q.run();\n\n};\n\nRendition.prototype.attachListeners = function(){\n\n\t// Listen to window for resize event if width or height is set to 100%\n\tif(!core.isNumber(this.settings.width) ||\n\t\t !core.isNumber(this.settings.height) ) {\n\t\twindow.addEventListener(\"resize\", this.onResized.bind(this), false);\n\t}\n\n};\n\nRendition.prototype.bounds = function() {\n\treturn this.container.getBoundingClientRect();\n};\n\nRendition.prototype.display = function(target){\n\n\treturn this.q.enqueue(this._display, target);\n\n};\n\nRendition.prototype._display = function(target){\n\n\tvar displaying = new RSVP.defer();\n\tvar displayed = displaying.promise;\n\n\tvar section;\n var view;\n var offset;\n\tvar fragment;\n\tvar cfi = this.epubcfi.isCfiString(target);\n\n\tvar visible;\n\n\tsection = this.book.spine.get(target);\n\n\tif(!section){\n\t\tdisplaying.reject(new Error(\"No Section Found\"));\n\t\treturn displayed;\n\t}\n\n\t// Check to make sure the section we want isn't already shown\n\tvisible = this.views.find(section);\n\n\tif(visible) {\n\t\toffset = view.locationOf(target);\n\t\tdisplayed = this.moveTo(offset)\n\t\t\t.then(function(){\n\t\t\t\treturn this.check();\n\t\t\t});\n\t} else {\n\n\t\t// Hide all current views\n\t\tthis.views.hide();\n\n\t\t// Create a new view\n\t\t// view = new View(section, this.viewSettings);\n\t\tview = this.createView(section);\n\n\t\t// This will clear all previous views\n\t\tdisplayed = this.fill(view)\n\t\t\t.then(function(){\n\n\t\t\t\t// Parse the target fragment\n\t\t\t\tif(typeof target === \"string\" &&\n\t\t\t\t\ttarget.indexOf(\"#\") > -1) {\n\t\t\t\t\t\tfragment = target.substring(target.indexOf(\"#\")+1);\n\t\t\t\t}\n\n\t\t\t\t// Move to correct place within the section, if needed\n\t\t\t\tif(cfi || fragment) {\n\t\t\t\t\toffset = view.locationOf(target);\n\t\t\t\t\treturn this.moveTo(offset);\n\t\t\t\t}\n\n\t\t\t\tif(typeof this.check === 'function') {\n\t\t\t\t\treturn this.check();\n\t\t\t\t}\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\treturn this.hooks.display.trigger(view);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tthis.views.show();\n\t\t\t}.bind(this));\n\t}\n\n\tdisplayed.then(function(){\n\n\t\tthis.trigger(\"displayed\", section);\n\n\t}.bind(this));\n\n\n\treturn displayed;\n};\n\n// Takes a cfi, fragment or page?\nRendition.prototype.moveTo = function(offset){\n\tthis.scrollBy(offset.left, offset.top);\n};\n\nRendition.prototype.render = function(view, show) {\n\n\tview.create();\n\n\tview.onLayout = this.layout.format.bind(this.layout);\n\n\t// Fit to size of the container, apply padding\n\tthis.resizeView(view);\n\n\t// Render Chain\n\treturn view.render(this.book.request)\n\t\t.then(function(){\n\t\t\treturn this.hooks.content.trigger(view, this);\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\treturn this.hooks.layout.trigger(view, this);\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\treturn view.display();\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\treturn this.hooks.render.trigger(view, this);\n\t\t}.bind(this))\n\t\t.then(function(){\n\t\t\tif(show !== false && this.views.hidden === false) {\n\t\t\t\tthis.q.enqueue(function(view){\n\t\t\t\t\tview.show();\n\t\t\t\t}, view);\n\t\t\t}\n\n\n\t\t\t// this.map = new Map(view, this.layout);\n\t\t\tthis.hooks.show.trigger(view, this);\n\t\t\tthis.trigger(\"rendered\", view.section);\n\n\t\t}.bind(this))\n\t\t.catch(function(e){\n\t\t\tthis.trigger(\"loaderror\", e);\n\t\t}.bind(this));\n\n};\n\n\nRendition.prototype.afterDisplayed = function(view){\n\tthis.trigger(\"added\", view.section);\n};\n\nRendition.prototype.fill = function(view){\n\n\tthis.views.clear();\n\n\tthis.views.append(view);\n\n\t// view.on(\"shown\", this.afterDisplayed.bind(this));\n\tview.onDisplayed = this.afterDisplayed.bind(this);\n\n\treturn this.render(view);\n};\n\nRendition.prototype.resizeView = function(view) {\n\n\tif(this.globalLayoutProperties.layout === \"pre-paginated\") {\n\t\tview.lock(\"both\", this.stage.width, this.stage.height);\n\t} else {\n\t\tview.lock(\"width\", this.stage.width, this.stage.height);\n\t}\n\n};\n\nRendition.prototype.stageSize = function(_width, _height){\n\tvar bounds;\n\tvar width = _width || this.settings.width;\n\tvar height = _height || this.settings.height;\n\n\t// If width or height are set to false, inherit them from containing element\n\tif(width === false) {\n\t\tbounds = this.element.getBoundingClientRect();\n\n\t\tif(bounds.width) {\n\t\t\twidth = bounds.width;\n\t\t\tthis.container.style.width = bounds.width + \"px\";\n\t\t}\n\t}\n\n\tif(height === false) {\n\t\tbounds = bounds || this.element.getBoundingClientRect();\n\n\t\tif(bounds.height) {\n\t\t\theight = bounds.height;\n\t\t\tthis.container.style.height = bounds.height + \"px\";\n\t\t}\n\n\t}\n\n\tif(width && !core.isNumber(width)) {\n\t\tbounds = this.container.getBoundingClientRect();\n\t\twidth = bounds.width;\n\t\t//height = bounds.height;\n\t}\n\n\tif(height && !core.isNumber(height)) {\n\t\tbounds = bounds || this.container.getBoundingClientRect();\n\t\t//width = bounds.width;\n\t\theight = bounds.height;\n\t}\n\n\n\tthis.containerStyles = window.getComputedStyle(this.container);\n\tthis.containerPadding = {\n\t\tleft: parseFloat(this.containerStyles[\"padding-left\"]) || 0,\n\t\tright: parseFloat(this.containerStyles[\"padding-right\"]) || 0,\n\t\ttop: parseFloat(this.containerStyles[\"padding-top\"]) || 0,\n\t\tbottom: parseFloat(this.containerStyles[\"padding-bottom\"]) || 0\n\t};\n\n\tthis.stage = {\n\t\twidth: width -\n\t\t\t\t\t\tthis.containerPadding.left -\n\t\t\t\t\t\tthis.containerPadding.right,\n\t\theight: height -\n\t\t\t\t\t\tthis.containerPadding.top -\n\t\t\t\t\t\tthis.containerPadding.bottom\n\t};\n\n\treturn this.stage;\n\n};\n\nRendition.prototype.applyLayoutMethod = function() {\n\n\tthis.layout = new Layout.Scroll();\n\tthis.updateLayout();\n\n\tthis.map = new Map(this.layout);\n};\n\nRendition.prototype.updateLayout = function() {\n\n\tthis.layout.calculate(this.stage.width, this.stage.height);\n\n};\n\nRendition.prototype.resize = function(width, height){\n\n\tthis.stageSize(width, height);\n\n\tthis.updateLayout();\n\n\tthis.views.each(this.resizeView.bind(this));\n\n\tthis.trigger(\"resized\", {\n\t\twidth: this.stage.width,\n\t\theight: this.stage.height\n\t});\n\n};\n\nRendition.prototype.onResized = function(e) {\n\tthis.resize();\n};\n\nRendition.prototype.createView = function(section) {\n\t// Transfer the existing hooks\n\tsection.hooks.serialize.register(this.hooks.serialize.list());\n\n\treturn new View(section, this.viewSettings);\n};\n\nRendition.prototype.next = function(){\n\n\treturn this.q.enqueue(function(){\n\n\t\tvar next;\n\t\tvar view;\n\n\t\tif(!this.views.length) return;\n\n\t\tnext = this.views.last().section.next();\n\n\t\tif(next) {\n\t\t\tview = this.createView(next);\n\t\t\treturn this.fill(view);\n\t\t}\n\n\t});\n\n};\n\nRendition.prototype.prev = function(){\n\n\treturn this.q.enqueue(function(){\n\n\t\tvar prev;\n\t\tvar view;\n\n\t\tif(!this.views.length) return;\n\n\t\tprev = this.views.first().section.prev();\n\t\tif(prev) {\n\t\t\tview = this.createView(prev);\n\t\t\treturn this.fill(view);\n\t\t}\n\n\t});\n\n};\n\n//-- http://www.idpf.org/epub/fxl/\nRendition.prototype.parseLayoutProperties = function(_metadata){\n\tvar metadata = _metadata || this.book.package.metadata;\n\tvar layout = (this.layoutOveride && this.layoutOveride.layout) || metadata.layout || \"reflowable\";\n\tvar spread = (this.layoutOveride && this.layoutOveride.spread) || metadata.spread || \"auto\";\n\tvar orientation = (this.layoutOveride && this.layoutOveride.orientation) || metadata.orientation || \"auto\";\n\tthis.globalLayoutProperties = {\n\t\tlayout : layout,\n\t\tspread : spread,\n\t\torientation : orientation\n\t};\n\treturn this.globalLayoutProperties;\n};\n\n\nRendition.prototype.current = function(){\n\tvar visible = this.visible();\n\tif(visible.length){\n\t\t// Current is the last visible view\n\t\treturn visible[visible.length-1];\n\t}\n return null;\n};\n\nRendition.prototype.isVisible = function(view, offsetPrev, offsetNext, _container){\n\tvar position = view.position();\n\tvar container = _container || this.container.getBoundingClientRect();\n\n\tif(this.settings.axis === \"horizontal\" &&\n\t\tposition.right > container.left - offsetPrev &&\n\t\tposition.left < container.right + offsetNext) {\n\n\t\treturn true;\n\n } else if(this.settings.axis === \"vertical\" &&\n \tposition.bottom > container.top - offsetPrev &&\n\t\tposition.top < container.bottom + offsetNext) {\n\n\t\treturn true;\n }\n\n\treturn false;\n\n};\n\nRendition.prototype.visible = function(){\n\tvar container = this.bounds();\n\tvar displayedViews = this.views.displayed();\n var visible = [];\n var isVisible;\n var view;\n\n for (var i = 0; i < displayedViews.length; i++) {\n view = displayedViews[i];\n isVisible = this.isVisible(view, 0, 0, container);\n\n if(isVisible === true) {\n visible.push(view);\n }\n\n }\n return visible;\n\n};\n\nRendition.prototype.bounds = function(func) {\n var bounds;\n\n if(!this.settings.height) {\n bounds = core.windowBounds();\n } else {\n bounds = this.container.getBoundingClientRect();\n }\n\n return bounds;\n};\n\nRendition.prototype.destroy = function(){\n // Clear the queue\n\tthis.q.clear();\n\n\tthis.views.clear();\n\n\tclearTimeout(this.trimTimeout);\n\tif(this.settings.hidden) {\n\t\tthis.element.removeChild(this.wrapper);\n\t} else {\n\t\tthis.element.removeChild(this.container);\n\t}\n\n};\n\nRendition.prototype.reportLocation = function(){\n return this.q.enqueue(function(){\n this.location = this.currentLocation();\n this.trigger(\"locationChanged\", this.location);\n }.bind(this));\n};\n\nRendition.prototype.currentLocation = function(){\n var view;\n var start, end;\n\n if(this.views.length) {\n \tview = this.views.first();\n // start = container.left - view.position().left;\n // end = start + this.layout.spread;\n\n return this.map.page(view);\n }\n\n};\n\nRendition.prototype.scrollBy = function(x, y, silent){\n if(silent) {\n this.ignore = true;\n }\n\n if(this.settings.height) {\n\n if(x) this.container.scrollLeft += x;\n \tif(y) this.container.scrollTop += y;\n\n } else {\n \twindow.scrollBy(x,y);\n }\n // console.log(\"scrollBy\", x, y);\n this.scrolled = true;\n};\n\nRendition.prototype.scrollTo = function(x, y, silent){\n if(silent) {\n this.ignore = true;\n }\n\n if(this.settings.height) {\n \tthis.container.scrollLeft = x;\n \tthis.container.scrollTop = y;\n } else {\n \twindow.scrollTo(x,y);\n }\n // console.log(\"scrollTo\", x, y);\n this.scrolled = true;\n // if(this.container.scrollLeft != x){\n // setTimeout(function() {\n // this.scrollTo(x, y, silent);\n // }.bind(this), 10);\n // return;\n // };\n };\n\nRendition.prototype.passViewEvents = function(view){\n view.listenedEvents.forEach(function(e){\n\t\tview.on(e, this.triggerViewEvent.bind(this));\n\t}.bind(this));\n};\n\nRendition.prototype.triggerViewEvent = function(e){\n this.trigger(e.type, e);\n};\n\nRendition.prototype.replacements = function(){\n\t// Wait for loading\n\treturn this.q.enqueue(function () {\n\t\t// Get thes books manifest\n\t\tvar manifest = this.book.package.manifest;\n\t var manifestArray = Object.keys(manifest).\n\t map(function (key){\n\t return manifest[key];\n\t });\n\n\t // Exclude HTML\n\t var items = manifestArray.\n\t filter(function (item){\n\t if (item.type != \"application/xhtml+xml\" &&\n\t item.type != \"text/html\") {\n\t return true;\n\t }\n\t });\n\n\t // Only CSS\n\t var css = items.\n\t filter(function (item){\n\t if (item.type === \"text/css\") {\n\t return true;\n\t }\n\t });\n\n\t\t// Css Urls\n\t\tvar cssUrls = css.map(function(item) {\n\t\t\treturn item.href;\n\t\t});\n\n\t\t// All Assets Urls\n\t var urls = items.\n\t map(function(item) {\n\t return item.href;\n\t }.bind(this));\n\n\t\t// Create blob urls for all the assets\n\t var processing = urls.\n\t map(function(url) {\n\t\t\t\tvar absolute = URI(url).absoluteTo(this.book.baseUrl).toString();\n\t\t\t\t// Full url from archive base\n\t return this.book.archive.createUrl(absolute);\n\t }.bind(this));\n\n\t\t// After all the urls are created\n\t return RSVP.all(processing).\n\t then(function(replacementUrls) {\n\n\t\t\t\t// Replace Asset Urls in the text of all css files\n\t\t\t\tcssUrls.forEach(function(href) {\n\t\t\t\t\tthis.replaceCss(href, urls, replacementUrls);\n\t\t }.bind(this));\n\n\t\t\t\t// Replace Asset Urls in chapters\n\t\t\t\t// by registering a hook after the sections contents has been serialized\n\t this.hooks.serialize.register(function(output, section) {\n\t\t\t\t\tthis.replaceAssets(section, urls, replacementUrls);\n\t }.bind(this));\n\n\t }.bind(this)).catch(function(reason){\n\t console.error(reason);\n\t });\n\t}.bind(this));\n};\n\nRendition.prototype.replaceCss = function(href, urls, replacementUrls){\n\t\tvar newUrl;\n\t\tvar indexInUrls;\n\n\t\t// Find the absolute url of the css file\n\t\tvar fileUri = URI(href);\n\t\tvar absolute = fileUri.absoluteTo(this.book.baseUrl).toString();\n\t\t// Get the text of the css file from the archive\n\t\tvar text = this.book.archive.getText(absolute);\n\t\t// Get asset links relative to css file\n\t\tvar relUrls = urls.\n\t\t\tmap(function(assetHref) {\n\t\t\t\tvar assetUri = URI(assetHref).absoluteTo(this.book.baseUrl);\n\t\t\t\tvar relative = assetUri.relativeTo(absolute).toString();\n\t\t\t\treturn relative;\n\t\t\t}.bind(this));\n\n\t\t// Replacements in the css text\n\t\ttext = replace.substitute(text, relUrls, replacementUrls);\n\n\t\t// Get the new url\n\t\tnewUrl = core.createBlobUrl(text, 'text/css');\n\n\t\t// switch the url in the replacementUrls\n\t\tindexInUrls = urls.indexOf(href);\n\t\tif (indexInUrls > -1) {\n\t\t\treplacementUrls[indexInUrls] = newUrl;\n\t\t}\n};\n\nRendition.prototype.replaceAssets = function(section, urls, replacementUrls){\n\tvar fileUri = URI(section.url);\n\t// Get Urls relative to current sections\n\tvar relUrls = urls.\n\t\tmap(function(href) {\n\t\t\tvar assetUri = URI(href).absoluteTo(this.book.baseUrl);\n\t\t\tvar relative = assetUri.relativeTo(fileUri).toString();\n\t\t\treturn relative;\n\t\t}.bind(this));\n\n\n\tsection.output = replace.substitute(section.output, relUrls, replacementUrls);\n};\n//-- Enable binding events to Renderer\nRSVP.EventTarget.mixin(Rendition.prototype);\n\nmodule.exports = Rendition;\n","var URI = require('urijs');\nvar core = require('./core');\n\nfunction base(doc, section){\n var base;\n var head;\n\n if(!doc){\n return;\n }\n\n head = doc.querySelector(\"head\");\n base = head.querySelector(\"base\");\n\n if(!base) {\n base = doc.createElement(\"base\");\n }\n\n base.setAttribute(\"href\", section.url);\n head.insertBefore(base, head.firstChild);\n\n}\n\nfunction links(view, renderer) {\n\n var links = view.document.querySelectorAll(\"a[href]\");\n var replaceLinks = function(link){\n var href = link.getAttribute(\"href\");\n var linkUri = URI(href);\n var absolute = linkUri.absoluteTo(view.section.url);\n var relative = absolute.relativeTo(this.book.baseUrl).toString();\n\n if(linkUri.protocol()){\n\n link.setAttribute(\"target\", \"_blank\");\n\n }else{\n /*\n if(baseDirectory) {\n\t\t\t\t// We must ensure that the file:// protocol is preserved for\n\t\t\t\t// local file links, as in certain contexts (such as under\n\t\t\t\t// Titanium), file links without the file:// protocol will not\n\t\t\t\t// work\n\t\t\t\tif (baseUri.protocol === \"file\") {\n\t\t\t\t\trelative = core.resolveUrl(baseUri.base, href);\n\t\t\t\t} else {\n\t\t\t\t\trelative = core.resolveUrl(baseDirectory, href);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trelative = href;\n\t\t\t}\n */\n\n if(linkUri.fragment()) {\n // do nothing with fragment yet\n } else {\n link.onclick = function(){\n renderer.display(relative);\n return false;\n };\n }\n\n }\n };\n\n for (var i = 0; i < links.length; i++) {\n replaceLinks(links[i]);\n }\n\n\n};\n\nfunction substitute(content, urls, replacements) {\n urls.forEach(function(url, i){\n if (url && replacements[i]) {\n content = content.replace(new RegExp(url, 'g'), replacements[i]);\n }\n });\n return content;\n}\nmodule.exports = {\n 'base': base,\n 'links': links,\n 'substitute': substitute\n};\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\n\nfunction request(url, type, withCredentials, headers) {\n var supportsURL = window.URL;\n var BLOB_RESPONSE = supportsURL ? \"blob\" : \"arraybuffer\";\n var uri;\n\n var deferred = new RSVP.defer();\n\n var xhr = new XMLHttpRequest();\n\n //-- Check from PDF.js:\n // https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js\n var xhrPrototype = XMLHttpRequest.prototype;\n\n var header;\n\n if (!('overrideMimeType' in xhrPrototype)) {\n // IE10 might have response, but not overrideMimeType\n Object.defineProperty(xhrPrototype, 'overrideMimeType', {\n value: function xmlHttpRequestOverrideMimeType(mimeType) {}\n });\n }\n if(withCredentials) {\n xhr.withCredentials = true;\n }\n\n xhr.open(\"GET\", url, true);\n\n for(header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n\n xhr.onreadystatechange = handler;\n\n // If type isn't set, determine it from the file extension\n\tif(!type) {\n\t\turi = URI(url);\n\t\ttype = uri.suffix();\n\t}\n\n if(type == 'blob'){\n xhr.responseType = BLOB_RESPONSE;\n }\n\n if(type == \"json\") {\n xhr.setRequestHeader(\"Accept\", \"application/json\");\n }\n\n if(core.isXml(type)) {\n\t\txhr.responseType = \"document\";\n\t\txhr.overrideMimeType('text/xml'); // for OPF parsing\n\t}\n\n\tif(type == 'xhtml') {\n\t\txhr.responseType = \"document\";\n\t}\n\n\tif(type == 'html' || type == 'htm') {\n\t\txhr.responseType = \"document\";\n \t}\n\n if(type == \"binary\") {\n xhr.responseType = \"arraybuffer\";\n }\n\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200 || this.responseXML ) { //-- Firefox is reporting 0 for blob urls\n var r;\n\n if((this.responseType == '' || this.responseType == 'document')\n && this.responseXML){\n r = this.responseXML;\n } else\n if(core.isXml(type)){\n // If this.responseXML wasn't set, try to parse using a DOMParser from text\n r = new DOMParser().parseFromString(this.response, \"text/xml\");\n }else\n if(type == 'xhtml'){\n r = new DOMParser().parseFromString(this.response, \"application/xhtml+xml\");\n }else\n if(type == 'html' || type == 'htm'){\n r = new DOMParser().parseFromString(this.response, \"text/html\");\n }else\n if(type == 'json'){\n r = JSON.parse(this.response);\n }else\n if(type == 'blob'){\n\n if(supportsURL) {\n r = this.response;\n } else {\n //-- Safari doesn't support responseType blob, so create a blob from arraybuffer\n r = new Blob([this.response]);\n }\n\n }else{\n r = this.response;\n }\n\n deferred.resolve(r);\n } else {\n deferred.reject({\n status: this.status,\n message : this.response,\n stack : new Error().stack\n });\n }\n }\n }\n\n return deferred.promise;\n};\n\nmodule.exports = request;\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Hook = require('./hook');\nvar replacements = require('./replacements');\n\nfunction Section(item, hooks){\n this.idref = item.idref;\n this.linear = item.linear;\n this.properties = item.properties;\n this.index = item.index;\n this.href = item.href;\n this.url = item.url;\n this.next = item.next;\n this.prev = item.prev;\n\n this.epubcfi = new EpubCFI();\n this.cfiBase = item.cfiBase;\n\n this.hooks = {};\n this.hooks.serialize = new Hook(this);\n this.hooks.content = new Hook(this);\n\n // Register replacements\n this.hooks.content.register(replacements.base);\n};\n\n\nSection.prototype.load = function(_request){\n var request = _request || this.request || require('./request');\n var loading = new RSVP.defer();\n var loaded = loading.promise;\n\n if(this.contents) {\n loading.resolve(this.contents);\n } else {\n request(this.url)\n .then(function(xml){\n var base;\n var directory = URI(this.url).directory();\n\n this.document = xml;\n this.contents = xml.documentElement;\n\n return this.hooks.content.trigger(this.document, this);\n }.bind(this))\n .then(function(){\n loading.resolve(this.contents);\n }.bind(this))\n .catch(function(error){\n loading.reject(error);\n });\n }\n\n return loaded;\n};\n\nSection.prototype.base = function(_document){\n var task = new RSVP.defer();\n var base = _document.createElement(\"base\"); // TODO: check if exists\n var head;\n\n base.setAttribute(\"href\", this.url);\n\n if(_document) {\n head = _document.querySelector(\"head\");\n }\n if(head) {\n head.insertBefore(base, head.firstChild);\n task.resolve();\n } else {\n task.reject(new Error(\"No head to insert into\"));\n }\n\n\n return task.promise;\n};\n\nSection.prototype.beforeSectionLoad = function(){\n // Stub for a hook - replace me for now\n};\n\nSection.prototype.render = function(_request){\n var rendering = new RSVP.defer();\n var rendered = rendering.promise;\n this.output; // TODO: better way to return this from hooks?\n\n this.load(_request).\n then(function(contents){\n var serializer = new XMLSerializer();\n this.output = serializer.serializeToString(contents);\n return this.output;\n }.bind(this)).\n then(function(){\n return this.hooks.serialize.trigger(this.output, this);\n }.bind(this)).\n then(function(){\n rendering.resolve(this.output);\n }.bind(this))\n .catch(function(error){\n rendering.reject(error);\n });\n\n return rendered;\n};\n\nSection.prototype.find = function(_query){\n\n};\n\n/**\n* Reconciles the current chapters layout properies with\n* the global layout properities.\n* Takes: global layout settings object, chapter properties string\n* Returns: Object with layout properties\n*/\nSection.prototype.reconcileLayoutSettings = function(global){\n //-- Get the global defaults\n var settings = {\n layout : global.layout,\n spread : global.spread,\n orientation : global.orientation\n };\n\n //-- Get the chapter's display type\n this.properties.forEach(function(prop){\n var rendition = prop.replace(\"rendition:\", '');\n var split = rendition.indexOf(\"-\");\n var property, value;\n\n if(split != -1){\n property = rendition.slice(0, split);\n value = rendition.slice(split+1);\n\n settings[property] = value;\n }\n });\n return settings;\n};\n\nSection.prototype.cfiFromRange = function(_range) {\n return this.epubcfi.generateCfiFromRange(_range, this.cfiBase);\n};\n\nSection.prototype.cfiFromElement = function(el) {\n return this.epubcfi.generateCfiFromElement(el, this.cfiBase);\n};\n\nmodule.exports = Section;\n","var RSVP = require('rsvp');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Section = require('./section');\n\nfunction Spine(_request){\n this.request = _request;\n this.spineItems = [];\n this.spineByHref = {};\n this.spineById = {};\n\n};\n\nSpine.prototype.load = function(_package) {\n\n this.items = _package.spine;\n this.manifest = _package.manifest;\n this.spineNodeIndex = _package.spineNodeIndex;\n this.baseUrl = _package.baseUrl || '';\n this.length = this.items.length;\n this.epubcfi = new EpubCFI();\n\n this.items.forEach(function(item, index){\n var href, url;\n var manifestItem = this.manifest[item.idref];\n var spineItem;\n item.cfiBase = this.epubcfi.generateChapterComponent(this.spineNodeIndex, item.index, item.idref);\n\n if(manifestItem) {\n item.href = manifestItem.href;\n item.url = this.baseUrl + item.href;\n\n if(manifestItem.properties.length){\n item.properties.push.apply(item.properties, manifestItem.properties);\n }\n }\n\n // if(index > 0) {\n item.prev = function(){ return this.get(index-1); }.bind(this);\n // }\n\n // if(index+1 < this.items.length) {\n item.next = function(){ return this.get(index+1); }.bind(this);\n // }\n\n spineItem = new Section(item);\n this.append(spineItem);\n\n\n }.bind(this));\n\n};\n\n// book.spine.get();\n// book.spine.get(1);\n// book.spine.get(\"chap1.html\");\n// book.spine.get(\"#id1234\");\nSpine.prototype.get = function(target) {\n var index = 0;\n\n if(this.epubcfi.isCfiString(target)) {\n cfi = this.epubcfi.parse(target);\n index = cfi.spinePos;\n } else if(target && (typeof target === \"number\" || isNaN(target) === false)){\n index = target;\n } else if(target && target.indexOf(\"#\") === 0) {\n index = this.spineById[target.substring(1)];\n } else if(target) {\n // Remove fragments\n target = target.split(\"#\")[0];\n index = this.spineByHref[target];\n }\n\n return this.spineItems[index] || null;\n};\n\nSpine.prototype.append = function(section) {\n var index = this.spineItems.length;\n section.index = index;\n\n this.spineItems.push(section);\n\n this.spineByHref[section.href] = index;\n this.spineById[section.idref] = index;\n\n return index;\n};\n\nSpine.prototype.prepend = function(section) {\n var index = this.spineItems.unshift(section);\n this.spineByHref[section.href] = 0;\n this.spineById[section.idref] = 0;\n\n // Re-index\n this.spineItems.forEach(function(item, index){\n item.index = index;\n });\n\n return 0;\n};\n\nSpine.prototype.insert = function(section, index) {\n\n};\n\nSpine.prototype.remove = function(section) {\n var index = this.spineItems.indexOf(section);\n\n if(index > -1) {\n delete this.spineByHref[section.href];\n delete this.spineById[section.idref];\n\n return this.spineItems.splice(index, 1);\n }\n};\n\nSpine.prototype.each = function() {\n\treturn this.spineItems.forEach.apply(this.spineItems, arguments);\n};\n\nmodule.exports = Spine;\n","var RSVP = require('rsvp');\nvar URI = require('urijs');\nvar core = require('./core');\nvar request = require('./request');\nvar mime = require('../libs/mime/mime');\n\nfunction Unarchive() {\n\n this.checkRequirements();\n this.urlCache = {};\n\n}\n\nUnarchive.prototype.checkRequirements = function(callback){\n try {\n if (typeof JSZip !== 'undefined') {\n this.zip = new JSZip();\n } else {\n JSZip = require('jszip');\n this.zip = new JSZip();\n }\n } catch (e) {\n console.error(\"JSZip lib not loaded\");\n }\n};\n\nUnarchive.prototype.open = function(zipUrl){\n\tif (zipUrl instanceof ArrayBuffer) {\n return new RSVP.Promise(function(resolve, reject) {\n this.zip = new JSZip(zipUrl);\n resolve(this.zip);\n });\n\t} else {\n\t\treturn request(zipUrl, \"binary\")\n .then(function(data){\n\t\t\t this.zip = new JSZip(data);\n return this.zip;\n\t\t }.bind(this));\n\t}\n};\n\nUnarchive.prototype.request = function(url, type){\n var deferred = new RSVP.defer();\n var response;\n var r;\n\n // If type isn't set, determine it from the file extension\n\tif(!type) {\n\t\turi = URI(url);\n\t\ttype = uri.suffix();\n\t}\n\n if(type == 'blob'){\n response = this.getBlob(url);\n } else {\n response = this.getText(url);\n }\n\n if (response) {\n r = this.handleResponse(response, type);\n deferred.resolve(r);\n } else {\n deferred.reject({\n message : \"File not found in the epub: \" + url,\n stack : new Error().stack\n });\n }\n return deferred.promise;\n};\n\nUnarchive.prototype.handleResponse = function(response, type){\n var r;\n\n if(type == \"json\") {\n r = JSON.parse(response);\n }\n else\n if(core.isXml(type)) {\n r = new DOMParser().parseFromString(response, \"text/xml\");\n\t}\n else\n\tif(type == 'xhtml') {\n r = new DOMParser().parseFromString(response, \"application/xhtml+xml\");\n\t}\n else\n\tif(type == 'html' || type == 'htm') {\n r = new DOMParser().parseFromString(response, \"text/html\");\n \t} else {\n \t r = response;\n \t}\n\n return r;\n};\n\nUnarchive.prototype.getBlob = function(url, _mimeType){\n\tvar decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\tvar entry = this.zip.file(decodededUrl);\n var mimeType;\n\n\tif(entry) {\n mimeType = _mimeType || mime.lookup(entry.name);\n return new Blob([entry.asUint8Array()], {type : mimeType});\n\t}\n};\n\nUnarchive.prototype.getText = function(url, encoding){\n\tvar decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash\n\tvar entry = this.zip.file(decodededUrl);\n\n\tif(entry) {\n return entry.asText();\n\t}\n};\n\nUnarchive.prototype.createUrl = function(url, mime){\n\tvar deferred = new RSVP.defer();\n\tvar _URL = window.URL || window.webkitURL || window.mozURL;\n\tvar tempUrl;\n\tvar blob;\n\n\tif(url in this.urlCache) {\n\t\tdeferred.resolve(this.urlCache[url]);\n\t\treturn deferred.promise;\n\t}\n\n\tblob = this.getBlob(url);\n\n if (blob) {\n tempUrl = _URL.createObjectURL(blob);\n deferred.resolve(tempUrl);\n this.urlCache[url] = tempUrl;\n } else {\n deferred.reject({\n message : \"File not found in the epub: \" + url,\n stack : new Error().stack\n });\n }\n\n\treturn deferred.promise;\n};\n\nUnarchive.prototype.revokeUrl = function(url){\n\tvar _URL = window.URL || window.webkitURL || window.mozURL;\n\tvar fromCache = this.urlCache[url];\n\tif(fromCache) _URL.revokeObjectURL(fromCache);\n};\n\nmodule.exports = Unarchive;\n","var RSVP = require('rsvp');\nvar core = require('./core');\nvar EpubCFI = require('./epubcfi');\n\nfunction View(section, options) {\n this.settings = options || {};\n\n this.id = \"epubjs-view:\" + core.uuid();\n this.section = section;\n this.index = section.index;\n\n this.element = document.createElement('div');\n this.element.classList.add(\"epub-view\");\n\n\n // this.element.style.minHeight = \"100px\";\n this.element.style.height = \"0px\";\n this.element.style.width = \"0px\";\n this.element.style.overflow = \"hidden\";\n\n this.added = false;\n this.displayed = false;\n this.rendered = false;\n\n //this.width = 0;\n //this.height = 0;\n\n // Blank Cfi for Parsing\n this.epubcfi = new EpubCFI();\n\n if(this.settings.axis && this.settings.axis == \"horizontal\"){\n this.element.style.display = \"inline-block\";\n } else {\n this.element.style.display = \"block\";\n }\n\n // Dom events to listen for\n this.listenedEvents = [\"keydown\", \"keyup\", \"keypressed\", \"mouseup\", \"mousedown\", \"click\", \"touchend\", \"touchstart\"];\n\n};\n\nView.prototype.create = function() {\n\n if(this.iframe) {\n return this.iframe;\n }\n\n this.iframe = document.createElement('iframe');\n this.iframe.id = this.id;\n this.iframe.scrolling = \"no\"; // Might need to be removed: breaks ios width calculations\n this.iframe.style.overflow = \"hidden\";\n this.iframe.seamless = \"seamless\";\n // Back up if seamless isn't supported\n this.iframe.style.border = \"none\";\n\n this.resizing = true;\n\n // this.iframe.style.display = \"none\";\n this.element.style.visibility = \"hidden\";\n this.iframe.style.visibility = \"hidden\";\n\n this.iframe.style.width = \"0\";\n this.iframe.style.height = \"0\";\n this._width = 0;\n this._height = 0;\n\n this.element.appendChild(this.iframe);\n this.added = true;\n\n this.elementBounds = core.bounds(this.element);\n\n // if(width || height){\n // this.resize(width, height);\n // } else if(this.width && this.height){\n // this.resize(this.width, this.height);\n // } else {\n // this.iframeBounds = core.bounds(this.iframe);\n // }\n\n // Firefox has trouble with baseURI and srcdoc\n // Disabled for now\n /*\n if(!!(\"srcdoc\" in this.iframe)) {\n this.supportsSrcdoc = true;\n } else {\n this.supportsSrcdoc = false;\n }\n */\n this.supportsSrcdoc = false;\n\n return this.iframe;\n};\n\n\nView.prototype.lock = function(what, width, height) {\n\n var elBorders = core.borders(this.element);\n var iframeBorders;\n\n if(this.iframe) {\n iframeBorders = core.borders(this.iframe);\n } else {\n iframeBorders = {width: 0, height: 0};\n }\n\n if(what == \"width\" && core.isNumber(width)){\n this.lockedWidth = width - elBorders.width - iframeBorders.width;\n this.resize(this.lockedWidth, width); // width keeps ratio correct\n }\n\n if(what == \"height\" && core.isNumber(height)){\n this.lockedHeight = height - elBorders.height - iframeBorders.height;\n this.resize(width, this.lockedHeight);\n }\n\n if(what === \"both\" &&\n core.isNumber(width) &&\n core.isNumber(height)){\n\n this.lockedWidth = width - elBorders.width - iframeBorders.width;\n this.lockedHeight = height - elBorders.height - iframeBorders.height;\n\n this.resize(this.lockedWidth, this.lockedHeight);\n }\n\n if(this.displayed && this.iframe) {\n\n this.layout();\n this.expand();\n\n }\n\n\n\n};\n\nView.prototype.expand = function(force) {\n var width = this.lockedWidth;\n var height = this.lockedHeight;\n\n var textWidth, textHeight;\n // console.log(\"expanding a\")\n if(!this.iframe || this._expanding) return;\n\n this._expanding = true;\n\n // Expand Horizontally\n if(height && !width) {\n // Get the width of the text\n textWidth = this.textWidth();\n // Check if the textWidth has changed\n if(textWidth != this._textWidth){\n // Get the contentWidth by resizing the iframe\n // Check with a min reset of the textWidth\n width = this.contentWidth(textWidth);\n // Save the textWdith\n this._textWidth = textWidth;\n // Save the contentWidth\n this._contentWidth = width;\n } else {\n // Otherwise assume content height hasn't changed\n width = this._contentWidth;\n }\n }\n\n // Expand Vertically\n if(width && !height) {\n textHeight = this.textHeight();\n if(textHeight != this._textHeight){\n height = this.contentHeight(textHeight);\n this._textHeight = textHeight;\n this._contentHeight = height;\n } else {\n height = this._contentHeight;\n }\n }\n\n // Only Resize if dimensions have changed or\n // if Frame is still hidden, so needs reframing\n if(this._needsReframe || width != this._width || height != this._height){\n this.resize(width, height);\n }\n\n this._expanding = false;\n};\n\nView.prototype.contentWidth = function(min) {\n var prev;\n var width;\n\n // Save previous width\n prev = this.iframe.style.width;\n // Set the iframe size to min, width will only ever be greater\n // Will preserve the aspect ratio\n this.iframe.style.width = (min || 0) + \"px\";\n // Get the scroll overflow width\n width = this.document.body.scrollWidth;\n // Reset iframe size back\n this.iframe.style.width = prev;\n return width;\n};\n\nView.prototype.contentHeight = function(min) {\n var prev;\n var height;\n\n prev = this.iframe.style.height;\n this.iframe.style.height = (min || 0) + \"px\";\n height = this.document.body.scrollHeight;\n this.iframe.style.height = prev;\n return height;\n};\n\nView.prototype.textWidth = function() {\n var width;\n var range = this.document.createRange();\n\n // Select the contents of frame\n range.selectNodeContents(this.document.body);\n\n // get the width of the text content\n width = range.getBoundingClientRect().width;\n return width;\n\n};\n\nView.prototype.textHeight = function() {\n var height;\n var range = this.document.createRange();\n\n range.selectNodeContents(this.document.body);\n\n height = range.getBoundingClientRect().height;\n return height;\n};\n\nView.prototype.resize = function(width, height) {\n\n if(!this.iframe) return;\n\n if(core.isNumber(width)){\n this.iframe.style.width = width + \"px\";\n this._width = width;\n }\n\n if(core.isNumber(height)){\n this.iframe.style.height = height + \"px\";\n this._height = height;\n }\n\n this.iframeBounds = core.bounds(this.iframe);\n\n this.reframe(this.iframeBounds.width, this.iframeBounds.height);\n\n};\n\nView.prototype.reframe = function(width, height) {\n //var prevBounds;\n\n if(!this.displayed) {\n this._needsReframe = true;\n return;\n }\n\n if(core.isNumber(width)){\n this.element.style.width = width + \"px\";\n }\n\n if(core.isNumber(height)){\n this.element.style.height = height + \"px\";\n }\n\n this.prevBounds = this.elementBounds;\n\n this.elementBounds = core.bounds(this.element);\n\n this.trigger(\"resized\", {\n width: this.elementBounds.width,\n height: this.elementBounds.height,\n widthDelta: this.elementBounds.width - this.prevBounds.width,\n heightDelta: this.elementBounds.height - this.prevBounds.height,\n });\n\n};\n\nView.prototype.resized = function(e) {\n /*\n if (!this.resizing) {\n if(this.iframe) {\n // this.expand();\n }\n } else {\n this.resizing = false;\n }*/\n\n};\n\nView.prototype.render = function(_request) {\n\n // if(this.rendering){\n // return this.displayed;\n // }\n\n this.rendering = true;\n // this.displayingDefer = new RSVP.defer();\n // this.displayedPromise = this.displaying.promise;\n\n return this.section.render(_request)\n .then(function(contents){\n return this.load(contents);\n }.bind(this));\n};\n\nView.prototype.load = function(contents) {\n var loading = new RSVP.defer();\n var loaded = loading.promise;\n\n if(!this.iframe) {\n loading.reject(new Error(\"No Iframe Available\"));\n return loaded;\n }\n\n this.iframe.onload = function(event) {\n\n this.window = this.iframe.contentWindow;\n this.document = this.iframe.contentDocument;\n this.rendering = false;\n loading.resolve(this);\n\n }.bind(this);\n\n if(this.supportsSrcdoc){\n this.iframe.srcdoc = contents;\n } else {\n\n this.document = this.iframe.contentDocument;\n\n if(!this.document) {\n loading.reject(new Error(\"No Document Available\"));\n return loaded;\n }\n\n this.document.open();\n this.document.write(contents);\n this.document.close();\n\n }\n\n return loaded;\n};\n\n\nView.prototype.layout = function(layoutFunc) {\n\n this.iframe.style.display = \"inline-block\";\n\n // Reset Body Styles\n this.document.body.style.margin = \"0\";\n //this.document.body.style.display = \"inline-block\";\n //this.document.documentElement.style.width = \"auto\";\n\n if(layoutFunc){\n layoutFunc(this);\n }\n\n this.onLayout(this);\n\n};\n\nView.prototype.onLayout = function(view) {\n // stub\n};\n\nView.prototype.listeners = function() {\n /*\n setTimeout(function(){\n this.window.addEventListener(\"resize\", this.resized.bind(this), false);\n }.bind(this), 10); // Wait to listen for resize events\n */\n\n // Wait for fonts to load to finish\n // http://dev.w3.org/csswg/css-font-loading/\n // Not implemented fully except in chrome\n\n if(this.document.fonts && this.document.fonts.status === \"loading\") {\n // console.log(\"fonts unloaded\");\n this.document.fonts.onloadingdone = function(){\n // console.log(\"loaded fonts\");\n this.expand();\n }.bind(this);\n }\n\n if(this.section.properties.indexOf(\"scripted\") > -1){\n this.observer = this.observe(this.document.body);\n }\n\n this.imageLoadListeners();\n\n this.mediaQueryListeners();\n\n // this.resizeListenters();\n\n this.addEventListeners();\n\n this.addSelectionListeners();\n};\n\nView.prototype.removeListeners = function() {\n\n this.removeEventListeners();\n\n this.removeSelectionListeners();\n};\n\nView.prototype.resizeListenters = function() {\n // Test size again\n clearTimeout(this.expanding);\n this.expanding = setTimeout(this.expand.bind(this), 350);\n};\n\n//https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js\nView.prototype.mediaQueryListeners = function() {\n var sheets = this.document.styleSheets;\n var mediaChangeHandler = function(m){\n if(m.matches && !this._expanding) {\n setTimeout(this.expand.bind(this), 1);\n // this.expand();\n }\n }.bind(this);\n\n for (var i = 0; i < sheets.length; i += 1) {\n var rules = sheets[i].cssRules;\n if(!rules) return; // Stylesheets changed\n for (var j = 0; j < rules.length; j += 1) {\n //if (rules[j].constructor === CSSMediaRule) {\n if(rules[j].media){\n var mql = this.window.matchMedia(rules[j].media.mediaText);\n mql.addListener(mediaChangeHandler);\n //mql.onchange = mediaChangeHandler;\n }\n }\n }\n};\n\nView.prototype.observe = function(target) {\n var renderer = this;\n\n // create an observer instance\n var observer = new MutationObserver(function(mutations) {\n if(renderer._expanding) {\n renderer.expand();\n }\n // mutations.forEach(function(mutation) {\n // console.log(mutation);\n // });\n });\n\n // configuration of the observer:\n var config = { attributes: true, childList: true, characterData: true, subtree: true };\n\n // pass in the target node, as well as the observer options\n observer.observe(target, config);\n\n return observer;\n};\n\n// View.prototype.appendTo = function(element) {\n// this.element = element;\n// this.element.appendChild(this.iframe);\n// };\n//\n// View.prototype.prependTo = function(element) {\n// this.element = element;\n// element.insertBefore(this.iframe, element.firstChild);\n// };\n\nView.prototype.imageLoadListeners = function(target) {\n var images = this.document.body.querySelectorAll(\"img\");\n var img;\n for (var i = 0; i < images.length; i++) {\n img = images[i];\n\n if (typeof img.naturalWidth !== \"undefined\" &&\n img.naturalWidth === 0) {\n img.onload = this.expand.bind(this);\n }\n }\n};\n\nView.prototype.display = function() {\n var displayed = new RSVP.defer();\n\n this.displayed = true;\n\n this.layout();\n\n this.listeners();\n\n this.expand();\n\n this.trigger(\"displayed\", this);\n this.onDisplayed(this);\n\n displayed.resolve(this);\n\n return displayed.promise;\n};\n\nView.prototype.show = function() {\n\n this.element.style.visibility = \"visible\";\n\n if(this.iframe){\n this.iframe.style.visibility = \"visible\";\n }\n\n this.trigger(\"shown\", this);\n};\n\nView.prototype.hide = function() {\n // this.iframe.style.display = \"none\";\n this.element.style.visibility = \"hidden\";\n this.iframe.style.visibility = \"hidden\";\n\n this.stopExpanding = true;\n this.trigger(\"hidden\", this);\n};\n\nView.prototype.position = function() {\n return this.element.getBoundingClientRect();\n};\n\nView.prototype.onDisplayed = function(view) {\n // Stub, override with a custom functions\n};\n\nView.prototype.bounds = function() {\n if(!this.elementBounds) {\n this.elementBounds = core.bounds(this.element);\n }\n return this.elementBounds;\n};\n\nView.prototype.destroy = function() {\n // Stop observing\n if(this.observer) {\n this.observer.disconnect();\n }\n\n if(this.displayed){\n this.removeListeners();\n\n this.stopExpanding = true;\n this.element.removeChild(this.iframe);\n this.displayed = false;\n this.iframe = null;\n\n this._textWidth = null;\n this._textHeight = null;\n this._width = null;\n this._height = null;\n }\n // this.element.style.height = \"0px\";\n // this.element.style.width = \"0px\";\n};\n\nView.prototype.root = function() {\n if(!this.document) return null;\n return this.document.documentElement;\n};\n\nView.prototype.locationOf = function(target) {\n var parentPos = this.iframe.getBoundingClientRect();\n var targetPos = {\"left\": 0, \"top\": 0};\n\n if(!this.document) return;\n\n if(this.epubcfi.isCfiString(target)) {\n cfi = this.epubcfi.parse(target);\n\n if(typeof document.evaluate === 'undefined') {\n marker = this.epubcfi.addMarker(cfi, this.document);\n if(marker) {\n // Must Clean up Marker before going to page\n this.epubcfi.removeMarker(marker, this.document);\n\n targetPos = marker.getBoundingClientRect();\n }\n } else {\n range = this.epubcfi.generateRangeFromCfi(cfi, this.document);\n if(range) {\n targetPos = range.getBoundingClientRect();\n }\n }\n } else if(typeof target === \"string\" &&\n target.indexOf(\"#\") > -1) {\n\n id = target.substring(target.indexOf(\"#\")+1);\n el = this.document.getElementById(id);\n\n if(el) {\n targetPos = el.getBoundingClientRect();\n }\n }\n\n return {\n \"left\": window.scrollX + parentPos.left + targetPos.left,\n \"top\": window.scrollY + parentPos.top + targetPos.top\n };\n};\n\nView.prototype.addCss = function(src) {\n return new RSVP.Promise(function(resolve, reject){\n var $stylesheet;\n var ready = false;\n\n if(!this.document) {\n resolve(false);\n return;\n }\n\n $stylesheet = this.document.createElement('link');\n $stylesheet.type = 'text/css';\n $stylesheet.rel = \"stylesheet\";\n $stylesheet.href = src;\n $stylesheet.onload = $stylesheet.onreadystatechange = function() {\n if ( !ready && (!this.readyState || this.readyState == 'complete') ) {\n ready = true;\n // Let apply\n setTimeout(function(){\n resolve(true);\n }, 1);\n }\n };\n\n this.document.head.appendChild($stylesheet);\n\n }.bind(this));\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule\nView.prototype.addStylesheetRules = function(rules) {\n var styleEl;\n var styleSheet;\n\n if(!this.document) return;\n\n styleEl = this.document.createElement('style');\n\n // Append style element to head\n this.document.head.appendChild(styleEl);\n\n // Grab style sheet\n styleSheet = styleEl.sheet;\n\n for (var i = 0, rl = rules.length; i < rl; i++) {\n var j = 1, rule = rules[i], selector = rules[i][0], propStr = '';\n // If the second argument of a rule is an array of arrays, correct our variables.\n if (Object.prototype.toString.call(rule[1][0]) === '[object Array]') {\n rule = rule[1];\n j = 0;\n }\n\n for (var pl = rule.length; j < pl; j++) {\n var prop = rule[j];\n propStr += prop[0] + ':' + prop[1] + (prop[2] ? ' !important' : '') + ';\\n';\n }\n\n // Insert CSS Rule\n styleSheet.insertRule(selector + '{' + propStr + '}', styleSheet.cssRules.length);\n }\n};\n\nView.prototype.addScript = function(src) {\n\n return new RSVP.Promise(function(resolve, reject){\n var $script;\n var ready = false;\n\n if(!this.document) {\n resolve(false);\n return;\n }\n\n $script = this.document.createElement('script');\n $script.type = 'text/javascript';\n $script.async = true;\n $script.src = src;\n $script.onload = $script.onreadystatechange = function() {\n if ( !ready && (!this.readyState || this.readyState == 'complete') ) {\n ready = true;\n setTimeout(function(){\n resolve(true);\n }, 1);\n }\n };\n\n this.document.head.appendChild($script);\n\n }.bind(this));\n};\n\nView.prototype.addEventListeners = function(){\n if(!this.document) {\n return;\n }\n this.listenedEvents.forEach(function(eventName){\n this.document.addEventListener(eventName, this.triggerEvent.bind(this), false);\n }, this);\n\n};\n\nView.prototype.removeEventListeners = function(){\n if(!this.document) {\n return;\n }\n this.listenedEvents.forEach(function(eventName){\n this.document.removeEventListener(eventName, this.triggerEvent, false);\n }, this);\n\n};\n\n// Pass browser events\nView.prototype.triggerEvent = function(e){\n this.trigger(e.type, e);\n};\n\nView.prototype.addSelectionListeners = function(){\n if(!this.document) {\n return;\n }\n this.document.addEventListener(\"selectionchange\", this.onSelectionChange.bind(this), false);\n};\n\nView.prototype.removeSelectionListeners = function(){\n if(!this.document) {\n return;\n }\n this.document.removeEventListener(\"selectionchange\", this.onSelectionChange, false);\n};\n\nView.prototype.onSelectionChange = function(e){\n if (this.selectionEndTimeout) {\n clearTimeout(this.selectionEndTimeout);\n }\n this.selectionEndTimeout = setTimeout(function() {\n this.selectedRange = this.window.getSelection();\n this.trigger(\"selected\", this.selectedRange);\n }.bind(this), 500);\n};\n\nRSVP.EventTarget.mixin(View.prototype);\n\nmodule.exports = View;\n","function Views(container) {\n this.container = container;\n this._views = [];\n this.length = 0;\n this.hidden = false;\n};\n\nViews.prototype.first = function() {\n\treturn this._views[0];\n};\n\nViews.prototype.last = function() {\n\treturn this._views[this._views.length-1];\n};\n\nViews.prototype.each = function() {\n\treturn this._views.forEach.apply(this._views, arguments);\n};\n\nViews.prototype.indexOf = function(view) {\n\treturn this._views.indexOf(view);\n};\n\nViews.prototype.slice = function() {\n\treturn this._views.slice.apply(this._views, arguments);\n};\n\nViews.prototype.get = function(i) {\n\treturn this._views[i];\n};\n\nViews.prototype.append = function(view){\n\tthis._views.push(view);\n\tthis.container.appendChild(view.element);\n this.length++;\n return view;\n};\n\nViews.prototype.prepend = function(view){\n\tthis._views.unshift(view);\n\tthis.container.insertBefore(view.element, this.container.firstChild);\n this.length++;\n return view;\n};\n\nViews.prototype.insert = function(view, index) {\n\tthis._views.splice(index, 0, view);\n\n\tif(index < this.container.children.length){\n\t\tthis.container.insertBefore(view.element, this.container.children[index]);\n\t} else {\n\t\tthis.container.appendChild(view.element);\n\t}\n this.length++;\n return view;\n};\n\nViews.prototype.remove = function(view) {\n\tvar index = this._views.indexOf(view);\n\n\tif(index > -1) {\n\t\tthis._views.splice(index, 1);\n\t}\n\n\n\tthis.destroy(view);\n\n this.length--;\n};\n\nViews.prototype.destroy = function(view) {\n\tview.off(\"resized\");\n\n\tif(view.displayed){\n\t\tview.destroy();\n\t}\n\n\tthis.container.removeChild(view.element);\n\tview = null;\n};\n\n// Iterators\n\nViews.prototype.clear = function(){\n\t// Remove all views\n var view;\n var len = this.length;\n\n if(!this.length) return;\n\n for (var i = 0; i < len; i++) {\n view = this._views[i];\n\t\tthis.destroy(view);\n }\n\n this._views = [];\n this.length = 0;\n};\n\nViews.prototype.find = function(section){\n\n var view;\n var len = this.length;\n\n for (var i = 0; i < len; i++) {\n view = this._views[i];\n\t\tif(view.displayed && view.section.index == section.index) {\n\t\t\treturn view;\n\t\t}\n }\n\n};\n\nViews.prototype.displayed = function(){\n var displayed = [];\n var view;\n var len = this.length;\n\n for (var i = 0; i < len; i++) {\n view = this._views[i];\n if(view.displayed){\n displayed.push(view);\n }\n }\n return displayed;\n};\n\nViews.prototype.show = function(){\n var view;\n var len = this.length;\n\n for (var i = 0; i < len; i++) {\n view = this._views[i];\n if(view.displayed){\n view.show();\n }\n }\n this.hidden = false;\n};\n\nViews.prototype.hide = function(){\n var view;\n var len = this.length;\n\n for (var i = 0; i < len; i++) {\n view = this._views[i];\n if(view.displayed){\n view.hide();\n }\n }\n this.hidden = true;\n};\n\nmodule.exports = Views;\n","if (typeof EPUBJS === 'undefined') {\n\t(typeof window !== 'undefined' ? window : global).EPUBJS = {};\n}\n\nEPUBJS.VERSION = \"0.3.0\";\n\nvar Book = require('./book');\n\nfunction ePub(_url) {\n\treturn new Book(_url);\n};\n\nmodule.exports = ePub;\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index 531dcc78f..f8f1b208c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -10,15 +10,27 @@ var onError = function (err) { }; var server = require("./tools/serve.js"); -var browserify = require('browserify'); -var watchify = require('watchify'); var source = require('vinyl-source-stream'); var buffer = require('vinyl-buffer'); var sourcemaps = require('gulp-sourcemaps'); var size = require('gulp-size'); -var URI = require('urijs'); -var mochify = require('mochify'); + +var webpack = require("webpack"); +var WebpackDevServer = require("webpack-dev-server"); +var webpackConfig = require("./webpack.config"); + +var Server = require('karma').Server; + +// modify some webpack config options +var watchConfig = Object.create(webpackConfig); +watchConfig.devtool = "sourcemap"; +watchConfig.debug = true; +watchConfig.watch = true; + +// create a single instance of the compiler to allow caching +var watchCompiler = webpack(watchConfig); + // https://github.com/mishoo/UglifyJS2/pull/265 // uglify.AST_Node.warn_function = function() {}; @@ -29,9 +41,20 @@ gulp.task('lint', function() { .pipe(jshint.reporter('default')); }); -// set up the browserify instance on a task basis -gulp.task('bundle', function () { - return bundle('epub.js'); +gulp.task('bundle', function (cb) { + webpack(webpackConfig, function(err, stats) { + if(err) { + throw new gutil.PluginError("webpack", err); + } + + gutil.log("[webpack-bundle]", stats.toString({ + colors: true, + chunks: true + })); + + cb(); + + }); }); // Minify JS @@ -52,97 +75,75 @@ gulp.task('minify', ['bundle'], function(){ // Watch Our Files gulp.task('watch', function(cb) { - bundle('epub.js', cb); -}); + watchCompiler(watchConfig, function(err, stats) { + if(err) { + throw new gutil.PluginError("webpack", err); + } + + gutil.log("[webpack-watch]", stats.toString({ + colors: true, + chunks: false + })); + + }); -gulp.task('serve', function(cb) { - server(); - bundle('epub.js', cb); }); -gulp.task('serve:no-watch', function(cb) { - server(); +gulp.task('test', function(done) { + new Server({ + configFile: __dirname + '/karma.conf.js', + singleRun: false + }, done).start(); }); -gulp.task('test', function(cb) { - mochify('./test/*.js', { - reporter: 'spec', - transform: 'brfs', - "web-security": false, - "webSecurityEnabled": false, - // "localUrlAccess": true, - watch: true, - wd: false, - debug: false - }) - .bundle(); +gulp.task('test:once', function(done) { + new Server({ + configFile: __dirname + '/karma.conf.js', + singleRun: true + }, done).start(); }); +gulp.task("serve", function(callback) { + server(); + /* + var serverConfig = Object.create(webpackConfig); + + serverConfig.devtool = "eval"; + serverConfig.debug = true; + serverConfig.watch = true; + + // Start a webpack-dev-server + new WebpackDevServer(webpack(serverConfig), { + stats: { + colors: true, + chunks: false + } + }).listen(8080, "localhost", function(err) { + if(err) throw new gutil.PluginError("webpack-dev-server", err); + gutil.log("[webpack-dev-server]", "http://localhost:8080/webpack-dev-server/examples/index.html"); + }); + */ -gulp.task('test:once', function(cb) { - mochify('./test/*.js', { - reporter: 'spec', - transform: 'brfs', - "web-security": false, - "webSecurityEnabled": false, - // "localUrlAccess": true, - watch: false, - wd: false, - debug: false - }) - .bundle(); }); // Default gulp.task('default', ['lint', 'bundle']); +function bundle(done) { + if (!done) { + webpackConfig.watch = true; + } else { + webpackConfig.watch = false; + } -function bundle(file, watch) { - var opt = { - entries: ['src/'+file], - standalone: 'ePub', - debug : true - }; - - var b = browserify(opt); - - // Expose epub module for require - b.require('./src/'+file, {expose: 'epub'}); - - // Keep JSZip library seperate, - // must be loaded to use Unarchive or `require` will throw an error - b.external('jszip'); - - b.external('xmldom'); - - // Ignore optional URI libraries - var urijsPath = URI(require.resolve('urijs')); - ['./punycode.js', './IPv6.js'].forEach(function(lib) { - var libPath = URI(lib).absoluteTo(urijsPath).toString(); - b.ignore(libPath); - }); + watchCompiler(watchConfig, function(err, stats) { + if(err) throw new gutil.PluginError("webpack", err); + gutil.log("[webpack]", stats.toString({ + colors: true, + chunks: false + })); - // watchify() if watch requested, otherwise run browserify() once - var bundler = watch ? watchify(b) : b; - - function rebundle() { - var stream = bundler.bundle(); - return stream - .on('error', gutil.log) - .pipe(source(file)) - .pipe(buffer()) - .pipe(sourcemaps.init({loadMaps: true})) - .pipe(sourcemaps.write('./')) - .pipe(size({ showFiles: true })) - .pipe(gulp.dest('./dist/')); - } + done && done(); - // listen for an update and run rebundle - bundler.on('update', function() { - rebundle(); - gutil.log('Rebundle...'); }); - - // run it once the first time buildScript is called - return rebundle(); } diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 000000000..ff030f4e5 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,102 @@ +// Karma configuration +// Generated on Wed Oct 26 2016 10:56:59 GMT+0200 (CEST) + +module.exports = function(config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['mocha'], + + + // list of files / patterns to load in the browser + files: [ + {pattern: 'test/*.js', watched: false}, + // {pattern: 'test/**/*.js', watched: false} + {pattern: 'test/fixtures/**/*', watched: false, included: false, served: true}, + + {pattern: 'node_modules/jszip/dist/jszip.js', watched: false, included: true, served: true}, + + ], + + // list of files to exclude + exclude: [ + ], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + // add webpack as preprocessor + 'test/*.js': ['webpack', 'sourcemap'], + // 'test/**/*.js': ['webpack', 'sourcemap'] + }, + + webpack:{ + externals: { + "jszip": "JSZip", + "xmldom": "xmldom" + }, + devtool: 'inline-source-map' + }, + + webpackMiddleware: { + stats: 'errors-only' + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['mocha'], + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_ERROR, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['PhantomJS'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity, + + proxies: { + "/fixtures/": "/base/test/fixtures/" + }, + + client: { + config: { + browserConsoleLogOptions: true + }, + captureConsole: true, + mocha: { + reporter: 'html' + // bail: true + } + } + + }) +} diff --git a/package.json b/package.json index e92344ff7..43d94b990 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,13 @@ "test": "test" }, "scripts": { - "test": "gulp test" + "test": "./node_modules/.bin/karma start --single-run --browsers PhantomJS", + "start": "webpack-dev-server --inline --hot", + "build" : "gulp minify" }, "author": "fchasen@gmail.com", "license": "MIT", "devDependencies": { - "brfs": "^1.4.1", - "browserify": "^13.0.0", "colors": "^1.1.2", "connect": "^3.0.1", "express": "^4.5.1", @@ -29,19 +29,25 @@ "gulp-uglify": "^1.5.3", "gulp-util": "^3.0.0", "jquery": "^2.1.4", - "mochify": "^2.14.3", + "jshint": "^2.9.3", + "karma": "^1.3.0", + "karma-mocha": "^1.2.0", + "karma-mocha-reporter": "^2.2.0", + "karma-phantomjs-launcher": "^1.0.2", + "karma-sourcemap-loader": "^0.3.7", + "karma-webpack": "^1.8.0", + "mocha-loader": "^1.0.0", "morgan": "^1.1.1", "optimist": "^0.6.1", - "phantomjs": "^2.1.3", "portfinder": "^1.0.2", - "qunitjs": "^1.14.0", + "raw-loader": "^0.5.1", "serve-static": "^1.3.1", - "sinon": "^1.17.2", "uglify": "^0.1.5", "vinyl-buffer": "^1.0.0", "vinyl-source-stream": "^1.1.0", - "watchify": "^3.6.1", - "jshint": "^2.9.3" + "webpack": "^1.13.2", + "webpack-dev-middleware": "^1.8.4", + "webpack-dev-server": "^1.16.2" }, "dependencies": { "jszip": "^3.1.1", diff --git a/src/epub.js b/src/epub.js index 1e0c2a5f2..550d9a8fe 100644 --- a/src/epub.js +++ b/src/epub.js @@ -28,7 +28,6 @@ ePub.register = { // Default Views ePub.register.view("iframe", require('./managers/views/iframe')); -// ePub.register.view("inline", require('./managers/views/inline')); // Default View Managers ePub.register.manager("single", require('./managers/default')); diff --git a/src/request.js b/src/request.js index b1eb004a3..0803bb083 100644 --- a/src/request.js +++ b/src/request.js @@ -77,11 +77,16 @@ function request(url, type, withCredentials, headers) { function handler() { if (this.readyState === XMLHttpRequest.DONE) { + var responseXML = false; - if (this.status === 200 || this.responseXML ) { //-- Firefox is reporting 0 for blob urls + if(this.responseType === '' || this.responseType === "document") { + responseXML = this.responseXML; + } + + if (this.status === 200 || responseXML ) { //-- Firefox is reporting 0 for blob urls var r; - if (!this.response && !this.responseXML) { + if (!this.response && !responseXML) { deferred.reject({ status: this.status, message : "Empty Response", @@ -100,8 +105,7 @@ function request(url, type, withCredentials, headers) { return deferred.promise; } - if((this.responseType == '' || this.responseType == 'document') - && this.responseXML){ + if(responseXML){ r = this.responseXML; } else if(core.isXml(type)){ diff --git a/test/epub.js b/test/epub.js index f3e5365fc..326ff28a5 100644 --- a/test/epub.js +++ b/test/epub.js @@ -1,14 +1,16 @@ var assert = require('assert'); -var sinon = require('sinon'); -var fs = require('fs'); +// var sinon = require('sinon'); describe('ePub', function() { var ePub = require('../src/epub'); var server; before(function(){ - var packageContents = fs.readFileSync(__dirname + '/../books/moby-dick/OPS/package.opf', 'utf8'); - var tocContents = fs.readFileSync(__dirname + '/../books/moby-dick/OPS/toc.xhtml', 'utf8'); + /* + // var packageContents = fs.readFileSync(__dirname + '/../books/moby-dick/OPS/package.opf', 'utf8'); + // var tocContents = fs.readFileSync(__dirname + '/../books/moby-dick/OPS/toc.xhtml', 'utf8'); + var packageContents = require('raw!./fixtures/moby-dick/OPS/package.opf'); + var tocContents = require('raw!./fixtures/moby-dick/OPS/toc.xhtml'); server = sinon.fakeServer.create(); server.autoRespond = true; @@ -20,20 +22,33 @@ describe('ePub', function() { server.respondWith("moby-dick/OPS/toc.xhtml", [200, { "Content-Type": "application/xhtml+xml" }, tocContents]); - + */ }); after(function(){ - server.restore(); + // server.restore(); }); it('should open a epub', function(done) { - var book = ePub("moby-dick/OPS/package.opf"); + var book = ePub("/fixtures/alice/OPS/package.opf"); + + book.opened.then(function(){ + assert.equal( book.isOpen, true, "book is opened" ); + assert.equal( book.url, "http://localhost:9876/fixtures/alice/OPS/package.opf", "book url is passed to new Book" ); + done(); + }); + }); + + it('should open a archived epub', function(done) { + var book = ePub("/fixtures/alice.epub"); + + assert(typeof (JSZip) !== "undefined", "JSZip is present" ); book.opened.then(function(){ assert.equal( book.isOpen, true, "book is opened" ); - assert.equal( book.url, "moby-dick/OPS/package.opf", "book url is passed to new Book" ); + assert.equal( book.url, "/", "book url is empty as book is archived" ); done(); }); }); + }); diff --git a/test/epubcfi.js b/test/epubcfi.js index df72d0075..7af3dac82 100644 --- a/test/epubcfi.js +++ b/test/epubcfi.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var fs = require('fs'); +// var fs = require('fs'); if (typeof DOMParser === "undefined") { global.DOMParser = require('xmldom').DOMParser; } @@ -136,7 +136,9 @@ describe('EpubCFI', function() { describe('#fromNode()', function() { var base = "/6/4[chap01ref]"; - var contents = fs.readFileSync(__dirname + '/fixtures/chapter1-highlights.xhtml', 'utf8'); + // var contents = fs.readFileSync(__dirname + '/fixtures/chapter1-highlights.xhtml', 'utf8'); + var contents = require('raw!./fixtures/chapter1-highlights.xhtml'); + // var serializer = new XMLSerializer(); // var doc = serializer.serializeToString(contents); var doc = new DOMParser().parseFromString(contents, "application/xhtml+xml"); @@ -183,13 +185,17 @@ describe('EpubCFI', function() { describe('#fromRange()', function() { var base = "/6/4[chap01ref]"; - var contentsClean = fs.readFileSync(__dirname + '/fixtures/chapter1.xhtml', 'utf8'); + // var contentsClean = fs.readFileSync(__dirname + '/fixtures/chapter1.xhtml', 'utf8'); + var contentsClean = require('raw!./fixtures/chapter1.xhtml'); + var doc = new DOMParser().parseFromString(contentsClean, "application/xhtml+xml"); - var contentsHighlights = fs.readFileSync(__dirname + '/fixtures/chapter1-highlights.xhtml', 'utf8'); + // var contentsHighlights = fs.readFileSync(__dirname + '/fixtures/chapter1-highlights.xhtml', 'utf8'); + var contentsHighlights = require('raw!./fixtures/chapter1-highlights.xhtml'); var docHighlights = new DOMParser().parseFromString(contentsHighlights, "application/xhtml+xml"); - var highlightContents = fs.readFileSync(__dirname + '/fixtures/highlight.xhtml', 'utf8'); + // var highlightContents = fs.readFileSync(__dirname + '/fixtures/highlight.xhtml', 'utf8'); + var highlightContents = require('raw!./fixtures/highlight.xhtml'); var docHighlightsAlice = new DOMParser().parseFromString(highlightContents, "application/xhtml+xml"); it('get a cfi from a collapsed range', function() { @@ -295,7 +301,8 @@ describe('EpubCFI', function() { describe('#toRange()', function() { var base = "/6/4[chap01ref]"; - var contents = fs.readFileSync(__dirname + '/fixtures/chapter1-highlights.xhtml', 'utf8'); + // var contents = fs.readFileSync(__dirname + '/fixtures/chapter1-highlights.xhtml', 'utf8'); + var contents = require('raw!./fixtures/chapter1-highlights.xhtml'); var doc = new DOMParser().parseFromString(contents, "application/xhtml+xml"); // var serializer = new XMLSerializer(); diff --git a/test/fixtures/alice.epub b/test/fixtures/alice.epub new file mode 100644 index 0000000000000000000000000000000000000000..9ac6ba324a426914cb5839f9fe1e709b70add60b GIT binary patch literal 536540 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
31O+Bh>FwYMj)o~G7EW@2J}~jN^GbsgP}N%a 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 %B3MrQO|bKc-$+~Y^FcBD;qA3^YV?2cMcup+ z`oiUhw(tkhk#63yUF)#sB7!Htq_^;Kb78TL z3ne{t$IINXkdG<6JMN3g^eb##95UL~c!}}b@-qqP;0icDK0@FI%GmRasV&>%FBQH0 zi^25NB+(!E8QY=?f<+%{e>NX7{y2H2{Ih$)27O;(xAoAh>rwzYFhc0h_8i_OC9E1HOOPXK1w ze8J!Lc=8-I#_$CZ^|KtNN+@`IKgC?LwYxECX7+8Jc?+#BGV#T8qre9357(J{eF+He z7~3HR%)4R-sO!ft+t8fzuGPOIY|N(1HO1tConON=daukv?yw+c)JS=O+#UwD8MGaU zr&c27c5ZaXIM02ku$)Zgk3hQ#HDiF%CDL8DcWoA9mXuB(kDAtBja0X?_8b|4#MA^; z>%^!|BmRm~+wtuz+;(N4wlBOidMn}?tbO}A--%aGD$gXGN0IdMCHax-_1N~}>3dy3 z+r=UNIX(v*6DN{8k~7%cD}vGK@g!H0Scvh8Jo%V~9y{%2%J2GF}`UpGd}i{V|Mr zP@rE{hzu$H7`%c}OoF(JDyQBicUypW{%qa$rDHbTfs>F8#0n%Ihx@-lT;lzs$OQ{Igf-O#qZa7L>B~8&b~c;dyh)*eH>50F0BRA!BzU<4Cn?9a9+H z!|K_m1SvgWK2KxyPXEUo8OrA(1goAuU!@HkoV!-GV^*SGXqMV79v;OW&HE9S5Dk@V zN`THgcZ*&goKlE=vLMM)juy-(VE$$J*De#Bbzyx#(w|6q@Q`%j)>_yD+xszADwM|> zx0jQNR>^MDQsUFaLit0l`|<*5?rUi&+E=}u-ucX+!TI`qZF@|!Id}DTiiWYLFo=|b zM52;NE`&eo^w&sZ$pl?pf8>33OAJ=Um#=YqbFnMOIcf&(jv<|OgHHe(bfy$H&cq7cW!`z(zK115Wgl7Zu@dliel>2dg@k ziZAzlSH!i~oHm$ZySbmwreZzmo&cu-d9(VF>~SA}R8=y=KALpEN)?K08x%H{y*XRA zk8Q!r7aI)%=FK}!Uh+og!PksAzd4TK=`ZasRUhi%UEB1XdGRIZTo-8?PXIkx4>|Vj zaAlF_RKC;V6qwiGn)P(0&x6rw+qNp(>rqp8lS44tu{Ro~Y~$K8aSL~n=n(~e^uY(h z&m~8Cnd|a-lYTLLRdN1dWUyU|#RQ!ao8+T&{hr6aHgxA+S30RBXk{I4Bwl;2he55G zWpv*p*>H9G+U``b(|&&XulV$Mfn8_F z5SLBzO`6~QOP#wX+5bX+)7h#a3m-XfQsu_kKwRLx#_`wuFubuEkm`v-^M_wcby zcve;jk%ZqJltP^zrCzO_2>2pYEcl6Cg=3BLQwD@&ul!VeYnMD`80JdG6OPs7fZX%6X4Z4Ix6aiGYKvkE%wYe`k108z@_S=pICsn2S$_p zY8N`|q*f2+8a5!EW?VBDb^_PkZZ_XV!-)Pe9F2!+-cfkP$Hpxt*6Q7gxi(v09M_l8 z7W*~E2Kbq3j}j6l`~⪙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%0A*YTEji&K(nO0XO6t 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%0DHREZ-Ci1 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 u|ApP@eiw$D=feZw=Xd`PsABjV@ZZ^ + + + + \ No newline at end of file diff --git a/test/fixtures/alice/OPS/chapter_001.xhtml b/test/fixtures/alice/OPS/chapter_001.xhtml new file mode 100644 index 000000000..26ac09864 --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_001.xhtml @@ -0,0 +1,139 @@ + + + + + Alice's Adventures in Wonderland + + + + +

+ + diff --git a/test/fixtures/alice/OPS/chapter_002.xhtml b/test/fixtures/alice/OPS/chapter_002.xhtml new file mode 100644 index 000000000..3babe69a2 --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_002.xhtml @@ -0,0 +1,141 @@ + + + + + Alice's Adventures in Wonderland + + + + +
+ +

The Pool Of Tears

+ +

Curiouser and curiouser!" cried Alice (she was so much + surprised that for the moment she quite forgot how to speak good English). "Now I'm + opening out like the largest telescope that ever was! Good-by, feet! Oh, my poor little + feet, I wonder who will put on your shoes and stockings for you now, dears? I shall be + a great deal too far off to trouble myself about you."

+ +

Just at this moment her head struck against the roof of the hall; in fact, she was + now rather more than nine feet high, and she at once took up the little golden key and + hurried off to the garden door.

+ +

Poor Alice! It was as much as she could do, lying down on one side, to look through + into the garden with one eye; but to get through was more hopeless than ever. She sat + down and began to cry again.

+ +

She went on shedding gallons of tears, until there was a large pool all 'round her + and reaching half down the hall.

+ +

After a time, she heard a little pattering of feet in the distance and she hastily + dried her eyes to see what was coming. It was the White Rabbit returning, splendidly + dressed, with a pair of white kid-gloves in one hand and a large fan in the other. + He came trotting along in a great + hurry, muttering to himself, "Oh! the Duchess, the Duchess! Oh! won't she be + savage if I've kept her waiting!"

+ +
+ Illo5 +
+ +

When the Rabbit came near her, Alice began, in a low, timid voice, "If you please, + sir—" The Rabbit started violently, dropped the white kid-gloves and the fan and + skurried away into the darkness as hard as he could go.

+ +

Alice took up the fan and gloves and she kept fanning herself all the time she went + on talking. "Dear, dear! How queer everything is to-day! And yesterday things went on + just as usual. Was I the same when I got up this morning? But if I'm not the + same, the next question is, 'Who in the world am I?' Ah, that's the great + puzzle!"

+ +

As she said this, she looked down at her hands and was surprised to see that she had + put on one of the Rabbit's little white kid-gloves while she was talking. "How + can I have done that?" she thought. "I must be growing small again." She got up + and went to the table to measure herself by it and found that she was now about two + feet high and was going on shrinking + rapidly. She soon found out that the cause of this was the fan she was holding and she + dropped it hastily, just in time to save herself from shrinking away altogether.

+ +

"That was a narrow escape!" said Alice, a good deal frightened at the sudden + change, but very glad to find herself still in existence. "And now for the garden!" And + she ran with all speed back to the little door; but, alas! the little door was shut + again and the little golden key was lying on the glass table as before. "Things are + worse than ever," thought the poor child, "for I never was so small as this before, + never!"

+ +

As she said these words, her foot slipped, and in another moment, splash! she was up + to her chin in salt-water. Her first idea was that she had somehow fallen into the sea. + However, she soon made out that she was in the pool of tears which she had wept when + she was nine feet high.

+ +
+ Illo6 +
+ +

Just then she heard something splashing about in the pool a little way off, and she + swam nearer to see what it was: she soon made out that it was only a mouse that had + slipped in like herself.

+ +

"Would it be of any use, now," thought Alice, "to speak to this mouse? Everything is + so out-of-the-way down here that I should think very likely it can talk; at any rate, + there's no harm in trying." So she began, "O Mouse, do you know the way out of this + pool? I am very tired of swimming about here, O Mouse!" The Mouse looked at her rather + inquisitively and seemed to her to wink with one of its little eyes, but it said + nothing.

+ +

"Perhaps it doesn't understand English," thought Alice. "I dare say it's a French + mouse, come over with William the Conqueror." So she began again: "Où est ma + chatte?" which was the first sentence in her French lesson-book. The Mouse gave a + sudden leap out of the water and seemed to quiver all over with fright. "Oh, I beg your + pardon!" cried Alice hastily, afraid that she had hurt the poor animal's feelings. "I + quite forgot you didn't like cats."

+ +

"Not like cats!" cried the Mouse in a shrill, passionate voice. "Would you + like cats, if you were me?"

+ +

"Well, perhaps not," said Alice in a soothing tone; "don't be angry about it. And + yet I wish I could show you our cat Dinah. I think you'd take a fancy to cats, if you + could only see her. She is such a dear, quiet thing." The Mouse was bristling all over + and she felt certain it must be really offended. "We won't talk about her any more, if + you'd rather not."

+ +

"We, indeed!" cried the Mouse, who was trembling down to the end of its tail. "As if + I would talk on such a subject! Our family always hated cats—nasty, low, vulgar things! Don't + let me hear the name again!"

+ +
+ Alice at the Mad Tea Party. +
+

Alice at the Mad Tea Party.

+
+
+ +

"I won't indeed!" said Alice, in a great hurry to change the subject of + conversation. "Are you—are you fond—of—of dogs? There is such a nice + little dog near our house, I should like to show you! It kills all the rats + and—oh, dear!" cried Alice in a sorrowful tone. "I'm afraid I've offended it + again!" For the Mouse was swimming away from her as hard as it could go, and making + quite a commotion in the pool as it went.

+ +

So she called softly after it, "Mouse dear! Do come back again, and we won't talk + about cats, or dogs either, if you don't like them!" When the Mouse heard this, it + turned 'round and swam slowly back to her; its face was quite pale, and it said, in a + low, trembling voice, "Let us get to the shore and then I'll tell you my history and + you'll understand why it is I hate cats and dogs."

+ +

It was high time to go, for the pool was getting quite crowded with the birds and + animals that had fallen into it; there were a Duck and a Dodo, a Lory and an Eaglet, + and several other curious creatures. Alice led the way and the whole party swam to the + shore.

+ +
+ Illo7 +
+ +

+ +
+ + diff --git a/test/fixtures/alice/OPS/chapter_003.xhtml b/test/fixtures/alice/OPS/chapter_003.xhtml new file mode 100644 index 000000000..6b80493d4 --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_003.xhtml @@ -0,0 +1,177 @@ + + + + + Alice's Adventures in Wonderland + + + + +
+ +

+ + A Caucus-Race And A Long Tale +

+ +

They were indeed a queer-looking party that assembled on the + bank—the birds with draggled feathers, the animals with their fur clinging close + to them, and all dripping wet, cross and uncomfortable.

+ +
+ Illo8 +
+ +

The first question, of course, was how to get dry again. They had a consultation + about this and after a few minutes, it seemed quite natural to Alice to find herself + talking familiarly with them, as if she had known them all her life.

+ +

At last the Mouse, who seemed to be a person of some authority among them, called out, "Sit down, all of you, and listen + to me! I'll soon make you dry enough!" They all sat down at once, in a large + ring, with the Mouse in the middle.

+ +

"Ahem!" said the Mouse with an important air. "Are you all ready? This is the driest + thing I know. Silence all 'round, if you please! 'William the Conqueror, whose cause + was favored by the pope, was soon submitted to by the English, who wanted leaders, and + had been of late much accustomed to usurpation and conquest. Edwin and Morcar, the + Earls of Mercia and Northumbria'—"

+ +

"Ugh!" said the Lory, with a shiver.

+ +

"—'And even Stigand, the patriotic archbishop of Canterbury, found it + advisable'—"

+ +

"Found what?" said the Duck.

+ +

"Found it," the Mouse replied rather crossly; "of course, you know what 'it' + means."

+ +

"I know what 'it' means well enough, when I find a thing," said the Duck; + "it's generally a frog or a worm. The question is, what did the archbishop find?"

+ +

The Mouse did not notice this question, but hurriedly went on, "'—found it + advisable to go with Edgar Atheling to meet William and offer him the crown.'—How + are you getting on now, my dear?" it continued, turning to Alice as it spoke.

+ +

"As wet as ever," said Alice in a melancholy tone; "it doesn't seem to dry me at + all."

+ +

"In that case," said the Dodo solemnly, rising to its feet, "I move that the meeting + adjourn, for the immediate adoption of more energetic remedies—"

+ +

"Speak English!" said the Eaglet. "I don't know the meaning of half those long + words, and, what's more, I don't believe you do either!"

+ +

"What I was going to say," said the Dodo in an offended tone, "is that the best + thing to get us dry would be a Caucus-race."

+ +

"What is a Caucus-race?" said Alice.

+ +
+ Illo9 +
+ +

"Why," said the Dodo, "the best way to explain it is to do it." First it marked out + a race-course, in a sort of circle, and then all the party were placed along the + course, here and there. There was no "One, two, three and away!" but they began running + when they liked and left off when they liked, so that it was not easy to know when the + race was over. However, when they had been running half an hour or so and were quite + dry again, the Dodo suddenly called out, "The race is over!" and they all crowded + 'round it, panting and asking, "But who has won?"

+ +

This question the Dodo could not answer without a great deal of thought. At last it + said, "Everybody has won, and all must have prizes."

+ +

"But who is to give the prizes?" quite a chorus of voices asked.

+ +

"Why, she, of course," said the Dodo, pointing to Alice with one finger; and + the whole party at once crowded 'round her, calling out, in a confused way, "Prizes! + Prizes!"

+ +

Alice had no idea what to do, and in despair she put her hand into her pocket and + pulled out a box of comfits (luckily the salt-water had not got into it) and handed + them 'round as prizes. There was exactly one a-piece, all 'round.

+ +

The next thing was to eat the comfits; this caused some noise and confusion, as the + large birds complained that they could not taste theirs, and the small ones choked and + had to be patted on the back. However, it was over at last and they sat down again in a + ring and begged the Mouse to tell them something more.

+ +

"You promised to tell me your history, you know," said Alice, "and why it is you + hate—C and D," she added in a whisper, half afraid that it would be offended + again.

+ +

"Mine is a long and a sad tale!" said the Mouse, turning to Alice and sighing.

+ +

"It is a long tail, certainly," said Alice, looking down with wonder at the + Mouse's tail, "but why do you call it sad?" And she kept on puzzling about it while the + Mouse was speaking, so that her idea of the tale was something like this:

+ +
+ "Fury said to
a mouse, + That
he met in the
house, + 'Let
us both go
to law: + I
will prosecute
you.—
Come, I'll
+ take no denial:
We must have
the trial;
+ For really
this + morning
I've
nothing
to do.'
Said the
mouse to
+ the cur,
'Such a
trial, dear
+ sir, With
no jury
+ or judge,
would
+ be wasting
our
+ breath.'
'I'll be
judge,
I'll be
jury,'
said
cunning
old
Fury;
'I'll
try
+ the
whole
+ cause,
and
+ condemn
you to
+ death.'"
+
+ +

"You are not attending!" said the + Mouse to Alice, severely. "What are you thinking of?"

+ +

"I beg your pardon," said Alice very humbly, "you had got to the fifth bend, I + think?"

+ +

"You insult me by talking such nonsense!" said the Mouse, getting up and walking + away.

+ +

"Please come back and finish your story!" Alice called after it. And the others all + joined in chorus, "Yes, please do!" But the Mouse only shook its head impatiently and + walked a little quicker.

+ +

"I wish I had Dinah, our cat, here!" said Alice. This caused a remarkable sensation + among the party. Some of the birds hurried off at once, and a Canary called out in a + trembling voice, to its children, "Come away, my dears! It's high time you were all in + bed!" On various pretexts they all moved off and Alice was soon left alone.

+ +

"I wish I hadn't mentioned Dinah! Nobody seems to like her down here and I'm sure + she's the best cat in the world!" Poor Alice began to cry again, for she felt very + lonely and low-spirited. In a little while, however, she again heard a little pattering + of footsteps in the distance and she looked up eagerly.

+ +
+ Illo10 +
+

+ +
+ Illo11 +
+ +
+ + diff --git a/test/fixtures/alice/OPS/chapter_004.xhtml b/test/fixtures/alice/OPS/chapter_004.xhtml new file mode 100644 index 000000000..babbb4ec3 --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_004.xhtml @@ -0,0 +1,159 @@ + + + + + Alice's Adventures in Wonderland + + + + +
+ +

+ The Rabbit Sends In A Little Bill

+ +

It was the White Rabbit, trotting slowly back again and + looking anxiously about as it went, as if it had lost something; Alice heard it + muttering to itself, "The Duchess! The Duchess! Oh, my dear paws! Oh, my fur and + whiskers! She'll get me executed, as sure as ferrets are ferrets! Where can I + have dropped them, I wonder?" Alice guessed in a moment that it was looking for the fan + and the pair of white kid-gloves and she very good-naturedly began hunting about for + them, but they were nowhere to be seen—everything seemed to have changed since + her swim in the pool, and the great hall, with the glass table and the little door, had + vanished completely.

+ +

Very soon the Rabbit noticed Alice, and called to her, in an angry tone, "Why, Mary + Ann, what are you doing out here? Run home this moment and fetch me a pair of + gloves and a fan! Quick, now!"

+ +

"He took me for his housemaid!" said Alice, as she ran off. "How surprised he'll be + when he finds out who I am!" As she said this, she came upon a neat little house, on + the door of which was a bright brass plate with the name "W. RABBIT" engraved upon it. + She went in without knocking and hurried upstairs, in great fear lest she should meet + the real Mary Ann and be turned out of the house before she had found the fan and + gloves.

+ +

By this time, Alice had found her way into a tidy little room with a table in the + window, and on it a fan and two or three pairs of tiny white kid-gloves; she took up + the fan and a pair of the gloves and was just going to leave the room, when her eyes + fell upon a little bottle that stood near the looking-glass. She uncorked it and put it + to her lips, saying to herself, "I do hope it'll make me grow large again, for, really, + I'm quite tired of being such a tiny little thing!"

+ +

Before she had drunk half the bottle, she found her head pressing against the + ceiling, and had to stoop to save her neck from being broken. She hastily put down the + bottle, remarking, "That's quite enough—I hope I sha'n't grow any more."

+ +

Alas! It was too late to wish that! She went on growing and growing and very soon + she had to kneel down on the floor. Still she went on growing, and, as a last resource, + she put one arm out of the window and one foot up the chimney, and said to + herself, "Now I can do no more, + wha tev er happens. What will become of me?"

+ +
+ Illo12 +
+ +

Luckily for Alice, the little mag ic b ottle had now had its full effect and she grew + no larger. After a few minutes she hear d a voice outside and stopped to listen.

+ +

"Mary Ann! Mary Ann!" said the voice . "Fetch me my gloves this moment!" Thencame a + little pattering of feet on the stairs. Alice knew it was the Rabbit coming to look for + her and she trembled till she shoo k th e house, quite forgetting that she was now about + a thousand times as large as the Rabbit and had no reason to be afraid of it.

+ +

Presently the Rabbit came up to the door and tried to open it; but as the door + opened inwards and Alice's elbow was press ed h ard against it, that attempt proved a + failure. Alice heard it sayto itself, "Then I'll g o 'round and get in at the + window."

+ +

"That you won't!" thought Ali ce; and after waiting till she fancied she heard + the Rabbit just under the window, sh e suddenly spread out her hand and made asnatch in the air. She did not get hold of + anything, but she heard a little s hriek and a fall and a crash of bro ken glass, from + which she concluded that it was just possible it had fallen into a c ucumber-frame or + something of that sort.

+ +

Next came an angry voice—the Rabbit's—" Pat!Pat! Where are you?" And + then a voice she had never heard before, "Sure t hen, I'm here! D iggi ng for apples, yer + honor!"

+ +

"Here! Come and help me out of this! Now tell me, Pat, what's that in the + windo w?"

+ +

"Sure, it's an arm, yer honor!"

+ +

"Well, it's got no business the re, at any rate; go and take it away!"

+ +

There was a long silence after this an d Alice could only hear whispers now and then, + and at last she spread out her hand ag ain and made another snatch in the air. This time + there were two little shrieks a nd more sounds of brok en g lass. "I wonder what + they'll do next!" thought Alice. "As for pulling me out of the wi ndow, I only wish they + could!"

+ +

She waited for some time without h earing anything more. At last came a rumbling of + little cart-wheels and the sound of a good many voices all talking together. She made + out the words: "Where's the other lad der? Bill's got the other—Bill! Here, Bill! + Will the roof bear?—Who's to g o do wn the chimney?—Nay, I sha'n't! + You do it! Here, Bill! The master s ays you've got to go down the chimney!"

+ +

Alice drew her foot as far down the c himney as she couldand waited till she heard a + little animal scratching and scrambling a bout in the chimney close above + her; then she gave one sharp kick and waited to see + what would happen next.

+ +

The first thing she heard was a general chorus of "There goes Bill!" then the + Rabbit's voice alone—"Catc h him, you by the hedge!" Then silence a nd t hen another + confusion of voices—"Hold up his head—Brandy now—Don 't choke + him—What happened to you?"

+ +

Lastcame a little f eeble, squeaking voice, "Well, I hardly know—No mor e, + thank ye. I'm better now—all I know is, something comes at me like a + Jack-in-the -box and up I goes like a sky-rocket!"

+ +

Afte r a minute or two of silence, they began moving about again, and Alice heard the + Rabbit say , "A barrowful will do, to begin with."

+ +

"A barrowful of what?" though t Alice. But she had not long to doubt, for the + next moment a shower of little pe bbles came rattling in at the window and some of them + hither in the face. Alice no ticed, with some surprise, that the pebbles were all + turning into little cakes as they lay on the floor and abr ight idea came into her + head. "If Ieat one of these cakes," she thought, "it's sure to m ake some change + in my size."

+ +

So she swallowed one of the cakes an d was delighted to find that she began shrinking + directly. As soon as she was small enough to get through the door, she ran out of the + house and found quite a crowd of lit tle animals and birds waiting outside. They all + m ade a rush at Alice the moment she ap peared, but she ran off as hard as she could and + soon found herself safe in a thick wood.

+ +
+ The Duchess tucked her arm affectionately into Alice's. +
+

"The Duchess tucked her arm affectionately into Alice's."

+
+
+ +

"The first thing I've got to do," said Alice to herself, as she wande red about in the wood, "is to grow to my right + size again; and the second thing i s to find my way into that lovely garden. I suppose I + ought to eat or drink something or other, but the great question is 'What?'"

+ +

Alice looked all arou nd her at the flowers and the blades of grass, but she could + notsee anything that loo kedlike the right thing to eat or drink under the + circumstances. There was a large mushroom growing near her, about the same height as + herself. She stretched herself u p on tiptoe and peeped over the edge and her eyes + immediately met those of a large blue caterpillar, that was sitting on the top, with + its armsfolded, quietly smoking a long hookah a nd taking not the smallest notice of + her or of anything else.

+ +
+ Illo13 +
+ +

+ +
+ + diff --git a/test/fixtures/alice/OPS/chapter_005.xhtml b/test/fixtures/alice/OPS/chapter_005.xhtml new file mode 100644 index 000000000..25d35225d --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_005.xhtml @@ -0,0 +1,149 @@ + + + + + Alice's Adventures in Wonderland + + + + +
+ +

+ Advice From A Caterpillar

+ +

At last the Caterpillar took the hookah out of its mouth and + addressed Alice in alanguid, sleepy voice.

+ +

"Who are you?" said the Caterpillar.

+ +
+ Illo14 +
+ +

Alice replied, rather shyly, "I—I hardly know, sir, just at present—at + least I know who I was when I got up this morning, but I think I must have + changed several times since then."

+ +

"Wha t do you mean by that?" said the Caterpillar, sternly. "Explain yourself!"

+ +

"I can't explainmyself, I'm afraid, sir," said Alice,"because I'm not + myself, you see—being so ma nydifferent sizes in a day is very confusing." She + drew hers elf up and said very gravely, "I think you ought to tell me who you + are, first."

+ +

"Why?" said the Caterpillar.

+ +

As Alice could not think of any good reason and the Caterpillar seemed to be in a + very u npleasant state of mind, she turned away.

+ +

"Come back!" the Caterpillar called after her. "I've something important to say!" + Alice turned and came back again.

+ +

"Keep your temper," said the Caterpillar.

+ +

"Is that all?" said Alice, swallowing down her anger as well as she could.

+ +

"No," said the Caterpillar.

+ +

It unfolded its arms, took the hookah out of its mouth again, and said, " So you + think you're changed, do you?"

+ +

"I'm afr aid, I am, sir," said Alice. "I can't remember things as I used—and I + don't keep the same size for ten minutes together!"

+ +

"What size d o you want to be?" asked the Caterpillar.

+ +

"Oh, I'mnot particular as to si ze," Alice hastily replied, "only one doesn't like + changing sooften, you know. I should like to be a little larger, sir, if you + wouldn't mind," said Alice. "Three inches is such a wretched height to be."

+ +

"It is a very good height indeed!" said the Caterpillar an grily, rearing itself + upright as it spoke (it was exactly three inches high).

+ +

In a minute or two, the Caterpillar got down off the mushroom and crawled away in to + the grass,merely remarking, as it went, "One side will make you grow taller, and the + other side will make you grow shorter."

+ +

"One side of what? The other side of what?" thought Alice to + herself.

+ +

"Of the mushroom," said the Caterpillar, just as if she had asked it aloud; and in + another moment, it was out of sight.

+ +

Alice remained looking thoughtfully at the mushroom for a minute, trying to make out + whichwere the two sides of it. At last she stretched her arms 'round it as far as they + would go, and broke off a bit of the edge with each hand.

+ +

"And now which is which?" she said to herself, and nibbled a little of the + right-hand bit to trythe effect. The next moment she felt a violent blow underneath + her chin—it had struck her foot!

+ +

She was a gooddeal frightened b y this very sudden change, as she was shrinking + rapidly; so she set to work at once to eat some of the other bit. Her chin was pressed + so closely against her foo tthat there was hardly room to open her mouth; but she did + it at last and managed to s wallow a morsel of the left-hand bit....

+ +

"Come, my head's free at last!" said Alice; but all she could see, when she loo ked + down, was an immense length of neck, which seemed to rise like a stalk out of a sea of + green leaves that lay far below her.

+ +

"Where have my shoulders got to? And oh, mypoor hands, how is it I can't see + you?"Shewas delighted to find that + her neck would bend about easily in any direction, like a serpent. She had just + succeeded in curving it down into a gr aceful zigzag and was going to dive inamong the + leaves, when a s harp hiss made her draw back in a hurry —a large pigeon had flo wn + into her face and was beating her violently with its wings.

+ +
+ Illo15 +
+ +

"Serpent!" cried the Pigeon.

+ +

"I'm not a serpent!" said Alice indignantly. "Let me alone!"

+ +

"I've tried the roo ts of trees, and I've tried banks, and I've tri ed hedges," the + Pigeon went on, "but those serpents! There's no pleasing them!"

+ +

Alice was more and more puzzled.

+ +

"As if it wasn't trouble enough hatching the eggs," said the Pigeon, "but I must be + on the look-out for serpents, night and day! And just as I'd taken the highest tree in + the wood," continued the Pigeon, raising its voice to a shriek, "and just as I was + thinkingI should be free of them at last, they must needs come wriggling down from the + sky! Ugh, Serpent!"

+ +

"But I'm not a serpent, I tell you!" said Alice. "I'm a—I'm a—I'm + a little girl," she added rather + doubtfully, as she remembered the numbe r of changes she had gone through that day.

+ +

"You're looking for eggs, I know that well enough," said the Pigeon; "and + what does it matter to me whether you're a little girl or a serpent?"

+ +

"It matters a good deal to me," said Alice h astily; "but I'm not looking for + eggs, as it happens, and if I was, I shouldn't want yours—I don't like + them raw."

+ +

"Well, be off, then!" said the Pige on in a sulky tone, as it settled down again into + its nest. Alice crouched down a mong the trees as well as she could, for her neck kept + getting entangled among the bra nches, and every now and then she had to stop and + untwist it. After awhile she rememb ered that she still held the pieces of mushroom in + her hands, and she set to work very carefully, nibbling first at one and then at the + other, and growing sometimes taller and sometimes shorter, until she had succeeded in + bringing herself down to her usual height.

+ +

It was so long since she had been anything near the right size that it felt quite + strange at first. "The next thing is to get into that beautiful garden—how + is that to be done, I wonder?" As she said this, she came suddenly upon an open + place, with a little house in it about four feet high. "Whoever lives there," thought + Alice, "it'll never do to come upon them this size;why, I should frighten them + out of their wits!" She did not venture to go near the house till she had brought + herself down to nine inches high.

+ +

+
+ + diff --git a/test/fixtures/alice/OPS/chapter_006.xhtml b/test/fixtures/alice/OPS/chapter_006.xhtml new file mode 100644 index 000000000..b36f41e23 --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_006.xhtml @@ -0,0 +1,122 @@ + + + + + Alice's Adventures in Wonderland + + + + +
+ +

Pig And Pepper

+ +

For a minute or twoshe stood looking at the house, when + suddenly a footman in livery came running out of the wood (judging by his face only, + she would have called him a fish)—and rapped loudly at the door with his + knuckles. It was opened by another footman in livery,with a round face and large eyes + like a frog.

+ +
+ Illo15 +
+ +

The Fish-Footman began by producing from under his arm a great letter, and this he + handed over to the other, saying, in a solemn tone, "For the Duchess. An invitation from the Queen to play croquet." The + Frog-Footman repeated, in the same solemn tone, "From the Queen. An invitation for the + Duchess to play croquet." Then they both bowed low and their curls got entangled + together.

+ +

When Alice next peeped out, the Fish-Footman was gone, and the other was sitting on + the ground near the door, staring stupidly up into the sky. Alice went timidly up to + the door and knocked.

+ +

"There's no sortof use in knocking," said the Footman, "and that for two reasons. + First, because I'm on the same side of the door as you are; secondly, because they're + making such a noise inside, no one could possibly hear you." And certainly there + was a most extraordinary noise going on within—a constant howling and + sneezing, and every now and then a great crash, as if a dish or kettle had been broken + to pieces.

+ +

"How am I to get in?" asked Alice.

+ +

"Are you to get in at all?" said the Footman. "That's the first question, you + know."

+ +

Alice opened the door and went in. The door led right into a large kitchen, which + was full of smoke from one end to the other; the Duchess was sitting on a three-legged + stool in the middle, nursing a baby; the cook was leaning over the fire, stirring a + large caldron which seemed to be full of soup.

+ +

"There's certainly too much pepper in that soup!" Alice said to herself, as well as + she could for sneezing. Even the Duchess sneezed occasionally; and asforthe baby, it + was sneezing and howling alternately without a moment'spause. The only two + creatures in the kitchen that did + not sneeze were the cook and a large cat, which was grinning from ear to + ear.

+ +

"Please would you tell me," said Alice, a little timidly, "why your cat grins like + that?"

+ +

"It's a Cheshire-Cat," said the Duchess,"and that's why."

+ +

"I didn't know that Cheshire-Cats always grinned; in fact, I didn't know that cats + could grin," said Alice.

+ +

"You don't know much," said the Duchess, "and that's a fact."

+ +

Just then the cook took the caldron of soupoff the fire, and at once set to work + throwing everything within her reach at the Duchess and the baby—the fire-irons + came first; then followed a shower of saucepans, plates and dishes. The Duchess took no + notice of them, even when they hit her, and the baby was howling so much already that + itwas quite impossible to say whether the blows hurt it or not.

+ +

"Oh, please mind what you're doing!" cried Alice, jumping up and down in an + agony of terror.

+ +

"Here! You may nurse it a bit, if you like!" the Duchess said to Alice, flinging the + baby at her as she spoke. "I must go and get ready to play croquet with the Queen," and + she hurried out of the room.

+ +

Alice caught the baby with some difficulty, as it was a queer-shaped little creature + and held out its arms and legs in all directions. "If I don't take this child away with + me," thought Alice, "they're sure to kill it in a day or two. Wouldn't it be murder to + leave it behind?" She said the last words out loud and the little thing grunted in + reply.

+ +

"If you're going to turn into a pig, my dear," said Alice, "I'll have nothing more + to do with you. Mind now!"

+ +

Alice was just beginning to think to herself, "Now, what am I to do with this + creature, when I get it home?" when it grunted again so violently that Alice looked + down into its face in some alarm. This time there could be no mistake about + it—it was neither more nor less than a pig; so she set the little creature down + and felt quite relieved to see it trot awayquietly into the wood.

+ +

Alice was a little startled by seeing the Cheshire-Catsitting on a bough of a tree + a few yards off. The Cat only grinned when it saw her. "Cheshire-Puss," began Alice, + rather timidly, "would you please tell me which way I ought to gofrom here?"

+ +

"In that direction," the Cat said, waving the right paw 'round, "lives a + Hatter; and in that direction," waving the other paw, "lives a March Hare. Visit + either you like; they're both mad."

+ +

"But I don't want to go among mad people," Alice remarked.

+ +

"Oh, you can't help that," said the Cat; "we're all mad here. Do you play croquet + with the Queen to-day?"

+ +

"I should like it very much," said Alice, "but I haven't been invited yet."

+ +

"You'll see me there," said the Cat, and vanished.

+ +

Alice had not gone much farther before she came in sight of the house of the March + Hare; it was so large a house that she did not like to go near till she had nibbled + some more of the left-hand bit of mushroom.

+ +

+ +
+ + diff --git a/test/fixtures/alice/OPS/chapter_007.xhtml b/test/fixtures/alice/OPS/chapter_007.xhtml new file mode 100644 index 000000000..5a79bca0a --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_007.xhtml @@ -0,0 +1,98 @@ + + + + + Alice's Adventures in Wonderland + + + + +
+ +

A Mad Tea-Party

+ +

There was a table set out under a tree in front of the + house, and the March Hare and the Hatter were having tea at it; a Dormouse was sitting + between them, fast asleep.

+ +

The table was a large one, but the three were all crowded together at one corner of + it. "No room! No room!" they cried out when they saw Alice coming. "There's + plenty of room!" said Alice indignantly, and she sat down in a large arm-chair + at one end of the table.

+ +

The Hatter opened his eyes very wide on hearing this, but all he said was "Why is a + raven like a writing-desk?"

+ +

"I'm glad they've begun asking riddles—I believe I can guess that," she added + aloud.

+ +

"Do you mean that you think you can find out the answer to it?" said the March + Hare.

+ +

"Exactly so," said Alice.

+ +

"Then you should say what you mean," the March Hare went on.

+ +

"I do," Alice hastily replied; "at least—at least I mean what I + say—that's the same thing, you know."

+ +

"You might just as well say," added the Dormouse, which seemed to be talking in its + sleep, "that 'I breathe when I sleep' is the same thing as 'I sleep when I + breathe!'"

+ +

"It is the same thing with you," said the Hatter, and he poured a little hot + tea upon its nose. The Dormouse shook its head impatiently and said, without opening + its eyes,"Ofcourse, of course; just what I was going to remark myself."

+ +
+ Illo17 +
+ +

"Have you guessed the riddle yet?" the Hatter said, turning to Alice again.

+ +

"No, I give it up," Alice replied. "What's theanswer?"

+ +

"I haven't the slightest idea," said the Hatter.

+ +

"Nor I,"said the March Hare.

+ +

Alice gave a weary sigh. "I think you might do something better with the time," she + said, "than wasting it in asking riddles that have no answers."

+ +

"Take some more tea," the March Hare said to Alice, very earnestly.

+ +

"I've had nothing yet," Alice replied in an offended tone, "so I can't take + more."

+ +

"You mean you can't take less," said the Hatter; "it's very easy to take + more than nothing."

+ +

At this, Alice got up and walked off. The Dormouse fell asleep instantly and neither + of the others took the least notice of her going, thoughshe looked back once or twice; the last time she saw them, they + were trying to put the Dormouse into the tea-pot.

+ + +
+ The Trial of the Knave of Hearts. +
+

The Trial of the Knave of Hearts.

+
+
+ +

"At any rate, I'll never go there again!" said Alice, as she picked her way + through the wood. "It's the stupidest tea-party I ever was at in all my life!" Just as + she said this, she noticed that one of the trees had a door leading right into it. + "That's very curious!" she thought. "I think I may as well go in at once." And in she + went.

+ +

Once more she foundherself in the long hall and close to the little glass table. + Taking the little golden key, she unlocked the door that led into the garden. Then she + set to work nibbling at the mushroom (she had kept a piece of it in her pocket) till + she was about a foot high; then she walked down the little passage; and + then—she found herself at last in the beautiful garden, among the bright + flower-beds and the cool fountains.

+ +
+ + diff --git a/test/fixtures/alice/OPS/chapter_008.xhtml b/test/fixtures/alice/OPS/chapter_008.xhtml new file mode 100644 index 000000000..06f0522df --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_008.xhtml @@ -0,0 +1,151 @@ + + + + + Alice's Adventures in Wonderland + + + + +
+ +

+ The Queen's Croquet Ground

+ +

A large rose-tree stood near the entrance of the garden; the + roses growing on it were white, but there were threegardeners at it, busily painting + them red. Suddenly their eyes chanced to fall upon Alice, as she stood watching them. + "Would you tell me, please," said Alice, a little timidly, "why you are painting those + roses?"

+ +

Five and Seven said nothing, butlooked at Two. Twobegan, in a low voice, "Why, the fact is, you see, Miss, this here + ought to have been a red rose-tree, and we put a white one in by mistake; and, + if the Queen was to find it out, we should all have our heads cut off, you know. So you + see, Miss, we're doing our best, afore she comes, to—" At this moment, Five, who + had been anxiously looking across the garden, called out, "The Queen! The Queen!" and + the three gardeners instantly threw themselves flat upon their faces. There was a sound + of many footstepsand Alice looked 'round, eager to see the Queen.

+ +

First came ten soldiers carrying clubs, with their hands and feet at the corners: + next the ten courtiers; these were ornamented all over with diamonds. After these came + the royal children; there were ten of them, all ornamented with hearts. Next came the + guests, mostly Kings and Queens, and among them Alice recognized the White Rabbit. Then + followed the Knave of Hearts, carrying the King's crown on a crimson velvet cushion; + and last of all this grand procession came THE KING AND THE QUEEN OF HEARTS.

+ +

When the procession came opposite to Alice, they all stopped and looked at her, and + the Queen said severely, "Who is this?" She said it to the Knave of Hearts, who only + bowed and smiled in reply.

+ +

"My name is Alice, so please Your Majesty," said Alice very politely; but she added + to herself, "Why, they're only a pack of cards, after all!"

+ +

"Can you play croquet?" shouted the Queen. The question was evidently meant for + Alice.

+ +

"Yes!" said Alice loudly.

+ +

"Come on, then!" roared the Queen.

+ +

"It's—it's a very fine day!" said a timid voice to Alice. She was walking by + the White Rabbit, who was peeping anxiously into her face.

+ +

"Very," said Alice. "Where's the Duchess?"

+ +

"Hush! Hush!" said the Rabbit. "She's under sentence of execution."

+ +

"What for?" said Alice.

+ +

"She boxed the Queen's ears—" the Rabbit began.

+ +

"Get to your places!" shouted the Queen in a voice of thunder, and people began + running about in all directions, tumbling up against each other. However, they got + settled down in a minute or two, and the game began.

+ +

Alice thought she had never seen such a curious croquet-ground in her life; it was + all ridges and furrows. The croquet balls were live hedgehogs, and the mallets live + flamingos and the soldiers had to double themselves up and stand on their hands and + feet, to make the arches.

+ +

The players all played at once, without waiting for turns, quarrelling all the while + and fighting for the hedgehogs; and in a very short time, the Queen was in a furious + passion and went stamping about and shouting, "Off with his head!" or "Off with her + head!" about once in a minute.

+ +

"They're dreadfully fond of beheading people here," thought Alice; "the great wonder + is that there's anyone left alive!"

+ +

She was looking about for some way of escape, when she noticed a curious appearance + in the air. "It's the Cheshire-Cat," + she said to herself; "now I shall have somebody to talk to."

+ +

"How are you getting on?" said the Cat.

+ +

"I don't think they play at all fairly," Alice said, in a rather complaining tone; + "and they all quarrel so dreadfully one can't hear oneself speak—and they don't + seem to have any rules in particular."

+ +

"How do you like the Queen?" said the Cat in a low voice.

+ +

"Not at all," said Alice.

+ +
+ Illo18 +
+ +

Alice thought she might as well go back and see how the game was going on. So she + went off in search of her hedgehog. The hedgehog was engaged in a fight with another + hedgehog, which seemed to Alice an excellent opportunity for croqueting one of them + with the other; the only difficulty was that her flamingo was gone across to the other + side of the garden, where Alice could see it trying, in a helpless sort of way, to fly + up into a tree. She caught the flamingo and tucked it away under her arm, that it might + not escape again.

+ +

Just then Alice ran across the Duchess (who was now out of prison). She tucked her + arm affectionately into Alice's and they walked off together. Alice was very glad to + find her in such a pleasant temper. She was a little startled, however, when she heard + the voice of the Duchess close to her ear. "You're thinking about something, my dear, + and that makes you forget to talk."

+ +

"The game's going on rather better now," Alice said, by way of keeping up the + conversation a little.

+ +

"'Tis so," said the Duchess; "and the moral of that is—'Oh, 'tis love, 'tis + love that makes the world go 'round!'"

+ +

"Somebody said," Alice whispered, "that it's done by everybody minding his own + business!"

+ +

"Ah, well! It means much the same thing," said the Duchess, digging her sharp little + chin into Alice's shoulder, as she added "and the moral of that is—'Take + care of the sense and the sounds will take care of themselves.'"

+ +

To Alice's great surprise, the Duchess's arm that was linked into hers began to + tremble. Alice looked up and there stood the Queen in front of them, with her arms + folded, frowning like a thunderstorm!

+ +

"Now, I give you fair warning," shouted the Queen, stamping on the ground as she + spoke, "either you or your head must be off, and that in about half no time. Take your + choice!" The Duchess took her choice, and was gone in a moment.

+ +

"Let's go on with the game," the Queen said to Alice; and Alice was too much + frightened to say a word, but slowly + followed her back to the croquet-ground.

+ +

All the time they were playing, the Queen never left off quarreling with the other + players and shouting, "Off with his head!" or "Off with her head!" By the end of half + an hour or so, all the players, except the King, the Queen and Alice, were in custody + of the soldiers and under sentence of execution.

+ +

Then the Queen left off, quite out of breath, and walked away with Alice.

+ +

Alice heard the King say in a low voice to the company generally, "You are all + pardoned."

+ +

Suddenly the cry "The Trial's beginning!" was heard in the distance, and Alice ran + along with the others.

+ +
+ + diff --git a/test/fixtures/alice/OPS/chapter_009.xhtml b/test/fixtures/alice/OPS/chapter_009.xhtml new file mode 100644 index 000000000..57653aeb7 --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_009.xhtml @@ -0,0 +1,100 @@ + + + + + Alice's Adventures in Wonderland + + + + +
+ +

Who Stole The Tarts?

+ +

The King and Queen of Hearts were seated on their throne + when they arrived, with a great crowd assembled about them—all sorts of little + birds and beasts, as well as the whole pack of cards: the Knave was standing before + them, in chains, with a soldier on each side to guard him; and near the King was the + White Rabbit, with a trumpet in one hand and a scroll of parchment in the other. In the + very middle of the court was a + table, with a large dish of tarts upon it. "I wish they'd get the trial done," Alice + thought, "and hand 'round the refreshments!"

+ +
+ Illo19 +
+ +

The judge, by the way, was the King and he wore his crown over his great wig. + "That's the jury-box," thought Alice; "and those twelve creatures (some were animals + and some were birds) I suppose they are the jurors."

+ +

Just then the White Rabbit cried out "Silence in the court!"

+ +

"Herald, read the accusation!" said the King.

+ +

On this, the White Rabbit blew three blasts on the trumpet, then unrolled the + parchment-scroll and read as follows:

+ +
+ "The Queen of Hearts, she made some tarts,
All on a summer day;
The Knave of Hearts, he stole + those tarts
And took them quite away!"
+
+ +

"Call the first witness," said the King; and the White Rabbit blew three blasts on + the trumpet and called out, "First witness!"

+ +

The first witness was the Hatter. He came in with a teacup in one hand and a piece of bread and butter in the + other.

+ +

"You ought to have finished," said the King. "When did you begin?"

+ +

The Hatter looked at the March Hare, who had followed him into the court, arm in arm + with the Dormouse. "Fourteenth of March, I think it was," he said.

+ +

"Give your evidence," said the King, "and don't be nervous, or I'll have you + executed on the spot."

+ +

This did not seem to encourage the witness at all; he kept shifting from one foot to + the other, looking uneasily at the Queen, and, in his confusion, he bit a large piece + out of his teacup instead of the bread and butter.

+ +

Just at this moment Alice felt a very curious sensation—she was beginning to + grow larger again.

+ +

The miserable Hatter dropped his teacup and bread and butter and went down on one + knee. "I'm a poor man, Your Majesty," he began.

+ +

"You're a very poor speaker," said the King.

+ +

"You may go," said the King, and the Hatter hurriedly left the court.

+ +

"Call the next witness!" said the King.

+ +

The next witness was the Duchess's cook. She carried the pepper-box in her hand and + the people near the door began sneezing all at once.

+ +

"Give your evidence," said the King.

+ +

"Sha'n't," said the cook.

+ +

The King looked anxiously at the White Rabbit, who said, in a low voice, "Your + Majesty must cross-examine this witness."

+ +

"Well, if I must, I must," the King said. "What are tarts made of?"

+ +

"Pepper, mostly," said the cook.

+ +

For some minutes the whole court was in confusion and by the time they had settled + down again, the cook had disappeared.

+ +

"Never mind!" said the King, "call the next witness."

+ +

Alice watched the White Rabbit as he fumbled over the list. Imagine her surprise + when he read out, at the top of his shrill little voice, the name "Alice!"

+ +
+ + \ No newline at end of file diff --git a/test/fixtures/alice/OPS/chapter_010.xhtml b/test/fixtures/alice/OPS/chapter_010.xhtml new file mode 100644 index 000000000..4dc46c562 --- /dev/null +++ b/test/fixtures/alice/OPS/chapter_010.xhtml @@ -0,0 +1,104 @@ + + + + + Alice's Adventures in Wonderland + + + + +
+ +

Alice's Evidence

+ +

"Here!" cried Alice. She jumped up in such a hurry that she + tipped over the jury-box, upsetting all the jurymen on to the heads of the crowd + below.

+ +

"Oh, I beg your pardon!" she exclaimed in a tone of great dismay.

+ +

"The trial cannot proceed," said the King, "until all the jurymen are back in their + proper places—all," he repeated with great emphasis, looking hard at + Alice.

+ +

"What do you know about this business?" the King said to Alice.

+ +

"Nothing whatever," said Alice.

+ +

The King then read from his book: "Rule forty-two. All persons more than a mile high to leave the court."

+ +

"I'm not a mile high," said Alice.

+ +

"Nearly two miles high," said the Queen.

+ +
+ Illo20 +
+ +

"Well, I sha'n't go, at any rate," said Alice.

+ +

The King turned pale and shut his note-book hastily. "Consider your verdict," he + said to the jury, in a low, trembling voice.

+ +

"There's more evidence to come yet, please Your Majesty," said the White Rabbit, + jumping up in a great hurry. "This paper has just been picked up. It seems to be a + letter written by the prisoner to—to somebody." He unfolded the paper as he spoke + and added, "It isn't a letter, after all; it's a set of verses."

+ +

"Please, Your Majesty," said the Knave, "I didn't write it and they can't prove that + I did; there's no name signed at the end."

+ +

"You must have meant some mischief, or else you'd have signed your name like + an honest man," said the King. There was a general clapping of hands at this.

+ +

"Read them," he added, turning to the White Rabbit.

+ +

There was dead silence in the court whilst the White Rabbit read out the verses.

+ +

"That's the most important piece of evidence we've heard yet," said the King.

+ +

"I don't believe there's an atom of meaning in it," ventured Alice.

+ +

"If there's no meaning in it," said the King, "that saves a world of trouble, you + know, as we needn't try to find any. Let the jury consider their verdict."

+ +

"No, no!" said the Queen. "Sentence first—verdict afterwards."

+ +

"Stuff and nonsense!" said Alice loudly. "The idea of having the sentence + first!"

+ +
+ Illo21 +
+ +

"Hold your tongue!" said the Queen, turning purple.

+ +

"I won't!" said Alice.

+ +

"Off with her head!" the Queen shouted at the top of her voice. Nobody moved.

+ +

"Who cares for you?" said Alice (she had grown to her full size by this + time). "You're nothing but a pack of cards!"

+ +

At this, the whole pack rose up in the air and came flying down upon her; she gave a little scream, half of fright and + half of anger, and tried to beat them off, and found herself lying on the bank, with + her head in the lap of her sister, who was gently brushing away some dead leaves that + had fluttered down from the trees upon her face.

+ +

"Wake up, Alice dear!" said her sister. "Why, what a long sleep you've had!"

+ +

"Oh, I've had such a curious dream!" said Alice. And she told her sister, as well as + she could remember them, all these strange adventures of hers that you have just been + reading about. Alice got up and ran off, thinking while she ran, as well she might, + what a wonderful dream it had been.

+ +
+ Illo22 +
+ +
+ + diff --git a/test/fixtures/alice/OPS/cover.xhtml b/test/fixtures/alice/OPS/cover.xhtml new file mode 100644 index 000000000..ac723473a --- /dev/null +++ b/test/fixtures/alice/OPS/cover.xhtml @@ -0,0 +1,12 @@ + + + + + Cover + + + + + Cover Image + + diff --git a/test/fixtures/alice/OPS/css/stylesheet.css b/test/fixtures/alice/OPS/css/stylesheet.css new file mode 100644 index 000000000..57531fecd --- /dev/null +++ b/test/fixtures/alice/OPS/css/stylesheet.css @@ -0,0 +1,105 @@ +body { + font-family: Georgia, serif; + font-size: 1em; + line-height: 1.33em; +} + +/* Book Title */ +h1 { + font-size: 1.5em; + line-height: 1.33em; +} + +/* Chapter Title */ +h2 { + font-size: 1.33em; + line-height: 1.2em; +} + +/* Subtitle */ +h3 { + font-size: 1.25em; + line-height: 1.12em; +} + +/* Meta Info */ +h4 { + font-size: 1.1em; + line-height: 1.05em; +} + +/* Chapter Container */ +section { + +} + +section > p { + +} + +/* Drop Cap */ +section > p:first-of-type:first-letter { + float: left; + font-size: 4em; + line-height: .8; + padding: 0 .2em; + font-family: Georgia; +} + +figure.small { + +} + +figure.full { + +} + +figure > img { + +} + +figcaption { + +} + +figcaption > p { + +} + +/* More specific Kindle Eink queries at: http://epubsecrets.com/media-queries-for-kindle-devices.php */ + +/* Amazon Kindle */ +@media amzn-kf8 { + +} + +/* Many device available at: https://css-tricks.com/snippets/css/media-queries-for-standard-devices/ */ + +/* Smartphone - Portrait */ +@media only screen + and (min-device-width: 320px) + and (max-device-width: 667px) + and (orientation: portrait) { + +} + +/* Smartphone - Landscape */ +@media only screen + and (min-device-width: 320px) + and (max-device-width: 667px) + and (orientation: landscape) { + +} + +/* Tablet - Portrait and Landscape */ +@media only screen + and (min-device-width: 768px) + and (max-device-width: 1024px) { + +} + +/* Laptop & Desktops */ +@media only screen + and (min-device-width: 1025px) { + +} \ No newline at end of file diff --git a/test/fixtures/alice/OPS/images/cover_th.jpg b/test/fixtures/alice/OPS/images/cover_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9cc3b31cb8c6bdac4336dd27dad4b15b107bc6b GIT binary patch literal 36192 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 C3?Z-p literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/i001_th.jpg b/test/fixtures/alice/OPS/images/i001_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab6a9c57990634f82f1b4472eae4ecb00ab4c806 GIT binary patch literal 7606 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 YLV}l-|ErX6Squ0(0sOB-=*8&&0kJJB5C8xG literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/i002_th.jpg b/test/fixtures/alice/OPS/images/i002_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df12dc5ac8c6fc88e95bcfca372357709f3edd62 GIT binary patch literal 6100 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 F{{YruSQY>P literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/i003_th.jpg b/test/fixtures/alice/OPS/images/i003_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2005bd219c2a2b245683597cc0b8de0d693b31f8 GIT binary patch literal 13746 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�H9hB_Z)+NS`yGz;Jg$dBeIGa!Qz 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 Awg3PC literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/i006_th.jpg b/test/fixtures/alice/OPS/images/i006_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..786b1735c260d6a292eef23c70d4d65f0e0a7a58 GIT binary patch literal 18305 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 H_Ww5lo@uJ5 literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/i007_th.jpg b/test/fixtures/alice/OPS/images/i007_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef2cd702963e06dcd4df0aaefabee33a35f90375 GIT binary patch literal 6636 zcma)A2T&8twhjWJgVbN?y^B%=As_~%Dj?Fk5V{5gBp^r&(g_$4P-^JXr1vJhV?=sF z4JaKF>GkpM-23LuyZ@beXJ>bIzTG){&hDAByWiFH)gs`gwz`%&fanGQV1HczS6cx3 z$KH^aZvjLA5&!_8cn$3UXu;j$}c1E z7yZAhqQ9C2P!nG-PESk^PzG#d5I;i8(EP^+n3dug&2AHq8JXAOFV_c4s^rgojx>5k z_A5XSjDiz(934#d1zO_KCmE#bCd9^xFSoQ(%6PHY}~(RG0}+FkyPDAb#+lIjfnMp z7*RQF+A+hlrh8-14`*|kPG+(3_>PED4)rmgl^3?yz-T)LV$?zCs4Ne5rJ^7B`w9@_ z3FLuc-+b(A#DG^9)9yJ|Vf&I)dQ3z

    NNBy)m?2y;H4hmE~?zP(bBl2$}20t#yyh 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%0AUag0>r8NF@ zr`>{~N76YY0fT`>m^`)?Oh%QFO7RM)i4S)QH|rsxvwi$EjzAT;7ICX- z2aQ`%_ssEN3-y&5^}n7OMKVTB<{+%>^>gze?fWfQpTaBYVZtw8PmBVv-2wgUU2EQS m6UX5$%?uz4KukzTNJL0XL_|zR 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/i014_th.jpg b/test/fixtures/alice/OPS/images/i014_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..492169ff64b84815a1a5ebbcbe3afd62ff991c81 GIT binary patch literal 15247 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/i015_th.jpg b/test/fixtures/alice/OPS/images/i015_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cba87ed757463818502b46717e19ba2c0f47609b GIT binary patch literal 14489 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/i019_th.jpg b/test/fixtures/alice/OPS/images/i019_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..779d5aa5ae86909bf63909149aea8fce317539a8 GIT binary patch literal 7215 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 H)7<|81B)@~ literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/i022_th.jpg b/test/fixtures/alice/OPS/images/i022_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8a0b9688f4bb43afdd8ab0f0e401c8fc92a67fb GIT binary patch literal 14295 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 z⪚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 Uw@PSt_>D(#SmB>x;D`DD1yu{^8~^|S literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/ii021_th.jpg b/test/fixtures/alice/OPS/images/ii021_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2f83b7d9d2d0137ca48a6dd270fb727e109dc959 GIT binary patch literal 10233 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 Ui3s0^%NqX&1^!tQ?|$*W08kr-ZU6uP literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/plate01_th.jpg b/test/fixtures/alice/OPS/images/plate01_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8798cc0683e9731016668496fe74d43362665f8 GIT binary patch literal 42546 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/plate02_th.jpg b/test/fixtures/alice/OPS/images/plate02_th.jpg new file mode 100644 index 0000000000000000000000000000000000000000..010d94ce56470a800cf14d45bb222baf779a46d4 GIT binary patch literal 42694 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 e#1`$d^8Wzf%`-fxclHVQ?=6iWTSS*Y~@3 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�+0%`5(W}$_n{t2~s~1*7O8#WEbN#2r{il_( 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 ZRxFP}6TWUL>!{QC^8WyL72{Gz|JgS%(`Enw literal 0 HcmV?d00001 diff --git a/test/fixtures/alice/OPS/images/title.jpg b/test/fixtures/alice/OPS/images/title.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34a4fb25c30b70afa7a6d758d88b1b1e864d6adf GIT binary patch literal 1667 zcma)1X;9O55dHoCIe|b94k?EqX9)rdmhk{N3`jVI2v{yf2@)`ggrlMyF@WvVN`Tbnpbc4o+8BPfu6Z#Ms!_#OxCw35d!42|@O`bM7` z|Cgvc01*qkfj0so0+*G)Z~=f}7_nya6R;=@0u3WIAn23yFCnbGje-#<1O}`1 zj|8nv5|Jo03A14{)+;pLLO0b}ucR}~YDC}QWOehfg@XWTEZqElD4IX*b-nBPNXiEZ`|y^}8= z*sKQIPyBe%n`yw>`Ft_?uGyPo9rTojxxuU%>(dUE2jhIZ!s)xpNKM~NFJRI4blT*< zHQPH(HA`F~In_1wV)~8eyPB?*859JH?~+4JCT#>*0++f#)N#p%ZOMj;8S8(auDFIFnhC(*c}$<=&B8F=_@I zHbN@)KbHXJxHsNjsmir9W7|GpF%OL?FZ=Uz1`E&h#Rd;*g8^7hq4zm}O35jC4bRTn$;wNkftnE`kVg-9$#qk+d zV{V1qDB?m)lsE5Zzk;7OX|L~He3-FMdGo^4*gAPoy6oYmj1wX!=eVf8YX`EgY9k>~ zmLZ-Rn2q9BmAFRi#e7>=xBDFhmDg;Tmc^PGp9>L^&sc}Zd30AkHFUk4!!3S^-;rlA zSf9kG96E5lVJJFD;T*4#(l4?`aLIe76&+t;HJ{1T>RToZn}lC7mor4Yqoo#_ft}pa z`!2==E7R}7mLpX0P5!?Khj%n{%#D-avRaY+?}kj675Jkjr>qEOsV!5ul0IA z>6!#Xn_mUtDtjbu=i%AM4w6YUXEo9>5;E=3Xdj!#%^z=W0+V1#XPQznX-P=cNwn`7W(ABQ1u$e@(5{(XAKs zOq6D1(bK1-W1iu$yADTu?Ax08giZCaAe`clBI#r~? zQ<*0X + + + en-US + 2012-01-18T12:47:00Z + + edu.nyu.itp.future-of-publishing.alice-in-wonderland + + Public domain in the USA. + Lewis Carroll + Gordon Robinson + Alice's Adventures in Wonderland + Fantasy + http://www.gutenberg.org/files/19033/19033-h/19033-h.htm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/fixtures/alice/OPS/titlepage.xhtml b/test/fixtures/alice/OPS/titlepage.xhtml new file mode 100644 index 000000000..f7da63715 --- /dev/null +++ b/test/fixtures/alice/OPS/titlepage.xhtml @@ -0,0 +1,42 @@ + + + + + Alice's Adventures in Wonderland + + + + +

    + +

    + +

    + Alice's Adventures In Wonderland +

    + +

    + +
    + title +
    + + +

    + +

    + Copyright, 1916,
    + By Sam'l Gabriel Sons & Company
    + New York +

    + +
    + Alice in the Room of the Duchess. +
    +

    Alice in the Room of the Duchess.

    +
    +
    + +
    + + diff --git a/test/fixtures/alice/OPS/toc.xhtml b/test/fixtures/alice/OPS/toc.xhtml new file mode 100644 index 000000000..eff8c4856 --- /dev/null +++ b/test/fixtures/alice/OPS/toc.xhtml @@ -0,0 +1,33 @@ + + + + + Alice's Adventures in Wonderland + + + + +
    +
    +

    Contents

    +
    + + + +
    + + diff --git a/test/fixtures/alice/mimetype b/test/fixtures/alice/mimetype new file mode 100644 index 000000000..57ef03f24 --- /dev/null +++ b/test/fixtures/alice/mimetype @@ -0,0 +1 @@ +application/epub+zip \ No newline at end of file diff --git a/test/index.html b/test/index.html index 9969dc5ad..b2a5495a8 100644 --- a/test/index.html +++ b/test/index.html @@ -1,21 +1,12 @@ - - - EPUB.js QUnit Tests - - - - - - - - -
    -
    - - - - - + + Mocha + + + + + + + diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 000000000..563c20f1d --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,31 @@ +var webpack = require("webpack"); +var path = require('path'); +var PROD = (process.env.NODE_ENV === 'production') +var hostname = "localhost"; +var port = "8080"; + +module.exports = { + entry: { + epub: "./src/epub.js", + }, + devtool: 'source-map', + output: { + path: path.resolve("./dist"), + filename: "[name].js", + sourceMapFilename: "[name].js.map", + library: "ePub", + libraryTarget: "umd" + }, + externals: { + "jszip": "JSZip", + "xmldom": "xmldom" + }, + plugins: [ + // new webpack.IgnorePlugin(/punycode|IPv6/), + ], + devServer: { + host: hostname, + port: port, + inline: true + } +}

+ +

Down The Rabbit-Hole

+ +
+ Illo1 +
+ +

Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do. Once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, "and what is the use of a book," thought Alice, "without pictures or conversations?"

+ +

So she was considering in her own mind (as well as she could, for the day made her feel very sleepy and stupid), whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly a White Rabbit with pink eyes ran close by her.

+ +
+ Illo2 +
+ +

There was nothing so very remarkable in that, nor did Alice think it so + very much out of the way to hear the Rabbit + say to itself, "Oh dear! Oh dear! I shall be too late!" But when the Rabbit actually + took a watch out of its waistcoat-pocket and looked at it and then hurried on, Alice + started to her feet, for it flashed across her mind that she had never before seen a + rabbit with either a waistcoat-pocket, or a watch to take out of it, and, burning with + curiosity, she ran across the field after it and was just in time to see it pop down a + large rabbit-hole, under the hedge. In another moment, down went Alice after it!

+ +

The rabbit-hole went straight on like a tunnel for some way and then dipped suddenly + down, so suddenly that Alice had not a moment to think about stopping herself before + she found herself falling down what seemed to be a very deep well.

+ +

Either the well was very deep, or she fell very slowly, for she had plenty of time, + as she went down, to look about her. First, she tried to make out what she was coming + to, but it was too dark to see anything; then she looked at the sides of the well and + noticed that they were filled with cupboards and book-shelves; here and there she saw + maps and pictures hung upon pegs. She + took down a jar from one of the shelves as she passed. It was labeled "ORANGE + MARMALADE," but, to her great disappointment, it was empty; she did not like to drop + the jar, so managed to put it into one of the cupboards as she fell past it.

+ +

Down, down, down! Would the fall never come to an end? There was nothing else to do, + so Alice soon began talking to herself. "Dinah'll miss me very much to-night, I should + think!" (Dinah was the cat.) "I hope they'll remember her saucer of milk at tea-time. + Dinah, my dear, I wish you were down here with me!" Alice felt that she was dozing off, + when suddenly, thump! thump! down she came upon a heap of sticks and dry leaves, and + the fall was over.

+ +

Alice was not a bit hurt, and she jumped up in a moment. She looked up, but it was + all dark overhead; before her was another long passage and the White Rabbit was still + in sight, hurrying down it. There was not a moment to be lost. Away went Alice like the + wind and was just in time to hear it say, as it turned a corner, "Oh, my ears and + whiskers, how late it's getting!" She was close behind it when she turned the corner, + but the Rabbit was no longer to be seen.

+ +

She found herself in a long, low hall, which was lit up by a row of lamps hanging + from the roof. There were doors all 'round the hall, but they were all locked; and when + Alice had been all the way down one side and up the other, trying every door, she + walked sadly down the middle, wondering how she was ever to get out again.

+ +
+ Illo3 +
+ +

Suddenly she came upon a little table, all made of solid glass. There was nothing on + it but a tiny golden key, and Alice's first idea was that this might belong to one of + the doors of the hall; but, alas! either the locks were too large, or the key was too + small, but, at any rate, it would not open any of them. However, on the second time + 'round, she came upon a low curtain she had not noticed before, and behind it was a + little door about fifteen inches high. She tried the little golden key in the lock, and + to her great delight, it fitted!

+ +

Alice opened the door and found that it led into a small passage, not much larger + than a rat-hole; she knelt down and looked along the passage into the loveliest garden + you ever saw. How she longed to get out of that dark hall and wander about among those + beds of bright flowers and those cool fountains, but she could not even get her head + through the doorway. "Oh," said Alice, "how I wish I could shut up like a telescope! I + think I could, if I only knew how to begin."

+ +

Alice went back to the table, half hoping she might find another key on it, or at + any rate, a book of rules for shutting people up like telescopes. This time she found a little bottle on it ("which + certainly was not here before," said Alice), and tied 'round the neck of the bottle was + a paper label, with the words "DRINK ME" beautifully printed on it in large + letters.

+ +

"No, I'll look first," she said, "and see whether it's marked 'poison' or + not," for she had never forgotten that, if you drink from a bottle marked "poison," it + is almost certain to disagree with you, sooner or later. However, this bottle was + not marked "poison," so Alice ventured to taste it, and, finding it very nice + (it had a sort of mixed flavor of cherry-tart, custard, pineapple, roast turkey, toffy + and hot buttered toast), she very soon finished it off.

+ +

"What a curious feeling!" said Alice. "I must be shutting up like a telescope!"

+ +

And so it was indeed! She was now only ten inches high, and her face brightened up + at the thought that she was now the right size for going through the little door into + that lovely garden.

+ +

After awhile, finding that nothing more happened, she decided on going into the + garden at once; but, alas for poor Alice! When she got to the door, she found she had + forgotten the little golden key, and when she went back to the table for it, she found + she could not possibly reach it: she could see it quite plainly through the glass and + she tried her best to climb up one of the legs of the table, but it was too slippery, + and when she had tired herself out with trying, the poor little thing sat down and + cried.

+ +

"Come, there's no use in crying like that!" said Alice to herself rather sharply. "I + advise you to leave off this minute!" + She generally gave herself very good advice (though she very seldom followed it), and + sometimes she scolded herself so severely as to bring tears into her eyes.

+ +

Soon her eye fell on a little glass box that was lying under the table: she opened + it and found in it a very small cake, on which the words "EAT ME" were beautifully + marked in currants. "Well, I'll eat it," said Alice, "and if it makes me grow larger, I + can reach the key; and if it makes me grow smaller, I can creep under the door: so + either way I'll get into the garden, and I don't care which happens!"

+ +

She ate a little bit and said anxiously to herself, "Which way? Which way?" holding + her hand on the top of her head to feel which way she was growing; and she was quite + surprised to find that she remained the same size. So she set to work and very soon + finished off the cake.

+ +
+ Illo4 +
+ +

+ +