From ee6f5d6ffb5275002fd76ad4ab9a9b449ad4c754 Mon Sep 17 00:00:00 2001 From: Mahdi Dibaiee Date: Mon, 31 Aug 2015 11:19:22 +0430 Subject: [PATCH] feat setup: Setup Redux, Immutable.js and React feat FileList: Implement File List + changedir action --- Gruntfile.js | 54 +- build/img/icons/icon.svg | 106 + build/img/icons/icon128x128.png | Bin 0 -> 6760 bytes build/img/icons/icon16x16.png | Bin 0 -> 804 bytes build/img/icons/icon48x48.png | Bin 0 -> 2688 bytes build/img/icons/icon60x60.png | Bin 0 -> 3344 bytes build/index.html | 13 + build/js/libs/l10n.js | 1571 ++++ {src/data => build/locales}/en-US.properties | 2 +- build/locales/locales.ini | 1 + build/main.js | 8328 ++++++++++++++---- manifest.webapp => build/manifest.webapp | 9 +- design/userinterface.sketch | Bin 0 -> 360448 bytes package.json | 2 + src/data/es.properties | 3 - src/data/locales.ini | 5 - src/index.html | 13 + src/js/actions/changedir.js | 8 + src/js/actions/list-files.js | 8 + src/js/actions/types.js | 9 + src/js/api/files.js | 13 + src/js/components/file-list.js | 38 + src/js/components/file.js | 20 + src/js/components/root.js | 19 +- src/js/main.js | 9 +- src/js/reducers/all.js | 10 + src/js/reducers/cwd.js | 16 + src/js/reducers/files.js | 10 + src/js/store.js | 14 + src/less/main.less | 0 src/less/variables.less | 1 + src/manifest.webapp | 31 + 32 files changed, 8558 insertions(+), 1755 deletions(-) create mode 100644 build/img/icons/icon.svg create mode 100644 build/img/icons/icon128x128.png create mode 100644 build/img/icons/icon16x16.png create mode 100644 build/img/icons/icon48x48.png create mode 100644 build/img/icons/icon60x60.png create mode 100644 build/index.html create mode 100644 build/js/libs/l10n.js rename {src/data => build/locales}/en-US.properties (74%) create mode 100644 build/locales/locales.ini rename manifest.webapp => build/manifest.webapp (62%) create mode 100644 design/userinterface.sketch delete mode 100644 src/data/es.properties delete mode 100644 src/data/locales.ini create mode 100644 src/index.html create mode 100644 src/js/actions/changedir.js create mode 100644 src/js/actions/list-files.js create mode 100644 src/js/actions/types.js create mode 100644 src/js/api/files.js create mode 100644 src/js/components/file-list.js create mode 100644 src/js/components/file.js create mode 100644 src/js/reducers/all.js create mode 100644 src/js/reducers/cwd.js create mode 100644 src/js/reducers/files.js create mode 100644 src/js/store.js create mode 100644 src/less/main.less create mode 100644 src/less/variables.less create mode 100644 src/manifest.webapp diff --git a/Gruntfile.js b/Gruntfile.js index 07ce51b..87d26a3 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -5,10 +5,17 @@ module.exports = function(grunt) { browserify: { dev: { files: { - 'build/main.js': 'src/js/**/*' + 'build/main.js': ['src/js/**/*', '!src/js/libs/**'] }, options: { - transform: ['babelify'], + alias: { + store: './src/js/store.js' + }, + transform: [['babelify', { + optional: ['es7.asyncFunctions', 'asyncToGenerator', + 'es7.decorators'], + blacklist: [] + }]], plugin: [ [ 'remapify', [ @@ -16,6 +23,21 @@ module.exports = function(grunt) { src: '**/*.js', expose: 'components', cwd: __dirname + '/src/js/components/' + }, + { + src: '**/*.js', + expose: 'actions', + cwd: __dirname + '/src/js/actions' + }, + { + src: '**/*.js', + expose: 'reducers', + cwd: __dirname + '/src/js/reducers' + }, + { + src: '**/*.js', + expose: 'api', + cwd: __dirname + '/src/js/api' } ] ] @@ -48,14 +70,34 @@ module.exports = function(grunt) { }] } }, + copy: { + assets: { + files: [{ + expand: true, + cwd: 'src', + dest: 'build', + src: ['index.html', 'manifest.webapp', + 'fonts/**', 'img/**', 'js/libs/**'] + }] + } + }, watch: { styles: { - files: ['less/**/*.less'], - tasks: ['less'] + files: ['src/less/**/*.less'], + tasks: ['less:dev'] + }, + scripts: { + files: ['src/js/**/*'], + tasks: ['browserify:dev'] + }, + assets: { + files: ['src/index.html', 'src/manifest.webapp', + 'src/fonts/**', 'src/img/**', 'src/data/**'], + tasks: ['copy'] } } }); - grunt.registerTask('default', ['browserify:dev', 'less:dev']); - grunt.registerTask('production', ['browserify:prod', 'less:prod']); + grunt.registerTask('default', ['browserify:dev', 'less:dev', 'copy']); + grunt.registerTask('production', ['browserify:prod', 'less:prod', 'copy']); }; diff --git a/build/img/icons/icon.svg b/build/img/icons/icon.svg new file mode 100644 index 0000000..834968c --- /dev/null +++ b/build/img/icons/icon.svg @@ -0,0 +1,106 @@ + + + + + + image/svg+xml + + + + + + + empty + Created with Sketch. + + + + + + + + + + + + diff --git a/build/img/icons/icon128x128.png b/build/img/icons/icon128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..7c672c53cdac204359a92326d3fb23c07d589a4c GIT binary patch literal 6760 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 literal 0 HcmV?d00001 diff --git a/build/img/icons/icon48x48.png b/build/img/icons/icon48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..451655bd2178cbafb08a8c52ae6f4879580503f5 GIT binary patch literal 2688 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 aYW+VFoWwRk?B9O?0000 + + + + Hawk + + + +

+ + + + diff --git a/build/js/libs/l10n.js b/build/js/libs/l10n.js new file mode 100644 index 0000000..cfc5c51 --- /dev/null +++ b/build/js/libs/l10n.js @@ -0,0 +1,1571 @@ +// This is the Gaia version of l20n: https://github.com/l20n/l20n.js +// l20n is Apache 2.0 licensed: https://github.com/l20n/l20n.js/blob/master/LICENSE +// You can find the latest build for Gaia here: https://github.com/mozilla-b2g/gaia/blob/master/shared/js/l10n.js +(function(window, undefined) { + 'use strict'; + + /* jshint validthis:true */ + function L10nError(message, id, loc) { + this.name = 'L10nError'; + this.message = message; + this.id = id; + this.loc = loc; + } + L10nError.prototype = Object.create(Error.prototype); + L10nError.prototype.constructor = L10nError; + + + /* jshint browser:true */ + + var io = { + load: function load(url, callback, sync) { + var xhr = new XMLHttpRequest(); + + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain'); + } + + xhr.open('GET', url, !sync); + + xhr.addEventListener('load', function io_load(e) { + if (e.target.status === 200 || e.target.status === 0) { + callback(null, e.target.responseText); + } else { + callback(new L10nError('Not found: ' + url)); + } + }); + xhr.addEventListener('error', callback); + xhr.addEventListener('timeout', callback); + + // the app: protocol throws on 404, see https://bugzil.la/827243 + try { + xhr.send(null); + } catch (e) { + callback(new L10nError('Not found: ' + url)); + } + }, + + loadJSON: function loadJSON(url, callback) { + var xhr = new XMLHttpRequest(); + + if (xhr.overrideMimeType) { + xhr.overrideMimeType('application/json'); + } + + xhr.open('GET', url); + + xhr.responseType = 'json'; + xhr.addEventListener('load', function io_loadjson(e) { + if (e.target.status === 200 || e.target.status === 0) { + callback(null, e.target.response); + } else { + callback(new L10nError('Not found: ' + url)); + } + }); + xhr.addEventListener('error', callback); + xhr.addEventListener('timeout', callback); + + // the app: protocol throws on 404, see https://bugzil.la/827243 + try { + xhr.send(null); + } catch (e) { + callback(new L10nError('Not found: ' + url)); + } + } + }; + + function EventEmitter() {} + + EventEmitter.prototype.emit = function ee_emit() { + if (!this._listeners) { + return; + } + + var args = Array.prototype.slice.call(arguments); + var type = args.shift(); + if (!this._listeners[type]) { + return; + } + + var typeListeners = this._listeners[type].slice(); + for (var i = 0; i < typeListeners.length; i++) { + typeListeners[i].apply(this, args); + } + }; + + EventEmitter.prototype.addEventListener = function ee_add(type, listener) { + if (!this._listeners) { + this._listeners = {}; + } + if (!(type in this._listeners)) { + this._listeners[type] = []; + } + this._listeners[type].push(listener); + }; + + EventEmitter.prototype.removeEventListener = function ee_rm(type, listener) { + if (!this._listeners) { + return; + } + + var typeListeners = this._listeners[type]; + var pos = typeListeners.indexOf(listener); + if (pos === -1) { + return; + } + + typeListeners.splice(pos, 1); + }; + + + function getPluralRule(lang) { + var locales2rules = { + 'af': 3, + 'ak': 4, + 'am': 4, + 'ar': 1, + 'asa': 3, + 'az': 0, + 'be': 11, + 'bem': 3, + 'bez': 3, + 'bg': 3, + 'bh': 4, + 'bm': 0, + 'bn': 3, + 'bo': 0, + 'br': 20, + 'brx': 3, + 'bs': 11, + 'ca': 3, + 'cgg': 3, + 'chr': 3, + 'cs': 12, + 'cy': 17, + 'da': 3, + 'de': 3, + 'dv': 3, + 'dz': 0, + 'ee': 3, + 'el': 3, + 'en': 3, + 'eo': 3, + 'es': 3, + 'et': 3, + 'eu': 3, + 'fa': 0, + 'ff': 5, + 'fi': 3, + 'fil': 4, + 'fo': 3, + 'fr': 5, + 'fur': 3, + 'fy': 3, + 'ga': 8, + 'gd': 24, + 'gl': 3, + 'gsw': 3, + 'gu': 3, + 'guw': 4, + 'gv': 23, + 'ha': 3, + 'haw': 3, + 'he': 2, + 'hi': 4, + 'hr': 11, + 'hu': 0, + 'id': 0, + 'ig': 0, + 'ii': 0, + 'is': 3, + 'it': 3, + 'iu': 7, + 'ja': 0, + 'jmc': 3, + 'jv': 0, + 'ka': 0, + 'kab': 5, + 'kaj': 3, + 'kcg': 3, + 'kde': 0, + 'kea': 0, + 'kk': 3, + 'kl': 3, + 'km': 0, + 'kn': 0, + 'ko': 0, + 'ksb': 3, + 'ksh': 21, + 'ku': 3, + 'kw': 7, + 'lag': 18, + 'lb': 3, + 'lg': 3, + 'ln': 4, + 'lo': 0, + 'lt': 10, + 'lv': 6, + 'mas': 3, + 'mg': 4, + 'mk': 16, + 'ml': 3, + 'mn': 3, + 'mo': 9, + 'mr': 3, + 'ms': 0, + 'mt': 15, + 'my': 0, + 'nah': 3, + 'naq': 7, + 'nb': 3, + 'nd': 3, + 'ne': 3, + 'nl': 3, + 'nn': 3, + 'no': 3, + 'nr': 3, + 'nso': 4, + 'ny': 3, + 'nyn': 3, + 'om': 3, + 'or': 3, + 'pa': 3, + 'pap': 3, + 'pl': 13, + 'ps': 3, + 'pt': 3, + 'rm': 3, + 'ro': 9, + 'rof': 3, + 'ru': 11, + 'rwk': 3, + 'sah': 0, + 'saq': 3, + 'se': 7, + 'seh': 3, + 'ses': 0, + 'sg': 0, + 'sh': 11, + 'shi': 19, + 'sk': 12, + 'sl': 14, + 'sma': 7, + 'smi': 7, + 'smj': 7, + 'smn': 7, + 'sms': 7, + 'sn': 3, + 'so': 3, + 'sq': 3, + 'sr': 11, + 'ss': 3, + 'ssy': 3, + 'st': 3, + 'sv': 3, + 'sw': 3, + 'syr': 3, + 'ta': 3, + 'te': 3, + 'teo': 3, + 'th': 0, + 'ti': 4, + 'tig': 3, + 'tk': 3, + 'tl': 4, + 'tn': 3, + 'to': 0, + 'tr': 0, + 'ts': 3, + 'tzm': 22, + 'uk': 11, + 'ur': 3, + 've': 3, + 'vi': 0, + 'vun': 3, + 'wa': 4, + 'wae': 3, + 'wo': 0, + 'xh': 3, + 'xog': 3, + 'yo': 0, + 'zh': 0, + 'zu': 3 + }; + + // utility functions for plural rules methods + function isIn(n, list) { + return list.indexOf(n) !== -1; + } + function isBetween(n, start, end) { + return start <= n && n <= end; + } + + // list of all plural rules methods: + // map an integer to the plural form name to use + var pluralRules = { + '0': function() { + return 'other'; + }, + '1': function(n) { + if ((isBetween((n % 100), 3, 10))) { + return 'few'; + } + if (n === 0) { + return 'zero'; + } + if ((isBetween((n % 100), 11, 99))) { + return 'many'; + } + if (n === 2) { + return 'two'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '2': function(n) { + if (n !== 0 && (n % 10) === 0) { + return 'many'; + } + if (n === 2) { + return 'two'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '3': function(n) { + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '4': function(n) { + if ((isBetween(n, 0, 1))) { + return 'one'; + } + return 'other'; + }, + '5': function(n) { + if ((isBetween(n, 0, 2)) && n !== 2) { + return 'one'; + } + return 'other'; + }, + '6': function(n) { + if (n === 0) { + return 'zero'; + } + if ((n % 10) === 1 && (n % 100) !== 11) { + return 'one'; + } + return 'other'; + }, + '7': function(n) { + if (n === 2) { + return 'two'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '8': function(n) { + if ((isBetween(n, 3, 6))) { + return 'few'; + } + if ((isBetween(n, 7, 10))) { + return 'many'; + } + if (n === 2) { + return 'two'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '9': function(n) { + if (n === 0 || n !== 1 && (isBetween((n % 100), 1, 19))) { + return 'few'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '10': function(n) { + if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19))) { + return 'few'; + } + if ((n % 10) === 1 && !(isBetween((n % 100), 11, 19))) { + return 'one'; + } + return 'other'; + }, + '11': function(n) { + if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14))) { + return 'few'; + } + if ((n % 10) === 0 || + (isBetween((n % 10), 5, 9)) || + (isBetween((n % 100), 11, 14))) { + return 'many'; + } + if ((n % 10) === 1 && (n % 100) !== 11) { + return 'one'; + } + return 'other'; + }, + '12': function(n) { + if ((isBetween(n, 2, 4))) { + return 'few'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '13': function(n) { + if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14))) { + return 'few'; + } + if (n !== 1 && (isBetween((n % 10), 0, 1)) || + (isBetween((n % 10), 5, 9)) || + (isBetween((n % 100), 12, 14))) { + return 'many'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '14': function(n) { + if ((isBetween((n % 100), 3, 4))) { + return 'few'; + } + if ((n % 100) === 2) { + return 'two'; + } + if ((n % 100) === 1) { + return 'one'; + } + return 'other'; + }, + '15': function(n) { + if (n === 0 || (isBetween((n % 100), 2, 10))) { + return 'few'; + } + if ((isBetween((n % 100), 11, 19))) { + return 'many'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '16': function(n) { + if ((n % 10) === 1 && n !== 11) { + return 'one'; + } + return 'other'; + }, + '17': function(n) { + if (n === 3) { + return 'few'; + } + if (n === 0) { + return 'zero'; + } + if (n === 6) { + return 'many'; + } + if (n === 2) { + return 'two'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '18': function(n) { + if (n === 0) { + return 'zero'; + } + if ((isBetween(n, 0, 2)) && n !== 0 && n !== 2) { + return 'one'; + } + return 'other'; + }, + '19': function(n) { + if ((isBetween(n, 2, 10))) { + return 'few'; + } + if ((isBetween(n, 0, 1))) { + return 'one'; + } + return 'other'; + }, + '20': function(n) { + if ((isBetween((n % 10), 3, 4) || ((n % 10) === 9)) && !( + isBetween((n % 100), 10, 19) || + isBetween((n % 100), 70, 79) || + isBetween((n % 100), 90, 99) + )) { + return 'few'; + } + if ((n % 1000000) === 0 && n !== 0) { + return 'many'; + } + if ((n % 10) === 2 && !isIn((n % 100), [12, 72, 92])) { + return 'two'; + } + if ((n % 10) === 1 && !isIn((n % 100), [11, 71, 91])) { + return 'one'; + } + return 'other'; + }, + '21': function(n) { + if (n === 0) { + return 'zero'; + } + if (n === 1) { + return 'one'; + } + return 'other'; + }, + '22': function(n) { + if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99))) { + return 'one'; + } + return 'other'; + }, + '23': function(n) { + if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0) { + return 'one'; + } + return 'other'; + }, + '24': function(n) { + if ((isBetween(n, 3, 10) || isBetween(n, 13, 19))) { + return 'few'; + } + if (isIn(n, [2, 12])) { + return 'two'; + } + if (isIn(n, [1, 11])) { + return 'one'; + } + return 'other'; + } + }; + + // return a function that gives the plural form name for a given integer + var index = locales2rules[lang.replace(/-.*$/, '')]; + if (!(index in pluralRules)) { + return function() { return 'other'; }; + } + return pluralRules[index]; + } + + + + + var nestedProps = ['style', 'dataset']; + + var parsePatterns; + + function parse(ctx, source) { + var ast = {}; + + if (!parsePatterns) { + parsePatterns = { + comment: /^\s*#|^\s*$/, + entity: /^([^=\s]+)\s*=\s*(.+)$/, + multiline: /[^\\]\\$/, + macro: /\{\[\s*(\w+)\(([^\)]*)\)\s*\]\}/i, + unicode: /\\u([0-9a-fA-F]{1,4})/g, + entries: /[\r\n]+/, + controlChars: /\\([\\\n\r\t\b\f\{\}\"\'])/g + }; + } + + var entries = source.split(parsePatterns.entries); + for (var i = 0; i < entries.length; i++) { + var line = entries[i]; + + if (parsePatterns.comment.test(line)) { + continue; + } + + while (parsePatterns.multiline.test(line) && i < entries.length) { + line = line.slice(0, -1) + entries[++i].trim(); + } + + var entityMatch = line.match(parsePatterns.entity); + if (entityMatch) { + try { + parseEntity(entityMatch[1], entityMatch[2], ast); + } catch (e) { + if (ctx) { + ctx._emitter.emit('error', e); + } else { + throw e; + } + } + } + } + return ast; + } + + function setEntityValue(id, attr, key, value, ast) { + var obj = ast; + var prop = id; + + if (attr) { + if (!(id in obj)) { + obj[id] = {}; + } + if (typeof(obj[id]) === 'string') { + obj[id] = {'_': obj[id]}; + } + obj = obj[id]; + prop = attr; + } + + if (!key) { + obj[prop] = value; + return; + } + + if (!(prop in obj)) { + obj[prop] = {'_': {}}; + } else if (typeof(obj[prop]) === 'string') { + obj[prop] = {'_index': parseMacro(obj[prop]), '_': {}}; + } + obj[prop]._[key] = value; + } + + function parseEntity(id, value, ast) { + var name, key; + + var pos = id.indexOf('['); + if (pos !== -1) { + name = id.substr(0, pos); + key = id.substring(pos + 1, id.length - 1); + } else { + name = id; + key = null; + } + + var nameElements = name.split('.'); + + var attr; + if (nameElements.length > 1) { + var attrElements = []; + attrElements.push(nameElements.pop()); + if (nameElements.length > 1) { + // Usually the last dot separates an attribute from an id + // + // In case when there are more than one dot in the id + // and the second to last item is "style" or "dataset" then the last two + // items are becoming the attribute. + // + // ex. + // id.style.color = foo => + // + // id: + // style.color: foo + // + // id.other.color = foo => + // + // id.other: + // color: foo + if (nestedProps.indexOf(nameElements[nameElements.length - 1]) !== -1) { + attrElements.push(nameElements.pop()); + } + } + name = nameElements.join('.'); + attr = attrElements.reverse().join('.'); + } else { + attr = null; + } + + setEntityValue(name, attr, key, unescapeString(value), ast); + } + + function unescapeControlCharacters(str) { + return str.replace(parsePatterns.controlChars, '$1'); + } + + function unescapeUnicode(str) { + return str.replace(parsePatterns.unicode, function(match, token) { + return unescape('%u' + '0000'.slice(token.length) + token); + }); + } + + function unescapeString(str) { + if (str.lastIndexOf('\\') !== -1) { + str = unescapeControlCharacters(str); + } + return unescapeUnicode(str); + } + + function parseMacro(str) { + var match = str.match(parsePatterns.macro); + if (!match) { + throw new L10nError('Malformed macro'); + } + return [match[1], match[2]]; + } + + + + var MAX_PLACEABLE_LENGTH = 2500; + var MAX_PLACEABLES = 100; + var rePlaceables = /\{\{\s*(.+?)\s*\}\}/g; + + function Entity(id, node, env) { + this.id = id; + this.env = env; + // the dirty guard prevents cyclic or recursive references from other + // Entities; see Entity.prototype.resolve + this.dirty = false; + if (typeof node === 'string') { + this.value = node; + } else { + // it's either a hash or it has attrs, or both + for (var key in node) { + if (node.hasOwnProperty(key) && key[0] !== '_') { + if (!this.attributes) { + this.attributes = {}; + } + this.attributes[key] = new Entity(this.id + '.' + key, node[key], + env); + } + } + this.value = node._ || null; + this.index = node._index; + } + } + + Entity.prototype.resolve = function E_resolve(ctxdata) { + if (this.dirty) { + return undefined; + } + + this.dirty = true; + var val; + // if resolve fails, we want the exception to bubble up and stop the whole + // resolving process; however, we still need to clean up the dirty flag + try { + val = resolve(ctxdata, this.env, this.value, this.index); + } finally { + this.dirty = false; + } + return val; + }; + + Entity.prototype.toString = function E_toString(ctxdata) { + try { + return this.resolve(ctxdata); + } catch (e) { + return undefined; + } + }; + + Entity.prototype.valueOf = function E_valueOf(ctxdata) { + if (!this.attributes) { + return this.toString(ctxdata); + } + + var entity = { + value: this.toString(ctxdata), + attributes: {} + }; + + for (var key in this.attributes) { + if (this.attributes.hasOwnProperty(key)) { + entity.attributes[key] = this.attributes[key].toString(ctxdata); + } + } + + return entity; + }; + + function subPlaceable(ctxdata, env, match, id) { + if (ctxdata && ctxdata.hasOwnProperty(id) && + (typeof ctxdata[id] === 'string' || + (typeof ctxdata[id] === 'number' && !isNaN(ctxdata[id])))) { + return ctxdata[id]; + } + + if (env.hasOwnProperty(id)) { + if (!(env[id] instanceof Entity)) { + env[id] = new Entity(id, env[id], env); + } + var value = env[id].resolve(ctxdata); + if (typeof value === 'string') { + // prevent Billion Laughs attacks + if (value.length >= MAX_PLACEABLE_LENGTH) { + throw new L10nError('Too many characters in placeable (' + + value.length + ', max allowed is ' + + MAX_PLACEABLE_LENGTH + ')'); + } + return value; + } + } + return match; + } + + function interpolate(ctxdata, env, str) { + var placeablesCount = 0; + var value = str.replace(rePlaceables, function(match, id) { + // prevent Quadratic Blowup attacks + if (placeablesCount++ >= MAX_PLACEABLES) { + throw new L10nError('Too many placeables (' + placeablesCount + + ', max allowed is ' + MAX_PLACEABLES + ')'); + } + return subPlaceable(ctxdata, env, match, id); + }); + placeablesCount = 0; + return value; + } + + function resolve(ctxdata, env, expr, index) { + if (typeof expr === 'string') { + return interpolate(ctxdata, env, expr); + } + + if (typeof expr === 'boolean' || + typeof expr === 'number' || + !expr) { + return expr; + } + + // otherwise, it's a dict + + if (index && ctxdata && ctxdata.hasOwnProperty(index[1])) { + var argValue = ctxdata[index[1]]; + + // special cases for zero, one, two if they are defined on the hash + if (argValue === 0 && 'zero' in expr) { + return resolve(ctxdata, env, expr.zero); + } + if (argValue === 1 && 'one' in expr) { + return resolve(ctxdata, env, expr.one); + } + if (argValue === 2 && 'two' in expr) { + return resolve(ctxdata, env, expr.two); + } + + var selector = env.__plural(argValue); + if (expr.hasOwnProperty(selector)) { + return resolve(ctxdata, env, expr[selector]); + } + } + + // if there was no index or no selector was found, try 'other' + if ('other' in expr) { + return resolve(ctxdata, env, expr.other); + } + + return undefined; + } + + function compile(env, ast) { + env = env || {}; + for (var id in ast) { + if (ast.hasOwnProperty(id)) { + env[id] = new Entity(id, ast[id], env); + } + } + return env; + } + + + + function Locale(id, ctx) { + this.id = id; + this.ctx = ctx; + this.isReady = false; + this.entries = { + __plural: getPluralRule(id) + }; + } + + Locale.prototype.getEntry = function L_getEntry(id) { + /* jshint -W093 */ + + var entries = this.entries; + + if (!entries.hasOwnProperty(id)) { + return undefined; + } + + if (entries[id] instanceof Entity) { + return entries[id]; + } + + return entries[id] = new Entity(id, entries[id], entries); + }; + + Locale.prototype.build = function L_build(callback) { + var sync = !callback; + var ctx = this.ctx; + var self = this; + + var l10nLoads = ctx.resLinks.length; + + function onL10nLoaded(err) { + if (err) { + ctx._emitter.emit('error', err); + } + if (--l10nLoads <= 0) { + self.isReady = true; + if (callback) { + callback(); + } + } + } + + if (l10nLoads === 0) { + onL10nLoaded(); + return; + } + + function onJSONLoaded(err, json) { + if (!err && json) { + self.addAST(json); + } + onL10nLoaded(err); + } + + function onPropLoaded(err, source) { + if (!err && source) { + var ast = parse(ctx, source); + self.addAST(ast); + } + onL10nLoaded(err); + } + + + for (var i = 0; i < ctx.resLinks.length; i++) { + var path = ctx.resLinks[i].replace('{{locale}}', this.id); + var type = path.substr(path.lastIndexOf('.') + 1); + + switch (type) { + case 'json': + io.loadJSON(path, onJSONLoaded, sync); + break; + case 'properties': + io.load(path, onPropLoaded, sync); + break; + } + } + }; + + Locale.prototype.addAST = function(ast) { + for (var id in ast) { + if (ast.hasOwnProperty(id)) { + this.entries[id] = ast[id]; + } + } + }; + + Locale.prototype.getEntity = function(id, ctxdata) { + var entry = this.getEntry(id); + + if (!entry) { + return null; + } + return entry.valueOf(ctxdata); + }; + + + + function Context(id) { + + this.id = id; + this.isReady = false; + this.isLoading = false; + + this.supportedLocales = []; + this.resLinks = []; + this.locales = {}; + + this._emitter = new EventEmitter(); + + + // Getting translations + + function getWithFallback(id) { + /* jshint -W084 */ + + if (!this.isReady) { + throw new L10nError('Context not ready'); + } + + var cur = 0; + var loc; + var locale; + while (loc = this.supportedLocales[cur]) { + locale = this.getLocale(loc); + if (!locale.isReady) { + // build without callback, synchronously + locale.build(null); + } + var entry = locale.getEntry(id); + if (entry === undefined) { + cur++; + warning.call(this, new L10nError(id + ' not found in ' + loc, id, + loc)); + continue; + } + return entry; + } + + error.call(this, new L10nError(id + ' not found', id)); + return null; + } + + this.get = function get(id, ctxdata) { + var entry = getWithFallback.call(this, id); + if (entry === null) { + return ''; + } + + return entry.toString(ctxdata) || ''; + }; + + this.getEntity = function getEntity(id, ctxdata) { + var entry = getWithFallback.call(this, id); + if (entry === null) { + return null; + } + + return entry.valueOf(ctxdata); + }; + + + // Helpers + + this.getLocale = function getLocale(code) { + /* jshint -W093 */ + + var locales = this.locales; + if (locales[code]) { + return locales[code]; + } + + return locales[code] = new Locale(code, this); + }; + + + // Getting ready + + function negotiate(available, requested, defaultLocale) { + if (available.indexOf(requested[0]) === -1 || + requested[0] === defaultLocale) { + return [defaultLocale]; + } else { + return [requested[0], defaultLocale]; + } + } + + function freeze(supported) { + var locale = this.getLocale(supported[0]); + if (locale.isReady) { + setReady.call(this, supported); + } else { + locale.build(setReady.bind(this, supported)); + } + } + + function setReady(supported) { + this.supportedLocales = supported; + this.isReady = true; + this._emitter.emit('ready'); + } + + this.requestLocales = function requestLocales() { + if (this.isLoading && !this.isReady) { + throw new L10nError('Context not ready'); + } + + this.isLoading = true; + var requested = Array.prototype.slice.call(arguments); + + var supported = negotiate(requested.concat('en-US'), requested, 'en-US'); + freeze.call(this, supported); + }; + + + // Events + + this.addEventListener = function addEventListener(type, listener) { + this._emitter.addEventListener(type, listener); + }; + + this.removeEventListener = function removeEventListener(type, listener) { + this._emitter.removeEventListener(type, listener); + }; + + this.ready = function ready(callback) { + if (this.isReady) { + setTimeout(callback); + } + this.addEventListener('ready', callback); + }; + + this.once = function once(callback) { + /* jshint -W068 */ + if (this.isReady) { + setTimeout(callback); + return; + } + + var callAndRemove = (function() { + this.removeEventListener('ready', callAndRemove); + callback(); + }).bind(this); + this.addEventListener('ready', callAndRemove); + }; + + + // Errors + + function warning(e) { + this._emitter.emit('warning', e); + return e; + } + + function error(e) { + this._emitter.emit('error', e); + return e; + } + } + + + /* jshint -W104 */ + + var DEBUG = false; + var isPretranslated = false; + var rtlList = ['ar', 'he', 'fa', 'ps', 'qps-plocm', 'ur']; + + // Public API + + navigator.mozL10n = { + ctx: new Context(), + get: function get(id, ctxdata) { + return navigator.mozL10n.ctx.get(id, ctxdata); + }, + localize: function localize(element, id, args) { + return localizeElement.call(navigator.mozL10n, element, id, args); + }, + translate: function translate(element) { + return translateFragment.call(navigator.mozL10n, element); + }, + ready: function ready(callback) { + return navigator.mozL10n.ctx.ready(callback); + }, + once: function once(callback) { + return navigator.mozL10n.ctx.once(callback); + }, + get readyState() { + return navigator.mozL10n.ctx.isReady ? 'complete' : 'loading'; + }, + language: { + set code(lang) { + navigator.mozL10n.ctx.requestLocales(lang); + }, + get code() { + return navigator.mozL10n.ctx.supportedLocales[0]; + }, + get direction() { + return getDirection(navigator.mozL10n.ctx.supportedLocales[0]); + } + }, + _getInternalAPI: function() { + return { + Error: L10nError, + Context: Context, + Locale: Locale, + Entity: Entity, + getPluralRule: getPluralRule, + rePlaceables: rePlaceables, + getTranslatableChildren: getTranslatableChildren, + getL10nAttributes: getL10nAttributes, + loadINI: loadINI, + fireLocalizedEvent: fireLocalizedEvent, + parse: parse, + compile: compile + }; + } + }; + + navigator.mozL10n.ctx.ready(onReady.bind(navigator.mozL10n)); + + if (DEBUG) { + navigator.mozL10n.ctx.addEventListener('error', console.error); + navigator.mozL10n.ctx.addEventListener('warning', console.warn); + } + + function getDirection(lang) { + return (rtlList.indexOf(lang) >= 0) ? 'rtl' : 'ltr'; + } + + var readyStates = { + 'loading': 0, + 'interactive': 1, + 'complete': 2 + }; + + function waitFor(state, callback) { + state = readyStates[state]; + if (readyStates[document.readyState] >= state) { + callback(); + return; + } + + document.addEventListener('readystatechange', function l10n_onrsc() { + if (readyStates[document.readyState] >= state) { + document.removeEventListener('readystatechange', l10n_onrsc); + callback(); + } + }); + } + + if (window.document) { + isPretranslated = (document.documentElement.lang === navigator.language); + + // this is a special case for netError bug; see https://bugzil.la/444165 + if (document.documentElement.dataset.noCompleteBug) { + pretranslate.call(navigator.mozL10n); + return; + } + + + if (isPretranslated) { + waitFor('interactive', function() { + window.setTimeout(initResources.bind(navigator.mozL10n)); + }); + } else { + if (document.readyState === 'complete') { + window.setTimeout(initResources.bind(navigator.mozL10n)); + } else { + waitFor('interactive', pretranslate.bind(navigator.mozL10n)); + } + } + + } + + function pretranslate() { + /* jshint -W068 */ + if (inlineLocalization.call(this)) { + waitFor('interactive', (function() { + window.setTimeout(initResources.bind(this)); + }).bind(this)); + } else { + initResources.call(this); + } + } + + function inlineLocalization() { + var script = document.documentElement + .querySelector('script[type="application/l10n"]' + + '[lang="' + navigator.language + '"]'); + if (!script) { + return false; + } + + var locale = this.ctx.getLocale(navigator.language); + // the inline localization is happenning very early, when the ctx is not + // yet ready and when the resources haven't been downloaded yet; add the + // inlined JSON directly to the current locale + locale.addAST(JSON.parse(script.innerHTML)); + // localize the visible DOM + var l10n = { + ctx: locale, + language: { + code: locale.id, + direction: getDirection(locale.id) + } + }; + translateFragment.call(l10n); + // the visible DOM is now pretranslated + isPretranslated = true; + return true; + } + + function initResources() { + var resLinks = document.head + .querySelectorAll('link[type="application/l10n"]'); + var iniLinks = []; + var i; + + for (i = 0; i < resLinks.length; i++) { + var link = resLinks[i]; + var url = link.getAttribute('href'); + var type = url.substr(url.lastIndexOf('.') + 1); + if (type === 'ini') { + iniLinks.push(url); + } + this.ctx.resLinks.push(url); + } + + var iniLoads = iniLinks.length; + if (iniLoads === 0) { + initLocale.call(this); + return; + } + + function onIniLoaded(err) { + if (err) { + this.ctx._emitter.emit('error', err); + } + if (--iniLoads === 0) { + initLocale.call(this); + } + } + + for (i = 0; i < iniLinks.length; i++) { + loadINI.call(this, iniLinks[i], onIniLoaded.bind(this)); + } + } + + function initLocale() { + this.ctx.requestLocales(navigator.language); + window.addEventListener('languagechange', function l10n_langchange() { + navigator.mozL10n.language.code = navigator.language; + }); + } + + function onReady() { + if (!isPretranslated) { + this.translate(); + } + isPretranslated = false; + + fireLocalizedEvent.call(this); + } + + function fireLocalizedEvent() { + var event = new CustomEvent('localized', { + 'bubbles': false, + 'cancelable': false, + 'detail': { + 'language': this.ctx.supportedLocales[0] + } + }); + window.dispatchEvent(event); + } + + /* jshint -W104 */ + + function loadINI(url, callback) { + var ctx = this.ctx; + io.load(url, function(err, source) { + var pos = ctx.resLinks.indexOf(url); + + if (err) { + // remove the ini link from resLinks + ctx.resLinks.splice(pos, 1); + return callback(err); + } + + if (!source) { + ctx.resLinks.splice(pos, 1); + return callback(new Error('Empty file: ' + url)); + } + + var patterns = parseINI(source, url).resources.map(function(x) { + return x.replace('en-US', '{{locale}}'); + }); + ctx.resLinks.splice.apply(ctx.resLinks, [pos, 1].concat(patterns)); + callback(); + }); + } + + function relativePath(baseUrl, url) { + if (url[0] === '/') { + return url; + } + + var dirs = baseUrl.split('/') + .slice(0, -1) + .concat(url.split('/')) + .filter(function(path) { + return path !== '.'; + }); + + return dirs.join('/'); + } + + var iniPatterns = { + 'section': /^\s*\[(.*)\]\s*$/, + 'import': /^\s*@import\s+url\((.*)\)\s*$/i, + 'entry': /[\r\n]+/ + }; + + function parseINI(source, iniPath) { + var entries = source.split(iniPatterns.entry); + var locales = ['en-US']; + var genericSection = true; + var uris = []; + var match; + + for (var i = 0; i < entries.length; i++) { + var line = entries[i]; + // we only care about en-US resources + if (genericSection && iniPatterns['import'].test(line)) { + match = iniPatterns['import'].exec(line); + var uri = relativePath(iniPath, match[1]); + uris.push(uri); + continue; + } + + // but we need the list of all locales in the ini, too + if (iniPatterns.section.test(line)) { + genericSection = false; + match = iniPatterns.section.exec(line); + locales.push(match[1]); + } + } + return { + locales: locales, + resources: uris + }; + } + + /* jshint -W104 */ + + function translateFragment(element) { + if (!element) { + element = document.documentElement; + document.documentElement.lang = this.language.code; + document.documentElement.dir = this.language.direction; + } + translateElement.call(this, element); + + var nodes = getTranslatableChildren(element); + for (var i = 0; i < nodes.length; i++ ) { + translateElement.call(this, nodes[i]); + } + } + + function getTranslatableChildren(element) { + return element ? element.querySelectorAll('*[data-l10n-id]') : []; + } + + function localizeElement(element, id, args) { + if (!element) { + return; + } + + if (!id) { + element.removeAttribute('data-l10n-id'); + element.removeAttribute('data-l10n-args'); + setTextContent(element, ''); + return; + } + + element.setAttribute('data-l10n-id', id); + if (args && typeof args === 'object') { + element.setAttribute('data-l10n-args', JSON.stringify(args)); + } else { + element.removeAttribute('data-l10n-args'); + } + + if (this.ctx.isReady) { + translateElement.call(this, element); + } + } + + function getL10nAttributes(element) { + if (!element) { + return {}; + } + + var l10nId = element.getAttribute('data-l10n-id'); + var l10nArgs = element.getAttribute('data-l10n-args'); + + var args = l10nArgs ? JSON.parse(l10nArgs) : null; + + return {id: l10nId, args: args}; + } + + + + function translateElement(element) { + var l10n = getL10nAttributes(element); + + if (!l10n.id) { + return; + } + + var entity = this.ctx.getEntity(l10n.id, l10n.args); + + if (!entity) { + return; + } + + if (typeof entity === 'string') { + setTextContent(element, entity); + return true; + } + + if (entity.value) { + setTextContent(element, entity.value); + } + + for (var key in entity.attributes) { + if (entity.attributes.hasOwnProperty(key)) { + var attr = entity.attributes[key]; + var pos = key.indexOf('.'); + if (pos !== -1) { + element[key.substr(0, pos)][key.substr(pos + 1)] = attr; + } else if (key === 'ariaLabel') { + element.setAttribute('aria-label', attr); + } else { + element[key] = attr; + } + } + } + + return true; + } + + function setTextContent(element, text) { + // standard case: no element children + if (!element.firstElementChild) { + element.textContent = text; + return; + } + + // this element has element children: replace the content of the first + // (non-blank) child textNode and clear other child textNodes + var found = false; + var reNotBlank = /\S/; + for (var child = element.firstChild; child; child = child.nextSibling) { + if (child.nodeType === Node.TEXT_NODE && + reNotBlank.test(child.nodeValue)) { + if (found) { + child.nodeValue = ''; + } else { + child.nodeValue = text; + found = true; + } + } + } + // if no (non-empty) textNode is found, insert a textNode before the + // element's first child. + if (!found) { + element.insertBefore(document.createTextNode(text), element.firstChild); + } + } + +})(this); + diff --git a/src/data/en-US.properties b/build/locales/en-US.properties similarity index 74% rename from src/data/en-US.properties rename to build/locales/en-US.properties index fbf3788..26f9a84 100644 --- a/src/data/en-US.properties +++ b/build/locales/en-US.properties @@ -1,3 +1,3 @@ -app_title = Privileged empty app +appname = Hawk app_description.innerHTML = This app is empty. Fill it with your own stuff! message = Hello world diff --git a/build/locales/locales.ini b/build/locales/locales.ini new file mode 100644 index 0000000..173dfb0 --- /dev/null +++ b/build/locales/locales.ini @@ -0,0 +1 @@ +@import url(en-US.properties) diff --git a/build/main.js b/build/main.js index 5e2dba8..4360500 100644 --- a/build/main.js +++ b/build/main.js @@ -1,4 +1,4 @@ -(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; + var shouldUpdateDispatchProps = finalMapDispatchToProps.length > 1; + + // Helps track hot reloading. + var version = nextVersion++; + + function computeStateProps(store, props) { + var state = store.getState(); + var stateProps = shouldUpdateStateProps ? finalMapStateToProps(state, props) : finalMapStateToProps(state); + + _invariant2['default'](_utilsIsPlainObject2['default'](stateProps), '`mapStateToProps` must return an object. Instead received %s.', stateProps); + return stateProps; + } + + function computeDispatchProps(store, props) { + var dispatch = store.dispatch; + + var dispatchProps = shouldUpdateDispatchProps ? finalMapDispatchToProps(dispatch, props) : finalMapDispatchToProps(dispatch); + + _invariant2['default'](_utilsIsPlainObject2['default'](dispatchProps), '`mapDispatchToProps` must return an object. Instead received %s.', dispatchProps); + return dispatchProps; + } + + function _computeNextState(stateProps, dispatchProps, parentProps) { + var mergedProps = finalMergeProps(stateProps, dispatchProps, parentProps); + _invariant2['default'](_utilsIsPlainObject2['default'](mergedProps), '`mergeProps` must return an object. Instead received %s.', mergedProps); + return mergedProps; + } + + return function wrapWithConnect(WrappedComponent) { + var Connect = (function (_Component) { + _inherits(Connect, _Component); + + Connect.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) { + return !_utilsShallowEqual2['default'](this.state.props, nextState.props); + }; + + _createClass(Connect, null, [{ + key: 'displayName', + value: 'Connect(' + getDisplayName(WrappedComponent) + ')', + enumerable: true + }, { + key: 'WrappedComponent', + value: WrappedComponent, + enumerable: true + }, { + key: 'contextTypes', + value: { + store: storeShape + }, + enumerable: true + }, { + key: 'propTypes', + value: { + store: storeShape + }, + enumerable: true + }]); + + function Connect(props, context) { + _classCallCheck(this, Connect); + + _Component.call(this, props, context); + this.version = version; + this.store = props.store || context.store; + + _invariant2['default'](this.store, 'Could not find "store" in either the context or ' + ('props of "' + this.constructor.displayName + '". ') + 'Either wrap the root component in a , ' + ('or explicitly pass "store" as a prop to "' + this.constructor.displayName + '".')); + + this.stateProps = computeStateProps(this.store, props); + this.dispatchProps = computeDispatchProps(this.store, props); + this.state = { + props: this.computeNextState() + }; + } + + Connect.prototype.computeNextState = function computeNextState() { + var props = arguments.length <= 0 || arguments[0] === undefined ? this.props : arguments[0]; + + return _computeNextState(this.stateProps, this.dispatchProps, props); + }; + + Connect.prototype.updateStateProps = function updateStateProps() { + var props = arguments.length <= 0 || arguments[0] === undefined ? this.props : arguments[0]; + + var nextStateProps = computeStateProps(this.store, props); + if (_utilsShallowEqual2['default'](nextStateProps, this.stateProps)) { + return false; + } + + this.stateProps = nextStateProps; + return true; + }; + + Connect.prototype.updateDispatchProps = function updateDispatchProps() { + var props = arguments.length <= 0 || arguments[0] === undefined ? this.props : arguments[0]; + + var nextDispatchProps = computeDispatchProps(this.store, props); + if (_utilsShallowEqual2['default'](nextDispatchProps, this.dispatchProps)) { + return false; + } + + this.dispatchProps = nextDispatchProps; + return true; + }; + + Connect.prototype.updateState = function updateState() { + var props = arguments.length <= 0 || arguments[0] === undefined ? this.props : arguments[0]; + + var nextState = this.computeNextState(props); + if (!_utilsShallowEqual2['default'](nextState, this.state.props)) { + this.setState({ + props: nextState + }); + } + }; + + Connect.prototype.isSubscribed = function isSubscribed() { + return typeof this.unsubscribe === 'function'; + }; + + Connect.prototype.trySubscribe = function trySubscribe() { + if (shouldSubscribe && !this.unsubscribe) { + this.unsubscribe = this.store.subscribe(this.handleChange.bind(this)); + this.handleChange(); + } + }; + + Connect.prototype.tryUnsubscribe = function tryUnsubscribe() { + if (this.unsubscribe) { + this.unsubscribe(); + this.unsubscribe = null; + } + }; + + Connect.prototype.componentDidMount = function componentDidMount() { + this.trySubscribe(); + }; + + Connect.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { + if (!_utilsShallowEqual2['default'](nextProps, this.props)) { + if (shouldUpdateStateProps) { + this.updateStateProps(nextProps); + } + + if (shouldUpdateDispatchProps) { + this.updateDispatchProps(nextProps); + } + + this.updateState(nextProps); + } + }; + + Connect.prototype.componentWillUnmount = function componentWillUnmount() { + this.tryUnsubscribe(); + }; + + Connect.prototype.handleChange = function handleChange() { + if (this.updateStateProps()) { + this.updateState(); + } + }; + + Connect.prototype.getWrappedInstance = function getWrappedInstance() { + return this.refs.wrappedInstance; + }; + + Connect.prototype.render = function render() { + return React.createElement(WrappedComponent, _extends({ ref: 'wrappedInstance' + }, this.state.props)); + }; + + return Connect; + })(Component); + + if ( + // Node-like CommonJS environments (Browserify, Webpack) + typeof process !== 'undefined' && typeof process.env !== 'undefined' && process.env.NODE_ENV !== 'production' || + // React Native + typeof __DEV__ !== 'undefined' && __DEV__ //eslint-disable-line no-undef + ) { + Connect.prototype.componentWillUpdate = function componentWillUpdate() { + if (this.version === version) { + return; + } + + // We are hot reloading! + this.version = version; + + // Update the state and bindings. + this.trySubscribe(); + this.updateStateProps(); + this.updateDispatchProps(); + this.updateState(); + }; + } + + return Connect; + }; + }; +} + +module.exports = exports['default']; +}).call(this,require('_process')) +},{"../utils/createStoreShape":6,"../utils/isPlainObject":7,"../utils/shallowEqual":8,"../utils/wrapActionCreators":9,"_process":1,"invariant":10}],4:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +exports['default'] = createProvider; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _utilsCreateStoreShape = require('../utils/createStoreShape'); + +var _utilsCreateStoreShape2 = _interopRequireDefault(_utilsCreateStoreShape); + +function isUsingOwnerContext(React) { + var version = React.version; + + if (typeof version !== 'string') { + return true; + } + + var sections = version.split('.'); + var major = parseInt(sections[0], 10); + var minor = parseInt(sections[1], 10); + + return major === 0 && minor === 13; +} + +function createProvider(React) { + var Component = React.Component; + var PropTypes = React.PropTypes; + var Children = React.Children; + + var storeShape = _utilsCreateStoreShape2['default'](PropTypes); + var requireFunctionChild = isUsingOwnerContext(React); + + var didWarn = false; + function warnAboutFunction() { + if (didWarn || requireFunctionChild) { + return; + } + + didWarn = true; + console.error( // eslint-disable-line no-console + 'With React 0.14 and later versions, you no longer need to ' + 'wrap child into a function.'); + } + function warnAboutElement() { + if (didWarn || !requireFunctionChild) { + return; + } + + didWarn = true; + console.error( // eslint-disable-line no-console + 'With React 0.13, you need to ' + 'wrap child into a function. ' + 'This restriction will be removed with React 0.14.'); + } + + return (function (_Component) { + _inherits(Provider, _Component); + + Provider.prototype.getChildContext = function getChildContext() { + return { store: this.state.store }; + }; + + _createClass(Provider, null, [{ + key: 'childContextTypes', + value: { + store: storeShape.isRequired + }, + enumerable: true + }, { + key: 'propTypes', + value: { + store: storeShape.isRequired, + children: (requireFunctionChild ? PropTypes.func : PropTypes.element).isRequired + }, + enumerable: true + }]); + + function Provider(props, context) { + _classCallCheck(this, Provider); + + _Component.call(this, props, context); + this.state = { store: props.store }; + } + + Provider.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { + var store = this.state.store; + var nextStore = nextProps.store; + + if (store !== nextStore) { + var nextReducer = nextStore.getReducer(); + store.replaceReducer(nextReducer); + } + }; + + Provider.prototype.render = function render() { + var children = this.props.children; + + if (typeof children === 'function') { + warnAboutFunction(); + children = children(); + } else { + warnAboutElement(); + } + + return Children.only(children); + }; + + return Provider; + })(Component); +} + +module.exports = exports['default']; +},{"../utils/createStoreShape":6}],5:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _componentsCreateAll = require('./components/createAll'); + +var _componentsCreateAll2 = _interopRequireDefault(_componentsCreateAll); + +var _createAll = _componentsCreateAll2['default'](_react2['default']); + +var Provider = _createAll.Provider; +var connect = _createAll.connect; +exports.Provider = Provider; +exports.connect = connect; +},{"./components/createAll":2,"react":165}],6:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports["default"] = createStoreShape; + +function createStoreShape(PropTypes) { + return PropTypes.shape({ + subscribe: PropTypes.func.isRequired, + dispatch: PropTypes.func.isRequired, + getState: PropTypes.func.isRequired + }); +} + +module.exports = exports["default"]; +},{}],7:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports['default'] = isPlainObject; +var fnToString = function fnToString(fn) { + return Function.prototype.toString.call(fn); +}; + +/** + * @param {any} obj The object to inspect. + * @returns {boolean} True if the argument appears to be a plain object. + */ + +function isPlainObject(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } + + var proto = typeof obj.constructor === 'function' ? Object.getPrototypeOf(obj) : Object.prototype; + + if (proto === null) { + return true; + } + + var constructor = proto.constructor; + + return typeof constructor === 'function' && constructor instanceof constructor && fnToString(constructor) === fnToString(Object); +} + +module.exports = exports['default']; +},{}],8:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports["default"] = shallowEqual; + +function shallowEqual(objA, objB) { + if (objA === objB) { + return true; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } + + // Test for A's keys different from B. + var hasOwn = Object.prototype.hasOwnProperty; + for (var i = 0; i < keysA.length; i++) { + if (!hasOwn.call(objB, keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) { + return false; + } + } + + return true; +} + +module.exports = exports["default"]; +},{}],9:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports['default'] = wrapActionCreators; + +var _redux = require('redux'); + +function wrapActionCreators(actionCreators) { + return function (dispatch) { + return _redux.bindActionCreators(actionCreators, dispatch); + }; +} + +module.exports = exports['default']; +},{"redux":167}],10:[function(require,module,exports){ +(function (process){ +/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule invariant + */ + +'use strict'; + +/** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + +var invariant = function(condition, format, a, b, c, d, e, f) { + if (process.env.NODE_ENV !== 'production') { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } + + if (!condition) { + var error; + if (format === undefined) { + error = new Error( + 'Minified exception occurred; use the non-minified dev environment ' + + 'for the full error message and additional helpful warnings.' + ); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error( + 'Invariant Violation: ' + + format.replace(/%s/g, function() { return args[argIndex++]; }) + ); + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } +}; + +module.exports = invariant; + +}).call(this,require('_process')) +},{"_process":1}],11:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -117,7 +697,7 @@ var AutoFocusMixin = { module.exports = AutoFocusMixin; -},{"./focusNode":120}],3:[function(require,module,exports){ +},{"./focusNode":129}],12:[function(require,module,exports){ /** * Copyright 2013-2015 Facebook, Inc. * All rights reserved. @@ -612,7 +1192,7 @@ var BeforeInputEventPlugin = { module.exports = BeforeInputEventPlugin; -},{"./EventConstants":15,"./EventPropagators":20,"./ExecutionEnvironment":21,"./FallbackCompositionState":22,"./SyntheticCompositionEvent":94,"./SyntheticInputEvent":98,"./keyOf":142}],4:[function(require,module,exports){ +},{"./EventConstants":24,"./EventPropagators":29,"./ExecutionEnvironment":30,"./FallbackCompositionState":31,"./SyntheticCompositionEvent":103,"./SyntheticInputEvent":107,"./keyOf":151}],13:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -737,7 +1317,7 @@ var CSSProperty = { module.exports = CSSProperty; -},{}],5:[function(require,module,exports){ +},{}],14:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -919,7 +1499,7 @@ var CSSPropertyOperations = { module.exports = CSSPropertyOperations; }).call(this,require('_process')) -},{"./CSSProperty":4,"./ExecutionEnvironment":21,"./camelizeStyleName":109,"./dangerousStyleValue":114,"./hyphenateStyleName":134,"./memoizeStringOnly":144,"./warning":155,"_process":1}],6:[function(require,module,exports){ +},{"./CSSProperty":13,"./ExecutionEnvironment":30,"./camelizeStyleName":118,"./dangerousStyleValue":123,"./hyphenateStyleName":143,"./memoizeStringOnly":153,"./warning":164,"_process":1}],15:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -1019,7 +1599,7 @@ PooledClass.addPoolingTo(CallbackQueue); module.exports = CallbackQueue; }).call(this,require('_process')) -},{"./Object.assign":27,"./PooledClass":28,"./invariant":136,"_process":1}],7:[function(require,module,exports){ +},{"./Object.assign":36,"./PooledClass":37,"./invariant":145,"_process":1}],16:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -1401,7 +1981,7 @@ var ChangeEventPlugin = { module.exports = ChangeEventPlugin; -},{"./EventConstants":15,"./EventPluginHub":17,"./EventPropagators":20,"./ExecutionEnvironment":21,"./ReactUpdates":88,"./SyntheticEvent":96,"./isEventSupported":137,"./isTextInputElement":139,"./keyOf":142}],8:[function(require,module,exports){ +},{"./EventConstants":24,"./EventPluginHub":26,"./EventPropagators":29,"./ExecutionEnvironment":30,"./ReactUpdates":97,"./SyntheticEvent":105,"./isEventSupported":146,"./isTextInputElement":148,"./keyOf":151}],17:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -1426,7 +2006,7 @@ var ClientReactRootIndex = { module.exports = ClientReactRootIndex; -},{}],9:[function(require,module,exports){ +},{}],18:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -1564,7 +2144,7 @@ var DOMChildrenOperations = { module.exports = DOMChildrenOperations; }).call(this,require('_process')) -},{"./Danger":12,"./ReactMultiChildUpdateTypes":73,"./invariant":136,"./setTextContent":150,"_process":1}],10:[function(require,module,exports){ +},{"./Danger":21,"./ReactMultiChildUpdateTypes":82,"./invariant":145,"./setTextContent":159,"_process":1}],19:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -1863,7 +2443,7 @@ var DOMProperty = { module.exports = DOMProperty; }).call(this,require('_process')) -},{"./invariant":136,"_process":1}],11:[function(require,module,exports){ +},{"./invariant":145,"_process":1}],20:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -2055,7 +2635,7 @@ var DOMPropertyOperations = { module.exports = DOMPropertyOperations; }).call(this,require('_process')) -},{"./DOMProperty":10,"./quoteAttributeValueForBrowser":148,"./warning":155,"_process":1}],12:[function(require,module,exports){ +},{"./DOMProperty":19,"./quoteAttributeValueForBrowser":157,"./warning":164,"_process":1}],21:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -2242,7 +2822,7 @@ var Danger = { module.exports = Danger; }).call(this,require('_process')) -},{"./ExecutionEnvironment":21,"./createNodesFromMarkup":113,"./emptyFunction":115,"./getMarkupWrap":128,"./invariant":136,"_process":1}],13:[function(require,module,exports){ +},{"./ExecutionEnvironment":30,"./createNodesFromMarkup":122,"./emptyFunction":124,"./getMarkupWrap":137,"./invariant":145,"_process":1}],22:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -2281,7 +2861,7 @@ var DefaultEventPluginOrder = [ module.exports = DefaultEventPluginOrder; -},{"./keyOf":142}],14:[function(require,module,exports){ +},{"./keyOf":151}],23:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -2421,7 +3001,7 @@ var EnterLeaveEventPlugin = { module.exports = EnterLeaveEventPlugin; -},{"./EventConstants":15,"./EventPropagators":20,"./ReactMount":71,"./SyntheticMouseEvent":100,"./keyOf":142}],15:[function(require,module,exports){ +},{"./EventConstants":24,"./EventPropagators":29,"./ReactMount":80,"./SyntheticMouseEvent":109,"./keyOf":151}],24:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -2493,7 +3073,7 @@ var EventConstants = { module.exports = EventConstants; -},{"./keyMirror":141}],16:[function(require,module,exports){ +},{"./keyMirror":150}],25:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -2583,7 +3163,7 @@ var EventListener = { module.exports = EventListener; }).call(this,require('_process')) -},{"./emptyFunction":115,"_process":1}],17:[function(require,module,exports){ +},{"./emptyFunction":124,"_process":1}],26:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -2861,7 +3441,7 @@ var EventPluginHub = { module.exports = EventPluginHub; }).call(this,require('_process')) -},{"./EventPluginRegistry":18,"./EventPluginUtils":19,"./accumulateInto":106,"./forEachAccumulated":121,"./invariant":136,"_process":1}],18:[function(require,module,exports){ +},{"./EventPluginRegistry":27,"./EventPluginUtils":28,"./accumulateInto":115,"./forEachAccumulated":130,"./invariant":145,"_process":1}],27:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -3141,7 +3721,7 @@ var EventPluginRegistry = { module.exports = EventPluginRegistry; }).call(this,require('_process')) -},{"./invariant":136,"_process":1}],19:[function(require,module,exports){ +},{"./invariant":145,"_process":1}],28:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -3362,7 +3942,7 @@ var EventPluginUtils = { module.exports = EventPluginUtils; }).call(this,require('_process')) -},{"./EventConstants":15,"./invariant":136,"_process":1}],20:[function(require,module,exports){ +},{"./EventConstants":24,"./invariant":145,"_process":1}],29:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -3504,7 +4084,7 @@ var EventPropagators = { module.exports = EventPropagators; }).call(this,require('_process')) -},{"./EventConstants":15,"./EventPluginHub":17,"./accumulateInto":106,"./forEachAccumulated":121,"_process":1}],21:[function(require,module,exports){ +},{"./EventConstants":24,"./EventPluginHub":26,"./accumulateInto":115,"./forEachAccumulated":130,"_process":1}],30:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -3548,7 +4128,7 @@ var ExecutionEnvironment = { module.exports = ExecutionEnvironment; -},{}],22:[function(require,module,exports){ +},{}],31:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -3639,7 +4219,7 @@ PooledClass.addPoolingTo(FallbackCompositionState); module.exports = FallbackCompositionState; -},{"./Object.assign":27,"./PooledClass":28,"./getTextContentAccessor":131}],23:[function(require,module,exports){ +},{"./Object.assign":36,"./PooledClass":37,"./getTextContentAccessor":140}],32:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -3850,7 +4430,7 @@ var HTMLDOMPropertyConfig = { module.exports = HTMLDOMPropertyConfig; -},{"./DOMProperty":10,"./ExecutionEnvironment":21}],24:[function(require,module,exports){ +},{"./DOMProperty":19,"./ExecutionEnvironment":30}],33:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -4006,7 +4586,7 @@ var LinkedValueUtils = { module.exports = LinkedValueUtils; }).call(this,require('_process')) -},{"./ReactPropTypes":79,"./invariant":136,"_process":1}],25:[function(require,module,exports){ +},{"./ReactPropTypes":88,"./invariant":145,"_process":1}],34:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -4063,7 +4643,7 @@ var LocalEventTrapMixin = { module.exports = LocalEventTrapMixin; }).call(this,require('_process')) -},{"./ReactBrowserEventEmitter":31,"./accumulateInto":106,"./forEachAccumulated":121,"./invariant":136,"_process":1}],26:[function(require,module,exports){ +},{"./ReactBrowserEventEmitter":40,"./accumulateInto":115,"./forEachAccumulated":130,"./invariant":145,"_process":1}],35:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -4121,7 +4701,7 @@ var MobileSafariClickEventPlugin = { module.exports = MobileSafariClickEventPlugin; -},{"./EventConstants":15,"./emptyFunction":115}],27:[function(require,module,exports){ +},{"./EventConstants":24,"./emptyFunction":124}],36:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. * All rights reserved. @@ -4170,7 +4750,7 @@ function assign(target, sources) { module.exports = assign; -},{}],28:[function(require,module,exports){ +},{}],37:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -4286,7 +4866,7 @@ var PooledClass = { module.exports = PooledClass; }).call(this,require('_process')) -},{"./invariant":136,"_process":1}],29:[function(require,module,exports){ +},{"./invariant":145,"_process":1}],38:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -4438,7 +5018,7 @@ React.version = '0.13.3'; module.exports = React; }).call(this,require('_process')) -},{"./EventPluginUtils":19,"./ExecutionEnvironment":21,"./Object.assign":27,"./ReactChildren":33,"./ReactClass":34,"./ReactComponent":35,"./ReactContext":39,"./ReactCurrentOwner":40,"./ReactDOM":41,"./ReactDOMTextComponent":52,"./ReactDefaultInjection":55,"./ReactElement":58,"./ReactElementValidator":59,"./ReactInstanceHandles":67,"./ReactMount":71,"./ReactPerf":76,"./ReactPropTypes":79,"./ReactReconciler":82,"./ReactServerRendering":85,"./findDOMNode":118,"./onlyChild":145,"_process":1}],30:[function(require,module,exports){ +},{"./EventPluginUtils":28,"./ExecutionEnvironment":30,"./Object.assign":36,"./ReactChildren":42,"./ReactClass":43,"./ReactComponent":44,"./ReactContext":48,"./ReactCurrentOwner":49,"./ReactDOM":50,"./ReactDOMTextComponent":61,"./ReactDefaultInjection":64,"./ReactElement":67,"./ReactElementValidator":68,"./ReactInstanceHandles":76,"./ReactMount":80,"./ReactPerf":85,"./ReactPropTypes":88,"./ReactReconciler":91,"./ReactServerRendering":94,"./findDOMNode":127,"./onlyChild":154,"_process":1}],39:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -4469,7 +5049,7 @@ var ReactBrowserComponentMixin = { module.exports = ReactBrowserComponentMixin; -},{"./findDOMNode":118}],31:[function(require,module,exports){ +},{"./findDOMNode":127}],40:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -4822,7 +5402,7 @@ var ReactBrowserEventEmitter = assign({}, ReactEventEmitterMixin, { module.exports = ReactBrowserEventEmitter; -},{"./EventConstants":15,"./EventPluginHub":17,"./EventPluginRegistry":18,"./Object.assign":27,"./ReactEventEmitterMixin":62,"./ViewportMetrics":105,"./isEventSupported":137}],32:[function(require,module,exports){ +},{"./EventConstants":24,"./EventPluginHub":26,"./EventPluginRegistry":27,"./Object.assign":36,"./ReactEventEmitterMixin":71,"./ViewportMetrics":114,"./isEventSupported":146}],41:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. * All rights reserved. @@ -4949,7 +5529,7 @@ var ReactChildReconciler = { module.exports = ReactChildReconciler; -},{"./ReactReconciler":82,"./flattenChildren":119,"./instantiateReactComponent":135,"./shouldUpdateReactComponent":152}],33:[function(require,module,exports){ +},{"./ReactReconciler":91,"./flattenChildren":128,"./instantiateReactComponent":144,"./shouldUpdateReactComponent":161}],42:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -5102,7 +5682,7 @@ var ReactChildren = { module.exports = ReactChildren; }).call(this,require('_process')) -},{"./PooledClass":28,"./ReactFragment":64,"./traverseAllChildren":154,"./warning":155,"_process":1}],34:[function(require,module,exports){ +},{"./PooledClass":37,"./ReactFragment":73,"./traverseAllChildren":163,"./warning":164,"_process":1}],43:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -6048,7 +6628,7 @@ var ReactClass = { module.exports = ReactClass; }).call(this,require('_process')) -},{"./Object.assign":27,"./ReactComponent":35,"./ReactCurrentOwner":40,"./ReactElement":58,"./ReactErrorUtils":61,"./ReactInstanceMap":68,"./ReactLifeCycle":69,"./ReactPropTypeLocationNames":77,"./ReactPropTypeLocations":78,"./ReactUpdateQueue":87,"./invariant":136,"./keyMirror":141,"./keyOf":142,"./warning":155,"_process":1}],35:[function(require,module,exports){ +},{"./Object.assign":36,"./ReactComponent":44,"./ReactCurrentOwner":49,"./ReactElement":67,"./ReactErrorUtils":70,"./ReactInstanceMap":77,"./ReactLifeCycle":78,"./ReactPropTypeLocationNames":86,"./ReactPropTypeLocations":87,"./ReactUpdateQueue":96,"./invariant":145,"./keyMirror":150,"./keyOf":151,"./warning":164,"_process":1}],44:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -6202,7 +6782,7 @@ if ("production" !== process.env.NODE_ENV) { module.exports = ReactComponent; }).call(this,require('_process')) -},{"./ReactUpdateQueue":87,"./invariant":136,"./warning":155,"_process":1}],36:[function(require,module,exports){ +},{"./ReactUpdateQueue":96,"./invariant":145,"./warning":164,"_process":1}],45:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -6249,7 +6829,7 @@ var ReactComponentBrowserEnvironment = { module.exports = ReactComponentBrowserEnvironment; -},{"./ReactDOMIDOperations":45,"./ReactMount":71}],37:[function(require,module,exports){ +},{"./ReactDOMIDOperations":54,"./ReactMount":80}],46:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -6310,7 +6890,7 @@ var ReactComponentEnvironment = { module.exports = ReactComponentEnvironment; }).call(this,require('_process')) -},{"./invariant":136,"_process":1}],38:[function(require,module,exports){ +},{"./invariant":145,"_process":1}],47:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -7223,7 +7803,7 @@ var ReactCompositeComponent = { module.exports = ReactCompositeComponent; }).call(this,require('_process')) -},{"./Object.assign":27,"./ReactComponentEnvironment":37,"./ReactContext":39,"./ReactCurrentOwner":40,"./ReactElement":58,"./ReactElementValidator":59,"./ReactInstanceMap":68,"./ReactLifeCycle":69,"./ReactNativeComponent":74,"./ReactPerf":76,"./ReactPropTypeLocationNames":77,"./ReactPropTypeLocations":78,"./ReactReconciler":82,"./ReactUpdates":88,"./emptyObject":116,"./invariant":136,"./shouldUpdateReactComponent":152,"./warning":155,"_process":1}],39:[function(require,module,exports){ +},{"./Object.assign":36,"./ReactComponentEnvironment":46,"./ReactContext":48,"./ReactCurrentOwner":49,"./ReactElement":67,"./ReactElementValidator":68,"./ReactInstanceMap":77,"./ReactLifeCycle":78,"./ReactNativeComponent":83,"./ReactPerf":85,"./ReactPropTypeLocationNames":86,"./ReactPropTypeLocations":87,"./ReactReconciler":91,"./ReactUpdates":97,"./emptyObject":125,"./invariant":145,"./shouldUpdateReactComponent":161,"./warning":164,"_process":1}],48:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -7301,7 +7881,7 @@ var ReactContext = { module.exports = ReactContext; }).call(this,require('_process')) -},{"./Object.assign":27,"./emptyObject":116,"./warning":155,"_process":1}],40:[function(require,module,exports){ +},{"./Object.assign":36,"./emptyObject":125,"./warning":164,"_process":1}],49:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -7335,7 +7915,7 @@ var ReactCurrentOwner = { module.exports = ReactCurrentOwner; -},{}],41:[function(require,module,exports){ +},{}],50:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -7514,7 +8094,7 @@ var ReactDOM = mapObject({ module.exports = ReactDOM; }).call(this,require('_process')) -},{"./ReactElement":58,"./ReactElementValidator":59,"./mapObject":143,"_process":1}],42:[function(require,module,exports){ +},{"./ReactElement":67,"./ReactElementValidator":68,"./mapObject":152,"_process":1}],51:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -7578,7 +8158,7 @@ var ReactDOMButton = ReactClass.createClass({ module.exports = ReactDOMButton; -},{"./AutoFocusMixin":2,"./ReactBrowserComponentMixin":30,"./ReactClass":34,"./ReactElement":58,"./keyMirror":141}],43:[function(require,module,exports){ +},{"./AutoFocusMixin":11,"./ReactBrowserComponentMixin":39,"./ReactClass":43,"./ReactElement":67,"./keyMirror":150}],52:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -8088,7 +8668,7 @@ ReactDOMComponent.injection = { module.exports = ReactDOMComponent; }).call(this,require('_process')) -},{"./CSSPropertyOperations":5,"./DOMProperty":10,"./DOMPropertyOperations":11,"./Object.assign":27,"./ReactBrowserEventEmitter":31,"./ReactComponentBrowserEnvironment":36,"./ReactMount":71,"./ReactMultiChild":72,"./ReactPerf":76,"./escapeTextContentForBrowser":117,"./invariant":136,"./isEventSupported":137,"./keyOf":142,"./warning":155,"_process":1}],44:[function(require,module,exports){ +},{"./CSSPropertyOperations":14,"./DOMProperty":19,"./DOMPropertyOperations":20,"./Object.assign":36,"./ReactBrowserEventEmitter":40,"./ReactComponentBrowserEnvironment":45,"./ReactMount":80,"./ReactMultiChild":81,"./ReactPerf":85,"./escapeTextContentForBrowser":126,"./invariant":145,"./isEventSupported":146,"./keyOf":151,"./warning":164,"_process":1}],53:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -8137,7 +8717,7 @@ var ReactDOMForm = ReactClass.createClass({ module.exports = ReactDOMForm; -},{"./EventConstants":15,"./LocalEventTrapMixin":25,"./ReactBrowserComponentMixin":30,"./ReactClass":34,"./ReactElement":58}],45:[function(require,module,exports){ +},{"./EventConstants":24,"./LocalEventTrapMixin":34,"./ReactBrowserComponentMixin":39,"./ReactClass":43,"./ReactElement":67}],54:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -8305,7 +8885,7 @@ ReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', { module.exports = ReactDOMIDOperations; }).call(this,require('_process')) -},{"./CSSPropertyOperations":5,"./DOMChildrenOperations":9,"./DOMPropertyOperations":11,"./ReactMount":71,"./ReactPerf":76,"./invariant":136,"./setInnerHTML":149,"_process":1}],46:[function(require,module,exports){ +},{"./CSSPropertyOperations":14,"./DOMChildrenOperations":18,"./DOMPropertyOperations":20,"./ReactMount":80,"./ReactPerf":85,"./invariant":145,"./setInnerHTML":158,"_process":1}],55:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -8350,7 +8930,7 @@ var ReactDOMIframe = ReactClass.createClass({ module.exports = ReactDOMIframe; -},{"./EventConstants":15,"./LocalEventTrapMixin":25,"./ReactBrowserComponentMixin":30,"./ReactClass":34,"./ReactElement":58}],47:[function(require,module,exports){ +},{"./EventConstants":24,"./LocalEventTrapMixin":34,"./ReactBrowserComponentMixin":39,"./ReactClass":43,"./ReactElement":67}],56:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -8396,7 +8976,7 @@ var ReactDOMImg = ReactClass.createClass({ module.exports = ReactDOMImg; -},{"./EventConstants":15,"./LocalEventTrapMixin":25,"./ReactBrowserComponentMixin":30,"./ReactClass":34,"./ReactElement":58}],48:[function(require,module,exports){ +},{"./EventConstants":24,"./LocalEventTrapMixin":34,"./ReactBrowserComponentMixin":39,"./ReactClass":43,"./ReactElement":67}],57:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -8573,7 +9153,7 @@ var ReactDOMInput = ReactClass.createClass({ module.exports = ReactDOMInput; }).call(this,require('_process')) -},{"./AutoFocusMixin":2,"./DOMPropertyOperations":11,"./LinkedValueUtils":24,"./Object.assign":27,"./ReactBrowserComponentMixin":30,"./ReactClass":34,"./ReactElement":58,"./ReactMount":71,"./ReactUpdates":88,"./invariant":136,"_process":1}],49:[function(require,module,exports){ +},{"./AutoFocusMixin":11,"./DOMPropertyOperations":20,"./LinkedValueUtils":33,"./Object.assign":36,"./ReactBrowserComponentMixin":39,"./ReactClass":43,"./ReactElement":67,"./ReactMount":80,"./ReactUpdates":97,"./invariant":145,"_process":1}],58:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -8625,7 +9205,7 @@ var ReactDOMOption = ReactClass.createClass({ module.exports = ReactDOMOption; }).call(this,require('_process')) -},{"./ReactBrowserComponentMixin":30,"./ReactClass":34,"./ReactElement":58,"./warning":155,"_process":1}],50:[function(require,module,exports){ +},{"./ReactBrowserComponentMixin":39,"./ReactClass":43,"./ReactElement":67,"./warning":164,"_process":1}],59:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -8803,7 +9383,7 @@ var ReactDOMSelect = ReactClass.createClass({ module.exports = ReactDOMSelect; -},{"./AutoFocusMixin":2,"./LinkedValueUtils":24,"./Object.assign":27,"./ReactBrowserComponentMixin":30,"./ReactClass":34,"./ReactElement":58,"./ReactUpdates":88}],51:[function(require,module,exports){ +},{"./AutoFocusMixin":11,"./LinkedValueUtils":33,"./Object.assign":36,"./ReactBrowserComponentMixin":39,"./ReactClass":43,"./ReactElement":67,"./ReactUpdates":97}],60:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -9016,7 +9596,7 @@ var ReactDOMSelection = { module.exports = ReactDOMSelection; -},{"./ExecutionEnvironment":21,"./getNodeForCharacterOffset":129,"./getTextContentAccessor":131}],52:[function(require,module,exports){ +},{"./ExecutionEnvironment":30,"./getNodeForCharacterOffset":138,"./getTextContentAccessor":140}],61:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -9133,7 +9713,7 @@ assign(ReactDOMTextComponent.prototype, { module.exports = ReactDOMTextComponent; -},{"./DOMPropertyOperations":11,"./Object.assign":27,"./ReactComponentBrowserEnvironment":36,"./ReactDOMComponent":43,"./escapeTextContentForBrowser":117}],53:[function(require,module,exports){ +},{"./DOMPropertyOperations":20,"./Object.assign":36,"./ReactComponentBrowserEnvironment":45,"./ReactDOMComponent":52,"./escapeTextContentForBrowser":126}],62:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -9273,7 +9853,7 @@ var ReactDOMTextarea = ReactClass.createClass({ module.exports = ReactDOMTextarea; }).call(this,require('_process')) -},{"./AutoFocusMixin":2,"./DOMPropertyOperations":11,"./LinkedValueUtils":24,"./Object.assign":27,"./ReactBrowserComponentMixin":30,"./ReactClass":34,"./ReactElement":58,"./ReactUpdates":88,"./invariant":136,"./warning":155,"_process":1}],54:[function(require,module,exports){ +},{"./AutoFocusMixin":11,"./DOMPropertyOperations":20,"./LinkedValueUtils":33,"./Object.assign":36,"./ReactBrowserComponentMixin":39,"./ReactClass":43,"./ReactElement":67,"./ReactUpdates":97,"./invariant":145,"./warning":164,"_process":1}],63:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -9346,7 +9926,7 @@ var ReactDefaultBatchingStrategy = { module.exports = ReactDefaultBatchingStrategy; -},{"./Object.assign":27,"./ReactUpdates":88,"./Transaction":104,"./emptyFunction":115}],55:[function(require,module,exports){ +},{"./Object.assign":36,"./ReactUpdates":97,"./Transaction":113,"./emptyFunction":124}],64:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -9505,7 +10085,7 @@ module.exports = { }; }).call(this,require('_process')) -},{"./BeforeInputEventPlugin":3,"./ChangeEventPlugin":7,"./ClientReactRootIndex":8,"./DefaultEventPluginOrder":13,"./EnterLeaveEventPlugin":14,"./ExecutionEnvironment":21,"./HTMLDOMPropertyConfig":23,"./MobileSafariClickEventPlugin":26,"./ReactBrowserComponentMixin":30,"./ReactClass":34,"./ReactComponentBrowserEnvironment":36,"./ReactDOMButton":42,"./ReactDOMComponent":43,"./ReactDOMForm":44,"./ReactDOMIDOperations":45,"./ReactDOMIframe":46,"./ReactDOMImg":47,"./ReactDOMInput":48,"./ReactDOMOption":49,"./ReactDOMSelect":50,"./ReactDOMTextComponent":52,"./ReactDOMTextarea":53,"./ReactDefaultBatchingStrategy":54,"./ReactDefaultPerf":56,"./ReactElement":58,"./ReactEventListener":63,"./ReactInjection":65,"./ReactInstanceHandles":67,"./ReactMount":71,"./ReactReconcileTransaction":81,"./SVGDOMPropertyConfig":89,"./SelectEventPlugin":90,"./ServerReactRootIndex":91,"./SimpleEventPlugin":92,"./createFullPageComponent":112,"_process":1}],56:[function(require,module,exports){ +},{"./BeforeInputEventPlugin":12,"./ChangeEventPlugin":16,"./ClientReactRootIndex":17,"./DefaultEventPluginOrder":22,"./EnterLeaveEventPlugin":23,"./ExecutionEnvironment":30,"./HTMLDOMPropertyConfig":32,"./MobileSafariClickEventPlugin":35,"./ReactBrowserComponentMixin":39,"./ReactClass":43,"./ReactComponentBrowserEnvironment":45,"./ReactDOMButton":51,"./ReactDOMComponent":52,"./ReactDOMForm":53,"./ReactDOMIDOperations":54,"./ReactDOMIframe":55,"./ReactDOMImg":56,"./ReactDOMInput":57,"./ReactDOMOption":58,"./ReactDOMSelect":59,"./ReactDOMTextComponent":61,"./ReactDOMTextarea":62,"./ReactDefaultBatchingStrategy":63,"./ReactDefaultPerf":65,"./ReactElement":67,"./ReactEventListener":72,"./ReactInjection":74,"./ReactInstanceHandles":76,"./ReactMount":80,"./ReactReconcileTransaction":90,"./SVGDOMPropertyConfig":98,"./SelectEventPlugin":99,"./ServerReactRootIndex":100,"./SimpleEventPlugin":101,"./createFullPageComponent":121,"_process":1}],65:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -9771,7 +10351,7 @@ var ReactDefaultPerf = { module.exports = ReactDefaultPerf; -},{"./DOMProperty":10,"./ReactDefaultPerfAnalysis":57,"./ReactMount":71,"./ReactPerf":76,"./performanceNow":147}],57:[function(require,module,exports){ +},{"./DOMProperty":19,"./ReactDefaultPerfAnalysis":66,"./ReactMount":80,"./ReactPerf":85,"./performanceNow":156}],66:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -9977,7 +10557,7 @@ var ReactDefaultPerfAnalysis = { module.exports = ReactDefaultPerfAnalysis; -},{"./Object.assign":27}],58:[function(require,module,exports){ +},{"./Object.assign":36}],67:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -10285,7 +10865,7 @@ ReactElement.isValidElement = function(object) { module.exports = ReactElement; }).call(this,require('_process')) -},{"./Object.assign":27,"./ReactContext":39,"./ReactCurrentOwner":40,"./warning":155,"_process":1}],59:[function(require,module,exports){ +},{"./Object.assign":36,"./ReactContext":48,"./ReactCurrentOwner":49,"./warning":164,"_process":1}],68:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -10750,7 +11330,7 @@ var ReactElementValidator = { module.exports = ReactElementValidator; }).call(this,require('_process')) -},{"./ReactCurrentOwner":40,"./ReactElement":58,"./ReactFragment":64,"./ReactNativeComponent":74,"./ReactPropTypeLocationNames":77,"./ReactPropTypeLocations":78,"./getIteratorFn":127,"./invariant":136,"./warning":155,"_process":1}],60:[function(require,module,exports){ +},{"./ReactCurrentOwner":49,"./ReactElement":67,"./ReactFragment":73,"./ReactNativeComponent":83,"./ReactPropTypeLocationNames":86,"./ReactPropTypeLocations":87,"./getIteratorFn":136,"./invariant":145,"./warning":164,"_process":1}],69:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -10845,7 +11425,7 @@ var ReactEmptyComponent = { module.exports = ReactEmptyComponent; }).call(this,require('_process')) -},{"./ReactElement":58,"./ReactInstanceMap":68,"./invariant":136,"_process":1}],61:[function(require,module,exports){ +},{"./ReactElement":67,"./ReactInstanceMap":77,"./invariant":145,"_process":1}],70:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -10877,7 +11457,7 @@ var ReactErrorUtils = { module.exports = ReactErrorUtils; -},{}],62:[function(require,module,exports){ +},{}],71:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -10927,7 +11507,7 @@ var ReactEventEmitterMixin = { module.exports = ReactEventEmitterMixin; -},{"./EventPluginHub":17}],63:[function(require,module,exports){ +},{"./EventPluginHub":26}],72:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -11110,7 +11690,7 @@ var ReactEventListener = { module.exports = ReactEventListener; -},{"./EventListener":16,"./ExecutionEnvironment":21,"./Object.assign":27,"./PooledClass":28,"./ReactInstanceHandles":67,"./ReactMount":71,"./ReactUpdates":88,"./getEventTarget":126,"./getUnboundedScrollPosition":132}],64:[function(require,module,exports){ +},{"./EventListener":25,"./ExecutionEnvironment":30,"./Object.assign":36,"./PooledClass":37,"./ReactInstanceHandles":76,"./ReactMount":80,"./ReactUpdates":97,"./getEventTarget":135,"./getUnboundedScrollPosition":141}],73:[function(require,module,exports){ (function (process){ /** * Copyright 2015, Facebook, Inc. @@ -11295,7 +11875,7 @@ var ReactFragment = { module.exports = ReactFragment; }).call(this,require('_process')) -},{"./ReactElement":58,"./warning":155,"_process":1}],65:[function(require,module,exports){ +},{"./ReactElement":67,"./warning":164,"_process":1}],74:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -11337,7 +11917,7 @@ var ReactInjection = { module.exports = ReactInjection; -},{"./DOMProperty":10,"./EventPluginHub":17,"./ReactBrowserEventEmitter":31,"./ReactClass":34,"./ReactComponentEnvironment":37,"./ReactDOMComponent":43,"./ReactEmptyComponent":60,"./ReactNativeComponent":74,"./ReactPerf":76,"./ReactRootIndex":84,"./ReactUpdates":88}],66:[function(require,module,exports){ +},{"./DOMProperty":19,"./EventPluginHub":26,"./ReactBrowserEventEmitter":40,"./ReactClass":43,"./ReactComponentEnvironment":46,"./ReactDOMComponent":52,"./ReactEmptyComponent":69,"./ReactNativeComponent":83,"./ReactPerf":85,"./ReactRootIndex":93,"./ReactUpdates":97}],75:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -11472,7 +12052,7 @@ var ReactInputSelection = { module.exports = ReactInputSelection; -},{"./ReactDOMSelection":51,"./containsNode":110,"./focusNode":120,"./getActiveElement":122}],67:[function(require,module,exports){ +},{"./ReactDOMSelection":60,"./containsNode":119,"./focusNode":129,"./getActiveElement":131}],76:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -11808,7 +12388,7 @@ var ReactInstanceHandles = { module.exports = ReactInstanceHandles; }).call(this,require('_process')) -},{"./ReactRootIndex":84,"./invariant":136,"_process":1}],68:[function(require,module,exports){ +},{"./ReactRootIndex":93,"./invariant":145,"_process":1}],77:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -11857,7 +12437,7 @@ var ReactInstanceMap = { module.exports = ReactInstanceMap; -},{}],69:[function(require,module,exports){ +},{}],78:[function(require,module,exports){ /** * Copyright 2015, Facebook, Inc. * All rights reserved. @@ -11894,7 +12474,7 @@ var ReactLifeCycle = { module.exports = ReactLifeCycle; -},{}],70:[function(require,module,exports){ +},{}],79:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -11942,7 +12522,7 @@ var ReactMarkupChecksum = { module.exports = ReactMarkupChecksum; -},{"./adler32":107}],71:[function(require,module,exports){ +},{"./adler32":116}],80:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -12833,7 +13413,7 @@ ReactPerf.measureMethods(ReactMount, 'ReactMount', { module.exports = ReactMount; }).call(this,require('_process')) -},{"./DOMProperty":10,"./ReactBrowserEventEmitter":31,"./ReactCurrentOwner":40,"./ReactElement":58,"./ReactElementValidator":59,"./ReactEmptyComponent":60,"./ReactInstanceHandles":67,"./ReactInstanceMap":68,"./ReactMarkupChecksum":70,"./ReactPerf":76,"./ReactReconciler":82,"./ReactUpdateQueue":87,"./ReactUpdates":88,"./containsNode":110,"./emptyObject":116,"./getReactRootElementInContainer":130,"./instantiateReactComponent":135,"./invariant":136,"./setInnerHTML":149,"./shouldUpdateReactComponent":152,"./warning":155,"_process":1}],72:[function(require,module,exports){ +},{"./DOMProperty":19,"./ReactBrowserEventEmitter":40,"./ReactCurrentOwner":49,"./ReactElement":67,"./ReactElementValidator":68,"./ReactEmptyComponent":69,"./ReactInstanceHandles":76,"./ReactInstanceMap":77,"./ReactMarkupChecksum":79,"./ReactPerf":85,"./ReactReconciler":91,"./ReactUpdateQueue":96,"./ReactUpdates":97,"./containsNode":119,"./emptyObject":125,"./getReactRootElementInContainer":139,"./instantiateReactComponent":144,"./invariant":145,"./setInnerHTML":158,"./shouldUpdateReactComponent":161,"./warning":164,"_process":1}],81:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -13263,7 +13843,7 @@ var ReactMultiChild = { module.exports = ReactMultiChild; -},{"./ReactChildReconciler":32,"./ReactComponentEnvironment":37,"./ReactMultiChildUpdateTypes":73,"./ReactReconciler":82}],73:[function(require,module,exports){ +},{"./ReactChildReconciler":41,"./ReactComponentEnvironment":46,"./ReactMultiChildUpdateTypes":82,"./ReactReconciler":91}],82:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -13296,7 +13876,7 @@ var ReactMultiChildUpdateTypes = keyMirror({ module.exports = ReactMultiChildUpdateTypes; -},{"./keyMirror":141}],74:[function(require,module,exports){ +},{"./keyMirror":150}],83:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -13403,7 +13983,7 @@ var ReactNativeComponent = { module.exports = ReactNativeComponent; }).call(this,require('_process')) -},{"./Object.assign":27,"./invariant":136,"_process":1}],75:[function(require,module,exports){ +},{"./Object.assign":36,"./invariant":145,"_process":1}],84:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -13515,7 +14095,7 @@ var ReactOwner = { module.exports = ReactOwner; }).call(this,require('_process')) -},{"./invariant":136,"_process":1}],76:[function(require,module,exports){ +},{"./invariant":145,"_process":1}],85:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -13619,7 +14199,7 @@ function _noMeasure(objName, fnName, func) { module.exports = ReactPerf; }).call(this,require('_process')) -},{"_process":1}],77:[function(require,module,exports){ +},{"_process":1}],86:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -13647,7 +14227,7 @@ if ("production" !== process.env.NODE_ENV) { module.exports = ReactPropTypeLocationNames; }).call(this,require('_process')) -},{"_process":1}],78:[function(require,module,exports){ +},{"_process":1}],87:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -13671,7 +14251,7 @@ var ReactPropTypeLocations = keyMirror({ module.exports = ReactPropTypeLocations; -},{"./keyMirror":141}],79:[function(require,module,exports){ +},{"./keyMirror":150}],88:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -14020,7 +14600,7 @@ function getPreciseType(propValue) { module.exports = ReactPropTypes; -},{"./ReactElement":58,"./ReactFragment":64,"./ReactPropTypeLocationNames":77,"./emptyFunction":115}],80:[function(require,module,exports){ +},{"./ReactElement":67,"./ReactFragment":73,"./ReactPropTypeLocationNames":86,"./emptyFunction":124}],89:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -14076,7 +14656,7 @@ PooledClass.addPoolingTo(ReactPutListenerQueue); module.exports = ReactPutListenerQueue; -},{"./Object.assign":27,"./PooledClass":28,"./ReactBrowserEventEmitter":31}],81:[function(require,module,exports){ +},{"./Object.assign":36,"./PooledClass":37,"./ReactBrowserEventEmitter":40}],90:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -14252,7 +14832,7 @@ PooledClass.addPoolingTo(ReactReconcileTransaction); module.exports = ReactReconcileTransaction; -},{"./CallbackQueue":6,"./Object.assign":27,"./PooledClass":28,"./ReactBrowserEventEmitter":31,"./ReactInputSelection":66,"./ReactPutListenerQueue":80,"./Transaction":104}],82:[function(require,module,exports){ +},{"./CallbackQueue":15,"./Object.assign":36,"./PooledClass":37,"./ReactBrowserEventEmitter":40,"./ReactInputSelection":75,"./ReactPutListenerQueue":89,"./Transaction":113}],91:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -14376,7 +14956,7 @@ var ReactReconciler = { module.exports = ReactReconciler; }).call(this,require('_process')) -},{"./ReactElementValidator":59,"./ReactRef":83,"_process":1}],83:[function(require,module,exports){ +},{"./ReactElementValidator":68,"./ReactRef":92,"_process":1}],92:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -14447,7 +15027,7 @@ ReactRef.detachRefs = function(instance, element) { module.exports = ReactRef; -},{"./ReactOwner":75}],84:[function(require,module,exports){ +},{"./ReactOwner":84}],93:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -14478,7 +15058,7 @@ var ReactRootIndex = { module.exports = ReactRootIndex; -},{}],85:[function(require,module,exports){ +},{}],94:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -14560,7 +15140,7 @@ module.exports = { }; }).call(this,require('_process')) -},{"./ReactElement":58,"./ReactInstanceHandles":67,"./ReactMarkupChecksum":70,"./ReactServerRenderingTransaction":86,"./emptyObject":116,"./instantiateReactComponent":135,"./invariant":136,"_process":1}],86:[function(require,module,exports){ +},{"./ReactElement":67,"./ReactInstanceHandles":76,"./ReactMarkupChecksum":79,"./ReactServerRenderingTransaction":95,"./emptyObject":125,"./instantiateReactComponent":144,"./invariant":145,"_process":1}],95:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. * All rights reserved. @@ -14673,7 +15253,7 @@ PooledClass.addPoolingTo(ReactServerRenderingTransaction); module.exports = ReactServerRenderingTransaction; -},{"./CallbackQueue":6,"./Object.assign":27,"./PooledClass":28,"./ReactPutListenerQueue":80,"./Transaction":104,"./emptyFunction":115}],87:[function(require,module,exports){ +},{"./CallbackQueue":15,"./Object.assign":36,"./PooledClass":37,"./ReactPutListenerQueue":89,"./Transaction":113,"./emptyFunction":124}],96:[function(require,module,exports){ (function (process){ /** * Copyright 2015, Facebook, Inc. @@ -14972,7 +15552,7 @@ var ReactUpdateQueue = { module.exports = ReactUpdateQueue; }).call(this,require('_process')) -},{"./Object.assign":27,"./ReactCurrentOwner":40,"./ReactElement":58,"./ReactInstanceMap":68,"./ReactLifeCycle":69,"./ReactUpdates":88,"./invariant":136,"./warning":155,"_process":1}],88:[function(require,module,exports){ +},{"./Object.assign":36,"./ReactCurrentOwner":49,"./ReactElement":67,"./ReactInstanceMap":77,"./ReactLifeCycle":78,"./ReactUpdates":97,"./invariant":145,"./warning":164,"_process":1}],97:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -15254,7 +15834,7 @@ var ReactUpdates = { module.exports = ReactUpdates; }).call(this,require('_process')) -},{"./CallbackQueue":6,"./Object.assign":27,"./PooledClass":28,"./ReactCurrentOwner":40,"./ReactPerf":76,"./ReactReconciler":82,"./Transaction":104,"./invariant":136,"./warning":155,"_process":1}],89:[function(require,module,exports){ +},{"./CallbackQueue":15,"./Object.assign":36,"./PooledClass":37,"./ReactCurrentOwner":49,"./ReactPerf":85,"./ReactReconciler":91,"./Transaction":113,"./invariant":145,"./warning":164,"_process":1}],98:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -15348,7 +15928,7 @@ var SVGDOMPropertyConfig = { module.exports = SVGDOMPropertyConfig; -},{"./DOMProperty":10}],90:[function(require,module,exports){ +},{"./DOMProperty":19}],99:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -15543,7 +16123,7 @@ var SelectEventPlugin = { module.exports = SelectEventPlugin; -},{"./EventConstants":15,"./EventPropagators":20,"./ReactInputSelection":66,"./SyntheticEvent":96,"./getActiveElement":122,"./isTextInputElement":139,"./keyOf":142,"./shallowEqual":151}],91:[function(require,module,exports){ +},{"./EventConstants":24,"./EventPropagators":29,"./ReactInputSelection":75,"./SyntheticEvent":105,"./getActiveElement":131,"./isTextInputElement":148,"./keyOf":151,"./shallowEqual":160}],100:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -15574,7 +16154,7 @@ var ServerReactRootIndex = { module.exports = ServerReactRootIndex; -},{}],92:[function(require,module,exports){ +},{}],101:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -16002,7 +16582,7 @@ var SimpleEventPlugin = { module.exports = SimpleEventPlugin; }).call(this,require('_process')) -},{"./EventConstants":15,"./EventPluginUtils":19,"./EventPropagators":20,"./SyntheticClipboardEvent":93,"./SyntheticDragEvent":95,"./SyntheticEvent":96,"./SyntheticFocusEvent":97,"./SyntheticKeyboardEvent":99,"./SyntheticMouseEvent":100,"./SyntheticTouchEvent":101,"./SyntheticUIEvent":102,"./SyntheticWheelEvent":103,"./getEventCharCode":123,"./invariant":136,"./keyOf":142,"./warning":155,"_process":1}],93:[function(require,module,exports){ +},{"./EventConstants":24,"./EventPluginUtils":28,"./EventPropagators":29,"./SyntheticClipboardEvent":102,"./SyntheticDragEvent":104,"./SyntheticEvent":105,"./SyntheticFocusEvent":106,"./SyntheticKeyboardEvent":108,"./SyntheticMouseEvent":109,"./SyntheticTouchEvent":110,"./SyntheticUIEvent":111,"./SyntheticWheelEvent":112,"./getEventCharCode":132,"./invariant":145,"./keyOf":151,"./warning":164,"_process":1}],102:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16047,7 +16627,7 @@ SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface); module.exports = SyntheticClipboardEvent; -},{"./SyntheticEvent":96}],94:[function(require,module,exports){ +},{"./SyntheticEvent":105}],103:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16092,7 +16672,7 @@ SyntheticEvent.augmentClass( module.exports = SyntheticCompositionEvent; -},{"./SyntheticEvent":96}],95:[function(require,module,exports){ +},{"./SyntheticEvent":105}],104:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16131,7 +16711,7 @@ SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface); module.exports = SyntheticDragEvent; -},{"./SyntheticMouseEvent":100}],96:[function(require,module,exports){ +},{"./SyntheticMouseEvent":109}],105:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16297,7 +16877,7 @@ PooledClass.addPoolingTo(SyntheticEvent, PooledClass.threeArgumentPooler); module.exports = SyntheticEvent; -},{"./Object.assign":27,"./PooledClass":28,"./emptyFunction":115,"./getEventTarget":126}],97:[function(require,module,exports){ +},{"./Object.assign":36,"./PooledClass":37,"./emptyFunction":124,"./getEventTarget":135}],106:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16336,7 +16916,7 @@ SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface); module.exports = SyntheticFocusEvent; -},{"./SyntheticUIEvent":102}],98:[function(require,module,exports){ +},{"./SyntheticUIEvent":111}],107:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16382,7 +16962,7 @@ SyntheticEvent.augmentClass( module.exports = SyntheticInputEvent; -},{"./SyntheticEvent":96}],99:[function(require,module,exports){ +},{"./SyntheticEvent":105}],108:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16469,7 +17049,7 @@ SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface); module.exports = SyntheticKeyboardEvent; -},{"./SyntheticUIEvent":102,"./getEventCharCode":123,"./getEventKey":124,"./getEventModifierState":125}],100:[function(require,module,exports){ +},{"./SyntheticUIEvent":111,"./getEventCharCode":132,"./getEventKey":133,"./getEventModifierState":134}],109:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16550,7 +17130,7 @@ SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface); module.exports = SyntheticMouseEvent; -},{"./SyntheticUIEvent":102,"./ViewportMetrics":105,"./getEventModifierState":125}],101:[function(require,module,exports){ +},{"./SyntheticUIEvent":111,"./ViewportMetrics":114,"./getEventModifierState":134}],110:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16598,7 +17178,7 @@ SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface); module.exports = SyntheticTouchEvent; -},{"./SyntheticUIEvent":102,"./getEventModifierState":125}],102:[function(require,module,exports){ +},{"./SyntheticUIEvent":111,"./getEventModifierState":134}],111:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16660,7 +17240,7 @@ SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface); module.exports = SyntheticUIEvent; -},{"./SyntheticEvent":96,"./getEventTarget":126}],103:[function(require,module,exports){ +},{"./SyntheticEvent":105,"./getEventTarget":135}],112:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16721,7 +17301,7 @@ SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface); module.exports = SyntheticWheelEvent; -},{"./SyntheticMouseEvent":100}],104:[function(require,module,exports){ +},{"./SyntheticMouseEvent":109}],113:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -16962,7 +17542,7 @@ var Transaction = { module.exports = Transaction; }).call(this,require('_process')) -},{"./invariant":136,"_process":1}],105:[function(require,module,exports){ +},{"./invariant":145,"_process":1}],114:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -16991,7 +17571,7 @@ var ViewportMetrics = { module.exports = ViewportMetrics; -},{}],106:[function(require,module,exports){ +},{}],115:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -17057,7 +17637,7 @@ function accumulateInto(current, next) { module.exports = accumulateInto; }).call(this,require('_process')) -},{"./invariant":136,"_process":1}],107:[function(require,module,exports){ +},{"./invariant":145,"_process":1}],116:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17091,7 +17671,7 @@ function adler32(data) { module.exports = adler32; -},{}],108:[function(require,module,exports){ +},{}],117:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17123,7 +17703,7 @@ function camelize(string) { module.exports = camelize; -},{}],109:[function(require,module,exports){ +},{}],118:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. * All rights reserved. @@ -17165,7 +17745,7 @@ function camelizeStyleName(string) { module.exports = camelizeStyleName; -},{"./camelize":108}],110:[function(require,module,exports){ +},{"./camelize":117}],119:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17209,7 +17789,7 @@ function containsNode(outerNode, innerNode) { module.exports = containsNode; -},{"./isTextNode":140}],111:[function(require,module,exports){ +},{"./isTextNode":149}],120:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17295,7 +17875,7 @@ function createArrayFromMixed(obj) { module.exports = createArrayFromMixed; -},{"./toArray":153}],112:[function(require,module,exports){ +},{"./toArray":162}],121:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -17357,7 +17937,7 @@ function createFullPageComponent(tag) { module.exports = createFullPageComponent; }).call(this,require('_process')) -},{"./ReactClass":34,"./ReactElement":58,"./invariant":136,"_process":1}],113:[function(require,module,exports){ +},{"./ReactClass":43,"./ReactElement":67,"./invariant":145,"_process":1}],122:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -17447,7 +18027,7 @@ function createNodesFromMarkup(markup, handleScript) { module.exports = createNodesFromMarkup; }).call(this,require('_process')) -},{"./ExecutionEnvironment":21,"./createArrayFromMixed":111,"./getMarkupWrap":128,"./invariant":136,"_process":1}],114:[function(require,module,exports){ +},{"./ExecutionEnvironment":30,"./createArrayFromMixed":120,"./getMarkupWrap":137,"./invariant":145,"_process":1}],123:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17505,7 +18085,7 @@ function dangerousStyleValue(name, value) { module.exports = dangerousStyleValue; -},{"./CSSProperty":4}],115:[function(require,module,exports){ +},{"./CSSProperty":13}],124:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17539,7 +18119,7 @@ emptyFunction.thatReturnsArgument = function(arg) { return arg; }; module.exports = emptyFunction; -},{}],116:[function(require,module,exports){ +},{}],125:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -17563,7 +18143,7 @@ if ("production" !== process.env.NODE_ENV) { module.exports = emptyObject; }).call(this,require('_process')) -},{"_process":1}],117:[function(require,module,exports){ +},{"_process":1}],126:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17603,7 +18183,7 @@ function escapeTextContentForBrowser(text) { module.exports = escapeTextContentForBrowser; -},{}],118:[function(require,module,exports){ +},{}],127:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -17676,7 +18256,7 @@ function findDOMNode(componentOrElement) { module.exports = findDOMNode; }).call(this,require('_process')) -},{"./ReactCurrentOwner":40,"./ReactInstanceMap":68,"./ReactMount":71,"./invariant":136,"./isNode":138,"./warning":155,"_process":1}],119:[function(require,module,exports){ +},{"./ReactCurrentOwner":49,"./ReactInstanceMap":77,"./ReactMount":80,"./invariant":145,"./isNode":147,"./warning":164,"_process":1}],128:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -17734,7 +18314,7 @@ function flattenChildren(children) { module.exports = flattenChildren; }).call(this,require('_process')) -},{"./traverseAllChildren":154,"./warning":155,"_process":1}],120:[function(require,module,exports){ +},{"./traverseAllChildren":163,"./warning":164,"_process":1}],129:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. * All rights reserved. @@ -17763,7 +18343,7 @@ function focusNode(node) { module.exports = focusNode; -},{}],121:[function(require,module,exports){ +},{}],130:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17794,7 +18374,7 @@ var forEachAccumulated = function(arr, cb, scope) { module.exports = forEachAccumulated; -},{}],122:[function(require,module,exports){ +},{}],131:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17823,7 +18403,7 @@ function getActiveElement() /*?DOMElement*/ { module.exports = getActiveElement; -},{}],123:[function(require,module,exports){ +},{}],132:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17875,7 +18455,7 @@ function getEventCharCode(nativeEvent) { module.exports = getEventCharCode; -},{}],124:[function(require,module,exports){ +},{}],133:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -17980,7 +18560,7 @@ function getEventKey(nativeEvent) { module.exports = getEventKey; -},{"./getEventCharCode":123}],125:[function(require,module,exports){ +},{"./getEventCharCode":132}],134:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18027,7 +18607,7 @@ function getEventModifierState(nativeEvent) { module.exports = getEventModifierState; -},{}],126:[function(require,module,exports){ +},{}],135:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18058,7 +18638,7 @@ function getEventTarget(nativeEvent) { module.exports = getEventTarget; -},{}],127:[function(require,module,exports){ +},{}],136:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18102,7 +18682,7 @@ function getIteratorFn(maybeIterable) { module.exports = getIteratorFn; -},{}],128:[function(require,module,exports){ +},{}],137:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -18221,7 +18801,7 @@ function getMarkupWrap(nodeName) { module.exports = getMarkupWrap; }).call(this,require('_process')) -},{"./ExecutionEnvironment":21,"./invariant":136,"_process":1}],129:[function(require,module,exports){ +},{"./ExecutionEnvironment":30,"./invariant":145,"_process":1}],138:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18296,7 +18876,7 @@ function getNodeForCharacterOffset(root, offset) { module.exports = getNodeForCharacterOffset; -},{}],130:[function(require,module,exports){ +},{}],139:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18331,7 +18911,7 @@ function getReactRootElementInContainer(container) { module.exports = getReactRootElementInContainer; -},{}],131:[function(require,module,exports){ +},{}],140:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18368,7 +18948,7 @@ function getTextContentAccessor() { module.exports = getTextContentAccessor; -},{"./ExecutionEnvironment":21}],132:[function(require,module,exports){ +},{"./ExecutionEnvironment":30}],141:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18408,7 +18988,7 @@ function getUnboundedScrollPosition(scrollable) { module.exports = getUnboundedScrollPosition; -},{}],133:[function(require,module,exports){ +},{}],142:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18441,7 +19021,7 @@ function hyphenate(string) { module.exports = hyphenate; -},{}],134:[function(require,module,exports){ +},{}],143:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18482,7 +19062,7 @@ function hyphenateStyleName(string) { module.exports = hyphenateStyleName; -},{"./hyphenate":133}],135:[function(require,module,exports){ +},{"./hyphenate":142}],144:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -18620,7 +19200,7 @@ function instantiateReactComponent(node, parentCompositeType) { module.exports = instantiateReactComponent; }).call(this,require('_process')) -},{"./Object.assign":27,"./ReactCompositeComponent":38,"./ReactEmptyComponent":60,"./ReactNativeComponent":74,"./invariant":136,"./warning":155,"_process":1}],136:[function(require,module,exports){ +},{"./Object.assign":36,"./ReactCompositeComponent":47,"./ReactEmptyComponent":69,"./ReactNativeComponent":83,"./invariant":145,"./warning":164,"_process":1}],145:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -18677,7 +19257,7 @@ var invariant = function(condition, format, a, b, c, d, e, f) { module.exports = invariant; }).call(this,require('_process')) -},{"_process":1}],137:[function(require,module,exports){ +},{"_process":1}],146:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18742,7 +19322,7 @@ function isEventSupported(eventNameSuffix, capture) { module.exports = isEventSupported; -},{"./ExecutionEnvironment":21}],138:[function(require,module,exports){ +},{"./ExecutionEnvironment":30}],147:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18769,7 +19349,7 @@ function isNode(object) { module.exports = isNode; -},{}],139:[function(require,module,exports){ +},{}],148:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18812,7 +19392,7 @@ function isTextInputElement(elem) { module.exports = isTextInputElement; -},{}],140:[function(require,module,exports){ +},{}],149:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18837,7 +19417,7 @@ function isTextNode(object) { module.exports = isTextNode; -},{"./isNode":138}],141:[function(require,module,exports){ +},{"./isNode":147}],150:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -18892,7 +19472,7 @@ var keyMirror = function(obj) { module.exports = keyMirror; }).call(this,require('_process')) -},{"./invariant":136,"_process":1}],142:[function(require,module,exports){ +},{"./invariant":145,"_process":1}],151:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18928,7 +19508,7 @@ var keyOf = function(oneKeyObj) { module.exports = keyOf; -},{}],143:[function(require,module,exports){ +},{}],152:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -18981,7 +19561,7 @@ function mapObject(object, callback, context) { module.exports = mapObject; -},{}],144:[function(require,module,exports){ +},{}],153:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -19014,7 +19594,7 @@ function memoizeStringOnly(callback) { module.exports = memoizeStringOnly; -},{}],145:[function(require,module,exports){ +},{}],154:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -19054,7 +19634,7 @@ function onlyChild(children) { module.exports = onlyChild; }).call(this,require('_process')) -},{"./ReactElement":58,"./invariant":136,"_process":1}],146:[function(require,module,exports){ +},{"./ReactElement":67,"./invariant":145,"_process":1}],155:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -19082,7 +19662,7 @@ if (ExecutionEnvironment.canUseDOM) { module.exports = performance || {}; -},{"./ExecutionEnvironment":21}],147:[function(require,module,exports){ +},{"./ExecutionEnvironment":30}],156:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -19110,7 +19690,7 @@ var performanceNow = performance.now.bind(performance); module.exports = performanceNow; -},{"./performance":146}],148:[function(require,module,exports){ +},{"./performance":155}],157:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -19138,7 +19718,7 @@ function quoteAttributeValueForBrowser(value) { module.exports = quoteAttributeValueForBrowser; -},{"./escapeTextContentForBrowser":117}],149:[function(require,module,exports){ +},{"./escapeTextContentForBrowser":126}],158:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -19227,7 +19807,7 @@ if (ExecutionEnvironment.canUseDOM) { module.exports = setInnerHTML; -},{"./ExecutionEnvironment":21}],150:[function(require,module,exports){ +},{"./ExecutionEnvironment":30}],159:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -19269,7 +19849,7 @@ if (ExecutionEnvironment.canUseDOM) { module.exports = setTextContent; -},{"./ExecutionEnvironment":21,"./escapeTextContentForBrowser":117,"./setInnerHTML":149}],151:[function(require,module,exports){ +},{"./ExecutionEnvironment":30,"./escapeTextContentForBrowser":126,"./setInnerHTML":158}],160:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -19313,7 +19893,7 @@ function shallowEqual(objA, objB) { module.exports = shallowEqual; -},{}],152:[function(require,module,exports){ +},{}],161:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -19417,7 +19997,7 @@ function shouldUpdateReactComponent(prevElement, nextElement) { module.exports = shouldUpdateReactComponent; }).call(this,require('_process')) -},{"./warning":155,"_process":1}],153:[function(require,module,exports){ +},{"./warning":164,"_process":1}],162:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -19489,7 +20069,7 @@ function toArray(obj) { module.exports = toArray; }).call(this,require('_process')) -},{"./invariant":136,"_process":1}],154:[function(require,module,exports){ +},{"./invariant":145,"_process":1}],163:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -19742,7 +20322,7 @@ function traverseAllChildren(children, callback, traverseContext) { module.exports = traverseAllChildren; }).call(this,require('_process')) -},{"./ReactElement":58,"./ReactFragment":64,"./ReactInstanceHandles":67,"./getIteratorFn":127,"./invariant":136,"./warning":155,"_process":1}],155:[function(require,module,exports){ +},{"./ReactElement":67,"./ReactFragment":73,"./ReactInstanceHandles":76,"./getIteratorFn":136,"./invariant":145,"./warning":164,"_process":1}],164:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -19805,1615 +20385,5895 @@ if ("production" !== process.env.NODE_ENV) { module.exports = warning; }).call(this,require('_process')) -},{"./emptyFunction":115,"_process":1}],156:[function(require,module,exports){ +},{"./emptyFunction":124,"_process":1}],165:[function(require,module,exports){ module.exports = require('./lib/React'); -},{"./lib/React":29}],157:[function(require,module,exports){ +},{"./lib/React":38}],166:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports['default'] = createStore; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utilsIsPlainObject = require('./utils/isPlainObject'); + +var _utilsIsPlainObject2 = _interopRequireDefault(_utilsIsPlainObject); + +/** + * These are private action types reserved by Redux. + * For any unknown actions, you must return the current state. + * If the current state is undefined, you must return the initial state. + * Do not reference these action types directly in your code. + */ +var ActionTypes = { + INIT: '@@redux/INIT' +}; + +exports.ActionTypes = ActionTypes; +/** + * Creates a Redux store that holds the state tree. + * The only way to change the data in the store is to call `dispatch()` on it. + * + * There should only be a single store in your app. To specify how different + * parts of the state tree respond to actions, you may combine several reducers + * into a single reducer function by using `combineReducers`. + * + * @param {Function} reducer A function that returns the next state tree, given + * the current state tree and the action to handle. + * + * @param {any} [initialState] The initial state. You may optionally specify it + * to hydrate the state from the server in universal apps, or to restore a + * previously serialized user session. + * If you use `combineReducers` to produce the root reducer function, this must be + * an object with the same shape as `combineReducers` keys. + * + * @returns {Store} A Redux store that lets you read the state, dispatch actions + * and subscribe to changes. + */ + +function createStore(reducer, initialState) { + if (typeof reducer !== 'function') { + throw new Error('Expected the reducer to be a function.'); + } + + var currentReducer = reducer; + var currentState = initialState; + var listeners = []; + var isDispatching = false; + + /** + * Reads the state tree managed by the store. + * + * @returns {any} The current state tree of your application. + */ + function getState() { + return currentState; + } + + /** + * Adds a change listener. It will be called any time an action is dispatched, + * and some part of the state tree may potentially have changed. You may then + * call `getState()` to read the current state tree inside the callback. + * + * @param {Function} listener A callback to be invoked on every dispatch. + * @returns {Function} A function to remove this change listener. + */ + function subscribe(listener) { + listeners.push(listener); + + return function unsubscribe() { + var index = listeners.indexOf(listener); + listeners.splice(index, 1); + }; + } + + /** + * Dispatches an action. It is the only way to trigger a state change. + * + * The `reducer` function, used to create the store, will be called with the + * current state tree and the given `action`. Its return value will + * be considered the **next** state of the tree, and the change listeners + * will be notified. + * + * The base implementation only supports plain object actions. If you want to + * dispatch a Promise, an Observable, a thunk, or something else, you need to + * wrap your store creating function into the corresponding middleware. For + * example, see the documentation for the `redux-thunk` package. Even the + * middleware will eventually dispatch plain object actions using this method. + * + * @param {Object} action A plain object representing “what changed”. It is + * a good idea to keep actions serializable so you can record and replay user + * sessions, or use the time travelling `redux-devtools`. + * + * @returns {Object} For convenience, the same action object you dispatched. + * + * Note that, if you use a custom middleware, it may wrap `dispatch()` to + * return something else (for example, a Promise you can await). + */ + function dispatch(action) { + if (!_utilsIsPlainObject2['default'](action)) { + throw new Error('Actions must be plain objects. Use custom middleware for async actions.'); + } + + if (isDispatching) { + throw new Error('Reducers may not dispatch actions.'); + } + + try { + isDispatching = true; + currentState = currentReducer(currentState, action); + } finally { + isDispatching = false; + } + + listeners.slice().forEach(function (listener) { + return listener(); + }); + return action; + } + + /** + * Returns the reducer currently used by the store to calculate the state. + * + * It is likely that you will only need this function if you implement a hot + * reloading mechanism for Redux. + * + * @returns {Function} The reducer used by the current store. + */ + function getReducer() { + return currentReducer; + } + + /** + * Replaces the reducer currently used by the store to calculate the state. + * + * You might need this if your app implements code splitting and you want to + * load some of the reducers dynamically. You might also need this if you + * implement a hot reloading mechanism for Redux. + * + * @param {Function} nextReducer The reducer for the store to use instead. + * @returns {void} + */ + function replaceReducer(nextReducer) { + currentReducer = nextReducer; + dispatch({ type: ActionTypes.INIT }); + } + + // When a store is created, an "INIT" action is dispatched so that every + // reducer returns their initial state. This effectively populates + // the initial state tree. + dispatch({ type: ActionTypes.INIT }); + + return { + dispatch: dispatch, + subscribe: subscribe, + getState: getState, + getReducer: getReducer, + replaceReducer: replaceReducer + }; +} +},{"./utils/isPlainObject":172}],167:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _createStore = require('./createStore'); + +var _createStore2 = _interopRequireDefault(_createStore); + +var _utilsCombineReducers = require('./utils/combineReducers'); + +var _utilsCombineReducers2 = _interopRequireDefault(_utilsCombineReducers); + +var _utilsBindActionCreators = require('./utils/bindActionCreators'); + +var _utilsBindActionCreators2 = _interopRequireDefault(_utilsBindActionCreators); + +var _utilsApplyMiddleware = require('./utils/applyMiddleware'); + +var _utilsApplyMiddleware2 = _interopRequireDefault(_utilsApplyMiddleware); + +var _utilsCompose = require('./utils/compose'); + +var _utilsCompose2 = _interopRequireDefault(_utilsCompose); + +exports.createStore = _createStore2['default']; +exports.combineReducers = _utilsCombineReducers2['default']; +exports.bindActionCreators = _utilsBindActionCreators2['default']; +exports.applyMiddleware = _utilsApplyMiddleware2['default']; +exports.compose = _utilsCompose2['default']; +},{"./createStore":166,"./utils/applyMiddleware":168,"./utils/bindActionCreators":169,"./utils/combineReducers":170,"./utils/compose":171}],168:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +exports['default'] = applyMiddleware; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _compose = require('./compose'); + +var _compose2 = _interopRequireDefault(_compose); + +/** + * Creates a store enhancer that applies middleware to the dispatch method + * of the Redux store. This is handy for a variety of tasks, such as expressing + * asynchronous actions in a concise manner, or logging every action payload. + * + * See `redux-thunk` package as an example of the Redux middleware. + * + * Because middleware is potentially asynchronous, this should be the first + * store enhancer in the composition chain. + * + * Note that each middleware will be given the `dispatch` and `getState` functions + * as named arguments. + * + * @param {...Function} middlewares The middleware chain to be applied. + * @returns {Function} A store enhancer applying the middleware. + */ + +function applyMiddleware() { + for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) { + middlewares[_key] = arguments[_key]; + } + + return function (next) { + return function (reducer, initialState) { + var store = next(reducer, initialState); + var _dispatch = store.dispatch; + var chain = []; + + var middlewareAPI = { + getState: store.getState, + dispatch: function dispatch(action) { + return _dispatch(action); + } + }; + chain = middlewares.map(function (middleware) { + return middleware(middlewareAPI); + }); + _dispatch = _compose2['default'].apply(undefined, chain.concat([store.dispatch])); + + return _extends({}, store, { + dispatch: _dispatch + }); + }; + }; +} + +module.exports = exports['default']; +},{"./compose":171}],169:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports['default'] = bindActionCreators; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _utilsMapValues = require('../utils/mapValues'); + +var _utilsMapValues2 = _interopRequireDefault(_utilsMapValues); + +function bindActionCreator(actionCreator, dispatch) { + return function () { + return dispatch(actionCreator.apply(undefined, arguments)); + }; +} + +/** + * Turns an object whose values are action creators, into an object with the + * same keys, but with every function wrapped into a `dispatch` call so they + * may be invoked directly. This is just a convenience method, as you can call + * `store.dispatch(MyActionCreators.doSomething())` yourself just fine. + * + * For convenience, you can also pass a single function as the first argument, + * and get a function in return. + * + * @param {Function|Object} actionCreators An object whose values are action + * creator functions. One handy way to obtain it is to use ES6 `import * as` + * syntax. You may also pass a single function. + * + * @param {Function} dispatch The `dispatch` function available on your Redux + * store. + * + * @returns {Function|Object} The object mimicking the original object, but with + * every action creator wrapped into the `dispatch` call. If you passed a + * function as `actionCreators`, the return value will also be a single + * function. + */ + +function bindActionCreators(actionCreators, dispatch) { + if (typeof actionCreators === 'function') { + return bindActionCreator(actionCreators, dispatch); + } + + if (typeof actionCreators !== 'object' || actionCreators == null) { + throw new Error('bindActionCreators expected an object or a function, instead received ' + typeof actionCreators + '. ' + 'Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?'); + } + + return _utilsMapValues2['default'](actionCreators, function (actionCreator) { + return bindActionCreator(actionCreator, dispatch); + }); +} + +module.exports = exports['default']; +},{"../utils/mapValues":173}],170:[function(require,module,exports){ +(function (process){ +'use strict'; + +exports.__esModule = true; +exports['default'] = combineReducers; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _createStore = require('../createStore'); + +var _utilsIsPlainObject = require('../utils/isPlainObject'); + +var _utilsIsPlainObject2 = _interopRequireDefault(_utilsIsPlainObject); + +var _utilsMapValues = require('../utils/mapValues'); + +var _utilsMapValues2 = _interopRequireDefault(_utilsMapValues); + +var _utilsPick = require('../utils/pick'); + +var _utilsPick2 = _interopRequireDefault(_utilsPick); + +function getErrorMessage(key, action) { + var actionType = action && action.type; + var actionName = actionType && '"' + actionType.toString() + '"' || 'an action'; + + return 'Reducer "' + key + '" returned undefined handling ' + actionName + '. ' + 'To ignore an action, you must explicitly return the previous state.'; +} + +function verifyStateShape(initialState, currentState) { + var reducerKeys = Object.keys(currentState); + + if (reducerKeys.length === 0) { + console.error('Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.'); + return; + } + + if (!_utilsIsPlainObject2['default'](initialState)) { + console.error('initialState has unexpected type of "' + ({}).toString.call(initialState).match(/\s([a-z|A-Z]+)/)[1] + '". Expected initialState to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"')); + return; + } + + var unexpectedKeys = Object.keys(initialState).filter(function (key) { + return reducerKeys.indexOf(key) < 0; + }); + + if (unexpectedKeys.length > 0) { + console.error('Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('"' + unexpectedKeys.join('", "') + '" in initialState will be ignored. ') + ('Expected to find one of the known reducer keys instead: "' + reducerKeys.join('", "') + '"')); + } +} + +/** + * Turns an object whose values are different reducer functions, into a single + * reducer function. It will call every child reducer, and gather their results + * into a single state object, whose keys correspond to the keys of the passed + * reducer functions. + * + * @param {Object} reducers An object whose values correspond to different + * reducer functions that need to be combined into one. One handy way to obtain + * it is to use ES6 `import * as reducers` syntax. The reducers may never return + * undefined for any action. Instead, they should return their initial state + * if the state passed to them was undefined, and the current state for any + * unrecognized action. + * + * @returns {Function} A reducer function that invokes every reducer inside the + * passed object, and builds a state object with the same shape. + */ + +function combineReducers(reducers) { + var finalReducers = _utilsPick2['default'](reducers, function (val) { + return typeof val === 'function'; + }); + + Object.keys(finalReducers).forEach(function (key) { + var reducer = finalReducers[key]; + if (typeof reducer(undefined, { type: _createStore.ActionTypes.INIT }) === 'undefined') { + throw new Error('Reducer "' + key + '" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined.'); + } + + var type = Math.random().toString(36).substring(7).split('').join('.'); + if (typeof reducer(undefined, { type: type }) === 'undefined') { + throw new Error('Reducer "' + key + '" returned undefined when probed with a random type. ' + ('Don\'t try to handle ' + _createStore.ActionTypes.INIT + ' or other actions in "redux/*" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined.'); + } + }); + + var defaultState = _utilsMapValues2['default'](finalReducers, function () { + return undefined; + }); + var stateShapeVerified; + + return function combination(state, action) { + if (state === undefined) state = defaultState; + + var finalState = _utilsMapValues2['default'](finalReducers, function (reducer, key) { + var newState = reducer(state[key], action); + if (typeof newState === 'undefined') { + throw new Error(getErrorMessage(key, action)); + } + return newState; + }); + + if ( + // Node-like CommonJS environments (Browserify, Webpack) + typeof process !== 'undefined' && typeof process.env !== 'undefined' && process.env.NODE_ENV !== 'production' || + // React Native + typeof __DEV__ !== 'undefined' && __DEV__ //eslint-disable-line no-undef + ) { + if (!stateShapeVerified) { + verifyStateShape(state, finalState); + stateShapeVerified = true; + } + } + + return finalState; + }; +} + +module.exports = exports['default']; +}).call(this,require('_process')) +},{"../createStore":166,"../utils/isPlainObject":172,"../utils/mapValues":173,"../utils/pick":174,"_process":1}],171:[function(require,module,exports){ +/** + * Composes functions from left to right. + * + * @param {...Function} funcs - The functions to compose. Each is expected to + * accept a function as an argument and to return a function. + * @returns {Function} A function obtained by composing functions from left to + * right. + */ +"use strict"; + +exports.__esModule = true; +exports["default"] = compose; + +function compose() { + for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) { + funcs[_key] = arguments[_key]; + } + + return funcs.reduceRight(function (composed, f) { + return f(composed); + }); +} + +module.exports = exports["default"]; +},{}],172:[function(require,module,exports){ +arguments[4][7][0].apply(exports,arguments) +},{"dup":7}],173:[function(require,module,exports){ +/** + * Applies a function to every key-value pair inside an object. + * + * @param {Object} obj The source object. + * @param {Function} fn The mapper function taht receives the value and the key. + * @returns {Object} A new object that contains the mapped values for the keys. + */ +"use strict"; + +exports.__esModule = true; +exports["default"] = mapValues; + +function mapValues(obj, fn) { + return Object.keys(obj).reduce(function (result, key) { + result[key] = fn(obj[key], key); + return result; + }, {}); +} + +module.exports = exports["default"]; +},{}],174:[function(require,module,exports){ +/** + * Picks key-value pairs from an object where values satisfy a predicate. + * + * @param {Object} obj The object to pick from. + * @param {Function} fn The predicate the values must satisfy to be copied. + * @returns {Object} The object with the values that satisfied the predicate. + */ +"use strict"; + +exports.__esModule = true; +exports["default"] = pick; + +function pick(obj, fn) { + return Object.keys(obj).reduce(function (result, key) { + if (fn(obj[key])) { + result[key] = obj[key]; + } + return result; + }, {}); +} + +module.exports = exports["default"]; +},{}],175:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = changedir; + +var _actionsTypes = require('actions/types'); + +function changedir(dir) { + return { + type: _actionsTypes.CHANGE_DIRECTORY, + dir: dir + }; +} + +module.exports = exports['default']; + +},{"actions/types":177}],176:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports['default'] = listFiles; + +var _actionsTypes = require('actions/types'); + +function listFiles(files) { + return { + type: _actionsTypes.LIST_FILES, + files: files + }; +} + +module.exports = exports['default']; + +},{"actions/types":177}],177:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports["default"] = React.createClass({ - displayName: "root", +var TYPES = { + CHANGE_DIRECTORY: Symbol(), + LIST_FILES: Symbol(), + SORT: Symbol(), + SEARCH: Symbol(), + REFRESH: Symbol() +}; - render: function render() { - return React.createElement("div", null); - } -}); +exports["default"] = TYPES; module.exports = exports["default"]; -},{}],158:[function(require,module,exports){ -// This is the Gaia version of l20n: https://github.com/l20n/l20n.js -// l20n is Apache 2.0 licensed: https://github.com/l20n/l20n.js/blob/master/LICENSE +},{}],178:[function(require,module,exports){ 'use strict'; -(function (window, undefined) { - 'use strict'; +Object.defineProperty(exports, '__esModule', { + value: true +}); - /* jshint validthis:true */ - function L10nError(message, id, loc) { - this.name = 'L10nError'; - this.message = message; - this.id = id; - this.loc = loc; - } - L10nError.prototype = Object.create(Error.prototype); - L10nError.prototype.constructor = L10nError; +var directory = _asyncToGenerator(function* () { + var dir = arguments.length <= 0 || arguments[0] === undefined ? '/' : arguments[0]; - /* jshint browser:true */ + var storage = navigator.getDeviceStorage('sdcard'); + var root = yield storage.getRoot(); - var io = { - load: function load(url, callback, sync) { - var xhr = new XMLHttpRequest(); + if (dir === '/' || !dir) return root; - if (xhr.overrideMimeType) { - xhr.overrideMimeType('text/plain'); - } + return yield root.get(dir); +}); - xhr.open('GET', url, !sync); +exports.directory = directory; - xhr.addEventListener('load', function io_load(e) { - if (e.target.status === 200 || e.target.status === 0) { - callback(null, e.target.responseText); - } else { - callback(new L10nError('Not found: ' + url)); - } - }); - xhr.addEventListener('error', callback); - xhr.addEventListener('timeout', callback); +var children = _asyncToGenerator(function* (dir) { + var parent = yield directory(dir); + return yield parent.getFilesAndDirectories(); +}); - // the app: protocol throws on 404, see https://bugzil.la/827243 - try { - xhr.send(null); - } catch (e) { - callback(new L10nError('Not found: ' + url)); - } - }, +exports.children = children; - loadJSON: function loadJSON(url, callback) { - var xhr = new XMLHttpRequest(); +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; } - if (xhr.overrideMimeType) { - xhr.overrideMimeType('application/json'); - } - - xhr.open('GET', url); - - xhr.responseType = 'json'; - xhr.addEventListener('load', function io_loadjson(e) { - if (e.target.status === 200 || e.target.status === 0) { - callback(null, e.target.response); - } else { - callback(new L10nError('Not found: ' + url)); - } - }); - xhr.addEventListener('error', callback); - xhr.addEventListener('timeout', callback); - - // the app: protocol throws on 404, see https://bugzil.la/827243 - try { - xhr.send(null); - } catch (e) { - callback(new L10nError('Not found: ' + url)); - } - } - }; - - function EventEmitter() {} - - EventEmitter.prototype.emit = function ee_emit() { - if (!this._listeners) { - return; - } - - var args = Array.prototype.slice.call(arguments); - var type = args.shift(); - if (!this._listeners[type]) { - return; - } - - var typeListeners = this._listeners[type].slice(); - for (var i = 0; i < typeListeners.length; i++) { - typeListeners[i].apply(this, args); - } - }; - - EventEmitter.prototype.addEventListener = function ee_add(type, listener) { - if (!this._listeners) { - this._listeners = {}; - } - if (!(type in this._listeners)) { - this._listeners[type] = []; - } - this._listeners[type].push(listener); - }; - - EventEmitter.prototype.removeEventListener = function ee_rm(type, listener) { - if (!this._listeners) { - return; - } - - var typeListeners = this._listeners[type]; - var pos = typeListeners.indexOf(listener); - if (pos === -1) { - return; - } - - typeListeners.splice(pos, 1); - }; - - function getPluralRule(lang) { - var locales2rules = { - 'af': 3, - 'ak': 4, - 'am': 4, - 'ar': 1, - 'asa': 3, - 'az': 0, - 'be': 11, - 'bem': 3, - 'bez': 3, - 'bg': 3, - 'bh': 4, - 'bm': 0, - 'bn': 3, - 'bo': 0, - 'br': 20, - 'brx': 3, - 'bs': 11, - 'ca': 3, - 'cgg': 3, - 'chr': 3, - 'cs': 12, - 'cy': 17, - 'da': 3, - 'de': 3, - 'dv': 3, - 'dz': 0, - 'ee': 3, - 'el': 3, - 'en': 3, - 'eo': 3, - 'es': 3, - 'et': 3, - 'eu': 3, - 'fa': 0, - 'ff': 5, - 'fi': 3, - 'fil': 4, - 'fo': 3, - 'fr': 5, - 'fur': 3, - 'fy': 3, - 'ga': 8, - 'gd': 24, - 'gl': 3, - 'gsw': 3, - 'gu': 3, - 'guw': 4, - 'gv': 23, - 'ha': 3, - 'haw': 3, - 'he': 2, - 'hi': 4, - 'hr': 11, - 'hu': 0, - 'id': 0, - 'ig': 0, - 'ii': 0, - 'is': 3, - 'it': 3, - 'iu': 7, - 'ja': 0, - 'jmc': 3, - 'jv': 0, - 'ka': 0, - 'kab': 5, - 'kaj': 3, - 'kcg': 3, - 'kde': 0, - 'kea': 0, - 'kk': 3, - 'kl': 3, - 'km': 0, - 'kn': 0, - 'ko': 0, - 'ksb': 3, - 'ksh': 21, - 'ku': 3, - 'kw': 7, - 'lag': 18, - 'lb': 3, - 'lg': 3, - 'ln': 4, - 'lo': 0, - 'lt': 10, - 'lv': 6, - 'mas': 3, - 'mg': 4, - 'mk': 16, - 'ml': 3, - 'mn': 3, - 'mo': 9, - 'mr': 3, - 'ms': 0, - 'mt': 15, - 'my': 0, - 'nah': 3, - 'naq': 7, - 'nb': 3, - 'nd': 3, - 'ne': 3, - 'nl': 3, - 'nn': 3, - 'no': 3, - 'nr': 3, - 'nso': 4, - 'ny': 3, - 'nyn': 3, - 'om': 3, - 'or': 3, - 'pa': 3, - 'pap': 3, - 'pl': 13, - 'ps': 3, - 'pt': 3, - 'rm': 3, - 'ro': 9, - 'rof': 3, - 'ru': 11, - 'rwk': 3, - 'sah': 0, - 'saq': 3, - 'se': 7, - 'seh': 3, - 'ses': 0, - 'sg': 0, - 'sh': 11, - 'shi': 19, - 'sk': 12, - 'sl': 14, - 'sma': 7, - 'smi': 7, - 'smj': 7, - 'smn': 7, - 'sms': 7, - 'sn': 3, - 'so': 3, - 'sq': 3, - 'sr': 11, - 'ss': 3, - 'ssy': 3, - 'st': 3, - 'sv': 3, - 'sw': 3, - 'syr': 3, - 'ta': 3, - 'te': 3, - 'teo': 3, - 'th': 0, - 'ti': 4, - 'tig': 3, - 'tk': 3, - 'tl': 4, - 'tn': 3, - 'to': 0, - 'tr': 0, - 'ts': 3, - 'tzm': 22, - 'uk': 11, - 'ur': 3, - 've': 3, - 'vi': 0, - 'vun': 3, - 'wa': 4, - 'wae': 3, - 'wo': 0, - 'xh': 3, - 'xog': 3, - 'yo': 0, - 'zh': 0, - 'zu': 3 - }; - - // utility functions for plural rules methods - function isIn(n, list) { - return list.indexOf(n) !== -1; - } - function isBetween(n, start, end) { - return start <= n && n <= end; - } - - // list of all plural rules methods: - // map an integer to the plural form name to use - var pluralRules = { - '0': function _() { - return 'other'; - }, - '1': function _(n) { - if (isBetween(n % 100, 3, 10)) { - return 'few'; - } - if (n === 0) { - return 'zero'; - } - if (isBetween(n % 100, 11, 99)) { - return 'many'; - } - if (n === 2) { - return 'two'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '2': function _(n) { - if (n !== 0 && n % 10 === 0) { - return 'many'; - } - if (n === 2) { - return 'two'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '3': function _(n) { - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '4': function _(n) { - if (isBetween(n, 0, 1)) { - return 'one'; - } - return 'other'; - }, - '5': function _(n) { - if (isBetween(n, 0, 2) && n !== 2) { - return 'one'; - } - return 'other'; - }, - '6': function _(n) { - if (n === 0) { - return 'zero'; - } - if (n % 10 === 1 && n % 100 !== 11) { - return 'one'; - } - return 'other'; - }, - '7': function _(n) { - if (n === 2) { - return 'two'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '8': function _(n) { - if (isBetween(n, 3, 6)) { - return 'few'; - } - if (isBetween(n, 7, 10)) { - return 'many'; - } - if (n === 2) { - return 'two'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '9': function _(n) { - if (n === 0 || n !== 1 && isBetween(n % 100, 1, 19)) { - return 'few'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '10': function _(n) { - if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) { - return 'few'; - } - if (n % 10 === 1 && !isBetween(n % 100, 11, 19)) { - return 'one'; - } - return 'other'; - }, - '11': function _(n) { - if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) { - return 'few'; - } - if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) { - return 'many'; - } - if (n % 10 === 1 && n % 100 !== 11) { - return 'one'; - } - return 'other'; - }, - '12': function _(n) { - if (isBetween(n, 2, 4)) { - return 'few'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '13': function _(n) { - if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) { - return 'few'; - } - if (n !== 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) { - return 'many'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '14': function _(n) { - if (isBetween(n % 100, 3, 4)) { - return 'few'; - } - if (n % 100 === 2) { - return 'two'; - } - if (n % 100 === 1) { - return 'one'; - } - return 'other'; - }, - '15': function _(n) { - if (n === 0 || isBetween(n % 100, 2, 10)) { - return 'few'; - } - if (isBetween(n % 100, 11, 19)) { - return 'many'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '16': function _(n) { - if (n % 10 === 1 && n !== 11) { - return 'one'; - } - return 'other'; - }, - '17': function _(n) { - if (n === 3) { - return 'few'; - } - if (n === 0) { - return 'zero'; - } - if (n === 6) { - return 'many'; - } - if (n === 2) { - return 'two'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '18': function _(n) { - if (n === 0) { - return 'zero'; - } - if (isBetween(n, 0, 2) && n !== 0 && n !== 2) { - return 'one'; - } - return 'other'; - }, - '19': function _(n) { - if (isBetween(n, 2, 10)) { - return 'few'; - } - if (isBetween(n, 0, 1)) { - return 'one'; - } - return 'other'; - }, - '20': function _(n) { - if ((isBetween(n % 10, 3, 4) || n % 10 === 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) { - return 'few'; - } - if (n % 1000000 === 0 && n !== 0) { - return 'many'; - } - if (n % 10 === 2 && !isIn(n % 100, [12, 72, 92])) { - return 'two'; - } - if (n % 10 === 1 && !isIn(n % 100, [11, 71, 91])) { - return 'one'; - } - return 'other'; - }, - '21': function _(n) { - if (n === 0) { - return 'zero'; - } - if (n === 1) { - return 'one'; - } - return 'other'; - }, - '22': function _(n) { - if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) { - return 'one'; - } - return 'other'; - }, - '23': function _(n) { - if (isBetween(n % 10, 1, 2) || n % 20 === 0) { - return 'one'; - } - return 'other'; - }, - '24': function _(n) { - if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) { - return 'few'; - } - if (isIn(n, [2, 12])) { - return 'two'; - } - if (isIn(n, [1, 11])) { - return 'one'; - } - return 'other'; - } - }; - - // return a function that gives the plural form name for a given integer - var index = locales2rules[lang.replace(/-.*$/, '')]; - if (!(index in pluralRules)) { - return function () { - return 'other'; - }; - } - return pluralRules[index]; - } - - var nestedProps = ['style', 'dataset']; - - var parsePatterns; - - function parse(ctx, source) { - var ast = {}; - - if (!parsePatterns) { - parsePatterns = { - comment: /^\s*#|^\s*$/, - entity: /^([^=\s]+)\s*=\s*(.+)$/, - multiline: /[^\\]\\$/, - macro: /\{\[\s*(\w+)\(([^\)]*)\)\s*\]\}/i, - unicode: /\\u([0-9a-fA-F]{1,4})/g, - entries: /[\r\n]+/, - controlChars: /\\([\\\n\r\t\b\f\{\}\"\'])/g - }; - } - - var entries = source.split(parsePatterns.entries); - for (var i = 0; i < entries.length; i++) { - var line = entries[i]; - - if (parsePatterns.comment.test(line)) { - continue; - } - - while (parsePatterns.multiline.test(line) && i < entries.length) { - line = line.slice(0, -1) + entries[++i].trim(); - } - - var entityMatch = line.match(parsePatterns.entity); - if (entityMatch) { - try { - parseEntity(entityMatch[1], entityMatch[2], ast); - } catch (e) { - if (ctx) { - ctx._emitter.emit('error', e); - } else { - throw e; - } - } - } - } - return ast; - } - - function setEntityValue(id, attr, key, value, ast) { - var obj = ast; - var prop = id; - - if (attr) { - if (!(id in obj)) { - obj[id] = {}; - } - if (typeof obj[id] === 'string') { - obj[id] = { '_': obj[id] }; - } - obj = obj[id]; - prop = attr; - } - - if (!key) { - obj[prop] = value; - return; - } - - if (!(prop in obj)) { - obj[prop] = { '_': {} }; - } else if (typeof obj[prop] === 'string') { - obj[prop] = { '_index': parseMacro(obj[prop]), '_': {} }; - } - obj[prop]._[key] = value; - } - - function parseEntity(id, value, ast) { - var name, key; - - var pos = id.indexOf('['); - if (pos !== -1) { - name = id.substr(0, pos); - key = id.substring(pos + 1, id.length - 1); - } else { - name = id; - key = null; - } - - var nameElements = name.split('.'); - - var attr; - if (nameElements.length > 1) { - var attrElements = []; - attrElements.push(nameElements.pop()); - if (nameElements.length > 1) { - // Usually the last dot separates an attribute from an id - // - // In case when there are more than one dot in the id - // and the second to last item is "style" or "dataset" then the last two - // items are becoming the attribute. - // - // ex. - // id.style.color = foo => - // - // id: - // style.color: foo - // - // id.other.color = foo => - // - // id.other: - // color: foo - if (nestedProps.indexOf(nameElements[nameElements.length - 1]) !== -1) { - attrElements.push(nameElements.pop()); - } - } - name = nameElements.join('.'); - attr = attrElements.reverse().join('.'); - } else { - attr = null; - } - - setEntityValue(name, attr, key, unescapeString(value), ast); - } - - function unescapeControlCharacters(str) { - return str.replace(parsePatterns.controlChars, '$1'); - } - - function unescapeUnicode(str) { - return str.replace(parsePatterns.unicode, function (match, token) { - return unescape('%u' + '0000'.slice(token.length) + token); - }); - } - - function unescapeString(str) { - if (str.lastIndexOf('\\') !== -1) { - str = unescapeControlCharacters(str); - } - return unescapeUnicode(str); - } - - function parseMacro(str) { - var match = str.match(parsePatterns.macro); - if (!match) { - throw new L10nError('Malformed macro'); - } - return [match[1], match[2]]; - } - - var MAX_PLACEABLE_LENGTH = 2500; - var MAX_PLACEABLES = 100; - var rePlaceables = /\{\{\s*(.+?)\s*\}\}/g; - - function Entity(id, node, env) { - this.id = id; - this.env = env; - // the dirty guard prevents cyclic or recursive references from other - // Entities; see Entity.prototype.resolve - this.dirty = false; - if (typeof node === 'string') { - this.value = node; - } else { - // it's either a hash or it has attrs, or both - for (var key in node) { - if (node.hasOwnProperty(key) && key[0] !== '_') { - if (!this.attributes) { - this.attributes = {}; - } - this.attributes[key] = new Entity(this.id + '.' + key, node[key], env); - } - } - this.value = node._ || null; - this.index = node._index; - } - } - - Entity.prototype.resolve = function E_resolve(ctxdata) { - if (this.dirty) { - return undefined; - } - - this.dirty = true; - var val; - // if resolve fails, we want the exception to bubble up and stop the whole - // resolving process; however, we still need to clean up the dirty flag - try { - val = resolve(ctxdata, this.env, this.value, this.index); - } finally { - this.dirty = false; - } - return val; - }; - - Entity.prototype.toString = function E_toString(ctxdata) { - try { - return this.resolve(ctxdata); - } catch (e) { - return undefined; - } - }; - - Entity.prototype.valueOf = function E_valueOf(ctxdata) { - if (!this.attributes) { - return this.toString(ctxdata); - } - - var entity = { - value: this.toString(ctxdata), - attributes: {} - }; - - for (var key in this.attributes) { - if (this.attributes.hasOwnProperty(key)) { - entity.attributes[key] = this.attributes[key].toString(ctxdata); - } - } - - return entity; - }; - - function subPlaceable(ctxdata, env, match, id) { - if (ctxdata && ctxdata.hasOwnProperty(id) && (typeof ctxdata[id] === 'string' || typeof ctxdata[id] === 'number' && !isNaN(ctxdata[id]))) { - return ctxdata[id]; - } - - if (env.hasOwnProperty(id)) { - if (!(env[id] instanceof Entity)) { - env[id] = new Entity(id, env[id], env); - } - var value = env[id].resolve(ctxdata); - if (typeof value === 'string') { - // prevent Billion Laughs attacks - if (value.length >= MAX_PLACEABLE_LENGTH) { - throw new L10nError('Too many characters in placeable (' + value.length + ', max allowed is ' + MAX_PLACEABLE_LENGTH + ')'); - } - return value; - } - } - return match; - } - - function interpolate(ctxdata, env, str) { - var placeablesCount = 0; - var value = str.replace(rePlaceables, function (match, id) { - // prevent Quadratic Blowup attacks - if (placeablesCount++ >= MAX_PLACEABLES) { - throw new L10nError('Too many placeables (' + placeablesCount + ', max allowed is ' + MAX_PLACEABLES + ')'); - } - return subPlaceable(ctxdata, env, match, id); - }); - placeablesCount = 0; - return value; - } - - function resolve(_x, _x2, _x3, _x4) { - var _again = true; - - _function: while (_again) { - var ctxdata = _x, - env = _x2, - expr = _x3, - index = _x4; - argValue = selector = undefined; - _again = false; - - if (typeof expr === 'string') { - return interpolate(ctxdata, env, expr); - } - - if (typeof expr === 'boolean' || typeof expr === 'number' || !expr) { - return expr; - } - - // otherwise, it's a dict - - if (index && ctxdata && ctxdata.hasOwnProperty(index[1])) { - var argValue = ctxdata[index[1]]; - - // special cases for zero, one, two if they are defined on the hash - if (argValue === 0 && 'zero' in expr) { - _x = ctxdata; - _x2 = env; - _x3 = expr.zero; - _x4 = undefined; - _again = true; - continue _function; - } - if (argValue === 1 && 'one' in expr) { - _x = ctxdata; - _x2 = env; - _x3 = expr.one; - _x4 = undefined; - _again = true; - continue _function; - } - if (argValue === 2 && 'two' in expr) { - _x = ctxdata; - _x2 = env; - _x3 = expr.two; - _x4 = undefined; - _again = true; - continue _function; - } - - var selector = env.__plural(argValue); - if (expr.hasOwnProperty(selector)) { - _x = ctxdata; - _x2 = env; - _x3 = expr[selector]; - _x4 = undefined; - _again = true; - continue _function; - } - } - - // if there was no index or no selector was found, try 'other' - if ('other' in expr) { - _x = ctxdata; - _x2 = env; - _x3 = expr.other; - _x4 = undefined; - _again = true; - continue _function; - } - - return undefined; - } - } - - function compile(env, ast) { - env = env || {}; - for (var id in ast) { - if (ast.hasOwnProperty(id)) { - env[id] = new Entity(id, ast[id], env); - } - } - return env; - } - - function Locale(id, ctx) { - this.id = id; - this.ctx = ctx; - this.isReady = false; - this.entries = { - __plural: getPluralRule(id) - }; - } - - Locale.prototype.getEntry = function L_getEntry(id) { - /* jshint -W093 */ - - var entries = this.entries; - - if (!entries.hasOwnProperty(id)) { - return undefined; - } - - if (entries[id] instanceof Entity) { - return entries[id]; - } - - return entries[id] = new Entity(id, entries[id], entries); - }; - - Locale.prototype.build = function L_build(callback) { - var sync = !callback; - var ctx = this.ctx; - var self = this; - - var l10nLoads = ctx.resLinks.length; - - function onL10nLoaded(err) { - if (err) { - ctx._emitter.emit('error', err); - } - if (--l10nLoads <= 0) { - self.isReady = true; - if (callback) { - callback(); - } - } - } - - if (l10nLoads === 0) { - onL10nLoaded(); - return; - } - - function onJSONLoaded(err, json) { - if (!err && json) { - self.addAST(json); - } - onL10nLoaded(err); - } - - function onPropLoaded(err, source) { - if (!err && source) { - var ast = parse(ctx, source); - self.addAST(ast); - } - onL10nLoaded(err); - } - - for (var i = 0; i < ctx.resLinks.length; i++) { - var path = ctx.resLinks[i].replace('{{locale}}', this.id); - var type = path.substr(path.lastIndexOf('.') + 1); - - switch (type) { - case 'json': - io.loadJSON(path, onJSONLoaded, sync); - break; - case 'properties': - io.load(path, onPropLoaded, sync); - break; - } - } - }; - - Locale.prototype.addAST = function (ast) { - for (var id in ast) { - if (ast.hasOwnProperty(id)) { - this.entries[id] = ast[id]; - } - } - }; - - Locale.prototype.getEntity = function (id, ctxdata) { - var entry = this.getEntry(id); - - if (!entry) { - return null; - } - return entry.valueOf(ctxdata); - }; - - function Context(id) { - - this.id = id; - this.isReady = false; - this.isLoading = false; - - this.supportedLocales = []; - this.resLinks = []; - this.locales = {}; - - this._emitter = new EventEmitter(); - - // Getting translations - - function getWithFallback(id) { - /* jshint -W084 */ - - if (!this.isReady) { - throw new L10nError('Context not ready'); - } - - var cur = 0; - var loc; - var locale; - while (loc = this.supportedLocales[cur]) { - locale = this.getLocale(loc); - if (!locale.isReady) { - // build without callback, synchronously - locale.build(null); - } - var entry = locale.getEntry(id); - if (entry === undefined) { - cur++; - warning.call(this, new L10nError(id + ' not found in ' + loc, id, loc)); - continue; - } - return entry; - } - - error.call(this, new L10nError(id + ' not found', id)); - return null; - } - - this.get = function get(id, ctxdata) { - var entry = getWithFallback.call(this, id); - if (entry === null) { - return ''; - } - - return entry.toString(ctxdata) || ''; - }; - - this.getEntity = function getEntity(id, ctxdata) { - var entry = getWithFallback.call(this, id); - if (entry === null) { - return null; - } - - return entry.valueOf(ctxdata); - }; - - // Helpers - - this.getLocale = function getLocale(code) { - /* jshint -W093 */ - - var locales = this.locales; - if (locales[code]) { - return locales[code]; - } - - return locales[code] = new Locale(code, this); - }; - - // Getting ready - - function negotiate(available, requested, defaultLocale) { - if (available.indexOf(requested[0]) === -1 || requested[0] === defaultLocale) { - return [defaultLocale]; - } else { - return [requested[0], defaultLocale]; - } - } - - function freeze(supported) { - var locale = this.getLocale(supported[0]); - if (locale.isReady) { - setReady.call(this, supported); - } else { - locale.build(setReady.bind(this, supported)); - } - } - - function setReady(supported) { - this.supportedLocales = supported; - this.isReady = true; - this._emitter.emit('ready'); - } - - this.requestLocales = function requestLocales() { - if (this.isLoading && !this.isReady) { - throw new L10nError('Context not ready'); - } - - this.isLoading = true; - var requested = Array.prototype.slice.call(arguments); - - var supported = negotiate(requested.concat('en-US'), requested, 'en-US'); - freeze.call(this, supported); - }; - - // Events - - this.addEventListener = function addEventListener(type, listener) { - this._emitter.addEventListener(type, listener); - }; - - this.removeEventListener = function removeEventListener(type, listener) { - this._emitter.removeEventListener(type, listener); - }; - - this.ready = function ready(callback) { - if (this.isReady) { - setTimeout(callback); - } - this.addEventListener('ready', callback); - }; - - this.once = function once(callback) { - /* jshint -W068 */ - if (this.isReady) { - setTimeout(callback); - return; - } - - var callAndRemove = (function () { - this.removeEventListener('ready', callAndRemove); - callback(); - }).bind(this); - this.addEventListener('ready', callAndRemove); - }; - - // Errors - - function warning(e) { - this._emitter.emit('warning', e); - return e; - } - - function error(e) { - this._emitter.emit('error', e); - return e; - } - } - - /* jshint -W104 */ - - var DEBUG = false; - var isPretranslated = false; - var rtlList = ['ar', 'he', 'fa', 'ps', 'qps-plocm', 'ur']; - - // Public API - - navigator.mozL10n = Object.defineProperties({ - ctx: new Context(), - get: function get(id, ctxdata) { - return navigator.mozL10n.ctx.get(id, ctxdata); - }, - localize: function localize(element, id, args) { - return localizeElement.call(navigator.mozL10n, element, id, args); - }, - translate: function translate(element) { - return translateFragment.call(navigator.mozL10n, element); - }, - ready: function ready(callback) { - return navigator.mozL10n.ctx.ready(callback); - }, - once: function once(callback) { - return navigator.mozL10n.ctx.once(callback); - }, - - language: Object.defineProperties({}, { - code: { - set: function set(lang) { - navigator.mozL10n.ctx.requestLocales(lang); - }, - get: function get() { - return navigator.mozL10n.ctx.supportedLocales[0]; - }, - configurable: true, - enumerable: true - }, - direction: { - get: function get() { - return getDirection(navigator.mozL10n.ctx.supportedLocales[0]); - }, - configurable: true, - enumerable: true - } - }), - _getInternalAPI: function _getInternalAPI() { - return { - Error: L10nError, - Context: Context, - Locale: Locale, - Entity: Entity, - getPluralRule: getPluralRule, - rePlaceables: rePlaceables, - getTranslatableChildren: getTranslatableChildren, - getL10nAttributes: getL10nAttributes, - loadINI: loadINI, - fireLocalizedEvent: fireLocalizedEvent, - parse: parse, - compile: compile - }; - } - }, { - readyState: { - get: function get() { - return navigator.mozL10n.ctx.isReady ? 'complete' : 'loading'; - }, - configurable: true, - enumerable: true - } - }); - - navigator.mozL10n.ctx.ready(onReady.bind(navigator.mozL10n)); - - if (DEBUG) { - navigator.mozL10n.ctx.addEventListener('error', console.error); - navigator.mozL10n.ctx.addEventListener('warning', console.warn); - } - - function getDirection(lang) { - return rtlList.indexOf(lang) >= 0 ? 'rtl' : 'ltr'; - } - - var readyStates = { - 'loading': 0, - 'interactive': 1, - 'complete': 2 - }; - - function waitFor(state, callback) { - state = readyStates[state]; - if (readyStates[document.readyState] >= state) { - callback(); - return; - } - - document.addEventListener('readystatechange', function l10n_onrsc() { - if (readyStates[document.readyState] >= state) { - document.removeEventListener('readystatechange', l10n_onrsc); - callback(); - } - }); - } - - if (window.document) { - isPretranslated = document.documentElement.lang === navigator.language; - - // this is a special case for netError bug; see https://bugzil.la/444165 - if (document.documentElement.dataset.noCompleteBug) { - pretranslate.call(navigator.mozL10n); - return; - } - - if (isPretranslated) { - waitFor('interactive', function () { - window.setTimeout(initResources.bind(navigator.mozL10n)); - }); - } else { - if (document.readyState === 'complete') { - window.setTimeout(initResources.bind(navigator.mozL10n)); - } else { - waitFor('interactive', pretranslate.bind(navigator.mozL10n)); - } - } - } - - function pretranslate() { - /* jshint -W068 */ - if (inlineLocalization.call(this)) { - waitFor('interactive', (function () { - window.setTimeout(initResources.bind(this)); - }).bind(this)); - } else { - initResources.call(this); - } - } - - function inlineLocalization() { - var script = document.documentElement.querySelector('script[type="application/l10n"]' + '[lang="' + navigator.language + '"]'); - if (!script) { - return false; - } - - var locale = this.ctx.getLocale(navigator.language); - // the inline localization is happenning very early, when the ctx is not - // yet ready and when the resources haven't been downloaded yet; add the - // inlined JSON directly to the current locale - locale.addAST(JSON.parse(script.innerHTML)); - // localize the visible DOM - var l10n = { - ctx: locale, - language: { - code: locale.id, - direction: getDirection(locale.id) - } - }; - translateFragment.call(l10n); - // the visible DOM is now pretranslated - isPretranslated = true; - return true; - } - - function initResources() { - var resLinks = document.head.querySelectorAll('link[type="application/l10n"]'); - var iniLinks = []; - var i; - - for (i = 0; i < resLinks.length; i++) { - var link = resLinks[i]; - var url = link.getAttribute('href'); - var type = url.substr(url.lastIndexOf('.') + 1); - if (type === 'ini') { - iniLinks.push(url); - } - this.ctx.resLinks.push(url); - } - - var iniLoads = iniLinks.length; - if (iniLoads === 0) { - initLocale.call(this); - return; - } - - function onIniLoaded(err) { - if (err) { - this.ctx._emitter.emit('error', err); - } - if (--iniLoads === 0) { - initLocale.call(this); - } - } - - for (i = 0; i < iniLinks.length; i++) { - loadINI.call(this, iniLinks[i], onIniLoaded.bind(this)); - } - } - - function initLocale() { - this.ctx.requestLocales(navigator.language); - window.addEventListener('languagechange', function l10n_langchange() { - navigator.mozL10n.language.code = navigator.language; - }); - } - - function onReady() { - if (!isPretranslated) { - this.translate(); - } - isPretranslated = false; - - fireLocalizedEvent.call(this); - } - - function fireLocalizedEvent() { - var event = new CustomEvent('localized', { - 'bubbles': false, - 'cancelable': false, - 'detail': { - 'language': this.ctx.supportedLocales[0] - } - }); - window.dispatchEvent(event); - } - - /* jshint -W104 */ - - function loadINI(url, callback) { - var ctx = this.ctx; - io.load(url, function (err, source) { - var pos = ctx.resLinks.indexOf(url); - - if (err) { - // remove the ini link from resLinks - ctx.resLinks.splice(pos, 1); - return callback(err); - } - - if (!source) { - ctx.resLinks.splice(pos, 1); - return callback(new Error('Empty file: ' + url)); - } - - var patterns = parseINI(source, url).resources.map(function (x) { - return x.replace('en-US', '{{locale}}'); - }); - ctx.resLinks.splice.apply(ctx.resLinks, [pos, 1].concat(patterns)); - callback(); - }); - } - - function relativePath(baseUrl, url) { - if (url[0] === '/') { - return url; - } - - var dirs = baseUrl.split('/').slice(0, -1).concat(url.split('/')).filter(function (path) { - return path !== '.'; - }); - - return dirs.join('/'); - } - - var iniPatterns = { - 'section': /^\s*\[(.*)\]\s*$/, - 'import': /^\s*@import\s+url\((.*)\)\s*$/i, - 'entry': /[\r\n]+/ - }; - - function parseINI(source, iniPath) { - var entries = source.split(iniPatterns.entry); - var locales = ['en-US']; - var genericSection = true; - var uris = []; - var match; - - for (var i = 0; i < entries.length; i++) { - var line = entries[i]; - // we only care about en-US resources - if (genericSection && iniPatterns['import'].test(line)) { - match = iniPatterns['import'].exec(line); - var uri = relativePath(iniPath, match[1]); - uris.push(uri); - continue; - } - - // but we need the list of all locales in the ini, too - if (iniPatterns.section.test(line)) { - genericSection = false; - match = iniPatterns.section.exec(line); - locales.push(match[1]); - } - } - return { - locales: locales, - resources: uris - }; - } - - /* jshint -W104 */ - - function translateFragment(element) { - if (!element) { - element = document.documentElement; - document.documentElement.lang = this.language.code; - document.documentElement.dir = this.language.direction; - } - translateElement.call(this, element); - - var nodes = getTranslatableChildren(element); - for (var i = 0; i < nodes.length; i++) { - translateElement.call(this, nodes[i]); - } - } - - function getTranslatableChildren(element) { - return element ? element.querySelectorAll('*[data-l10n-id]') : []; - } - - function localizeElement(element, id, args) { - if (!element) { - return; - } - - if (!id) { - element.removeAttribute('data-l10n-id'); - element.removeAttribute('data-l10n-args'); - setTextContent(element, ''); - return; - } - - element.setAttribute('data-l10n-id', id); - if (args && typeof args === 'object') { - element.setAttribute('data-l10n-args', JSON.stringify(args)); - } else { - element.removeAttribute('data-l10n-args'); - } - - if (this.ctx.isReady) { - translateElement.call(this, element); - } - } - - function getL10nAttributes(element) { - if (!element) { - return {}; - } - - var l10nId = element.getAttribute('data-l10n-id'); - var l10nArgs = element.getAttribute('data-l10n-args'); - - var args = l10nArgs ? JSON.parse(l10nArgs) : null; - - return { id: l10nId, args: args }; - } - - function translateElement(element) { - var l10n = getL10nAttributes(element); - - if (!l10n.id) { - return; - } - - var entity = this.ctx.getEntity(l10n.id, l10n.args); - - if (!entity) { - return; - } - - if (typeof entity === 'string') { - setTextContent(element, entity); - return true; - } - - if (entity.value) { - setTextContent(element, entity.value); - } - - for (var key in entity.attributes) { - if (entity.attributes.hasOwnProperty(key)) { - var attr = entity.attributes[key]; - var pos = key.indexOf('.'); - if (pos !== -1) { - element[key.substr(0, pos)][key.substr(pos + 1)] = attr; - } else if (key === 'ariaLabel') { - element.setAttribute('aria-label', attr); - } else { - element[key] = attr; - } - } - } - - return true; - } - - function setTextContent(element, text) { - // standard case: no element children - if (!element.firstElementChild) { - element.textContent = text; - return; - } - - // this element has element children: replace the content of the first - // (non-blank) child textNode and clear other child textNodes - var found = false; - var reNotBlank = /\S/; - for (var child = element.firstChild; child; child = child.nextSibling) { - if (child.nodeType === Node.TEXT_NODE && reNotBlank.test(child.nodeValue)) { - if (found) { - child.nodeValue = ''; - } else { - child.nodeValue = text; - found = true; - } - } - } - // if no (non-empty) textNode is found, insert a textNode before the - // element's first child. - if (!found) { - element.insertBefore(document.createTextNode(text), element.firstChild); - } - } -})(undefined); -// You can find the latest build for Gaia here: https://github.com/mozilla-b2g/gaia/blob/master/shared/js/l10n.js - -},{}],159:[function(require,module,exports){ +},{}],179:[function(require,module,exports){ 'use strict'; +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +var getFiles = _asyncToGenerator(function* (dir) { + var storage = navigator.getDeviceStorage('sdcard'); + var root = yield storage.get(dir); + + return yield root.getFilesAndDirectories(); +}); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _componentsRoot = require('components/root'); +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; } -var _componentsRoot2 = _interopRequireDefault(_componentsRoot); +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _react = require('react'); var _react2 = _interopRequireDefault(_react); -var x = "I'm just testing"; +var _reactRedux = require('react-redux'); -},{"components/root":157,"react":156}]},{},[157,158,159]); +var _file = require('./file'); + +var _file2 = _interopRequireDefault(_file); + +var FileList = (function (_Component) { + _inherits(FileList, _Component); + + function FileList() { + _classCallCheck(this, _FileList); + + _get(Object.getPrototypeOf(_FileList.prototype), 'constructor', this).call(this); + } + + _createClass(FileList, [{ + key: 'render', + value: function render() { + var _props = this.props; + var cwd = _props.cwd; + var files = _props.files; + + var els = files.map(function (file, index) { + return _react2['default'].createElement(_file2['default'], { key: index, index: index, name: file.name }); + }); + + return _react2['default'].createElement( + 'div', + null, + _react2['default'].createElement( + 'strong', + null, + 'cwd: ', + cwd + ), + els + ); + } + }]); + + var _FileList = FileList; + FileList = (0, _reactRedux.connect)(props)(FileList) || FileList; + return FileList; +})(_react.Component); + +exports['default'] = FileList; + +function props(state) { + return { + cwd: state.get('cwd'), + files: state.get('files') + }; +} + +module.exports = exports['default']; + +},{"./file":180,"react":165,"react-redux":5}],180:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _store = require('store'); + +var _store2 = _interopRequireDefault(_store); + +var _actionsChangedir = require('actions/changedir'); + +var _actionsChangedir2 = _interopRequireDefault(_actionsChangedir); + +var File = (function (_Component) { + _inherits(File, _Component); + + function File() { + _classCallCheck(this, File); + + _get(Object.getPrototypeOf(File.prototype), 'constructor', this).apply(this, arguments); + } + + _createClass(File, [{ + key: 'render', + value: function render() { + return _react2['default'].createElement( + 'div', + { onClick: this.peekInside.bind(this) }, + _react2['default'].createElement( + 'p', + null, + this.props.index, + '. ', + this.props.name + ) + ); + } + }, { + key: 'peekInside', + value: function peekInside() { + var file = _store2['default'].getState().get('files')[this.props.index]; + + console.log(file); + _store2['default'].dispatch((0, _actionsChangedir2['default'])(file.path.slice(1) + file.name)); + } + }]); + + return File; +})(_react.Component); + +exports['default'] = File; +module.exports = exports['default']; + +},{"actions/changedir":175,"react":165,"store":"store"}],181:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _componentsFileList = require('components/file-list'); + +var _componentsFileList2 = _interopRequireDefault(_componentsFileList); + +var _actionsChangedir = require('actions/changedir'); + +var _actionsChangedir2 = _interopRequireDefault(_actionsChangedir); + +var _store = require('store'); + +var _store2 = _interopRequireDefault(_store); + +window.store = _store2['default']; +window.changedir = _actionsChangedir2['default']; + +var Root = (function (_Component) { + _inherits(Root, _Component); + + function Root() { + _classCallCheck(this, Root); + + _get(Object.getPrototypeOf(Root.prototype), 'constructor', this).apply(this, arguments); + } + + _createClass(Root, [{ + key: 'render', + value: function render() { + return _react2['default'].createElement( + 'div', + null, + 'Hawk!', + _react2['default'].createElement(_componentsFileList2['default'], null) + ); + } + }]); + + return Root; +})(_react.Component); + +exports['default'] = Root; +module.exports = exports['default']; + +},{"actions/changedir":175,"components/file-list":179,"react":165,"store":"store"}],182:[function(require,module,exports){ +'use strict'; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _componentsRoot = require('components/root'); + +var _componentsRoot2 = _interopRequireDefault(_componentsRoot); + +var _store = require('store'); + +var _store2 = _interopRequireDefault(_store); + +var _reactRedux = require('react-redux'); + +var wrapper = document.getElementById('wrapper'); +_react2['default'].render(_react2['default'].createElement( + _reactRedux.Provider, + { store: _store2['default'] }, + function () { + return _react2['default'].createElement(_componentsRoot2['default'], null); + } +), wrapper); + +},{"components/root":181,"react":165,"react-redux":5,"store":"store"}],183:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _immutable = require('immutable'); + +var _immutable2 = _interopRequireDefault(_immutable); + +var _cwd = require('./cwd'); + +var _cwd2 = _interopRequireDefault(_cwd); + +var _files = require('./files'); + +var _files2 = _interopRequireDefault(_files); + +exports['default'] = function (state, action) { + if (state === undefined) state = new _immutable2['default'].Map(); + + return new _immutable2['default'].Map({ + cwd: (0, _cwd2['default'])(state.get('cwd'), action), + files: (0, _files2['default'])(state.get('files'), action) + }); +}; + +module.exports = exports['default']; + +},{"./cwd":184,"./files":185,"immutable":186}],184:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _actionsTypes = require('actions/types'); + +var _actionsListFiles = require('actions/list-files'); + +var _actionsListFiles2 = _interopRequireDefault(_actionsListFiles); + +var _apiFiles = require('api/files'); + +var _store = require('store'); + +var _store2 = _interopRequireDefault(_store); + +exports['default'] = function (state, action) { + if (state === undefined) state = '/'; + + switch (action.type) { + case _actionsTypes.CHANGE_DIRECTORY: + (0, _apiFiles.children)(action.dir).then(function (files) { + _store2['default'].dispatch((0, _actionsListFiles2['default'])(files)); + }); + return action.dir; + default: + return state; + } +}; + +module.exports = exports['default']; + +},{"actions/list-files":176,"actions/types":177,"api/files":178,"store":"store"}],185:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _actionsTypes = require('actions/types'); + +exports['default'] = function (state, action) { + if (state === undefined) state = []; + + switch (action.type) { + case _actionsTypes.LIST_FILES: + return action.files; + default: + return state; + } +}; + +module.exports = exports['default']; + +},{"actions/types":177}],186:[function(require,module,exports){ +/** + * Copyright (c) 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + global.Immutable = factory() +}(this, function () { 'use strict';var SLICE$0 = Array.prototype.slice; + + function createClass(ctor, superClass) { + if (superClass) { + ctor.prototype = Object.create(superClass.prototype); + } + ctor.prototype.constructor = ctor; + } + + // Used for setting prototype methods that IE8 chokes on. + var DELETE = 'delete'; + + // Constants describing the size of trie nodes. + var SHIFT = 5; // Resulted in best performance after ______? + var SIZE = 1 << SHIFT; + var MASK = SIZE - 1; + + // A consistent shared value representing "not set" which equals nothing other + // than itself, and nothing that could be provided externally. + var NOT_SET = {}; + + // Boolean references, Rough equivalent of `bool &`. + var CHANGE_LENGTH = { value: false }; + var DID_ALTER = { value: false }; + + function MakeRef(ref) { + ref.value = false; + return ref; + } + + function SetRef(ref) { + ref && (ref.value = true); + } + + // A function which returns a value representing an "owner" for transient writes + // to tries. The return value will only ever equal itself, and will not equal + // the return of any subsequent call of this function. + function OwnerID() {} + + // http://jsperf.com/copy-array-inline + function arrCopy(arr, offset) { + offset = offset || 0; + var len = Math.max(0, arr.length - offset); + var newArr = new Array(len); + for (var ii = 0; ii < len; ii++) { + newArr[ii] = arr[ii + offset]; + } + return newArr; + } + + function ensureSize(iter) { + if (iter.size === undefined) { + iter.size = iter.__iterate(returnTrue); + } + return iter.size; + } + + function wrapIndex(iter, index) { + return index >= 0 ? (+index) : ensureSize(iter) + (+index); + } + + function returnTrue() { + return true; + } + + function wholeSlice(begin, end, size) { + return (begin === 0 || (size !== undefined && begin <= -size)) && + (end === undefined || (size !== undefined && end >= size)); + } + + function resolveBegin(begin, size) { + return resolveIndex(begin, size, 0); + } + + function resolveEnd(end, size) { + return resolveIndex(end, size, size); + } + + function resolveIndex(index, size, defaultIndex) { + return index === undefined ? + defaultIndex : + index < 0 ? + Math.max(0, size + index) : + size === undefined ? + index : + Math.min(size, index); + } + + function Iterable(value) { + return isIterable(value) ? value : Seq(value); + } + + + createClass(KeyedIterable, Iterable); + function KeyedIterable(value) { + return isKeyed(value) ? value : KeyedSeq(value); + } + + + createClass(IndexedIterable, Iterable); + function IndexedIterable(value) { + return isIndexed(value) ? value : IndexedSeq(value); + } + + + createClass(SetIterable, Iterable); + function SetIterable(value) { + return isIterable(value) && !isAssociative(value) ? value : SetSeq(value); + } + + + + function isIterable(maybeIterable) { + return !!(maybeIterable && maybeIterable[IS_ITERABLE_SENTINEL]); + } + + function isKeyed(maybeKeyed) { + return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL]); + } + + function isIndexed(maybeIndexed) { + return !!(maybeIndexed && maybeIndexed[IS_INDEXED_SENTINEL]); + } + + function isAssociative(maybeAssociative) { + return isKeyed(maybeAssociative) || isIndexed(maybeAssociative); + } + + function isOrdered(maybeOrdered) { + return !!(maybeOrdered && maybeOrdered[IS_ORDERED_SENTINEL]); + } + + Iterable.isIterable = isIterable; + Iterable.isKeyed = isKeyed; + Iterable.isIndexed = isIndexed; + Iterable.isAssociative = isAssociative; + Iterable.isOrdered = isOrdered; + + Iterable.Keyed = KeyedIterable; + Iterable.Indexed = IndexedIterable; + Iterable.Set = SetIterable; + + + var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; + var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; + var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@'; + var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; + + /* global Symbol */ + + var ITERATE_KEYS = 0; + var ITERATE_VALUES = 1; + var ITERATE_ENTRIES = 2; + + var REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; + + var ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL; + + + function src_Iterator__Iterator(next) { + this.next = next; + } + + src_Iterator__Iterator.prototype.toString = function() { + return '[Iterator]'; + }; + + + src_Iterator__Iterator.KEYS = ITERATE_KEYS; + src_Iterator__Iterator.VALUES = ITERATE_VALUES; + src_Iterator__Iterator.ENTRIES = ITERATE_ENTRIES; + + src_Iterator__Iterator.prototype.inspect = + src_Iterator__Iterator.prototype.toSource = function () { return this.toString(); } + src_Iterator__Iterator.prototype[ITERATOR_SYMBOL] = function () { + return this; + }; + + + function iteratorValue(type, k, v, iteratorResult) { + var value = type === 0 ? k : type === 1 ? v : [k, v]; + iteratorResult ? (iteratorResult.value = value) : (iteratorResult = { + value: value, done: false + }); + return iteratorResult; + } + + function iteratorDone() { + return { value: undefined, done: true }; + } + + function hasIterator(maybeIterable) { + return !!getIteratorFn(maybeIterable); + } + + function isIterator(maybeIterator) { + return maybeIterator && typeof maybeIterator.next === 'function'; + } + + function getIterator(iterable) { + var iteratorFn = getIteratorFn(iterable); + return iteratorFn && iteratorFn.call(iterable); + } + + function getIteratorFn(iterable) { + var iteratorFn = iterable && ( + (REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) || + iterable[FAUX_ITERATOR_SYMBOL] + ); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } + } + + function isArrayLike(value) { + return value && typeof value.length === 'number'; + } + + createClass(Seq, Iterable); + function Seq(value) { + return value === null || value === undefined ? emptySequence() : + isIterable(value) ? value.toSeq() : seqFromValue(value); + } + + Seq.of = function(/*...values*/) { + return Seq(arguments); + }; + + Seq.prototype.toSeq = function() { + return this; + }; + + Seq.prototype.toString = function() { + return this.__toString('Seq {', '}'); + }; + + Seq.prototype.cacheResult = function() { + if (!this._cache && this.__iterateUncached) { + this._cache = this.entrySeq().toArray(); + this.size = this._cache.length; + } + return this; + }; + + // abstract __iterateUncached(fn, reverse) + + Seq.prototype.__iterate = function(fn, reverse) { + return seqIterate(this, fn, reverse, true); + }; + + // abstract __iteratorUncached(type, reverse) + + Seq.prototype.__iterator = function(type, reverse) { + return seqIterator(this, type, reverse, true); + }; + + + + createClass(KeyedSeq, Seq); + function KeyedSeq(value) { + return value === null || value === undefined ? + emptySequence().toKeyedSeq() : + isIterable(value) ? + (isKeyed(value) ? value.toSeq() : value.fromEntrySeq()) : + keyedSeqFromValue(value); + } + + KeyedSeq.prototype.toKeyedSeq = function() { + return this; + }; + + + + createClass(IndexedSeq, Seq); + function IndexedSeq(value) { + return value === null || value === undefined ? emptySequence() : + !isIterable(value) ? indexedSeqFromValue(value) : + isKeyed(value) ? value.entrySeq() : value.toIndexedSeq(); + } + + IndexedSeq.of = function(/*...values*/) { + return IndexedSeq(arguments); + }; + + IndexedSeq.prototype.toIndexedSeq = function() { + return this; + }; + + IndexedSeq.prototype.toString = function() { + return this.__toString('Seq [', ']'); + }; + + IndexedSeq.prototype.__iterate = function(fn, reverse) { + return seqIterate(this, fn, reverse, false); + }; + + IndexedSeq.prototype.__iterator = function(type, reverse) { + return seqIterator(this, type, reverse, false); + }; + + + + createClass(SetSeq, Seq); + function SetSeq(value) { + return ( + value === null || value === undefined ? emptySequence() : + !isIterable(value) ? indexedSeqFromValue(value) : + isKeyed(value) ? value.entrySeq() : value + ).toSetSeq(); + } + + SetSeq.of = function(/*...values*/) { + return SetSeq(arguments); + }; + + SetSeq.prototype.toSetSeq = function() { + return this; + }; + + + + Seq.isSeq = isSeq; + Seq.Keyed = KeyedSeq; + Seq.Set = SetSeq; + Seq.Indexed = IndexedSeq; + + var IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@'; + + Seq.prototype[IS_SEQ_SENTINEL] = true; + + + + // #pragma Root Sequences + + createClass(ArraySeq, IndexedSeq); + function ArraySeq(array) { + this._array = array; + this.size = array.length; + } + + ArraySeq.prototype.get = function(index, notSetValue) { + return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue; + }; + + ArraySeq.prototype.__iterate = function(fn, reverse) { + var array = this._array; + var maxIndex = array.length - 1; + for (var ii = 0; ii <= maxIndex; ii++) { + if (fn(array[reverse ? maxIndex - ii : ii], ii, this) === false) { + return ii + 1; + } + } + return ii; + }; + + ArraySeq.prototype.__iterator = function(type, reverse) { + var array = this._array; + var maxIndex = array.length - 1; + var ii = 0; + return new src_Iterator__Iterator(function() + {return ii > maxIndex ? + iteratorDone() : + iteratorValue(type, ii, array[reverse ? maxIndex - ii++ : ii++])} + ); + }; + + + + createClass(ObjectSeq, KeyedSeq); + function ObjectSeq(object) { + var keys = Object.keys(object); + this._object = object; + this._keys = keys; + this.size = keys.length; + } + + ObjectSeq.prototype.get = function(key, notSetValue) { + if (notSetValue !== undefined && !this.has(key)) { + return notSetValue; + } + return this._object[key]; + }; + + ObjectSeq.prototype.has = function(key) { + return this._object.hasOwnProperty(key); + }; + + ObjectSeq.prototype.__iterate = function(fn, reverse) { + var object = this._object; + var keys = this._keys; + var maxIndex = keys.length - 1; + for (var ii = 0; ii <= maxIndex; ii++) { + var key = keys[reverse ? maxIndex - ii : ii]; + if (fn(object[key], key, this) === false) { + return ii + 1; + } + } + return ii; + }; + + ObjectSeq.prototype.__iterator = function(type, reverse) { + var object = this._object; + var keys = this._keys; + var maxIndex = keys.length - 1; + var ii = 0; + return new src_Iterator__Iterator(function() { + var key = keys[reverse ? maxIndex - ii : ii]; + return ii++ > maxIndex ? + iteratorDone() : + iteratorValue(type, key, object[key]); + }); + }; + + ObjectSeq.prototype[IS_ORDERED_SENTINEL] = true; + + + createClass(IterableSeq, IndexedSeq); + function IterableSeq(iterable) { + this._iterable = iterable; + this.size = iterable.length || iterable.size; + } + + IterableSeq.prototype.__iterateUncached = function(fn, reverse) { + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); + } + var iterable = this._iterable; + var iterator = getIterator(iterable); + var iterations = 0; + if (isIterator(iterator)) { + var step; + while (!(step = iterator.next()).done) { + if (fn(step.value, iterations++, this) === false) { + break; + } + } + } + return iterations; + }; + + IterableSeq.prototype.__iteratorUncached = function(type, reverse) { + if (reverse) { + return this.cacheResult().__iterator(type, reverse); + } + var iterable = this._iterable; + var iterator = getIterator(iterable); + if (!isIterator(iterator)) { + return new src_Iterator__Iterator(iteratorDone); + } + var iterations = 0; + return new src_Iterator__Iterator(function() { + var step = iterator.next(); + return step.done ? step : iteratorValue(type, iterations++, step.value); + }); + }; + + + + createClass(IteratorSeq, IndexedSeq); + function IteratorSeq(iterator) { + this._iterator = iterator; + this._iteratorCache = []; + } + + IteratorSeq.prototype.__iterateUncached = function(fn, reverse) { + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); + } + var iterator = this._iterator; + var cache = this._iteratorCache; + var iterations = 0; + while (iterations < cache.length) { + if (fn(cache[iterations], iterations++, this) === false) { + return iterations; + } + } + var step; + while (!(step = iterator.next()).done) { + var val = step.value; + cache[iterations] = val; + if (fn(val, iterations++, this) === false) { + break; + } + } + return iterations; + }; + + IteratorSeq.prototype.__iteratorUncached = function(type, reverse) { + if (reverse) { + return this.cacheResult().__iterator(type, reverse); + } + var iterator = this._iterator; + var cache = this._iteratorCache; + var iterations = 0; + return new src_Iterator__Iterator(function() { + if (iterations >= cache.length) { + var step = iterator.next(); + if (step.done) { + return step; + } + cache[iterations] = step.value; + } + return iteratorValue(type, iterations, cache[iterations++]); + }); + }; + + + + + // # pragma Helper functions + + function isSeq(maybeSeq) { + return !!(maybeSeq && maybeSeq[IS_SEQ_SENTINEL]); + } + + var EMPTY_SEQ; + + function emptySequence() { + return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([])); + } + + function keyedSeqFromValue(value) { + var seq = + Array.isArray(value) ? new ArraySeq(value).fromEntrySeq() : + isIterator(value) ? new IteratorSeq(value).fromEntrySeq() : + hasIterator(value) ? new IterableSeq(value).fromEntrySeq() : + typeof value === 'object' ? new ObjectSeq(value) : + undefined; + if (!seq) { + throw new TypeError( + 'Expected Array or iterable object of [k, v] entries, '+ + 'or keyed object: ' + value + ); + } + return seq; + } + + function indexedSeqFromValue(value) { + var seq = maybeIndexedSeqFromValue(value); + if (!seq) { + throw new TypeError( + 'Expected Array or iterable object of values: ' + value + ); + } + return seq; + } + + function seqFromValue(value) { + var seq = maybeIndexedSeqFromValue(value) || + (typeof value === 'object' && new ObjectSeq(value)); + if (!seq) { + throw new TypeError( + 'Expected Array or iterable object of values, or keyed object: ' + value + ); + } + return seq; + } + + function maybeIndexedSeqFromValue(value) { + return ( + isArrayLike(value) ? new ArraySeq(value) : + isIterator(value) ? new IteratorSeq(value) : + hasIterator(value) ? new IterableSeq(value) : + undefined + ); + } + + function seqIterate(seq, fn, reverse, useKeys) { + var cache = seq._cache; + if (cache) { + var maxIndex = cache.length - 1; + for (var ii = 0; ii <= maxIndex; ii++) { + var entry = cache[reverse ? maxIndex - ii : ii]; + if (fn(entry[1], useKeys ? entry[0] : ii, seq) === false) { + return ii + 1; + } + } + return ii; + } + return seq.__iterateUncached(fn, reverse); + } + + function seqIterator(seq, type, reverse, useKeys) { + var cache = seq._cache; + if (cache) { + var maxIndex = cache.length - 1; + var ii = 0; + return new src_Iterator__Iterator(function() { + var entry = cache[reverse ? maxIndex - ii : ii]; + return ii++ > maxIndex ? + iteratorDone() : + iteratorValue(type, useKeys ? entry[0] : ii - 1, entry[1]); + }); + } + return seq.__iteratorUncached(type, reverse); + } + + createClass(Collection, Iterable); + function Collection() { + throw TypeError('Abstract'); + } + + + createClass(KeyedCollection, Collection);function KeyedCollection() {} + + createClass(IndexedCollection, Collection);function IndexedCollection() {} + + createClass(SetCollection, Collection);function SetCollection() {} + + + Collection.Keyed = KeyedCollection; + Collection.Indexed = IndexedCollection; + Collection.Set = SetCollection; + + /** + * An extension of the "same-value" algorithm as [described for use by ES6 Map + * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality) + * + * NaN is considered the same as NaN, however -0 and 0 are considered the same + * value, which is different from the algorithm described by + * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). + * + * This is extended further to allow Objects to describe the values they + * represent, by way of `valueOf` or `equals` (and `hashCode`). + * + * Note: because of this extension, the key equality of Immutable.Map and the + * value equality of Immutable.Set will differ from ES6 Map and Set. + * + * ### Defining custom values + * + * The easiest way to describe the value an object represents is by implementing + * `valueOf`. For example, `Date` represents a value by returning a unix + * timestamp for `valueOf`: + * + * var date1 = new Date(1234567890000); // Fri Feb 13 2009 ... + * var date2 = new Date(1234567890000); + * date1.valueOf(); // 1234567890000 + * assert( date1 !== date2 ); + * assert( Immutable.is( date1, date2 ) ); + * + * Note: overriding `valueOf` may have other implications if you use this object + * where JavaScript expects a primitive, such as implicit string coercion. + * + * For more complex types, especially collections, implementing `valueOf` may + * not be performant. An alternative is to implement `equals` and `hashCode`. + * + * `equals` takes another object, presumably of similar type, and returns true + * if the it is equal. Equality is symmetrical, so the same result should be + * returned if this and the argument are flipped. + * + * assert( a.equals(b) === b.equals(a) ); + * + * `hashCode` returns a 32bit integer number representing the object which will + * be used to determine how to store the value object in a Map or Set. You must + * provide both or neither methods, one must not exist without the other. + * + * Also, an important relationship between these methods must be upheld: if two + * values are equal, they *must* return the same hashCode. If the values are not + * equal, they might have the same hashCode; this is called a hash collision, + * and while undesirable for performance reasons, it is acceptable. + * + * if (a.equals(b)) { + * assert( a.hashCode() === b.hashCode() ); + * } + * + * All Immutable collections implement `equals` and `hashCode`. + * + */ + function is(valueA, valueB) { + if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { + return true; + } + if (!valueA || !valueB) { + return false; + } + if (typeof valueA.valueOf === 'function' && + typeof valueB.valueOf === 'function') { + valueA = valueA.valueOf(); + valueB = valueB.valueOf(); + if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { + return true; + } + if (!valueA || !valueB) { + return false; + } + } + if (typeof valueA.equals === 'function' && + typeof valueB.equals === 'function' && + valueA.equals(valueB)) { + return true; + } + return false; + } + + function fromJS(json, converter) { + return converter ? + fromJSWith(converter, json, '', {'': json}) : + fromJSDefault(json); + } + + function fromJSWith(converter, json, key, parentJSON) { + if (Array.isArray(json)) { + return converter.call(parentJSON, key, IndexedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)})); + } + if (isPlainObj(json)) { + return converter.call(parentJSON, key, KeyedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)})); + } + return json; + } + + function fromJSDefault(json) { + if (Array.isArray(json)) { + return IndexedSeq(json).map(fromJSDefault).toList(); + } + if (isPlainObj(json)) { + return KeyedSeq(json).map(fromJSDefault).toMap(); + } + return json; + } + + function isPlainObj(value) { + return value && (value.constructor === Object || value.constructor === undefined); + } + + var src_Math__imul = + typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2 ? + Math.imul : + function src_Math__imul(a, b) { + a = a | 0; // int + b = b | 0; // int + var c = a & 0xffff; + var d = b & 0xffff; + // Shift by 0 fixes the sign on the high part. + return (c * d) + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0) | 0; // int + }; + + // v8 has an optimization for storing 31-bit signed numbers. + // Values which have either 00 or 11 as the high order bits qualify. + // This function drops the highest order bit in a signed number, maintaining + // the sign bit. + function smi(i32) { + return ((i32 >>> 1) & 0x40000000) | (i32 & 0xBFFFFFFF); + } + + function hash(o) { + if (o === false || o === null || o === undefined) { + return 0; + } + if (typeof o.valueOf === 'function') { + o = o.valueOf(); + if (o === false || o === null || o === undefined) { + return 0; + } + } + if (o === true) { + return 1; + } + var type = typeof o; + if (type === 'number') { + var h = o | 0; + if (h !== o) { + h ^= o * 0xFFFFFFFF; + } + while (o > 0xFFFFFFFF) { + o /= 0xFFFFFFFF; + h ^= o; + } + return smi(h); + } + if (type === 'string') { + return o.length > STRING_HASH_CACHE_MIN_STRLEN ? cachedHashString(o) : hashString(o); + } + if (typeof o.hashCode === 'function') { + return o.hashCode(); + } + return hashJSObj(o); + } + + function cachedHashString(string) { + var hash = stringHashCache[string]; + if (hash === undefined) { + hash = hashString(string); + if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) { + STRING_HASH_CACHE_SIZE = 0; + stringHashCache = {}; + } + STRING_HASH_CACHE_SIZE++; + stringHashCache[string] = hash; + } + return hash; + } + + // http://jsperf.com/hashing-strings + function hashString(string) { + // This is the hash from JVM + // The hash code for a string is computed as + // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1], + // where s[i] is the ith character of the string and n is the length of + // the string. We "mod" the result to make it between 0 (inclusive) and 2^31 + // (exclusive) by dropping high bits. + var hash = 0; + for (var ii = 0; ii < string.length; ii++) { + hash = 31 * hash + string.charCodeAt(ii) | 0; + } + return smi(hash); + } + + function hashJSObj(obj) { + var hash; + if (usingWeakMap) { + hash = weakMap.get(obj); + if (hash !== undefined) { + return hash; + } + } + + hash = obj[UID_HASH_KEY]; + if (hash !== undefined) { + return hash; + } + + if (!canDefineProperty) { + hash = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY]; + if (hash !== undefined) { + return hash; + } + + hash = getIENodeHash(obj); + if (hash !== undefined) { + return hash; + } + } + + hash = ++objHashUID; + if (objHashUID & 0x40000000) { + objHashUID = 0; + } + + if (usingWeakMap) { + weakMap.set(obj, hash); + } else if (isExtensible !== undefined && isExtensible(obj) === false) { + throw new Error('Non-extensible objects are not allowed as keys.'); + } else if (canDefineProperty) { + Object.defineProperty(obj, UID_HASH_KEY, { + 'enumerable': false, + 'configurable': false, + 'writable': false, + 'value': hash + }); + } else if (obj.propertyIsEnumerable !== undefined && + obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable) { + // Since we can't define a non-enumerable property on the object + // we'll hijack one of the less-used non-enumerable properties to + // save our hash on it. Since this is a function it will not show up in + // `JSON.stringify` which is what we want. + obj.propertyIsEnumerable = function() { + return this.constructor.prototype.propertyIsEnumerable.apply(this, arguments); + }; + obj.propertyIsEnumerable[UID_HASH_KEY] = hash; + } else if (obj.nodeType !== undefined) { + // At this point we couldn't get the IE `uniqueID` to use as a hash + // and we couldn't use a non-enumerable property to exploit the + // dontEnum bug so we simply add the `UID_HASH_KEY` on the node + // itself. + obj[UID_HASH_KEY] = hash; + } else { + throw new Error('Unable to set a non-enumerable property on object.'); + } + + return hash; + } + + // Get references to ES5 object methods. + var isExtensible = Object.isExtensible; + + // True if Object.defineProperty works as expected. IE8 fails this test. + var canDefineProperty = (function() { + try { + Object.defineProperty({}, '@', {}); + return true; + } catch (e) { + return false; + } + }()); + + // IE has a `uniqueID` property on DOM nodes. We can construct the hash from it + // and avoid memory leaks from the IE cloneNode bug. + function getIENodeHash(node) { + if (node && node.nodeType > 0) { + switch (node.nodeType) { + case 1: // Element + return node.uniqueID; + case 9: // Document + return node.documentElement && node.documentElement.uniqueID; + } + } + } + + // If possible, use a WeakMap. + var usingWeakMap = typeof WeakMap === 'function'; + var weakMap; + if (usingWeakMap) { + weakMap = new WeakMap(); + } + + var objHashUID = 0; + + var UID_HASH_KEY = '__immutablehash__'; + if (typeof Symbol === 'function') { + UID_HASH_KEY = Symbol(UID_HASH_KEY); + } + + var STRING_HASH_CACHE_MIN_STRLEN = 16; + var STRING_HASH_CACHE_MAX_SIZE = 255; + var STRING_HASH_CACHE_SIZE = 0; + var stringHashCache = {}; + + function invariant(condition, error) { + if (!condition) throw new Error(error); + } + + function assertNotInfinite(size) { + invariant( + size !== Infinity, + 'Cannot perform this action with an infinite size.' + ); + } + + createClass(ToKeyedSequence, KeyedSeq); + function ToKeyedSequence(indexed, useKeys) { + this._iter = indexed; + this._useKeys = useKeys; + this.size = indexed.size; + } + + ToKeyedSequence.prototype.get = function(key, notSetValue) { + return this._iter.get(key, notSetValue); + }; + + ToKeyedSequence.prototype.has = function(key) { + return this._iter.has(key); + }; + + ToKeyedSequence.prototype.valueSeq = function() { + return this._iter.valueSeq(); + }; + + ToKeyedSequence.prototype.reverse = function() {var this$0 = this; + var reversedSequence = reverseFactory(this, true); + if (!this._useKeys) { + reversedSequence.valueSeq = function() {return this$0._iter.toSeq().reverse()}; + } + return reversedSequence; + }; + + ToKeyedSequence.prototype.map = function(mapper, context) {var this$0 = this; + var mappedSequence = mapFactory(this, mapper, context); + if (!this._useKeys) { + mappedSequence.valueSeq = function() {return this$0._iter.toSeq().map(mapper, context)}; + } + return mappedSequence; + }; + + ToKeyedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; + var ii; + return this._iter.__iterate( + this._useKeys ? + function(v, k) {return fn(v, k, this$0)} : + ((ii = reverse ? resolveSize(this) : 0), + function(v ) {return fn(v, reverse ? --ii : ii++, this$0)}), + reverse + ); + }; + + ToKeyedSequence.prototype.__iterator = function(type, reverse) { + if (this._useKeys) { + return this._iter.__iterator(type, reverse); + } + var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); + var ii = reverse ? resolveSize(this) : 0; + return new src_Iterator__Iterator(function() { + var step = iterator.next(); + return step.done ? step : + iteratorValue(type, reverse ? --ii : ii++, step.value, step); + }); + }; + + ToKeyedSequence.prototype[IS_ORDERED_SENTINEL] = true; + + + createClass(ToIndexedSequence, IndexedSeq); + function ToIndexedSequence(iter) { + this._iter = iter; + this.size = iter.size; + } + + ToIndexedSequence.prototype.includes = function(value) { + return this._iter.includes(value); + }; + + ToIndexedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; + var iterations = 0; + return this._iter.__iterate(function(v ) {return fn(v, iterations++, this$0)}, reverse); + }; + + ToIndexedSequence.prototype.__iterator = function(type, reverse) { + var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); + var iterations = 0; + return new src_Iterator__Iterator(function() { + var step = iterator.next(); + return step.done ? step : + iteratorValue(type, iterations++, step.value, step) + }); + }; + + + + createClass(ToSetSequence, SetSeq); + function ToSetSequence(iter) { + this._iter = iter; + this.size = iter.size; + } + + ToSetSequence.prototype.has = function(key) { + return this._iter.includes(key); + }; + + ToSetSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return this._iter.__iterate(function(v ) {return fn(v, v, this$0)}, reverse); + }; + + ToSetSequence.prototype.__iterator = function(type, reverse) { + var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); + return new src_Iterator__Iterator(function() { + var step = iterator.next(); + return step.done ? step : + iteratorValue(type, step.value, step.value, step); + }); + }; + + + + createClass(FromEntriesSequence, KeyedSeq); + function FromEntriesSequence(entries) { + this._iter = entries; + this.size = entries.size; + } + + FromEntriesSequence.prototype.entrySeq = function() { + return this._iter.toSeq(); + }; + + FromEntriesSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return this._iter.__iterate(function(entry ) { + // Check if entry exists first so array access doesn't throw for holes + // in the parent iteration. + if (entry) { + validateEntry(entry); + var indexedIterable = isIterable(entry); + return fn( + indexedIterable ? entry.get(1) : entry[1], + indexedIterable ? entry.get(0) : entry[0], + this$0 + ); + } + }, reverse); + }; + + FromEntriesSequence.prototype.__iterator = function(type, reverse) { + var iterator = this._iter.__iterator(ITERATE_VALUES, reverse); + return new src_Iterator__Iterator(function() { + while (true) { + var step = iterator.next(); + if (step.done) { + return step; + } + var entry = step.value; + // Check if entry exists first so array access doesn't throw for holes + // in the parent iteration. + if (entry) { + validateEntry(entry); + var indexedIterable = isIterable(entry); + return iteratorValue( + type, + indexedIterable ? entry.get(0) : entry[0], + indexedIterable ? entry.get(1) : entry[1], + step + ); + } + } + }); + }; + + + ToIndexedSequence.prototype.cacheResult = + ToKeyedSequence.prototype.cacheResult = + ToSetSequence.prototype.cacheResult = + FromEntriesSequence.prototype.cacheResult = + cacheResultThrough; + + + function flipFactory(iterable) { + var flipSequence = makeSequence(iterable); + flipSequence._iter = iterable; + flipSequence.size = iterable.size; + flipSequence.flip = function() {return iterable}; + flipSequence.reverse = function () { + var reversedSequence = iterable.reverse.apply(this); // super.reverse() + reversedSequence.flip = function() {return iterable.reverse()}; + return reversedSequence; + }; + flipSequence.has = function(key ) {return iterable.includes(key)}; + flipSequence.includes = function(key ) {return iterable.has(key)}; + flipSequence.cacheResult = cacheResultThrough; + flipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; + return iterable.__iterate(function(v, k) {return fn(k, v, this$0) !== false}, reverse); + } + flipSequence.__iteratorUncached = function(type, reverse) { + if (type === ITERATE_ENTRIES) { + var iterator = iterable.__iterator(type, reverse); + return new src_Iterator__Iterator(function() { + var step = iterator.next(); + if (!step.done) { + var k = step.value[0]; + step.value[0] = step.value[1]; + step.value[1] = k; + } + return step; + }); + } + return iterable.__iterator( + type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES, + reverse + ); + } + return flipSequence; + } + + + function mapFactory(iterable, mapper, context) { + var mappedSequence = makeSequence(iterable); + mappedSequence.size = iterable.size; + mappedSequence.has = function(key ) {return iterable.has(key)}; + mappedSequence.get = function(key, notSetValue) { + var v = iterable.get(key, NOT_SET); + return v === NOT_SET ? + notSetValue : + mapper.call(context, v, key, iterable); + }; + mappedSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; + return iterable.__iterate( + function(v, k, c) {return fn(mapper.call(context, v, k, c), k, this$0) !== false}, + reverse + ); + } + mappedSequence.__iteratorUncached = function (type, reverse) { + var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); + return new src_Iterator__Iterator(function() { + var step = iterator.next(); + if (step.done) { + return step; + } + var entry = step.value; + var key = entry[0]; + return iteratorValue( + type, + key, + mapper.call(context, entry[1], key, iterable), + step + ); + }); + } + return mappedSequence; + } + + + function reverseFactory(iterable, useKeys) { + var reversedSequence = makeSequence(iterable); + reversedSequence._iter = iterable; + reversedSequence.size = iterable.size; + reversedSequence.reverse = function() {return iterable}; + if (iterable.flip) { + reversedSequence.flip = function () { + var flipSequence = flipFactory(iterable); + flipSequence.reverse = function() {return iterable.flip()}; + return flipSequence; + }; + } + reversedSequence.get = function(key, notSetValue) + {return iterable.get(useKeys ? key : -1 - key, notSetValue)}; + reversedSequence.has = function(key ) + {return iterable.has(useKeys ? key : -1 - key)}; + reversedSequence.includes = function(value ) {return iterable.includes(value)}; + reversedSequence.cacheResult = cacheResultThrough; + reversedSequence.__iterate = function (fn, reverse) {var this$0 = this; + return iterable.__iterate(function(v, k) {return fn(v, k, this$0)}, !reverse); + }; + reversedSequence.__iterator = + function(type, reverse) {return iterable.__iterator(type, !reverse)}; + return reversedSequence; + } + + + function filterFactory(iterable, predicate, context, useKeys) { + var filterSequence = makeSequence(iterable); + if (useKeys) { + filterSequence.has = function(key ) { + var v = iterable.get(key, NOT_SET); + return v !== NOT_SET && !!predicate.call(context, v, key, iterable); + }; + filterSequence.get = function(key, notSetValue) { + var v = iterable.get(key, NOT_SET); + return v !== NOT_SET && predicate.call(context, v, key, iterable) ? + v : notSetValue; + }; + } + filterSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; + var iterations = 0; + iterable.__iterate(function(v, k, c) { + if (predicate.call(context, v, k, c)) { + iterations++; + return fn(v, useKeys ? k : iterations - 1, this$0); + } + }, reverse); + return iterations; + }; + filterSequence.__iteratorUncached = function (type, reverse) { + var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); + var iterations = 0; + return new src_Iterator__Iterator(function() { + while (true) { + var step = iterator.next(); + if (step.done) { + return step; + } + var entry = step.value; + var key = entry[0]; + var value = entry[1]; + if (predicate.call(context, value, key, iterable)) { + return iteratorValue(type, useKeys ? key : iterations++, value, step); + } + } + }); + } + return filterSequence; + } + + + function countByFactory(iterable, grouper, context) { + var groups = src_Map__Map().asMutable(); + iterable.__iterate(function(v, k) { + groups.update( + grouper.call(context, v, k, iterable), + 0, + function(a ) {return a + 1} + ); + }); + return groups.asImmutable(); + } + + + function groupByFactory(iterable, grouper, context) { + var isKeyedIter = isKeyed(iterable); + var groups = (isOrdered(iterable) ? OrderedMap() : src_Map__Map()).asMutable(); + iterable.__iterate(function(v, k) { + groups.update( + grouper.call(context, v, k, iterable), + function(a ) {return (a = a || [], a.push(isKeyedIter ? [k, v] : v), a)} + ); + }); + var coerce = iterableClass(iterable); + return groups.map(function(arr ) {return reify(iterable, coerce(arr))}); + } + + + function sliceFactory(iterable, begin, end, useKeys) { + var originalSize = iterable.size; + + if (wholeSlice(begin, end, originalSize)) { + return iterable; + } + + var resolvedBegin = resolveBegin(begin, originalSize); + var resolvedEnd = resolveEnd(end, originalSize); + + // begin or end will be NaN if they were provided as negative numbers and + // this iterable's size is unknown. In that case, cache first so there is + // a known size and these do not resolve to NaN. + if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) { + return sliceFactory(iterable.toSeq().cacheResult(), begin, end, useKeys); + } + + // Note: resolvedEnd is undefined when the original sequence's length is + // unknown and this slice did not supply an end and should contain all + // elements after resolvedBegin. + // In that case, resolvedSize will be NaN and sliceSize will remain undefined. + var resolvedSize = resolvedEnd - resolvedBegin; + var sliceSize; + if (resolvedSize === resolvedSize) { + sliceSize = resolvedSize < 0 ? 0 : resolvedSize; + } + + var sliceSeq = makeSequence(iterable); + + sliceSeq.size = sliceSize; + + if (!useKeys && isSeq(iterable) && sliceSize >= 0) { + sliceSeq.get = function (index, notSetValue) { + index = wrapIndex(this, index); + return index >= 0 && index < sliceSize ? + iterable.get(index + resolvedBegin, notSetValue) : + notSetValue; + } + } + + sliceSeq.__iterateUncached = function(fn, reverse) {var this$0 = this; + if (sliceSize === 0) { + return 0; + } + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); + } + var skipped = 0; + var isSkipping = true; + var iterations = 0; + iterable.__iterate(function(v, k) { + if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) { + iterations++; + return fn(v, useKeys ? k : iterations - 1, this$0) !== false && + iterations !== sliceSize; + } + }); + return iterations; + }; + + sliceSeq.__iteratorUncached = function(type, reverse) { + if (sliceSize !== 0 && reverse) { + return this.cacheResult().__iterator(type, reverse); + } + // Don't bother instantiating parent iterator if taking 0. + var iterator = sliceSize !== 0 && iterable.__iterator(type, reverse); + var skipped = 0; + var iterations = 0; + return new src_Iterator__Iterator(function() { + while (skipped++ < resolvedBegin) { + iterator.next(); + } + if (++iterations > sliceSize) { + return iteratorDone(); + } + var step = iterator.next(); + if (useKeys || type === ITERATE_VALUES) { + return step; + } else if (type === ITERATE_KEYS) { + return iteratorValue(type, iterations - 1, undefined, step); + } else { + return iteratorValue(type, iterations - 1, step.value[1], step); + } + }); + } + + return sliceSeq; + } + + + function takeWhileFactory(iterable, predicate, context) { + var takeSequence = makeSequence(iterable); + takeSequence.__iterateUncached = function(fn, reverse) {var this$0 = this; + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); + } + var iterations = 0; + iterable.__iterate(function(v, k, c) + {return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$0)} + ); + return iterations; + }; + takeSequence.__iteratorUncached = function(type, reverse) {var this$0 = this; + if (reverse) { + return this.cacheResult().__iterator(type, reverse); + } + var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); + var iterating = true; + return new src_Iterator__Iterator(function() { + if (!iterating) { + return iteratorDone(); + } + var step = iterator.next(); + if (step.done) { + return step; + } + var entry = step.value; + var k = entry[0]; + var v = entry[1]; + if (!predicate.call(context, v, k, this$0)) { + iterating = false; + return iteratorDone(); + } + return type === ITERATE_ENTRIES ? step : + iteratorValue(type, k, v, step); + }); + }; + return takeSequence; + } + + + function skipWhileFactory(iterable, predicate, context, useKeys) { + var skipSequence = makeSequence(iterable); + skipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this; + if (reverse) { + return this.cacheResult().__iterate(fn, reverse); + } + var isSkipping = true; + var iterations = 0; + iterable.__iterate(function(v, k, c) { + if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) { + iterations++; + return fn(v, useKeys ? k : iterations - 1, this$0); + } + }); + return iterations; + }; + skipSequence.__iteratorUncached = function(type, reverse) {var this$0 = this; + if (reverse) { + return this.cacheResult().__iterator(type, reverse); + } + var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse); + var skipping = true; + var iterations = 0; + return new src_Iterator__Iterator(function() { + var step, k, v; + do { + step = iterator.next(); + if (step.done) { + if (useKeys || type === ITERATE_VALUES) { + return step; + } else if (type === ITERATE_KEYS) { + return iteratorValue(type, iterations++, undefined, step); + } else { + return iteratorValue(type, iterations++, step.value[1], step); + } + } + var entry = step.value; + k = entry[0]; + v = entry[1]; + skipping && (skipping = predicate.call(context, v, k, this$0)); + } while (skipping); + return type === ITERATE_ENTRIES ? step : + iteratorValue(type, k, v, step); + }); + }; + return skipSequence; + } + + + function concatFactory(iterable, values) { + var isKeyedIterable = isKeyed(iterable); + var iters = [iterable].concat(values).map(function(v ) { + if (!isIterable(v)) { + v = isKeyedIterable ? + keyedSeqFromValue(v) : + indexedSeqFromValue(Array.isArray(v) ? v : [v]); + } else if (isKeyedIterable) { + v = KeyedIterable(v); + } + return v; + }).filter(function(v ) {return v.size !== 0}); + + if (iters.length === 0) { + return iterable; + } + + if (iters.length === 1) { + var singleton = iters[0]; + if (singleton === iterable || + isKeyedIterable && isKeyed(singleton) || + isIndexed(iterable) && isIndexed(singleton)) { + return singleton; + } + } + + var concatSeq = new ArraySeq(iters); + if (isKeyedIterable) { + concatSeq = concatSeq.toKeyedSeq(); + } else if (!isIndexed(iterable)) { + concatSeq = concatSeq.toSetSeq(); + } + concatSeq = concatSeq.flatten(true); + concatSeq.size = iters.reduce( + function(sum, seq) { + if (sum !== undefined) { + var size = seq.size; + if (size !== undefined) { + return sum + size; + } + } + }, + 0 + ); + return concatSeq; + } + + + function flattenFactory(iterable, depth, useKeys) { + var flatSequence = makeSequence(iterable); + flatSequence.__iterateUncached = function(fn, reverse) { + var iterations = 0; + var stopped = false; + function flatDeep(iter, currentDepth) {var this$0 = this; + iter.__iterate(function(v, k) { + if ((!depth || currentDepth < depth) && isIterable(v)) { + flatDeep(v, currentDepth + 1); + } else if (fn(v, useKeys ? k : iterations++, this$0) === false) { + stopped = true; + } + return !stopped; + }, reverse); + } + flatDeep(iterable, 0); + return iterations; + } + flatSequence.__iteratorUncached = function(type, reverse) { + var iterator = iterable.__iterator(type, reverse); + var stack = []; + var iterations = 0; + return new src_Iterator__Iterator(function() { + while (iterator) { + var step = iterator.next(); + if (step.done !== false) { + iterator = stack.pop(); + continue; + } + var v = step.value; + if (type === ITERATE_ENTRIES) { + v = v[1]; + } + if ((!depth || stack.length < depth) && isIterable(v)) { + stack.push(iterator); + iterator = v.__iterator(type, reverse); + } else { + return useKeys ? step : iteratorValue(type, iterations++, v, step); + } + } + return iteratorDone(); + }); + } + return flatSequence; + } + + + function flatMapFactory(iterable, mapper, context) { + var coerce = iterableClass(iterable); + return iterable.toSeq().map( + function(v, k) {return coerce(mapper.call(context, v, k, iterable))} + ).flatten(true); + } + + + function interposeFactory(iterable, separator) { + var interposedSequence = makeSequence(iterable); + interposedSequence.size = iterable.size && iterable.size * 2 -1; + interposedSequence.__iterateUncached = function(fn, reverse) {var this$0 = this; + var iterations = 0; + iterable.__iterate(function(v, k) + {return (!iterations || fn(separator, iterations++, this$0) !== false) && + fn(v, iterations++, this$0) !== false}, + reverse + ); + return iterations; + }; + interposedSequence.__iteratorUncached = function(type, reverse) { + var iterator = iterable.__iterator(ITERATE_VALUES, reverse); + var iterations = 0; + var step; + return new src_Iterator__Iterator(function() { + if (!step || iterations % 2) { + step = iterator.next(); + if (step.done) { + return step; + } + } + return iterations % 2 ? + iteratorValue(type, iterations++, separator) : + iteratorValue(type, iterations++, step.value, step); + }); + }; + return interposedSequence; + } + + + function sortFactory(iterable, comparator, mapper) { + if (!comparator) { + comparator = defaultComparator; + } + var isKeyedIterable = isKeyed(iterable); + var index = 0; + var entries = iterable.toSeq().map( + function(v, k) {return [k, v, index++, mapper ? mapper(v, k, iterable) : v]} + ).toArray(); + entries.sort(function(a, b) {return comparator(a[3], b[3]) || a[2] - b[2]}).forEach( + isKeyedIterable ? + function(v, i) { entries[i].length = 2; } : + function(v, i) { entries[i] = v[1]; } + ); + return isKeyedIterable ? KeyedSeq(entries) : + isIndexed(iterable) ? IndexedSeq(entries) : + SetSeq(entries); + } + + + function maxFactory(iterable, comparator, mapper) { + if (!comparator) { + comparator = defaultComparator; + } + if (mapper) { + var entry = iterable.toSeq() + .map(function(v, k) {return [v, mapper(v, k, iterable)]}) + .reduce(function(a, b) {return maxCompare(comparator, a[1], b[1]) ? b : a}); + return entry && entry[0]; + } else { + return iterable.reduce(function(a, b) {return maxCompare(comparator, a, b) ? b : a}); + } + } + + function maxCompare(comparator, a, b) { + var comp = comparator(b, a); + // b is considered the new max if the comparator declares them equal, but + // they are not equal and b is in fact a nullish value. + return (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) || comp > 0; + } + + + function zipWithFactory(keyIter, zipper, iters) { + var zipSequence = makeSequence(keyIter); + zipSequence.size = new ArraySeq(iters).map(function(i ) {return i.size}).min(); + // Note: this a generic base implementation of __iterate in terms of + // __iterator which may be more generically useful in the future. + zipSequence.__iterate = function(fn, reverse) { + /* generic: + var iterator = this.__iterator(ITERATE_ENTRIES, reverse); + var step; + var iterations = 0; + while (!(step = iterator.next()).done) { + iterations++; + if (fn(step.value[1], step.value[0], this) === false) { + break; + } + } + return iterations; + */ + // indexed: + var iterator = this.__iterator(ITERATE_VALUES, reverse); + var step; + var iterations = 0; + while (!(step = iterator.next()).done) { + if (fn(step.value, iterations++, this) === false) { + break; + } + } + return iterations; + }; + zipSequence.__iteratorUncached = function(type, reverse) { + var iterators = iters.map(function(i ) + {return (i = Iterable(i), getIterator(reverse ? i.reverse() : i))} + ); + var iterations = 0; + var isDone = false; + return new src_Iterator__Iterator(function() { + var steps; + if (!isDone) { + steps = iterators.map(function(i ) {return i.next()}); + isDone = steps.some(function(s ) {return s.done}); + } + if (isDone) { + return iteratorDone(); + } + return iteratorValue( + type, + iterations++, + zipper.apply(null, steps.map(function(s ) {return s.value})) + ); + }); + }; + return zipSequence + } + + + // #pragma Helper Functions + + function reify(iter, seq) { + return isSeq(iter) ? seq : iter.constructor(seq); + } + + function validateEntry(entry) { + if (entry !== Object(entry)) { + throw new TypeError('Expected [K, V] tuple: ' + entry); + } + } + + function resolveSize(iter) { + assertNotInfinite(iter.size); + return ensureSize(iter); + } + + function iterableClass(iterable) { + return isKeyed(iterable) ? KeyedIterable : + isIndexed(iterable) ? IndexedIterable : + SetIterable; + } + + function makeSequence(iterable) { + return Object.create( + ( + isKeyed(iterable) ? KeyedSeq : + isIndexed(iterable) ? IndexedSeq : + SetSeq + ).prototype + ); + } + + function cacheResultThrough() { + if (this._iter.cacheResult) { + this._iter.cacheResult(); + this.size = this._iter.size; + return this; + } else { + return Seq.prototype.cacheResult.call(this); + } + } + + function defaultComparator(a, b) { + return a > b ? 1 : a < b ? -1 : 0; + } + + function forceIterator(keyPath) { + var iter = getIterator(keyPath); + if (!iter) { + // Array might not be iterable in this environment, so we need a fallback + // to our wrapped type. + if (!isArrayLike(keyPath)) { + throw new TypeError('Expected iterable or array-like: ' + keyPath); + } + iter = getIterator(Iterable(keyPath)); + } + return iter; + } + + createClass(src_Map__Map, KeyedCollection); + + // @pragma Construction + + function src_Map__Map(value) { + return value === null || value === undefined ? emptyMap() : + isMap(value) ? value : + emptyMap().withMutations(function(map ) { + var iter = KeyedIterable(value); + assertNotInfinite(iter.size); + iter.forEach(function(v, k) {return map.set(k, v)}); + }); + } + + src_Map__Map.prototype.toString = function() { + return this.__toString('Map {', '}'); + }; + + // @pragma Access + + src_Map__Map.prototype.get = function(k, notSetValue) { + return this._root ? + this._root.get(0, undefined, k, notSetValue) : + notSetValue; + }; + + // @pragma Modification + + src_Map__Map.prototype.set = function(k, v) { + return updateMap(this, k, v); + }; + + src_Map__Map.prototype.setIn = function(keyPath, v) { + return this.updateIn(keyPath, NOT_SET, function() {return v}); + }; + + src_Map__Map.prototype.remove = function(k) { + return updateMap(this, k, NOT_SET); + }; + + src_Map__Map.prototype.deleteIn = function(keyPath) { + return this.updateIn(keyPath, function() {return NOT_SET}); + }; + + src_Map__Map.prototype.update = function(k, notSetValue, updater) { + return arguments.length === 1 ? + k(this) : + this.updateIn([k], notSetValue, updater); + }; + + src_Map__Map.prototype.updateIn = function(keyPath, notSetValue, updater) { + if (!updater) { + updater = notSetValue; + notSetValue = undefined; + } + var updatedValue = updateInDeepMap( + this, + forceIterator(keyPath), + notSetValue, + updater + ); + return updatedValue === NOT_SET ? undefined : updatedValue; + }; + + src_Map__Map.prototype.clear = function() { + if (this.size === 0) { + return this; + } + if (this.__ownerID) { + this.size = 0; + this._root = null; + this.__hash = undefined; + this.__altered = true; + return this; + } + return emptyMap(); + }; + + // @pragma Composition + + src_Map__Map.prototype.merge = function(/*...iters*/) { + return mergeIntoMapWith(this, undefined, arguments); + }; + + src_Map__Map.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return mergeIntoMapWith(this, merger, iters); + }; + + src_Map__Map.prototype.mergeIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1); + return this.updateIn( + keyPath, + emptyMap(), + function(m ) {return typeof m.merge === 'function' ? + m.merge.apply(m, iters) : + iters[iters.length - 1]} + ); + }; + + src_Map__Map.prototype.mergeDeep = function(/*...iters*/) { + return mergeIntoMapWith(this, deepMerger(undefined), arguments); + }; + + src_Map__Map.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return mergeIntoMapWith(this, deepMerger(merger), iters); + }; + + src_Map__Map.prototype.mergeDeepIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1); + return this.updateIn( + keyPath, + emptyMap(), + function(m ) {return typeof m.mergeDeep === 'function' ? + m.mergeDeep.apply(m, iters) : + iters[iters.length - 1]} + ); + }; + + src_Map__Map.prototype.sort = function(comparator) { + // Late binding + return OrderedMap(sortFactory(this, comparator)); + }; + + src_Map__Map.prototype.sortBy = function(mapper, comparator) { + // Late binding + return OrderedMap(sortFactory(this, comparator, mapper)); + }; + + // @pragma Mutability + + src_Map__Map.prototype.withMutations = function(fn) { + var mutable = this.asMutable(); + fn(mutable); + return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this; + }; + + src_Map__Map.prototype.asMutable = function() { + return this.__ownerID ? this : this.__ensureOwner(new OwnerID()); + }; + + src_Map__Map.prototype.asImmutable = function() { + return this.__ensureOwner(); + }; + + src_Map__Map.prototype.wasAltered = function() { + return this.__altered; + }; + + src_Map__Map.prototype.__iterator = function(type, reverse) { + return new MapIterator(this, type, reverse); + }; + + src_Map__Map.prototype.__iterate = function(fn, reverse) {var this$0 = this; + var iterations = 0; + this._root && this._root.iterate(function(entry ) { + iterations++; + return fn(entry[1], entry[0], this$0); + }, reverse); + return iterations; + }; + + src_Map__Map.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { + return this; + } + if (!ownerID) { + this.__ownerID = ownerID; + this.__altered = false; + return this; + } + return makeMap(this.size, this._root, ownerID, this.__hash); + }; + + + function isMap(maybeMap) { + return !!(maybeMap && maybeMap[IS_MAP_SENTINEL]); + } + + src_Map__Map.isMap = isMap; + + var IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@'; + + var MapPrototype = src_Map__Map.prototype; + MapPrototype[IS_MAP_SENTINEL] = true; + MapPrototype[DELETE] = MapPrototype.remove; + MapPrototype.removeIn = MapPrototype.deleteIn; + + + // #pragma Trie Nodes + + + + function ArrayMapNode(ownerID, entries) { + this.ownerID = ownerID; + this.entries = entries; + } + + ArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) { + var entries = this.entries; + for (var ii = 0, len = entries.length; ii < len; ii++) { + if (is(key, entries[ii][0])) { + return entries[ii][1]; + } + } + return notSetValue; + }; + + ArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + var removed = value === NOT_SET; + + var entries = this.entries; + var idx = 0; + for (var len = entries.length; idx < len; idx++) { + if (is(key, entries[idx][0])) { + break; + } + } + var exists = idx < len; + + if (exists ? entries[idx][1] === value : removed) { + return this; + } + + SetRef(didAlter); + (removed || !exists) && SetRef(didChangeSize); + + if (removed && entries.length === 1) { + return; // undefined + } + + if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) { + return createNodes(ownerID, entries, key, value); + } + + var isEditable = ownerID && ownerID === this.ownerID; + var newEntries = isEditable ? entries : arrCopy(entries); + + if (exists) { + if (removed) { + idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); + } else { + newEntries[idx] = [key, value]; + } + } else { + newEntries.push([key, value]); + } + + if (isEditable) { + this.entries = newEntries; + return this; + } + + return new ArrayMapNode(ownerID, newEntries); + }; + + + + + function BitmapIndexedNode(ownerID, bitmap, nodes) { + this.ownerID = ownerID; + this.bitmap = bitmap; + this.nodes = nodes; + } + + BitmapIndexedNode.prototype.get = function(shift, keyHash, key, notSetValue) { + if (keyHash === undefined) { + keyHash = hash(key); + } + var bit = (1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK)); + var bitmap = this.bitmap; + return (bitmap & bit) === 0 ? notSetValue : + this.nodes[popCount(bitmap & (bit - 1))].get(shift + SHIFT, keyHash, key, notSetValue); + }; + + BitmapIndexedNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + if (keyHash === undefined) { + keyHash = hash(key); + } + var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; + var bit = 1 << keyHashFrag; + var bitmap = this.bitmap; + var exists = (bitmap & bit) !== 0; + + if (!exists && value === NOT_SET) { + return this; + } + + var idx = popCount(bitmap & (bit - 1)); + var nodes = this.nodes; + var node = exists ? nodes[idx] : undefined; + var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter); + + if (newNode === node) { + return this; + } + + if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) { + return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode); + } + + if (exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1])) { + return nodes[idx ^ 1]; + } + + if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) { + return newNode; + } + + var isEditable = ownerID && ownerID === this.ownerID; + var newBitmap = exists ? newNode ? bitmap : bitmap ^ bit : bitmap | bit; + var newNodes = exists ? newNode ? + setIn(nodes, idx, newNode, isEditable) : + spliceOut(nodes, idx, isEditable) : + spliceIn(nodes, idx, newNode, isEditable); + + if (isEditable) { + this.bitmap = newBitmap; + this.nodes = newNodes; + return this; + } + + return new BitmapIndexedNode(ownerID, newBitmap, newNodes); + }; + + + + + function HashArrayMapNode(ownerID, count, nodes) { + this.ownerID = ownerID; + this.count = count; + this.nodes = nodes; + } + + HashArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) { + if (keyHash === undefined) { + keyHash = hash(key); + } + var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; + var node = this.nodes[idx]; + return node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue; + }; + + HashArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + if (keyHash === undefined) { + keyHash = hash(key); + } + var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; + var removed = value === NOT_SET; + var nodes = this.nodes; + var node = nodes[idx]; + + if (removed && !node) { + return this; + } + + var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter); + if (newNode === node) { + return this; + } + + var newCount = this.count; + if (!node) { + newCount++; + } else if (!newNode) { + newCount--; + if (newCount < MIN_HASH_ARRAY_MAP_SIZE) { + return packNodes(ownerID, nodes, newCount, idx); + } + } + + var isEditable = ownerID && ownerID === this.ownerID; + var newNodes = setIn(nodes, idx, newNode, isEditable); + + if (isEditable) { + this.count = newCount; + this.nodes = newNodes; + return this; + } + + return new HashArrayMapNode(ownerID, newCount, newNodes); + }; + + + + + function HashCollisionNode(ownerID, keyHash, entries) { + this.ownerID = ownerID; + this.keyHash = keyHash; + this.entries = entries; + } + + HashCollisionNode.prototype.get = function(shift, keyHash, key, notSetValue) { + var entries = this.entries; + for (var ii = 0, len = entries.length; ii < len; ii++) { + if (is(key, entries[ii][0])) { + return entries[ii][1]; + } + } + return notSetValue; + }; + + HashCollisionNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + if (keyHash === undefined) { + keyHash = hash(key); + } + + var removed = value === NOT_SET; + + if (keyHash !== this.keyHash) { + if (removed) { + return this; + } + SetRef(didAlter); + SetRef(didChangeSize); + return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]); + } + + var entries = this.entries; + var idx = 0; + for (var len = entries.length; idx < len; idx++) { + if (is(key, entries[idx][0])) { + break; + } + } + var exists = idx < len; + + if (exists ? entries[idx][1] === value : removed) { + return this; + } + + SetRef(didAlter); + (removed || !exists) && SetRef(didChangeSize); + + if (removed && len === 2) { + return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]); + } + + var isEditable = ownerID && ownerID === this.ownerID; + var newEntries = isEditable ? entries : arrCopy(entries); + + if (exists) { + if (removed) { + idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); + } else { + newEntries[idx] = [key, value]; + } + } else { + newEntries.push([key, value]); + } + + if (isEditable) { + this.entries = newEntries; + return this; + } + + return new HashCollisionNode(ownerID, this.keyHash, newEntries); + }; + + + + + function ValueNode(ownerID, keyHash, entry) { + this.ownerID = ownerID; + this.keyHash = keyHash; + this.entry = entry; + } + + ValueNode.prototype.get = function(shift, keyHash, key, notSetValue) { + return is(key, this.entry[0]) ? this.entry[1] : notSetValue; + }; + + ValueNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + var removed = value === NOT_SET; + var keyMatch = is(key, this.entry[0]); + if (keyMatch ? value === this.entry[1] : removed) { + return this; + } + + SetRef(didAlter); + + if (removed) { + SetRef(didChangeSize); + return; // undefined + } + + if (keyMatch) { + if (ownerID && ownerID === this.ownerID) { + this.entry[1] = value; + return this; + } + return new ValueNode(ownerID, this.keyHash, [key, value]); + } + + SetRef(didChangeSize); + return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]); + }; + + + + // #pragma Iterators + + ArrayMapNode.prototype.iterate = + HashCollisionNode.prototype.iterate = function (fn, reverse) { + var entries = this.entries; + for (var ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) { + if (fn(entries[reverse ? maxIndex - ii : ii]) === false) { + return false; + } + } + } + + BitmapIndexedNode.prototype.iterate = + HashArrayMapNode.prototype.iterate = function (fn, reverse) { + var nodes = this.nodes; + for (var ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) { + var node = nodes[reverse ? maxIndex - ii : ii]; + if (node && node.iterate(fn, reverse) === false) { + return false; + } + } + } + + ValueNode.prototype.iterate = function (fn, reverse) { + return fn(this.entry); + } + + createClass(MapIterator, src_Iterator__Iterator); + + function MapIterator(map, type, reverse) { + this._type = type; + this._reverse = reverse; + this._stack = map._root && mapIteratorFrame(map._root); + } + + MapIterator.prototype.next = function() { + var type = this._type; + var stack = this._stack; + while (stack) { + var node = stack.node; + var index = stack.index++; + var maxIndex; + if (node.entry) { + if (index === 0) { + return mapIteratorValue(type, node.entry); + } + } else if (node.entries) { + maxIndex = node.entries.length - 1; + if (index <= maxIndex) { + return mapIteratorValue(type, node.entries[this._reverse ? maxIndex - index : index]); + } + } else { + maxIndex = node.nodes.length - 1; + if (index <= maxIndex) { + var subNode = node.nodes[this._reverse ? maxIndex - index : index]; + if (subNode) { + if (subNode.entry) { + return mapIteratorValue(type, subNode.entry); + } + stack = this._stack = mapIteratorFrame(subNode, stack); + } + continue; + } + } + stack = this._stack = this._stack.__prev; + } + return iteratorDone(); + }; + + + function mapIteratorValue(type, entry) { + return iteratorValue(type, entry[0], entry[1]); + } + + function mapIteratorFrame(node, prev) { + return { + node: node, + index: 0, + __prev: prev + }; + } + + function makeMap(size, root, ownerID, hash) { + var map = Object.create(MapPrototype); + map.size = size; + map._root = root; + map.__ownerID = ownerID; + map.__hash = hash; + map.__altered = false; + return map; + } + + var EMPTY_MAP; + function emptyMap() { + return EMPTY_MAP || (EMPTY_MAP = makeMap(0)); + } + + function updateMap(map, k, v) { + var newRoot; + var newSize; + if (!map._root) { + if (v === NOT_SET) { + return map; + } + newSize = 1; + newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]); + } else { + var didChangeSize = MakeRef(CHANGE_LENGTH); + var didAlter = MakeRef(DID_ALTER); + newRoot = updateNode(map._root, map.__ownerID, 0, undefined, k, v, didChangeSize, didAlter); + if (!didAlter.value) { + return map; + } + newSize = map.size + (didChangeSize.value ? v === NOT_SET ? -1 : 1 : 0); + } + if (map.__ownerID) { + map.size = newSize; + map._root = newRoot; + map.__hash = undefined; + map.__altered = true; + return map; + } + return newRoot ? makeMap(newSize, newRoot) : emptyMap(); + } + + function updateNode(node, ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { + if (!node) { + if (value === NOT_SET) { + return node; + } + SetRef(didAlter); + SetRef(didChangeSize); + return new ValueNode(ownerID, keyHash, [key, value]); + } + return node.update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter); + } + + function isLeafNode(node) { + return node.constructor === ValueNode || node.constructor === HashCollisionNode; + } + + function mergeIntoNode(node, ownerID, shift, keyHash, entry) { + if (node.keyHash === keyHash) { + return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]); + } + + var idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK; + var idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; + + var newNode; + var nodes = idx1 === idx2 ? + [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)] : + ((newNode = new ValueNode(ownerID, keyHash, entry)), idx1 < idx2 ? [node, newNode] : [newNode, node]); + + return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes); + } + + function createNodes(ownerID, entries, key, value) { + if (!ownerID) { + ownerID = new OwnerID(); + } + var node = new ValueNode(ownerID, hash(key), [key, value]); + for (var ii = 0; ii < entries.length; ii++) { + var entry = entries[ii]; + node = node.update(ownerID, 0, undefined, entry[0], entry[1]); + } + return node; + } + + function packNodes(ownerID, nodes, count, excluding) { + var bitmap = 0; + var packedII = 0; + var packedNodes = new Array(count); + for (var ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) { + var node = nodes[ii]; + if (node !== undefined && ii !== excluding) { + bitmap |= bit; + packedNodes[packedII++] = node; + } + } + return new BitmapIndexedNode(ownerID, bitmap, packedNodes); + } + + function expandNodes(ownerID, nodes, bitmap, including, node) { + var count = 0; + var expandedNodes = new Array(SIZE); + for (var ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) { + expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined; + } + expandedNodes[including] = node; + return new HashArrayMapNode(ownerID, count + 1, expandedNodes); + } + + function mergeIntoMapWith(map, merger, iterables) { + var iters = []; + for (var ii = 0; ii < iterables.length; ii++) { + var value = iterables[ii]; + var iter = KeyedIterable(value); + if (!isIterable(value)) { + iter = iter.map(function(v ) {return fromJS(v)}); + } + iters.push(iter); + } + return mergeIntoCollectionWith(map, merger, iters); + } + + function deepMerger(merger) { + return function(existing, value, key) + {return existing && existing.mergeDeepWith && isIterable(value) ? + existing.mergeDeepWith(merger, value) : + merger ? merger(existing, value, key) : value}; + } + + function mergeIntoCollectionWith(collection, merger, iters) { + iters = iters.filter(function(x ) {return x.size !== 0}); + if (iters.length === 0) { + return collection; + } + if (collection.size === 0 && !collection.__ownerID && iters.length === 1) { + return collection.constructor(iters[0]); + } + return collection.withMutations(function(collection ) { + var mergeIntoMap = merger ? + function(value, key) { + collection.update(key, NOT_SET, function(existing ) + {return existing === NOT_SET ? value : merger(existing, value, key)} + ); + } : + function(value, key) { + collection.set(key, value); + } + for (var ii = 0; ii < iters.length; ii++) { + iters[ii].forEach(mergeIntoMap); + } + }); + } + + function updateInDeepMap(existing, keyPathIter, notSetValue, updater) { + var isNotSet = existing === NOT_SET; + var step = keyPathIter.next(); + if (step.done) { + var existingValue = isNotSet ? notSetValue : existing; + var newValue = updater(existingValue); + return newValue === existingValue ? existing : newValue; + } + invariant( + isNotSet || (existing && existing.set), + 'invalid keyPath' + ); + var key = step.value; + var nextExisting = isNotSet ? NOT_SET : existing.get(key, NOT_SET); + var nextUpdated = updateInDeepMap( + nextExisting, + keyPathIter, + notSetValue, + updater + ); + return nextUpdated === nextExisting ? existing : + nextUpdated === NOT_SET ? existing.remove(key) : + (isNotSet ? emptyMap() : existing).set(key, nextUpdated); + } + + function popCount(x) { + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0f0f0f0f; + x = x + (x >> 8); + x = x + (x >> 16); + return x & 0x7f; + } + + function setIn(array, idx, val, canEdit) { + var newArray = canEdit ? array : arrCopy(array); + newArray[idx] = val; + return newArray; + } + + function spliceIn(array, idx, val, canEdit) { + var newLen = array.length + 1; + if (canEdit && idx + 1 === newLen) { + array[idx] = val; + return array; + } + var newArray = new Array(newLen); + var after = 0; + for (var ii = 0; ii < newLen; ii++) { + if (ii === idx) { + newArray[ii] = val; + after = -1; + } else { + newArray[ii] = array[ii + after]; + } + } + return newArray; + } + + function spliceOut(array, idx, canEdit) { + var newLen = array.length - 1; + if (canEdit && idx === newLen) { + array.pop(); + return array; + } + var newArray = new Array(newLen); + var after = 0; + for (var ii = 0; ii < newLen; ii++) { + if (ii === idx) { + after = 1; + } + newArray[ii] = array[ii + after]; + } + return newArray; + } + + var MAX_ARRAY_MAP_SIZE = SIZE / 4; + var MAX_BITMAP_INDEXED_SIZE = SIZE / 2; + var MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4; + + createClass(List, IndexedCollection); + + // @pragma Construction + + function List(value) { + var empty = emptyList(); + if (value === null || value === undefined) { + return empty; + } + if (isList(value)) { + return value; + } + var iter = IndexedIterable(value); + var size = iter.size; + if (size === 0) { + return empty; + } + assertNotInfinite(size); + if (size > 0 && size < SIZE) { + return makeList(0, size, SHIFT, null, new VNode(iter.toArray())); + } + return empty.withMutations(function(list ) { + list.setSize(size); + iter.forEach(function(v, i) {return list.set(i, v)}); + }); + } + + List.of = function(/*...values*/) { + return this(arguments); + }; + + List.prototype.toString = function() { + return this.__toString('List [', ']'); + }; + + // @pragma Access + + List.prototype.get = function(index, notSetValue) { + index = wrapIndex(this, index); + if (index < 0 || index >= this.size) { + return notSetValue; + } + index += this._origin; + var node = listNodeFor(this, index); + return node && node.array[index & MASK]; + }; + + // @pragma Modification + + List.prototype.set = function(index, value) { + return updateList(this, index, value); + }; + + List.prototype.remove = function(index) { + return !this.has(index) ? this : + index === 0 ? this.shift() : + index === this.size - 1 ? this.pop() : + this.splice(index, 1); + }; + + List.prototype.clear = function() { + if (this.size === 0) { + return this; + } + if (this.__ownerID) { + this.size = this._origin = this._capacity = 0; + this._level = SHIFT; + this._root = this._tail = null; + this.__hash = undefined; + this.__altered = true; + return this; + } + return emptyList(); + }; + + List.prototype.push = function(/*...values*/) { + var values = arguments; + var oldSize = this.size; + return this.withMutations(function(list ) { + setListBounds(list, 0, oldSize + values.length); + for (var ii = 0; ii < values.length; ii++) { + list.set(oldSize + ii, values[ii]); + } + }); + }; + + List.prototype.pop = function() { + return setListBounds(this, 0, -1); + }; + + List.prototype.unshift = function(/*...values*/) { + var values = arguments; + return this.withMutations(function(list ) { + setListBounds(list, -values.length); + for (var ii = 0; ii < values.length; ii++) { + list.set(ii, values[ii]); + } + }); + }; + + List.prototype.shift = function() { + return setListBounds(this, 1); + }; + + // @pragma Composition + + List.prototype.merge = function(/*...iters*/) { + return mergeIntoListWith(this, undefined, arguments); + }; + + List.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return mergeIntoListWith(this, merger, iters); + }; + + List.prototype.mergeDeep = function(/*...iters*/) { + return mergeIntoListWith(this, deepMerger(undefined), arguments); + }; + + List.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return mergeIntoListWith(this, deepMerger(merger), iters); + }; + + List.prototype.setSize = function(size) { + return setListBounds(this, 0, size); + }; + + // @pragma Iteration + + List.prototype.slice = function(begin, end) { + var size = this.size; + if (wholeSlice(begin, end, size)) { + return this; + } + return setListBounds( + this, + resolveBegin(begin, size), + resolveEnd(end, size) + ); + }; + + List.prototype.__iterator = function(type, reverse) { + var index = 0; + var values = iterateList(this, reverse); + return new src_Iterator__Iterator(function() { + var value = values(); + return value === DONE ? + iteratorDone() : + iteratorValue(type, index++, value); + }); + }; + + List.prototype.__iterate = function(fn, reverse) { + var index = 0; + var values = iterateList(this, reverse); + var value; + while ((value = values()) !== DONE) { + if (fn(value, index++, this) === false) { + break; + } + } + return index; + }; + + List.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { + return this; + } + if (!ownerID) { + this.__ownerID = ownerID; + return this; + } + return makeList(this._origin, this._capacity, this._level, this._root, this._tail, ownerID, this.__hash); + }; + + + function isList(maybeList) { + return !!(maybeList && maybeList[IS_LIST_SENTINEL]); + } + + List.isList = isList; + + var IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@'; + + var ListPrototype = List.prototype; + ListPrototype[IS_LIST_SENTINEL] = true; + ListPrototype[DELETE] = ListPrototype.remove; + ListPrototype.setIn = MapPrototype.setIn; + ListPrototype.deleteIn = + ListPrototype.removeIn = MapPrototype.removeIn; + ListPrototype.update = MapPrototype.update; + ListPrototype.updateIn = MapPrototype.updateIn; + ListPrototype.mergeIn = MapPrototype.mergeIn; + ListPrototype.mergeDeepIn = MapPrototype.mergeDeepIn; + ListPrototype.withMutations = MapPrototype.withMutations; + ListPrototype.asMutable = MapPrototype.asMutable; + ListPrototype.asImmutable = MapPrototype.asImmutable; + ListPrototype.wasAltered = MapPrototype.wasAltered; + + + + function VNode(array, ownerID) { + this.array = array; + this.ownerID = ownerID; + } + + // TODO: seems like these methods are very similar + + VNode.prototype.removeBefore = function(ownerID, level, index) { + if (index === level ? 1 << level : 0 || this.array.length === 0) { + return this; + } + var originIndex = (index >>> level) & MASK; + if (originIndex >= this.array.length) { + return new VNode([], ownerID); + } + var removingFirst = originIndex === 0; + var newChild; + if (level > 0) { + var oldChild = this.array[originIndex]; + newChild = oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index); + if (newChild === oldChild && removingFirst) { + return this; + } + } + if (removingFirst && !newChild) { + return this; + } + var editable = editableVNode(this, ownerID); + if (!removingFirst) { + for (var ii = 0; ii < originIndex; ii++) { + editable.array[ii] = undefined; + } + } + if (newChild) { + editable.array[originIndex] = newChild; + } + return editable; + }; + + VNode.prototype.removeAfter = function(ownerID, level, index) { + if (index === level ? 1 << level : 0 || this.array.length === 0) { + return this; + } + var sizeIndex = ((index - 1) >>> level) & MASK; + if (sizeIndex >= this.array.length) { + return this; + } + var removingLast = sizeIndex === this.array.length - 1; + var newChild; + if (level > 0) { + var oldChild = this.array[sizeIndex]; + newChild = oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index); + if (newChild === oldChild && removingLast) { + return this; + } + } + if (removingLast && !newChild) { + return this; + } + var editable = editableVNode(this, ownerID); + if (!removingLast) { + editable.array.pop(); + } + if (newChild) { + editable.array[sizeIndex] = newChild; + } + return editable; + }; + + + + var DONE = {}; + + function iterateList(list, reverse) { + var left = list._origin; + var right = list._capacity; + var tailPos = getTailOffset(right); + var tail = list._tail; + + return iterateNodeOrLeaf(list._root, list._level, 0); + + function iterateNodeOrLeaf(node, level, offset) { + return level === 0 ? + iterateLeaf(node, offset) : + iterateNode(node, level, offset); + } + + function iterateLeaf(node, offset) { + var array = offset === tailPos ? tail && tail.array : node && node.array; + var from = offset > left ? 0 : left - offset; + var to = right - offset; + if (to > SIZE) { + to = SIZE; + } + return function() { + if (from === to) { + return DONE; + } + var idx = reverse ? --to : from++; + return array && array[idx]; + }; + } + + function iterateNode(node, level, offset) { + var values; + var array = node && node.array; + var from = offset > left ? 0 : (left - offset) >> level; + var to = ((right - offset) >> level) + 1; + if (to > SIZE) { + to = SIZE; + } + return function() { + do { + if (values) { + var value = values(); + if (value !== DONE) { + return value; + } + values = null; + } + if (from === to) { + return DONE; + } + var idx = reverse ? --to : from++; + values = iterateNodeOrLeaf( + array && array[idx], level - SHIFT, offset + (idx << level) + ); + } while (true); + }; + } + } + + function makeList(origin, capacity, level, root, tail, ownerID, hash) { + var list = Object.create(ListPrototype); + list.size = capacity - origin; + list._origin = origin; + list._capacity = capacity; + list._level = level; + list._root = root; + list._tail = tail; + list.__ownerID = ownerID; + list.__hash = hash; + list.__altered = false; + return list; + } + + var EMPTY_LIST; + function emptyList() { + return EMPTY_LIST || (EMPTY_LIST = makeList(0, 0, SHIFT)); + } + + function updateList(list, index, value) { + index = wrapIndex(list, index); + + if (index >= list.size || index < 0) { + return list.withMutations(function(list ) { + index < 0 ? + setListBounds(list, index).set(0, value) : + setListBounds(list, 0, index + 1).set(index, value) + }); + } + + index += list._origin; + + var newTail = list._tail; + var newRoot = list._root; + var didAlter = MakeRef(DID_ALTER); + if (index >= getTailOffset(list._capacity)) { + newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter); + } else { + newRoot = updateVNode(newRoot, list.__ownerID, list._level, index, value, didAlter); + } + + if (!didAlter.value) { + return list; + } + + if (list.__ownerID) { + list._root = newRoot; + list._tail = newTail; + list.__hash = undefined; + list.__altered = true; + return list; + } + return makeList(list._origin, list._capacity, list._level, newRoot, newTail); + } + + function updateVNode(node, ownerID, level, index, value, didAlter) { + var idx = (index >>> level) & MASK; + var nodeHas = node && idx < node.array.length; + if (!nodeHas && value === undefined) { + return node; + } + + var newNode; + + if (level > 0) { + var lowerNode = node && node.array[idx]; + var newLowerNode = updateVNode(lowerNode, ownerID, level - SHIFT, index, value, didAlter); + if (newLowerNode === lowerNode) { + return node; + } + newNode = editableVNode(node, ownerID); + newNode.array[idx] = newLowerNode; + return newNode; + } + + if (nodeHas && node.array[idx] === value) { + return node; + } + + SetRef(didAlter); + + newNode = editableVNode(node, ownerID); + if (value === undefined && idx === newNode.array.length - 1) { + newNode.array.pop(); + } else { + newNode.array[idx] = value; + } + return newNode; + } + + function editableVNode(node, ownerID) { + if (ownerID && node && ownerID === node.ownerID) { + return node; + } + return new VNode(node ? node.array.slice() : [], ownerID); + } + + function listNodeFor(list, rawIndex) { + if (rawIndex >= getTailOffset(list._capacity)) { + return list._tail; + } + if (rawIndex < 1 << (list._level + SHIFT)) { + var node = list._root; + var level = list._level; + while (node && level > 0) { + node = node.array[(rawIndex >>> level) & MASK]; + level -= SHIFT; + } + return node; + } + } + + function setListBounds(list, begin, end) { + var owner = list.__ownerID || new OwnerID(); + var oldOrigin = list._origin; + var oldCapacity = list._capacity; + var newOrigin = oldOrigin + begin; + var newCapacity = end === undefined ? oldCapacity : end < 0 ? oldCapacity + end : oldOrigin + end; + if (newOrigin === oldOrigin && newCapacity === oldCapacity) { + return list; + } + + // If it's going to end after it starts, it's empty. + if (newOrigin >= newCapacity) { + return list.clear(); + } + + var newLevel = list._level; + var newRoot = list._root; + + // New origin might need creating a higher root. + var offsetShift = 0; + while (newOrigin + offsetShift < 0) { + newRoot = new VNode(newRoot && newRoot.array.length ? [undefined, newRoot] : [], owner); + newLevel += SHIFT; + offsetShift += 1 << newLevel; + } + if (offsetShift) { + newOrigin += offsetShift; + oldOrigin += offsetShift; + newCapacity += offsetShift; + oldCapacity += offsetShift; + } + + var oldTailOffset = getTailOffset(oldCapacity); + var newTailOffset = getTailOffset(newCapacity); + + // New size might need creating a higher root. + while (newTailOffset >= 1 << (newLevel + SHIFT)) { + newRoot = new VNode(newRoot && newRoot.array.length ? [newRoot] : [], owner); + newLevel += SHIFT; + } + + // Locate or create the new tail. + var oldTail = list._tail; + var newTail = newTailOffset < oldTailOffset ? + listNodeFor(list, newCapacity - 1) : + newTailOffset > oldTailOffset ? new VNode([], owner) : oldTail; + + // Merge Tail into tree. + if (oldTail && newTailOffset > oldTailOffset && newOrigin < oldCapacity && oldTail.array.length) { + newRoot = editableVNode(newRoot, owner); + var node = newRoot; + for (var level = newLevel; level > SHIFT; level -= SHIFT) { + var idx = (oldTailOffset >>> level) & MASK; + node = node.array[idx] = editableVNode(node.array[idx], owner); + } + node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail; + } + + // If the size has been reduced, there's a chance the tail needs to be trimmed. + if (newCapacity < oldCapacity) { + newTail = newTail && newTail.removeAfter(owner, 0, newCapacity); + } + + // If the new origin is within the tail, then we do not need a root. + if (newOrigin >= newTailOffset) { + newOrigin -= newTailOffset; + newCapacity -= newTailOffset; + newLevel = SHIFT; + newRoot = null; + newTail = newTail && newTail.removeBefore(owner, 0, newOrigin); + + // Otherwise, if the root has been trimmed, garbage collect. + } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) { + offsetShift = 0; + + // Identify the new top root node of the subtree of the old root. + while (newRoot) { + var beginIndex = (newOrigin >>> newLevel) & MASK; + if (beginIndex !== (newTailOffset >>> newLevel) & MASK) { + break; + } + if (beginIndex) { + offsetShift += (1 << newLevel) * beginIndex; + } + newLevel -= SHIFT; + newRoot = newRoot.array[beginIndex]; + } + + // Trim the new sides of the new root. + if (newRoot && newOrigin > oldOrigin) { + newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift); + } + if (newRoot && newTailOffset < oldTailOffset) { + newRoot = newRoot.removeAfter(owner, newLevel, newTailOffset - offsetShift); + } + if (offsetShift) { + newOrigin -= offsetShift; + newCapacity -= offsetShift; + } + } + + if (list.__ownerID) { + list.size = newCapacity - newOrigin; + list._origin = newOrigin; + list._capacity = newCapacity; + list._level = newLevel; + list._root = newRoot; + list._tail = newTail; + list.__hash = undefined; + list.__altered = true; + return list; + } + return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail); + } + + function mergeIntoListWith(list, merger, iterables) { + var iters = []; + var maxSize = 0; + for (var ii = 0; ii < iterables.length; ii++) { + var value = iterables[ii]; + var iter = IndexedIterable(value); + if (iter.size > maxSize) { + maxSize = iter.size; + } + if (!isIterable(value)) { + iter = iter.map(function(v ) {return fromJS(v)}); + } + iters.push(iter); + } + if (maxSize > list.size) { + list = list.setSize(maxSize); + } + return mergeIntoCollectionWith(list, merger, iters); + } + + function getTailOffset(size) { + return size < SIZE ? 0 : (((size - 1) >>> SHIFT) << SHIFT); + } + + createClass(OrderedMap, src_Map__Map); + + // @pragma Construction + + function OrderedMap(value) { + return value === null || value === undefined ? emptyOrderedMap() : + isOrderedMap(value) ? value : + emptyOrderedMap().withMutations(function(map ) { + var iter = KeyedIterable(value); + assertNotInfinite(iter.size); + iter.forEach(function(v, k) {return map.set(k, v)}); + }); + } + + OrderedMap.of = function(/*...values*/) { + return this(arguments); + }; + + OrderedMap.prototype.toString = function() { + return this.__toString('OrderedMap {', '}'); + }; + + // @pragma Access + + OrderedMap.prototype.get = function(k, notSetValue) { + var index = this._map.get(k); + return index !== undefined ? this._list.get(index)[1] : notSetValue; + }; + + // @pragma Modification + + OrderedMap.prototype.clear = function() { + if (this.size === 0) { + return this; + } + if (this.__ownerID) { + this.size = 0; + this._map.clear(); + this._list.clear(); + return this; + } + return emptyOrderedMap(); + }; + + OrderedMap.prototype.set = function(k, v) { + return updateOrderedMap(this, k, v); + }; + + OrderedMap.prototype.remove = function(k) { + return updateOrderedMap(this, k, NOT_SET); + }; + + OrderedMap.prototype.wasAltered = function() { + return this._map.wasAltered() || this._list.wasAltered(); + }; + + OrderedMap.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return this._list.__iterate( + function(entry ) {return entry && fn(entry[1], entry[0], this$0)}, + reverse + ); + }; + + OrderedMap.prototype.__iterator = function(type, reverse) { + return this._list.fromEntrySeq().__iterator(type, reverse); + }; + + OrderedMap.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { + return this; + } + var newMap = this._map.__ensureOwner(ownerID); + var newList = this._list.__ensureOwner(ownerID); + if (!ownerID) { + this.__ownerID = ownerID; + this._map = newMap; + this._list = newList; + return this; + } + return makeOrderedMap(newMap, newList, ownerID, this.__hash); + }; + + + function isOrderedMap(maybeOrderedMap) { + return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap); + } + + OrderedMap.isOrderedMap = isOrderedMap; + + OrderedMap.prototype[IS_ORDERED_SENTINEL] = true; + OrderedMap.prototype[DELETE] = OrderedMap.prototype.remove; + + + + function makeOrderedMap(map, list, ownerID, hash) { + var omap = Object.create(OrderedMap.prototype); + omap.size = map ? map.size : 0; + omap._map = map; + omap._list = list; + omap.__ownerID = ownerID; + omap.__hash = hash; + return omap; + } + + var EMPTY_ORDERED_MAP; + function emptyOrderedMap() { + return EMPTY_ORDERED_MAP || (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList())); + } + + function updateOrderedMap(omap, k, v) { + var map = omap._map; + var list = omap._list; + var i = map.get(k); + var has = i !== undefined; + var newMap; + var newList; + if (v === NOT_SET) { // removed + if (!has) { + return omap; + } + if (list.size >= SIZE && list.size >= map.size * 2) { + newList = list.filter(function(entry, idx) {return entry !== undefined && i !== idx}); + newMap = newList.toKeyedSeq().map(function(entry ) {return entry[0]}).flip().toMap(); + if (omap.__ownerID) { + newMap.__ownerID = newList.__ownerID = omap.__ownerID; + } + } else { + newMap = map.remove(k); + newList = i === list.size - 1 ? list.pop() : list.set(i, undefined); + } + } else { + if (has) { + if (v === list.get(i)[1]) { + return omap; + } + newMap = map; + newList = list.set(i, [k, v]); + } else { + newMap = map.set(k, list.size); + newList = list.set(list.size, [k, v]); + } + } + if (omap.__ownerID) { + omap.size = newMap.size; + omap._map = newMap; + omap._list = newList; + omap.__hash = undefined; + return omap; + } + return makeOrderedMap(newMap, newList); + } + + createClass(Stack, IndexedCollection); + + // @pragma Construction + + function Stack(value) { + return value === null || value === undefined ? emptyStack() : + isStack(value) ? value : + emptyStack().unshiftAll(value); + } + + Stack.of = function(/*...values*/) { + return this(arguments); + }; + + Stack.prototype.toString = function() { + return this.__toString('Stack [', ']'); + }; + + // @pragma Access + + Stack.prototype.get = function(index, notSetValue) { + var head = this._head; + index = wrapIndex(this, index); + while (head && index--) { + head = head.next; + } + return head ? head.value : notSetValue; + }; + + Stack.prototype.peek = function() { + return this._head && this._head.value; + }; + + // @pragma Modification + + Stack.prototype.push = function(/*...values*/) { + if (arguments.length === 0) { + return this; + } + var newSize = this.size + arguments.length; + var head = this._head; + for (var ii = arguments.length - 1; ii >= 0; ii--) { + head = { + value: arguments[ii], + next: head + }; + } + if (this.__ownerID) { + this.size = newSize; + this._head = head; + this.__hash = undefined; + this.__altered = true; + return this; + } + return makeStack(newSize, head); + }; + + Stack.prototype.pushAll = function(iter) { + iter = IndexedIterable(iter); + if (iter.size === 0) { + return this; + } + assertNotInfinite(iter.size); + var newSize = this.size; + var head = this._head; + iter.reverse().forEach(function(value ) { + newSize++; + head = { + value: value, + next: head + }; + }); + if (this.__ownerID) { + this.size = newSize; + this._head = head; + this.__hash = undefined; + this.__altered = true; + return this; + } + return makeStack(newSize, head); + }; + + Stack.prototype.pop = function() { + return this.slice(1); + }; + + Stack.prototype.unshift = function(/*...values*/) { + return this.push.apply(this, arguments); + }; + + Stack.prototype.unshiftAll = function(iter) { + return this.pushAll(iter); + }; + + Stack.prototype.shift = function() { + return this.pop.apply(this, arguments); + }; + + Stack.prototype.clear = function() { + if (this.size === 0) { + return this; + } + if (this.__ownerID) { + this.size = 0; + this._head = undefined; + this.__hash = undefined; + this.__altered = true; + return this; + } + return emptyStack(); + }; + + Stack.prototype.slice = function(begin, end) { + if (wholeSlice(begin, end, this.size)) { + return this; + } + var resolvedBegin = resolveBegin(begin, this.size); + var resolvedEnd = resolveEnd(end, this.size); + if (resolvedEnd !== this.size) { + // super.slice(begin, end); + return IndexedCollection.prototype.slice.call(this, begin, end); + } + var newSize = this.size - resolvedBegin; + var head = this._head; + while (resolvedBegin--) { + head = head.next; + } + if (this.__ownerID) { + this.size = newSize; + this._head = head; + this.__hash = undefined; + this.__altered = true; + return this; + } + return makeStack(newSize, head); + }; + + // @pragma Mutability + + Stack.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { + return this; + } + if (!ownerID) { + this.__ownerID = ownerID; + this.__altered = false; + return this; + } + return makeStack(this.size, this._head, ownerID, this.__hash); + }; + + // @pragma Iteration + + Stack.prototype.__iterate = function(fn, reverse) { + if (reverse) { + return this.reverse().__iterate(fn); + } + var iterations = 0; + var node = this._head; + while (node) { + if (fn(node.value, iterations++, this) === false) { + break; + } + node = node.next; + } + return iterations; + }; + + Stack.prototype.__iterator = function(type, reverse) { + if (reverse) { + return this.reverse().__iterator(type); + } + var iterations = 0; + var node = this._head; + return new src_Iterator__Iterator(function() { + if (node) { + var value = node.value; + node = node.next; + return iteratorValue(type, iterations++, value); + } + return iteratorDone(); + }); + }; + + + function isStack(maybeStack) { + return !!(maybeStack && maybeStack[IS_STACK_SENTINEL]); + } + + Stack.isStack = isStack; + + var IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@'; + + var StackPrototype = Stack.prototype; + StackPrototype[IS_STACK_SENTINEL] = true; + StackPrototype.withMutations = MapPrototype.withMutations; + StackPrototype.asMutable = MapPrototype.asMutable; + StackPrototype.asImmutable = MapPrototype.asImmutable; + StackPrototype.wasAltered = MapPrototype.wasAltered; + + + function makeStack(size, head, ownerID, hash) { + var map = Object.create(StackPrototype); + map.size = size; + map._head = head; + map.__ownerID = ownerID; + map.__hash = hash; + map.__altered = false; + return map; + } + + var EMPTY_STACK; + function emptyStack() { + return EMPTY_STACK || (EMPTY_STACK = makeStack(0)); + } + + createClass(src_Set__Set, SetCollection); + + // @pragma Construction + + function src_Set__Set(value) { + return value === null || value === undefined ? emptySet() : + isSet(value) ? value : + emptySet().withMutations(function(set ) { + var iter = SetIterable(value); + assertNotInfinite(iter.size); + iter.forEach(function(v ) {return set.add(v)}); + }); + } + + src_Set__Set.of = function(/*...values*/) { + return this(arguments); + }; + + src_Set__Set.fromKeys = function(value) { + return this(KeyedIterable(value).keySeq()); + }; + + src_Set__Set.prototype.toString = function() { + return this.__toString('Set {', '}'); + }; + + // @pragma Access + + src_Set__Set.prototype.has = function(value) { + return this._map.has(value); + }; + + // @pragma Modification + + src_Set__Set.prototype.add = function(value) { + return updateSet(this, this._map.set(value, true)); + }; + + src_Set__Set.prototype.remove = function(value) { + return updateSet(this, this._map.remove(value)); + }; + + src_Set__Set.prototype.clear = function() { + return updateSet(this, this._map.clear()); + }; + + // @pragma Composition + + src_Set__Set.prototype.union = function() {var iters = SLICE$0.call(arguments, 0); + iters = iters.filter(function(x ) {return x.size !== 0}); + if (iters.length === 0) { + return this; + } + if (this.size === 0 && !this.__ownerID && iters.length === 1) { + return this.constructor(iters[0]); + } + return this.withMutations(function(set ) { + for (var ii = 0; ii < iters.length; ii++) { + SetIterable(iters[ii]).forEach(function(value ) {return set.add(value)}); + } + }); + }; + + src_Set__Set.prototype.intersect = function() {var iters = SLICE$0.call(arguments, 0); + if (iters.length === 0) { + return this; + } + iters = iters.map(function(iter ) {return SetIterable(iter)}); + var originalSet = this; + return this.withMutations(function(set ) { + originalSet.forEach(function(value ) { + if (!iters.every(function(iter ) {return iter.includes(value)})) { + set.remove(value); + } + }); + }); + }; + + src_Set__Set.prototype.subtract = function() {var iters = SLICE$0.call(arguments, 0); + if (iters.length === 0) { + return this; + } + iters = iters.map(function(iter ) {return SetIterable(iter)}); + var originalSet = this; + return this.withMutations(function(set ) { + originalSet.forEach(function(value ) { + if (iters.some(function(iter ) {return iter.includes(value)})) { + set.remove(value); + } + }); + }); + }; + + src_Set__Set.prototype.merge = function() { + return this.union.apply(this, arguments); + }; + + src_Set__Set.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1); + return this.union.apply(this, iters); + }; + + src_Set__Set.prototype.sort = function(comparator) { + // Late binding + return OrderedSet(sortFactory(this, comparator)); + }; + + src_Set__Set.prototype.sortBy = function(mapper, comparator) { + // Late binding + return OrderedSet(sortFactory(this, comparator, mapper)); + }; + + src_Set__Set.prototype.wasAltered = function() { + return this._map.wasAltered(); + }; + + src_Set__Set.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return this._map.__iterate(function(_, k) {return fn(k, k, this$0)}, reverse); + }; + + src_Set__Set.prototype.__iterator = function(type, reverse) { + return this._map.map(function(_, k) {return k}).__iterator(type, reverse); + }; + + src_Set__Set.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { + return this; + } + var newMap = this._map.__ensureOwner(ownerID); + if (!ownerID) { + this.__ownerID = ownerID; + this._map = newMap; + return this; + } + return this.__make(newMap, ownerID); + }; + + + function isSet(maybeSet) { + return !!(maybeSet && maybeSet[IS_SET_SENTINEL]); + } + + src_Set__Set.isSet = isSet; + + var IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@'; + + var SetPrototype = src_Set__Set.prototype; + SetPrototype[IS_SET_SENTINEL] = true; + SetPrototype[DELETE] = SetPrototype.remove; + SetPrototype.mergeDeep = SetPrototype.merge; + SetPrototype.mergeDeepWith = SetPrototype.mergeWith; + SetPrototype.withMutations = MapPrototype.withMutations; + SetPrototype.asMutable = MapPrototype.asMutable; + SetPrototype.asImmutable = MapPrototype.asImmutable; + + SetPrototype.__empty = emptySet; + SetPrototype.__make = makeSet; + + function updateSet(set, newMap) { + if (set.__ownerID) { + set.size = newMap.size; + set._map = newMap; + return set; + } + return newMap === set._map ? set : + newMap.size === 0 ? set.__empty() : + set.__make(newMap); + } + + function makeSet(map, ownerID) { + var set = Object.create(SetPrototype); + set.size = map ? map.size : 0; + set._map = map; + set.__ownerID = ownerID; + return set; + } + + var EMPTY_SET; + function emptySet() { + return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap())); + } + + createClass(OrderedSet, src_Set__Set); + + // @pragma Construction + + function OrderedSet(value) { + return value === null || value === undefined ? emptyOrderedSet() : + isOrderedSet(value) ? value : + emptyOrderedSet().withMutations(function(set ) { + var iter = SetIterable(value); + assertNotInfinite(iter.size); + iter.forEach(function(v ) {return set.add(v)}); + }); + } + + OrderedSet.of = function(/*...values*/) { + return this(arguments); + }; + + OrderedSet.fromKeys = function(value) { + return this(KeyedIterable(value).keySeq()); + }; + + OrderedSet.prototype.toString = function() { + return this.__toString('OrderedSet {', '}'); + }; + + + function isOrderedSet(maybeOrderedSet) { + return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet); + } + + OrderedSet.isOrderedSet = isOrderedSet; + + var OrderedSetPrototype = OrderedSet.prototype; + OrderedSetPrototype[IS_ORDERED_SENTINEL] = true; + + OrderedSetPrototype.__empty = emptyOrderedSet; + OrderedSetPrototype.__make = makeOrderedSet; + + function makeOrderedSet(map, ownerID) { + var set = Object.create(OrderedSetPrototype); + set.size = map ? map.size : 0; + set._map = map; + set.__ownerID = ownerID; + return set; + } + + var EMPTY_ORDERED_SET; + function emptyOrderedSet() { + return EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap())); + } + + createClass(Record, KeyedCollection); + + function Record(defaultValues, name) { + var hasInitialized; + + var RecordType = function Record(values) { + if (values instanceof RecordType) { + return values; + } + if (!(this instanceof RecordType)) { + return new RecordType(values); + } + if (!hasInitialized) { + hasInitialized = true; + var keys = Object.keys(defaultValues); + setProps(RecordTypePrototype, keys); + RecordTypePrototype.size = keys.length; + RecordTypePrototype._name = name; + RecordTypePrototype._keys = keys; + RecordTypePrototype._defaultValues = defaultValues; + } + this._map = src_Map__Map(values); + }; + + var RecordTypePrototype = RecordType.prototype = Object.create(RecordPrototype); + RecordTypePrototype.constructor = RecordType; + + return RecordType; + } + + Record.prototype.toString = function() { + return this.__toString(recordName(this) + ' {', '}'); + }; + + // @pragma Access + + Record.prototype.has = function(k) { + return this._defaultValues.hasOwnProperty(k); + }; + + Record.prototype.get = function(k, notSetValue) { + if (!this.has(k)) { + return notSetValue; + } + var defaultVal = this._defaultValues[k]; + return this._map ? this._map.get(k, defaultVal) : defaultVal; + }; + + // @pragma Modification + + Record.prototype.clear = function() { + if (this.__ownerID) { + this._map && this._map.clear(); + return this; + } + var RecordType = this.constructor; + return RecordType._empty || (RecordType._empty = makeRecord(this, emptyMap())); + }; + + Record.prototype.set = function(k, v) { + if (!this.has(k)) { + throw new Error('Cannot set unknown key "' + k + '" on ' + recordName(this)); + } + var newMap = this._map && this._map.set(k, v); + if (this.__ownerID || newMap === this._map) { + return this; + } + return makeRecord(this, newMap); + }; + + Record.prototype.remove = function(k) { + if (!this.has(k)) { + return this; + } + var newMap = this._map && this._map.remove(k); + if (this.__ownerID || newMap === this._map) { + return this; + } + return makeRecord(this, newMap); + }; + + Record.prototype.wasAltered = function() { + return this._map.wasAltered(); + }; + + Record.prototype.__iterator = function(type, reverse) {var this$0 = this; + return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterator(type, reverse); + }; + + Record.prototype.__iterate = function(fn, reverse) {var this$0 = this; + return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterate(fn, reverse); + }; + + Record.prototype.__ensureOwner = function(ownerID) { + if (ownerID === this.__ownerID) { + return this; + } + var newMap = this._map && this._map.__ensureOwner(ownerID); + if (!ownerID) { + this.__ownerID = ownerID; + this._map = newMap; + return this; + } + return makeRecord(this, newMap, ownerID); + }; + + + var RecordPrototype = Record.prototype; + RecordPrototype[DELETE] = RecordPrototype.remove; + RecordPrototype.deleteIn = + RecordPrototype.removeIn = MapPrototype.removeIn; + RecordPrototype.merge = MapPrototype.merge; + RecordPrototype.mergeWith = MapPrototype.mergeWith; + RecordPrototype.mergeIn = MapPrototype.mergeIn; + RecordPrototype.mergeDeep = MapPrototype.mergeDeep; + RecordPrototype.mergeDeepWith = MapPrototype.mergeDeepWith; + RecordPrototype.mergeDeepIn = MapPrototype.mergeDeepIn; + RecordPrototype.setIn = MapPrototype.setIn; + RecordPrototype.update = MapPrototype.update; + RecordPrototype.updateIn = MapPrototype.updateIn; + RecordPrototype.withMutations = MapPrototype.withMutations; + RecordPrototype.asMutable = MapPrototype.asMutable; + RecordPrototype.asImmutable = MapPrototype.asImmutable; + + + function makeRecord(likeRecord, map, ownerID) { + var record = Object.create(Object.getPrototypeOf(likeRecord)); + record._map = map; + record.__ownerID = ownerID; + return record; + } + + function recordName(record) { + return record._name || record.constructor.name || 'Record'; + } + + function setProps(prototype, names) { + try { + names.forEach(setProp.bind(undefined, prototype)); + } catch (error) { + // Object.defineProperty failed. Probably IE8. + } + } + + function setProp(prototype, name) { + Object.defineProperty(prototype, name, { + get: function() { + return this.get(name); + }, + set: function(value) { + invariant(this.__ownerID, 'Cannot set on an immutable record.'); + this.set(name, value); + } + }); + } + + function deepEqual(a, b) { + if (a === b) { + return true; + } + + if ( + !isIterable(b) || + a.size !== undefined && b.size !== undefined && a.size !== b.size || + a.__hash !== undefined && b.__hash !== undefined && a.__hash !== b.__hash || + isKeyed(a) !== isKeyed(b) || + isIndexed(a) !== isIndexed(b) || + isOrdered(a) !== isOrdered(b) + ) { + return false; + } + + if (a.size === 0 && b.size === 0) { + return true; + } + + var notAssociative = !isAssociative(a); + + if (isOrdered(a)) { + var entries = a.entries(); + return b.every(function(v, k) { + var entry = entries.next().value; + return entry && is(entry[1], v) && (notAssociative || is(entry[0], k)); + }) && entries.next().done; + } + + var flipped = false; + + if (a.size === undefined) { + if (b.size === undefined) { + if (typeof a.cacheResult === 'function') { + a.cacheResult(); + } + } else { + flipped = true; + var _ = a; + a = b; + b = _; + } + } + + var allEqual = true; + var bSize = b.__iterate(function(v, k) { + if (notAssociative ? !a.has(v) : + flipped ? !is(v, a.get(k, NOT_SET)) : !is(a.get(k, NOT_SET), v)) { + allEqual = false; + return false; + } + }); + + return allEqual && a.size === bSize; + } + + createClass(Range, IndexedSeq); + + function Range(start, end, step) { + if (!(this instanceof Range)) { + return new Range(start, end, step); + } + invariant(step !== 0, 'Cannot step a Range by 0'); + start = start || 0; + if (end === undefined) { + end = Infinity; + } + step = step === undefined ? 1 : Math.abs(step); + if (end < start) { + step = -step; + } + this._start = start; + this._end = end; + this._step = step; + this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1); + if (this.size === 0) { + if (EMPTY_RANGE) { + return EMPTY_RANGE; + } + EMPTY_RANGE = this; + } + } + + Range.prototype.toString = function() { + if (this.size === 0) { + return 'Range []'; + } + return 'Range [ ' + + this._start + '...' + this._end + + (this._step > 1 ? ' by ' + this._step : '') + + ' ]'; + }; + + Range.prototype.get = function(index, notSetValue) { + return this.has(index) ? + this._start + wrapIndex(this, index) * this._step : + notSetValue; + }; + + Range.prototype.includes = function(searchValue) { + var possibleIndex = (searchValue - this._start) / this._step; + return possibleIndex >= 0 && + possibleIndex < this.size && + possibleIndex === Math.floor(possibleIndex); + }; + + Range.prototype.slice = function(begin, end) { + if (wholeSlice(begin, end, this.size)) { + return this; + } + begin = resolveBegin(begin, this.size); + end = resolveEnd(end, this.size); + if (end <= begin) { + return new Range(0, 0); + } + return new Range(this.get(begin, this._end), this.get(end, this._end), this._step); + }; + + Range.prototype.indexOf = function(searchValue) { + var offsetValue = searchValue - this._start; + if (offsetValue % this._step === 0) { + var index = offsetValue / this._step; + if (index >= 0 && index < this.size) { + return index + } + } + return -1; + }; + + Range.prototype.lastIndexOf = function(searchValue) { + return this.indexOf(searchValue); + }; + + Range.prototype.__iterate = function(fn, reverse) { + var maxIndex = this.size - 1; + var step = this._step; + var value = reverse ? this._start + maxIndex * step : this._start; + for (var ii = 0; ii <= maxIndex; ii++) { + if (fn(value, ii, this) === false) { + return ii + 1; + } + value += reverse ? -step : step; + } + return ii; + }; + + Range.prototype.__iterator = function(type, reverse) { + var maxIndex = this.size - 1; + var step = this._step; + var value = reverse ? this._start + maxIndex * step : this._start; + var ii = 0; + return new src_Iterator__Iterator(function() { + var v = value; + value += reverse ? -step : step; + return ii > maxIndex ? iteratorDone() : iteratorValue(type, ii++, v); + }); + }; + + Range.prototype.equals = function(other) { + return other instanceof Range ? + this._start === other._start && + this._end === other._end && + this._step === other._step : + deepEqual(this, other); + }; + + + var EMPTY_RANGE; + + createClass(Repeat, IndexedSeq); + + function Repeat(value, times) { + if (!(this instanceof Repeat)) { + return new Repeat(value, times); + } + this._value = value; + this.size = times === undefined ? Infinity : Math.max(0, times); + if (this.size === 0) { + if (EMPTY_REPEAT) { + return EMPTY_REPEAT; + } + EMPTY_REPEAT = this; + } + } + + Repeat.prototype.toString = function() { + if (this.size === 0) { + return 'Repeat []'; + } + return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]'; + }; + + Repeat.prototype.get = function(index, notSetValue) { + return this.has(index) ? this._value : notSetValue; + }; + + Repeat.prototype.includes = function(searchValue) { + return is(this._value, searchValue); + }; + + Repeat.prototype.slice = function(begin, end) { + var size = this.size; + return wholeSlice(begin, end, size) ? this : + new Repeat(this._value, resolveEnd(end, size) - resolveBegin(begin, size)); + }; + + Repeat.prototype.reverse = function() { + return this; + }; + + Repeat.prototype.indexOf = function(searchValue) { + if (is(this._value, searchValue)) { + return 0; + } + return -1; + }; + + Repeat.prototype.lastIndexOf = function(searchValue) { + if (is(this._value, searchValue)) { + return this.size; + } + return -1; + }; + + Repeat.prototype.__iterate = function(fn, reverse) { + for (var ii = 0; ii < this.size; ii++) { + if (fn(this._value, ii, this) === false) { + return ii + 1; + } + } + return ii; + }; + + Repeat.prototype.__iterator = function(type, reverse) {var this$0 = this; + var ii = 0; + return new src_Iterator__Iterator(function() + {return ii < this$0.size ? iteratorValue(type, ii++, this$0._value) : iteratorDone()} + ); + }; + + Repeat.prototype.equals = function(other) { + return other instanceof Repeat ? + is(this._value, other._value) : + deepEqual(other); + }; + + + var EMPTY_REPEAT; + + /** + * Contributes additional methods to a constructor + */ + function mixin(ctor, methods) { + var keyCopier = function(key ) { ctor.prototype[key] = methods[key]; }; + Object.keys(methods).forEach(keyCopier); + Object.getOwnPropertySymbols && + Object.getOwnPropertySymbols(methods).forEach(keyCopier); + return ctor; + } + + Iterable.Iterator = src_Iterator__Iterator; + + mixin(Iterable, { + + // ### Conversion to other types + + toArray: function() { + assertNotInfinite(this.size); + var array = new Array(this.size || 0); + this.valueSeq().__iterate(function(v, i) { array[i] = v; }); + return array; + }, + + toIndexedSeq: function() { + return new ToIndexedSequence(this); + }, + + toJS: function() { + return this.toSeq().map( + function(value ) {return value && typeof value.toJS === 'function' ? value.toJS() : value} + ).__toJS(); + }, + + toJSON: function() { + return this.toSeq().map( + function(value ) {return value && typeof value.toJSON === 'function' ? value.toJSON() : value} + ).__toJS(); + }, + + toKeyedSeq: function() { + return new ToKeyedSequence(this, true); + }, + + toMap: function() { + // Use Late Binding here to solve the circular dependency. + return src_Map__Map(this.toKeyedSeq()); + }, + + toObject: function() { + assertNotInfinite(this.size); + var object = {}; + this.__iterate(function(v, k) { object[k] = v; }); + return object; + }, + + toOrderedMap: function() { + // Use Late Binding here to solve the circular dependency. + return OrderedMap(this.toKeyedSeq()); + }, + + toOrderedSet: function() { + // Use Late Binding here to solve the circular dependency. + return OrderedSet(isKeyed(this) ? this.valueSeq() : this); + }, + + toSet: function() { + // Use Late Binding here to solve the circular dependency. + return src_Set__Set(isKeyed(this) ? this.valueSeq() : this); + }, + + toSetSeq: function() { + return new ToSetSequence(this); + }, + + toSeq: function() { + return isIndexed(this) ? this.toIndexedSeq() : + isKeyed(this) ? this.toKeyedSeq() : + this.toSetSeq(); + }, + + toStack: function() { + // Use Late Binding here to solve the circular dependency. + return Stack(isKeyed(this) ? this.valueSeq() : this); + }, + + toList: function() { + // Use Late Binding here to solve the circular dependency. + return List(isKeyed(this) ? this.valueSeq() : this); + }, + + + // ### Common JavaScript methods and properties + + toString: function() { + return '[Iterable]'; + }, + + __toString: function(head, tail) { + if (this.size === 0) { + return head + tail; + } + return head + ' ' + this.toSeq().map(this.__toStringMapper).join(', ') + ' ' + tail; + }, + + + // ### ES6 Collection methods (ES6 Array and Map) + + concat: function() {var values = SLICE$0.call(arguments, 0); + return reify(this, concatFactory(this, values)); + }, + + contains: function(searchValue) { + return this.includes(searchValue); + }, + + includes: function(searchValue) { + return this.some(function(value ) {return is(value, searchValue)}); + }, + + entries: function() { + return this.__iterator(ITERATE_ENTRIES); + }, + + every: function(predicate, context) { + assertNotInfinite(this.size); + var returnValue = true; + this.__iterate(function(v, k, c) { + if (!predicate.call(context, v, k, c)) { + returnValue = false; + return false; + } + }); + return returnValue; + }, + + filter: function(predicate, context) { + return reify(this, filterFactory(this, predicate, context, true)); + }, + + find: function(predicate, context, notSetValue) { + var entry = this.findEntry(predicate, context); + return entry ? entry[1] : notSetValue; + }, + + findEntry: function(predicate, context) { + var found; + this.__iterate(function(v, k, c) { + if (predicate.call(context, v, k, c)) { + found = [k, v]; + return false; + } + }); + return found; + }, + + findLastEntry: function(predicate, context) { + return this.toSeq().reverse().findEntry(predicate, context); + }, + + forEach: function(sideEffect, context) { + assertNotInfinite(this.size); + return this.__iterate(context ? sideEffect.bind(context) : sideEffect); + }, + + join: function(separator) { + assertNotInfinite(this.size); + separator = separator !== undefined ? '' + separator : ','; + var joined = ''; + var isFirst = true; + this.__iterate(function(v ) { + isFirst ? (isFirst = false) : (joined += separator); + joined += v !== null && v !== undefined ? v.toString() : ''; + }); + return joined; + }, + + keys: function() { + return this.__iterator(ITERATE_KEYS); + }, + + map: function(mapper, context) { + return reify(this, mapFactory(this, mapper, context)); + }, + + reduce: function(reducer, initialReduction, context) { + assertNotInfinite(this.size); + var reduction; + var useFirst; + if (arguments.length < 2) { + useFirst = true; + } else { + reduction = initialReduction; + } + this.__iterate(function(v, k, c) { + if (useFirst) { + useFirst = false; + reduction = v; + } else { + reduction = reducer.call(context, reduction, v, k, c); + } + }); + return reduction; + }, + + reduceRight: function(reducer, initialReduction, context) { + var reversed = this.toKeyedSeq().reverse(); + return reversed.reduce.apply(reversed, arguments); + }, + + reverse: function() { + return reify(this, reverseFactory(this, true)); + }, + + slice: function(begin, end) { + return reify(this, sliceFactory(this, begin, end, true)); + }, + + some: function(predicate, context) { + return !this.every(not(predicate), context); + }, + + sort: function(comparator) { + return reify(this, sortFactory(this, comparator)); + }, + + values: function() { + return this.__iterator(ITERATE_VALUES); + }, + + + // ### More sequential methods + + butLast: function() { + return this.slice(0, -1); + }, + + isEmpty: function() { + return this.size !== undefined ? this.size === 0 : !this.some(function() {return true}); + }, + + count: function(predicate, context) { + return ensureSize( + predicate ? this.toSeq().filter(predicate, context) : this + ); + }, + + countBy: function(grouper, context) { + return countByFactory(this, grouper, context); + }, + + equals: function(other) { + return deepEqual(this, other); + }, + + entrySeq: function() { + var iterable = this; + if (iterable._cache) { + // We cache as an entries array, so we can just return the cache! + return new ArraySeq(iterable._cache); + } + var entriesSequence = iterable.toSeq().map(entryMapper).toIndexedSeq(); + entriesSequence.fromEntrySeq = function() {return iterable.toSeq()}; + return entriesSequence; + }, + + filterNot: function(predicate, context) { + return this.filter(not(predicate), context); + }, + + findLast: function(predicate, context, notSetValue) { + return this.toKeyedSeq().reverse().find(predicate, context, notSetValue); + }, + + first: function() { + return this.find(returnTrue); + }, + + flatMap: function(mapper, context) { + return reify(this, flatMapFactory(this, mapper, context)); + }, + + flatten: function(depth) { + return reify(this, flattenFactory(this, depth, true)); + }, + + fromEntrySeq: function() { + return new FromEntriesSequence(this); + }, + + get: function(searchKey, notSetValue) { + return this.find(function(_, key) {return is(key, searchKey)}, undefined, notSetValue); + }, + + getIn: function(searchKeyPath, notSetValue) { + var nested = this; + // Note: in an ES6 environment, we would prefer: + // for (var key of searchKeyPath) { + var iter = forceIterator(searchKeyPath); + var step; + while (!(step = iter.next()).done) { + var key = step.value; + nested = nested && nested.get ? nested.get(key, NOT_SET) : NOT_SET; + if (nested === NOT_SET) { + return notSetValue; + } + } + return nested; + }, + + groupBy: function(grouper, context) { + return groupByFactory(this, grouper, context); + }, + + has: function(searchKey) { + return this.get(searchKey, NOT_SET) !== NOT_SET; + }, + + hasIn: function(searchKeyPath) { + return this.getIn(searchKeyPath, NOT_SET) !== NOT_SET; + }, + + isSubset: function(iter) { + iter = typeof iter.includes === 'function' ? iter : Iterable(iter); + return this.every(function(value ) {return iter.includes(value)}); + }, + + isSuperset: function(iter) { + iter = typeof iter.isSubset === 'function' ? iter : Iterable(iter); + return iter.isSubset(this); + }, + + keySeq: function() { + return this.toSeq().map(keyMapper).toIndexedSeq(); + }, + + last: function() { + return this.toSeq().reverse().first(); + }, + + max: function(comparator) { + return maxFactory(this, comparator); + }, + + maxBy: function(mapper, comparator) { + return maxFactory(this, comparator, mapper); + }, + + min: function(comparator) { + return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator); + }, + + minBy: function(mapper, comparator) { + return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator, mapper); + }, + + rest: function() { + return this.slice(1); + }, + + skip: function(amount) { + return this.slice(Math.max(0, amount)); + }, + + skipLast: function(amount) { + return reify(this, this.toSeq().reverse().skip(amount).reverse()); + }, + + skipWhile: function(predicate, context) { + return reify(this, skipWhileFactory(this, predicate, context, true)); + }, + + skipUntil: function(predicate, context) { + return this.skipWhile(not(predicate), context); + }, + + sortBy: function(mapper, comparator) { + return reify(this, sortFactory(this, comparator, mapper)); + }, + + take: function(amount) { + return this.slice(0, Math.max(0, amount)); + }, + + takeLast: function(amount) { + return reify(this, this.toSeq().reverse().take(amount).reverse()); + }, + + takeWhile: function(predicate, context) { + return reify(this, takeWhileFactory(this, predicate, context)); + }, + + takeUntil: function(predicate, context) { + return this.takeWhile(not(predicate), context); + }, + + valueSeq: function() { + return this.toIndexedSeq(); + }, + + + // ### Hashable Object + + hashCode: function() { + return this.__hash || (this.__hash = hashIterable(this)); + }, + + + // ### Internal + + // abstract __iterate(fn, reverse) + + // abstract __iterator(type, reverse) + }); + + // var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; + // var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; + // var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@'; + // var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; + + var IterablePrototype = Iterable.prototype; + IterablePrototype[IS_ITERABLE_SENTINEL] = true; + IterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.values; + IterablePrototype.__toJS = IterablePrototype.toArray; + IterablePrototype.__toStringMapper = quoteString; + IterablePrototype.inspect = + IterablePrototype.toSource = function() { return this.toString(); }; + IterablePrototype.chain = IterablePrototype.flatMap; + + // Temporary warning about using length + (function () { + try { + Object.defineProperty(IterablePrototype, 'length', { + get: function () { + if (!Iterable.noLengthWarning) { + var stack; + try { + throw new Error(); + } catch (error) { + stack = error.stack; + } + if (stack.indexOf('_wrapObject') === -1) { + console && console.warn && console.warn( + 'iterable.length has been deprecated, '+ + 'use iterable.size or iterable.count(). '+ + 'This warning will become a silent error in a future version. ' + + stack + ); + return this.size; + } + } + } + }); + } catch (e) {} + })(); + + + + mixin(KeyedIterable, { + + // ### More sequential methods + + flip: function() { + return reify(this, flipFactory(this)); + }, + + findKey: function(predicate, context) { + var entry = this.findEntry(predicate, context); + return entry && entry[0]; + }, + + findLastKey: function(predicate, context) { + return this.toSeq().reverse().findKey(predicate, context); + }, + + keyOf: function(searchValue) { + return this.findKey(function(value ) {return is(value, searchValue)}); + }, + + lastKeyOf: function(searchValue) { + return this.findLastKey(function(value ) {return is(value, searchValue)}); + }, + + mapEntries: function(mapper, context) {var this$0 = this; + var iterations = 0; + return reify(this, + this.toSeq().map( + function(v, k) {return mapper.call(context, [k, v], iterations++, this$0)} + ).fromEntrySeq() + ); + }, + + mapKeys: function(mapper, context) {var this$0 = this; + return reify(this, + this.toSeq().flip().map( + function(k, v) {return mapper.call(context, k, v, this$0)} + ).flip() + ); + }, + + }); + + var KeyedIterablePrototype = KeyedIterable.prototype; + KeyedIterablePrototype[IS_KEYED_SENTINEL] = true; + KeyedIterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.entries; + KeyedIterablePrototype.__toJS = IterablePrototype.toObject; + KeyedIterablePrototype.__toStringMapper = function(v, k) {return JSON.stringify(k) + ': ' + quoteString(v)}; + + + + mixin(IndexedIterable, { + + // ### Conversion to other types + + toKeyedSeq: function() { + return new ToKeyedSequence(this, false); + }, + + + // ### ES6 Collection methods (ES6 Array and Map) + + filter: function(predicate, context) { + return reify(this, filterFactory(this, predicate, context, false)); + }, + + findIndex: function(predicate, context) { + var entry = this.findEntry(predicate, context); + return entry ? entry[0] : -1; + }, + + indexOf: function(searchValue) { + var key = this.toKeyedSeq().keyOf(searchValue); + return key === undefined ? -1 : key; + }, + + lastIndexOf: function(searchValue) { + return this.toSeq().reverse().indexOf(searchValue); + }, + + reverse: function() { + return reify(this, reverseFactory(this, false)); + }, + + slice: function(begin, end) { + return reify(this, sliceFactory(this, begin, end, false)); + }, + + splice: function(index, removeNum /*, ...values*/) { + var numArgs = arguments.length; + removeNum = Math.max(removeNum | 0, 0); + if (numArgs === 0 || (numArgs === 2 && !removeNum)) { + return this; + } + index = resolveBegin(index, this.size); + var spliced = this.slice(0, index); + return reify( + this, + numArgs === 1 ? + spliced : + spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum)) + ); + }, + + + // ### More collection methods + + findLastIndex: function(predicate, context) { + var key = this.toKeyedSeq().findLastKey(predicate, context); + return key === undefined ? -1 : key; + }, + + first: function() { + return this.get(0); + }, + + flatten: function(depth) { + return reify(this, flattenFactory(this, depth, false)); + }, + + get: function(index, notSetValue) { + index = wrapIndex(this, index); + return (index < 0 || (this.size === Infinity || + (this.size !== undefined && index > this.size))) ? + notSetValue : + this.find(function(_, key) {return key === index}, undefined, notSetValue); + }, + + has: function(index) { + index = wrapIndex(this, index); + return index >= 0 && (this.size !== undefined ? + this.size === Infinity || index < this.size : + this.indexOf(index) !== -1 + ); + }, + + interpose: function(separator) { + return reify(this, interposeFactory(this, separator)); + }, + + interleave: function(/*...iterables*/) { + var iterables = [this].concat(arrCopy(arguments)); + var zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, iterables); + var interleaved = zipped.flatten(true); + if (zipped.size) { + interleaved.size = zipped.size * iterables.length; + } + return reify(this, interleaved); + }, + + last: function() { + return this.get(-1); + }, + + skipWhile: function(predicate, context) { + return reify(this, skipWhileFactory(this, predicate, context, false)); + }, + + zip: function(/*, ...iterables */) { + var iterables = [this].concat(arrCopy(arguments)); + return reify(this, zipWithFactory(this, defaultZipper, iterables)); + }, + + zipWith: function(zipper/*, ...iterables */) { + var iterables = arrCopy(arguments); + iterables[0] = this; + return reify(this, zipWithFactory(this, zipper, iterables)); + }, + + }); + + IndexedIterable.prototype[IS_INDEXED_SENTINEL] = true; + IndexedIterable.prototype[IS_ORDERED_SENTINEL] = true; + + + + mixin(SetIterable, { + + // ### ES6 Collection methods (ES6 Array and Map) + + get: function(value, notSetValue) { + return this.has(value) ? value : notSetValue; + }, + + includes: function(value) { + return this.has(value); + }, + + + // ### More sequential methods + + keySeq: function() { + return this.valueSeq(); + }, + + }); + + SetIterable.prototype.has = IterablePrototype.includes; + + + // Mixin subclasses + + mixin(KeyedSeq, KeyedIterable.prototype); + mixin(IndexedSeq, IndexedIterable.prototype); + mixin(SetSeq, SetIterable.prototype); + + mixin(KeyedCollection, KeyedIterable.prototype); + mixin(IndexedCollection, IndexedIterable.prototype); + mixin(SetCollection, SetIterable.prototype); + + + // #pragma Helper functions + + function keyMapper(v, k) { + return k; + } + + function entryMapper(v, k) { + return [k, v]; + } + + function not(predicate) { + return function() { + return !predicate.apply(this, arguments); + } + } + + function neg(predicate) { + return function() { + return -predicate.apply(this, arguments); + } + } + + function quoteString(value) { + return typeof value === 'string' ? JSON.stringify(value) : value; + } + + function defaultZipper() { + return arrCopy(arguments); + } + + function defaultNegComparator(a, b) { + return a < b ? 1 : a > b ? -1 : 0; + } + + function hashIterable(iterable) { + if (iterable.size === Infinity) { + return 0; + } + var ordered = isOrdered(iterable); + var keyed = isKeyed(iterable); + var h = ordered ? 1 : 0; + var size = iterable.__iterate( + keyed ? + ordered ? + function(v, k) { h = 31 * h + hashMerge(hash(v), hash(k)) | 0; } : + function(v, k) { h = h + hashMerge(hash(v), hash(k)) | 0; } : + ordered ? + function(v ) { h = 31 * h + hash(v) | 0; } : + function(v ) { h = h + hash(v) | 0; } + ); + return murmurHashOfSize(size, h); + } + + function murmurHashOfSize(size, h) { + h = src_Math__imul(h, 0xCC9E2D51); + h = src_Math__imul(h << 15 | h >>> -15, 0x1B873593); + h = src_Math__imul(h << 13 | h >>> -13, 5); + h = (h + 0xE6546B64 | 0) ^ size; + h = src_Math__imul(h ^ h >>> 16, 0x85EBCA6B); + h = src_Math__imul(h ^ h >>> 13, 0xC2B2AE35); + h = smi(h ^ h >>> 16); + return h; + } + + function hashMerge(a, b) { + return a ^ b + 0x9E3779B9 + (a << 6) + (a >> 2) | 0; // int + } + + var Immutable = { + + Iterable: Iterable, + + Seq: Seq, + Collection: Collection, + Map: src_Map__Map, + OrderedMap: OrderedMap, + List: List, + Stack: Stack, + Set: src_Set__Set, + OrderedSet: OrderedSet, + + Record: Record, + Range: Range, + Repeat: Repeat, + + is: is, + fromJS: fromJS, + + }; + + return Immutable; + +})); +},{}],"store":[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _redux = require('redux'); + +var _reducersAll = require('reducers/all'); + +var _reducersAll2 = _interopRequireDefault(_reducersAll); + +var _actionsChangedir = require('actions/changedir'); + +var _actionsChangedir2 = _interopRequireDefault(_actionsChangedir); + +var _immutable = require('immutable'); + +var _immutable2 = _interopRequireDefault(_immutable); + +var DEFAULT = new _immutable2['default'].Map({ + dir: '/', + files: [] +}); + +var store = (0, _redux.createStore)(_reducersAll2['default'], DEFAULT); +store.dispatch((0, _actionsChangedir2['default'])(DEFAULT.dir)); + +exports['default'] = store; +module.exports = exports['default']; + +},{"actions/changedir":175,"immutable":186,"reducers/all":183,"redux":167}]},{},[175,176,177,178,179,180,181,182,183,184,185,"store"]); diff --git a/manifest.webapp b/build/manifest.webapp similarity index 62% rename from manifest.webapp rename to build/manifest.webapp index 77d71a5..6a6102c 100644 --- a/manifest.webapp +++ b/build/manifest.webapp @@ -14,7 +14,14 @@ "url": "http://dibaiee.ir" }, "type": "privileged", - "permissions": {}, + "permissions": { + "device-storage:videos": {"access": "readwrite"}, + "device-storage:pictures": {"access": "readwrite"}, + "device-storage:music": {"access": "readwrite"}, + "device-storage:sdcard": {"access": "readwrite"}, + "device-storage:apps": {"access": "readwrite"}, + "webapps-manage": {} + }, "installs_allowed_from": [ "*" ], diff --git a/design/userinterface.sketch b/design/userinterface.sketch new file mode 100644 index 0000000000000000000000000000000000000000..394b651833a1dd088e60900b31617dbe857902e5 GIT binary patch literal 360448 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

