diff --git a/dist/epub.js b/dist/epub.js index 5717995..35d222d 100644 --- a/dist/epub.js +++ b/dist/epub.js @@ -172,6 +172,8 @@ module.exports = { } },{}],2:[function(require,module,exports){ + +},{}],3:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -264,7 +266,7 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],3:[function(require,module,exports){ +},{}],4:[function(require,module,exports){ (function (process){ /*! * @overview RSVP - a tiny implementation of Promises/A+. @@ -1878,8 +1880,2172 @@ process.umask = function() { return 0; }; }).call(this); }).call(this,require('_process')) -},{"_process":2}],4:[function(require,module,exports){ +},{"_process":3}],5:[function(require,module,exports){ +/*! + * URI.js - Mutating URLs + * + * Version: 1.17.0 + * + * Author: Rodney Rehm + * Web: http://medialize.github.io/URI.js/ + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * GPL v3 http://opensource.org/licenses/GPL-3.0 + * + */ +(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.17.0'; + + 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); + } + + 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) { + if (typeof name === 'object') { + for (var key in name) { + if (hasOwn.call(name, key)) { + if (!URI.hasQuery(data, key, name[key])) { + return false; + } + } + } + + return true; + } else if (typeof name !== 'string') { + throw new TypeError('URI.hasQuery() accepts an object, string 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.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) { + var parts; + + 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) { + if (!this._parts.username) { + return ''; + } + + var t = URI.buildUserinfo(this._parts); + return t.substring(0, t.length -1); + } 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; + } + + 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.indexOf('/..'); + 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); + } + + _path = URI.recodePath(_path); + 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":2,"./SecondLevelDomains":2,"./punycode":2}],6:[function(require,module,exports){ var RSVP = require('rsvp'); +var URI = require('urijs'); var core = require('./core'); var Spine = require('./spine'); var Locations = require('./locations'); @@ -1948,44 +4114,43 @@ Book.prototype.open = function(_url){ } // Reuse parsed url or create a new uri object - if(typeof(_url) === "object") { - uri = _url; - } else { - uri = core.uri(_url); - } - - this.url = uri.href; + // if(typeof(_url) === "object") { + // uri = _url; + // } else { + // uri = core.uri(_url); + // } + uri = URI(_url); + this.url = _url; // Find path to the Container - if(uri.extension === "opf") { + if(uri.suffix() === "opf") { // Direct link to package, no container - this.packageUrl = uri.href; + this.packageUrl = _url; this.containerUrl = ''; - if(uri.origin) { - this.baseUrl = uri.base; + if(uri.origin()) { + this.baseUrl = uri.origin() + "/" + uri.directory() + "/"; } else if(window){ - location = core.uri(window.location.href); - this.baseUrl = core.resolveUrl(location.base, uri.directory); + this.baseUrl = uri.absoluteTo(window.location.href).directory() + "/"; } else { - this.baseUrl = uri.directory; + this.baseUrl = uri.directory() + "/"; } epubPackage = this.request(this.packageUrl); - } else if(this.isArchived(uri)) { + } else if(this.isArchivedUrl(uri)) { // Book is archived - this.containerUrl = containerPath; - this.url = ''; + this.url = '/'; + this.containerUrl = URI(containerPath).absoluteTo(this.url).toString(); - epubContainer = this.unarchive(uri.href). + epubContainer = this.unarchive(_url). then(function() { return this.request(this.containerUrl); }.bind(this)); } // Find the path to the Package from the container - else if (!uri.extension) { + else if (!uri.suffix()) { this.containerUrl = this.url + containerPath; @@ -1998,18 +4163,17 @@ Book.prototype.open = function(_url){ return parse.container(containerXml); // Container has path to content }). then(function(paths){ - var packageUri = core.uri(paths.packagePath); - book.packageUrl = book.url + paths.packagePath; + var packageUri = URI(paths.packagePath); + book.packageUrl = packageUri.absoluteTo(book.url).toString(); book.encoding = paths.encoding; // Set Url relative to the content - if(packageUri.origin) { - book.baseUrl = packageUri.base; - } else if(window && book.url){ - location = core.uri(window.location.href); - book.baseUrl = core.resolveUrl(location.base, book.url + packageUri.directory); + if(packageUri.origin()) { + book.baseUrl = packageUri.origin() + "/" + packageUri.directory() + "/"; + } else if(window && !book.isArchivedUrl(uri)){ + book.baseUrl = packageUri.absoluteTo(window.location.href).directory() + "/"; } else { - book.baseUrl = packageUri.directory; + book.baseUrl = "/" + packageUri.directory() + "/"; } return book.request(book.packageUrl); @@ -2067,7 +4231,7 @@ Book.prototype.unpack = function(packageXml){ // MOVE TO RENDER // book.globalLayoutProperties = book.parseLayoutProperties(book.package.metadata); - book.cover = book.baseUrl + book.package.coverPath; + book.cover = URI(book.package.coverPath).absoluteTo(book.baseUrl).toString(); }; // Alias for book.spine.get @@ -2084,6 +4248,7 @@ Book.prototype.renderTo = function(element, options) { this.rendition = new Renderer(this, options); this.rendition.attachTo(element); + return this.rendition; }; @@ -2111,21 +4276,24 @@ Book.prototype.unarchive = function(bookUrl){ }; //-- Checks if url has a .epub or .zip extension, or is ArrayBuffer (of zip/epub) -Book.prototype.isArchived = function(bookUrl){ +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); - } + // if(typeof(bookUrl) === "object") { + // uri = bookUrl; + // } else { + // uri = core.uri(bookUrl); + // } + uri = URI(bookUrl); + extension = uri.suffix(); - if(uri.extension && (uri.extension == "epub" || uri.extension == "zip")){ + if(extension && (extension == "epub" || extension == "zip")){ return true; } @@ -2134,8 +4302,8 @@ Book.prototype.isArchived = function(bookUrl){ //-- Returns the cover Book.prototype.coverUrl = function(){ - var retrieved = this.loaded.cover - .then(function(url) { + var retrieved = this.loaded.cover. + then(function(url) { if(this.archive) { return this.archive.createUrl(this.cover); }else{ @@ -2147,6 +4315,7 @@ Book.prototype.coverUrl = function(){ return retrieved; }; + module.exports = Book; //-- Enable binding events to book @@ -2165,7 +4334,7 @@ RSVP.on('rejected', function(event){ console.error(event.detail.message, event.detail.stack); }); -},{"./continuous":5,"./core":6,"./locations":10,"./navigation":12,"./paginate":13,"./parser":14,"./rendition":16,"./request":18,"./spine":20,"./unarchive":21,"rsvp":3}],5:[function(require,module,exports){ +},{"./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(require,module,exports){ var RSVP = require('rsvp'); var core = require('./core'); var Rendition = require('./rendition'); @@ -2246,12 +4415,12 @@ Continuous.prototype.afterDisplayed = function(currView){ var prevView, nextView; if(index + 1 === this.views.length && next) { - nextView = new View(next, this.viewSettings); + nextView = this.createView(next); this.q.enqueue(this.append, nextView); } if(index === 0 && prev) { - prevView = new View(prev, this.viewSettings); + prevView = this.createView(prev, this.viewSettings); this.q.enqueue(this.prepend, prevView); } @@ -2585,7 +4754,7 @@ Continuous.prototype.current = function(what){ module.exports = Continuous; -},{"./core":6,"./rendition":16,"./view":22,"rsvp":3}],6:[function(require,module,exports){ +},{"./core":8,"./rendition":18,"./view":24,"rsvp":4}],8:[function(require,module,exports){ var RSVP = require('rsvp'); var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; @@ -3010,7 +5179,8 @@ module.exports = { 'isXml': isXml }; -},{"rsvp":3}],7:[function(require,module,exports){ +},{"rsvp":4}],9:[function(require,module,exports){ +var URI = require('urijs'); var core = require('./core'); function EpubCFI(cfiStr){ @@ -3372,9 +5542,9 @@ EpubCFI.prototype.compare = function(cfiOne, cfiTwo) { }; EpubCFI.prototype.generateCfiFromHref = function(href, book) { - var uri = core.uri(href); - var path = uri.path; - var fragment = uri.fragment; + var uri = URI(href); + var path = uri.path(); + var fragment = uri.fragment(); var spinePos = book.spineIndexByURL[path]; var loaded; var deferred = new RSVP.defer(); @@ -3567,7 +5737,7 @@ EpubCFI.prototype.isCfiString = function(target) { module.exports = EpubCFI; -},{"./core":6}],8:[function(require,module,exports){ +},{"./core":8,"urijs":5}],10:[function(require,module,exports){ var RSVP = require('rsvp'); //-- Hooks allow for injecting functions that must all complete in order before finishing @@ -3584,8 +5754,17 @@ function Hook(context){ }; // Adds a function to be run before a hook completes -Hook.prototype.register = function(func){ - this.hooks.push(func); +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]); + } + } + } }; // Triggers a hook to run all functions @@ -3608,9 +5787,14 @@ Hook.prototype.trigger = function(){ return RSVP.all(promises); }; +// Adds a function to be run before a hook completes +Hook.prototype.list = function(){ + return this.hooks; +}; + module.exports = Hook; -},{"rsvp":3}],9:[function(require,module,exports){ +},{"rsvp":4}],11:[function(require,module,exports){ var core = require('./core'); function Reflowable(){ @@ -3773,7 +5957,7 @@ module.exports = { 'Scroll': Scroll }; -},{"./core":6}],10:[function(require,module,exports){ +},{"./core":8}],12:[function(require,module,exports){ var core = require('./core'); var Queue = require('./queue'); var EpubCFI = require('./epubcfi'); @@ -3998,7 +6182,7 @@ RSVP.EventTarget.mixin(Locations.prototype); module.exports = Locations; -},{"./core":6,"./epubcfi":7,"./queue":15,"rsvp":3}],11:[function(require,module,exports){ +},{"./core":8,"./epubcfi":9,"./queue":17,"rsvp":4}],13:[function(require,module,exports){ function Map(layout){ this.layout = layout; }; @@ -4287,10 +6471,11 @@ Map.prototype.rangeListToCfiList = function(view, columns){ module.exports = Map; -},{}],12:[function(require,module,exports){ +},{}],14:[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; @@ -4303,7 +6488,7 @@ function Navigation(_package, _request){ this.tocById = {}; if(_package.navPath) { - this.navUrl = _package.baseUrl + _package.navPath; + this.navUrl = URI(_package.navPath).absoluteTo(_package.baseUrl).toString(); this.nav = {}; this.nav.load = function(_request){ @@ -4322,7 +6507,7 @@ function Navigation(_package, _request){ } if(_package.ncxPath) { - this.ncxUrl = _package.baseUrl + _package.ncxPath; + this.ncxUrl = URI(_package.ncxPath).absoluteTo(_package.baseUrl).toString(); this.ncx = {}; this.ncx.load = function(_request){ @@ -4390,7 +6575,7 @@ Navigation.prototype.get = function(target) { module.exports = Navigation; -},{"./core":6,"./parser":14,"./request":18,"rsvp":3}],13:[function(require,module,exports){ +},{"./core":8,"./parser":16,"./request":20,"rsvp":4,"urijs":5}],15:[function(require,module,exports){ var RSVP = require('rsvp'); var core = require('./core'); var Continuous = require('./continuous'); @@ -4678,7 +6863,8 @@ Paginate.prototype.adjustImages = function(view) { module.exports = Paginate; -},{"./continuous":5,"./core":6,"./layout":9,"./map":11,"rsvp":3}],14:[function(require,module,exports){ +},{"./continuous":7,"./core":8,"./layout":11,"./map":13,"rsvp":4}],16:[function(require,module,exports){ +var URI = require('urijs'); var core = require('./core'); var EpubCFI = require('./epubcfi'); @@ -4701,7 +6887,7 @@ Parser.prototype.container = function(containerXml){ } fullpath = rootfile.getAttribute('full-path'); - folder = core.uri(fullpath).directory; + folder = URI(fullpath).directory(); encoding = containerXml.xmlEncoding; //-- Now that we have the path we can parse the contents @@ -4991,8 +7177,8 @@ Parser.prototype.navItem = function(item, spineIndexByURL, bookSpine){ content = item.querySelector("a, span"), src = content.getAttribute('href') || '', text = content.textContent || "", - split = src.split("#"), - baseUrl = split[0], + // split = src.split("#"), + // baseUrl = split[0], // spinePos = spineIndexByURL[baseUrl], // spineItem = bookSpine[spinePos], subitems = [], @@ -5056,8 +7242,8 @@ Parser.prototype.tocItem = function(item, spineIndexByURL, bookSpine){ src = content.getAttribute('src'), navLabel = item.querySelector("navLabel"), text = navLabel.textContent ? navLabel.textContent : "", - split = src.split("#"), - baseUrl = split[0], + // split = src.split("#"), + // baseUrl = split[0], // spinePos = spineIndexByURL[baseUrl], // spineItem = bookSpine[spinePos], subitems = [], @@ -5141,7 +7327,7 @@ Parser.prototype.pageListItem = function(item, spineIndexByURL, bookSpine){ module.exports = Parser; -},{"./core":6,"./epubcfi":7}],15:[function(require,module,exports){ +},{"./core":8,"./epubcfi":9,"urijs":5}],17:[function(require,module,exports){ var RSVP = require('rsvp'); var core = require('./core'); @@ -5336,8 +7522,9 @@ function Task(task, args, context){ module.exports = Queue; -},{"./core":6,"rsvp":3}],16:[function(require,module,exports){ +},{"./core":8,"rsvp":4}],18:[function(require,module,exports){ var RSVP = require('rsvp'); +var URI = require('urijs'); var core = require('./core'); var replace = require('./replacements'); var Hook = require('./hook'); @@ -5370,6 +7557,7 @@ function Rendition(book, options) { //-- 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); @@ -5388,6 +7576,9 @@ function Rendition(book, options) { this.q.enqueue(this.parseLayoutProperties); + if(this.book.archive) { + this.replacements(); + } }; /** @@ -5553,7 +7744,8 @@ Rendition.prototype._display = function(target){ this.views.hide(); // Create a new view - view = new View(section, this.viewSettings); + // view = new View(section, this.viewSettings); + view = this.createView(section); // This will clear all previous views displayed = this.fill(view) @@ -5760,6 +7952,9 @@ Rendition.prototype.onResized = function(e) { }; Rendition.prototype.createView = function(section) { + // Transfer the existing hooks + section.hooks.serialize.register(this.hooks.serialize.list()); + return new View(section, this.viewSettings); }; @@ -5963,43 +8158,138 @@ Rendition.prototype.triggerViewEvent = function(e){ this.trigger(e.type, e); }; +Rendition.prototype.replacements = function(){ + return this.q.enqueue(function () { + 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; + } + }); + + // Only CSS + var css = items. + filter(function (item){ + if (item.type != "text/css") { + return true; + } + }); + + var urls = items. + map(function(item) { + // return this.book.baseUrl + item.href; + return item.href; + }.bind(this)); + + var processing = urls. + map(function(url) { + var absolute = URI(url).absoluteTo(this.book.baseUrl).toString(); + // Full url from archive base + return this.book.archive.createUrl(absolute); + }.bind(this)); + + return RSVP.all(processing). + then(function(replacementUrls) { + this.hooks.serialize.register(function(content, section) { + // resolve file urls + var fileUri = URI(section.url); + // console.log(section.url); + // var fileDirectory = fileUri.directory(); + // // // package urls + // var packageUri = URI(this.book.packageUrl); + // var packageDirectory = packageUri.directory(); + // + // // Need to compare the directory of the current file + // // with the directory of the package file. + + + urls = 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(content, urls, replacementUrls); + }.bind(this)); + }.bind(this)).catch(function(reason){ + console.error(reason); + }); + }.bind(this)); +}; //-- Enable binding events to Renderer RSVP.EventTarget.mixin(Rendition.prototype); module.exports = Rendition; -},{"./core":6,"./epubcfi":7,"./hook":8,"./layout":9,"./map":11,"./queue":15,"./replacements":17,"./view":22,"./views":23,"rsvp":3}],17:[function(require,module,exports){ +},{"./core":8,"./epubcfi":9,"./hook":10,"./layout":11,"./map":13,"./queue":17,"./replacements":19,"./view":24,"./views":25,"rsvp":4,"urijs":5}],19:[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"); + + if(!base) { + base = doc.createElement("base"); + } + + base.setAttribute("href", section.url); + head.insertBefore(base, head.firstChild); + +} + function links(view, renderer) { var links = view.document.querySelectorAll("a[href]"); var replaceLinks = function(link){ var href = link.getAttribute("href"); - var uri = new core.uri(href); + var linkUri = URI(href); + var absolute = linkUri.absoluteTo(view.section.url); + var relative = absolute.relativeTo(this.book.baseUrl).toString(); - - if(uri.protocol){ + 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; + } + */ - // relative = core.resolveUrl(directory, href); - // if(uri.fragment && !base) { - // link.onclick = function(){ - // renderer.fragment(href); - // return false; - // }; - // } else { - - //} - - if(href.indexOf("#") === 0) { + if(linkUri.fragment()) { // do nothing with fragment yet } else { link.onclick = function(){ - renderer.display(href); + renderer.display(relative); return false; }; } @@ -6014,12 +8304,21 @@ function links(view, renderer) { }; +function substitute(content, urls, replacements) { + urls.forEach(function(url, i){ + content = content.replace(new RegExp(url, 'g'), replacements[i]); + }); + return content; +} module.exports = { - 'links': links + 'base': base, + 'links': links, + 'substitute': substitute }; -},{"./core":6}],18:[function(require,module,exports){ +},{"./core":8,"urijs":5}],20:[function(require,module,exports){ var RSVP = require('rsvp'); +var URI = require('urijs'); var core = require('./core'); function request(url, type, withCredentials, headers) { @@ -6057,8 +8356,8 @@ function request(url, type, withCredentials, headers) { // If type isn't set, determine it from the file extension if(!type) { - uri = core.uri(url); - type = uri.extension; + uri = URI(url); + type = uri.suffix(); } if(type == 'blob'){ @@ -6139,13 +8438,14 @@ function request(url, type, withCredentials, headers) { module.exports = request; -},{"./core":6,"rsvp":3}],19:[function(require,module,exports){ +},{"./core":8,"rsvp":4,"urijs":5}],21:[function(require,module,exports){ var RSVP = require('rsvp'); var core = require('./core'); var EpubCFI = require('./epubcfi'); var Hook = require('./hook'); +var replacements = require('./replacements'); -function Section(item){ +function Section(item, hooks){ this.idref = item.idref; this.linear = item.linear; this.properties = item.properties; @@ -6159,10 +8459,11 @@ function Section(item){ this.cfiBase = item.cfiBase; this.hooks = {}; - this.hooks.replacements = new Hook(this); + this.hooks.serialize = new Hook(this); + this.hooks.content = new Hook(this); // Register replacements - this.hooks.replacements.register(this.replacements); + this.hooks.content.register(replacements.base); }; @@ -6182,7 +8483,7 @@ Section.prototype.load = function(_request){ this.document = xml; this.contents = xml.documentElement; - return this.hooks.replacements.trigger(this.document); + return this.hooks.content.trigger(this.document, this); }.bind(this)) .then(function(){ loading.resolve(this.contents); @@ -6195,7 +8496,7 @@ Section.prototype.load = function(_request){ return loaded; }; -Section.prototype.replacements = function(_document){ +Section.prototype.base = function(_document){ var task = new RSVP.defer(); var base = _document.createElement("base"); // TODO: check if exists var head; @@ -6223,15 +8524,23 @@ Section.prototype.beforeSectionLoad = function(){ 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 = new XMLSerializer(); - var output = serializer.serializeToString(contents); - rendering.resolve(output); - }) - .catch(function(error){ - rendering.reject(error); - }); + this.load(_request). + then(function(contents){ + var 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; }; @@ -6280,7 +8589,7 @@ Section.prototype.cfiFromElement = function(el) { module.exports = Section; -},{"./core":6,"./epubcfi":7,"./hook":8,"./request":18,"rsvp":3}],20:[function(require,module,exports){ +},{"./core":8,"./epubcfi":9,"./hook":10,"./replacements":19,"./request":20,"rsvp":4}],22:[function(require,module,exports){ var RSVP = require('rsvp'); var core = require('./core'); var EpubCFI = require('./epubcfi'); @@ -6313,7 +8622,6 @@ Spine.prototype.load = function(_package) { item.href = manifestItem.href; item.url = this.baseUrl + item.href; - if(manifestItem.properties.length){ item.properties.push.apply(item.properties, manifestItem.properties); } @@ -6404,8 +8712,9 @@ Spine.prototype.each = function() { module.exports = Spine; -},{"./core":6,"./epubcfi":7,"./section":19,"rsvp":3}],21:[function(require,module,exports){ +},{"./core":8,"./epubcfi":9,"./section":21,"rsvp":4}],23:[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'); @@ -6452,8 +8761,8 @@ Unarchive.prototype.request = function(url, type){ // If type isn't set, determine it from the file extension if(!type) { - uri = core.uri(url); - type = uri.extension; + uri = URI(url); + type = uri.suffix(); } if(type == 'blob'){ @@ -6499,7 +8808,7 @@ Unarchive.prototype.handleResponse = function(response, type){ }; Unarchive.prototype.getBlob = function(url, _mimeType){ - var decodededUrl = window.decodeURIComponent(url); + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash var entry = this.zip.file(decodededUrl); var mimeType; @@ -6510,7 +8819,7 @@ Unarchive.prototype.getBlob = function(url, _mimeType){ }; Unarchive.prototype.getText = function(url, encoding){ - var decodededUrl = window.decodeURIComponent(url); + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash var entry = this.zip.file(decodededUrl); if(entry) { @@ -6553,7 +8862,7 @@ Unarchive.prototype.revokeUrl = function(url){ module.exports = Unarchive; -},{"../libs/mime/mime":1,"./core":6,"./request":18,"jszip":"jszip","rsvp":3}],22:[function(require,module,exports){ +},{"../libs/mime/mime":1,"./core":8,"./request":20,"jszip":"jszip","rsvp":4,"urijs":5}],24:[function(require,module,exports){ var RSVP = require('rsvp'); var core = require('./core'); var EpubCFI = require('./epubcfi'); @@ -7309,7 +9618,7 @@ RSVP.EventTarget.mixin(View.prototype); module.exports = View; -},{"./core":6,"./epubcfi":7,"rsvp":3}],23:[function(require,module,exports){ +},{"./core":8,"./epubcfi":9,"rsvp":4}],25:[function(require,module,exports){ function Views(container) { this.container = container; this._views = []; @@ -7483,7 +9792,7 @@ module.exports = ePub; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./book":4}]},{},["epub"])("epub") +},{"./book":6}]},{},["epub"])("epub") }); diff --git a/dist/epub.js.map b/dist/epub.js.map index 6eb78b8..ae82cc7 100644 --- a/dist/epub.js.map +++ b/dist/epub.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","libs/mime/mime.js","node_modules/browserify/node_modules/process/browser.js","node_modules/rsvp/dist/rsvp.js","src/book.js","src/continuous.js","src/core.js","src/epubcfi.js","src/hook.js","src/layout.js","src/locations.js","src/map.js","src/navigation.js","src/paginate.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/view.js","src/views.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;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACzkDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3iBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1JA;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 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);","var RSVP = require('rsvp');\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\n this.url = uri.href;\n\n // Find path to the Container\n if(uri.extension === \"opf\") {\n // Direct link to package, no container\n this.packageUrl = uri.href;\n this.containerUrl = '';\n\n if(uri.origin) {\n this.baseUrl = uri.base;\n } else if(window){\n location = core.uri(window.location.href);\n this.baseUrl = core.resolveUrl(location.base, uri.directory);\n } else {\n this.baseUrl = uri.directory;\n }\n\n epubPackage = this.request(this.packageUrl);\n\n } else if(this.isArchived(uri)) {\n // Book is archived\n this.containerUrl = containerPath;\n this.url = '';\n\n epubContainer = this.unarchive(uri.href).\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.extension) {\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 = core.uri(paths.packagePath);\n book.packageUrl = book.url + paths.packagePath;\n book.encoding = paths.encoding;\n\n // Set Url relative to the content\n if(packageUri.origin) {\n book.baseUrl = packageUri.base;\n } else if(window && book.url){\n location = core.uri(window.location.href);\n book.baseUrl = core.resolveUrl(location.base, book.url + packageUri.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 = book.baseUrl + book.package.coverPath;\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 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.isArchived = function(bookUrl){\n var uri;\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\n\tif(uri.extension && (uri.extension == \"epub\" || uri.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\t.then(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};\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 = new View(next, this.viewSettings);\n\t\tthis.q.enqueue(this.append, nextView);\n\t}\n\n\tif(index === 0 && prev) {\n\t\tprevView = new View(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\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};\n","var 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 = core.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(func){\n this.hooks.push(func);\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\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');\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 = _package.baseUrl + _package.navPath;\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 = _package.baseUrl + _package.ncxPath;\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 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 = core.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\tsplit = src.split(\"#\"),\n\t\t\tbaseUrl = 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\tsplit = src.split(\"#\"),\n\t\t\tbaseUrl = 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 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.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};\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\tview = new View(section, this.viewSettings);\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\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\n//-- Enable binding events to Renderer\nRSVP.EventTarget.mixin(Rendition.prototype);\n\nmodule.exports = Rendition;\n","var core = require('./core');\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 uri = new core.uri(href);\n\n\n if(uri.protocol){\n\n link.setAttribute(\"target\", \"_blank\");\n\n }else{\n\n // relative = core.resolveUrl(directory, href);\n // if(uri.fragment && !base) {\n // link.onclick = function(){\n // renderer.fragment(href);\n // return false;\n // };\n // } else {\n\n //}\n\n if(href.indexOf(\"#\") === 0) {\n // do nothing with fragment yet\n } else {\n link.onclick = function(){\n renderer.display(href);\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\nmodule.exports = {\n 'links': links\n};\n","var RSVP = require('rsvp');\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 = core.uri(url);\n\t\ttype = uri.extension;\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 core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Hook = require('./hook');\n\nfunction Section(item){\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.replacements = new Hook(this);\n\n // Register replacements\n this.hooks.replacements.register(this.replacements);\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 = core.folder(this.url);\n\n this.document = xml;\n this.contents = xml.documentElement;\n\n return this.hooks.replacements.trigger(this.document);\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.replacements = 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\n this.load(_request).then(function(contents){\n var serializer = new XMLSerializer();\n var output = serializer.serializeToString(contents);\n rendering.resolve(output);\n })\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\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 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 = core.uri(url);\n\t\ttype = uri.extension;\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);\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);\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"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","libs/mime/mime.js","node_modules/browserify/lib/_empty.js","node_modules/browserify/node_modules/process/browser.js","node_modules/rsvp/dist/rsvp.js","node_modules/urijs/src/URI.js","src/book.js","src/continuous.js","src/core.js","src/epubcfi.js","src/hook.js","src/layout.js","src/locations.js","src/map.js","src/navigation.js","src/paginate.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/view.js","src/views.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;;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;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACzkDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5iBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnsBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1JA;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 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\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};\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\treturn this.q.enqueue(function () {\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 var urls = items.\n\t map(function(item) {\n\t\t\t\t// return this.book.baseUrl + item.href;\n\t return item.href;\n\t }.bind(this));\n\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 return RSVP.all(processing).\n\t then(function(replacementUrls) {\n\t this.hooks.serialize.register(function(content, section) {\n\t\t\t\t\t// resolve file urls\n\t\t\t\t\tvar fileUri = URI(section.url);\n\t\t\t\t\t// console.log(section.url);\n\t\t\t\t\t// var fileDirectory = fileUri.directory();\n\t\t\t\t\t// // // package urls\n\t\t\t\t\t// var packageUri = URI(this.book.packageUrl);\n\t\t\t\t\t// var packageDirectory = packageUri.directory();\n\t\t\t\t\t//\n\t\t\t\t\t// // Need to compare the directory of the current file\n\t\t\t\t\t// // with the directory of the package file.\n\n\n\t\t\t\t\turls = urls.\n\t\t\t\t map(function(href) {\n\t\t\t\t\t\t\tvar assetUri = URI(href).absoluteTo(this.book.baseUrl);\n\t\t\t\t\t\t\tvar relative = assetUri.relativeTo(fileUri).toString();\n\t\t\t\t return relative;\n\t\t\t\t }.bind(this));\n\n\n\t section.output = replace.substitute(content, urls, replacementUrls);\n\t }.bind(this));\n\t }.bind(this)).catch(function(reason){\n\t console.error(reason);\n\t });\n\t}.bind(this));\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 content = content.replace(new RegExp(url, 'g'), replacements[i]);\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 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 = core.folder(this.url);\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"]} \ No newline at end of file diff --git a/dist/epub.min.js b/dist/epub.min.js index a989929..9ded1ff 100644 --- a/dist/epub.min.js +++ b/dist/epub.min.js @@ -1,4 +1,5 @@ -!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,n){function r(s,h){if(!i[s]){if(!t[s]){var a="function"==typeof require&&require;if(!h&&a)return a(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var u=i[s]={exports:{}};t[s][0].call(u.exports,function(e){var i=t[s][1][e];return r(i?i:e)},u,u.exports,e,t,i,n)}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 r(t){var e=t._promiseCallbacks;return e||(e=t._promiseCallbacks={}),e}function o(t,e){return"onerror"===t?(Q.on("error",e),void 0):2!==arguments.length?Q[t]:(Q[t]=e,void 0)}function s(t){return"function"==typeof t||"object"==typeof t&&null!==t}function h(t){return"function"==typeof t}function a(t){return"object"==typeof t&&null!==t}function c(){}function u(){}function p(t){try{return t.then}catch(e){return ae.error=e,ae}}function l(t,e,i,n){try{t.call(e,i,n)}catch(r){return r}}function d(t,e,i){Q.async(function(t){var n=!1,r=l(i,e,function(i){n||(n=!0,e!==i?m(t,i):v(t,i))},function(e){n||(n=!0,w(t,e))},"Settle: "+(t._label||" unknown promise"));!n&&r&&(n=!0,w(t,r))},t)}function f(t,e){e._state===se?v(t,e._result):t._state===he?w(t,e._result):b(e,void 0,function(i){e!==i?m(t,i):v(t,i)},function(e){w(t,e)})}function g(t,e){if(e.constructor===t.constructor)f(t,e);else{var i=p(e);i===ae?w(t,ae.error):void 0===i?v(t,e):h(i)?d(t,e,i):v(t,e)}}function m(t,e){t===e?v(t,e):s(e)?g(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?Q.instrument&&re("fulfilled",t):Q.async(x,t))}function w(t,e){t._state===oe&&(t._state=he,t._result=e,Q.async(y,t))}function b(t,e,i,n){var r=t._subscribers,o=r.length;t._onerror=null,r[o]=e,r[o+se]=i,r[o+he]=n,0===o&&t._state&&Q.async(x,t)}function x(t){var e=t._subscribers,i=t._state;if(Q.instrument&&re(i===se?"fulfilled":"rejected",t),0!==e.length){for(var n,r,o=t._result,s=0;sh;h++)s[h]=t[h];for(n=0;nn;n++)i[n-1]=t[n];return i}function F(t,e){return{then:function(i,n){return t.call(e,i,n)}}}function j(t,e,i,n){var r=B(i,n,e);return r===ve&&w(t,r.value),t}function z(t,e,i,n){return ye.all(e).then(function(e){var r=B(i,n,e);return r===ve&&w(t,r.value),t})}function I(t){return t&&"object"==typeof t?t.constructor===ye?!0:O(t):!1}function U(t,e,i){this._superConstructor(t,e,!1,i)}function M(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(J)}}function W(){var t=0,e=new je(J),i=document.createTextNode("");return e.observe(i,{characterData:!0}),function(){i.data=t=++t%2}}function V(){var t=new MessageChannel;return t.port1.onmessage=J,function(){t.port2.postMessage(0)}}function X(){return function(){setTimeout(J,1)}}function J(){for(var t=0;Pe>t;t+=2){var e=Ie[t],i=Ie[t+1];e(i),Ie[t]=void 0,Ie[t+1]=void 0}Pe=0}function Y(t,e){Q.async(t,e)}function K(){Q.on.apply(Q,arguments)}function Z(){Q.off.apply(Q,arguments)}var G={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=r(this);i=o[t],i||(i=o[t]=[]),-1===n(i,e)&&i.push(e)},off:function(t,e){var i,o,s=r(this);return e?(i=s[t],o=n(i,e),-1!==o&&i.splice(o,1),void 0):(s[t]=[],void 0)},trigger:function(t,e){var i,n,o=r(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 c.prototype=t,new c},ne=[],re=function(t,e,i){1===ne.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;en;n++)this._eachEntry(i[n],n)},C.prototype._eachEntry=function(t,e){var i=this._instanceConstructor;a(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 n=this.promise;n._state===oe&&(this._remaining--,this._abortOnReject&&t===he?w(n,i):this._result[e]=this._makeResult(t,e,i)),0===this._remaining&&v(n,this._result)},C.prototype._makeResult=function(t,e,i){return i},C.prototype._willSettleAt=function(t,e){var i=this;b(t,void 0,function(t){i._settledAt(se,e,t)},function(t){i._settledAt(he,e,t)})};var pe=function(t,e){return new ue(this,t,!0,e).promise},le=function(t,e){function i(t){m(o,t)}function n(t){w(o,t)}var r=this,o=new r(u,e);if(!te(t))return w(o,new TypeError("You must pass an array to race.")),o;for(var s=t.length,h=0;o._state===oe&&s>h;h++)b(r.resolve(t[h]),void 0,i,n);return o},de=function(t,e){var i=this;if(t&&"object"==typeof t&&t.constructor===i)return t;var n=new i(u,e);return m(n,t),n},fe=function(t,e){var i=this,n=new i(u,e);return w(n,t),n},ge="rsvp_"+ee()+"-",me=0,ye=N;N.cast=de,N.all=pe,N.race=le,N.resolve=de,N.reject=fe,N.prototype={constructor:N,_guidKey:ge,_onerror:function(t){Q.trigger("error",t)},then:function(t,e,i){var n=this,r=n._state;if(r===se&&!t||r===he&&!e)return Q.instrument&&re("chained",this,this),this;n._onerror=null;var o=new this.constructor(u,i),s=n._result;if(Q.instrument&&re("chained",n,o),r){var h=arguments[r-1];Q.async(function(){T(r,o,h,s)})}else b(n,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,we=new R,be=function(t,e){var i=function(){for(var i,n=this,r=arguments.length,o=new Array(r+1),s=!1,h=0;r>h;++h){if(i=arguments[h],!s){if(s=I(i),s===we){var a=new ye(u);return w(a,we.value),a}s&&s!==!0&&(i=F(s,i))}o[h]=i}var c=new ye(u);return o[r]=function(t,i){t?w(c,t):void 0===e?m(c,i):e===!0?m(c,A(arguments)):te(e)?m(c,P(arguments,e)):m(c,i)},s?z(c,o,t,n):j(c,o,t,n)};return i.__proto__=t,i},xe=function(t,e){return ye.all(t,e)};U.prototype=ie(ue.prototype),U.prototype._superConstructor=ue,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=M;M.prototype=ie(ue.prototype),M.prototype._superConstructor=ue,M.prototype._init=function(){this._result={}},M.prototype._validateInput=function(t){return t&&"object"==typeof t},M.prototype._validationError=function(){return new Error("Promise.hash must be called with an object")},M.prototype._enumerate=function(){var t=this.promise,e=this._input,i=[];for(var n in e)t._state===oe&&e.hasOwnProperty(n)&&i.push({position:n,entry:e[n]});var r=i.length;this._remaining=r;for(var o,s=0;t._state===oe&&r>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=ue,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},Le=function(t){var e={};return e.promise=new ye(function(t,i){e.resolve=t,e.reject=i},t),e},Ne=function(t,e,i){return ye.all(t,i).then(function(t){if(!h(e))throw new TypeError("You must pass a function as map's second argument.");for(var n=t.length,r=new Array(n),o=0;n>o;o++)r[o]=e(t[o]);return ye.all(r,i)})},Re=function(t,e){return ye.resolve(t,e)},Oe=function(t,e){return ye.reject(t,e)},Be=function(t,e,i){return ye.all(t,i).then(function(t){if(!h(e))throw new TypeError("You must pass a function as filter's second argument.");for(var n=t.length,r=new Array(n),o=0;n>o;o++)r[o]=e(t[o]);return ye.all(r,i).then(function(e){for(var i=new Array(n),r=0,o=0;n>o;o++)e[o]&&(i[r]=t[o],r++);return i.length=r,i})})},Pe=0,Ae=function(t,e){Ie[Pe]=t,Ie[Pe+1]=e,Pe+=2,2===Pe&&ke()},Fe="undefined"!=typeof window?window:{},je=Fe.MutationObserver||Fe.WebKitMutationObserver,ze="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,Ie=new Array(1e3);ke="undefined"!=typeof e&&"[object process]"==={}.toString.call(e)?H():je?W():ze?V():X(),Q.async=Ae;if("undefined"!=typeof window&&"object"==typeof window.__PROMISE_INSTRUMENTATION__){var Ue=window.__PROMISE_INSTRUMENTATION__;o("instrument",!0);for(var Me in Ue)Ue.hasOwnProperty(Me)&&K(Me,Ue[Me])}var De={race:Se,Promise:ye,allSettled:_e,hash:Ee,hashSettled:Ce,denodeify:be,on:K,off:Z,map:Ne,filter:Be,resolve:Re,reject:Oe,all:xe,rethrow:qe,defer:Le,EventTarget:G,configure:o,async:Y};"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:2}],4:[function(t,e){function i(t){this.opening=new n.defer,this.opened=this.opening.promise,this.isOpen=!1,this.url=void 0,this.loading={manifest:new n.defer,spine:new n.defer,metadata:new n.defer,cover:new n.defer,navigation:new n.defer,pageList:new n.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=n.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 n=t("rsvp"),r=t("./core"),o=t("./spine"),s=t("./locations"),h=t("./parser"),a=t("./navigation"),c=(t("./rendition"),t("./continuous"),t("./paginate"),t("./unarchive")),u=t("./request");i.prototype.open=function(t){var e,i,n,o,s=new h,a=this,c="META-INF/container.xml";return t?(e="object"==typeof t?t:r.uri(t),this.url=e.href,"opf"===e.extension?(this.packageUrl=e.href,this.containerUrl="",e.origin?this.baseUrl=e.base:window?(o=r.uri(window.location.href),this.baseUrl=r.resolveUrl(o.base,e.directory)):this.baseUrl=e.directory,i=this.request(this.packageUrl)):this.isArchived(e)?(this.containerUrl=c,this.url="",n=this.unarchive(e.href).then(function(){return this.request(this.containerUrl)}.bind(this))):e.extension||(this.containerUrl=this.url+c,n=this.request(this.containerUrl)),n&&(i=n.then(function(t){return s.container(t)}).then(function(t){var e=r.uri(t.packagePath);return a.packageUrl=a.url+t.packagePath,a.encoding=t.encoding,e.origin?a.baseUrl=e.base:window&&a.url?(o=r.uri(window.location.href),a.baseUrl=r.resolveUrl(o.base,a.url+e.directory)):a.baseUrl=e.directory,a.request(a.packageUrl)}).catch(function(t){console.error("Could not load book at: "+(this.packageUrl||this.containerPath)),a.trigger("book:loadFailed",this.packageUrl||this.containerPath),a.opening.reject(t)})),i.then(function(t){a.unpack(t),a.loading.manifest.resolve(a.package.manifest),a.loading.metadata.resolve(a.package.metadata),a.loading.spine.resolve(a.spine),a.loading.cover.resolve(a.cover),a.isOpen=!0,a.opening.resolve(a)}).catch(function(t){console.error(t.message,t.stack),a.opening.reject(t)}),this.opened):(this.opening.resolve(this),this.opened)},i.prototype.unpack=function(t){var e=this,i=new h;e.package=i.packageContents(t),e.package.baseUrl=e.baseUrl,this.spine.load(e.package),e.navigation=new a(e.package,this.request),e.navigation.load().then(function(t){e.toc=t,e.loading.navigation.resolve(e.toc)}),e.cover=e.baseUrl+e.package.coverPath},i.prototype.section=function(t){return this.spine.get(t)},i.prototype.renderTo=function(e,i){var n=i&&i.method?i.method:"rendition",r=t("./"+n);return this.rendition=new r(this,i),this.rendition.attachTo(e),this.rendition},i.prototype.requestMethod=function(t){return this.archive?this.archive.request(t):u(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 c,this.archive.open(t)},i.prototype.isArchived=function(t){var e;return t instanceof ArrayBuffer?!0:(e="object"==typeof t?t:r.uri(t),!e.extension||"epub"!=e.extension&&"zip"!=e.extension?!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,n.EventTarget.mixin(i.prototype),n.on("error",function(t){console.error(t)}),n.configure("instrument",!0),n.on("rejected",function(t){console.error(t.detail.message,t.detail.stack)})},{"./continuous":5,"./core":6,"./locations":10,"./navigation":12,"./paginate":13,"./parser":14,"./rendition":16,"./request":18,"./spine":20,"./unarchive":21,rsvp:3}],5:[function(t,e){function i(t,e){o.apply(this,arguments),this.settings=r.extend(this.settings||{},{infinite:!0,overflow:"auto",axis:"vertical",offset:500,offsetDelta:250}),r.extend(this.settings,e),this.settings.hidden&&(this.wrapper=this.wrap(this.container))}var n=t("rsvp"),r=t("./core"),o=t("./rendition"),s=t("./view");i.prototype=Object.create(o.prototype),i.prototype.constructor=i,i.prototype.attachListeners=function(){r.isNumber(this.settings.width)&&r.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,n=t.section.next(),r=t.section.prev(),o=this.views.indexOf(t);o+1===this.views.length&&n&&(i=new s(n,this.viewSettings),this.q.enqueue(this.append,i)),0===o&&r&&(e=new s(r,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 n.defer,i=this.bounds(),r=[],o=t||this.settings.offset;return this.views.each(function(t){var e=this.isVisible(t,o,o,i);e?t.displayed||t.rendering||r.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)),r.length?n.all(r).then(function(){this.q.enqueue(this.check)}.bind(this)):(e.resolve(),e.promise)},i.prototype.trim=function(){for(var t=new n.defer,e=this.views.displayed(),i=e[0],r=e[e.length-1],o=this.views.indexOf(i),s=this.views.indexOf(r),h=this.views.slice(0,o),a=this.views.slice(s+1),c=0;cthis.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":6,"./rendition":16,"./view":22,rsvp:3}],6:[function(t,e){function i(t){var e,i,r,o={protocol:"",host:"",path:"",origin:"",directory:"",base:"",filename:"",extension:"",fragment:"",href:t},s=t.indexOf("://"),h=t.indexOf("?"),a=t.indexOf("#");return-1!=a&&(o.fragment=t.slice(a+1),t=t.slice(0,a)),-1!=h&&(o.search=t.slice(h+1),t=t.slice(0,h),href=t),-1!=s?(o.protocol=t.slice(0,s),e=t.slice(s+3),r=e.indexOf("/"),-1===r?(o.host=o.path,o.path=""):(o.host=e.slice(0,r),o.path=e.slice(r)),o.origin=o.protocol+"://"+o.host,o.directory=n(o.path),o.base=o.origin+o.directory):(o.path=t,o.directory=n(t),o.base=o.directory),o.filename=t.replace(o.base,""),i=o.filename.lastIndexOf("."),-1!=i&&(o.extension=o.filename.slice(i+1)),o}function n(t){var e=t.lastIndexOf("/");if(-1==e)var i="";return i=t.slice(0,e+1)}function r(t){return!(!t||1!=t.nodeType)}function o(){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 s(t){for(var e=-1,i=Object.keys(t),n=i.length,r=Array(n);++er;r++)if("undefined"!=typeof document.body.style[e[r]+i])return e[r]+i;return t}function p(t){for(var e=1,i=arguments.length;i>e;e++){var n=arguments[e];for(var r in n)void 0===t[r]&&(t[r]=n[r])}return t}function l(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 d(t,e,i){var n=f(t,e,i);return e.splice(n,0,t),n}function f(t,e,i,n,r){var o,s=n||0,h=r||e.length,a=parseInt(s+(h-s)/2);return i||(i=function(t,e){return t>e?1:e>t?-1:(t=e)?0:void 0}),0>=h-s?a:(o=i(e[a],t),h-s===1?o>0?a:a+1:0===o?a:-1===o?f(t,e,i,a,h):f(t,e,i,s,a))}function g(t,e,i,n,r){var o,s=n||0,h=r||e.length,a=parseInt(s+(h-s)/2);return i||(i=function(t,e){return t>e?1:e>t?-1:(t=e)?0:void 0}),0>=h-s?-1:(o=i(e[a],t),h-s===1?0===o?a:-1:0===o?a:-1===o?g(t,e,i,a,h):g(t,e,i,s,a))}function m(t){var e=window.getComputedStyle(t),i=["width","paddingRight","paddingLeft","marginRight","marginLeft","borderRightWidth","borderLeftWidth"],n=["height","paddingTop","paddingBottom","marginTop","marginBottom","borderTopWidth","borderBottomWidth"],r=0,o=0;return i.forEach(function(t){r+=parseFloat(e[t])||0}),n.forEach(function(t){o+=parseFloat(e[t])||0}),{height:o,width:r}}function y(t){var e=window.getComputedStyle(t),i=["paddingRight","paddingLeft","marginRight","marginLeft","borderRightWidth","borderLeftWidth"],n=["paddingTop","paddingBottom","marginTop","marginBottom","borderTopWidth","borderBottomWidth"],r=0,o=0;return i.forEach(function(t){r+=parseFloat(e[t])||0}),n.forEach(function(t){o+=parseFloat(e[t])||0}),{height:o,width:r}}function v(){var t=window.innerWidth,e=window.innerHeight;return{top:0,left:0,right:t,bottom:e,width:t,height:e}}function w(t){var e=t.match(/[^'"]+|['"]/g);return e=e.map(function(t){return"'"===t?'"\'"':'"'===t?"'\"'":"'"+t+"'"}),"concat('',"+e.join(",")+")"}function b(t){for(var e,i=t.parentNode,n=i.childNodes,r=-1,o=0;o-1}var _=(t("rsvp"),window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame);e.exports={uri:i,folder:n,isElement:r,uuid:o,values:s,resolveUrl:h,indexOfSorted:g,documentHeight:a,isNumber:c,prefixed:u,defaults:p,extend:l,insert:d,locationOf:f,indexOfSorted:g,requestAnimationFrame:_,bounds:m,borders:y,windowBounds:v,cleanStringForXpath:w,indexOfTextNode:b,isXml:x}},{rsvp:3}],7:[function(t,e){function i(t){return t?this.parse(t):void 0}var n=t("./core");i.prototype.generateChapterComponent=function(t,e,i){var n=parseInt(e),r=t+1,o="/"+r+"/";return o+=2*(n+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),n=this.generatePathComponent(i);return n.length?"epubcfi("+e+"!"+n+"/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,n,r,o,s,h,a,c,u={},p=function(t){var e,i,n,r;return e="element",i=parseInt(t)/2-1,n=t.match(/\[(.*)\]/),n&&n[1]&&(r=n[1]),{type:e,index:i,id:r||!1}};return"string"!=typeof t?{spinePos:-1}:(u.str=t,0===t.indexOf("epubcfi(")&&")"===t[t.length-1]&&(t=t.slice(8,t.length-1)),i=this.getChapterComponent(t),n=this.getPathComponent(t)||"",r=this.getCharecterOffsetComponent(t),i?(e=i.split("/")[2]||"")?(u.spinePos=parseInt(e)/2-1||0,s=e.match(/\[(.*)\]/),u.spineId=s?s[1]:!1,-1!=n.indexOf(",")&&console.warn("CFI Ranges are not supported"),h=n.split("/"),a=h.pop(),u.steps=[],h.forEach(function(t){var e;t&&(e=p(t),u.steps.push(e))}),c=parseInt(a),isNaN(c)||(c%2===0?u.steps.push(p(a)):u.steps.push({type:"text",index:(c-1)/2})),o=r.match(/\[(.*)\]/),o&&o[1]?(u.characterOffset=parseInt(r.split("[")[0]),u.textLocationAssertion=o[1]):u.characterOffset=parseInt(r),u):{spinePos:-1}:{spinePos:-1})},i.prototype.addMarker=function(t,e,i){var n,r,o,s,h=e||document,a=i||this.createMarker(h);return"string"==typeof t&&(t=this.parse(t)),r=t.steps[t.steps.length-1],-1===t.spinePos?!1:(n=this.findParent(t,h))?(r&&"text"===r.type?(o=n.childNodes[r.index],t.characterOffset?(s=o.splitText(t.characterOffset),a.classList.add("EPUBJS-CFI-SPLIT"),n.insertBefore(a,s)):n.insertBefore(a,o)):n.insertBefore(a,n.firstChild),a):!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,n,r,o=e||document,s=o.getElementsByTagName("html")[0],h=Array.prototype.slice.call(s.children); -if("string"==typeof t&&(t=this.parse(t)),n=t.steps.slice(0),!n.length)return o.getElementsByTagName("body")[0];for(;n&&n.length>0;){if(i=n.shift(),"text"===i.type?(r=s.childNodes[i.index],s=r.parentNode||s):s=i.id?o.getElementById(i.id):h[i.index],"undefined"==typeof s)return console.error("No Element For",i,t.str),!1;h=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[n].index)return 1;if(t.steps[n].indexe.characterOffset?1:t.characterOffset")},i.prototype.generateRangeFromCfi=function(t,e){var i,n,r,o,s,h,a=e||document,c=a.createRange();return"string"==typeof t&&(t=this.parse(t)),-1===t.spinePos?!1:(i=t.steps[t.steps.length-1],"undefined"!=typeof document.evaluate?(n=this.generateXpathFromSteps(t.steps),r=a.evaluate(n,a,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue):(s=this.generateQueryFromSteps(t.steps),h=a.querySelector(s),h&&"text"==i.type&&(r=h.childNodes[i.index])),r?(r&&t.characterOffset>=0?(o=r.length,t.characterOffset=0?i:p%2===0?p:p-1;r=a>1?Math.floor((u-l)/a):u,s=r*a,h=(r+l)*a,this.columnAxis=o.prefixed("columnAxis"),this.columnGap=o.prefixed("columnGap"),this.columnWidth=o.prefixed("columnWidth"),this.columnFill=o.prefixed("columnFill"),this.width=u,this.height=e,this.spread=s,this.delta=h,this.column=r,this.gap=l,this.divisor=a},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}},n.prototype.calculate=function(){},n.prototype.format=function(t){var e,i,n=t.document.documentElement,r=documentElement.querySelector("[name=viewport");r&&r.hasAttribute("content")&&(content=r.getAttribute("content"),contents=content.split(","),contents[0]&&(e=contents[0].replace("width=","")),contents[1]&&(i=contents[1].replace("height=",""))),t.resize(e,i),n.style.overflow="auto"},n.prototype.count=function(){return{spreads:1,pages:1}},r.prototype.calculate=function(t){this.spread=t,this.column=t,this.gap=0},r.prototype.format=function(t){var e=t.document.documentElement;e.style.width="auto",e.style.height="auto"},r.prototype.count=function(){return{spreads:1,pages:1}},e.exports={Reflowable:i,Fixed:n,Scroll:r}},{"./core":6}],10:[function(t,e){function i(t,e){this.spine=t,this.request=e,this.q=new r(this),this.epubcfi=new o,this._locations=[],this.total=0,this.break=150,this._current=0}var n=t("./core"),r=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,n=e.ownerDocument,r=0;this.sprint(e,function(e){var o,s=e.length,h=0;for(0==r&&(i=n.createRange(),i.setStart(e,0)),o=this.break-r,o>s&&(r+=s,h=s);s>h;)r=this.break,h+=this.break,h>=s?r=s-(h-this.break):(i.setEnd(e,h),cfi=t.cfiFromRange(i),this._locations.push(cfi),r=0,h+=1,i=n.createRange(),i.setStart(e,h))}.bind(this)),i&&(i.setEnd(prev,prev.length),cfi=t.cfiFromRange(i),this._locations.push(cfi),r=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:n.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":6,"./epubcfi":7,"./queue":15,rsvp:3}],11:[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 n=t.document.body;return this.rangePairToCfiPair(t.section,{start:this.findStart(n,e,i),end:this.findEnd(n,e,i)})},i.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},i.prototype.findRanges=function(t){for(var e,i,n=[],r=this.layout.count(t),o=this.layout.column,s=this.layout.gap,h=0;h=e&&i>=n?t:r>e?t:(s=t,o.push(t),void 0)}))return this.findTextStartRange(r,e,i);return this.findTextStartRange(s,e,i)},i.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,h;return t.nodeType==Node.TEXT_NODE?(h=document.createRange(),h.selectNodeContents(t),r=h.getBoundingClientRect()):r=t.getBoundingClientRect(),e=r.left,n=r.right,e>i&&s?s:n>i?t:(s=t,o.push(t),void 0)}))return this.findTextEndRange(r,e,i);return this.findTextEndRange(s,e,i)},i.prototype.findTextStartRange=function(t,e){for(var i,n,r,o=this.splitTextNodeIntoRanges(t),s=0;s=e)return n;i=n}return o[0]},i.prototype.findTextEndRange=function(t,e,i){for(var n,r,o,s=this.splitTextNodeIntoRanges(t),h=0;hi&&n)return n;if(o.right>i)return r;n=r}return s[s.length-1]},i.prototype.splitTextNodeIntoRanges=function(t,e){var i,n=[],r=t.textContent||"",o=r.trim(),s=t.ownerDocument,h=e||" ";if(pos=o.indexOf(h),-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),n.push(i),i=!1;-1!=pos;)pos=o.indexOf(h,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},i.prototype.rangePairToCfiPair=function(t,e){var i=e.start,n=e.end;return i.collapse(!0),n.collapse(!0),startCfi=t.cfiFromRange(i),endCfi=t.cfiFromRange(n),{start:startCfi,end:endCfi}},i.prototype.rangeListToCfiList=function(t,e){for(var i,n=[],r=0;r1?(t=h.left-s[0].position().left,i=t+this.layout.column,e=h.left+this.layout.spread-s[s.length-1].position().left,n=e+this.layout.column,r=this.map.page(s[0],t,i),o=this.map.page(s[s.length-1],e,n),{start:r.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 n.Promise(function(t){setTimeout(function(){t()},1)})},e.exports=i},{"./continuous":5,"./core":6,"./layout":9,"./map":11,rsvp:3}],14:[function(t,e){function i(){}var n=t("./core"),r=t("./epubcfi");i.prototype.container=function(t){var e,i,r,o;return t?(e=t.querySelector("rootfile"))?(i=e.getAttribute("full-path"),r=n.uri(i).directory,o=t.xmlEncoding,{packagePath:i,basePath:r,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,n,r,o,s,h,a,c,u,p=this;return t?(e=t.querySelector("metadata"))?(i=t.querySelector("manifest"))?(n=t.querySelector("spine"))?(r=p.manifest(i),o=p.findNavPath(i),s=p.findNcxPath(i,n),h=p.findCoverPath(t),a=Array.prototype.indexOf.call(n.parentNode.childNodes,n),c=p.spine(n,r),u=p.metadata(e),u.direction=n.getAttribute("page-progression-direction"),{metadata:u,spine:c,manifest:r,navPath:o,ncxPath:s,coverPath:h,spineNodeIndex:a}):(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,n=t.querySelector("item[media-type='application/x-dtbncx+xml']");return n||(i=e.getAttribute("toc"),i&&(n=t.querySelector("item[id='"+i+"']"))),n?n.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 n=i.getAttribute("content"),r=t.querySelector("item[id='"+n+"']");return r?r.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,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:""):""},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"),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},i.prototype.spine=function(t){{var e=[],i=t.getElementsByTagName("itemref"),n=Array.prototype.slice.call(i);new r}return n.forEach(function(t,i){var n=t.getAttribute("idref"),r=t.getAttribute("properties")||"",o=r.length?r.split(" "):[],s={idref:n,linear:t.getAttribute("linear")||"",properties:o,index:i};e.push(s)}),e},i.prototype.querySelectorByType=function(t,e,i){var n=t.querySelector(e+'[*|type="'+i+'"]');if(null!==n&&0!==n.length)return n;n=t.querySelectorAll(e);for(var r=0;rn;++n)r=this.navItem(h[n],e,i),c[r.id]=r,r.parent?(o=c[r.parent],o.subitems.push(r)):u.push(r);return u},i.prototype.navItem=function(t){var e,i=t.getAttribute("id")||!1,n=t.querySelector("a, span"),r=n.getAttribute("href")||"",o=n.textContent||"",s=r.split("#"),h=(s[0],[]),a=t.parentNode;return a&&"navPoint"===a.nodeName&&(e=a.getAttribute("id")),{id:i,href:r,label:o,subitems:h,parent:e}},i.prototype.toc=function(t,e,i){var n,r,o,s=t.querySelectorAll("navMap navPoint"),h=s.length,a={},c=[];if(!s||0===h)return c;for(n=0;h>n;++n)r=this.tocItem(s[n],e,i),a[r.id]=r,r.parent?(o=a[r.parent],o.subitems.push(r)):c.push(r);return c},i.prototype.tocItem=function(t){var e,i=t.getAttribute("id")||!1,n=t.querySelector("content"),r=n.getAttribute("src"),o=t.querySelector("navLabel"),s=o.textContent?o.textContent:"",h=r.split("#"),a=(h[0],[]),c=t.parentNode;return c&&"navPoint"===c.nodeName&&(e=c.getAttribute("id")),{id:i,href:r,label:s,subitems:a,parent:e}},i.prototype.pageList=function(t,e,i){var n,r,o=this.querySelectorByType(t,"nav","page-list"),s=o?o.querySelectorAll("ol li"):[],h=s.length,a=[];if(!s||0===h)return a;for(n=0;h>n;++n)r=this.pageListItem(s[n],e,i),a.push(r);return a},i.prototype.pageListItem=function(t){var e,i,n,r=(t.getAttribute("id")||!1,t.querySelector("a")),o=r.getAttribute("href")||"",s=r.textContent||"",h=parseInt(s),a=o.indexOf("epubcfi");return-1!=a?(e=o.split("#"),i=e[0],n=e.length>1?e[1]:!1,{cfi:n,href:o,packageUrl:i,page:h}):{href:o,page:h}},e.exports=i},{"./core":6,"./epubcfi":7}],15:[function(t,e){function i(t){this._q=[],this.context=t,this.tick=r.requestAnimationFrame,this.running=!1,this.paused=!1}var n=t("rsvp"),r=t("./core");i.prototype.enqueue=function(){var t,e,i,r=[].shift.call(arguments),o=arguments;return r?("function"==typeof r?(t=new n.defer,e=t.promise,i={task:r,args:o,deferred:t,promise:e}):i={promise:r},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 n.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 n.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":6,rsvp:3}],16:[function(t,e){function i(t,e){this.settings=r.extend(this.settings||{},{infinite:!0,hidden:!1,width:!1,height:null,layoutOveride:null,axis:"vertical"}),r.extend(this.settings,e),this.viewSettings={},this.book=t,this.views=null,this.hooks={},this.hooks.display=new s(this),this.hooks.content=new s(this),this.hooks.layout=new s(this),this.hooks.render=new s(this),this.hooks.show=new s(this),this.hooks.content.register(o.links.bind(this)),this.hooks.content.register(this.passViewEvents.bind(this)),this.epubcfi=new h,this.q=new a(this),this.q.enqueue(this.book.opened),this.q.enqueue(this.parseLayoutProperties)}var n=t("rsvp"),r=t("./core"),o=t("./replacements"),s=t("./hook"),h=t("./epubcfi"),a=t("./queue"),c=t("./view"),u=t("./views"),p=t("./layout"),l=t("./map");i.prototype.initialize=function(t){{var e,i=t||{},n=i.height,o=i.width;i.hidden||!1}return i.height&&r.isNumber(i.height)&&(n=i.height+"px"),i.width&&r.isNumber(i.width)&&(o=i.width+"px"),e=document.createElement("div"),e.id="epubjs-container:"+r.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"),o&&(e.style.width=o),n&&(e.style.height=n),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}),r.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 u(this.container),this.attachListeners(),this.stageSize(),this.applyLayoutMethod(),this.trigger("attached"),void 0):(console.error("Not an Element"),void 0)},i.prototype.attachListeners=function(){r.isNumber(this.settings.width)&&r.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,r,o,s,h=new n.defer,a=h.promise,u=this.epubcfi.isCfiString(t);return(e=this.book.spine.get(t))?(s=this.views.find(e),s?(r=i.locationOf(t),a=this.moveTo(r).then(function(){return this.check()})):(this.views.hide(),i=new c(e,this.viewSettings),a=this.fill(i).then(function(){return"string"==typeof t&&t.indexOf("#")>-1&&(o=t.substring(t.indexOf("#")+1)),u||o?(r=i.locationOf(t),this.moveTo(r)):"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))),a.then(function(){this.trigger("displayed",e)}.bind(this)),a):(h.reject(new Error("No Section Found")),a)},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,n=t||this.settings.width,o=e||this.settings.height;return n===!1&&(i=this.element.getBoundingClientRect(),i.width&&(n=i.width,this.container.style.width=i.width+"px")),o===!1&&(i=i||this.element.getBoundingClientRect(),i.height&&(o=i.height,this.container.style.height=i.height+"px")),n&&!r.isNumber(n)&&(i=this.container.getBoundingClientRect(),n=i.width),o&&!r.isNumber(o)&&(i=i||this.container.getBoundingClientRect(),o=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:n-this.containerPadding.left-this.containerPadding.right,height:o-this.containerPadding.top-this.containerPadding.bottom},this.stage},i.prototype.applyLayoutMethod=function(){this.layout=new p.Scroll,this.updateLayout(),this.map=new l(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 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",n=this.layoutOveride&&this.layoutOveride.spread||e.spread||"auto",r=this.layoutOveride&&this.layoutOveride.orientation||e.orientation||"auto";return this.globalLayoutProperties={layout:i,spread:n,orientation:r},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,n){var r=t.position(),o=n||this.container.getBoundingClientRect();return"horizontal"===this.settings.axis&&r.right>o.left-e&&r.lefto.top-e&&r.top-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":6,"./epubcfi":7,"./section":19,rsvp:3}],21:[function(t,e){function i(){this.checkRequirements(),this.urlCache={}}var n=t("rsvp"),r=t("./core"),o=t("./request"),s=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 n.Promise(function(e){this.zip=new JSZip(t),e(this.zip)}):o(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 n.defer;return e||(uri=r.uri(t),e=uri.extension),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):r.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,n=window.decodeURIComponent(t),r=this.zip.file(n);return r?(i=e||s.lookup(r.name),new Blob([r.asUint8Array()],{type:i})):void 0},i.prototype.getText=function(t){var e=window.decodeURIComponent(t),i=this.zip.file(e);return i?i.asText():void 0},i.prototype.createUrl=function(t){var e,i,r=new n.defer,o=window.URL||window.webkitURL||window.mozURL;return t in this.urlCache?(r.resolve(this.urlCache[t]),r.promise):(i=this.getBlob(t),i?(e=o.createObjectURL(i),r.resolve(e),this.urlCache[t]=e):r.reject({message:"File not found in the epub: "+t,stack:(new Error).stack}),r.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":6,"./request":18,jszip:"jszip",rsvp:3}],22:[function(t,e){function i(t,e){this.settings=e||{},this.id="epubjs-view:"+r.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 n=t("rsvp"),r=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=r.bounds(this.element),this.supportsSrcdoc=!1,this.iframe)},i.prototype.lock=function(t,e,i){var n,o=r.borders(this.element);n=this.iframe?r.borders(this.iframe):{width:0,height:0},"width"==t&&r.isNumber(e)&&(this.lockedWidth=e-o.width-n.width,this.resize(this.lockedWidth,e)),"height"==t&&r.isNumber(i)&&(this.lockedHeight=i-o.height-n.height,this.resize(e,this.lockedHeight)),"both"===t&&r.isNumber(e)&&r.isNumber(i)&&(this.lockedWidth=e-o.width-n.width,this.lockedHeight=i-o.height-n.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,n=this.lockedHeight;this.iframe&&!this._expanding&&(this._expanding=!0,n&&!i&&(t=this.textWidth(),t!=this._textWidth?(i=this.contentWidth(t),this._textWidth=t,this._contentWidth=i):i=this._contentWidth),i&&!n&&(e=this.textHeight(),e!=this._textHeight?(n=this.contentHeight(e),this._textHeight=e,this._contentHeight=n):n=this._contentHeight),(this._needsReframe||i!=this._width||n!=this._height)&&this.resize(i,n),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&&(r.isNumber(t)&&(this.iframe.style.width=t+"px",this._width=t),r.isNumber(e)&&(this.iframe.style.height=e+"px",this._height=e),this.iframeBounds=r.bounds(this.iframe),this.reframe(this.iframeBounds.width,this.iframeBounds.height))},i.prototype.reframe=function(t,e){return this.displayed?(r.isNumber(t)&&(this.element.style.width=t+"px"),r.isNumber(e)&&(this.element.style.height=e+"px"),this.prevBounds=this.elementBounds,this.elementBounds=r.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 n.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 n.Promise(function(e){var i,n=!1;return this.document?(i=this.document.createElement("link"),i.type="text/css",i.rel="stylesheet",i.href=t,i.onload=i.onreadystatechange=function(){n||this.readyState&&"complete"!=this.readyState||(n=!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 n=0,r=t.length;r>n;n++){var o=1,s=t[n],h=t[n][0],a="";"[object Array]"===Object.prototype.toString.call(s[1][0])&&(s=s[1],o=0);for(var c=s.length;c>o;o++){var u=s[o];a+=u[0]+":"+u[1]+(u[2]?" !important":"")+";\n"}i.insertRule(h+"{"+a+"}",i.cssRules.length)}}},i.prototype.addScript=function(t){return new n.Promise(function(e){var i,n=!1;return this.document?(i=this.document.createElement("script"),i.type="text/javascript",i.async=!0,i.src=t,i.onload=i.onreadystatechange=function(){n||this.readyState&&"complete"!=this.readyState||(n=!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)},n.EventTarget.mixin(i.prototype),e.exports=i},{"./core":6,"./epubcfi":7,rsvp:3}],23:[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,n=0;i>n;n++)if(e=this._views[n],e.displayed&&e.section.index==t.index)return e},i.prototype.displayed=function(){for(var t,e=[],i=this.length,n=0;i>n;n++)t=this._views[n],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 n(t){return new r(t)}"undefined"==typeof EPUBJS&&(("undefined"!=typeof window?window:i).EPUBJS={}),EPUBJS.VERSION="0.3.0";var r=t("./book");e.exports=n}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./book":4}]},{},["epub"])("epub")}); +!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=O(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=O(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;Ne>t;t+=2){var e=je[t],i=je[t+1];e(i),je[t]=void 0,je[t+1]=void 0}Ne=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,N(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)},Oe=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})})},Ne=0,Be=function(t,e){je[Ne]=t,je[Ne+1]=e,Ne+=2,2===Ne&&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:Oe,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){var e,i,n,o={protocol:"",host:"",path:"",origin:"",directory:"",base:"",filename:"",extension:"",fragment:"",href:t},s=t.indexOf("://"),a=t.indexOf("?"),h=t.indexOf("#");return-1!=h&&(o.fragment=t.slice(h+1),t=t.slice(0,h)),-1!=a&&(o.search=t.slice(a+1),t=t.slice(0,a),href=t),-1!=s?(o.protocol=t.slice(0,s),e=t.slice(s+3),n=e.indexOf("/"),-1===n?(o.host=o.path,o.path=""):(o.host=e.slice(0,n),o.path=e.slice(n)),o.origin=o.protocol+"://"+o.host,o.directory=r(o.path),o.base=o.origin+o.directory):(o.path=t,o.directory=r(t),o.base=o.directory),o.filename=t.replace(o.base,""),i=o.filename.lastIndexOf("."),-1!=i&&(o.extension=o.filename.slice(i+1)),o}function r(t){var e=t.lastIndexOf("/");if(-1==e)var i="";return i=t.slice(0,e+1)}function n(t){return!(!t||1!=t.nodeType)}function o(){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 s(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 p(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 l(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 d(t,e,i){var r=f(t,e,i);return e.splice(r,0,t),r}function f(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?f(t,e,i,h,a):f(t,e,i,s,h))}function m(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?m(t,e,i,h,a):m(t,e,i,s,h))}function g(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 y(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 v(){var t=window.innerWidth,e=window.innerHeight;return{top:0,left:0,right:t,bottom:e,width:t,height:e}}function b(t){var e=t.match(/[^'"]+|['"]/g);return e=e.map(function(t){return"'"===t?'"\'"':'"'===t?"'\"'":"'"+t+"'"}),"concat('',"+e.join(",")+")"}function w(t){for(var e,i=t.parentNode,r=i.childNodes,n=-1,o=0;o-1}var _=(t("rsvp"),window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame);e.exports={uri:i,folder:r,isElement:n,uuid:o,values:s,resolveUrl:a,indexOfSorted:m,documentHeight:h,isNumber:u,prefixed:c,defaults:p,extend:l,insert:d,locationOf:f,indexOfSorted:m,requestAnimationFrame:_,bounds:g,borders:y,windowBounds:v,cleanStringForXpath:b,indexOfTextNode:w,isXml:x}},{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?(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 diff --git a/dist/epub.min.js.map b/dist/epub.min.js.map index 7ca61b1..00eae35 100644 --- a/dist/epub.min.js.map +++ b/dist/epub.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","libs/mime/mime.js","node_modules/browserify/node_modules/process/browser.js","node_modules/rsvp/dist/rsvp.js","src/book.js","src/continuous.js","src/core.js","src/epubcfi.js","src/hook.js","src/layout.js","src/locations.js","src/map.js","src/navigation.js","src/paginate.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/view.js","src/views.js","src/epub.js"],"names":[],"mappings":"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","file":"epub.min.js","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 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);","var RSVP = require('rsvp');\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\n this.url = uri.href;\n\n // Find path to the Container\n if(uri.extension === \"opf\") {\n // Direct link to package, no container\n this.packageUrl = uri.href;\n this.containerUrl = '';\n\n if(uri.origin) {\n this.baseUrl = uri.base;\n } else if(window){\n location = core.uri(window.location.href);\n this.baseUrl = core.resolveUrl(location.base, uri.directory);\n } else {\n this.baseUrl = uri.directory;\n }\n\n epubPackage = this.request(this.packageUrl);\n\n } else if(this.isArchived(uri)) {\n // Book is archived\n this.containerUrl = containerPath;\n this.url = '';\n\n epubContainer = this.unarchive(uri.href).\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.extension) {\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 = core.uri(paths.packagePath);\n book.packageUrl = book.url + paths.packagePath;\n book.encoding = paths.encoding;\n\n // Set Url relative to the content\n if(packageUri.origin) {\n book.baseUrl = packageUri.base;\n } else if(window && book.url){\n location = core.uri(window.location.href);\n book.baseUrl = core.resolveUrl(location.base, book.url + packageUri.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 = book.baseUrl + book.package.coverPath;\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 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.isArchived = function(bookUrl){\n var uri;\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\n\tif(uri.extension && (uri.extension == \"epub\" || uri.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\t.then(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};\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 = new View(next, this.viewSettings);\n\t\tthis.q.enqueue(this.append, nextView);\n\t}\n\n\tif(index === 0 && prev) {\n\t\tprevView = new View(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\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};\n","var 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 = core.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(func){\n this.hooks.push(func);\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\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');\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 = _package.baseUrl + _package.navPath;\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 = _package.baseUrl + _package.ncxPath;\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 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 = core.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\tsplit = src.split(\"#\"),\n\t\t\tbaseUrl = 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\tsplit = src.split(\"#\"),\n\t\t\tbaseUrl = 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 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.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};\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\tview = new View(section, this.viewSettings);\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\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\n//-- Enable binding events to Renderer\nRSVP.EventTarget.mixin(Rendition.prototype);\n\nmodule.exports = Rendition;\n","var core = require('./core');\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 uri = new core.uri(href);\n\n\n if(uri.protocol){\n\n link.setAttribute(\"target\", \"_blank\");\n\n }else{\n\n // relative = core.resolveUrl(directory, href);\n // if(uri.fragment && !base) {\n // link.onclick = function(){\n // renderer.fragment(href);\n // return false;\n // };\n // } else {\n\n //}\n\n if(href.indexOf(\"#\") === 0) {\n // do nothing with fragment yet\n } else {\n link.onclick = function(){\n renderer.display(href);\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\nmodule.exports = {\n 'links': links\n};\n","var RSVP = require('rsvp');\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 = core.uri(url);\n\t\ttype = uri.extension;\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 core = require('./core');\nvar EpubCFI = require('./epubcfi');\nvar Hook = require('./hook');\n\nfunction Section(item){\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.replacements = new Hook(this);\n\n // Register replacements\n this.hooks.replacements.register(this.replacements);\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 = core.folder(this.url);\n\n this.document = xml;\n this.contents = xml.documentElement;\n\n return this.hooks.replacements.trigger(this.document);\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.replacements = 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\n this.load(_request).then(function(contents){\n var serializer = new XMLSerializer();\n var output = serializer.serializeToString(contents);\n rendering.resolve(output);\n })\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\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 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 = core.uri(url);\n\t\ttype = uri.extension;\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);\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);\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 +{"version":3,"sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","libs/mime/mime.js","node_modules/browserify/lib/_empty.js","node_modules/browserify/node_modules/process/browser.js","node_modules/rsvp/dist/rsvp.js","node_modules/urijs/src/URI.js","src/book.js","src/continuous.js","src/core.js","src/epubcfi.js","src/hook.js","src/layout.js","src/locations.js","src/map.js","src/navigation.js","src/paginate.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/view.js","src/views.js","src/epub.js"],"names":[],"mappings":"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","file":"epub.min.js","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 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\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};\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\treturn this.q.enqueue(function () {\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 var urls = items.\n\t map(function(item) {\n\t\t\t\t// return this.book.baseUrl + item.href;\n\t return item.href;\n\t }.bind(this));\n\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 return RSVP.all(processing).\n\t then(function(replacementUrls) {\n\t this.hooks.serialize.register(function(content, section) {\n\t\t\t\t\t// resolve file urls\n\t\t\t\t\tvar fileUri = URI(section.url);\n\t\t\t\t\t// console.log(section.url);\n\t\t\t\t\t// var fileDirectory = fileUri.directory();\n\t\t\t\t\t// // // package urls\n\t\t\t\t\t// var packageUri = URI(this.book.packageUrl);\n\t\t\t\t\t// var packageDirectory = packageUri.directory();\n\t\t\t\t\t//\n\t\t\t\t\t// // Need to compare the directory of the current file\n\t\t\t\t\t// // with the directory of the package file.\n\n\n\t\t\t\t\turls = urls.\n\t\t\t\t map(function(href) {\n\t\t\t\t\t\t\tvar assetUri = URI(href).absoluteTo(this.book.baseUrl);\n\t\t\t\t\t\t\tvar relative = assetUri.relativeTo(fileUri).toString();\n\t\t\t\t return relative;\n\t\t\t\t }.bind(this));\n\n\n\t section.output = replace.substitute(content, urls, replacementUrls);\n\t }.bind(this));\n\t }.bind(this)).catch(function(reason){\n\t console.error(reason);\n\t });\n\t}.bind(this));\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 content = content.replace(new RegExp(url, 'g'), replacements[i]);\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 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 = core.folder(this.url);\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 89ce4f1..c90e40e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -16,6 +16,9 @@ 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'); + // https://github.com/mishoo/UglifyJS2/pull/265 // uglify.AST_Node.warn_function = function() {}; @@ -43,6 +46,7 @@ gulp.task('minify', ['bundle'], function(){ .pipe(sourcemaps.init({loadMaps: true})) .pipe(uglify(uglifyOptions)) .pipe(sourcemaps.write('./')) + .pipe(size({ showFiles: true })) .pipe(gulp.dest('dist')); }); @@ -59,9 +63,6 @@ gulp.task('serve', ["watch"], function() { // Default gulp.task('default', ['lint', 'build']); -// gulp.task('default', function() { -// // place code for your default task here -// }); function bundle(file, watch) { var opt = { @@ -71,9 +72,21 @@ function bundle(file, watch) { }; 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'); + // Ignore optional URI libraries + var urijsPath = URI(require.resolve('urijs')); + ['./punycode.js', './IPv6.js', './SecondLevelDomains.js'].forEach(function(lib) { + var libPath = URI(lib).absoluteTo(urijsPath).toString(); + b.ignore(libPath); + }); + // watchify() if watch requested, otherwise run browserify() once var bundler = watch ? watchify(b) : b; @@ -85,6 +98,7 @@ function bundle(file, watch) { .pipe(buffer()) .pipe(sourcemaps.init({loadMaps: true})) .pipe(sourcemaps.write('./')) + .pipe(size({ showFiles: true })) .pipe(gulp.dest('./dist/')); } diff --git a/package.json b/package.json index 7d2801e..fbc5e8d 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "gulp-jshint": "^1.8.4", "gulp-plumber": "^0.6.4", "gulp-rename": "^1.2.0", + "gulp-size": "^2.0.0", "gulp-sourcemaps": "^1.6.0", "gulp-uglify": "^0.3.1", "gulp-util": "^3.0.0", @@ -37,6 +38,7 @@ }, "dependencies": { "jszip": "^2.5.0", - "rsvp": "^3.0.18" + "rsvp": "^3.0.18", + "urijs": "^1.17.0" } } diff --git a/src/book.js b/src/book.js index 5e57377..147d015 100644 --- a/src/book.js +++ b/src/book.js @@ -1,4 +1,5 @@ var RSVP = require('rsvp'); +var URI = require('urijs'); var core = require('./core'); var Spine = require('./spine'); var Locations = require('./locations'); @@ -67,44 +68,43 @@ Book.prototype.open = function(_url){ } // Reuse parsed url or create a new uri object - if(typeof(_url) === "object") { - uri = _url; - } else { - uri = core.uri(_url); - } - - this.url = uri.href; + // if(typeof(_url) === "object") { + // uri = _url; + // } else { + // uri = core.uri(_url); + // } + uri = URI(_url); + this.url = _url; // Find path to the Container - if(uri.extension === "opf") { + if(uri.suffix() === "opf") { // Direct link to package, no container - this.packageUrl = uri.href; + this.packageUrl = _url; this.containerUrl = ''; - if(uri.origin) { - this.baseUrl = uri.base; + if(uri.origin()) { + this.baseUrl = uri.origin() + "/" + uri.directory() + "/"; } else if(window){ - location = core.uri(window.location.href); - this.baseUrl = core.resolveUrl(location.base, uri.directory); + this.baseUrl = uri.absoluteTo(window.location.href).directory() + "/"; } else { - this.baseUrl = uri.directory; + this.baseUrl = uri.directory() + "/"; } epubPackage = this.request(this.packageUrl); - } else if(this.isArchived(uri)) { + } else if(this.isArchivedUrl(uri)) { // Book is archived - this.containerUrl = containerPath; - this.url = ''; + this.url = '/'; + this.containerUrl = URI(containerPath).absoluteTo(this.url).toString(); - epubContainer = this.unarchive(uri.href). + epubContainer = this.unarchive(_url). then(function() { return this.request(this.containerUrl); }.bind(this)); } // Find the path to the Package from the container - else if (!uri.extension) { + else if (!uri.suffix()) { this.containerUrl = this.url + containerPath; @@ -117,18 +117,17 @@ Book.prototype.open = function(_url){ return parse.container(containerXml); // Container has path to content }). then(function(paths){ - var packageUri = core.uri(paths.packagePath); - book.packageUrl = book.url + paths.packagePath; + var packageUri = URI(paths.packagePath); + book.packageUrl = packageUri.absoluteTo(book.url).toString(); book.encoding = paths.encoding; // Set Url relative to the content - if(packageUri.origin) { - book.baseUrl = packageUri.base; - } else if(window && book.url){ - location = core.uri(window.location.href); - book.baseUrl = core.resolveUrl(location.base, book.url + packageUri.directory); + if(packageUri.origin()) { + book.baseUrl = packageUri.origin() + "/" + packageUri.directory() + "/"; + } else if(window && !book.isArchivedUrl(uri)){ + book.baseUrl = packageUri.absoluteTo(window.location.href).directory() + "/"; } else { - book.baseUrl = packageUri.directory; + book.baseUrl = "/" + packageUri.directory() + "/"; } return book.request(book.packageUrl); @@ -186,7 +185,7 @@ Book.prototype.unpack = function(packageXml){ // MOVE TO RENDER // book.globalLayoutProperties = book.parseLayoutProperties(book.package.metadata); - book.cover = book.baseUrl + book.package.coverPath; + book.cover = URI(book.package.coverPath).absoluteTo(book.baseUrl).toString(); }; // Alias for book.spine.get @@ -203,6 +202,7 @@ Book.prototype.renderTo = function(element, options) { this.rendition = new Renderer(this, options); this.rendition.attachTo(element); + return this.rendition; }; @@ -230,21 +230,24 @@ Book.prototype.unarchive = function(bookUrl){ }; //-- Checks if url has a .epub or .zip extension, or is ArrayBuffer (of zip/epub) -Book.prototype.isArchived = function(bookUrl){ +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); - } + // if(typeof(bookUrl) === "object") { + // uri = bookUrl; + // } else { + // uri = core.uri(bookUrl); + // } + uri = URI(bookUrl); + extension = uri.suffix(); - if(uri.extension && (uri.extension == "epub" || uri.extension == "zip")){ + if(extension && (extension == "epub" || extension == "zip")){ return true; } @@ -253,8 +256,8 @@ Book.prototype.isArchived = function(bookUrl){ //-- Returns the cover Book.prototype.coverUrl = function(){ - var retrieved = this.loaded.cover - .then(function(url) { + var retrieved = this.loaded.cover. + then(function(url) { if(this.archive) { return this.archive.createUrl(this.cover); }else{ @@ -266,6 +269,7 @@ Book.prototype.coverUrl = function(){ return retrieved; }; + module.exports = Book; //-- Enable binding events to book diff --git a/src/continuous.js b/src/continuous.js index b76bdbd..c4f1fcf 100644 --- a/src/continuous.js +++ b/src/continuous.js @@ -78,12 +78,12 @@ Continuous.prototype.afterDisplayed = function(currView){ var prevView, nextView; if(index + 1 === this.views.length && next) { - nextView = new View(next, this.viewSettings); + nextView = this.createView(next); this.q.enqueue(this.append, nextView); } if(index === 0 && prev) { - prevView = new View(prev, this.viewSettings); + prevView = this.createView(prev, this.viewSettings); this.q.enqueue(this.prepend, prevView); } diff --git a/src/epubcfi.js b/src/epubcfi.js index d1689e4..50aebf1 100644 --- a/src/epubcfi.js +++ b/src/epubcfi.js @@ -1,3 +1,4 @@ +var URI = require('urijs'); var core = require('./core'); function EpubCFI(cfiStr){ @@ -359,9 +360,9 @@ EpubCFI.prototype.compare = function(cfiOne, cfiTwo) { }; EpubCFI.prototype.generateCfiFromHref = function(href, book) { - var uri = core.uri(href); - var path = uri.path; - var fragment = uri.fragment; + var uri = URI(href); + var path = uri.path(); + var fragment = uri.fragment(); var spinePos = book.spineIndexByURL[path]; var loaded; var deferred = new RSVP.defer(); diff --git a/src/hook.js b/src/hook.js index 78bb012..e43fec7 100644 --- a/src/hook.js +++ b/src/hook.js @@ -14,8 +14,17 @@ function Hook(context){ }; // Adds a function to be run before a hook completes -Hook.prototype.register = function(func){ - this.hooks.push(func); +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]); + } + } + } }; // Triggers a hook to run all functions @@ -38,4 +47,9 @@ Hook.prototype.trigger = function(){ return RSVP.all(promises); }; +// Adds a function to be run before a hook completes +Hook.prototype.list = function(){ + return this.hooks; +}; + module.exports = Hook; diff --git a/src/navigation.js b/src/navigation.js index b2a6e28..391926f 100644 --- a/src/navigation.js +++ b/src/navigation.js @@ -1,6 +1,7 @@ var core = require('./core'); var Parser = require('./parser'); var RSVP = require('rsvp'); +var URI = require('urijs'); function Navigation(_package, _request){ var navigation = this; @@ -13,7 +14,7 @@ function Navigation(_package, _request){ this.tocById = {}; if(_package.navPath) { - this.navUrl = _package.baseUrl + _package.navPath; + this.navUrl = URI(_package.navPath).absoluteTo(_package.baseUrl).toString(); this.nav = {}; this.nav.load = function(_request){ @@ -32,7 +33,7 @@ function Navigation(_package, _request){ } if(_package.ncxPath) { - this.ncxUrl = _package.baseUrl + _package.ncxPath; + this.ncxUrl = URI(_package.ncxPath).absoluteTo(_package.baseUrl).toString(); this.ncx = {}; this.ncx.load = function(_request){ diff --git a/src/parser.js b/src/parser.js index aea2f6e..0855973 100644 --- a/src/parser.js +++ b/src/parser.js @@ -1,3 +1,4 @@ +var URI = require('urijs'); var core = require('./core'); var EpubCFI = require('./epubcfi'); @@ -20,7 +21,7 @@ Parser.prototype.container = function(containerXml){ } fullpath = rootfile.getAttribute('full-path'); - folder = core.uri(fullpath).directory; + folder = URI(fullpath).directory(); encoding = containerXml.xmlEncoding; //-- Now that we have the path we can parse the contents @@ -310,8 +311,8 @@ Parser.prototype.navItem = function(item, spineIndexByURL, bookSpine){ content = item.querySelector("a, span"), src = content.getAttribute('href') || '', text = content.textContent || "", - split = src.split("#"), - baseUrl = split[0], + // split = src.split("#"), + // baseUrl = split[0], // spinePos = spineIndexByURL[baseUrl], // spineItem = bookSpine[spinePos], subitems = [], @@ -375,8 +376,8 @@ Parser.prototype.tocItem = function(item, spineIndexByURL, bookSpine){ src = content.getAttribute('src'), navLabel = item.querySelector("navLabel"), text = navLabel.textContent ? navLabel.textContent : "", - split = src.split("#"), - baseUrl = split[0], + // split = src.split("#"), + // baseUrl = split[0], // spinePos = spineIndexByURL[baseUrl], // spineItem = bookSpine[spinePos], subitems = [], diff --git a/src/rendition.js b/src/rendition.js index 0d397c5..cf1e100 100644 --- a/src/rendition.js +++ b/src/rendition.js @@ -1,4 +1,5 @@ var RSVP = require('rsvp'); +var URI = require('urijs'); var core = require('./core'); var replace = require('./replacements'); var Hook = require('./hook'); @@ -31,6 +32,7 @@ function Rendition(book, options) { //-- 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); @@ -49,6 +51,9 @@ function Rendition(book, options) { this.q.enqueue(this.parseLayoutProperties); + if(this.book.archive) { + this.replacements(); + } }; /** @@ -214,7 +219,8 @@ Rendition.prototype._display = function(target){ this.views.hide(); // Create a new view - view = new View(section, this.viewSettings); + // view = new View(section, this.viewSettings); + view = this.createView(section); // This will clear all previous views displayed = this.fill(view) @@ -421,6 +427,9 @@ Rendition.prototype.onResized = function(e) { }; Rendition.prototype.createView = function(section) { + // Transfer the existing hooks + section.hooks.serialize.register(this.hooks.serialize.list()); + return new View(section, this.viewSettings); }; @@ -624,6 +633,74 @@ Rendition.prototype.triggerViewEvent = function(e){ this.trigger(e.type, e); }; +Rendition.prototype.replacements = function(){ + return this.q.enqueue(function () { + 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; + } + }); + + // Only CSS + var css = items. + filter(function (item){ + if (item.type != "text/css") { + return true; + } + }); + + var urls = items. + map(function(item) { + // return this.book.baseUrl + item.href; + return item.href; + }.bind(this)); + + var processing = urls. + map(function(url) { + var absolute = URI(url).absoluteTo(this.book.baseUrl).toString(); + // Full url from archive base + return this.book.archive.createUrl(absolute); + }.bind(this)); + + return RSVP.all(processing). + then(function(replacementUrls) { + this.hooks.serialize.register(function(content, section) { + // resolve file urls + var fileUri = URI(section.url); + // console.log(section.url); + // var fileDirectory = fileUri.directory(); + // // // package urls + // var packageUri = URI(this.book.packageUrl); + // var packageDirectory = packageUri.directory(); + // + // // Need to compare the directory of the current file + // // with the directory of the package file. + + + urls = 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(content, urls, replacementUrls); + }.bind(this)); + }.bind(this)).catch(function(reason){ + console.error(reason); + }); + }.bind(this)); +}; //-- Enable binding events to Renderer RSVP.EventTarget.mixin(Rendition.prototype); diff --git a/src/replacements.js b/src/replacements.js index e219156..63c3a0f 100644 --- a/src/replacements.js +++ b/src/replacements.js @@ -1,34 +1,61 @@ +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"); + + if(!base) { + base = doc.createElement("base"); + } + + base.setAttribute("href", section.url); + head.insertBefore(base, head.firstChild); + +} + function links(view, renderer) { var links = view.document.querySelectorAll("a[href]"); var replaceLinks = function(link){ var href = link.getAttribute("href"); - var uri = new core.uri(href); + var linkUri = URI(href); + var absolute = linkUri.absoluteTo(view.section.url); + var relative = absolute.relativeTo(this.book.baseUrl).toString(); - - if(uri.protocol){ + 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; + } + */ - // relative = core.resolveUrl(directory, href); - // if(uri.fragment && !base) { - // link.onclick = function(){ - // renderer.fragment(href); - // return false; - // }; - // } else { - - //} - - if(href.indexOf("#") === 0) { + if(linkUri.fragment()) { // do nothing with fragment yet } else { link.onclick = function(){ - renderer.display(href); + renderer.display(relative); return false; }; } @@ -43,6 +70,14 @@ function links(view, renderer) { }; +function substitute(content, urls, replacements) { + urls.forEach(function(url, i){ + content = content.replace(new RegExp(url, 'g'), replacements[i]); + }); + return content; +} module.exports = { - 'links': links + 'base': base, + 'links': links, + 'substitute': substitute }; diff --git a/src/request.js b/src/request.js index 7864480..2684013 100644 --- a/src/request.js +++ b/src/request.js @@ -1,4 +1,5 @@ var RSVP = require('rsvp'); +var URI = require('urijs'); var core = require('./core'); function request(url, type, withCredentials, headers) { @@ -36,8 +37,8 @@ function request(url, type, withCredentials, headers) { // If type isn't set, determine it from the file extension if(!type) { - uri = core.uri(url); - type = uri.extension; + uri = URI(url); + type = uri.suffix(); } if(type == 'blob'){ diff --git a/src/section.js b/src/section.js index 997c264..a2b2a0d 100644 --- a/src/section.js +++ b/src/section.js @@ -2,8 +2,9 @@ var RSVP = require('rsvp'); var core = require('./core'); var EpubCFI = require('./epubcfi'); var Hook = require('./hook'); +var replacements = require('./replacements'); -function Section(item){ +function Section(item, hooks){ this.idref = item.idref; this.linear = item.linear; this.properties = item.properties; @@ -17,10 +18,11 @@ function Section(item){ this.cfiBase = item.cfiBase; this.hooks = {}; - this.hooks.replacements = new Hook(this); + this.hooks.serialize = new Hook(this); + this.hooks.content = new Hook(this); // Register replacements - this.hooks.replacements.register(this.replacements); + this.hooks.content.register(replacements.base); }; @@ -40,7 +42,7 @@ Section.prototype.load = function(_request){ this.document = xml; this.contents = xml.documentElement; - return this.hooks.replacements.trigger(this.document); + return this.hooks.content.trigger(this.document, this); }.bind(this)) .then(function(){ loading.resolve(this.contents); @@ -53,7 +55,7 @@ Section.prototype.load = function(_request){ return loaded; }; -Section.prototype.replacements = function(_document){ +Section.prototype.base = function(_document){ var task = new RSVP.defer(); var base = _document.createElement("base"); // TODO: check if exists var head; @@ -81,15 +83,23 @@ Section.prototype.beforeSectionLoad = function(){ 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 = new XMLSerializer(); - var output = serializer.serializeToString(contents); - rendering.resolve(output); - }) - .catch(function(error){ - rendering.reject(error); - }); + this.load(_request). + then(function(contents){ + var 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; }; diff --git a/src/spine.js b/src/spine.js index 219de82..3bc94c0 100644 --- a/src/spine.js +++ b/src/spine.js @@ -30,7 +30,6 @@ Spine.prototype.load = function(_package) { item.href = manifestItem.href; item.url = this.baseUrl + item.href; - if(manifestItem.properties.length){ item.properties.push.apply(item.properties, manifestItem.properties); } diff --git a/src/unarchive.js b/src/unarchive.js index 6b70459..7e51e9f 100644 --- a/src/unarchive.js +++ b/src/unarchive.js @@ -1,4 +1,5 @@ var RSVP = require('rsvp'); +var URI = require('urijs'); var core = require('./core'); var request = require('./request'); var mime = require('../libs/mime/mime'); @@ -45,8 +46,8 @@ Unarchive.prototype.request = function(url, type){ // If type isn't set, determine it from the file extension if(!type) { - uri = core.uri(url); - type = uri.extension; + uri = URI(url); + type = uri.suffix(); } if(type == 'blob'){ @@ -92,7 +93,7 @@ Unarchive.prototype.handleResponse = function(response, type){ }; Unarchive.prototype.getBlob = function(url, _mimeType){ - var decodededUrl = window.decodeURIComponent(url); + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash var entry = this.zip.file(decodededUrl); var mimeType; @@ -103,7 +104,7 @@ Unarchive.prototype.getBlob = function(url, _mimeType){ }; Unarchive.prototype.getText = function(url, encoding){ - var decodededUrl = window.decodeURIComponent(url); + var decodededUrl = window.decodeURIComponent(url.substr(1)); // Remove first slash var entry = this.zip.file(decodededUrl); if(entry) {