core.js
   1  /**
   2   * @license
   3   * Lodash (Custom Build) <https://lodash.com/>
   4   * Build: `lodash core -o ./dist/lodash.core.js`
   5   * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
   6   * Released under MIT license <https://lodash.com/license>
   7   * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
   8   * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
   9   */
  10  ;(function() {
  11  
  12    /** Used as a safe reference for `undefined` in pre-ES5 environments. */
  13    var undefined;
  14  
  15    /** Used as the semantic version number. */
  16    var VERSION = '4.17.21';
  17  
  18    /** Error message constants. */
  19    var FUNC_ERROR_TEXT = 'Expected a function';
  20  
  21    /** Used to compose bitmasks for value comparisons. */
  22    var COMPARE_PARTIAL_FLAG = 1,
  23        COMPARE_UNORDERED_FLAG = 2;
  24  
  25    /** Used to compose bitmasks for function metadata. */
  26    var WRAP_BIND_FLAG = 1,
  27        WRAP_PARTIAL_FLAG = 32;
  28  
  29    /** Used as references for various `Number` constants. */
  30    var INFINITY = 1 / 0,
  31        MAX_SAFE_INTEGER = 9007199254740991;
  32  
  33    /** `Object#toString` result references. */
  34    var argsTag = '[object Arguments]',
  35        arrayTag = '[object Array]',
  36        asyncTag = '[object AsyncFunction]',
  37        boolTag = '[object Boolean]',
  38        dateTag = '[object Date]',
  39        errorTag = '[object Error]',
  40        funcTag = '[object Function]',
  41        genTag = '[object GeneratorFunction]',
  42        numberTag = '[object Number]',
  43        objectTag = '[object Object]',
  44        proxyTag = '[object Proxy]',
  45        regexpTag = '[object RegExp]',
  46        stringTag = '[object String]';
  47  
  48    /** Used to match HTML entities and HTML characters. */
  49    var reUnescapedHtml = /[&<>"']/g,
  50        reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
  51  
  52    /** Used to detect unsigned integer values. */
  53    var reIsUint = /^(?:0|[1-9]\d*)$/;
  54  
  55    /** Used to map characters to HTML entities. */
  56    var htmlEscapes = {
  57      '&': '&amp;',
  58      '<': '&lt;',
  59      '>': '&gt;',
  60      '"': '&quot;',
  61      "'": '&#39;'
  62    };
  63  
  64    /** Detect free variable `global` from Node.js. */
  65    var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
  66  
  67    /** Detect free variable `self`. */
  68    var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  69  
  70    /** Used as a reference to the global object. */
  71    var root = freeGlobal || freeSelf || Function('return this')();
  72  
  73    /** Detect free variable `exports`. */
  74    var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
  75  
  76    /** Detect free variable `module`. */
  77    var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
  78  
  79    /*--------------------------------------------------------------------------*/
  80  
  81    /**
  82     * Appends the elements of `values` to `array`.
  83     *
  84     * @private
  85     * @param {Array} array The array to modify.
  86     * @param {Array} values The values to append.
  87     * @returns {Array} Returns `array`.
  88     */
  89    function arrayPush(array, values) {
  90      array.push.apply(array, values);
  91      return array;
  92    }
  93  
  94    /**
  95     * The base implementation of `_.findIndex` and `_.findLastIndex` without
  96     * support for iteratee shorthands.
  97     *
  98     * @private
  99     * @param {Array} array The array to inspect.
 100     * @param {Function} predicate The function invoked per iteration.
 101     * @param {number} fromIndex The index to search from.
 102     * @param {boolean} [fromRight] Specify iterating from right to left.
 103     * @returns {number} Returns the index of the matched value, else `-1`.
 104     */
 105    function baseFindIndex(array, predicate, fromIndex, fromRight) {
 106      var length = array.length,
 107          index = fromIndex + (fromRight ? 1 : -1);
 108  
 109      while ((fromRight ? index-- : ++index < length)) {
 110        if (predicate(array[index], index, array)) {
 111          return index;
 112        }
 113      }
 114      return -1;
 115    }
 116  
 117    /**
 118     * The base implementation of `_.property` without support for deep paths.
 119     *
 120     * @private
 121     * @param {string} key The key of the property to get.
 122     * @returns {Function} Returns the new accessor function.
 123     */
 124    function baseProperty(key) {
 125      return function(object) {
 126        return object == null ? undefined : object[key];
 127      };
 128    }
 129  
 130    /**
 131     * The base implementation of `_.propertyOf` without support for deep paths.
 132     *
 133     * @private
 134     * @param {Object} object The object to query.
 135     * @returns {Function} Returns the new accessor function.
 136     */
 137    function basePropertyOf(object) {
 138      return function(key) {
 139        return object == null ? undefined : object[key];
 140      };
 141    }
 142  
 143    /**
 144     * The base implementation of `_.reduce` and `_.reduceRight`, without support
 145     * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
 146     *
 147     * @private
 148     * @param {Array|Object} collection The collection to iterate over.
 149     * @param {Function} iteratee The function invoked per iteration.
 150     * @param {*} accumulator The initial value.
 151     * @param {boolean} initAccum Specify using the first or last element of
 152     *  `collection` as the initial value.
 153     * @param {Function} eachFunc The function to iterate over `collection`.
 154     * @returns {*} Returns the accumulated value.
 155     */
 156    function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
 157      eachFunc(collection, function(value, index, collection) {
 158        accumulator = initAccum
 159          ? (initAccum = false, value)
 160          : iteratee(accumulator, value, index, collection);
 161      });
 162      return accumulator;
 163    }
 164  
 165    /**
 166     * The base implementation of `_.values` and `_.valuesIn` which creates an
 167     * array of `object` property values corresponding to the property names
 168     * of `props`.
 169     *
 170     * @private
 171     * @param {Object} object The object to query.
 172     * @param {Array} props The property names to get values for.
 173     * @returns {Object} Returns the array of property values.
 174     */
 175    function baseValues(object, props) {
 176      return baseMap(props, function(key) {
 177        return object[key];
 178      });
 179    }
 180  
 181    /**
 182     * Used by `_.escape` to convert characters to HTML entities.
 183     *
 184     * @private
 185     * @param {string} chr The matched character to escape.
 186     * @returns {string} Returns the escaped character.
 187     */
 188    var escapeHtmlChar = basePropertyOf(htmlEscapes);
 189  
 190    /**
 191     * Creates a unary function that invokes `func` with its argument transformed.
 192     *
 193     * @private
 194     * @param {Function} func The function to wrap.
 195     * @param {Function} transform The argument transform.
 196     * @returns {Function} Returns the new function.
 197     */
 198    function overArg(func, transform) {
 199      return function(arg) {
 200        return func(transform(arg));
 201      };
 202    }
 203  
 204    /*--------------------------------------------------------------------------*/
 205  
 206    /** Used for built-in method references. */
 207    var arrayProto = Array.prototype,
 208        objectProto = Object.prototype;
 209  
 210    /** Used to check objects for own properties. */
 211    var hasOwnProperty = objectProto.hasOwnProperty;
 212  
 213    /** Used to generate unique IDs. */
 214    var idCounter = 0;
 215  
 216    /**
 217     * Used to resolve the
 218     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 219     * of values.
 220     */
 221    var nativeObjectToString = objectProto.toString;
 222  
 223    /** Used to restore the original `_` reference in `_.noConflict`. */
 224    var oldDash = root._;
 225  
 226    /** Built-in value references. */
 227    var objectCreate = Object.create,
 228        propertyIsEnumerable = objectProto.propertyIsEnumerable;
 229  
 230    /* Built-in method references for those with the same name as other `lodash` methods. */
 231    var nativeIsFinite = root.isFinite,
 232        nativeKeys = overArg(Object.keys, Object),
 233        nativeMax = Math.max;
 234  
 235    /*------------------------------------------------------------------------*/
 236  
 237    /**
 238     * Creates a `lodash` object which wraps `value` to enable implicit method
 239     * chain sequences. Methods that operate on and return arrays, collections,
 240     * and functions can be chained together. Methods that retrieve a single value
 241     * or may return a primitive value will automatically end the chain sequence
 242     * and return the unwrapped value. Otherwise, the value must be unwrapped
 243     * with `_#value`.
 244     *
 245     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
 246     * enabled using `_.chain`.
 247     *
 248     * The execution of chained methods is lazy, that is, it's deferred until
 249     * `_#value` is implicitly or explicitly called.
 250     *
 251     * Lazy evaluation allows several methods to support shortcut fusion.
 252     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
 253     * the creation of intermediate arrays and can greatly reduce the number of
 254     * iteratee executions. Sections of a chain sequence qualify for shortcut
 255     * fusion if the section is applied to an array and iteratees accept only
 256     * one argument. The heuristic for whether a section qualifies for shortcut
 257     * fusion is subject to change.
 258     *
 259     * Chaining is supported in custom builds as long as the `_#value` method is
 260     * directly or indirectly included in the build.
 261     *
 262     * In addition to lodash methods, wrappers have `Array` and `String` methods.
 263     *
 264     * The wrapper `Array` methods are:
 265     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
 266     *
 267     * The wrapper `String` methods are:
 268     * `replace` and `split`
 269     *
 270     * The wrapper methods that support shortcut fusion are:
 271     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
 272     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
 273     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
 274     *
 275     * The chainable wrapper methods are:
 276     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
 277     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
 278     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
 279     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
 280     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
 281     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
 282     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
 283     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
 284     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
 285     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
 286     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
 287     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
 288     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
 289     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
 290     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
 291     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
 292     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
 293     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
 294     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
 295     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
 296     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
 297     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
 298     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
 299     * `zipObject`, `zipObjectDeep`, and `zipWith`
 300     *
 301     * The wrapper methods that are **not** chainable by default are:
 302     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
 303     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
 304     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
 305     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
 306     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
 307     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
 308     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
 309     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
 310     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
 311     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
 312     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
 313     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
 314     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
 315     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
 316     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
 317     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
 318     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
 319     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
 320     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
 321     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
 322     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
 323     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
 324     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
 325     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
 326     * `upperFirst`, `value`, and `words`
 327     *
 328     * @name _
 329     * @constructor
 330     * @category Seq
 331     * @param {*} value The value to wrap in a `lodash` instance.
 332     * @returns {Object} Returns the new `lodash` wrapper instance.
 333     * @example
 334     *
 335     * function square(n) {
 336     *   return n * n;
 337     * }
 338     *
 339     * var wrapped = _([1, 2, 3]);
 340     *
 341     * // Returns an unwrapped value.
 342     * wrapped.reduce(_.add);
 343     * // => 6
 344     *
 345     * // Returns a wrapped value.
 346     * var squares = wrapped.map(square);
 347     *
 348     * _.isArray(squares);
 349     * // => false
 350     *
 351     * _.isArray(squares.value());
 352     * // => true
 353     */
 354    function lodash(value) {
 355      return value instanceof LodashWrapper
 356        ? value
 357        : new LodashWrapper(value);
 358    }
 359  
 360    /**
 361     * The base implementation of `_.create` without support for assigning
 362     * properties to the created object.
 363     *
 364     * @private
 365     * @param {Object} proto The object to inherit from.
 366     * @returns {Object} Returns the new object.
 367     */
 368    var baseCreate = (function() {
 369      function object() {}
 370      return function(proto) {
 371        if (!isObject(proto)) {
 372          return {};
 373        }
 374        if (objectCreate) {
 375          return objectCreate(proto);
 376        }
 377        object.prototype = proto;
 378        var result = new object;
 379        object.prototype = undefined;
 380        return result;
 381      };
 382    }());
 383  
 384    /**
 385     * The base constructor for creating `lodash` wrapper objects.
 386     *
 387     * @private
 388     * @param {*} value The value to wrap.
 389     * @param {boolean} [chainAll] Enable explicit method chain sequences.
 390     */
 391    function LodashWrapper(value, chainAll) {
 392      this.__wrapped__ = value;
 393      this.__actions__ = [];
 394      this.__chain__ = !!chainAll;
 395    }
 396  
 397    LodashWrapper.prototype = baseCreate(lodash.prototype);
 398    LodashWrapper.prototype.constructor = LodashWrapper;
 399  
 400    /*------------------------------------------------------------------------*/
 401  
 402    /**
 403     * Assigns `value` to `key` of `object` if the existing value is not equivalent
 404     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 405     * for equality comparisons.
 406     *
 407     * @private
 408     * @param {Object} object The object to modify.
 409     * @param {string} key The key of the property to assign.
 410     * @param {*} value The value to assign.
 411     */
 412    function assignValue(object, key, value) {
 413      var objValue = object[key];
 414      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
 415          (value === undefined && !(key in object))) {
 416        baseAssignValue(object, key, value);
 417      }
 418    }
 419  
 420    /**
 421     * The base implementation of `assignValue` and `assignMergeValue` without
 422     * value checks.
 423     *
 424     * @private
 425     * @param {Object} object The object to modify.
 426     * @param {string} key The key of the property to assign.
 427     * @param {*} value The value to assign.
 428     */
 429    function baseAssignValue(object, key, value) {
 430      object[key] = value;
 431    }
 432  
 433    /**
 434     * The base implementation of `_.delay` and `_.defer` which accepts `args`
 435     * to provide to `func`.
 436     *
 437     * @private
 438     * @param {Function} func The function to delay.
 439     * @param {number} wait The number of milliseconds to delay invocation.
 440     * @param {Array} args The arguments to provide to `func`.
 441     * @returns {number|Object} Returns the timer id or timeout object.
 442     */
 443    function baseDelay(func, wait, args) {
 444      if (typeof func != 'function') {
 445        throw new TypeError(FUNC_ERROR_TEXT);
 446      }
 447      return setTimeout(function() { func.apply(undefined, args); }, wait);
 448    }
 449  
 450    /**
 451     * The base implementation of `_.forEach` without support for iteratee shorthands.
 452     *
 453     * @private
 454     * @param {Array|Object} collection The collection to iterate over.
 455     * @param {Function} iteratee The function invoked per iteration.
 456     * @returns {Array|Object} Returns `collection`.
 457     */
 458    var baseEach = createBaseEach(baseForOwn);
 459  
 460    /**
 461     * The base implementation of `_.every` without support for iteratee shorthands.
 462     *
 463     * @private
 464     * @param {Array|Object} collection The collection to iterate over.
 465     * @param {Function} predicate The function invoked per iteration.
 466     * @returns {boolean} Returns `true` if all elements pass the predicate check,
 467     *  else `false`
 468     */
 469    function baseEvery(collection, predicate) {
 470      var result = true;
 471      baseEach(collection, function(value, index, collection) {
 472        result = !!predicate(value, index, collection);
 473        return result;
 474      });
 475      return result;
 476    }
 477  
 478    /**
 479     * The base implementation of methods like `_.max` and `_.min` which accepts a
 480     * `comparator` to determine the extremum value.
 481     *
 482     * @private
 483     * @param {Array} array The array to iterate over.
 484     * @param {Function} iteratee The iteratee invoked per iteration.
 485     * @param {Function} comparator The comparator used to compare values.
 486     * @returns {*} Returns the extremum value.
 487     */
 488    function baseExtremum(array, iteratee, comparator) {
 489      var index = -1,
 490          length = array.length;
 491  
 492      while (++index < length) {
 493        var value = array[index],
 494            current = iteratee(value);
 495  
 496        if (current != null && (computed === undefined
 497              ? (current === current && !false)
 498              : comparator(current, computed)
 499            )) {
 500          var computed = current,
 501              result = value;
 502        }
 503      }
 504      return result;
 505    }
 506  
 507    /**
 508     * The base implementation of `_.filter` without support for iteratee shorthands.
 509     *
 510     * @private
 511     * @param {Array|Object} collection The collection to iterate over.
 512     * @param {Function} predicate The function invoked per iteration.
 513     * @returns {Array} Returns the new filtered array.
 514     */
 515    function baseFilter(collection, predicate) {
 516      var result = [];
 517      baseEach(collection, function(value, index, collection) {
 518        if (predicate(value, index, collection)) {
 519          result.push(value);
 520        }
 521      });
 522      return result;
 523    }
 524  
 525    /**
 526     * The base implementation of `_.flatten` with support for restricting flattening.
 527     *
 528     * @private
 529     * @param {Array} array The array to flatten.
 530     * @param {number} depth The maximum recursion depth.
 531     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
 532     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
 533     * @param {Array} [result=[]] The initial result value.
 534     * @returns {Array} Returns the new flattened array.
 535     */
 536    function baseFlatten(array, depth, predicate, isStrict, result) {
 537      var index = -1,
 538          length = array.length;
 539  
 540      predicate || (predicate = isFlattenable);
 541      result || (result = []);
 542  
 543      while (++index < length) {
 544        var value = array[index];
 545        if (depth > 0 && predicate(value)) {
 546          if (depth > 1) {
 547            // Recursively flatten arrays (susceptible to call stack limits).
 548            baseFlatten(value, depth - 1, predicate, isStrict, result);
 549          } else {
 550            arrayPush(result, value);
 551          }
 552        } else if (!isStrict) {
 553          result[result.length] = value;
 554        }
 555      }
 556      return result;
 557    }
 558  
 559    /**
 560     * The base implementation of `baseForOwn` which iterates over `object`
 561     * properties returned by `keysFunc` and invokes `iteratee` for each property.
 562     * Iteratee functions may exit iteration early by explicitly returning `false`.
 563     *
 564     * @private
 565     * @param {Object} object The object to iterate over.
 566     * @param {Function} iteratee The function invoked per iteration.
 567     * @param {Function} keysFunc The function to get the keys of `object`.
 568     * @returns {Object} Returns `object`.
 569     */
 570    var baseFor = createBaseFor();
 571  
 572    /**
 573     * The base implementation of `_.forOwn` without support for iteratee shorthands.
 574     *
 575     * @private
 576     * @param {Object} object The object to iterate over.
 577     * @param {Function} iteratee The function invoked per iteration.
 578     * @returns {Object} Returns `object`.
 579     */
 580    function baseForOwn(object, iteratee) {
 581      return object && baseFor(object, iteratee, keys);
 582    }
 583  
 584    /**
 585     * The base implementation of `_.functions` which creates an array of
 586     * `object` function property names filtered from `props`.
 587     *
 588     * @private
 589     * @param {Object} object The object to inspect.
 590     * @param {Array} props The property names to filter.
 591     * @returns {Array} Returns the function names.
 592     */
 593    function baseFunctions(object, props) {
 594      return baseFilter(props, function(key) {
 595        return isFunction(object[key]);
 596      });
 597    }
 598  
 599    /**
 600     * The base implementation of `getTag` without fallbacks for buggy environments.
 601     *
 602     * @private
 603     * @param {*} value The value to query.
 604     * @returns {string} Returns the `toStringTag`.
 605     */
 606    function baseGetTag(value) {
 607      return objectToString(value);
 608    }
 609  
 610    /**
 611     * The base implementation of `_.gt` which doesn't coerce arguments.
 612     *
 613     * @private
 614     * @param {*} value The value to compare.
 615     * @param {*} other The other value to compare.
 616     * @returns {boolean} Returns `true` if `value` is greater than `other`,
 617     *  else `false`.
 618     */
 619    function baseGt(value, other) {
 620      return value > other;
 621    }
 622  
 623    /**
 624     * The base implementation of `_.isArguments`.
 625     *
 626     * @private
 627     * @param {*} value The value to check.
 628     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 629     */
 630    var baseIsArguments = noop;
 631  
 632    /**
 633     * The base implementation of `_.isDate` without Node.js optimizations.
 634     *
 635     * @private
 636     * @param {*} value The value to check.
 637     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
 638     */
 639    function baseIsDate(value) {
 640      return isObjectLike(value) && baseGetTag(value) == dateTag;
 641    }
 642  
 643    /**
 644     * The base implementation of `_.isEqual` which supports partial comparisons
 645     * and tracks traversed objects.
 646     *
 647     * @private
 648     * @param {*} value The value to compare.
 649     * @param {*} other The other value to compare.
 650     * @param {boolean} bitmask The bitmask flags.
 651     *  1 - Unordered comparison
 652     *  2 - Partial comparison
 653     * @param {Function} [customizer] The function to customize comparisons.
 654     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
 655     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 656     */
 657    function baseIsEqual(value, other, bitmask, customizer, stack) {
 658      if (value === other) {
 659        return true;
 660      }
 661      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
 662        return value !== value && other !== other;
 663      }
 664      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
 665    }
 666  
 667    /**
 668     * A specialized version of `baseIsEqual` for arrays and objects which performs
 669     * deep comparisons and tracks traversed objects enabling objects with circular
 670     * references to be compared.
 671     *
 672     * @private
 673     * @param {Object} object The object to compare.
 674     * @param {Object} other The other object to compare.
 675     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
 676     * @param {Function} customizer The function to customize comparisons.
 677     * @param {Function} equalFunc The function to determine equivalents of values.
 678     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
 679     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
 680     */
 681    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
 682      var objIsArr = isArray(object),
 683          othIsArr = isArray(other),
 684          objTag = objIsArr ? arrayTag : baseGetTag(object),
 685          othTag = othIsArr ? arrayTag : baseGetTag(other);
 686  
 687      objTag = objTag == argsTag ? objectTag : objTag;
 688      othTag = othTag == argsTag ? objectTag : othTag;
 689  
 690      var objIsObj = objTag == objectTag,
 691          othIsObj = othTag == objectTag,
 692          isSameTag = objTag == othTag;
 693  
 694      stack || (stack = []);
 695      var objStack = find(stack, function(entry) {
 696        return entry[0] == object;
 697      });
 698      var othStack = find(stack, function(entry) {
 699        return entry[0] == other;
 700      });
 701      if (objStack && othStack) {
 702        return objStack[1] == other;
 703      }
 704      stack.push([object, other]);
 705      stack.push([other, object]);
 706      if (isSameTag && !objIsObj) {
 707        var result = (objIsArr)
 708          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
 709          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
 710        stack.pop();
 711        return result;
 712      }
 713      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
 714        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
 715            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
 716  
 717        if (objIsWrapped || othIsWrapped) {
 718          var objUnwrapped = objIsWrapped ? object.value() : object,
 719              othUnwrapped = othIsWrapped ? other.value() : other;
 720  
 721          var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
 722          stack.pop();
 723          return result;
 724        }
 725      }
 726      if (!isSameTag) {
 727        return false;
 728      }
 729      var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack);
 730      stack.pop();
 731      return result;
 732    }
 733  
 734    /**
 735     * The base implementation of `_.isRegExp` without Node.js optimizations.
 736     *
 737     * @private
 738     * @param {*} value The value to check.
 739     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
 740     */
 741    function baseIsRegExp(value) {
 742      return isObjectLike(value) && baseGetTag(value) == regexpTag;
 743    }
 744  
 745    /**
 746     * The base implementation of `_.iteratee`.
 747     *
 748     * @private
 749     * @param {*} [value=_.identity] The value to convert to an iteratee.
 750     * @returns {Function} Returns the iteratee.
 751     */
 752    function baseIteratee(func) {
 753      if (typeof func == 'function') {
 754        return func;
 755      }
 756      if (func == null) {
 757        return identity;
 758      }
 759      return (typeof func == 'object' ? baseMatches : baseProperty)(func);
 760    }
 761  
 762    /**
 763     * The base implementation of `_.lt` which doesn't coerce arguments.
 764     *
 765     * @private
 766     * @param {*} value The value to compare.
 767     * @param {*} other The other value to compare.
 768     * @returns {boolean} Returns `true` if `value` is less than `other`,
 769     *  else `false`.
 770     */
 771    function baseLt(value, other) {
 772      return value < other;
 773    }
 774  
 775    /**
 776     * The base implementation of `_.map` without support for iteratee shorthands.
 777     *
 778     * @private
 779     * @param {Array|Object} collection The collection to iterate over.
 780     * @param {Function} iteratee The function invoked per iteration.
 781     * @returns {Array} Returns the new mapped array.
 782     */
 783    function baseMap(collection, iteratee) {
 784      var index = -1,
 785          result = isArrayLike(collection) ? Array(collection.length) : [];
 786  
 787      baseEach(collection, function(value, key, collection) {
 788        result[++index] = iteratee(value, key, collection);
 789      });
 790      return result;
 791    }
 792  
 793    /**
 794     * The base implementation of `_.matches` which doesn't clone `source`.
 795     *
 796     * @private
 797     * @param {Object} source The object of property values to match.
 798     * @returns {Function} Returns the new spec function.
 799     */
 800    function baseMatches(source) {
 801      var props = nativeKeys(source);
 802      return function(object) {
 803        var length = props.length;
 804        if (object == null) {
 805          return !length;
 806        }
 807        object = Object(object);
 808        while (length--) {
 809          var key = props[length];
 810          if (!(key in object &&
 811                baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)
 812              )) {
 813            return false;
 814          }
 815        }
 816        return true;
 817      };
 818    }
 819  
 820    /**
 821     * The base implementation of `_.pick` without support for individual
 822     * property identifiers.
 823     *
 824     * @private
 825     * @param {Object} object The source object.
 826     * @param {string[]} paths The property paths to pick.
 827     * @returns {Object} Returns the new object.
 828     */
 829    function basePick(object, props) {
 830      object = Object(object);
 831      return reduce(props, function(result, key) {
 832        if (key in object) {
 833          result[key] = object[key];
 834        }
 835        return result;
 836      }, {});
 837    }
 838  
 839    /**
 840     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
 841     *
 842     * @private
 843     * @param {Function} func The function to apply a rest parameter to.
 844     * @param {number} [start=func.length-1] The start position of the rest parameter.
 845     * @returns {Function} Returns the new function.
 846     */
 847    function baseRest(func, start) {
 848      return setToString(overRest(func, start, identity), func + '');
 849    }
 850  
 851    /**
 852     * The base implementation of `_.slice` without an iteratee call guard.
 853     *
 854     * @private
 855     * @param {Array} array The array to slice.
 856     * @param {number} [start=0] The start position.
 857     * @param {number} [end=array.length] The end position.
 858     * @returns {Array} Returns the slice of `array`.
 859     */
 860    function baseSlice(array, start, end) {
 861      var index = -1,
 862          length = array.length;
 863  
 864      if (start < 0) {
 865        start = -start > length ? 0 : (length + start);
 866      }
 867      end = end > length ? length : end;
 868      if (end < 0) {
 869        end += length;
 870      }
 871      length = start > end ? 0 : ((end - start) >>> 0);
 872      start >>>= 0;
 873  
 874      var result = Array(length);
 875      while (++index < length) {
 876        result[index] = array[index + start];
 877      }
 878      return result;
 879    }
 880  
 881    /**
 882     * Copies the values of `source` to `array`.
 883     *
 884     * @private
 885     * @param {Array} source The array to copy values from.
 886     * @param {Array} [array=[]] The array to copy values to.
 887     * @returns {Array} Returns `array`.
 888     */
 889    function copyArray(source) {
 890      return baseSlice(source, 0, source.length);
 891    }
 892  
 893    /**
 894     * The base implementation of `_.some` without support for iteratee shorthands.
 895     *
 896     * @private
 897     * @param {Array|Object} collection The collection to iterate over.
 898     * @param {Function} predicate The function invoked per iteration.
 899     * @returns {boolean} Returns `true` if any element passes the predicate check,
 900     *  else `false`.
 901     */
 902    function baseSome(collection, predicate) {
 903      var result;
 904  
 905      baseEach(collection, function(value, index, collection) {
 906        result = predicate(value, index, collection);
 907        return !result;
 908      });
 909      return !!result;
 910    }
 911  
 912    /**
 913     * The base implementation of `wrapperValue` which returns the result of
 914     * performing a sequence of actions on the unwrapped `value`, where each
 915     * successive action is supplied the return value of the previous.
 916     *
 917     * @private
 918     * @param {*} value The unwrapped value.
 919     * @param {Array} actions Actions to perform to resolve the unwrapped value.
 920     * @returns {*} Returns the resolved value.
 921     */
 922    function baseWrapperValue(value, actions) {
 923      var result = value;
 924      return reduce(actions, function(result, action) {
 925        return action.func.apply(action.thisArg, arrayPush([result], action.args));
 926      }, result);
 927    }
 928  
 929    /**
 930     * Compares values to sort them in ascending order.
 931     *
 932     * @private
 933     * @param {*} value The value to compare.
 934     * @param {*} other The other value to compare.
 935     * @returns {number} Returns the sort order indicator for `value`.
 936     */
 937    function compareAscending(value, other) {
 938      if (value !== other) {
 939        var valIsDefined = value !== undefined,
 940            valIsNull = value === null,
 941            valIsReflexive = value === value,
 942            valIsSymbol = false;
 943  
 944        var othIsDefined = other !== undefined,
 945            othIsNull = other === null,
 946            othIsReflexive = other === other,
 947            othIsSymbol = false;
 948  
 949        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
 950            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
 951            (valIsNull && othIsDefined && othIsReflexive) ||
 952            (!valIsDefined && othIsReflexive) ||
 953            !valIsReflexive) {
 954          return 1;
 955        }
 956        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
 957            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
 958            (othIsNull && valIsDefined && valIsReflexive) ||
 959            (!othIsDefined && valIsReflexive) ||
 960            !othIsReflexive) {
 961          return -1;
 962        }
 963      }
 964      return 0;
 965    }
 966  
 967    /**
 968     * Copies properties of `source` to `object`.
 969     *
 970     * @private
 971     * @param {Object} source The object to copy properties from.
 972     * @param {Array} props The property identifiers to copy.
 973     * @param {Object} [object={}] The object to copy properties to.
 974     * @param {Function} [customizer] The function to customize copied values.
 975     * @returns {Object} Returns `object`.
 976     */
 977    function copyObject(source, props, object, customizer) {
 978      var isNew = !object;
 979      object || (object = {});
 980  
 981      var index = -1,
 982          length = props.length;
 983  
 984      while (++index < length) {
 985        var key = props[index];
 986  
 987        var newValue = customizer
 988          ? customizer(object[key], source[key], key, object, source)
 989          : undefined;
 990  
 991        if (newValue === undefined) {
 992          newValue = source[key];
 993        }
 994        if (isNew) {
 995          baseAssignValue(object, key, newValue);
 996        } else {
 997          assignValue(object, key, newValue);
 998        }
 999      }
1000      return object;
1001    }
1002  
1003    /**
1004     * Creates a function like `_.assign`.
1005     *
1006     * @private
1007     * @param {Function} assigner The function to assign values.
1008     * @returns {Function} Returns the new assigner function.
1009     */
1010    function createAssigner(assigner) {
1011      return baseRest(function(object, sources) {
1012        var index = -1,
1013            length = sources.length,
1014            customizer = length > 1 ? sources[length - 1] : undefined;
1015  
1016        customizer = (assigner.length > 3 && typeof customizer == 'function')
1017          ? (length--, customizer)
1018          : undefined;
1019  
1020        object = Object(object);
1021        while (++index < length) {
1022          var source = sources[index];
1023          if (source) {
1024            assigner(object, source, index, customizer);
1025          }
1026        }
1027        return object;
1028      });
1029    }
1030  
1031    /**
1032     * Creates a `baseEach` or `baseEachRight` function.
1033     *
1034     * @private
1035     * @param {Function} eachFunc The function to iterate over a collection.
1036     * @param {boolean} [fromRight] Specify iterating from right to left.
1037     * @returns {Function} Returns the new base function.
1038     */
1039    function createBaseEach(eachFunc, fromRight) {
1040      return function(collection, iteratee) {
1041        if (collection == null) {
1042          return collection;
1043        }
1044        if (!isArrayLike(collection)) {
1045          return eachFunc(collection, iteratee);
1046        }
1047        var length = collection.length,
1048            index = fromRight ? length : -1,
1049            iterable = Object(collection);
1050  
1051        while ((fromRight ? index-- : ++index < length)) {
1052          if (iteratee(iterable[index], index, iterable) === false) {
1053            break;
1054          }
1055        }
1056        return collection;
1057      };
1058    }
1059  
1060    /**
1061     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
1062     *
1063     * @private
1064     * @param {boolean} [fromRight] Specify iterating from right to left.
1065     * @returns {Function} Returns the new base function.
1066     */
1067    function createBaseFor(fromRight) {
1068      return function(object, iteratee, keysFunc) {
1069        var index = -1,
1070            iterable = Object(object),
1071            props = keysFunc(object),
1072            length = props.length;
1073  
1074        while (length--) {
1075          var key = props[fromRight ? length : ++index];
1076          if (iteratee(iterable[key], key, iterable) === false) {
1077            break;
1078          }
1079        }
1080        return object;
1081      };
1082    }
1083  
1084    /**
1085     * Creates a function that produces an instance of `Ctor` regardless of
1086     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
1087     *
1088     * @private
1089     * @param {Function} Ctor The constructor to wrap.
1090     * @returns {Function} Returns the new wrapped function.
1091     */
1092    function createCtor(Ctor) {
1093      return function() {
1094        // Use a `switch` statement to work with class constructors. See
1095        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
1096        // for more details.
1097        var args = arguments;
1098        var thisBinding = baseCreate(Ctor.prototype),
1099            result = Ctor.apply(thisBinding, args);
1100  
1101        // Mimic the constructor's `return` behavior.
1102        // See https://es5.github.io/#x13.2.2 for more details.
1103        return isObject(result) ? result : thisBinding;
1104      };
1105    }
1106  
1107    /**
1108     * Creates a `_.find` or `_.findLast` function.
1109     *
1110     * @private
1111     * @param {Function} findIndexFunc The function to find the collection index.
1112     * @returns {Function} Returns the new find function.
1113     */
1114    function createFind(findIndexFunc) {
1115      return function(collection, predicate, fromIndex) {
1116        var iterable = Object(collection);
1117        if (!isArrayLike(collection)) {
1118          var iteratee = baseIteratee(predicate, 3);
1119          collection = keys(collection);
1120          predicate = function(key) { return iteratee(iterable[key], key, iterable); };
1121        }
1122        var index = findIndexFunc(collection, predicate, fromIndex);
1123        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
1124      };
1125    }
1126  
1127    /**
1128     * Creates a function that wraps `func` to invoke it with the `this` binding
1129     * of `thisArg` and `partials` prepended to the arguments it receives.
1130     *
1131     * @private
1132     * @param {Function} func The function to wrap.
1133     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
1134     * @param {*} thisArg The `this` binding of `func`.
1135     * @param {Array} partials The arguments to prepend to those provided to
1136     *  the new function.
1137     * @returns {Function} Returns the new wrapped function.
1138     */
1139    function createPartial(func, bitmask, thisArg, partials) {
1140      if (typeof func != 'function') {
1141        throw new TypeError(FUNC_ERROR_TEXT);
1142      }
1143      var isBind = bitmask & WRAP_BIND_FLAG,
1144          Ctor = createCtor(func);
1145  
1146      function wrapper() {
1147        var argsIndex = -1,
1148            argsLength = arguments.length,
1149            leftIndex = -1,
1150            leftLength = partials.length,
1151            args = Array(leftLength + argsLength),
1152            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
1153  
1154        while (++leftIndex < leftLength) {
1155          args[leftIndex] = partials[leftIndex];
1156        }
1157        while (argsLength--) {
1158          args[leftIndex++] = arguments[++argsIndex];
1159        }
1160        return fn.apply(isBind ? thisArg : this, args);
1161      }
1162      return wrapper;
1163    }
1164  
1165    /**
1166     * A specialized version of `baseIsEqualDeep` for arrays with support for
1167     * partial deep comparisons.
1168     *
1169     * @private
1170     * @param {Array} array The array to compare.
1171     * @param {Array} other The other array to compare.
1172     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1173     * @param {Function} customizer The function to customize comparisons.
1174     * @param {Function} equalFunc The function to determine equivalents of values.
1175     * @param {Object} stack Tracks traversed `array` and `other` objects.
1176     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
1177     */
1178    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
1179      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1180          arrLength = array.length,
1181          othLength = other.length;
1182  
1183      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
1184        return false;
1185      }
1186      // Check that cyclic values are equal.
1187      var arrStacked = stack.get(array);
1188      var othStacked = stack.get(other);
1189      if (arrStacked && othStacked) {
1190        return arrStacked == other && othStacked == array;
1191      }
1192      var index = -1,
1193          result = true,
1194          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined;
1195  
1196      // Ignore non-index properties.
1197      while (++index < arrLength) {
1198        var arrValue = array[index],
1199            othValue = other[index];
1200  
1201        var compared;
1202        if (compared !== undefined) {
1203          if (compared) {
1204            continue;
1205          }
1206          result = false;
1207          break;
1208        }
1209        // Recursively compare arrays (susceptible to call stack limits).
1210        if (seen) {
1211          if (!baseSome(other, function(othValue, othIndex) {
1212                if (!indexOf(seen, othIndex) &&
1213                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
1214                  return seen.push(othIndex);
1215                }
1216              })) {
1217            result = false;
1218            break;
1219          }
1220        } else if (!(
1221              arrValue === othValue ||
1222                equalFunc(arrValue, othValue, bitmask, customizer, stack)
1223            )) {
1224          result = false;
1225          break;
1226        }
1227      }
1228      return result;
1229    }
1230  
1231    /**
1232     * A specialized version of `baseIsEqualDeep` for comparing objects of
1233     * the same `toStringTag`.
1234     *
1235     * **Note:** This function only supports comparing values with tags of
1236     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
1237     *
1238     * @private
1239     * @param {Object} object The object to compare.
1240     * @param {Object} other The other object to compare.
1241     * @param {string} tag The `toStringTag` of the objects to compare.
1242     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1243     * @param {Function} customizer The function to customize comparisons.
1244     * @param {Function} equalFunc The function to determine equivalents of values.
1245     * @param {Object} stack Tracks traversed `object` and `other` objects.
1246     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1247     */
1248    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
1249      switch (tag) {
1250  
1251        case boolTag:
1252        case dateTag:
1253        case numberTag:
1254          // Coerce booleans to `1` or `0` and dates to milliseconds.
1255          // Invalid dates are coerced to `NaN`.
1256          return eq(+object, +other);
1257  
1258        case errorTag:
1259          return object.name == other.name && object.message == other.message;
1260  
1261        case regexpTag:
1262        case stringTag:
1263          // Coerce regexes to strings and treat strings, primitives and objects,
1264          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
1265          // for more details.
1266          return object == (other + '');
1267  
1268      }
1269      return false;
1270    }
1271  
1272    /**
1273     * A specialized version of `baseIsEqualDeep` for objects with support for
1274     * partial deep comparisons.
1275     *
1276     * @private
1277     * @param {Object} object The object to compare.
1278     * @param {Object} other The other object to compare.
1279     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1280     * @param {Function} customizer The function to customize comparisons.
1281     * @param {Function} equalFunc The function to determine equivalents of values.
1282     * @param {Object} stack Tracks traversed `object` and `other` objects.
1283     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1284     */
1285    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
1286      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1287          objProps = keys(object),
1288          objLength = objProps.length,
1289          othProps = keys(other),
1290          othLength = othProps.length;
1291  
1292      if (objLength != othLength && !isPartial) {
1293        return false;
1294      }
1295      var index = objLength;
1296      while (index--) {
1297        var key = objProps[index];
1298        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
1299          return false;
1300        }
1301      }
1302      // Check that cyclic values are equal.
1303      var objStacked = stack.get(object);
1304      var othStacked = stack.get(other);
1305      if (objStacked && othStacked) {
1306        return objStacked == other && othStacked == object;
1307      }
1308      var result = true;
1309  
1310      var skipCtor = isPartial;
1311      while (++index < objLength) {
1312        key = objProps[index];
1313        var objValue = object[key],
1314            othValue = other[key];
1315  
1316        var compared;
1317        // Recursively compare objects (susceptible to call stack limits).
1318        if (!(compared === undefined
1319              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
1320              : compared
1321            )) {
1322          result = false;
1323          break;
1324        }
1325        skipCtor || (skipCtor = key == 'constructor');
1326      }
1327      if (result && !skipCtor) {
1328        var objCtor = object.constructor,
1329            othCtor = other.constructor;
1330  
1331        // Non `Object` object instances with different constructors are not equal.
1332        if (objCtor != othCtor &&
1333            ('constructor' in object && 'constructor' in other) &&
1334            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
1335              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
1336          result = false;
1337        }
1338      }
1339      return result;
1340    }
1341  
1342    /**
1343     * A specialized version of `baseRest` which flattens the rest array.
1344     *
1345     * @private
1346     * @param {Function} func The function to apply a rest parameter to.
1347     * @returns {Function} Returns the new function.
1348     */
1349    function flatRest(func) {
1350      return setToString(overRest(func, undefined, flatten), func + '');
1351    }
1352  
1353    /**
1354     * Checks if `value` is a flattenable `arguments` object or array.
1355     *
1356     * @private
1357     * @param {*} value The value to check.
1358     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
1359     */
1360    function isFlattenable(value) {
1361      return isArray(value) || isArguments(value);
1362    }
1363  
1364    /**
1365     * Checks if `value` is a valid array-like index.
1366     *
1367     * @private
1368     * @param {*} value The value to check.
1369     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
1370     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
1371     */
1372    function isIndex(value, length) {
1373      var type = typeof value;
1374      length = length == null ? MAX_SAFE_INTEGER : length;
1375  
1376      return !!length &&
1377        (type == 'number' ||
1378          (type != 'symbol' && reIsUint.test(value))) &&
1379            (value > -1 && value % 1 == 0 && value < length);
1380    }
1381  
1382    /**
1383     * Checks if the given arguments are from an iteratee call.
1384     *
1385     * @private
1386     * @param {*} value The potential iteratee value argument.
1387     * @param {*} index The potential iteratee index or key argument.
1388     * @param {*} object The potential iteratee object argument.
1389     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
1390     *  else `false`.
1391     */
1392    function isIterateeCall(value, index, object) {
1393      if (!isObject(object)) {
1394        return false;
1395      }
1396      var type = typeof index;
1397      if (type == 'number'
1398            ? (isArrayLike(object) && isIndex(index, object.length))
1399            : (type == 'string' && index in object)
1400          ) {
1401        return eq(object[index], value);
1402      }
1403      return false;
1404    }
1405  
1406    /**
1407     * This function is like
1408     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
1409     * except that it includes inherited enumerable properties.
1410     *
1411     * @private
1412     * @param {Object} object The object to query.
1413     * @returns {Array} Returns the array of property names.
1414     */
1415    function nativeKeysIn(object) {
1416      var result = [];
1417      if (object != null) {
1418        for (var key in Object(object)) {
1419          result.push(key);
1420        }
1421      }
1422      return result;
1423    }
1424  
1425    /**
1426     * Converts `value` to a string using `Object.prototype.toString`.
1427     *
1428     * @private
1429     * @param {*} value The value to convert.
1430     * @returns {string} Returns the converted string.
1431     */
1432    function objectToString(value) {
1433      return nativeObjectToString.call(value);
1434    }
1435  
1436    /**
1437     * A specialized version of `baseRest` which transforms the rest array.
1438     *
1439     * @private
1440     * @param {Function} func The function to apply a rest parameter to.
1441     * @param {number} [start=func.length-1] The start position of the rest parameter.
1442     * @param {Function} transform The rest array transform.
1443     * @returns {Function} Returns the new function.
1444     */
1445    function overRest(func, start, transform) {
1446      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
1447      return function() {
1448        var args = arguments,
1449            index = -1,
1450            length = nativeMax(args.length - start, 0),
1451            array = Array(length);
1452  
1453        while (++index < length) {
1454          array[index] = args[start + index];
1455        }
1456        index = -1;
1457        var otherArgs = Array(start + 1);
1458        while (++index < start) {
1459          otherArgs[index] = args[index];
1460        }
1461        otherArgs[start] = transform(array);
1462        return func.apply(this, otherArgs);
1463      };
1464    }
1465  
1466    /**
1467     * Sets the `toString` method of `func` to return `string`.
1468     *
1469     * @private
1470     * @param {Function} func The function to modify.
1471     * @param {Function} string The `toString` result.
1472     * @returns {Function} Returns `func`.
1473     */
1474    var setToString = identity;
1475  
1476    /*------------------------------------------------------------------------*/
1477  
1478    /**
1479     * Creates an array with all falsey values removed. The values `false`, `null`,
1480     * `0`, `""`, `undefined`, and `NaN` are falsey.
1481     *
1482     * @static
1483     * @memberOf _
1484     * @since 0.1.0
1485     * @category Array
1486     * @param {Array} array The array to compact.
1487     * @returns {Array} Returns the new array of filtered values.
1488     * @example
1489     *
1490     * _.compact([0, 1, false, 2, '', 3]);
1491     * // => [1, 2, 3]
1492     */
1493    function compact(array) {
1494      return baseFilter(array, Boolean);
1495    }
1496  
1497    /**
1498     * Creates a new array concatenating `array` with any additional arrays
1499     * and/or values.
1500     *
1501     * @static
1502     * @memberOf _
1503     * @since 4.0.0
1504     * @category Array
1505     * @param {Array} array The array to concatenate.
1506     * @param {...*} [values] The values to concatenate.
1507     * @returns {Array} Returns the new concatenated array.
1508     * @example
1509     *
1510     * var array = [1];
1511     * var other = _.concat(array, 2, [3], [[4]]);
1512     *
1513     * console.log(other);
1514     * // => [1, 2, 3, [4]]
1515     *
1516     * console.log(array);
1517     * // => [1]
1518     */
1519    function concat() {
1520      var length = arguments.length;
1521      if (!length) {
1522        return [];
1523      }
1524      var args = Array(length - 1),
1525          array = arguments[0],
1526          index = length;
1527  
1528      while (index--) {
1529        args[index - 1] = arguments[index];
1530      }
1531      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
1532    }
1533  
1534    /**
1535     * This method is like `_.find` except that it returns the index of the first
1536     * element `predicate` returns truthy for instead of the element itself.
1537     *
1538     * @static
1539     * @memberOf _
1540     * @since 1.1.0
1541     * @category Array
1542     * @param {Array} array The array to inspect.
1543     * @param {Function} [predicate=_.identity] The function invoked per iteration.
1544     * @param {number} [fromIndex=0] The index to search from.
1545     * @returns {number} Returns the index of the found element, else `-1`.
1546     * @example
1547     *
1548     * var users = [
1549     *   { 'user': 'barney',  'active': false },
1550     *   { 'user': 'fred',    'active': false },
1551     *   { 'user': 'pebbles', 'active': true }
1552     * ];
1553     *
1554     * _.findIndex(users, function(o) { return o.user == 'barney'; });
1555     * // => 0
1556     *
1557     * // The `_.matches` iteratee shorthand.
1558     * _.findIndex(users, { 'user': 'fred', 'active': false });
1559     * // => 1
1560     *
1561     * // The `_.matchesProperty` iteratee shorthand.
1562     * _.findIndex(users, ['active', false]);
1563     * // => 0
1564     *
1565     * // The `_.property` iteratee shorthand.
1566     * _.findIndex(users, 'active');
1567     * // => 2
1568     */
1569    function findIndex(array, predicate, fromIndex) {
1570      var length = array == null ? 0 : array.length;
1571      if (!length) {
1572        return -1;
1573      }
1574      var index = fromIndex == null ? 0 : toInteger(fromIndex);
1575      if (index < 0) {
1576        index = nativeMax(length + index, 0);
1577      }
1578      return baseFindIndex(array, baseIteratee(predicate, 3), index);
1579    }
1580  
1581    /**
1582     * Flattens `array` a single level deep.
1583     *
1584     * @static
1585     * @memberOf _
1586     * @since 0.1.0
1587     * @category Array
1588     * @param {Array} array The array to flatten.
1589     * @returns {Array} Returns the new flattened array.
1590     * @example
1591     *
1592     * _.flatten([1, [2, [3, [4]], 5]]);
1593     * // => [1, 2, [3, [4]], 5]
1594     */
1595    function flatten(array) {
1596      var length = array == null ? 0 : array.length;
1597      return length ? baseFlatten(array, 1) : [];
1598    }
1599  
1600    /**
1601     * Recursively flattens `array`.
1602     *
1603     * @static
1604     * @memberOf _
1605     * @since 3.0.0
1606     * @category Array
1607     * @param {Array} array The array to flatten.
1608     * @returns {Array} Returns the new flattened array.
1609     * @example
1610     *
1611     * _.flattenDeep([1, [2, [3, [4]], 5]]);
1612     * // => [1, 2, 3, 4, 5]
1613     */
1614    function flattenDeep(array) {
1615      var length = array == null ? 0 : array.length;
1616      return length ? baseFlatten(array, INFINITY) : [];
1617    }
1618  
1619    /**
1620     * Gets the first element of `array`.
1621     *
1622     * @static
1623     * @memberOf _
1624     * @since 0.1.0
1625     * @alias first
1626     * @category Array
1627     * @param {Array} array The array to query.
1628     * @returns {*} Returns the first element of `array`.
1629     * @example
1630     *
1631     * _.head([1, 2, 3]);
1632     * // => 1
1633     *
1634     * _.head([]);
1635     * // => undefined
1636     */
1637    function head(array) {
1638      return (array && array.length) ? array[0] : undefined;
1639    }
1640  
1641    /**
1642     * Gets the index at which the first occurrence of `value` is found in `array`
1643     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
1644     * for equality comparisons. If `fromIndex` is negative, it's used as the
1645     * offset from the end of `array`.
1646     *
1647     * @static
1648     * @memberOf _
1649     * @since 0.1.0
1650     * @category Array
1651     * @param {Array} array The array to inspect.
1652     * @param {*} value The value to search for.
1653     * @param {number} [fromIndex=0] The index to search from.
1654     * @returns {number} Returns the index of the matched value, else `-1`.
1655     * @example
1656     *
1657     * _.indexOf([1, 2, 1, 2], 2);
1658     * // => 1
1659     *
1660     * // Search from the `fromIndex`.
1661     * _.indexOf([1, 2, 1, 2], 2, 2);
1662     * // => 3
1663     */
1664    function indexOf(array, value, fromIndex) {
1665      var length = array == null ? 0 : array.length;
1666      if (typeof fromIndex == 'number') {
1667        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
1668      } else {
1669        fromIndex = 0;
1670      }
1671      var index = (fromIndex || 0) - 1,
1672          isReflexive = value === value;
1673  
1674      while (++index < length) {
1675        var other = array[index];
1676        if ((isReflexive ? other === value : other !== other)) {
1677          return index;
1678        }
1679      }
1680      return -1;
1681    }
1682  
1683    /**
1684     * Gets the last element of `array`.
1685     *
1686     * @static
1687     * @memberOf _
1688     * @since 0.1.0
1689     * @category Array
1690     * @param {Array} array The array to query.
1691     * @returns {*} Returns the last element of `array`.
1692     * @example
1693     *
1694     * _.last([1, 2, 3]);
1695     * // => 3
1696     */
1697    function last(array) {
1698      var length = array == null ? 0 : array.length;
1699      return length ? array[length - 1] : undefined;
1700    }
1701  
1702    /**
1703     * Creates a slice of `array` from `start` up to, but not including, `end`.
1704     *
1705     * **Note:** This method is used instead of
1706     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
1707     * returned.
1708     *
1709     * @static
1710     * @memberOf _
1711     * @since 3.0.0
1712     * @category Array
1713     * @param {Array} array The array to slice.
1714     * @param {number} [start=0] The start position.
1715     * @param {number} [end=array.length] The end position.
1716     * @returns {Array} Returns the slice of `array`.
1717     */
1718    function slice(array, start, end) {
1719      var length = array == null ? 0 : array.length;
1720      start = start == null ? 0 : +start;
1721      end = end === undefined ? length : +end;
1722      return length ? baseSlice(array, start, end) : [];
1723    }
1724  
1725    /*------------------------------------------------------------------------*/
1726  
1727    /**
1728     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
1729     * chain sequences enabled. The result of such sequences must be unwrapped
1730     * with `_#value`.
1731     *
1732     * @static
1733     * @memberOf _
1734     * @since 1.3.0
1735     * @category Seq
1736     * @param {*} value The value to wrap.
1737     * @returns {Object} Returns the new `lodash` wrapper instance.
1738     * @example
1739     *
1740     * var users = [
1741     *   { 'user': 'barney',  'age': 36 },
1742     *   { 'user': 'fred',    'age': 40 },
1743     *   { 'user': 'pebbles', 'age': 1 }
1744     * ];
1745     *
1746     * var youngest = _
1747     *   .chain(users)
1748     *   .sortBy('age')
1749     *   .map(function(o) {
1750     *     return o.user + ' is ' + o.age;
1751     *   })
1752     *   .head()
1753     *   .value();
1754     * // => 'pebbles is 1'
1755     */
1756    function chain(value) {
1757      var result = lodash(value);
1758      result.__chain__ = true;
1759      return result;
1760    }
1761  
1762    /**
1763     * This method invokes `interceptor` and returns `value`. The interceptor
1764     * is invoked with one argument; (value). The purpose of this method is to
1765     * "tap into" a method chain sequence in order to modify intermediate results.
1766     *
1767     * @static
1768     * @memberOf _
1769     * @since 0.1.0
1770     * @category Seq
1771     * @param {*} value The value to provide to `interceptor`.
1772     * @param {Function} interceptor The function to invoke.
1773     * @returns {*} Returns `value`.
1774     * @example
1775     *
1776     * _([1, 2, 3])
1777     *  .tap(function(array) {
1778     *    // Mutate input array.
1779     *    array.pop();
1780     *  })
1781     *  .reverse()
1782     *  .value();
1783     * // => [2, 1]
1784     */
1785    function tap(value, interceptor) {
1786      interceptor(value);
1787      return value;
1788    }
1789  
1790    /**
1791     * This method is like `_.tap` except that it returns the result of `interceptor`.
1792     * The purpose of this method is to "pass thru" values replacing intermediate
1793     * results in a method chain sequence.
1794     *
1795     * @static
1796     * @memberOf _
1797     * @since 3.0.0
1798     * @category Seq
1799     * @param {*} value The value to provide to `interceptor`.
1800     * @param {Function} interceptor The function to invoke.
1801     * @returns {*} Returns the result of `interceptor`.
1802     * @example
1803     *
1804     * _('  abc  ')
1805     *  .chain()
1806     *  .trim()
1807     *  .thru(function(value) {
1808     *    return [value];
1809     *  })
1810     *  .value();
1811     * // => ['abc']
1812     */
1813    function thru(value, interceptor) {
1814      return interceptor(value);
1815    }
1816  
1817    /**
1818     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
1819     *
1820     * @name chain
1821     * @memberOf _
1822     * @since 0.1.0
1823     * @category Seq
1824     * @returns {Object} Returns the new `lodash` wrapper instance.
1825     * @example
1826     *
1827     * var users = [
1828     *   { 'user': 'barney', 'age': 36 },
1829     *   { 'user': 'fred',   'age': 40 }
1830     * ];
1831     *
1832     * // A sequence without explicit chaining.
1833     * _(users).head();
1834     * // => { 'user': 'barney', 'age': 36 }
1835     *
1836     * // A sequence with explicit chaining.
1837     * _(users)
1838     *   .chain()
1839     *   .head()
1840     *   .pick('user')
1841     *   .value();
1842     * // => { 'user': 'barney' }
1843     */
1844    function wrapperChain() {
1845      return chain(this);
1846    }
1847  
1848    /**
1849     * Executes the chain sequence to resolve the unwrapped value.
1850     *
1851     * @name value
1852     * @memberOf _
1853     * @since 0.1.0
1854     * @alias toJSON, valueOf
1855     * @category Seq
1856     * @returns {*} Returns the resolved unwrapped value.
1857     * @example
1858     *
1859     * _([1, 2, 3]).value();
1860     * // => [1, 2, 3]
1861     */
1862    function wrapperValue() {
1863      return baseWrapperValue(this.__wrapped__, this.__actions__);
1864    }
1865  
1866    /*------------------------------------------------------------------------*/
1867  
1868    /**
1869     * Checks if `predicate` returns truthy for **all** elements of `collection`.
1870     * Iteration is stopped once `predicate` returns falsey. The predicate is
1871     * invoked with three arguments: (value, index|key, collection).
1872     *
1873     * **Note:** This method returns `true` for
1874     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
1875     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
1876     * elements of empty collections.
1877     *
1878     * @static
1879     * @memberOf _
1880     * @since 0.1.0
1881     * @category Collection
1882     * @param {Array|Object} collection The collection to iterate over.
1883     * @param {Function} [predicate=_.identity] The function invoked per iteration.
1884     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
1885     * @returns {boolean} Returns `true` if all elements pass the predicate check,
1886     *  else `false`.
1887     * @example
1888     *
1889     * _.every([true, 1, null, 'yes'], Boolean);
1890     * // => false
1891     *
1892     * var users = [
1893     *   { 'user': 'barney', 'age': 36, 'active': false },
1894     *   { 'user': 'fred',   'age': 40, 'active': false }
1895     * ];
1896     *
1897     * // The `_.matches` iteratee shorthand.
1898     * _.every(users, { 'user': 'barney', 'active': false });
1899     * // => false
1900     *
1901     * // The `_.matchesProperty` iteratee shorthand.
1902     * _.every(users, ['active', false]);
1903     * // => true
1904     *
1905     * // The `_.property` iteratee shorthand.
1906     * _.every(users, 'active');
1907     * // => false
1908     */
1909    function every(collection, predicate, guard) {
1910      predicate = guard ? undefined : predicate;
1911      return baseEvery(collection, baseIteratee(predicate));
1912    }
1913  
1914    /**
1915     * Iterates over elements of `collection`, returning an array of all elements
1916     * `predicate` returns truthy for. The predicate is invoked with three
1917     * arguments: (value, index|key, collection).
1918     *
1919     * **Note:** Unlike `_.remove`, this method returns a new array.
1920     *
1921     * @static
1922     * @memberOf _
1923     * @since 0.1.0
1924     * @category Collection
1925     * @param {Array|Object} collection The collection to iterate over.
1926     * @param {Function} [predicate=_.identity] The function invoked per iteration.
1927     * @returns {Array} Returns the new filtered array.
1928     * @see _.reject
1929     * @example
1930     *
1931     * var users = [
1932     *   { 'user': 'barney', 'age': 36, 'active': true },
1933     *   { 'user': 'fred',   'age': 40, 'active': false }
1934     * ];
1935     *
1936     * _.filter(users, function(o) { return !o.active; });
1937     * // => objects for ['fred']
1938     *
1939     * // The `_.matches` iteratee shorthand.
1940     * _.filter(users, { 'age': 36, 'active': true });
1941     * // => objects for ['barney']
1942     *
1943     * // The `_.matchesProperty` iteratee shorthand.
1944     * _.filter(users, ['active', false]);
1945     * // => objects for ['fred']
1946     *
1947     * // The `_.property` iteratee shorthand.
1948     * _.filter(users, 'active');
1949     * // => objects for ['barney']
1950     *
1951     * // Combining several predicates using `_.overEvery` or `_.overSome`.
1952     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
1953     * // => objects for ['fred', 'barney']
1954     */
1955    function filter(collection, predicate) {
1956      return baseFilter(collection, baseIteratee(predicate));
1957    }
1958  
1959    /**
1960     * Iterates over elements of `collection`, returning the first element
1961     * `predicate` returns truthy for. The predicate is invoked with three
1962     * arguments: (value, index|key, collection).
1963     *
1964     * @static
1965     * @memberOf _
1966     * @since 0.1.0
1967     * @category Collection
1968     * @param {Array|Object} collection The collection to inspect.
1969     * @param {Function} [predicate=_.identity] The function invoked per iteration.
1970     * @param {number} [fromIndex=0] The index to search from.
1971     * @returns {*} Returns the matched element, else `undefined`.
1972     * @example
1973     *
1974     * var users = [
1975     *   { 'user': 'barney',  'age': 36, 'active': true },
1976     *   { 'user': 'fred',    'age': 40, 'active': false },
1977     *   { 'user': 'pebbles', 'age': 1,  'active': true }
1978     * ];
1979     *
1980     * _.find(users, function(o) { return o.age < 40; });
1981     * // => object for 'barney'
1982     *
1983     * // The `_.matches` iteratee shorthand.
1984     * _.find(users, { 'age': 1, 'active': true });
1985     * // => object for 'pebbles'
1986     *
1987     * // The `_.matchesProperty` iteratee shorthand.
1988     * _.find(users, ['active', false]);
1989     * // => object for 'fred'
1990     *
1991     * // The `_.property` iteratee shorthand.
1992     * _.find(users, 'active');
1993     * // => object for 'barney'
1994     */
1995    var find = createFind(findIndex);
1996  
1997    /**
1998     * Iterates over elements of `collection` and invokes `iteratee` for each element.
1999     * The iteratee is invoked with three arguments: (value, index|key, collection).
2000     * Iteratee functions may exit iteration early by explicitly returning `false`.
2001     *
2002     * **Note:** As with other "Collections" methods, objects with a "length"
2003     * property are iterated like arrays. To avoid this behavior use `_.forIn`
2004     * or `_.forOwn` for object iteration.
2005     *
2006     * @static
2007     * @memberOf _
2008     * @since 0.1.0
2009     * @alias each
2010     * @category Collection
2011     * @param {Array|Object} collection The collection to iterate over.
2012     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2013     * @returns {Array|Object} Returns `collection`.
2014     * @see _.forEachRight
2015     * @example
2016     *
2017     * _.forEach([1, 2], function(value) {
2018     *   console.log(value);
2019     * });
2020     * // => Logs `1` then `2`.
2021     *
2022     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
2023     *   console.log(key);
2024     * });
2025     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
2026     */
2027    function forEach(collection, iteratee) {
2028      return baseEach(collection, baseIteratee(iteratee));
2029    }
2030  
2031    /**
2032     * Creates an array of values by running each element in `collection` thru
2033     * `iteratee`. The iteratee is invoked with three arguments:
2034     * (value, index|key, collection).
2035     *
2036     * Many lodash methods are guarded to work as iteratees for methods like
2037     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
2038     *
2039     * The guarded methods are:
2040     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
2041     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
2042     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
2043     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
2044     *
2045     * @static
2046     * @memberOf _
2047     * @since 0.1.0
2048     * @category Collection
2049     * @param {Array|Object} collection The collection to iterate over.
2050     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2051     * @returns {Array} Returns the new mapped array.
2052     * @example
2053     *
2054     * function square(n) {
2055     *   return n * n;
2056     * }
2057     *
2058     * _.map([4, 8], square);
2059     * // => [16, 64]
2060     *
2061     * _.map({ 'a': 4, 'b': 8 }, square);
2062     * // => [16, 64] (iteration order is not guaranteed)
2063     *
2064     * var users = [
2065     *   { 'user': 'barney' },
2066     *   { 'user': 'fred' }
2067     * ];
2068     *
2069     * // The `_.property` iteratee shorthand.
2070     * _.map(users, 'user');
2071     * // => ['barney', 'fred']
2072     */
2073    function map(collection, iteratee) {
2074      return baseMap(collection, baseIteratee(iteratee));
2075    }
2076  
2077    /**
2078     * Reduces `collection` to a value which is the accumulated result of running
2079     * each element in `collection` thru `iteratee`, where each successive
2080     * invocation is supplied the return value of the previous. If `accumulator`
2081     * is not given, the first element of `collection` is used as the initial
2082     * value. The iteratee is invoked with four arguments:
2083     * (accumulator, value, index|key, collection).
2084     *
2085     * Many lodash methods are guarded to work as iteratees for methods like
2086     * `_.reduce`, `_.reduceRight`, and `_.transform`.
2087     *
2088     * The guarded methods are:
2089     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
2090     * and `sortBy`
2091     *
2092     * @static
2093     * @memberOf _
2094     * @since 0.1.0
2095     * @category Collection
2096     * @param {Array|Object} collection The collection to iterate over.
2097     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2098     * @param {*} [accumulator] The initial value.
2099     * @returns {*} Returns the accumulated value.
2100     * @see _.reduceRight
2101     * @example
2102     *
2103     * _.reduce([1, 2], function(sum, n) {
2104     *   return sum + n;
2105     * }, 0);
2106     * // => 3
2107     *
2108     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
2109     *   (result[value] || (result[value] = [])).push(key);
2110     *   return result;
2111     * }, {});
2112     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
2113     */
2114    function reduce(collection, iteratee, accumulator) {
2115      return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach);
2116    }
2117  
2118    /**
2119     * Gets the size of `collection` by returning its length for array-like
2120     * values or the number of own enumerable string keyed properties for objects.
2121     *
2122     * @static
2123     * @memberOf _
2124     * @since 0.1.0
2125     * @category Collection
2126     * @param {Array|Object|string} collection The collection to inspect.
2127     * @returns {number} Returns the collection size.
2128     * @example
2129     *
2130     * _.size([1, 2, 3]);
2131     * // => 3
2132     *
2133     * _.size({ 'a': 1, 'b': 2 });
2134     * // => 2
2135     *
2136     * _.size('pebbles');
2137     * // => 7
2138     */
2139    function size(collection) {
2140      if (collection == null) {
2141        return 0;
2142      }
2143      collection = isArrayLike(collection) ? collection : nativeKeys(collection);
2144      return collection.length;
2145    }
2146  
2147    /**
2148     * Checks if `predicate` returns truthy for **any** element of `collection`.
2149     * Iteration is stopped once `predicate` returns truthy. The predicate is
2150     * invoked with three arguments: (value, index|key, collection).
2151     *
2152     * @static
2153     * @memberOf _
2154     * @since 0.1.0
2155     * @category Collection
2156     * @param {Array|Object} collection The collection to iterate over.
2157     * @param {Function} [predicate=_.identity] The function invoked per iteration.
2158     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
2159     * @returns {boolean} Returns `true` if any element passes the predicate check,
2160     *  else `false`.
2161     * @example
2162     *
2163     * _.some([null, 0, 'yes', false], Boolean);
2164     * // => true
2165     *
2166     * var users = [
2167     *   { 'user': 'barney', 'active': true },
2168     *   { 'user': 'fred',   'active': false }
2169     * ];
2170     *
2171     * // The `_.matches` iteratee shorthand.
2172     * _.some(users, { 'user': 'barney', 'active': false });
2173     * // => false
2174     *
2175     * // The `_.matchesProperty` iteratee shorthand.
2176     * _.some(users, ['active', false]);
2177     * // => true
2178     *
2179     * // The `_.property` iteratee shorthand.
2180     * _.some(users, 'active');
2181     * // => true
2182     */
2183    function some(collection, predicate, guard) {
2184      predicate = guard ? undefined : predicate;
2185      return baseSome(collection, baseIteratee(predicate));
2186    }
2187  
2188    /**
2189     * Creates an array of elements, sorted in ascending order by the results of
2190     * running each element in a collection thru each iteratee. This method
2191     * performs a stable sort, that is, it preserves the original sort order of
2192     * equal elements. The iteratees are invoked with one argument: (value).
2193     *
2194     * @static
2195     * @memberOf _
2196     * @since 0.1.0
2197     * @category Collection
2198     * @param {Array|Object} collection The collection to iterate over.
2199     * @param {...(Function|Function[])} [iteratees=[_.identity]]
2200     *  The iteratees to sort by.
2201     * @returns {Array} Returns the new sorted array.
2202     * @example
2203     *
2204     * var users = [
2205     *   { 'user': 'fred',   'age': 48 },
2206     *   { 'user': 'barney', 'age': 36 },
2207     *   { 'user': 'fred',   'age': 30 },
2208     *   { 'user': 'barney', 'age': 34 }
2209     * ];
2210     *
2211     * _.sortBy(users, [function(o) { return o.user; }]);
2212     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
2213     *
2214     * _.sortBy(users, ['user', 'age']);
2215     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
2216     */
2217    function sortBy(collection, iteratee) {
2218      var index = 0;
2219      iteratee = baseIteratee(iteratee);
2220  
2221      return baseMap(baseMap(collection, function(value, key, collection) {
2222        return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) };
2223      }).sort(function(object, other) {
2224        return compareAscending(object.criteria, other.criteria) || (object.index - other.index);
2225      }), baseProperty('value'));
2226    }
2227  
2228    /*------------------------------------------------------------------------*/
2229  
2230    /**
2231     * Creates a function that invokes `func`, with the `this` binding and arguments
2232     * of the created function, while it's called less than `n` times. Subsequent
2233     * calls to the created function return the result of the last `func` invocation.
2234     *
2235     * @static
2236     * @memberOf _
2237     * @since 3.0.0
2238     * @category Function
2239     * @param {number} n The number of calls at which `func` is no longer invoked.
2240     * @param {Function} func The function to restrict.
2241     * @returns {Function} Returns the new restricted function.
2242     * @example
2243     *
2244     * jQuery(element).on('click', _.before(5, addContactToList));
2245     * // => Allows adding up to 4 contacts to the list.
2246     */
2247    function before(n, func) {
2248      var result;
2249      if (typeof func != 'function') {
2250        throw new TypeError(FUNC_ERROR_TEXT);
2251      }
2252      n = toInteger(n);
2253      return function() {
2254        if (--n > 0) {
2255          result = func.apply(this, arguments);
2256        }
2257        if (n <= 1) {
2258          func = undefined;
2259        }
2260        return result;
2261      };
2262    }
2263  
2264    /**
2265     * Creates a function that invokes `func` with the `this` binding of `thisArg`
2266     * and `partials` prepended to the arguments it receives.
2267     *
2268     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
2269     * may be used as a placeholder for partially applied arguments.
2270     *
2271     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
2272     * property of bound functions.
2273     *
2274     * @static
2275     * @memberOf _
2276     * @since 0.1.0
2277     * @category Function
2278     * @param {Function} func The function to bind.
2279     * @param {*} thisArg The `this` binding of `func`.
2280     * @param {...*} [partials] The arguments to be partially applied.
2281     * @returns {Function} Returns the new bound function.
2282     * @example
2283     *
2284     * function greet(greeting, punctuation) {
2285     *   return greeting + ' ' + this.user + punctuation;
2286     * }
2287     *
2288     * var object = { 'user': 'fred' };
2289     *
2290     * var bound = _.bind(greet, object, 'hi');
2291     * bound('!');
2292     * // => 'hi fred!'
2293     *
2294     * // Bound with placeholders.
2295     * var bound = _.bind(greet, object, _, '!');
2296     * bound('hi');
2297     * // => 'hi fred!'
2298     */
2299    var bind = baseRest(function(func, thisArg, partials) {
2300      return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials);
2301    });
2302  
2303    /**
2304     * Defers invoking the `func` until the current call stack has cleared. Any
2305     * additional arguments are provided to `func` when it's invoked.
2306     *
2307     * @static
2308     * @memberOf _
2309     * @since 0.1.0
2310     * @category Function
2311     * @param {Function} func The function to defer.
2312     * @param {...*} [args] The arguments to invoke `func` with.
2313     * @returns {number} Returns the timer id.
2314     * @example
2315     *
2316     * _.defer(function(text) {
2317     *   console.log(text);
2318     * }, 'deferred');
2319     * // => Logs 'deferred' after one millisecond.
2320     */
2321    var defer = baseRest(function(func, args) {
2322      return baseDelay(func, 1, args);
2323    });
2324  
2325    /**
2326     * Invokes `func` after `wait` milliseconds. Any additional arguments are
2327     * provided to `func` when it's invoked.
2328     *
2329     * @static
2330     * @memberOf _
2331     * @since 0.1.0
2332     * @category Function
2333     * @param {Function} func The function to delay.
2334     * @param {number} wait The number of milliseconds to delay invocation.
2335     * @param {...*} [args] The arguments to invoke `func` with.
2336     * @returns {number} Returns the timer id.
2337     * @example
2338     *
2339     * _.delay(function(text) {
2340     *   console.log(text);
2341     * }, 1000, 'later');
2342     * // => Logs 'later' after one second.
2343     */
2344    var delay = baseRest(function(func, wait, args) {
2345      return baseDelay(func, toNumber(wait) || 0, args);
2346    });
2347  
2348    /**
2349     * Creates a function that negates the result of the predicate `func`. The
2350     * `func` predicate is invoked with the `this` binding and arguments of the
2351     * created function.
2352     *
2353     * @static
2354     * @memberOf _
2355     * @since 3.0.0
2356     * @category Function
2357     * @param {Function} predicate The predicate to negate.
2358     * @returns {Function} Returns the new negated function.
2359     * @example
2360     *
2361     * function isEven(n) {
2362     *   return n % 2 == 0;
2363     * }
2364     *
2365     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
2366     * // => [1, 3, 5]
2367     */
2368    function negate(predicate) {
2369      if (typeof predicate != 'function') {
2370        throw new TypeError(FUNC_ERROR_TEXT);
2371      }
2372      return function() {
2373        var args = arguments;
2374        return !predicate.apply(this, args);
2375      };
2376    }
2377  
2378    /**
2379     * Creates a function that is restricted to invoking `func` once. Repeat calls
2380     * to the function return the value of the first invocation. The `func` is
2381     * invoked with the `this` binding and arguments of the created function.
2382     *
2383     * @static
2384     * @memberOf _
2385     * @since 0.1.0
2386     * @category Function
2387     * @param {Function} func The function to restrict.
2388     * @returns {Function} Returns the new restricted function.
2389     * @example
2390     *
2391     * var initialize = _.once(createApplication);
2392     * initialize();
2393     * initialize();
2394     * // => `createApplication` is invoked once
2395     */
2396    function once(func) {
2397      return before(2, func);
2398    }
2399  
2400    /*------------------------------------------------------------------------*/
2401  
2402    /**
2403     * Creates a shallow clone of `value`.
2404     *
2405     * **Note:** This method is loosely based on the
2406     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
2407     * and supports cloning arrays, array buffers, booleans, date objects, maps,
2408     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
2409     * arrays. The own enumerable properties of `arguments` objects are cloned
2410     * as plain objects. An empty object is returned for uncloneable values such
2411     * as error objects, functions, DOM nodes, and WeakMaps.
2412     *
2413     * @static
2414     * @memberOf _
2415     * @since 0.1.0
2416     * @category Lang
2417     * @param {*} value The value to clone.
2418     * @returns {*} Returns the cloned value.
2419     * @see _.cloneDeep
2420     * @example
2421     *
2422     * var objects = [{ 'a': 1 }, { 'b': 2 }];
2423     *
2424     * var shallow = _.clone(objects);
2425     * console.log(shallow[0] === objects[0]);
2426     * // => true
2427     */
2428    function clone(value) {
2429      if (!isObject(value)) {
2430        return value;
2431      }
2432      return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value));
2433    }
2434  
2435    /**
2436     * Performs a
2437     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
2438     * comparison between two values to determine if they are equivalent.
2439     *
2440     * @static
2441     * @memberOf _
2442     * @since 4.0.0
2443     * @category Lang
2444     * @param {*} value The value to compare.
2445     * @param {*} other The other value to compare.
2446     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2447     * @example
2448     *
2449     * var object = { 'a': 1 };
2450     * var other = { 'a': 1 };
2451     *
2452     * _.eq(object, object);
2453     * // => true
2454     *
2455     * _.eq(object, other);
2456     * // => false
2457     *
2458     * _.eq('a', 'a');
2459     * // => true
2460     *
2461     * _.eq('a', Object('a'));
2462     * // => false
2463     *
2464     * _.eq(NaN, NaN);
2465     * // => true
2466     */
2467    function eq(value, other) {
2468      return value === other || (value !== value && other !== other);
2469    }
2470  
2471    /**
2472     * Checks if `value` is likely an `arguments` object.
2473     *
2474     * @static
2475     * @memberOf _
2476     * @since 0.1.0
2477     * @category Lang
2478     * @param {*} value The value to check.
2479     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
2480     *  else `false`.
2481     * @example
2482     *
2483     * _.isArguments(function() { return arguments; }());
2484     * // => true
2485     *
2486     * _.isArguments([1, 2, 3]);
2487     * // => false
2488     */
2489    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
2490      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
2491        !propertyIsEnumerable.call(value, 'callee');
2492    };
2493  
2494    /**
2495     * Checks if `value` is classified as an `Array` object.
2496     *
2497     * @static
2498     * @memberOf _
2499     * @since 0.1.0
2500     * @category Lang
2501     * @param {*} value The value to check.
2502     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
2503     * @example
2504     *
2505     * _.isArray([1, 2, 3]);
2506     * // => true
2507     *
2508     * _.isArray(document.body.children);
2509     * // => false
2510     *
2511     * _.isArray('abc');
2512     * // => false
2513     *
2514     * _.isArray(_.noop);
2515     * // => false
2516     */
2517    var isArray = Array.isArray;
2518  
2519    /**
2520     * Checks if `value` is array-like. A value is considered array-like if it's
2521     * not a function and has a `value.length` that's an integer greater than or
2522     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
2523     *
2524     * @static
2525     * @memberOf _
2526     * @since 4.0.0
2527     * @category Lang
2528     * @param {*} value The value to check.
2529     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
2530     * @example
2531     *
2532     * _.isArrayLike([1, 2, 3]);
2533     * // => true
2534     *
2535     * _.isArrayLike(document.body.children);
2536     * // => true
2537     *
2538     * _.isArrayLike('abc');
2539     * // => true
2540     *
2541     * _.isArrayLike(_.noop);
2542     * // => false
2543     */
2544    function isArrayLike(value) {
2545      return value != null && isLength(value.length) && !isFunction(value);
2546    }
2547  
2548    /**
2549     * Checks if `value` is classified as a boolean primitive or object.
2550     *
2551     * @static
2552     * @memberOf _
2553     * @since 0.1.0
2554     * @category Lang
2555     * @param {*} value The value to check.
2556     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
2557     * @example
2558     *
2559     * _.isBoolean(false);
2560     * // => true
2561     *
2562     * _.isBoolean(null);
2563     * // => false
2564     */
2565    function isBoolean(value) {
2566      return value === true || value === false ||
2567        (isObjectLike(value) && baseGetTag(value) == boolTag);
2568    }
2569  
2570    /**
2571     * Checks if `value` is classified as a `Date` object.
2572     *
2573     * @static
2574     * @memberOf _
2575     * @since 0.1.0
2576     * @category Lang
2577     * @param {*} value The value to check.
2578     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
2579     * @example
2580     *
2581     * _.isDate(new Date);
2582     * // => true
2583     *
2584     * _.isDate('Mon April 23 2012');
2585     * // => false
2586     */
2587    var isDate = baseIsDate;
2588  
2589    /**
2590     * Checks if `value` is an empty object, collection, map, or set.
2591     *
2592     * Objects are considered empty if they have no own enumerable string keyed
2593     * properties.
2594     *
2595     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
2596     * jQuery-like collections are considered empty if they have a `length` of `0`.
2597     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
2598     *
2599     * @static
2600     * @memberOf _
2601     * @since 0.1.0
2602     * @category Lang
2603     * @param {*} value The value to check.
2604     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
2605     * @example
2606     *
2607     * _.isEmpty(null);
2608     * // => true
2609     *
2610     * _.isEmpty(true);
2611     * // => true
2612     *
2613     * _.isEmpty(1);
2614     * // => true
2615     *
2616     * _.isEmpty([1, 2, 3]);
2617     * // => false
2618     *
2619     * _.isEmpty({ 'a': 1 });
2620     * // => false
2621     */
2622    function isEmpty(value) {
2623      if (isArrayLike(value) &&
2624          (isArray(value) || isString(value) ||
2625            isFunction(value.splice) || isArguments(value))) {
2626        return !value.length;
2627      }
2628      return !nativeKeys(value).length;
2629    }
2630  
2631    /**
2632     * Performs a deep comparison between two values to determine if they are
2633     * equivalent.
2634     *
2635     * **Note:** This method supports comparing arrays, array buffers, booleans,
2636     * date objects, error objects, maps, numbers, `Object` objects, regexes,
2637     * sets, strings, symbols, and typed arrays. `Object` objects are compared
2638     * by their own, not inherited, enumerable properties. Functions and DOM
2639     * nodes are compared by strict equality, i.e. `===`.
2640     *
2641     * @static
2642     * @memberOf _
2643     * @since 0.1.0
2644     * @category Lang
2645     * @param {*} value The value to compare.
2646     * @param {*} other The other value to compare.
2647     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2648     * @example
2649     *
2650     * var object = { 'a': 1 };
2651     * var other = { 'a': 1 };
2652     *
2653     * _.isEqual(object, other);
2654     * // => true
2655     *
2656     * object === other;
2657     * // => false
2658     */
2659    function isEqual(value, other) {
2660      return baseIsEqual(value, other);
2661    }
2662  
2663    /**
2664     * Checks if `value` is a finite primitive number.
2665     *
2666     * **Note:** This method is based on
2667     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
2668     *
2669     * @static
2670     * @memberOf _
2671     * @since 0.1.0
2672     * @category Lang
2673     * @param {*} value The value to check.
2674     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
2675     * @example
2676     *
2677     * _.isFinite(3);
2678     * // => true
2679     *
2680     * _.isFinite(Number.MIN_VALUE);
2681     * // => true
2682     *
2683     * _.isFinite(Infinity);
2684     * // => false
2685     *
2686     * _.isFinite('3');
2687     * // => false
2688     */
2689    function isFinite(value) {
2690      return typeof value == 'number' && nativeIsFinite(value);
2691    }
2692  
2693    /**
2694     * Checks if `value` is classified as a `Function` object.
2695     *
2696     * @static
2697     * @memberOf _
2698     * @since 0.1.0
2699     * @category Lang
2700     * @param {*} value The value to check.
2701     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
2702     * @example
2703     *
2704     * _.isFunction(_);
2705     * // => true
2706     *
2707     * _.isFunction(/abc/);
2708     * // => false
2709     */
2710    function isFunction(value) {
2711      if (!isObject(value)) {
2712        return false;
2713      }
2714      // The use of `Object#toString` avoids issues with the `typeof` operator
2715      // in Safari 9 which returns 'object' for typed arrays and other constructors.
2716      var tag = baseGetTag(value);
2717      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
2718    }
2719  
2720    /**
2721     * Checks if `value` is a valid array-like length.
2722     *
2723     * **Note:** This method is loosely based on
2724     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
2725     *
2726     * @static
2727     * @memberOf _
2728     * @since 4.0.0
2729     * @category Lang
2730     * @param {*} value The value to check.
2731     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
2732     * @example
2733     *
2734     * _.isLength(3);
2735     * // => true
2736     *
2737     * _.isLength(Number.MIN_VALUE);
2738     * // => false
2739     *
2740     * _.isLength(Infinity);
2741     * // => false
2742     *
2743     * _.isLength('3');
2744     * // => false
2745     */
2746    function isLength(value) {
2747      return typeof value == 'number' &&
2748        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
2749    }
2750  
2751    /**
2752     * Checks if `value` is the
2753     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
2754     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
2755     *
2756     * @static
2757     * @memberOf _
2758     * @since 0.1.0
2759     * @category Lang
2760     * @param {*} value The value to check.
2761     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
2762     * @example
2763     *
2764     * _.isObject({});
2765     * // => true
2766     *
2767     * _.isObject([1, 2, 3]);
2768     * // => true
2769     *
2770     * _.isObject(_.noop);
2771     * // => true
2772     *
2773     * _.isObject(null);
2774     * // => false
2775     */
2776    function isObject(value) {
2777      var type = typeof value;
2778      return value != null && (type == 'object' || type == 'function');
2779    }
2780  
2781    /**
2782     * Checks if `value` is object-like. A value is object-like if it's not `null`
2783     * and has a `typeof` result of "object".
2784     *
2785     * @static
2786     * @memberOf _
2787     * @since 4.0.0
2788     * @category Lang
2789     * @param {*} value The value to check.
2790     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
2791     * @example
2792     *
2793     * _.isObjectLike({});
2794     * // => true
2795     *
2796     * _.isObjectLike([1, 2, 3]);
2797     * // => true
2798     *
2799     * _.isObjectLike(_.noop);
2800     * // => false
2801     *
2802     * _.isObjectLike(null);
2803     * // => false
2804     */
2805    function isObjectLike(value) {
2806      return value != null && typeof value == 'object';
2807    }
2808  
2809    /**
2810     * Checks if `value` is `NaN`.
2811     *
2812     * **Note:** This method is based on
2813     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
2814     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
2815     * `undefined` and other non-number values.
2816     *
2817     * @static
2818     * @memberOf _
2819     * @since 0.1.0
2820     * @category Lang
2821     * @param {*} value The value to check.
2822     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
2823     * @example
2824     *
2825     * _.isNaN(NaN);
2826     * // => true
2827     *
2828     * _.isNaN(new Number(NaN));
2829     * // => true
2830     *
2831     * isNaN(undefined);
2832     * // => true
2833     *
2834     * _.isNaN(undefined);
2835     * // => false
2836     */
2837    function isNaN(value) {
2838      // An `NaN` primitive is the only value that is not equal to itself.
2839      // Perform the `toStringTag` check first to avoid errors with some
2840      // ActiveX objects in IE.
2841      return isNumber(value) && value != +value;
2842    }
2843  
2844    /**
2845     * Checks if `value` is `null`.
2846     *
2847     * @static
2848     * @memberOf _
2849     * @since 0.1.0
2850     * @category Lang
2851     * @param {*} value The value to check.
2852     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
2853     * @example
2854     *
2855     * _.isNull(null);
2856     * // => true
2857     *
2858     * _.isNull(void 0);
2859     * // => false
2860     */
2861    function isNull(value) {
2862      return value === null;
2863    }
2864  
2865    /**
2866     * Checks if `value` is classified as a `Number` primitive or object.
2867     *
2868     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
2869     * classified as numbers, use the `_.isFinite` method.
2870     *
2871     * @static
2872     * @memberOf _
2873     * @since 0.1.0
2874     * @category Lang
2875     * @param {*} value The value to check.
2876     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
2877     * @example
2878     *
2879     * _.isNumber(3);
2880     * // => true
2881     *
2882     * _.isNumber(Number.MIN_VALUE);
2883     * // => true
2884     *
2885     * _.isNumber(Infinity);
2886     * // => true
2887     *
2888     * _.isNumber('3');
2889     * // => false
2890     */
2891    function isNumber(value) {
2892      return typeof value == 'number' ||
2893        (isObjectLike(value) && baseGetTag(value) == numberTag);
2894    }
2895  
2896    /**
2897     * Checks if `value` is classified as a `RegExp` object.
2898     *
2899     * @static
2900     * @memberOf _
2901     * @since 0.1.0
2902     * @category Lang
2903     * @param {*} value The value to check.
2904     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
2905     * @example
2906     *
2907     * _.isRegExp(/abc/);
2908     * // => true
2909     *
2910     * _.isRegExp('/abc/');
2911     * // => false
2912     */
2913    var isRegExp = baseIsRegExp;
2914  
2915    /**
2916     * Checks if `value` is classified as a `String` primitive or object.
2917     *
2918     * @static
2919     * @since 0.1.0
2920     * @memberOf _
2921     * @category Lang
2922     * @param {*} value The value to check.
2923     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
2924     * @example
2925     *
2926     * _.isString('abc');
2927     * // => true
2928     *
2929     * _.isString(1);
2930     * // => false
2931     */
2932    function isString(value) {
2933      return typeof value == 'string' ||
2934        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
2935    }
2936  
2937    /**
2938     * Checks if `value` is `undefined`.
2939     *
2940     * @static
2941     * @since 0.1.0
2942     * @memberOf _
2943     * @category Lang
2944     * @param {*} value The value to check.
2945     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
2946     * @example
2947     *
2948     * _.isUndefined(void 0);
2949     * // => true
2950     *
2951     * _.isUndefined(null);
2952     * // => false
2953     */
2954    function isUndefined(value) {
2955      return value === undefined;
2956    }
2957  
2958    /**
2959     * Converts `value` to an array.
2960     *
2961     * @static
2962     * @since 0.1.0
2963     * @memberOf _
2964     * @category Lang
2965     * @param {*} value The value to convert.
2966     * @returns {Array} Returns the converted array.
2967     * @example
2968     *
2969     * _.toArray({ 'a': 1, 'b': 2 });
2970     * // => [1, 2]
2971     *
2972     * _.toArray('abc');
2973     * // => ['a', 'b', 'c']
2974     *
2975     * _.toArray(1);
2976     * // => []
2977     *
2978     * _.toArray(null);
2979     * // => []
2980     */
2981    function toArray(value) {
2982      if (!isArrayLike(value)) {
2983        return values(value);
2984      }
2985      return value.length ? copyArray(value) : [];
2986    }
2987  
2988    /**
2989     * Converts `value` to an integer.
2990     *
2991     * **Note:** This method is loosely based on
2992     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
2993     *
2994     * @static
2995     * @memberOf _
2996     * @since 4.0.0
2997     * @category Lang
2998     * @param {*} value The value to convert.
2999     * @returns {number} Returns the converted integer.
3000     * @example
3001     *
3002     * _.toInteger(3.2);
3003     * // => 3
3004     *
3005     * _.toInteger(Number.MIN_VALUE);
3006     * // => 0
3007     *
3008     * _.toInteger(Infinity);
3009     * // => 1.7976931348623157e+308
3010     *
3011     * _.toInteger('3.2');
3012     * // => 3
3013     */
3014    var toInteger = Number;
3015  
3016    /**
3017     * Converts `value` to a number.
3018     *
3019     * @static
3020     * @memberOf _
3021     * @since 4.0.0
3022     * @category Lang
3023     * @param {*} value The value to process.
3024     * @returns {number} Returns the number.
3025     * @example
3026     *
3027     * _.toNumber(3.2);
3028     * // => 3.2
3029     *
3030     * _.toNumber(Number.MIN_VALUE);
3031     * // => 5e-324
3032     *
3033     * _.toNumber(Infinity);
3034     * // => Infinity
3035     *
3036     * _.toNumber('3.2');
3037     * // => 3.2
3038     */
3039    var toNumber = Number;
3040  
3041    /**
3042     * Converts `value` to a string. An empty string is returned for `null`
3043     * and `undefined` values. The sign of `-0` is preserved.
3044     *
3045     * @static
3046     * @memberOf _
3047     * @since 4.0.0
3048     * @category Lang
3049     * @param {*} value The value to convert.
3050     * @returns {string} Returns the converted string.
3051     * @example
3052     *
3053     * _.toString(null);
3054     * // => ''
3055     *
3056     * _.toString(-0);
3057     * // => '-0'
3058     *
3059     * _.toString([1, 2, 3]);
3060     * // => '1,2,3'
3061     */
3062    function toString(value) {
3063      if (typeof value == 'string') {
3064        return value;
3065      }
3066      return value == null ? '' : (value + '');
3067    }
3068  
3069    /*------------------------------------------------------------------------*/
3070  
3071    /**
3072     * Assigns own enumerable string keyed properties of source objects to the
3073     * destination object. Source objects are applied from left to right.
3074     * Subsequent sources overwrite property assignments of previous sources.
3075     *
3076     * **Note:** This method mutates `object` and is loosely based on
3077     * [`Object.assign`](https://mdn.io/Object/assign).
3078     *
3079     * @static
3080     * @memberOf _
3081     * @since 0.10.0
3082     * @category Object
3083     * @param {Object} object The destination object.
3084     * @param {...Object} [sources] The source objects.
3085     * @returns {Object} Returns `object`.
3086     * @see _.assignIn
3087     * @example
3088     *
3089     * function Foo() {
3090     *   this.a = 1;
3091     * }
3092     *
3093     * function Bar() {
3094     *   this.c = 3;
3095     * }
3096     *
3097     * Foo.prototype.b = 2;
3098     * Bar.prototype.d = 4;
3099     *
3100     * _.assign({ 'a': 0 }, new Foo, new Bar);
3101     * // => { 'a': 1, 'c': 3 }
3102     */
3103    var assign = createAssigner(function(object, source) {
3104      copyObject(source, nativeKeys(source), object);
3105    });
3106  
3107    /**
3108     * This method is like `_.assign` except that it iterates over own and
3109     * inherited source properties.
3110     *
3111     * **Note:** This method mutates `object`.
3112     *
3113     * @static
3114     * @memberOf _
3115     * @since 4.0.0
3116     * @alias extend
3117     * @category Object
3118     * @param {Object} object The destination object.
3119     * @param {...Object} [sources] The source objects.
3120     * @returns {Object} Returns `object`.
3121     * @see _.assign
3122     * @example
3123     *
3124     * function Foo() {
3125     *   this.a = 1;
3126     * }
3127     *
3128     * function Bar() {
3129     *   this.c = 3;
3130     * }
3131     *
3132     * Foo.prototype.b = 2;
3133     * Bar.prototype.d = 4;
3134     *
3135     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
3136     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
3137     */
3138    var assignIn = createAssigner(function(object, source) {
3139      copyObject(source, nativeKeysIn(source), object);
3140    });
3141  
3142    /**
3143     * Creates an object that inherits from the `prototype` object. If a
3144     * `properties` object is given, its own enumerable string keyed properties
3145     * are assigned to the created object.
3146     *
3147     * @static
3148     * @memberOf _
3149     * @since 2.3.0
3150     * @category Object
3151     * @param {Object} prototype The object to inherit from.
3152     * @param {Object} [properties] The properties to assign to the object.
3153     * @returns {Object} Returns the new object.
3154     * @example
3155     *
3156     * function Shape() {
3157     *   this.x = 0;
3158     *   this.y = 0;
3159     * }
3160     *
3161     * function Circle() {
3162     *   Shape.call(this);
3163     * }
3164     *
3165     * Circle.prototype = _.create(Shape.prototype, {
3166     *   'constructor': Circle
3167     * });
3168     *
3169     * var circle = new Circle;
3170     * circle instanceof Circle;
3171     * // => true
3172     *
3173     * circle instanceof Shape;
3174     * // => true
3175     */
3176    function create(prototype, properties) {
3177      var result = baseCreate(prototype);
3178      return properties == null ? result : assign(result, properties);
3179    }
3180  
3181    /**
3182     * Assigns own and inherited enumerable string keyed properties of source
3183     * objects to the destination object for all destination properties that
3184     * resolve to `undefined`. Source objects are applied from left to right.
3185     * Once a property is set, additional values of the same property are ignored.
3186     *
3187     * **Note:** This method mutates `object`.
3188     *
3189     * @static
3190     * @since 0.1.0
3191     * @memberOf _
3192     * @category Object
3193     * @param {Object} object The destination object.
3194     * @param {...Object} [sources] The source objects.
3195     * @returns {Object} Returns `object`.
3196     * @see _.defaultsDeep
3197     * @example
3198     *
3199     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
3200     * // => { 'a': 1, 'b': 2 }
3201     */
3202    var defaults = baseRest(function(object, sources) {
3203      object = Object(object);
3204  
3205      var index = -1;
3206      var length = sources.length;
3207      var guard = length > 2 ? sources[2] : undefined;
3208  
3209      if (guard && isIterateeCall(sources[0], sources[1], guard)) {
3210        length = 1;
3211      }
3212  
3213      while (++index < length) {
3214        var source = sources[index];
3215        var props = keysIn(source);
3216        var propsIndex = -1;
3217        var propsLength = props.length;
3218  
3219        while (++propsIndex < propsLength) {
3220          var key = props[propsIndex];
3221          var value = object[key];
3222  
3223          if (value === undefined ||
3224              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
3225            object[key] = source[key];
3226          }
3227        }
3228      }
3229  
3230      return object;
3231    });
3232  
3233    /**
3234     * Checks if `path` is a direct property of `object`.
3235     *
3236     * @static
3237     * @since 0.1.0
3238     * @memberOf _
3239     * @category Object
3240     * @param {Object} object The object to query.
3241     * @param {Array|string} path The path to check.
3242     * @returns {boolean} Returns `true` if `path` exists, else `false`.
3243     * @example
3244     *
3245     * var object = { 'a': { 'b': 2 } };
3246     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
3247     *
3248     * _.has(object, 'a');
3249     * // => true
3250     *
3251     * _.has(object, 'a.b');
3252     * // => true
3253     *
3254     * _.has(object, ['a', 'b']);
3255     * // => true
3256     *
3257     * _.has(other, 'a');
3258     * // => false
3259     */
3260    function has(object, path) {
3261      return object != null && hasOwnProperty.call(object, path);
3262    }
3263  
3264    /**
3265     * Creates an array of the own enumerable property names of `object`.
3266     *
3267     * **Note:** Non-object values are coerced to objects. See the
3268     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
3269     * for more details.
3270     *
3271     * @static
3272     * @since 0.1.0
3273     * @memberOf _
3274     * @category Object
3275     * @param {Object} object The object to query.
3276     * @returns {Array} Returns the array of property names.
3277     * @example
3278     *
3279     * function Foo() {
3280     *   this.a = 1;
3281     *   this.b = 2;
3282     * }
3283     *
3284     * Foo.prototype.c = 3;
3285     *
3286     * _.keys(new Foo);
3287     * // => ['a', 'b'] (iteration order is not guaranteed)
3288     *
3289     * _.keys('hi');
3290     * // => ['0', '1']
3291     */
3292    var keys = nativeKeys;
3293  
3294    /**
3295     * Creates an array of the own and inherited enumerable property names of `object`.
3296     *
3297     * **Note:** Non-object values are coerced to objects.
3298     *
3299     * @static
3300     * @memberOf _
3301     * @since 3.0.0
3302     * @category Object
3303     * @param {Object} object The object to query.
3304     * @returns {Array} Returns the array of property names.
3305     * @example
3306     *
3307     * function Foo() {
3308     *   this.a = 1;
3309     *   this.b = 2;
3310     * }
3311     *
3312     * Foo.prototype.c = 3;
3313     *
3314     * _.keysIn(new Foo);
3315     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
3316     */
3317    var keysIn = nativeKeysIn;
3318  
3319    /**
3320     * Creates an object composed of the picked `object` properties.
3321     *
3322     * @static
3323     * @since 0.1.0
3324     * @memberOf _
3325     * @category Object
3326     * @param {Object} object The source object.
3327     * @param {...(string|string[])} [paths] The property paths to pick.
3328     * @returns {Object} Returns the new object.
3329     * @example
3330     *
3331     * var object = { 'a': 1, 'b': '2', 'c': 3 };
3332     *
3333     * _.pick(object, ['a', 'c']);
3334     * // => { 'a': 1, 'c': 3 }
3335     */
3336    var pick = flatRest(function(object, paths) {
3337      return object == null ? {} : basePick(object, paths);
3338    });
3339  
3340    /**
3341     * This method is like `_.get` except that if the resolved value is a
3342     * function it's invoked with the `this` binding of its parent object and
3343     * its result is returned.
3344     *
3345     * @static
3346     * @since 0.1.0
3347     * @memberOf _
3348     * @category Object
3349     * @param {Object} object The object to query.
3350     * @param {Array|string} path The path of the property to resolve.
3351     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
3352     * @returns {*} Returns the resolved value.
3353     * @example
3354     *
3355     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
3356     *
3357     * _.result(object, 'a[0].b.c1');
3358     * // => 3
3359     *
3360     * _.result(object, 'a[0].b.c2');
3361     * // => 4
3362     *
3363     * _.result(object, 'a[0].b.c3', 'default');
3364     * // => 'default'
3365     *
3366     * _.result(object, 'a[0].b.c3', _.constant('default'));
3367     * // => 'default'
3368     */
3369    function result(object, path, defaultValue) {
3370      var value = object == null ? undefined : object[path];
3371      if (value === undefined) {
3372        value = defaultValue;
3373      }
3374      return isFunction(value) ? value.call(object) : value;
3375    }
3376  
3377    /**
3378     * Creates an array of the own enumerable string keyed property values of `object`.
3379     *
3380     * **Note:** Non-object values are coerced to objects.
3381     *
3382     * @static
3383     * @since 0.1.0
3384     * @memberOf _
3385     * @category Object
3386     * @param {Object} object The object to query.
3387     * @returns {Array} Returns the array of property values.
3388     * @example
3389     *
3390     * function Foo() {
3391     *   this.a = 1;
3392     *   this.b = 2;
3393     * }
3394     *
3395     * Foo.prototype.c = 3;
3396     *
3397     * _.values(new Foo);
3398     * // => [1, 2] (iteration order is not guaranteed)
3399     *
3400     * _.values('hi');
3401     * // => ['h', 'i']
3402     */
3403    function values(object) {
3404      return object == null ? [] : baseValues(object, keys(object));
3405    }
3406  
3407    /*------------------------------------------------------------------------*/
3408  
3409    /**
3410     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
3411     * corresponding HTML entities.
3412     *
3413     * **Note:** No other characters are escaped. To escape additional
3414     * characters use a third-party library like [_he_](https://mths.be/he).
3415     *
3416     * Though the ">" character is escaped for symmetry, characters like
3417     * ">" and "/" don't need escaping in HTML and have no special meaning
3418     * unless they're part of a tag or unquoted attribute value. See
3419     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
3420     * (under "semi-related fun fact") for more details.
3421     *
3422     * When working with HTML you should always
3423     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
3424     * XSS vectors.
3425     *
3426     * @static
3427     * @since 0.1.0
3428     * @memberOf _
3429     * @category String
3430     * @param {string} [string=''] The string to escape.
3431     * @returns {string} Returns the escaped string.
3432     * @example
3433     *
3434     * _.escape('fred, barney, & pebbles');
3435     * // => 'fred, barney, &amp; pebbles'
3436     */
3437    function escape(string) {
3438      string = toString(string);
3439      return (string && reHasUnescapedHtml.test(string))
3440        ? string.replace(reUnescapedHtml, escapeHtmlChar)
3441        : string;
3442    }
3443  
3444    /*------------------------------------------------------------------------*/
3445  
3446    /**
3447     * This method returns the first argument it receives.
3448     *
3449     * @static
3450     * @since 0.1.0
3451     * @memberOf _
3452     * @category Util
3453     * @param {*} value Any value.
3454     * @returns {*} Returns `value`.
3455     * @example
3456     *
3457     * var object = { 'a': 1 };
3458     *
3459     * console.log(_.identity(object) === object);
3460     * // => true
3461     */
3462    function identity(value) {
3463      return value;
3464    }
3465  
3466    /**
3467     * Creates a function that invokes `func` with the arguments of the created
3468     * function. If `func` is a property name, the created function returns the
3469     * property value for a given element. If `func` is an array or object, the
3470     * created function returns `true` for elements that contain the equivalent
3471     * source properties, otherwise it returns `false`.
3472     *
3473     * @static
3474     * @since 4.0.0
3475     * @memberOf _
3476     * @category Util
3477     * @param {*} [func=_.identity] The value to convert to a callback.
3478     * @returns {Function} Returns the callback.
3479     * @example
3480     *
3481     * var users = [
3482     *   { 'user': 'barney', 'age': 36, 'active': true },
3483     *   { 'user': 'fred',   'age': 40, 'active': false }
3484     * ];
3485     *
3486     * // The `_.matches` iteratee shorthand.
3487     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
3488     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
3489     *
3490     * // The `_.matchesProperty` iteratee shorthand.
3491     * _.filter(users, _.iteratee(['user', 'fred']));
3492     * // => [{ 'user': 'fred', 'age': 40 }]
3493     *
3494     * // The `_.property` iteratee shorthand.
3495     * _.map(users, _.iteratee('user'));
3496     * // => ['barney', 'fred']
3497     *
3498     * // Create custom iteratee shorthands.
3499     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
3500     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
3501     *     return func.test(string);
3502     *   };
3503     * });
3504     *
3505     * _.filter(['abc', 'def'], /ef/);
3506     * // => ['def']
3507     */
3508    var iteratee = baseIteratee;
3509  
3510    /**
3511     * Creates a function that performs a partial deep comparison between a given
3512     * object and `source`, returning `true` if the given object has equivalent
3513     * property values, else `false`.
3514     *
3515     * **Note:** The created function is equivalent to `_.isMatch` with `source`
3516     * partially applied.
3517     *
3518     * Partial comparisons will match empty array and empty object `source`
3519     * values against any array or object value, respectively. See `_.isEqual`
3520     * for a list of supported value comparisons.
3521     *
3522     * **Note:** Multiple values can be checked by combining several matchers
3523     * using `_.overSome`
3524     *
3525     * @static
3526     * @memberOf _
3527     * @since 3.0.0
3528     * @category Util
3529     * @param {Object} source The object of property values to match.
3530     * @returns {Function} Returns the new spec function.
3531     * @example
3532     *
3533     * var objects = [
3534     *   { 'a': 1, 'b': 2, 'c': 3 },
3535     *   { 'a': 4, 'b': 5, 'c': 6 }
3536     * ];
3537     *
3538     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
3539     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
3540     *
3541     * // Checking for several possible values
3542     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
3543     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
3544     */
3545    function matches(source) {
3546      return baseMatches(assign({}, source));
3547    }
3548  
3549    /**
3550     * Adds all own enumerable string keyed function properties of a source
3551     * object to the destination object. If `object` is a function, then methods
3552     * are added to its prototype as well.
3553     *
3554     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
3555     * avoid conflicts caused by modifying the original.
3556     *
3557     * @static
3558     * @since 0.1.0
3559     * @memberOf _
3560     * @category Util
3561     * @param {Function|Object} [object=lodash] The destination object.
3562     * @param {Object} source The object of functions to add.
3563     * @param {Object} [options={}] The options object.
3564     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
3565     * @returns {Function|Object} Returns `object`.
3566     * @example
3567     *
3568     * function vowels(string) {
3569     *   return _.filter(string, function(v) {
3570     *     return /[aeiou]/i.test(v);
3571     *   });
3572     * }
3573     *
3574     * _.mixin({ 'vowels': vowels });
3575     * _.vowels('fred');
3576     * // => ['e']
3577     *
3578     * _('fred').vowels().value();
3579     * // => ['e']
3580     *
3581     * _.mixin({ 'vowels': vowels }, { 'chain': false });
3582     * _('fred').vowels();
3583     * // => ['e']
3584     */
3585    function mixin(object, source, options) {
3586      var props = keys(source),
3587          methodNames = baseFunctions(source, props);
3588  
3589      if (options == null &&
3590          !(isObject(source) && (methodNames.length || !props.length))) {
3591        options = source;
3592        source = object;
3593        object = this;
3594        methodNames = baseFunctions(source, keys(source));
3595      }
3596      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
3597          isFunc = isFunction(object);
3598  
3599      baseEach(methodNames, function(methodName) {
3600        var func = source[methodName];
3601        object[methodName] = func;
3602        if (isFunc) {
3603          object.prototype[methodName] = function() {
3604            var chainAll = this.__chain__;
3605            if (chain || chainAll) {
3606              var result = object(this.__wrapped__),
3607                  actions = result.__actions__ = copyArray(this.__actions__);
3608  
3609              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
3610              result.__chain__ = chainAll;
3611              return result;
3612            }
3613            return func.apply(object, arrayPush([this.value()], arguments));
3614          };
3615        }
3616      });
3617  
3618      return object;
3619    }
3620  
3621    /**
3622     * Reverts the `_` variable to its previous value and returns a reference to
3623     * the `lodash` function.
3624     *
3625     * @static
3626     * @since 0.1.0
3627     * @memberOf _
3628     * @category Util
3629     * @returns {Function} Returns the `lodash` function.
3630     * @example
3631     *
3632     * var lodash = _.noConflict();
3633     */
3634    function noConflict() {
3635      if (root._ === this) {
3636        root._ = oldDash;
3637      }
3638      return this;
3639    }
3640  
3641    /**
3642     * This method returns `undefined`.
3643     *
3644     * @static
3645     * @memberOf _
3646     * @since 2.3.0
3647     * @category Util
3648     * @example
3649     *
3650     * _.times(2, _.noop);
3651     * // => [undefined, undefined]
3652     */
3653    function noop() {
3654      // No operation performed.
3655    }
3656  
3657    /**
3658     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
3659     *
3660     * @static
3661     * @since 0.1.0
3662     * @memberOf _
3663     * @category Util
3664     * @param {string} [prefix=''] The value to prefix the ID with.
3665     * @returns {string} Returns the unique ID.
3666     * @example
3667     *
3668     * _.uniqueId('contact_');
3669     * // => 'contact_104'
3670     *
3671     * _.uniqueId();
3672     * // => '105'
3673     */
3674    function uniqueId(prefix) {
3675      var id = ++idCounter;
3676      return toString(prefix) + id;
3677    }
3678  
3679    /*------------------------------------------------------------------------*/
3680  
3681    /**
3682     * Computes the maximum value of `array`. If `array` is empty or falsey,
3683     * `undefined` is returned.
3684     *
3685     * @static
3686     * @since 0.1.0
3687     * @memberOf _
3688     * @category Math
3689     * @param {Array} array The array to iterate over.
3690     * @returns {*} Returns the maximum value.
3691     * @example
3692     *
3693     * _.max([4, 2, 8, 6]);
3694     * // => 8
3695     *
3696     * _.max([]);
3697     * // => undefined
3698     */
3699    function max(array) {
3700      return (array && array.length)
3701        ? baseExtremum(array, identity, baseGt)
3702        : undefined;
3703    }
3704  
3705    /**
3706     * Computes the minimum value of `array`. If `array` is empty or falsey,
3707     * `undefined` is returned.
3708     *
3709     * @static
3710     * @since 0.1.0
3711     * @memberOf _
3712     * @category Math
3713     * @param {Array} array The array to iterate over.
3714     * @returns {*} Returns the minimum value.
3715     * @example
3716     *
3717     * _.min([4, 2, 8, 6]);
3718     * // => 2
3719     *
3720     * _.min([]);
3721     * // => undefined
3722     */
3723    function min(array) {
3724      return (array && array.length)
3725        ? baseExtremum(array, identity, baseLt)
3726        : undefined;
3727    }
3728  
3729    /*------------------------------------------------------------------------*/
3730  
3731    // Add methods that return wrapped values in chain sequences.
3732    lodash.assignIn = assignIn;
3733    lodash.before = before;
3734    lodash.bind = bind;
3735    lodash.chain = chain;
3736    lodash.compact = compact;
3737    lodash.concat = concat;
3738    lodash.create = create;
3739    lodash.defaults = defaults;
3740    lodash.defer = defer;
3741    lodash.delay = delay;
3742    lodash.filter = filter;
3743    lodash.flatten = flatten;
3744    lodash.flattenDeep = flattenDeep;
3745    lodash.iteratee = iteratee;
3746    lodash.keys = keys;
3747    lodash.map = map;
3748    lodash.matches = matches;
3749    lodash.mixin = mixin;
3750    lodash.negate = negate;
3751    lodash.once = once;
3752    lodash.pick = pick;
3753    lodash.slice = slice;
3754    lodash.sortBy = sortBy;
3755    lodash.tap = tap;
3756    lodash.thru = thru;
3757    lodash.toArray = toArray;
3758    lodash.values = values;
3759  
3760    // Add aliases.
3761    lodash.extend = assignIn;
3762  
3763    // Add methods to `lodash.prototype`.
3764    mixin(lodash, lodash);
3765  
3766    /*------------------------------------------------------------------------*/
3767  
3768    // Add methods that return unwrapped values in chain sequences.
3769    lodash.clone = clone;
3770    lodash.escape = escape;
3771    lodash.every = every;
3772    lodash.find = find;
3773    lodash.forEach = forEach;
3774    lodash.has = has;
3775    lodash.head = head;
3776    lodash.identity = identity;
3777    lodash.indexOf = indexOf;
3778    lodash.isArguments = isArguments;
3779    lodash.isArray = isArray;
3780    lodash.isBoolean = isBoolean;
3781    lodash.isDate = isDate;
3782    lodash.isEmpty = isEmpty;
3783    lodash.isEqual = isEqual;
3784    lodash.isFinite = isFinite;
3785    lodash.isFunction = isFunction;
3786    lodash.isNaN = isNaN;
3787    lodash.isNull = isNull;
3788    lodash.isNumber = isNumber;
3789    lodash.isObject = isObject;
3790    lodash.isRegExp = isRegExp;
3791    lodash.isString = isString;
3792    lodash.isUndefined = isUndefined;
3793    lodash.last = last;
3794    lodash.max = max;
3795    lodash.min = min;
3796    lodash.noConflict = noConflict;
3797    lodash.noop = noop;
3798    lodash.reduce = reduce;
3799    lodash.result = result;
3800    lodash.size = size;
3801    lodash.some = some;
3802    lodash.uniqueId = uniqueId;
3803  
3804    // Add aliases.
3805    lodash.each = forEach;
3806    lodash.first = head;
3807  
3808    mixin(lodash, (function() {
3809      var source = {};
3810      baseForOwn(lodash, function(func, methodName) {
3811        if (!hasOwnProperty.call(lodash.prototype, methodName)) {
3812          source[methodName] = func;
3813        }
3814      });
3815      return source;
3816    }()), { 'chain': false });
3817  
3818    /*------------------------------------------------------------------------*/
3819  
3820    /**
3821     * The semantic version number.
3822     *
3823     * @static
3824     * @memberOf _
3825     * @type {string}
3826     */
3827    lodash.VERSION = VERSION;
3828  
3829    // Add `Array` methods to `lodash.prototype`.
3830    baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
3831      var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName],
3832          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
3833          retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName);
3834  
3835      lodash.prototype[methodName] = function() {
3836        var args = arguments;
3837        if (retUnwrapped && !this.__chain__) {
3838          var value = this.value();
3839          return func.apply(isArray(value) ? value : [], args);
3840        }
3841        return this[chainName](function(value) {
3842          return func.apply(isArray(value) ? value : [], args);
3843        });
3844      };
3845    });
3846  
3847    // Add chain sequence methods to the `lodash` wrapper.
3848    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
3849  
3850    /*--------------------------------------------------------------------------*/
3851  
3852    // Some AMD build optimizers, like r.js, check for condition patterns like:
3853    if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
3854      // Expose Lodash on the global object to prevent errors when Lodash is
3855      // loaded by a script tag in the presence of an AMD loader.
3856      // See http://requirejs.org/docs/errors.html#mismatch for more details.
3857      // Use `_.noConflict` to remove Lodash from the global object.
3858      root._ = lodash;
3859  
3860      // Define as an anonymous module so, through path mapping, it can be
3861      // referenced as the "underscore" module.
3862      define(function() {
3863        return lodash;
3864      });
3865    }
3866    // Check for `exports` after `define` in case a build optimizer adds it.
3867    else if (freeModule) {
3868      // Export for Node.js.
3869      (freeModule.exports = lodash)._ = lodash;
3870      // Export for CommonJS support.
3871      freeExports._ = lodash;
3872    }
3873    else {
3874      // Export to the global object.
3875      root._ = lodash;
3876    }
3877  }.call(this));