master
   1//     Underscore.js 1.6.0
   2//     http://underscorejs.org
   3//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
   4//     Underscore may be freely distributed under the MIT license.
   5
   6(function() {
   7
   8  // Baseline setup
   9  // --------------
  10
  11  // Establish the root object, `window` in the browser, or `exports` on the server.
  12  var root = this;
  13
  14  // Save the previous value of the `_` variable.
  15  var previousUnderscore = root._;
  16
  17  // Establish the object that gets returned to break out of a loop iteration.
  18  var breaker = {};
  19
  20  // Save bytes in the minified (but not gzipped) version:
  21  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
  22
  23  // Create quick reference variables for speed access to core prototypes.
  24  var
  25    push             = ArrayProto.push,
  26    slice            = ArrayProto.slice,
  27    concat           = ArrayProto.concat,
  28    toString         = ObjProto.toString,
  29    hasOwnProperty   = ObjProto.hasOwnProperty;
  30
  31  // All **ECMAScript 5** native function implementations that we hope to use
  32  // are declared here.
  33  var
  34    nativeForEach      = ArrayProto.forEach,
  35    nativeMap          = ArrayProto.map,
  36    nativeReduce       = ArrayProto.reduce,
  37    nativeReduceRight  = ArrayProto.reduceRight,
  38    nativeFilter       = ArrayProto.filter,
  39    nativeEvery        = ArrayProto.every,
  40    nativeSome         = ArrayProto.some,
  41    nativeIndexOf      = ArrayProto.indexOf,
  42    nativeLastIndexOf  = ArrayProto.lastIndexOf,
  43    nativeIsArray      = Array.isArray,
  44    nativeKeys         = Object.keys,
  45    nativeBind         = FuncProto.bind;
  46
  47  // Create a safe reference to the Underscore object for use below.
  48  var _ = function(obj) {
  49    if (obj instanceof _) return obj;
  50    if (!(this instanceof _)) return new _(obj);
  51    this._wrapped = obj;
  52  };
  53
  54  // Export the Underscore object for **Node.js**, with
  55  // backwards-compatibility for the old `require()` API. If we're in
  56  // the browser, add `_` as a global object via a string identifier,
  57  // for Closure Compiler "advanced" mode.
  58  if (typeof exports !== 'undefined') {
  59    if (typeof module !== 'undefined' && module.exports) {
  60      exports = module.exports = _;
  61    }
  62    exports._ = _;
  63  } else {
  64    root._ = _;
  65  }
  66
  67  // Current version.
  68  _.VERSION = '1.6.0';
  69
  70  // Collection Functions
  71  // --------------------
  72
  73  // The cornerstone, an `each` implementation, aka `forEach`.
  74  // Handles objects with the built-in `forEach`, arrays, and raw objects.
  75  // Delegates to **ECMAScript 5**'s native `forEach` if available.
  76  var each = _.each = _.forEach = function(obj, iterator, context) {
  77    if (obj == null) return obj;
  78    if (nativeForEach && obj.forEach === nativeForEach) {
  79      obj.forEach(iterator, context);
  80    } else if (obj.length === +obj.length) {
  81      for (var i = 0, length = obj.length; i < length; i++) {
  82        if (iterator.call(context, obj[i], i, obj) === breaker) return;
  83      }
  84    } else {
  85      var keys = _.keys(obj);
  86      for (var i = 0, length = keys.length; i < length; i++) {
  87        if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
  88      }
  89    }
  90    return obj;
  91  };
  92
  93  // Return the results of applying the iterator to each element.
  94  // Delegates to **ECMAScript 5**'s native `map` if available.
  95  _.map = _.collect = function(obj, iterator, context) {
  96    var results = [];
  97    if (obj == null) return results;
  98    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
  99    each(obj, function(value, index, list) {
 100      results.push(iterator.call(context, value, index, list));
 101    });
 102    return results;
 103  };
 104
 105  var reduceError = 'Reduce of empty array with no initial value';
 106
 107  // **Reduce** builds up a single result from a list of values, aka `inject`,
 108  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
 109  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
 110    var initial = arguments.length > 2;
 111    if (obj == null) obj = [];
 112    if (nativeReduce && obj.reduce === nativeReduce) {
 113      if (context) iterator = _.bind(iterator, context);
 114      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
 115    }
 116    each(obj, function(value, index, list) {
 117      if (!initial) {
 118        memo = value;
 119        initial = true;
 120      } else {
 121        memo = iterator.call(context, memo, value, index, list);
 122      }
 123    });
 124    if (!initial) throw new TypeError(reduceError);
 125    return memo;
 126  };
 127
 128  // The right-associative version of reduce, also known as `foldr`.
 129  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
 130  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
 131    var initial = arguments.length > 2;
 132    if (obj == null) obj = [];
 133    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
 134      if (context) iterator = _.bind(iterator, context);
 135      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
 136    }
 137    var length = obj.length;
 138    if (length !== +length) {
 139      var keys = _.keys(obj);
 140      length = keys.length;
 141    }
 142    each(obj, function(value, index, list) {
 143      index = keys ? keys[--length] : --length;
 144      if (!initial) {
 145        memo = obj[index];
 146        initial = true;
 147      } else {
 148        memo = iterator.call(context, memo, obj[index], index, list);
 149      }
 150    });
 151    if (!initial) throw new TypeError(reduceError);
 152    return memo;
 153  };
 154
 155  // Return the first value which passes a truth test. Aliased as `detect`.
 156  _.find = _.detect = function(obj, predicate, context) {
 157    var result;
 158    any(obj, function(value, index, list) {
 159      if (predicate.call(context, value, index, list)) {
 160        result = value;
 161        return true;
 162      }
 163    });
 164    return result;
 165  };
 166
 167  // Return all the elements that pass a truth test.
 168  // Delegates to **ECMAScript 5**'s native `filter` if available.
 169  // Aliased as `select`.
 170  _.filter = _.select = function(obj, predicate, context) {
 171    var results = [];
 172    if (obj == null) return results;
 173    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
 174    each(obj, function(value, index, list) {
 175      if (predicate.call(context, value, index, list)) results.push(value);
 176    });
 177    return results;
 178  };
 179
 180  // Return all the elements for which a truth test fails.
 181  _.reject = function(obj, predicate, context) {
 182    return _.filter(obj, function(value, index, list) {
 183      return !predicate.call(context, value, index, list);
 184    }, context);
 185  };
 186
 187  // Determine whether all of the elements match a truth test.
 188  // Delegates to **ECMAScript 5**'s native `every` if available.
 189  // Aliased as `all`.
 190  _.every = _.all = function(obj, predicate, context) {
 191    predicate || (predicate = _.identity);
 192    var result = true;
 193    if (obj == null) return result;
 194    if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context);
 195    each(obj, function(value, index, list) {
 196      if (!(result = result && predicate.call(context, value, index, list))) return breaker;
 197    });
 198    return !!result;
 199  };
 200
 201  // Determine if at least one element in the object matches a truth test.
 202  // Delegates to **ECMAScript 5**'s native `some` if available.
 203  // Aliased as `any`.
 204  var any = _.some = _.any = function(obj, predicate, context) {
 205    predicate || (predicate = _.identity);
 206    var result = false;
 207    if (obj == null) return result;
 208    if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
 209    each(obj, function(value, index, list) {
 210      if (result || (result = predicate.call(context, value, index, list))) return breaker;
 211    });
 212    return !!result;
 213  };
 214
 215  // Determine if the array or object contains a given value (using `===`).
 216  // Aliased as `include`.
 217  _.contains = _.include = function(obj, target) {
 218    if (obj == null) return false;
 219    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
 220    return any(obj, function(value) {
 221      return value === target;
 222    });
 223  };
 224
 225  // Invoke a method (with arguments) on every item in a collection.
 226  _.invoke = function(obj, method) {
 227    var args = slice.call(arguments, 2);
 228    var isFunc = _.isFunction(method);
 229    return _.map(obj, function(value) {
 230      return (isFunc ? method : value[method]).apply(value, args);
 231    });
 232  };
 233
 234  // Convenience version of a common use case of `map`: fetching a property.
 235  _.pluck = function(obj, key) {
 236    return _.map(obj, _.property(key));
 237  };
 238
 239  // Convenience version of a common use case of `filter`: selecting only objects
 240  // containing specific `key:value` pairs.
 241  _.where = function(obj, attrs) {
 242    return _.filter(obj, _.matches(attrs));
 243  };
 244
 245  // Convenience version of a common use case of `find`: getting the first object
 246  // containing specific `key:value` pairs.
 247  _.findWhere = function(obj, attrs) {
 248    return _.find(obj, _.matches(attrs));
 249  };
 250
 251  // Return the maximum element or (element-based computation).
 252  // Can't optimize arrays of integers longer than 65,535 elements.
 253  // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
 254  _.max = function(obj, iterator, context) {
 255    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
 256      return Math.max.apply(Math, obj);
 257    }
 258    var result = -Infinity, lastComputed = -Infinity;
 259    each(obj, function(value, index, list) {
 260      var computed = iterator ? iterator.call(context, value, index, list) : value;
 261      if (computed > lastComputed) {
 262        result = value;
 263        lastComputed = computed;
 264      }
 265    });
 266    return result;
 267  };
 268
 269  // Return the minimum element (or element-based computation).
 270  _.min = function(obj, iterator, context) {
 271    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
 272      return Math.min.apply(Math, obj);
 273    }
 274    var result = Infinity, lastComputed = Infinity;
 275    each(obj, function(value, index, list) {
 276      var computed = iterator ? iterator.call(context, value, index, list) : value;
 277      if (computed < lastComputed) {
 278        result = value;
 279        lastComputed = computed;
 280      }
 281    });
 282    return result;
 283  };
 284
 285  // Shuffle an array, using the modern version of the
 286  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
 287  _.shuffle = function(obj) {
 288    var rand;
 289    var index = 0;
 290    var shuffled = [];
 291    each(obj, function(value) {
 292      rand = _.random(index++);
 293      shuffled[index - 1] = shuffled[rand];
 294      shuffled[rand] = value;
 295    });
 296    return shuffled;
 297  };
 298
 299  // Sample **n** random values from a collection.
 300  // If **n** is not specified, returns a single random element.
 301  // The internal `guard` argument allows it to work with `map`.
 302  _.sample = function(obj, n, guard) {
 303    if (n == null || guard) {
 304      if (obj.length !== +obj.length) obj = _.values(obj);
 305      return obj[_.random(obj.length - 1)];
 306    }
 307    return _.shuffle(obj).slice(0, Math.max(0, n));
 308  };
 309
 310  // An internal function to generate lookup iterators.
 311  var lookupIterator = function(value) {
 312    if (value == null) return _.identity;
 313    if (_.isFunction(value)) return value;
 314    return _.property(value);
 315  };
 316
 317  // Sort the object's values by a criterion produced by an iterator.
 318  _.sortBy = function(obj, iterator, context) {
 319    iterator = lookupIterator(iterator);
 320    return _.pluck(_.map(obj, function(value, index, list) {
 321      return {
 322        value: value,
 323        index: index,
 324        criteria: iterator.call(context, value, index, list)
 325      };
 326    }).sort(function(left, right) {
 327      var a = left.criteria;
 328      var b = right.criteria;
 329      if (a !== b) {
 330        if (a > b || a === void 0) return 1;
 331        if (a < b || b === void 0) return -1;
 332      }
 333      return left.index - right.index;
 334    }), 'value');
 335  };
 336
 337  // An internal function used for aggregate "group by" operations.
 338  var group = function(behavior) {
 339    return function(obj, iterator, context) {
 340      var result = {};
 341      iterator = lookupIterator(iterator);
 342      each(obj, function(value, index) {
 343        var key = iterator.call(context, value, index, obj);
 344        behavior(result, key, value);
 345      });
 346      return result;
 347    };
 348  };
 349
 350  // Groups the object's values by a criterion. Pass either a string attribute
 351  // to group by, or a function that returns the criterion.
 352  _.groupBy = group(function(result, key, value) {
 353    _.has(result, key) ? result[key].push(value) : result[key] = [value];
 354  });
 355
 356  // Indexes the object's values by a criterion, similar to `groupBy`, but for
 357  // when you know that your index values will be unique.
 358  _.indexBy = group(function(result, key, value) {
 359    result[key] = value;
 360  });
 361
 362  // Counts instances of an object that group by a certain criterion. Pass
 363  // either a string attribute to count by, or a function that returns the
 364  // criterion.
 365  _.countBy = group(function(result, key) {
 366    _.has(result, key) ? result[key]++ : result[key] = 1;
 367  });
 368
 369  // Use a comparator function to figure out the smallest index at which
 370  // an object should be inserted so as to maintain order. Uses binary search.
 371  _.sortedIndex = function(array, obj, iterator, context) {
 372    iterator = lookupIterator(iterator);
 373    var value = iterator.call(context, obj);
 374    var low = 0, high = array.length;
 375    while (low < high) {
 376      var mid = (low + high) >>> 1;
 377      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
 378    }
 379    return low;
 380  };
 381
 382  // Safely create a real, live array from anything iterable.
 383  _.toArray = function(obj) {
 384    if (!obj) return [];
 385    if (_.isArray(obj)) return slice.call(obj);
 386    if (obj.length === +obj.length) return _.map(obj, _.identity);
 387    return _.values(obj);
 388  };
 389
 390  // Return the number of elements in an object.
 391  _.size = function(obj) {
 392    if (obj == null) return 0;
 393    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
 394  };
 395
 396  // Array Functions
 397  // ---------------
 398
 399  // Get the first element of an array. Passing **n** will return the first N
 400  // values in the array. Aliased as `head` and `take`. The **guard** check
 401  // allows it to work with `_.map`.
 402  _.first = _.head = _.take = function(array, n, guard) {
 403    if (array == null) return void 0;
 404    if ((n == null) || guard) return array[0];
 405    if (n < 0) return [];
 406    return slice.call(array, 0, n);
 407  };
 408
 409  // Returns everything but the last entry of the array. Especially useful on
 410  // the arguments object. Passing **n** will return all the values in
 411  // the array, excluding the last N. The **guard** check allows it to work with
 412  // `_.map`.
 413  _.initial = function(array, n, guard) {
 414    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
 415  };
 416
 417  // Get the last element of an array. Passing **n** will return the last N
 418  // values in the array. The **guard** check allows it to work with `_.map`.
 419  _.last = function(array, n, guard) {
 420    if (array == null) return void 0;
 421    if ((n == null) || guard) return array[array.length - 1];
 422    return slice.call(array, Math.max(array.length - n, 0));
 423  };
 424
 425  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
 426  // Especially useful on the arguments object. Passing an **n** will return
 427  // the rest N values in the array. The **guard**
 428  // check allows it to work with `_.map`.
 429  _.rest = _.tail = _.drop = function(array, n, guard) {
 430    return slice.call(array, (n == null) || guard ? 1 : n);
 431  };
 432
 433  // Trim out all falsy values from an array.
 434  _.compact = function(array) {
 435    return _.filter(array, _.identity);
 436  };
 437
 438  // Internal implementation of a recursive `flatten` function.
 439  var flatten = function(input, shallow, output) {
 440    if (shallow && _.every(input, _.isArray)) {
 441      return concat.apply(output, input);
 442    }
 443    each(input, function(value) {
 444      if (_.isArray(value) || _.isArguments(value)) {
 445        shallow ? push.apply(output, value) : flatten(value, shallow, output);
 446      } else {
 447        output.push(value);
 448      }
 449    });
 450    return output;
 451  };
 452
 453  // Flatten out an array, either recursively (by default), or just one level.
 454  _.flatten = function(array, shallow) {
 455    return flatten(array, shallow, []);
 456  };
 457
 458  // Return a version of the array that does not contain the specified value(s).
 459  _.without = function(array) {
 460    return _.difference(array, slice.call(arguments, 1));
 461  };
 462
 463  // Split an array into two arrays: one whose elements all satisfy the given
 464  // predicate, and one whose elements all do not satisfy the predicate.
 465  _.partition = function(array, predicate) {
 466    var pass = [], fail = [];
 467    each(array, function(elem) {
 468      (predicate(elem) ? pass : fail).push(elem);
 469    });
 470    return [pass, fail];
 471  };
 472
 473  // Produce a duplicate-free version of the array. If the array has already
 474  // been sorted, you have the option of using a faster algorithm.
 475  // Aliased as `unique`.
 476  _.uniq = _.unique = function(array, isSorted, iterator, context) {
 477    if (_.isFunction(isSorted)) {
 478      context = iterator;
 479      iterator = isSorted;
 480      isSorted = false;
 481    }
 482    var initial = iterator ? _.map(array, iterator, context) : array;
 483    var results = [];
 484    var seen = [];
 485    each(initial, function(value, index) {
 486      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
 487        seen.push(value);
 488        results.push(array[index]);
 489      }
 490    });
 491    return results;
 492  };
 493
 494  // Produce an array that contains the union: each distinct element from all of
 495  // the passed-in arrays.
 496  _.union = function() {
 497    return _.uniq(_.flatten(arguments, true));
 498  };
 499
 500  // Produce an array that contains every item shared between all the
 501  // passed-in arrays.
 502  _.intersection = function(array) {
 503    var rest = slice.call(arguments, 1);
 504    return _.filter(_.uniq(array), function(item) {
 505      return _.every(rest, function(other) {
 506        return _.contains(other, item);
 507      });
 508    });
 509  };
 510
 511  // Take the difference between one array and a number of other arrays.
 512  // Only the elements present in just the first array will remain.
 513  _.difference = function(array) {
 514    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
 515    return _.filter(array, function(value){ return !_.contains(rest, value); });
 516  };
 517
 518  // Zip together multiple lists into a single array -- elements that share
 519  // an index go together.
 520  _.zip = function() {
 521    var length = _.max(_.pluck(arguments, 'length').concat(0));
 522    var results = new Array(length);
 523    for (var i = 0; i < length; i++) {
 524      results[i] = _.pluck(arguments, '' + i);
 525    }
 526    return results;
 527  };
 528
 529  // Converts lists into objects. Pass either a single array of `[key, value]`
 530  // pairs, or two parallel arrays of the same length -- one of keys, and one of
 531  // the corresponding values.
 532  _.object = function(list, values) {
 533    if (list == null) return {};
 534    var result = {};
 535    for (var i = 0, length = list.length; i < length; i++) {
 536      if (values) {
 537        result[list[i]] = values[i];
 538      } else {
 539        result[list[i][0]] = list[i][1];
 540      }
 541    }
 542    return result;
 543  };
 544
 545  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
 546  // we need this function. Return the position of the first occurrence of an
 547  // item in an array, or -1 if the item is not included in the array.
 548  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
 549  // If the array is large and already in sort order, pass `true`
 550  // for **isSorted** to use binary search.
 551  _.indexOf = function(array, item, isSorted) {
 552    if (array == null) return -1;
 553    var i = 0, length = array.length;
 554    if (isSorted) {
 555      if (typeof isSorted == 'number') {
 556        i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
 557      } else {
 558        i = _.sortedIndex(array, item);
 559        return array[i] === item ? i : -1;
 560      }
 561    }
 562    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
 563    for (; i < length; i++) if (array[i] === item) return i;
 564    return -1;
 565  };
 566
 567  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
 568  _.lastIndexOf = function(array, item, from) {
 569    if (array == null) return -1;
 570    var hasIndex = from != null;
 571    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
 572      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
 573    }
 574    var i = (hasIndex ? from : array.length);
 575    while (i--) if (array[i] === item) return i;
 576    return -1;
 577  };
 578
 579  // Generate an integer Array containing an arithmetic progression. A port of
 580  // the native Python `range()` function. See
 581  // [the Python documentation](http://docs.python.org/library/functions.html#range).
 582  _.range = function(start, stop, step) {
 583    if (arguments.length <= 1) {
 584      stop = start || 0;
 585      start = 0;
 586    }
 587    step = arguments[2] || 1;
 588
 589    var length = Math.max(Math.ceil((stop - start) / step), 0);
 590    var idx = 0;
 591    var range = new Array(length);
 592
 593    while(idx < length) {
 594      range[idx++] = start;
 595      start += step;
 596    }
 597
 598    return range;
 599  };
 600
 601  // Function (ahem) Functions
 602  // ------------------
 603
 604  // Reusable constructor function for prototype setting.
 605  var ctor = function(){};
 606
 607  // Create a function bound to a given object (assigning `this`, and arguments,
 608  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
 609  // available.
 610  _.bind = function(func, context) {
 611    var args, bound;
 612    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
 613    if (!_.isFunction(func)) throw new TypeError;
 614    args = slice.call(arguments, 2);
 615    return bound = function() {
 616      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
 617      ctor.prototype = func.prototype;
 618      var self = new ctor;
 619      ctor.prototype = null;
 620      var result = func.apply(self, args.concat(slice.call(arguments)));
 621      if (Object(result) === result) return result;
 622      return self;
 623    };
 624  };
 625
 626  // Partially apply a function by creating a version that has had some of its
 627  // arguments pre-filled, without changing its dynamic `this` context. _ acts
 628  // as a placeholder, allowing any combination of arguments to be pre-filled.
 629  _.partial = function(func) {
 630    var boundArgs = slice.call(arguments, 1);
 631    return function() {
 632      var position = 0;
 633      var args = boundArgs.slice();
 634      for (var i = 0, length = args.length; i < length; i++) {
 635        if (args[i] === _) args[i] = arguments[position++];
 636      }
 637      while (position < arguments.length) args.push(arguments[position++]);
 638      return func.apply(this, args);
 639    };
 640  };
 641
 642  // Bind a number of an object's methods to that object. Remaining arguments
 643  // are the method names to be bound. Useful for ensuring that all callbacks
 644  // defined on an object belong to it.
 645  _.bindAll = function(obj) {
 646    var funcs = slice.call(arguments, 1);
 647    if (funcs.length === 0) throw new Error('bindAll must be passed function names');
 648    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
 649    return obj;
 650  };
 651
 652  // Memoize an expensive function by storing its results.
 653  _.memoize = function(func, hasher) {
 654    var memo = {};
 655    hasher || (hasher = _.identity);
 656    return function() {
 657      var key = hasher.apply(this, arguments);
 658      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
 659    };
 660  };
 661
 662  // Delays a function for the given number of milliseconds, and then calls
 663  // it with the arguments supplied.
 664  _.delay = function(func, wait) {
 665    var args = slice.call(arguments, 2);
 666    return setTimeout(function(){ return func.apply(null, args); }, wait);
 667  };
 668
 669  // Defers a function, scheduling it to run after the current call stack has
 670  // cleared.
 671  _.defer = function(func) {
 672    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
 673  };
 674
 675  // Returns a function, that, when invoked, will only be triggered at most once
 676  // during a given window of time. Normally, the throttled function will run
 677  // as much as it can, without ever going more than once per `wait` duration;
 678  // but if you'd like to disable the execution on the leading edge, pass
 679  // `{leading: false}`. To disable execution on the trailing edge, ditto.
 680  _.throttle = function(func, wait, options) {
 681    var context, args, result;
 682    var timeout = null;
 683    var previous = 0;
 684    options || (options = {});
 685    var later = function() {
 686      previous = options.leading === false ? 0 : _.now();
 687      timeout = null;
 688      result = func.apply(context, args);
 689      context = args = null;
 690    };
 691    return function() {
 692      var now = _.now();
 693      if (!previous && options.leading === false) previous = now;
 694      var remaining = wait - (now - previous);
 695      context = this;
 696      args = arguments;
 697      if (remaining <= 0) {
 698        clearTimeout(timeout);
 699        timeout = null;
 700        previous = now;
 701        result = func.apply(context, args);
 702        context = args = null;
 703      } else if (!timeout && options.trailing !== false) {
 704        timeout = setTimeout(later, remaining);
 705      }
 706      return result;
 707    };
 708  };
 709
 710  // Returns a function, that, as long as it continues to be invoked, will not
 711  // be triggered. The function will be called after it stops being called for
 712  // N milliseconds. If `immediate` is passed, trigger the function on the
 713  // leading edge, instead of the trailing.
 714  _.debounce = function(func, wait, immediate) {
 715    var timeout, args, context, timestamp, result;
 716
 717    var later = function() {
 718      var last = _.now() - timestamp;
 719      if (last < wait) {
 720        timeout = setTimeout(later, wait - last);
 721      } else {
 722        timeout = null;
 723        if (!immediate) {
 724          result = func.apply(context, args);
 725          context = args = null;
 726        }
 727      }
 728    };
 729
 730    return function() {
 731      context = this;
 732      args = arguments;
 733      timestamp = _.now();
 734      var callNow = immediate && !timeout;
 735      if (!timeout) {
 736        timeout = setTimeout(later, wait);
 737      }
 738      if (callNow) {
 739        result = func.apply(context, args);
 740        context = args = null;
 741      }
 742
 743      return result;
 744    };
 745  };
 746
 747  // Returns a function that will be executed at most one time, no matter how
 748  // often you call it. Useful for lazy initialization.
 749  _.once = function(func) {
 750    var ran = false, memo;
 751    return function() {
 752      if (ran) return memo;
 753      ran = true;
 754      memo = func.apply(this, arguments);
 755      func = null;
 756      return memo;
 757    };
 758  };
 759
 760  // Returns the first function passed as an argument to the second,
 761  // allowing you to adjust arguments, run code before and after, and
 762  // conditionally execute the original function.
 763  _.wrap = function(func, wrapper) {
 764    return _.partial(wrapper, func);
 765  };
 766
 767  // Returns a function that is the composition of a list of functions, each
 768  // consuming the return value of the function that follows.
 769  _.compose = function() {
 770    var funcs = arguments;
 771    return function() {
 772      var args = arguments;
 773      for (var i = funcs.length - 1; i >= 0; i--) {
 774        args = [funcs[i].apply(this, args)];
 775      }
 776      return args[0];
 777    };
 778  };
 779
 780  // Returns a function that will only be executed after being called N times.
 781  _.after = function(times, func) {
 782    return function() {
 783      if (--times < 1) {
 784        return func.apply(this, arguments);
 785      }
 786    };
 787  };
 788
 789  // Object Functions
 790  // ----------------
 791
 792  // Retrieve the names of an object's properties.
 793  // Delegates to **ECMAScript 5**'s native `Object.keys`
 794  _.keys = function(obj) {
 795    if (!_.isObject(obj)) return [];
 796    if (nativeKeys) return nativeKeys(obj);
 797    var keys = [];
 798    for (var key in obj) if (_.has(obj, key)) keys.push(key);
 799    return keys;
 800  };
 801
 802  // Retrieve the values of an object's properties.
 803  _.values = function(obj) {
 804    var keys = _.keys(obj);
 805    var length = keys.length;
 806    var values = new Array(length);
 807    for (var i = 0; i < length; i++) {
 808      values[i] = obj[keys[i]];
 809    }
 810    return values;
 811  };
 812
 813  // Convert an object into a list of `[key, value]` pairs.
 814  _.pairs = function(obj) {
 815    var keys = _.keys(obj);
 816    var length = keys.length;
 817    var pairs = new Array(length);
 818    for (var i = 0; i < length; i++) {
 819      pairs[i] = [keys[i], obj[keys[i]]];
 820    }
 821    return pairs;
 822  };
 823
 824  // Invert the keys and values of an object. The values must be serializable.
 825  _.invert = function(obj) {
 826    var result = {};
 827    var keys = _.keys(obj);
 828    for (var i = 0, length = keys.length; i < length; i++) {
 829      result[obj[keys[i]]] = keys[i];
 830    }
 831    return result;
 832  };
 833
 834  // Return a sorted list of the function names available on the object.
 835  // Aliased as `methods`
 836  _.functions = _.methods = function(obj) {
 837    var names = [];
 838    for (var key in obj) {
 839      if (_.isFunction(obj[key])) names.push(key);
 840    }
 841    return names.sort();
 842  };
 843
 844  // Extend a given object with all the properties in passed-in object(s).
 845  _.extend = function(obj) {
 846    each(slice.call(arguments, 1), function(source) {
 847      if (source) {
 848        for (var prop in source) {
 849          obj[prop] = source[prop];
 850        }
 851      }
 852    });
 853    return obj;
 854  };
 855
 856  // Return a copy of the object only containing the whitelisted properties.
 857  _.pick = function(obj) {
 858    var copy = {};
 859    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
 860    each(keys, function(key) {
 861      if (key in obj) copy[key] = obj[key];
 862    });
 863    return copy;
 864  };
 865
 866   // Return a copy of the object without the blacklisted properties.
 867  _.omit = function(obj) {
 868    var copy = {};
 869    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
 870    for (var key in obj) {
 871      if (!_.contains(keys, key)) copy[key] = obj[key];
 872    }
 873    return copy;
 874  };
 875
 876  // Fill in a given object with default properties.
 877  _.defaults = function(obj) {
 878    each(slice.call(arguments, 1), function(source) {
 879      if (source) {
 880        for (var prop in source) {
 881          if (obj[prop] === void 0) obj[prop] = source[prop];
 882        }
 883      }
 884    });
 885    return obj;
 886  };
 887
 888  // Create a (shallow-cloned) duplicate of an object.
 889  _.clone = function(obj) {
 890    if (!_.isObject(obj)) return obj;
 891    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
 892  };
 893
 894  // Invokes interceptor with the obj, and then returns obj.
 895  // The primary purpose of this method is to "tap into" a method chain, in
 896  // order to perform operations on intermediate results within the chain.
 897  _.tap = function(obj, interceptor) {
 898    interceptor(obj);
 899    return obj;
 900  };
 901
 902  // Internal recursive comparison function for `isEqual`.
 903  var eq = function(a, b, aStack, bStack) {
 904    // Identical objects are equal. `0 === -0`, but they aren't identical.
 905    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
 906    if (a === b) return a !== 0 || 1 / a == 1 / b;
 907    // A strict comparison is necessary because `null == undefined`.
 908    if (a == null || b == null) return a === b;
 909    // Unwrap any wrapped objects.
 910    if (a instanceof _) a = a._wrapped;
 911    if (b instanceof _) b = b._wrapped;
 912    // Compare `[[Class]]` names.
 913    var className = toString.call(a);
 914    if (className != toString.call(b)) return false;
 915    switch (className) {
 916      // Strings, numbers, dates, and booleans are compared by value.
 917      case '[object String]':
 918        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
 919        // equivalent to `new String("5")`.
 920        return a == String(b);
 921      case '[object Number]':
 922        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
 923        // other numeric values.
 924        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
 925      case '[object Date]':
 926      case '[object Boolean]':
 927        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
 928        // millisecond representations. Note that invalid dates with millisecond representations
 929        // of `NaN` are not equivalent.
 930        return +a == +b;
 931      // RegExps are compared by their source patterns and flags.
 932      case '[object RegExp]':
 933        return a.source == b.source &&
 934               a.global == b.global &&
 935               a.multiline == b.multiline &&
 936               a.ignoreCase == b.ignoreCase;
 937    }
 938    if (typeof a != 'object' || typeof b != 'object') return false;
 939    // Assume equality for cyclic structures. The algorithm for detecting cyclic
 940    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
 941    var length = aStack.length;
 942    while (length--) {
 943      // Linear search. Performance is inversely proportional to the number of
 944      // unique nested structures.
 945      if (aStack[length] == a) return bStack[length] == b;
 946    }
 947    // Objects with different constructors are not equivalent, but `Object`s
 948    // from different frames are.
 949    var aCtor = a.constructor, bCtor = b.constructor;
 950    if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
 951                             _.isFunction(bCtor) && (bCtor instanceof bCtor))
 952                        && ('constructor' in a && 'constructor' in b)) {
 953      return false;
 954    }
 955    // Add the first object to the stack of traversed objects.
 956    aStack.push(a);
 957    bStack.push(b);
 958    var size = 0, result = true;
 959    // Recursively compare objects and arrays.
 960    if (className == '[object Array]') {
 961      // Compare array lengths to determine if a deep comparison is necessary.
 962      size = a.length;
 963      result = size == b.length;
 964      if (result) {
 965        // Deep compare the contents, ignoring non-numeric properties.
 966        while (size--) {
 967          if (!(result = eq(a[size], b[size], aStack, bStack))) break;
 968        }
 969      }
 970    } else {
 971      // Deep compare objects.
 972      for (var key in a) {
 973        if (_.has(a, key)) {
 974          // Count the expected number of properties.
 975          size++;
 976          // Deep compare each member.
 977          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
 978        }
 979      }
 980      // Ensure that both objects contain the same number of properties.
 981      if (result) {
 982        for (key in b) {
 983          if (_.has(b, key) && !(size--)) break;
 984        }
 985        result = !size;
 986      }
 987    }
 988    // Remove the first object from the stack of traversed objects.
 989    aStack.pop();
 990    bStack.pop();
 991    return result;
 992  };
 993
 994  // Perform a deep comparison to check if two objects are equal.
 995  _.isEqual = function(a, b) {
 996    return eq(a, b, [], []);
 997  };
 998
 999  // Is a given array, string, or object empty?
1000  // An "empty" object has no enumerable own-properties.
1001  _.isEmpty = function(obj) {
1002    if (obj == null) return true;
1003    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
1004    for (var key in obj) if (_.has(obj, key)) return false;
1005    return true;
1006  };
1007
1008  // Is a given value a DOM element?
1009  _.isElement = function(obj) {
1010    return !!(obj && obj.nodeType === 1);
1011  };
1012
1013  // Is a given value an array?
1014  // Delegates to ECMA5's native Array.isArray
1015  _.isArray = nativeIsArray || function(obj) {
1016    return toString.call(obj) == '[object Array]';
1017  };
1018
1019  // Is a given variable an object?
1020  _.isObject = function(obj) {
1021    return obj === Object(obj);
1022  };
1023
1024  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
1025  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
1026    _['is' + name] = function(obj) {
1027      return toString.call(obj) == '[object ' + name + ']';
1028    };
1029  });
1030
1031  // Define a fallback version of the method in browsers (ahem, IE), where
1032  // there isn't any inspectable "Arguments" type.
1033  if (!_.isArguments(arguments)) {
1034    _.isArguments = function(obj) {
1035      return !!(obj && _.has(obj, 'callee'));
1036    };
1037  }
1038
1039  // Optimize `isFunction` if appropriate.
1040  if (typeof (/./) !== 'function') {
1041    _.isFunction = function(obj) {
1042      return typeof obj === 'function';
1043    };
1044  }
1045
1046  // Is a given object a finite number?
1047  _.isFinite = function(obj) {
1048    return isFinite(obj) && !isNaN(parseFloat(obj));
1049  };
1050
1051  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
1052  _.isNaN = function(obj) {
1053    return _.isNumber(obj) && obj != +obj;
1054  };
1055
1056  // Is a given value a boolean?
1057  _.isBoolean = function(obj) {
1058    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
1059  };
1060
1061  // Is a given value equal to null?
1062  _.isNull = function(obj) {
1063    return obj === null;
1064  };
1065
1066  // Is a given variable undefined?
1067  _.isUndefined = function(obj) {
1068    return obj === void 0;
1069  };
1070
1071  // Shortcut function for checking if an object has a given property directly
1072  // on itself (in other words, not on a prototype).
1073  _.has = function(obj, key) {
1074    return hasOwnProperty.call(obj, key);
1075  };
1076
1077  // Utility Functions
1078  // -----------------
1079
1080  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
1081  // previous owner. Returns a reference to the Underscore object.
1082  _.noConflict = function() {
1083    root._ = previousUnderscore;
1084    return this;
1085  };
1086
1087  // Keep the identity function around for default iterators.
1088  _.identity = function(value) {
1089    return value;
1090  };
1091
1092  _.constant = function(value) {
1093    return function () {
1094      return value;
1095    };
1096  };
1097
1098  _.property = function(key) {
1099    return function(obj) {
1100      return obj[key];
1101    };
1102  };
1103
1104  // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
1105  _.matches = function(attrs) {
1106    return function(obj) {
1107      if (obj === attrs) return true; //avoid comparing an object to itself.
1108      for (var key in attrs) {
1109        if (attrs[key] !== obj[key])
1110          return false;
1111      }
1112      return true;
1113    }
1114  };
1115
1116  // Run a function **n** times.
1117  _.times = function(n, iterator, context) {
1118    var accum = Array(Math.max(0, n));
1119    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
1120    return accum;
1121  };
1122
1123  // Return a random integer between min and max (inclusive).
1124  _.random = function(min, max) {
1125    if (max == null) {
1126      max = min;
1127      min = 0;
1128    }
1129    return min + Math.floor(Math.random() * (max - min + 1));
1130  };
1131
1132  // A (possibly faster) way to get the current timestamp as an integer.
1133  _.now = Date.now || function() { return new Date().getTime(); };
1134
1135  // List of HTML entities for escaping.
1136  var entityMap = {
1137    escape: {
1138      '&': '&amp;',
1139      '<': '&lt;',
1140      '>': '&gt;',
1141      '"': '&quot;',
1142      "'": '&#x27;'
1143    }
1144  };
1145  entityMap.unescape = _.invert(entityMap.escape);
1146
1147  // Regexes containing the keys and values listed immediately above.
1148  var entityRegexes = {
1149    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
1150    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
1151  };
1152
1153  // Functions for escaping and unescaping strings to/from HTML interpolation.
1154  _.each(['escape', 'unescape'], function(method) {
1155    _[method] = function(string) {
1156      if (string == null) return '';
1157      return ('' + string).replace(entityRegexes[method], function(match) {
1158        return entityMap[method][match];
1159      });
1160    };
1161  });
1162
1163  // If the value of the named `property` is a function then invoke it with the
1164  // `object` as context; otherwise, return it.
1165  _.result = function(object, property) {
1166    if (object == null) return void 0;
1167    var value = object[property];
1168    return _.isFunction(value) ? value.call(object) : value;
1169  };
1170
1171  // Add your own custom functions to the Underscore object.
1172  _.mixin = function(obj) {
1173    each(_.functions(obj), function(name) {
1174      var func = _[name] = obj[name];
1175      _.prototype[name] = function() {
1176        var args = [this._wrapped];
1177        push.apply(args, arguments);
1178        return result.call(this, func.apply(_, args));
1179      };
1180    });
1181  };
1182
1183  // Generate a unique integer id (unique within the entire client session).
1184  // Useful for temporary DOM ids.
1185  var idCounter = 0;
1186  _.uniqueId = function(prefix) {
1187    var id = ++idCounter + '';
1188    return prefix ? prefix + id : id;
1189  };
1190
1191  // By default, Underscore uses ERB-style template delimiters, change the
1192  // following template settings to use alternative delimiters.
1193  _.templateSettings = {
1194    evaluate    : /<%([\s\S]+?)%>/g,
1195    interpolate : /<%=([\s\S]+?)%>/g,
1196    escape      : /<%-([\s\S]+?)%>/g
1197  };
1198
1199  // When customizing `templateSettings`, if you don't want to define an
1200  // interpolation, evaluation or escaping regex, we need one that is
1201  // guaranteed not to match.
1202  var noMatch = /(.)^/;
1203
1204  // Certain characters need to be escaped so that they can be put into a
1205  // string literal.
1206  var escapes = {
1207    "'":      "'",
1208    '\\':     '\\',
1209    '\r':     'r',
1210    '\n':     'n',
1211    '\t':     't',
1212    '\u2028': 'u2028',
1213    '\u2029': 'u2029'
1214  };
1215
1216  var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
1217
1218  // JavaScript micro-templating, similar to John Resig's implementation.
1219  // Underscore templating handles arbitrary delimiters, preserves whitespace,
1220  // and correctly escapes quotes within interpolated code.
1221  _.template = function(text, data, settings) {
1222    var render;
1223    settings = _.defaults({}, settings, _.templateSettings);
1224
1225    // Combine delimiters into one regular expression via alternation.
1226    var matcher = new RegExp([
1227      (settings.escape || noMatch).source,
1228      (settings.interpolate || noMatch).source,
1229      (settings.evaluate || noMatch).source
1230    ].join('|') + '|$', 'g');
1231
1232    // Compile the template source, escaping string literals appropriately.
1233    var index = 0;
1234    var source = "__p+='";
1235    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
1236      source += text.slice(index, offset)
1237        .replace(escaper, function(match) { return '\\' + escapes[match]; });
1238
1239      if (escape) {
1240        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
1241      }
1242      if (interpolate) {
1243        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1244      }
1245      if (evaluate) {
1246        source += "';\n" + evaluate + "\n__p+='";
1247      }
1248      index = offset + match.length;
1249      return match;
1250    });
1251    source += "';\n";
1252
1253    // If a variable is not specified, place data values in local scope.
1254    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
1255
1256    source = "var __t,__p='',__j=Array.prototype.join," +
1257      "print=function(){__p+=__j.call(arguments,'');};\n" +
1258      source + "return __p;\n";
1259
1260    try {
1261      render = new Function(settings.variable || 'obj', '_', source);
1262    } catch (e) {
1263      e.source = source;
1264      throw e;
1265    }
1266
1267    if (data) return render(data, _);
1268    var template = function(data) {
1269      return render.call(this, data, _);
1270    };
1271
1272    // Provide the compiled function source as a convenience for precompilation.
1273    template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
1274
1275    return template;
1276  };
1277
1278  // Add a "chain" function, which will delegate to the wrapper.
1279  _.chain = function(obj) {
1280    return _(obj).chain();
1281  };
1282
1283  // OOP
1284  // ---------------
1285  // If Underscore is called as a function, it returns a wrapped object that
1286  // can be used OO-style. This wrapper holds altered versions of all the
1287  // underscore functions. Wrapped objects may be chained.
1288
1289  // Helper function to continue chaining intermediate results.
1290  var result = function(obj) {
1291    return this._chain ? _(obj).chain() : obj;
1292  };
1293
1294  // Add all of the Underscore functions to the wrapper object.
1295  _.mixin(_);
1296
1297  // Add all mutator Array functions to the wrapper.
1298  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
1299    var method = ArrayProto[name];
1300    _.prototype[name] = function() {
1301      var obj = this._wrapped;
1302      method.apply(obj, arguments);
1303      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
1304      return result.call(this, obj);
1305    };
1306  });
1307
1308  // Add all accessor Array functions to the wrapper.
1309  each(['concat', 'join', 'slice'], function(name) {
1310    var method = ArrayProto[name];
1311    _.prototype[name] = function() {
1312      return result.call(this, method.apply(this._wrapped, arguments));
1313    };
1314  });
1315
1316  _.extend(_.prototype, {
1317
1318    // Start chaining a wrapped Underscore object.
1319    chain: function() {
1320      this._chain = true;
1321      return this;
1322    },
1323
1324    // Extracts the result from a wrapped and chained object.
1325    value: function() {
1326      return this._wrapped;
1327    }
1328
1329  });
1330
1331  // AMD registration happens at the end for compatibility with AMD loaders
1332  // that may not enforce next-turn semantics on modules. Even though general
1333  // practice for AMD registration is to be anonymous, underscore registers
1334  // as a named module because, like jQuery, it is a base library that is
1335  // popular enough to be bundled in a third party lib, but not be part of
1336  // an AMD load request. Those cases could generate an error when an
1337  // anonymous define() is called outside of a loader request.
1338  if (typeof define === 'function' && define.amd) {
1339    define('underscore', [], function() {
1340      return _;
1341    });
1342  }
1343}).call(this);