@=XUce|| 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�T(*bvXz4tB8zJ3Aov0htfVcTkptiAYB- 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 + + + + Hawk + + + +

+ + + + diff --git a/src/js/actions/changedir.js b/src/js/actions/changedir.js new file mode 100644 index 0000000..d74f764 --- /dev/null +++ b/src/js/actions/changedir.js @@ -0,0 +1,8 @@ +import { CHANGE_DIRECTORY } from 'actions/types'; + +export default function changedir(dir) { + return { + type: CHANGE_DIRECTORY, + dir + }; +} diff --git a/src/js/actions/list-files.js b/src/js/actions/list-files.js new file mode 100644 index 0000000..aa8aa9e --- /dev/null +++ b/src/js/actions/list-files.js @@ -0,0 +1,8 @@ +import { LIST_FILES } from 'actions/types'; + +export default function listFiles(files) { + return { + type: LIST_FILES, + files + }; +} diff --git a/src/js/actions/types.js b/src/js/actions/types.js new file mode 100644 index 0000000..9174cd6 --- /dev/null +++ b/src/js/actions/types.js @@ -0,0 +1,9 @@ +const TYPES = { + CHANGE_DIRECTORY: Symbol(), + LIST_FILES: Symbol(), + SORT: Symbol(), + SEARCH: Symbol(), + REFRESH: Symbol() +}; + +export default TYPES; diff --git a/src/js/api/files.js b/src/js/api/files.js new file mode 100644 index 0000000..baf2aff --- /dev/null +++ b/src/js/api/files.js @@ -0,0 +1,13 @@ +export async function directory(dir = '/') { + let storage = navigator.getDeviceStorage('sdcard'); + let root = await storage.getRoot(); + + if (dir === '/' || !dir) return root; + + return await root.get(dir); +} + +export async function children(dir) { + let parent = await directory(dir); + return await parent.getFilesAndDirectories(); +} diff --git a/src/js/components/file-list.js b/src/js/components/file-list.js new file mode 100644 index 0000000..8d37044 --- /dev/null +++ b/src/js/components/file-list.js @@ -0,0 +1,38 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import File from './file'; + +@connect(props) +export default class FileList extends Component { + constructor() { + super(); + } + + render() { + let { cwd, files } = this.props; + + let els = files.map((file, index) => { + return ; + }); + + return ( +
cwd: {cwd} + {els} +
+ ); + } +} + +function props(state) { + return { + cwd: state.get('cwd'), + files: state.get('files') + } +} + +async function getFiles(dir) { + let storage = navigator.getDeviceStorage('sdcard'); + let root = await storage.get(dir); + + return await root.getFilesAndDirectories(); +} diff --git a/src/js/components/file.js b/src/js/components/file.js new file mode 100644 index 0000000..6081c45 --- /dev/null +++ b/src/js/components/file.js @@ -0,0 +1,20 @@ +import React, { Component } from 'react'; +import store from 'store'; +import changedir from 'actions/changedir'; + +export default class File extends Component { + render() { + return ( +
+

{this.props.index}. {this.props.name}

+
+ ); + } + + peekInside() { + let file = store.getState().get('files')[this.props.index]; + + console.log(file); + store.dispatch(changedir(file.path.slice(1) + file.name)); + } +} diff --git a/src/js/components/root.js b/src/js/components/root.js index 9430e67..d5e4c8c 100644 --- a/src/js/components/root.js +++ b/src/js/components/root.js @@ -1,5 +1,18 @@ -export default React.createClass({ +import React, { Component } from 'react' +import FileList from 'components/file-list'; +import changedir from 'actions/changedir'; +import store from 'store'; + +window.store = store; +window.changedir = changedir; + +export default class Root extends Component { render() { - return
; + return ( +
+ Hawk! + +
+ ); } -}); +} diff --git a/src/js/main.js b/src/js/main.js index 6ff08f1..079e20a 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -1,2 +1,7 @@ -import Root from 'components/root' -let x = "I'm just testing"; +import React from 'react'; +import Root from 'components/root'; +import store from 'store'; +import { Provider } from 'react-redux'; + +let wrapper = document.getElementById('wrapper'); +React.render({() => }, wrapper); diff --git a/src/js/reducers/all.js b/src/js/reducers/all.js new file mode 100644 index 0000000..9c4678b --- /dev/null +++ b/src/js/reducers/all.js @@ -0,0 +1,10 @@ +import Immutable from 'immutable'; +import cwd from './cwd'; +import files from './files'; + +export default function(state = new Immutable.Map(), action) { + return new Immutable.Map({ + cwd: cwd(state.get('cwd'), action), + files: files(state.get('files'), action) + }); +} diff --git a/src/js/reducers/cwd.js b/src/js/reducers/cwd.js new file mode 100644 index 0000000..9e48939 --- /dev/null +++ b/src/js/reducers/cwd.js @@ -0,0 +1,16 @@ +import { CHANGE_DIRECTORY } from 'actions/types'; +import listFiles from 'actions/list-files'; +import { children } from 'api/files'; +import store from 'store'; + +export default function(state = '/', action) { + switch (action.type) { + case CHANGE_DIRECTORY: + children(action.dir).then(files => { + store.dispatch(listFiles(files)); + }); + return action.dir; + default: + return state; + } +} diff --git a/src/js/reducers/files.js b/src/js/reducers/files.js new file mode 100644 index 0000000..9e64a41 --- /dev/null +++ b/src/js/reducers/files.js @@ -0,0 +1,10 @@ +import { LIST_FILES } from 'actions/types'; + +export default function(state = [], action) { + switch (action.type) { + case LIST_FILES: + return action.files; + default: + return state; + } +} diff --git a/src/js/store.js b/src/js/store.js new file mode 100644 index 0000000..2f92cbf --- /dev/null +++ b/src/js/store.js @@ -0,0 +1,14 @@ +import { createStore } from 'redux'; +import reducers from 'reducers/all'; +import changedir from 'actions/changedir'; +import Immutable from 'immutable'; + +const DEFAULT = new Immutable.Map({ + dir: '/', + files: [] +}); + +let store = createStore(reducers, DEFAULT); +store.dispatch(changedir(DEFAULT.dir)); + +export default store; diff --git a/src/less/main.less b/src/less/main.less new file mode 100644 index 0000000..e69de29 diff --git a/src/less/variables.less b/src/less/variables.less new file mode 100644 index 0000000..59c227c --- /dev/null +++ b/src/less/variables.less @@ -0,0 +1 @@ +@ diff --git a/src/manifest.webapp b/src/manifest.webapp new file mode 100644 index 0000000..6a6102c --- /dev/null +++ b/src/manifest.webapp @@ -0,0 +1,31 @@ +{ + "version": "0.1.0", + "name": "Hawk", + "description": "Keep an eye on your files with a full-featured file-manager", + "launch_path": "/index.html", + "icons": { + "16": "/img/icons/icon16x16.png", + "48": "/img/icons/icon48x48.png", + "60": "/img/icons/icon60x60.png", + "128": "/img/icons/icon128x128.png" + }, + "developer": { + "name": "Mahdi Dibaiee", + "url": "http://dibaiee.ir" + }, + "type": "privileged", + "permissions": { + "device-storage:videos": {"access": "readwrite"}, + "device-storage:pictures": {"access": "readwrite"}, + "device-storage:music": {"access": "readwrite"}, + "device-storage:sdcard": {"access": "readwrite"}, + "device-storage:apps": {"access": "readwrite"}, + "webapps-manage": {} + }, + "installs_allowed_from": [ + "*" + ], + "locales": { + }, + "default_locale": "en" +}