Skip to content

Instantly share code, notes, and snippets.

@jhusain
Created August 8, 2014 21:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jhusain/9522cb1a4964981f06bf to your computer and use it in GitHub Desktop.
Save jhusain/9522cb1a4964981f06bf to your computer and use it in GitHub Desktop.
requirebin sketch
// example using the raf module from npm. try changing some values!
var Rx = require('rx');
window.Rx = Rx;
!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),(f.falkor||(f.falkor={})).PathEvaluator=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
var Rx = _dereq_("../src/rx.ultralite");
var Observable = Rx.Observable,
Disposable = Rx.Disposable,
sentinelSize = 50,
isArray = Array.isArray;
var µTime = 1,
µRate = 0.25,
µSize = 0.25,
MIN_SAFE_INTEGER = -Math.pow(2, 53) - 1;
PathEvaluator.internals = {
getPaths: getPaths,
setPaths: setPaths,
setPBF: setPBF,
setPBFRoot: setPBFRoot,
setPathsRoot: setPathsRoot,
stringify: stringify
};
PathEvaluator.EXPIRES_NOW = 0;
PathEvaluator.EXPIRES_NEVER = 1;
PathEvaluator.lazy = true;
PathEvaluator.connected = true;
PathEvaluator.streaming = true;
PathEvaluator.refreshing = false;
PathEvaluator.prototype.get = get;
PathEvaluator.prototype.set = set;
PathEvaluator.prototype.call = call;
PathEvaluator.prototype.invalidate = invalidate;
PathEvaluator.prototype.value = value;
PathEvaluator.prototype.optimize = optimize;
PathEvaluator.prototype.context = context;
PathEvaluator.prototype.insert = insert;
PathEvaluator.prototype.getValueSync = value;
PathEvaluator.prototype.setValueSync = insert;
PathEvaluator.prototype.bind = bind;
PathEvaluator.prototype.hardBind = hardBind;
PathEvaluator.prototype.deferBind = deferBind;
PathEvaluator.prototype.serialize = serialize;
PathEvaluator.prototype.deserialize = immediateToLazy(deserialize);
PathEvaluator.prototype.toBatched = toBatched;
PathEvaluator.prototype.toIndependent = toIndependent;
PathEvaluator.prototype.toLazy = toLazy;
PathEvaluator.prototype.toEager = toEager;
PathEvaluator.prototype.toRemote = toRemote;
PathEvaluator.prototype.toLocal = toLocal;
PathEvaluator.prototype.toProgressive = toProgressive;
PathEvaluator.prototype.toAggregate = toAggregate;
PathEvaluator.prototype.toCached = toCached;
PathEvaluator.prototype.toRefreshed = toRefreshed;
function PathEvaluator(maxSize, loader, cache, lazy, batches, streaming, connected, refreshing) {
this.loader = loader || {
get: function() {
return Observable.create(function(o) {
o.onCompleted();
return function() {};
});
}
};
if (typeof maxSize !== 'number') {
throw new Error('PathEvaluator: maxSize must be a number.');
}
this.maxSize = maxSize;
this.cache = cache || {};
this.path = [];
this.timeExpireList = [];
this.sizeExpireList = [];
this.root = this;
this._batches = batches;
this._lazy = lazy !== undefined ? lazy : PathEvaluator.lazy;
this._streaming = streaming !== undefined ? streaming : PathEvaluator.streaming;
this._connected = connected !== undefined ? connected : PathEvaluator.connected;
this._refreshing = refreshing !== undefined ? refreshing : PathEvaluator.refreshing;
return this;
}
function toBatched(newBatch) {
if (this._batches == null) delete this._batches;
return this._batches !== undefined && newBatch === undefined ?
this : clone(this, undefined, newBatch || []);
}
function toIndependent() {
return this._batches === undefined ?
this : clone(this, undefined, null);
}
function toLazy() {
return this._lazy === true ?
this : clone(this, undefined, undefined, true);
}
function toEager() {
return this._lazy === false ?
this : clone(this, undefined, undefined, false);
}
function toProgressive() {
return this._streaming === true ?
this : clone(this, undefined, undefined, undefined, true);
}
function toAggregate() {
return this._streaming === false ?
this : clone(this, undefined, undefined, undefined, false);
}
function toRemote() {
return this._connected === true ?
this : clone(this, undefined, undefined, undefined, undefined, true);
}
function toLocal() {
return this._connected === false ?
this : clone(this, undefined, undefined, undefined, undefined, false);
}
function toCached() {
return this._refreshing === false ?
this : clone(this, undefined, undefined, undefined, undefined, undefined, false);
}
function toRefreshed() {
return this._refreshing === true ?
this : clone(this, undefined, undefined, undefined, undefined, undefined, true);
}
function noop() {}
function clone(evaluator, path, batches, lazy, streaming, connected, refreshing) {
var pe = Object.create(evaluator);
if (path !== undefined) pe.path = path;
if (batches !== undefined) pe._batches = batches;
if (lazy !== undefined) pe._lazy = lazy;
if (streaming !== undefined) pe._streaming = streaming;
if (connected !== undefined) pe._connected = connected;
if (refreshing !== undefined) pe._refreshing = refreshing;
return pe;
}
function immediateToLazy(immediateFn) {
return function lazyImpl() {
var self = this,
lazyArgs = args(arguments);
return Observable.createWithDisposable(function(observer) {
return immediateFn.apply(self, lazyArgs.concat(self.context(), onNext, onError, onCompleted));
function onNext(pbvf) {
if (self._streaming === false || pbvf === self) {
observer.onNext(pbvf);
} else {
var pbv = {},
path = pbvf.path,
value = pbvf.value,
i = -1,
n = path.length,
a = new Array(n);
if (typeof value === 'object' &&
!Array.isArray(value) &&
value != null) {
value = Object.create(value);
}
pbv.value = value;
while (++i < n) {
a[i] = path[i];
}
pbv.path = path;
path = pbvf.optimized;
i = -1;
n = path.length;
a = new Array(n);
while (++i < n) {
a[i] = path[i];
}
pbv.optimized = a;
observer.onNext(pbv);
}
}
function onError(e) {
observer.onError(e);
}
function onCompleted() {
observer.onCompleted();
}
});
};
}
function args(list) {
for (var a = [], i = 0, n = list.length; i < n; ++i) {
a[i] = list[i];
}
return a;
}
function serialize(cache) {
var frame, key, context = cache || this.cache,
message = {},
depth = 0,
stack = [],
keys;
descending: while (depth >= 0) {
frame = stack[depth] || (stack[depth] = {
context: context,
message: message,
keys: Object.keys(context).filter(internalKeys).sort()
});
context = frame.context;
message = frame.message;
keys = frame.keys;
while ((key = keys.shift())) {
context = context[key];
if (context == null || Array.isArray(context) || typeof context !== 'object') {
message[key] = context;
context = frame.context;
} else {
message = message[key] || (message[key] = {});
++depth;
continue descending;
}
}
stack[depth--] = undefined;
}
return message;
function internalKeys(x) {
return x.indexOf('__') !== 0;
}
}
function deserialize(cache, pbv, onNext, onError, onCompleted) {
var self = this,
frame, key, context = cache,
depth = 0,
path = [],
paths = [],
stack = [],
keys;
descending: while (depth >= 0) {
frame = stack[depth] || (stack[depth] = {
context: context,
keys: Object.keys(context).filter(internalKeys).sort()
});
context = frame.context;
keys = frame.keys;
while ((key = keys.shift())) {
path[depth] = key;
context = context[key];
if (context == null || Array.isArray(context) || typeof context !== "object" || context.$type !== undefined) {
context = frame.context;
paths.push(path.slice(0, depth + 1));
} else {
++depth;
continue descending;
}
}
stack[depth--] = undefined;
}
return setPBFRoot.call(self, {
paths: paths,
value: cache
}, noop, finished, finished);
function internalKeys(x) {
return (x[0] !== '$' && x.indexOf('__') !== 0);
}
function finished() {
onNext(self);
onCompleted();
}
}
function stringify(obj, replacer, space) {
return JSON.stringify(flatten(obj), replacer, space);
}
function flatten(obj) {
var flattenedObject, keys, keyCount, key;
if (obj === null || typeof obj !== 'object') {
return obj;
} else if (obj instanceof Array) {
flattenedObject = [];
for (keyCount = 0; keyCount < obj.length; keyCount++) {
flattenedObject.push(flatten(obj[keyCount]));
}
return flattenedObject;
} else {
flattenedObject = {};
do {
keys = Object.keys(obj);
keys.sort();
for (keyCount = 0; keyCount < keys.length; keyCount++) {
key = keys[keyCount];
if (key.substring(0, 2) !== '__') {
flattenedObject[key] = flatten(obj[key]);
}
}
obj = Object.getPrototypeOf(obj);
} while (obj !== undefined && obj !== null);
return flattenedObject;
}
}
function bind(path) {
var pe = clone(this, this.path.concat(path));
pe._context = null;
return pe;
}
function hardBind(path) {
var branch = findPath.call(this, this.path.concat(path, null)),
context = branch.value,
backRefsLength, evaluator;
if (context) {
evaluator = clone(this, branch.optimized);
backRefsLength = context.__refsLength || 0;
context['__ref' + backRefsLength] = evaluator;
context.__refsLength = backRefsLength + 1;
evaluator._context = context;
} else {
evaluator = clone(this, this.path.concat(path));
}
return evaluator;
}
function deferBind(path) {
var self = this;
return Observable.create(function(observer) {
observer.onNext(self.hardBind(path));
observer.onCompleted();
return noop;
});
}
function get() {
var a = args(arguments);
if (this._lazy) {
if (this._refreshing) {
return refreshLazily.call(this, a);
}
return getLazily.call(this, a);
}
var pbv = this.context(),
onNext = a[a.length - 3],
onError = a[a.length - 2],
onCompleted = a[a.length - 1];
a = a.slice(0, -3);
if (this._refreshing) {
return refreshPaths.call(this, a, pbv, onNext, onError, onCompleted);
}
return getPaths.call(this, a, pbv, onNext, onError, onCompleted);
}
var getLazily = immediateToLazy(getPaths),
refreshLazily = immediateToLazy(refreshPaths);
function getPaths(paths, pbv, onNext, onError, onCompleted) {
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW,
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER,
self, streaming, connected, max,
batches, batch, observers, observer,
contexts, messages, pathSets, misses, errors,
cache, context, parent, value, type, size, expires, timestamp,
messageParent, message, messageValue, messageType, messageSize,
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive,
sizeOffset = 0,
bound, original, optimized, offset,
path, key, column, last, ref, now,
refs, cols, prevs, interrupts, interrupted,
generations, generationsLen, backRefs, pathSet, index, total, miss;
var timeExpireList = this.timeExpireList,
sizeExpireList = this.sizeExpireList,
timeExpireListLength = timeExpireList.length,
sizeExpireListLength = sizeExpireList.length;
self = this;
now = Date.now();
streaming = self._streaming;
connected = self._connected;
cache = self.cache;
batches = self._batches;
max = self.maxSize;
misses = paths.misses || (paths.misses = []);
errors = paths.errors || (paths.errors = []);
refs = paths.refs || (paths.refs = []);
cols = paths.cols || (paths.cols = []);
prevs = paths.prevs || (paths.prevs = []);
interrupts = paths.interrupts || (paths.interrupts = 0);
interrupted = interrupts > 0;
observers = paths.observers || (paths.observers = []);
index = paths.index || (paths.index = 0);
total = paths.length;
context = init_context(paths, pbv.value || {});
contexts = paths.contexts;
bound = refs[-1] = pbv.optimized || pbv.path;
pbv.path = original = [];
pbv.optimized = optimized = [];
pbv.value = undefined;
observers[observers.length] = observer = {
onNext: onNext,
onError: onError,
onCompleted: onCompleted,
streaming: streaming,
paths: 0,
path: bound,
misses: paths.concat(),
errors: errors
};
getting: for (; index < total; ++index) {
original.length = 0;
path = paths[paths.index = index];
last = path.length - 1;
column = path.index || (path.index = 0);
reset_refs();
reset_cols();
unlocking: while (column >= 0) {
parent = contexts[column - 1];
descend();
unlock();
path.index = column = ascend(path, column, 0);
reset_refs();
reset_cols();
}
path.index = 0;
}
paths.index = 0;
if (connected === true && misses.length > 0) {
return batch_or_load_paths();
}
finish();
return Disposable.empty;
/** @inline */
function ascend(path, column, lower) {
var key;
ascending: for (; column >= lower; --column) {
key = path[column];
if (is_simple_key(key)) {
continue ascending;
}
if (isArray(key)) {
if (++key.index === key.length) {
key = key[key.index = offset = 0];
if (is_simple_key(key)) {
continue ascending;
}
} else {
break ascending;
}
}
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) {
offset = 0;
key.offset = key.from;
continue ascending;
}
break ascending;
}
return column;
}
/** @inline */
function reset_cols() {
var i = cols[interrupts - 1];
while (i >= column) {
if (--interrupts >= 0) {
i = cols[interrupts - 1];
} else {
break;
}
}
interrupted = interrupts > 0;
}
/** @inline */
function reset_refs() {
ref = refs[column - 1];
if (ref !== undefined) {
offset = reset_optimized_from_ref() - column;
}
}
/** @inline */
function find_key(key) {
if (is_complex_key(key)) {
if (isArray(key)) {
key = find_segment_key(key);
if (is_complex_key(key)) {
key = find_range_key(key);
}
} else {
key = find_range_key(key);
}
}
return key;
}
/** @inline */
function find_segment_key(key) {
return key[key.index || (key.index = 0)];
}
/** @inline */
function find_range_key(key) {
return key.offset || (key.offset = key.from || (key.from = 0));
}
/** @inline */
function is_simple_key(key) {
return (typeof key !== 'object' || key == null);
}
/** @inline */
function is_complex_key(key) {
return (typeof key === 'object' && key != null);
}
/** @inline */
function find_context() {
return parent[key];
}
/** @inline */
function find_leaf_context() {
return (
(context = parent[key]) !== undefined && (
((expires = context.$expires) === undefined && context) ||
((expires === EXPIRES_NOW && context)) &&
((expires === EXPIRES_NEVER && context)) &&
((expires > now && context))) ||
// (timeExpireList[timeExpireListLength++] = context) &&
// (context = undefined))) ||
(context = undefined)
);
}
/** @inline */
function find_type() {
return (type = context && context.$type || undefined);
}
/** @inline */
function find_value() {
return (value = (
context !== undefined &&
find_type() === "sentinel"
) ? context.value : context);
}
/** @inline */
function reset_path_from_ref() {
if (path._context === undefined) {
set_back_reference();
}
while (interrupted === true && column === last) {
path = prevs[--interrupts];
column = cols[interrupts];
interrupted = interrupts > 0;
offset = last - column;
last = path.length - 1;
}
}
/** @inline */
function reset_optimized_from_ref() {
var n = optimized.length = ref.length;
for (var i = -1; ++i < n;) {
optimized[i] = ref[i];
}
return n;
}
/** @inline */
function save_optimized(optimized, column, offset, key) {
return (optimized[optimized.length = column + offset] = key);
}
/** @inline */
function save_original(original, column, key) {
return (original[column] = key);
}
/** @inline */
function set_back_reference() {
// create a back reference
backRefs = context.__refsLength || 0;
context['__ref' + backRefs] = path;
context.__refsLength = backRefs + 1;
// create a hard reference
path._context = context;
}
/** @inline */
function stamp() {
context.__access_time = now;
context.__access_count = (context.__access_count || 0) + 1;
}
/** @inline */
function build_path_set(paths, pathSet, observer) {
var contexts = [],
context, xs,
index = -1,
total = paths.length,
path, column, last, obs;
contexts[-1] = pathSet || (pathSet = {
__observers: []
});
building: while (++index < total) {
path = paths[index];
obs = observer || path.observer;
last = path.length - 1;
column = 0;
unlocking: while (column >= 0) {
context = contexts[column - 1];
(xs = context.__observers)[xs.length] = obs;
for (; column <= last; ++column) {
key = find_key(path[column]);
if (key != null) {
contexts[column] = context = context[key] || (context[key] = {
__observers: []
});
(xs = context.__observers)[xs.length] = obs;
}
}
obs.paths = (obs.paths || 0) + 1;
column = ascend(path, column, 0);
}
}
return pathSet;
}
/** @inline */
function cleanup() {
if ((total = cache.$size) >= max) {
if (batches === undefined || batches.length === 0 || batches.every(function(batch) {
return batch.pendingLoad === false;
})) {
if (timeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up time expire list");
self.root.timeExpireList = timeExpireList =
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
total = timeExpireList.total;
}
}
if (sizeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up size expire list");
self.root.sizeExpireList = sizeExpireList =
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
}
}
}
}
}
/** @inline */
function descend() {
descending: for (; column <= last; ++column) {
key = find_key(path[column]);
// all the columns before the last column
if (column < last) {
if (key == null) {
continue descending;
}
save_optimized(optimized, column, offset, key);
if (interrupted === false) {
save_original(original, column, key);
}
if ((context = find_context(parent, key)) === undefined) {
short_circuit();
break descending;
}
value = find_value(context);
if (isArray(value)) {
do {
stamp();
interrupt();
} while (isArray(value = find_value(context)));
type = undefined;
continue descending;
} else if (type !== undefined) {
short_circuit();
break descending;
} else if (interrupted === false) {
contexts[column] = context;
}
type = undefined;
parent = context;
continue descending;
}
// last column
if (key != null) {
save_optimized(optimized, column, offset, key);
context = find_leaf_context(parent, key);
}
value = find_value(context);
if (interrupted === true) {
if (context == null || type === "error") {
short_circuit_int();
break descending;
}
reset_path_from_ref();
contexts[column] = parent = context;
if (isArray(value)) {
stamp();
interrupt();
}
type = undefined;
continue descending;
}
save_original(original, column, key);
break descending;
}
}
/** @inline */
function unlock() {
if (context == null) {
miss = save_missing();
miss.observer = observer;
misses[misses.length] = miss;
} else if (type === 'error') {
stamp();
save_error();
} else {
stamp();
if (streaming === true && value !== undefined) {
pbv.value = value;
onNext(pbv);
}
}
}
/** @inline */
function init_context(paths, context) {
return contexts === undefined ?
((paths.contexts = contexts = [])[-1] = context) :
((contexts[-1]));
}
/** @inline */
function interrupt() {
refs[column] = ref = value;
if ((context = value._context) !== undefined) {
offset = reset_optimized_from_ref() - column - 1;
contexts[column] = parent = context;
} else {
prevs[interrupts] = path;
cols[interrupts++] = column;
interrupted = true;
path = value;
last = path.length - 1;
offset = 0;
column = -1;
parent = cache;
context = value = undefined;
}
}
/** @inline */
function save_missing() {
var i, j, nulls = 0,
n = optimized.length,
miss = new Array(n + last - column);
for (i = j = -1; ++i < n;) {
key = optimized[i];
if (key != null) {
miss[++j] = key;
} else {
--nulls;
}
}
i = column;
while (++i <= last) {
key = path[i];
if (key != null) {
miss[++j] = key;
} else {
--nulls;
}
}
miss.length += nulls;
return miss;
}
/** @inline */
function batch_or_load_paths() {
var loadDisposable = Disposable.empty;
if (batches === undefined) {
pathSet = build_path_set(misses, null, observer);
misses = rangeCollapse(buildQueries(pathSet));
loadDisposable = self.loader.get(misses).subscribe(function(pbf) {
pbf = Object.create(pbf);
var error = pbf.error,
serverErrors = [];
// TODO: retry certain errors
while (error !== undefined) {
if (error.innerErrors) {
serverErrors.push.apply(serverErrors, error.innerErrors);
} else {
error.$type = "error";
setPath.call(self, error.path || error.pql, error, pbf.value);
}
error = serverErrors.pop();
}
pbf.paths.errors = errors;
pbf.paths.pathSet = undefined;
pbf.paths.observers = undefined;
setPBFRoot.call(self, pbf, onNext, onError, onCompleted);
}, onError, noop);
return loadDisposable;
} else {
batch = batches[batches.length - 1];
if (batch === undefined || batch.pendingLoad === true) {
batch = Disposable.create(function() {
var i = batches.indexOf(batch);
if (i !== -1) {
batches.splice(i, 1);
}
if (batch.batchID !== undefined) {
clearTimeout(batch.batchID);
batch.batchID = undefined;
}
if (batch.pendingLoad === true) {
loadDisposable.dispose();
}
batch.pendingLoad = false;
});
batch.batchIndex = batches.length;
// util.log.warn('PathEvaluator: new batch - ' + batch.batchIndex);
batch.batchID = setTimeout(function() {
var i = batches.indexOf(batch);
if (i !== -1) {
batches.splice(i, 1);
}
batch.batchID = undefined;
batch.pendingLoad = true;
batch.pathSet = build_path_set(batch.misses);
batch.misses = rangeCollapse(buildQueries(batch.pathSet));
// util.log.warn('PathEvaluator: requesting batch ' + batch.batchIndex + ' - ' + JSON.stringify(batch.misses));
loadDisposable = self.loader.get(batch.misses).subscribe(function(pbf) {
pbf = Object.create(pbf);
batch.pendingLoad = false;
// util.log.warn('PathEvaluator: setting batch - ' + batch.batchIndex);
var error = pbf.error,
serverErrors = [];
// TODO: retry certain errors
while (error !== undefined) {
if (error.innerErrors) {
serverErrors.push.apply(serverErrors, error.innerErrors);
} else {
error.$type = "error";
setPath.call(self, error.path || error.pql, error, pbf.value);
}
error = serverErrors.pop();
}
pbf.paths.errors = [];
pbf.paths.pathSet = batch.pathSet;
pbf.paths.observers = batch.observers.concat();
setPBFRoot.call(self, pbf, noop, noop, noop);
}, onError, noop);
}, 16);
batch.pendingLoad = false;
batches.push(batch);
}
// util.log.warn('PathEvaluator: adding paths to batch - ' + batch.batchIndex);
var batchMisses = batch.misses || (batch.misses = []);
var batchObservers = batch.observers || (batch.observers = []);
batchMisses.push.apply(batchMisses, misses);
batchObservers.push(observer);
batch.pathSet = batch.pathSet || (batch.pathSet = {
__observers: []
});
return Disposable.create(function() {
var batchObservers = batch.observers,
i = batchObservers.indexOf(observer);
if (i !== -1) {
batchObservers.splice(i, 1);
}
if (batchObservers.length === 0) {
batch.dispose();
}
});
}
}
/** @inline */
function finish() {
if (streaming === false && onNext !== undefined) {
onNext({
paths: paths,
value: self.context().value
});
}
if (errors.length > 0 && onError !== undefined) {
onError({
innerErrors: errors
});
} else if (onCompleted !== undefined) {
onCompleted();
}
}
/** @inline */
function save_error() {
errors[errors.length] = {
optimized: optimized.concat(),
path: original.concat(),
value: value
};
}
/** @inline */
function short_circuit() {
if (interrupted === true) {
short_circuit_int();
} else {
short_circuit_path();
}
}
/** @inline */
function short_circuit_path() {
original.length = column + 1;
optimized.length = column + offset + 1;
}
/** @inline */
function short_circuit_int() {
path = prevs[0] || path;
column = cols[0];
last = path.length - 1;
original.length = column + 2;
original[column + 1] = null;
optimized.length = column + offset + 1;
}
}
function refreshPaths(paths, pbv, onNext, onError, onCompleted) {
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW,
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER,
self, streaming, connected, max,
batches, batch, observers, observer,
contexts, messages, pathSets, misses, errors,
cache, context, parent, value, type, size, expires, timestamp,
messageParent, message, messageValue, messageType, messageSize,
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive,
sizeOffset = 0,
bound, original, optimized, offset,
path, key, column, last, ref, now,
refs, cols, prevs, interrupts, interrupted,
generations, generationsLen, backRefs, pathSet, index, total, miss;
var timeExpireList = this.timeExpireList,
sizeExpireList = this.sizeExpireList,
timeExpireListLength = timeExpireList.length,
sizeExpireListLength = sizeExpireList.length;
self = this;
now = Date.now();
streaming = self._streaming;
connected = self._connected;
cache = self.cache;
batches = self._batches;
max = self.maxSize;
misses = paths.misses || (paths.misses = []);
errors = paths.errors || (paths.errors = []);
refs = paths.refs || (paths.refs = []);
cols = paths.cols || (paths.cols = []);
prevs = paths.prevs || (paths.prevs = []);
interrupts = paths.interrupts || (paths.interrupts = 0);
interrupted = interrupts > 0;
observers = paths.observers || (paths.observers = []);
index = paths.index || (paths.index = 0);
total = paths.length;
context = init_context(paths, pbv.value || {});
contexts = paths.contexts;
bound = refs[-1] = pbv.optimized || pbv.path;
pbv.path = original = [];
pbv.optimized = optimized = [];
pbv.value = undefined;
observers[observers.length] = observer = {
onNext: onNext,
onError: onError,
onCompleted: onCompleted,
streaming: streaming,
paths: 0,
path: bound,
misses: paths.concat(),
errors: errors
};
getting: for (; index < total; ++index) {
original.length = 0;
path = paths[paths.index = index];
last = path.length - 1;
column = path.index || (path.index = 0);
reset_refs();
reset_cols();
unlocking: while (column >= 0) {
parent = contexts[column - 1];
descend();
unlock();
path.index = column = ascend(path, column, 0);
reset_refs();
reset_cols();
}
path.index = 0;
}
paths.index = 0;
if (connected === true) {
return batch_or_load_paths();
}
finish();
return Disposable.empty;
/** @inline */
function ascend(path, column, lower) {
var key;
ascending: for (; column >= lower; --column) {
key = path[column];
if (is_simple_key(key)) {
continue ascending;
}
if (isArray(key)) {
if (++key.index === key.length) {
key = key[key.index = offset = 0];
if (is_simple_key(key)) {
continue ascending;
}
} else {
break ascending;
}
}
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) {
offset = 0;
key.offset = key.from;
continue ascending;
}
break ascending;
}
return column;
}
/** @inline */
function reset_cols() {
var i = cols[interrupts - 1];
while (i >= column) {
if (--interrupts >= 0) {
i = cols[interrupts - 1];
} else {
break;
}
}
interrupted = interrupts > 0;
}
/** @inline */
function reset_refs() {
ref = refs[column - 1];
if (ref !== undefined) {
offset = reset_optimized_from_ref() - column;
}
}
/** @inline */
function find_key(key) {
if (is_complex_key(key)) {
if (isArray(key)) {
key = find_segment_key(key);
if (is_complex_key(key)) {
key = find_range_key(key);
}
} else {
key = find_range_key(key);
}
}
return key;
}
/** @inline */
function find_segment_key(key) {
return key[key.index || (key.index = 0)];
}
/** @inline */
function find_range_key(key) {
return key.offset || (key.offset = key.from || (key.from = 0));
}
/** @inline */
function is_simple_key(key) {
return (typeof key !== 'object' || key == null);
}
/** @inline */
function is_complex_key(key) {
return (typeof key === 'object' && key != null);
}
/** @inline */
function find_context() {
return parent[key];
}
/** @inline */
function find_leaf_context() {
return (
(context = parent[key]) !== undefined && (
((expires = context.$expires) === undefined && context) ||
((expires === EXPIRES_NOW && context)) &&
((expires === EXPIRES_NEVER && context)) &&
((expires > now && context))) ||
// (timeExpireList[timeExpireListLength++] = context) &&
// (context = undefined))) ||
(context = undefined)
);
}
/** @inline */
function find_type() {
return (type = context && context.$type || undefined);
}
/** @inline */
function find_value() {
return (value = (
context !== undefined &&
find_type() === "sentinel"
) ? context.value : context);
}
/** @inline */
function reset_path_from_ref() {
if (path._context === undefined) {
set_back_reference();
}
while (interrupted === true && column === last) {
path = prevs[--interrupts];
column = cols[interrupts];
interrupted = interrupts > 0;
offset = last - column;
last = path.length - 1;
}
}
/** @inline */
function reset_optimized_from_ref() {
var n = optimized.length = ref.length;
for (var i = -1; ++i < n;) {
optimized[i] = ref[i];
}
return n;
}
/** @inline */
function save_optimized(optimized, column, offset, key) {
return (optimized[optimized.length = column + offset] = key);
}
/** @inline */
function save_original(original, column, key) {
return (original[column] = key);
}
/** @inline */
function set_back_reference() {
// create a back reference
backRefs = context.__refsLength || 0;
context['__ref' + backRefs] = path;
context.__refsLength = backRefs + 1;
// create a hard reference
path._context = context;
}
/** @inline */
function stamp() {
context.__access_time = now;
context.__access_count = (context.__access_count || 0) + 1;
}
/** @inline */
function build_path_set(paths, pathSet, observer) {
var contexts = [],
context, xs,
index = -1,
total = paths.length,
path, column, last, obs;
contexts[-1] = pathSet || (pathSet = {
__observers: []
});
building: while (++index < total) {
path = paths[index];
obs = observer || path.observer;
last = path.length - 1;
column = 0;
unlocking: while (column >= 0) {
context = contexts[column - 1];
(xs = context.__observers)[xs.length] = obs;
for (; column <= last; ++column) {
key = find_key(path[column]);
if (key != null) {
contexts[column] = context = context[key] || (context[key] = {
__observers: []
});
(xs = context.__observers)[xs.length] = obs;
}
}
obs.paths = (obs.paths || 0) + 1;
column = ascend(path, column, 0);
}
}
return pathSet;
}
/** @inline */
function cleanup() {
if ((total = cache.$size) >= max) {
if (batches === undefined || batches.length === 0 || batches.every(function(batch) {
return batch.pendingLoad === false;
})) {
if (timeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up time expire list");
self.root.timeExpireList = timeExpireList =
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
total = timeExpireList.total;
}
}
if (sizeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up size expire list");
self.root.sizeExpireList = sizeExpireList =
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
}
}
}
}
}
/** @inline */
function descend() {
descending: for (; column <= last; ++column) {
key = find_key(path[column]);
// all the columns before the last column
if (column < last) {
if (key == null) {
continue descending;
}
save_optimized(optimized, column, offset, key);
if (interrupted === false) {
save_original(original, column, key);
}
if ((context = find_context(parent, key)) === undefined) {
short_circuit();
break descending;
}
value = find_value(context);
if (isArray(value)) {
do {
stamp();
interrupt();
} while (isArray(value = find_value(context)));
type = undefined;
continue descending;
} else if (type !== undefined) {
short_circuit();
break descending;
} else if (interrupted === false) {
contexts[column] = context;
}
type = undefined;
parent = context;
continue descending;
}
// last column
if (key != null) {
save_optimized(optimized, column, offset, key);
context = find_leaf_context(parent, key);
}
value = find_value(context);
if (interrupted === true) {
if (context == null || type === "error") {
short_circuit_int();
break descending;
}
reset_path_from_ref();
contexts[column] = parent = context;
if (isArray(value)) {
stamp();
interrupt();
}
type = undefined;
continue descending;
}
save_original(original, column, key);
break descending;
}
}
/** @inline */
function unlock() {
miss = save_missing();
miss.observer = observer;
misses[misses.length] = miss;
if (context != null) {
if (type === 'error') {
stamp();
save_error();
} else {
stamp();
if (streaming === true && value !== undefined) {
pbv.value = value;
onNext(pbv);
}
}
}
}
/** @inline */
function init_context(paths, context) {
return contexts === undefined ?
((paths.contexts = contexts = [])[-1] = context) :
((contexts[-1]));
}
/** @inline */
function interrupt() {
refs[column] = ref = value;
if ((context = value._context) !== undefined) {
offset = reset_optimized_from_ref() - column - 1;
contexts[column] = parent = context;
} else {
prevs[interrupts] = path;
cols[interrupts++] = column;
interrupted = true;
path = value;
last = path.length - 1;
offset = 0;
column = -1;
parent = cache;
context = value = undefined;
}
}
/** @inline */
function save_missing() {
var i, j, nulls = 0,
n = optimized.length,
miss = new Array(n + last - column);
for (i = j = -1; ++i < n;) {
key = optimized[i];
if (key != null) {
miss[++j] = key;
} else {
--nulls;
}
}
i = column;
while (++i <= last) {
key = path[i];
if (key != null) {
miss[++j] = key;
} else {
--nulls;
}
}
miss.length += nulls;
return miss;
}
/** @inline */
function batch_or_load_paths() {
var loadDisposable = Disposable.empty;
if (batches === undefined) {
pathSet = build_path_set(misses, null, observer);
misses = rangeCollapse(buildQueries(pathSet));
loadDisposable = self.loader.get(misses).subscribe(function(pbf) {
pbf = Object.create(pbf);
var error = pbf.error,
serverErrors = [];
// TODO: retry certain errors
while (error !== undefined) {
if (error.innerErrors) {
serverErrors.push.apply(serverErrors, error.innerErrors);
} else {
error.$type = "error";
setPath.call(self, error.path || error.pql, error, pbf.value);
}
error = serverErrors.pop();
}
pbf.paths.errors = errors;
pbf.paths.pathSet = undefined;
pbf.paths.observers = undefined;
setPBFRoot.call(self, pbf, onNext, onError, onCompleted);
}, onError, noop);
return loadDisposable;
} else {
batch = batches[batches.length - 1];
if (batch === undefined || batch.pendingLoad === true) {
batch = Disposable.create(function() {
var i = batches.indexOf(batch);
if (i !== -1) {
batches.splice(i, 1);
}
if (batch.batchID !== undefined) {
clearTimeout(batch.batchID);
batch.batchID = undefined;
}
if (batch.pendingLoad === true) {
loadDisposable.dispose();
}
batch.pendingLoad = false;
});
batch.batchIndex = batches.length;
// util.log.warn('PathEvaluator: new batch - ' + batch.batchIndex);
batch.batchID = setTimeout(function() {
var i = batches.indexOf(batch);
if (i !== -1) {
batches.splice(i, 1);
}
batch.batchID = undefined;
batch.pendingLoad = true;
batch.pathSet = build_path_set(batch.misses);
batch.misses = rangeCollapse(buildQueries(batch.pathSet));
// util.log.warn('PathEvaluator: requesting batch ' + batch.batchIndex + ' - ' + JSON.stringify(batch.misses));
loadDisposable = self.loader.get(batch.misses).subscribe(function(pbf) {
pbf = Object.create(pbf);
batch.pendingLoad = false;
// util.log.warn('PathEvaluator: setting batch - ' + batch.batchIndex);
var error = pbf.error,
serverErrors = [];
// TODO: retry certain errors
while (error !== undefined) {
if (error.innerErrors) {
serverErrors.push.apply(serverErrors, error.innerErrors);
} else {
error.$type = "error";
setPath.call(self, error.path || error.pql, error, pbf.value);
}
error = serverErrors.pop();
}
pbf.paths.errors = [];
pbf.paths.pathSet = batch.pathSet;
pbf.paths.observers = batch.observers.concat();
setPBFRoot.call(self, pbf, noop, noop, noop);
}, onError, noop);
}, 16);
batch.pendingLoad = false;
batches.push(batch);
}
// util.log.warn('PathEvaluator: adding paths to batch - ' + batch.batchIndex);
var batchMisses = batch.misses || (batch.misses = []);
var batchObservers = batch.observers || (batch.observers = []);
batchMisses.push.apply(batchMisses, misses);
batchObservers.push(observer);
batch.pathSet = batch.pathSet || (batch.pathSet = {
__observers: []
});
return Disposable.create(function() {
var batchObservers = batch.observers,
i = batchObservers.indexOf(observer);
if (i !== -1) {
batchObservers.splice(i, 1);
}
if (batchObservers.length === 0) {
batch.dispose();
}
});
}
}
/** @inline */
function finish() {
if (streaming === false && onNext !== undefined) {
onNext({
paths: paths,
value: self.context().value
});
}
if (errors.length > 0 && onError !== undefined) {
onError({
innerErrors: errors
});
} else if (onCompleted !== undefined) {
onCompleted();
}
}
/** @inline */
function save_error() {
errors[errors.length] = {
optimized: optimized.concat(),
path: original.concat(),
value: value
};
}
/** @inline */
function short_circuit() {
if (interrupted === true) {
short_circuit_int();
} else {
short_circuit_path();
}
}
/** @inline */
function short_circuit_path() {
original.length = column + 1;
optimized.length = column + offset + 1;
}
/** @inline */
function short_circuit_int() {
path = prevs[0] || path;
column = cols[0];
last = path.length - 1;
original.length = column + 2;
original[column + 1] = null;
optimized.length = column + offset + 1;
}
}
function set() {
var a = args(arguments);
if (this._lazy) {
if (this._streaming) {
return setPathsLazily.call(this, a);
}
return setPBFLazily.call(this, a[0]);
}
var pbv = this.context(),
onNext = a[a.length - 3],
onError = a[a.length - 2],
onCompleted = a[a.length - 1];
a = a.slice(0, -3);
if (this._streaming) {
return setPaths.call(this, a, pbv, onNext, onError, onCompleted);
}
return setPBF.call(this, a[0].paths, a[0].value, pbv, onNext, onError, onCompleted);
}
var setPBFLazily = immediateToLazy(function(pbf, pbv, n, e, c) {
return setPBF.call(this, pbf.paths, pbf.value, pbv, n, e, c);
});
var setPathsLazily = immediateToLazy(setPaths);
function setPBFRoot(pbf, onNext, onError, onCompleted) {
return setPBF.call(this, pbf.paths, pbf.value, {
path: [],
value: this.cache
}, onNext, onError, onCompleted);
}
function setPathsRoot(paths, onNext, onError, onCompleted) {
return setPaths.call(this, paths, {
path: [],
value: this.cache
}, onNext, onError, onCompleted);
}
function setPBF(paths, messageCache, pbv, onNext, onError, onCompleted) {
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW,
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER,
self, streaming, connected, max,
batches, batch, observers, observer,
contexts, messages, pathSets, misses, errors,
cache, context, parent, value, type, size, expires, timestamp,
messageParent, message, messageValue, messageType, messageSize,
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive,
sizeOffset = 0,
bound, original, optimized, offset,
path, key, column, last, ref, now,
refs, cols, prevs, interrupts, interrupted,
generations, generationsLen, backRefs, pathSet, index, total, miss;
var timeExpireList = this.timeExpireList,
sizeExpireList = this.sizeExpireList,
timeExpireListLength = timeExpireList.length,
sizeExpireListLength = sizeExpireList.length;
self = this;
now = Date.now();
streaming = self._streaming;
connected = self._connected;
cache = self.cache;
batches = self._batches;
max = self.maxSize;
misses = paths.misses || (paths.misses = []);
errors = paths.errors || (paths.errors = []);
refs = paths.refs || (paths.refs = []);
cols = paths.cols || (paths.cols = []);
prevs = paths.prevs || (paths.prevs = []);
interrupts = paths.interrupts || (paths.interrupts = 0);
interrupted = interrupts > 0;
observers = paths.observers || (paths.observers = []);
index = paths.index || (paths.index = 0);
total = paths.length;
context = init_context(paths, pbv.value || {});
contexts = paths.contexts;
bound = refs[-1] = pbv.optimized || pbv.path;
pbv.path = original = [];
pbv.optimized = optimized = [];
pbv.value = undefined;
observers[observers.length] = observer = {
onNext: onNext,
onError: onError,
onCompleted: onCompleted,
streaming: streaming,
paths: 0,
path: bound,
misses: paths.concat(),
errors: errors
};
generations = paths.generations || (paths.generations = []);
generationsLen = generations.length;
message = init_message(paths, paths.messages, messageCache);
messages = paths.messages;
pathSets = paths.pathSets || (paths.pathSets = []);
pathSets[-1] = pathSet = build_path_set(paths, paths.pathSet || {
__observers: []
}, observer);
setting: for (; index < total; ++index) {
original.length = 0;
path = paths[paths.index = index];
last = path.length - 1;
column = path.index || (path.index = 0);
reset_refs();
reset_cols();
unlocking: while (column >= 0) {
parent = contexts[column - 1];
messageParent = messages[column - 1];
pathSet = pathSets[column - 1];
descend();
unlock();
path.index = column = ascend(path, column, 0);
reset_refs();
reset_cols();
}
path.index = 0;
}
paths.index = 0;
update_generations();
finish(pathSet);
cleanup();
return Disposable.empty;
/** @inline */
function ascend(path, column, lower) {
var key;
ascending: for (; column >= lower; --column) {
key = path[column];
if (is_simple_key(key)) {
continue ascending;
}
if (isArray(key)) {
if (++key.index === key.length) {
key = key[key.index = offset = 0];
if (is_simple_key(key)) {
continue ascending;
}
} else {
break ascending;
}
}
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) {
offset = 0;
key.offset = key.from;
continue ascending;
}
break ascending;
}
return column;
}
/** @inline */
function reset_cols() {
var i = cols[interrupts - 1];
while (i >= column) {
if (--interrupts >= 0) {
i = cols[interrupts - 1];
} else {
break;
}
}
interrupted = interrupts > 0;
}
/** @inline */
function reset_refs() {
ref = refs[column - 1];
if (ref !== undefined) {
offset = reset_optimized_from_ref() - column;
}
}
/** @inline */
function find_key(key) {
if (is_complex_key(key)) {
if (isArray(key)) {
key = find_segment_key(key);
if (is_complex_key(key)) {
key = find_range_key(key);
}
} else {
key = find_range_key(key);
}
}
return key;
}
/** @inline */
function find_segment_key(key) {
return key[key.index || (key.index = 0)];
}
/** @inline */
function find_range_key(key) {
return key.offset || (key.offset = key.from || (key.from = 0));
}
/** @inline */
function is_simple_key(key) {
return (typeof key !== 'object' || key == null);
}
/** @inline */
function is_complex_key(key) {
return (typeof key === 'object' && key != null);
}
/** @inline */
function find_context() {
return parent[key];
}
/** @inline */
function find_leaf_context() {
return (
(context = parent[key]) !== undefined && (
((expires = context.$expires) === undefined && context) ||
((expires === EXPIRES_NOW && context)) &&
((expires === EXPIRES_NEVER && context)) &&
((expires > now && context))) ||
// (timeExpireList[timeExpireListLength++] = context) &&
// (context = undefined))) ||
(context = undefined)
);
}
/** @inline */
function find_type() {
return (type = context && context.$type || undefined);
}
/** @inline */
function find_value() {
return (value = (
context !== undefined &&
find_type() === "sentinel"
) ? context.value : context);
}
/** @inline */
function reset_path_from_ref() {
if (path._context === undefined) {
set_back_reference();
}
while (interrupted === true && column === last) {
path = prevs[--interrupts];
column = cols[interrupts];
interrupted = interrupts > 0;
offset = last - column;
last = path.length - 1;
}
}
/** @inline */
function reset_optimized_from_ref() {
var n = optimized.length = ref.length;
for (var i = -1; ++i < n;) {
optimized[i] = ref[i];
}
return n;
}
/** @inline */
function save_optimized(optimized, column, offset, key) {
return (optimized[optimized.length = column + offset] = key);
}
/** @inline */
function save_original(original, column, key) {
return (original[column] = key);
}
/** @inline */
function set_back_reference() {
// create a back reference
backRefs = context.__refsLength || 0;
context['__ref' + backRefs] = path;
context.__refsLength = backRefs + 1;
// create a hard reference
path._context = context;
}
/** @inline */
function stamp() {
context.__access_time = now;
context.__access_count = (context.__access_count || 0) + 1;
}
/** @inline */
function adjust_contexts() {
context.__generation = (context.__generation || 0) + 1;
do {
context.$size = (context.$size || 0) + sizeOffset;
context = context.__parent;
} while (context !== undefined);
context = parent[key];
var stack = [],
frame, refs, ref,
depth = 0,
i, n;
adjusting: while (depth >= 0) {
if ((frame = stack[depth]) === undefined) {
i = -1;
n = context.__refsLength || 0;
refs = [];
while (++i < n) {
ref = context['__ref' + i];
if (ref && ref.__tagged === undefined) {
ref.__tagged = true;
generations[generationsLen++] = refs[i] = ref;
}
}
if ((ref = context.__parent) !== undefined && ref.__tagged === undefined) {
ref.__tagged = true;
generations[generationsLen++] = refs[i] = ref;
}
frame = stack[depth] = {
context: context,
refs: refs
};
}
refs = frame.refs;
if ((context = refs[refs.length - 1]) !== undefined) {
refs.length -= 1;
++depth;
continue adjusting;
}
stack[depth--] = undefined;
}
context = parent[key];
sizeOffset = 0;
}
/** @inline */
function update_generations() {
var i = generations.length,
ref;
while ((ref = generations[--i]) !== undefined) {
ref.__tagged = undefined;
ref.__generation = (ref.__generation || 0) + 1;
}
generations.length = generationsLen = 0;
}
/** @inline */
function cleanup() {
if ((total = cache.$size) >= max) {
if (batches === undefined || batches.length === 0 || batches.every(function(batch) {
return batch.pendingLoad === false;
})) {
if (timeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up time expire list");
self.root.timeExpireList = timeExpireList =
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
total = timeExpireList.total;
}
}
if (sizeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up size expire list");
self.root.sizeExpireList = sizeExpireList =
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
}
}
}
}
}
/** @inline */
function build_path_set(paths, pathSet, observer) {
var contexts = [],
context, xs,
index = -1,
total = paths.length,
path, column, last, obs;
contexts[-1] = pathSet || (pathSet = {
__observers: []
});
building: while (++index < total) {
path = paths[index];
obs = observer || path.observer;
last = path.length - 1;
column = 0;
unlocking: while (column >= 0) {
context = contexts[column - 1];
(xs = context.__observers)[xs.length] = obs;
for (; column <= last; ++column) {
key = find_key(path[column]);
if (key != null) {
contexts[column] = context = context[key] || (context[key] = {
__observers: []
});
(xs = context.__observers)[xs.length] = obs;
}
}
obs.paths = (obs.paths || 0) + 1;
column = ascend(path, column, 0);
}
}
return pathSet;
}
/** @inline */
function check_observer_finished(observers, observer) {
var j;
if (--observer.paths === 0) {
if (observer.errors.length > 0) {
observer.onError({
innerErrors: observer.errors
});
} else {
observer.onCompleted();
}
j = observers.indexOf(observer);
if (j !== -1) {
observers.splice(j, 1);
}
}
}
/** @inline */
function descend() {
var i, n;
descending: for (; column <= last; ++column) {
if (interrupted === false) {
key = find_key(path[column]);
if (key != null) {
save_original(original, column, key);
pathSet = find_path_set();
pathSets[column] = pathSet;
} else if (column < last) {
continue descending;
} else {
save_original(original, column, key);
}
} else {
key = path[column];
if (key == null && column < last) {
continue descending;
}
}
if (key != null) {
save_optimized(optimized, column, offset, key);
context = column < last ? find_context() : find_leaf_context();
message = find_message();
if (context === undefined || message === context) {
size = timestamp = 0;
} else if (message_value_is_leaf() || (interrupted === false && column === last)) {
replace_context(message);
}
if (context === undefined) {
if (message === undefined) {
short_circuit();
insert_missing_sentinel();
break descending;
} else {
if (message == null) {
messageExpires = messageTimestamp = 2;
} else {
messageTimestamp = message.$timestamp;
messageExpires = message.$expires;
}
if (messageTimestamp < timestamp) {
short_circuit();
value = find_value(context);
context = undefined;
break descending;
} else if (messageExpires === EXPIRES_NOW) {
short_circuit();
value = find_message_value();
context = undefined;
break descending;
} else if (column < last) {
if (message_value_is_leaf()) {
insert_message();
} else {
insert_empty_branch();
}
} else if (interrupted === true) {
insert_empty_branch();
reset_path_from_ref();
contexts[column] = parent = context;
messages[column] = messageParent = message;
type = undefined;
continue descending;
} else {
insert_message();
break descending;
}
}
} else if (typeof context === 'object') {
link_context();
}
}
if (isArray(find_value())) {
stamp();
interrupt();
messageParent = messageCache;
type = undefined;
continue descending;
} else if (type !== undefined) {
short_circuit();
break descending;
} else if (interrupted === false) {
contexts[column] = context;
messages[column] = message;
} else if (column === last) {
if (context === undefined || type === "error") {
short_circuit();
break descending;
}
reset_path_from_ref();
contexts[column] = parent = context;
messages[column] = messageParent = message;
if (isArray(value)) {
stamp();
interrupt();
messageParent = messageCache;
}
type = undefined;
continue descending;
}
parent = context;
messageParent = message;
}
}
/** @inline */
function find_message() {
return messageParent && messageParent[key];
}
/** @inline */
function find_message_value() {
return (messageValue = (
(message !== undefined) &&
find_message_type() === "sentinel"
) ? message.value : message);
}
/** @inline */
function find_message_size() {
messageSize = 1;
if (message_value_has_length()) {
messageSize = messageValue.length;
} else if (message !== messageValue && typeofMessageValue === "object" && messageValue !== null) {
messageSize = 0;
}
if (messageType !== undefined) {
messageSize += sentinelSize;
} else if (message_value_is_primitive()) {
messageType = "sentinel";
messageSize += sentinelSize;
message = {
"$type": messageType,
"value": messageValue
};
} else if (!message_value_is_array()) {
messageSize = message.$size || sentinelSize;
}
type = messageType;
return messageSize;
}
/** @inline */
function find_message_type() {
return (messageType = message && message.$type || undefined);
}
/** @inline */
function find_path_set() {
return pathSet[key];
}
/** @inline */
function finish(pathSet) {
var x = observers.concat(),
i = -1,
n = x.length;
while (++i < n) {
if ((observer = x[i]).streaming === false) {
observer.onNext({
paths: observer.misses,
value: findPath.call(self, observer.path, self.cache).value
});
}
if (observer.errors.length > 0) {
observer.onError({
innerErrors: observer.errors
});
} else {
observer.onCompleted();
}
}
}
/** @inline */
function init_context(paths, context) {
return contexts === undefined ?
((paths.contexts = contexts = [])[-1] = context) :
((contexts[-1]));
}
/** @inline */
function init_message(paths, messages, message) {
return messages === undefined ?
((paths.messages = [])[-1] = message) :
((messages[-1]));
}
/** @inline */
function init_stamp() {
sizeExpireList[sizeExpireListLength++] = context;
expires = context.$expires;
if (expires !== undefined &&
expires !== EXPIRES_NEVER &&
expires !== EXPIRES_NOW) {
if (expires < 0) {
expires = now + (expires * -1);
}
context.$expires = expires;
}
stamp();
}
/** @inline */
function insert_missing_sentinel() {
messageSize = sentinelSize + 1;
messageValue = value = undefined;
messageType = type = "sentinel";
message = {
"$type": messageType,
"value": messageValue
};
sizeOffset += messageSize;
parent[key] = context = message;
link_context();
adjust_contexts();
}
/** @inline */
function insert_empty_branch() {
parent[key] = context = {
"$size": 0
};
link_context();
}
/** @inline */
function insert_message() {
value = find_message_value();
messageSize = find_message_size();
message.$size = size;
sizeOffset += (messageSize - size);
parent[key] = context = message;
link_context();
adjust_contexts();
context.$type = type = (type || "leaf");
if (context.__access_time === undefined) {
init_stamp();
} else {
stamp();
}
}
/** @inline */
function interrupt() {
refs[column] = value;
prevs[interrupts] = path;
cols[interrupts++] = column;
interrupted = true;
path = value;
last = path.length - 1;
offset = 0;
column = -1;
parent = cache;
}
/** @inline */
function link_context() {
// link the child to the parent
context.__parent = parent;
context.__key = key;
}
/** @inline */
function message_value_is_leaf() {
return (message_value_is_primitive() || message_value_is_array());
}
/** @inline */
function message_value_has_length() {
return ((typeof_message_value() === 'string') || message_value_is_array());
}
/** @inline */
function message_value_is_array() {
return (isArray(messageValue) && (typeofMessageValue = "array"));
}
/** @inline */
function message_value_is_primitive() {
return (messageValueIsPrimitive = (typeof_message_value() !== 'object' || messageValue === null));
}
/** @inline */
function replace_context(message) {
size = context.$size || 0;
timestamp = context.$timestamp || 0;
if (message != null) {
migrate_references(context, message);
}
if (isArray(value)) {
delete_hard_link(context);
}
// context.$expires = -1;
// timeExpireList[timeExpireListLength++] = context;
context = undefined;
}
/** @inline */
function migrate_references(context, message) {
var mBackRefs = message.__refsLength || 0,
cBackRefs = context.__refsLength || 0,
refs = -1,
refKey, ref;
while (++refs < cBackRefs) {
refKey = "__ref" + refs;
ref = context[refKey];
ref._context = message;
message["__ref" + (mBackRefs + refs)] = ref;
delete context[refKey];
}
}
/** @inline */
function delete_hard_link(reference) {
var destination = reference._context;
if (destination != null) {
var refIndex = (reference.__refIndex || 0) - 1,
refsLen = (destination.__refsLength || 0) - 1;
while (++refIndex <= refsLen) {
destination["__ref" + refIndex] = destination["__ref" + refIndex + 1];
}
destination.__refsLength = refsLen;
if (refsLen < 0) {
delete destination.__ref0;
delete destination.__refsLength;
}
delete reference.__refIndex;
delete reference._context;
}
}
/** @inline */
function short_circuit() {
if (interrupted === true) {
short_circuit_int();
} else {
short_circuit_path();
}
}
/** @inline */
function short_circuit_path() {
original.length = column + 1;
optimized.length = column + offset + 1;
}
/** @inline */
function short_circuit_int() {
path = prevs[0] || path;
column = cols[0];
last = path.length - 1;
original.length = column + 2;
original[column + 1] = null;
optimized.length = column + offset + 1;
}
/** @inline */
function typeof_message_value() {
return (typeofMessageValue = typeof find_message_value());
}
/** @inline */
function unlock() {
var i, n, x;
// if(context != null && column === last) {
// if (context.__access_time === undefined) {
// init_stamp();
// } else {
// stamp();
// }
// }
if (type === "error") {
var error = {
optimized: optimized.concat(),
path: original.concat(),
value: value
};
for (i = -1, x = pathSet.__observers, n = x.length; ++i < n;) {
observer = x[i];
if (observers.indexOf(observer) !== -1) {
errors = observer.errors;
errors[errors.length] = error;
if (observer.streaming === true) {
check_observer_finished(observers, observer);
}
}
}
} else {
if ((value !== undefined) ||
(type === "sentinel" && column < last)) { // onNext undefined branch sentinels
pbv.value = value;
for (i = -1, x = pathSet.__observers, n = x.length; ++i < n;) {
observer = x[i];
if (observers.indexOf(observer) !== -1) {
if (observer.streaming === true) {
observer.onNext(pbv);
check_observer_finished(observers, observer);
}
}
}
x.length = 0;
}
}
}
}
function setPaths(paths, pbv, onNext, onError, onCompleted) {
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW,
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER,
self, streaming, connected, max,
batches, batch, observers, observer,
contexts, messages, pathSets, misses, errors,
cache, context, parent, value, type, size, expires, timestamp,
messageParent, message, messageValue, messageType, messageSize,
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive,
sizeOffset = 0,
bound, original, optimized, offset,
path, key, column, last, ref, now,
refs, cols, prevs, interrupts, interrupted,
generations, generationsLen, backRefs, pathSet, index, total, miss;
var timeExpireList = this.timeExpireList,
sizeExpireList = this.sizeExpireList,
timeExpireListLength = timeExpireList.length,
sizeExpireListLength = sizeExpireList.length;
self = this;
now = Date.now();
streaming = self._streaming;
connected = self._connected;
cache = self.cache;
batches = self._batches;
max = self.maxSize;
misses = paths.misses || (paths.misses = []);
errors = paths.errors || (paths.errors = []);
refs = paths.refs || (paths.refs = []);
cols = paths.cols || (paths.cols = []);
prevs = paths.prevs || (paths.prevs = []);
interrupts = paths.interrupts || (paths.interrupts = 0);
interrupted = interrupts > 0;
observers = paths.observers || (paths.observers = []);
index = paths.index || (paths.index = 0);
total = paths.length;
context = init_context(paths, pbv.value || {});
contexts = paths.contexts;
bound = refs[-1] = pbv.optimized || pbv.path;
pbv.path = original = [];
pbv.optimized = optimized = [];
pbv.value = undefined;
observers[observers.length] = observer = {
onNext: onNext,
onError: onError,
onCompleted: onCompleted,
streaming: streaming,
paths: 0,
path: bound,
misses: paths.concat(),
errors: errors
};
generations = paths.generations || (paths.generations = []);
generationsLen = generations.length;
cache = context;
for (; index < total; ++index) {
pbv = paths[paths.index = index];
pbv.path.generations = generations;
pbv = this.insert(pbv, cache);
value = find_value(context = pbv.value);
unlock();
}
paths.index = 0;
update_generations();
finish();
cleanup();
return Disposable.empty;
/** @inline */
function ascend(path, column, lower) {
var key;
ascending: for (; column >= lower; --column) {
key = path[column];
if (is_simple_key(key)) {
continue ascending;
}
if (isArray(key)) {
if (++key.index === key.length) {
key = key[key.index = offset = 0];
if (is_simple_key(key)) {
continue ascending;
}
} else {
break ascending;
}
}
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) {
offset = 0;
key.offset = key.from;
continue ascending;
}
break ascending;
}
return column;
}
/** @inline */
function reset_cols() {
var i = cols[interrupts - 1];
while (i >= column) {
if (--interrupts >= 0) {
i = cols[interrupts - 1];
} else {
break;
}
}
interrupted = interrupts > 0;
}
/** @inline */
function reset_refs() {
ref = refs[column - 1];
if (ref !== undefined) {
offset = reset_optimized_from_ref() - column;
}
}
/** @inline */
function find_key(key) {
if (is_complex_key(key)) {
if (isArray(key)) {
key = find_segment_key(key);
if (is_complex_key(key)) {
key = find_range_key(key);
}
} else {
key = find_range_key(key);
}
}
return key;
}
/** @inline */
function find_segment_key(key) {
return key[key.index || (key.index = 0)];
}
/** @inline */
function find_range_key(key) {
return key.offset || (key.offset = key.from || (key.from = 0));
}
/** @inline */
function is_simple_key(key) {
return (typeof key !== 'object' || key == null);
}
/** @inline */
function is_complex_key(key) {
return (typeof key === 'object' && key != null);
}
/** @inline */
function find_context() {
return parent[key];
}
/** @inline */
function find_leaf_context() {
return (
(context = parent[key]) !== undefined && (
((expires = context.$expires) === undefined && context) ||
((expires === EXPIRES_NOW && context)) &&
((expires === EXPIRES_NEVER && context)) &&
((expires > now && context))) ||
// (timeExpireList[timeExpireListLength++] = context) &&
// (context = undefined))) ||
(context = undefined)
);
}
/** @inline */
function find_type() {
return (type = context && context.$type || undefined);
}
/** @inline */
function find_value() {
return (value = (
context !== undefined &&
find_type() === "sentinel"
) ? context.value : context);
}
/** @inline */
function reset_path_from_ref() {
if (path._context === undefined) {
set_back_reference();
}
while (interrupted === true && column === last) {
path = prevs[--interrupts];
column = cols[interrupts];
interrupted = interrupts > 0;
offset = last - column;
last = path.length - 1;
}
}
/** @inline */
function reset_optimized_from_ref() {
var n = optimized.length = ref.length;
for (var i = -1; ++i < n;) {
optimized[i] = ref[i];
}
return n;
}
/** @inline */
function save_optimized(optimized, column, offset, key) {
return (optimized[optimized.length = column + offset] = key);
}
/** @inline */
function save_original(original, column, key) {
return (original[column] = key);
}
/** @inline */
function set_back_reference() {
// create a back reference
backRefs = context.__refsLength || 0;
context['__ref' + backRefs] = path;
context.__refsLength = backRefs + 1;
// create a hard reference
path._context = context;
}
/** @inline */
function stamp() {
context.__access_time = now;
context.__access_count = (context.__access_count || 0) + 1;
}
/** @inline */
function cleanup() {
if ((total = cache.$size) >= max) {
if (batches === undefined || batches.length === 0 || batches.every(function(batch) {
return batch.pendingLoad === false;
})) {
if (timeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up time expire list");
self.root.timeExpireList = timeExpireList =
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
total = timeExpireList.total;
}
}
if (sizeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up size expire list");
self.root.sizeExpireList = sizeExpireList =
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
}
}
}
}
}
/** @inline */
function update_generations() {
var i = generations.length,
ref;
while ((ref = generations[--i]) !== undefined) {
ref.__tagged = undefined;
ref.__generation = (ref.__generation || 0) + 1;
}
generations.length = generationsLen = 0;
}
/** @inline */
function finish() {
if (streaming === false && onNext !== undefined) {
onNext({
paths: paths,
value: self.context().value
});
}
if (errors.length > 0 && onError !== undefined) {
onError({
innerErrors: errors
});
} else if (onCompleted !== undefined) {
onCompleted();
}
}
/** @inline */
function init_context(paths, context) {
return contexts === undefined ?
((paths.contexts = contexts = [])[-1] = context) :
((contexts[-1]));
}
/** @inline */
function unlock() {
if (type === "error") {
errors[errors.length] = {
optimized: pbv.optimized.concat(),
path: pbv.path.concat(),
value: value
};
} else {
if ((streaming === true) && (
(value !== undefined) ||
(type === "sentinel" && column < last))) { // onNext undefined branch sentinels
pbv.value = value;
onNext(pbv);
}
}
}
}
function invalidate() {
var a = args(arguments);
if (this._lazy) {
return invalidateLazily.call(this, a);
}
var pbv = this.context(),
onNext = a[a.length - 3],
onError = a[a.length - 2],
onCompleted = a[a.length - 1];
a = a.slice(0, -3);
return invalidatePaths.call(this, a, pbv, onNext, onError, onCompleted);
}
var invalidateLazily = immediateToLazy(invalidatePaths);
function invalidatePaths(paths, pbv, onNext, onError, onCompleted) {
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW,
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER,
self, streaming, connected, max,
batches, batch, observers, observer,
contexts, messages, pathSets, misses, errors,
cache, context, parent, value, type, size, expires, timestamp,
messageParent, message, messageValue, messageType, messageSize,
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive,
sizeOffset = 0,
bound, original, optimized, offset,
path, key, column, last, ref, now,
refs, cols, prevs, interrupts, interrupted,
generations, generationsLen, backRefs, pathSet, index, total, miss;
var timeExpireList = this.timeExpireList,
sizeExpireList = this.sizeExpireList,
timeExpireListLength = timeExpireList.length,
sizeExpireListLength = sizeExpireList.length;
self = this;
now = Date.now();
streaming = self._streaming;
connected = self._connected;
cache = self.cache;
batches = self._batches;
max = self.maxSize;
misses = paths.misses || (paths.misses = []);
errors = paths.errors || (paths.errors = []);
refs = paths.refs || (paths.refs = []);
cols = paths.cols || (paths.cols = []);
prevs = paths.prevs || (paths.prevs = []);
interrupts = paths.interrupts || (paths.interrupts = 0);
interrupted = interrupts > 0;
observers = paths.observers || (paths.observers = []);
index = paths.index || (paths.index = 0);
total = paths.length;
context = init_context(paths, pbv.value || {});
contexts = paths.contexts;
bound = refs[-1] = pbv.optimized || pbv.path;
pbv.path = original = [];
pbv.optimized = optimized = [];
pbv.value = undefined;
observers[observers.length] = observer = {
onNext: onNext,
onError: onError,
onCompleted: onCompleted,
streaming: streaming,
paths: 0,
path: bound,
misses: paths.concat(),
errors: errors
};
invalidating: for (; index < total; ++index) {
path = paths[paths.index = index];
last = path.length - 1;
column = path.index || (path.index = 0);
reset_cols();
unlocking: while (column >= 0) {
parent = contexts[column - 1];
descend();
unlock();
path.index = column = ascend(path, column, 0);
reset_cols();
}
path.index = 0;
}
paths.index = 0;
cleanup();
onNext(self);
onCompleted();
return Disposable.empty;
/** @inline */
function ascend(path, column, lower) {
var key;
ascending: for (; column >= lower; --column) {
key = path[column];
if (is_simple_key(key)) {
continue ascending;
}
if (isArray(key)) {
if (++key.index === key.length) {
key = key[key.index = offset = 0];
if (is_simple_key(key)) {
continue ascending;
}
} else {
break ascending;
}
}
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) {
offset = 0;
key.offset = key.from;
continue ascending;
}
break ascending;
}
return column;
}
/** @inline */
function reset_cols() {
var i = cols[interrupts - 1];
while (i >= column) {
if (--interrupts >= 0) {
i = cols[interrupts - 1];
} else {
break;
}
}
interrupted = interrupts > 0;
}
/** @inline */
function reset_refs() {
ref = refs[column - 1];
if (ref !== undefined) {
offset = reset_optimized_from_ref() - column;
}
}
/** @inline */
function find_key(key) {
if (is_complex_key(key)) {
if (isArray(key)) {
key = find_segment_key(key);
if (is_complex_key(key)) {
key = find_range_key(key);
}
} else {
key = find_range_key(key);
}
}
return key;
}
/** @inline */
function find_segment_key(key) {
return key[key.index || (key.index = 0)];
}
/** @inline */
function find_range_key(key) {
return key.offset || (key.offset = key.from || (key.from = 0));
}
/** @inline */
function is_simple_key(key) {
return (typeof key !== 'object' || key == null);
}
/** @inline */
function is_complex_key(key) {
return (typeof key === 'object' && key != null);
}
/** @inline */
function find_context() {
return parent[key];
}
/** @inline */
function find_leaf_context() {
return (
(context = parent[key]) !== undefined && (
((expires = context.$expires) === undefined && context) ||
((expires === EXPIRES_NOW && context)) &&
((expires === EXPIRES_NEVER && context)) &&
((expires > now && context))) ||
// (timeExpireList[timeExpireListLength++] = context) &&
// (context = undefined))) ||
(context = undefined)
);
}
/** @inline */
function find_type() {
return (type = context && context.$type || undefined);
}
/** @inline */
function find_value() {
return (value = (
context !== undefined &&
find_type() === "sentinel"
) ? context.value : context);
}
/** @inline */
function reset_path_from_ref() {
if (path._context === undefined) {
set_back_reference();
}
while (interrupted === true && column === last) {
path = prevs[--interrupts];
column = cols[interrupts];
interrupted = interrupts > 0;
offset = last - column;
last = path.length - 1;
}
}
/** @inline */
function reset_optimized_from_ref() {
var n = optimized.length = ref.length;
for (var i = -1; ++i < n;) {
optimized[i] = ref[i];
}
return n;
}
/** @inline */
function save_optimized(optimized, column, offset, key) {
return (optimized[optimized.length = column + offset] = key);
}
/** @inline */
function save_original(original, column, key) {
return (original[column] = key);
}
/** @inline */
function set_back_reference() {
// create a back reference
backRefs = context.__refsLength || 0;
context['__ref' + backRefs] = path;
context.__refsLength = backRefs + 1;
// create a hard reference
path._context = context;
}
/** @inline */
function stamp() {
context.__access_time = now;
context.__access_count = (context.__access_count || 0) + 1;
}
/** @inline */
function cleanup() {
if ((total = cache.$size) >= max) {
if (batches === undefined || batches.length === 0 || batches.every(function(batch) {
return batch.pendingLoad === false;
})) {
if (timeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up time expire list");
self.root.timeExpireList = timeExpireList =
collect(timeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
total = timeExpireList.total;
}
}
if (sizeExpireListLength > 0) {
if (total >= max) {
// console.log("Falkor GC: cleaning up size expire list");
self.root.sizeExpireList = sizeExpireList =
collect(sizeExpireList, now, 0.8 * max, total, µTime, µRate, µSize);
}
}
}
}
}
/** @inline */
function descend() {
descending: for (; column <= last; ++column) {
key = find_key(path[column]);
// all the columns before the last column
if (column < last) {
if (key == null) {
continue descending;
}
if ((context = find_context(parent, key)) === undefined) {
break descending;
}
value = find_value(context);
if (isArray(value)) {
do {
interrupt();
} while (isArray(value = find_value(context)));
type = undefined;
continue descending;
} else if (type !== undefined) {
break descending;
} else if (interrupted === false) {
contexts[column] = context;
}
type = undefined;
parent = context;
continue descending;
}
// last column
if (key != null) {
context = find_context(parent, key);
}
value = find_value(context);
if (interrupted === true) {
if (context == null || type === "error") {
break descending;
}
reset_path_from_ref();
contexts[column] = parent = context;
if (isArray(value)) {
interrupt();
}
type = undefined;
continue descending;
}
break descending;
}
}
/** @inline */
function init_context(paths, context) {
return contexts === undefined ?
((paths.contexts = contexts = [])[-1] = context) :
((contexts[-1]));
}
/** @inline */
function interrupt() {
refs[column] = ref = value;
if ((context = value._context) !== undefined) {
contexts[column] = parent = context;
} else {
prevs[interrupts] = path;
cols[interrupts++] = column;
interrupted = true;
path = value;
last = path.length - 1;
column = -1;
parent = cache;
context = value = undefined;
}
}
/** @inline */
function unlock() {
var x;
if (context !== undefined) {
sizeOffset = context.$size;
// timeExpireList[timeExpireListLength++] = context;
do {
x = context.__parent;
if ((context.$size -= sizeOffset) <= 0 && context !== cache) {
// mark the node as invalidated so the collect
// algorithm will give it the lowest score.
context.__invalidated = true;
if (x !== undefined) {
delete x[context.__key];
delete context.__parent;
}
}
} while ((context = x) !== undefined);
context = parent[key];
sizeOffset = 0;
}
}
}
function optimize(path, cache) {
var pbv = findPath.call(this, this.path.concat(path || []), cache);
return pbv ? pbv.optimized : path;
}
function value(path, cache) {
var pbv = findPath.call(this, this.path.concat(path || []), cache);
return pbv ? pbv.value : null;
}
function context(path, cache) {
return this._context ? {
path: this.path.concat(),
value: this._context
} :
findPath.call(this, this.path.concat(path), cache);
}
function findPath(the_path, from_cache) {
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW,
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER,
self, streaming, connected, max,
batches, batch, observers, observer,
contexts, messages, pathSets, misses, errors,
cache, context, parent, value, type, size, expires, timestamp,
messageParent, message, messageValue, messageType, messageSize,
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive,
sizeOffset = 0,
bound, original, optimized, offset,
path, key, column, last, ref, now,
refs, cols, prevs, interrupts, interrupted,
generations, generationsLen, backRefs, pathSet, index, total, miss;
var timeExpireList = this.timeExpireList,
sizeExpireList = this.sizeExpireList,
timeExpireListLength = timeExpireList.length,
sizeExpireListLength = sizeExpireList.length;
now = Date.now();
cache = from_cache || this.cache;
path = the_path;
refs = [];
cols = [];
prevs = [];
interrupts = 0;
interrupted = false;
original = [];
optimized = [];
var pbv = {
path: original,
optimized: optimized
};
last = path.length - 1;
column = offset = 0;
parent = context = value = cache;
descend();
unlock();
return pbv;
/** @inline */
function ascend(path, column, lower) {
var key;
ascending: for (; column >= lower; --column) {
key = path[column];
if (is_simple_key(key)) {
continue ascending;
}
if (isArray(key)) {
if (++key.index === key.length) {
key = key[key.index = offset = 0];
if (is_simple_key(key)) {
continue ascending;
}
} else {
break ascending;
}
}
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) {
offset = 0;
key.offset = key.from;
continue ascending;
}
break ascending;
}
return column;
}
/** @inline */
function reset_cols() {
var i = cols[interrupts - 1];
while (i >= column) {
if (--interrupts >= 0) {
i = cols[interrupts - 1];
} else {
break;
}
}
interrupted = interrupts > 0;
}
/** @inline */
function reset_refs() {
ref = refs[column - 1];
if (ref !== undefined) {
offset = reset_optimized_from_ref() - column;
}
}
/** @inline */
function find_key(key) {
if (is_complex_key(key)) {
if (isArray(key)) {
key = find_segment_key(key);
if (is_complex_key(key)) {
key = find_range_key(key);
}
} else {
key = find_range_key(key);
}
}
return key;
}
/** @inline */
function find_segment_key(key) {
return key[key.index || (key.index = 0)];
}
/** @inline */
function find_range_key(key) {
return key.offset || (key.offset = key.from || (key.from = 0));
}
/** @inline */
function is_simple_key(key) {
return (typeof key !== 'object' || key == null);
}
/** @inline */
function is_complex_key(key) {
return (typeof key === 'object' && key != null);
}
/** @inline */
function find_context() {
return parent[key];
}
/** @inline */
function find_leaf_context() {
return (
(context = parent[key]) !== undefined && (
((expires = context.$expires) === undefined && context) ||
((expires === EXPIRES_NOW && context)) &&
((expires === EXPIRES_NEVER && context)) &&
((expires > now && context))) ||
// (timeExpireList[timeExpireListLength++] = context) &&
// (context = undefined))) ||
(context = undefined)
);
}
/** @inline */
function find_type() {
return (type = context && context.$type || undefined);
}
/** @inline */
function find_value() {
return (value = (
context !== undefined &&
find_type() === "sentinel"
) ? context.value : context);
}
/** @inline */
function reset_path_from_ref() {
if (path._context === undefined) {
set_back_reference();
}
while (interrupted === true && column === last) {
path = prevs[--interrupts];
column = cols[interrupts];
interrupted = interrupts > 0;
offset = last - column;
last = path.length - 1;
}
}
/** @inline */
function reset_optimized_from_ref() {
var n = optimized.length = ref.length;
for (var i = -1; ++i < n;) {
optimized[i] = ref[i];
}
return n;
}
/** @inline */
function save_optimized(optimized, column, offset, key) {
return (optimized[optimized.length = column + offset] = key);
}
/** @inline */
function save_original(original, column, key) {
return (original[column] = key);
}
/** @inline */
function set_back_reference() {
// create a back reference
backRefs = context.__refsLength || 0;
context['__ref' + backRefs] = path;
context.__refsLength = backRefs + 1;
// create a hard reference
path._context = context;
}
/** @inline */
function stamp() {
context.__access_time = now;
context.__access_count = (context.__access_count || 0) + 1;
}
/** @inline */
function descend() {
descending: for (; column <= last; ++column) {
key = find_key(path[column]);
// all the columns before the last column
if (column < last) {
if (key == null) {
continue descending;
}
save_optimized(optimized, column, offset, key);
if (interrupted === false) {
save_original(original, column, key);
}
if ((context = find_context(parent, key)) === undefined) {
short_circuit();
break descending;
}
value = find_value(context);
if (isArray(value)) {
do {
stamp();
interrupt();
} while (isArray(value = find_value(context)));
type = undefined;
continue descending;
} else if (type !== undefined) {
short_circuit();
break descending;
}
type = undefined;
parent = context;
continue descending;
}
// last column
if (key != null) {
save_optimized(optimized, column, offset, key);
save_original(original, column, key);
context = find_leaf_context(parent, key);
}
value = find_value(context);
if (interrupted === true) {
if (context == null || type === "error") {
short_circuit_int();
break descending;
}
reset_path_from_ref();
parent = context;
if (isArray(value)) {
interrupt();
}
type = undefined;
continue descending;
}
break descending;
}
}
/** @inline */
function interrupt() {
refs[column] = ref = value;
if ((context = value._context) !== undefined) {
offset = reset_optimized_from_ref() - column - 1;
parent = context;
} else {
prevs[interrupts] = path;
cols[interrupts++] = column;
interrupted = true;
path = value;
last = path.length - 1;
offset = 0;
column = -1;
parent = cache;
context = value = undefined;
}
}
/** @inline */
function save_missing() {
var i, j, nulls = 0,
n = optimized.length,
miss = new Array(n + last - column);
for (i = j = -1; ++i < n;) {
key = optimized[i];
if (key != null) {
miss[++j] = key;
} else {
--nulls;
}
}
i = column;
while (++i <= last) {
key = path[i];
if (key != null) {
miss[++j] = key;
} else {
--nulls;
}
}
miss.length += nulls;
return miss;
}
/** @inline */
function short_circuit() {
if (interrupted === true) {
short_circuit_int();
} else {
optimized.length = column + offset + 1;
}
}
/** @inline */
function short_circuit_path() {
original.length = column + 1;
optimized.length = column + offset + 1;
}
/** @inline */
function short_circuit_int() {
path = prevs[0] || path;
column = cols[0];
last = path.length - 1;
optimized.length = column + offset + 1;
}
/** @inline */
function unlock() {
if (context == null) {
pbv.value = undefined;
pbv.optimized = save_missing();
} else {
stamp();
pbv.value = value;
}
}
}
function insert(pathOrPBV, value, cache) {
var path;
if (arguments.length === 1) {
value = pathOrPBV.value;
path = pathOrPBV.path;
} else if (arguments.length === 2 && pathOrPBV.path !== undefined) {
cache = value;
value = pathOrPBV.value;
path = pathOrPBV.path;
} else {
path = pathOrPBV;
}
var generations = path.generations || [];
path = this.path.concat(path);
path.generations = generations;
var pbv = setPath.call(this, path, value, cache || this.cache),
generationsLen = generations.length;
update_generations();
return pbv; /** @inline */
function update_generations() {
var i = generations.length,
ref;
while ((ref = generations[--i]) !== undefined) {
ref.__tagged = undefined;
ref.__generation = (ref.__generation || 0) + 1;
}
generations.length = generationsLen = 0;
}
}
function setPath(the_path, newValue, from_cache) {
var EXPIRES_NOW = PathEvaluator.EXPIRES_NOW,
EXPIRES_NEVER = PathEvaluator.EXPIRES_NEVER,
self, streaming, connected, max,
batches, batch, observers, observer,
contexts, messages, pathSets, misses, errors,
cache, context, parent, value, type, size, expires, timestamp,
messageParent, message, messageValue, messageType, messageSize,
messageExpires, messageTimestamp, typeofMessageValue, messageValueIsPrimitive,
sizeOffset = 0,
bound, original, optimized, offset,
path, key, column, last, ref, now,
refs, cols, prevs, interrupts, interrupted,
generations, generationsLen, backRefs, pathSet, index, total, miss;
var timeExpireList = this.timeExpireList,
sizeExpireList = this.sizeExpireList,
timeExpireListLength = timeExpireList.length,
sizeExpireListLength = sizeExpireList.length;
cache = from_cache || this.cache;
path = the_path;
refs = [];
cols = [];
prevs = [];
interrupts = 0;
interrupted = false;
original = [];
optimized = [];
generations = path.generations || [];
generationsLen = generations.length;
var pbv = {
path: original,
optimized: optimized
};
now = Date.now();
parent = context = value = cache;
message = newValue;
last = path.length - 1;
column = offset = 0;
descend();
unlock();
pbv.value = value;
return pbv;
/** @inline */
function ascend(path, column, lower) {
var key;
ascending: for (; column >= lower; --column) {
key = path[column];
if (is_simple_key(key)) {
continue ascending;
}
if (isArray(key)) {
if (++key.index === key.length) {
key = key[key.index = offset = 0];
if (is_simple_key(key)) {
continue ascending;
}
} else {
break ascending;
}
}
if (++key.offset > (key.to || (key.to = key.from + (key.length || 1) - 1))) {
offset = 0;
key.offset = key.from;
continue ascending;
}
break ascending;
}
return column;
}
/** @inline */
function reset_cols() {
var i = cols[interrupts - 1];
while (i >= column) {
if (--interrupts >= 0) {
i = cols[interrupts - 1];
} else {
break;
}
}
interrupted = interrupts > 0;
}
/** @inline */
function reset_refs() {
ref = refs[column - 1];
if (ref !== undefined) {
offset = reset_optimized_from_ref() - column;
}
}
/** @inline */
function find_key(key) {
if (is_complex_key(key)) {
if (isArray(key)) {
key = find_segment_key(key);
if (is_complex_key(key)) {
key = find_range_key(key);
}
} else {
key = find_range_key(key);
}
}
return key;
}
/** @inline */
function find_segment_key(key) {
return key[key.index || (key.index = 0)];
}
/** @inline */
function find_range_key(key) {
return key.offset || (key.offset = key.from || (key.from = 0));
}
/** @inline */
function is_simple_key(key) {
return (typeof key !== 'object' || key == null);
}
/** @inline */
function is_complex_key(key) {
return (typeof key === 'object' && key != null);
}
/** @inline */
function find_context() {
return parent[key];
}
/** @inline */
function find_leaf_context() {
return (
(context = parent[key]) !== undefined && (
((expires = context.$expires) === undefined && context) ||
((expires === EXPIRES_NOW && context)) &&
((expires === EXPIRES_NEVER && context)) &&
((expires > now && context))) ||
// (timeExpireList[timeExpireListLength++] = context) &&
// (context = undefined))) ||
(context = undefined)
);
}
/** @inline */
function find_type() {
return (type = context && context.$type || undefined);
}
/** @inline */
function find_value() {
return (value = (
context !== undefined &&
find_type() === "sentinel"
) ? context.value : context);
}
/** @inline */
function reset_path_from_ref() {
if (path._context === undefined) {
set_back_reference();
}
while (interrupted === true && column === last) {
path = prevs[--interrupts];
column = cols[interrupts];
interrupted = interrupts > 0;
offset = last - column;
last = path.length - 1;
}
}
/** @inline */
function reset_optimized_from_ref() {
var n = optimized.length = ref.length;
for (var i = -1; ++i < n;) {
optimized[i] = ref[i];
}
return n;
}
/** @inline */
function save_optimized(optimized, column, offset, key) {
return (optimized[optimized.length = column + offset] = key);
}
/** @inline */
function save_original(original, column, key) {
return (original[column] = key);
}
/** @inline */
function set_back_reference() {
// create a back reference
backRefs = context.__refsLength || 0;
context['__ref' + backRefs] = path;
context.__refsLength = backRefs + 1;
// create a hard reference
path._context = context;
}
/** @inline */
function stamp() {
context.__access_time = now;
context.__access_count = (context.__access_count || 0) + 1;
}
/** @inline */
function adjust_contexts() {
context.__generation = (context.__generation || 0) + 1;
do {
context.$size = (context.$size || 0) + sizeOffset;
context = context.__parent;
} while (context !== undefined);
context = parent[key];
var stack = [],
frame, refs, ref,
depth = 0,
i, n;
adjusting: while (depth >= 0) {
if ((frame = stack[depth]) === undefined) {
i = -1;
n = context.__refsLength || 0;
refs = [];
while (++i < n) {
ref = context['__ref' + i];
if (ref && ref.__tagged === undefined) {
ref.__tagged = true;
generations[generationsLen++] = refs[i] = ref;
}
}
if ((ref = context.__parent) !== undefined && ref.__tagged === undefined) {
ref.__tagged = true;
generations[generationsLen++] = refs[i] = ref;
}
frame = stack[depth] = {
context: context,
refs: refs
};
}
refs = frame.refs;
if ((context = refs[refs.length - 1]) !== undefined) {
refs.length -= 1;
++depth;
continue adjusting;
}
stack[depth--] = undefined;
}
context = parent[key];
sizeOffset = 0;
}
/** @inline */
function descend() {
descending: for (; column <= last; ++column) {
key = find_key(path[column]);
// all the columns before the last column
if (column < last) {
if (key == null) {
continue descending;
}
save_optimized(optimized, column, offset, key);
if (interrupted === false) {
save_original(original, column, key);
}
if ((context = find_context(parent, key)) === undefined) {
insert_empty_branch();
}
value = find_value(context);
if (isArray(value)) {
interrupt();
type = undefined;
continue descending;
} else if (type !== undefined) {
insert_empty_branch();
}
type = undefined;
parent = context;
continue descending;
}
// last column
if (key != null) {
save_optimized(optimized, column, offset, key);
context = find_leaf_context(parent, key);
if (interrupted === false) {
if (context === undefined) {
size = 0;
} else {
replace_context(message);
}
insert_message();
if (interrupted === false && type === undefined) {
context.$type = type = "leaf";
}
}
}
value = find_value(context);
if (interrupted === true) {
if (context == null || type === "error") {
insert_empty_branch();
}
reset_path_from_ref();
parent = context;
if (isArray(value)) {
interrupt();
}
type = undefined;
continue descending;
}
save_original(original, column, key);
break descending;
}
}
/** @inline */
function find_message() {
return messageParent && messageParent[key];
}
/** @inline */
function find_message_value() {
return (messageValue = (
(message !== undefined) &&
find_message_type() === "sentinel"
) ? message.value : message);
}
/** @inline */
function find_message_type() {
return (messageType = message && message.$type || undefined);
}
/** @inline */
function find_message_size() {
messageSize = 1;
if (message_value_has_length()) {
messageSize = messageValue.length;
} else if (message !== messageValue && typeofMessageValue === "object" && messageValue !== null) {
messageSize = 0;
}
if (messageType !== undefined) {
messageSize += sentinelSize;
} else if (message_value_is_primitive()) {
messageType = "sentinel";
messageSize += sentinelSize;
message = {
"$type": messageType,
"value": messageValue
};
} else if (!message_value_is_array()) {
messageSize = message.$size || sentinelSize;
}
type = messageType;
return messageSize;
}
/** @inline */
function link_context() {
// link the child to the parent
context.__parent = parent;
context.__key = key;
}
/** @inline */
function message_value_is_leaf() {
return (message_value_is_primitive() || message_value_is_array());
}
/** @inline */
function message_value_has_length() {
return ((typeof_message_value() === 'string') || message_value_is_array());
}
/** @inline */
function message_value_is_array() {
return (isArray(messageValue) && (typeofMessageValue = "array"));
}
/** @inline */
function message_value_is_primitive() {
return (messageValueIsPrimitive = (typeof_message_value() !== 'object' || messageValue === null));
}
/** @inline */
function init_stamp() {
sizeExpireList[sizeExpireListLength++] = context;
expires = context.$expires;
if (expires !== undefined &&
expires !== EXPIRES_NEVER &&
expires !== EXPIRES_NOW) {
if (expires < 0) {
expires = now + (expires * -1);
}
context.$expires = expires;
}
stamp();
}
/** @inline */
function insert_empty_branch() {
parent[key] = context = {
"$size": 0
};
link_context();
}
/** @inline */
function insert_message() {
value = find_message_value();
messageSize = find_message_size();
message.$size = size;
sizeOffset += (messageSize - size);
parent[key] = context = message;
link_context();
adjust_contexts();
context.$type = type = (type || "leaf");
if (context.__access_time === undefined) {
init_stamp();
} else {
stamp();
}
}
/** @inline */
function interrupt() {
refs[column] = value;
prevs[interrupts] = path;
cols[interrupts++] = column;
interrupted = true;
path = value;
last = path.length - 1;
offset = 0;
column = -1;
parent = cache;
}
/** @inline */
function replace_context(message) {
size = context.$size || 0;
timestamp = context.$timestamp || 0;
if (message != null) {
migrate_references(context, message);
}
if (isArray(value)) {
delete_hard_link(context);
}
// context.$expires = -1;
// timeExpireList[timeExpireListLength++] = context;
context = undefined;
}
/** @inline */
function migrate_references(context, message) {
var mBackRefs = message.__refsLength || 0,
cBackRefs = context.__refsLength || 0,
refs = -1,
refKey, ref;
while (++refs < cBackRefs) {
refKey = "__ref" + refs;
ref = context[refKey];
ref._context = message;
message["__ref" + (mBackRefs + refs)] = ref;
delete context[refKey];
}
}
/** @inline */
function delete_hard_link(reference) {
var destination = reference._context;
if (destination != null) {
var refIndex = (reference.__refIndex || 0) - 1,
refsLen = (destination.__refsLength || 0) - 1;
while (++refIndex <= refsLen) {
destination["__ref" + refIndex] = destination["__ref" + refIndex + 1];
}
destination.__refsLength = refsLen;
if (refsLen < 0) {
delete destination.__ref0;
delete destination.__refsLength;
}
delete reference.__refIndex;
delete reference._context;
}
}
/** @inline */
function typeof_message_value() {
return (typeofMessageValue = typeof find_message_value());
}
/** @inline */
function unlock() {
if (context != null) {
if (context.__access_time === undefined) {
init_stamp();
} else {
stamp();
}
}
}
}
function call() {
return this._lazy ?
callLazily.apply(this, arguments) :
callImmediately.apply(
this,
arguments
);
}
var callLazily = immediateToLazy(callImmediately);
function callImmediately(path, callArgs, suffixes, paths, pbv, onNext, onError, onCompleted) {
var a = args(arguments);
if (a.length === 6) {
onCompleted = a.pop();
onError = a.pop();
onNext = a.pop();
pbv = a.pop();
suffixes = [];
paths = [];
} else if (a.length === 7) {
onCompleted = a.pop();
onError = a.pop();
onNext = a.pop();
pbv = a.pop();
paths = [];
}
suffixes = suffixes || [];
paths = paths || [];
var self = this,
bound = pbv.optimized || pbv.path || [];
pbv = {
path: [],
value: this.cache
};
var extras = paths.map(function(x) {
return bound.concat(x);
}),
invalidateSubscription = Disposable.empty,
setSubscription = Disposable.empty,
loadSubscription = this.loader.
call(bound.concat(path), callArgs, suffixes, extras).
subscribe(function(pbf) {
var invalidated = pbf.invalidated || [];
if (invalidated.length > 0) {
// remove elements at the invalidated paths
return (invalidateSubscription = invalidatePaths.call(self, invalidated, pbv, function(self) {
return (setSubscription = setCallResponse.call(self, pbf));
}, onError, noop));
}
return (setSubscription = setCallResponse.call(self, pbf));
}, onError, noop);
return Disposable.create(function(x) {
loadSubscription.dispose();
invalidateSubscription.dispose();
setSubscription.dispose();
});
function setCallResponse(pbf) {
pbf = Object.create(pbf);
var error = pbf.error,
serverErrors = [];
// TODO: retry certain errors
while (error !== undefined) {
if (error.innerErrors) {
serverErrors.push.apply(serverErrors, error.innerErrors);
} else {
error.$type = "error";
setPath.call(self, error.path || error.pql, error, pbf.value);
}
error = serverErrors.pop();
}
pbf.paths.errors = [];
pbf.paths.pathSet = undefined;
pbf.paths.observers = undefined;
return setPBFRoot.call(self, pbf, onNext, onError, onCompleted);
}
}
function collapse(list) {
return rangeCollapse(buildQueries(buildTree(list)));
}
/**
* Collapse ranges, e.g. when there is a continuous range
* in an array, turn it into an object instead
*
* [1,2,3,4,5,6] => {"from":1, "to":6}
*
*/
function rangeCollapse(paths) {
paths.forEach(function(path) {
path.forEach(function(elt, index) {
var range;
if (Array.isArray(elt) && elt.every(isNumber) && allUnique(elt)) {
elt.sort(function(a, b) {
return a - b;
});
if (elt[elt.length - 1] - elt[0] === elt.length - 1) {
// create range
range = {};
range.from = elt[0];
range.to = elt[elt.length - 1];
path[index] = range;
}
}
});
});
return paths;
}
/**
* Return true if argument is a number
*/
function isNumber(val) {
return typeof val === "number";
}
/**
* allUnique
* return true if every number in an array is unique
*/
function allUnique(arr) {
var hash = {},
index,
len;
for (index = 0, len = arr.length; index < len; index++) {
if (hash[arr[index]]) {
return false;
}
hash[arr[index]] = true;
}
return true;
}
/**
* Build the tree associated with
* all queries. Only requires
* traversing the list of queries
* once
*/
function buildTree(list) {
return list.reduce(insertPath, {});
}
/**
* A helper function for inserting a
* path into the tree. If the path
* has a grouping (i.e. it's already
* partially collapsed) it adds the
* elements individually to the tree
*/
function insertPath(root, path) {
var children, child, i, n, j, k,
rest = path.slice(1);
if (path.length !== 0) {
if ((child = path[0]) == null) {
return root;
}
if (typeof child !== 'object') {
insertPath(root[child] || (root[child] = {}), rest);
} else if (Array.isArray(child) && (children = child)) {
i = -1;
n = children.length;
while (++i < n) {
if (typeof(child = children[i]) === 'object') {
j = child.from || 0;
k = child.to || (j + child.length);
while (j <= k) {
insertPath(root[j] || (root[j] = {}), rest);
++j;
}
} else {
insertPath(root[child] || (root[child] = {}), rest);
}
}
} else {
i = child.from || 0;
n = child.to || (i + child.length);
while (i <= n) {
insertPath(root[i] || (root[i] = {}), rest);
++i;
}
}
}
return root;
}
/**
* Sort a list-of-lists
* Used for generating a unique hash
* key for each subtree; used by the
* memoization
*/
function sortLol(lol) {
return lol.reduce(function(result, curr) {
if (curr instanceof Array) {
result.push(sortLol(curr).slice(0).sort());
return result;
}
return result.concat(curr);
}, []).slice(0).sort();
}
/**
* Create a unique hash key for a set
* of paths
*/
function createKey(list) {
return JSON.stringify(sortLol(list));
}
/**
* Builds the set of collapsed
* queries by traversing the tree
* once
*/
var charPattern = /\D/i;
/* jshint forin: false */
function buildQueries(root) {
var children = Object.keys(root).filter(function(key) {
return key !== '__observers';
}),
child, memo, paths, key, childIsNum,
list, head, tail, copy, results,
i = -1,
n = children.length,
j, k, x;
if (n === 0 || Array.isArray(root) === true) {
return [
[]
];
}
memo = {};
while (++i < n) {
child = children[i];
paths = buildQueries(root[child]);
key = createKey(paths);
childIsNum = typeof child === 'string' && !charPattern.test(child);
if ((list = memo[key]) && (head = list.head)) {
head[head.length] = childIsNum ? parseInt(child, 10) : child;
} else {
memo[key] = {
head: [childIsNum ? parseInt(child, 10) : child],
tail: paths
};
}
}
results = [];
for (x in memo) {
head = (list = memo[x]).head;
tail = list.tail;
i = -1;
n = tail.length;
while (++i < n) {
list = tail[i];
j = -1;
k = list.length;
if (head[0] === '') {
copy = [];
} else {
copy = [head.length === 1 ? head[0] : head];
while (++j < k) {
copy[j + 1] = list[j];
}
}
results[results.length] = copy;
}
}
return results;
}
function collect(nodes, now, max, total, T, R, S) {
// console.log("Falkor GC: Running GC routine on " + nodes.length + " items with " + total + " total size at " + Date.now());
var to = 0;
nodes.
sort(function(a, b) {
return a.__invalidated === true ?
-1 : b.invalidated === true ?
1 : a.__access_time - b.__access_time;
}).
every(function(x, i) {
var offset = x.$size,
backRefs, ref, y;
total -= offset;
to = i;
x.__invalidated = true;
do {
y = x.__parent;
if (x.__invalidated === true) {
// Remove x from the falkor cache.
if (y !== undefined) {
// console.log("Falkor GC: Removing " + stringify(x));
delete y[x.__key];
delete x.__parent;
}
// Remove all back references.
backRefs = (x.__refsLength || 0);
while (--backRefs >= 0) {
if ((ref = x['__ref' + backRefs]) !== undefined) {
delete ref._context;
delete x['__ref' + backRefs];
}
}
delete x.__refsLength;
}
x.$size = (x.$size - offset);
} while ((x = y) !== undefined);
return total > max;
});
// console.log("Falkor GC: removed " + to + " elements.");
// console.log("Falkor GC: new size is " + total + ".");
return nodes.slice(to);
// return nodes;
// console.log("Falkor GC: Running GC routine on " + nodes.length + " items with " + total + " total size.");
/*
var from = 0, to = nodes.length - 1, k = to >>> 1,
x, y, r, w, m, mid,
scores = [], score, offset, backRefs;
// if from == to we reached the kth element
while(from < to) {
r = from;
w = to;
// choose an arbitrary pivot.
// an unsigned bitshift divides by 2 and discards the remainder.
m = (r + w) >>> 1;
// compute a score for the pivot
mid = scores[m] || (scores[m] = getScore(nodes[m]));
// stop if the reader and writer meet
while (r < w) {
// compute a score for the node we're comparing against
score = scores[r] || (scores[r] = getScore(nodes[r]));
if (score >= mid) {
x = nodes[r];
// put the large values at the end
scores[r] = scores[w];
scores[w] = score;
nodes[r] = nodes[w];
nodes[w] = x;
--w;
} else {
// the value is smaller than the pivot, skip
++r;
}
}
// compute a score for the evaluated reader
score = scores[r] || (scores[r] = getScore(nodes[r]));
// if we stepped up (++r) we need to step one down
if (score > mid) {
--r;
}
// the r pointer is on the end of the first k elements
if (k <= r) {
to = r;
} else {
from = r + 1;
}
}
from = -1;
to = nodes.length;
// remove elements until we've hit our target
// cache size, or there are no more elements
// to remove.
while(total > max && ++from < to) {
total -= (offset = (x = nodes[from]).$size);
x.__invalidated = true;
do {
y = x.__parent;
x.$size = (x.$size - offset);
if (x.__invalidated === true) {
// Remove x from the falkor cache.
if(y !== undefined) {
// console.log("Falkor GC: Removing " + stringify(x) + " at " + x.__access_time);
delete y[x.__key];
delete x.__parent;
}
// Remove all back references.
backRefs = (x.__refsLength || 0);
while (--backRefs >= 0) {
delete x['__ref' + backRefs]._context;
delete x['__ref' + backRefs];
}
delete x.__refsLength;
}
} while ((x = y) !== undefined);
}
// console.log("Falkor GC: removed " + from + " elements.");
// console.log("Falkor GC: new size is " + total + ".");
nodes = nodes.slice(from);
nodes.total = total;
return nodes;
*/
/** @inline */
/*
function getScore(x) {
return (x.__invalidated === true || x.$expires <= now) ?
MIN_SAFE_INTEGER :
-Math.floor(Math.sqrt(
Math.pow(T * (now - x.__access_time), 2) +
Math.pow(Math.pow(R * x.__access_count, 3) + Math.pow(S * x.$size, 3), 2)
));
}
*/
}
module.exports = PathEvaluator;
},{"../src/rx.ultralite":2}],2:[function(_dereq_,module,exports){
(function (global){
/**
Rx Ultralite!
Rx on the Roku Tyler throws this (possibly related to browserify-ing Rx):
Error: 'TypeError: 'undefined' is not a function (evaluating 'root.document.createElement('script')')'
*/
var Rx;
if (typeof window !== "undefined" && typeof window["Rx"] !== "undefined") {
// Browser environment
Rx = window["Rx"];
} else if(typeof global !== "undefined" && typeof global["Rx"] !== "undefined") {
// Node.js environment
Rx = global["Rx"];
} else {
if(typeof global !== "undefined" && typeof global.require === "function") {
try {
// Node.js environment with rx module
Rx = global["require"]("rx");
} catch(e) {
Rx = undefined;
}
}
}
if(Rx === undefined) {
Rx = {
I: function() { return arguments[0]; },
Disposable: (function() {
function Disposable(a) {
this.action = a;
}
Disposable.create = function(a) {
return new Disposable(a);
}
Disposable.empty = new Disposable(function(){});
Disposable.prototype.dispose = function() {
if(typeof this.action === 'function') {
this.action();
}
}
return Disposable;
})(),
Observable: (function() {
function Observable(s) {
this.s = s;
}
Observable.create = Observable.createWithDisposable = function(s) {
return new Observable(s);
}
Observable.fastCreateWithDisposable = Observable.create;
Observable.fastReturnValue = function(value) {
return Observable.create(function(observer) {
observer.onNext(value);
observer.onCompleted();
});
}
Observable.prototype.subscribe = function(n, e, c) {
return this.s(
(n != null && typeof n === 'object') ?
n :
Rx.Observer.create(n, e, c)
);
}
Observable.prototype.catchException = function(next) {
var self = this;
return Observable.create(function(o) {
return self.subscribe(
function(x) { o.onNext(x); },
function(e) {
return (
(typeof next === 'function') ?
next(e) : next
).subscribe(o);
},
function() { o.onCompleted(); });
});
}
return Observable;
})(),
Observer: (function() {
function Observer(n, e, c) {
this.onNext = n || Rx.I;
this.onError = e || Rx.I;
this.onCompleted = c || Rx.I;
}
Observer.create = function(n, e, c) {
return new Observer(n, e, c);
}
return Observer;
})(),
Subject: (function(){
function Subject() {
this.observers = [];
}
Subject.prototype.subscribe = function(subscriber) {
var a = this.observers,
n = a.length;
a[n] = subscriber;
return {
dispose: function() {
a.splice(n, 1);
}
}
};
Subject.prototype.onNext = function(x) {
var listeners = this.observers.concat(),
i = -1, n = listeners.length;
while(++i < n) {
listeners[i].onNext(x);
}
};
Subject.prototype.onError = function(e) {
var listeners = this.observers.concat(),
i = -1, n = listeners.length;
this.observers.length = 0;
while(++i < n) {
listeners[i].onError(e);
}
};
Subject.prototype.onCompleted = function() {
var listeners = this.observers.concat(),
i = -1, n = listeners.length;
this.observers.length = 0;
while(++i < n) {
listeners[i].onCompleted();
}
};
})()
};
}
module.exports = Rx;
}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}]},{},[1])
(1)
});
alert(falkor.PathEvaluator);
var pathEvaluator = new falkor.PathEvaluator();
alert();
pathEvaluator.deserialize({
videos: {
"123": {
name: "Die Hard"
}
}
});
var result = pathEvaluator.get(["videos",123,"name"]);
require=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);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){function EventEmitter(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;EventEmitter.defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError("n must be a positive number");this._maxListeners=n;return this};EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(!this._events)this._events={};if(type==="error"){if(!this._events.error||isObject(this._events.error)&&!this._events.error.length){er=arguments[1];if(er instanceof Error){throw er}else{throw TypeError('Uncaught, unspecified "error" event.')}return false}}handler=this._events[type];if(isUndefined(handler))return false;if(isFunction(handler)){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:len=arguments.length;args=new Array(len-1);for(i=1;i<len;i++)args[i-1]=arguments[i];handler.apply(this,args)}}else if(isObject(handler)){len=arguments.length;args=new Array(len-1);for(i=1;i<len;i++)args[i-1]=arguments[i];listeners=handler.slice();len=listeners.length;for(i=0;i<len;i++)listeners[i].apply(this,args)}return true};EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events)this._events={};if(this._events.newListener)this.emit("newListener",type,isFunction(listener.listener)?listener.listener:listener);if(!this._events[type])this._events[type]=listener;else if(isObject(this._events[type]))this._events[type].push(listener);else this._events[type]=[this._events[type],listener];if(isObject(this._events[type])&&!this._events[type].warned){var m;if(!isUndefined(this._maxListeners)){m=this._maxListeners}else{m=EventEmitter.defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);console.trace()}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError("listener must be a function");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit("removeListener",type,listener)}else if(isObject(list)){for(i=length;i-->0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1)}if(this._events.removeListener)this.emit("removeListener",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key==="removeListener")continue;this.removeAllListeners(key)}this.removeAllListeners("removeListener");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else{while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.listenerCount=function(emitter,type){var ret;if(!emitter._events||!emitter._events[type])ret=0;else if(isFunction(emitter._events[type]))ret=1;else ret=emitter._events[type].length;return ret};function isFunction(arg){return typeof arg==="function"}function isNumber(arg){return typeof arg==="number"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],2:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){var source=ev.source;if((source===window||source===null)&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];function noop(){}process.on=noop;process.once=noop;process.off=noop;process.emit=noop;process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],3:[function(require,module,exports){(function(process,global){(function(undefined){var objectTypes={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false};var root=objectTypes[typeof window]&&window||this,freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports,freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module,moduleExports=freeModule&&freeModule.exports===freeExports&&freeExports,freeGlobal=objectTypes[typeof global]&&global;if(freeGlobal&&(freeGlobal.global===freeGlobal||freeGlobal.window===freeGlobal)){root=freeGlobal}var Rx={internals:{},config:{Promise:root.Promise},helpers:{}};var noop=Rx.helpers.noop=function(){},notDefined=Rx.helpers.notDefined=function(x){return typeof x==="undefined"},isScheduler=Rx.helpers.isScheduler=function(x){return x instanceof Rx.Scheduler},identity=Rx.helpers.identity=function(x){return x},pluck=Rx.helpers.pluck=function(property){return function(x){return x[property]}},just=Rx.helpers.just=function(value){return function(){return value}},defaultNow=Rx.helpers.defaultNow=Date.now,defaultComparer=Rx.helpers.defaultComparer=function(x,y){return isEqual(x,y)},defaultSubComparer=Rx.helpers.defaultSubComparer=function(x,y){return x>y?1:x<y?-1:0},defaultKeySerializer=Rx.helpers.defaultKeySerializer=function(x){return x.toString()},defaultError=Rx.helpers.defaultError=function(err){throw err},isPromise=Rx.helpers.isPromise=function(p){return!!p&&typeof p.then==="function"},asArray=Rx.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},not=Rx.helpers.not=function(a){return!a};var sequenceContainsNoElements="Sequence contains no elements.";var argumentOutOfRange="Argument out of range";var objectDisposed="Object has been disposed";function checkDisposed(){if(this.isDisposed){throw new Error(objectDisposed)}}var $iterator$=typeof Symbol==="function"&&Symbol.iterator||"_es6shim_iterator_";if(root.Set&&typeof(new root.Set)["@@iterator"]==="function"){$iterator$="@@iterator"}var doneEnumerator={done:true,value:undefined};var argsClass="[object Arguments]",arrayClass="[object Array]",boolClass="[object Boolean]",dateClass="[object Date]",errorClass="[object Error]",funcClass="[object Function]",numberClass="[object Number]",objectClass="[object Object]",regexpClass="[object RegExp]",stringClass="[object String]";var toString=Object.prototype.toString,hasOwnProperty=Object.prototype.hasOwnProperty,supportsArgsClass=toString.call(arguments)==argsClass,suportNodeClass,errorProto=Error.prototype,objectProto=Object.prototype,propertyIsEnumerable=objectProto.propertyIsEnumerable;try{suportNodeClass=!(toString.call(document)==objectClass&&!({toString:0}+""))}catch(e){suportNodeClass=true}var shadowedProps=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"];var nonEnumProps={};nonEnumProps[arrayClass]=nonEnumProps[dateClass]=nonEnumProps[numberClass]={constructor:true,toLocaleString:true,toString:true,valueOf:true};nonEnumProps[boolClass]=nonEnumProps[stringClass]={constructor:true,toString:true,valueOf:true};nonEnumProps[errorClass]=nonEnumProps[funcClass]=nonEnumProps[regexpClass]={constructor:true,toString:true};nonEnumProps[objectClass]={constructor:true};var support={};(function(){var ctor=function(){this.x=1},props=[];ctor.prototype={valueOf:1,y:1};for(var key in new ctor){props.push(key)}for(key in arguments){}support.enumErrorProps=propertyIsEnumerable.call(errorProto,"message")||propertyIsEnumerable.call(errorProto,"name");support.enumPrototypes=propertyIsEnumerable.call(ctor,"prototype");support.nonEnumArgs=key!=0;support.nonEnumShadows=!/valueOf/.test(props)})(1);function isObject(value){var type=typeof value;return value&&(type=="function"||type=="object")||false}function keysIn(object){var result=[];if(!isObject(object)){return result}if(support.nonEnumArgs&&object.length&&isArguments(object)){object=slice.call(object)}var skipProto=support.enumPrototypes&&typeof object=="function",skipErrorProps=support.enumErrorProps&&(object===errorProto||object instanceof Error);for(var key in object){if(!(skipProto&&key=="prototype")&&!(skipErrorProps&&(key=="message"||key=="name"))){result.push(key)}}if(support.nonEnumShadows&&object!==objectProto){var ctor=object.constructor,index=-1,length=shadowedProps.length;if(object===(ctor&&ctor.prototype)){var className=object===stringProto?stringClass:object===errorProto?errorClass:toString.call(object),nonEnum=nonEnumProps[className]}while(++index<length){key=shadowedProps[index];if(!(nonEnum&&nonEnum[key])&&hasOwnProperty.call(object,key)){result.push(key)}}}return result}function internalFor(object,callback,keysFunc){var index=-1,props=keysFunc(object),length=props.length;while(++index<length){var key=props[index];if(callback(object[key],key,object)===false){break}}return object}function internalForIn(object,callback){return internalFor(object,callback,keysIn)}function isNode(value){return typeof value.toString!="function"&&typeof(value+"")=="string"}function isArguments(value){return value&&typeof value=="object"?toString.call(value)==argsClass:false}if(!supportsArgsClass){isArguments=function(value){return value&&typeof value=="object"?hasOwnProperty.call(value,"callee"):false}}function isFunction(value){return typeof value=="function"||false}if(isFunction(/x/)){isFunction=function(value){return typeof value=="function"&&toString.call(value)==funcClass}}var isEqual=Rx.internals.isEqual=function(x,y){return deepEquals(x,y,[],[])};function deepEquals(a,b,stackA,stackB){if(a===b){return a!==0||1/a==1/b}var type=typeof a,otherType=typeof b;if(a===a&&(a==null||b==null||type!="function"&&type!="object"&&otherType!="function"&&otherType!="object")){return false}var className=toString.call(a),otherClass=toString.call(b);if(className==argsClass){className=objectClass}if(otherClass==argsClass){otherClass=objectClass}if(className!=otherClass){return false}switch(className){case boolClass:case dateClass:return+a==+b;case numberClass:return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case regexpClass:case stringClass:return a==String(b)}var isArr=className==arrayClass;if(!isArr){if(className!=objectClass||!support.nodeClass&&(isNode(a)||isNode(b))){return false}var ctorA=!support.argsObject&&isArguments(a)?Object:a.constructor,ctorB=!support.argsObject&&isArguments(b)?Object:b.constructor;if(ctorA!=ctorB&&!(hasOwnProperty.call(a,"constructor")&&hasOwnProperty.call(b,"constructor"))&&!(isFunction(ctorA)&&ctorA instanceof ctorA&&isFunction(ctorB)&&ctorB instanceof ctorB)&&("constructor"in a&&"constructor"in b)){return false}}var initedStack=!stackA;stackA||(stackA=[]);stackB||(stackB=[]);var length=stackA.length;while(length--){if(stackA[length]==a){return stackB[length]==b}}var size=0;result=true;stackA.push(a);stackB.push(b);if(isArr){length=a.length;size=b.length;result=size==length;if(result){while(size--){var index=length,value=b[size];if(!(result=deepEquals(a[size],value,stackA,stackB))){break}}}}else{internalForIn(b,function(value,key,b){if(hasOwnProperty.call(b,key)){size++;return result=hasOwnProperty.call(a,key)&&deepEquals(a[key],value,stackA,stackB)}});if(result){internalForIn(a,function(value,key,a){if(hasOwnProperty.call(a,key)){return result=--size>-1}})}}stackA.pop();stackB.pop();return result}var slice=Array.prototype.slice;function argsOrArray(args,idx){return args.length===1&&Array.isArray(args[idx])?args[idx]:slice.call(args)}var hasProp={}.hasOwnProperty;var inherits=this.inherits=Rx.internals.inherits=function(child,parent){function __(){this.constructor=child}__.prototype=parent.prototype;child.prototype=new __};var addProperties=Rx.internals.addProperties=function(obj){var sources=slice.call(arguments,1);for(var i=0,len=sources.length;i<len;i++){var source=sources[i];for(var prop in source){obj[prop]=source[prop]}}};var addRef=Rx.internals.addRef=function(xs,r){return new AnonymousObservable(function(observer){return new CompositeDisposable(r.getDisposable(),xs.subscribe(observer))})};function arrayInitialize(count,factory){var a=new Array(count);for(var i=0;i<count;i++){a[i]=factory()}return a}var IndexedItem=function(id,value){this.id=id;this.value=value};IndexedItem.prototype.compareTo=function(other){var c=this.value.compareTo(other.value);if(c===0){c=this.id-other.id}return c};var PriorityQueue=Rx.internals.PriorityQueue=function(capacity){this.items=new Array(capacity);this.length=0};var priorityProto=PriorityQueue.prototype;priorityProto.isHigherPriority=function(left,right){return this.items[left].compareTo(this.items[right])<0};priorityProto.percolate=function(index){if(index>=this.length||index<0){return}var parent=index-1>>1;if(parent<0||parent===index){return}if(this.isHigherPriority(index,parent)){var temp=this.items[index];this.items[index]=this.items[parent];this.items[parent]=temp;this.percolate(parent)}};priorityProto.heapify=function(index){if(index===undefined){index=0}if(index>=this.length||index<0){return}var left=2*index+1,right=2*index+2,first=index;if(left<this.length&&this.isHigherPriority(left,first)){first=left}if(right<this.length&&this.isHigherPriority(right,first)){first=right}if(first!==index){var temp=this.items[index];this.items[index]=this.items[first];this.items[first]=temp;this.heapify(first)}};priorityProto.peek=function(){return this.items[0].value};priorityProto.removeAt=function(index){this.items[index]=this.items[--this.length];delete this.items[this.length];this.heapify()};priorityProto.dequeue=function(){var result=this.peek();this.removeAt(0);return result};priorityProto.enqueue=function(item){var index=this.length++;this.items[index]=new IndexedItem(PriorityQueue.count++,item);this.percolate(index)};priorityProto.remove=function(item){for(var i=0;i<this.length;i++){if(this.items[i].value===item){this.removeAt(i);return true}}return false};PriorityQueue.count=0;var CompositeDisposable=Rx.CompositeDisposable=function(){this.disposables=argsOrArray(arguments,0);this.isDisposed=false;this.length=this.disposables.length};var CompositeDisposablePrototype=CompositeDisposable.prototype;CompositeDisposablePrototype.add=function(item){if(this.isDisposed){item.dispose()}else{this.disposables.push(item);this.length++}};CompositeDisposablePrototype.remove=function(item){var shouldDispose=false;if(!this.isDisposed){var idx=this.disposables.indexOf(item);if(idx!==-1){shouldDispose=true;this.disposables.splice(idx,1);this.length--;item.dispose()}}return shouldDispose};CompositeDisposablePrototype.dispose=function(){if(!this.isDisposed){this.isDisposed=true;var currentDisposables=this.disposables.slice(0);this.disposables=[];this.length=0;for(var i=0,len=currentDisposables.length;i<len;i++){currentDisposables[i].dispose()}}};CompositeDisposablePrototype.clear=function(){var currentDisposables=this.disposables.slice(0);this.disposables=[];this.length=0;for(var i=0,len=currentDisposables.length;i<len;i++){currentDisposables[i].dispose()}};CompositeDisposablePrototype.contains=function(item){return this.disposables.indexOf(item)!==-1};CompositeDisposablePrototype.toArray=function(){return this.disposables.slice(0)};var Disposable=Rx.Disposable=function(action){this.isDisposed=false;this.action=action||noop};Disposable.prototype.dispose=function(){if(!this.isDisposed){this.action();this.isDisposed=true}};var disposableCreate=Disposable.create=function(action){return new Disposable(action)};var disposableEmpty=Disposable.empty={dispose:noop};var BooleanDisposable=function(){function BooleanDisposable(isSingle){this.isSingle=isSingle;this.isDisposed=false;this.current=null}var booleanDisposablePrototype=BooleanDisposable.prototype;booleanDisposablePrototype.getDisposable=function(){return this.current};booleanDisposablePrototype.setDisposable=function(value){if(this.current&&this.isSingle){throw new Error("Disposable has already been assigned")}var shouldDispose=this.isDisposed,old;if(!shouldDispose){old=this.current;this.current=value}if(old){old.dispose()}if(shouldDispose&&value){value.dispose()}};booleanDisposablePrototype.dispose=function(){var old;if(!this.isDisposed){this.isDisposed=true;old=this.current;this.current=null}if(old){old.dispose()}};return BooleanDisposable}();var SingleAssignmentDisposable=Rx.SingleAssignmentDisposable=function(super_){inherits(SingleAssignmentDisposable,super_);function SingleAssignmentDisposable(){super_.call(this,true)}return SingleAssignmentDisposable}(BooleanDisposable);var SerialDisposable=Rx.SerialDisposable=function(super_){inherits(SerialDisposable,super_);function SerialDisposable(){super_.call(this,false)}return SerialDisposable}(BooleanDisposable);var RefCountDisposable=Rx.RefCountDisposable=function(){function InnerDisposable(disposable){this.disposable=disposable;this.disposable.count++;this.isInnerDisposed=false}InnerDisposable.prototype.dispose=function(){if(!this.disposable.isDisposed){if(!this.isInnerDisposed){this.isInnerDisposed=true;this.disposable.count--;if(this.disposable.count===0&&this.disposable.isPrimaryDisposed){this.disposable.isDisposed=true;this.disposable.underlyingDisposable.dispose()}}}};function RefCountDisposable(disposable){this.underlyingDisposable=disposable;this.isDisposed=false;this.isPrimaryDisposed=false;this.count=0}RefCountDisposable.prototype.dispose=function(){if(!this.isDisposed){if(!this.isPrimaryDisposed){this.isPrimaryDisposed=true;if(this.count===0){this.isDisposed=true;this.underlyingDisposable.dispose()}}}};RefCountDisposable.prototype.getDisposable=function(){return this.isDisposed?disposableEmpty:new InnerDisposable(this)};return RefCountDisposable}();function ScheduledDisposable(scheduler,disposable){this.scheduler=scheduler;this.disposable=disposable;this.isDisposed=false}ScheduledDisposable.prototype.dispose=function(){var parent=this;this.scheduler.schedule(function(){if(!parent.isDisposed){parent.isDisposed=true;parent.disposable.dispose()}})};var ScheduledItem=Rx.internals.ScheduledItem=function(scheduler,state,action,dueTime,comparer){this.scheduler=scheduler;this.state=state;this.action=action;this.dueTime=dueTime;this.comparer=comparer||defaultSubComparer;this.disposable=new SingleAssignmentDisposable};ScheduledItem.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())};ScheduledItem.prototype.compareTo=function(other){return this.comparer(this.dueTime,other.dueTime)};ScheduledItem.prototype.isCancelled=function(){return this.disposable.isDisposed};ScheduledItem.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var Scheduler=Rx.Scheduler=function(){function Scheduler(now,schedule,scheduleRelative,scheduleAbsolute){this.now=now;this._schedule=schedule;this._scheduleRelative=scheduleRelative;this._scheduleAbsolute=scheduleAbsolute}function invokeRecImmediate(scheduler,pair){var state=pair.first,action=pair.second,group=new CompositeDisposable,recursiveAction=function(state1){action(state1,function(state2){var isAdded=false,isDone=false,d=scheduler.scheduleWithState(state2,function(scheduler1,state3){if(isAdded){group.remove(d)}else{isDone=true}recursiveAction(state3);return disposableEmpty});if(!isDone){group.add(d);isAdded=true}})};recursiveAction(state);return group}function invokeRecDate(scheduler,pair,method){var state=pair.first,action=pair.second,group=new CompositeDisposable,recursiveAction=function(state1){action(state1,function(state2,dueTime1){var isAdded=false,isDone=false,d=scheduler[method].call(scheduler,state2,dueTime1,function(scheduler1,state3){if(isAdded){group.remove(d)}else{isDone=true}recursiveAction(state3);return disposableEmpty});if(!isDone){group.add(d);isAdded=true}})};recursiveAction(state);return group}function invokeAction(scheduler,action){action();return disposableEmpty}var schedulerProto=Scheduler.prototype;schedulerProto.catchException=schedulerProto["catch"]=function(handler){return new CatchScheduler(this,handler)};schedulerProto.schedulePeriodic=function(period,action){return this.schedulePeriodicWithState(null,period,function(){action()})};schedulerProto.schedulePeriodicWithState=function(state,period,action){var s=state,id=setInterval(function(){s=action(s)},period);return disposableCreate(function(){clearInterval(id)})};schedulerProto.schedule=function(action){return this._schedule(action,invokeAction)};schedulerProto.scheduleWithState=function(state,action){return this._schedule(state,action)};schedulerProto.scheduleWithRelative=function(dueTime,action){return this._scheduleRelative(action,dueTime,invokeAction)};schedulerProto.scheduleWithRelativeAndState=function(state,dueTime,action){return this._scheduleRelative(state,dueTime,action)};schedulerProto.scheduleWithAbsolute=function(dueTime,action){return this._scheduleAbsolute(action,dueTime,invokeAction)};schedulerProto.scheduleWithAbsoluteAndState=function(state,dueTime,action){return this._scheduleAbsolute(state,dueTime,action)};schedulerProto.scheduleRecursive=function(action){return this.scheduleRecursiveWithState(action,function(_action,self){_action(function(){self(_action)})})};schedulerProto.scheduleRecursiveWithState=function(state,action){return this.scheduleWithState({first:state,second:action},function(s,p){return invokeRecImmediate(s,p)})};schedulerProto.scheduleRecursiveWithRelative=function(dueTime,action){return this.scheduleRecursiveWithRelativeAndState(action,dueTime,function(_action,self){_action(function(dt){self(_action,dt)})})};schedulerProto.scheduleRecursiveWithRelativeAndState=function(state,dueTime,action){return this._scheduleRelative({first:state,second:action},dueTime,function(s,p){return invokeRecDate(s,p,"scheduleWithRelativeAndState")})};schedulerProto.scheduleRecursiveWithAbsolute=function(dueTime,action){return this.scheduleRecursiveWithAbsoluteAndState(action,dueTime,function(_action,self){_action(function(dt){self(_action,dt)})})};schedulerProto.scheduleRecursiveWithAbsoluteAndState=function(state,dueTime,action){return this._scheduleAbsolute({first:state,second:action},dueTime,function(s,p){return invokeRecDate(s,p,"scheduleWithAbsoluteAndState")})};Scheduler.now=defaultNow;Scheduler.normalize=function(timeSpan){if(timeSpan<0){timeSpan=0}return timeSpan};return Scheduler}();var normalizeTime=Scheduler.normalize;var SchedulePeriodicRecursive=Rx.internals.SchedulePeriodicRecursive=function(){function tick(command,recurse){recurse(0,this._period);try{this._state=this._action(this._state)}catch(e){this._cancel.dispose();throw e}}function SchedulePeriodicRecursive(scheduler,state,period,action){this._scheduler=scheduler;this._state=state;this._period=period;this._action=action}SchedulePeriodicRecursive.prototype.start=function(){var d=new SingleAssignmentDisposable;this._cancel=d;d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,tick.bind(this)));return d};return SchedulePeriodicRecursive}();var immediateScheduler=Scheduler.immediate=function(){function scheduleNow(state,action){return action(this,state)}function scheduleRelative(state,dueTime,action){var dt=normalizeTime(dt);while(dt-this.now()>0){}return action(this,state)}function scheduleAbsolute(state,dueTime,action){return this.scheduleWithRelativeAndState(state,dueTime-this.now(),action)}return new Scheduler(defaultNow,scheduleNow,scheduleRelative,scheduleAbsolute)}();var currentThreadScheduler=Scheduler.currentThread=function(){var queue;function runTrampoline(q){var item;while(q.length>0){item=q.dequeue();if(!item.isCancelled()){while(item.dueTime-Scheduler.now()>0){}if(!item.isCancelled()){item.invoke()}}}}function scheduleNow(state,action){return this.scheduleWithRelativeAndState(state,0,action)}function scheduleRelative(state,dueTime,action){var dt=this.now()+Scheduler.normalize(dueTime),si=new ScheduledItem(this,state,action,dt);if(!queue){queue=new PriorityQueue(4);queue.enqueue(si);try{runTrampoline(queue)}catch(e){throw e}finally{queue=null}}else{queue.enqueue(si)}return si.disposable}function scheduleAbsolute(state,dueTime,action){return this.scheduleWithRelativeAndState(state,dueTime-this.now(),action)}var currentScheduler=new Scheduler(defaultNow,scheduleNow,scheduleRelative,scheduleAbsolute);currentScheduler.scheduleRequired=function(){return!queue};currentScheduler.ensureTrampoline=function(action){if(!queue){this.schedule(action)}else{action()}};return currentScheduler}();var scheduleMethod,clearMethod=noop;(function(){var reNative=RegExp("^"+String(toString).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$");var setImmediate=typeof(setImmediate=freeGlobal&&moduleExports&&freeGlobal.setImmediate)=="function"&&!reNative.test(setImmediate)&&setImmediate,clearImmediate=typeof(clearImmediate=freeGlobal&&moduleExports&&freeGlobal.clearImmediate)=="function"&&!reNative.test(clearImmediate)&&clearImmediate;function postMessageSupported(){if(!root.postMessage||root.importScripts){return false}var isAsync=false,oldHandler=root.onmessage;root.onmessage=function(){isAsync=true};root.postMessage("","*");root.onmessage=oldHandler;return isAsync}if(typeof process!=="undefined"&&{}.toString.call(process)==="[object process]"){scheduleMethod=process.nextTick}else if(typeof setImmediate==="function"){scheduleMethod=setImmediate;clearMethod=clearImmediate}else if(postMessageSupported()){var MSG_PREFIX="ms.rx.schedule"+Math.random(),tasks={},taskId=0;function onGlobalPostMessage(event){if(typeof event.data==="string"&&event.data.substring(0,MSG_PREFIX.length)===MSG_PREFIX){var handleId=event.data.substring(MSG_PREFIX.length),action=tasks[handleId];action();delete tasks[handleId]}}if(root.addEventListener){root.addEventListener("message",onGlobalPostMessage,false)}else{root.attachEvent("onmessage",onGlobalPostMessage,false)}scheduleMethod=function(action){var currentId=taskId++;tasks[currentId]=action;root.postMessage(MSG_PREFIX+currentId,"*")}}else if(!!root.MessageChannel){var channel=new root.MessageChannel,channelTasks={},channelTaskId=0;channel.port1.onmessage=function(event){var id=event.data,action=channelTasks[id];action();delete channelTasks[id]};scheduleMethod=function(action){var id=channelTaskId++;channelTasks[id]=action;channel.port2.postMessage(id)}}else if("document"in root&&"onreadystatechange"in root.document.createElement("script")){scheduleMethod=function(action){var scriptElement=root.document.createElement("script");scriptElement.onreadystatechange=function(){action();scriptElement.onreadystatechange=null;scriptElement.parentNode.removeChild(scriptElement);scriptElement=null};root.document.documentElement.appendChild(scriptElement)}}else{scheduleMethod=function(action){return setTimeout(action,0)};clearMethod=clearTimeout}})();var timeoutScheduler=Scheduler.timeout=function(){function scheduleNow(state,action){var scheduler=this,disposable=new SingleAssignmentDisposable;var id=scheduleMethod(function(){if(!disposable.isDisposed){disposable.setDisposable(action(scheduler,state))}});return new CompositeDisposable(disposable,disposableCreate(function(){clearMethod(id)}))}function scheduleRelative(state,dueTime,action){var scheduler=this,dt=Scheduler.normalize(dueTime);if(dt===0){return scheduler.scheduleWithState(state,action)}var disposable=new SingleAssignmentDisposable;var id=setTimeout(function(){if(!disposable.isDisposed){disposable.setDisposable(action(scheduler,state))}},dt);return new CompositeDisposable(disposable,disposableCreate(function(){clearTimeout(id)}))}function scheduleAbsolute(state,dueTime,action){return this.scheduleWithRelativeAndState(state,dueTime-this.now(),action)}return new Scheduler(defaultNow,scheduleNow,scheduleRelative,scheduleAbsolute)}();var CatchScheduler=function(_super){function localNow(){return this._scheduler.now()}function scheduleNow(state,action){return this._scheduler.scheduleWithState(state,this._wrap(action))}function scheduleRelative(state,dueTime,action){return this._scheduler.scheduleWithRelativeAndState(state,dueTime,this._wrap(action))}function scheduleAbsolute(state,dueTime,action){return this._scheduler.scheduleWithAbsoluteAndState(state,dueTime,this._wrap(action))}inherits(CatchScheduler,_super);function CatchScheduler(scheduler,handler){this._scheduler=scheduler;this._handler=handler;this._recursiveOriginal=null;this._recursiveWrapper=null;_super.call(this,localNow,scheduleNow,scheduleRelative,scheduleAbsolute)}CatchScheduler.prototype._clone=function(scheduler){return new CatchScheduler(scheduler,this._handler)};CatchScheduler.prototype._wrap=function(action){var parent=this;return function(self,state){try{return action(parent._getRecursiveWrapper(self),state)}catch(e){if(!parent._handler(e)){throw e}return disposableEmpty}}};CatchScheduler.prototype._getRecursiveWrapper=function(scheduler){if(this._recursiveOriginal!==scheduler){this._recursiveOriginal=scheduler;var wrapper=this._clone(scheduler);wrapper._recursiveOriginal=scheduler;wrapper._recursiveWrapper=wrapper;this._recursiveWrapper=wrapper}return this._recursiveWrapper};CatchScheduler.prototype.schedulePeriodicWithState=function(state,period,action){var self=this,failed=false,d=new SingleAssignmentDisposable;d.setDisposable(this._scheduler.schedulePeriodicWithState(state,period,function(state1){if(failed){return null}try{return action(state1)}catch(e){failed=true;if(!self._handler(e)){throw e}d.dispose();return null}}));return d};return CatchScheduler}(Scheduler);var Notification=Rx.Notification=function(){function Notification(kind,hasValue){this.hasValue=hasValue==null?false:hasValue;this.kind=kind}Notification.prototype.accept=function(observerOrOnNext,onError,onCompleted){return observerOrOnNext&&typeof observerOrOnNext==="object"?this._acceptObservable(observerOrOnNext):this._accept(observerOrOnNext,onError,onCompleted)};Notification.prototype.toObservable=function(scheduler){var notification=this;
isScheduler(scheduler)||(scheduler=immediateScheduler);return new AnonymousObservable(function(observer){return scheduler.schedule(function(){notification._acceptObservable(observer);notification.kind==="N"&&observer.onCompleted()})})};return Notification}();var notificationCreateOnNext=Notification.createOnNext=function(){function _accept(onNext){return onNext(this.value)}function _acceptObservable(observer){return observer.onNext(this.value)}function toString(){return"OnNext("+this.value+")"}return function(value){var notification=new Notification("N",true);notification.value=value;notification._accept=_accept;notification._acceptObservable=_acceptObservable;notification.toString=toString;return notification}}();var notificationCreateOnError=Notification.createOnError=function(){function _accept(onNext,onError){return onError(this.exception)}function _acceptObservable(observer){return observer.onError(this.exception)}function toString(){return"OnError("+this.exception+")"}return function(exception){var notification=new Notification("E");notification.exception=exception;notification._accept=_accept;notification._acceptObservable=_acceptObservable;notification.toString=toString;return notification}}();var notificationCreateOnCompleted=Notification.createOnCompleted=function(){function _accept(onNext,onError,onCompleted){return onCompleted()}function _acceptObservable(observer){return observer.onCompleted()}function toString(){return"OnCompleted()"}return function(){var notification=new Notification("C");notification._accept=_accept;notification._acceptObservable=_acceptObservable;notification.toString=toString;return notification}}();var Enumerator=Rx.internals.Enumerator=function(next){this._next=next};Enumerator.prototype.next=function(){return this._next()};Enumerator.prototype[$iterator$]=function(){return this};var Enumerable=Rx.internals.Enumerable=function(iterator){this._iterator=iterator};Enumerable.prototype[$iterator$]=function(){return this._iterator()};Enumerable.prototype.concat=function(){var sources=this;return new AnonymousObservable(function(observer){var e;try{e=sources[$iterator$]()}catch(err){observer.onError();return}var isDisposed,subscription=new SerialDisposable;var cancelable=immediateScheduler.scheduleRecursive(function(self){var currentItem;if(isDisposed){return}try{currentItem=e.next()}catch(ex){observer.onError(ex);return}if(currentItem.done){observer.onCompleted();return}var currentValue=currentItem.value;isPromise(currentValue)&&(currentValue=observableFromPromise(currentValue));var d=new SingleAssignmentDisposable;subscription.setDisposable(d);d.setDisposable(currentValue.subscribe(observer.onNext.bind(observer),observer.onError.bind(observer),function(){self()}))});return new CompositeDisposable(subscription,cancelable,disposableCreate(function(){isDisposed=true}))})};Enumerable.prototype.catchException=function(){var sources=this;return new AnonymousObservable(function(observer){var e;try{e=sources[$iterator$]()}catch(err){observer.onError();return}var isDisposed,lastException,subscription=new SerialDisposable;var cancelable=immediateScheduler.scheduleRecursive(function(self){if(isDisposed){return}var currentItem;try{currentItem=e.next()}catch(ex){observer.onError(ex);return}if(currentItem.done){if(lastException){observer.onError(lastException)}else{observer.onCompleted()}return}var currentValue=currentItem.value;isPromise(currentValue)&&(currentValue=observableFromPromise(currentValue));var d=new SingleAssignmentDisposable;subscription.setDisposable(d);d.setDisposable(currentValue.subscribe(observer.onNext.bind(observer),function(exn){lastException=exn;self()},observer.onCompleted.bind(observer)))});return new CompositeDisposable(subscription,cancelable,disposableCreate(function(){isDisposed=true}))})};var enumerableRepeat=Enumerable.repeat=function(value,repeatCount){if(repeatCount==null){repeatCount=-1}return new Enumerable(function(){var left=repeatCount;return new Enumerator(function(){if(left===0){return doneEnumerator}if(left>0){left--}return{done:false,value:value}})})};var enumerableFor=Enumerable.forEach=function(source,selector,thisArg){selector||(selector=identity);return new Enumerable(function(){var index=-1;return new Enumerator(function(){return++index<source.length?{done:false,value:selector.call(thisArg,source[index],index,source)}:doneEnumerator})})};var Observer=Rx.Observer=function(){};Observer.prototype.toNotifier=function(){var observer=this;return function(n){return n.accept(observer)}};Observer.prototype.asObserver=function(){return new AnonymousObserver(this.onNext.bind(this),this.onError.bind(this),this.onCompleted.bind(this))};Observer.prototype.checked=function(){return new CheckedObserver(this)};var observerCreate=Observer.create=function(onNext,onError,onCompleted){onNext||(onNext=noop);onError||(onError=defaultError);onCompleted||(onCompleted=noop);return new AnonymousObserver(onNext,onError,onCompleted)};Observer.fromNotifier=function(handler){return new AnonymousObserver(function(x){return handler(notificationCreateOnNext(x))},function(exception){return handler(notificationCreateOnError(exception))},function(){return handler(notificationCreateOnCompleted())})};Observer.notifyOn=function(scheduler){return new ObserveOnObserver(scheduler,this)};var AbstractObserver=Rx.internals.AbstractObserver=function(_super){inherits(AbstractObserver,_super);function AbstractObserver(){this.isStopped=false;_super.call(this)}AbstractObserver.prototype.onNext=function(value){if(!this.isStopped){this.next(value)}};AbstractObserver.prototype.onError=function(error){if(!this.isStopped){this.isStopped=true;this.error(error)}};AbstractObserver.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=true;this.completed()}};AbstractObserver.prototype.dispose=function(){this.isStopped=true};AbstractObserver.prototype.fail=function(e){if(!this.isStopped){this.isStopped=true;this.error(e);return true}return false};return AbstractObserver}(Observer);var AnonymousObserver=Rx.AnonymousObserver=function(_super){inherits(AnonymousObserver,_super);function AnonymousObserver(onNext,onError,onCompleted){_super.call(this);this._onNext=onNext;this._onError=onError;this._onCompleted=onCompleted}AnonymousObserver.prototype.next=function(value){this._onNext(value)};AnonymousObserver.prototype.error=function(exception){this._onError(exception)};AnonymousObserver.prototype.completed=function(){this._onCompleted()};return AnonymousObserver}(AbstractObserver);var CheckedObserver=function(_super){inherits(CheckedObserver,_super);function CheckedObserver(observer){_super.call(this);this._observer=observer;this._state=0}var CheckedObserverPrototype=CheckedObserver.prototype;CheckedObserverPrototype.onNext=function(value){this.checkAccess();try{this._observer.onNext(value)}catch(e){throw e}finally{this._state=0}};CheckedObserverPrototype.onError=function(err){this.checkAccess();try{this._observer.onError(err)}catch(e){throw e}finally{this._state=2}};CheckedObserverPrototype.onCompleted=function(){this.checkAccess();try{this._observer.onCompleted()}catch(e){throw e}finally{this._state=2}};CheckedObserverPrototype.checkAccess=function(){if(this._state===1){throw new Error("Re-entrancy detected")}if(this._state===2){throw new Error("Observer completed")}if(this._state===0){this._state=1}};return CheckedObserver}(Observer);var ScheduledObserver=Rx.internals.ScheduledObserver=function(_super){inherits(ScheduledObserver,_super);function ScheduledObserver(scheduler,observer){_super.call(this);this.scheduler=scheduler;this.observer=observer;this.isAcquired=false;this.hasFaulted=false;this.queue=[];this.disposable=new SerialDisposable}ScheduledObserver.prototype.next=function(value){var self=this;this.queue.push(function(){self.observer.onNext(value)})};ScheduledObserver.prototype.error=function(exception){var self=this;this.queue.push(function(){self.observer.onError(exception)})};ScheduledObserver.prototype.completed=function(){var self=this;this.queue.push(function(){self.observer.onCompleted()})};ScheduledObserver.prototype.ensureActive=function(){var isOwner=false,parent=this;if(!this.hasFaulted&&this.queue.length>0){isOwner=!this.isAcquired;this.isAcquired=true}if(isOwner){this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(self){var work;if(parent.queue.length>0){work=parent.queue.shift()}else{parent.isAcquired=false;return}try{work()}catch(ex){parent.queue=[];parent.hasFaulted=true;throw ex}self()}))}};ScheduledObserver.prototype.dispose=function(){_super.prototype.dispose.call(this);this.disposable.dispose()};return ScheduledObserver}(AbstractObserver);var ObserveOnObserver=function(_super){inherits(ObserveOnObserver,_super);function ObserveOnObserver(){_super.apply(this,arguments)}ObserveOnObserver.prototype.next=function(value){_super.prototype.next.call(this,value);this.ensureActive()};ObserveOnObserver.prototype.error=function(e){_super.prototype.error.call(this,e);this.ensureActive()};ObserveOnObserver.prototype.completed=function(){_super.prototype.completed.call(this);this.ensureActive()};return ObserveOnObserver}(ScheduledObserver);var observableProto;var Observable=Rx.Observable=function(){function Observable(subscribe){this._subscribe=subscribe}observableProto=Observable.prototype;observableProto.subscribe=observableProto.forEach=function(observerOrOnNext,onError,onCompleted){var subscriber=typeof observerOrOnNext==="object"?observerOrOnNext:observerCreate(observerOrOnNext,onError,onCompleted);return this._subscribe(subscriber)};return Observable}();observableProto.observeOn=function(scheduler){var source=this;return new AnonymousObservable(function(observer){return source.subscribe(new ObserveOnObserver(scheduler,observer))})};observableProto.subscribeOn=function(scheduler){var source=this;return new AnonymousObservable(function(observer){var m=new SingleAssignmentDisposable,d=new SerialDisposable;d.setDisposable(m);m.setDisposable(scheduler.schedule(function(){d.setDisposable(new ScheduledDisposable(scheduler,source.subscribe(observer)))}));return d})};var observableFromPromise=Observable.fromPromise=function(promise){return new AnonymousObservable(function(observer){promise.then(function(value){observer.onNext(value);observer.onCompleted()},function(reason){observer.onError(reason)});return function(){if(promise&&promise.abort){promise.abort()}}})};observableProto.toPromise=function(promiseCtor){promiseCtor||(promiseCtor=Rx.config.Promise);if(!promiseCtor){throw new Error("Promise type not provided nor in Rx.config.Promise")}var source=this;return new promiseCtor(function(resolve,reject){var value,hasValue=false;source.subscribe(function(v){value=v;hasValue=true},function(err){reject(err)},function(){if(hasValue){resolve(value)}})})};observableProto.toArray=function(){var self=this;return new AnonymousObservable(function(observer){var arr=[];return self.subscribe(arr.push.bind(arr),observer.onError.bind(observer),function(){observer.onNext(arr);observer.onCompleted()})})};Observable.create=Observable.createWithDisposable=function(subscribe){return new AnonymousObservable(subscribe)};var observableDefer=Observable.defer=function(observableFactory){return new AnonymousObservable(function(observer){var result;try{result=observableFactory()}catch(e){return observableThrow(e).subscribe(observer)}isPromise(result)&&(result=observableFromPromise(result));return result.subscribe(observer)})};var observableEmpty=Observable.empty=function(scheduler){isScheduler(scheduler)||(scheduler=immediateScheduler);return new AnonymousObservable(function(observer){return scheduler.schedule(function(){observer.onCompleted()})})};var maxSafeInteger=Math.pow(2,53)-1;function numberIsFinite(value){return typeof value==="number"&&root.isFinite(value)}function isNan(n){return n!==n}function isIterable(o){return o[$iterator$]!==undefined}function sign(value){var number=+value;if(number===0){return number}if(isNaN(number)){return number}return number<0?-1:1}function toLength(o){var len=+o.length;if(isNaN(len)){return 0}if(len===0||!numberIsFinite(len)){return len}len=sign(len)*Math.floor(Math.abs(len));if(len<=0){return 0}if(len>maxSafeInteger){return maxSafeInteger}return len}function isCallable(f){return Object.prototype.toString.call(f)==="[object Function]"&&typeof f==="function"}Observable.from=function(iterable,mapFn,thisArg,scheduler){if(iterable==null){throw new Error("iterable cannot be null.")}if(mapFn&&!isCallable(mapFn)){throw new Error("mapFn when provided must be a function")}isScheduler(scheduler)||(scheduler=currentThreadScheduler);return new AnonymousObservable(function(observer){var list=Object(iterable),objIsIterable=isIterable(list),len=objIsIterable?0:toLength(list),it=objIsIterable?list[$iterator$]():null,i=0;return scheduler.scheduleRecursive(function(self){if(i<len||objIsIterable){var result;if(objIsIterable){var next=it.next();if(next.done){observer.onCompleted();return}result=next.value}else{result=list[i]}if(mapFn&&isCallable(mapFn)){try{result=thisArg?mapFn.call(thisArg,result,i):mapFn(result,i)}catch(e){observer.onError(e);return}}observer.onNext(result);i++;self()}else{observer.onCompleted()}})})};var observableFromArray=Observable.fromArray=function(array,scheduler){isScheduler(scheduler)||(scheduler=currentThreadScheduler);return new AnonymousObservable(function(observer){var count=0,len=array.length;return scheduler.scheduleRecursive(function(self){if(count<len){observer.onNext(array[count++]);self()}else{observer.onCompleted()}})})};Observable.generate=function(initialState,condition,iterate,resultSelector,scheduler){isScheduler(scheduler)||(scheduler=currentThreadScheduler);return new AnonymousObservable(function(observer){var first=true,state=initialState;return scheduler.scheduleRecursive(function(self){var hasResult,result;try{if(first){first=false}else{state=iterate(state)}hasResult=condition(state);if(hasResult){result=resultSelector(state)}}catch(exception){observer.onError(exception);return}if(hasResult){observer.onNext(result);self()}else{observer.onCompleted()}})})};Observable.of=function(){var len=arguments.length,args=new Array(len);for(var i=0;i<len;i++){args[i]=arguments[i]}return observableFromArray(args)};var observableOf=Observable.ofWithScheduler=function(scheduler){var len=arguments.length-1,args=new Array(len);for(var i=0;i<len;i++){args[i]=arguments[i+1]}return observableFromArray(args,scheduler)};var observableNever=Observable.never=function(){return new AnonymousObservable(function(){return disposableEmpty})};Observable.range=function(start,count,scheduler){isScheduler(scheduler)||(scheduler=currentThreadScheduler);return new AnonymousObservable(function(observer){return scheduler.scheduleRecursiveWithState(0,function(i,self){if(i<count){observer.onNext(start+i);self(i+1)}else{observer.onCompleted()}})})};Observable.repeat=function(value,repeatCount,scheduler){isScheduler(scheduler)||(scheduler=currentThreadScheduler);return observableReturn(value,scheduler).repeat(repeatCount==null?-1:repeatCount)};var observableReturn=Observable["return"]=Observable.returnValue=Observable.just=function(value,scheduler){isScheduler(scheduler)||(scheduler=immediateScheduler);return new AnonymousObservable(function(observer){return scheduler.schedule(function(){observer.onNext(value);observer.onCompleted()})})};var observableThrow=Observable["throw"]=Observable.throwException=function(exception,scheduler){isScheduler(scheduler)||(scheduler=immediateScheduler);return new AnonymousObservable(function(observer){return scheduler.schedule(function(){observer.onError(exception)})})};Observable.using=function(resourceFactory,observableFactory){return new AnonymousObservable(function(observer){var disposable=disposableEmpty,resource,source;try{resource=resourceFactory();if(resource){disposable=resource}source=observableFactory(resource)}catch(exception){return new CompositeDisposable(observableThrow(exception).subscribe(observer),disposable)}return new CompositeDisposable(source.subscribe(observer),disposable)})};observableProto.amb=function(rightSource){var leftSource=this;return new AnonymousObservable(function(observer){var choice,leftChoice="L",rightChoice="R",leftSubscription=new SingleAssignmentDisposable,rightSubscription=new SingleAssignmentDisposable;isPromise(rightSource)&&(rightSource=observableFromPromise(rightSource));function choiceL(){if(!choice){choice=leftChoice;rightSubscription.dispose()}}function choiceR(){if(!choice){choice=rightChoice;leftSubscription.dispose()}}leftSubscription.setDisposable(leftSource.subscribe(function(left){choiceL();if(choice===leftChoice){observer.onNext(left)}},function(err){choiceL();if(choice===leftChoice){observer.onError(err)}},function(){choiceL();if(choice===leftChoice){observer.onCompleted()}}));rightSubscription.setDisposable(rightSource.subscribe(function(right){choiceR();if(choice===rightChoice){observer.onNext(right)}},function(err){choiceR();if(choice===rightChoice){observer.onError(err)}},function(){choiceR();if(choice===rightChoice){observer.onCompleted()}}));return new CompositeDisposable(leftSubscription,rightSubscription)})};Observable.amb=function(){var acc=observableNever(),items=argsOrArray(arguments,0);function func(previous,current){return previous.amb(current)}for(var i=0,len=items.length;i<len;i++){acc=func(acc,items[i])}return acc};function observableCatchHandler(source,handler){return new AnonymousObservable(function(observer){var d1=new SingleAssignmentDisposable,subscription=new SerialDisposable;subscription.setDisposable(d1);d1.setDisposable(source.subscribe(observer.onNext.bind(observer),function(exception){var d,result;try{result=handler(exception)}catch(ex){observer.onError(ex);return}isPromise(result)&&(result=observableFromPromise(result));d=new SingleAssignmentDisposable;subscription.setDisposable(d);d.setDisposable(result.subscribe(observer))},observer.onCompleted.bind(observer)));return subscription})}observableProto["catch"]=observableProto.catchException=function(handlerOrSecond){return typeof handlerOrSecond==="function"?observableCatchHandler(this,handlerOrSecond):observableCatch([this,handlerOrSecond])};var observableCatch=Observable.catchException=Observable["catch"]=function(){var items=argsOrArray(arguments,0);return enumerableFor(items).catchException()};observableProto.combineLatest=function(){var args=slice.call(arguments);if(Array.isArray(args[0])){args[0].unshift(this)}else{args.unshift(this)}return combineLatest.apply(this,args)};var combineLatest=Observable.combineLatest=function(){var args=slice.call(arguments),resultSelector=args.pop();if(Array.isArray(args[0])){args=args[0]}return new AnonymousObservable(function(observer){var falseFactory=function(){return false},n=args.length,hasValue=arrayInitialize(n,falseFactory),hasValueAll=false,isDone=arrayInitialize(n,falseFactory),values=new Array(n);function next(i){var res;hasValue[i]=true;if(hasValueAll||(hasValueAll=hasValue.every(identity))){try{res=resultSelector.apply(null,values)}catch(ex){observer.onError(ex);return}observer.onNext(res)}else if(isDone.filter(function(x,j){return j!==i}).every(identity)){observer.onCompleted()}}function done(i){isDone[i]=true;if(isDone.every(identity)){observer.onCompleted()}}var subscriptions=new Array(n);for(var idx=0;idx<n;idx++){(function(i){var source=args[i],sad=new SingleAssignmentDisposable;isPromise(source)&&(source=observableFromPromise(source));sad.setDisposable(source.subscribe(function(x){values[i]=x;next(i)},observer.onError.bind(observer),function(){done(i)}));subscriptions[i]=sad})(idx)}return new CompositeDisposable(subscriptions)})};observableProto.concat=function(){var items=slice.call(arguments,0);items.unshift(this);return observableConcat.apply(this,items)};var observableConcat=Observable.concat=function(){var sources=argsOrArray(arguments,0);return enumerableFor(sources).concat()};observableProto.concatObservable=observableProto.concatAll=function(){return this.merge(1)};observableProto.merge=function(maxConcurrentOrOther){if(typeof maxConcurrentOrOther!=="number"){return observableMerge(this,maxConcurrentOrOther)}var sources=this;return new AnonymousObservable(function(observer){var activeCount=0,group=new CompositeDisposable,isStopped=false,q=[],subscribe=function(xs){var subscription=new SingleAssignmentDisposable;group.add(subscription);if(isPromise(xs)){xs=observableFromPromise(xs)}subscription.setDisposable(xs.subscribe(observer.onNext.bind(observer),observer.onError.bind(observer),function(){var s;group.remove(subscription);if(q.length>0){s=q.shift();subscribe(s)}else{activeCount--;if(isStopped&&activeCount===0){observer.onCompleted()}}}))};group.add(sources.subscribe(function(innerSource){if(activeCount<maxConcurrentOrOther){activeCount++;subscribe(innerSource)}else{q.push(innerSource)}},observer.onError.bind(observer),function(){isStopped=true;if(activeCount===0){observer.onCompleted()}}));return group})};var observableMerge=Observable.merge=function(){var scheduler,sources;if(!arguments[0]){scheduler=immediateScheduler;sources=slice.call(arguments,1)}else if(arguments[0].now){scheduler=arguments[0];sources=slice.call(arguments,1)}else{scheduler=immediateScheduler;sources=slice.call(arguments,0)}if(Array.isArray(sources[0])){sources=sources[0]}return observableFromArray(sources,scheduler).mergeObservable()};observableProto.mergeObservable=observableProto.mergeAll=function(){var sources=this;return new AnonymousObservable(function(observer){var group=new CompositeDisposable,isStopped=false,m=new SingleAssignmentDisposable;group.add(m);m.setDisposable(sources.subscribe(function(innerSource){var innerSubscription=new SingleAssignmentDisposable;group.add(innerSubscription);if(isPromise(innerSource)){innerSource=observableFromPromise(innerSource)}innerSubscription.setDisposable(innerSource.subscribe(function(x){observer.onNext(x)},observer.onError.bind(observer),function(){group.remove(innerSubscription);if(isStopped&&group.length===1){observer.onCompleted()}}))},observer.onError.bind(observer),function(){isStopped=true;if(group.length===1){observer.onCompleted()}}));return group})};observableProto.onErrorResumeNext=function(second){if(!second){throw new Error("Second observable is required")}return onErrorResumeNext([this,second])};var onErrorResumeNext=Observable.onErrorResumeNext=function(){var sources=argsOrArray(arguments,0);return new AnonymousObservable(function(observer){var pos=0,subscription=new SerialDisposable,cancelable=immediateScheduler.scheduleRecursive(function(self){var current,d;if(pos<sources.length){current=sources[pos++];isPromise(current)&&(current=observableFromPromise(current));d=new SingleAssignmentDisposable;subscription.setDisposable(d);d.setDisposable(current.subscribe(observer.onNext.bind(observer),function(){self()},function(){self()}))}else{observer.onCompleted()}});return new CompositeDisposable(subscription,cancelable)})};observableProto.skipUntil=function(other){var source=this;return new AnonymousObservable(function(observer){var isOpen=false;var disposables=new CompositeDisposable(source.subscribe(function(left){isOpen&&observer.onNext(left)},observer.onError.bind(observer),function(){isOpen&&observer.onCompleted()}));isPromise(other)&&(other=observableFromPromise(other));var rightSubscription=new SingleAssignmentDisposable;disposables.add(rightSubscription);rightSubscription.setDisposable(other.subscribe(function(){isOpen=true;rightSubscription.dispose()},observer.onError.bind(observer),function(){rightSubscription.dispose()}));return disposables})};observableProto["switch"]=observableProto.switchLatest=function(){var sources=this;return new AnonymousObservable(function(observer){var hasLatest=false,innerSubscription=new SerialDisposable,isStopped=false,latest=0,subscription=sources.subscribe(function(innerSource){var d=new SingleAssignmentDisposable,id=++latest;hasLatest=true;innerSubscription.setDisposable(d);if(isPromise(innerSource)){innerSource=observableFromPromise(innerSource)}d.setDisposable(innerSource.subscribe(function(x){if(latest===id){observer.onNext(x)}},function(e){if(latest===id){observer.onError(e)}},function(){if(latest===id){hasLatest=false;if(isStopped){observer.onCompleted()}}}))},observer.onError.bind(observer),function(){isStopped=true;if(!hasLatest){observer.onCompleted()}});return new CompositeDisposable(subscription,innerSubscription)})};observableProto.takeUntil=function(other){var source=this;return new AnonymousObservable(function(observer){isPromise(other)&&(other=observableFromPromise(other));return new CompositeDisposable(source.subscribe(observer),other.subscribe(observer.onCompleted.bind(observer),observer.onError.bind(observer),noop))})};function zipArray(second,resultSelector){var first=this;return new AnonymousObservable(function(observer){var index=0,len=second.length;return first.subscribe(function(left){if(index<len){var right=second[index++],result;try{result=resultSelector(left,right)}catch(e){observer.onError(e);return}observer.onNext(result)}else{observer.onCompleted()}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})}observableProto.zip=function(){if(Array.isArray(arguments[0])){return zipArray.apply(this,arguments)}var parent=this,sources=slice.call(arguments),resultSelector=sources.pop();sources.unshift(parent);return new AnonymousObservable(function(observer){var n=sources.length,queues=arrayInitialize(n,function(){return[]}),isDone=arrayInitialize(n,function(){return false});function next(i){var res,queuedValues;if(queues.every(function(x){return x.length>0})){try{queuedValues=queues.map(function(x){return x.shift()});res=resultSelector.apply(parent,queuedValues)}catch(ex){observer.onError(ex);return}observer.onNext(res)}else if(isDone.filter(function(x,j){return j!==i}).every(identity)){observer.onCompleted()}}function done(i){isDone[i]=true;if(isDone.every(function(x){return x})){observer.onCompleted()}}var subscriptions=new Array(n);for(var idx=0;idx<n;idx++){(function(i){var source=sources[i],sad=new SingleAssignmentDisposable;isPromise(source)&&(source=observableFromPromise(source));sad.setDisposable(source.subscribe(function(x){queues[i].push(x);next(i)},observer.onError.bind(observer),function(){done(i)}));subscriptions[i]=sad})(idx)}return new CompositeDisposable(subscriptions)})};Observable.zip=function(){var args=slice.call(arguments,0),first=args.shift();return first.zip.apply(first,args)};Observable.zipArray=function(){var sources=argsOrArray(arguments,0);return new AnonymousObservable(function(observer){var n=sources.length,queues=arrayInitialize(n,function(){return[]}),isDone=arrayInitialize(n,function(){return false});function next(i){if(queues.every(function(x){return x.length>0})){var res=queues.map(function(x){return x.shift()});observer.onNext(res)}else if(isDone.filter(function(x,j){return j!==i}).every(identity)){observer.onCompleted();return}}function done(i){isDone[i]=true;if(isDone.every(identity)){observer.onCompleted();return}}var subscriptions=new Array(n);for(var idx=0;idx<n;idx++){(function(i){subscriptions[i]=new SingleAssignmentDisposable;subscriptions[i].setDisposable(sources[i].subscribe(function(x){queues[i].push(x);next(i)},observer.onError.bind(observer),function(){done(i)}))})(idx)}var compositeDisposable=new CompositeDisposable(subscriptions);compositeDisposable.add(disposableCreate(function(){for(var qIdx=0,qLen=queues.length;qIdx<qLen;qIdx++){queues[qIdx]=[]}}));return compositeDisposable})};observableProto.asObservable=function(){var source=this;return new AnonymousObservable(function(observer){return source.subscribe(observer)})};observableProto.bufferWithCount=function(count,skip){if(typeof skip!=="number"){skip=count}return this.windowWithCount(count,skip).selectMany(function(x){return x.toArray()}).where(function(x){return x.length>0})};observableProto.dematerialize=function(){var source=this;return new AnonymousObservable(function(observer){return source.subscribe(function(x){return x.accept(observer)},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.distinctUntilChanged=function(keySelector,comparer){var source=this;keySelector||(keySelector=identity);comparer||(comparer=defaultComparer);return new AnonymousObservable(function(observer){var hasCurrentKey=false,currentKey;return source.subscribe(function(value){var comparerEquals=false,key;try{key=keySelector(value)}catch(exception){observer.onError(exception);return}if(hasCurrentKey){try{comparerEquals=comparer(currentKey,key)}catch(exception){observer.onError(exception);return}}if(!hasCurrentKey||!comparerEquals){hasCurrentKey=true;currentKey=key;observer.onNext(value)}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto["do"]=observableProto.doAction=observableProto.tap=function(observerOrOnNext,onError,onCompleted){var source=this,onNextFunc;if(typeof observerOrOnNext==="function"){onNextFunc=observerOrOnNext}else{onNextFunc=observerOrOnNext.onNext.bind(observerOrOnNext);onError=observerOrOnNext.onError.bind(observerOrOnNext);onCompleted=observerOrOnNext.onCompleted.bind(observerOrOnNext)}return new AnonymousObservable(function(observer){return source.subscribe(function(x){try{onNextFunc(x)}catch(e){observer.onError(e)}observer.onNext(x)},function(err){if(!onError){observer.onError(err)}else{try{onError(err)}catch(e){observer.onError(e)}observer.onError(err)}},function(){if(!onCompleted){observer.onCompleted()}else{try{onCompleted()}catch(e){observer.onError(e)}observer.onCompleted()}})})};observableProto["finally"]=observableProto.finallyAction=function(action){var source=this;return new AnonymousObservable(function(observer){var subscription;try{subscription=source.subscribe(observer)}catch(e){action();throw e}return disposableCreate(function(){try{subscription.dispose()}catch(e){throw e}finally{action()}})})};observableProto.ignoreElements=function(){var source=this;return new AnonymousObservable(function(observer){return source.subscribe(noop,observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.materialize=function(){var source=this;return new AnonymousObservable(function(observer){return source.subscribe(function(value){observer.onNext(notificationCreateOnNext(value))},function(e){observer.onNext(notificationCreateOnError(e));observer.onCompleted()},function(){observer.onNext(notificationCreateOnCompleted());observer.onCompleted()})})};observableProto.repeat=function(repeatCount){return enumerableRepeat(this,repeatCount).concat()};observableProto.retry=function(retryCount){return enumerableRepeat(this,retryCount).catchException()};observableProto.scan=function(){var hasSeed=false,seed,accumulator,source=this;if(arguments.length===2){hasSeed=true;seed=arguments[0];accumulator=arguments[1]}else{accumulator=arguments[0]}return new AnonymousObservable(function(observer){var hasAccumulation,accumulation,hasValue;return source.subscribe(function(x){try{if(!hasValue){hasValue=true}if(hasAccumulation){accumulation=accumulator(accumulation,x)}else{accumulation=hasSeed?accumulator(seed,x):x;hasAccumulation=true}}catch(e){observer.onError(e);return}observer.onNext(accumulation)},observer.onError.bind(observer),function(){if(!hasValue&&hasSeed){observer.onNext(seed)}observer.onCompleted()})})};observableProto.skipLast=function(count){var source=this;return new AnonymousObservable(function(observer){var q=[];return source.subscribe(function(x){q.push(x);if(q.length>count){observer.onNext(q.shift())}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.startWith=function(){var values,scheduler,start=0;if(!!arguments.length&&"now"in Object(arguments[0])){scheduler=arguments[0];start=1}else{scheduler=immediateScheduler}values=slice.call(arguments,start);return enumerableFor([observableFromArray(values,scheduler),this]).concat()};observableProto.takeLast=function(count,scheduler){return this.takeLastBuffer(count).selectMany(function(xs){return observableFromArray(xs,scheduler)
})};observableProto.takeLastBuffer=function(count){var source=this;return new AnonymousObservable(function(observer){var q=[];return source.subscribe(function(x){q.push(x);if(q.length>count){q.shift()}},observer.onError.bind(observer),function(){observer.onNext(q);observer.onCompleted()})})};observableProto.windowWithCount=function(count,skip){var source=this;if(count<=0){throw new Error(argumentOutOfRange)}if(arguments.length===1){skip=count}if(skip<=0){throw new Error(argumentOutOfRange)}return new AnonymousObservable(function(observer){var m=new SingleAssignmentDisposable,refCountDisposable=new RefCountDisposable(m),n=0,q=[],createWindow=function(){var s=new Subject;q.push(s);observer.onNext(addRef(s,refCountDisposable))};createWindow();m.setDisposable(source.subscribe(function(x){var s;for(var i=0,len=q.length;i<len;i++){q[i].onNext(x)}var c=n-count+1;if(c>=0&&c%skip===0){s=q.shift();s.onCompleted()}n++;if(n%skip===0){createWindow()}},function(exception){while(q.length>0){q.shift().onError(exception)}observer.onError(exception)},function(){while(q.length>0){q.shift().onCompleted()}observer.onCompleted()}));return refCountDisposable})};function concatMap(selector){return this.map(function(x,i){var result=selector(x,i);return isPromise(result)?observableFromPromise(result):result}).concatAll()}function concatMapObserver(onNext,onError,onCompleted){var source=this;return new AnonymousObservable(function(observer){var index=0;return source.subscribe(function(x){observer.onNext(onNext(x,index++))},function(err){observer.onNext(onError(err));observer.completed()},function(){observer.onNext(onCompleted());observer.onCompleted()})}).concatAll()}observableProto.selectConcat=observableProto.concatMap=function(selector,resultSelector){if(resultSelector){return this.concatMap(function(x,i){var selectorResult=selector(x,i),result=isPromise(selectorResult)?observableFromPromise(selectorResult):selectorResult;return result.map(function(y){return resultSelector(x,y,i)})})}if(typeof selector==="function"){return concatMap.call(this,selector)}return concatMap.call(this,function(){return selector})};observableProto.defaultIfEmpty=function(defaultValue){var source=this;if(defaultValue===undefined){defaultValue=null}return new AnonymousObservable(function(observer){var found=false;return source.subscribe(function(x){found=true;observer.onNext(x)},observer.onError.bind(observer),function(){if(!found){observer.onNext(defaultValue)}observer.onCompleted()})})};function arrayIndexOfComparer(array,item,comparer){for(var i=0,len=array.length;i<len;i++){if(comparer(array[i],item)){return i}}return-1}function HashSet(comparer){this.comparer=comparer;this.set=[]}HashSet.prototype.push=function(value){var retValue=arrayIndexOfComparer(this.set,value,this.comparer)===-1;retValue&&this.set.push(value);return retValue};observableProto.distinct=function(keySelector,comparer){var source=this;comparer||(comparer=defaultComparer);return new AnonymousObservable(function(observer){var hashSet=new HashSet(comparer);return source.subscribe(function(x){var key=x;if(keySelector){try{key=keySelector(x)}catch(e){observer.onError(e);return}}hashSet.push(key)&&observer.onNext(x)},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.groupBy=function(keySelector,elementSelector,comparer){return this.groupByUntil(keySelector,elementSelector,observableNever,comparer)};observableProto.groupByUntil=function(keySelector,elementSelector,durationSelector,comparer){var source=this;elementSelector||(elementSelector=identity);comparer||(comparer=defaultComparer);return new AnonymousObservable(function(observer){var map=new Dictionary,groupDisposable=new CompositeDisposable,refCountDisposable=new RefCountDisposable(groupDisposable);groupDisposable.add(source.subscribe(function(x){var key,i,len,items;try{key=keySelector(x)}catch(e){items=map.getValues();for(i=0,len=items.length;i<len;i++){items[i].onError(e)}observer.onError(e);return}var fireNewMapEntry=false,writer=map.tryGetValue(key);if(!writer){writer=new Subject;map.set(key,writer);fireNewMapEntry=true}if(fireNewMapEntry){var group=new GroupedObservable(key,writer,refCountDisposable),durationGroup=new GroupedObservable(key,writer);try{duration=durationSelector(durationGroup)}catch(e){items=map.getValues();for(i=0,len=items.length;i<len;i++){items[i].onError(e)}observer.onError(e);return}observer.onNext(group);var md=new SingleAssignmentDisposable;groupDisposable.add(md);var expire=function(){map.remove(key)&&writer.onCompleted();groupDisposable.remove(md)};md.setDisposable(duration.take(1).subscribe(noop,function(exn){items=map.getValues();for(i=0,len=items.length;i<len;i++){items[i].onError(exn)}observer.onError(exn)},expire))}var element;try{element=elementSelector(x)}catch(e){items=map.getValues();for(i=0,len=items.length;i<len;i++){items[i].onError(e)}observer.onError(e);return}writer.onNext(element)},function(ex){var items=map.getValues();for(var i=0,len=items.length;i<len;i++){items[i].onError(ex)}observer.onError(ex)},function(){var items=map.getValues();for(var i=0,len=items.length;i<len;i++){items[i].onCompleted()}observer.onCompleted()}));return refCountDisposable})};observableProto.select=observableProto.map=function(selector,thisArg){var parent=this;return new AnonymousObservable(function(observer){var count=0;return parent.subscribe(function(value){var result;try{result=selector.call(thisArg,value,count++,parent)}catch(exception){observer.onError(exception);return}observer.onNext(result)},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.pluck=function(property){return this.select(function(x){return x[property]})};function selectMany(selector){return this.select(function(x,i){var result=selector(x,i);return isPromise(result)?observableFromPromise(result):result}).mergeObservable()}function selectManyObserver(onNext,onError,onCompleted){var source=this;return new AnonymousObservable(function(observer){var index=0;return source.subscribe(function(x){observer.onNext(onNext(x,index++))},function(err){observer.onNext(onError(err));observer.completed()},function(){observer.onNext(onCompleted());observer.onCompleted()})}).mergeAll()}observableProto.selectMany=observableProto.flatMap=function(selector,resultSelector){if(resultSelector){return this.selectMany(function(x,i){var selectorResult=selector(x,i),result=isPromise(selectorResult)?observableFromPromise(selectorResult):selectorResult;return result.select(function(y){return resultSelector(x,y,i)})})}if(typeof selector==="function"){return selectMany.call(this,selector)}return selectMany.call(this,function(){return selector})};observableProto.selectSwitch=observableProto.flatMapLatest=observableProto.switchMap=function(selector,thisArg){return this.select(selector,thisArg).switchLatest()};observableProto.skip=function(count){if(count<0){throw new Error(argumentOutOfRange)}var observable=this;return new AnonymousObservable(function(observer){var remaining=count;return observable.subscribe(function(x){if(remaining<=0){observer.onNext(x)}else{remaining--}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.skipWhile=function(predicate,thisArg){var source=this;return new AnonymousObservable(function(observer){var i=0,running=false;return source.subscribe(function(x){if(!running){try{running=!predicate.call(thisArg,x,i++,source)}catch(e){observer.onError(e);return}}if(running){observer.onNext(x)}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.take=function(count,scheduler){if(count<0){throw new Error(argumentOutOfRange)}if(count===0){return observableEmpty(scheduler)}var observable=this;return new AnonymousObservable(function(observer){var remaining=count;return observable.subscribe(function(x){if(remaining>0){remaining--;observer.onNext(x);if(remaining===0){observer.onCompleted()}}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.takeWhile=function(predicate,thisArg){var observable=this;return new AnonymousObservable(function(observer){var i=0,running=true;return observable.subscribe(function(x){if(running){try{running=predicate.call(thisArg,x,i++,observable)}catch(e){observer.onError(e);return}if(running){observer.onNext(x)}else{observer.onCompleted()}}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.where=observableProto.filter=function(predicate,thisArg){var parent=this;return new AnonymousObservable(function(observer){var count=0;return parent.subscribe(function(value){var shouldRun;try{shouldRun=predicate.call(thisArg,value,count++,parent)}catch(exception){observer.onError(exception);return}if(shouldRun){observer.onNext(value)}},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.finalValue=function(){var source=this;return new AnonymousObservable(function(observer){var hasValue=false,value;return source.subscribe(function(x){hasValue=true;value=x},observer.onError.bind(observer),function(){if(!hasValue){observer.onError(new Error(sequenceContainsNoElements))}else{observer.onNext(value);observer.onCompleted()}})})};function extremaBy(source,keySelector,comparer){return new AnonymousObservable(function(observer){var hasValue=false,lastKey=null,list=[];return source.subscribe(function(x){var comparison,key;try{key=keySelector(x)}catch(ex){observer.onError(ex);return}comparison=0;if(!hasValue){hasValue=true;lastKey=key}else{try{comparison=comparer(key,lastKey)}catch(ex1){observer.onError(ex1);return}}if(comparison>0){lastKey=key;list=[]}if(comparison>=0){list.push(x)}},observer.onError.bind(observer),function(){observer.onNext(list);observer.onCompleted()})})}function firstOnly(x){if(x.length===0){throw new Error(sequenceContainsNoElements)}return x[0]}observableProto.aggregate=function(){var seed,hasSeed,accumulator;if(arguments.length===2){seed=arguments[0];hasSeed=true;accumulator=arguments[1]}else{accumulator=arguments[0]}return hasSeed?this.scan(seed,accumulator).startWith(seed).finalValue():this.scan(accumulator).finalValue()};observableProto.reduce=function(accumulator){var seed,hasSeed;if(arguments.length===2){hasSeed=true;seed=arguments[1]}return hasSeed?this.scan(seed,accumulator).startWith(seed).finalValue():this.scan(accumulator).finalValue()};observableProto.some=observableProto.any=function(predicate,thisArg){var source=this;return predicate?source.where(predicate,thisArg).any():new AnonymousObservable(function(observer){return source.subscribe(function(){observer.onNext(true);observer.onCompleted()},observer.onError.bind(observer),function(){observer.onNext(false);observer.onCompleted()})})};observableProto.isEmpty=function(){return this.any().select(function(b){return!b})};observableProto.every=observableProto.all=function(predicate,thisArg){return this.where(function(v){return!predicate(v)},thisArg).any().select(function(b){return!b})};observableProto.contains=function(value,comparer){comparer||(comparer=defaultComparer);return this.where(function(v){return comparer(v,value)}).any()};observableProto.count=function(predicate,thisArg){return predicate?this.where(predicate,thisArg).count():this.aggregate(0,function(count){return count+1})};observableProto.sum=function(keySelector,thisArg){return keySelector?this.select(keySelector,thisArg).sum():this.aggregate(0,function(prev,curr){return prev+curr})};observableProto.minBy=function(keySelector,comparer){comparer||(comparer=defaultSubComparer);return extremaBy(this,keySelector,function(x,y){return comparer(x,y)*-1})};observableProto.min=function(comparer){return this.minBy(identity,comparer).select(function(x){return firstOnly(x)})};observableProto.maxBy=function(keySelector,comparer){comparer||(comparer=defaultSubComparer);return extremaBy(this,keySelector,comparer)};observableProto.max=function(comparer){return this.maxBy(identity,comparer).select(function(x){return firstOnly(x)})};observableProto.average=function(keySelector,thisArg){return keySelector?this.select(keySelector,thisArg).average():this.scan({sum:0,count:0},function(prev,cur){return{sum:prev.sum+cur,count:prev.count+1}}).finalValue().select(function(s){if(s.count===0){throw new Error("The input sequence was empty")}return s.sum/s.count})};function sequenceEqualArray(first,second,comparer){return new AnonymousObservable(function(observer){var count=0,len=second.length;return first.subscribe(function(value){var equal=false;try{if(count<len){equal=comparer(value,second[count++])}}catch(e){observer.onError(e);return}if(!equal){observer.onNext(false);observer.onCompleted()}},observer.onError.bind(observer),function(){observer.onNext(count===len);observer.onCompleted()})})}observableProto.sequenceEqual=function(second,comparer){var first=this;comparer||(comparer=defaultComparer);if(Array.isArray(second)){return sequenceEqualArray(first,second,comparer)}return new AnonymousObservable(function(observer){var donel=false,doner=false,ql=[],qr=[];var subscription1=first.subscribe(function(x){var equal,v;if(qr.length>0){v=qr.shift();try{equal=comparer(v,x)}catch(e){observer.onError(e);return}if(!equal){observer.onNext(false);observer.onCompleted()}}else if(doner){observer.onNext(false);observer.onCompleted()}else{ql.push(x)}},observer.onError.bind(observer),function(){donel=true;if(ql.length===0){if(qr.length>0){observer.onNext(false);observer.onCompleted()}else if(doner){observer.onNext(true);observer.onCompleted()}}});isPromise(second)&&(second=observableFromPromise(second));var subscription2=second.subscribe(function(x){var equal,v;if(ql.length>0){v=ql.shift();try{equal=comparer(v,x)}catch(exception){observer.onError(exception);return}if(!equal){observer.onNext(false);observer.onCompleted()}}else if(donel){observer.onNext(false);observer.onCompleted()}else{qr.push(x)}},observer.onError.bind(observer),function(){doner=true;if(qr.length===0){if(ql.length>0){observer.onNext(false);observer.onCompleted()}else if(donel){observer.onNext(true);observer.onCompleted()}}});return new CompositeDisposable(subscription1,subscription2)})};function elementAtOrDefault(source,index,hasDefault,defaultValue){if(index<0){throw new Error(argumentOutOfRange)}return new AnonymousObservable(function(observer){var i=index;return source.subscribe(function(x){if(i===0){observer.onNext(x);observer.onCompleted()}i--},observer.onError.bind(observer),function(){if(!hasDefault){observer.onError(new Error(argumentOutOfRange))}else{observer.onNext(defaultValue);observer.onCompleted()}})})}observableProto.elementAt=function(index){return elementAtOrDefault(this,index,false)};observableProto.elementAtOrDefault=function(index,defaultValue){return elementAtOrDefault(this,index,true,defaultValue)};function singleOrDefaultAsync(source,hasDefault,defaultValue){return new AnonymousObservable(function(observer){var value=defaultValue,seenValue=false;return source.subscribe(function(x){if(seenValue){observer.onError(new Error("Sequence contains more than one element"))}else{value=x;seenValue=true}},observer.onError.bind(observer),function(){if(!seenValue&&!hasDefault){observer.onError(new Error(sequenceContainsNoElements))}else{observer.onNext(value);observer.onCompleted()}})})}observableProto.single=function(predicate,thisArg){return predicate?this.where(predicate,thisArg).single():singleOrDefaultAsync(this,false)};observableProto.singleOrDefault=function(predicate,defaultValue,thisArg){return predicate?this.where(predicate,thisArg).singleOrDefault(null,defaultValue):singleOrDefaultAsync(this,true,defaultValue)};function firstOrDefaultAsync(source,hasDefault,defaultValue){return new AnonymousObservable(function(observer){return source.subscribe(function(x){observer.onNext(x);observer.onCompleted()},observer.onError.bind(observer),function(){if(!hasDefault){observer.onError(new Error(sequenceContainsNoElements))}else{observer.onNext(defaultValue);observer.onCompleted()}})})}observableProto.first=function(predicate,thisArg){return predicate?this.where(predicate,thisArg).first():firstOrDefaultAsync(this,false)};observableProto.firstOrDefault=function(predicate,defaultValue,thisArg){return predicate?this.where(predicate).firstOrDefault(null,defaultValue):firstOrDefaultAsync(this,true,defaultValue)};function lastOrDefaultAsync(source,hasDefault,defaultValue){return new AnonymousObservable(function(observer){var value=defaultValue,seenValue=false;return source.subscribe(function(x){value=x;seenValue=true},observer.onError.bind(observer),function(){if(!seenValue&&!hasDefault){observer.onError(new Error(sequenceContainsNoElements))}else{observer.onNext(value);observer.onCompleted()}})})}observableProto.last=function(predicate,thisArg){return predicate?this.where(predicate,thisArg).last():lastOrDefaultAsync(this,false)};observableProto.lastOrDefault=function(predicate,defaultValue,thisArg){return predicate?this.where(predicate,thisArg).lastOrDefault(null,defaultValue):lastOrDefaultAsync(this,true,defaultValue)};function findValue(source,predicate,thisArg,yieldIndex){return new AnonymousObservable(function(observer){var i=0;return source.subscribe(function(x){var shouldRun;try{shouldRun=predicate.call(thisArg,x,i,source)}catch(e){observer.onError(e);return}if(shouldRun){observer.onNext(yieldIndex?i:x);observer.onCompleted()}else{i++}},observer.onError.bind(observer),function(){observer.onNext(yieldIndex?-1:undefined);observer.onCompleted()})})}observableProto.find=function(predicate,thisArg){return findValue(this,predicate,thisArg,false)};observableProto.findIndex=function(predicate,thisArg){return findValue(this,predicate,thisArg,true)};Observable.start=function(func,context,scheduler){return observableToAsync(func,context,scheduler)()};var observableToAsync=Observable.toAsync=function(func,context,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);return function(){var args=arguments,subject=new AsyncSubject;scheduler.schedule(function(){var result;try{result=func.apply(context,args)}catch(e){subject.onError(e);return}subject.onNext(result);subject.onCompleted()});return subject.asObservable()}};Observable.fromCallback=function(func,context,selector){return function(){var args=slice.call(arguments,0);return new AnonymousObservable(function(observer){function handler(e){var results=e;if(selector){try{results=selector(arguments)}catch(err){observer.onError(err);return}observer.onNext(results)}else{if(results.length<=1){observer.onNext.apply(observer,results)}else{observer.onNext(results)}}observer.onCompleted()}args.push(handler);func.apply(context,args)})}};Observable.fromNodeCallback=function(func,context,selector){return function(){var args=slice.call(arguments,0);return new AnonymousObservable(function(observer){function handler(err){if(err){observer.onError(err);return}var results=slice.call(arguments,1);if(selector){try{results=selector(results)}catch(e){observer.onError(e);return}observer.onNext(results)}else{if(results.length<=1){observer.onNext.apply(observer,results)}else{observer.onNext(results)}}observer.onCompleted()}args.push(handler);func.apply(context,args)})}};function createListener(element,name,handler){if(element.addListener){element.addListener(name,handler);return disposableCreate(function(){element.removeListener(name,handler)})}if(element.addEventListener){element.addEventListener(name,handler,false);return disposableCreate(function(){element.removeEventListener(name,handler,false)})}throw new Error("No listener found")}function createEventListener(el,eventName,handler){var disposables=new CompositeDisposable;if(typeof el.item==="function"&&typeof el.length==="number"){for(var i=0,len=el.length;i<len;i++){disposables.add(createEventListener(el.item(i),eventName,handler))}}else if(el){disposables.add(createListener(el,eventName,handler))}return disposables}var jq=!!root.angular&&!!angular.element?angular.element:!!root.jQuery?root.jQuery:!!root.Zepto?root.Zepto:null;var ember=!!root.Ember&&typeof root.Ember.addListener==="function";Observable.fromEvent=function(element,eventName,selector){if(ember){return fromEventPattern(function(h){Ember.addListener(element,eventName,h)},function(h){Ember.removeListener(element,eventName,h)},selector)}if(jq){var $elem=jq(element);return fromEventPattern(function(h){$elem.on(eventName,h)},function(h){$elem.off(eventName,h)},selector)}return new AnonymousObservable(function(observer){return createEventListener(element,eventName,function handler(e){var results=e;if(selector){try{results=selector(arguments)}catch(err){observer.onError(err);return}}observer.onNext(results)})}).publish().refCount()};var fromEventPattern=Observable.fromEventPattern=function(addHandler,removeHandler,selector){return new AnonymousObservable(function(observer){function innerHandler(e){var result=e;if(selector){try{result=selector(arguments)}catch(err){observer.onError(err);return}}observer.onNext(result)}var returnValue=addHandler(innerHandler);return disposableCreate(function(){if(removeHandler){removeHandler(innerHandler,returnValue)}})}).publish().refCount()};Observable.startAsync=function(functionAsync){var promise;try{promise=functionAsync()}catch(e){return observableThrow(e)}return observableFromPromise(promise)};var PausableObservable=function(_super){inherits(PausableObservable,_super);function subscribe(observer){var conn=this.source.publish(),subscription=conn.subscribe(observer),connection=disposableEmpty;var pausable=this.subject.distinctUntilChanged().subscribe(function(b){if(b){connection=conn.connect()}else{connection.dispose();connection=disposableEmpty}});return new CompositeDisposable(subscription,connection,pausable)}function PausableObservable(source,subject){this.source=source;this.subject=subject||new Subject;this.isPaused=true;_super.call(this,subscribe)}PausableObservable.prototype.pause=function(){if(this.isPaused===true){return}this.isPaused=true;this.subject.onNext(false)};PausableObservable.prototype.resume=function(){if(this.isPaused===false){return}this.isPaused=false;this.subject.onNext(true)};return PausableObservable}(Observable);observableProto.pausable=function(pauser){return new PausableObservable(this,pauser)};function combineLatestSource(source,subject,resultSelector){return new AnonymousObservable(function(observer){var n=2,hasValue=[false,false],hasValueAll=false,isDone=false,values=new Array(n);function next(x,i){values[i]=x;var res;hasValue[i]=true;if(hasValueAll||(hasValueAll=hasValue.every(identity))){try{res=resultSelector.apply(null,values)}catch(ex){observer.onError(ex);return}observer.onNext(res)}else if(isDone){observer.onCompleted()}}return new CompositeDisposable(source.subscribe(function(x){next(x,0)},observer.onError.bind(observer),function(){isDone=true;observer.onCompleted()}),subject.subscribe(function(x){next(x,1)},observer.onError.bind(observer)))})}var PausableBufferedObservable=function(_super){inherits(PausableBufferedObservable,_super);function subscribe(observer){var q=[],previous=true;var subscription=combineLatestSource(this.source,this.subject.distinctUntilChanged(),function(data,shouldFire){return{data:data,shouldFire:shouldFire}}).subscribe(function(results){if(results.shouldFire&&previous){observer.onNext(results.data)}if(results.shouldFire&&!previous){while(q.length>0){observer.onNext(q.shift())}previous=true}else if(!results.shouldFire&&!previous){q.push(results.data)}else if(!results.shouldFire&&previous){previous=false}},function(err){while(q.length>0){observer.onNext(q.shift())}observer.onError(err)},function(){while(q.length>0){observer.onNext(q.shift())}observer.onCompleted()});this.subject.onNext(false);return subscription}function PausableBufferedObservable(source,subject){this.source=source;this.subject=subject||new Subject;this.isPaused=true;_super.call(this,subscribe)}PausableBufferedObservable.prototype.pause=function(){if(this.isPaused===true){return}this.isPaused=true;this.subject.onNext(false)};PausableBufferedObservable.prototype.resume=function(){if(this.isPaused===false){return}this.isPaused=false;this.subject.onNext(true)};return PausableBufferedObservable}(Observable);observableProto.pausableBuffered=function(subject){return new PausableBufferedObservable(this,subject)};observableProto.controlled=function(enableQueue){if(enableQueue==null){enableQueue=true}return new ControlledObservable(this,enableQueue)};var ControlledObservable=function(_super){inherits(ControlledObservable,_super);function subscribe(observer){return this.source.subscribe(observer)}function ControlledObservable(source,enableQueue){_super.call(this,subscribe);this.subject=new ControlledSubject(enableQueue);this.source=source.multicast(this.subject).refCount()}ControlledObservable.prototype.request=function(numberOfItems){if(numberOfItems==null){numberOfItems=-1}return this.subject.request(numberOfItems)};return ControlledObservable}(Observable);var ControlledSubject=Rx.ControlledSubject=function(_super){function subscribe(observer){return this.subject.subscribe(observer)}inherits(ControlledSubject,_super);function ControlledSubject(enableQueue){if(enableQueue==null){enableQueue=true}_super.call(this,subscribe);this.subject=new Subject;this.enableQueue=enableQueue;this.queue=enableQueue?[]:null;this.requestedCount=0;this.requestedDisposable=disposableEmpty;this.error=null;this.hasFailed=false;this.hasCompleted=false;this.controlledDisposable=disposableEmpty}addProperties(ControlledSubject.prototype,Observer,{onCompleted:function(){checkDisposed.call(this);this.hasCompleted=true;if(!this.enableQueue||this.queue.length===0){this.subject.onCompleted()}},onError:function(error){checkDisposed.call(this);this.hasFailed=true;this.error=error;if(!this.enableQueue||this.queue.length===0){this.subject.onError(error)}},onNext:function(value){checkDisposed.call(this);var hasRequested=false;if(this.requestedCount===0){if(this.enableQueue){this.queue.push(value)}}else{if(this.requestedCount!==-1){if(this.requestedCount--===0){this.disposeCurrentRequest()}}hasRequested=true}if(hasRequested){this.subject.onNext(value)}},_processRequest:function(numberOfItems){if(this.enableQueue){while(this.queue.length>=numberOfItems&&numberOfItems>0){this.subject.onNext(this.queue.shift());numberOfItems--}if(this.queue.length!==0){return{numberOfItems:numberOfItems,returnValue:true}}else{return{numberOfItems:numberOfItems,returnValue:false}}}if(this.hasFailed){this.subject.onError(this.error);this.controlledDisposable.dispose();this.controlledDisposable=disposableEmpty}else if(this.hasCompleted){this.subject.onCompleted();this.controlledDisposable.dispose();this.controlledDisposable=disposableEmpty}return{numberOfItems:numberOfItems,returnValue:false}},request:function(number){checkDisposed.call(this);this.disposeCurrentRequest();var self=this,r=this._processRequest(number);number=r.numberOfItems;if(!r.returnValue){this.requestedCount=number;this.requestedDisposable=disposableCreate(function(){self.requestedCount=0});return this.requestedDisposable}else{return disposableEmpty}},disposeCurrentRequest:function(){this.requestedDisposable.dispose();this.requestedDisposable=disposableEmpty},dispose:function(){this.isDisposed=true;this.error=null;this.subject.dispose();this.requestedDisposable.dispose()}});return ControlledSubject}(Observable);observableProto.multicast=function(subjectOrSubjectSelector,selector){var source=this;return typeof subjectOrSubjectSelector==="function"?new AnonymousObservable(function(observer){var connectable=source.multicast(subjectOrSubjectSelector());return new CompositeDisposable(selector(connectable).subscribe(observer),connectable.connect())}):new ConnectableObservable(source,subjectOrSubjectSelector)};observableProto.publish=function(selector){return!selector?this.multicast(new Subject):this.multicast(function(){return new Subject},selector)};observableProto.share=function(){return this.publish(null).refCount()};observableProto.publishLast=function(selector){return!selector?this.multicast(new AsyncSubject):this.multicast(function(){return new AsyncSubject},selector)};observableProto.publishValue=function(initialValueOrSelector,initialValue){return arguments.length===2?this.multicast(function(){return new BehaviorSubject(initialValue)},initialValueOrSelector):this.multicast(new BehaviorSubject(initialValueOrSelector))};observableProto.shareValue=function(initialValue){return this.publishValue(initialValue).refCount()};observableProto.replay=function(selector,bufferSize,window,scheduler){return!selector?this.multicast(new ReplaySubject(bufferSize,window,scheduler)):this.multicast(function(){return new ReplaySubject(bufferSize,window,scheduler)},selector)};observableProto.shareReplay=function(bufferSize,window,scheduler){return this.replay(null,bufferSize,window,scheduler).refCount()};var InnerSubscription=function(subject,observer){this.subject=subject;this.observer=observer};InnerSubscription.prototype.dispose=function(){if(!this.subject.isDisposed&&this.observer!==null){var idx=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(idx,1);this.observer=null}};var BehaviorSubject=Rx.BehaviorSubject=function(_super){function subscribe(observer){checkDisposed.call(this);if(!this.isStopped){this.observers.push(observer);observer.onNext(this.value);return new InnerSubscription(this,observer)}var ex=this.exception;if(ex){observer.onError(ex)}else{observer.onCompleted()}return disposableEmpty}inherits(BehaviorSubject,_super);function BehaviorSubject(value){_super.call(this,subscribe);this.value=value,this.observers=[],this.isDisposed=false,this.isStopped=false,this.exception=null}addProperties(BehaviorSubject.prototype,Observer,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;for(var i=0,len=os.length;i<len;i++){os[i].onCompleted()}this.observers=[]}},onError:function(error){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;this.exception=error;for(var i=0,len=os.length;i<len;i++){os[i].onError(error)}this.observers=[]}},onNext:function(value){checkDisposed.call(this);if(!this.isStopped){this.value=value;var os=this.observers.slice(0);for(var i=0,len=os.length;i<len;i++){os[i].onNext(value)}}},dispose:function(){this.isDisposed=true;this.observers=null;this.value=null;this.exception=null}});return BehaviorSubject}(Observable);var ReplaySubject=Rx.ReplaySubject=function(_super){function RemovableDisposable(subject,observer){this.subject=subject;this.observer=observer}RemovableDisposable.prototype.dispose=function(){this.observer.dispose();if(!this.subject.isDisposed){var idx=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(idx,1)}};function subscribe(observer){var so=new ScheduledObserver(this.scheduler,observer),subscription=new RemovableDisposable(this,so);checkDisposed.call(this);this._trim(this.scheduler.now());this.observers.push(so);var n=this.q.length;for(var i=0,len=this.q.length;i<len;i++){so.onNext(this.q[i].value)}if(this.hasError){n++;so.onError(this.error)}else if(this.isStopped){n++;so.onCompleted()}so.ensureActive(n);return subscription}inherits(ReplaySubject,_super);function ReplaySubject(bufferSize,windowSize,scheduler){this.bufferSize=bufferSize==null?Number.MAX_VALUE:bufferSize;this.windowSize=windowSize==null?Number.MAX_VALUE:windowSize;this.scheduler=scheduler||currentThreadScheduler;this.q=[];this.observers=[];this.isStopped=false;this.isDisposed=false;this.hasError=false;this.error=null;_super.call(this,subscribe)}addProperties(ReplaySubject.prototype,Observer,{hasObservers:function(){return this.observers.length>0},_trim:function(now){while(this.q.length>this.bufferSize){this.q.shift()}while(this.q.length>0&&now-this.q[0].interval>this.windowSize){this.q.shift()}},onNext:function(value){var observer;checkDisposed.call(this);if(!this.isStopped){var now=this.scheduler.now();
this.q.push({interval:now,value:value});this._trim(now);var o=this.observers.slice(0);for(var i=0,len=o.length;i<len;i++){observer=o[i];observer.onNext(value);observer.ensureActive()}}},onError:function(error){var observer;checkDisposed.call(this);if(!this.isStopped){this.isStopped=true;this.error=error;this.hasError=true;var now=this.scheduler.now();this._trim(now);var o=this.observers.slice(0);for(var i=0,len=o.length;i<len;i++){observer=o[i];observer.onError(error);observer.ensureActive()}this.observers=[]}},onCompleted:function(){var observer;checkDisposed.call(this);if(!this.isStopped){this.isStopped=true;var now=this.scheduler.now();this._trim(now);var o=this.observers.slice(0);for(var i=0,len=o.length;i<len;i++){observer=o[i];observer.onCompleted();observer.ensureActive()}this.observers=[]}},dispose:function(){this.isDisposed=true;this.observers=null}});return ReplaySubject}(Observable);var ConnectableObservable=Rx.ConnectableObservable=function(__super__){inherits(ConnectableObservable,__super__);function ConnectableObservable(source,subject){var hasSubscription=false,subscription;this.connect=function(){if(!hasSubscription){hasSubscription=true;subscription=new CompositeDisposable(source.subscribe(subject),disposableCreate(function(){hasSubscription=false}))}return subscription};__super__.call(this,subject.subscribe.bind(subject))}ConnectableObservable.prototype.refCount=function(){var connectableSubscription,count=0,source=this;return new AnonymousObservable(function(observer){var shouldConnect=++count===1,subscription=source.subscribe(observer);shouldConnect&&(connectableSubscription=source.connect());return function(){subscription.dispose();--count===0&&connectableSubscription.dispose()}})};return ConnectableObservable}(Observable);var Dictionary=function(){var primes=[1,3,7,13,31,61,127,251,509,1021,2039,4093,8191,16381,32749,65521,131071,262139,524287,1048573,2097143,4194301,8388593,16777213,33554393,67108859,134217689,268435399,536870909,1073741789,2147483647],noSuchkey="no such key",duplicatekey="duplicate key";function isPrime(candidate){if(candidate&1===0){return candidate===2}var num1=Math.sqrt(candidate),num2=3;while(num2<=num1){if(candidate%num2===0){return false}num2+=2}return true}function getPrime(min){var index,num,candidate;for(index=0;index<primes.length;++index){num=primes[index];if(num>=min){return num}}candidate=min|1;while(candidate<primes[primes.length-1]){if(isPrime(candidate)){return candidate}candidate+=2}return min}function stringHashFn(str){var hash=757602046;if(!str.length){return hash}for(var i=0,len=str.length;i<len;i++){var character=str.charCodeAt(i);hash=(hash<<5)-hash+character;hash=hash&hash}return hash}function numberHashFn(key){var c2=668265261;key=key^61^key>>>16;key=key+(key<<3);key=key^key>>>4;key=key*c2;key=key^key>>>15;return key}var getHashCode=function(){var uniqueIdCounter=0;return function(obj){if(obj==null){throw new Error(noSuchkey)}if(typeof obj==="string"){return stringHashFn(obj)}if(typeof obj==="number"){return numberHashFn(obj)}if(typeof obj==="boolean"){return obj===true?1:0}if(obj instanceof Date){return numberHashFn(obj.valueOf())}if(obj instanceof RegExp){return stringHashFn(obj.toString())}if(typeof obj.valueOf==="function"){var valueOf=obj.valueOf();if(typeof valueOf==="number"){return numberHashFn(valueOf)}if(typeof obj==="string"){return stringHashFn(valueOf)}}if(obj.getHashCode){return obj.getHashCode()}var id=17*uniqueIdCounter++;obj.getHashCode=function(){return id};return id}}();function newEntry(){return{key:null,value:null,next:0,hashCode:0}}function Dictionary(capacity,comparer){if(capacity<0){throw new Error("out of range")}if(capacity>0){this._initialize(capacity)}this.comparer=comparer||defaultComparer;this.freeCount=0;this.size=0;this.freeList=-1}var dictionaryProto=Dictionary.prototype;dictionaryProto._initialize=function(capacity){var prime=getPrime(capacity),i;this.buckets=new Array(prime);this.entries=new Array(prime);for(i=0;i<prime;i++){this.buckets[i]=-1;this.entries[i]=newEntry()}this.freeList=-1};dictionaryProto.add=function(key,value){return this._insert(key,value,true)};dictionaryProto._insert=function(key,value,add){if(!this.buckets){this._initialize(0)}var index3,num=getHashCode(key)&2147483647,index1=num%this.buckets.length;for(var index2=this.buckets[index1];index2>=0;index2=this.entries[index2].next){if(this.entries[index2].hashCode===num&&this.comparer(this.entries[index2].key,key)){if(add){throw new Error(duplicatekey)}this.entries[index2].value=value;return}}if(this.freeCount>0){index3=this.freeList;this.freeList=this.entries[index3].next;--this.freeCount}else{if(this.size===this.entries.length){this._resize();index1=num%this.buckets.length}index3=this.size;++this.size}this.entries[index3].hashCode=num;this.entries[index3].next=this.buckets[index1];this.entries[index3].key=key;this.entries[index3].value=value;this.buckets[index1]=index3};dictionaryProto._resize=function(){var prime=getPrime(this.size*2),numArray=new Array(prime);for(index=0;index<numArray.length;++index){numArray[index]=-1}var entryArray=new Array(prime);for(index=0;index<this.size;++index){entryArray[index]=this.entries[index]}for(var index=this.size;index<prime;++index){entryArray[index]=newEntry()}for(var index1=0;index1<this.size;++index1){var index2=entryArray[index1].hashCode%prime;entryArray[index1].next=numArray[index2];numArray[index2]=index1}this.buckets=numArray;this.entries=entryArray};dictionaryProto.remove=function(key){if(this.buckets){var num=getHashCode(key)&2147483647,index1=num%this.buckets.length,index2=-1;for(var index3=this.buckets[index1];index3>=0;index3=this.entries[index3].next){if(this.entries[index3].hashCode===num&&this.comparer(this.entries[index3].key,key)){if(index2<0){this.buckets[index1]=this.entries[index3].next}else{this.entries[index2].next=this.entries[index3].next}this.entries[index3].hashCode=-1;this.entries[index3].next=this.freeList;this.entries[index3].key=null;this.entries[index3].value=null;this.freeList=index3;++this.freeCount;return true}else{index2=index3}}}return false};dictionaryProto.clear=function(){var index,len;if(this.size<=0){return}for(index=0,len=this.buckets.length;index<len;++index){this.buckets[index]=-1}for(index=0;index<this.size;++index){this.entries[index]=newEntry()}this.freeList=-1;this.size=0};dictionaryProto._findEntry=function(key){if(this.buckets){var num=getHashCode(key)&2147483647;for(var index=this.buckets[num%this.buckets.length];index>=0;index=this.entries[index].next){if(this.entries[index].hashCode===num&&this.comparer(this.entries[index].key,key)){return index}}}return-1};dictionaryProto.count=function(){return this.size-this.freeCount};dictionaryProto.tryGetValue=function(key){var entry=this._findEntry(key);return entry>=0?this.entries[entry].value:undefined};dictionaryProto.getValues=function(){var index=0,results=[];if(this.entries){for(var index1=0;index1<this.size;index1++){if(this.entries[index1].hashCode>=0){results[index++]=this.entries[index1].value}}}return results};dictionaryProto.get=function(key){var entry=this._findEntry(key);if(entry>=0){return this.entries[entry].value}throw new Error(noSuchkey)};dictionaryProto.set=function(key,value){this._insert(key,value,false)};dictionaryProto.containskey=function(key){return this._findEntry(key)>=0};return Dictionary}();observableProto.join=function(right,leftDurationSelector,rightDurationSelector,resultSelector){var left=this;return new AnonymousObservable(function(observer){var group=new CompositeDisposable,leftDone=false,leftId=0,leftMap=new Dictionary,rightDone=false,rightId=0,rightMap=new Dictionary;group.add(left.subscribe(function(value){var duration,expire,id=leftId++,md=new SingleAssignmentDisposable,result,values;leftMap.add(id,value);group.add(md);expire=function(){if(leftMap.remove(id)&&leftMap.count()===0&&leftDone){observer.onCompleted()}return group.remove(md)};try{duration=leftDurationSelector(value)}catch(e){observer.onError(e);return}md.setDisposable(duration.take(1).subscribe(noop,observer.onError.bind(observer),function(){expire()}));values=rightMap.getValues();for(var i=0;i<values.length;i++){try{result=resultSelector(value,values[i])}catch(exception){observer.onError(exception);return}observer.onNext(result)}},observer.onError.bind(observer),function(){leftDone=true;if(rightDone||leftMap.count()===0){observer.onCompleted()}}));group.add(right.subscribe(function(value){var duration,expire,id=rightId++,md=new SingleAssignmentDisposable,result,values;rightMap.add(id,value);group.add(md);expire=function(){if(rightMap.remove(id)&&rightMap.count()===0&&rightDone){observer.onCompleted()}return group.remove(md)};try{duration=rightDurationSelector(value)}catch(exception){observer.onError(exception);return}md.setDisposable(duration.take(1).subscribe(noop,observer.onError.bind(observer),function(){expire()}));values=leftMap.getValues();for(var i=0;i<values.length;i++){try{result=resultSelector(values[i],value)}catch(exception){observer.onError(exception);return}observer.onNext(result)}},observer.onError.bind(observer),function(){rightDone=true;if(leftDone||rightMap.count()===0){observer.onCompleted()}}));return group})};observableProto.groupJoin=function(right,leftDurationSelector,rightDurationSelector,resultSelector){var left=this;return new AnonymousObservable(function(observer){var nothing=function(){};var group=new CompositeDisposable;var r=new RefCountDisposable(group);var leftMap=new Dictionary;var rightMap=new Dictionary;var leftID=0;var rightID=0;group.add(left.subscribe(function(value){var s=new Subject;var id=leftID++;leftMap.add(id,s);var i,len,leftValues,rightValues;var result;try{result=resultSelector(value,addRef(s,r))}catch(e){leftValues=leftMap.getValues();for(i=0,len=leftValues.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e);return}observer.onNext(result);rightValues=rightMap.getValues();for(i=0,len=rightValues.length;i<len;i++){s.onNext(rightValues[i])}var md=new SingleAssignmentDisposable;group.add(md);var expire=function(){if(leftMap.remove(id)){s.onCompleted()}group.remove(md)};var duration;try{duration=leftDurationSelector(value)}catch(e){leftValues=leftMap.getValues();for(i=0,len=leftMap.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e);return}md.setDisposable(duration.take(1).subscribe(nothing,function(e){leftValues=leftMap.getValues();for(i=0,len=leftValues.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e)},expire))},function(e){var leftValues=leftMap.getValues();for(var i=0,len=leftValues.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e)},observer.onCompleted.bind(observer)));group.add(right.subscribe(function(value){var leftValues,i,len;var id=rightID++;rightMap.add(id,value);var md=new SingleAssignmentDisposable;group.add(md);var expire=function(){rightMap.remove(id);group.remove(md)};var duration;try{duration=rightDurationSelector(value)}catch(e){leftValues=leftMap.getValues();for(i=0,len=leftMap.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e);return}md.setDisposable(duration.take(1).subscribe(nothing,function(e){leftValues=leftMap.getValues();for(i=0,len=leftMap.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e)},expire));leftValues=leftMap.getValues();for(i=0,len=leftValues.length;i<len;i++){leftValues[i].onNext(value)}},function(e){var leftValues=leftMap.getValues();for(var i=0,len=leftValues.length;i<len;i++){leftValues[i].onError(e)}observer.onError(e)}));return r})};observableProto.buffer=function(bufferOpeningsOrClosingSelector,bufferClosingSelector){return this.window.apply(this,arguments).selectMany(function(x){return x.toArray()})};observableProto.window=function(windowOpeningsOrClosingSelector,windowClosingSelector){if(arguments.length===1&&typeof arguments[0]!=="function"){return observableWindowWithBounaries.call(this,windowOpeningsOrClosingSelector)}return typeof windowOpeningsOrClosingSelector==="function"?observableWindowWithClosingSelector.call(this,windowOpeningsOrClosingSelector):observableWindowWithOpenings.call(this,windowOpeningsOrClosingSelector,windowClosingSelector)};function observableWindowWithOpenings(windowOpenings,windowClosingSelector){return windowOpenings.groupJoin(this,windowClosingSelector,function(){return observableEmpty()},function(_,window){return window})}function observableWindowWithBounaries(windowBoundaries){var source=this;return new AnonymousObservable(function(observer){var window=new Subject,d=new CompositeDisposable,r=new RefCountDisposable(d);observer.onNext(addRef(window,r));d.add(source.subscribe(function(x){window.onNext(x)},function(err){window.onError(err);observer.onError(err)},function(){window.onCompleted();observer.onCompleted()}));d.add(windowBoundaries.subscribe(function(w){window.onCompleted();window=new Subject;observer.onNext(addRef(window,r))},function(err){window.onError(err);observer.onError(err)},function(){window.onCompleted();observer.onCompleted()}));return r})}function observableWindowWithClosingSelector(windowClosingSelector){var source=this;return new AnonymousObservable(function(observer){var createWindowClose,m=new SerialDisposable,d=new CompositeDisposable(m),r=new RefCountDisposable(d),window=new Subject;observer.onNext(addRef(window,r));d.add(source.subscribe(function(x){window.onNext(x)},function(ex){window.onError(ex);observer.onError(ex)},function(){window.onCompleted();observer.onCompleted()}));createWindowClose=function(){var m1,windowClose;try{windowClose=windowClosingSelector()}catch(exception){observer.onError(exception);return}m1=new SingleAssignmentDisposable;m.setDisposable(m1);m1.setDisposable(windowClose.take(1).subscribe(noop,function(ex){window.onError(ex);observer.onError(ex)},function(){window.onCompleted();window=new Subject;observer.onNext(addRef(window,r));createWindowClose()}))};createWindowClose();return r})}observableProto.pairwise=function(){var source=this;return new AnonymousObservable(function(observer){var previous,hasPrevious=false;return source.subscribe(function(x){if(hasPrevious){observer.onNext([previous,x])}else{hasPrevious=true}previous=x},observer.onError.bind(observer),observer.onCompleted.bind(observer))})};observableProto.partition=function(predicate,thisArg){var published=this.publish().refCount();return[published.filter(predicate,thisArg),published.filter(function(x,i,o){return!predicate.call(thisArg,x,i,o)})]};function enumerableWhile(condition,source){return new Enumerable(function(){return new Enumerator(function(){return condition()?{done:false,value:source}:{done:true,value:undefined}})})}observableProto.letBind=observableProto["let"]=function(func){return func(this)};Observable["if"]=Observable.ifThen=function(condition,thenSource,elseSourceOrScheduler){return observableDefer(function(){elseSourceOrScheduler||(elseSourceOrScheduler=observableEmpty());isPromise(thenSource)&&(thenSource=observableFromPromise(thenSource));isPromise(elseSourceOrScheduler)&&(elseSourceOrScheduler=observableFromPromise(elseSourceOrScheduler));typeof elseSourceOrScheduler.now==="function"&&(elseSourceOrScheduler=observableEmpty(elseSourceOrScheduler));return condition()?thenSource:elseSourceOrScheduler})};Observable["for"]=Observable.forIn=function(sources,resultSelector){return enumerableFor(sources,resultSelector).concat()};var observableWhileDo=Observable["while"]=Observable.whileDo=function(condition,source){isPromise(source)&&(source=observableFromPromise(source));return enumerableWhile(condition,source).concat()};observableProto.doWhile=function(condition){return observableConcat([this,observableWhileDo(condition,this)])};Observable["case"]=Observable.switchCase=function(selector,sources,defaultSourceOrScheduler){return observableDefer(function(){isPromise(defaultSourceOrScheduler)&&(defaultSourceOrScheduler=observableFromPromise(defaultSourceOrScheduler));defaultSourceOrScheduler||(defaultSourceOrScheduler=observableEmpty());typeof defaultSourceOrScheduler.now==="function"&&(defaultSourceOrScheduler=observableEmpty(defaultSourceOrScheduler));var result=sources[selector()];isPromise(result)&&(result=observableFromPromise(result));return result||defaultSourceOrScheduler})};observableProto.expand=function(selector,scheduler){isScheduler(scheduler)||(scheduler=immediateScheduler);var source=this;return new AnonymousObservable(function(observer){var q=[],m=new SerialDisposable,d=new CompositeDisposable(m),activeCount=0,isAcquired=false;var ensureActive=function(){var isOwner=false;if(q.length>0){isOwner=!isAcquired;isAcquired=true}if(isOwner){m.setDisposable(scheduler.scheduleRecursive(function(self){var work;if(q.length>0){work=q.shift()}else{isAcquired=false;return}var m1=new SingleAssignmentDisposable;d.add(m1);m1.setDisposable(work.subscribe(function(x){observer.onNext(x);var result=null;try{result=selector(x)}catch(e){observer.onError(e)}q.push(result);activeCount++;ensureActive()},observer.onError.bind(observer),function(){d.remove(m1);activeCount--;if(activeCount===0){observer.onCompleted()}}));self()}))}};q.push(source);activeCount++;ensureActive();return d})};Observable.forkJoin=function(){var allSources=argsOrArray(arguments,0);return new AnonymousObservable(function(subscriber){var count=allSources.length;if(count===0){subscriber.onCompleted();return disposableEmpty}var group=new CompositeDisposable,finished=false,hasResults=new Array(count),hasCompleted=new Array(count),results=new Array(count);for(var idx=0;idx<count;idx++){(function(i){var source=allSources[i];isPromise(source)&&(source=observableFromPromise(source));group.add(source.subscribe(function(value){if(!finished){hasResults[i]=true;results[i]=value}},function(e){finished=true;subscriber.onError(e);group.dispose()},function(){if(!finished){if(!hasResults[i]){subscriber.onCompleted();return}hasCompleted[i]=true;for(var ix=0;ix<count;ix++){if(!hasCompleted[ix]){return}}finished=true;subscriber.onNext(results);subscriber.onCompleted()}}))})(idx)}return group})};observableProto.forkJoin=function(second,resultSelector){var first=this;return new AnonymousObservable(function(observer){var leftStopped=false,rightStopped=false,hasLeft=false,hasRight=false,lastLeft,lastRight,leftSubscription=new SingleAssignmentDisposable,rightSubscription=new SingleAssignmentDisposable;isPromise(second)&&(second=observableFromPromise(second));leftSubscription.setDisposable(first.subscribe(function(left){hasLeft=true;lastLeft=left},function(err){rightSubscription.dispose();observer.onError(err)},function(){leftStopped=true;if(rightStopped){if(!hasLeft){observer.onCompleted()}else if(!hasRight){observer.onCompleted()}else{var result;try{result=resultSelector(lastLeft,lastRight)}catch(e){observer.onError(e);return}observer.onNext(result);observer.onCompleted()}}}));rightSubscription.setDisposable(second.subscribe(function(right){hasRight=true;lastRight=right},function(err){leftSubscription.dispose();observer.onError(err)},function(){rightStopped=true;if(leftStopped){if(!hasLeft){observer.onCompleted()}else if(!hasRight){observer.onCompleted()}else{var result;try{result=resultSelector(lastLeft,lastRight)}catch(e){observer.onError(e);return}observer.onNext(result);observer.onCompleted()}}}));return new CompositeDisposable(leftSubscription,rightSubscription)})};observableProto.manySelect=function(selector,scheduler){isScheduler(scheduler)||(scheduler=immediateScheduler);var source=this;return observableDefer(function(){var chain;return source.map(function(x){var curr=new ChainObservable(x);chain&&chain.onNext(x);chain=curr;return curr}).tap(noop,function(e){chain&&chain.onError(e)},function(){chain&&chain.onCompleted()}).observeOn(scheduler).map(selector)})};var ChainObservable=function(__super__){function subscribe(observer){var self=this,g=new CompositeDisposable;g.add(currentThreadScheduler.schedule(function(){observer.onNext(self.head);g.add(self.tail.mergeObservable().subscribe(observer))}));return g}inherits(ChainObservable,__super__);function ChainObservable(head){__super__.call(this,subscribe);this.head=head;this.tail=new AsyncSubject}addProperties(ChainObservable.prototype,Observer,{onCompleted:function(){this.onNext(Observable.empty())},onError:function(e){this.onNext(Observable.throwException(e))},onNext:function(v){this.tail.onNext(v);this.tail.onCompleted()}});return ChainObservable}(Observable);var Map=function(){function Map(){this.keys=[];this.values=[]}Map.prototype["delete"]=function(key){var i=this.keys.indexOf(key);if(i!==-1){this.keys.splice(i,1);this.values.splice(i,1)}return i!==-1};Map.prototype.get=function(key,fallback){var i=this.keys.indexOf(key);return i!==-1?this.values[i]:fallback};Map.prototype.set=function(key,value){var i=this.keys.indexOf(key);if(i!==-1){this.values[i]=value}this.values[this.keys.push(key)-1]=value};Map.prototype.size=function(){return this.keys.length};Map.prototype.has=function(key){return this.keys.indexOf(key)!==-1};Map.prototype.getKeys=function(){return this.keys.slice(0)};Map.prototype.getValues=function(){return this.values.slice(0)};return Map}();function Pattern(patterns){this.patterns=patterns}Pattern.prototype.and=function(other){var patterns=this.patterns.slice(0);patterns.push(other);return new Pattern(patterns)};Pattern.prototype.thenDo=function(selector){return new Plan(this,selector)};function Plan(expression,selector){this.expression=expression;this.selector=selector}Plan.prototype.activate=function(externalSubscriptions,observer,deactivate){var self=this;var joinObservers=[];for(var i=0,len=this.expression.patterns.length;i<len;i++){joinObservers.push(planCreateObserver(externalSubscriptions,this.expression.patterns[i],observer.onError.bind(observer)))}var activePlan=new ActivePlan(joinObservers,function(){var result;try{result=self.selector.apply(self,arguments)}catch(exception){observer.onError(exception);return}observer.onNext(result)},function(){for(var j=0,jlen=joinObservers.length;j<jlen;j++){joinObservers[j].removeActivePlan(activePlan)}deactivate(activePlan)});for(i=0,len=joinObservers.length;i<len;i++){joinObservers[i].addActivePlan(activePlan)}return activePlan};function planCreateObserver(externalSubscriptions,observable,onError){var entry=externalSubscriptions.get(observable);if(!entry){var observer=new JoinObserver(observable,onError);externalSubscriptions.set(observable,observer);return observer}return entry}function ActivePlan(joinObserverArray,onNext,onCompleted){var i,joinObserver;this.joinObserverArray=joinObserverArray;this.onNext=onNext;this.onCompleted=onCompleted;this.joinObservers=new Map;for(i=0;i<this.joinObserverArray.length;i++){joinObserver=this.joinObserverArray[i];this.joinObservers.set(joinObserver,joinObserver)}}ActivePlan.prototype.dequeue=function(){var values=this.joinObservers.getValues();for(var i=0,len=values.length;i<len;i++){values[i].queue.shift()}};ActivePlan.prototype.match=function(){var firstValues,i,len,isCompleted,values,hasValues=true;for(i=0,len=this.joinObserverArray.length;i<len;i++){if(this.joinObserverArray[i].queue.length===0){hasValues=false;break}}if(hasValues){firstValues=[];isCompleted=false;for(i=0,len=this.joinObserverArray.length;i<len;i++){firstValues.push(this.joinObserverArray[i].queue[0]);if(this.joinObserverArray[i].queue[0].kind==="C"){isCompleted=true}}if(isCompleted){this.onCompleted()}else{this.dequeue();values=[];for(i=0;i<firstValues.length;i++){values.push(firstValues[i].value)}this.onNext.apply(this,values)}}};var JoinObserver=function(_super){inherits(JoinObserver,_super);function JoinObserver(source,onError){_super.call(this);this.source=source;this.onError=onError;this.queue=[];this.activePlans=[];this.subscription=new SingleAssignmentDisposable;this.isDisposed=false}var JoinObserverPrototype=JoinObserver.prototype;JoinObserverPrototype.next=function(notification){if(!this.isDisposed){if(notification.kind==="E"){this.onError(notification.exception);return}this.queue.push(notification);var activePlans=this.activePlans.slice(0);for(var i=0,len=activePlans.length;i<len;i++){activePlans[i].match()}}};JoinObserverPrototype.error=noop;JoinObserverPrototype.completed=noop;JoinObserverPrototype.addActivePlan=function(activePlan){this.activePlans.push(activePlan)};JoinObserverPrototype.subscribe=function(){this.subscription.setDisposable(this.source.materialize().subscribe(this))};JoinObserverPrototype.removeActivePlan=function(activePlan){var idx=this.activePlans.indexOf(activePlan);this.activePlans.splice(idx,1);if(this.activePlans.length===0){this.dispose()}};JoinObserverPrototype.dispose=function(){_super.prototype.dispose.call(this);if(!this.isDisposed){this.isDisposed=true;this.subscription.dispose()}};return JoinObserver}(AbstractObserver);observableProto.and=function(right){return new Pattern([this,right])};observableProto.thenDo=function(selector){return new Pattern([this]).thenDo(selector)};Observable.when=function(){var plans=argsOrArray(arguments,0);return new AnonymousObservable(function(observer){var activePlans=[],externalSubscriptions=new Map,group,i,len,joinObserver,joinValues,outObserver;outObserver=observerCreate(observer.onNext.bind(observer),function(exception){var values=externalSubscriptions.getValues();for(var j=0,jlen=values.length;j<jlen;j++){values[j].onError(exception)}observer.onError(exception)},observer.onCompleted.bind(observer));try{for(i=0,len=plans.length;i<len;i++){activePlans.push(plans[i].activate(externalSubscriptions,outObserver,function(activePlan){var idx=activePlans.indexOf(activePlan);activePlans.splice(idx,1);if(activePlans.length===0){outObserver.onCompleted()}}))}}catch(e){observableThrow(e).subscribe(observer)}group=new CompositeDisposable;joinValues=externalSubscriptions.getValues();for(i=0,len=joinValues.length;i<len;i++){joinObserver=joinValues[i];joinObserver.subscribe();group.add(joinObserver)}return group})};function observableTimerDate(dueTime,scheduler){return new AnonymousObservable(function(observer){return scheduler.scheduleWithAbsolute(dueTime,function(){observer.onNext(0);observer.onCompleted()})})}function observableTimerDateAndPeriod(dueTime,period,scheduler){var p=normalizeTime(period);return new AnonymousObservable(function(observer){var count=0,d=dueTime;return scheduler.scheduleRecursiveWithAbsolute(d,function(self){var now;if(p>0){now=scheduler.now();d=d+p;if(d<=now){d=now+p}}observer.onNext(count++);self(d)})})}function observableTimerTimeSpan(dueTime,scheduler){var d=normalizeTime(dueTime);return new AnonymousObservable(function(observer){return scheduler.scheduleWithRelative(d,function(){observer.onNext(0);observer.onCompleted()})})}function observableTimerTimeSpanAndPeriod(dueTime,period,scheduler){if(dueTime===period){return new AnonymousObservable(function(observer){return scheduler.schedulePeriodicWithState(0,period,function(count){observer.onNext(count);return count+1})})}return observableDefer(function(){return observableTimerDateAndPeriod(scheduler.now()+dueTime,period,scheduler)})}var observableinterval=Observable.interval=function(period,scheduler){return observableTimerTimeSpanAndPeriod(period,period,isScheduler(scheduler)?scheduler:timeoutScheduler)};var observableTimer=Observable.timer=function(dueTime,periodOrScheduler,scheduler){var period;isScheduler(scheduler)||(scheduler=timeoutScheduler);if(periodOrScheduler!==undefined&&typeof periodOrScheduler==="number"){period=periodOrScheduler}else if(periodOrScheduler!==undefined&&typeof periodOrScheduler==="object"){scheduler=periodOrScheduler}if(dueTime instanceof Date&&period===undefined){return observableTimerDate(dueTime.getTime(),scheduler)}if(dueTime instanceof Date&&period!==undefined){period=periodOrScheduler;return observableTimerDateAndPeriod(dueTime.getTime(),period,scheduler)}return period===undefined?observableTimerTimeSpan(dueTime,scheduler):observableTimerTimeSpanAndPeriod(dueTime,period,scheduler)};function observableDelayTimeSpan(source,dueTime,scheduler){return new AnonymousObservable(function(observer){var active=false,cancelable=new SerialDisposable,exception=null,q=[],running=false,subscription;subscription=source.materialize().timestamp(scheduler).subscribe(function(notification){var d,shouldRun;if(notification.value.kind==="E"){q=[];q.push(notification);exception=notification.value.exception;shouldRun=!running}else{q.push({value:notification.value,timestamp:notification.timestamp+dueTime});shouldRun=!active;active=true}if(shouldRun){if(exception!==null){observer.onError(exception)}else{d=new SingleAssignmentDisposable;cancelable.setDisposable(d);d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime,function(self){var e,recurseDueTime,result,shouldRecurse;if(exception!==null){return}running=true;do{result=null;if(q.length>0&&q[0].timestamp-scheduler.now()<=0){result=q.shift().value}if(result!==null){result.accept(observer)}}while(result!==null);shouldRecurse=false;recurseDueTime=0;if(q.length>0){shouldRecurse=true;recurseDueTime=Math.max(0,q[0].timestamp-scheduler.now())}else{active=false}e=exception;running=false;if(e!==null){observer.onError(e)}else if(shouldRecurse){self(recurseDueTime)}}))}}});return new CompositeDisposable(subscription,cancelable)})}function observableDelayDate(source,dueTime,scheduler){return observableDefer(function(){return observableDelayTimeSpan(source,dueTime-scheduler.now(),scheduler)})}observableProto.delay=function(dueTime,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);return dueTime instanceof Date?observableDelayDate(this,dueTime.getTime(),scheduler):observableDelayTimeSpan(this,dueTime,scheduler)};observableProto.throttle=function(dueTime,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);return this.throttleWithSelector(function(){return observableTimer(dueTime,scheduler)})};observableProto.windowWithTime=function(timeSpan,timeShiftOrScheduler,scheduler){var source=this,timeShift;timeShiftOrScheduler==null&&(timeShift=timeSpan);isScheduler(scheduler)||(scheduler=timeoutScheduler);if(typeof timeShiftOrScheduler==="number"){timeShift=timeShiftOrScheduler}else if(typeof timeShiftOrScheduler==="object"){timeShift=timeSpan;scheduler=timeShiftOrScheduler}return new AnonymousObservable(function(observer){var groupDisposable,nextShift=timeShift,nextSpan=timeSpan,q=[],refCountDisposable,timerD=new SerialDisposable,totalTime=0;groupDisposable=new CompositeDisposable(timerD),refCountDisposable=new RefCountDisposable(groupDisposable);q.push(new Subject);observer.onNext(addRef(q[0],refCountDisposable));createTimer();groupDisposable.add(source.subscribe(function(x){var i,len;for(i=0,len=q.length;i<len;i++){q[i].onNext(x)}},function(e){var i,len;for(i=0,len=q.length;i<len;i++){q[i].onError(e)}observer.onError(e)},function(){var i,len;for(i=0,len=q.length;i<len;i++){q[i].onCompleted()}observer.onCompleted()}));return refCountDisposable;function createTimer(){var m=new SingleAssignmentDisposable,isSpan=false,isShift=false;timerD.setDisposable(m);if(nextSpan===nextShift){isSpan=true;isShift=true}else if(nextSpan<nextShift){isSpan=true}else{isShift=true}var newTotalTime=isSpan?nextSpan:nextShift,ts=newTotalTime-totalTime;totalTime=newTotalTime;isSpan&&(nextSpan+=timeShift);isShift&&(nextShift+=timeShift);m.setDisposable(scheduler.scheduleWithRelative(ts,function(){var s;if(isShift){s=new Subject;q.push(s);observer.onNext(addRef(s,refCountDisposable))}if(isSpan){s=q.shift();s.onCompleted()}createTimer()}))}})};observableProto.windowWithTimeOrCount=function(timeSpan,count,scheduler){var source=this;isScheduler(scheduler)||(scheduler=timeoutScheduler);return new AnonymousObservable(function(observer){var createTimer,groupDisposable,n=0,refCountDisposable,s=new Subject;timerD=new SerialDisposable,windowId=0;groupDisposable=new CompositeDisposable(timerD);refCountDisposable=new RefCountDisposable(groupDisposable);observer.onNext(addRef(s,refCountDisposable));createTimer(0);groupDisposable.add(source.subscribe(function(x){var newId=0,newWindow=false;s.onNext(x);n++;if(n===count){newWindow=true;
n=0;newId=++windowId;s.onCompleted();s=new Subject;observer.onNext(addRef(s,refCountDisposable))}newWindow&&createTimer(newId)},function(e){s.onError(e);observer.onError(e)},function(){s.onCompleted();observer.onCompleted()}));return refCountDisposable;function createTimer(id){var m=new SingleAssignmentDisposable;timerD.setDisposable(m);m.setDisposable(scheduler.scheduleWithRelative(timeSpan,function(){var newId;if(id!==windowId){return}n=0;newId=++windowId;s.onCompleted();s=new Subject;observer.onNext(addRef(s,refCountDisposable));createTimer(newId)}))}})};observableProto.bufferWithTime=function(timeSpan,timeShiftOrScheduler,scheduler){return this.windowWithTime.apply(this,arguments).selectMany(function(x){return x.toArray()})};observableProto.bufferWithTimeOrCount=function(timeSpan,count,scheduler){return this.windowWithTimeOrCount(timeSpan,count,scheduler).selectMany(function(x){return x.toArray()})};observableProto.timeInterval=function(scheduler){var source=this;isScheduler(scheduler)||(scheduler=timeoutScheduler);return observableDefer(function(){var last=scheduler.now();return source.map(function(x){var now=scheduler.now(),span=now-last;last=now;return{value:x,interval:span}})})};observableProto.timestamp=function(scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);return this.map(function(x){return{value:x,timestamp:scheduler.now()}})};function sampleObservable(source,sampler){return new AnonymousObservable(function(observer){var atEnd,value,hasValue;function sampleSubscribe(){if(hasValue){hasValue=false;observer.onNext(value)}atEnd&&observer.onCompleted()}return new CompositeDisposable(source.subscribe(function(newValue){hasValue=true;value=newValue},observer.onError.bind(observer),function(){atEnd=true}),sampler.subscribe(sampleSubscribe,observer.onError.bind(observer),sampleSubscribe))})}observableProto.sample=function(intervalOrSampler,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);return typeof intervalOrSampler==="number"?sampleObservable(this,observableinterval(intervalOrSampler,scheduler)):sampleObservable(this,intervalOrSampler)};observableProto.timeout=function(dueTime,other,scheduler){other||(other=observableThrow(new Error("Timeout")));isScheduler(scheduler)||(scheduler=timeoutScheduler);var source=this,schedulerMethod=dueTime instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new AnonymousObservable(function(observer){var id=0,original=new SingleAssignmentDisposable,subscription=new SerialDisposable,switched=false,timer=new SerialDisposable;subscription.setDisposable(original);var createTimer=function(){var myId=id;timer.setDisposable(scheduler[schedulerMethod](dueTime,function(){if(id===myId){isPromise(other)&&(other=observableFromPromise(other));subscription.setDisposable(other.subscribe(observer))}}))};createTimer();original.setDisposable(source.subscribe(function(x){if(!switched){id++;observer.onNext(x);createTimer()}},function(e){if(!switched){id++;observer.onError(e)}},function(){if(!switched){id++;observer.onCompleted()}}));return new CompositeDisposable(subscription,timer)})};Observable.generateWithAbsoluteTime=function(initialState,condition,iterate,resultSelector,timeSelector,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);return new AnonymousObservable(function(observer){var first=true,hasResult=false,result,state=initialState,time;return scheduler.scheduleRecursiveWithAbsolute(scheduler.now(),function(self){hasResult&&observer.onNext(result);try{if(first){first=false}else{state=iterate(state)}hasResult=condition(state);if(hasResult){result=resultSelector(state);time=timeSelector(state)}}catch(e){observer.onError(e);return}if(hasResult){self(time)}else{observer.onCompleted()}})})};Observable.generateWithRelativeTime=function(initialState,condition,iterate,resultSelector,timeSelector,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);return new AnonymousObservable(function(observer){var first=true,hasResult=false,result,state=initialState,time;return scheduler.scheduleRecursiveWithRelative(0,function(self){hasResult&&observer.onNext(result);try{if(first){first=false}else{state=iterate(state)}hasResult=condition(state);if(hasResult){result=resultSelector(state);time=timeSelector(state)}}catch(e){observer.onError(e);return}if(hasResult){self(time)}else{observer.onCompleted()}})})};observableProto.delaySubscription=function(dueTime,scheduler){return this.delayWithSelector(observableTimer(dueTime,isScheduler(scheduler)?scheduler:timeoutScheduler),observableEmpty)};observableProto.delayWithSelector=function(subscriptionDelay,delayDurationSelector){var source=this,subDelay,selector;if(typeof subscriptionDelay==="function"){selector=subscriptionDelay}else{subDelay=subscriptionDelay;selector=delayDurationSelector}return new AnonymousObservable(function(observer){var delays=new CompositeDisposable,atEnd=false,done=function(){if(atEnd&&delays.length===0){observer.onCompleted()}},subscription=new SerialDisposable,start=function(){subscription.setDisposable(source.subscribe(function(x){var delay;try{delay=selector(x)}catch(error){observer.onError(error);return}var d=new SingleAssignmentDisposable;delays.add(d);d.setDisposable(delay.subscribe(function(){observer.onNext(x);delays.remove(d);done()},observer.onError.bind(observer),function(){observer.onNext(x);delays.remove(d);done()}))},observer.onError.bind(observer),function(){atEnd=true;subscription.dispose();done()}))};if(!subDelay){start()}else{subscription.setDisposable(subDelay.subscribe(function(){start()},observer.onError.bind(observer),function(){start()}))}return new CompositeDisposable(subscription,delays)})};observableProto.timeoutWithSelector=function(firstTimeout,timeoutdurationSelector,other){if(arguments.length===1){timeoutdurationSelector=firstTimeout;var firstTimeout=observableNever()}other||(other=observableThrow(new Error("Timeout")));var source=this;return new AnonymousObservable(function(observer){var subscription=new SerialDisposable,timer=new SerialDisposable,original=new SingleAssignmentDisposable;subscription.setDisposable(original);var id=0,switched=false,setTimer=function(timeout){var myId=id,timerWins=function(){return id===myId};var d=new SingleAssignmentDisposable;timer.setDisposable(d);d.setDisposable(timeout.subscribe(function(){if(timerWins()){subscription.setDisposable(other.subscribe(observer))}d.dispose()},function(e){if(timerWins()){observer.onError(e)}},function(){if(timerWins()){subscription.setDisposable(other.subscribe(observer))}}))};setTimer(firstTimeout);var observerWins=function(){var res=!switched;if(res){id++}return res};original.setDisposable(source.subscribe(function(x){if(observerWins()){observer.onNext(x);var timeout;try{timeout=timeoutdurationSelector(x)}catch(e){observer.onError(e);return}setTimer(timeout)}},function(e){if(observerWins()){observer.onError(e)}},function(){if(observerWins()){observer.onCompleted()}}));return new CompositeDisposable(subscription,timer)})};observableProto.throttleWithSelector=function(throttleDurationSelector){var source=this;return new AnonymousObservable(function(observer){var value,hasValue=false,cancelable=new SerialDisposable,id=0,subscription=source.subscribe(function(x){var throttle;try{throttle=throttleDurationSelector(x)}catch(e){observer.onError(e);return}hasValue=true;value=x;id++;var currentid=id,d=new SingleAssignmentDisposable;cancelable.setDisposable(d);d.setDisposable(throttle.subscribe(function(){if(hasValue&&id===currentid){observer.onNext(value)}hasValue=false;d.dispose()},observer.onError.bind(observer),function(){if(hasValue&&id===currentid){observer.onNext(value)}hasValue=false;d.dispose()}))},function(e){cancelable.dispose();observer.onError(e);hasValue=false;id++},function(){cancelable.dispose();if(hasValue){observer.onNext(value)}observer.onCompleted();hasValue=false;id++});return new CompositeDisposable(subscription,cancelable)})};observableProto.skipLastWithTime=function(duration,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);var source=this;return new AnonymousObservable(function(observer){var q=[];return source.subscribe(function(x){var now=scheduler.now();q.push({interval:now,value:x});while(q.length>0&&now-q[0].interval>=duration){observer.onNext(q.shift().value)}},observer.onError.bind(observer),function(){var now=scheduler.now();while(q.length>0&&now-q[0].interval>=duration){observer.onNext(q.shift().value)}observer.onCompleted()})})};observableProto.takeLastWithTime=function(duration,timerScheduler,loopScheduler){return this.takeLastBufferWithTime(duration,timerScheduler).selectMany(function(xs){return observableFromArray(xs,loopScheduler)})};observableProto.takeLastBufferWithTime=function(duration,scheduler){var source=this;isScheduler(scheduler)||(scheduler=timeoutScheduler);return new AnonymousObservable(function(observer){var q=[];return source.subscribe(function(x){var now=scheduler.now();q.push({interval:now,value:x});while(q.length>0&&now-q[0].interval>=duration){q.shift()}},observer.onError.bind(observer),function(){var now=scheduler.now(),res=[];while(q.length>0){var next=q.shift();if(now-next.interval<=duration){res.push(next.value)}}observer.onNext(res);observer.onCompleted()})})};observableProto.takeWithTime=function(duration,scheduler){var source=this;isScheduler(scheduler)||(scheduler=timeoutScheduler);return new AnonymousObservable(function(observer){return new CompositeDisposable(scheduler.scheduleWithRelative(duration,observer.onCompleted.bind(observer)),source.subscribe(observer))})};observableProto.skipWithTime=function(duration,scheduler){var source=this;isScheduler(scheduler)||(scheduler=timeoutScheduler);return new AnonymousObservable(function(observer){var open=false;return new CompositeDisposable(scheduler.scheduleWithRelative(duration,function(){open=true}),source.subscribe(function(x){open&&observer.onNext(x)},observer.onError.bind(observer),observer.onCompleted.bind(observer)))})};observableProto.skipUntilWithTime=function(startTime,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);var source=this,schedulerMethod=startTime instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new AnonymousObservable(function(observer){var open=false;return new CompositeDisposable(scheduler[schedulerMethod](startTime,function(){open=true}),source.subscribe(function(x){open&&observer.onNext(x)},observer.onError.bind(observer),observer.onCompleted.bind(observer)))})};observableProto.takeUntilWithTime=function(endTime,scheduler){isScheduler(scheduler)||(scheduler=timeoutScheduler);var source=this,schedulerMethod=endTime instanceof Date?"scheduleWithAbsolute":"scheduleWithRelative";return new AnonymousObservable(function(observer){return new CompositeDisposable(scheduler[schedulerMethod](endTime,function(){observer.onCompleted()}),source.subscribe(observer))})};observableProto.exclusive=function(){var sources=this;return new AnonymousObservable(function(observer){var hasCurrent=false,isStopped=false,m=new SingleAssignmentDisposable,g=new CompositeDisposable;g.add(m);m.setDisposable(sources.subscribe(function(innerSource){if(!hasCurrent){hasCurrent=true;isPromise(innerSource)&&(innerSource=observableFromPromise(innerSource));var innerSubscription=new SingleAssignmentDisposable;g.add(innerSubscription);innerSubscription.setDisposable(innerSource.subscribe(observer.onNext.bind(observer),observer.onError.bind(observer),function(){g.remove(innerSubscription);hasCurrent=false;if(isStopped&&g.length===1){observer.onCompleted()}}))}},observer.onError.bind(observer),function(){isStopped=true;if(!hasCurrent&&g.length===1){observer.onCompleted()}}));return g})};observableProto.exclusiveMap=function(selector,thisArg){var sources=this;return new AnonymousObservable(function(observer){var index=0,hasCurrent=false,isStopped=true,m=new SingleAssignmentDisposable,g=new CompositeDisposable;g.add(m);m.setDisposable(sources.subscribe(function(innerSource){if(!hasCurrent){hasCurrent=true;innerSubscription=new SingleAssignmentDisposable;g.add(innerSubscription);isPromise(innerSource)&&(innerSource=observableFromPromise(innerSource));innerSubscription.setDisposable(innerSource.subscribe(function(x){var result;try{result=selector.call(thisArg,x,index++,innerSource)}catch(e){observer.onError(e);return}observer.onNext(result)},observer.onError.bind(observer),function(){g.remove(innerSubscription);hasCurrent=false;if(isStopped&&g.length===1){observer.onCompleted()}}))}},observer.onError.bind(observer),function(){isStopped=true;if(g.length===1&&!hasCurrent){observer.onCompleted()}}));return g})};Rx.VirtualTimeScheduler=function(_super){function notImplemented(){throw new Error("Not implemented")}function localNow(){return this.toDateTimeOffset(this.clock)}function scheduleNow(state,action){return this.scheduleAbsoluteWithState(state,this.clock,action)}function scheduleRelative(state,dueTime,action){return this.scheduleRelativeWithState(state,this.toRelative(dueTime),action)}function scheduleAbsolute(state,dueTime,action){return this.scheduleRelativeWithState(state,this.toRelative(dueTime-this.now()),action)}function invokeAction(scheduler,action){action();return disposableEmpty}inherits(VirtualTimeScheduler,_super);function VirtualTimeScheduler(initialClock,comparer){this.clock=initialClock;this.comparer=comparer;this.isEnabled=false;this.queue=new PriorityQueue(1024);_super.call(this,localNow,scheduleNow,scheduleRelative,scheduleAbsolute)}var VirtualTimeSchedulerPrototype=VirtualTimeScheduler.prototype;VirtualTimeSchedulerPrototype.add=notImplemented;VirtualTimeSchedulerPrototype.toDateTimeOffset=notImplemented;VirtualTimeSchedulerPrototype.toRelative=notImplemented;VirtualTimeSchedulerPrototype.schedulePeriodicWithState=function(state,period,action){var s=new SchedulePeriodicRecursive(this,state,period,action);return s.start()};VirtualTimeSchedulerPrototype.scheduleRelativeWithState=function(state,dueTime,action){var runAt=this.add(this.clock,dueTime);return this.scheduleAbsoluteWithState(state,runAt,action)};VirtualTimeSchedulerPrototype.scheduleRelative=function(dueTime,action){return this.scheduleRelativeWithState(action,dueTime,invokeAction)};VirtualTimeSchedulerPrototype.start=function(){var next;if(!this.isEnabled){this.isEnabled=true;do{next=this.getNext();if(next!==null){if(this.comparer(next.dueTime,this.clock)>0){this.clock=next.dueTime}next.invoke()}else{this.isEnabled=false}}while(this.isEnabled)}};VirtualTimeSchedulerPrototype.stop=function(){this.isEnabled=false};VirtualTimeSchedulerPrototype.advanceTo=function(time){var next;var dueToClock=this.comparer(this.clock,time);if(this.comparer(this.clock,time)>0){throw new Error(argumentOutOfRange)}if(dueToClock===0){return}if(!this.isEnabled){this.isEnabled=true;do{next=this.getNext();if(next!==null&&this.comparer(next.dueTime,time)<=0){if(this.comparer(next.dueTime,this.clock)>0){this.clock=next.dueTime}next.invoke()}else{this.isEnabled=false}}while(this.isEnabled);this.clock=time}};VirtualTimeSchedulerPrototype.advanceBy=function(time){var dt=this.add(this.clock,time);var dueToClock=this.comparer(this.clock,dt);if(dueToClock>0){throw new Error(argumentOutOfRange)}if(dueToClock===0){return}this.advanceTo(dt)};VirtualTimeSchedulerPrototype.sleep=function(time){var dt=this.add(this.clock,time);if(this.comparer(this.clock,dt)>=0){throw new Error(argumentOutOfRange)}this.clock=dt};VirtualTimeSchedulerPrototype.getNext=function(){var next;while(this.queue.length>0){next=this.queue.peek();if(next.isCancelled()){this.queue.dequeue()}else{return next}}return null};VirtualTimeSchedulerPrototype.scheduleAbsolute=function(dueTime,action){return this.scheduleAbsoluteWithState(action,dueTime,invokeAction)};VirtualTimeSchedulerPrototype.scheduleAbsoluteWithState=function(state,dueTime,action){var self=this,run=function(scheduler,state1){self.queue.remove(si);return action(scheduler,state1)},si=new ScheduledItem(self,state,run,dueTime,self.comparer);self.queue.enqueue(si);return si.disposable};return VirtualTimeScheduler}(Scheduler);Rx.HistoricalScheduler=function(_super){inherits(HistoricalScheduler,_super);function HistoricalScheduler(initialClock,comparer){var clock=initialClock==null?0:initialClock;var cmp=comparer||defaultSubComparer;_super.call(this,clock,cmp)}var HistoricalSchedulerProto=HistoricalScheduler.prototype;HistoricalSchedulerProto.add=function(absolute,relative){return absolute+relative};HistoricalSchedulerProto.toDateTimeOffset=function(absolute){return new Date(absolute).getTime()};HistoricalSchedulerProto.toRelative=function(timeSpan){return timeSpan};return HistoricalScheduler}(Rx.VirtualTimeScheduler);var AnonymousObservable=Rx.AnonymousObservable=function(__super__){inherits(AnonymousObservable,__super__);function fixSubscriber(subscriber){if(typeof subscriber==="undefined"){subscriber=disposableEmpty}else if(typeof subscriber==="function"){subscriber=disposableCreate(subscriber)}return subscriber}function AnonymousObservable(subscribe){if(!(this instanceof AnonymousObservable)){return new AnonymousObservable(subscribe)}function s(observer){var setDisposable=function(){try{autoDetachObserver.setDisposable(fixSubscriber(subscribe(autoDetachObserver)))}catch(e){if(!autoDetachObserver.fail(e)){throw e}}};var autoDetachObserver=new AutoDetachObserver(observer);if(currentThreadScheduler.scheduleRequired()){currentThreadScheduler.schedule(setDisposable)}else{setDisposable()}return autoDetachObserver}__super__.call(this,s)}return AnonymousObservable}(Observable);var AutoDetachObserver=function(_super){inherits(AutoDetachObserver,_super);function AutoDetachObserver(observer){_super.call(this);this.observer=observer;this.m=new SingleAssignmentDisposable}var AutoDetachObserverPrototype=AutoDetachObserver.prototype;AutoDetachObserverPrototype.next=function(value){var noError=false;try{this.observer.onNext(value);noError=true}catch(e){throw e}finally{if(!noError){this.dispose()}}};AutoDetachObserverPrototype.error=function(exn){try{this.observer.onError(exn)}catch(e){throw e}finally{this.dispose()}};AutoDetachObserverPrototype.completed=function(){try{this.observer.onCompleted()}catch(e){throw e}finally{this.dispose()}};AutoDetachObserverPrototype.setDisposable=function(value){this.m.setDisposable(value)};AutoDetachObserverPrototype.getDisposable=function(value){return this.m.getDisposable()};AutoDetachObserverPrototype.disposable=function(value){return arguments.length?this.getDisposable():setDisposable(value)};AutoDetachObserverPrototype.dispose=function(){_super.prototype.dispose.call(this);this.m.dispose()};return AutoDetachObserver}(AbstractObserver);var GroupedObservable=function(_super){inherits(GroupedObservable,_super);function subscribe(observer){return this.underlyingObservable.subscribe(observer)}function GroupedObservable(key,underlyingObservable,mergedDisposable){_super.call(this,subscribe);this.key=key;this.underlyingObservable=!mergedDisposable?underlyingObservable:new AnonymousObservable(function(observer){return new CompositeDisposable(mergedDisposable.getDisposable(),underlyingObservable.subscribe(observer))})}return GroupedObservable}(Observable);var Subject=Rx.Subject=function(_super){function subscribe(observer){checkDisposed.call(this);if(!this.isStopped){this.observers.push(observer);return new InnerSubscription(this,observer)}if(this.exception){observer.onError(this.exception);return disposableEmpty}observer.onCompleted();return disposableEmpty}inherits(Subject,_super);function Subject(){_super.call(this,subscribe);this.isDisposed=false,this.isStopped=false,this.observers=[]}addProperties(Subject.prototype,Observer,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;for(var i=0,len=os.length;i<len;i++){os[i].onCompleted()}this.observers=[]}},onError:function(exception){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;this.exception=exception;for(var i=0,len=os.length;i<len;i++){os[i].onError(exception)}this.observers=[]}},onNext:function(value){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);for(var i=0,len=os.length;i<len;i++){os[i].onNext(value)}}},dispose:function(){this.isDisposed=true;this.observers=null}});Subject.create=function(observer,observable){return new AnonymousSubject(observer,observable)};return Subject}(Observable);var AsyncSubject=Rx.AsyncSubject=function(_super){function subscribe(observer){checkDisposed.call(this);if(!this.isStopped){this.observers.push(observer);return new InnerSubscription(this,observer)}var ex=this.exception,hv=this.hasValue,v=this.value;if(ex){observer.onError(ex)}else if(hv){observer.onNext(v);observer.onCompleted()}else{observer.onCompleted()}return disposableEmpty}inherits(AsyncSubject,_super);function AsyncSubject(){_super.call(this,subscribe);this.isDisposed=false;this.isStopped=false;this.value=null;this.hasValue=false;this.observers=[];this.exception=null}addProperties(AsyncSubject.prototype,Observer,{hasObservers:function(){checkDisposed.call(this);return this.observers.length>0},onCompleted:function(){var o,i,len;checkDisposed.call(this);if(!this.isStopped){this.isStopped=true;var os=this.observers.slice(0),v=this.value,hv=this.hasValue;if(hv){for(i=0,len=os.length;i<len;i++){o=os[i];o.onNext(v);o.onCompleted()}}else{for(i=0,len=os.length;i<len;i++){os[i].onCompleted()}}this.observers=[]}},onError:function(exception){checkDisposed.call(this);if(!this.isStopped){var os=this.observers.slice(0);this.isStopped=true;this.exception=exception;for(var i=0,len=os.length;i<len;i++){os[i].onError(exception)}this.observers=[]}},onNext:function(value){checkDisposed.call(this);if(!this.isStopped){this.value=value;this.hasValue=true}},dispose:function(){this.isDisposed=true;this.observers=null;this.exception=null;this.value=null}});return AsyncSubject}(Observable);var AnonymousSubject=function(_super){inherits(AnonymousSubject,_super);function subscribe(observer){return this.observable.subscribe(observer)}function AnonymousSubject(observer,observable){_super.call(this,subscribe);this.observer=observer;this.observable=observable}addProperties(AnonymousSubject.prototype,Observer,{onCompleted:function(){this.observer.onCompleted()},onError:function(exception){this.observer.onError(exception)},onNext:function(value){this.observer.onNext(value)}});return AnonymousSubject}(Observable);if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){root.Rx=Rx;define(function(){return Rx})}else if(freeExports&&freeModule){if(moduleExports){(freeModule.exports=Rx).Rx=Rx}else{freeExports.Rx=Rx}}else{root.Rx=Rx}}).call(this)}).call(this,require("/home/admin/browserify-cdn/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"),typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"/home/admin/browserify-cdn/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":2}],4:[function(require,module,exports){(function(global){(function(factory){var objectTypes={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false};var root=objectTypes[typeof window]&&window||this,freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports,freeModule=objectTypes[typeof module]&&module&&!module.nodeType&&module,moduleExports=freeModule&&freeModule.exports===freeExports&&freeExports,freeGlobal=objectTypes[typeof global]&&global;if(freeGlobal&&(freeGlobal.global===freeGlobal||freeGlobal.window===freeGlobal)){root=freeGlobal}if(typeof define==="function"&&define.amd){define(["rx.virtualtime","exports"],function(Rx,exports){root.Rx=factory(root,exports,Rx);return root.Rx})}else if(typeof module==="object"&&module&&module.exports===freeExports){module.exports=factory(root,module.exports,require("./rx.all"))}else{root.Rx=factory(root,{},root.Rx)}}).call(this,function(root,exp,Rx,undefined){var Observer=Rx.Observer,Observable=Rx.Observable,Notification=Rx.Notification,VirtualTimeScheduler=Rx.VirtualTimeScheduler,Disposable=Rx.Disposable,disposableEmpty=Disposable.empty,disposableCreate=Disposable.create,CompositeDisposable=Rx.CompositeDisposable,SingleAssignmentDisposable=Rx.SingleAssignmentDisposable,slice=Array.prototype.slice,inherits=Rx.internals.inherits,defaultComparer=Rx.internals.isEqual;function argsOrArray(args,idx){return args.length===1&&Array.isArray(args[idx])?args[idx]:slice.call(args)}function OnNextPredicate(predicate){this.predicate=predicate}OnNextPredicate.prototype.equals=function(other){if(other===this){return true}if(other==null){return false}if(other.kind!=="N"){return false}return this.predicate(other.value)};function OnErrorPredicate(predicate){this.predicate=predicate}OnErrorPredicate.prototype.equals=function(other){if(other===this){return true}if(other==null){return false}if(other.kind!=="E"){return false}return this.predicate(other.exception)};var ReactiveTest=Rx.ReactiveTest={created:100,subscribed:200,disposed:1e3,onNext:function(ticks,value){if(typeof value==="function"){return new Recorded(ticks,new OnNextPredicate(value))}return new Recorded(ticks,Notification.createOnNext(value))},onError:function(ticks,exception){if(typeof exception==="function"){return new Recorded(ticks,new OnErrorPredicate(exception))}return new Recorded(ticks,Notification.createOnError(exception))},onCompleted:function(ticks){return new Recorded(ticks,Notification.createOnCompleted())},subscribe:function(start,end){return new Subscription(start,end)}};var Recorded=Rx.Recorded=function(time,value,comparer){this.time=time;this.value=value;this.comparer=comparer||defaultComparer};Recorded.prototype.equals=function(other){return this.time===other.time&&this.comparer(this.value,other.value)};Recorded.prototype.toString=function(){return this.value.toString()+"@"+this.time};var Subscription=Rx.Subscription=function(start,end){this.subscribe=start;this.unsubscribe=end||Number.MAX_VALUE};Subscription.prototype.equals=function(other){return this.subscribe===other.subscribe&&this.unsubscribe===other.unsubscribe};Subscription.prototype.toString=function(){return"("+this.subscribe+", "+this.unsubscribe===Number.MAX_VALUE?"Infinite":this.unsubscribe+")"};var MockDisposable=Rx.MockDisposable=function(scheduler){this.scheduler=scheduler;this.disposes=[];this.disposes.push(this.scheduler.clock)};MockDisposable.prototype.dispose=function(){this.disposes.push(this.scheduler.clock)};var MockObserver=function(_super){inherits(MockObserver,_super);function MockObserver(scheduler){_super.call(this);this.scheduler=scheduler;this.messages=[]}var MockObserverPrototype=MockObserver.prototype;MockObserverPrototype.onNext=function(value){this.messages.push(new Recorded(this.scheduler.clock,Notification.createOnNext(value)))};MockObserverPrototype.onError=function(exception){this.messages.push(new Recorded(this.scheduler.clock,Notification.createOnError(exception)))};MockObserverPrototype.onCompleted=function(){this.messages.push(new Recorded(this.scheduler.clock,Notification.createOnCompleted()))};return MockObserver}(Observer);var HotObservable=function(_super){function subscribe(observer){var observable=this;this.observers.push(observer);this.subscriptions.push(new Subscription(this.scheduler.clock));var index=this.subscriptions.length-1;return disposableCreate(function(){var idx=observable.observers.indexOf(observer);observable.observers.splice(idx,1);observable.subscriptions[index]=new Subscription(observable.subscriptions[index].subscribe,observable.scheduler.clock)})}inherits(HotObservable,_super);function HotObservable(scheduler,messages){_super.call(this,subscribe);var message,notification,observable=this;this.scheduler=scheduler;this.messages=messages;this.subscriptions=[];this.observers=[];for(var i=0,len=this.messages.length;i<len;i++){message=this.messages[i];notification=message.value;(function(innerNotification){scheduler.scheduleAbsoluteWithState(null,message.time,function(){var obs=observable.observers.slice(0);for(var j=0,jLen=obs.length;j<jLen;j++){innerNotification.accept(obs[j])}return disposableEmpty})})(notification)}}return HotObservable}(Observable);var ColdObservable=function(_super){function subscribe(observer){var message,notification,observable=this;this.subscriptions.push(new Subscription(this.scheduler.clock));var index=this.subscriptions.length-1;var d=new CompositeDisposable;for(var i=0,len=this.messages.length;i<len;i++){message=this.messages[i];notification=message.value;(function(innerNotification){d.add(observable.scheduler.scheduleRelativeWithState(null,message.time,function(){innerNotification.accept(observer);return disposableEmpty}))})(notification)}return disposableCreate(function(){observable.subscriptions[index]=new Subscription(observable.subscriptions[index].subscribe,observable.scheduler.clock);d.dispose()})}inherits(ColdObservable,_super);function ColdObservable(scheduler,messages){_super.call(this,subscribe);this.scheduler=scheduler;this.messages=messages;this.subscriptions=[]}return ColdObservable}(Observable);Rx.TestScheduler=function(_super){inherits(TestScheduler,_super);function baseComparer(x,y){return x>y?1:x<y?-1:0}function TestScheduler(){_super.call(this,0,baseComparer)}TestScheduler.prototype.scheduleAbsoluteWithState=function(state,dueTime,action){if(dueTime<=this.clock){dueTime=this.clock+1}return _super.prototype.scheduleAbsoluteWithState.call(this,state,dueTime,action)};TestScheduler.prototype.add=function(absolute,relative){return absolute+relative};TestScheduler.prototype.toDateTimeOffset=function(absolute){return new Date(absolute).getTime()};TestScheduler.prototype.toRelative=function(timeSpan){return timeSpan};TestScheduler.prototype.startWithTiming=function(create,created,subscribed,disposed){var observer=this.createObserver(),source,subscription;this.scheduleAbsoluteWithState(null,created,function(){source=create();return disposableEmpty});this.scheduleAbsoluteWithState(null,subscribed,function(){subscription=source.subscribe(observer);return disposableEmpty});this.scheduleAbsoluteWithState(null,disposed,function(){subscription.dispose();return disposableEmpty});this.start();return observer};TestScheduler.prototype.startWithDispose=function(create,disposed){return this.startWithTiming(create,ReactiveTest.created,ReactiveTest.subscribed,disposed)};TestScheduler.prototype.startWithCreate=function(create){return this.startWithTiming(create,ReactiveTest.created,ReactiveTest.subscribed,ReactiveTest.disposed)};TestScheduler.prototype.createHotObservable=function(){var messages=argsOrArray(arguments,0);return new HotObservable(this,messages)};TestScheduler.prototype.createColdObservable=function(){var messages=argsOrArray(arguments,0);return new ColdObservable(this,messages)};TestScheduler.prototype.createObserver=function(){return new MockObserver(this)};return TestScheduler}(VirtualTimeScheduler);return Rx})}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./rx.all":3}],"Vc+y1C":[function(require,module,exports){var Rx=require("./dist/rx.all");require("./dist/rx.testing");var EventEmitter=require("events").EventEmitter,Observable=Rx.Observable;Rx.Node={fromCallback:function(func,scheduler,context,selector){return Observable.fromCallback(func,scheduler,context,selector)},fromNodeCallback:function(func,scheduler,context,selector){return Observable.fromNodeCallback(func,scheduler,context,selector)},fromEvent:function(eventEmitter,eventName,selector){return Observable.fromEvent(eventEmitter,eventName,selector)},toEventEmitter:function(observable,eventName,selector){var e=new EventEmitter;selector||(selector=function(x){return x});e.publish=function(){e.subscription=observable.subscribe(function(x){e.emit(eventName,selector(x))},function(err){e.emit("error",err)},function(){e.emit("end")})};return e},fromStream:function(stream){return Observable.create(function(observer){function dataHandler(data){observer.onNext(data)
}function errorHandler(err){observer.onError(err)}function endHandler(){observer.onCompleted()}stream.addListener("data",dataHandler);stream.addListener("error",errorHandler);stream.addListener("end",endHandler);return function(){stream.removeListener("data",dataHandler);stream.removeListener("error",errorHandler);stream.removeListener("end",endHandler)}}).publish().refCount()},writeToStream:function(observable,stream,encoding){return observable.subscribe(function(x){stream.write(x,encoding)},function(err){stream.emit("error",err)},function(){!stream._isStdio&&stream.end()})}};module.exports=Rx},{"./dist/rx.all":3,"./dist/rx.testing":4,events:1}],rx:[function(require,module,exports){module.exports=require("Vc+y1C")},{}]},{},[]);var Rx=require("rx");window.Rx=Rx;!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),(f.falkor||(f.falkor={})).PathEvaluator=e()}}(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(_dereq_,module,exports){var Rx=_dereq_("../src/rx.ultralite");var Observable=Rx.Observable,Disposable=Rx.Disposable,sentinelSize=50,isArray=Array.isArray;var µTime=1,µRate=.25,µSize=.25,MIN_SAFE_INTEGER=-Math.pow(2,53)-1;PathEvaluator.internals={getPaths:getPaths,setPaths:setPaths,setPBF:setPBF,setPBFRoot:setPBFRoot,setPathsRoot:setPathsRoot,stringify:stringify};PathEvaluator.EXPIRES_NOW=0;PathEvaluator.EXPIRES_NEVER=1;PathEvaluator.lazy=true;PathEvaluator.connected=true;PathEvaluator.streaming=true;PathEvaluator.refreshing=false;PathEvaluator.prototype.get=get;PathEvaluator.prototype.set=set;PathEvaluator.prototype.call=call;PathEvaluator.prototype.invalidate=invalidate;PathEvaluator.prototype.value=value;PathEvaluator.prototype.optimize=optimize;PathEvaluator.prototype.context=context;PathEvaluator.prototype.insert=insert;PathEvaluator.prototype.getValueSync=value;PathEvaluator.prototype.setValueSync=insert;PathEvaluator.prototype.bind=bind;PathEvaluator.prototype.hardBind=hardBind;PathEvaluator.prototype.deferBind=deferBind;PathEvaluator.prototype.serialize=serialize;PathEvaluator.prototype.deserialize=immediateToLazy(deserialize);PathEvaluator.prototype.toBatched=toBatched;PathEvaluator.prototype.toIndependent=toIndependent;PathEvaluator.prototype.toLazy=toLazy;PathEvaluator.prototype.toEager=toEager;PathEvaluator.prototype.toRemote=toRemote;PathEvaluator.prototype.toLocal=toLocal;PathEvaluator.prototype.toProgressive=toProgressive;PathEvaluator.prototype.toAggregate=toAggregate;PathEvaluator.prototype.toCached=toCached;PathEvaluator.prototype.toRefreshed=toRefreshed;function PathEvaluator(maxSize,loader,cache,lazy,batches,streaming,connected,refreshing){this.loader=loader||{get:function(){return Observable.create(function(o){o.onCompleted();return function(){}})}};if(typeof maxSize!=="number"){throw new Error("PathEvaluator: maxSize must be a number.")}this.maxSize=maxSize;this.cache=cache||{};this.path=[];this.timeExpireList=[];this.sizeExpireList=[];this.root=this;this._batches=batches;this._lazy=lazy!==undefined?lazy:PathEvaluator.lazy;this._streaming=streaming!==undefined?streaming:PathEvaluator.streaming;this._connected=connected!==undefined?connected:PathEvaluator.connected;this._refreshing=refreshing!==undefined?refreshing:PathEvaluator.refreshing;return this}function toBatched(newBatch){if(this._batches==null)delete this._batches;return this._batches!==undefined&&newBatch===undefined?this:clone(this,undefined,newBatch||[])}function toIndependent(){return this._batches===undefined?this:clone(this,undefined,null)}function toLazy(){return this._lazy===true?this:clone(this,undefined,undefined,true)}function toEager(){return this._lazy===false?this:clone(this,undefined,undefined,false)}function toProgressive(){return this._streaming===true?this:clone(this,undefined,undefined,undefined,true)}function toAggregate(){return this._streaming===false?this:clone(this,undefined,undefined,undefined,false)}function toRemote(){return this._connected===true?this:clone(this,undefined,undefined,undefined,undefined,true)}function toLocal(){return this._connected===false?this:clone(this,undefined,undefined,undefined,undefined,false)}function toCached(){return this._refreshing===false?this:clone(this,undefined,undefined,undefined,undefined,undefined,false)}function toRefreshed(){return this._refreshing===true?this:clone(this,undefined,undefined,undefined,undefined,undefined,true)}function noop(){}function clone(evaluator,path,batches,lazy,streaming,connected,refreshing){var pe=Object.create(evaluator);if(path!==undefined)pe.path=path;if(batches!==undefined)pe._batches=batches;if(lazy!==undefined)pe._lazy=lazy;if(streaming!==undefined)pe._streaming=streaming;if(connected!==undefined)pe._connected=connected;if(refreshing!==undefined)pe._refreshing=refreshing;return pe}function immediateToLazy(immediateFn){return function lazyImpl(){var self=this,lazyArgs=args(arguments);return Observable.createWithDisposable(function(observer){return immediateFn.apply(self,lazyArgs.concat(self.context(),onNext,onError,onCompleted));function onNext(pbvf){if(self._streaming===false||pbvf===self){observer.onNext(pbvf)}else{var pbv={},path=pbvf.path,value=pbvf.value,i=-1,n=path.length,a=new Array(n);if(typeof value==="object"&&!Array.isArray(value)&&value!=null){value=Object.create(value)}pbv.value=value;while(++i<n){a[i]=path[i]}pbv.path=path;path=pbvf.optimized;i=-1;n=path.length;a=new Array(n);while(++i<n){a[i]=path[i]}pbv.optimized=a;observer.onNext(pbv)}}function onError(e){observer.onError(e)}function onCompleted(){observer.onCompleted()}})}}function args(list){for(var a=[],i=0,n=list.length;i<n;++i){a[i]=list[i]}return a}function serialize(cache){var frame,key,context=cache||this.cache,message={},depth=0,stack=[],keys;descending:while(depth>=0){frame=stack[depth]||(stack[depth]={context:context,message:message,keys:Object.keys(context).filter(internalKeys).sort()});context=frame.context;message=frame.message;keys=frame.keys;while(key=keys.shift()){context=context[key];if(context==null||Array.isArray(context)||typeof context!=="object"){message[key]=context;context=frame.context}else{message=message[key]||(message[key]={});++depth;continue descending}}stack[depth--]=undefined}return message;function internalKeys(x){return x.indexOf("__")!==0}}function deserialize(cache,pbv,onNext,onError,onCompleted){var self=this,frame,key,context=cache,depth=0,path=[],paths=[],stack=[],keys;descending:while(depth>=0){frame=stack[depth]||(stack[depth]={context:context,keys:Object.keys(context).filter(internalKeys).sort()});context=frame.context;keys=frame.keys;while(key=keys.shift()){path[depth]=key;context=context[key];if(context==null||Array.isArray(context)||typeof context!=="object"||context.$type!==undefined){context=frame.context;paths.push(path.slice(0,depth+1))}else{++depth;continue descending}}stack[depth--]=undefined}return setPBFRoot.call(self,{paths:paths,value:cache},noop,finished,finished);function internalKeys(x){return x[0]!=="$"&&x.indexOf("__")!==0}function finished(){onNext(self);onCompleted()}}function stringify(obj,replacer,space){return JSON.stringify(flatten(obj),replacer,space)}function flatten(obj){var flattenedObject,keys,keyCount,key;if(obj===null||typeof obj!=="object"){return obj}else if(obj instanceof Array){flattenedObject=[];for(keyCount=0;keyCount<obj.length;keyCount++){flattenedObject.push(flatten(obj[keyCount]))}return flattenedObject}else{flattenedObject={};do{keys=Object.keys(obj);keys.sort();for(keyCount=0;keyCount<keys.length;keyCount++){key=keys[keyCount];if(key.substring(0,2)!=="__"){flattenedObject[key]=flatten(obj[key])}}obj=Object.getPrototypeOf(obj)}while(obj!==undefined&&obj!==null);return flattenedObject}}function bind(path){var pe=clone(this,this.path.concat(path));pe._context=null;return pe}function hardBind(path){var branch=findPath.call(this,this.path.concat(path,null)),context=branch.value,backRefsLength,evaluator;if(context){evaluator=clone(this,branch.optimized);backRefsLength=context.__refsLength||0;context["__ref"+backRefsLength]=evaluator;context.__refsLength=backRefsLength+1;evaluator._context=context}else{evaluator=clone(this,this.path.concat(path))}return evaluator}function deferBind(path){var self=this;return Observable.create(function(observer){observer.onNext(self.hardBind(path));observer.onCompleted();return noop})}function get(){var a=args(arguments);if(this._lazy){if(this._refreshing){return refreshLazily.call(this,a)}return getLazily.call(this,a)}var pbv=this.context(),onNext=a[a.length-3],onError=a[a.length-2],onCompleted=a[a.length-1];a=a.slice(0,-3);if(this._refreshing){return refreshPaths.call(this,a,pbv,onNext,onError,onCompleted)}return getPaths.call(this,a,pbv,onNext,onError,onCompleted)}var getLazily=immediateToLazy(getPaths),refreshLazily=immediateToLazy(refreshPaths);function getPaths(paths,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]);errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};getting:for(;index<total;++index){original.length=0;path=paths[paths.index=index];last=path.length-1;column=path.index||(path.index=0);reset_refs();reset_cols();unlocking:while(column>=0){parent=contexts[column-1];descend();unlock();path.index=column=ascend(path,column,0);reset_refs();reset_cols()}path.index=0}paths.index=0;if(connected===true&&misses.length>0){return batch_or_load_paths()}finish();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function build_path_set(paths,pathSet,observer){var contexts=[],context,xs,index=-1,total=paths.length,path,column,last,obs;contexts[-1]=pathSet||(pathSet={__observers:[]});building:while(++index<total){path=paths[index];obs=observer||path.observer;last=path.length-1;column=0;unlocking:while(column>=0){context=contexts[column-1];(xs=context.__observers)[xs.length]=obs;for(;column<=last;++column){key=find_key(path[column]);if(key!=null){contexts[column]=context=context[key]||(context[key]={__observers:[]});(xs=context.__observers)[xs.length]=obs}}obs.paths=(obs.paths||0)+1;column=ascend(path,column,0)}}return pathSet}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}save_optimized(optimized,column,offset,key);if(interrupted===false){save_original(original,column,key)}if((context=find_context(parent,key))===undefined){short_circuit();break descending}value=find_value(context);if(isArray(value)){do{stamp();interrupt()}while(isArray(value=find_value(context)));type=undefined;continue descending}else if(type!==undefined){short_circuit();break descending}else if(interrupted===false){contexts[column]=context}type=undefined;parent=context;continue descending}if(key!=null){save_optimized(optimized,column,offset,key);context=find_leaf_context(parent,key)}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){short_circuit_int();break descending}reset_path_from_ref();contexts[column]=parent=context;if(isArray(value)){stamp();interrupt()}type=undefined;continue descending}save_original(original,column,key);break descending}}function unlock(){if(context==null){miss=save_missing();miss.observer=observer;misses[misses.length]=miss}else if(type==="error"){stamp();save_error()}else{stamp();if(streaming===true&&value!==undefined){pbv.value=value;onNext(pbv)}}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function interrupt(){refs[column]=ref=value;if((context=value._context)!==undefined){offset=reset_optimized_from_ref()-column-1;contexts[column]=parent=context}else{prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache;context=value=undefined}}function save_missing(){var i,j,nulls=0,n=optimized.length,miss=new Array(n+last-column);for(i=j=-1;++i<n;){key=optimized[i];if(key!=null){miss[++j]=key}else{--nulls}}i=column;while(++i<=last){key=path[i];if(key!=null){miss[++j]=key}else{--nulls}}miss.length+=nulls;return miss}function batch_or_load_paths(){var loadDisposable=Disposable.empty;if(batches===undefined){pathSet=build_path_set(misses,null,observer);misses=rangeCollapse(buildQueries(pathSet));loadDisposable=self.loader.get(misses).subscribe(function(pbf){pbf=Object.create(pbf);var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=errors;pbf.paths.pathSet=undefined;pbf.paths.observers=undefined;setPBFRoot.call(self,pbf,onNext,onError,onCompleted)},onError,noop);return loadDisposable}else{batch=batches[batches.length-1];if(batch===undefined||batch.pendingLoad===true){batch=Disposable.create(function(){var i=batches.indexOf(batch);if(i!==-1){batches.splice(i,1)}if(batch.batchID!==undefined){clearTimeout(batch.batchID);batch.batchID=undefined}if(batch.pendingLoad===true){loadDisposable.dispose()}batch.pendingLoad=false});batch.batchIndex=batches.length;batch.batchID=setTimeout(function(){var i=batches.indexOf(batch);if(i!==-1){batches.splice(i,1)}batch.batchID=undefined;batch.pendingLoad=true;batch.pathSet=build_path_set(batch.misses);batch.misses=rangeCollapse(buildQueries(batch.pathSet));loadDisposable=self.loader.get(batch.misses).subscribe(function(pbf){pbf=Object.create(pbf);batch.pendingLoad=false;var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=[];pbf.paths.pathSet=batch.pathSet;pbf.paths.observers=batch.observers.concat();setPBFRoot.call(self,pbf,noop,noop,noop)},onError,noop)},16);batch.pendingLoad=false;batches.push(batch)}var batchMisses=batch.misses||(batch.misses=[]);var batchObservers=batch.observers||(batch.observers=[]);batchMisses.push.apply(batchMisses,misses);batchObservers.push(observer);batch.pathSet=batch.pathSet||(batch.pathSet={__observers:[]});return Disposable.create(function(){var batchObservers=batch.observers,i=batchObservers.indexOf(observer);if(i!==-1){batchObservers.splice(i,1)}if(batchObservers.length===0){batch.dispose()}})}}function finish(){if(streaming===false&&onNext!==undefined){onNext({paths:paths,value:self.context().value})}if(errors.length>0&&onError!==undefined){onError({innerErrors:errors})}else if(onCompleted!==undefined){onCompleted()}}function save_error(){errors[errors.length]={optimized:optimized.concat(),path:original.concat(),value:value}}function short_circuit(){if(interrupted===true){short_circuit_int()}else{short_circuit_path()}}function short_circuit_path(){original.length=column+1;optimized.length=column+offset+1}function short_circuit_int(){path=prevs[0]||path;column=cols[0];last=path.length-1;original.length=column+2;original[column+1]=null;optimized.length=column+offset+1}}function refreshPaths(paths,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]);errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};getting:for(;index<total;++index){original.length=0;path=paths[paths.index=index];last=path.length-1;column=path.index||(path.index=0);reset_refs();reset_cols();unlocking:while(column>=0){parent=contexts[column-1];descend();unlock();path.index=column=ascend(path,column,0);reset_refs();reset_cols()}path.index=0}paths.index=0;if(connected===true){return batch_or_load_paths()}finish();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function build_path_set(paths,pathSet,observer){var contexts=[],context,xs,index=-1,total=paths.length,path,column,last,obs;contexts[-1]=pathSet||(pathSet={__observers:[]});building:while(++index<total){path=paths[index];obs=observer||path.observer;last=path.length-1;column=0;unlocking:while(column>=0){context=contexts[column-1];(xs=context.__observers)[xs.length]=obs;for(;column<=last;++column){key=find_key(path[column]);if(key!=null){contexts[column]=context=context[key]||(context[key]={__observers:[]});(xs=context.__observers)[xs.length]=obs}}obs.paths=(obs.paths||0)+1;column=ascend(path,column,0)}}return pathSet}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}save_optimized(optimized,column,offset,key);if(interrupted===false){save_original(original,column,key)}if((context=find_context(parent,key))===undefined){short_circuit();break descending}value=find_value(context);if(isArray(value)){do{stamp();interrupt()}while(isArray(value=find_value(context)));type=undefined;continue descending}else if(type!==undefined){short_circuit();break descending}else if(interrupted===false){contexts[column]=context}type=undefined;parent=context;continue descending}if(key!=null){save_optimized(optimized,column,offset,key);context=find_leaf_context(parent,key)}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){short_circuit_int();break descending}reset_path_from_ref();contexts[column]=parent=context;if(isArray(value)){stamp();interrupt()}type=undefined;continue descending}save_original(original,column,key);break descending}}function unlock(){miss=save_missing();miss.observer=observer;misses[misses.length]=miss;if(context!=null){if(type==="error"){stamp();save_error()}else{stamp();if(streaming===true&&value!==undefined){pbv.value=value;onNext(pbv)}}}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function interrupt(){refs[column]=ref=value;if((context=value._context)!==undefined){offset=reset_optimized_from_ref()-column-1;contexts[column]=parent=context}else{prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache;context=value=undefined}}function save_missing(){var i,j,nulls=0,n=optimized.length,miss=new Array(n+last-column);for(i=j=-1;++i<n;){key=optimized[i];if(key!=null){miss[++j]=key}else{--nulls}}i=column;while(++i<=last){key=path[i];if(key!=null){miss[++j]=key}else{--nulls}}miss.length+=nulls;return miss}function batch_or_load_paths(){var loadDisposable=Disposable.empty;if(batches===undefined){pathSet=build_path_set(misses,null,observer);misses=rangeCollapse(buildQueries(pathSet));loadDisposable=self.loader.get(misses).subscribe(function(pbf){pbf=Object.create(pbf);var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=errors;pbf.paths.pathSet=undefined;pbf.paths.observers=undefined;setPBFRoot.call(self,pbf,onNext,onError,onCompleted)},onError,noop);return loadDisposable}else{batch=batches[batches.length-1];if(batch===undefined||batch.pendingLoad===true){batch=Disposable.create(function(){var i=batches.indexOf(batch);if(i!==-1){batches.splice(i,1)}if(batch.batchID!==undefined){clearTimeout(batch.batchID);batch.batchID=undefined}if(batch.pendingLoad===true){loadDisposable.dispose()}batch.pendingLoad=false});batch.batchIndex=batches.length;batch.batchID=setTimeout(function(){var i=batches.indexOf(batch);if(i!==-1){batches.splice(i,1)}batch.batchID=undefined;batch.pendingLoad=true;batch.pathSet=build_path_set(batch.misses);batch.misses=rangeCollapse(buildQueries(batch.pathSet));loadDisposable=self.loader.get(batch.misses).subscribe(function(pbf){pbf=Object.create(pbf);batch.pendingLoad=false;var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=[];pbf.paths.pathSet=batch.pathSet;pbf.paths.observers=batch.observers.concat();setPBFRoot.call(self,pbf,noop,noop,noop)},onError,noop)},16);batch.pendingLoad=false;batches.push(batch)}var batchMisses=batch.misses||(batch.misses=[]);var batchObservers=batch.observers||(batch.observers=[]);batchMisses.push.apply(batchMisses,misses);batchObservers.push(observer);batch.pathSet=batch.pathSet||(batch.pathSet={__observers:[]});return Disposable.create(function(){var batchObservers=batch.observers,i=batchObservers.indexOf(observer);if(i!==-1){batchObservers.splice(i,1)}if(batchObservers.length===0){batch.dispose()}})}}function finish(){if(streaming===false&&onNext!==undefined){onNext({paths:paths,value:self.context().value})}if(errors.length>0&&onError!==undefined){onError({innerErrors:errors})}else if(onCompleted!==undefined){onCompleted()}}function save_error(){errors[errors.length]={optimized:optimized.concat(),path:original.concat(),value:value}}function short_circuit(){if(interrupted===true){short_circuit_int()}else{short_circuit_path()}}function short_circuit_path(){original.length=column+1;optimized.length=column+offset+1}function short_circuit_int(){path=prevs[0]||path;column=cols[0];last=path.length-1;original.length=column+2;original[column+1]=null;optimized.length=column+offset+1}}function set(){var a=args(arguments);if(this._lazy){if(this._streaming){return setPathsLazily.call(this,a)}return setPBFLazily.call(this,a[0])}var pbv=this.context(),onNext=a[a.length-3],onError=a[a.length-2],onCompleted=a[a.length-1];a=a.slice(0,-3);if(this._streaming){return setPaths.call(this,a,pbv,onNext,onError,onCompleted)}return setPBF.call(this,a[0].paths,a[0].value,pbv,onNext,onError,onCompleted)}var setPBFLazily=immediateToLazy(function(pbf,pbv,n,e,c){return setPBF.call(this,pbf.paths,pbf.value,pbv,n,e,c)});var setPathsLazily=immediateToLazy(setPaths);function setPBFRoot(pbf,onNext,onError,onCompleted){return setPBF.call(this,pbf.paths,pbf.value,{path:[],value:this.cache},onNext,onError,onCompleted)}function setPathsRoot(paths,onNext,onError,onCompleted){return setPaths.call(this,paths,{path:[],value:this.cache},onNext,onError,onCompleted)}function setPBF(paths,messageCache,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]);
errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};generations=paths.generations||(paths.generations=[]);generationsLen=generations.length;message=init_message(paths,paths.messages,messageCache);messages=paths.messages;pathSets=paths.pathSets||(paths.pathSets=[]);pathSets[-1]=pathSet=build_path_set(paths,paths.pathSet||{__observers:[]},observer);setting:for(;index<total;++index){original.length=0;path=paths[paths.index=index];last=path.length-1;column=path.index||(path.index=0);reset_refs();reset_cols();unlocking:while(column>=0){parent=contexts[column-1];messageParent=messages[column-1];pathSet=pathSets[column-1];descend();unlock();path.index=column=ascend(path,column,0);reset_refs();reset_cols()}path.index=0}paths.index=0;update_generations();finish(pathSet);cleanup();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function adjust_contexts(){context.__generation=(context.__generation||0)+1;do{context.$size=(context.$size||0)+sizeOffset;context=context.__parent}while(context!==undefined);context=parent[key];var stack=[],frame,refs,ref,depth=0,i,n;adjusting:while(depth>=0){if((frame=stack[depth])===undefined){i=-1;n=context.__refsLength||0;refs=[];while(++i<n){ref=context["__ref"+i];if(ref&&ref.__tagged===undefined){ref.__tagged=true;generations[generationsLen++]=refs[i]=ref}}if((ref=context.__parent)!==undefined&&ref.__tagged===undefined){ref.__tagged=true;generations[generationsLen++]=refs[i]=ref}frame=stack[depth]={context:context,refs:refs}}refs=frame.refs;if((context=refs[refs.length-1])!==undefined){refs.length-=1;++depth;continue adjusting}stack[depth--]=undefined}context=parent[key];sizeOffset=0}function update_generations(){var i=generations.length,ref;while((ref=generations[--i])!==undefined){ref.__tagged=undefined;ref.__generation=(ref.__generation||0)+1}generations.length=generationsLen=0}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function build_path_set(paths,pathSet,observer){var contexts=[],context,xs,index=-1,total=paths.length,path,column,last,obs;contexts[-1]=pathSet||(pathSet={__observers:[]});building:while(++index<total){path=paths[index];obs=observer||path.observer;last=path.length-1;column=0;unlocking:while(column>=0){context=contexts[column-1];(xs=context.__observers)[xs.length]=obs;for(;column<=last;++column){key=find_key(path[column]);if(key!=null){contexts[column]=context=context[key]||(context[key]={__observers:[]});(xs=context.__observers)[xs.length]=obs}}obs.paths=(obs.paths||0)+1;column=ascend(path,column,0)}}return pathSet}function check_observer_finished(observers,observer){var j;if(--observer.paths===0){if(observer.errors.length>0){observer.onError({innerErrors:observer.errors})}else{observer.onCompleted()}j=observers.indexOf(observer);if(j!==-1){observers.splice(j,1)}}}function descend(){var i,n;descending:for(;column<=last;++column){if(interrupted===false){key=find_key(path[column]);if(key!=null){save_original(original,column,key);pathSet=find_path_set();pathSets[column]=pathSet}else if(column<last){continue descending}else{save_original(original,column,key)}}else{key=path[column];if(key==null&&column<last){continue descending}}if(key!=null){save_optimized(optimized,column,offset,key);context=column<last?find_context():find_leaf_context();message=find_message();if(context===undefined||message===context){size=timestamp=0}else if(message_value_is_leaf()||interrupted===false&&column===last){replace_context(message)}if(context===undefined){if(message===undefined){short_circuit();insert_missing_sentinel();break descending}else{if(message==null){messageExpires=messageTimestamp=2}else{messageTimestamp=message.$timestamp;messageExpires=message.$expires}if(messageTimestamp<timestamp){short_circuit();value=find_value(context);context=undefined;break descending}else if(messageExpires===EXPIRES_NOW){short_circuit();value=find_message_value();context=undefined;break descending}else if(column<last){if(message_value_is_leaf()){insert_message()}else{insert_empty_branch()}}else if(interrupted===true){insert_empty_branch();reset_path_from_ref();contexts[column]=parent=context;messages[column]=messageParent=message;type=undefined;continue descending}else{insert_message();break descending}}}else if(typeof context==="object"){link_context()}}if(isArray(find_value())){stamp();interrupt();messageParent=messageCache;type=undefined;continue descending}else if(type!==undefined){short_circuit();break descending}else if(interrupted===false){contexts[column]=context;messages[column]=message}else if(column===last){if(context===undefined||type==="error"){short_circuit();break descending}reset_path_from_ref();contexts[column]=parent=context;messages[column]=messageParent=message;if(isArray(value)){stamp();interrupt();messageParent=messageCache}type=undefined;continue descending}parent=context;messageParent=message}}function find_message(){return messageParent&&messageParent[key]}function find_message_value(){return messageValue=message!==undefined&&find_message_type()==="sentinel"?message.value:message}function find_message_size(){messageSize=1;if(message_value_has_length()){messageSize=messageValue.length}else if(message!==messageValue&&typeofMessageValue==="object"&&messageValue!==null){messageSize=0}if(messageType!==undefined){messageSize+=sentinelSize}else if(message_value_is_primitive()){messageType="sentinel";messageSize+=sentinelSize;message={$type:messageType,value:messageValue}}else if(!message_value_is_array()){messageSize=message.$size||sentinelSize}type=messageType;return messageSize}function find_message_type(){return messageType=message&&message.$type||undefined}function find_path_set(){return pathSet[key]}function finish(pathSet){var x=observers.concat(),i=-1,n=x.length;while(++i<n){if((observer=x[i]).streaming===false){observer.onNext({paths:observer.misses,value:findPath.call(self,observer.path,self.cache).value})}if(observer.errors.length>0){observer.onError({innerErrors:observer.errors})}else{observer.onCompleted()}}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function init_message(paths,messages,message){return messages===undefined?(paths.messages=[])[-1]=message:messages[-1]}function init_stamp(){sizeExpireList[sizeExpireListLength++]=context;expires=context.$expires;if(expires!==undefined&&expires!==EXPIRES_NEVER&&expires!==EXPIRES_NOW){if(expires<0){expires=now+expires*-1}context.$expires=expires}stamp()}function insert_missing_sentinel(){messageSize=sentinelSize+1;messageValue=value=undefined;messageType=type="sentinel";message={$type:messageType,value:messageValue};sizeOffset+=messageSize;parent[key]=context=message;link_context();adjust_contexts()}function insert_empty_branch(){parent[key]=context={$size:0};link_context()}function insert_message(){value=find_message_value();messageSize=find_message_size();message.$size=size;sizeOffset+=messageSize-size;parent[key]=context=message;link_context();adjust_contexts();context.$type=type=type||"leaf";if(context.__access_time===undefined){init_stamp()}else{stamp()}}function interrupt(){refs[column]=value;prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache}function link_context(){context.__parent=parent;context.__key=key}function message_value_is_leaf(){return message_value_is_primitive()||message_value_is_array()}function message_value_has_length(){return typeof_message_value()==="string"||message_value_is_array()}function message_value_is_array(){return isArray(messageValue)&&(typeofMessageValue="array")}function message_value_is_primitive(){return messageValueIsPrimitive=typeof_message_value()!=="object"||messageValue===null}function replace_context(message){size=context.$size||0;timestamp=context.$timestamp||0;if(message!=null){migrate_references(context,message)}if(isArray(value)){delete_hard_link(context)}context=undefined}function migrate_references(context,message){var mBackRefs=message.__refsLength||0,cBackRefs=context.__refsLength||0,refs=-1,refKey,ref;while(++refs<cBackRefs){refKey="__ref"+refs;ref=context[refKey];ref._context=message;message["__ref"+(mBackRefs+refs)]=ref;delete context[refKey]}}function delete_hard_link(reference){var destination=reference._context;if(destination!=null){var refIndex=(reference.__refIndex||0)-1,refsLen=(destination.__refsLength||0)-1;while(++refIndex<=refsLen){destination["__ref"+refIndex]=destination["__ref"+refIndex+1]}destination.__refsLength=refsLen;if(refsLen<0){delete destination.__ref0;delete destination.__refsLength}delete reference.__refIndex;delete reference._context}}function short_circuit(){if(interrupted===true){short_circuit_int()}else{short_circuit_path()}}function short_circuit_path(){original.length=column+1;optimized.length=column+offset+1}function short_circuit_int(){path=prevs[0]||path;column=cols[0];last=path.length-1;original.length=column+2;original[column+1]=null;optimized.length=column+offset+1}function typeof_message_value(){return typeofMessageValue=typeof find_message_value()}function unlock(){var i,n,x;if(type==="error"){var error={optimized:optimized.concat(),path:original.concat(),value:value};for(i=-1,x=pathSet.__observers,n=x.length;++i<n;){observer=x[i];if(observers.indexOf(observer)!==-1){errors=observer.errors;errors[errors.length]=error;if(observer.streaming===true){check_observer_finished(observers,observer)}}}}else{if(value!==undefined||type==="sentinel"&&column<last){pbv.value=value;for(i=-1,x=pathSet.__observers,n=x.length;++i<n;){observer=x[i];if(observers.indexOf(observer)!==-1){if(observer.streaming===true){observer.onNext(pbv);check_observer_finished(observers,observer)}}}x.length=0}}}}function setPaths(paths,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]);errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};generations=paths.generations||(paths.generations=[]);generationsLen=generations.length;cache=context;for(;index<total;++index){pbv=paths[paths.index=index];pbv.path.generations=generations;pbv=this.insert(pbv,cache);value=find_value(context=pbv.value);unlock()}paths.index=0;update_generations();finish();cleanup();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function update_generations(){var i=generations.length,ref;while((ref=generations[--i])!==undefined){ref.__tagged=undefined;ref.__generation=(ref.__generation||0)+1}generations.length=generationsLen=0}function finish(){if(streaming===false&&onNext!==undefined){onNext({paths:paths,value:self.context().value})}if(errors.length>0&&onError!==undefined){onError({innerErrors:errors})}else if(onCompleted!==undefined){onCompleted()}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function unlock(){if(type==="error"){errors[errors.length]={optimized:pbv.optimized.concat(),path:pbv.path.concat(),value:value}}else{if(streaming===true&&(value!==undefined||type==="sentinel"&&column<last)){pbv.value=value;onNext(pbv)}}}}function invalidate(){var a=args(arguments);if(this._lazy){return invalidateLazily.call(this,a)}var pbv=this.context(),onNext=a[a.length-3],onError=a[a.length-2],onCompleted=a[a.length-1];a=a.slice(0,-3);return invalidatePaths.call(this,a,pbv,onNext,onError,onCompleted)}var invalidateLazily=immediateToLazy(invalidatePaths);function invalidatePaths(paths,pbv,onNext,onError,onCompleted){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;self=this;now=Date.now();streaming=self._streaming;connected=self._connected;cache=self.cache;batches=self._batches;max=self.maxSize;misses=paths.misses||(paths.misses=[]);errors=paths.errors||(paths.errors=[]);refs=paths.refs||(paths.refs=[]);cols=paths.cols||(paths.cols=[]);prevs=paths.prevs||(paths.prevs=[]);interrupts=paths.interrupts||(paths.interrupts=0);interrupted=interrupts>0;observers=paths.observers||(paths.observers=[]);index=paths.index||(paths.index=0);total=paths.length;context=init_context(paths,pbv.value||{});contexts=paths.contexts;bound=refs[-1]=pbv.optimized||pbv.path;pbv.path=original=[];pbv.optimized=optimized=[];pbv.value=undefined;observers[observers.length]=observer={onNext:onNext,onError:onError,onCompleted:onCompleted,streaming:streaming,paths:0,path:bound,misses:paths.concat(),errors:errors};invalidating:for(;index<total;++index){path=paths[paths.index=index];last=path.length-1;column=path.index||(path.index=0);reset_cols();unlocking:while(column>=0){parent=contexts[column-1];descend();unlock();path.index=column=ascend(path,column,0);reset_cols()}path.index=0}paths.index=0;cleanup();onNext(self);onCompleted();return Disposable.empty;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function cleanup(){if((total=cache.$size)>=max){if(batches===undefined||batches.length===0||batches.every(function(batch){return batch.pendingLoad===false})){if(timeExpireListLength>0){if(total>=max){self.root.timeExpireList=timeExpireList=collect(timeExpireList,now,.8*max,total,µTime,µRate,µSize);total=timeExpireList.total}}if(sizeExpireListLength>0){if(total>=max){self.root.sizeExpireList=sizeExpireList=collect(sizeExpireList,now,.8*max,total,µTime,µRate,µSize)}}}}}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}if((context=find_context(parent,key))===undefined){break descending}value=find_value(context);if(isArray(value)){do{interrupt()}while(isArray(value=find_value(context)));type=undefined;continue descending}else if(type!==undefined){break descending}else if(interrupted===false){contexts[column]=context}type=undefined;parent=context;continue descending}if(key!=null){context=find_context(parent,key)}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){break descending}reset_path_from_ref();contexts[column]=parent=context;if(isArray(value)){interrupt()}type=undefined;continue descending}break descending}}function init_context(paths,context){return contexts===undefined?(paths.contexts=contexts=[])[-1]=context:contexts[-1]}function interrupt(){refs[column]=ref=value;if((context=value._context)!==undefined){contexts[column]=parent=context}else{prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;column=-1;parent=cache;context=value=undefined}}function unlock(){var x;if(context!==undefined){sizeOffset=context.$size;do{x=context.__parent;if((context.$size-=sizeOffset)<=0&&context!==cache){context.__invalidated=true;if(x!==undefined){delete x[context.__key];delete context.__parent}}}while((context=x)!==undefined);context=parent[key];sizeOffset=0}}}function optimize(path,cache){var pbv=findPath.call(this,this.path.concat(path||[]),cache);return pbv?pbv.optimized:path}function value(path,cache){var pbv=findPath.call(this,this.path.concat(path||[]),cache);return pbv?pbv.value:null}function context(path,cache){return this._context?{path:this.path.concat(),value:this._context}:findPath.call(this,this.path.concat(path),cache)}function findPath(the_path,from_cache){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;now=Date.now();cache=from_cache||this.cache;path=the_path;refs=[];cols=[];prevs=[];interrupts=0;interrupted=false;original=[];optimized=[];var pbv={path:original,optimized:optimized};last=path.length-1;column=offset=0;parent=context=value=cache;descend();unlock();return pbv;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}save_optimized(optimized,column,offset,key);if(interrupted===false){save_original(original,column,key)}if((context=find_context(parent,key))===undefined){short_circuit();break descending}value=find_value(context);if(isArray(value)){do{stamp();interrupt()}while(isArray(value=find_value(context)));type=undefined;continue descending}else if(type!==undefined){short_circuit();break descending}type=undefined;parent=context;continue descending}if(key!=null){save_optimized(optimized,column,offset,key);save_original(original,column,key);context=find_leaf_context(parent,key)}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){short_circuit_int();break descending}reset_path_from_ref();parent=context;if(isArray(value)){interrupt()}type=undefined;continue descending}break descending}}function interrupt(){refs[column]=ref=value;if((context=value._context)!==undefined){offset=reset_optimized_from_ref()-column-1;parent=context}else{prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache;context=value=undefined}}function save_missing(){var i,j,nulls=0,n=optimized.length,miss=new Array(n+last-column);for(i=j=-1;++i<n;){key=optimized[i];if(key!=null){miss[++j]=key}else{--nulls}}i=column;while(++i<=last){key=path[i];if(key!=null){miss[++j]=key}else{--nulls}}miss.length+=nulls;return miss}function short_circuit(){if(interrupted===true){short_circuit_int()}else{optimized.length=column+offset+1}}function short_circuit_path(){original.length=column+1;optimized.length=column+offset+1}function short_circuit_int(){path=prevs[0]||path;column=cols[0];last=path.length-1;optimized.length=column+offset+1}function unlock(){if(context==null){pbv.value=undefined;pbv.optimized=save_missing()}else{stamp();pbv.value=value}}}function insert(pathOrPBV,value,cache){var path;if(arguments.length===1){value=pathOrPBV.value;path=pathOrPBV.path}else if(arguments.length===2&&pathOrPBV.path!==undefined){cache=value;value=pathOrPBV.value;path=pathOrPBV.path}else{path=pathOrPBV}var generations=path.generations||[];path=this.path.concat(path);path.generations=generations;var pbv=setPath.call(this,path,value,cache||this.cache),generationsLen=generations.length;update_generations();return pbv;function update_generations(){var i=generations.length,ref;while((ref=generations[--i])!==undefined){ref.__tagged=undefined;ref.__generation=(ref.__generation||0)+1}generations.length=generationsLen=0}}function setPath(the_path,newValue,from_cache){var EXPIRES_NOW=PathEvaluator.EXPIRES_NOW,EXPIRES_NEVER=PathEvaluator.EXPIRES_NEVER,self,streaming,connected,max,batches,batch,observers,observer,contexts,messages,pathSets,misses,errors,cache,context,parent,value,type,size,expires,timestamp,messageParent,message,messageValue,messageType,messageSize,messageExpires,messageTimestamp,typeofMessageValue,messageValueIsPrimitive,sizeOffset=0,bound,original,optimized,offset,path,key,column,last,ref,now,refs,cols,prevs,interrupts,interrupted,generations,generationsLen,backRefs,pathSet,index,total,miss;
var timeExpireList=this.timeExpireList,sizeExpireList=this.sizeExpireList,timeExpireListLength=timeExpireList.length,sizeExpireListLength=sizeExpireList.length;cache=from_cache||this.cache;path=the_path;refs=[];cols=[];prevs=[];interrupts=0;interrupted=false;original=[];optimized=[];generations=path.generations||[];generationsLen=generations.length;var pbv={path:original,optimized:optimized};now=Date.now();parent=context=value=cache;message=newValue;last=path.length-1;column=offset=0;descend();unlock();pbv.value=value;return pbv;function ascend(path,column,lower){var key;ascending:for(;column>=lower;--column){key=path[column];if(is_simple_key(key)){continue ascending}if(isArray(key)){if(++key.index===key.length){key=key[key.index=offset=0];if(is_simple_key(key)){continue ascending}}else{break ascending}}if(++key.offset>(key.to||(key.to=key.from+(key.length||1)-1))){offset=0;key.offset=key.from;continue ascending}break ascending}return column}function reset_cols(){var i=cols[interrupts-1];while(i>=column){if(--interrupts>=0){i=cols[interrupts-1]}else{break}}interrupted=interrupts>0}function reset_refs(){ref=refs[column-1];if(ref!==undefined){offset=reset_optimized_from_ref()-column}}function find_key(key){if(is_complex_key(key)){if(isArray(key)){key=find_segment_key(key);if(is_complex_key(key)){key=find_range_key(key)}}else{key=find_range_key(key)}}return key}function find_segment_key(key){return key[key.index||(key.index=0)]}function find_range_key(key){return key.offset||(key.offset=key.from||(key.from=0))}function is_simple_key(key){return typeof key!=="object"||key==null}function is_complex_key(key){return typeof key==="object"&&key!=null}function find_context(){return parent[key]}function find_leaf_context(){return(context=parent[key])!==undefined&&((expires=context.$expires)===undefined&&context||expires===EXPIRES_NOW&&context&&(expires===EXPIRES_NEVER&&context)&&(expires>now&&context))||(context=undefined)}function find_type(){return type=context&&context.$type||undefined}function find_value(){return value=context!==undefined&&find_type()==="sentinel"?context.value:context}function reset_path_from_ref(){if(path._context===undefined){set_back_reference()}while(interrupted===true&&column===last){path=prevs[--interrupts];column=cols[interrupts];interrupted=interrupts>0;offset=last-column;last=path.length-1}}function reset_optimized_from_ref(){var n=optimized.length=ref.length;for(var i=-1;++i<n;){optimized[i]=ref[i]}return n}function save_optimized(optimized,column,offset,key){return optimized[optimized.length=column+offset]=key}function save_original(original,column,key){return original[column]=key}function set_back_reference(){backRefs=context.__refsLength||0;context["__ref"+backRefs]=path;context.__refsLength=backRefs+1;path._context=context}function stamp(){context.__access_time=now;context.__access_count=(context.__access_count||0)+1}function adjust_contexts(){context.__generation=(context.__generation||0)+1;do{context.$size=(context.$size||0)+sizeOffset;context=context.__parent}while(context!==undefined);context=parent[key];var stack=[],frame,refs,ref,depth=0,i,n;adjusting:while(depth>=0){if((frame=stack[depth])===undefined){i=-1;n=context.__refsLength||0;refs=[];while(++i<n){ref=context["__ref"+i];if(ref&&ref.__tagged===undefined){ref.__tagged=true;generations[generationsLen++]=refs[i]=ref}}if((ref=context.__parent)!==undefined&&ref.__tagged===undefined){ref.__tagged=true;generations[generationsLen++]=refs[i]=ref}frame=stack[depth]={context:context,refs:refs}}refs=frame.refs;if((context=refs[refs.length-1])!==undefined){refs.length-=1;++depth;continue adjusting}stack[depth--]=undefined}context=parent[key];sizeOffset=0}function descend(){descending:for(;column<=last;++column){key=find_key(path[column]);if(column<last){if(key==null){continue descending}save_optimized(optimized,column,offset,key);if(interrupted===false){save_original(original,column,key)}if((context=find_context(parent,key))===undefined){insert_empty_branch()}value=find_value(context);if(isArray(value)){interrupt();type=undefined;continue descending}else if(type!==undefined){insert_empty_branch()}type=undefined;parent=context;continue descending}if(key!=null){save_optimized(optimized,column,offset,key);context=find_leaf_context(parent,key);if(interrupted===false){if(context===undefined){size=0}else{replace_context(message)}insert_message();if(interrupted===false&&type===undefined){context.$type=type="leaf"}}}value=find_value(context);if(interrupted===true){if(context==null||type==="error"){insert_empty_branch()}reset_path_from_ref();parent=context;if(isArray(value)){interrupt()}type=undefined;continue descending}save_original(original,column,key);break descending}}function find_message(){return messageParent&&messageParent[key]}function find_message_value(){return messageValue=message!==undefined&&find_message_type()==="sentinel"?message.value:message}function find_message_type(){return messageType=message&&message.$type||undefined}function find_message_size(){messageSize=1;if(message_value_has_length()){messageSize=messageValue.length}else if(message!==messageValue&&typeofMessageValue==="object"&&messageValue!==null){messageSize=0}if(messageType!==undefined){messageSize+=sentinelSize}else if(message_value_is_primitive()){messageType="sentinel";messageSize+=sentinelSize;message={$type:messageType,value:messageValue}}else if(!message_value_is_array()){messageSize=message.$size||sentinelSize}type=messageType;return messageSize}function link_context(){context.__parent=parent;context.__key=key}function message_value_is_leaf(){return message_value_is_primitive()||message_value_is_array()}function message_value_has_length(){return typeof_message_value()==="string"||message_value_is_array()}function message_value_is_array(){return isArray(messageValue)&&(typeofMessageValue="array")}function message_value_is_primitive(){return messageValueIsPrimitive=typeof_message_value()!=="object"||messageValue===null}function init_stamp(){sizeExpireList[sizeExpireListLength++]=context;expires=context.$expires;if(expires!==undefined&&expires!==EXPIRES_NEVER&&expires!==EXPIRES_NOW){if(expires<0){expires=now+expires*-1}context.$expires=expires}stamp()}function insert_empty_branch(){parent[key]=context={$size:0};link_context()}function insert_message(){value=find_message_value();messageSize=find_message_size();message.$size=size;sizeOffset+=messageSize-size;parent[key]=context=message;link_context();adjust_contexts();context.$type=type=type||"leaf";if(context.__access_time===undefined){init_stamp()}else{stamp()}}function interrupt(){refs[column]=value;prevs[interrupts]=path;cols[interrupts++]=column;interrupted=true;path=value;last=path.length-1;offset=0;column=-1;parent=cache}function replace_context(message){size=context.$size||0;timestamp=context.$timestamp||0;if(message!=null){migrate_references(context,message)}if(isArray(value)){delete_hard_link(context)}context=undefined}function migrate_references(context,message){var mBackRefs=message.__refsLength||0,cBackRefs=context.__refsLength||0,refs=-1,refKey,ref;while(++refs<cBackRefs){refKey="__ref"+refs;ref=context[refKey];ref._context=message;message["__ref"+(mBackRefs+refs)]=ref;delete context[refKey]}}function delete_hard_link(reference){var destination=reference._context;if(destination!=null){var refIndex=(reference.__refIndex||0)-1,refsLen=(destination.__refsLength||0)-1;while(++refIndex<=refsLen){destination["__ref"+refIndex]=destination["__ref"+refIndex+1]}destination.__refsLength=refsLen;if(refsLen<0){delete destination.__ref0;delete destination.__refsLength}delete reference.__refIndex;delete reference._context}}function typeof_message_value(){return typeofMessageValue=typeof find_message_value()}function unlock(){if(context!=null){if(context.__access_time===undefined){init_stamp()}else{stamp()}}}}function call(){return this._lazy?callLazily.apply(this,arguments):callImmediately.apply(this,arguments)}var callLazily=immediateToLazy(callImmediately);function callImmediately(path,callArgs,suffixes,paths,pbv,onNext,onError,onCompleted){var a=args(arguments);if(a.length===6){onCompleted=a.pop();onError=a.pop();onNext=a.pop();pbv=a.pop();suffixes=[];paths=[]}else if(a.length===7){onCompleted=a.pop();onError=a.pop();onNext=a.pop();pbv=a.pop();paths=[]}suffixes=suffixes||[];paths=paths||[];var self=this,bound=pbv.optimized||pbv.path||[];pbv={path:[],value:this.cache};var extras=paths.map(function(x){return bound.concat(x)}),invalidateSubscription=Disposable.empty,setSubscription=Disposable.empty,loadSubscription=this.loader.call(bound.concat(path),callArgs,suffixes,extras).subscribe(function(pbf){var invalidated=pbf.invalidated||[];if(invalidated.length>0){return invalidateSubscription=invalidatePaths.call(self,invalidated,pbv,function(self){return setSubscription=setCallResponse.call(self,pbf)},onError,noop)}return setSubscription=setCallResponse.call(self,pbf)},onError,noop);return Disposable.create(function(x){loadSubscription.dispose();invalidateSubscription.dispose();setSubscription.dispose()});function setCallResponse(pbf){pbf=Object.create(pbf);var error=pbf.error,serverErrors=[];while(error!==undefined){if(error.innerErrors){serverErrors.push.apply(serverErrors,error.innerErrors)}else{error.$type="error";setPath.call(self,error.path||error.pql,error,pbf.value)}error=serverErrors.pop()}pbf.paths.errors=[];pbf.paths.pathSet=undefined;pbf.paths.observers=undefined;return setPBFRoot.call(self,pbf,onNext,onError,onCompleted)}}function collapse(list){return rangeCollapse(buildQueries(buildTree(list)))}function rangeCollapse(paths){paths.forEach(function(path){path.forEach(function(elt,index){var range;if(Array.isArray(elt)&&elt.every(isNumber)&&allUnique(elt)){elt.sort(function(a,b){return a-b});if(elt[elt.length-1]-elt[0]===elt.length-1){range={};range.from=elt[0];range.to=elt[elt.length-1];path[index]=range}}})});return paths}function isNumber(val){return typeof val==="number"}function allUnique(arr){var hash={},index,len;for(index=0,len=arr.length;index<len;index++){if(hash[arr[index]]){return false}hash[arr[index]]=true}return true}function buildTree(list){return list.reduce(insertPath,{})}function insertPath(root,path){var children,child,i,n,j,k,rest=path.slice(1);if(path.length!==0){if((child=path[0])==null){return root}if(typeof child!=="object"){insertPath(root[child]||(root[child]={}),rest)}else if(Array.isArray(child)&&(children=child)){i=-1;n=children.length;while(++i<n){if(typeof(child=children[i])==="object"){j=child.from||0;k=child.to||j+child.length;while(j<=k){insertPath(root[j]||(root[j]={}),rest);++j}}else{insertPath(root[child]||(root[child]={}),rest)}}}else{i=child.from||0;n=child.to||i+child.length;while(i<=n){insertPath(root[i]||(root[i]={}),rest);++i}}}return root}function sortLol(lol){return lol.reduce(function(result,curr){if(curr instanceof Array){result.push(sortLol(curr).slice(0).sort());return result}return result.concat(curr)},[]).slice(0).sort()}function createKey(list){return JSON.stringify(sortLol(list))}var charPattern=/\D/i;function buildQueries(root){var children=Object.keys(root).filter(function(key){return key!=="__observers"}),child,memo,paths,key,childIsNum,list,head,tail,copy,results,i=-1,n=children.length,j,k,x;if(n===0||Array.isArray(root)===true){return[[]]}memo={};while(++i<n){child=children[i];paths=buildQueries(root[child]);key=createKey(paths);childIsNum=typeof child==="string"&&!charPattern.test(child);if((list=memo[key])&&(head=list.head)){head[head.length]=childIsNum?parseInt(child,10):child}else{memo[key]={head:[childIsNum?parseInt(child,10):child],tail:paths}}}results=[];for(x in memo){head=(list=memo[x]).head;tail=list.tail;i=-1;n=tail.length;while(++i<n){list=tail[i];j=-1;k=list.length;if(head[0]===""){copy=[]}else{copy=[head.length===1?head[0]:head];while(++j<k){copy[j+1]=list[j]}}results[results.length]=copy}}return results}function collect(nodes,now,max,total,T,R,S){var to=0;nodes.sort(function(a,b){return a.__invalidated===true?-1:b.invalidated===true?1:a.__access_time-b.__access_time}).every(function(x,i){var offset=x.$size,backRefs,ref,y;total-=offset;to=i;x.__invalidated=true;do{y=x.__parent;if(x.__invalidated===true){if(y!==undefined){delete y[x.__key];delete x.__parent}backRefs=x.__refsLength||0;while(--backRefs>=0){if((ref=x["__ref"+backRefs])!==undefined){delete ref._context;delete x["__ref"+backRefs]}}delete x.__refsLength}x.$size=x.$size-offset}while((x=y)!==undefined);return total>max});return nodes.slice(to)}module.exports=PathEvaluator},{"../src/rx.ultralite":2}],2:[function(_dereq_,module,exports){(function(global){var Rx;if(typeof window!=="undefined"&&typeof window["Rx"]!=="undefined"){Rx=window["Rx"]}else if(typeof global!=="undefined"&&typeof global["Rx"]!=="undefined"){Rx=global["Rx"]}else{if(typeof global!=="undefined"&&typeof global.require==="function"){try{Rx=global["require"]("rx")}catch(e){Rx=undefined}}}if(Rx===undefined){Rx={I:function(){return arguments[0]},Disposable:function(){function Disposable(a){this.action=a}Disposable.create=function(a){return new Disposable(a)};Disposable.empty=new Disposable(function(){});Disposable.prototype.dispose=function(){if(typeof this.action==="function"){this.action()}};return Disposable}(),Observable:function(){function Observable(s){this.s=s}Observable.create=Observable.createWithDisposable=function(s){return new Observable(s)};Observable.fastCreateWithDisposable=Observable.create;Observable.fastReturnValue=function(value){return Observable.create(function(observer){observer.onNext(value);observer.onCompleted()})};Observable.prototype.subscribe=function(n,e,c){return this.s(n!=null&&typeof n==="object"?n:Rx.Observer.create(n,e,c))};Observable.prototype.catchException=function(next){var self=this;return Observable.create(function(o){return self.subscribe(function(x){o.onNext(x)},function(e){return(typeof next==="function"?next(e):next).subscribe(o)},function(){o.onCompleted()})})};return Observable}(),Observer:function(){function Observer(n,e,c){this.onNext=n||Rx.I;this.onError=e||Rx.I;this.onCompleted=c||Rx.I}Observer.create=function(n,e,c){return new Observer(n,e,c)};return Observer}(),Subject:function(){function Subject(){this.observers=[]}Subject.prototype.subscribe=function(subscriber){var a=this.observers,n=a.length;a[n]=subscriber;return{dispose:function(){a.splice(n,1)}}};Subject.prototype.onNext=function(x){var listeners=this.observers.concat(),i=-1,n=listeners.length;while(++i<n){listeners[i].onNext(x)}};Subject.prototype.onError=function(e){var listeners=this.observers.concat(),i=-1,n=listeners.length;this.observers.length=0;while(++i<n){listeners[i].onError(e)}};Subject.prototype.onCompleted=function(){var listeners=this.observers.concat(),i=-1,n=listeners.length;this.observers.length=0;while(++i<n){listeners[i].onCompleted()}}}()}}module.exports=Rx}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}]},{},[1])(1)});alert(falkor.PathEvaluator);var pathEvaluator=new falkor.PathEvaluator;alert();pathEvaluator.deserialize({videos:{123:{name:"Die Hard"}}});var result=pathEvaluator.get(["videos",123,"name"]);
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"rx": "2.3.1"
}
}
<style type='text/css'>html, body { margin: 0; padding: 0; border: 0; }
body, html { height: 100%; width: 100%; }</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment